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:
parent
c3b444dc9f
commit
cad4e683bc
5 changed files with 41 additions and 37 deletions
|
@ -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}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,3 +6,8 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.form {
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
}
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue