diff --git a/src/actions/tags.js b/src/actions/tags.js new file mode 100644 index 00000000..58a753e4 --- /dev/null +++ b/src/actions/tags.js @@ -0,0 +1,153 @@ +'use strict'; + +// Modules +import Dispatcher from '../modules/Dispatcher/Dispatcher.js'; + +/** + * Константа, содержащая в себе типы действий для работы с тегами. + */ +export const TagsActionTypes = { + /* Список тегов (в случае карточки и в случае доски) */ + SHOW_LIST_POPUP_BOARD: 'tags/list-popup/show/board', + SHOW_LIST_POPUP_CARD: 'tags/list-popup/show/card', + HIDE_LIST_POPUP: 'tags/list-popup/hide', + + /* Окно редактирования/создания тега */ + SHOW_TAG_POPUP_EDIT: 'tags/tag-popup/edit/show', + SHOW_TAG_POPUP_CREATE: 'tags/tag-popup/create/show', + HIDE_TAG_POPUP: 'tags/tag-popup/hide', + CREATE_TAG: 'tags/create', + DELETE_TAG: 'tags/delete', + UPDATE_TAG: 'tags/update', + PICK_COLOR: 'tags/pick-color', + + /* Переключение тега у карточки */ + TOGGLE_TAG: 'tags/toggle', + EDIT_TAG_NAME: 'tags/editname', +}; + +/** + * Класс, содержащий в себе действия для работы с тегами. + */ +export const tagsActions = { + + /** + * Отображает окно со списком тегов, при нажатии на кнопку тегов на доске + */ + showTagListPopUpBoard() { + Dispatcher.dispatch({ + actionName: TagsActionTypes.SHOW_LIST_POPUP_BOARD, + }); + }, + + /** + * Отображает окно со списком тегов, при нажатии на кнопку добавить тег на карточке + */ + showTagListPopUpCard() { + Dispatcher.dispatch({ + actionName: TagsActionTypes.SHOW_LIST_POPUP_CARD, + }); + }, + + /** + * Скрывает окно со списком тегов + */ + hideTagListPopUp() { + Dispatcher.dispatch({ + actionName: TagsActionTypes.HIDE_LIST_POPUP, + }); + }, + + /** + * Отображает окно редактирования тега + * @param {Number} tgid id тега + */ + showTagEditPopUp(tgid) { + Dispatcher.dispatch({ + actionName: TagsActionTypes.SHOW_TAG_POPUP_EDIT, + data: {tgid}, + }); + }, + + /** + * Отображает окно создания тега + */ + showTagCreatePopUp() { + Dispatcher.dispatch({ + actionName: TagsActionTypes.SHOW_TAG_POPUP_CREATE, + }); + }, + + /** + * Скрывает окно тега + */ + hideTagPopUp() { + Dispatcher.dispatch({ + actionName: TagsActionTypes.HIDE_TAG_POPUP, + }); + }, + + /** + * Создает тег + * @param {String} tagName название тега + */ + createTag(tagName) { + Dispatcher.dispatch({ + actionName: TagsActionTypes.CREATE_TAG, + data: { + tag_name: tagName, + }, + }); + }, + + /** + * Удаляет тег + */ + deleteTag() { + Dispatcher.dispatch({ + actionName: TagsActionTypes.DELETE_TAG, + }); + }, + + /** + * Обновляет тег + */ + updateTag() { + Dispatcher.dispatch({ + actionName: TagsActionTypes.UPDATE_TAG, + }); + }, + + /** + * Переключает тег у карточки + * @param {Number} tgid id тега + */ + toggleTag(tgid) { + Dispatcher.dispatch({ + actionName: TagsActionTypes.TOGGLE_TAG, + data: {tgid}, + }); + }, + + /** + * Выбирает цвет для текущего, редактируемого тега + * @param {Number} clrid id цвета + */ + pickColor(clrid) { + Dispatcher.dispatch({ + actionName: TagsActionTypes.PICK_COLOR, + data: {clrid}, + }); + }, + + /** + * Обновляет в сторе редактируемое имя тега + * @param {String} tagName название тега + */ + editTagName(tagName) { + Dispatcher.dispatch({ + actionName: TagsActionTypes.EDIT_TAG_NAME, + data: {tag_name: tagName}, + }); + }, +}; diff --git a/src/components/Card/Card.hbs b/src/components/Card/Card.hbs index 43e9331f..e861f219 100644 --- a/src/components/Card/Card.hbs +++ b/src/components/Card/Card.hbs @@ -1,7 +1,7 @@
{{#each tags}} -
+
{{/each}}
diff --git a/src/constants/constants.js b/src/constants/constants.js index c263536a..4875deb8 100644 --- a/src/constants/constants.js +++ b/src/constants/constants.js @@ -91,6 +91,8 @@ export const ConstantMessages = { CardTitleTooLong: 'Название карточки слишком длинное', CardErrorOnServer: 'Не удалось создать карточку, попробуйте позднее', UnsuccessfulRequest: 'Неудачный запрос, попробуйте позднее :]', + + WrongTagNameLength: 'Введите имя тега длиной от 1 до 40 символов', }; export const BoardStoreConstants = { diff --git a/src/modules/Network/Network.js b/src/modules/Network/Network.js index 240f3114..8507d4ac 100644 --- a/src/modules/Network/Network.js +++ b/src/modules/Network/Network.js @@ -28,6 +28,7 @@ class Network { team: 'api/teams', checklists: 'api/checkLists', checklistsItems: 'api/checkListItems', + tags: 'api/tags', }; this._defaultOptions = { @@ -590,6 +591,68 @@ class Network { `https://${this.BackendUrl}/${this._endpoints.comments}/${data.cmid}`, options); } + + /** + * Метод, реализующий PUT /api/cards/:cid/toggletag/:tgid + * @param {Number} cid - id карточки + * @param {Number} tgid - id переключаемого тега + */ + async toggleCardTag(cid, tgid) { + const options = { + method: 'put', + headers: { + 'Content-Type': 'application/json', + }, + }; + return this.httpRequest( + `https://${this.BackendUrl}/${this._endpoints.card}/${cid}` + + `/toggletag/${tgid}`, options); + } + + /** + * Метод, реализующий запрос DELETE /api/tags/:tgid + * @param {Number} tgid - id тега + * @return {Promise} промис запроса + */ + async deleteTag(tgid) { + const options = { + method: 'delete', + }; + return this.httpRequest(`https://${this.BackendUrl}` + + `/${this._endpoints.tags}/${tgid}`, options); + } + + + /** + * Метод, реализующий запрос POST /api/tags. + * @param {object} data полезная нагрузка запроса + * @return {Promise} промис запроса + */ + async createTag(data) { + const options = { + method: 'post', + body: JSON.stringify(data), + }; + return this.httpRequest( + `https://${this.BackendUrl}/${this._endpoints.tags}`, + options); + } + + /** + * Метод, реализующий запрос PUT /api/tag/:tgid. + * @param {Object} data полезная нагрузка запроса + * @param {Number} tgid id обновляемого тега + * @return {Promise} промис запроса + */ + async updateTag(data, tgid) { + const options = { + method: 'put', + body: JSON.stringify(data), + }; + return this.httpRequest( + `https://${this.BackendUrl}/${this._endpoints.tags}/${tgid}`, + options); + } } export default new Network(); diff --git a/src/modules/Validator/Validator.js b/src/modules/Validator/Validator.js index 0e5b0fad..169c715d 100644 --- a/src/modules/Validator/Validator.js +++ b/src/modules/Validator/Validator.js @@ -176,4 +176,16 @@ export default class Validator { } return ''; } + + /** + * Метод, валидирующий название тега + * @param {String} title заглавие на проверку + * @return {String | null} + */ + validateTagTitle(title) { + if (!title || title.length === 0 || title.length > 40) { + return ConstantMessages.WrongTagNameLength; + } + return null; + } } diff --git a/src/popups/Card/CardPopUp.hbs b/src/popups/Card/CardPopUp.hbs index 6de91c69..2d3db2f7 100644 --- a/src/popups/Card/CardPopUp.hbs +++ b/src/popups/Card/CardPopUp.hbs @@ -12,6 +12,17 @@