@openmrs/esm-styleguide 8.0.1-pre.3581 → 8.0.1-pre.3592
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -4
- package/dist/empty-card/empty-card.component.d.ts +13 -0
- package/dist/empty-card/index.d.ts +1 -0
- package/dist/error-card/error-card.component.d.ts +11 -0
- package/dist/error-card/index.d.ts +1 -0
- package/dist/error-state/error-state.component.d.ts +6 -0
- package/dist/error-state/index.d.ts +1 -0
- package/dist/internal.d.ts +4 -0
- package/dist/left-nav/index.d.ts +23 -0
- package/dist/modals/index.d.ts +25 -0
- package/dist/notifications/actionable-notification.component.d.ts +20 -0
- package/dist/notifications/active-actionable-notifications.component.d.ts +8 -0
- package/dist/notifications/active-notifications.component.d.ts +8 -0
- package/dist/notifications/index.d.ts +19 -0
- package/dist/notifications/notification.component.d.ts +19 -0
- package/dist/openmrs-esm-styleguide.css +1 -1
- package/dist/openmrs-esm-styleguide.css.map +1 -1
- package/dist/openmrs-esm-styleguide.js +2 -2
- package/dist/openmrs-esm-styleguide.js.map +1 -1
- package/dist/pagination/index.d.ts +1 -0
- package/dist/pagination/pagination.component.d.ts +22 -0
- package/dist/public.d.ts +20 -18
- package/dist/snackbars/active-snackbar.component.d.ts +9 -0
- package/dist/snackbars/index.d.ts +13 -0
- package/dist/snackbars/snackbar.component.d.ts +22 -0
- package/dist/toasts/active-toasts.component.d.ts +9 -0
- package/dist/toasts/index.d.ts +13 -0
- package/dist/toasts/toast.component.d.ts +19 -0
- package/dist/workspaces/action-menu-button/action-menu-button.component.d.ts +11 -0
- package/dist/workspaces/container/action-menu.component.d.ts +9 -0
- package/dist/workspaces/container/workspace-container.component.d.ts +54 -0
- package/dist/workspaces/container/workspace-renderer.component.d.ts +8 -0
- package/dist/workspaces/notification/workspace-notification.component.d.ts +6 -0
- package/dist/workspaces/public.d.ts +4 -0
- package/dist/workspaces/workspace-sidebar-store/useWorkspaceGroupStore.d.ts +11 -0
- package/dist/workspaces/workspaces.d.ts +236 -0
- package/package.json +12 -12
- package/src/cards/card-header.component.tsx +30 -0
- package/src/cards/card-header.module.scss +45 -0
- package/src/cards/index.ts +1 -0
- package/src/declarations.d.ts +14 -2
- package/src/empty-card/empty-card-registration.ts +6 -0
- package/src/empty-card/empty-card.component.tsx +55 -0
- package/src/empty-card/empty-card.module.scss +27 -0
- package/src/empty-card/empty-card.test.tsx +58 -0
- package/src/empty-card/empty-data-illustration.svg +32 -0
- package/src/empty-card/index.ts +1 -0
- package/src/error-card/error-card.component.tsx +35 -0
- package/src/error-card/error-card.module.scss +21 -0
- package/src/error-card/error-card.test.tsx +25 -0
- package/src/error-card/index.ts +1 -0
- package/src/index.ts +5 -3
- package/src/internal.ts +4 -0
- package/src/pagination/index.ts +1 -0
- package/src/pagination/pagination.component.tsx +77 -0
- package/src/pagination/pagination.module.scss +66 -0
- package/src/pagination/pagination.test.tsx +72 -0
- package/src/public.ts +20 -18
- package/src/snackbars/index.tsx +2 -0
- package/src/toasts/index.tsx +2 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './pagination.component';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type PaginationProps as CarbonPaginationProps } from '@carbon/react';
|
|
3
|
+
export interface PaginationProps {
|
|
4
|
+
/** The count of current items displayed */
|
|
5
|
+
currentItems: number;
|
|
6
|
+
/** The count of total items displayed */
|
|
7
|
+
totalItems: number;
|
|
8
|
+
/** The current page number */
|
|
9
|
+
pageNumber: number;
|
|
10
|
+
/** The size of each page */
|
|
11
|
+
pageSize: number;
|
|
12
|
+
/** A callback to be called when the page changes */
|
|
13
|
+
onPageNumberChange?: CarbonPaginationProps['onChange'];
|
|
14
|
+
/** An optional URL the user should be directed to if they click on the link to see all results */
|
|
15
|
+
dashboardLinkUrl?: string;
|
|
16
|
+
/** Optional text to display instead of the default "See all" */
|
|
17
|
+
dashboardLinkLabel?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Re-usable pagination bar
|
|
21
|
+
*/
|
|
22
|
+
export declare const Pagination: React.FC<PaginationProps>;
|
package/dist/public.d.ts
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export { showToast } from './toasts';
|
|
5
|
-
export { showModal } from './modals';
|
|
6
|
-
export * from './workspaces/public';
|
|
7
|
-
export { type ToastDescriptor, type ToastType, type ToastNotificationMeta } from './toasts/toast.component';
|
|
8
|
-
export { showSnackbar } from './snackbars';
|
|
9
|
-
export { type SnackbarDescriptor, type SnackbarType, type SnackbarMeta } from './snackbars/snackbar.component';
|
|
10
|
-
export * from './left-nav';
|
|
1
|
+
export { type StyleguideConfigObject } from './config-schema';
|
|
2
|
+
export * from './cards';
|
|
3
|
+
export * from './custom-overflow-menu';
|
|
11
4
|
export * from './dashboard-extension';
|
|
12
|
-
export * from './error-state';
|
|
13
5
|
export * from './datepicker';
|
|
14
|
-
export * from './
|
|
15
|
-
export * from './
|
|
16
|
-
export * from './
|
|
17
|
-
export * from './
|
|
6
|
+
export * from './diagnosis-tags';
|
|
7
|
+
export * from './empty-card';
|
|
8
|
+
export * from './error-state';
|
|
9
|
+
export * from './error-card';
|
|
18
10
|
export * from './icons/icons';
|
|
11
|
+
export * from './left-nav';
|
|
12
|
+
export * from './location-picker';
|
|
13
|
+
export { showModal } from './modals';
|
|
14
|
+
export { showNotification, showActionableNotification } from './notifications';
|
|
15
|
+
export { type ActionableNotificationDescriptor, type ActionableNotificationType, } from './notifications/actionable-notification.component';
|
|
16
|
+
export { type NotificationDescriptor, type InlineNotificationType } from './notifications/notification.component';
|
|
19
17
|
export * from './page-header';
|
|
18
|
+
export * from './pagination';
|
|
19
|
+
export * from './patient-banner';
|
|
20
|
+
export * from './patient-photo';
|
|
20
21
|
export * from './pictograms/pictograms';
|
|
21
|
-
export
|
|
22
|
-
export
|
|
23
|
-
export
|
|
22
|
+
export * from './responsive-wrapper';
|
|
23
|
+
export { showSnackbar, type SnackbarDescriptor, type SnackbarType, type SnackbarMeta } from './snackbars';
|
|
24
|
+
export { showToast, type ToastDescriptor, type ToastType, type ToastNotificationMeta } from './toasts';
|
|
25
|
+
export * from './workspaces/public';
|
|
24
26
|
export { launchWorkspace2, launchWorkspaceGroup2, closeWorkspaceGroup2, getRegisteredWorkspace2Names, useWorkspace2Context, ActionMenuButton2, Workspace2, type Workspace2Definition, type Workspace2DefinitionProps, } from './workspaces2';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** @module @category UI */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { Subject } from 'rxjs';
|
|
4
|
+
import type { SnackbarMeta } from './snackbar.component';
|
|
5
|
+
interface ActiveSnackbarProps {
|
|
6
|
+
subject: Subject<SnackbarMeta>;
|
|
7
|
+
}
|
|
8
|
+
declare const ActiveSnackbars: React.FC<ActiveSnackbarProps>;
|
|
9
|
+
export default ActiveSnackbars;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SnackbarDescriptor } from './snackbar.component';
|
|
2
|
+
export { type SnackbarDescriptor, type SnackbarType, type SnackbarMeta } from './snackbar.component';
|
|
3
|
+
/**
|
|
4
|
+
* Starts a rendering host for snack bar notifications. Should only be used by the app shell.
|
|
5
|
+
* Under normal conditions there is no need to use this function.
|
|
6
|
+
* @param target The container target that hosts the snack bar notifications.
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderSnackbars(target: HTMLElement | null): void;
|
|
9
|
+
/**
|
|
10
|
+
* Displays a snack bar notification in the UI.
|
|
11
|
+
* @param snackbar The description of the snack bar to display.
|
|
12
|
+
*/
|
|
13
|
+
export declare function showSnackbar(snackbar: SnackbarDescriptor): void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** @module @category UI */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export interface SnackbarProps {
|
|
4
|
+
snackbar: SnackbarMeta;
|
|
5
|
+
closeSnackbar(): void;
|
|
6
|
+
}
|
|
7
|
+
export interface SnackbarDescriptor {
|
|
8
|
+
actionButtonLabel?: string;
|
|
9
|
+
isLowContrast?: boolean;
|
|
10
|
+
kind?: SnackbarType | string;
|
|
11
|
+
onActionButtonClick?: () => void;
|
|
12
|
+
progressActionLabel?: string;
|
|
13
|
+
subtitle?: React.ReactNode;
|
|
14
|
+
timeoutInMs?: number;
|
|
15
|
+
autoClose?: boolean;
|
|
16
|
+
title: string;
|
|
17
|
+
}
|
|
18
|
+
export interface SnackbarMeta extends SnackbarDescriptor {
|
|
19
|
+
id: number;
|
|
20
|
+
}
|
|
21
|
+
export type SnackbarType = 'error' | 'info' | 'info-square' | 'success' | 'warning' | 'warning-alt';
|
|
22
|
+
export declare const Snackbar: React.FC<SnackbarProps>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** @module @category UI */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { Subject } from 'rxjs';
|
|
4
|
+
import type { ToastNotificationMeta } from './toast.component';
|
|
5
|
+
interface ActiveToastsProps {
|
|
6
|
+
subject: Subject<ToastNotificationMeta>;
|
|
7
|
+
}
|
|
8
|
+
declare const ActiveToasts: React.FC<ActiveToastsProps>;
|
|
9
|
+
export default ActiveToasts;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ToastDescriptor } from './toast.component';
|
|
2
|
+
export { type ToastDescriptor, type ToastType, type ToastNotificationMeta } from './toast.component';
|
|
3
|
+
/**
|
|
4
|
+
* Starts a rendering host for toast notifications. Should only be used by the app shell.
|
|
5
|
+
* Under normal conditions there is no need to use this function.
|
|
6
|
+
* @param target The container target that hosts the toast notifications.
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderToasts(target: HTMLElement | null): void;
|
|
9
|
+
/**
|
|
10
|
+
* Displays a toast notification in the UI.
|
|
11
|
+
* @param toast The description of the toast to display.
|
|
12
|
+
*/
|
|
13
|
+
export declare function showToast(toast: ToastDescriptor): void;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** @module @category UI */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export interface ToastProps {
|
|
4
|
+
toast: ToastNotificationMeta;
|
|
5
|
+
closeToast(): void;
|
|
6
|
+
}
|
|
7
|
+
export interface ToastDescriptor {
|
|
8
|
+
description: React.ReactNode;
|
|
9
|
+
onActionButtonClick?: () => void;
|
|
10
|
+
actionButtonLabel?: string;
|
|
11
|
+
kind?: ToastType;
|
|
12
|
+
critical?: boolean;
|
|
13
|
+
title?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ToastNotificationMeta extends ToastDescriptor {
|
|
16
|
+
id: number;
|
|
17
|
+
}
|
|
18
|
+
export type ToastType = 'error' | 'info' | 'info-square' | 'success' | 'warning' | 'warning-alt';
|
|
19
|
+
export declare const Toast: React.FC<ToastProps>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** @module @category Workspace */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export interface ActionMenuButtonProps {
|
|
4
|
+
getIcon: (props: object) => JSX.Element;
|
|
5
|
+
label: string;
|
|
6
|
+
iconDescription: string;
|
|
7
|
+
handler: () => void;
|
|
8
|
+
type: string;
|
|
9
|
+
tagContent?: string | React.ReactNode;
|
|
10
|
+
}
|
|
11
|
+
export declare const ActionMenuButton: React.FC<ActionMenuButtonProps>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** @module @category Workspace */
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export interface ActionMenuProps {
|
|
4
|
+
isWithinWorkspace?: boolean;
|
|
5
|
+
name?: string;
|
|
6
|
+
actionMenuProps?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
export declare function ActionMenu({ isWithinWorkspace, name, actionMenuProps }: ActionMenuProps): React.JSX.Element;
|
|
9
|
+
export default ActionMenu;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface WorkspaceContainerProps {
|
|
3
|
+
contextKey: string;
|
|
4
|
+
overlay?: boolean;
|
|
5
|
+
showSiderailAndBottomNav?: boolean;
|
|
6
|
+
additionalWorkspaceProps?: object;
|
|
7
|
+
actionMenuProps?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Use this component to render the [workspace window](https://zeroheight.com/23a080e38/p/483a22-workspace)
|
|
11
|
+
* in an app such as the patient chart, or a workspace overlay in an app such as the clinic dashboard.
|
|
12
|
+
* This allows workspaces to be opened on the page where this component is mounted. This component
|
|
13
|
+
* must not be mounted multiple times on the same page. If there are multiple apps on a page, only
|
|
14
|
+
* one of those apps should use this component—it "hosts" the workspaces.
|
|
15
|
+
*
|
|
16
|
+
* Workspaces may be opened with the [[launchWorkspace]] function from `@openmrs/esm-framework`
|
|
17
|
+
* (among other options).
|
|
18
|
+
*
|
|
19
|
+
* The `overlay` prop determines whether the workspace is rendered as an overlay or a window.
|
|
20
|
+
* When a workspace window is opened, the other content on the screen will be pushed to the left.
|
|
21
|
+
* When an overlay is opened, it will cover other content on the screen.
|
|
22
|
+
*
|
|
23
|
+
* The context key is a string that appears in the URL, which defines the pages on which workspaces
|
|
24
|
+
* are valid. If the URL changes in a way such that it no longer contains the context key, then
|
|
25
|
+
* all workspaces will be closed. This ensures that, for example, workspaces on the home page do
|
|
26
|
+
* not stay open when the user transitions to the patient dashboard; and also that workspaces do
|
|
27
|
+
* not stay open when the user navigates to a different patient. The context key must be a valid
|
|
28
|
+
* sub-path of the URL, with no initial or trailing slash. So if the URL is
|
|
29
|
+
* `https://example.com/patient/123/foo`, then `patient` and `patient/123` and `123/foo` are valid
|
|
30
|
+
* context keys, but `patient/12` and `pati` are not.
|
|
31
|
+
*
|
|
32
|
+
* An extension slot is provided in the workspace header. Its name is derived from the `featureName` of
|
|
33
|
+
* the top-level component in which it is defined (feature names are generally provided in the lifecycle
|
|
34
|
+
* functions in an app's `index.ts` file). The slot is named `workspace-header-${featureName}-slot`.
|
|
35
|
+
* For the patient chart, this is `workspace-header-patient-chart-slot`.
|
|
36
|
+
*
|
|
37
|
+
* This component also provides the [Siderail and Bottom Nav](https://zeroheight.com/23a080e38/p/948cf1-siderail-and-bottom-nav/b/86907e).
|
|
38
|
+
* To use this, pass the `showSiderailAndBottomNav` prop. The Siderail is rendered on the right side of the screen
|
|
39
|
+
* on desktop, and the Bottom Nav is rendered at the bottom of the screen on tablet or mobile. The sidebar/bottom-nav
|
|
40
|
+
* menu provides an extension slot, to which buttons are attached as extensions. The slot
|
|
41
|
+
* derives its name from the `featureName` of the top-level component in which this `WorkspaceContainer`
|
|
42
|
+
* appears (feature names are generally provided in the lifecycle functions in an app's `index.ts` file).
|
|
43
|
+
* The slot is named `action-menu-${featureName}-items-slot`. For the patient chart, this is
|
|
44
|
+
* `action-menu-patient-chart-items-slot`.
|
|
45
|
+
*
|
|
46
|
+
* This component also provides everything needed for workspace notifications to be rendered.
|
|
47
|
+
*
|
|
48
|
+
* @param props.contextKey The context key (explained above)
|
|
49
|
+
* @param props.additionalWorkspaceProps Additional props to pass to the workspace. Using this is
|
|
50
|
+
* unusual; you will generally want to pass props to the workspace when you open it, using
|
|
51
|
+
* `launchWorkspace`. Use this only for props that will apply to every workspace launched
|
|
52
|
+
* on the page where this component is mounted.
|
|
53
|
+
*/
|
|
54
|
+
export declare function WorkspaceContainer({ contextKey, overlay, showSiderailAndBottomNav, additionalWorkspaceProps, actionMenuProps, }: WorkspaceContainerProps): React.JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type OpenWorkspace } from '../workspaces';
|
|
3
|
+
interface WorkspaceRendererProps {
|
|
4
|
+
workspace: OpenWorkspace;
|
|
5
|
+
additionalPropsFromPage?: object;
|
|
6
|
+
}
|
|
7
|
+
export declare function WorkspaceRenderer({ workspace, additionalPropsFromPage }: WorkspaceRendererProps): React.JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './action-menu-button/action-menu-button.component';
|
|
2
|
+
export * from './container/workspace-container.component';
|
|
3
|
+
export { closeWorkspace, launchWorkspace, navigateAndLaunchWorkspace, useWorkspaces, launchWorkspaceGroup, } from './workspaces';
|
|
4
|
+
export { type DefaultWorkspaceProps, type CloseWorkspaceOptions, type OpenWorkspace, type WorkspacesInfo, type Prompt, } from './workspaces';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This hook is used to interact with the store of a workspace store.
|
|
3
|
+
* A workspace store is defined as a group of workspaces that open in the same workspace group.
|
|
4
|
+
*
|
|
5
|
+
* In case a workspace group is not active, it will be considered as a standalone workspace, and hence this hook will return an empty object and updateFunction as an empty function.
|
|
6
|
+
*
|
|
7
|
+
* @internal
|
|
8
|
+
*
|
|
9
|
+
* @param {string} workspaceGroupName The workspaceGroupName of the workspace used when registering the workspace in the module's routes.json file.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useWorkspaceGroupStore(workspaceGroupName?: string): object;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/** @module @category Workspace */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import type { StoreApi } from 'zustand/vanilla';
|
|
4
|
+
import { type WorkspaceRegistration } from '@openmrs/esm-extensions';
|
|
5
|
+
import { type WorkspaceWindowState } from '@openmrs/esm-globals';
|
|
6
|
+
export interface CloseWorkspaceOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Whether to close the workspace ignoring all the changes present in the workspace.
|
|
9
|
+
*
|
|
10
|
+
* If ignoreChanges is true, the user will not be prompted to save changes before closing
|
|
11
|
+
* even if the `testFcn` passed to `promptBeforeClosing` returns `true`.
|
|
12
|
+
*/
|
|
13
|
+
ignoreChanges?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* If you want to take an action after the workspace is closed, you can pass your function as
|
|
16
|
+
* `onWorkspaceClose`. This function will be called only after the workspace is closed, given
|
|
17
|
+
* that the user might be shown a prompt.
|
|
18
|
+
* @returns void
|
|
19
|
+
*/
|
|
20
|
+
onWorkspaceClose?: () => void;
|
|
21
|
+
/**
|
|
22
|
+
* Controls whether the workspace group should be closed and store to be
|
|
23
|
+
* cleared when this workspace is closed.
|
|
24
|
+
* Defaults to true except when opening a new workspace of the same group.
|
|
25
|
+
*
|
|
26
|
+
* @default true
|
|
27
|
+
*/
|
|
28
|
+
closeWorkspaceGroup?: boolean;
|
|
29
|
+
}
|
|
30
|
+
/** The default parameters received by all workspaces */
|
|
31
|
+
export interface DefaultWorkspaceProps {
|
|
32
|
+
/**
|
|
33
|
+
* Call this function to close the workspace. This function will prompt the user
|
|
34
|
+
* if there are any unsaved changes to workspace.
|
|
35
|
+
*
|
|
36
|
+
* You can pass `onWorkspaceClose` function to be called when the workspace is finally
|
|
37
|
+
* closed, given the user forcefully closes the workspace.
|
|
38
|
+
*/
|
|
39
|
+
closeWorkspace(closeWorkspaceOptions?: CloseWorkspaceOptions): void;
|
|
40
|
+
/**
|
|
41
|
+
* Call this with a no-args function that returns true if the user should be prompted before
|
|
42
|
+
* this workspace is closed; e.g. if there is unsaved data.
|
|
43
|
+
*/
|
|
44
|
+
promptBeforeClosing(testFcn: () => boolean): void;
|
|
45
|
+
/**
|
|
46
|
+
* Call this function to close the workspace after the form is saved. This function
|
|
47
|
+
* will directly close the workspace without any prompt
|
|
48
|
+
*/
|
|
49
|
+
closeWorkspaceWithSavedChanges(closeWorkspaceOptions?: CloseWorkspaceOptions): void;
|
|
50
|
+
/**
|
|
51
|
+
* Use this to set the workspace title if it needs to be set dynamically.
|
|
52
|
+
*
|
|
53
|
+
* Workspace titles generally are set in the workspace declaration in the routes.json file. They can also
|
|
54
|
+
* be set by the workspace launcher by passing `workspaceTitle` in the `additionalProps`
|
|
55
|
+
* parameter of the `launchWorkspace` function. This function is useful when the workspace
|
|
56
|
+
* title needs to be set dynamically.
|
|
57
|
+
*
|
|
58
|
+
* @param title The title to set. If using titleNode, set this to a human-readable string
|
|
59
|
+
* which will identify the workspace in notifications and other places.
|
|
60
|
+
* @param titleNode A React object to put in the workspace header in place of the title. This
|
|
61
|
+
* is useful for displaying custom elements in the header. Note that custom header
|
|
62
|
+
* elements can also be attached to the workspace header extension slots.
|
|
63
|
+
*/
|
|
64
|
+
setTitle(title: string, titleNode?: ReactNode): void;
|
|
65
|
+
}
|
|
66
|
+
export interface WorkspaceWindowSize {
|
|
67
|
+
size: WorkspaceWindowState;
|
|
68
|
+
}
|
|
69
|
+
export interface WorkspaceWindowSizeProviderProps {
|
|
70
|
+
children?: React.ReactNode;
|
|
71
|
+
}
|
|
72
|
+
export interface WorkspaceWindowSizeContext {
|
|
73
|
+
windowSize: WorkspaceWindowSize;
|
|
74
|
+
updateWindowSize?(value: WorkspaceWindowState): any;
|
|
75
|
+
active: boolean;
|
|
76
|
+
}
|
|
77
|
+
export interface Prompt {
|
|
78
|
+
title: string;
|
|
79
|
+
body: string;
|
|
80
|
+
/** Defaults to "Confirm" */
|
|
81
|
+
confirmText?: string;
|
|
82
|
+
onConfirm(): void;
|
|
83
|
+
/** Defaults to "Cancel" */
|
|
84
|
+
cancelText?: string;
|
|
85
|
+
}
|
|
86
|
+
export interface WorkspaceStoreState {
|
|
87
|
+
context: string | null;
|
|
88
|
+
openWorkspaces: Array<OpenWorkspace>;
|
|
89
|
+
prompt: Prompt | null;
|
|
90
|
+
workspaceWindowState: WorkspaceWindowState;
|
|
91
|
+
workspaceGroup?: {
|
|
92
|
+
name: string;
|
|
93
|
+
members: Array<string>;
|
|
94
|
+
cleanup?(): void;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export interface OpenWorkspace extends WorkspaceRegistration, DefaultWorkspaceProps {
|
|
98
|
+
additionalProps: object;
|
|
99
|
+
currentWorkspaceGroup?: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
*
|
|
103
|
+
* @param name Name of the workspace
|
|
104
|
+
* @param ignoreChanges If set to true, the "unsaved changes" modal will never be shown, even if the `promptBeforeClosing` function returns true. The user will not be prompted before closing.
|
|
105
|
+
* @returns true if the workspace can be closed.
|
|
106
|
+
*/
|
|
107
|
+
export declare function canCloseWorkspaceWithoutPrompting(name: string, ignoreChanges?: boolean): boolean;
|
|
108
|
+
interface LaunchWorkspaceGroupArg {
|
|
109
|
+
state: Record<string | symbol | number, any>;
|
|
110
|
+
onWorkspaceGroupLaunch?(): void;
|
|
111
|
+
workspaceGroupCleanup?(): void;
|
|
112
|
+
workspaceToLaunch?: {
|
|
113
|
+
name: string;
|
|
114
|
+
additionalProps?: Record<string | symbol | number, any>;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Launches a workspace group with the specified name and configuration.
|
|
119
|
+
* If there are any open workspaces, it will first close them before launching the new workspace group.
|
|
120
|
+
*
|
|
121
|
+
* @param groupName - The name of the workspace group to launch
|
|
122
|
+
* @param args - Configuration object for launching the workspace group
|
|
123
|
+
* @param args.state - The initial state for the workspace group
|
|
124
|
+
* @param args.onWorkspaceGroupLaunch - Optional callback function to be executed after the workspace group is launched
|
|
125
|
+
* @param args.workspaceGroupCleanup - Optional cleanup function to be executed when the workspace group is closed
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* launchWorkspaceGroup("myGroup", {
|
|
129
|
+
* state: initialState,
|
|
130
|
+
* onWorkspaceGroupLaunch: () => console.log("Workspace group launched"),
|
|
131
|
+
* workspaceGroupCleanup: () => console.log("Cleaning up workspace group")
|
|
132
|
+
* });
|
|
133
|
+
*/
|
|
134
|
+
export declare function launchWorkspaceGroup(groupName: string, args: LaunchWorkspaceGroupArg): void;
|
|
135
|
+
/**
|
|
136
|
+
* This launches a workspace by its name. The workspace must have been registered.
|
|
137
|
+
* Workspaces should be registered in the `routes.json` file.
|
|
138
|
+
*
|
|
139
|
+
* For the workspace to appear, there must be either a `<WorkspaceOverlay />` or
|
|
140
|
+
* a `<WorkspaceWindow />` component rendered.
|
|
141
|
+
*
|
|
142
|
+
* The behavior of this function is as follows:
|
|
143
|
+
*
|
|
144
|
+
* - If no workspaces are open, or if no other workspaces with the same type are open,
|
|
145
|
+
* it will be opened and focused.
|
|
146
|
+
* - If a workspace with the same name is already open, it will be displayed/focused,
|
|
147
|
+
* if it was not already.
|
|
148
|
+
* - If a workspace is launched and a workspace which cannot be hidden is already open,
|
|
149
|
+
* a confirmation modal will pop up warning about closing the currently open workspace.
|
|
150
|
+
* - If another workspace with the same type is open, the workspace will be brought to
|
|
151
|
+
* the front and then a confirmation modal will pop up warning about closing the opened
|
|
152
|
+
* workspace
|
|
153
|
+
*
|
|
154
|
+
* Note that this function just manipulates the workspace store. The UI logic is handled
|
|
155
|
+
* by the components that display workspaces.
|
|
156
|
+
*
|
|
157
|
+
* Additional props can be passed to the workspace component being launched. Passing a
|
|
158
|
+
* prop named `workspaceTitle` will override the title of the workspace.
|
|
159
|
+
*
|
|
160
|
+
* @param name The name of the workspace to launch
|
|
161
|
+
* @param additionalProps Props to pass to the workspace component being launched. Passing
|
|
162
|
+
* a prop named `workspaceTitle` will override the title of the workspace.
|
|
163
|
+
*/
|
|
164
|
+
export declare function launchWorkspace<T extends DefaultWorkspaceProps | object = DefaultWorkspaceProps & {
|
|
165
|
+
[key: string]: any;
|
|
166
|
+
}>(name: string, additionalProps?: Omit<T, keyof DefaultWorkspaceProps> & {
|
|
167
|
+
workspaceTitle?: string;
|
|
168
|
+
}): void;
|
|
169
|
+
/**
|
|
170
|
+
* Use this function to navigate to a new page and launch a workspace on that page.
|
|
171
|
+
*
|
|
172
|
+
* @param options.targetUrl: The URL to navigate to. Will be passed to [[navigate]].
|
|
173
|
+
* @param options.contextKey: The context key used by the target page.
|
|
174
|
+
* @param options.workspaceName: The name of the workspace to launch.
|
|
175
|
+
* @param options.additionalProps: Additional props to pass to the workspace component being launched.
|
|
176
|
+
*/
|
|
177
|
+
export declare function navigateAndLaunchWorkspace({ targetUrl, contextKey, workspaceName, additionalProps, }: {
|
|
178
|
+
targetUrl: string;
|
|
179
|
+
contextKey: string;
|
|
180
|
+
workspaceName: string;
|
|
181
|
+
additionalProps?: object;
|
|
182
|
+
}): void;
|
|
183
|
+
export declare function promptBeforeClosing(workspaceName: string, testFcn: () => boolean): void;
|
|
184
|
+
export declare function getPromptBeforeClosingFcn(workspaceName: string): any;
|
|
185
|
+
export declare function cancelPrompt(): void;
|
|
186
|
+
/**
|
|
187
|
+
* Function to close an opened workspace
|
|
188
|
+
* @param name Workspace registration name
|
|
189
|
+
* @param options Options to close workspace
|
|
190
|
+
*/
|
|
191
|
+
export declare function closeWorkspace(name: string, options?: CloseWorkspaceOptions): boolean;
|
|
192
|
+
/**
|
|
193
|
+
* The set of workspaces is specific to a particular page. This function
|
|
194
|
+
* should be used when transitioning to a new page. If the current
|
|
195
|
+
* workspace data is for a different page, the workspace state is cleared.
|
|
196
|
+
*
|
|
197
|
+
* This is called by the workspace components when they mount.
|
|
198
|
+
* @internal
|
|
199
|
+
*
|
|
200
|
+
* @param contextKey An arbitrary key to identify the current page
|
|
201
|
+
*/
|
|
202
|
+
export declare function changeWorkspaceContext(contextKey: string | null): void;
|
|
203
|
+
export declare const workspaceStore: StoreApi<WorkspaceStoreState>;
|
|
204
|
+
export declare function getWorkspaceStore(): StoreApi<WorkspaceStoreState>;
|
|
205
|
+
export declare function updateWorkspaceWindowState(value: WorkspaceWindowState): void;
|
|
206
|
+
export declare function closeAllWorkspaces(onClosingWorkspaces?: () => void, filter?: (workspace: OpenWorkspace) => boolean): void;
|
|
207
|
+
export interface WorkspacesInfo {
|
|
208
|
+
active: boolean;
|
|
209
|
+
prompt: Prompt | null;
|
|
210
|
+
workspaceWindowState: WorkspaceWindowState;
|
|
211
|
+
workspaces: Array<OpenWorkspace>;
|
|
212
|
+
workspaceGroup?: WorkspaceStoreState['workspaceGroup'];
|
|
213
|
+
}
|
|
214
|
+
export declare function useWorkspaces(): WorkspacesInfo;
|
|
215
|
+
type PromptType = 'closing-workspace' | 'closing-all-workspaces' | 'closing-workspace-launching-new-workspace';
|
|
216
|
+
/**
|
|
217
|
+
* Sets the current prompt according to the prompt type.
|
|
218
|
+
* @param promptType Determines the text and behavior of the prompt
|
|
219
|
+
* @param onConfirmation Function to be called after the user confirms to close the workspace
|
|
220
|
+
* @param workspaceTitle Workspace title to be shown in the prompt
|
|
221
|
+
* @returns
|
|
222
|
+
*/
|
|
223
|
+
export declare function showWorkspacePrompts(promptType: PromptType, onConfirmation?: () => void, workspaceTitle?: string): void;
|
|
224
|
+
export declare function resetWorkspaceStore(): void;
|
|
225
|
+
/**
|
|
226
|
+
* The workspace group store is a store that is specific to the workspace group.
|
|
227
|
+
* If the workspace has its own sidebar, the store will be created.
|
|
228
|
+
* This store can be used to store data that is specific to the workspace group.
|
|
229
|
+
* The store will be same for all the workspaces with same group name.
|
|
230
|
+
*
|
|
231
|
+
* For workspaces launched without a group, the store will be undefined.
|
|
232
|
+
*
|
|
233
|
+
* The store will be cleared when all the workspaces with the store's group name are closed.
|
|
234
|
+
*/
|
|
235
|
+
export declare function getWorkspaceGroupStore(workspaceGroupName: string | undefined, additionalProps?: object): StoreApi<object> | undefined;
|
|
236
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openmrs/esm-styleguide",
|
|
3
|
-
"version": "8.0.1-pre.
|
|
3
|
+
"version": "8.0.1-pre.3592",
|
|
4
4
|
"license": "MPL-2.0",
|
|
5
5
|
"description": "The styleguide for OpenMRS SPA",
|
|
6
6
|
"main": "dist/openmrs-esm-styleguide.js",
|
|
@@ -98,17 +98,17 @@
|
|
|
98
98
|
"swr": "2.x"
|
|
99
99
|
},
|
|
100
100
|
"devDependencies": {
|
|
101
|
-
"@openmrs/esm-api": "8.0.1-pre.
|
|
102
|
-
"@openmrs/esm-config": "8.0.1-pre.
|
|
103
|
-
"@openmrs/esm-emr-api": "8.0.1-pre.
|
|
104
|
-
"@openmrs/esm-error-handling": "8.0.1-pre.
|
|
105
|
-
"@openmrs/esm-extensions": "8.0.1-pre.
|
|
106
|
-
"@openmrs/esm-globals": "8.0.1-pre.
|
|
107
|
-
"@openmrs/esm-navigation": "8.0.1-pre.
|
|
108
|
-
"@openmrs/esm-react-utils": "8.0.1-pre.
|
|
109
|
-
"@openmrs/esm-state": "8.0.1-pre.
|
|
110
|
-
"@openmrs/esm-translations": "8.0.1-pre.
|
|
111
|
-
"@openmrs/esm-utils": "8.0.1-pre.
|
|
101
|
+
"@openmrs/esm-api": "8.0.1-pre.3592",
|
|
102
|
+
"@openmrs/esm-config": "8.0.1-pre.3592",
|
|
103
|
+
"@openmrs/esm-emr-api": "8.0.1-pre.3592",
|
|
104
|
+
"@openmrs/esm-error-handling": "8.0.1-pre.3592",
|
|
105
|
+
"@openmrs/esm-extensions": "8.0.1-pre.3592",
|
|
106
|
+
"@openmrs/esm-globals": "8.0.1-pre.3592",
|
|
107
|
+
"@openmrs/esm-navigation": "8.0.1-pre.3592",
|
|
108
|
+
"@openmrs/esm-react-utils": "8.0.1-pre.3592",
|
|
109
|
+
"@openmrs/esm-state": "8.0.1-pre.3592",
|
|
110
|
+
"@openmrs/esm-translations": "8.0.1-pre.3592",
|
|
111
|
+
"@openmrs/esm-utils": "8.0.1-pre.3592",
|
|
112
112
|
"@rspack/cli": "^1.3.11",
|
|
113
113
|
"@rspack/core": "^1.3.11",
|
|
114
114
|
"@types/geopattern": "^1.2.9",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import classNames from 'classnames';
|
|
3
|
+
import { useLayoutType } from '@openmrs/esm-react-utils';
|
|
4
|
+
import styles from './card-header.module.scss';
|
|
5
|
+
|
|
6
|
+
export interface CardHeaderProps {
|
|
7
|
+
/** The title for this card. This must be a pre-translated string. */
|
|
8
|
+
title: string;
|
|
9
|
+
/** The contents of the card header to render if any. */
|
|
10
|
+
children?: React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Re-usable header component for O3-style cards, like those found on the patient chart
|
|
15
|
+
*/
|
|
16
|
+
export function CardHeader({ title, children }: CardHeaderProps) {
|
|
17
|
+
const isTablet = useLayoutType() === 'tablet';
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
className={classNames({
|
|
22
|
+
[styles.tabletHeader]: isTablet,
|
|
23
|
+
[styles.desktopHeader]: !isTablet,
|
|
24
|
+
})}
|
|
25
|
+
>
|
|
26
|
+
<h4>{title}</h4>
|
|
27
|
+
{children}
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
@use '@carbon/layout';
|
|
2
|
+
@use '@carbon/type';
|
|
3
|
+
@use '../vars' as *;
|
|
4
|
+
|
|
5
|
+
.desktopHeader,
|
|
6
|
+
.tabletHeader {
|
|
7
|
+
display: flex;
|
|
8
|
+
justify-content: space-between;
|
|
9
|
+
align-items: center;
|
|
10
|
+
padding: layout.$spacing-04 0 layout.$spacing-04 layout.$spacing-05;
|
|
11
|
+
background-color: $ui-background;
|
|
12
|
+
|
|
13
|
+
h4:after {
|
|
14
|
+
content: '';
|
|
15
|
+
display: block;
|
|
16
|
+
width: layout.$spacing-07;
|
|
17
|
+
padding-top: 0.188rem;
|
|
18
|
+
border-bottom: 0.375rem solid var(--brand-03);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.desktopHeader {
|
|
23
|
+
height: layout.$spacing-09;
|
|
24
|
+
h4 {
|
|
25
|
+
@include type.type-style('heading-compact-02');
|
|
26
|
+
color: $text-02;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.tabletHeader {
|
|
31
|
+
height: 4.5rem;
|
|
32
|
+
h4 {
|
|
33
|
+
@include type.type-style('heading-03');
|
|
34
|
+
color: $text-02;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Overriding styles for RTL support
|
|
39
|
+
html[dir='rtl'] {
|
|
40
|
+
.desktopHeader,
|
|
41
|
+
.tabletHeader {
|
|
42
|
+
text-align: right;
|
|
43
|
+
padding: layout.$spacing-04 layout.$spacing-05 layout.$spacing-04 0;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CardHeader, type CardHeaderProps } from './card-header.component';
|
package/src/declarations.d.ts
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
|
-
declare module '*.css'
|
|
2
|
-
|
|
1
|
+
declare module '*.css' {
|
|
2
|
+
interface Styles {
|
|
3
|
+
[key: string]: string;
|
|
4
|
+
}
|
|
5
|
+
const content: Styles;
|
|
6
|
+
export default content;
|
|
7
|
+
}
|
|
8
|
+
declare module '*.scss' {
|
|
9
|
+
interface Styles {
|
|
10
|
+
[key: string]: string;
|
|
11
|
+
}
|
|
12
|
+
const content: Styles;
|
|
13
|
+
export default content;
|
|
14
|
+
}
|
|
3
15
|
declare module '*.svg' {
|
|
4
16
|
const content: string;
|
|
5
17
|
export default content;
|