[ARVADOS-WORKBENCH2] updated: 1.4.1-278-g227ffcbd

Git user git at public.arvados.org
Thu Feb 13 00:01:04 UTC 2020


Summary of changes:
 src/common/config.ts                               | 24 +++++++++-
 src/components/warning/warning.tsx                 | 11 ++---
 src/models/session.ts                              |  1 +
 src/services/auth-service/auth-service.ts          |  6 ++-
 .../collection-service/collection-service.ts       | 11 ++++-
 .../common-service/common-resource-service.test.ts | 16 +++++++
 .../common-service/common-resource-service.ts      | 22 ++++++++-
 src/services/common-service/common-service.ts      |  4 +-
 .../common-service/trashable-resource-service.ts   |  4 +-
 .../favorite-service/favorite-service.test.ts      |  6 +--
 src/services/favorite-service/favorite-service.ts  |  8 ++--
 src/store/auth/auth-action-session.ts              | 52 +++++++++++++---------
 src/store/auth/auth-action.test.ts                 |  9 +++-
 src/store/collections/collection-copy-actions.ts   |  7 +--
 src/store/collections/collection-update-actions.ts |  9 ++--
 src/store/projects/project-update-actions.ts       | 14 +++---
 src/store/search-bar/search-bar-actions.ts         | 16 ++++---
 .../search-results-middleware-service.ts           | 12 ++---
 .../side-panel-tree/side-panel-tree-actions.ts     |  6 +--
 src/store/tree-picker/tree-picker-actions.ts       |  1 -
 src/store/users/users-actions.ts                   | 23 ++++++++++
 src/validators/validators.tsx                      |  2 +
 .../context-menu/action-sets/user-action-set.ts    | 11 +++--
 .../dialog-forms/setup-shell-account-dialog.tsx    | 19 +++-----
 src/views-components/main-app-bar/help-menu.tsx    |  6 +--
 .../virtual-machine-user-panel.tsx                 | 29 +++++-------
 26 files changed, 208 insertions(+), 121 deletions(-)

       via  227ffcbd2efe8cccd4a9025344b09632630cff14 (commit)
       via  299d867b60f431b0dfa50f42630bca91ae53337d (commit)
       via  f6093a73debdd7135870582088202da459386f17 (commit)
       via  79ba1fb04fca00e440b47d28eb37f2127716343f (commit)
       via  7791be98d3982a01c56c336b6f67db5c4af59ea1 (commit)
       via  ccec2628805e5eab520425aa8489b20ce80acf2b (commit)
       via  6d1f423a0c753f84562aa3efafaaa110062cfdad (commit)
       via  070f84137b216212da7eac806710df5d0c479bba (commit)
       via  a6fff3efaf195a82d9d912fa9ab134a9d9e05c48 (commit)
       via  c7d5dec8425d970c41a81c6328b91665acec1ec0 (commit)
       via  3d93769b1906fd43bade1c053429541877a75cc9 (commit)
       via  e62c661a8de391ae269a0170901c6b0290970620 (commit)
       via  e6cb6f8427302b818aee04375d91abc30385a3e9 (commit)
       via  48be4482ec29aa092c250d77862d8dbd77e70f1b (commit)
       via  920bf74753465ab51a8bfe5462f0e687b8fe2055 (commit)
       via  67d1d0a6ea4e20dd3bb2d1c4e6797cba557398b4 (commit)
      from  41658ace1742a1bc6af651962a6207f7de8ecd92 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 227ffcbd2efe8cccd4a9025344b09632630cff14
Author: Lucas Di Pentima <lucas at di-pentima.com.ar>
Date:   Wed Feb 12 20:59:46 2020 -0300

    15781: Uses 'contains' or 'ilike' on prop searches depending on API revision.
    
    Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas at di-pentima.com.ar>

diff --git a/src/store/search-bar/search-bar-actions.ts b/src/store/search-bar/search-bar-actions.ts
index 4af132ea..794ca8dc 100644
--- a/src/store/search-bar/search-bar-actions.ts
+++ b/src/store/search-bar/search-bar-actions.ts
@@ -212,7 +212,7 @@ const searchGroups = (searchValue: string, limit: number) =>
             const { cluster: clusterId } = getAdvancedDataFromQuery(searchValue);
             const sessions = getSearchSessions(clusterId, getState().auth.sessions);
             const lists: ListResults<GroupContentsResource>[] = await Promise.all(sessions.map(session => {
-                const filters = queryToFilters(searchValue);
+                const filters = queryToFilters(searchValue, session.apiRevision);
                 return services.groupsService.contents('', {
                     filters,
                     limit,
@@ -336,7 +336,7 @@ export const getSearchSessions = (clusterId: string | undefined, sessions: Sessi
     return sessions.filter(s => s.loggedIn && (!clusterId || s.clusterId === clusterId));
 };
 
-export const queryToFilters = (query: string) => {
+export const queryToFilters = (query: string, apiRevision: number) => {
     const data = getAdvancedDataFromQuery(query);
     const filter = new FilterBuilder();
     const resourceKind = data.type;
@@ -359,9 +359,15 @@ export const queryToFilters = (query: string) => {
 
     data.properties.forEach(p => {
         if (p.value) {
-            filter
-                .addContains(`properties.${p.key}`, p.value, GroupContentsResourcePrefix.PROJECT)
-                .addContains(`properties.${p.key}`, p.value, GroupContentsResourcePrefix.COLLECTION);
+            if (apiRevision < 20200212) {
+                filter
+                    .addILike(`properties.${p.key}`, p.value, GroupContentsResourcePrefix.PROJECT)
+                    .addILike(`properties.${p.key}`, p.value, GroupContentsResourcePrefix.COLLECTION);
+            } else {
+                filter
+                    .addContains(`properties.${p.key}`, p.value, GroupContentsResourcePrefix.PROJECT)
+                    .addContains(`properties.${p.key}`, p.value, GroupContentsResourcePrefix.COLLECTION);
+            }
         }
         filter.addExists(p.key);
     });
diff --git a/src/store/search-results-panel/search-results-middleware-service.ts b/src/store/search-results-panel/search-results-middleware-service.ts
index 84e68ab0..f054a4e4 100644
--- a/src/store/search-results-panel/search-results-middleware-service.ts
+++ b/src/store/search-results-panel/search-results-middleware-service.ts
@@ -42,8 +42,6 @@ export class SearchResultsMiddlewareService extends DataExplorerMiddlewareServic
             return;
         }
 
-        const params = getParams(dataExplorer, searchValue);
-
         const initial = {
             itemsAvailable: 0,
             items: [] as GroupContentsResource[],
@@ -56,24 +54,26 @@ export class SearchResultsMiddlewareService extends DataExplorerMiddlewareServic
             api.dispatch(setItems(initial));
         }
 
-        sessions.map(session =>
+        sessions.map(session => {
+            const params = getParams(dataExplorer, searchValue, session.apiRevision);
             this.services.groupsService.contents('', params, session)
                 .then((response) => {
                     api.dispatch(updateResources(response.items));
                     api.dispatch(appendItems(response));
                 }).catch(() => {
                     api.dispatch(couldNotFetchSearchResults(session.clusterId));
-                })
+                });
+            }
         );
     }
 }
 
 const typeFilters = (columns: DataColumns<string>) => serializeResourceTypeFilters(getDataExplorerColumnFilters(columns, ProjectPanelColumnNames.TYPE));
 
-export const getParams = (dataExplorer: DataExplorer, query: string) => ({
+const getParams = (dataExplorer: DataExplorer, query: string, apiRevision: number) => ({
     ...dataExplorerToListParams(dataExplorer),
     filters: joinFilters(
-        queryToFilters(query),
+        queryToFilters(query, apiRevision),
         typeFilters(dataExplorer.columns)
     ),
     order: getOrder(dataExplorer),

commit 299d867b60f431b0dfa50f42630bca91ae53337d
Author: Lucas Di Pentima <lucas at di-pentima.com.ar>
Date:   Wed Feb 12 19:53:20 2020 -0300

    15718: Adds API revision number from discovery doc to sessions.
    
    Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas at di-pentima.com.ar>

diff --git a/src/common/config.ts b/src/common/config.ts
index 23faaf91..58fa13ae 100644
--- a/src/common/config.ts
+++ b/src/common/config.ts
@@ -78,6 +78,7 @@ export class Config {
     fileViewersConfigUrl: string;
     loginCluster: string;
     clusterConfig: ClusterConfigJSON;
+    apiRevision: number;
 }
 
 export const buildConfig = (clusterConfigJSON: ClusterConfigJSON): Config => {
@@ -91,10 +92,21 @@ export const buildConfig = (clusterConfigJSON: ClusterConfigJSON): Config => {
     config.keepWebServiceUrl = clusterConfigJSON.Services.WebDAVDownload.ExternalURL;
     config.loginCluster = clusterConfigJSON.Login.LoginCluster;
     config.clusterConfig = clusterConfigJSON;
+    config.apiRevision = 0;
     mapRemoteHosts(clusterConfigJSON, config);
     return config;
 };
 
+const getApiRevision = async (apiUrl: string) => {
+    try {
+        const dd = (await Axios.get<any>(`${apiUrl}/${DISCOVERY_DOC_PATH}`)).data;
+        return parseInt(dd.revision, 10) || 0;
+    } catch {
+        console.warn("Unable to get API Revision number, defaulting to zero. Some features may not work properly.");
+        return 0;
+    }
+};
+
 export const fetchConfig = () => {
     return Axios
         .get<WorkbenchConfig>(WORKBENCH_CONFIG_URL + "?nocache=" + (new Date()).getTime())
@@ -107,9 +119,10 @@ export const fetchConfig = () => {
             if (workbenchConfig.API_HOST === undefined) {
                 throw new Error(`Unable to start Workbench. API_HOST is undefined in ${WORKBENCH_CONFIG_URL} or the environment.`);
             }
-            return Axios.get<ClusterConfigJSON>(getClusterConfigURL(workbenchConfig.API_HOST)).then(response => {
+            return Axios.get<ClusterConfigJSON>(getClusterConfigURL(workbenchConfig.API_HOST)).then(async response => {
                 const clusterConfigJSON = response.data;
-                const config = buildConfig(clusterConfigJSON);
+                const apiRevision = await getApiRevision(clusterConfigJSON.Services.Controller.ExternalURL);
+                const config = {...buildConfig(clusterConfigJSON), apiRevision};
                 const warnLocalConfig = (varName: string) => console.warn(
                     `A value for ${varName} was found in ${WORKBENCH_CONFIG_URL}. To use the Arvados centralized configuration instead, \
 remove the entire ${varName} entry from ${WORKBENCH_CONFIG_URL}`);
@@ -192,6 +205,7 @@ export const mockConfig = (config: Partial<Config>): Config => ({
     fileViewersConfigUrl: "",
     loginCluster: "",
     clusterConfig: mockClusterConfigJSON({}),
+    apiRevision: 0,
     ...config
 });
 
diff --git a/src/models/session.ts b/src/models/session.ts
index 91a0d997..d388f599 100644
--- a/src/models/session.ts
+++ b/src/models/session.ts
@@ -19,4 +19,5 @@ export interface Session {
     loggedIn: boolean;
     status: SessionStatus;
     active: boolean;
+    apiRevision: number;
 }
diff --git a/src/services/auth-service/auth-service.ts b/src/services/auth-service/auth-service.ts
index c6e93a8f..690420e7 100644
--- a/src/services/auth-service/auth-service.ts
+++ b/src/services/auth-service/auth-service.ts
@@ -135,7 +135,8 @@ export class AuthService {
             loggedIn: true,
             active: true,
             uuid: user ? user.uuid : '',
-            status: SessionStatus.VALIDATED
+            status: SessionStatus.VALIDATED,
+            apiRevision: cfg.apiRevision,
         } as Session;
         const localSessions = this.getSessions().map(s => ({
             ...s,
@@ -155,7 +156,8 @@ export class AuthService {
                 loggedIn: false,
                 active: false,
                 uuid: '',
-                status: SessionStatus.INVALIDATED
+                status: SessionStatus.INVALIDATED,
+                apiRevision: 0,
             } as Session;
         });
         const sessions = [currentSession]
diff --git a/src/store/auth/auth-action-session.ts b/src/store/auth/auth-action-session.ts
index c1b97adc..a6387828 100644
--- a/src/store/auth/auth-action-session.ts
+++ b/src/store/auth/auth-action-session.ts
@@ -21,31 +21,37 @@ import { snackbarActions, SnackbarKind } from "~/store/snackbar/snackbar-actions
 import * as jsSHA from "jssha";
 
 const getClusterConfig = async (origin: string): Promise<Config | null> => {
-    // Try the new public config endpoint
+    let configFromDD: Config | undefined;
     try {
-        const config = (await Axios.get<ClusterConfigJSON>(`${origin}/${CLUSTER_CONFIG_PATH}`)).data;
-        return buildConfig(config);
-    } catch { }
-
-    // Fall back to discovery document
-    try {
-        const config = (await Axios.get<any>(`${origin}/${DISCOVERY_DOC_PATH}`)).data;
-        return {
-            baseUrl: normalizeURLPath(config.baseUrl),
-            keepWebServiceUrl: config.keepWebServiceUrl,
-            remoteHosts: config.remoteHosts,
-            rootUrl: config.rootUrl,
-            uuidPrefix: config.uuidPrefix,
-            websocketUrl: config.websocketUrl,
-            workbenchUrl: config.workbenchUrl,
-            workbench2Url: config.workbench2Url,
+        const dd = (await Axios.get<any>(`${origin}/${DISCOVERY_DOC_PATH}`)).data;
+        configFromDD = {
+            baseUrl: normalizeURLPath(dd.baseUrl),
+            keepWebServiceUrl: dd.keepWebServiceUrl,
+            remoteHosts: dd.remoteHosts,
+            rootUrl: dd.rootUrl,
+            uuidPrefix: dd.uuidPrefix,
+            websocketUrl: dd.websocketUrl,
+            workbenchUrl: dd.workbenchUrl,
+            workbench2Url: dd.workbench2Url,
             loginCluster: "",
             vocabularyUrl: "",
             fileViewersConfigUrl: "",
-            clusterConfig: mockClusterConfigJSON({})
+            clusterConfig: mockClusterConfigJSON({}),
+            apiRevision: parseInt(dd.revision, 10),
         };
     } catch { }
 
+    // Try the new public config endpoint
+    try {
+        const config = (await Axios.get<ClusterConfigJSON>(`${origin}/${CLUSTER_CONFIG_PATH}`)).data;
+        return {...buildConfig(config), apiRevision: configFromDD ? configFromDD.apiRevision : 0};
+    } catch { }
+
+    // Fall back to discovery document
+    if (configFromDD !== undefined) {
+        return configFromDD;
+    }
+
     return null;
 };
 
@@ -120,13 +126,14 @@ export const validateSession = (session: Session, activeSession: Session) =>
         dispatch(authActions.UPDATE_SESSION({ ...session, status: SessionStatus.BEING_VALIDATED }));
         session.loggedIn = false;
 
-        const setupSession = (baseUrl: string, user: User, token: string) => {
+        const setupSession = (baseUrl: string, user: User, token: string, apiRevision: number) => {
             session.baseUrl = baseUrl;
             session.token = token;
             session.email = user.email;
             session.uuid = user.uuid;
             session.name = getUserFullname(user);
             session.loggedIn = true;
+            session.apiRevision = apiRevision;
         };
 
         let fail: Error | null = null;
@@ -135,12 +142,12 @@ export const validateSession = (session: Session, activeSession: Session) =>
             dispatch(authActions.REMOTE_CLUSTER_CONFIG({ config }));
             try {
                 const { user, token } = await validateCluster(config, session.token);
-                setupSession(config.baseUrl, user, token);
+                setupSession(config.baseUrl, user, token, config.apiRevision);
             } catch (e) {
                 fail = new Error(`Getting current user for ${session.remoteHost}: ${e.message}`);
                 try {
                     const { user, token } = await validateCluster(config, activeSession.token);
-                    setupSession(config.baseUrl, user, token);
+                    setupSession(config.baseUrl, user, token, config.apiRevision);
                     fail = null;
                 } catch (e2) {
                     if (e.message === invalidV2Token) {
@@ -227,7 +234,8 @@ export const addSession = (remoteHost: string, token?: string, sendToLogin?: boo
                     baseUrl: config.baseUrl,
                     clusterId: config.uuidPrefix,
                     remoteHost,
-                    token
+                    token,
+                    apiRevision: config.apiRevision,
                 };
 
                 if (sessions.find(s => s.clusterId === config.uuidPrefix)) {
diff --git a/src/store/auth/auth-action.test.ts b/src/store/auth/auth-action.test.ts
index d126d9ca..8a17fe9f 100644
--- a/src/store/auth/auth-action.test.ts
+++ b/src/store/auth/auth-action.test.ts
@@ -67,6 +67,7 @@ describe('auth-actions', () => {
             rootUrl: "https://zzzzz.arvadosapi.com",
             uuidPrefix: "zzzzz",
             remoteHosts: { xc59z: "xc59z.arvadosapi.com" },
+            apiRevision: 12345678,
         };
 
         store.dispatch(initAuth(config));
@@ -82,6 +83,7 @@ describe('auth-actions', () => {
                     expect(auth).toEqual({
                         apiToken: "token",
                         config: {
+                            apiRevision: 12345678,
                             remoteHosts: {
                                 "xc59z": "xc59z.arvadosapi.com",
                             },
@@ -94,6 +96,7 @@ describe('auth-actions', () => {
                         loginCluster: undefined,
                         remoteHostsConfig: {
                             "zzzzz": {
+                                "apiRevision": 12345678,
                                 "remoteHosts": {
                                     "xc59z": "xc59z.arvadosapi.com",
                                 },
@@ -114,8 +117,9 @@ describe('auth-actions', () => {
                             "remoteHost": "https://zzzzz.arvadosapi.com",
                             "status": 2,
                             "token": "token",
-                            "name": "John Doe"
-		    "uuid": "zzzzz-tpzed-abcefg",
+                            "name": "John Doe",
+                            "apiRevision": 12345678,
+                            "uuid": "zzzzz-tpzed-abcefg",
                         }, {
                             "active": false,
                             "baseUrl": "",
@@ -127,6 +131,7 @@ describe('auth-actions', () => {
                             "token": "",
                             "name": "",
                             "uuid": "",
+                            "apiRevision": 0,
                         }],
                         user: {
                             email: "test at test.com",

commit f6093a73debdd7135870582088202da459386f17
Merge: 41658ace 79ba1fb0
Author: Lucas Di Pentima <lucas at di-pentima.com.ar>
Date:   Tue Feb 11 10:54:41 2020 -0300

    15781: Merge branch 'master' into 15781-multi-value-property-edit
    
    Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas at di-pentima.com.ar>


-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list