mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 11:06:40 +07:00
saving with title and buttons and forcing
This commit is contained in:
parent
fc1bac528a
commit
1ecc2d2a92
8 changed files with 98 additions and 21 deletions
|
@ -1,10 +1,12 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { getUrlData } from '$utils/history';
|
import { getUrlData, pushPath } from '$utils/history';
|
||||||
import { toTranslit } from '$utils/format';
|
import { toTranslit } from '$utils/format';
|
||||||
import { TIPS } from '$constants/tips';
|
import { TIPS } from '$constants/tips';
|
||||||
import { MODES } from '$constants/modes';
|
import { MODES } from '$constants/modes';
|
||||||
import { postMap } from '$utils/api';
|
import { postMap } from '$utils/api';
|
||||||
|
|
||||||
|
import classnames from 'classnames';
|
||||||
|
|
||||||
export class SaveDialog extends React.Component {
|
export class SaveDialog extends React.Component {
|
||||||
state = {
|
state = {
|
||||||
address: '',
|
address: '',
|
||||||
|
@ -12,21 +14,25 @@ export class SaveDialog extends React.Component {
|
||||||
error: '',
|
error: '',
|
||||||
sending: false,
|
sending: false,
|
||||||
finished: false,
|
finished: false,
|
||||||
success: false,
|
|
||||||
overwriting: false,
|
overwriting: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
getAddress = () => {
|
||||||
|
const { path } = getUrlData();
|
||||||
|
const { title, address } = this.state;
|
||||||
|
return toTranslit(address.trim()) || toTranslit(title.trim()) || toTranslit(path.trim());
|
||||||
|
};
|
||||||
|
|
||||||
setTitle = ({ target: { value } }) => this.setState({ title: (value || '') });
|
setTitle = ({ target: { value } }) => this.setState({ title: (value || '') });
|
||||||
|
|
||||||
setAddress = ({ target: { value } }) => this.setState({ address: (value || '') });
|
setAddress = ({ target: { value } }) => this.setState({ address: (value || '') });
|
||||||
|
|
||||||
cancelSaving = () => this.props.editor.changeMode(MODES.NONE);
|
cancelSaving = () => this.props.editor.changeMode(MODES.NONE);
|
||||||
|
|
||||||
sendSaveRequest = () => {
|
sendSaveRequest = (e, force = false) => {
|
||||||
const { route, stickers } = this.props.editor.dumpData();
|
const { route, stickers } = this.props.editor.dumpData();
|
||||||
const { title, address } = this.state;
|
const { title } = this.state;
|
||||||
const { id, token } = this.props.user;
|
const { id, token } = this.props.user;
|
||||||
const { path, host } = getUrlData();
|
|
||||||
|
|
||||||
postMap({
|
postMap({
|
||||||
id,
|
id,
|
||||||
|
@ -34,13 +40,40 @@ export class SaveDialog extends React.Component {
|
||||||
route,
|
route,
|
||||||
stickers,
|
stickers,
|
||||||
title,
|
title,
|
||||||
address: (toTranslit(address.trim()) || toTranslit(title.trim()) || toTranslit(path.trim())),
|
force,
|
||||||
}).then(console.log).catch(console.warn);
|
address: this.getAddress(),
|
||||||
|
}).then(this.parseResponse).catch(console.warn);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
forceSaveRequest = e => this.sendSaveRequest(e, true);
|
||||||
|
|
||||||
|
parseResponse = data => {
|
||||||
|
if (data.success) return this.setSuccess(data);
|
||||||
|
if (data.mode === 'overwriting') return this.setOverwrite(data.description);
|
||||||
|
return this.setError(data.description);
|
||||||
|
};
|
||||||
|
|
||||||
|
setSuccess = ({ address, description }) => {
|
||||||
|
pushPath(`/${address}/edit`);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
error: description, finished: true, sending: true, overwriting: false
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
setOverwrite = error => this.setState({
|
||||||
|
error, finished: false, sending: true, overwriting: true
|
||||||
|
});
|
||||||
|
|
||||||
|
setError = error => this.setState({
|
||||||
|
error, finished: false, sending: true, overwriting: false
|
||||||
|
});
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { address, title, error } = this.state;
|
const {
|
||||||
const { path, host } = getUrlData();
|
title, error, finished, overwriting, sending
|
||||||
|
} = this.state;
|
||||||
|
const { host } = getUrlData();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="helper save-helper">
|
<div className="helper save-helper">
|
||||||
|
@ -54,7 +87,7 @@ export class SaveDialog extends React.Component {
|
||||||
<div className="save-description">
|
<div className="save-description">
|
||||||
<div className="save-address-input">
|
<div className="save-address-input">
|
||||||
<label className="save-address-label">http://{host}/</label>
|
<label className="save-address-label">http://{host}/</label>
|
||||||
<input type="text" value={toTranslit(address.trim() || title.trim() || path).substr(0, 32)} onChange={this.setAddress} />
|
<input type="text" value={this.getAddress().substr(0, 32)} onChange={this.setAddress} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="save-text">
|
<div className="save-text">
|
||||||
|
@ -65,9 +98,26 @@ export class SaveDialog extends React.Component {
|
||||||
|
|
||||||
<div className="save-buttons">
|
<div className="save-buttons">
|
||||||
<div className="save-buttons-text" />
|
<div className="save-buttons-text" />
|
||||||
<div className="button-group">
|
<div className={classnames({ 'button-group': !finished })}>
|
||||||
|
|
||||||
|
{ !finished &&
|
||||||
<div className="button" onClick={this.cancelSaving}>Отмена</div>
|
<div className="button" onClick={this.cancelSaving}>Отмена</div>
|
||||||
<div className="button primary" onClick={this.sendSaveRequest}>Сохранить</div>
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
(!sending || (sending && !overwriting && !finished)) &&
|
||||||
|
<div className="button primary" onClick={this.sendSaveRequest}>Сохранить</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
sending && overwriting &&
|
||||||
|
<div className="button danger" onClick={this.forceSaveRequest}>Перезаписать</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
{ finished &&
|
||||||
|
<div className="button success" onClick={this.cancelSaving}>Отлично, спасибо!</div>
|
||||||
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -76,4 +126,4 @@ export class SaveDialog extends React.Component {
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
|
@ -41,7 +41,6 @@ export class App extends React.Component {
|
||||||
this.editor.stopEditing();
|
this.editor.stopEditing();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(console.warn)
|
|
||||||
.catch(this.startEmptyEditor);
|
.catch(this.startEmptyEditor);
|
||||||
} else {
|
} else {
|
||||||
// this.hideLoader();
|
// this.hideLoader();
|
||||||
|
|
|
@ -195,10 +195,12 @@ export class Editor {
|
||||||
|
|
||||||
startEditing = () => {
|
startEditing = () => {
|
||||||
this.poly.poly.enableEdit();
|
this.poly.poly.enableEdit();
|
||||||
|
this.stickers.startEditing();
|
||||||
};
|
};
|
||||||
|
|
||||||
stopEditing = () => {
|
stopEditing = () => {
|
||||||
this.poly.poly.disableEdit();
|
this.poly.poly.disableEdit();
|
||||||
|
this.stickers.stopEditing();
|
||||||
};
|
};
|
||||||
|
|
||||||
dumpData = () => ({
|
dumpData = () => ({
|
||||||
|
|
|
@ -129,9 +129,13 @@ export class Sticker {
|
||||||
angle: this.angle,
|
angle: this.angle,
|
||||||
latlng: this.latlng,
|
latlng: this.latlng,
|
||||||
sticker: this.sticker,
|
sticker: this.sticker,
|
||||||
})
|
|
||||||
|
|
||||||
stopEditing = () => ({
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
stopEditing = () => {
|
||||||
|
this.element.className = 'sticker-container inactive';
|
||||||
|
};
|
||||||
|
|
||||||
|
startEditing = () => {
|
||||||
|
this.element.className = 'sticker-container';
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,4 +53,12 @@ export class Stickers {
|
||||||
};
|
};
|
||||||
|
|
||||||
dumpData = () => this.stickers.map(sticker => sticker.dumpData());
|
dumpData = () => this.stickers.map(sticker => sticker.dumpData());
|
||||||
|
|
||||||
|
startEditing = () => {
|
||||||
|
this.stickers.map(sticker => sticker.startEditing());
|
||||||
|
}
|
||||||
|
|
||||||
|
stopEditing = () => {
|
||||||
|
this.stickers.map(sticker => sticker.stopEditing());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,10 @@
|
||||||
&.danger {
|
&.danger {
|
||||||
background: #ed2f3b;
|
background: #ed2f3b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.success {
|
||||||
|
background: #17bf6d;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.button-group {
|
.button-group {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
.sticker-container {
|
.sticker-container {
|
||||||
outline: none;
|
outline: none;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
transition: transform 250ms;
|
||||||
|
|
||||||
&:before {
|
&:before {
|
||||||
content: ' ';
|
content: ' ';
|
||||||
|
@ -28,6 +29,14 @@
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.inactive {
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
|
.sticker-delete {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sticker-label {
|
.sticker-label {
|
||||||
|
|
|
@ -31,10 +31,10 @@ export const getStoredMap = ({ name }) => axios.get(API.GET_MAP, {
|
||||||
name,
|
name,
|
||||||
action: 'load'
|
action: 'load'
|
||||||
}
|
}
|
||||||
}).then(result => (result && result.data && result.data.data && result.data.owner && { ...result.data.data, owner: result.data.owner }));
|
}).then(result => (result && result.data && result.data.data && { ...result.data.data, owner: (result.data.owner || null) }));
|
||||||
|
|
||||||
export const postMap = ({
|
export const postMap = ({
|
||||||
title, address, route, stickers, id, token
|
title, address, route, stickers, id, token, force,
|
||||||
}) => axios.post(API.POST_MAP, {
|
}) => axios.post(API.POST_MAP, {
|
||||||
action: 'store',
|
action: 'store',
|
||||||
title,
|
title,
|
||||||
|
@ -43,4 +43,5 @@ export const postMap = ({
|
||||||
stickers,
|
stickers,
|
||||||
id,
|
id,
|
||||||
token,
|
token,
|
||||||
}).then(result => (result && result.data && result.data.data && result.data.owner && { ...result.data.data, owner: result.data.owner }));
|
force,
|
||||||
|
}).then(result => (result && result.data && result.data));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue