react-ui-basics 0.0.220 → 0.0.222
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/Animated.js +1 -0
- package/Animated.js.map +1 -1
- package/Button.js.map +1 -1
- package/Dialog.d.ts +29 -0
- package/Dialog.js +84 -143
- package/Dialog.js.map +1 -1
- package/FilteredList.css +1 -1
- package/FilteredList.d.ts +62 -0
- package/FilteredList.js +128 -232
- package/FilteredList.js.map +1 -1
- package/FormUploadProgress.d.ts +19 -0
- package/FormUploadProgress.js +14 -39
- package/FormUploadProgress.js.map +1 -1
- package/Modal.d.ts +31 -0
- package/Modal.js +102 -134
- package/Modal.js.map +1 -1
- package/ReactConstants.d.ts +6 -2
- package/ReactConstants.js.map +1 -1
- package/ReactCreateElement.d.ts +3 -0
- package/ReactCreateElement.js.map +1 -1
- package/ReadyListener.d.ts +34 -0
- package/ReadyListener.js +34 -56
- package/ReadyListener.js.map +1 -1
- package/Scrollable.css +0 -1
- package/Scrollable.d.ts +33 -0
- package/Scrollable.js +310 -325
- package/Scrollable.js.map +1 -1
- package/_virtual/_rollupPluginBabelHelpers.js +0 -15
- package/_virtual/_rollupPluginBabelHelpers.js.map +1 -1
- package/bundle.css +829 -830
- package/package.json +1 -1
- package/router/Route.js +1 -0
- package/router/Route.js.map +1 -1
- package/src/Button.tsx +0 -1
- package/src/{Dialog.js → Dialog.tsx} +63 -44
- package/src/FilteredList.css +1 -1
- package/src/FilteredList.scss +1 -1
- package/src/{FilteredList.js → FilteredList.tsx} +95 -45
- package/src/{FormUploadProgress.js → FormUploadProgress.tsx} +13 -22
- package/src/{Modal.js → Modal.tsx} +48 -33
- package/src/ReactConstants.ts +9 -3
- package/src/ReactCreateElement.tsx +3 -0
- package/src/ReadyListener.tsx +58 -0
- package/src/Scrollable.css +0 -1
- package/src/Scrollable.scss +0 -1
- package/src/{Scrollable.js → Scrollable.tsx} +78 -64
- package/src/ReactCreateElement.js +0 -3
- package/src/ReadyListener.js +0 -48
package/package.json
CHANGED
package/router/Route.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import ReactConstants from "./../ReactConstants"; import {clientHeight as __clientHeight, clientWidth as __clientWidth, createAccessor as __createAccessor, data as __data, height as __height, left as __left, length as __length, pageX as __pageX, pageY as __pageY, props as __props, scrollLeft as __scrollLeft, scrollTop as __scrollTop, state as __state, style as __style, target as __target, top as __top, value as __value, width as __width} from "./../CommonFields"; import {toConsumableArray as __toConsumableArray} from "./../_virtual/_rollupPluginBabelHelpers"; import {extends as __extends} from "./../_virtual/_rollupPluginBabelHelpers"; import {inherits as __inherits} from "./../_virtual/_rollupPluginBabelHelpers"; import { inherits as _inherits, createSuper as _createSuper, createClass as _createClass, classCallCheck as _classCallCheck, assertThisInitialized as _assertThisInitialized, slicedToArray as _slicedToArray } from '../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
2
|
import React from 'react';
|
|
3
|
+
import '../ReactCreateElement.js';
|
|
3
4
|
import 'prop-types';
|
|
4
5
|
import { setOf, allPropsExcept, isDifferent, addEventListener, WINDOW, removeEventListener, orNoop } from '../Tools.js';
|
|
5
6
|
import { stateGSs, componentDidUpdate, render, componentDidMount, componentWillUnmount, PureComponent, propsGetter, setState } from '../ReactConstants.js';
|
package/router/Route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Route.js","sources":["../src/router/Route.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport {allPropsExcept, isDifferent, orNoop, setOf, WINDOW, addEventListener, removeEventListener} from \"../Tools\";\nimport {componentDidUpdate, render, PureComponent, componentDidMount, componentWillUnmount, propsGetter, stateGSs, setState} from \"../ReactConstants\";\n\nconst historyEvents = ['popstate', 'pushState', 'replaceState'];\n\nconst cleanPath = (path) => {\n if (path.length > 1 && path.lastIndexOf('/') === path.length - 1)\n return path.substring(0, path.length - 1);\n\n return path;\n};\n\nconst createUrlMatcher = path => {\n let matcher;\n const segments = path.split('/');\n const optionals = segments.map(it => it === '*' || it.indexOf('?') === it.length - 1);\n const containsVariables = path.indexOf(':') !== -1;\n const containsAnySegment = path.indexOf('*') !== -1;\n const containsNot = path.indexOf('!') !== -1;\n\n if (!containsAnySegment && !containsVariables && !containsNot) {\n matcher = (p) => p === path\n } else {\n const endsWithAny = path.lastIndexOf('*') === path.length - 1;\n const matchers = segments.map((segment, i) => {\n let matcher;\n const variableNameIndex = segment.indexOf(':');\n if (segment === '*')\n matcher = () => true;\n else if (variableNameIndex !== -1) {\n let variable = segment.substring(variableNameIndex + 1);\n let regex = null\n if (variable.indexOf('?') !== -1)\n variable = variable.substring(0, variable.indexOf('?'));\n if (variable.indexOf('(') !== -1) {\n let regexStart = variable.indexOf('(');\n regex = new RegExp(variable.substring(regexStart))\n variable = variable.substring(0, regexStart);\n }\n\n const prefix = variableNameIndex && segment.substring(0, variableNameIndex);\n matcher = (p, params) => {\n if (regex && !!p && !p.match(regex))\n return false\n\n if (!p && !optionals[i])\n return false;\n if (prefix) {\n if (p.indexOf(prefix) === 0)\n p = p.substring(variableNameIndex);\n else\n return false;\n }\n\n params[variable] = p;\n return true;\n }\n } else if (segment.indexOf('!') === 0) {\n const not = segment.substring(1);\n matcher = (p) => p !== not;\n } else\n matcher = (p) => p === segment;\n return matcher;\n });\n\n matcher = (path, params) => {\n const segments = path.split('/');\n const length = Math.min(matchers.length, segments.length);\n\n // only exact match if mapping not ends with *\n if (!endsWithAny && matchers.length < segments.length)\n return false;\n\n // check that each segment matches\n for (let i = 0; i < length; i++) {\n if (!matchers[i](segments[i], params))\n return false;\n }\n\n // check that all other segments are optional\n for (let i = length; i < optionals.length; i++) {\n if (!optionals[i])\n return false;\n }\n\n return true;\n };\n }\n return matcher\n};\n\nconst createUrlMatchers = path => {\n if (Array.isArray(path)) {\n const matchers = path.map(it => createUrlMatcher(it));\n return (path, params) => {\n for (let i = 0; i < matchers.length; i++) {\n let props = {};\n if (matchers[i](path, props)) {\n Object.assign(params, props);\n return true;\n }\n }\n return false;\n }\n } else {\n return createUrlMatcher(path);\n }\n};\n\nconst selfProps = setOf([\n 'children',\n 'path',\n 'controller',\n 'onToggle',\n]);\n\nclass Route extends PureComponent {\n\n constructor(properties) {\n super(properties);\n const that = this;\n that.state = {};\n let matcher;\n\n const props = propsGetter(that);\n const [\n isRendering,\n paramsState,\n mergedPropsState,\n ] = stateGSs(that, 3);\n\n const process = () => {\n let params = {};\n let nextState = {};\n let isMatching = matcher(cleanPath(WINDOW.location.pathname), params);\n\n const toggle = isMatching !== isRendering();\n toggle && (nextState[isRendering] = isMatching);\n\n if (isDifferent(paramsState(), params)) {\n nextState[mergedPropsState] = Object.assign(allPropsExcept(props(), selfProps), params);\n nextState[paramsState] = params;\n }\n\n //set new state just once to avoid several renders\n setState(that, nextState, () => {\n toggle && orNoop(props().onToggle)(isMatching);\n })\n };\n\n that[componentDidUpdate] = (prevProps, prevState) => {\n if (props() !== prevProps) {\n let mergedProps = Object.assign(allPropsExcept(props(), selfProps), paramsState());\n if (isDifferent(mergedProps, mergedPropsState()))\n mergedPropsState(mergedProps);\n }\n };\n\n that[render] = () => {\n const {children, controller} = props();\n return (controller || DefaultController)(isRendering(), children, mergedPropsState());\n };\n\n that[componentDidMount] = () => {\n matcher = createUrlMatchers(props().path);\n\n historyEvents.forEach(it => {\n addEventListener(WINDOW, it, process);\n });\n process();\n };\n\n that[componentWillUnmount] = () => {\n historyEvents.forEach(it => {\n removeEventListener(WINDOW, it, process);\n });\n };\n }\n}\n\nif (window.isNotProductionEnvironment) {\n Route.propTypes = {\n path: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]).isRequired,\n controller: PropTypes.func,\n onToggle: PropTypes.func,\n };\n}\n\nconst DefaultController = (matches, children, props) => {\n if (!matches || !children) return null;\n if (Object.keys(props).length > 0) {\n return React.Children.map(children, child => React.cloneElement(child, props));\n }\n return children;\n};\n\nexport default Route;"],"names":["historyEvents","cleanPath","path","length","lastIndexOf","substring","createUrlMatcher","matcher","segments","split","optionals","map","it","indexOf","containsVariables","containsAnySegment","containsNot","p","endsWithAny","matchers","segment","i","variableNameIndex","variable","regex","regexStart","RegExp","prefix","params","match","not","Math","min","createUrlMatchers","Array","isArray","props","Object","assign","selfProps","setOf","Route","_PureComponent","_inherits","_super","_createSuper","properties","_this","_classCallCheck","call","that","_assertThisInitialized","state","propsGetter","_stateGSs","stateGSs","_stateGSs2","_slicedToArray","isRendering","paramsState","mergedPropsState","process","nextState","isMatching","WINDOW","location","pathname","toggle","isDifferent","allPropsExcept","setState","orNoop","onToggle","componentDidUpdate","prevProps","prevState","mergedProps","render","_props","children","controller","DefaultController","componentDidMount","forEach","addEventListener","componentWillUnmount","removeEventListener","_createClass","PureComponent","matches","keys","React","Children","child","cloneElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Route.js","sources":["../src/router/Route.js"],"sourcesContent":["import React from 'react';\nimport ReactCreateElement from '../ReactCreateElement';\nimport PropTypes from 'prop-types';\nimport './HistoryTools'\nimport {allPropsExcept, isDifferent, orNoop, setOf, WINDOW, addEventListener, removeEventListener} from \"../Tools\";\nimport {componentDidUpdate, render, PureComponent, componentDidMount, componentWillUnmount, propsGetter, stateGSs, setState} from \"../ReactConstants\";\n\nconst historyEvents = ['popstate', 'pushState', 'replaceState'];\n\nconst cleanPath = (path) => {\n if (path.length > 1 && path.lastIndexOf('/') === path.length - 1)\n return path.substring(0, path.length - 1);\n\n return path;\n};\n\nconst createUrlMatcher = path => {\n let matcher;\n const segments = path.split('/');\n const optionals = segments.map(it => it === '*' || it.indexOf('?') === it.length - 1);\n const containsVariables = path.indexOf(':') !== -1;\n const containsAnySegment = path.indexOf('*') !== -1;\n const containsNot = path.indexOf('!') !== -1;\n\n if (!containsAnySegment && !containsVariables && !containsNot) {\n matcher = (p) => p === path\n } else {\n const endsWithAny = path.lastIndexOf('*') === path.length - 1;\n const matchers = segments.map((segment, i) => {\n let matcher;\n const variableNameIndex = segment.indexOf(':');\n if (segment === '*')\n matcher = () => true;\n else if (variableNameIndex !== -1) {\n let variable = segment.substring(variableNameIndex + 1);\n let regex = null\n if (variable.indexOf('?') !== -1)\n variable = variable.substring(0, variable.indexOf('?'));\n if (variable.indexOf('(') !== -1) {\n let regexStart = variable.indexOf('(');\n regex = new RegExp(variable.substring(regexStart))\n variable = variable.substring(0, regexStart);\n }\n\n const prefix = variableNameIndex && segment.substring(0, variableNameIndex);\n matcher = (p, params) => {\n if (regex && !!p && !p.match(regex))\n return false\n\n if (!p && !optionals[i])\n return false;\n if (prefix) {\n if (p.indexOf(prefix) === 0)\n p = p.substring(variableNameIndex);\n else\n return false;\n }\n\n params[variable] = p;\n return true;\n }\n } else if (segment.indexOf('!') === 0) {\n const not = segment.substring(1);\n matcher = (p) => p !== not;\n } else\n matcher = (p) => p === segment;\n return matcher;\n });\n\n matcher = (path, params) => {\n const segments = path.split('/');\n const length = Math.min(matchers.length, segments.length);\n\n // only exact match if mapping not ends with *\n if (!endsWithAny && matchers.length < segments.length)\n return false;\n\n // check that each segment matches\n for (let i = 0; i < length; i++) {\n if (!matchers[i](segments[i], params))\n return false;\n }\n\n // check that all other segments are optional\n for (let i = length; i < optionals.length; i++) {\n if (!optionals[i])\n return false;\n }\n\n return true;\n };\n }\n return matcher\n};\n\nconst createUrlMatchers = path => {\n if (Array.isArray(path)) {\n const matchers = path.map(it => createUrlMatcher(it));\n return (path, params) => {\n for (let i = 0; i < matchers.length; i++) {\n let props = {};\n if (matchers[i](path, props)) {\n Object.assign(params, props);\n return true;\n }\n }\n return false;\n }\n } else {\n return createUrlMatcher(path);\n }\n};\n\nconst selfProps = setOf([\n 'children',\n 'path',\n 'controller',\n 'onToggle',\n]);\n\nclass Route extends PureComponent {\n\n constructor(properties) {\n super(properties);\n const that = this;\n that.state = {};\n let matcher;\n\n const props = propsGetter(that);\n const [\n isRendering,\n paramsState,\n mergedPropsState,\n ] = stateGSs(that, 3);\n\n const process = () => {\n let params = {};\n let nextState = {};\n let isMatching = matcher(cleanPath(WINDOW.location.pathname), params);\n\n const toggle = isMatching !== isRendering();\n toggle && (nextState[isRendering] = isMatching);\n\n if (isDifferent(paramsState(), params)) {\n nextState[mergedPropsState] = Object.assign(allPropsExcept(props(), selfProps), params);\n nextState[paramsState] = params;\n }\n\n //set new state just once to avoid several renders\n setState(that, nextState, () => {\n toggle && orNoop(props().onToggle)(isMatching);\n })\n };\n\n that[componentDidUpdate] = (prevProps, prevState) => {\n if (props() !== prevProps) {\n let mergedProps = Object.assign(allPropsExcept(props(), selfProps), paramsState());\n if (isDifferent(mergedProps, mergedPropsState()))\n mergedPropsState(mergedProps);\n }\n };\n\n that[render] = () => {\n const {children, controller} = props();\n return (controller || DefaultController)(isRendering(), children, mergedPropsState());\n };\n\n that[componentDidMount] = () => {\n matcher = createUrlMatchers(props().path);\n\n historyEvents.forEach(it => {\n addEventListener(WINDOW, it, process);\n });\n process();\n };\n\n that[componentWillUnmount] = () => {\n historyEvents.forEach(it => {\n removeEventListener(WINDOW, it, process);\n });\n };\n }\n}\n\nif (window.isNotProductionEnvironment) {\n Route.propTypes = {\n path: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]).isRequired,\n controller: PropTypes.func,\n onToggle: PropTypes.func,\n };\n}\n\nconst DefaultController = (matches, children, props) => {\n if (!matches || !children) return null;\n if (Object.keys(props).length > 0) {\n return React.Children.map(children, child => React.cloneElement(child, props));\n }\n return children;\n};\n\nexport default Route;"],"names":["historyEvents","cleanPath","path","length","lastIndexOf","substring","createUrlMatcher","matcher","segments","split","optionals","map","it","indexOf","containsVariables","containsAnySegment","containsNot","p","endsWithAny","matchers","segment","i","variableNameIndex","variable","regex","regexStart","RegExp","prefix","params","match","not","Math","min","createUrlMatchers","Array","isArray","props","Object","assign","selfProps","setOf","Route","_PureComponent","_inherits","_super","_createSuper","properties","_this","_classCallCheck","call","that","_assertThisInitialized","state","propsGetter","_stateGSs","stateGSs","_stateGSs2","_slicedToArray","isRendering","paramsState","mergedPropsState","process","nextState","isMatching","WINDOW","location","pathname","toggle","isDifferent","allPropsExcept","setState","orNoop","onToggle","componentDidUpdate","prevProps","prevState","mergedProps","render","_props","children","controller","DefaultController","componentDidMount","forEach","addEventListener","componentWillUnmount","removeEventListener","_createClass","PureComponent","matches","keys","React","Children","child","cloneElement"],"mappings":"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"}
|
package/src/Button.tsx
CHANGED
|
@@ -2,7 +2,6 @@ import React, {FocusEventHandler, MouseEventHandler, ReactElement, ReactNode} fr
|
|
|
2
2
|
import ReactCreateElement from './ReactCreateElement';
|
|
3
3
|
import './Button.css'
|
|
4
4
|
import {classNames, DOCUMENT, addEventListener, createRef, orNoop} from "./Tools";
|
|
5
|
-
import PropTypes from "prop-types";
|
|
6
5
|
import {PureComponent, render, stateGS, props} from "./ReactConstants";
|
|
7
6
|
|
|
8
7
|
export interface ButtonProps {
|
|
@@ -1,18 +1,36 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React, {MouseEventHandler, ReactElement} from 'react';
|
|
2
2
|
import ReactCreateElement from './ReactCreateElement';
|
|
3
3
|
import './Dialog.css'
|
|
4
4
|
import Button from "./Button";
|
|
5
5
|
import Modal from "./Modal";
|
|
6
6
|
import {isUndefined, orNoop, preventDefault, ref, UNDEFINED, classNames, createRef} from "./Tools";
|
|
7
7
|
import {PureComponent, render, componentDidMount, propsGetter, stateGSs} from "./ReactConstants";
|
|
8
|
-
import PropTypes from "prop-types";
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
|
|
10
|
+
type StringOrReactElement = string | ReactElement;
|
|
11
|
+
|
|
12
|
+
export interface DialogProps {
|
|
13
|
+
title?: StringOrReactElement,
|
|
14
|
+
description?: StringOrReactElement,
|
|
15
|
+
accept?: StringOrReactElement,
|
|
16
|
+
cancel?: StringOrReactElement,
|
|
17
|
+
className?: string,
|
|
18
|
+
top?: number,
|
|
19
|
+
onAccept?: MouseEventHandler,
|
|
20
|
+
onCancel?: MouseEventHandler,
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class Dialog extends PureComponent<DialogProps> {
|
|
24
|
+
static defaultProps = {
|
|
25
|
+
accept: 'Accept',
|
|
26
|
+
cancel: 'Decline',
|
|
27
|
+
}
|
|
28
|
+
|
|
11
29
|
constructor(properties) {
|
|
12
30
|
super(properties);
|
|
13
31
|
|
|
14
|
-
this[
|
|
15
|
-
const {title, description, accept, cancel, onAccept, onCancel, children} =
|
|
32
|
+
this[render] = () => {
|
|
33
|
+
const {title, description, accept, cancel, onAccept, onCancel, children} = this.props;
|
|
16
34
|
return <div className="Dialog">
|
|
17
35
|
{title && <div className="title">{title}</div>}
|
|
18
36
|
{description && <div className="description">{description}</div>}
|
|
@@ -26,16 +44,34 @@ class Dialog extends PureComponent {
|
|
|
26
44
|
}
|
|
27
45
|
}
|
|
28
46
|
|
|
29
|
-
Dialog.defaultProps = {
|
|
30
|
-
accept: 'Accept',
|
|
31
|
-
cancel: 'Decline',
|
|
32
|
-
};
|
|
33
47
|
|
|
34
48
|
const throwIfPropExists = (key, props) => {
|
|
35
49
|
if (props[key]) throw Error(key + " was already set by props")
|
|
36
50
|
};
|
|
37
51
|
|
|
38
|
-
|
|
52
|
+
export type OpenDialogFn = (
|
|
53
|
+
onAccept?: MouseEventHandler,
|
|
54
|
+
onCancel?: MouseEventHandler,
|
|
55
|
+
title?: StringOrReactElement,
|
|
56
|
+
description?: StringOrReactElement,
|
|
57
|
+
accept?: StringOrReactElement,
|
|
58
|
+
cancel?: StringOrReactElement
|
|
59
|
+
) => void;
|
|
60
|
+
|
|
61
|
+
export type CloseDialogFn = () => void;
|
|
62
|
+
|
|
63
|
+
abstract class AbstractDialogWrapper extends PureComponent<DialogWrapperProps> {
|
|
64
|
+
open: OpenDialogFn
|
|
65
|
+
close: CloseDialogFn
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface DialogWrapperProps extends DialogProps {
|
|
69
|
+
show?: boolean,
|
|
70
|
+
open?: (open: OpenDialogFn) => void,
|
|
71
|
+
close?: (close: CloseDialogFn) => void,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
class DialogWrapper extends AbstractDialogWrapper {
|
|
39
75
|
|
|
40
76
|
constructor(properties) {
|
|
41
77
|
super(properties);
|
|
@@ -43,8 +79,8 @@ class DialogWrapper extends Component {
|
|
|
43
79
|
that.state = {};
|
|
44
80
|
|
|
45
81
|
const props = propsGetter(that);
|
|
46
|
-
const openRef = createRef();
|
|
47
|
-
const closeRef = createRef();
|
|
82
|
+
const openRef = createRef<() => void>();
|
|
83
|
+
const closeRef = createRef<() => void>();
|
|
48
84
|
|
|
49
85
|
const [titleState,
|
|
50
86
|
descriptionState,
|
|
@@ -52,9 +88,9 @@ class DialogWrapper extends Component {
|
|
|
52
88
|
onCancelState,
|
|
53
89
|
acceptState,
|
|
54
90
|
cancelState
|
|
55
|
-
] = stateGSs(that, 6);
|
|
91
|
+
] = stateGSs<[StringOrReactElement, StringOrReactElement, MouseEventHandler, MouseEventHandler, StringOrReactElement, StringOrReactElement]>(that, 6);
|
|
56
92
|
|
|
57
|
-
const onCancel = (e) => {
|
|
93
|
+
const onCancel = (e?) => {
|
|
58
94
|
preventDefault(e);
|
|
59
95
|
orNoop(props().onCancel || onCancelState())();
|
|
60
96
|
closeRef()();
|
|
@@ -66,8 +102,8 @@ class DialogWrapper extends Component {
|
|
|
66
102
|
closeRef()();
|
|
67
103
|
};
|
|
68
104
|
|
|
69
|
-
that[
|
|
70
|
-
const {top, className
|
|
105
|
+
that[render] = () => {
|
|
106
|
+
const {top, className} = props();
|
|
71
107
|
return (
|
|
72
108
|
<Modal
|
|
73
109
|
top={top}
|
|
@@ -76,7 +112,15 @@ class DialogWrapper extends Component {
|
|
|
76
112
|
close={closeRef}
|
|
77
113
|
onClose={onCancel}
|
|
78
114
|
>
|
|
79
|
-
<Dialog
|
|
115
|
+
<Dialog
|
|
116
|
+
title={titleState()}
|
|
117
|
+
description={descriptionState()}
|
|
118
|
+
accept={acceptState()}
|
|
119
|
+
cancel={cancelState()}
|
|
120
|
+
{...props()}
|
|
121
|
+
onAccept={onAccept}
|
|
122
|
+
onCancel={onCancel}
|
|
123
|
+
/>
|
|
80
124
|
</Modal>
|
|
81
125
|
);
|
|
82
126
|
};
|
|
@@ -117,7 +161,7 @@ class DialogWrapper extends Component {
|
|
|
117
161
|
openRef()();
|
|
118
162
|
};
|
|
119
163
|
|
|
120
|
-
that[
|
|
164
|
+
that[componentDidMount] = () => {
|
|
121
165
|
const _props = props();
|
|
122
166
|
orNoop(_props.open)(that.open);
|
|
123
167
|
orNoop(_props.close)(closeRef());
|
|
@@ -126,29 +170,4 @@ class DialogWrapper extends Component {
|
|
|
126
170
|
}
|
|
127
171
|
}
|
|
128
172
|
|
|
129
|
-
export default DialogWrapper;
|
|
130
|
-
|
|
131
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
132
|
-
DialogWrapper.propTypes = {
|
|
133
|
-
title: PropTypes.oneOfType([
|
|
134
|
-
PropTypes.string,
|
|
135
|
-
PropTypes.element
|
|
136
|
-
]),
|
|
137
|
-
description: PropTypes.oneOfType([
|
|
138
|
-
PropTypes.string,
|
|
139
|
-
PropTypes.element
|
|
140
|
-
]),
|
|
141
|
-
accept: PropTypes.oneOfType([
|
|
142
|
-
PropTypes.string,
|
|
143
|
-
PropTypes.element
|
|
144
|
-
]),
|
|
145
|
-
cancel: PropTypes.oneOfType([
|
|
146
|
-
PropTypes.string,
|
|
147
|
-
PropTypes.element
|
|
148
|
-
]),
|
|
149
|
-
onAccept: PropTypes.func,
|
|
150
|
-
onCancel: PropTypes.func,
|
|
151
|
-
[ReactConstants[5]]: PropTypes.string,
|
|
152
|
-
top: PropTypes.number,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
173
|
+
export default DialogWrapper;
|
package/src/FilteredList.css
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
background: white;
|
|
10
10
|
z-index: 4;
|
|
11
11
|
box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
|
|
12
|
-
transition:
|
|
12
|
+
transition: top 0.2s ease-out, opacity 0.2s ease-out;
|
|
13
13
|
top: calc(100% + 4px);
|
|
14
14
|
opacity: 0;
|
|
15
15
|
border-radius: 2px;
|
package/src/FilteredList.scss
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
background: white;
|
|
12
12
|
z-index: 4;
|
|
13
13
|
box-shadow: 0 3px 1px -2px rgba(0, 0, 0, .2), 0 2px 2px 0 rgba(0, 0, 0, .14), 0 1px 5px 0 rgba(0, 0, 0, .12);
|
|
14
|
-
transition:
|
|
14
|
+
transition: top 0.2s ease-out, opacity 0.2s ease-out;
|
|
15
15
|
top: calc(100% + 4px);
|
|
16
16
|
opacity: 0;
|
|
17
17
|
border-radius: 2px;
|
|
@@ -1,13 +1,39 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React, {CSSProperties, MouseEventHandler} from 'react';
|
|
2
2
|
import ReactCreateElement from './ReactCreateElement';
|
|
3
3
|
import './FilteredList.css'
|
|
4
4
|
import Scrollable from "./Scrollable";
|
|
5
5
|
import {classNames, orNoop, ref, stopPropagation, isFunction, isObject} from "./Tools";
|
|
6
6
|
import {PureComponent} from "./ReactConstants";
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
type Labels<T> = ((item: T) => string) | { [key: string]: string } | { [key: number]: string };
|
|
9
|
+
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
export const getLabel: (<T extends string | number>(labels: Labels<T>, id: T) => string) = (labels, id) => isFunction(labels) ? labels(id) : labels[id]
|
|
12
|
+
|
|
13
|
+
export interface FilteredListProps<T> {
|
|
14
|
+
nextProvider?: (cb: () => void) => void
|
|
15
|
+
prevProvider?: (cb: () => void) => void
|
|
16
|
+
resetProvider?: (cb: () => void) => void
|
|
17
|
+
selectedProvider?: (cb: () => void) => void
|
|
18
|
+
data: T[]
|
|
19
|
+
labels?: Labels<T>
|
|
20
|
+
filter?: (item: T) => boolean
|
|
21
|
+
className?: string
|
|
22
|
+
selected?: T | { [key: string]: boolean } | { [key: number]: boolean }
|
|
23
|
+
inline?: boolean
|
|
24
|
+
childComponent
|
|
25
|
+
childProps
|
|
26
|
+
style?: CSSProperties
|
|
27
|
+
scroll
|
|
28
|
+
onSelect: (selected: T) => void
|
|
29
|
+
selectSingle?: boolean
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface FilteredListState<T> {
|
|
33
|
+
selected: T
|
|
34
|
+
}
|
|
9
35
|
|
|
10
|
-
class FilteredList extends PureComponent {
|
|
36
|
+
class FilteredList<T extends string|number> extends PureComponent<FilteredListProps<T>, FilteredListState<T>> {
|
|
11
37
|
|
|
12
38
|
static defaultProps = {
|
|
13
39
|
data: [],
|
|
@@ -18,59 +44,66 @@ class FilteredList extends PureComponent {
|
|
|
18
44
|
filter: () => true,
|
|
19
45
|
};
|
|
20
46
|
|
|
47
|
+
hidden:Map<T, boolean> = new Map();
|
|
48
|
+
elements :Map<T, HTMLDivElement> = new Map();
|
|
49
|
+
list:T[] = [];
|
|
50
|
+
el: Scrollable
|
|
51
|
+
|
|
21
52
|
constructor(props) {
|
|
22
53
|
super(props);
|
|
23
|
-
this.state = {selected:
|
|
24
|
-
this.hidden = {};
|
|
25
|
-
this.elements = {};
|
|
54
|
+
this.state = {selected: null};
|
|
26
55
|
}
|
|
27
56
|
|
|
28
57
|
componentDidMount() {
|
|
29
|
-
orNoop(
|
|
30
|
-
orNoop(
|
|
31
|
-
orNoop(
|
|
32
|
-
orNoop(
|
|
58
|
+
orNoop(this.props.nextProvider)(this.next);
|
|
59
|
+
orNoop(this.props.prevProvider)(this.prev);
|
|
60
|
+
orNoop(this.props.selectedProvider)(this.selected);
|
|
61
|
+
orNoop(this.props.resetProvider)(this.reset);
|
|
33
62
|
|
|
34
|
-
this.updateList(
|
|
63
|
+
this.updateList(this.props)
|
|
35
64
|
}
|
|
36
65
|
|
|
37
66
|
componentDidUpdate(prevProps, prevState, snapshot) {
|
|
38
|
-
if (
|
|
67
|
+
if (this.props.data === prevProps.data)
|
|
39
68
|
return;
|
|
40
69
|
|
|
41
|
-
this.updateList(
|
|
70
|
+
this.updateList(this.props)
|
|
42
71
|
}
|
|
43
72
|
|
|
44
73
|
updateList = (props) => {
|
|
45
74
|
const {data} = props;
|
|
46
|
-
const {selected} =
|
|
75
|
+
const {selected} = this.state;
|
|
47
76
|
this.list = data || [];
|
|
48
77
|
|
|
49
78
|
if (!this.list.includes(selected))
|
|
50
|
-
this.setState({selected:
|
|
79
|
+
this.setState({selected: null})
|
|
51
80
|
};
|
|
52
81
|
|
|
53
82
|
render() {
|
|
54
|
-
const {data, labels, filter, className, selected, inline, childComponent, childProps, style, scroll} =
|
|
83
|
+
const {data, labels, filter, className, selected, inline, childComponent, childProps, style, scroll} = this.props;
|
|
55
84
|
return (
|
|
56
85
|
<Scrollable className={classNames('FilteredList', className, inline ? 'inline' : 'popup')}
|
|
57
86
|
autoScrollTop={false}
|
|
58
87
|
ref={ref('el', this)} style={style} scrollBarMode={scroll}>
|
|
59
|
-
{(data || []).filter(id => id
|
|
88
|
+
{(data || []).filter(id => !!id || id === 0).map(id => <ItemWrapper
|
|
60
89
|
id={id}
|
|
61
90
|
key={id}
|
|
62
91
|
label={getLabel(labels, id)}
|
|
63
92
|
childComponent={childComponent}
|
|
64
93
|
childProps={childProps}
|
|
65
|
-
element={el => this.elements
|
|
94
|
+
element={el => this.elements.set(id, el)}
|
|
66
95
|
onClick={e => {
|
|
67
96
|
stopPropagation(e);
|
|
68
97
|
this.onSelect(id);
|
|
69
98
|
}}
|
|
70
99
|
onMouseEnter={e => this.setState({selected: id})}
|
|
71
|
-
onMouseLeave={e => id ===
|
|
72
|
-
className={classNames('child',
|
|
73
|
-
classProvider={it =>
|
|
100
|
+
onMouseLeave={e => id === this.state.selected && this.setState({selected: null})}
|
|
101
|
+
className={classNames('child', this.state.selected === id && 'active', selected === id || (isObject(selected) && selected[id as (string | number)]) && 'selected')}
|
|
102
|
+
classProvider={it => {
|
|
103
|
+
const hidden = !filter(it);
|
|
104
|
+
this.hidden.set(id, hidden)
|
|
105
|
+
return hidden && 'hidden';
|
|
106
|
+
}}
|
|
74
107
|
/>)}
|
|
75
108
|
</Scrollable>
|
|
76
109
|
)
|
|
@@ -78,17 +111,17 @@ class FilteredList extends PureComponent {
|
|
|
78
111
|
|
|
79
112
|
onSelect = (id) => {
|
|
80
113
|
this.setState({selected: id});
|
|
81
|
-
|
|
114
|
+
this.props.onSelect(id);
|
|
82
115
|
};
|
|
83
116
|
|
|
84
|
-
selected = () => {
|
|
85
|
-
const {selected: value} =
|
|
86
|
-
const {selectSingle} =
|
|
117
|
+
selected = (): T => {
|
|
118
|
+
const {selected: value} = this.state;
|
|
119
|
+
const {selectSingle} = this.props;
|
|
87
120
|
|
|
88
121
|
|
|
89
|
-
if (value === -1 || this.hidden
|
|
90
|
-
let filtered = this.list.filter(id => !this.hidden
|
|
91
|
-
if (selectSingle &&
|
|
122
|
+
if (value === -1 || this.hidden.get(value)) {
|
|
123
|
+
let filtered = this.list.filter(id => !this.hidden.get(id));
|
|
124
|
+
if (selectSingle && filtered.length === 1)
|
|
92
125
|
return filtered[0];
|
|
93
126
|
|
|
94
127
|
return null;
|
|
@@ -99,16 +132,16 @@ class FilteredList extends PureComponent {
|
|
|
99
132
|
|
|
100
133
|
next = () => {
|
|
101
134
|
const list = this.list;
|
|
102
|
-
const selected =
|
|
135
|
+
const selected = this.state.selected;
|
|
103
136
|
let position = list.findIndex(id => selected === id);
|
|
104
|
-
if (this.hidden
|
|
137
|
+
if (this.hidden.get(list[position]))
|
|
105
138
|
position = -1;
|
|
106
139
|
|
|
107
|
-
while (++position <
|
|
108
|
-
if (!this.hidden
|
|
140
|
+
while (++position < list.length) {
|
|
141
|
+
if (!this.hidden.get(list[position]))
|
|
109
142
|
break
|
|
110
143
|
}
|
|
111
|
-
if (position <
|
|
144
|
+
if (position < list.length) {
|
|
112
145
|
let id = list[position];
|
|
113
146
|
this.setState({selected: id});
|
|
114
147
|
this.updateScroll(id)
|
|
@@ -117,13 +150,13 @@ class FilteredList extends PureComponent {
|
|
|
117
150
|
|
|
118
151
|
prev = () => {
|
|
119
152
|
const list = this.list;
|
|
120
|
-
const selected =
|
|
153
|
+
const selected = this.state.selected;
|
|
121
154
|
let position = list.findIndex(id => selected === id);
|
|
122
|
-
if (this.hidden
|
|
123
|
-
position =
|
|
155
|
+
if (this.hidden.get(list[position]))
|
|
156
|
+
position = list.length;
|
|
124
157
|
|
|
125
158
|
while (--position >= 0) {
|
|
126
|
-
if (!this.hidden
|
|
159
|
+
if (!this.hidden.get(list[position]))
|
|
127
160
|
break
|
|
128
161
|
}
|
|
129
162
|
if (position >= 0) {
|
|
@@ -138,9 +171,9 @@ class FilteredList extends PureComponent {
|
|
|
138
171
|
let container = this.el;
|
|
139
172
|
const scrollTop = container.getScroll();
|
|
140
173
|
const height = container.getHeight();
|
|
141
|
-
let isVisible = scrollTop <= child.offsetTop && scrollTop + height >= child.offsetTop +
|
|
174
|
+
let isVisible = scrollTop <= child.offsetTop && scrollTop + height >= child.offsetTop + child.clientHeight;
|
|
142
175
|
if (!isVisible) {
|
|
143
|
-
let scrollToBottom = child.offsetTop +
|
|
176
|
+
let scrollToBottom = child.offsetTop + child.clientHeight - height;
|
|
144
177
|
let scrollToTop = child.offsetTop;
|
|
145
178
|
if (Math.abs(scrollTop - scrollToTop) < Math.abs(scrollTop - scrollToBottom)) {
|
|
146
179
|
container.setScroll(scrollToTop)
|
|
@@ -151,8 +184,8 @@ class FilteredList extends PureComponent {
|
|
|
151
184
|
};
|
|
152
185
|
|
|
153
186
|
reset = () => {
|
|
154
|
-
this.setState({selected:
|
|
155
|
-
this.el.
|
|
187
|
+
this.setState({selected: null});
|
|
188
|
+
this.el.setScroll(0)
|
|
156
189
|
};
|
|
157
190
|
|
|
158
191
|
scrollTo = (id) => this.el.setScroll(this.elements[id] && this.elements[id].offsetTop);
|
|
@@ -160,9 +193,26 @@ class FilteredList extends PureComponent {
|
|
|
160
193
|
|
|
161
194
|
export default FilteredList;
|
|
162
195
|
|
|
163
|
-
|
|
196
|
+
interface ItemWrapperProps {
|
|
197
|
+
id
|
|
198
|
+
label
|
|
199
|
+
onClick?: MouseEventHandler
|
|
200
|
+
onMouseDown?: MouseEventHandler
|
|
201
|
+
onMouseEnter?: MouseEventHandler
|
|
202
|
+
onMouseLeave?: MouseEventHandler
|
|
203
|
+
classProvider?: (data) => string
|
|
204
|
+
className?: string
|
|
205
|
+
childComponent
|
|
206
|
+
childProps
|
|
207
|
+
element?: (el: HTMLDivElement) => void
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
class ItemWrapper extends React.Component<ItemWrapperProps> {
|
|
211
|
+
data
|
|
212
|
+
el: HTMLDivElement
|
|
213
|
+
|
|
164
214
|
render() {
|
|
165
|
-
const {id, label, onClick, onMouseDown, onMouseEnter, onMouseLeave, classProvider, className, childComponent, childProps} =
|
|
215
|
+
const {id, label, onClick, onMouseDown, onMouseEnter, onMouseLeave, classProvider, className, childComponent, childProps} = this.props;
|
|
166
216
|
const child = React.createElement(childComponent, {
|
|
167
217
|
...childProps,
|
|
168
218
|
id,
|
|
@@ -170,7 +220,7 @@ class ItemWrapper extends React.Component {
|
|
|
170
220
|
dataConsumer: (data) => this.data = data,
|
|
171
221
|
});
|
|
172
222
|
|
|
173
|
-
const cssClass = orNoop(classProvider)(
|
|
223
|
+
const cssClass = orNoop(classProvider)(this.data);
|
|
174
224
|
return (
|
|
175
225
|
<div className={classNames('ItemWrapper', cssClass, className)}
|
|
176
226
|
onMouseEnter={onMouseEnter}
|
|
@@ -185,7 +235,7 @@ class ItemWrapper extends React.Component {
|
|
|
185
235
|
}
|
|
186
236
|
|
|
187
237
|
componentDidMount() {
|
|
188
|
-
orNoop(
|
|
238
|
+
orNoop(this.props.element)(this.el);
|
|
189
239
|
this.forceUpdate();
|
|
190
240
|
}
|
|
191
241
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React, {ReactNode} from 'react';
|
|
2
2
|
import ReactCreateElement from './ReactCreateElement';
|
|
3
3
|
import './FormUploadProgress.css'
|
|
4
4
|
import Button from "./Button";
|
|
@@ -6,11 +6,10 @@ import Animated from "./Animated";
|
|
|
6
6
|
import CircleProgress from "./CircleProgress";
|
|
7
7
|
import SpinningProgress from "./SpinningProgress";
|
|
8
8
|
import {formatAbbreviation, formatNumberWithMaxLength} from "./Size";
|
|
9
|
-
import PropTypes from "prop-types";
|
|
10
9
|
import {preventDefault} from "./Tools";
|
|
11
10
|
|
|
12
11
|
|
|
13
|
-
const defaultValueFormat = (value, loaded, total) => {
|
|
12
|
+
const defaultValueFormat = (value: number, loaded: number, total: number) => {
|
|
14
13
|
if (total == null)
|
|
15
14
|
return Math.floor(Number.isFinite(value) ? value : 0) + '%';
|
|
16
15
|
|
|
@@ -24,6 +23,16 @@ const defaultValueFormat = (value, loaded, total) => {
|
|
|
24
23
|
</>
|
|
25
24
|
};
|
|
26
25
|
|
|
26
|
+
export interface FormUploadProgressProps {
|
|
27
|
+
value: number
|
|
28
|
+
loaded: number
|
|
29
|
+
total: number
|
|
30
|
+
formatValue?: (value: number, loaded: number, total: number) => ReactNode
|
|
31
|
+
processingLabel?: ReactNode
|
|
32
|
+
cancelLabel?: ReactNode
|
|
33
|
+
cancel?: () => void
|
|
34
|
+
}
|
|
35
|
+
|
|
27
36
|
const FormUploadProgress = ({
|
|
28
37
|
value,
|
|
29
38
|
cancel,
|
|
@@ -32,7 +41,7 @@ const FormUploadProgress = ({
|
|
|
32
41
|
formatValue,
|
|
33
42
|
processingLabel,
|
|
34
43
|
cancelLabel,
|
|
35
|
-
}) => {
|
|
44
|
+
}: FormUploadProgressProps) => {
|
|
36
45
|
return (
|
|
37
46
|
<Animated value={total > 0}>
|
|
38
47
|
<div className="FormUploadProgress">
|
|
@@ -60,22 +69,4 @@ FormUploadProgress.defaultProps = {
|
|
|
60
69
|
formatValue: defaultValueFormat,
|
|
61
70
|
};
|
|
62
71
|
|
|
63
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
64
|
-
FormUploadProgress.propTypes = {
|
|
65
|
-
value: PropTypes.number,
|
|
66
|
-
loaded: PropTypes.number,
|
|
67
|
-
total: PropTypes.number,
|
|
68
|
-
formatValue: PropTypes.func,
|
|
69
|
-
processingLabel: PropTypes.oneOfType([
|
|
70
|
-
PropTypes.string,
|
|
71
|
-
PropTypes.element
|
|
72
|
-
]),
|
|
73
|
-
cancelLabel: PropTypes.oneOfType([
|
|
74
|
-
PropTypes.string,
|
|
75
|
-
PropTypes.element
|
|
76
|
-
]),
|
|
77
|
-
cancel: PropTypes.func,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
72
|
export default FormUploadProgress;
|