less movement in list selector

This commit is contained in:
2018-09-25 23:33:49 +03:00
parent a23153d4e9
commit 28fd0ea2ae
7 changed files with 86 additions and 133 deletions

View File

@@ -59,9 +59,9 @@
} }
}, },
"@material-ui/core": { "@material-ui/core": {
"version": "3.0.3", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.0.3.tgz", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-3.1.1.tgz",
"integrity": "sha512-xWeqqfAg8YAhEZvQhMefPvUSrVhe0RqzbOjFDbp6DELzs+88lrJP2lrsBPTuy/5+O6L+oeNyHy2XwI9C77R2dw==", "integrity": "sha512-AFAKrldoG8GrP6w+9uzHdbm9GQC+cuggKhv8yG2FcUcXoyAzyLZQww1tgTj+hXNMEuOs2l55oFBo2RNNFoGwWQ==",
"requires": { "requires": {
"@babel/runtime": "7.0.0", "@babel/runtime": "7.0.0",
"@types/jss": "^9.5.3", "@types/jss": "^9.5.3",
@@ -126,9 +126,9 @@
} }
}, },
"@types/jss": { "@types/jss": {
"version": "9.5.5", "version": "9.5.6",
"resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.5.tgz", "resolved": "https://registry.npmjs.org/@types/jss/-/jss-9.5.6.tgz",
"integrity": "sha512-SvxziE0TAoyYst/bzqdReNLIymrZ4jlgc3ux0qnjeS38jAUXVbD/c8gg58QLVOIb0djRBELIBuywRKtJe+iLtg==", "integrity": "sha512-7TWmR5y1jYG4ka4wTZt65RR0kw4WgALFUWktQIWbLnDd6/z/0SQZ/4+UeH0rhdp+HEdIfmzPBH0VwE/4Z9Evzw==",
"requires": { "requires": {
"csstype": "^2.0.0", "csstype": "^2.0.0",
"indefinite-observable": "^1.0.1" "indefinite-observable": "^1.0.1"
@@ -4411,13 +4411,11 @@
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@@ -4430,18 +4428,15 @@
}, },
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
@@ -4544,8 +4539,7 @@
}, },
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
@@ -4555,7 +4549,6 @@
"is-fullwidth-code-point": { "is-fullwidth-code-point": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
@@ -4568,20 +4561,17 @@
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
}, },
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true, "bundled": true
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.2.4", "version": "2.2.4",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"yallist": "^3.0.0" "yallist": "^3.0.0"
@@ -4598,7 +4588,6 @@
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
@@ -4671,8 +4660,7 @@
}, },
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
@@ -4682,7 +4670,6 @@
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
@@ -4788,7 +4775,6 @@
"string-width": { "string-width": {
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
@@ -9761,28 +9747,13 @@
"integrity": "sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw==" "integrity": "sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw=="
}, },
"react-event-listener": { "react-event-listener": {
"version": "0.6.3", "version": "0.6.4",
"resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.3.tgz", "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.4.tgz",
"integrity": "sha512-21ubz0vpzPL/8YPGkcDs/LFIemxMFPhpXnFKvrm15IA7x/kYzh1Bru3ww/lsZJJ0hCqyhJGjv7Txl/U00Je5SA==", "integrity": "sha512-t7VSjIuUFmN+GeyKb+wm025YLeojVB85kJL6sSs0wEBJddfmKBEQz+CNBZ2zBLKVWkPy/fZXM6U5yvojjYBVYQ==",
"requires": { "requires": {
"@babel/runtime": "7.0.0-rc.1", "@babel/runtime": "7.0.0",
"prop-types": "^15.6.0", "prop-types": "^15.6.0",
"warning": "^4.0.1" "warning": "^4.0.1"
},
"dependencies": {
"@babel/runtime": {
"version": "7.0.0-rc.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-rc.1.tgz",
"integrity": "sha512-Nifv2kwP/nwR39cAOasNxzjYfpeuf/ZbZNtQz5eYxWTC9yHARU9wItFnAwz1GTZ62MU+AtSjzZPMbLK5Q9hmbg==",
"requires": {
"regenerator-runtime": "^0.12.0"
}
},
"regenerator-runtime": {
"version": "0.12.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
"integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
}
} }
}, },
"react-jss": { "react-jss": {

View File

@@ -3,7 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"dependencies": { "dependencies": {
"@material-ui/core": "^3.0.3", "@material-ui/core": "^3.1.1",
"@material-ui/icons": "^3.0.1", "@material-ui/icons": "^3.0.1",
"@redux-offline/redux-offline": "^2.4.0", "@redux-offline/redux-offline": "^2.4.0",
"localforage": "^1.7.2", "localforage": "^1.7.2",

View File

@@ -10,6 +10,7 @@
flex-grow: 1; flex-grow: 1;
width: 80%; width: 80%;
margin-right: 1rem; margin-right: 1rem;
height: 100px;
} }
.loading { .loading {

View File

@@ -2,9 +2,10 @@ import DeleteIcon from '@material-ui/icons/Delete';
import AddIcon from '@material-ui/icons/Add'; import AddIcon from '@material-ui/icons/Add';
import EditIcon from '@material-ui/icons/Edit'; import EditIcon from '@material-ui/icons/Edit';
import BackButton from '@material-ui/icons/ArrowBack'; import BackButton from '@material-ui/icons/ArrowBack';
import { IconButton } from '@material-ui/core';
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Transition, config, animated } from 'react-spring'; import { Transition, config } from 'react-spring';
const button = { const button = {
width: 30, width: 30,
@@ -37,54 +38,58 @@ export default function ListActions({
const actions = []; const actions = [];
if (!creating && !editing) { if (!creating && !editing) {
actions.push(styles => ( actions.push(styles => (
<animated.button <IconButton
key="create" key="create"
style={{ ...button, ...styles }} style={{ ...button, ...styles }}
onClick={() => startCreateList()} onClick={() => startCreateList()}
> >
<AddIcon style={icon} /> <AddIcon style={icon} />
</animated.button> </IconButton>
)); ));
} }
if (list && !creating && !editing) { if (list && !creating && !editing) {
actions.push(styles => ( actions.push(styles => (
<animated.button <IconButton
key="remove" key="remove"
style={{ ...button, ...styles }} style={{ ...button, ...styles }}
onClick={() => removeList()} onClick={() => removeList()}
> >
<DeleteIcon style={icon} /> <DeleteIcon style={icon} />
</animated.button> </IconButton>
)); ));
} }
if (list && !creating && !editing) { if (list && !creating && !editing) {
actions.push(styles => ( actions.push(styles => (
<animated.button <IconButton
key="edit" key="edit"
style={{ ...button, ...styles }} style={{ ...button, ...styles }}
onClick={() => startEditList()} onClick={() => startEditList()}
> >
<EditIcon style={icon} /> <EditIcon style={icon} />
</animated.button> </IconButton>
)); ));
} }
if (creating || editing) { if (creating || editing) {
actions.push(styles => ( actions.push(styles => (
<animated.button <IconButton
key="back" key="back"
style={{ ...button, ...styles }} style={{ ...button, ...styles }}
className="backbutton" className="backbutton"
onClick={() => back()} onClick={() => back()}
> >
<BackButton style={icon} /> <BackButton style={icon} />
</animated.button> </IconButton>
)); ));
} }
return ( return (
<div id="listactions"> <div id="listactions">
<Transition <Transition
native config={{
config={config.stiff} ...config.stiff,
overshootClamping: true,
restSpeedThreshold: 0.5,
restDisplacementThreshold: 0.5,
}}
keys={actions.map(action => action({}).key)} keys={actions.map(action => action({}).key)}
from={{ opacity: 0, height: 0, margin: 0, padding: 0 }} from={{ opacity: 0, height: 0, margin: 0, padding: 0 }}
enter={{ opacity: 1, height: 30, margin: 0, padding: 0 }} enter={{ opacity: 1, height: 30, margin: 0, padding: 0 }}

View File

@@ -0,0 +1,43 @@
import React from 'react';
import PropTypes from 'prop-types';
import { IconButton } from '@material-ui/core';
const button = {
width: 36,
height: 36,
};
export default function ListInput({ onClick, children, defaultValue }) {
let input;
return (
<div id="listselector" className="list--input">
<input
ref={node => {
input = node;
}}
defaultValue={defaultValue}
style={{ height: 40 }}
id="input"
type="text"
onKeyPress={e => {
if (e.key === 'Enter') {
onClick(input.value);
}
}}
/>
<IconButton
style={button}
type="submit"
onClick={() => input.value.trim() && onClick(input.value)}
>
{children}
</IconButton>
</div>
);
}
ListInput.propTypes = {
onClick: PropTypes.func.isRequired,
children: PropTypes.element.isRequired,
defaultValue: PropTypes.string,
};

View File

@@ -15,8 +15,6 @@ function Lists({ userLoaded, listsLoaded }) {
<SelectorContainer /> <SelectorContainer />
</div> </div>
)} )}
{!userLoaded && <span className="loading">loading.</span>}
{userLoaded && !listsLoaded && <span className="loading">loading..</span>}
</div> </div>
); );
} }

View File

@@ -3,15 +3,10 @@ import PropTypes from 'prop-types';
import { Select, MenuItem } from '@material-ui/core'; import { Select, MenuItem } from '@material-ui/core';
import AddIcon from '@material-ui/icons/Add'; import AddIcon from '@material-ui/icons/Add';
import CheckIcon from '@material-ui/icons/Check'; import CheckIcon from '@material-ui/icons/Check';
import { Transition, config } from 'react-spring';
import ListInput from './ListInput';
import './Selector.css'; import './Selector.css';
const button = {
width: 36,
height: 36,
};
const icon = { const icon = {
fontSize: 24, fontSize: 24,
}; };
@@ -26,84 +21,24 @@ export default function Selector({
editList, editList,
}) { }) {
if (creating) { if (creating) {
let input = null;
return ( return (
<div id="listselector" className="list--input"> <ListInput onClick={addList}>
<Transition <AddIcon style={icon} />
native </ListInput>
config={config.stiff}
from={{ paddingBottom: 18 }}
enter={{ paddingBottom: 0 }}
leave={{ paddingBottom: 18 }}
>
{styles => (
<input
ref={node => {
input = node;
}}
style={styles}
id="input"
type="text"
onKeyPress={e => {
if (e.key === 'Enter') {
addList(input.value);
}
}}
/>
)}
</Transition>
<button
style={button}
type="submit"
onClick={() => input.value.trim() && addList(input.value)}
>
<AddIcon style={icon} />
</button>
</div>
); );
} }
if (editing) { if (editing) {
let input = null;
return ( return (
<div id="listselector" className="list--input"> <ListInput onClick={editList} defaultValue={lists.lists[list].name}>
<Transition <CheckIcon style={icon} />
config={config.stiff} </ListInput>
from={{ paddingBottom: 18 }}
enter={{ paddingBottom: 0 }}
leave={{ paddingBottom: 18 }}
>
{styles => (
<input
ref={node => {
input = node;
}}
style={styles}
defaultValue={lists.lists[list].name}
id="input"
type="text"
onKeyPress={e => {
if (e.key === 'Enter') {
editList(input.value);
}
}}
/>
)}
</Transition>
<button
style={button}
type="submit"
onClick={() => input.value.trim() && editList(input.value)}
>
<CheckIcon style={icon} />
</button>
</div>
); );
} }
if (list) { if (list) {
return ( return (
<div id="listselector"> <div id="listselector">
<Select <Select
style={{ fontSize: '1.5rem', width: '100%' }} style={{ fontSize: '1.5rem', width: '100%', height: 40 }}
value={list} value={list}
onChange={e => onChange(e.target.value)} onChange={e => onChange(e.target.value)}
> >