dry-ux 1.58.0 → 1.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,11 @@
1
1
  import * as React from "react";
2
- import { PopUpOptions } from "./UIUtil.interface";
2
+ import { Content, PopUpOptions } from "./UIUtil.interface";
3
+ import "./overlay.css";
3
4
  export interface IModalProps {
4
5
  options: PopUpOptions;
5
6
  handleClose: () => void;
6
7
  shown: boolean;
8
+ overlay: Content;
7
9
  config: {
8
10
  styles?: {
9
11
  [selector: string]: React.CSSProperties;
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const React = require("react");
4
4
  const react_bootstrap_1 = require("react-bootstrap");
5
- const Modal = React.memo(({ handleClose, shown, options: { content, footerContent, cssClass, closeBtn, title, width, onClose, titleCloseBtn = true, centered, trackingId, }, config: { defaultModalStyles = false, styles = {}, setBackdropHeight = true, centered: globalCentered, onOpen, onClose: globalOnClose, }, }) => {
5
+ require("./overlay.css");
6
+ const Modal = React.memo(({ handleClose, shown, overlay, options: { content, footerContent, cssClass, closeBtn, title, width, onClose, titleCloseBtn = true, centered, trackingId, }, config: { defaultModalStyles = false, styles = {}, setBackdropHeight = true, centered: globalCentered, onOpen, onClose: globalOnClose, }, }) => {
6
7
  const isCentered = centered !== null && centered !== void 0 ? centered : globalCentered;
8
+ const modalRef = React.useRef(null);
7
9
  const applyStyles = React.useCallback(() => {
8
10
  document.querySelectorAll(".modal-dialog").forEach((el) => {
9
11
  el.style.width = typeof width == "number" ? `${width}px` : width;
@@ -50,7 +52,9 @@ const Modal = React.memo(({ handleClose, shown, options: { content, footerConten
50
52
  };
51
53
  const contentToRender = typeof content == "string" ? React.createElement("div", { dangerouslySetInnerHTML: { __html: content } }) : content;
52
54
  const showFooter = closeBtn || footerContent;
53
- return (React.createElement(react_bootstrap_1.Modal, { onHide: onHide, show: shown, animation: true, autoFocus: true, keyboard: false, className: cssClass, backdropStyle: { zIndex: 1040, opacity: 0.5 }, backdrop: "static" },
55
+ return (React.createElement(react_bootstrap_1.Modal, { onHide: onHide, show: shown, animation: true, autoFocus: true, keyboard: false, ref: modalRef, className: cssClass, backdropStyle: { zIndex: 1040, opacity: 0.5 }, backdrop: "static" },
56
+ overlay && (React.createElement("div", { className: "dry-ux-overlay" },
57
+ React.createElement("div", { className: "dry-ux-overlay-content" }, overlay))),
54
58
  !!title && (React.createElement(react_bootstrap_1.Modal.Header, { closeButton: titleCloseBtn, onHide: onHide },
55
59
  React.createElement(react_bootstrap_1.Modal.Title, null, title))),
56
60
  React.createElement(react_bootstrap_1.Modal.Body, null, contentToRender),
@@ -1,3 +1,4 @@
1
+ export type Content = JSX.Element | string;
1
2
  export type PopUp = {
2
3
  /**
3
4
  * Hides the modal.
@@ -11,16 +12,29 @@ export type PopUp = {
11
12
  * Removes the modal.
12
13
  */
13
14
  remove: () => void;
15
+ /**
16
+ * The overlay for the modal.
17
+ */
18
+ overlay: {
19
+ /**
20
+ * Shows the overlay.
21
+ */
22
+ show: (content: Content) => void;
23
+ /**
24
+ * Hides the overlay.
25
+ */
26
+ hide: () => void;
27
+ };
14
28
  };
15
29
  export type PopUpOptions = {
16
30
  /**
17
31
  * The content of the modal.
18
32
  */
19
- content: JSX.Element | string;
33
+ content: Content;
20
34
  /**
21
35
  * Footer content of the modal.
22
36
  */
23
- footerContent?: JSX.Element | string;
37
+ footerContent?: Content;
24
38
  /**
25
39
  * The class to apply to the modal.
26
40
  */
@@ -32,7 +46,7 @@ export type PopUpOptions = {
32
46
  /**
33
47
  * The title of the modal.
34
48
  */
35
- title?: JSX.Element | string;
49
+ title?: Content;
36
50
  /**
37
51
  * If true, the modal will have a close button in the title bar.
38
52
  */
@@ -63,7 +77,7 @@ export type PopUpAction = {
63
77
  /**
64
78
  * The content to display in the modal.
65
79
  */
66
- content: JSX.Element | string;
80
+ content: Content;
67
81
  /**
68
82
  * The type of button to display.
69
83
  */
@@ -76,6 +90,10 @@ export type PopUpAction = {
76
90
  * If true, the modal will be closed when the button is clicked.
77
91
  */
78
92
  closeOnClick?: boolean;
93
+ /**
94
+ * If set, confirm overlay will be shown before the action is executed.
95
+ */
96
+ confirm?: Content;
79
97
  };
80
98
  export type UIUtilModal = {
81
99
  /**
@@ -96,6 +114,7 @@ export type UIUtilModal = {
96
114
  [id: string]: {
97
115
  options: PopUpOptions;
98
116
  shown: boolean;
117
+ overlay?: Content;
99
118
  handleClose: (id: string, shown: boolean, destroyOnClose: boolean) => void;
100
119
  };
101
120
  };
@@ -107,7 +126,7 @@ export type UIUtilModal = {
107
126
  * Shows an alert style modal.
108
127
  * @param content The content to display in the modal.
109
128
  */
110
- showAlert: (content: PopUpOptions["content"], onClose?: PopUpOptions["onClose"]) => PopUp;
129
+ showAlert: (content: Content, onClose?: PopUpOptions["onClose"]) => PopUp;
111
130
  /**
112
131
  * Shows a confirm style modal.
113
132
  * @param options The options for the modal.
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { IUIUtilLoader, UIUtilModal, PopUp, PopUpAction, PopUpOptions, UIUtilPrompt } from "./UIUtil.interface";
2
+ import { IUIUtilLoader, UIUtilModal, PopUp, PopUpAction, PopUpOptions, UIUtilPrompt, Content } from "./UIUtil.interface";
3
3
  import "../types";
4
4
  export interface IUIUtilProviderState {
5
5
  modal: UIUtilModal;
@@ -11,18 +11,20 @@ export declare const UIUtilContext: React.Context<IUIUtilProviderState>;
11
11
  export declare const useUIUtilContext: () => IUIUtilProviderState;
12
12
  export declare class UIUtilProvider extends React.PureComponent<{}, IUIUtilProviderState> {
13
13
  private readonly loader;
14
+ private readonly modalId;
14
15
  constructor(props: any);
15
16
  get modalDefaults(): {
16
17
  create: any;
17
18
  show: (options: PopUpOptions) => PopUp;
18
19
  getCurrent: () => PopUp;
19
- showAlert: (content: PopUpOptions["content"], onClose?: PopUpOptions["onClose"]) => PopUp;
20
+ showAlert: (content: Content, onClose?: PopUpOptions["onClose"]) => PopUp;
20
21
  showConfirm: (options: PopUpOptions, onYes: () => void, onNo?: () => void) => PopUp;
21
22
  showActions: (options: PopUpOptions, actions: PopUpAction[]) => PopUp;
22
23
  instances: {
23
24
  [id: string]: {
24
25
  options: PopUpOptions;
25
26
  shown: boolean;
27
+ overlay?: Content;
26
28
  handleClose: (id: string, shown: boolean, destroyOnClose: boolean) => void;
27
29
  };
28
30
  };
@@ -44,11 +46,14 @@ export declare class UIUtilProvider extends React.PureComponent<{}, IUIUtilProvi
44
46
  [id: string]: {
45
47
  options: PopUpOptions;
46
48
  shown: boolean;
49
+ overlay?: Content;
47
50
  handleClose: (id: string, shown: boolean, destroyOnClose: boolean) => void;
48
51
  };
49
52
  };
50
53
  };
51
54
  toggleModalInstance(id: string, shown: boolean, destroyOnClose?: boolean): void;
55
+ toggleModalOverlay(id: string, content?: JSX.Element | string): void;
56
+ getModalActionButtons(actions: PopUpAction[]): React.JSX.Element[];
52
57
  removeModalInstance(id: string): void;
53
58
  getCurrentModal(id: string): PopUp;
54
59
  createModal(id: string, options: PopUpOptions): PopUp;
@@ -38,6 +38,10 @@ class UIUtilProvider extends React.PureComponent {
38
38
  constructor(props) {
39
39
  super(props);
40
40
  this.loader = Loader_1.Loader.getInstance();
41
+ this.modalId = {
42
+ actions: "actions",
43
+ confirm: "confirm",
44
+ };
41
45
  this.state = Object.assign(Object.assign({}, defaultState), { modal: this.modalDefaults, customLoader: this.customLoaderDefaults, loader: this.loaderDefaults, prompt: this.promptDefaults });
42
46
  }
43
47
  get modalDefaults() {
@@ -51,15 +55,12 @@ class UIUtilProvider extends React.PureComponent {
51
55
  closeBtn: true,
52
56
  width: 400,
53
57
  onClose,
54
- }), showConfirm: (options, onYes, onNo) => this.createModal("confirm", Object.assign(Object.assign({}, options), { footerContent: (React.createElement(React.Fragment, null,
58
+ }), showConfirm: (options, onYes, onNo) => this.createModal(this.modalId.confirm, Object.assign(Object.assign({}, options), { footerContent: (React.createElement(React.Fragment, null,
55
59
  options.footerContent,
56
60
  React.createElement(react_bootstrap_1.Button, { bsClass: "btn btn-success mright", onClick: onYes }, "Yes"),
57
- React.createElement(react_bootstrap_1.Button, { bsClass: "btn btn-danger", onClick: () => (onNo ? onNo() : this.toggleModalInstance("confirm", false, true)) }, "No"))) })), showActions: (options, actions) => this.createModal("actions", Object.assign(Object.assign({}, options), { footerContent: (React.createElement(React.Fragment, null,
61
+ React.createElement(react_bootstrap_1.Button, { bsClass: "btn btn-danger", onClick: () => onNo ? onNo() : this.toggleModalInstance(this.modalId.confirm, false, true) }, "No"))) })), showActions: (options, actions) => this.createModal(this.modalId.actions, Object.assign(Object.assign({}, options), { footerContent: (React.createElement(React.Fragment, null,
58
62
  options.footerContent,
59
- actions.map(({ content, type = "success", closeOnClick, onClick }, index) => (React.createElement(react_bootstrap_1.Button, { bsClass: `btn btn-${type} mright`, onClick: () => {
60
- onClick && onClick();
61
- closeOnClick && this.toggleModalInstance("actions", false, true);
62
- } }, content))))) })) });
63
+ this.getModalActionButtons(actions))) })) });
63
64
  }
64
65
  get customLoaderDefaults() {
65
66
  return Object.assign(Object.assign({}, defaultState.customLoader), { show: () => this.setState({
@@ -79,6 +80,7 @@ class UIUtilProvider extends React.PureComponent {
79
80
  } });
80
81
  }
81
82
  toggleModalInstance(id, shown, destroyOnClose = false) {
83
+ var _a, _b;
82
84
  const { modal: { instances }, } = this.state;
83
85
  const instance = instances[id];
84
86
  if (!instance) {
@@ -86,6 +88,9 @@ class UIUtilProvider extends React.PureComponent {
86
88
  }
87
89
  // Hide all other instances
88
90
  Object.keys(instances).forEach(id => (instances[id].shown = false));
91
+ if (!shown) {
92
+ (_b = (_a = instance.options).onClose) === null || _b === void 0 ? void 0 : _b.call(_a);
93
+ }
89
94
  if (!shown && destroyOnClose && instance.options.destroyOnClose) {
90
95
  this.removeModalInstance(id);
91
96
  }
@@ -96,8 +101,46 @@ class UIUtilProvider extends React.PureComponent {
96
101
  });
97
102
  }
98
103
  }
104
+ toggleModalOverlay(id, content) {
105
+ const { modal: { instances }, } = this.state;
106
+ instances[id].overlay = content;
107
+ this.setState({
108
+ modal: Object.assign(Object.assign({}, this.state.modal), { instances }),
109
+ });
110
+ }
111
+ getModalActionButtons(actions) {
112
+ return actions.map(({ content, type = "success", closeOnClick, onClick, confirm }, index) => (React.createElement(react_bootstrap_1.Button, { bsClass: `btn btn-${type} mright`, onClick: () => {
113
+ const triggerClick = () => {
114
+ onClick === null || onClick === void 0 ? void 0 : onClick();
115
+ closeOnClick && this.toggleModalInstance(this.modalId.actions, false, true);
116
+ };
117
+ if (!!confirm) {
118
+ this.toggleModalOverlay(this.modalId.actions, React.createElement("div", { style: { minWidth: 200 } },
119
+ React.createElement("div", { style: {
120
+ fontWeight: "bold",
121
+ fontSize: 18,
122
+ paddingLeft: 5,
123
+ } }, "Confirm"),
124
+ React.createElement("hr", { style: { margin: 5 } }),
125
+ React.createElement("div", null, typeof confirm == "string" ? (React.createElement("h4", { className: "text-center", style: { margin: 10 } }, confirm)) : (confirm)),
126
+ React.createElement("hr", { style: { margin: 5 } }),
127
+ React.createElement("div", { style: { textAlign: "right" } },
128
+ React.createElement(react_bootstrap_1.Button, { bsClass: "btn btn-success", style: { marginRight: 10 }, onClick: () => {
129
+ triggerClick();
130
+ this.toggleModalOverlay(this.modalId.actions);
131
+ } }, "Yes"),
132
+ React.createElement(react_bootstrap_1.Button, { bsClass: "btn btn-danger", onClick: () => this.toggleModalOverlay(this.modalId.actions) }, "No"))));
133
+ }
134
+ else {
135
+ triggerClick();
136
+ }
137
+ } }, content)));
138
+ }
99
139
  removeModalInstance(id) {
140
+ var _a, _b;
100
141
  const { modal: { instances }, } = this.state;
142
+ const instance = instances[id];
143
+ (_b = (_a = instance.options).onClose) === null || _b === void 0 ? void 0 : _b.call(_a);
101
144
  delete instances[id];
102
145
  this.setState({
103
146
  modal: Object.assign(Object.assign({}, this.state.modal), { instances }),
@@ -108,6 +151,10 @@ class UIUtilProvider extends React.PureComponent {
108
151
  show: () => this.toggleModalInstance(id, true),
109
152
  hide: () => this.toggleModalInstance(id, false),
110
153
  remove: () => this.removeModalInstance(id),
154
+ overlay: {
155
+ show: (content) => this.toggleModalOverlay(id, content),
156
+ hide: () => this.toggleModalOverlay(id),
157
+ },
111
158
  };
112
159
  }
113
160
  createModal(id, options) {
@@ -7,7 +7,7 @@ const Modal_1 = require("./Modal");
7
7
  exports.UIUtilRenderer = React.memo(({ modalConfig = {} }) => {
8
8
  const { modal } = (0, UIUtilProvider_1.useUIUtilContext)();
9
9
  return (React.createElement(React.Fragment, null, Object.keys(modal.instances).map(id => {
10
- const { shown, options, handleClose } = modal.instances[id];
11
- return (React.createElement(Modal_1.default, { key: id, shown: shown, options: options, handleClose: () => handleClose(id, false, true), config: modalConfig }));
10
+ const { shown, options, handleClose, overlay } = modal.instances[id];
11
+ return (React.createElement(Modal_1.default, { key: id, shown: shown, overlay: overlay, options: options, handleClose: () => handleClose(id, false, true), config: modalConfig }));
12
12
  })));
13
13
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dry-ux",
3
- "version": "1.58.0",
3
+ "version": "1.60.0",
4
4
  "description": "",
5
5
  "main": "dist/index",
6
6
  "scripts": {