<script> import { __ } from '~/locale'; import { deprecatedCreateFlash as Flash } from '~/flash'; import DeprecatedModal from '~/vue_shared/components/deprecated_modal.vue'; import { visitUrl } from '~/lib/utils/url_utility'; import boardsStore from '~/boards/stores/boards_store'; import BoardConfigurationOptions from './board_configuration_options.vue'; const boardDefaults = { id: false, name: '', labels: [], milestone_id: undefined, assignee: {}, assignee_id: undefined, weight: null, hide_backlog_list: false, hide_closed_list: false, }; export default { components: { BoardScope: () => import('ee_component/boards/components/board_scope.vue'), DeprecatedModal, BoardConfigurationOptions, }, props: { canAdminBoard: { type: Boolean, required: true, }, labelsPath: { type: String, required: true, }, labelsWebUrl: { type: String, required: true, }, scopedIssueBoardFeatureEnabled: { type: Boolean, required: false, default: false, }, projectId: { type: Number, required: false, default: 0, }, groupId: { type: Number, required: false, default: 0, }, weights: { type: Array, required: false, default: () => [], }, enableScopedLabels: { type: Boolean, required: false, default: false, }, }, data() { return { board: { ...boardDefaults, ...this.currentBoard }, currentBoard: boardsStore.state.currentBoard, currentPage: boardsStore.state.currentPage, isLoading: false, }; }, computed: { isNewForm() { return this.currentPage === 'new'; }, isDeleteForm() { return this.currentPage === 'delete'; }, isEditForm() { return this.currentPage === 'edit'; }, isVisible() { return this.currentPage !== ''; }, buttonText() { if (this.isNewForm) { return __('Create board'); } if (this.isDeleteForm) { return __('Delete'); } return __('Save changes'); }, buttonKind() { if (this.isNewForm) { return 'success'; } if (this.isDeleteForm) { return 'danger'; } return 'info'; }, title() { if (this.isNewForm) { return __('Create new board'); } if (this.isDeleteForm) { return __('Delete board'); } if (this.readonly) { return __('Board scope'); } return __('Edit board'); }, readonly() { return !this.canAdminBoard; }, submitDisabled() { return this.isLoading || this.board.name.length === 0; }, }, mounted() { this.resetFormState(); if (this.$refs.name) { this.$refs.name.focus(); } }, methods: { submit() { if (this.board.name.length === 0) return; this.isLoading = true; if (this.isDeleteForm) { boardsStore .deleteBoard(this.currentBoard) .then(() => { visitUrl(boardsStore.rootPath); }) .catch(() => { Flash(__('Failed to delete board. Please try again.')); this.isLoading = false; }); } else { boardsStore .createBoard(this.board) .then(resp => { // This handles 2 use cases // - In create call we only get one parameter, the new board // - In update call, due to Promise.all, we get REST response in // array index 0 if (Array.isArray(resp)) { return resp[0].data; } return resp.data ? resp.data : resp; }) .then(data => { visitUrl(data.board_path); }) .catch(() => { Flash(__('Unable to save your changes. Please try again.')); this.isLoading = false; }); } }, cancel() { boardsStore.showPage(''); }, resetFormState() { if (this.isNewForm) { // Clear the form when we open the "New board" modal this.board = { ...boardDefaults }; } else if (this.currentBoard && Object.keys(this.currentBoard).length) { this.board = { ...boardDefaults, ...this.currentBoard }; } }, }, }; </script> <template> <deprecated-modal v-show="isVisible" :hide-footer="readonly" :title="title" :primary-button-label="buttonText" :kind="buttonKind" :submit-disabled="submitDisabled" modal-dialog-class="board-config-modal" @cancel="cancel" @submit="submit" > <template #body> <p v-if="isDeleteForm">{{ __('Are you sure you want to delete this board?') }}</p> <form v-else class="js-board-config-modal" @submit.prevent> <div v-if="!readonly" class="append-bottom-20"> <label class="label-bold gl-font-lg" for="board-new-name">{{ __('Title') }}</label> <input id="board-new-name" ref="name" v-model="board.name" class="form-control" data-qa-selector="board_name_field" type="text" :placeholder="__('Enter board name')" @keyup.enter="submit" /> </div> <board-configuration-options :is-new-form="isNewForm" :board="board" :current-board="currentBoard" /> <board-scope v-if="scopedIssueBoardFeatureEnabled" :collapse-scope="isNewForm" :board="board" :can-admin-board="canAdminBoard" :labels-path="labelsPath" :labels-web-url="labelsWebUrl" :enable-scoped-labels="enableScopedLabels" :project-id="projectId" :group-id="groupId" :weights="weights" /> </form> </template> </deprecated-modal> </template>