@rivtn/noseur 1.0.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.
Files changed (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/esm/Template.d.ts +7 -0
  4. package/dist/esm/Template.js +13 -0
  5. package/dist/esm/compose/Composed.css +437 -0
  6. package/dist/esm/compose/exotic/ColorPicker.d.ts +41 -0
  7. package/dist/esm/compose/exotic/ColorPicker.js +85 -0
  8. package/dist/esm/compose/exotic/ColorSlider.d.ts +30 -0
  9. package/dist/esm/compose/exotic/ColorSlider.js +99 -0
  10. package/dist/esm/compose/form/ComposedPassword.d.ts +25 -0
  11. package/dist/esm/compose/form/ComposedPassword.js +103 -0
  12. package/dist/esm/compose/form/DateTimeInput.d.ts +28 -0
  13. package/dist/esm/compose/form/DateTimeInput.js +154 -0
  14. package/dist/esm/compose/form/DateTimePicker.d.ts +341 -0
  15. package/dist/esm/compose/form/DateTimePicker.js +1265 -0
  16. package/dist/esm/compose/form/FormControl.d.ts +33 -0
  17. package/dist/esm/compose/form/FormControl.js +163 -0
  18. package/dist/esm/compose/form/FormGroup.d.ts +14 -0
  19. package/dist/esm/compose/form/FormGroup.js +58 -0
  20. package/dist/esm/compose/overlay/Alert.d.ts +56 -0
  21. package/dist/esm/compose/overlay/Alert.js +267 -0
  22. package/dist/esm/constants/Alignment.d.ts +17 -0
  23. package/dist/esm/constants/Alignment.js +18 -0
  24. package/dist/esm/constants/Direction.d.ts +26 -0
  25. package/dist/esm/constants/Direction.js +22 -0
  26. package/dist/esm/constants/Orientation.d.ts +8 -0
  27. package/dist/esm/constants/Orientation.js +9 -0
  28. package/dist/esm/constants/Scheme.d.ts +39 -0
  29. package/dist/esm/constants/Scheme.js +43 -0
  30. package/dist/esm/constants/Transition.d.ts +81 -0
  31. package/dist/esm/constants/Transition.js +85 -0
  32. package/dist/esm/constants/Types.d.ts +74 -0
  33. package/dist/esm/constants/Types.js +14 -0
  34. package/dist/esm/core/ComponentBaseProps.d.ts +53 -0
  35. package/dist/esm/core/ComponentBaseProps.js +33 -0
  36. package/dist/esm/core/noseur.css +2390 -0
  37. package/dist/esm/data/Column.d.ts +235 -0
  38. package/dist/esm/data/Column.js +98 -0
  39. package/dist/esm/data/Data.css +213 -0
  40. package/dist/esm/data/Data.d.ts +98 -0
  41. package/dist/esm/data/Data.js +142 -0
  42. package/dist/esm/data/List.d.ts +14 -0
  43. package/dist/esm/data/List.js +117 -0
  44. package/dist/esm/data/Table.d.ts +22 -0
  45. package/dist/esm/data/Table.js +236 -0
  46. package/dist/esm/form/Button.d.ts +35 -0
  47. package/dist/esm/form/Button.js +131 -0
  48. package/dist/esm/form/Calendar.d.ts +20 -0
  49. package/dist/esm/form/Calendar.js +46 -0
  50. package/dist/esm/form/Checkbox.d.ts +20 -0
  51. package/dist/esm/form/Checkbox.js +155 -0
  52. package/dist/esm/form/ColorMap.d.ts +22 -0
  53. package/dist/esm/form/ColorMap.js +43 -0
  54. package/dist/esm/form/ColorPalette.d.ts +28 -0
  55. package/dist/esm/form/ColorPalette.js +87 -0
  56. package/dist/esm/form/Dropdown.d.ts +78 -0
  57. package/dist/esm/form/Dropdown.js +360 -0
  58. package/dist/esm/form/FileInput.d.ts +134 -0
  59. package/dist/esm/form/FileInput.js +523 -0
  60. package/dist/esm/form/Form.css +467 -0
  61. package/dist/esm/form/Input.d.ts +45 -0
  62. package/dist/esm/form/Input.js +186 -0
  63. package/dist/esm/form/RadioButton.d.ts +21 -0
  64. package/dist/esm/form/RadioButton.js +178 -0
  65. package/dist/esm/form/Slider.d.ts +21 -0
  66. package/dist/esm/form/Slider.js +163 -0
  67. package/dist/esm/hooks/useSearchParams.d.ts +15 -0
  68. package/dist/esm/hooks/useSearchParams.js +50 -0
  69. package/dist/esm/hooks/useSubscription.d.ts +9 -0
  70. package/dist/esm/hooks/useSubscription.js +26 -0
  71. package/dist/esm/index.d.ts +60 -0
  72. package/dist/esm/index.js +73 -0
  73. package/dist/esm/layout/GridView.d.ts +23 -0
  74. package/dist/esm/layout/GridView.js +34 -0
  75. package/dist/esm/layout/Layout.css +5 -0
  76. package/dist/esm/misc/Misc.css +164 -0
  77. package/dist/esm/misc/ProgressBar.d.ts +22 -0
  78. package/dist/esm/misc/ProgressBar.js +86 -0
  79. package/dist/esm/overlay/Dialog.d.ts +46 -0
  80. package/dist/esm/overlay/Dialog.js +290 -0
  81. package/dist/esm/overlay/Message.d.ts +35 -0
  82. package/dist/esm/overlay/Message.js +187 -0
  83. package/dist/esm/overlay/Overlay.css +382 -0
  84. package/dist/esm/overlay/Popover.d.ts +30 -0
  85. package/dist/esm/overlay/Popover.js +245 -0
  86. package/dist/esm/overlay/Portal.d.ts +11 -0
  87. package/dist/esm/overlay/Portal.js +29 -0
  88. package/dist/esm/overlay/Toast.d.ts +49 -0
  89. package/dist/esm/overlay/Toast.js +341 -0
  90. package/dist/esm/panel/Accordion.d.ts +26 -0
  91. package/dist/esm/panel/Accordion.js +127 -0
  92. package/dist/esm/panel/Panel.css +317 -0
  93. package/dist/esm/panel/Panel.d.ts +43 -0
  94. package/dist/esm/panel/Panel.js +125 -0
  95. package/dist/esm/panel/ScrollPanel.d.ts +27 -0
  96. package/dist/esm/panel/ScrollPanel.js +43 -0
  97. package/dist/esm/panel/TabPane.d.ts +82 -0
  98. package/dist/esm/panel/TabPane.js +237 -0
  99. package/dist/esm/presentation/Chart.d.ts +49 -0
  100. package/dist/esm/presentation/Chart.js +62 -0
  101. package/dist/esm/presentation/Paginator.d.ts +90 -0
  102. package/dist/esm/presentation/Paginator.js +331 -0
  103. package/dist/esm/presentation/Presentation.css +23 -0
  104. package/dist/esm/sensor/DragSensor.d.ts +50 -0
  105. package/dist/esm/sensor/DragSensor.js +156 -0
  106. package/dist/esm/sensor/ViewportSensor.d.ts +18 -0
  107. package/dist/esm/sensor/ViewportSensor.js +85 -0
  108. package/dist/esm/utils/BoolHelper.d.ts +13 -0
  109. package/dist/esm/utils/BoolHelper.js +105 -0
  110. package/dist/esm/utils/Classname.d.ts +9 -0
  111. package/dist/esm/utils/Classname.js +20 -0
  112. package/dist/esm/utils/ColorHelper.d.ts +127 -0
  113. package/dist/esm/utils/ColorHelper.js +198 -0
  114. package/dist/esm/utils/DOMUtils.d.ts +142 -0
  115. package/dist/esm/utils/DOMUtils.js +759 -0
  116. package/dist/esm/utils/DateHelper.d.ts +115 -0
  117. package/dist/esm/utils/DateHelper.js +338 -0
  118. package/dist/esm/utils/Debugger.d.ts +12 -0
  119. package/dist/esm/utils/Debugger.js +30 -0
  120. package/dist/esm/utils/FileHelper.d.ts +8 -0
  121. package/dist/esm/utils/FileHelper.js +65 -0
  122. package/dist/esm/utils/FunctionStackManager.d.ts +13 -0
  123. package/dist/esm/utils/FunctionStackManager.js +59 -0
  124. package/dist/esm/utils/InputHelper.d.ts +37 -0
  125. package/dist/esm/utils/InputHelper.js +70 -0
  126. package/dist/esm/utils/MicroBuilder.d.ts +24 -0
  127. package/dist/esm/utils/MicroBuilder.js +61 -0
  128. package/dist/esm/utils/ObjectHelper.d.ts +51 -0
  129. package/dist/esm/utils/ObjectHelper.js +334 -0
  130. package/dist/esm/utils/StringHelper.d.ts +10 -0
  131. package/dist/esm/utils/StringHelper.js +54 -0
  132. package/dist/esm/utils/Subscriber.d.ts +14 -0
  133. package/dist/esm/utils/Subscriber.js +27 -0
  134. package/dist/esm/utils/Timer.d.ts +32 -0
  135. package/dist/esm/utils/Timer.js +68 -0
  136. package/dist/esm/utils/TypeChecker.d.ts +12 -0
  137. package/dist/esm/utils/TypeChecker.js +38 -0
  138. package/package.json +63 -0
@@ -0,0 +1,34 @@
1
+ import "./Layout.css";
2
+ import React from "react";
3
+ import { Classname } from "../utils/Classname";
4
+ class GridViewComponent extends React.Component {
5
+ static defaultProps = {
6
+ gap: 0,
7
+ row: 5,
8
+ column: 5,
9
+ columnSize: 25,
10
+ };
11
+ state = {
12
+ column: this.props.column,
13
+ };
14
+ constructor(props) {
15
+ super(props);
16
+ }
17
+ componentDidUpdate(prevProps, _) {
18
+ console.log("THE.----", prevProps, this.state.column);
19
+ }
20
+ render() {
21
+ const width = (typeof this.props.columnSize === "number" ? this.props.columnSize : this.props.columnSize.width);
22
+ const className = Classname.build("noseur-gridview", this.props.className);
23
+ const style = {
24
+ ...(this.props.style ?? {}),
25
+ gridTemplateColumns: Array(this.state.column).fill(`${width}px`).join(" "),
26
+ columnGap: (typeof this.props.gap !== "number" ? this.props.gap?.column : undefined),
27
+ rowGap: (typeof this.props.gap !== "number" ? this.props.gap?.row : undefined),
28
+ gap: (typeof this.props.gap === "number" ? this.props.gap : undefined),
29
+ };
30
+ return (React.createElement("div", { className: className, style: style, id: this.props.id, key: this.props.key }, this.props.children));
31
+ }
32
+ ;
33
+ }
34
+ export const GridView = ({ ref, ...props }) => (React.createElement(GridViewComponent, { ...props, forwardRef: ref }));
@@ -0,0 +1,5 @@
1
+ /* GridView */
2
+ .noseur-gridview {
3
+ display: grid;
4
+ width: fit-content;
5
+ }
@@ -0,0 +1,164 @@
1
+ /* Progressbar */
2
+ .noseur-progress-bar {
3
+ height: 1rem;
4
+ overflow: hidden;
5
+ position: relative;
6
+ border-radius: 6px;
7
+ }
8
+
9
+ .noseur-progress-bar-determinant {
10
+ width: 0%;
11
+ margin: 0px;
12
+ height: 100%;
13
+ display: flex;
14
+ border: 0 none;
15
+ overflow: hidden;
16
+ position: absolute;
17
+ align-items: center;
18
+ justify-content: center;
19
+ transition: width 1s ease-in-out;
20
+ }
21
+
22
+ .noseur-progress-bar-label {
23
+ font-size: 11px;
24
+ display: -webkit-box;
25
+ -webkit-line-clamp: 1;
26
+ -webkit-box-orient: vertical;
27
+ }
28
+
29
+ .noseur-progress-bar-indeterminate {
30
+ width: 0px;
31
+ margin: 0px;
32
+ }
33
+
34
+ .noseur-progress-bar-indeterminate::before {
35
+ content: "";
36
+ position: absolute;
37
+ background-color: inherit;
38
+ top: 0;
39
+ left: 0;
40
+ bottom: 0;
41
+ will-change: left, right;
42
+ -webkit-animation: noseur-progress-bar-indeterminate-anim 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
43
+ animation: noseur-progress-bar-indeterminate-anim 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;
44
+ }
45
+
46
+ .noseur-progress-bar-indeterminate::after {
47
+ content: "";
48
+ position: absolute;
49
+ background-color: inherit;
50
+ top: 0;
51
+ left: 0;
52
+ bottom: 0;
53
+ will-change: left, right;
54
+ -webkit-animation: noseur-progress-bar-indeterminate-anim-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
55
+ animation: noseur-progress-bar-indeterminate-anim-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;
56
+ -webkit-animation-delay: 1.15s;
57
+ animation-delay: 1.15s;
58
+ }
59
+
60
+ @-webkit-keyframes noseur-progress-bar-indeterminate-anim {
61
+ 0% {
62
+ left: -35%;
63
+ right: 100%;
64
+ }
65
+ 60% {
66
+ left: 100%;
67
+ right: -90%;
68
+ }
69
+ 100% {
70
+ left: 100%;
71
+ right: -90%;
72
+ }
73
+ }
74
+ @keyframes noseur-progress-bar-indeterminate-anim {
75
+ 0% {
76
+ left: -35%;
77
+ right: 100%;
78
+ }
79
+ 60% {
80
+ left: 100%;
81
+ right: -90%;
82
+ }
83
+ 100% {
84
+ left: 100%;
85
+ right: -90%;
86
+ }
87
+ }
88
+ @-webkit-keyframes noseur-progress-bar-indeterminate-anim-short {
89
+ 0% {
90
+ left: -200%;
91
+ right: 100%;
92
+ }
93
+ 60% {
94
+ left: 107%;
95
+ right: -8%;
96
+ }
97
+ 100% {
98
+ left: 107%;
99
+ right: -8%;
100
+ }
101
+ }
102
+ @keyframes noseur-progress-bar-indeterminate-anim-short {
103
+ 0% {
104
+ left: -200%;
105
+ right: 100%;
106
+ }
107
+ 60% {
108
+ left: 107%;
109
+ right: -8%;
110
+ }
111
+ 100% {
112
+ left: 107%;
113
+ right: -8%;
114
+ }
115
+ }
116
+ /* Badge, Tag And Pill */
117
+ .noseur-badge {
118
+ font-weight: 700;
119
+ overflow: hidden;
120
+ min-width: 1.2rem;
121
+ border-radius: 50%;
122
+ font-size: 0.65rem;
123
+ text-align: center;
124
+ align-items: center;
125
+ line-height: 1.2rem;
126
+ display: inline-flex;
127
+ justify-content: center;
128
+ }
129
+
130
+ .noseur-tag {
131
+ font-weight: 700;
132
+ border-radius: 3px;
133
+ font-size: 0.65rem;
134
+ text-align: center;
135
+ align-items: center;
136
+ display: inline-block;
137
+ justify-content: center;
138
+ padding: 0.25rem 0.4rem;
139
+ }
140
+
141
+ .noseur-pill {
142
+ font-weight: 700;
143
+ font-size: 0.65rem;
144
+ text-align: center;
145
+ border-radius: 10px;
146
+ align-items: center;
147
+ display: inline-block;
148
+ padding: 0.25rem 0.4rem;
149
+ justify-content: center;
150
+ }
151
+
152
+ .noseur-badge-overlay {
153
+ padding-top: 4px;
154
+ padding-right: 4px;
155
+ position: relative;
156
+ width: max-content;
157
+ }
158
+
159
+ .noseur-badge-overlay > .noseur-badge,
160
+ .noseur-badge-overlay > .noseur-tag,
161
+ .noseur-badge-overlay > .noseur-pill {
162
+ z-index: 2;
163
+ position: absolute;
164
+ }
@@ -0,0 +1,22 @@
1
+ import "./Misc.css";
2
+ import React from 'react';
3
+ import { ComponentBaseProps } from '../core/ComponentBaseProps';
4
+ import { NoseurNummber, NoseurNumberedObject, NumberRange, NoseurObject } from "../constants/Types";
5
+ export interface ProgressBarManageRef {
6
+ getValue: () => NumberRange<0, 100>;
7
+ setValue: (value: NumberRange<0, 100>) => void;
8
+ }
9
+ export declare enum ProgressBarMode {
10
+ DETERMINATE = 0,
11
+ INDETERMINATE = 1
12
+ }
13
+ export interface ProgressBarProps extends ComponentBaseProps<HTMLDivElement, ProgressBarManageRef> {
14
+ style: {};
15
+ stripped: boolean;
16
+ noLabel: boolean;
17
+ mode: ProgressBarMode;
18
+ value: NumberRange<0, 100>;
19
+ labeltemplate: (value: NoseurNummber) => string;
20
+ percentageColors: NoseurNumberedObject<NoseurObject<string>>;
21
+ }
22
+ export declare const ProgressBar: ({ ref, ...props }: Partial<ProgressBarProps>) => React.JSX.Element;
@@ -0,0 +1,86 @@
1
+ import "./Misc.css";
2
+ import React from 'react';
3
+ import { Scheme } from '../constants/Scheme';
4
+ import { Classname } from '../utils/Classname';
5
+ import { ObjectHelper } from "../utils/ObjectHelper";
6
+ export var ProgressBarMode;
7
+ (function (ProgressBarMode) {
8
+ ProgressBarMode[ProgressBarMode["DETERMINATE"] = 0] = "DETERMINATE";
9
+ ProgressBarMode[ProgressBarMode["INDETERMINATE"] = 1] = "INDETERMINATE";
10
+ })(ProgressBarMode || (ProgressBarMode = {}));
11
+ ;
12
+ // TODO color per percentage
13
+ class ProgressBarComponent extends React.Component {
14
+ static defaultProps = {
15
+ scheme: Scheme.PRIMARY,
16
+ mode: ProgressBarMode.DETERMINATE
17
+ };
18
+ state = {
19
+ currentValue: this.props.value
20
+ };
21
+ componentDidMount() {
22
+ ObjectHelper.resolveManageRef(this, {
23
+ getValue: () => this.state.currentValue,
24
+ setValue: (value) => this.setState({ currentValue: value }),
25
+ });
26
+ }
27
+ componentDidUpdate(prevProps) {
28
+ if (prevProps.value !== this.props.value) {
29
+ this.setState({ currentValue: this.props.value });
30
+ }
31
+ }
32
+ componentWillUnmount() {
33
+ ObjectHelper.resolveManageRef(this, null);
34
+ }
35
+ getPercentageColor(value) {
36
+ if (!this.props.percentageColors)
37
+ return;
38
+ const percentages = Object.keys(this.props.percentageColors).reverse();
39
+ for (const percentage of percentages) {
40
+ if (value >= percentage) {
41
+ return this.props.percentageColors[percentage];
42
+ }
43
+ }
44
+ return;
45
+ }
46
+ buildDeterminant(value, label, percentageColor) {
47
+ const style = { width: `${value}%`, background: percentageColor ? percentageColor["fg"] : undefined };
48
+ const className = Classname.build("noseur-progress-bar-determinant", this.props.scheme);
49
+ const props = {
50
+ style,
51
+ className
52
+ };
53
+ return (React.createElement("div", { ...props }, label));
54
+ }
55
+ buildInDeterminant() {
56
+ const className = Classname.build("noseur-progress-bar-indeterminate", this.props.scheme);
57
+ return (React.createElement("div", { className: className }));
58
+ }
59
+ buildLabel(value) {
60
+ if (this.props.noLabel)
61
+ return null;
62
+ const label = this.props.labeltemplate ? this.props.labeltemplate(3) : value + "%";
63
+ return React.createElement("span", { className: "noseur-progress-bar-label" }, label);
64
+ }
65
+ render() {
66
+ const className = Classname.build("noseur-progress-bar", {
67
+ 'noseur-disabled': !this.props.noStyle && this.props.disabled,
68
+ }, this.props.className);
69
+ let value = (this.state.currentValue && this.state.currentValue < 0 ? 0 : this.state.currentValue);
70
+ value = (value && value > 100 ? 100 : value);
71
+ const label = this.buildLabel(value);
72
+ const percentageColor = this.getPercentageColor(value);
73
+ const style = percentageColor ? { ...this.props.style, background: percentageColor["bg"] } : this.props.style;
74
+ const bar = this.props.mode === ProgressBarMode.DETERMINATE ? this.buildDeterminant(value, label, percentageColor) : this.buildInDeterminant();
75
+ const eventProps = ObjectHelper.extractEventProps(this.props);
76
+ const props = {
77
+ style,
78
+ className,
79
+ ...eventProps,
80
+ id: this.props.id,
81
+ key: this.props.key,
82
+ };
83
+ return (React.createElement("div", { ref: this.props.forwardRef, ...props }, bar));
84
+ }
85
+ }
86
+ export const ProgressBar = ({ ref, ...props }) => (React.createElement(ProgressBarComponent, { ...props, forwardRef: ref }));
@@ -0,0 +1,46 @@
1
+ import "./Overlay.css";
2
+ import React from "react";
3
+ import { Alignment } from "../constants/Alignment";
4
+ import { ComponentBaseProps, ComponentElementBasicAttributes, TransitionProps } from "../core/ComponentBaseProps";
5
+ import { NoseurElement, NoseurObject, NoseurRawElement } from "../constants/Types";
6
+ export type DialogEvent = () => void;
7
+ export type DialogMaximizeEvent = (event?: any) => boolean;
8
+ export interface DialogManageRef {
9
+ show: () => void;
10
+ hide: () => void;
11
+ toggle: () => void;
12
+ }
13
+ export interface DialogProps extends ComponentBaseProps<HTMLDivElement, DialogManageRef>, TransitionProps {
14
+ visible: boolean;
15
+ baseZIndex: number;
16
+ maximized: boolean;
17
+ noOverlay: boolean;
18
+ icons: NoseurElement;
19
+ notClosable: boolean;
20
+ alignment: Alignment;
21
+ maximizable: boolean;
22
+ header: NoseurElement;
23
+ footer: NoseurElement;
24
+ disableScroll: boolean;
25
+ closeIcon: NoseurElement;
26
+ dismissibleModal: boolean;
27
+ modalProps: NoseurObject<any>;
28
+ headerProps: NoseurObject<any>;
29
+ contentProps: NoseurObject<any>;
30
+ onOpenFocusRef: React.MutableRefObject<any>;
31
+ onCloseFocusRef: React.MutableRefObject<any>;
32
+ container: NoseurRawElement | React.Ref<HTMLDivElement>;
33
+ maximizeIcons: {
34
+ minimize: NoseurElement;
35
+ maximize: NoseurElement;
36
+ };
37
+ maximizeProps?: {
38
+ minimize?: ComponentElementBasicAttributes;
39
+ maximize?: ComponentElementBasicAttributes;
40
+ };
41
+ onShow: DialogEvent;
42
+ onHide: DialogEvent;
43
+ onMaximize?: DialogMaximizeEvent;
44
+ onMinimize?: DialogMaximizeEvent;
45
+ }
46
+ export declare const Dialog: ({ ref, ...props }: Partial<DialogProps>) => React.JSX.Element;
@@ -0,0 +1,290 @@
1
+ import "./Overlay.css";
2
+ import React from "react";
3
+ import { Portal } from "./Portal";
4
+ import { Classname } from "../utils/Classname";
5
+ import { TypeChecker } from "../utils/TypeChecker";
6
+ import { Alignment } from "../constants/Alignment";
7
+ import { ObjectHelper } from "../utils/ObjectHelper";
8
+ import { CSSTransition } from 'react-transition-group';
9
+ import { BaseZIndex, DOMHelper, ZIndexHandler } from "../utils/DOMUtils";
10
+ import { NoseurGlobals } from "../core/ComponentBaseProps";
11
+ import { Transition } from "../constants/Transition";
12
+ ;
13
+ class DialogComponent extends React.Component {
14
+ static defaultProps = {
15
+ notClosable: false,
16
+ disableScroll: false,
17
+ dismissibleModal: true,
18
+ closeIcon: "fa fa-times",
19
+ alignment: Alignment.CENTER,
20
+ baseZIndex: BaseZIndex.MODAL,
21
+ transition: Transition.DIALOGY,
22
+ maximizeIcons: {
23
+ minimize: "fa fa-window-minimize",
24
+ maximize: "fa fa-window-maximize",
25
+ }
26
+ };
27
+ state = {
28
+ visible: false,
29
+ modalVisible: false,
30
+ id: DOMHelper.uniqueElementId(),
31
+ maximized: this.props.maximized,
32
+ };
33
+ internalModalElement;
34
+ internalDialogElement;
35
+ componentUnmounted = false;
36
+ transitionNodeRef;
37
+ constructor(props) {
38
+ super(props);
39
+ this.onClose = this.onClose.bind(this);
40
+ this.onEnter = this.onEnter.bind(this);
41
+ this.onExited = this.onExited.bind(this);
42
+ this.onEntered = this.onEntered.bind(this);
43
+ this.onModalClick = this.onModalClick.bind(this);
44
+ this.toggleMaximize = this.toggleMaximize.bind(this);
45
+ this.transitionNodeRef = React.createRef();
46
+ }
47
+ componentDidMount() {
48
+ ObjectHelper.resolveManageRef(this, {
49
+ show: () => this.setState({ visible: true }),
50
+ hide: () => this.setState({ visible: false }),
51
+ toggle: () => this.setState({ visible: !this.props.visible }),
52
+ });
53
+ if (this.props.visible) {
54
+ this.setState({ modalVisible: true }, () => {
55
+ ZIndexHandler.setElementZIndex(this.internalModalElement, this.props.baseZIndex);
56
+ });
57
+ }
58
+ this.componentUnmounted = true;
59
+ }
60
+ componentDidUpdate(prevProps) {
61
+ if (this.props.visible && !this.state.modalVisible) {
62
+ this.setState({ modalVisible: true }, () => {
63
+ ZIndexHandler.setElementZIndex(this.internalModalElement, this.props.baseZIndex);
64
+ });
65
+ }
66
+ if (!this.props.visible && this.state.visible && this.state.modalVisible) {
67
+ this.setState({
68
+ visible: this.props.visible
69
+ });
70
+ }
71
+ if (prevProps.maximized !== this.props.maximized) {
72
+ this.setState({ maximized: this.props.maximized }, () => {
73
+ if (this.props.onMaximize) {
74
+ this.updateScrollOnMaximizable();
75
+ }
76
+ });
77
+ }
78
+ }
79
+ componentWillUnmount() {
80
+ if (!this.componentUnmounted)
81
+ return;
82
+ this.componentUnmounted = true;
83
+ ZIndexHandler.removeElementZIndex(this.internalModalElement);
84
+ ObjectHelper.resolveManageRef(this, null);
85
+ }
86
+ onClose(event) {
87
+ event.preventDefault();
88
+ event.stopPropagation();
89
+ this.setState({ visible: !this.props.visible });
90
+ }
91
+ onEnter() {
92
+ if ((this.props.disableScroll || (this.props.maximizable && this.state.maximized)) && !this.props.noOverlay) {
93
+ DOMHelper.addClass((this.getRefOrHTMLElement(this.props.container) || document.body), 'noseur-overflow-hidden');
94
+ }
95
+ }
96
+ onEntered() {
97
+ if (this.props.onShow)
98
+ this.props.onShow();
99
+ const elementToReceiveOpenFocus = this.props.onOpenFocusRef?.current;
100
+ if (elementToReceiveOpenFocus && TypeChecker.isFunction(elementToReceiveOpenFocus?.focus)) {
101
+ elementToReceiveOpenFocus.focus();
102
+ }
103
+ }
104
+ onExited() {
105
+ ZIndexHandler.removeElementZIndex(this.internalModalElement);
106
+ this.setState({ modalVisible: false });
107
+ if ((this.props.disableScroll || (this.props.maximizable && this.state.maximized)) && !this.props.noOverlay) {
108
+ DOMHelper.removeClass((this.getRefOrHTMLElement(this.props.container) || document.body), 'noseur-overflow-hidden');
109
+ }
110
+ const elementToReceiveCloseFocus = this.props.onCloseFocusRef?.current;
111
+ if (elementToReceiveCloseFocus && TypeChecker.isFunction(elementToReceiveCloseFocus?.focus)) {
112
+ elementToReceiveCloseFocus.focus();
113
+ }
114
+ if (this.props.onHide)
115
+ this.props.onHide();
116
+ }
117
+ onModalClick(event) {
118
+ if (this.props.dismissibleModal && !this.props.noOverlay && this.internalModalElement === event.target) {
119
+ this.onClose(event);
120
+ }
121
+ }
122
+ toggleMaximize(event) {
123
+ let maximized = !this.state.maximized;
124
+ event.preventDefault();
125
+ event.stopPropagation();
126
+ if (!maximized && (!this.props.onMinimize || this.props.onMinimize(event))) {
127
+ this.setState({ maximized }, this.updateScrollOnMaximizable);
128
+ }
129
+ if (!!maximized && (!this.props.onMaximize || this.props.onMaximize(event))) {
130
+ this.setState({ maximized }, this.updateScrollOnMaximizable);
131
+ }
132
+ }
133
+ updateScrollOnMaximizable() {
134
+ if (!this.props.disableScroll) {
135
+ let funcIdentifier = this.state.maximized ? 'addClass' : 'removeClass';
136
+ (DOMHelper[funcIdentifier])((this.getRefOrHTMLElement(this.props.container) || document.body), 'noseur-overflow-hidden');
137
+ }
138
+ }
139
+ renderCloseButton() {
140
+ if (this.props.notClosable || !this.props.closeIcon)
141
+ return;
142
+ if (TypeChecker.isString(this.props.closeIcon)) {
143
+ return (React.createElement("i", { className: `noseur-dialog-header-close-icon ${this.props.closeIcon}`, onClick: this.onClose }));
144
+ }
145
+ const closeProps = { ...(this.props.closeIcon.props || {}) };
146
+ const cacheClassName = closeProps.className;
147
+ closeProps.className = Classname.build('noseur-dialog-header-close-icon', cacheClassName);
148
+ if (!closeProps.onClick)
149
+ closeProps.onClick = this.onClose;
150
+ return React.cloneElement(this.props.closeIcon, closeProps);
151
+ }
152
+ renderMaximizeButton() {
153
+ if (!this.props.maximizable)
154
+ return;
155
+ const icon = (this.state.maximized ? this.props.maximizeIcons.minimize : this.props.maximizeIcons.maximize);
156
+ if (TypeChecker.isString(icon)) {
157
+ const className = Classname.build('noseur-dialog-header-maximize-icon', icon);
158
+ return (React.createElement("i", { className: className, onClick: this.toggleMaximize }));
159
+ }
160
+ const iconProps = { ...(icon.props || {}) };
161
+ const cacheClassName = iconProps.className;
162
+ iconProps.className = Classname.build('noseur-dialog-header-maximize-icon', cacheClassName);
163
+ if (!iconProps.onClick)
164
+ iconProps.onClick = this.toggleMaximize;
165
+ return React.cloneElement(icon, iconProps);
166
+ }
167
+ renderHeader(id) {
168
+ let header = this.props.header;
169
+ const closeIcon = this.renderCloseButton();
170
+ const maximizeIcon = this.renderMaximizeButton();
171
+ const icons = this.props.icons || [];
172
+ if (!closeIcon && !maximizeIcon && !header)
173
+ return;
174
+ if (header) {
175
+ header = this.props.header;
176
+ if (TypeChecker.isString(header)) {
177
+ header = React.createElement("span", { id: id + '-header', className: "noseur-dialog-title" }, header);
178
+ }
179
+ else {
180
+ const relayProps = { ...(header.props || {}) };
181
+ const cacheClassName = relayProps.className;
182
+ relayProps.className = Classname.build('noseur-dialog-title', cacheClassName);
183
+ header = React.cloneElement(header, relayProps);
184
+ }
185
+ }
186
+ const headerProps = { ...(this.props.headerProps || {}) };
187
+ const cacheClassName = headerProps.className;
188
+ headerProps.className = Classname.build(`noseur-dialog-header ${!header ? "nl" : ""}`, cacheClassName);
189
+ // TODO add onMouseDown for dragging header on screen
190
+ return (React.createElement("div", { ...headerProps },
191
+ header,
192
+ React.createElement("div", { className: "noseur-dialog-header-right" },
193
+ icons,
194
+ maximizeIcon,
195
+ closeIcon)));
196
+ }
197
+ renderFooter() {
198
+ if (!this.props.footer)
199
+ return;
200
+ const footer = this.props.footer;
201
+ const className = "noseur-dialog-footer";
202
+ if (TypeChecker.isReactElement(this.props.footer)) {
203
+ const footerProps = { ...(footer.props || {}) };
204
+ const cacheClassName = footerProps.className;
205
+ footerProps.className = Classname.build(className, cacheClassName);
206
+ return React.cloneElement(footer, footerProps);
207
+ }
208
+ return (React.createElement("div", { className: className }, footer));
209
+ }
210
+ renderContent(id, hasHeader) {
211
+ const contentProps = { ...(this.props.contentProps || {}) };
212
+ const cacheId = contentProps.id;
213
+ const cacheClassName = contentProps.className;
214
+ contentProps.className = Classname.build('noseur-dialog-content', cacheClassName, {
215
+ 'noseur-dialog-content-bd-t': !hasHeader,
216
+ 'noseur-dialog-content-bd-b': !this.props.footer,
217
+ });
218
+ return (React.createElement("div", { ...contentProps, id: cacheId || `${id}-content` }, this.props.children));
219
+ }
220
+ renderChildren() {
221
+ const id = this.props.id || this.state.id;
222
+ const className = Classname.build('noseur-dialog', this.props.className, {
223
+ 'noseur-dialog-maximized': this.state.maximized
224
+ }, NoseurGlobals.get(NoseurGlobals.KEYS.LAF.THEME));
225
+ let alignment = this.props.alignment;
226
+ if (alignment === Alignment.TOP_CENTER)
227
+ alignment = Alignment.TOP;
228
+ if (alignment === Alignment.BOTTOM_CENTER)
229
+ alignment = Alignment.BOTTOM;
230
+ const modalProps = { ...(this.props.modalProps || {}) };
231
+ const cacheModalRef = modalProps.ref;
232
+ const cacheClassName = modalProps.className;
233
+ modalProps.ref = (r) => {
234
+ if (!!this.internalModalElement && !r)
235
+ this.componentWillUnmount();
236
+ else if (this.componentUnmounted && !!r)
237
+ this.componentDidMount();
238
+ this.internalModalElement = r;
239
+ ObjectHelper.resolveRef(cacheModalRef, r);
240
+ };
241
+ modalProps.className = Classname.build('noseur-dialog-modal', {
242
+ 'noseur-p-stk': !!this.props.container,
243
+ 'noseur-component-overlay': !this.props.noOverlay,
244
+ 'noseur-dialog-visible': this.state.modalVisible
245
+ }, `noseur-dialog-${alignment}`, cacheClassName, this.props.maximizeProps?.[this.state.maximized ? "maximize" : "minimize"]?.className);
246
+ const transitionTimeout = this.props.transitionTimeout ?? 500;
247
+ const footer = this.renderFooter();
248
+ const header = this.renderHeader(id);
249
+ const transition = this.props.transition;
250
+ const content = this.renderContent(id, !!header);
251
+ const elementRef = (r) => {
252
+ this.internalDialogElement = r;
253
+ ObjectHelper.resolveRef(cacheModalRef, r);
254
+ ObjectHelper.resolveRef(this.transitionNodeRef, r);
255
+ ObjectHelper.resolveRef(this.props.forwardRef, r, true);
256
+ };
257
+ if (!modalProps.onClick)
258
+ modalProps.onClick = this.onModalClick;
259
+ return (React.createElement("div", { ...modalProps, style: {
260
+ ...(modalProps.style),
261
+ zIndex: this.props.baseZIndex ?? modalProps.style?.zIndex,
262
+ ...(this.props.maximizeProps?.[this.state.maximized ? "maximize" : "minimize"]?.style),
263
+ }, ref: (r) => {
264
+ ObjectHelper.resolveRef(cacheModalRef, r);
265
+ if (!(r && !this.state.visible && this.props.visible))
266
+ return;
267
+ this.setState({
268
+ visible: this.props.visible
269
+ });
270
+ } },
271
+ React.createElement(CSSTransition, { classNames: transition, timeout: transition === Transition.NONE ? 0 : transitionTimeout, in: this.state.visible, options: this.props.transitionOptions, unmountOnExit: true, onEnter: this.onEnter, onEntered: this.onEntered, onExited: this.onExited, nodeRef: this.transitionNodeRef },
272
+ React.createElement("div", { ref: elementRef, id: id, className: className, style: this.props.style, role: "dialog", "aria-labelledby": id + '-header', "aria-describedby": id + '-content', "aria-modal": this.props.dismissibleModal },
273
+ header,
274
+ content,
275
+ footer))));
276
+ }
277
+ getRefOrHTMLElement(p) {
278
+ if (typeof p === "object" && ("current" in p)) {
279
+ return p.current;
280
+ }
281
+ return p;
282
+ }
283
+ render() {
284
+ if (!this.state.modalVisible)
285
+ return null;
286
+ const children = this.renderChildren();
287
+ return React.createElement(Portal, { children: children, container: this.getRefOrHTMLElement(this.props.container), visible: true });
288
+ }
289
+ }
290
+ export const Dialog = ({ ref, ...props }) => (React.createElement(DialogComponent, { ...props, forwardRef: ref }));
@@ -0,0 +1,35 @@
1
+ import "./Overlay.css";
2
+ import React, { MouseEventHandler } from 'react';
3
+ import { NoseurElement, NoseurIconElement, NoseurRawElement } from "../constants/Types";
4
+ import { ProgressBarProps } from "../misc/ProgressBar";
5
+ import { ComponentBaseProps, ComponentElementBasicAttributes, TransitionProps } from "../core/ComponentBaseProps";
6
+ export type MessageEventHandler = () => void;
7
+ export type MessageContentHandler = (attr?: ComponentElementBasicAttributes) => NoseurElement;
8
+ export type MessageAttributesRelays = {
9
+ progressBar: Partial<ProgressBarProps>;
10
+ content?: ComponentElementBasicAttributes;
11
+ closeIcon?: ComponentElementBasicAttributes;
12
+ };
13
+ export interface MessageManageRef {
14
+ close: () => void;
15
+ update: (messageProps: Partial<MessageProps>, borrowLifetime?: boolean) => void;
16
+ }
17
+ export interface MessageProps extends ComponentBaseProps<HTMLDivElement, MessageManageRef, MessageAttributesRelays>, TransitionProps {
18
+ fill: boolean;
19
+ sticky: boolean;
20
+ lifetime: number;
21
+ foreScheme: boolean;
22
+ closeOnClick: boolean;
23
+ icon: NoseurIconElement;
24
+ showProgressbar: boolean;
25
+ pauseDelayOnHover: boolean;
26
+ container: NoseurRawElement;
27
+ content: NoseurElement | MessageContentHandler;
28
+ onClose: MessageEventHandler;
29
+ onAction: MessageEventHandler;
30
+ onExitDOM: MessageEventHandler;
31
+ onEnterDOM: MessageEventHandler;
32
+ onMouseEnter?: MouseEventHandler<HTMLDivElement> | undefined;
33
+ onMouseLeave?: MouseEventHandler<HTMLDivElement> | undefined;
34
+ }
35
+ export declare const Message: ({ ref, ...props }: Partial<MessageProps>) => React.JSX.Element;