diff --git a/CHANGELOG.md b/CHANGELOG.md index 5135aec57..d2d106845 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * Added * Local file inclusion of terra-application-navigation * Added ApplicationNavigationActionsContext to application-navigation + * Added WorkspaceLayout to local ApplicationNavigation instance ## 1.48.0 - (June 15, 2021) diff --git a/package.json b/package.json index ba92b39cc..4b8aba03e 100644 --- a/package.json +++ b/package.json @@ -104,6 +104,7 @@ "keycode-js": "^3.1.0", "mutationobserver-shim": "0.3.3", "prop-types": "^15.5.8", + "react-draggable": "^4.4.3", "react-onclickoutside": "^6.7.1", "resize-observer-polyfill": "^1.4.1", "terra-action-footer": "^2.61.0", diff --git a/src/application-navigation/ApplicationNavigation.jsx b/src/application-navigation/ApplicationNavigation.jsx index c4a6606e5..1d7ae502f 100644 --- a/src/application-navigation/ApplicationNavigation.jsx +++ b/src/application-navigation/ApplicationNavigation.jsx @@ -2,6 +2,7 @@ import React, { useRef, useCallback, Suspense, } from 'react'; import PropTypes from 'prop-types'; +import uuidv4 from 'uuid/v4'; import TerraApplicationNavigation from './private/ApplicationNavigation'; import { titleConfigPropType, navigationItemsPropType, extensionItemsPropType, utilityItemsPropType, userConfigPropType, @@ -12,6 +13,7 @@ import ApplicationLoadingOverlay, { ApplicationLoadingOverlayProvider } from '.. import { ApplicationStatusOverlayProvider } from '../application-status-overlay'; import { NavigationPromptCheckpoint, navigationPromptResolutionOptionsShape, getUnsavedChangesPromptOptions } from '../navigation-prompt'; import { ApplicationIntlContext } from '../application-intl'; +import ApplicationNavigationWorkspace from './private/workspace-layout/ApplicationNavigationWorkspace'; const propTypes = { /** @@ -44,6 +46,10 @@ const propTypes = { * An element to render within the ApplicationNavigation utility menu, shifted to the drawer at the `medium` breakpoint and below. */ hero: PropTypes.element, + /** + * The base id used to generate ids of workspace, navigation, utility, and extension items + */ + id: PropTypes.string, /** * An array of configuration objects with information specifying the creation of navigation items. These items * are rendered within the ApplicationNavigation header at larger breakpoints and within the drawer menu at smaller breakpoints. @@ -116,6 +122,10 @@ const propTypes = { * These items are rendered within the popup utility menu at larger breakpoints and within the drawer menu at smaller breakpoints. */ utilityItems: utilityItemsPropType, + /** + * An ApplicationNavigationWorkspace element and it's associated ApplicationNavigationWorkspaceItems. + */ + workspace: PropTypes.element, }; const ApplicationNavigation = ({ @@ -125,6 +135,7 @@ const ApplicationNavigation = ({ disablePromptsForNavigationItems, extensionItems, hero, + id, navigationItems, navigationPromptResolutionOptions, notifications, @@ -138,10 +149,11 @@ const ApplicationNavigation = ({ titleConfig, userConfig, utilityItems, + workspace, }) => { const applicationIntl = React.useContext(ApplicationIntlContext); - const navigationPromptCheckpointRef = useRef(); + const idRef = React.useRef(uuidv4()); const onSelectNavigationItem = useCallback((selectedItemKey) => { if (disablePromptsForNavigationItems) { @@ -167,6 +179,7 @@ const ApplicationNavigation = ({ return ( @@ -201,5 +215,6 @@ const ApplicationNavigation = ({ }; ApplicationNavigation.propTypes = propTypes; +ApplicationNavigation.Workspace = ApplicationNavigationWorkspace; export default ApplicationNavigation; diff --git a/src/application-navigation/index.js b/src/application-navigation/index.js index b835caf2b..96ef56d0e 100644 --- a/src/application-navigation/index.js +++ b/src/application-navigation/index.js @@ -1,10 +1,19 @@ import { - titleConfigPropType, navigationItemsPropType, extensionItemsPropType, utilityItemsPropType, userConfigPropType, + titleConfigPropType, + navigationItemsPropType, + extensionItemsPropType, + utilityItemsPropType, + userConfigPropType, } from './private/utils/propTypes'; +import ApplicationNavigationActionsContext from './ApplicationNavigationActionsContext'; import ApplicationNavigation from './ApplicationNavigation'; export default ApplicationNavigation; export { - titleConfigPropType, navigationItemsPropType, extensionItemsPropType, utilityItemsPropType, userConfigPropType, + titleConfigPropType, + navigationItemsPropType, + extensionItemsPropType, + utilityItemsPropType, + userConfigPropType, + ApplicationNavigationActionsContext, }; - diff --git a/src/application-navigation/private/ApplicationNavigation.jsx b/src/application-navigation/private/ApplicationNavigation.jsx index 8451e341d..8cccca44b 100644 --- a/src/application-navigation/private/ApplicationNavigation.jsx +++ b/src/application-navigation/private/ApplicationNavigation.jsx @@ -17,6 +17,7 @@ import { shouldRenderCompactNavigation } from './utils/helpers'; import { titleConfigPropType, userConfigPropType, navigationItemsPropType, extensionItemsPropType, utilityItemsPropType, } from './utils/propTypes'; +import WorkspaceLayout from './workspace-layout/WorkspaceLayout'; import styles from './ApplicationNavigation.module.scss'; @@ -108,6 +109,10 @@ const propTypes = { * A collection of child elements to render within the ApplicationNavigation body. */ children: PropTypes.node, + /** + * An ApplicationNavigation.Workspace element to be presented within the layout. + */ + workspace: PropTypes.element, }; const defaultProps = { @@ -134,6 +139,7 @@ const ApplicationNavigation = ({ onSelectUtilityItem, notifications, children, + workspace, }) => { const drawerMenuRef = useRef(); const contentLayoutRef = useRef(); @@ -145,9 +151,11 @@ const ApplicationNavigation = ({ const drawerMenuIsOpenRef = useRef(false); const closeMenuCallbackRef = useRef(); const renderedNavItemKeyRef = useRef(activeNavigationItemKey); + const skipToWorkspaceActionRef = useRef(); const [drawerMenuIsOpen, setDrawerMenuIsOpen] = useState(false); const [popupMenuIsOpen, setPopupMenuIsOpen] = useState(false); + const [renderSkipToWorkspace, setRenderSkipToWorkspace] = useState(false); const closeMenuEvent = 'terra-application-navigation.dismiss-menu'; @@ -273,6 +281,19 @@ const ApplicationNavigation = ({ ); } + function createWorkspaceAction() { + let skipToAction; + if (renderSkipToWorkspace) { + skipToAction = () => { + if (!skipToWorkspaceActionRef.current) { + return; + } + skipToWorkspaceActionRef.current(); + }; + } + return skipToAction; + } + function renderCompactHeader() { return ( ); } @@ -321,6 +343,7 @@ const ApplicationNavigation = ({ onSelectSettings={onSelectSettings} onSelectHelp={onSelectHelp} onSelectLogout={onSelectLogout} + skipToWorkspaceAction={createWorkspaceAction()} /> ); } @@ -442,6 +465,35 @@ const ApplicationNavigation = ({ const theme = React.useContext(ThemeContext); const appNavClassNames = cx('application-navigation', theme.className); + const renderMain = () => { + const skipToCallback = action => { + skipToWorkspaceActionRef.current = action; + + if (action && !renderSkipToWorkspace) { + setRenderSkipToWorkspace(true); + } + }; + + return ( + +
+ {hiddenMainTitle} + {children} +
+
+ ); + }; + return (
{shouldRenderCompactNavigation(activeBreakpoint) ? renderCompactHeader() : renderHeader()} -
- {hiddenMainTitle} - {children} -
+ {renderMain()} { const [navigationIsOpen, setNavigationIsOpen] = useState(false); const [utilitiesIsOpen, setUtilitiesIsOpen] = useState(false); @@ -333,11 +338,24 @@ const CompactHeader = ({ ); } + function renderSkipToWorkspace() { + if (!skipToWorkspaceAction) { + return undefined; + } + + return ( + + ); + } + return (
+ {renderSkipToWorkspace()} {renderMenuButton()}
{renderTitle()} diff --git a/src/application-navigation/private/header/_Header.jsx b/src/application-navigation/private/header/_Header.jsx index 66edfc51d..61d2042e9 100644 --- a/src/application-navigation/private/header/_Header.jsx +++ b/src/application-navigation/private/header/_Header.jsx @@ -102,6 +102,10 @@ const propTypes = { * If `onSelectLogout` is not provided, the Logout action button will not be rendered. */ onSelectLogout: PropTypes.func, + /** + * Action to tie to the skipToLink for workspace. + */ + skipToWorkspaceAction: PropTypes.func, }; const defaultProps = { @@ -129,6 +133,7 @@ const Header = ({ onSelectSettings, onSelectHelp, onSelectLogout, + skipToWorkspaceAction, }) => { function renderTitle() { if (!titleConfig) { @@ -198,11 +203,24 @@ const Header = ({ ); } + function renderSkipToWorkspace() { + if (!skipToWorkspaceAction) { + return undefined; + } + + return ( + + ); + } + return (
+ {renderSkipToWorkspace()}
{renderTitle()}
diff --git a/src/application-navigation/private/orion-fusion-theme/ResizeHandle.module.scss b/src/application-navigation/private/orion-fusion-theme/ResizeHandle.module.scss new file mode 100644 index 000000000..e193ebad7 --- /dev/null +++ b/src/application-navigation/private/orion-fusion-theme/ResizeHandle.module.scss @@ -0,0 +1,6 @@ +:local { + .orion-fusion-theme { + --terra-application-resize-handle-hover-background-color: rgba(34, 42, 46, 0.6); + --terra-application-resize-handle-dragging-background-color: rgba(34, 42, 46, 1); + } +} diff --git a/src/application-navigation/private/orion-fusion-theme/WorkspaceLayout.module.scss b/src/application-navigation/private/orion-fusion-theme/WorkspaceLayout.module.scss new file mode 100644 index 000000000..feec2826c --- /dev/null +++ b/src/application-navigation/private/orion-fusion-theme/WorkspaceLayout.module.scss @@ -0,0 +1,5 @@ +:local { + .orion-fusion-theme { + --terra-application-workspace-layout-workspace-overlay-background-color: rgba(0, 0, 0, 0.3); + } +} diff --git a/src/application-navigation/private/utils/helpers.js b/src/application-navigation/private/utils/helpers.js index 5166feb2b..ba2b97bcd 100644 --- a/src/application-navigation/private/utils/helpers.js +++ b/src/application-navigation/private/utils/helpers.js @@ -85,8 +85,8 @@ function logoutUtilityItemId(appNavId) { return utilityItemId(appNavId, 'TerraLogout'); } -function extensionItemId(appNavId, extenstionItemKey) { - return itemId(appNavId, 'ExtensionItem', extenstionItemKey); +function extensionItemId(appNavId, extensionItemKey) { + return itemId(appNavId, 'ExtensionItem', extensionItemKey); } export default { diff --git a/src/application-navigation/private/workspace-layout/ApplicationNavigationWorkspace.jsx b/src/application-navigation/private/workspace-layout/ApplicationNavigationWorkspace.jsx new file mode 100644 index 000000000..4dcfd9d4f --- /dev/null +++ b/src/application-navigation/private/workspace-layout/ApplicationNavigationWorkspace.jsx @@ -0,0 +1,142 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Workspace, { WorkspaceItem } from '../../../workspace'; + +const propTypes = { + /** + * Callback function triggering when the workspace size changes. + */ + onSizeChange: PropTypes.func, + /** + * Callback function triggering when the open state of workspace changes between true and false. + */ + onPresentationStateChange: PropTypes.func, + /** + * Callback function triggering when the active workspace item changes. + */ + onActiveItemChange: PropTypes.func, + /** + * The string key linked to the active workspace item. + */ + initialActiveItemKey: PropTypes.string.isRequired, + /** + * WorkspaceItems to be rendered within the workspace. + */ + children: PropTypes.node.isRequired, + /** + * Whether or not the workspace should initially display as open. + */ + initialIsOpen: PropTypes.bool, + /** + * The size string value matching the active size option. + */ + initialSize: PropTypes.object, + /** + * @private + * Id string to apply to the workspace + */ + id: PropTypes.string.isRequired, + /** + * @private + * Whether or not the workspace is open + */ + isOpen: PropTypes.bool, + /** + * @private + * Function callback i.e. `onRequest(event)` + */ + onRequestClose: PropTypes.func, + /** + * @private + * Whether or not the workspace is present as an overlay + */ + isPresentedAsOverlay: PropTypes.bool, + /** + * @private + * Numeric scale value ranging from `0.0 - 1.0` as the minimum to maximum size for the workspace + */ + sizeScalar: PropTypes.number, + /** + * @private + * The string representation of the workspace size + */ + activeSize: PropTypes.string, + /** + * @private + * Array of objects containing key/text pairs for the available size options + */ + sizeOptions: PropTypes.arrayOf(PropTypes.shape({ + key: PropTypes.string.isRequired, + text: PropTypes.string.isRequired, + })), + /** + * @private + * Function callback i.e. `onRequestSizeChange(size)` + */ + onRequestSizeChange: PropTypes.func, +}; + +const ApplicationNavigationWorkspace = ({ + // consumer props + onSizeChange, + onPresentationStateChange, + onActiveItemChange, + initialActiveItemKey, + children, + // These props are read by the parent to determine the controlled values to pass down. + initialIsOpen, // eslint-disable-line no-unused-vars, react/no-unused-prop-types + initialSize, // eslint-disable-line no-unused-vars, react/no-unused-prop-types + + // private injected props + id, + isOpen, + onRequestClose, + isPresentedAsOverlay, + sizeScalar, + activeSize, + sizeOptions, + onRequestSizeChange, +}) => { + const [activeItemKey, setActiveItemKey] = React.useState(initialActiveItemKey); + + React.useEffect(() => { + if (onSizeChange && sizeScalar !== undefined) { + onSizeChange(sizeScalar); + } + }, [sizeScalar, onSizeChange]); + + React.useEffect(() => { + if (onPresentationStateChange) { + onPresentationStateChange(isOpen); + } + }, [isOpen, onPresentationStateChange]); + + React.useEffect(() => { + if (onActiveItemChange) { + onActiveItemChange(activeItemKey); + } + }, [activeItemKey, onActiveItemChange]); + + return ( + { + setActiveItemKey(itemKey); + }} + activeSize={activeSize} + sizeOptions={sizeOptions} + onRequestSizeChange={onRequestSizeChange} + onRequestDismiss={onRequestClose} + dismissButtonIsVisible={isPresentedAsOverlay} + isPresentedAsOverlay={isPresentedAsOverlay} + > + {children} + + ); +}; + +ApplicationNavigationWorkspace.propTypes = propTypes; +ApplicationNavigationWorkspace.Item = WorkspaceItem; + +export default ApplicationNavigationWorkspace; diff --git a/src/application-navigation/private/workspace-layout/ResizeHandle.jsx b/src/application-navigation/private/workspace-layout/ResizeHandle.jsx new file mode 100644 index 000000000..6e4b6233b --- /dev/null +++ b/src/application-navigation/private/workspace-layout/ResizeHandle.jsx @@ -0,0 +1,120 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames/bind'; +import { DraggableCore } from 'react-draggable'; +import ThemeContext from 'terra-theme-context'; + +import styles from './ResizeHandle.module.scss'; + +const cx = classNames.bind(styles); + +const propTypes = { + /** + * Function called upon release of the ResizeHandle. The id, as well as the new ResizeHandle position, will be provided + * as arguments. Parameters: `onResizeStop(resizeHandleId, positionDelta)` + */ + onResizeStop: PropTypes.func, + /** + * Function called upon move of the ResizeHandle. + * Parameters: `onResizeMove(node)` + */ + onResizeMove: PropTypes.func, + /** + * Function called upon start of the ResizeHandle. + * Parameters: `onResizeStart(resizeHandleId, positionDelta)` + */ + onResizeStart: PropTypes.func, +}; + +const MINIMUM_WORKSPACE_WIDTH = 320; + +class ResizeHandle extends React.Component { + /** + * Click events that occur on the ResizeHandle are not propagated. This prevents clicks on the ResizeHandle from registering + * as clicks on the elements over which the ResizeHandle is rendered. + */ + static preventClickEvent(event) { + event.stopPropagation(); + } + + constructor(props) { + super(props); + + this.handleDragMove = this.handleDragMove.bind(this); + this.handleDragStart = this.handleDragStart.bind(this); + this.handleDragStop = this.handleDragStop.bind(this); + + this.resizeBoundsRef = React.createRef(); + } + + handleDragMove(event, data) { + const { onResizeMove } = this.props; + + const handleNode = data.node; + + this.resizeHandleDragPosition += data.deltaX; + + const newWidth = data.x * -1 + this.resizeBoundsRef.current.currentWidth; + const scale = (newWidth - MINIMUM_WORKSPACE_WIDTH) / this.resizeBoundsRef.current.range; + + if (scale >= 0 && scale <= 1) { + handleNode.style.transform = `translate3d(${this.resizeHandleDragPosition}px, 0, 0)`; + } + + if (onResizeMove) { + onResizeMove(handleNode); + } + } + + handleDragStart(event, data) { + const { onResizeStart } = this.props; + + const handleNode = data.node; + + this.resizeHandleDragPosition = 0; + + handleNode.classList.add(cx('dragging')); + + if (onResizeStart) { + onResizeStart((bounds) => { + this.resizeBoundsRef.current = bounds; + }); + } + } + + handleDragStop(event, data) { + const { onResizeStop } = this.props; + const handleNode = data.node; + + handleNode.classList.remove(cx('dragging')); + handleNode.style.transform = ''; + + if (onResizeStop) { + onResizeStop(this.resizeHandleDragPosition); + } + } + + render() { + const theme = this.context; + return ( + /* eslint-disable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */ + +
+ + /* eslint-enable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */ + ); + } +} + +ResizeHandle.propTypes = propTypes; +ResizeHandle.contextType = ThemeContext; + +export default ResizeHandle; diff --git a/src/application-navigation/private/workspace-layout/ResizeHandle.module.scss b/src/application-navigation/private/workspace-layout/ResizeHandle.module.scss new file mode 100644 index 000000000..36f2b0149 --- /dev/null +++ b/src/application-navigation/private/workspace-layout/ResizeHandle.module.scss @@ -0,0 +1,24 @@ +// Themes +@import '../clinical-lowlight-theme/ResizeHandle.module'; +@import '../orion-fusion-theme/ResizeHandle.module'; + +:local { + .resize-handle { + background-color: transparent; + cursor: col-resize; /* stylelint-disable-line plugin/no-unsupported-browser-features */ // cursor isn't supported by Android/iOS browsers + height: 100%; + left: 0; + top: 0; + width: 5px; + z-index: 1; + + &:hover { + background-color: var(--terra-application-resize-handle-hover-background-color, rgba(34, 42, 46, 0.6)); + } + + &.dragging { + background-color: var(--terra-application-resize-handle-dragging-background-color, rgba(34, 42, 46, 1)); + z-index: 4; + } + } +} diff --git a/src/application-navigation/private/workspace-layout/WorkspaceLayout.jsx b/src/application-navigation/private/workspace-layout/WorkspaceLayout.jsx new file mode 100644 index 000000000..8fba80e66 --- /dev/null +++ b/src/application-navigation/private/workspace-layout/WorkspaceLayout.jsx @@ -0,0 +1,446 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames/bind'; +import { KEY_ESCAPE } from 'keycode-js'; +import IconPanelRight from 'terra-icon/lib/icon/IconPanelRight'; +import IconPanelLeft from 'terra-icon/lib/icon/IconPanelLeft'; + +import { ActiveBreakpointContext } from '../../../breakpoints'; +import ResizeHandle from './ResizeHandle'; +import { ApplicationIntlContext } from '../../../application-intl'; +import ApplicationNavigationActionsContext from '../../ApplicationNavigationActionsContext'; + +import styles from './WorkspaceLayout.module.scss'; + +const cx = classNames.bind(styles); + +const propTypes = { + /** + * Child content to be rendered in the main content region of the workspace layout. + */ + children: PropTypes.node, + /** + * React ref mapping to back to portaling of the child content. + */ + contentElementRef: PropTypes.object, + /** + * Unique id for the layout. + */ + id: PropTypes.string.isRequired, + /** + * Element adhering to the Workspace API. + */ + workspace: PropTypes.element, + /** + * Returns the composed skipTo action function if workspace is present. + */ + skipToCallback: PropTypes.func, +}; + +const MINIMUM_WORKSPACE_WIDTH = 320; +const MINIMUM_CONTENT_WIDTH = 320; + +const initialSizeForBreakpoint = breakpoint => { + if (breakpoint === 'tiny' || breakpoint === 'small') { + return { + scale: undefined, + type: undefined, + }; + } + + if (breakpoint === 'medium') { + return { + scale: undefined, + type: 'split', + }; + } + + return { + scale: 0, + type: undefined, + }; +}; + +const getSizeOptionsForBreakpoint = breakpoint => { + let menuOptions; + if (breakpoint === 'large' || breakpoint === 'huge' || breakpoint === 'enormous') { + menuOptions = [ + { key: 'small', text: 'Small' }, + { key: 'medium', text: 'Medium' }, + { key: 'large', text: 'Large' }, + ]; + } else if (breakpoint === 'medium') { + menuOptions = [ + { key: 'split', text: 'Split' }, + { key: 'overlay', text: 'Overlay' }, + ]; + } + return menuOptions; +}; + +const getActiveSizeForWorkspaceSize = workspaceSize => { + if (workspaceSize.scale === 0) { + return 'small'; + } if (workspaceSize.scale === 0.5) { + return 'medium'; + } if (workspaceSize.scale === 1) { + return 'large'; + } if (workspaceSize.type === 'split') { + return 'split'; + } if (workspaceSize.type === 'overlay') { + return 'overlay'; + } + + return undefined; +}; + +const validateInitialWorkspaceSizeForBreakpoint = (breakpoint) => { + if (breakpoint === 'large' || breakpoint === 'huge' || breakpoint === 'enormous') { + return true; + } + + return false; +}; + +const WorkspaceLayout = ({ + children, + id, + workspace, + contentElementRef, + skipToCallback, +}) => { + const activeBreakpoint = React.useContext(ActiveBreakpointContext); + const applicationIntl = React.useContext(ApplicationIntlContext); + + const layoutContainerRef = React.useRef(); + const layoutBodyRef = React.useRef(); + const workspacePanelRef = React.useRef(); + const workspaceResizeBoundsRef = React.useRef(); + const resizeOverlayRef = React.useRef(); + const workspaceOverlayRef = React.useRef(); + const lastActiveSizeRef = React.useRef(); + const userSelectedTypeRef = React.useRef(); + const userSelectedScaleRef = React.useRef(0); + + let initialWorkspaceSize; + if (validateInitialWorkspaceSizeForBreakpoint(activeBreakpoint)) { + initialWorkspaceSize = (workspace && workspace.props.initialSize) || initialSizeForBreakpoint(activeBreakpoint); + } else { + initialWorkspaceSize = initialSizeForBreakpoint(activeBreakpoint); + } + + const [workspaceSize, setWorkspaceSize] = React.useState(initialWorkspaceSize); + const hasOverlayWorkspace = activeBreakpoint === 'tiny' || activeBreakpoint === 'small' || workspaceSize.type === 'overlay'; + const isLargeFormFactor = activeBreakpoint === 'large' || activeBreakpoint === 'huge' || activeBreakpoint === 'enormous'; + const [workspaceIsVisible, setWorkspaceIsVisible] = React.useState(!hasOverlayWorkspace && workspace && workspace.props.initialIsOpen); + const hasWorkspace = !!workspace; + + const actionsContextValue = React.useMemo(() => { + let actions = []; + let actionLabel; + if (workspaceIsVisible) { + actionLabel = applicationIntl.formatMessage({ id: 'terraApplication.workspace.showWorkspaceLabel' }); + } else { + actionLabel = applicationIntl.formatMessage({ id: 'terraApplication.workspace.hideWorkspaceLabel' }); + } + + if (hasWorkspace) { + actions = [...actions, { + key: 'workspace-layout-toggle-workspace-panel', + label: actionLabel, + icon: workspaceIsVisible ? : , + onSelect: () => { + setWorkspaceIsVisible(state => !state); + }, + }]; + } + + return ({ + actions, + }); + }, [hasWorkspace, workspaceIsVisible, applicationIntl]); + + React.useEffect(() => { + if (!lastActiveSizeRef.current) { + lastActiveSizeRef.current = activeBreakpoint; + return; + } + + if (lastActiveSizeRef.current === activeBreakpoint) { + return; + } + + lastActiveSizeRef.current = activeBreakpoint; + + if (activeBreakpoint === 'tiny' || activeBreakpoint === 'small') { + setWorkspaceSize({ + scale: undefined, + type: undefined, + }); + } else if (activeBreakpoint === 'medium') { + const scale = userSelectedScaleRef.current || workspaceSize.scale; + + if (scale === undefined || scale <= 0.5) { + setWorkspaceSize({ + scale: undefined, + type: 'split', + }); + } else if (scale > 0.5) { + setWorkspaceSize({ + scale: undefined, + type: 'overlay', + }); + } + } else if (activeBreakpoint === 'large' || activeBreakpoint === 'huge' || activeBreakpoint === 'enormous') { + setWorkspaceSize({ + scale: userSelectedScaleRef.current || 0, + type: undefined, + }); + } + }, [workspaceSize, activeBreakpoint]); + + const lastWorkspaceOpenState = React.useRef(workspaceIsVisible); + React.useEffect(() => { + if (workspaceIsVisible && !lastWorkspaceOpenState.current && workspacePanelRef.current) { + setTimeout(() => { workspacePanelRef.current.focus(); }, 0); + } else if (!workspaceIsVisible && lastWorkspaceOpenState.current) { + setTimeout(() => { + const mainElement = document.querySelector('main'); + if (mainElement) { + mainElement.focus(); + } + }, 0); + } + + lastWorkspaceOpenState.current = workspaceIsVisible; + }, [workspaceIsVisible]); + + React.useEffect(() => { + if (!workspaceIsVisible || !hasOverlayWorkspace) { + return undefined; + } + + function handleKeydown(e) { + if (e.keyCode === KEY_ESCAPE) { + if (e.target === layoutContainerRef.current || layoutContainerRef.current.contains(e.target)) { + setWorkspaceIsVisible(false); + } + } + } + + document.addEventListener('keydown', handleKeydown); + + return () => { + document.removeEventListener('keydown', handleKeydown); + }; + }, [workspaceIsVisible, hasOverlayWorkspace]); + + const handleOnRequestSizeChange = size => { + userSelectedTypeRef.current = undefined; + + if (size === 'small') { + userSelectedScaleRef.current = 0; + setWorkspaceSize({ + scale: 0, + type: undefined, + }); + } else if (size === 'medium') { + userSelectedScaleRef.current = 0.5; + + setWorkspaceSize({ + scale: 0.5, + type: undefined, + }); + } else if (size === 'large') { + userSelectedScaleRef.current = 1.0; + + setWorkspaceSize({ + scale: 1.0, + type: undefined, + }); + } else if (size === 'split') { + userSelectedTypeRef.current = 'split'; + + setWorkspaceSize({ + scale: undefined, + type: 'split', + }); + } else if (size === 'overlay') { + userSelectedTypeRef.current = 'overlay'; + + setWorkspaceSize({ + scale: undefined, + type: 'overlay', + }); + } + }; + + const clonePropsOntoWorkspace = () => ( + React.cloneElement(workspace, { + id: `${id}-workspace-container`, + isOpen: workspaceIsVisible, + onRequestClose: () => { + setWorkspaceIsVisible(false); + }, + isPresentedAsOverlay: hasOverlayWorkspace, + sizeScalar: workspaceSize.scale, + activeSize: getActiveSizeForWorkspaceSize(workspaceSize), + sizeOptions: getSizeOptionsForBreakpoint(activeBreakpoint), + onRequestSizeChange: handleOnRequestSizeChange, + }) + ); + + React.useEffect(() => { + if (!skipToCallback) { + return; + } + + const skipToAction = () => { + if (!workspaceIsVisible) { + setWorkspaceIsVisible(true); + } else { + setTimeout(() => { + workspacePanelRef.current.focus(); + }, 0); + } + }; + + skipToCallback(skipToAction); + }, [skipToCallback, workspaceIsVisible]); + + const renderResizeHandle = () => { + if (!isLargeFormFactor) { + return undefined; + } + + return ( +
+ { + resizeOverlayRef.current.style.display = 'block'; + resizeOverlayRef.current.style.backgroundColor = 'rgba(0, 0, 0, 0.3)'; + + workspaceResizeBoundsRef.current = { + range: layoutBodyRef.current.getBoundingClientRect().width - MINIMUM_CONTENT_WIDTH - MINIMUM_WORKSPACE_WIDTH, + currentWidth: workspacePanelRef.current.getBoundingClientRect().width, + }; + + registerBounds({ + range: layoutBodyRef.current.getBoundingClientRect().width - MINIMUM_CONTENT_WIDTH - MINIMUM_WORKSPACE_WIDTH, + currentWidth: workspacePanelRef.current.getBoundingClientRect().width, + }); + }} + onResizeStop={(position) => { + resizeOverlayRef.current.style.display = 'none'; + resizeOverlayRef.current.style.backgroundColor = 'initial'; + + const newWidth = position * -1 + workspaceResizeBoundsRef.current.currentWidth; + const scale = (newWidth - MINIMUM_WORKSPACE_WIDTH) / workspaceResizeBoundsRef.current.range; + + userSelectedTypeRef.current = undefined; + + if (scale >= 1) { + userSelectedScaleRef.current = 1.0; + + setWorkspaceSize({ + scale: 1.0, + type: undefined, + }); + } else if (scale < 0) { + userSelectedScaleRef.current = 0; + + setWorkspaceSize({ + scale: 0, + type: undefined, + }); + } else { + userSelectedScaleRef.current = scale; + + setWorkspaceSize({ + scale, + type: undefined, + }); + } + }} + /> +
+ ); + }; + + const renderWorkspaceOverlay = () => { + if (!workspaceIsVisible || !hasOverlayWorkspace) { + return undefined; + } + + return ( +
{ setWorkspaceIsVisible(false); }} // eslint-disable-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions + /> + ); + }; + + const renderContent = () => ( +
+ + {children} + +
+ ); + + const renderWorkspace = () => { + if (!workspace) { + return undefined; + } + + return ( + <> + {renderResizeHandle()} +
+
+ {clonePropsOntoWorkspace()} +
+
+ {renderWorkspaceOverlay()} + + ); + }; + + return ( +
+
+
+ {renderContent()} + {renderWorkspace()} +
+
+ ); +}; + +WorkspaceLayout.propTypes = propTypes; + +export default WorkspaceLayout; diff --git a/src/application-navigation/private/workspace-layout/WorkspaceLayout.module.scss b/src/application-navigation/private/workspace-layout/WorkspaceLayout.module.scss new file mode 100644 index 000000000..b613d90ab --- /dev/null +++ b/src/application-navigation/private/workspace-layout/WorkspaceLayout.module.scss @@ -0,0 +1,102 @@ +// Themes +@import '../clinical-lowlight-theme/WorkspaceLayout.module'; +@import '../orion-fusion-theme/WorkspaceLayout.module'; + +:local { + .layout-container { + align-items: flex-start; + display: flex; + flex-direction: row; + flex-wrap: nowrap; + height: 100%; + justify-content: stretch; + overflow: hidden; + position: relative; + } + + .layout-body { + align-items: flex-start; + display: flex; + flex: 1 1 auto; + flex-direction: row; + flex-wrap: nowrap; + height: 100%; + justify-content: stretch; + overflow: hidden; + } + + .content-body { + flex: 1 1 320px; + height: 100%; + overflow: hidden; + + .workspace-visible.workspace-split & { + flex: 1 1 auto; + } + } + + .workspace-body { + display: none; + flex: 1 1 320px; + height: 100%; + overflow: hidden; + position: relative; + width: 100%; + z-index: 2; + + .workspace-visible.workspace-split & { + flex: 0 0 auto; + width: 320px; // fix small width to 320 + } + + &.visible { + display: block; + } + + &.overlay { + bottom: 0; + position: absolute; + right: 0; + top: 0; + width: calc(100% - 40px); + } + } + + .workspace-inner { + height: 100%; + overflow: hidden; + position: relative; + width: 100%; + z-index: -1; + } + + .workspace-overlay { + background-color: var(--terra-application-workspace-layout-workspace-overlay-background-color, rgba(0, 0, 0, 0.3)); + bottom: 0; + display: block; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; + } + + .resize-overlay { + bottom: 0; + cursor: col-resize; + display: none; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 5; + } + + .resize-handle-frame { + flex: 0 0 auto; + height: 100%; + position: relative; + width: 0; + z-index: 3; + } +} diff --git a/src/terra-dev-site/app/components.2/ApplicationNavigation.app.mdx b/src/terra-dev-site/app/components.2/ApplicationNavigation.app.mdx index 123f62537..1f7e8840d 100644 --- a/src/terra-dev-site/app/components.2/ApplicationNavigation.app.mdx +++ b/src/terra-dev-site/app/components.2/ApplicationNavigation.app.mdx @@ -1,5 +1,9 @@ import PropsTable from 'terra-application/lib/application-navigation/ApplicationNavigation?dev-site-props-table'; +import ApplicationNavigationWorkspaceProps from 'terra-application/lib/application-navigation/private/workspace-layout/ApplicationNavigationWorkspace?dev-site-props-table'; + import ApplicationNavigationExample from './example/ApplicationNavigationExample?dev-site-example'; +import ApplicationNavigationWorkspaceExample from './example/ApplicationNavigationWorkspaceExample?dev-site-example'; + import { Notice } from '@cerner/terra-docs'; # ApplicationNavigation @@ -233,6 +237,47 @@ const myNotifications = { `onDrawerMenuStateChange` callback allows the consumer to know state changes in Drawer Menu. +### `workspace` +#### Is Required: `false` + +The `workspace` prop allows consumers to render a persistent aside region within the layout. + + + +Only an instance of the `ApplicationNavigation.Workspace` component may be supplied to the `workspace` prop. + + + + + +If a workspace is rendered by the ApplicationNavigation component, children of the component must use the [ApplicationNavigationActionsContext](/application/terra-application/contexts/application-navigation-actions-context) +to render the action controls necessary for its usage. Failure to do so will lead to a lack of user control over the workspace and an inconsistent user experience. + + + +## Subcomponents + +### ApplicationNavigation.Workspace + +The `ApplicationNavigation.Workspace` component defines the interface for presenting content within the ApplicationNavigation's workspace region. + +#### Props + + + +### ApplicationNavigation.Workspace.Item + +The `ApplicationNavigation.Workspace.Item` defines the labeling of a tab within the workspace region as well as its associated content. + +#### Props + +|Prop Name|Type|Is Required|Default Value|Description| +|---|---|---|---|---| +|`itemKey`|string|**required**|none|A unique key used to identify the item. Must be unique within the collection of provided items.| +|`label`|string|**required**|none|A string used to visibly label the content within the workspace.| +|`metaData`|object|optional|none|Additional data that will be returned with callbacks from the workspace component.| +|`render`|func|optional|none|A function executed during rendering to generate content for the item.| + ## Responsive Design The ApplicationNavigation has two rendering modes: `standard` and `compact`. @@ -252,6 +297,8 @@ The ApplicationNavigation has two rendering modes: `standard` and `compact`. + + ## Features ### Exception Handling @@ -293,4 +340,4 @@ check for unsaved changes prior to the pending child's removal. ApplicationNavigation renders a [Suspense](https://reactjs.org/docs/code-splitting.html#reactlazy) component around its children. If any child components or their descendants are lazy loaded using [React.lazy](https://reactjs.org/docs/code-splitting.html#reactlazy), an ApplicationLoadingOverlay will be rendered while the component -is being retrieved. The overlay will render below the ApplicationNavigation header and allow the header to remain interactable. \ No newline at end of file +is being retrieved. The overlay will render below the ApplicationNavigation header and allow the header to remain interactive. diff --git a/src/terra-dev-site/app/components.2/NavigationPromptCheckpoint.app.mdx b/src/terra-dev-site/app/components.2/NavigationPromptCheckpoint.app.mdx index 23d860abc..5d28cae53 100644 --- a/src/terra-dev-site/app/components.2/NavigationPromptCheckpoint.app.mdx +++ b/src/terra-dev-site/app/components.2/NavigationPromptCheckpoint.app.mdx @@ -4,7 +4,7 @@ import NavigationPromptCheckpointProps from 'terra-navigation-prompt/lib/Navigat The NavigationPromptCheckpoint serves as a registration gateway for [NavigationPrompts](/application/terra-application/components/navigation-prompt) rendered within it. Any NavigationPrompt rendered within the context of a NavigationPromptCheckpoint will register itself with the NavigationPromptCheckpoint -(and any other anscestor checkpoints). The component that implements the NavigationPromptCheckpoint can use the presence of registered NavigationPrompts to +(and any other ancestor checkpoints). The component that implements the NavigationPromptCheckpoint can use the presence of registered NavigationPrompts to influence its navigational workflows as necessary. ## Usage diff --git a/src/terra-dev-site/app/components.2/NotificationBanner.mdx b/src/terra-dev-site/app/components.2/NotificationBanner.app.mdx similarity index 87% rename from src/terra-dev-site/app/components.2/NotificationBanner.mdx rename to src/terra-dev-site/app/components.2/NotificationBanner.app.mdx index 603908214..d50651203 100644 --- a/src/terra-dev-site/app/components.2/NotificationBanner.mdx +++ b/src/terra-dev-site/app/components.2/NotificationBanner.app.mdx @@ -1,5 +1,5 @@ +import { Notice } from '@cerner/terra-docs'; import PropsTable from './NotificationBannerPropsTable?dev-site-props-table'; -import NotificationBannerExample from './example/NotificationBannerExample?dev-site-example'; # Notification Banner @@ -7,6 +7,18 @@ A Notification Banner should be rendered by a component that needs to render a n When rendered, the Notification Banner registers itself with the framework so it is prioritized correctly when any other rendered notification banners before they are is displayed in a list above all other content. + + +NotificationBanners are only supported when rendered within the following components: + +* [WorkspaceContent](/application/terra-application/components/workspace-content) +* Modal components disclosed by the [ModalManager](/application/terra-application/components/modal-manager) +* Panel components disclosed by the [SlidePanelManager](/application/terra-application/components/slide-panel-manager) + +Rendering a NotificationBanner outside these locations will result in an exception being thrown. + + + ## Banner Variants The Notification Banner can be used to bring awareness to a user’s risk and non-risk situations that may occur within an application; there are multiple variants provided for common situations. @@ -47,10 +59,6 @@ The expected banner's usage when in the orion-fusion-theme are consistent with t -## Example - - - ## Testing The Notification Banner has the following data attribute available for browser tests: diff --git a/src/terra-dev-site/app/components.2/WorkspaceContent.app.mdx b/src/terra-dev-site/app/components.2/WorkspaceContent.app.mdx new file mode 100644 index 000000000..25808aea3 --- /dev/null +++ b/src/terra-dev-site/app/components.2/WorkspaceContent.app.mdx @@ -0,0 +1,49 @@ +import WorkspaceContentProps from 'terra-application/lib/workspace/WorkspaceContent?dev-site-props-table'; +import WorkspaceContentStatusOverlayProps from 'terra-application/lib/workspace/overlays/WorkspaceContentStatusOverlay?dev-site-props-table'; +import WorkspaceContentStatusOverlayButtonProps from 'terra-application/lib/workspace/shared/StatusLayoutButton?dev-site-props-table'; +import WorkspaceContentActivityOverlayProps from 'terra-application/lib/workspace/overlays/WorkspaceContentActivityOverlay?dev-site-props-table'; + +import { Notice } from '@cerner/terra-docs'; + +# WorkspaceContent + +The WorkspaceContent component is essential for integrating into the workspace. It provides the necessary UI and API hooks to present content consistently in the workspace ecosystem. + +## Usage + +```jsx +import { WorkspaceContent } from 'terra-application/lib/workspace'; +``` + +Please see the [How To Create Workspace Content](/application/terra-application/how-to/create-workspace-content) guide for more usage information. + +## Props + + + +## Subcomponents + +### WorkspaceContent.StatusOverlay + +An instance of the `WorkspaceContent.StatusOverlay` component can be provided to the `statusOverlay` prop to present an interaction-blocking status indicator over the WorkspaceContent's children. + +#### Props + + + +### WorkspaceContent.StatusOverlay.Button + +The `StatusOverlay.Button` component should be supplied as children to the StatusOverlay when actions are desired within the status view. + +#### Props + + + +### WorkspaceContent.ActivityOverlay + +An instance of the `WorkspaceContent.ActivityOverlay` component can be provided to the `activityOverlay` prop to present an interaction-blocking overlay over the WorkspaceContent's children. + +#### Props + + + diff --git a/src/terra-dev-site/app/components.2/example/ApplicationNavigationExample.module.scss b/src/terra-dev-site/app/components.2/example/ApplicationNavigationExample.module.scss index c8d52b035..271950935 100644 --- a/src/terra-dev-site/app/components.2/example/ApplicationNavigationExample.module.scss +++ b/src/terra-dev-site/app/components.2/example/ApplicationNavigationExample.module.scss @@ -3,7 +3,8 @@ height: 400px; } - .page-content { + .page-content, + .workspace-content { padding: 1rem; } } diff --git a/src/terra-dev-site/app/components.2/example/ApplicationNavigationWorkspaceExample.jsx b/src/terra-dev-site/app/components.2/example/ApplicationNavigationWorkspaceExample.jsx new file mode 100644 index 000000000..413b926ab --- /dev/null +++ b/src/terra-dev-site/app/components.2/example/ApplicationNavigationWorkspaceExample.jsx @@ -0,0 +1,168 @@ +import React, { useState } from 'react'; +import classNames from 'classnames/bind'; +import ApplicationNavigation, { + ApplicationNavigationActionsContext, +} from 'terra-application/lib/application-navigation'; +import { WorkspaceContent } from 'terra-application/lib/workspace'; +import NotificationBanner from 'terra-application/lib/notification-banner'; +import Button from 'terra-button'; +import IconEdit from 'terra-icon/lib/icon/IconEdit'; +import IconAdd from 'terra-icon/lib/icon/IconAdd'; +import IconAttachment from 'terra-icon/lib/icon/IconAttachment'; +import Toolbar from 'terra-toolbar'; + +import styles from './ApplicationNavigationExample.module.scss'; + +const cx = classNames.bind(styles); + +// Content to be rendered within the workspace must be rendered using the +// WorkspaceContent component. For this example, we define two components to +// represent both simple and complex scenarios. + +const WorkspaceContent1 = () => ( + +
+

Example Workspace Content 1

+
+
+); + +const WorkspaceContent2 = () => ( + + + + ) : ( + { setActiveNavigationItem(key); }} + onSelectLogout={() => { setLoggedOut(true); }} + workspace={workspace} + > + + {({ actions = [] }) => ( +
+

+ Example Content for + {' '} + {activeNavigationItem} +

+

+ Layout Actions: + {' '} + {actions.map(action => ( + + ))} +

+

+ Last Reported Active Workspace Item: + {' '} + {reportedWorkspaceActiveItem} +

+

+ Last Reported Workspace Size: + {' '} + {reportedWorkspaceSize} +

+

+ Last Reported Workspace Visibility: + {' '} + {reportedWorkspaceVisibility} +

+
+ )} +
+
+ )} +
+ ); +}; + +export default ApplicationNavigationWorkspaceExample; diff --git a/src/terra-dev-site/app/components.2/example/NotificationBannerExample.jsx b/src/terra-dev-site/app/components.2/example/NotificationBannerExample.jsx deleted file mode 100644 index 8748f29dd..000000000 --- a/src/terra-dev-site/app/components.2/example/NotificationBannerExample.jsx +++ /dev/null @@ -1,114 +0,0 @@ -import React, { useState } from 'react'; -import classNamesBind from 'classnames/bind'; -import NotificationBanner from 'terra-application/lib/notification-banner'; -import styles from './CustomBannerVariant.module.scss'; - -const cx = classNamesBind.bind(styles); - -const Example = () => { - const [showHazardHighBanner, setShowHazardHighBanner] = useState(false); - const [showHazardMediumBanner, setShowHazardMediumBanner] = useState(false); - const [showHazardLowBanner, setShowHazardLowBanner] = useState(false); - const [showErrorBanner, setShowErrorBanner] = useState(false); - const [showUnsatisfiedBanner, setShowUnsatisfiedBanner] = useState(false); - const [showUnverifiedBanner, setShowUnverifiedBanner] = useState(false); - const [showCustomBanner, setShowCustomBanner] = useState(false); - - return ( - <> - {showUnsatisfiedBanner && ( - setShowUnsatisfiedBanner(false)} - /> - )} - {showHazardHighBanner && ( - setShowHazardHighBanner(false)} - /> - )} - {showErrorBanner && ( - setShowErrorBanner(false)} - /> - )} - {showHazardMediumBanner && ( - setShowHazardMediumBanner(false)} - /> - )} - {showUnverifiedBanner && ( - setShowUnverifiedBanner(false)} - /> - )} - {showHazardLowBanner && ( - setShowHazardLowBanner(false)} - /> - )} - {showCustomBanner && ( - setShowCustomBanner(false)} - custom={{ - signalWord: 'Check this out!', - customIconClass: cx('custom-notification-banner-icon'), - }} - /> - )} -

Show Banner Options:

- - - - - - - - - ); -}; - -export default Example; diff --git a/src/terra-dev-site/app/contexts.2/ApplicationNavigationActionsContext.app.mdx b/src/terra-dev-site/app/contexts.2/ApplicationNavigationActionsContext.app.mdx new file mode 100644 index 000000000..e0f82f0b0 --- /dev/null +++ b/src/terra-dev-site/app/contexts.2/ApplicationNavigationActionsContext.app.mdx @@ -0,0 +1,27 @@ +# ApplicationNavigationActionsContext + +The ApplicationNavigationActionsContext defines an interface for communicating actions that may be taken to influence an ApplicationNavigation component's state. + +Components rendered within the ApplicationNavigation component as children should respond to changes in this context's value and render appropriate controls for the provided action definitions. + +## Usage + +```jsx +import { ApplicationNavigationActionsContext } from 'terra-application/lib/application-navigation/'; +``` + +## Context Props + +|Key|Type|Description| +|---|---|---| +|`actions`|actionShape|An array of action objects.| + +## Action Props +|Key|Type|Description| +|---|---|---| +|`key`|String|An identifier for the action. This must be unique within the provided actions.| +|`label`|String|A string description for the action. This will be presented to users and should be translated if necessary.| +|`icon`|Node|A graphic representing the action. This may be used by the context consumer to render controls for the action.| +|`onSelect`|Function|A function executed upon selection of the action.| + + diff --git a/src/terra-dev-site/app/demo/AppPage.jsx b/src/terra-dev-site/app/demo/AppPage.jsx index df10f9ec4..1c53187cb 100644 --- a/src/terra-dev-site/app/demo/AppPage.jsx +++ b/src/terra-dev-site/app/demo/AppPage.jsx @@ -7,6 +7,7 @@ import { ActiveBreakpointContext } from 'terra-application/lib/breakpoints'; import ApplicationLoadingOverlay from 'terra-application/lib/application-loading-overlay'; import { ApplicationIntlContext } from 'terra-application/lib/application-intl'; import { ThemeContext } from 'terra-application/lib/theme'; +import { ApplicationNavigationActionsContext } from 'terra-application/lib/application-navigation'; import LoadingOverlayPresenter from './LoadingOverlayPresenter'; import ModalPresenter from './ModalPresenter'; @@ -74,6 +75,23 @@ const AppPage = ({ pageName }) => {

{`The div below uses the theme context to apply styling for theme: ${theme.name}.`}

+ + {({ actions = [] }) => ( +
+

Layout Actions

+ {actions.map(action => ( + + ))} +
+ )} +
); }; diff --git a/src/terra-dev-site/app/demo/DemoAppNavigation.jsx b/src/terra-dev-site/app/demo/DemoAppNavigation.jsx index d46f47470..b3eaa3617 100644 --- a/src/terra-dev-site/app/demo/DemoAppNavigation.jsx +++ b/src/terra-dev-site/app/demo/DemoAppNavigation.jsx @@ -2,9 +2,16 @@ import React, { useRef, useContext, useState, } from 'react'; import IconLightbulb from 'terra-icon/lib/icon/IconLightbulb'; +import Button from 'terra-button'; +import IconEdit from 'terra-icon/lib/icon/IconEdit'; +import IconAdd from 'terra-icon/lib/icon/IconAdd'; +import IconAttachment from 'terra-icon/lib/icon/IconAttachment'; +import Toolbar from 'terra-toolbar'; import ApplicationNavigation from 'terra-application/lib/application-navigation'; import { DisclosureManagerContext } from 'terra-application/lib/disclosure-manager'; +import { WorkspaceContent } from 'terra-application/lib/workspace'; +import NotificationBanner from 'terra-application/lib/notification-banner'; import { ModalContent } from './ModalPresenter'; @@ -17,6 +24,31 @@ const userConfig = { initials: 'DU', }; +const WorkspaceContent1 = () => ( + +
+

Example Workspace Content 1

+
+
+); + +const WorkspaceContent2 = () => ( + + +
+ {showAlertBanner && ( + setShowAlertBanner(false)} + /> + )} + + ); +}; + +MyContent2.labelTranslationId = 'myNamespace.myContent2.label'; + +export default MyContent2; +``` + +## Adding ActivityOverlay to MyContent2 + +The WorkspaceContent component can receive an `activityOverlay` prop that will be rendered over the component's child content. + +The provided `WorkspaceContent.ActivityOverlay` is the only supported component at this time. + +```jsx +import React from 'react'; +import { WorkspaceContent } from 'terra-application/lib/workspace'; +import NotificationBanner from 'terra-application/lib/notification-banner'; + +const MyContent2 = () => { + const [showAlertBanner, setShowAlertBanner] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + + return ( + + ) : undefined} + > +
+

Example Content 2

+ + +
+ {showAlertBanner && ( + setShowAlertBanner(false)} + /> + )} +
+ ); +}; + +MyContent2.labelTranslationId = 'myNamespace.myContent2.label'; + +export default MyContent2; +``` + +## Adding StatusOverlay to MyContent2 + +The WorkspaceContent component can receive an `statusOverlay` prop that will be rendered over the component's other content. + +The provided `WorkspaceContent.StatusOverlay` is the only supported component at this time. + + + +Note that this can be combined with and presented alongside the activity overlay if both props are provided. However, the activity overlay will render on top of the status overlay. + + + +```jsx +import React from 'react'; +import { WorkspaceContent } from 'terra-application/lib/workspace'; +import NotificationBanner from 'terra-application/lib/notification-banner'; + +const MyContent2 = () => { + const [showAlertBanner, setShowAlertBanner] = React.useState(false); + const [isLoading, setIsLoading] = React.useState(false); + const [hasNoResults, setHasNoResults] = React.useState(false); + + return ( + + ) : undefined} + statusOverlay={hasNoResults ? ( + + ) : undefined} + > +
+

Example Content 2

+ + + +
+ {showAlertBanner && ( + setShowAlertBanner(false)} + /> + )} +
+ ); +}; + +MyContent2.labelTranslationId = 'myNamespace.myContent2.label'; + +export default MyContent2; +``` + +## Wrapping Up + +With that, we have demonstrated all capabilities of the WorkspaceContent component. Please review the results in the below example. + + diff --git a/src/terra-dev-site/app/how-to.3/example/WorkspaceContentHowToExample.jsx b/src/terra-dev-site/app/how-to.3/example/WorkspaceContentHowToExample.jsx new file mode 100644 index 000000000..94ecd80bf --- /dev/null +++ b/src/terra-dev-site/app/how-to.3/example/WorkspaceContentHowToExample.jsx @@ -0,0 +1,157 @@ +import React, { useState } from 'react'; +import classNames from 'classnames/bind'; +import ApplicationNavigation, { + ApplicationNavigationActionsContext, +} from 'terra-application/lib/application-navigation'; +import { WorkspaceContent, WorkspaceContext } from 'terra-application/lib/workspace'; +import NotificationBanner from 'terra-application/lib/notification-banner'; +import Button from 'terra-button'; +import Toolbar from 'terra-toolbar'; + +import styles from './WorkspaceContentHowToExample.module.scss'; + +const cx = classNames.bind(styles); + +const MyContent1 = () => { + const { isActive } = React.useContext(WorkspaceContext); + + React.useEffect(() => { + if (isActive) { + // add listeners + + return () => { + // remove listeners + }; + } + + return undefined; + }, [isActive]); + + return ( + + + + +
+ {showAlertBanner && ( + setShowAlertBanner(false)} + /> + )} + + ); +}; + +MyContent2.labelTranslationId = 'myNamespace.myContent2.label'; + +const WorkspaceContentHowToExample = () => { + const [activeNavigationItem, setActiveNavigationItem] = useState('page_1'); + + const workspace = ( + + } + /> + } + /> + + ); + + return ( +
+ { setActiveNavigationItem(key); }} + workspace={workspace} + > + + {({ actions = [] }) => ( +
+

+ Example Content for + {' '} + {activeNavigationItem} +

+

+ Layout Actions: + {' '} + {actions.map(action => ( + + ))} +

+
+ )} +
+
+
+ ); +}; + +export default WorkspaceContentHowToExample; diff --git a/src/terra-dev-site/app/how-to.3/example/WorkspaceContentHowToExample.module.scss b/src/terra-dev-site/app/how-to.3/example/WorkspaceContentHowToExample.module.scss new file mode 100644 index 000000000..271950935 --- /dev/null +++ b/src/terra-dev-site/app/how-to.3/example/WorkspaceContentHowToExample.module.scss @@ -0,0 +1,10 @@ +:local { + .example-container { + height: 400px; + } + + .page-content, + .workspace-content { + padding: 1rem; + } +} diff --git a/src/terra-dev-site/guide/workspace-content.mdx b/src/terra-dev-site/guide/workspace-content.mdx deleted file mode 100644 index 89bd0be0a..000000000 --- a/src/terra-dev-site/guide/workspace-content.mdx +++ /dev/null @@ -1,218 +0,0 @@ -# Workspace Content Guide - -Welcome to the Terra Workspace content guide. This guide will walk through the recommended approach for creating a component to be consumed and presented within a workspaces content area. - -## Summary - -The overall construction of a workspace region is composed of a higher order `Workspace` component and child `WorkspaceItem`'s. The `WorkspaceItem` is comprised of labels, identifiers, and a render function. Within the render function a `WorkspaceContent` component, or a component that wraps it, should be returned. - -## Getting Started - -This guide will walk through structure, exports, and construction of a stand alone WorkspaceContent component. The example component is using the base component from terra-application to provide an API for interacting with the theme. - -## Workspace - Higher Order - -An application and its associated page navigation will have the responsibility of constructing the workspace similar to the example below. - -```jsx -import React from 'react'; -import { Workspace, WorkspaceItem } from 'terra-application/lib/workspace'; - -const MyWorkspace = () => { - return ( - setActiveKey(metaData.key)} - > - } - /> - } - /> - } - /> - - ); -}; - -export default MyWorkspace; -``` - -We will be focusing on the content within the renders, in this example as shown by `MyContent1` and `MyContent2`. - -## Workspace - Content - -While the WorkspaceContent component can be wrapped for composition/state management, there should be no structural/layout elements between the WorkspaceItem and the WorkspaceContent. - -A WorkspaceContent element can receive toolbar and children props. - -The toolbar will be injected into the layout by the WorkspaceContent itself. This pattern is similar to the terra-content-container and header/footer nodes. - -The child component will be placed within a scroll-able region. - -*Best Practice* -As applications will be pulling in multiple workspaces and multiple components to keep things isolated the best practice is to export a translation string identifier for the content's desired labeling. In this example, we are exporting a constant value as `labelTranslationId`. - -```jsx -import React from 'react'; -import { WorkspaceContent } from 'terra-application/lib/workspace'; - -const MyContent1 = () => { - return ( - } - > - - - ); -}; - -MyContent1.labelTranslationId = 'myModule.myContent1.label'; - -export default MyContent1; -``` - -## Workspace - Managing Active Display - -WorkspaceContent components that are not the currently active display will remain mounted, but will be removed from the DOM. So any dependent logic or listeners that expect to be on the DOM need to be disabled or provided for when no longer on the DOM. In order to facilitate this, the WorkspaceContext provides an `isActive` value that will change when the WorkspaceContent component activates/deactivates. - -Below is an example using hooks to retrieve the `isActive` value. - -```jsx -import React from 'react'; -import { WorkspaceContext } from 'terra-application/lib/workspace'; - -const MyContent2 = () => { - const { isActive } = React.useContext(WorkspaceContext); - - React.useEffect(() => { - if (isActive) { - // add listeners - - return () => { - // remove listeners - } - } - }, [isActive]) - - return ( - - - - ); -}; - -export default MyContent2; -``` - -## Workspace - Notifications - -Each WorkspaceContent component provides a region for rendering notification banners. To render a notification banner, the NotificationBanner provided by terra-application must be rendered as a child or descendent of the WorkspaceContent component. - -```jsx -import React from 'react'; -import NotificationBanner from 'terra-application/lib/notification-banner'; - -const MyContent3 = () => { - const [showAlertBanner, setShowAlertBanner] = useState(false); - - // Note that any NotificationBanner components rendered by MyComponent would also be rendered within the - // WorkspaceContent notification region as WorkspaceContent is an ancestor to this MyComponent instance. - - return ( - - {showAlertBanner && ( - setShowAlertBanner(false)} - /> - )} - - - ); -}; - -export default MyContent2; -``` - -## Workspace - Activity Overlay - -The WorkspaceContent component can receive an `activityOverlay` prop that will be rendered over the component's other content. - -The provided `WorkspaceContentActivityOverlay` is the only supported component at this time. - -```jsx -import React from 'react'; -import { WorkspaceContent, WorkspaceContentActivityOverlay } from 'terra-application/lib/workspace'; - -const MyContent4 = () => { - const [isLoading, setIsLoading] = React.useState(false); - - React.useEffect(() => { - // toggle loading state here - }) - - return ( - : undefined} - > - - - ); -}; - -export default MyContent4; -``` - -## Workspace - Status Overlay - -The WorkspaceContent component can receive an `statusOverlay` prop that will be rendered over the component's other content. - -The provided `WorkspaceContentStatusOverlay` is the only supported component at this time. - -Note that this can be combined with and presented alongside the activity overlay if both props are provided. However, the activity overlay will render on top of the status overlay. - -```jsx -import React from 'react'; -import { WorkspaceContent, WorkspaceContentStatusOverlay } from 'terra-application/lib/workspace'; - -const MyContent5 = () => { - const [hasNoResults, setHasNoResults] = React.useState(false); - - React.useEffect(() => { - // toggle results state here - }) - - return ( - : undefined} - > - - - ); -}; - -export default MyContent5; -``` - -## FAQ - -### If my component is not actively displayed will my state be preserved? - -Yes! Content that is not actively displayed on the DOM remains mounted, so any state captured by your component is maintained. - -### Can I provide my own scrolling via terra-scroll or terra-content-container? - -No. The workspace provides the scroll-able region and the location to render fixed header elements. This region is provided and controlled in order to handle the various keyboard/accessibility concerns associated with the presentation. diff --git a/src/terra-dev-site/test/application-navigation/ApplicationNavigationTest.test.jsx b/src/terra-dev-site/test/application-navigation/ApplicationNavigationTest.test.jsx index 0fdafafe9..6cab523db 100644 --- a/src/terra-dev-site/test/application-navigation/ApplicationNavigationTest.test.jsx +++ b/src/terra-dev-site/test/application-navigation/ApplicationNavigationTest.test.jsx @@ -1,9 +1,12 @@ import React, { useState, useContext } from 'react'; import PropTypes from 'prop-types'; import { ThemeContext } from 'terra-application/lib/theme'; +import ApplicationNavigation, { + ApplicationNavigationActionsContext, +} from 'terra-application/lib/application-navigation'; +import { WorkspaceContent } from '../../../workspace'; import { ApplicationIntlContext } from '../../../application-intl'; import ApplicationBase from '../../../application-base'; -import ApplicationNavigation from '../../../application-navigation'; import NavigationPrompt from '../../../navigation-prompt'; const PendingAction = ({ index, onClick, navDisabled }) => ( @@ -29,6 +32,7 @@ PendingAction.propTypes = { const PageContent = ({ title }) => { const [hasPendingAction1, setHasPendingAction1] = useState(false); const [hasPendingAction2, setHasPendingAction2] = useState(false); + const actionsContext = React.useContext(ApplicationNavigationActionsContext); return (
@@ -49,6 +53,20 @@ const PageContent = ({ title }) => { /> {hasPendingAction1 ? : undefined} {hasPendingAction2 ? : undefined} +

+ Layout Actions: + {' '} + {actionsContext.actions && actionsContext.actions.map(action => ( + + ))} +

); }; @@ -57,6 +75,49 @@ PageContent.propTypes = { title: PropTypes.string, }; +const Tab1 = () => ( + +

Example Workspace Content 1

+
+); + +const Tab2 = () => ( + +

Example Workspace Content 2

+
+); + +const workspace = ( + { + console.log(`Workspace active item: ${newActiveItemKey}`); // eslint-disable-line no-console + }} + onSizeChange={(size) => { + console.log(`Workspace size changed: ${size}`); // eslint-disable-line no-console + }} + onPresentationStateChange={(isPresented) => { + console.log(`Workspace presentation changed. isOpen - ${isPresented}`); // eslint-disable-line no-console + }} + > + } + /> + } + /> + +); + const ApplicationNavigationTest = () => { const applicationIntl = useContext(ApplicationIntlContext); const theme = React.useContext(ThemeContext); @@ -88,6 +149,7 @@ const ApplicationNavigationTest = () => { onSelectLogout={() => { setLoggedOut(true); }} + workspace={workspace} > diff --git a/src/terra-dev-site/test/application-navigation/private/application-navigation/Title.test.jsx b/src/terra-dev-site/test/application-navigation/private/application-navigation/Title.test.jsx index b0cad23a0..3ab47236f 100644 --- a/src/terra-dev-site/test/application-navigation/private/application-navigation/Title.test.jsx +++ b/src/terra-dev-site/test/application-navigation/private/application-navigation/Title.test.jsx @@ -30,11 +30,11 @@ const titleConfigHideTitle = { // TODO: remove terra-application after it is incorporated into dev-site for themes or themes are co-located const TitleTest = () => ( <> - - - - - + + + + + ); diff --git a/src/terra-dev-site/test/application-navigation/private/application-navigation/User.test.jsx b/src/terra-dev-site/test/application-navigation/private/application-navigation/User.test.jsx index a310a3d41..54189d94f 100644 --- a/src/terra-dev-site/test/application-navigation/private/application-navigation/User.test.jsx +++ b/src/terra-dev-site/test/application-navigation/private/application-navigation/User.test.jsx @@ -30,11 +30,11 @@ const userConfigNoInitials = { const UserTest = () => ( <> - - - - - + + + + + ); diff --git a/src/terra-dev-site/test/application-navigation/private/workspace-layout/WorkspaceLayoutClosedTest.test.jsx b/src/terra-dev-site/test/application-navigation/private/workspace-layout/WorkspaceLayoutClosedTest.test.jsx new file mode 100644 index 000000000..bf66aa10b --- /dev/null +++ b/src/terra-dev-site/test/application-navigation/private/workspace-layout/WorkspaceLayoutClosedTest.test.jsx @@ -0,0 +1,101 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ApplicationNavigation, { + ApplicationNavigationActionsContext, +} from 'terra-application/lib/application-navigation'; +import { WorkspaceContent } from 'terra-application/lib/workspace'; +import WorkspaceLayout from 'terra-application/lib/application-navigation/private/workspace-layout/WorkspaceLayout'; + +const PageContent = ({ title }) => { + const actionsContext = React.useContext(ApplicationNavigationActionsContext); + + return ( +
+

{title}

+

+ Layout Actions: + {' '} + {actionsContext.actions && actionsContext.actions.map((action, index) => ( + + ))} +

+
+ ); +}; + +PageContent.propTypes = { + title: PropTypes.string, +}; + +const Tab1 = () => ( + +

Example Workspace Content 1

+
+); + +const Tab2 = () => ( + +

Example Workspace Content 2

+
+); + +const workspace = ( + { + console.log(`Workspace active item: ${newActiveItemKey}`); // eslint-disable-line no-console + }} + onSizeChange={(size) => { + console.log(`Workspace size changed: ${size}`); // eslint-disable-line no-console + }} + onPresentationStateChange={(isPresented) => { + console.log(`Workspace presentation changed. isOpen - ${isPresented}`); // eslint-disable-line no-console + }} + > + } + /> + } + /> + +); + +const WorkspaceLayoutTest = () => { + const actionRef = React.useRef(); + const [isToggleEnabled, setIsToggleEnabled] = React.useState(false); + + return ( + { + actionRef.current = actionFunc; + setIsToggleEnabled(!!actionRef.current); + }} + > + actionRef.current() : null} + /> + + ); +}; + +export default WorkspaceLayoutTest; diff --git a/src/terra-dev-site/test/application-navigation/private/workspace-layout/WorkspaceLayoutOpenTest.test.jsx b/src/terra-dev-site/test/application-navigation/private/workspace-layout/WorkspaceLayoutOpenTest.test.jsx new file mode 100644 index 000000000..9d31eae5d --- /dev/null +++ b/src/terra-dev-site/test/application-navigation/private/workspace-layout/WorkspaceLayoutOpenTest.test.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import ApplicationNavigation, { + ApplicationNavigationActionsContext, +} from 'terra-application/lib/application-navigation'; +import { WorkspaceContent } from 'terra-application/lib/workspace'; +import WorkspaceLayout from 'terra-application/lib/application-navigation/private/workspace-layout/WorkspaceLayout'; + +const PageContent = ({ title }) => { + const actionsContext = React.useContext(ApplicationNavigationActionsContext); + + return ( +
+

{title}

+

+ Layout Actions: + {' '} + {actionsContext.actions && actionsContext.actions.map((action, index) => ( + + ))} +

+
+ ); +}; + +PageContent.propTypes = { + title: PropTypes.string, +}; + +const Tab1 = () => ( + +

Example Workspace Content 1

+
+); + +const Tab2 = () => ( + +

Example Workspace Content 2

+
+); + +const workspace = ( + { + console.log(`Workspace active item: ${newActiveItemKey}`); // eslint-disable-line no-console + }} + onSizeChange={(size) => { + console.log(`Workspace size changed: ${size}`); // eslint-disable-line no-console + }} + onPresentationStateChange={(isPresented) => { + console.log(`Workspace presentation changed. isOpen - ${isPresented}`); // eslint-disable-line no-console + }} + > + } + /> + } + /> + +); + +const WorkspaceLayoutTest = () => { + const actionRef = React.useRef(); + const [isToggleEnabled, setIsToggleEnabled] = React.useState(false); + + return ( + { + actionRef.current = actionFunc; + setIsToggleEnabled(!!actionRef.current); + }} + > + actionRef.current() : null} + /> + + ); +}; + +export default WorkspaceLayoutTest; diff --git a/src/terra-dev-site/test/workspace/Tab1.jsx b/src/terra-dev-site/test/workspace/Tab1.jsx index 1b6b6588e..24e870ab8 100644 --- a/src/terra-dev-site/test/workspace/Tab1.jsx +++ b/src/terra-dev-site/test/workspace/Tab1.jsx @@ -5,7 +5,7 @@ import IconEdit from 'terra-icon/lib/icon/IconEdit'; import IconAdd from 'terra-icon/lib/icon/IconAdd'; import IconAttachment from 'terra-icon/lib/icon/IconAttachment'; -import { WorkspaceContent, WorkspaceContentActivityOverlay, WorkspaceContentStatusOverlay } from '../../../workspace'; +import { WorkspaceContent } from '../../../workspace'; import MockContent from './MockContent'; @@ -22,14 +22,12 @@ const Tab1 = () => {
} + id="test-application-id" navigationItems={ Array [ Object { diff --git a/tests/jest/application-navigation/private/ApplicationNavigation.test.jsx b/tests/jest/application-navigation/private/ApplicationNavigation.test.jsx index a775889c5..4182cf498 100644 --- a/tests/jest/application-navigation/private/ApplicationNavigation.test.jsx +++ b/tests/jest/application-navigation/private/ApplicationNavigation.test.jsx @@ -1,10 +1,28 @@ import React from 'react'; import { ActiveBreakpointContext } from 'terra-breakpoints'; import ThemeContextProvider from 'terra-theme-context/lib/ThemeContextProvider'; +import { IntlProvider } from 'react-intl'; /* eslint-disable-next-line import/no-extraneous-dependencies */ -import { mountWithIntl } from 'terra-enzyme-intl'; +import { mountWithIntl, mockIntl } from 'terra-enzyme-intl'; +import { ApplicationIntlContext } from '../../../../src/application-intl'; import ApplicationNavigation from '../../../../src/application-navigation/private/ApplicationNavigation'; +/* eslint-disable react/prop-types */ +const MockApplication = ({ children }) => ( + // eslint-disable-next-line compat/compat + property, + getOwnPropertyDescriptor: () => ({ configurable: true, enumerable: true }), // important for new checks in react-intl v5 + })} + > + + {children} + + +); + describe('ApplicationNavigation', () => { let reactUseContext; let breakpointContextValue; @@ -108,9 +126,11 @@ describe('ApplicationNavigation', () => { it('correctly applies the theme context className', () => { const appNav = mountWithIntl( - - - , + + + + + , ); expect(appNav).toMatchSnapshot(); }); diff --git a/tests/jest/application-navigation/private/__snapshots__/ApplicationNavigation.test.jsx.snap b/tests/jest/application-navigation/private/__snapshots__/ApplicationNavigation.test.jsx.snap index d6466740f..64ed6c641 100644 --- a/tests/jest/application-navigation/private/__snapshots__/ApplicationNavigation.test.jsx.snap +++ b/tests/jest/application-navigation/private/__snapshots__/ApplicationNavigation.test.jsx.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`ApplicationNavigation correctly applies the theme context className 1`] = ` - - -
-
+ -
- +
+ + +
+
+
+
+
+
+
+
+
+ + +
+ +
+
+ - -
+ +
+
- - -
- -
-
- - -
+ +
+
    +
+
+
+ -
- -
-
    -
- - -
- -
- -
- - +
+
+
+
+
+ + + + + + + + + + `; exports[`ApplicationNavigation should render default element 1`] = ` @@ -284,12 +326,17 @@ exports[`ApplicationNavigation should render default element 1`] = ` } utilityItems={Array []} /> -
+ +
+ -
- -
- test child content -
-
+
+ +
+ test child content +
+
+ -
- -
- test child content -
-
+
+ +
+ test child content +
+
+ ( + + + {children} + + +); + +const Tab1 = () => ( + +

Example Workspace Content 1

+
+); + +const Tab2 = () => ( + +

Example Workspace Content 2

+
+); + +const renderWorkspace = (initActive = 'tab-1', initSize = { scale: 0.50 }, initIsOpen = false) => ( + + } + /> + } + /> + +); + +describe('WorkspaceLayout', () => { + test('should render a WorkspaceLayout with default props', () => { + render(( + + + + )); + + const containerNode = document.getElementById('test-id'); + expect(containerNode).toBeInTheDocument(); + + const mainNode = document.getElementById('test-id-content-body'); + expect(mainNode).toBeInTheDocument(); + }); + + test('should render a WorkspaceLayout with main content', () => { + render(( + + +

Test Main Content

+
+
+ )); + + const mainNode = document.getElementById('test-id-content-body'); + expect(mainNode).toBeInTheDocument(); + expect(mainNode).toHaveTextContent('Test Main Content'); + }); + + test('should render a WorkspaceLayout defaulting closed', () => { + render(( + + + + )); + + const panelNode = document.getElementById('test-id-workspace-body'); + expect(panelNode).toBeInTheDocument(); + expect(panelNode).not.toHaveClass('visible'); + expect(panelNode).toHaveAttribute('aria-labelledBy', 'test-id-workspace-container'); + expect(panelNode).toHaveAttribute('tabIndex', '-1'); + expect(panelNode).toHaveTextContent('Example Workspace Content 1'); + }); + + test('should render a WorkspaceLayout defaulting open', () => { + render(( + + + + )); + + const panelNode = document.getElementById('test-id-workspace-body'); + expect(panelNode).toBeInTheDocument(); + expect(panelNode).toHaveClass('visible'); + expect(panelNode).toHaveAttribute('aria-labelledBy', 'test-id-workspace-container'); + expect(panelNode).toHaveAttribute('tabIndex', '-1'); + expect(panelNode).toHaveTextContent('Example Workspace Content 1'); + }); +}); diff --git a/tests/jest/workspace/WorkspaceContent.test.jsx b/tests/jest/workspace/WorkspaceContent.test.jsx index 9baa78ccd..9543c6aab 100644 --- a/tests/jest/workspace/WorkspaceContent.test.jsx +++ b/tests/jest/workspace/WorkspaceContent.test.jsx @@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/react'; import '@testing-library/jest-dom/extend-expect'; import { - WorkspaceContent, WorkspaceContentStatusOverlay, WorkspaceContentActivityOverlay, + WorkspaceContent, } from '../../../src/workspace'; import TabContext from '../../../src/workspace/subcomponents/_TabContext'; import NotificationBanner from '../../../src/notification-banner'; @@ -85,7 +85,7 @@ test('should render given status overlay', () => { render(( } - statusOverlay={} + statusOverlay={} >
@@ -99,7 +99,7 @@ test('should render given activity overlay', () => { render(( } - activityOverlay={} + activityOverlay={} >
@@ -113,8 +113,8 @@ test('should render both status and activity overlays if both are provided', () render(( } - statusOverlay={} - activityOverlay={} + statusOverlay={} + activityOverlay={} >
diff --git a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png index e7a0011cc..7a0db44fa 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png and b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png index 36f34abf5..c67a5535c 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png and b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png index 11ff3406e..4af41ab1f 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png and b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png index d4937b8c6..207b90683 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png and b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png index e7a0011cc..7a0db44fa 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png and b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png index 098639640..17fbb95fd 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png and b/tests/wdio/application-navigation/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png index a7655269c..3b35424cf 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png and b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png index 3d078fbb4..0c7670483 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png and b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png index 79cc8de2d..a1d1efa08 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png and b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png index 54bbb3d9f..05cbbc11f 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png and b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png index a7655269c..3b35424cf 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png and b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png index 5f85311fc..996dfc399 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png and b/tests/wdio/application-navigation/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png index 15ca45b12..717918735 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png and b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/1__primary_navigation_item_prompt.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png index 661d46199..bf9330661 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png and b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/2__primary_navigation_item_prompt_reject.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png index 61d145fe2..32da527d1 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png and b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/3__primary_navigation_item_prompt_accept.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png index 13f7deff4..a0ea51588 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png and b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/4__primary_navigation_item_prompt_with_multiple_prompts.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png index 15ca45b12..717918735 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png and b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/5__logout_prompt_item_prompt.png differ diff --git a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png index 8d6f9d034..455b976e8 100644 Binary files a/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png and b/tests/wdio/application-navigation/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/6__logout_prompt_reject.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png b/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png index f0fc5f10c..8af9dd084 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png b/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png index aa892b77d..9bda4ed95 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png b/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png index 2e96c3064..15ba4f242 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/clinical-lowlight-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png b/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png index 38987ac52..6de3656ad 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png b/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png index 623f32625..0953ebee9 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png b/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png index 055cc62bd..a50875208 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/orion-fusion-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png b/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png index f7fbbdf01..37b6b810e 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_large/application-navigation-spec/hero_displays_properly.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png b/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png index 0025ae75a..2aaec1dfb 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_and_user_enters_nav_drawer.png differ diff --git a/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png b/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png index 2b2bb6134..db0e12cce 100644 Binary files a/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png and b/tests/wdio/application-navigation/private/__snapshots__/reference/terra-default-theme/en/chrome_small/application-navigation-spec/hero_enters_the_nav_drawer.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/error/terra-default-theme/en/chrome_undefined/workspace-layout-spec/close_state_closes_with_toggle_action.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/error/terra-default-theme/en/chrome_undefined/workspace-layout-spec/close_state_closes_with_toggle_action.png new file mode 100644 index 000000000..ad6d307e7 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/error/terra-default-theme/en/chrome_undefined/workspace-layout-spec/close_state_closes_with_toggle_action.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/error/terra-default-theme/en/chrome_undefined/workspace-layout-spec/open_state_closes_with_toggle_action.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/error/terra-default-theme/en/chrome_undefined/workspace-layout-spec/open_state_closes_with_toggle_action.png new file mode 100644 index 000000000..2fd5ef954 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/error/terra-default-theme/en/chrome_undefined/workspace-layout-spec/open_state_closes_with_toggle_action.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png new file mode 100644 index 000000000..88f2093a8 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png new file mode 100644 index 000000000..cbb4732b3 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png new file mode 100644 index 000000000..fd29ccb29 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png new file mode 100644 index 000000000..17f76762e Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/clinical-lowlight-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png new file mode 100644 index 000000000..0719bc62c Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png new file mode 100644 index 000000000..eac111165 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png new file mode 100644 index 000000000..621e485a5 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png new file mode 100644 index 000000000..feb05a713 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/orion-fusion-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png new file mode 100644 index 000000000..58ae918e2 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_closed.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png new file mode 100644 index 000000000..9d4ba6b29 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/1__loads_with_workspace_open.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png new file mode 100644 index 000000000..969ef9089 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/2__workspace_closed.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png new file mode 100644 index 000000000..c3fa45229 Binary files /dev/null and b/tests/wdio/application-navigation/workspace-layout/__snapshots__/reference/terra-default-theme/en/chrome_large/workspace-layout-spec/2__workspace_open.png differ diff --git a/tests/wdio/application-navigation/workspace-layout/workspace-layout-spec.js b/tests/wdio/application-navigation/workspace-layout/workspace-layout-spec.js new file mode 100644 index 000000000..bf0ba0bea --- /dev/null +++ b/tests/wdio/application-navigation/workspace-layout/workspace-layout-spec.js @@ -0,0 +1,32 @@ +const selector = '#root'; + +Terra.describeViewports('Workspace Layout', ['large'], () => { + describe('open state', () => { + before(() => browser.url('/raw/tests/terra-application/application-navigation/private/workspace-layout/workspace-layout-open-test')); + + it('initialIsOpen true', () => { + Terra.validates.element('1. loads with workspace open', { selector }); + }); + + it('closes with toggle action', () => { + $('#test-action-id-0').click(); + + Terra.validates.element('2. workspace closed', { selector }); + }); + }); + + describe('close state', () => { + before(() => browser.url('/raw/tests/terra-application/application-navigation/private/workspace-layout/workspace-layout-closed-test')); + + it('initialIsOpen false', () => { + Terra.validates.element('1. loads with workspace closed', { selector }); + }); + + it('opens with toggle action', () => { + $('#test-action-id-0').click(); + $('#test-workspace-0').waitForDisplayed(); + + Terra.validates.element('2. workspace open', { selector }); + }); + }); +}); diff --git a/tests/wdio/modal-manager/__snapshots__/error/terra-default-theme/en/chrome_undefined/modal-manager-spec/ModalManager_dismisses_the_nested_modal_using_the_global_close.png b/tests/wdio/modal-manager/__snapshots__/error/terra-default-theme/en/chrome_undefined/modal-manager-spec/ModalManager_dismisses_the_nested_modal_using_the_global_close.png new file mode 100644 index 000000000..e69de29bb diff --git a/tests/wdio/modal-manager/__snapshots__/error/terra-default-theme/en/chrome_undefined/modal-manager-spec/ModalManager_opens_medium_modal.png b/tests/wdio/modal-manager/__snapshots__/error/terra-default-theme/en/chrome_undefined/modal-manager-spec/ModalManager_opens_medium_modal.png new file mode 100644 index 000000000..e69de29bb diff --git a/tests/wdio/modal-manager/__snapshots__/error/terra-default-theme/en/chrome_undefined/modal-manager-spec/ModalManager_renders_notification_banners_in_modal.png b/tests/wdio/modal-manager/__snapshots__/error/terra-default-theme/en/chrome_undefined/modal-manager-spec/ModalManager_renders_notification_banners_in_modal.png new file mode 100644 index 000000000..e69de29bb diff --git a/translations/de.json b/translations/de.json index f8ad63123..72475aaec 100644 --- a/translations/de.json +++ b/translations/de.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Arbeitsplatz ausblenden", "terraApplication.workspace.workspaceSettingsLabel": "Einstellungen für Arbeitsplatz", "terraApplication.workspace.activityOverlay.loading": "Ladevorgang...", + "terraApplication.workspace.skipToLabel": "Zum Arbeitsplatz", "terraApplication.notificationBanner.dismiss": "Verwerfen", "terraApplication.notificationBanner.info": "Informationen.", "terraApplication.notificationBanner.error": "Fehler.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "{label}-Benachrichtigung neu. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "{label}-Benachrichtigung entfernt. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Schließen", - "terraApplication.navigation.tabs.rollupButtonDescription": "Mehr Navigation", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Mehr Navigation", - "terraApplication.navigation.header.utilityButtonTitleUser": "Benutzereinstellungen", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Optionen", - "terraApplication.navigation.drawerMenu.navigation": "Navigationselemente", - "terraApplication.navigation.drawerMenu.utilities": "Dienstprogrammelemente", "terraApplication.navigation.utilityMenu.logout": "Abmelden", "terraApplication.navigation.utilityMenu.settings": "Einstellungen", "terraApplication.navigation.utilityMenu.help": "Hilfe", "terraApplication.navigation.utilityMenu.headerTitle": "Dienstprogramme", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Weitere Tools", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Weitere Tools", "terraApplication.navigation.tabs.rollupButtonTitle": "Mehr", + "terraApplication.navigation.tabs.rollupButtonDescription": "Mehr Navigation", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Mehr Navigation", "terraApplication.navigation.notifications.new": "Neu", "terraApplication.navigation.header.skipToContentTitle": "Zum Inhalt", - "terraApplication.navigation.header.menuButtonTitle": "Menü" -} + "terraApplication.navigation.header.utilityButtonTitleUser": "Benutzereinstellungen für {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Optionen", + "terraApplication.navigation.header.menuButtonTitle": "Menü", + "terraApplication.navigation.drawerMenu.navigation": "Navigationselemente", + "terraApplication.navigation.drawerMenu.utilities": "Dienstprogrammelemente" +} \ No newline at end of file diff --git a/translations/en-AU.json b/translations/en-AU.json index 91fd7c4fb..11eda77e0 100644 --- a/translations/en-AU.json +++ b/translations/en-AU.json @@ -5,20 +5,17 @@ "terraApplication.unsavedChangesPrompt.multiplePromptMessageOutro": "Changes will be lost if you don't save them. How do you want to proceed?", "terraApplication.unsavedChangesPrompt.acceptButtonText": "Don't Save", "terraApplication.unsavedChangesPrompt.rejectButtonText": "Continue Editing", - "terraApplication.errorBoundary.defaultErrorMessage": "The system encountered an error: {errorDetails}", - "terraApplication.statusLayout.no-data": "No Results", "terraApplication.statusLayout.no-matching-results": "No Matching Results", "terraApplication.statusLayout.not-authorized": "Not Authorized", "terraApplication.statusLayout.error": "Error", - "terraApplication.workspace.workspaceLabel": "Workspace", "terraApplication.workspace.showWorkspaceLabel": "Show Workspace", "terraApplication.workspace.hideWorkspaceLabel": "Hide Workspace", "terraApplication.workspace.workspaceSettingsLabel": "Workspace Settings", "terraApplication.workspace.activityOverlay.loading": "Loading...", - + "terraApplication.workspace.skipToLabel": "Skip To Workspace", "terraApplication.notificationBanner.dismiss": "Dismiss", "terraApplication.notificationBanner.info": "Information.", "terraApplication.notificationBanner.error": "Error.", @@ -28,14 +25,11 @@ "terraApplication.notificationBanner.unsatisfied": "Required Action.", "terraApplication.notificationBanner.unverified": "Outside Records.", "terraApplication.notificationBanner.success": "Success.", - "terraApplication.notifications.regionLabel": "{label} notifications.", "terraApplication.notifications.totalCountLabel": "Total {label} notifications: {count}", "terraApplication.notifications.newNotificationLabel": "New {label} notification. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Removed {label} notification. {bannerType} {bannerDescription}.", - "terraApplication.actionMenu.headerCloseButtonLabel": "Close", - "terraApplication.navigation.utilityMenu.logout": "Logout", "terraApplication.navigation.utilityMenu.settings": "Settings", "terraApplication.navigation.utilityMenu.help": "Help", diff --git a/translations/en-CA.json b/translations/en-CA.json index 91fd7c4fb..11eda77e0 100644 --- a/translations/en-CA.json +++ b/translations/en-CA.json @@ -5,20 +5,17 @@ "terraApplication.unsavedChangesPrompt.multiplePromptMessageOutro": "Changes will be lost if you don't save them. How do you want to proceed?", "terraApplication.unsavedChangesPrompt.acceptButtonText": "Don't Save", "terraApplication.unsavedChangesPrompt.rejectButtonText": "Continue Editing", - "terraApplication.errorBoundary.defaultErrorMessage": "The system encountered an error: {errorDetails}", - "terraApplication.statusLayout.no-data": "No Results", "terraApplication.statusLayout.no-matching-results": "No Matching Results", "terraApplication.statusLayout.not-authorized": "Not Authorized", "terraApplication.statusLayout.error": "Error", - "terraApplication.workspace.workspaceLabel": "Workspace", "terraApplication.workspace.showWorkspaceLabel": "Show Workspace", "terraApplication.workspace.hideWorkspaceLabel": "Hide Workspace", "terraApplication.workspace.workspaceSettingsLabel": "Workspace Settings", "terraApplication.workspace.activityOverlay.loading": "Loading...", - + "terraApplication.workspace.skipToLabel": "Skip To Workspace", "terraApplication.notificationBanner.dismiss": "Dismiss", "terraApplication.notificationBanner.info": "Information.", "terraApplication.notificationBanner.error": "Error.", @@ -28,14 +25,11 @@ "terraApplication.notificationBanner.unsatisfied": "Required Action.", "terraApplication.notificationBanner.unverified": "Outside Records.", "terraApplication.notificationBanner.success": "Success.", - "terraApplication.notifications.regionLabel": "{label} notifications.", "terraApplication.notifications.totalCountLabel": "Total {label} notifications: {count}", "terraApplication.notifications.newNotificationLabel": "New {label} notification. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Removed {label} notification. {bannerType} {bannerDescription}.", - "terraApplication.actionMenu.headerCloseButtonLabel": "Close", - "terraApplication.navigation.utilityMenu.logout": "Logout", "terraApplication.navigation.utilityMenu.settings": "Settings", "terraApplication.navigation.utilityMenu.help": "Help", diff --git a/translations/en-GB.json b/translations/en-GB.json old mode 100755 new mode 100644 index 0d00edf39..ecea324a1 --- a/translations/en-GB.json +++ b/translations/en-GB.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Hide Workspace", "terraApplication.workspace.workspaceSettingsLabel": "Workspace Settings", "terraApplication.workspace.activityOverlay.loading": "Loading...", + "terraApplication.workspace.skipToLabel": "Skip To Workspace", "terraApplication.notificationBanner.dismiss": "Dismiss", "terraApplication.notificationBanner.info": "Information.", "terraApplication.notificationBanner.error": "Error.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "New {label} notification. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Removed {label} notification. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Close", - "terraApplication.navigation.tabs.rollupButtonDescription": "More Navigation", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "More Navigation", - "terraApplication.navigation.header.utilityButtonTitleUser": "User Settings for: {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Options", - "terraApplication.navigation.drawerMenu.navigation": "Navigation Items", - "terraApplication.navigation.drawerMenu.utilities": "Utility Items", - "terraApplication.navigation.utilityMenu.logout": "Logout", + "terraApplication.navigation.utilityMenu.logout": "Log Out", "terraApplication.navigation.utilityMenu.settings": "Settings", "terraApplication.navigation.utilityMenu.help": "Help", "terraApplication.navigation.utilityMenu.headerTitle": "Utilities", "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", "terraApplication.navigation.tabs.rollupButtonTitle": "More", + "terraApplication.navigation.tabs.rollupButtonDescription": "More Navigation", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "More Navigation", "terraApplication.navigation.notifications.new": "New", "terraApplication.navigation.header.skipToContentTitle": "Skip to Content", - "terraApplication.navigation.header.menuButtonTitle": "Menu" + "terraApplication.navigation.header.utilityButtonTitleUser": "User Settings for: {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Options", + "terraApplication.navigation.header.menuButtonTitle": "Menu", + "terraApplication.navigation.drawerMenu.navigation": "Navigation Items", + "terraApplication.navigation.drawerMenu.utilities": "Utility Items" } \ No newline at end of file diff --git a/translations/en-US.json b/translations/en-US.json index 91fd7c4fb..11eda77e0 100644 --- a/translations/en-US.json +++ b/translations/en-US.json @@ -5,20 +5,17 @@ "terraApplication.unsavedChangesPrompt.multiplePromptMessageOutro": "Changes will be lost if you don't save them. How do you want to proceed?", "terraApplication.unsavedChangesPrompt.acceptButtonText": "Don't Save", "terraApplication.unsavedChangesPrompt.rejectButtonText": "Continue Editing", - "terraApplication.errorBoundary.defaultErrorMessage": "The system encountered an error: {errorDetails}", - "terraApplication.statusLayout.no-data": "No Results", "terraApplication.statusLayout.no-matching-results": "No Matching Results", "terraApplication.statusLayout.not-authorized": "Not Authorized", "terraApplication.statusLayout.error": "Error", - "terraApplication.workspace.workspaceLabel": "Workspace", "terraApplication.workspace.showWorkspaceLabel": "Show Workspace", "terraApplication.workspace.hideWorkspaceLabel": "Hide Workspace", "terraApplication.workspace.workspaceSettingsLabel": "Workspace Settings", "terraApplication.workspace.activityOverlay.loading": "Loading...", - + "terraApplication.workspace.skipToLabel": "Skip To Workspace", "terraApplication.notificationBanner.dismiss": "Dismiss", "terraApplication.notificationBanner.info": "Information.", "terraApplication.notificationBanner.error": "Error.", @@ -28,14 +25,11 @@ "terraApplication.notificationBanner.unsatisfied": "Required Action.", "terraApplication.notificationBanner.unverified": "Outside Records.", "terraApplication.notificationBanner.success": "Success.", - "terraApplication.notifications.regionLabel": "{label} notifications.", "terraApplication.notifications.totalCountLabel": "Total {label} notifications: {count}", "terraApplication.notifications.newNotificationLabel": "New {label} notification. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Removed {label} notification. {bannerType} {bannerDescription}.", - "terraApplication.actionMenu.headerCloseButtonLabel": "Close", - "terraApplication.navigation.utilityMenu.logout": "Logout", "terraApplication.navigation.utilityMenu.settings": "Settings", "terraApplication.navigation.utilityMenu.help": "Help", diff --git a/translations/en.json b/translations/en.json index 91fd7c4fb..11eda77e0 100644 --- a/translations/en.json +++ b/translations/en.json @@ -5,20 +5,17 @@ "terraApplication.unsavedChangesPrompt.multiplePromptMessageOutro": "Changes will be lost if you don't save them. How do you want to proceed?", "terraApplication.unsavedChangesPrompt.acceptButtonText": "Don't Save", "terraApplication.unsavedChangesPrompt.rejectButtonText": "Continue Editing", - "terraApplication.errorBoundary.defaultErrorMessage": "The system encountered an error: {errorDetails}", - "terraApplication.statusLayout.no-data": "No Results", "terraApplication.statusLayout.no-matching-results": "No Matching Results", "terraApplication.statusLayout.not-authorized": "Not Authorized", "terraApplication.statusLayout.error": "Error", - "terraApplication.workspace.workspaceLabel": "Workspace", "terraApplication.workspace.showWorkspaceLabel": "Show Workspace", "terraApplication.workspace.hideWorkspaceLabel": "Hide Workspace", "terraApplication.workspace.workspaceSettingsLabel": "Workspace Settings", "terraApplication.workspace.activityOverlay.loading": "Loading...", - + "terraApplication.workspace.skipToLabel": "Skip To Workspace", "terraApplication.notificationBanner.dismiss": "Dismiss", "terraApplication.notificationBanner.info": "Information.", "terraApplication.notificationBanner.error": "Error.", @@ -28,14 +25,11 @@ "terraApplication.notificationBanner.unsatisfied": "Required Action.", "terraApplication.notificationBanner.unverified": "Outside Records.", "terraApplication.notificationBanner.success": "Success.", - "terraApplication.notifications.regionLabel": "{label} notifications.", "terraApplication.notifications.totalCountLabel": "Total {label} notifications: {count}", "terraApplication.notifications.newNotificationLabel": "New {label} notification. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Removed {label} notification. {bannerType} {bannerDescription}.", - "terraApplication.actionMenu.headerCloseButtonLabel": "Close", - "terraApplication.navigation.utilityMenu.logout": "Logout", "terraApplication.navigation.utilityMenu.settings": "Settings", "terraApplication.navigation.utilityMenu.help": "Help", diff --git a/translations/es-ES.json b/translations/es-ES.json old mode 100755 new mode 100644 index 124d2b47f..293d1e4ef --- a/translations/es-ES.json +++ b/translations/es-ES.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Ocultar área de trabajo", "terraApplication.workspace.workspaceSettingsLabel": "Configuración del área de trabajo", "terraApplication.workspace.activityOverlay.loading": "Cargando...", + "terraApplication.workspace.skipToLabel": "Pasar al Espacio de trabajo", "terraApplication.notificationBanner.dismiss": "Descartar", "terraApplication.notificationBanner.info": "Información.", "terraApplication.notificationBanner.error": "Error.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nueva {label} notificación. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Notificación {label} quitada. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Cerrar", - "terraApplication.navigation.tabs.rollupButtonDescription": "Más opciones de navegación", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Más opciones de navegación", - "terraApplication.navigation.header.utilityButtonTitleUser": "Configuración del usuario para: {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opciones", - "terraApplication.navigation.drawerMenu.navigation": "Elementos de navegación", - "terraApplication.navigation.drawerMenu.utilities": "Elementos de utilidades", "terraApplication.navigation.utilityMenu.logout": "Cerrar sesión", "terraApplication.navigation.utilityMenu.settings": "Configuración", "terraApplication.navigation.utilityMenu.help": "Ayuda", "terraApplication.navigation.utilityMenu.headerTitle": "Utilidades", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Herramientas adicionales", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Herramientas adicionales", "terraApplication.navigation.tabs.rollupButtonTitle": "Más", + "terraApplication.navigation.tabs.rollupButtonDescription": "Más opciones de navegación", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Más opciones de navegación", "terraApplication.navigation.notifications.new": "Nuevo", "terraApplication.navigation.header.skipToContentTitle": "Saltar al contenido", - "terraApplication.navigation.header.menuButtonTitle": "Menú" + "terraApplication.navigation.header.utilityButtonTitleUser": "Configuración del usuario para: {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opciones", + "terraApplication.navigation.header.menuButtonTitle": "Menú", + "terraApplication.navigation.drawerMenu.navigation": "Elementos de navegación", + "terraApplication.navigation.drawerMenu.utilities": "Elementos de utilidades" } \ No newline at end of file diff --git a/translations/es-US.json b/translations/es-US.json old mode 100755 new mode 100644 index ea5697e43..293d1e4ef --- a/translations/es-US.json +++ b/translations/es-US.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Ocultar área de trabajo", "terraApplication.workspace.workspaceSettingsLabel": "Configuración del área de trabajo", "terraApplication.workspace.activityOverlay.loading": "Cargando...", + "terraApplication.workspace.skipToLabel": "Pasar al Espacio de trabajo", "terraApplication.notificationBanner.dismiss": "Descartar", "terraApplication.notificationBanner.info": "Información.", "terraApplication.notificationBanner.error": "Error.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nueva {label} notificación. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Notificación {label} quitada. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Cerrar", - "terraApplication.navigation.tabs.rollupButtonDescription": "Más opciones de navegación", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Más opciones de navegación", - "terraApplication.navigation.header.utilityButtonTitleUser": "Configuración del usuario para: {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opciones", - "terraApplication.navigation.drawerMenu.navigation": "Elementos de navegación", - "terraApplication.navigation.drawerMenu.utilities": "Elementos de utilidades", "terraApplication.navigation.utilityMenu.logout": "Cerrar sesión", "terraApplication.navigation.utilityMenu.settings": "Configuración", "terraApplication.navigation.utilityMenu.help": "Ayuda", "terraApplication.navigation.utilityMenu.headerTitle": "Utilidades", - "terraApplication.navigation.extensions.rollupButtonDescription": "Elementos adicionales", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Elementos adicionales", + "terraApplication.navigation.extensions.rollupButtonDescription": "Herramientas adicionales", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Herramientas adicionales", "terraApplication.navigation.tabs.rollupButtonTitle": "Más", + "terraApplication.navigation.tabs.rollupButtonDescription": "Más opciones de navegación", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Más opciones de navegación", "terraApplication.navigation.notifications.new": "Nuevo", "terraApplication.navigation.header.skipToContentTitle": "Saltar al contenido", - "terraApplication.navigation.header.menuButtonTitle": "Menú" + "terraApplication.navigation.header.utilityButtonTitleUser": "Configuración del usuario para: {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opciones", + "terraApplication.navigation.header.menuButtonTitle": "Menú", + "terraApplication.navigation.drawerMenu.navigation": "Elementos de navegación", + "terraApplication.navigation.drawerMenu.utilities": "Elementos de utilidades" } \ No newline at end of file diff --git a/translations/es.json b/translations/es.json old mode 100755 new mode 100644 index ea5697e43..293d1e4ef --- a/translations/es.json +++ b/translations/es.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Ocultar área de trabajo", "terraApplication.workspace.workspaceSettingsLabel": "Configuración del área de trabajo", "terraApplication.workspace.activityOverlay.loading": "Cargando...", + "terraApplication.workspace.skipToLabel": "Pasar al Espacio de trabajo", "terraApplication.notificationBanner.dismiss": "Descartar", "terraApplication.notificationBanner.info": "Información.", "terraApplication.notificationBanner.error": "Error.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nueva {label} notificación. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Notificación {label} quitada. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Cerrar", - "terraApplication.navigation.tabs.rollupButtonDescription": "Más opciones de navegación", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Más opciones de navegación", - "terraApplication.navigation.header.utilityButtonTitleUser": "Configuración del usuario para: {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opciones", - "terraApplication.navigation.drawerMenu.navigation": "Elementos de navegación", - "terraApplication.navigation.drawerMenu.utilities": "Elementos de utilidades", "terraApplication.navigation.utilityMenu.logout": "Cerrar sesión", "terraApplication.navigation.utilityMenu.settings": "Configuración", "terraApplication.navigation.utilityMenu.help": "Ayuda", "terraApplication.navigation.utilityMenu.headerTitle": "Utilidades", - "terraApplication.navigation.extensions.rollupButtonDescription": "Elementos adicionales", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Elementos adicionales", + "terraApplication.navigation.extensions.rollupButtonDescription": "Herramientas adicionales", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Herramientas adicionales", "terraApplication.navigation.tabs.rollupButtonTitle": "Más", + "terraApplication.navigation.tabs.rollupButtonDescription": "Más opciones de navegación", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Más opciones de navegación", "terraApplication.navigation.notifications.new": "Nuevo", "terraApplication.navigation.header.skipToContentTitle": "Saltar al contenido", - "terraApplication.navigation.header.menuButtonTitle": "Menú" + "terraApplication.navigation.header.utilityButtonTitleUser": "Configuración del usuario para: {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opciones", + "terraApplication.navigation.header.menuButtonTitle": "Menú", + "terraApplication.navigation.drawerMenu.navigation": "Elementos de navegación", + "terraApplication.navigation.drawerMenu.utilities": "Elementos de utilidades" } \ No newline at end of file diff --git a/translations/fr-FR.json b/translations/fr-FR.json old mode 100755 new mode 100644 index 710c4578e..41887b0b3 --- a/translations/fr-FR.json +++ b/translations/fr-FR.json @@ -1,6 +1,6 @@ { "terraApplication.unsavedChangesPrompt.title": "Modifications non enregistrées", - "terraApplication.unsavedChangesPrompt.singlePromptMessage": "Des modifications apportées au {promptDescription} n'ont pas été enregistrées.", + "terraApplication.unsavedChangesPrompt.singlePromptMessage": "Des modifications apportées au composant {promptDescription} n'ont pas été enregistrées.", "terraApplication.unsavedChangesPrompt.multiplePromptMessageIntro": "Des modifications apportées aux éléments suivants n'ont pas été enregistrées :", "terraApplication.unsavedChangesPrompt.multiplePromptMessageOutro": "Si vous n'enregistrez pas les modifications, elles seront perdues. Comment voulez-vous procéder ?", "terraApplication.unsavedChangesPrompt.acceptButtonText": "Ne pas enregistrer", @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Masquer l'espace de travail", "terraApplication.workspace.workspaceSettingsLabel": "Paramètres de l'espace de travail", "terraApplication.workspace.activityOverlay.loading": "Chargement...", + "terraApplication.workspace.skipToLabel": "Accéder à l'espace de travail", "terraApplication.notificationBanner.dismiss": "Ignorer", "terraApplication.notificationBanner.info": "Informations.", "terraApplication.notificationBanner.error": "Erreur.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nouvelle notification {label}. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Notification {label} supprimée. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Fermer", - "terraApplication.navigation.tabs.rollupButtonDescription": "Liens de navigation supplémentaires", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Liens de navigation supplémentaires", - "terraApplication.navigation.header.utilityButtonTitleUser": "Paramètres utilisateur pour : {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Options", - "terraApplication.navigation.drawerMenu.navigation": "Éléments de navigation", - "terraApplication.navigation.drawerMenu.utilities": "Éléments de l'utilitaire", "terraApplication.navigation.utilityMenu.logout": "Déconnexion", "terraApplication.navigation.utilityMenu.settings": "Paramètres", "terraApplication.navigation.utilityMenu.help": "Aide", "terraApplication.navigation.utilityMenu.headerTitle": "Utilitaires", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Outils supplémentaires", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Outils supplémentaires", "terraApplication.navigation.tabs.rollupButtonTitle": "Plus", + "terraApplication.navigation.tabs.rollupButtonDescription": "Liens de navigation supplémentaires", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Liens de navigation supplémentaires", "terraApplication.navigation.notifications.new": "Nouveau", "terraApplication.navigation.header.skipToContentTitle": "Accéder au contenu", - "terraApplication.navigation.header.menuButtonTitle": "Menu" + "terraApplication.navigation.header.utilityButtonTitleUser": "Paramètres utilisateur pour : {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Options", + "terraApplication.navigation.header.menuButtonTitle": "Menu", + "terraApplication.navigation.drawerMenu.navigation": "Éléments de navigation", + "terraApplication.navigation.drawerMenu.utilities": "Éléments de l'utilitaire" } \ No newline at end of file diff --git a/translations/fr.json b/translations/fr.json old mode 100755 new mode 100644 index 710c4578e..41887b0b3 --- a/translations/fr.json +++ b/translations/fr.json @@ -1,6 +1,6 @@ { "terraApplication.unsavedChangesPrompt.title": "Modifications non enregistrées", - "terraApplication.unsavedChangesPrompt.singlePromptMessage": "Des modifications apportées au {promptDescription} n'ont pas été enregistrées.", + "terraApplication.unsavedChangesPrompt.singlePromptMessage": "Des modifications apportées au composant {promptDescription} n'ont pas été enregistrées.", "terraApplication.unsavedChangesPrompt.multiplePromptMessageIntro": "Des modifications apportées aux éléments suivants n'ont pas été enregistrées :", "terraApplication.unsavedChangesPrompt.multiplePromptMessageOutro": "Si vous n'enregistrez pas les modifications, elles seront perdues. Comment voulez-vous procéder ?", "terraApplication.unsavedChangesPrompt.acceptButtonText": "Ne pas enregistrer", @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Masquer l'espace de travail", "terraApplication.workspace.workspaceSettingsLabel": "Paramètres de l'espace de travail", "terraApplication.workspace.activityOverlay.loading": "Chargement...", + "terraApplication.workspace.skipToLabel": "Accéder à l'espace de travail", "terraApplication.notificationBanner.dismiss": "Ignorer", "terraApplication.notificationBanner.info": "Informations.", "terraApplication.notificationBanner.error": "Erreur.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nouvelle notification {label}. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Notification {label} supprimée. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Fermer", - "terraApplication.navigation.tabs.rollupButtonDescription": "Liens de navigation supplémentaires", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Liens de navigation supplémentaires", - "terraApplication.navigation.header.utilityButtonTitleUser": "Paramètres utilisateur pour : {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Options", - "terraApplication.navigation.drawerMenu.navigation": "Éléments de navigation", - "terraApplication.navigation.drawerMenu.utilities": "Éléments de l'utilitaire", "terraApplication.navigation.utilityMenu.logout": "Déconnexion", "terraApplication.navigation.utilityMenu.settings": "Paramètres", "terraApplication.navigation.utilityMenu.help": "Aide", "terraApplication.navigation.utilityMenu.headerTitle": "Utilitaires", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Outils supplémentaires", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Outils supplémentaires", "terraApplication.navigation.tabs.rollupButtonTitle": "Plus", + "terraApplication.navigation.tabs.rollupButtonDescription": "Liens de navigation supplémentaires", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Liens de navigation supplémentaires", "terraApplication.navigation.notifications.new": "Nouveau", "terraApplication.navigation.header.skipToContentTitle": "Accéder au contenu", - "terraApplication.navigation.header.menuButtonTitle": "Menu" + "terraApplication.navigation.header.utilityButtonTitleUser": "Paramètres utilisateur pour : {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Options", + "terraApplication.navigation.header.menuButtonTitle": "Menu", + "terraApplication.navigation.drawerMenu.navigation": "Éléments de navigation", + "terraApplication.navigation.drawerMenu.utilities": "Éléments de l'utilitaire" } \ No newline at end of file diff --git a/translations/nl-BE.json b/translations/nl-BE.json old mode 100755 new mode 100644 index 44f4a8883..eb3803dae --- a/translations/nl-BE.json +++ b/translations/nl-BE.json @@ -15,12 +15,13 @@ "terraApplication.workspace.hideWorkspaceLabel": "Werkruimte verbergen", "terraApplication.workspace.workspaceSettingsLabel": "Instellingen werkruimte", "terraApplication.workspace.activityOverlay.loading": "Bezig met laden", + "terraApplication.workspace.skipToLabel": "Doorgaan naar werkruimte", "terraApplication.notificationBanner.dismiss": "Negeren", "terraApplication.notificationBanner.info": "Informatie.", "terraApplication.notificationBanner.error": "Fout.", "terraApplication.notificationBanner.warning": "Waarschuwing.", "terraApplication.notificationBanner.alert": "Waarschuwing.", - "terraApplication.notificationBanner.advisory": "Adviserend.", + "terraApplication.notificationBanner.advisory": "Advies.", "terraApplication.notificationBanner.unsatisfied": "Vereiste actie.", "terraApplication.notificationBanner.unverified": "Externe records.", "terraApplication.notificationBanner.success": "Geslaagd.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nieuwe {label}-melding. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Verwijderde {label}-melding. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Sluiten", - "terraApplication.navigation.tabs.rollupButtonDescription": "Meer navigatie", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Meer navigatie", - "terraApplication.navigation.header.utilityButtonTitleUser": "Gebruikersinstellingen voor {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opties", - "terraApplication.navigation.drawerMenu.navigation": "Navigatie-items", - "terraApplication.navigation.drawerMenu.utilities": "Hulp-items", "terraApplication.navigation.utilityMenu.logout": "Afmelden", "terraApplication.navigation.utilityMenu.settings": "Instellingen", "terraApplication.navigation.utilityMenu.help": "Help", "terraApplication.navigation.utilityMenu.headerTitle": "Hulpprogramma's", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Aanvullende tools", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Aanvullende tools", "terraApplication.navigation.tabs.rollupButtonTitle": "Meer", + "terraApplication.navigation.tabs.rollupButtonDescription": "Meer navigatie", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Meer navigatie", "terraApplication.navigation.notifications.new": "Nieuw", "terraApplication.navigation.header.skipToContentTitle": "Doorgaan naar content", - "terraApplication.navigation.header.menuButtonTitle": "Menu" + "terraApplication.navigation.header.utilityButtonTitleUser": "Gebruikersinstellingen voor {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opties", + "terraApplication.navigation.header.menuButtonTitle": "Menu", + "terraApplication.navigation.drawerMenu.navigation": "Navigatie-items", + "terraApplication.navigation.drawerMenu.utilities": "Hulp-items" } \ No newline at end of file diff --git a/translations/nl.json b/translations/nl.json old mode 100755 new mode 100644 index 44f4a8883..eb3803dae --- a/translations/nl.json +++ b/translations/nl.json @@ -15,12 +15,13 @@ "terraApplication.workspace.hideWorkspaceLabel": "Werkruimte verbergen", "terraApplication.workspace.workspaceSettingsLabel": "Instellingen werkruimte", "terraApplication.workspace.activityOverlay.loading": "Bezig met laden", + "terraApplication.workspace.skipToLabel": "Doorgaan naar werkruimte", "terraApplication.notificationBanner.dismiss": "Negeren", "terraApplication.notificationBanner.info": "Informatie.", "terraApplication.notificationBanner.error": "Fout.", "terraApplication.notificationBanner.warning": "Waarschuwing.", "terraApplication.notificationBanner.alert": "Waarschuwing.", - "terraApplication.notificationBanner.advisory": "Adviserend.", + "terraApplication.notificationBanner.advisory": "Advies.", "terraApplication.notificationBanner.unsatisfied": "Vereiste actie.", "terraApplication.notificationBanner.unverified": "Externe records.", "terraApplication.notificationBanner.success": "Geslaagd.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nieuwe {label}-melding. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Verwijderde {label}-melding. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Sluiten", - "terraApplication.navigation.tabs.rollupButtonDescription": "Meer navigatie", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Meer navigatie", - "terraApplication.navigation.header.utilityButtonTitleUser": "Gebruikersinstellingen voor {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opties", - "terraApplication.navigation.drawerMenu.navigation": "Navigatie-items", - "terraApplication.navigation.drawerMenu.utilities": "Hulp-items", "terraApplication.navigation.utilityMenu.logout": "Afmelden", "terraApplication.navigation.utilityMenu.settings": "Instellingen", "terraApplication.navigation.utilityMenu.help": "Help", "terraApplication.navigation.utilityMenu.headerTitle": "Hulpprogramma's", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Aanvullende tools", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Aanvullende tools", "terraApplication.navigation.tabs.rollupButtonTitle": "Meer", + "terraApplication.navigation.tabs.rollupButtonDescription": "Meer navigatie", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Meer navigatie", "terraApplication.navigation.notifications.new": "Nieuw", "terraApplication.navigation.header.skipToContentTitle": "Doorgaan naar content", - "terraApplication.navigation.header.menuButtonTitle": "Menu" + "terraApplication.navigation.header.utilityButtonTitleUser": "Gebruikersinstellingen voor {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opties", + "terraApplication.navigation.header.menuButtonTitle": "Menu", + "terraApplication.navigation.drawerMenu.navigation": "Navigatie-items", + "terraApplication.navigation.drawerMenu.utilities": "Hulp-items" } \ No newline at end of file diff --git a/translations/pt-BR.json b/translations/pt-BR.json old mode 100755 new mode 100644 index f63ba9719..11356b1ff --- a/translations/pt-BR.json +++ b/translations/pt-BR.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Ocultar espaço de trabalho", "terraApplication.workspace.workspaceSettingsLabel": "Configurações do espaço de trabalho", "terraApplication.workspace.activityOverlay.loading": "Carregando...", + "terraApplication.workspace.skipToLabel": "Pular para espaço de trabalho", "terraApplication.notificationBanner.dismiss": "Dispensar", "terraApplication.notificationBanner.info": "Informações.", "terraApplication.notificationBanner.error": "Erro.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nova notificação {label}. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Notificação {label} removida. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Fechar", - "terraApplication.navigation.tabs.rollupButtonDescription": "Mais navegação", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Mais navegação", - "terraApplication.navigation.header.utilityButtonTitleUser": "Configurações do usuário para: {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opções", - "terraApplication.navigation.drawerMenu.navigation": "Itens de navegação", - "terraApplication.navigation.drawerMenu.utilities": "Itens de utilitários", "terraApplication.navigation.utilityMenu.logout": "Logoff", "terraApplication.navigation.utilityMenu.settings": "Configurações", "terraApplication.navigation.utilityMenu.help": "Ajuda", "terraApplication.navigation.utilityMenu.headerTitle": "Utilitários", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Ferramentas adicionais", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Ferramentas adicionais", "terraApplication.navigation.tabs.rollupButtonTitle": "Mais", + "terraApplication.navigation.tabs.rollupButtonDescription": "Mais navegação", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Mais navegação", "terraApplication.navigation.notifications.new": "Novo", "terraApplication.navigation.header.skipToContentTitle": "Pular para conteúdo", - "terraApplication.navigation.header.menuButtonTitle": "Menu" + "terraApplication.navigation.header.utilityButtonTitleUser": "Configurações do usuário para: {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opções", + "terraApplication.navigation.header.menuButtonTitle": "Menu", + "terraApplication.navigation.drawerMenu.navigation": "Itens de navegação", + "terraApplication.navigation.drawerMenu.utilities": "Itens de utilitários" } \ No newline at end of file diff --git a/translations/pt.json b/translations/pt.json old mode 100755 new mode 100644 index f63ba9719..11356b1ff --- a/translations/pt.json +++ b/translations/pt.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Ocultar espaço de trabalho", "terraApplication.workspace.workspaceSettingsLabel": "Configurações do espaço de trabalho", "terraApplication.workspace.activityOverlay.loading": "Carregando...", + "terraApplication.workspace.skipToLabel": "Pular para espaço de trabalho", "terraApplication.notificationBanner.dismiss": "Dispensar", "terraApplication.notificationBanner.info": "Informações.", "terraApplication.notificationBanner.error": "Erro.", @@ -29,20 +30,20 @@ "terraApplication.notifications.newNotificationLabel": "Nova notificação {label}. {bannerType} {bannerDescription}, {bannerAction}, {bannerDismiss}.", "terraApplication.notifications.removedNotificationLabel": "Notificação {label} removida. {bannerType} {bannerDescription}.", "terraApplication.actionMenu.headerCloseButtonLabel": "Fechar", - "terraApplication.navigation.tabs.rollupButtonDescription": "Mais navegação", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Mais navegação", - "terraApplication.navigation.header.utilityButtonTitleUser": "Configurações do usuário para: {currentUserName}", - "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opções", - "terraApplication.navigation.drawerMenu.navigation": "Itens de navegação", - "terraApplication.navigation.drawerMenu.utilities": "Itens de utilitários", "terraApplication.navigation.utilityMenu.logout": "Logoff", "terraApplication.navigation.utilityMenu.settings": "Configurações", "terraApplication.navigation.utilityMenu.help": "Ajuda", "terraApplication.navigation.utilityMenu.headerTitle": "Utilitários", - "terraApplication.navigation.extensions.rollupButtonDescription": "Additional Tools", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Additional Tools", + "terraApplication.navigation.extensions.rollupButtonDescription": "Ferramentas adicionais", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Ferramentas adicionais", "terraApplication.navigation.tabs.rollupButtonTitle": "Mais", + "terraApplication.navigation.tabs.rollupButtonDescription": "Mais navegação", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Mais navegação", "terraApplication.navigation.notifications.new": "Novo", "terraApplication.navigation.header.skipToContentTitle": "Pular para conteúdo", - "terraApplication.navigation.header.menuButtonTitle": "Menu" + "terraApplication.navigation.header.utilityButtonTitleUser": "Configurações do usuário para: {currentUserName}", + "terraApplication.navigation.header.utilityButtonTitleNoUser": "Opções", + "terraApplication.navigation.header.menuButtonTitle": "Menu", + "terraApplication.navigation.drawerMenu.navigation": "Itens de navegação", + "terraApplication.navigation.drawerMenu.utilities": "Itens de utilitários" } \ No newline at end of file diff --git a/translations/sv-SE.json b/translations/sv-SE.json old mode 100755 new mode 100644 index 237eeb364..2429c3ff4 --- a/translations/sv-SE.json +++ b/translations/sv-SE.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Dölj arbetsyta", "terraApplication.workspace.workspaceSettingsLabel": "Inställningar för arbetsyta", "terraApplication.workspace.activityOverlay.loading": "Läser in…", + "terraApplication.workspace.skipToLabel": "Gå till arbetsyta", "terraApplication.notificationBanner.dismiss": "Stäng", "terraApplication.notificationBanner.info": "Information.", "terraApplication.notificationBanner.error": "Fel.", @@ -33,16 +34,16 @@ "terraApplication.navigation.utilityMenu.settings": "Inställningar", "terraApplication.navigation.utilityMenu.help": "Hjälp", "terraApplication.navigation.utilityMenu.headerTitle": "Verktyg", - "terraApplication.navigation.extensions.rollupButtonDescription": "Ytterligare objekt", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Ytterligare objekt", + "terraApplication.navigation.extensions.rollupButtonDescription": "Ytterligare verktyg", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Ytterligare verktyg", "terraApplication.navigation.tabs.rollupButtonTitle": "Mer", "terraApplication.navigation.tabs.rollupButtonDescription": "Fler navigeringslänkar", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Ytterligare avsnitt", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Fler navigeringslänkar", "terraApplication.navigation.notifications.new": "Nytt", "terraApplication.navigation.header.skipToContentTitle": "Gå till Innehåll", "terraApplication.navigation.header.utilityButtonTitleUser": "Användarinställningar för: {currentUserName}", "terraApplication.navigation.header.utilityButtonTitleNoUser": "Alternativ", - "terraApplication.navigation.header.menuButtonTitle": "Växla meny", + "terraApplication.navigation.header.menuButtonTitle": "Meny", "terraApplication.navigation.drawerMenu.navigation": "Navigeringsobjekt", "terraApplication.navigation.drawerMenu.utilities": "Verktygsobjekt" } \ No newline at end of file diff --git a/translations/sv.json b/translations/sv.json old mode 100755 new mode 100644 index 237eeb364..2429c3ff4 --- a/translations/sv.json +++ b/translations/sv.json @@ -15,6 +15,7 @@ "terraApplication.workspace.hideWorkspaceLabel": "Dölj arbetsyta", "terraApplication.workspace.workspaceSettingsLabel": "Inställningar för arbetsyta", "terraApplication.workspace.activityOverlay.loading": "Läser in…", + "terraApplication.workspace.skipToLabel": "Gå till arbetsyta", "terraApplication.notificationBanner.dismiss": "Stäng", "terraApplication.notificationBanner.info": "Information.", "terraApplication.notificationBanner.error": "Fel.", @@ -33,16 +34,16 @@ "terraApplication.navigation.utilityMenu.settings": "Inställningar", "terraApplication.navigation.utilityMenu.help": "Hjälp", "terraApplication.navigation.utilityMenu.headerTitle": "Verktyg", - "terraApplication.navigation.extensions.rollupButtonDescription": "Ytterligare objekt", - "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Ytterligare objekt", + "terraApplication.navigation.extensions.rollupButtonDescription": "Ytterligare verktyg", + "terraApplication.navigation.extensions.rollupMenuHeaderTitle": "Ytterligare verktyg", "terraApplication.navigation.tabs.rollupButtonTitle": "Mer", "terraApplication.navigation.tabs.rollupButtonDescription": "Fler navigeringslänkar", - "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Ytterligare avsnitt", + "terraApplication.navigation.tabs.rollupMenuHeaderTitle": "Fler navigeringslänkar", "terraApplication.navigation.notifications.new": "Nytt", "terraApplication.navigation.header.skipToContentTitle": "Gå till Innehåll", "terraApplication.navigation.header.utilityButtonTitleUser": "Användarinställningar för: {currentUserName}", "terraApplication.navigation.header.utilityButtonTitleNoUser": "Alternativ", - "terraApplication.navigation.header.menuButtonTitle": "Växla meny", + "terraApplication.navigation.header.menuButtonTitle": "Meny", "terraApplication.navigation.drawerMenu.navigation": "Navigeringsobjekt", "terraApplication.navigation.drawerMenu.utilities": "Verktygsobjekt" } \ No newline at end of file