1
0
Fork 0
mirror of https://github.com/muerwre/vault-frontend.git synced 2025-04-25 04:46:40 +07:00

fixed editor structure

This commit is contained in:
muerwre 2019-08-21 11:23:15 +07:00
parent c3b444dc9f
commit cad4e683bc
5 changed files with 41 additions and 37 deletions

View file

@ -17,16 +17,14 @@ type IProps = ReturnType<typeof mapStateToProps> &
pending_files: IUploadStatus[]; pending_files: IUploadStatus[];
setData: (val: INode) => void; setData: (val: INode) => void;
onFileMove: (o: number, n: number) => void; onFileMove: (from: number, to: number) => void;
onInputChange: ChangeEventHandler<HTMLInputElement>; onInputChange: ChangeEventHandler<HTMLInputElement>;
onDrop: DragEventHandler<HTMLFormElement>;
}; };
const ImageEditorUnconnected: FC<IProps> = ({ const ImageEditorUnconnected: FC<IProps> = ({
data, data,
onFileMove, onFileMove,
onInputChange, onInputChange,
onDrop,
pending_files, pending_files,
}) => ( }) => (
<ImageGrid <ImageGrid
@ -34,7 +32,6 @@ const ImageEditorUnconnected: FC<IProps> = ({
items={data.files} items={data.files}
locked={pending_files} locked={pending_files}
onUpload={onInputChange} onUpload={onInputChange}
onDrop={onDrop}
/> />
); );

View file

@ -1,5 +1,5 @@
import React, { import React, {
FC, useCallback, ChangeEventHandler, DragEventHandler FC, useCallback, ChangeEventHandler, DragEventHandler,
} from 'react'; } from 'react';
import { SortableContainer, SortableElement } from 'react-sortable-hoc'; import { SortableContainer, SortableElement } from 'react-sortable-hoc';
import * as styles from './styles.scss'; import * as styles from './styles.scss';
@ -12,10 +12,9 @@ interface IProps {
locked: IUploadStatus[]; locked: IUploadStatus[];
onFileMove: (o: number, n: number) => void; onFileMove: (o: number, n: number) => void;
onUpload?: ChangeEventHandler<HTMLInputElement>; onUpload?: ChangeEventHandler<HTMLInputElement>;
onDrop: DragEventHandler<HTMLFormElement>;
} }
const SortableItem = SortableElement(({ children, }) => ( const SortableItem = SortableElement(({ children }) => (
<div className={styles.item}>{children}</div> <div className={styles.item}>{children}</div>
)); ));
@ -23,14 +22,12 @@ const SortableList = SortableContainer(
({ ({
items, items,
locked, locked,
onDrop,
}: { }: {
items: IFile[]; items: IFile[];
locked: IUploadStatus[]; locked: IUploadStatus[];
onUpload: ChangeEventHandler<HTMLInputElement>; onUpload: ChangeEventHandler<HTMLInputElement>;
onDrop: DragEventHandler<HTMLFormElement>;
}) => ( }) => (
<form className={styles.grid} onDrop={onDrop}> <div className={styles.grid}>
{items.map((file, index) => ( {items.map((file, index) => (
<SortableItem key={file.id} index={index} collection={0}> <SortableItem key={file.id} index={index} collection={0}>
<ImageUpload id={file.id} thumb={file.url} /> <ImageUpload id={file.id} thumb={file.url} />
@ -41,15 +38,15 @@ const SortableList = SortableContainer(
<ImageUpload thumb={item.preview} progress={item.progress} is_uploading /> <ImageUpload thumb={item.preview} progress={item.progress} is_uploading />
</SortableItem> </SortableItem>
))} ))}
</form> </div>
) )
); );
const ImageGrid: FC<IProps> = ({ const ImageGrid: FC<IProps> = ({
items, locked, onFileMove, onUpload, onDrop, items, locked, onFileMove, onUpload,
}) => { }) => {
const onMove = useCallback(({ oldIndex, newIndex, }) => onFileMove(oldIndex, newIndex), [ const onMove = useCallback(({ oldIndex, newIndex }) => onFileMove(oldIndex, newIndex), [
onFileMove onFileMove,
]); ]);
return ( return (
@ -59,7 +56,6 @@ const ImageGrid: FC<IProps> = ({
items={items} items={items}
locked={locked} locked={locked}
onUpload={onUpload} onUpload={onUpload}
onDrop={onDrop}
pressDelay={window.innerWidth < 768 ? 200 : 0} pressDelay={window.innerWidth < 768 ? 200 : 0}
helperClass={styles.helper} helperClass={styles.helper}
/> />

View file

@ -1,5 +1,5 @@
import React, { import React, {
FC, useState, useCallback, useEffect, FC, useState, useCallback, useEffect, FormEvent,
} from 'react'; } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import assocPath from 'ramda/es/assocPath'; import assocPath from 'ramda/es/assocPath';
@ -61,7 +61,7 @@ const EditorDialogUnconnected: FC<IProps> = ({
); );
const onDrop = useCallback( const onDrop = useCallback(
(event: React.DragEvent<HTMLFormElement>) => { (event: React.DragEvent<HTMLDivElement>) => {
event.preventDefault(); event.preventDefault();
if (!event.dataTransfer || !event.dataTransfer.files || !event.dataTransfer.files.length) return; if (!event.dataTransfer || !event.dataTransfer.files || !event.dataTransfer.files.length) return;
@ -118,8 +118,8 @@ const EditorDialogUnconnected: FC<IProps> = ({
}; };
}, [eventPreventer]); }, [eventPreventer]);
useEffect(() => console.log({ temp }), [temp]); // useEffect(() => console.log({ temp }), [temp]);
useEffect(() => console.log({ data }), [data]); // useEffect(() => console.log({ data }), [data]);
useEffect(() => { useEffect(() => {
Object.entries(statuses).forEach(([id, status]) => { Object.entries(statuses).forEach(([id, status]) => {
@ -137,12 +137,17 @@ const EditorDialogUnconnected: FC<IProps> = ({
[setData, data] [setData, data]
); );
const onSubmit = useCallback((event: FormEvent) => {
event.preventDefault();
console.log({ data });
}, [data]);
const buttons = ( const buttons = (
<Padder style={{ position: 'relative' }}> <Padder style={{ position: 'relative' }}>
<EditorPanel data={data} setData={setData} onUpload={onInputChange} /> <EditorPanel data={data} setData={setData} onUpload={onInputChange} />
<Group horizontal> <Group horizontal>
<InputText title="Название" value={data.title} handler={setTitle} /> <InputText title="Название" value={data.title} handler={setTitle} autoFocus />
<Button title="Сохранить" iconRight="check" /> <Button title="Сохранить" iconRight="check" />
</Group> </Group>
@ -152,19 +157,20 @@ const EditorDialogUnconnected: FC<IProps> = ({
useCloseOnEscape(onRequestClose); useCloseOnEscape(onRequestClose);
return ( return (
<ScrollDialog buttons={buttons} width={860} onClose={onRequestClose}> <form onSubmit={onSubmit} className={styles.form}>
<div className={styles.editor}> <ScrollDialog buttons={buttons} width={860} onClose={onRequestClose}>
<ImageEditor <div className={styles.editor} onDrop={onDrop}>
data={data} <ImageEditor
setData={setData} data={data}
pending_files={temp.filter(id => !!statuses[id]).map(id => statuses[id])} pending_files={temp.filter(id => !!statuses[id]).map(id => statuses[id])}
onUpload={onInputChange} setData={setData}
onFileMove={onFileMove} onUpload={onInputChange}
onInputChange={onInputChange} onFileMove={onFileMove}
onDrop={onDrop} onInputChange={onInputChange}
/> />
</div> </div>
</ScrollDialog> </ScrollDialog>
</form>
); );
}; };

View file

@ -6,3 +6,8 @@
justify-content: center; justify-content: center;
position: relative; position: relative;
} }
.form {
height: 100vh;
width: 100%;
}

View file

@ -16,7 +16,7 @@ const INITIAL_STATE: INodeState = {
editor: { editor: {
...EMPTY_NODE, ...EMPTY_NODE,
type: 'image', type: 'image',
blocks: [{ ...EMPTY_BLOCK, type: 'image' }], blocks: [],
files: [], files: [],
}, },
is_loading: false, is_loading: false,