mirror of
https://github.com/plankanban/planka.git
synced 2025-07-18 20:59:44 +02:00
Merge branch 'master' of https://github.com/plankanban/planka
This commit is contained in:
commit
281b24707a
6 changed files with 38 additions and 23 deletions
|
@ -21,36 +21,46 @@ const CardAdd = React.memo(({ isOpened, onCreate, onClose }) => {
|
||||||
|
|
||||||
const nameField = useRef(null);
|
const nameField = useRef(null);
|
||||||
|
|
||||||
const submit = useCallback(() => {
|
const submit = useCallback(
|
||||||
const cleanData = {
|
(autoOpen) => {
|
||||||
...data,
|
const cleanData = {
|
||||||
name: data.name.trim(),
|
...data,
|
||||||
};
|
name: data.name.trim(),
|
||||||
|
};
|
||||||
|
|
||||||
if (!cleanData.name) {
|
if (!cleanData.name) {
|
||||||
nameField.current.ref.current.select();
|
nameField.current.ref.current.select();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
onCreate(cleanData);
|
onCreate(cleanData, autoOpen);
|
||||||
|
setData(DEFAULT_DATA);
|
||||||
|
|
||||||
setData(DEFAULT_DATA);
|
if (autoOpen) {
|
||||||
focusNameField();
|
onClose();
|
||||||
}, [onCreate, data, setData, focusNameField]);
|
} else {
|
||||||
|
focusNameField();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[onCreate, onClose, data, setData, focusNameField],
|
||||||
|
);
|
||||||
|
|
||||||
const handleFieldKeyDown = useCallback(
|
const handleFieldKeyDown = useCallback(
|
||||||
(event) => {
|
(event) => {
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
case 'Enter':
|
case 'Enter': {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
submit();
|
const autoOpen = event.ctrlKey;
|
||||||
|
submit(autoOpen);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'Escape':
|
}
|
||||||
|
case 'Escape': {
|
||||||
onClose();
|
onClose();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -34,7 +34,7 @@ const mapDispatchToProps = (dispatch, { id }) =>
|
||||||
{
|
{
|
||||||
onUpdate: (data) => entryActions.updateList(id, data),
|
onUpdate: (data) => entryActions.updateList(id, data),
|
||||||
onDelete: () => entryActions.deleteList(id),
|
onDelete: () => entryActions.deleteList(id),
|
||||||
onCardCreate: (data) => entryActions.createCard(id, data),
|
onCardCreate: (data, autoOpen) => entryActions.createCard(id, data, autoOpen),
|
||||||
},
|
},
|
||||||
dispatch,
|
dispatch,
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import EntryActionTypes from '../constants/EntryActionTypes';
|
import EntryActionTypes from '../constants/EntryActionTypes';
|
||||||
|
|
||||||
const createCard = (listId, data) => ({
|
const createCard = (listId, data, autoOpen) => ({
|
||||||
type: EntryActionTypes.CARD_CREATE,
|
type: EntryActionTypes.CARD_CREATE,
|
||||||
payload: {
|
payload: {
|
||||||
listId,
|
listId,
|
||||||
data,
|
data,
|
||||||
|
autoOpen,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ export default {
|
||||||
editUsername_title: 'Edit Username',
|
editUsername_title: 'Edit Username',
|
||||||
email: 'E-mail',
|
email: 'E-mail',
|
||||||
emailAlreadyInUse: 'E-mail already in use',
|
emailAlreadyInUse: 'E-mail already in use',
|
||||||
enterCardTitle: 'Enter card title...',
|
enterCardTitle: 'Enter card title... [Ctrl+Enter] to auto-open',
|
||||||
enterDescription: 'Enter description...',
|
enterDescription: 'Enter description...',
|
||||||
enterFilename: 'Enter filename',
|
enterFilename: 'Enter filename',
|
||||||
enterListTitle: 'Enter list title...',
|
enterListTitle: 'Enter list title...',
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
import { call, put, select } from 'redux-saga/effects';
|
import { call, put, select } from 'redux-saga/effects';
|
||||||
|
|
||||||
import { goToBoard } from './router';
|
import { goToBoard, goToCard } from './router';
|
||||||
import request from '../request';
|
import request from '../request';
|
||||||
import selectors from '../../../selectors';
|
import selectors from '../../../selectors';
|
||||||
import actions from '../../../actions';
|
import actions from '../../../actions';
|
||||||
import api from '../../../api';
|
import api from '../../../api';
|
||||||
import { createLocalId } from '../../../utils/local-id';
|
import { createLocalId } from '../../../utils/local-id';
|
||||||
|
|
||||||
export function* createCard(listId, data) {
|
export function* createCard(listId, data, autoOpen) {
|
||||||
const { boardId } = yield select(selectors.selectListById, listId);
|
const { boardId } = yield select(selectors.selectListById, listId);
|
||||||
|
|
||||||
const nextData = {
|
const nextData = {
|
||||||
|
@ -35,6 +35,10 @@ export function* createCard(listId, data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
yield put(actions.createCard.success(localId, card));
|
yield put(actions.createCard.success(localId, card));
|
||||||
|
|
||||||
|
if (autoOpen) {
|
||||||
|
yield call(goToCard, card.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function* handleCardCreate(card) {
|
export function* handleCardCreate(card) {
|
||||||
|
|
|
@ -5,8 +5,8 @@ import EntryActionTypes from '../../../constants/EntryActionTypes';
|
||||||
|
|
||||||
export default function* cardsWatchers() {
|
export default function* cardsWatchers() {
|
||||||
yield all([
|
yield all([
|
||||||
takeEvery(EntryActionTypes.CARD_CREATE, ({ payload: { listId, data } }) =>
|
takeEvery(EntryActionTypes.CARD_CREATE, ({ payload: { listId, data, autoOpen } }) =>
|
||||||
services.createCard(listId, data),
|
services.createCard(listId, data, autoOpen),
|
||||||
),
|
),
|
||||||
takeEvery(EntryActionTypes.CARD_CREATE_HANDLE, ({ payload: { card } }) =>
|
takeEvery(EntryActionTypes.CARD_CREATE_HANDLE, ({ payload: { card } }) =>
|
||||||
services.handleCardCreate(card),
|
services.handleCardCreate(card),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue