From 6dd8ad307843f7bbc6cd0dd7befeced8b90432eb Mon Sep 17 00:00:00 2001 From: Ahmed Awan Date: Mon, 1 Aug 2022 17:36:40 -0400 Subject: [PATCH 01/15] Advanced Tool Search Added a dropdown, advanced filter menu for tools, similar to the history --- client/src/components/Common/DelayedInput.vue | 22 ++++ .../Panels/Common/ToolAdvancedSearch.vue | 107 ++++++++++++++++++ .../Panels/Common/ToolSearch.test.js | 52 +++++++++ .../components/Panels/Common/ToolSearch.vue | 48 +++++++- client/src/components/Panels/ToolBox.vue | 37 +++--- .../components/providers/storeProviders.js | 1 + client/src/entry/analysis/router.js | 10 ++ client/src/store/toolStore.js | 47 ++++++++ lib/galaxy/webapps/galaxy/buildapp.py | 1 + 9 files changed, 308 insertions(+), 17 deletions(-) create mode 100644 client/src/components/Panels/Common/ToolAdvancedSearch.vue create mode 100644 client/src/components/Panels/Common/ToolSearch.test.js diff --git a/client/src/components/Common/DelayedInput.vue b/client/src/components/Common/DelayedInput.vue index 8f3281c2267..a713cd6a3b8 100644 --- a/client/src/components/Common/DelayedInput.vue +++ b/client/src/components/Common/DelayedInput.vue @@ -6,15 +6,26 @@ class="search-query" size="sm" autocomplete="off" + :disabled="includeAdvBtn && showAdvanced" :placeholder="placeholder" @input="delayQuery" @change="setQuery" @keydown.esc="setQuery('')" /> + + + + @@ -42,6 +53,14 @@ export default { type: Number, default: 1000, }, + includeAdvBtn: { + type: Boolean, + default: false, + }, + showAdvanced: { + type: Boolean, + default: false, + }, }, data() { return { @@ -83,6 +102,9 @@ export default { this.setQuery(""); this.$refs.toolInput.focus(); }, + onToggle() { + this.$emit("onToggle", !this.showAdvanced); + }, }, }; diff --git a/client/src/components/Panels/Common/ToolAdvancedSearch.vue b/client/src/components/Panels/Common/ToolAdvancedSearch.vue new file mode 100644 index 00000000000..bb9bcaa931a --- /dev/null +++ b/client/src/components/Panels/Common/ToolAdvancedSearch.vue @@ -0,0 +1,107 @@ + + diff --git a/client/src/components/Panels/Common/ToolSearch.test.js b/client/src/components/Panels/Common/ToolSearch.test.js new file mode 100644 index 00000000000..068f416e2a6 --- /dev/null +++ b/client/src/components/Panels/Common/ToolSearch.test.js @@ -0,0 +1,52 @@ +import { mount } from "@vue/test-utils"; +import { getLocalVue } from "jest/helpers"; +import ToolSearch from "./ToolSearch"; +const localVue = getLocalVue(); + +describe("ToolSearch", () => { + it("test tools advanced filter panel", async () => { + const wrapper = mount(ToolSearch, { + propsData: { + currentPanelView: "default", + showAdvanced: false, + }, + localVue, + stubs: { + icon: { template: "
" }, + }, + }); + + expect(wrapper.find("[description='advanced tool filters']").exists()).toBe(false); + await wrapper.setProps({ showAdvanced: true }); + expect(wrapper.find("[description='advanced tool filters']").exists()).toBe(true); + const filterInputs = { + "[placeholder='any tool name']": "name-filter", + "[placeholder='any section']": "section-filter", + "[placeholder='any id']": "id-filter", + "[placeholder='any description']": "desc-filter", + }; + + // Now add filters in all input fields in the advanced menu + Object.entries(filterInputs).forEach(([selector, value]) => { + const filterInput = wrapper.find(selector); + if (filterInput.vm && filterInput.props().type == "text") { + filterInput.setValue(value); + } + }); + + // Test: values are stored in the filterSettings object + expect(Object.values(wrapper.vm.filterSettings)).toEqual(Object.values(filterInputs)); + + // Test: clearing the filters + const clearButton = wrapper.find("[description='clear filters']"); + expect(Object.values(wrapper.vm.filterSettings).length).toBe(4); + await clearButton.trigger("click"); + expect(Object.values(wrapper.vm.filterSettings).length).toBe(0); + + // Test: keyup.esc (should toggle the view out) + const nameField = wrapper.find("[placeholder='any tool name']"); + expect(wrapper.emitted()["update:show-advanced"]).toBeUndefined(); + await nameField.trigger("keyup.esc"); + expect(wrapper.emitted()["update:show-advanced"].length - 1).toBeFalsy(); + }); +}); diff --git a/client/src/components/Panels/Common/ToolSearch.vue b/client/src/components/Panels/Common/ToolSearch.vue index 25a9d36958d..f810e4d42a6 100644 --- a/client/src/components/Panels/Common/ToolSearch.vue +++ b/client/src/components/Panels/Common/ToolSearch.vue @@ -1,5 +1,40 @@ diff --git a/client/src/components/Panels/ToolBox.vue b/client/src/components/Panels/ToolBox.vue index 5820ccb9aab..045e319e5c4 100644 --- a/client/src/components/Panels/ToolBox.vue +++ b/client/src/components/Panels/ToolBox.vue @@ -3,8 +3,9 @@