From 66aa2c36bb6dbf0d1e751bde2862a930e82c4827 Mon Sep 17 00:00:00 2001 From: RAR Date: Sun, 8 Jan 2023 21:59:24 +0100 Subject: [PATCH] feat: Open card once created with Ctrl+Enter (#373) --- client/src/components/List/CardAdd.jsx | 42 +++++++++++++++---------- client/src/containers/ListContainer.js | 2 +- client/src/entry-actions/cards.js | 3 +- client/src/locales/en/core.js | 2 +- client/src/sagas/core/services/cards.js | 8 +++-- client/src/sagas/core/watchers/cards.js | 4 +-- 6 files changed, 38 insertions(+), 23 deletions(-) diff --git a/client/src/components/List/CardAdd.jsx b/client/src/components/List/CardAdd.jsx index d457f66f..bdfc3536 100755 --- a/client/src/components/List/CardAdd.jsx +++ b/client/src/components/List/CardAdd.jsx @@ -21,36 +21,46 @@ const CardAdd = React.memo(({ isOpened, onCreate, onClose }) => { const nameField = useRef(null); - const submit = useCallback(() => { - const cleanData = { - ...data, - name: data.name.trim(), - }; + const submit = useCallback( + (autoOpen) => { + const cleanData = { + ...data, + name: data.name.trim(), + }; - if (!cleanData.name) { - nameField.current.ref.current.select(); - return; - } + if (!cleanData.name) { + nameField.current.ref.current.select(); + return; + } - onCreate(cleanData); + onCreate(cleanData, autoOpen); + setData(DEFAULT_DATA); - setData(DEFAULT_DATA); - focusNameField(); - }, [onCreate, data, setData, focusNameField]); + if (autoOpen) { + onClose(); + } else { + focusNameField(); + } + }, + [onCreate, onClose, data, setData, focusNameField], + ); const handleFieldKeyDown = useCallback( (event) => { switch (event.key) { - case 'Enter': + case 'Enter': { event.preventDefault(); - submit(); + const autoOpen = event.ctrlKey; + submit(autoOpen); break; - case 'Escape': + } + case 'Escape': { onClose(); break; + } default: } }, diff --git a/client/src/containers/ListContainer.js b/client/src/containers/ListContainer.js index 95ee90c8..cb2f6a00 100755 --- a/client/src/containers/ListContainer.js +++ b/client/src/containers/ListContainer.js @@ -34,7 +34,7 @@ const mapDispatchToProps = (dispatch, { id }) => { onUpdate: (data) => entryActions.updateList(id, data), onDelete: () => entryActions.deleteList(id), - onCardCreate: (data) => entryActions.createCard(id, data), + onCardCreate: (data, autoOpen) => entryActions.createCard(id, data, autoOpen), }, dispatch, ); diff --git a/client/src/entry-actions/cards.js b/client/src/entry-actions/cards.js index c3e9eb25..d73b2476 100755 --- a/client/src/entry-actions/cards.js +++ b/client/src/entry-actions/cards.js @@ -1,10 +1,11 @@ import EntryActionTypes from '../constants/EntryActionTypes'; -const createCard = (listId, data) => ({ +const createCard = (listId, data, autoOpen) => ({ type: EntryActionTypes.CARD_CREATE, payload: { listId, data, + autoOpen, }, }); diff --git a/client/src/locales/en/core.js b/client/src/locales/en/core.js index bccb869b..16935fe3 100644 --- a/client/src/locales/en/core.js +++ b/client/src/locales/en/core.js @@ -84,7 +84,7 @@ export default { editUsername_title: 'Edit Username', email: 'E-mail', emailAlreadyInUse: 'E-mail already in use', - enterCardTitle: 'Enter card title...', + enterCardTitle: 'Enter card title... [Ctrl+Enter] to auto-open', enterDescription: 'Enter description...', enterFilename: 'Enter filename', enterListTitle: 'Enter list title...', diff --git a/client/src/sagas/core/services/cards.js b/client/src/sagas/core/services/cards.js index a75844d2..40c3db83 100644 --- a/client/src/sagas/core/services/cards.js +++ b/client/src/sagas/core/services/cards.js @@ -1,13 +1,13 @@ import { call, put, select } from 'redux-saga/effects'; -import { goToBoard } from './router'; +import { goToBoard, goToCard } from './router'; import request from '../request'; import selectors from '../../../selectors'; import actions from '../../../actions'; import api from '../../../api'; 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 nextData = { @@ -35,6 +35,10 @@ export function* createCard(listId, data) { } yield put(actions.createCard.success(localId, card)); + + if (autoOpen) { + yield call(goToCard, card.id); + } } export function* handleCardCreate(card) { diff --git a/client/src/sagas/core/watchers/cards.js b/client/src/sagas/core/watchers/cards.js index 6a5d0889..02905150 100644 --- a/client/src/sagas/core/watchers/cards.js +++ b/client/src/sagas/core/watchers/cards.js @@ -5,8 +5,8 @@ import EntryActionTypes from '../../../constants/EntryActionTypes'; export default function* cardsWatchers() { yield all([ - takeEvery(EntryActionTypes.CARD_CREATE, ({ payload: { listId, data } }) => - services.createCard(listId, data), + takeEvery(EntryActionTypes.CARD_CREATE, ({ payload: { listId, data, autoOpen } }) => + services.createCard(listId, data, autoOpen), ), takeEvery(EntryActionTypes.CARD_CREATE_HANDLE, ({ payload: { card } }) => services.handleCardCreate(card),