fs-walle-react-ts/src/LexSingleInput.tsx

128 lines
3.1 KiB
TypeScript
Raw Normal View History

2017-06-21 12:37:48 +00:00
import * as React from 'react';
import * as _ from 'lodash';
2017-06-22 11:34:06 +00:00
import { Label, Form } from 'semantic-ui-react';
const { Flex, Box } = require('reflexbox');
import {
Input,
Image
} from 'semantic-ui-react';
2017-07-20 13:43:40 +00:00
import {
SortableContainer,
SortableElement,
arrayMove
} from 'react-sortable-hoc';
2017-06-21 12:37:48 +00:00
class LexSingleInput extends React.Component<any, any> {
2017-06-21 12:37:48 +00:00
public render() {
return (
2017-06-22 11:34:06 +00:00
<div>
<Form>
<Form.Group as={Flex} inline={true} style={{ margin: '0 0 5px 5px' }}>
<Form.Field as={Box} w={2 / 5} style={{ textAlign: 'right' }}>
2017-07-18 08:04:02 +00:00
{this.props.label}
2017-06-22 11:34:06 +00:00
</Form.Field>
<Form.Field as={Box} w={3 / 5} >
{this.props.children}
</Form.Field>
</Form.Group>
</Form>
2017-06-21 12:37:48 +00:00
</div>
);
}
}
2017-07-18 08:04:02 +00:00
function changedLabel(changed: boolean, text: string) {
let labelClass = changed ? 'olive' : '';
return (
<Label
pointing="right"
className={labelClass}
>
{text}
</Label>
);
}
const imageRoot = '/png/';
export function textInput(params: any) {
2017-07-20 13:43:40 +00:00
let { field, sh, value, changed } = params;
return (
2017-07-18 08:04:02 +00:00
<LexSingleInput
label={changedLabel(changed, field)}
key={field}
>
<Input
onChange={sh}
2017-07-20 13:43:40 +00:00
value={value}
placeholder={field}
type="text"
dir="auto"
style={{ width: '10em' }}
/>
</LexSingleInput>
);
}
export function selectInput(params: any) {
2017-07-20 13:43:40 +00:00
let { field, sh, value, options, langSelOpts, changed } = params;
let staticOpts = options;
let fieldOpts = _.get<any>(langSelOpts, field, []);
let selOpts = staticOpts ? staticOpts : fieldOpts;
return (
2017-07-18 08:04:02 +00:00
<LexSingleInput key={field} label={changedLabel(changed, field)}>
<select
onChange={sh}
style={{ width: '10em' }}
2017-07-20 13:43:40 +00:00
value={value}
>
{selOpts.map((k: any, i: any, c: any) => {
return <option key={i} value={k}> {k}</option>;
})}
</select>
</LexSingleInput>
);
}
export function imagePreview(params: any) {
2017-07-20 13:43:40 +00:00
let { field, value, changed } = params;
let imageSrc = imageRoot + value;
return value !== '' ? (
2017-07-18 08:04:02 +00:00
<LexSingleInput key={field} label={changedLabel(changed, field)}>
<Image src={imageSrc} size="tiny" bordered={true} />
</LexSingleInput>
) : textInput(params);
}
2017-07-19 13:40:56 +00:00
2017-07-20 13:43:40 +00:00
const SortableItem = SortableElement<any>(({ value }) =>
<li>{value}</li>
);
const SortableList = SortableContainer<any>(({ items }) => {
return (
<ul>
{items.map((value: any, index: any) => (
<SortableItem key={`item-${index}`} index={index} value={value.value} />
))}
</ul>
);
});
2017-07-19 13:40:56 +00:00
export function listInput(params: any) {
2017-07-20 13:43:40 +00:00
let { field, value, changed } = params;
let sortEndHandler = (idxs: any) => {
let { oldIndex, newIndex } = idxs;
arrayMove(value, oldIndex, newIndex);
};
console.log('value: ', value);
2017-07-19 13:40:56 +00:00
return (
<LexSingleInput key={field} label={changedLabel(changed, field)}>
2017-07-20 13:43:40 +00:00
<SortableList
items={value}
onSortEnd={sortEndHandler}
helperClass="SortableHelper"
/>
2017-07-19 13:40:56 +00:00
</LexSingleInput>
);
}