19783: Fix advanced search "limit to project" option
authorPeter Amstutz <peter.amstutz@curii.com>
Fri, 9 Dec 2022 21:43:50 +0000 (16:43 -0500)
committerPeter Amstutz <peter.amstutz@curii.com>
Fri, 9 Dec 2022 21:43:50 +0000 (16:43 -0500)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

src/models/search-bar.ts
src/store/search-bar/search-bar-actions.ts
src/store/search-bar/search-bar-tree-actions.ts
src/views-components/form-fields/search-bar-form-fields.tsx

index b404496f9381c0d76ac0ea2c16f6d09bf378795c..f9320a26d700f2582afea62cf512a0fb0ba2b085 100644 (file)
@@ -3,11 +3,13 @@
 // SPDX-License-Identifier: AGPL-3.0
 
 import { ResourceKind } from 'models/resource';
+import { GroupResource } from './group';
 
 export type SearchBarAdvancedFormData = {
     type?: ResourceKind;
     cluster?: string;
     projectUuid?: string;
+    projectObject?: GroupResource;
     inTrash: boolean;
     pastVersions: boolean;
     dateFrom: string;
index 8b03ddd765e3cfe7b9002f97f0e4fd8b371a6be7..af40e86ade09bfc30698eded0bb1b8802dfac577 100644 (file)
@@ -89,6 +89,9 @@ export const searchAdvancedData = (data: SearchBarAdvancedFormData) =>
 
 export const setSearchValueFromAdvancedData = (data: SearchBarAdvancedFormData, prevData?: SearchBarAdvancedFormData) =>
     (dispatch: Dispatch, getState: () => RootState) => {
+        if (data.projectObject) {
+            data.projectUuid = data.projectObject.uuid;
+        }
         const searchValue = getState().searchBar.searchValue;
         const value = getQueryFromAdvancedData({
             ...data,
@@ -98,8 +101,11 @@ export const setSearchValueFromAdvancedData = (data: SearchBarAdvancedFormData,
     };
 
 export const setAdvancedDataFromSearchValue = (search: string, vocabulary: Vocabulary) =>
-    async (dispatch: Dispatch) => {
+    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
         const data = getAdvancedDataFromQuery(search, vocabulary);
+        if (data.projectUuid) {
+            data.projectObject = await services.projectService.get(data.projectUuid);
+        }
         dispatch<any>(initialize(SEARCH_BAR_ADVANCED_FORM_NAME, data));
         if (data.projectUuid) {
             await dispatch<any>(activateSearchBarProject(data.projectUuid));
@@ -227,11 +233,11 @@ const searchGroups = (searchValue: string, limit: number, useCancel = false) =>
                         recursive: true
                     }, session, cancelTokens[index].token);
                 }));
-    
+
                 cancelTokens = [];
-    
+
                 const items = lists.reduce((items, list) => items.concat(list.items), [] as GroupContentsResource[]);
-    
+
                 if (lists.filter(list => !!(list as any).items).length !== lists.length) {
                     dispatch(searchBarActions.SET_SEARCH_RESULTS([]));
                 } else {
@@ -290,7 +296,7 @@ export const getQueryFromAdvancedData = (data: SearchBarAdvancedFormData, prevDa
         };
         (data.properties || []).forEach(p =>
             fo[`prop-"${p.keyID || p.key}":"${p.valueID || p.value}"`] = `"${p.valueID || p.value}"`
-            );
+        );
         return fo;
     };
 
@@ -308,9 +314,9 @@ export const getQueryFromAdvancedData = (data: SearchBarAdvancedFormData, prevDa
             [`has:"${p.keyID || p.key}"`, `prop-"${p.keyID || p.key}":"${p.valueID || p.value}"`]
         ));
 
-    const modified = getModifiedKeysValues(flatData(data), prevData ? flatData(prevData):{});
+    const modified = getModifiedKeysValues(flatData(data), prevData ? flatData(prevData) : {});
     value = buildQueryFromKeyMap(
-        {searchValue: data.searchValue, ...modified} as SearchBarAdvancedFormData, keyMap);
+        { searchValue: data.searchValue, ...modified } as SearchBarAdvancedFormData, keyMap);
 
     value = value.trim();
     return value;
index 6ab25d6ea5cc3f83c6be151669e57a51bbba6d56..7d05a320fecf6348f8543a0e38bdd41916d1cf02 100644 (file)
@@ -66,8 +66,10 @@ export const expandSearchBarTreeItem = (id: string) =>
     };
 
 export const activateSearchBarProject = (id: string) =>
-    async (dispatch: Dispatch, getState: () => RootState) => {
-        const { treePicker } = getState();
+    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+
+
+        /*const { treePicker } = getState();
         const node = getSearchBarTreeNode(id)(treePicker);
         if (node && node.status !== TreeNodeStatus.LOADED) {
             await dispatch<any>(loadSearchBarTreeProjects(id));
@@ -78,7 +80,7 @@ export const activateSearchBarProject = (id: string) =>
             ids: getSearchBarTreeNodeAncestorsIds(id)(treePicker),
             pickerId: SEARCH_BAR_ADVANCED_FORM_PICKER_ID
         }));
-        dispatch<any>(expandSearchBarTreeItem(id));
+        dispatch<any>(expandSearchBarTreeItem(id));*/
     };
 
 
index 0a6b8795de3bcc6423ba34e592d98337d942ec3e..6bd6b8c292e4ced43c7b41162093cc8f92cea751 100644 (file)
@@ -17,6 +17,7 @@ import { PropertyKeyField, } from 'views-components/resource-properties-form/pro
 import { PropertyValueField } from 'views-components/resource-properties-form/property-value-field';
 import { connect } from "react-redux";
 import { RootState } from "store/store";
+import { ProjectInput, ProjectCommandInputParameter } from 'views/run-process-panel/inputs/project-input';
 
 export const SearchBarTypeField = () =>
     <Field
@@ -50,20 +51,11 @@ export const SearchBarClusterField = connect(
     );
 
 export const SearchBarProjectField = () =>
-    <Field
-        name='projectUuid'
-        component={ProjectsPicker} />;
-
-const ProjectsPicker = (props: WrappedFieldProps) =>
-    <div style={{ height: '100px', display: 'flex', flexDirection: 'column', overflow: 'overlay' }}>
-        <HomeTreePicker
-            pickerId={SEARCH_BAR_ADVANCED_FORM_PICKER_ID}
-            toggleItemActive={
-                (_: any, { id }: TreeItem<ProjectsTreePickerItem>) => {
-                    props.input.onChange(id);
-                }
-            } />
-    </div>;
+    <ProjectInput input={{
+        id: "projectObject",
+        label: "Limit search to Project"
+    } as ProjectCommandInputParameter}
+        options={{ showOnlyOwned: false, showOnlyWritable: false }} />
 
 export const SearchBarTrashField = () =>
     <Field