diff --git a/app/assets/javascripts/repositories/repository_datatable.js b/app/assets/javascripts/repositories/repository_datatable.js index d391882cf..bfc130a2e 100644 --- a/app/assets/javascripts/repositories/repository_datatable.js +++ b/app/assets/javascripts/repositories/repository_datatable.js @@ -872,6 +872,12 @@ var RepositoryDatatable = (function(global) { changeToEditMode(); // adjustTableHeader(); }) + .on('click', '#assignRepositoryRecords', function(e) { + e.preventDefault(); + e.stopPropagation(); + + window.AssignItemsToTaskModalComponentContainer.showModal(); + }) .on('click', '#deleteRepositoryRecords', function(e) { e.preventDefault(); e.stopPropagation(); diff --git a/app/assets/stylesheets/repository/assign_items_to_task_modal.scss b/app/assets/stylesheets/repository/assign_items_to_task_modal.scss index dedd7be94..cf1bbbb8c 100644 --- a/app/assets/stylesheets/repository/assign_items_to_task_modal.scss +++ b/app/assets/stylesheets/repository/assign_items_to_task_modal.scss @@ -22,7 +22,10 @@ display: flex; flex-direction: column; row-gap: .25rem; + } + .sn-select__search-input:focus { + box-shadow: none; } label { diff --git a/app/javascript/packs/vue/assign_items_to_task_modal.js b/app/javascript/packs/vue/assign_items_to_task_modal.js index 7fd3cbc50..2cc783622 100644 --- a/app/javascript/packs/vue/assign_items_to_task_modal.js +++ b/app/javascript/packs/vue/assign_items_to_task_modal.js @@ -26,6 +26,9 @@ function initAssignItemsToTaskModalComponent() { }; }, methods: { + showModal() { + this.visibility = true; + }, closeModal() { this.visibility = false; } diff --git a/app/javascript/vue/assign_items_to_tasks_modal/container.vue b/app/javascript/vue/assign_items_to_tasks_modal/container.vue index b0f30b4f9..feb53a36f 100644 --- a/app/javascript/vue/assign_items_to_tasks_modal/container.vue +++ b/app/javascript/vue/assign_items_to_tasks_modal/container.vue @@ -39,6 +39,7 @@ </label> <SelectSearch + :value="selectedProject" ref="projectsSelector" @change="changeProject" :options="projects" @@ -65,6 +66,7 @@ </label> <SelectSearch + :value="selectedExperiment" :disabled="!selectedProject" ref="experimentsSelector" @change="changeExperiment" @@ -88,6 +90,7 @@ </label> <SelectSearch + :value="selectedTask" :disabled="!selectedExperiment" ref="tasksSelector" @change="changeTask" diff --git a/app/javascript/vue/shared/select.vue b/app/javascript/vue/shared/select.vue index 8a3862184..27520e677 100644 --- a/app/javascript/vue/shared/select.vue +++ b/app/javascript/vue/shared/select.vue @@ -18,6 +18,7 @@ export default { name: 'Select', props: { + value: { type: [String, Number] }, options: { type: Array, default: () => [] }, initialValue: { type: [String, Number] }, placeholder: { type: String }, @@ -25,7 +26,6 @@ }, data() { return { - value: null, isOpen: false, optionPositionStyle: '' } @@ -66,8 +66,7 @@ } }, setValue(value) { - this.value = value; - this.$emit('change', this.value); + this.$emit('change', value); }, updateOptionPosition() { const container = this.$refs.container; diff --git a/app/javascript/vue/shared/select_search.vue b/app/javascript/vue/shared/select_search.vue index 88249ef97..7bdb79b55 100644 --- a/app/javascript/vue/shared/select_search.vue +++ b/app/javascript/vue/shared/select_search.vue @@ -1,5 +1,5 @@ <template> - <Select class="sn-select--search" :options="currentOptions" :placeholder="placeholder" v-bind:disabled="disabled" @change="change" @blur="blur" @open="open" @close="close"> + <Select class="sn-select--search" :value="value" :options="currentOptions" :placeholder="placeholder" v-bind:disabled="disabled" @change="change" @blur="blur" @open="open" @close="close"> <input ref="focusElement" v-model="query" type="text" class="sn-select__search-input" :placeholder="searchPlaceholder" /> <span class="sn-select__value">{{ valueLabel || (placeholder || i18n.t('general.select')) }}</span> <span class="sn-select__caret caret"></span> @@ -12,6 +12,7 @@ export default { name: 'SelectSearch', props: { + value: { type: [String, Number] }, options: { type: Array, default: () => [] }, optionsUrl: { type: String }, placeholder: { type: String }, @@ -21,7 +22,6 @@ components: { Select }, data() { return { - value: null, query: null, currentOptions: null, isOpen: false @@ -59,15 +59,15 @@ this.$emit('blur'); }, change(value) { - this.value = value; this.isOpen = false; - this.$emit('change', this.value); + this.$emit('change', value); }, open() { this.isOpen = true; this.$emit('open'); }, close() { + this.query = ''; this.isOpen = false; this.$emit('close'); }, diff --git a/app/services/toolbars/repository_rows_service.rb b/app/services/toolbars/repository_rows_service.rb index ef32316c9..fde3b7c7c 100644 --- a/app/services/toolbars/repository_rows_service.rb +++ b/app/services/toolbars/repository_rows_service.rb @@ -30,6 +30,7 @@ module Toolbars [ restore_action, edit_action, + assign_action, duplicate_action, export_action, print_label_action, @@ -68,6 +69,19 @@ module Toolbars } end + def assign_action + return unless can_manage_repository_rows?(@repository) + + { + name: 'assign', + label: I18n.t('repositories.assign_record'), + icon: 'fas fa-paperclip', + button_class: 'assign-repository-rows-btn', + button_id: 'assignRepositoryRecords', + type: :legacy + } + end + def duplicate_action return unless can_create_repository_rows?(@repository) diff --git a/config/locales/en.yml b/config/locales/en.yml index 125e5a37e..9aeef9367 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1958,6 +1958,7 @@ en: errors_list_title: "Items were not imported because one or more errors were found:" no_repository_name: "Item name is required!" edit_record: "Edit" + assign_record: "Assign to task" copy_record: "Duplicate" delete_record: "Delete" archive_record: "Archive"