[arvados] updated: 2.7.0-6511-gf523522e3b

git repository hosting git at public.arvados.org
Mon Apr 22 14:56:00 UTC 2024


Summary of changes:
 .github/workflows/tests.yml                        |   40 +
 .licenseignore                                     |    2 +
 build/build-dev-docker-jobs-image.sh               |    2 +-
 .../package-build-dockerfiles/debian11/Dockerfile  |    4 +-
 build/package-build-dockerfiles/rocky8/Dockerfile  |    4 +-
 .../ubuntu2004/Dockerfile                          |    4 +-
 build/package-testing/rpm-common-test-packages.sh  |    4 +
 .../test-package-python3-arvados-python-client.sh  |    4 +-
 build/pypkg_info.py                                |  124 ++
 build/run-build-packages-one-target.sh             |   12 +-
 build/run-build-packages.sh                        |   22 +-
 build/run-library.sh                               |  240 +--
 build/run-tests.sh                                 |   54 +-
 doc/README.textile                                 |   34 +-
 doc/Rakefile                                       |  209 +-
 doc/_config.yml                                    |   15 +-
 .../_container_runtime_constraints.liquid          |    1 +
 doc/admin/upgrading.html.textile.liquid            |   24 +
 doc/api/dispatch.html.textile.liquid               |   22 +-
 .../methods/container_requests.html.textile.liquid |   20 +
 .../install-dispatch.html.textile.liquid           |   11 +-
 .../install-shell-server.html.textile.liquid       |    2 +-
 doc/pysdk_pdoc.py                                  |   30 +-
 doc/sdk/cli/index.html.textile.liquid              |    2 +-
 doc/sdk/cli/install.html.textile.liquid            |    2 +-
 doc/sdk/cli/reference.html.textile.liquid          |    2 +-
 doc/sdk/cli/subcommands.html.textile.liquid        |    2 +-
 doc/sdk/fuse/install.html.textile.liquid           |   42 +
 doc/sdk/fuse/options.html.textile.liquid           |  193 ++
 doc/sdk/index.html.textile.liquid                  |   15 +-
 doc/sdk/java-v2/example.html.textile.liquid        |    2 +-
 doc/sdk/java-v2/index.html.textile.liquid          |    2 +-
 doc/sdk/java-v2/javadoc.html.textile.liquid        |    2 +-
 doc/sdk/python/arvados-fuse.html.textile.liquid    |   44 -
 doc/sdk/python/cookbook.html.textile.liquid        |    2 +-
 doc/sdk/python/sdk-python.html.textile.liquid      |   10 +-
 .../cwl/crunchstat-summary.html.textile.liquid     |  183 +-
 doc/user/cwl/cwl-run-options.html.textile.liquid   |    3 +-
 doc/user/cwl/images/crunchstat-summary-html.png    |  Bin 132084 -> 142417 bytes
 .../getting_started/setup-cli.html.textile.liquid  |    2 +-
 .../tutorials/wgs-tutorial.html.textile.liquid     |    3 +-
 docker/jobs/Dockerfile                             |    2 +-
 go.mod                                             |   14 +-
 go.sum                                             |   44 +-
 lib/cloud/ec2/ec2.go                               |   16 +-
 lib/cloud/ec2/ec2_test.go                          |   57 +
 lib/config/config.default.yml                      |   96 +-
 lib/controller/federation/conn.go                  |    4 +
 lib/controller/integration_test.go                 |  103 +-
 lib/controller/localdb/container_request.go        |   91 +
 lib/controller/router/router.go                    |    7 +
 lib/controller/rpc/conn.go                         |    7 +
 lib/crunchrun/crunchrun.go                         |   13 +-
 lib/crunchrun/integration_test.go                  |    7 +-
 lib/diagnostics/cmd.go                             |   80 +-
 lib/diagnostics/docker_image_test.go               |   25 +
 lib/dispatchcloud/dispatcher.go                    |   83 +-
 lib/dispatchcloud/dispatcher_test.go               |  126 +-
 lib/dispatchcloud/scheduler/run_queue.go           |   77 +-
 lib/dispatchcloud/scheduler/scheduler.go           |    3 +
 lib/install/deps.go                                |   28 +-
 lib/lsf/dispatch.go                                |   21 +-
 lib/lsf/dispatch_test.go                           |   42 +-
 lib/mount/command.go                               |   30 +-
 lib/mount/fs.go                                    |   73 +-
 lib/mount/fs_test.go                               |    2 +
 sdk/R/install_deps.R                               |    7 +-
 sdk/cwl/arvados_cwl/__init__.py                    |    4 +
 sdk/cwl/arvados_cwl/arvcontainer.py                |   44 +-
 sdk/cwl/arvados_cwl/context.py                     |    2 +
 sdk/cwl/arvados_cwl/executor.py                    |   11 +-
 sdk/cwl/arvados_version.py                         |  159 +-
 sdk/cwl/setup.py                                   |   13 +-
 sdk/cwl/tests/arvados-tests.sh                     |    2 +-
 ...quest_9tee4-xvhdp-kk0ja1cl8b2kr1y-arv-mount.txt |   10 +
 ...uest_9tee4-xvhdp-kk0ja1cl8b2kr1y-crunchstat.txt |   17 +
 sdk/cwl/tests/test_container.py                    |   58 +-
 sdk/dev-jobs.dockerfile                            |    2 +-
 sdk/go/arvados/api.go                              |  180 +-
 sdk/go/arvados/config.go                           |    8 +-
 sdk/go/arvados/container.go                        |    6 +
 sdk/go/arvadostest/api.go                          |    4 +
 sdk/go/keepclient/keepclient.go                    |   37 +-
 sdk/go/keepclient/keepclient_test.go               |  247 ++-
 sdk/go/keepclient/support.go                       |   44 +-
 .../client/api/client/BaseStandardApiClient.java   |    4 +-
 .../client/api/client/CollectionsApiClient.java    |   14 +
 .../client/api/client/KeepWebApiClient.java        |   25 +
 .../client/api/model/CollectionReplaceFiles.java   |   70 +
 .../org/arvados/client/facade/ArvadosFacade.java   |   16 +
 .../arvados/client/logic/keep/FileDownloader.java  |   33 +
 .../api/client/CollectionsApiClientTest.java       |   67 +-
 .../client/api/client/KeepWebApiClientTest.java    |   44 +-
 .../client/logic/keep/FileDownloaderTest.java      |   43 +-
 sdk/python/arvados-v1-discovery.json               |   20 +
 sdk/python/arvados/arvfile.py                      |   43 +-
 sdk/python/arvados/commands/_util.py               |   99 +-
 sdk/python/arvados/diskcache.py                    |  129 +-
 sdk/python/arvados/events.py                       |    2 +-
 sdk/python/arvados/http_to_keep.py                 |   23 +-
 sdk/python/arvados/keep.py                         |   90 +-
 sdk/python/arvados_version.py                      |  158 +-
 sdk/python/setup.py                                |   13 +-
 sdk/python/tests/test_arvfile.py                   |   57 +-
 sdk/python/tests/test_cmd_util.py                  |  194 ++
 sdk/python/tests/test_keep_client.py               |  182 +-
 sdk/python/tests/test_storage_classes.py           |  128 ++
 services/api/Gemfile.lock                          |  136 +-
 .../arvados/v1/container_requests_controller.rb    |   16 +
 .../api/app/models/api_client_authorization.rb     |   17 +-
 services/api/app/models/container_request.rb       |    5 +-
 services/api/config/routes.rb                      |    4 +-
 services/api/test/fixtures/collections.yml         |   45 +
 services/api/test/fixtures/groups.yml              |   11 +
 services/api/test/integration/remote_user_test.rb  |   71 +-
 services/dockercleaner/arvados_version.py          |  160 +-
 services/dockercleaner/setup.py                    |   13 +-
 services/fuse/arvados_fuse/__init__.py             |  555 ++++--
 services/fuse/arvados_fuse/command.py              |  453 ++++-
 services/fuse/arvados_fuse/fresh.py                |   15 +-
 services/fuse/arvados_fuse/fusedir.py              |  471 +++--
 services/fuse/arvados_fuse/fusefile.py             |   13 +
 services/fuse/arvados_version.py                   |  161 +-
 services/fuse/setup.py                             |   21 +-
 services/fuse/tests/integration_test.py            |    2 +-
 services/fuse/tests/mount_test_base.py             |   23 +-
 services/fuse/tests/test_inodes.py                 |   37 +-
 services/fuse/tests/test_mount.py                  |   14 +-
 services/fuse/tests/test_mount_filters.py          |  223 +++
 services/fuse/tests/test_unmount.py                |    4 +-
 services/keep-balance/change_set.go                |   19 +-
 services/keep-balance/change_set_test.go           |    4 +-
 services/keep-web/handler.go                       |    5 +-
 services/keep-web/handler_test.go                  |    1 +
 services/keep-web/main.go                          |    1 +
 services/keep-web/metrics.go                       |  155 ++
 services/keep-web/s3_test.go                       |    6 +-
 services/keep-web/server_test.go                   |   36 +-
 services/keepproxy/keepproxy_test.go               |    4 +-
 services/keepstore/azure_blob_volume.go            |  271 +--
 services/keepstore/azure_blob_volume_test.go       |  190 +-
 services/keepstore/bufferpool.go                   |   70 +-
 services/keepstore/bufferpool_test.go              |   45 +-
 services/keepstore/collision.go                    |  100 -
 services/keepstore/collision_test.go               |   51 -
 services/keepstore/command.go                      |  196 +-
 services/keepstore/command_test.go                 |    2 +-
 services/keepstore/count.go                        |    6 +-
 services/keepstore/gocheck_test.go                 |   14 -
 services/keepstore/handler_test.go                 | 1405 --------------
 services/keepstore/handlers.go                     | 1056 ----------
 services/keepstore/hashcheckwriter.go              |   68 +
 services/keepstore/keepstore.go                    |  778 +++++++-
 services/keepstore/keepstore_test.go               |  892 +++++++++
 services/keepstore/metrics.go                      |   57 -
 services/keepstore/metrics_test.go                 |   87 +
 services/keepstore/mock_mutex_for_test.go          |   27 -
 services/keepstore/mounts_test.go                  |  175 +-
 services/keepstore/perms.go                        |   33 -
 services/keepstore/perms_test.go                   |   63 -
 services/keepstore/pipe_adapters.go                |   93 -
 services/keepstore/proxy_remote.go                 |  212 --
 services/keepstore/proxy_remote_test.go            |   52 +-
 services/keepstore/pull_worker.go                  |  206 +-
 services/keepstore/pull_worker_integration_test.go |  118 --
 services/keepstore/pull_worker_test.go             |  393 ++--
 services/keepstore/putprogress.go                  |  101 +
 services/keepstore/router.go                       |  276 +++
 services/keepstore/router_test.go                  |  517 +++++
 .../keepstore/{s3aws_volume.go => s3_volume.go}    |  309 ++-
 .../{s3aws_volume_test.go => s3_volume_test.go}    |  181 +-
 services/keepstore/status_test.go                  |   25 -
 services/keepstore/streamwriterat.go               |  160 ++
 services/keepstore/streamwriterat_test.go          |   83 +
 services/keepstore/trash_worker.go                 |  209 +-
 services/keepstore/trash_worker_test.go            |  509 ++---
 services/keepstore/unix_volume.go                  |  269 +--
 services/keepstore/unix_volume_test.go             |  362 +---
 services/keepstore/volume.go                       |  461 +----
 services/keepstore/volume_generic_test.go          |  630 +++---
 services/keepstore/volume_test.go                  |  258 +--
 services/keepstore/work_queue.go                   |  208 --
 services/keepstore/work_queue_test.go              |  244 ---
 services/workbench2/Makefile                       |   24 +-
 services/workbench2/README.md                      |    3 +-
 services/workbench2/cypress.config.ts              |   25 +
 services/workbench2/cypress.json                   |    8 -
 .../workbench2/cypress/e2e/banner-tooltip.cy.js    |  112 ++
 .../collection.spec.js => e2e/collection.cy.js}    |   32 +-
 .../create-workflow.cy.js}                         |    5 -
 .../delete-multiple-files.cy.js}                   |    5 -
 .../{integration => e2e}/details-card.spec.js      |    0
 .../favorites.spec.js => e2e/favorites.cy.js}      |    5 -
 .../group-manage.cy.js}                            |   10 +-
 .../{integration/login.spec.js => e2e/login.cy.js} |    5 -
 .../multiselect-toolbar.cy.js}                     |    5 -
 .../page-not-found.cy.js}                          |   18 +-
 .../process.spec.js => e2e/process.cy.js}          |  165 +-
 .../project.spec.js => e2e/project.cy.js}          |   51 +-
 .../search.spec.js => e2e/search.cy.js}            |   23 +-
 .../sharing.spec.js => e2e/sharing.cy.js}          |   19 +-
 .../side-panel.spec.js => e2e/side-panel.cy.js}    |    5 -
 .../user-profile.cy.js}                            |   18 +-
 .../virtual-machine-admin.cy.js}                   |    0
 .../workflow.spec.js => e2e/workflow.cy.js}        |   12 +-
 .../cypress/integration/banner-tooltip.spec.js     |  115 --
 services/workbench2/cypress/support/commands.js    |   16 +-
 .../cypress/support/{index.js => e2e.js}           |    0
 services/workbench2/docker/Dockerfile              |   12 +-
 services/workbench2/package.json                   |   13 +-
 services/workbench2/src/common/link-update-name.ts |   74 +
 .../src/components/breadcrumbs/breadcrumbs.tsx     |    2 +-
 .../src/components/code-snippet/code-snippet.tsx   |   32 +-
 .../code-snippet/virtual-code-snippet.tsx          |   76 +
 .../collection-panel-files.tsx                     |    2 +-
 .../copy-to-clipboard-snackbar.tsx                 |    2 +-
 .../copy-to-clipboard/copy-result-to-clipboard.ts  |   63 +
 .../src/components/data-explorer/data-explorer.tsx |   57 +-
 .../src/components/data-table/data-table.test.tsx  |   10 +-
 .../src/components/data-table/data-table.tsx       |   69 +-
 .../default-virtual-code-snippet.tsx               |   31 +
 .../src/components/default-view/default-view.tsx   |    1 +
 .../details-attribute/details-attribute.tsx        |    2 +-
 services/workbench2/src/components/icon/icon.tsx   |    9 +
 .../src/components/loading/inline-pulser.tsx       |   30 +
 .../multi-panel-view/multi-panel-view.tsx          |   52 +-
 .../multiselect-toolbar/MultiselectToolbar.tsx     |  135 +-
 .../ms-toolbar-action-filters.ts                   |   52 +-
 .../ms-toolbar-overflow-menu.tsx                   |    4 +-
 .../ms-toolbar-overflow-wrapper.tsx                |    2 +-
 .../subprocess-progress-bar.tsx                    |   39 +-
 services/workbench2/src/components/tree/tree.tsx   |    2 +-
 services/workbench2/src/index.tsx                  |    3 +-
 services/workbench2/src/models/group.ts            |    2 +
 .../collection-service/collection-service.ts       |   13 +-
 services/workbench2/src/services/services.ts       |    5 +-
 .../all-processes-panel-middleware-service.ts      |   96 +-
 .../src/store/breadcrumbs/breadcrumbs-actions.ts   |   15 +-
 .../store/collections/collection-update-actions.ts |    2 +
 .../context-menu/context-menu-actions.test.ts      |    2 +-
 .../src/store/context-menu/context-menu-actions.ts |    2 +-
 .../store/data-explorer/data-explorer-action.ts    |    4 +
 .../store/data-explorer/data-explorer-reducer.ts   |    5 +
 .../favorite-panel-middleware-service.ts           |    4 +-
 .../src/store/favorites/favorites-actions.ts       |    6 +-
 ...etails-panel-members-middleware-service.test.js |   28 +
 ...oup-details-panel-members-middleware-service.ts |   25 +-
 ...ls-panel-permissions-middleware-service.test.js |   28 +
 ...details-panel-permissions-middleware-service.ts |   25 +-
 .../groups-panel-middleware-service.test.ts        |  160 ++
 .../groups-panel-middleware-service.ts             |   39 +-
 .../src/store/navigation/navigation-action.ts      |    1 -
 .../open-in-new-tab/open-in-new-tab.actions.ts     |    6 +-
 .../store/process-panel/process-panel-actions.ts   |   33 +-
 .../store/process-panel/process-panel-reducer.ts   |    4 +
 .../src/store/process-panel/process-panel.ts       |    6 +
 .../processes/processes-middleware-service.ts      |   95 +
 .../project-panel-middleware-service.ts            |    8 +-
 .../src/store/projects/project-lock-actions.ts     |   10 +-
 .../public-favorites/public-favorites-actions.ts   |    6 +-
 .../src/store/search-bar/search-bar-actions.ts     |    2 +-
 .../src/store/search-bar/search-bar-reducer.ts     |    2 +-
 .../search-results-middleware-service.ts           |   25 +-
 .../side-panel-tree/side-panel-tree-actions.ts     |   86 +-
 services/workbench2/src/store/store.ts             |    4 +
 .../subprocess-panel-middleware-service.ts         |  107 +-
 .../trash-panel/trash-panel-middleware-service.ts  |    4 +-
 .../workbench2/src/store/trash/trash-actions.ts    |    6 +-
 .../src/store/workbench/workbench-actions.ts       |    9 +-
 .../workflow-panel/workflow-middleware-service.ts  |   28 +
 .../store/workflow-panel/workflow-panel-actions.ts |    8 +-
 .../collection-panel-files.ts                      |    2 +-
 .../api-client-authorization-action-set.ts         |    8 +-
 .../action-sets/collection-action-set.ts           |   28 +-
 .../action-sets/collection-files-action-set.ts     |   20 +-
 .../collection-files-item-action-set.ts            |   17 +-
 .../collection-files-not-selected-action-set.ts    |    4 +-
 .../action-sets/favorite-action-set.ts             |    3 +-
 .../context-menu/action-sets/group-action-set.ts   |   10 +-
 .../action-sets/group-member-action-set.ts         |    8 +-
 .../action-sets/keep-service-action-set.ts         |    8 +-
 .../context-menu/action-sets/link-action-set.ts    |    8 +-
 .../action-sets/permission-edit-action-set.ts      |    8 +-
 .../action-sets/process-resource-action-set.ts     |   47 +-
 .../context-menu/action-sets/project-action-set.ts |   26 +-
 .../action-sets/project-admin-action-set.ts        |    4 +-
 .../action-sets/repository-action-set.ts           |   10 +-
 .../action-sets/resource-action-set.ts             |    3 +-
 .../action-sets/root-project-action-set.ts         |    6 +-
 .../action-sets/search-results-action-set.ts       |   10 +-
 .../context-menu/action-sets/ssh-key-action-set.ts |    8 +-
 .../context-menu/action-sets/trash-action-set.ts   |    3 +-
 .../action-sets/trashed-collection-action-set.ts   |   10 +-
 .../context-menu/action-sets/user-action-set.ts    |   18 +-
 .../action-sets/virtual-machine-action-set.ts      |    8 +-
 .../action-sets/workflow-action-set.ts             |   14 +-
 .../collection-copy-to-clipboard-action.tsx        |    2 +-
 .../actions/collection-file-viewer-action.test.tsx |    2 +-
 .../actions/collection-file-viewer-action.tsx      |    2 +-
 .../context-menu/actions/context-menu-divider.tsx  |   45 +
 .../actions/copy-to-clipboard-action.tsx           |    2 +-
 .../actions/download-collection-file-action.tsx    |    2 +-
 .../context-menu/actions/file-viewer-action.tsx    |    2 +-
 .../context-menu/actions/file-viewer-actions.tsx   |    1 +
 .../context-menu/context-menu-action-set.ts        |   56 +
 .../views-components/context-menu/context-menu.tsx |   55 +-
 .../context-menu/menu-item-sort.ts                 |  184 ++
 .../data-explorer/data-explorer.tsx                |   12 +-
 .../data-explorer/renderers.test.tsx               |   94 +-
 .../views-components/data-explorer/renderers.tsx   |   37 +-
 .../src/views-components/login-form/login-form.tsx |    3 +-
 .../main-app-bar/notifications-menu.tsx            |    6 +-
 .../ms-collection-action-set.ts                    |   33 +-
 .../multiselect-toolbar/ms-menu-actions.ts         |   50 +-
 .../multiselect-toolbar/ms-process-action-set.ts   |   44 +-
 .../multiselect-toolbar/ms-project-action-set.ts   |   41 +-
 .../ms-user-details-action-set.ts                  |    9 +-
 .../multiselect-toolbar/ms-workflow-action-set.ts  |   24 +-
 .../repositories-sample-git-dialog.tsx             |    2 +-
 .../sharing-dialog/permission-select.tsx           |    1 +
 .../sharing-dialog/sharing-dialog-component.tsx    |   25 +-
 .../sharing-invitation-form-component.tsx          |   36 +-
 .../sharing-dialog/sharing-invitation-form.tsx     |    1 -
 .../sharing-management-form-component.tsx          |   15 +-
 .../sharing-public-access-form-component.tsx       |    4 +-
 .../sharing-dialog/sharing-urls-component.tsx      |    4 +-
 .../sharing-dialog/visibility-level-select.tsx     |    1 -
 .../token-dialog/token-dialog.test.tsx             |    2 +-
 .../views-components/token-dialog/token-dialog.tsx |   11 +-
 .../views-components/tree-picker/tree-picker.ts    |    2 +-
 .../src/views/groups-panel/groups-panel.tsx        |   27 +-
 .../src/views/login-panel/login-panel.tsx          |   10 +-
 .../src/views/process-panel/process-cmd-card.tsx   |   50 +-
 .../views/process-panel/process-io-card.test.tsx   |   11 +-
 .../src/views/process-panel/process-io-card.tsx    |  423 ++--
 .../src/views/process-panel/process-log-card.tsx   |    2 +-
 .../process-panel/process-log-code-snippet.tsx     |   57 +-
 .../process-output-collection-files.ts             |    2 +-
 .../src/views/process-panel/process-panel-root.tsx |    4 +
 .../src/views/process-panel/process-panel.tsx      |    9 +-
 .../views/process-panel/process-resource-card.tsx  |   10 +-
 .../src/views/project-panel/project-panel.tsx      |   34 +-
 .../src/views/ssh-key-panel/ssh-key-panel-root.tsx |   14 +-
 .../src/views/trash-panel/trash-panel.tsx          |    2 +-
 .../virtual-machine-user-panel.tsx                 |   18 +-
 .../workflow-panel/registered-workflow-panel.tsx   |   24 +-
 .../workflow-processes-panel-root.tsx              |  126 ++
 .../workflow-panel/workflow-processes-panel.tsx    |   36 +
 services/workbench2/yarn.lock                      | 2022 ++++++++++++--------
 .../lib/arvbox/docker/service/sdk/run-service      |    2 +-
 tools/compute-images/scripts/base.sh               |    2 +-
 ...nsure-encrypted-partitions-aws-ebs-autoscale.sh |    2 +-
 tools/crunchstat-summary/arvados_version.py        |  161 +-
 .../crunchstat_summary/command.py                  |   19 +-
 .../crunchstat_summary/dygraphs.js                 |   17 +-
 .../crunchstat_summary/reader.py                   |   43 +-
 .../crunchstat_summary/summarizer.py               |  589 +++---
 .../crunchstat_summary/webchart.py                 |   78 +-
 tools/crunchstat-summary/setup.py                  |   19 +-
 ...ainer_9tee4-dz642-lymtndkpy39eibk.txt.gz.report |   17 +-
 ...4-xvhdp-kk0ja1cl8b2kr1y-arv-mount.txt.gz.report |   13 +-
 ...-xvhdp-kk0ja1cl8b2kr1y-crunchstat.txt.gz.report |   15 +-
 ...quest_9tee4-xvhdp-kk0ja1cl8b2kr1y.txt.gz.report |   17 +-
 .../tests/crunchstat_error_messages.txt            |    6 +-
 .../tests/logfile_20151204190335.txt.gz            |  Bin 3682 -> 0 bytes
 .../tests/logfile_20151204190335.txt.gz.report     |   35 -
 .../tests/logfile_20151210063411.txt.gz            |  Bin 3101 -> 0 bytes
 .../tests/logfile_20151210063411.txt.gz.report     |   24 -
 .../tests/logfile_20151210063439.txt.gz            |  Bin 3103 -> 0 bytes
 .../tests/logfile_20151210063439.txt.gz.report     |   24 -
 tools/crunchstat-summary/tests/test_examples.py    |  193 +-
 tools/keep-block-check/keep-block-check_test.go    |    7 +-
 tools/keep-rsync/keep-rsync_test.go                |    4 +-
 .../multi_host/aws/states/workbench1_uninstall.sls |   12 +
 .../states/workbench1_uninstall.sls                |   12 +
 .../states/workbench1_uninstall.sls                |   12 +
 tools/salt-install/provision.sh                    |    5 +
 tools/salt-install/terraform/aws/services/main.tf  |    5 +-
 tools/user-activity/arvados_version.py             |  161 +-
 tools/user-activity/setup.py                       |    8 +-
 380 files changed, 15033 insertions(+), 11735 deletions(-)
 create mode 100644 .github/workflows/tests.yml
 create mode 100644 build/pypkg_info.py
 create mode 100644 doc/sdk/fuse/install.html.textile.liquid
 create mode 100644 doc/sdk/fuse/options.html.textile.liquid
 delete mode 100644 doc/sdk/python/arvados-fuse.html.textile.liquid
 create mode 100644 lib/diagnostics/docker_image_test.go
 create mode 100644 sdk/cwl/tests/container_request_9tee4-xvhdp-kk0ja1cl8b2kr1y-arv-mount.txt
 create mode 100644 sdk/cwl/tests/container_request_9tee4-xvhdp-kk0ja1cl8b2kr1y-crunchstat.txt
 create mode 100644 sdk/java-v2/src/main/java/org/arvados/client/api/model/CollectionReplaceFiles.java
 create mode 100644 sdk/python/tests/test_cmd_util.py
 create mode 100644 sdk/python/tests/test_storage_classes.py
 create mode 100644 services/fuse/tests/test_mount_filters.py
 create mode 100644 services/keep-web/metrics.go
 delete mode 100644 services/keepstore/collision.go
 delete mode 100644 services/keepstore/collision_test.go
 delete mode 100644 services/keepstore/gocheck_test.go
 delete mode 100644 services/keepstore/handler_test.go
 delete mode 100644 services/keepstore/handlers.go
 create mode 100644 services/keepstore/hashcheckwriter.go
 create mode 100644 services/keepstore/keepstore_test.go
 create mode 100644 services/keepstore/metrics_test.go
 delete mode 100644 services/keepstore/mock_mutex_for_test.go
 delete mode 100644 services/keepstore/perms.go
 delete mode 100644 services/keepstore/perms_test.go
 delete mode 100644 services/keepstore/pipe_adapters.go
 delete mode 100644 services/keepstore/proxy_remote.go
 delete mode 100644 services/keepstore/pull_worker_integration_test.go
 create mode 100644 services/keepstore/putprogress.go
 create mode 100644 services/keepstore/router.go
 create mode 100644 services/keepstore/router_test.go
 rename services/keepstore/{s3aws_volume.go => s3_volume.go} (75%)
 rename services/keepstore/{s3aws_volume_test.go => s3_volume_test.go} (77%)
 delete mode 100644 services/keepstore/status_test.go
 create mode 100644 services/keepstore/streamwriterat.go
 create mode 100644 services/keepstore/streamwriterat_test.go
 delete mode 100644 services/keepstore/work_queue.go
 delete mode 100644 services/keepstore/work_queue_test.go
 create mode 100644 services/workbench2/cypress.config.ts
 delete mode 100644 services/workbench2/cypress.json
 create mode 100644 services/workbench2/cypress/e2e/banner-tooltip.cy.js
 rename services/workbench2/cypress/{integration/collection.spec.js => e2e/collection.cy.js} (99%)
 rename services/workbench2/cypress/{integration/create-workflow.spec.js => e2e/create-workflow.cy.js} (99%)
 rename services/workbench2/cypress/{integration/delete-multiple-files.spec.js => e2e/delete-multiple-files.cy.js} (97%)
 rename services/workbench2/cypress/{integration => e2e}/details-card.spec.js (100%)
 rename services/workbench2/cypress/{integration/favorites.spec.js => e2e/favorites.cy.js} (99%)
 rename services/workbench2/cypress/{integration/group-manage.spec.js => e2e/group-manage.cy.js} (98%)
 rename services/workbench2/cypress/{integration/login.spec.js => e2e/login.cy.js} (98%)
 rename services/workbench2/cypress/{integration/multiselect-toolbar.spec.js => e2e/multiselect-toolbar.cy.js} (91%)
 rename services/workbench2/cypress/{integration/page-not-found.spec.js => e2e/page-not-found.cy.js} (87%)
 rename services/workbench2/cypress/{integration/process.spec.js => e2e/process.cy.js} (91%)
 rename services/workbench2/cypress/{integration/project.spec.js => e2e/project.cy.js} (96%)
 rename services/workbench2/cypress/{integration/search.spec.js => e2e/search.cy.js} (95%)
 rename services/workbench2/cypress/{integration/sharing.spec.js => e2e/sharing.cy.js} (94%)
 rename services/workbench2/cypress/{integration/side-panel.spec.js => e2e/side-panel.cy.js} (98%)
 rename services/workbench2/cypress/{integration/user-profile.spec.js => e2e/user-profile.cy.js} (97%)
 rename services/workbench2/cypress/{integration/virtual-machine-admin.spec.js => e2e/virtual-machine-admin.cy.js} (100%)
 rename services/workbench2/cypress/{integration/workflow.spec.js => e2e/workflow.cy.js} (99%)
 delete mode 100644 services/workbench2/cypress/integration/banner-tooltip.spec.js
 rename services/workbench2/cypress/support/{index.js => e2e.js} (100%)
 create mode 100644 services/workbench2/src/common/link-update-name.ts
 create mode 100644 services/workbench2/src/components/code-snippet/virtual-code-snippet.tsx
 create mode 100644 services/workbench2/src/components/copy-to-clipboard/copy-result-to-clipboard.ts
 create mode 100644 services/workbench2/src/components/default-code-snippet/default-virtual-code-snippet.tsx
 create mode 100644 services/workbench2/src/components/loading/inline-pulser.tsx
 create mode 100644 services/workbench2/src/store/group-details-panel/group-details-panel-members-middleware-service.test.js
 create mode 100644 services/workbench2/src/store/group-details-panel/group-details-panel-permissions-middleware-service.test.js
 create mode 100644 services/workbench2/src/store/groups-panel/groups-panel-middleware-service.test.ts
 create mode 100644 services/workbench2/src/store/processes/processes-middleware-service.ts
 create mode 100644 services/workbench2/src/views-components/context-menu/actions/context-menu-divider.tsx
 create mode 100644 services/workbench2/src/views-components/context-menu/menu-item-sort.ts
 create mode 100644 services/workbench2/src/views/workflow-panel/workflow-processes-panel-root.tsx
 create mode 100644 services/workbench2/src/views/workflow-panel/workflow-processes-panel.tsx
 delete mode 100644 tools/crunchstat-summary/tests/logfile_20151204190335.txt.gz
 delete mode 100644 tools/crunchstat-summary/tests/logfile_20151204190335.txt.gz.report
 delete mode 100644 tools/crunchstat-summary/tests/logfile_20151210063411.txt.gz
 delete mode 100644 tools/crunchstat-summary/tests/logfile_20151210063411.txt.gz.report
 delete mode 100644 tools/crunchstat-summary/tests/logfile_20151210063439.txt.gz
 delete mode 100644 tools/crunchstat-summary/tests/logfile_20151210063439.txt.gz.report
 create mode 100644 tools/salt-install/config_examples/multi_host/aws/states/workbench1_uninstall.sls
 create mode 100644 tools/salt-install/config_examples/single_host/multiple_hostnames/states/workbench1_uninstall.sls
 create mode 100644 tools/salt-install/config_examples/single_host/single_hostname/states/workbench1_uninstall.sls

       via  f523522e3b9024b706da52bcddbce42a58c56296 (commit)
       via  562687ce72e709d485aa47773117a51a764a6606 (commit)
       via  52d652233f981839e4a8cfe25fadf985adda82ee (commit)
       via  7428f6339bb59f97d9ec7e139b757c1a4b962ce7 (commit)
       via  d35808f8df98545d42b692e25343636a86de4a57 (commit)
       via  5384f78c59c99c76d6aa892b129257c8b7361694 (commit)
       via  65ab2ff511ac6478bc11a4398abab5861e2cc4d7 (commit)
       via  ea697fb1e8482e77f505596370023763f427506f (commit)
       via  d80b4ca38f845525927bfe192eed37573d635c1a (commit)
       via  aea34fe6d98be7e5084aad6d9e51c8730ecf8d79 (commit)
       via  b85a809c724815c2a24f740bcb0e0d3f0bdeb761 (commit)
       via  3de055c028a3e761de60d955f450b06ccee21380 (commit)
       via  f03a846bbc12694af40944855196b2136660b843 (commit)
       via  d6225ffd9c44b5e8b7e4d6f6c78201ecb7056480 (commit)
       via  0f2720f0aa2bc8399fdea5a647584bd90aca7547 (commit)
       via  3e483c4428580bf9860c76d1676b03f63d5143dc (commit)
       via  404f868129e22cd627d350d61f74806f5b31a8ad (commit)
       via  3afc1cd214cb3f53ec36b3d5b4c80bc5989093a0 (commit)
       via  8b75bf68865cbee66f49591e1351fa00fac8e1bf (commit)
       via  672bc32dc2d687e45e50800a431cd4d9a115c168 (commit)
       via  efc7e2a46e0a82bf9d1af0761f2970076c6f1203 (commit)
       via  43c64a7a9af20e0690e01b4e2484fa7196c66973 (commit)
       via  a65af8010388549eac616bde8224368ab944ff6b (commit)
       via  495ee6b835dea5f053cf95bef2dc9d61d0324774 (commit)
       via  4fba0ca2cd49fca1606277a5329caadffd849f1e (commit)
       via  5a5c399ed4196dcae9a694ac63d94334cac790aa (commit)
       via  5bf94d55b564bfbd052a61ab8219aa063b2a80c6 (commit)
       via  4a1e25b2df1817cb3bfa153076efd1a98ed802ff (commit)
       via  91567eb5eed5ae55e941c581697b4ddd53ddacec (commit)
       via  ccf8e339aa90742cc9e45e35baa6825695fc90ca (commit)
       via  4810be1bcc6363d39bca310800ccdab06211f057 (commit)
       via  3ec75a5a85dc871a5f1007c1eb5e7a6f9fd10235 (commit)
       via  23c01a7c048315d34c7a8c25eb34d9ed06a973e3 (commit)
       via  387d86217ab0f119285c12735a6d0f3e606c23a1 (commit)
       via  b5da8e816bfb9790fc37965311a9dcb0f169ea79 (commit)
       via  36995896541981402a27483571bfae32fec7cc1a (commit)
       via  0809ee6545e7b209130591b7b1d6461fcc397148 (commit)
       via  1e29fff559f47972c7f65ca1f6390661176296fe (commit)
       via  716f55edbae8b8a16e2479e1f0e75619567df051 (commit)
       via  287fdb5c5bc99d749dcc85d7fb756b39c5cc2ee3 (commit)
       via  95c835b12a32a5fa6dc94799d6fea16e5b20080c (commit)
       via  efe40af06f1576412b7bcf47d059bfa8c10e81d7 (commit)
       via  7997c58155e51f10d8243fe66587468f9ee3a563 (commit)
       via  3eed3a289173f679098df98f6f1ee0ff86f533cf (commit)
       via  eee1ae96a3b7a645121a69998271f7d1adf21dd4 (commit)
       via  9542ef840c95bcde07eed8d41b9649c6032d8d6d (commit)
       via  d863a42b75aa0855701c36d825372e1c338eaac5 (commit)
       via  766d6fbd23a1bf526b55b10ffe26404f4827010d (commit)
       via  6e1da3c3cb2a28b4eb107dcb8ca873d03955ec59 (commit)
       via  4d3508cefb40ad5b53af22d8f3dda13593b598d2 (commit)
       via  7ed04fa92d597734b8c33681f18ec1020b568840 (commit)
       via  f674f8883fc075170a20ef592a2609e4f521f7b2 (commit)
       via  942be3e7fc2d79e76047710d8705fa6584ca3117 (commit)
       via  4ca460797b3b2c80141524b34399171749b4d482 (commit)
       via  9f2e8304caea45f8e7a603a0e4019fd5845f4264 (commit)
       via  31f0010ed0833ff91600cd8ce31d4df1847882cc (commit)
       via  9b12bf802a73c654f7106c5405103448a30078dd (commit)
       via  4d892bd66c5d11d8cbde42348099e92da0c21a99 (commit)
       via  9a72938d7fa4786aed241f619476490570933f15 (commit)
       via  e0481ba5073bd1f30d092aeee1a06ef3c635a93b (commit)
       via  0a39d337a1c58d7cbdd51b2f852b84eebc1c68ef (commit)
       via  015668c71b0d0a88fefab6783d3199472df95eb2 (commit)
       via  ff1759078071c52b857afdbe64713ebf0833fae4 (commit)
       via  2bbea832f0a7a16e70b85b2e2ad9ca4637a80118 (commit)
       via  3832c780144d8491403582d9d1142c150fde6d1f (commit)
       via  1f54a6762575e1ff8da9861277dd8e44a7e87caf (commit)
       via  14088c5bd88ede15698ba8f5b8efbf08e18374ce (commit)
       via  a9a011ed1f1daec47a9bc306f13ff91a63954e42 (commit)
       via  7966e5fbed9f19c01e8de2c5ca9da08c4ec79775 (commit)
       via  eff916e6bbdb8e3c0fae34179fcbb3294853f53f (commit)
       via  6e15f1dab1b2c81996929f787a3515909b3293c0 (commit)
       via  44c8f9ed561513b607d3eca752ad3e1efd376f56 (commit)
       via  1476fbd67813d5fbead1ad614f5317db9bd0e0bb (commit)
       via  e54662c069d72c7a22f89bd889370703790d2536 (commit)
       via  75244c16116d53c5f96b8b71b6b60b249aadba89 (commit)
       via  d7cf4c1ec30c7f90f38a9f34c14547c94c081b59 (commit)
       via  c233377306fee0a3e3e860b0b924be7c51078285 (commit)
       via  f9378d4015246bab78305a2f117e144248acfbb4 (commit)
       via  ec67d31d1c519c4b1b624f6df0534d27f39f3ed9 (commit)
       via  b4205dda0bf1a7e00b35e8a92bc433f6b2fd2b71 (commit)
       via  8090c845fea8d9532be5c4347f06dcf9fa7c868c (commit)
       via  9d07096105edd0ff289d97cb9951b9ee40dba7d8 (commit)
       via  08f8ec2186df6d3111fdd274e71d9e12742f5e9d (commit)
       via  db302194cfe02e27bb8d476f68831009ef2aa76d (commit)
       via  6e82c6703a8caabcf5ed96b7bd0338e60a2b6619 (commit)
       via  7e67490b7e0808b8838a1823c90565ae162b200b (commit)
       via  0682477f00b9aa7b3b4e27f331de7f3a07b2dabb (commit)
       via  8f519cc734ecd69df86dffff02f460addfa0c6e7 (commit)
       via  d9d824fb6d36cc8887e68751cc8813a8b810ba9f (commit)
       via  74b95d1f2b982c0e33bceda9c5f6e06af0a3919c (commit)
       via  e7c1d657a3f6b84dc1e2fa82883d7368c3859011 (commit)
       via  cb2ffbec735d31a376157e79ad4eaf54798e74e4 (commit)
       via  e792b65d396b15b2c6c90ab2ab70d19c81f98460 (commit)
       via  2a0299c0a203a14d3ac95d5afeb9ded6475e0f9e (commit)
       via  3a7e0c1b7de023461f90d41a1878ec43c3d187a9 (commit)
       via  648b0db5d0fedc67206c08625bfb42511b4ee23b (commit)
       via  5b15b2571f4ace6074ba30cee2195a616d196d97 (commit)
       via  039f78f18f488844fa653038189ace482c3b52f6 (commit)
       via  62e557a3314a607b5701db7e64f7609a5af00adc (commit)
       via  befe9d43c1aae5d16708eac82a7493637439fcb8 (commit)
       via  b4a2c4b4767a76a6e2f3bf85e544e670a5de6e2f (commit)
       via  62c3ba8319265118432f33ea98df116253b3e785 (commit)
       via  593917ad86ce138fd4735628a3437a920130b691 (commit)
       via  2ac122244af90c2c85ab289a5ca807b954b00294 (commit)
       via  9c1b519f2ad5382d9472d755c05b109dab92d610 (commit)
       via  a15ba265e59898fb59fa85fac01c0a9efc4d064f (commit)
       via  4637d2c632e4d6c1a759f5a1aa8ac5195e1c362c (commit)
       via  12c4579e867d6dd4d7a931b2adb9c7119e12214a (commit)
       via  10564bc0d78545b71a5815c3332403f2e8a0d562 (commit)
       via  d190ac273c87a28ab270b460a1bbfd1898b4e5a7 (commit)
       via  8215e5931aeed29d82e94b5129a685e0b2f084c3 (commit)
       via  1f8dc0fa14b8095203638f27d36d548c8568152b (commit)
       via  807876d53b4bc86fd78e3c1183a42ed317cb835d (commit)
       via  6886f23ec69c0baf38e91e8ea0038c4f581eee06 (commit)
       via  623a3a3e8309f5e5045359fbf891e9a690a9dfc7 (commit)
       via  561e80264b0a9df86f5ce1e1a5a388bb53d11bc6 (commit)
       via  bd04725444b7ab15ea81647c519a580ca50a94de (commit)
       via  743b9941ce35d8877365742700c9b4c1eded0968 (commit)
       via  b91d06bf3ede4b9afa5a74070a4f8ca95d16f629 (commit)
       via  cbf5da01288da63a4f83282384fa7cdebbb2c5e0 (commit)
       via  08eb10445bdda427d52ccc9d070a989b3fd4aa59 (commit)
       via  9c5068adca5044058518667e981000c3913673b8 (commit)
       via  f3e76491dfd8cdc1b73c0fd16f309f6dd8c51193 (commit)
       via  857687c280c2a84152de6e8df840d0bcf1282bcf (commit)
       via  2c736f0babb3862b4d77210e3340473a1cf42082 (commit)
       via  f235379ac4b4c2216d42ae93233e5d0c5c1ae872 (commit)
       via  cc3f89292c0136ce5d9e56506f82ea743c59fff8 (commit)
       via  73aff80c1f97e854203f75375dbef1924671667e (commit)
       via  4151c412724bc38745958d0c62a427fabff1ac0d (commit)
       via  062542e47eb3bbb1ad911f2bcb6e51967f80db86 (commit)
       via  4ec8e3b32cd11141f9d639f651b721feff66c437 (commit)
       via  4b7bd3d53c9a108e8074f11e7e78475b80f07c57 (commit)
       via  75cf6882418dc594e3ada42e433ccccd25435cac (commit)
       via  deb438266566154f55d143171741bc3aa9279b45 (commit)
       via  79d2927c497c924e9b15545d44b860627e8f8a7c (commit)
       via  e9856c5b1fc9162ce1f105fee49e2a80d69dd397 (commit)
       via  b56396475bcae2a8a1356267120bc712538b198d (commit)
       via  9d762fe81ce5403a1a797a04e4e62c3d6d6f5b6f (commit)
       via  e2041e819042f1051fc026aaee2c73823824fc56 (commit)
       via  5e5d32ab61b3a6e063ca43fbedb0483257affa22 (commit)
       via  7993b2712271726a714904b1acfa6ccc151e0d0e (commit)
       via  b8aa1aef3a5f883d86d548aee9aecf82d3df82db (commit)
       via  b4f40934a6b7cf80895be7936af64a755cfda81b (commit)
       via  f093cf66138faec359a95777a91b6a2904469d7d (commit)
       via  b41a884bdeb7f18ad923d23ffed8be0f0a85e452 (commit)
       via  3a4994a4a3f1f9a52e38f70335e8845e09849846 (commit)
       via  defaae08f226bb9efbb76a0e15d392f46e929479 (commit)
       via  9d8b1517ec34774e041eede98c050f6bdd184c22 (commit)
       via  04c46ad79307ac28644adc5f25a05d8f0736c499 (commit)
       via  58fe2158d605b653cd2de61da22bed092dce58b1 (commit)
       via  3e197765c7cfefe556391661ee9a14abeab2dbb6 (commit)
       via  bf4193eeaa390cec08bbb8333a53fbc89edfd7f3 (commit)
       via  83a1b654fd2a6e15c6122da161a32443e7409623 (commit)
       via  6e0c005287a02a30aff2a286dc861be1b6dabafd (commit)
       via  3c210fe96edb1c345850e1eb35c93f98d205f843 (commit)
       via  9e01274aa67960cc532a65fbccd540c4b02ad4e5 (commit)
       via  342d41c1745b40ef78739fe9599be11f6dc529c5 (commit)
       via  60d2f52bdde24a7173275b18c74d3e7703282a8f (commit)
       via  f8f3297dd2e6e37c9fd2387edb2873db83bec3ab (commit)
       via  fab6a2603007e5ef60385148d09d51f3ed0f5b2c (commit)
       via  aca95ae8737d90adcee57929caa4239d2a7e1f66 (commit)
       via  64f53eb394384ba13e2e33f4794516577e4db528 (commit)
       via  55703cfd8ee34f76a230ff256f51367f4fe3f77e (commit)
       via  81b42d35b22babd40a068a33f40d9be2c94eb5e5 (commit)
       via  a683ec930d6658145b2e96131288f4ef3000a7d5 (commit)
       via  7548c375d046ce564630de403f8707baab547e1a (commit)
       via  1a7b50a8cbb56342845df954cbb07c16c2e5722c (commit)
       via  b5c15775caf865d8fed5d4839d4a082f6518bba4 (commit)
       via  eb5b8638a308f7954f83a6a6659ae97d4f4e082d (commit)
       via  9d1ff3299a57d0e820bf7975f0f3e6080b22f0a5 (commit)
       via  8836fd8f35b497eaad22de9d9478d8aa97fb359c (commit)
       via  19d0d9c46a423adf81410f582b3a60a412d3e7f8 (commit)
       via  2179d3f39d81e97cd3f6225f0551af429cae0e8f (commit)
       via  37516bc14fdfe634c78764c15f3a8eb3a09b403c (commit)
       via  35b87ad5b912892586cab02d309b2bdb1b0acff9 (commit)
       via  ffbd16ffadb228c7eca488a65082344e78a9dc78 (commit)
       via  aee2fb2b736a714d3c8dc5b4624bff3fae8d7ba4 (commit)
       via  96f0b43ee4bb07e87dbeef8514a51857db069351 (commit)
       via  be3378300d63ce537a5843c5fc23ecd76f4f1f5c (commit)
       via  34fba73b216678a3f447d462c5e487a4011bc700 (commit)
       via  b541c9d898d3dde983de2e0ea80a40e17d4c9b9f (commit)
       via  ea30fca96919402f1eedcf1a598240b9514972e0 (commit)
       via  6dfef004d33b147cbe80bbb5ecc6922ac25f156d (commit)
       via  841d8e9643b622457474b74d075b36dcb67c871b (commit)
       via  ffe0c69733abbf34adca1c6d1c9dd15cb3904ccb (commit)
       via  ea3743e6f64672fa487ee55dba66c63cb9da0123 (commit)
       via  17245ae08f1539c5bbef65ecaa8238518f4ede11 (commit)
       via  d3c7699ee377c4298779369c24e56c8019b599a1 (commit)
       via  d4d23b620acbce3cd5e1b5d48b660f7194533c53 (commit)
       via  c63ed8946d66b425bd98ced05bf0b36ae3bd606c (commit)
       via  cb68d4e34688abd308d7adffc288c82a5deb6c85 (commit)
       via  e2f4f1c30dfeff4261333fd65a4c521acc098804 (commit)
       via  493f9e866aa1ac2d2b8247a96f859591cad53d05 (commit)
       via  15f85151b4a761603c6164cd4654657582dd9e0b (commit)
       via  a6f2e4ea0bf519125271141c154df7e0a245b082 (commit)
       via  328867d29fbb26ad09037753a6dd2dcdf134beef (commit)
       via  98aed15ea3c1625a16154546cf87adc9f046f48b (commit)
       via  054aea6a43e28ecbeb04c98bb5dff4b19f61644e (commit)
       via  279fe9dbbbd72d2cc3a65bbf75a68aa43b2b048b (commit)
       via  6fad433ba5753166eee177fc072c061cdf17c6fa (commit)
       via  903783f131aa5dc786b1b46283e44c04c877cc11 (commit)
       via  049358ec144d007ab098a0f7bfe2e10f3ef0da0c (commit)
       via  b9fde93b6e24b0575ce81a964be6884231647ee4 (commit)
       via  cac999f47113207f1b05405ee24daab19ac97de4 (commit)
       via  d9767bb060224fdf932ce68f56565127b752ab09 (commit)
       via  b7084ab5ece7ad0ebc34c14ed0624f9e8f995ff4 (commit)
       via  9e19b42c932e3c203a6e45d883b807d9dcc2c921 (commit)
       via  8b5d03935a661e80caf353fdff8b8b998d702e27 (commit)
       via  44f003133c3c8eec7baca6999c199b7fc1646fdc (commit)
       via  6d20c830b3843023eb1600a7032bb0d54bb398ba (commit)
       via  c48f04fe095bf6de2597143d82bc268c417341de (commit)
       via  8265e843a36b9fba46791728ca8170f3b12ce333 (commit)
       via  af7233e3695ad99ae500b51390e1bf9c1c8c5a5c (commit)
       via  765d0793106c41f5810da483b7cf36a9c8a895a0 (commit)
       via  6fe577611e7afeed3c422d19d46f7ab34b201cbd (commit)
       via  abce699c344ffe2369e1125b1d65e71e2485f7cb (commit)
       via  857b9529178950df565689d091704b8fc228f2c6 (commit)
       via  e61c439e17ffdbec5964b65c3338300cb252d0f5 (commit)
       via  95dba0428816e5b53cde4f8b15ae283619c51d54 (commit)
       via  f10e92fe095a7b292dde71da0f1d8465312236d7 (commit)
       via  536888e31706dfb9db43338e858529a7432a13c1 (commit)
       via  9548790f004624cc6a143bb8cf9267e2fe7cbada (commit)
       via  0f3ce3e9251fbcdd761a9b531332eb94a10381c0 (commit)
       via  fdbf77185581f3a270aee3defb86ad9b5f091a1a (commit)
       via  57bece692f5e5d9f66ca4dfc77035867b1b32289 (commit)
       via  c91f68273656821bfa4a2315866794b5ede88b00 (commit)
       via  52059aab9c65a9cbdff0b8d379ab8b0a25f62880 (commit)
       via  0f0fd0ece6c2003b9cb5811af73f5455bdf9a894 (commit)
       via  94a845ec96ac8d68672195b49cd3088a78a10e03 (commit)
       via  cba86260ec62023c8b440a974f8fe0bd63b3f004 (commit)
       via  8d3cf07be66fb6b8a58c3999783ebc753c30428f (commit)
       via  e6ccda1f6925da119589e93b54d22508cf979069 (commit)
       via  b290de5604e7ccfad230cd1e0547f0c09cc2fe01 (commit)
       via  6b9cb6715bb7c04b2a425bc28b41a51f8a273a7a (commit)
       via  ae7a179649bbe19761c49de65b10127592ef646b (commit)
       via  a4a14d30f7fd703dbc999ca8bacd02cd00dda46c (commit)
       via  e1953022010bc0679a2d79baf5c040b8312c5d8b (commit)
       via  918edd276441e29b249d881001eb712a06cc8509 (commit)
       via  9ad1be8f5e545fef32b0317f04a17f34ba762497 (commit)
       via  7b8dd3737caad98021dc89e777e325d1c9529819 (commit)
       via  fc1d5c838c0f764ddfa891c0cef6d55c77abbe79 (commit)
       via  c09a6b1acd5e84b6f1abcb6eada69771f16966be (commit)
       via  9ce086be94935233601712eb5a07e252266f4e8d (commit)
       via  f8f5995fb9e1d036ff1b5d5d479bfae6698e9935 (commit)
       via  f79d1cdf7696a3bbcc374df5ce4d1761a28a5ea5 (commit)
       via  35d4eea994c98b4bb65111c9da6e57abbc7e014f (commit)
       via  99a1c26447c7cc06f27ce9b79690cdb64752f2ca (commit)
       via  60b6f4e619f1a22405e831eda2186d61f7f1ea48 (commit)
       via  7345838cb097f11e2ba8239020762ae867591510 (commit)
       via  78ba2ad766885dd8ed2f75c4b4466d894b328dbf (commit)
       via  d12b46657b3e3e341676ce48932c0cc961763abb (commit)
       via  50b990c78fe3c2855c0f2eb6706997724b3d346a (commit)
       via  9ef83bc1a6a2258258096759d079381a1e1a1c5c (commit)
       via  da4bc7c758d09c1c02542b54b96eab018f746eae (commit)
       via  bea6758a63d13f7829bdf68f6c9cbcfa76c2f210 (commit)
       via  9d3abfdbf7babd7a791132d963adbd39d41e3196 (commit)
       via  52ae34e34b08e889716dd753bd90dd1d47501bec (commit)
       via  b02372d2d0ddb9ec7c8a70581b2f4358c6f9c825 (commit)
       via  2aff408211e84a226af6f74cb9338cbaf3fc4645 (commit)
       via  95ac4cc571d413a95c70c5feb1430c0bb314ecee (commit)
       via  077d6648a4622d2f7e206b2ac76a3f01a60113ae (commit)
       via  9f7943df047aa10bb4b796f0f9780c29bf854332 (commit)
       via  7889b2946c77867e3bfed76ec787bb36be67f3e2 (commit)
       via  75017b1e056df82d947db19a024c524072d0d55d (commit)
       via  a50af999abab5d1937b43437fa160d6c6a36a438 (commit)
       via  f61c01afea5fb78aa026f3e4270156a20c9eeb5a (commit)
       via  a56e6e6db2fa45008f9a3a1023f91207ea9f4f9a (commit)
       via  92430a1fcb52c2fc688dae5a40f6eb086455008a (commit)
       via  0d753912c2fa8f53f1d5c2e6251b7a25caeb3499 (commit)
       via  26daadcfca01a2f3e1ca9a045debbbe5136adf58 (commit)
       via  52bf3ffb05654904d81b82d90ed8acbd1fb641fb (commit)
       via  603c6b707287af641305f7e0389b934923d70a74 (commit)
       via  78de3b9c008dbab08408797ed783a28e27f8aecb (commit)
       via  bf9bf6558fab875107746205d9f12f7885333bb6 (commit)
       via  6477e004fb67681b8b64bcdbca187dbc32c6cd60 (commit)
       via  58942469c2e85ddf9e1b369ea16d7c0c837eec63 (commit)
       via  e04151fe6963fa8dde5c19b8e3007fdddbb452ae (commit)
       via  3357db83fc3e6bd24c0f6f98129e66463edd9750 (commit)
       via  10c8c224e3bd5ee124be8e29ec569f565a03a85b (commit)
       via  d49af567353a4597e6a478ff871bdc6d3bd50f08 (commit)
       via  cd6cc155469fb54cd7d868e5bc331f13805b79c9 (commit)
       via  0fb1d755bdd3878a17cefb268e26913eb80cd7ff (commit)
       via  6f3e2cd586172574f2b6ee0f03fc5c79e7ce3b32 (commit)
       via  2512a633dac10249c351b474b80807725246144a (commit)
       via  bba33fe67b5126c092ac09e6fe0ff388aefd5619 (commit)
       via  e3521142de728bd3e45f5fcfbc1949c4a3c0652b (commit)
       via  113b2b5d0b9628ddc85baab9c1b33cadd7cf8633 (commit)
       via  bba514524b48490a8aeeb01376a10c853a90a2f2 (commit)
       via  33376dca1c7d97c02c9145e8226203ec74110055 (commit)
       via  95a655d4e4b54940d3872aa794828f4fa016c975 (commit)
       via  c6215a9818ef18c35df66488e0d80074b0631a34 (commit)
       via  9aefffe7db795c8b4aacfc8c2dbfc2eab17ad363 (commit)
       via  0bbc879707665f316892387570182d1d2209e91c (commit)
       via  fe65b9e7f45f69ccd9c73ca6cf220cd544512d0a (commit)
       via  a8915904f23325c5c6e465164bc032e0dabc4229 (commit)
       via  e0724a24547a1e22377a4ec2fa077b7c3597dbfd (commit)
       via  f3cc90ee39862a7d455ddf15bca5da5966700adb (commit)
       via  4c33c80836296cd7f92b70a61844b02f350cdeb4 (commit)
       via  4393e4edc2054e0d039517ddec507eaf339fb96f (commit)
       via  4a1d81633cd0633d70cd2d250f82776062c30a5a (commit)
       via  7e9d451769e84b18faf05dd93caf91c440ba8308 (commit)
       via  fd6b6e7a917d414d76f0bd5b2550c85fd8d2eec9 (commit)
       via  08297c0769ab936d55ae37a216ec65d66cbd06e1 (commit)
       via  164fe5d1d26297dd767dd2fd633b5bc448eab8f6 (commit)
       via  404d326a66c0f83e2278a2cc012b4b6b87de6459 (commit)
       via  7675c71cff927a677c9f3366962800469fa502b5 (commit)
       via  5a21c904426121a082c5daa2da2f65eb45154511 (commit)
       via  fcc1154442af6919767c367a05ce86cf95622e57 (commit)
       via  84225502fc158312c02825da20f235232f66909d (commit)
       via  502d0d5d6774860002368d25648d9d366832fe21 (commit)
       via  616d135e77a3e81220c6194494efa718888a9c9c (commit)
       via  65e6fa3de6c5e921e30044c66ed494456d965c59 (commit)
       via  9375fd613c5eec65195ffb721666061e4032cb0a (commit)
       via  cfb1970c0ca562c7adddc32eb7b1ff85e410289e (commit)
       via  282c677a7f39fe4186085c2705472bff9658a012 (commit)
       via  316b202c1c91a777432d5c4697305e61c1afa972 (commit)
       via  a1d52c20e1f911df998543ad642d5d27d5cd0f62 (commit)
       via  a45c454c5e76912f081822f2f70d50cf08ed27bd (commit)
       via  38e806a76c0a5babb539777dee97155d69753754 (commit)
       via  2c3c89fef054c10fad443fb549d99b199a4aa452 (commit)
       via  6b28bccc0f033b2c3a2dbcb66938e91930702042 (commit)
       via  c1317d69a70742b9c15847e4bd8580750c16fc45 (commit)
       via  7ef8a067621baba0eb38d28303812055aa41fb7f (commit)
       via  dc5e352fbba183d4eab1196b77d5f190e692eda3 (commit)
       via  8ca57d340d0322282d95545983397952112abce3 (commit)
       via  c331f885dd5fcc2d9aea245e9d410e7daccf888d (commit)
       via  97b0134409146503e051faeb9e6eb4b808f6cb28 (commit)
       via  77d35baf5dedff40f4d198c826c84be1502479e1 (commit)
       via  810846168f8e14f63caefac534b843b7681b881f (commit)
       via  58d07b5b2d77550e500212f6c8a8fd082d72e597 (commit)
       via  a7a6c3931e0ec3fad3034b1c457407fb13861633 (commit)
       via  0f9d5cc0b9a83c99ebc1c63fd24b539bc37bbb63 (commit)
       via  f9e39b9d8ae46c3e1200e3eddc0bc68ea6ce0925 (commit)
       via  c5489cb1052e68d1d0db71224ed09f1499ee776f (commit)
       via  dc6b5b04d0b0ea40e9e9caa499f070f95b99fa07 (commit)
       via  3ecbf55b4c3389115f6aa8db4839c522d3b3b288 (commit)
       via  e86a96f413affec0a05a9843d2e8d960000843b6 (commit)
       via  99dd11ec75589f79c8c0abc185deba6951936373 (commit)
       via  5b4d6b3be363cd47a8191ac1da42f5a2c13ef72d (commit)
       via  26411493537eeb54ddafa2e9e29a5723edcd0316 (commit)
       via  3088d48fc13089013fc0e0fa252c3d5122fd073d (commit)
       via  528982e8b2d20552aefda334f49cc38469547294 (commit)
       via  e2b5933fa0c48d4747680722e1ce155bc316e6a0 (commit)
       via  4a8db6777ef79b85ad52759bf5b4abec5b24c3b8 (commit)
       via  dc333e620d19bde703fddaf39cc8b5a78f0f4f4a (commit)
       via  dcf159b164464fd0d349cddcb3ae54d98f26c2f6 (commit)
       via  1e9e1e556f51abaa2f001b1c280f1d4a09ca75e2 (commit)
       via  0019db357afed7f52da38e9c398f3e39ce4eb162 (commit)
       via  f3081db313f5b99ec40e41e279f6ce2bbf156fca (commit)
       via  ba8101bf91e0502227d08f0148c6d004d915b504 (commit)
       via  1b0c21ccddcc7436e1f740cbb6bf71859203367b (commit)
       via  8465f354eeb09436e421d7ee4f8f68f9a5e5cc44 (commit)
       via  8bcea9479f65602bff315bd0f636ff8d1f1a375d (commit)
       via  2c52a2e854e4bbd763fad388ee0db8c4226f5b83 (commit)
       via  349e681615d2b9707f53f247c6c5b6d6229e7f1f (commit)
       via  f86892e89212ec7ada8c666a983d8f56fb30b15d (commit)
       via  217ceda3a0eb62a1ef1a58e0a1fdba89862920f8 (commit)
       via  27921534f9447e21c87cfdf64adef6e39c764897 (commit)
       via  76228599812922ed87f09a68fa53bb3ac653bfd8 (commit)
       via  3517c774109e6588ee94f317994939d3976b3850 (commit)
       via  19278b7140f08791c45b31f04e32ad9977d26551 (commit)
       via  cd0d451424fd6dbdb4dfb8ce98e479a60b94e0fd (commit)
       via  a14ff26b0b96bee9e5280c971d2394ffe5d3f8a8 (commit)
       via  b663f5c6770040e612bb9a9dce3d28973747c369 (commit)
       via  c272d74463c393c967f0bdc3a9f3de626f3e5e7c (commit)
       via  2ace2e7ca42a3949de3e6c0327cd2648f344dee9 (commit)
       via  2cfa4357aa0c3e5fe45324b2a37a90ddbf689b2a (commit)
       via  a1eff4d25c72460e1c3e52e523ba5029012d2ce9 (commit)
       via  daf28acf73a01fcff9e136d0036ace877af85e25 (commit)
       via  4a2eef986ec4b6ea07513afb7e89b09bab12669f (commit)
       via  07e75e47c5544347279f16a058a05c73b7aedb0d (commit)
       via  60fe1d1bba234f7f5ce6315062aa0a11e2c45e1a (commit)
       via  cdbbd5b29a0f2056ef52f23489a29af6d116a94f (commit)
       via  439877fdcd308943991d21379ac7946abb41daea (commit)
       via  62168c2db5c36de2362cd1d5785b598b187bbef3 (commit)
       via  e6d11bb6b7d0008ba31e0ea07d577e7787236c74 (commit)
       via  6d7ad47255a49c583f2fb0d78e6df5029c9ba56b (commit)
       via  bffc439a72f03126359d468329b8d25febc7bc9e (commit)
       via  30a07d66f784564de0817dd5fae7a82f5a3928b1 (commit)
       via  561561ecadfa2fc2ed36aaf09bb98be382051e7b (commit)
       via  33bb622ec2846f9e3c788655f42d7a7f25a4651c (commit)
       via  f8351929a502d46a1f95a2b270466ffeb16bf307 (commit)
       via  10e8d1c10a0f1192b3999c1fd5be8c41d2af39c6 (commit)
       via  858bf2e3bae0542d5b7da7dd6e1819660ee0c9c0 (commit)
       via  022107bd52092c658208e74161581c6bedda4a5f (commit)
       via  7ef752823f118079af629604ac29143e7c156687 (commit)
       via  99e43aaefc4a76908fd5f649edf0512c3800e021 (commit)
       via  acb5cbe8fb3524e18e31d0bbc5e9a3a80936a771 (commit)
       via  22361307cf41f916afd562e7f33fcdaacefe5f9d (commit)
       via  0428dcd2b44b944eb0645aeac210924e563db898 (commit)
       via  b6aef1869e3fa5a8f7f87b551fa68592b43756ac (commit)
       via  90a328e83574deed28d97d558e950b00e4200693 (commit)
       via  ff660b5e081301201832ac7b33ea12cceb84bc3d (commit)
       via  c66cf8a682bd326a38c069045bfc116c61603bc8 (commit)
       via  63be99931dcf5301ca75e9bc8eb049c86174eb0c (commit)
       via  b654b9c6bc67bc6de5e9fe08484acbfe7e1a7fad (commit)
       via  39f6e9f70f683237d9488faac1c549ca19ac9dae (commit)
       via  2c6557f613fcf6cdcebb08c321a5d061aeb780c6 (commit)
       via  e5b8b03317deca9ecf858a9fb5695c2e665a7a59 (commit)
       via  8c33c582e6fa415dbdca5204f5926fe09de34e3b (commit)
       via  54e625fd4fc61268d9a291b378bec3015ab35604 (commit)
       via  554f319d6a198a6e0907203f4398aa34bef45c02 (commit)
       via  c300d42d1b07d74a054be8bb561b3152c537376c (commit)
       via  4e3387a5939fe7e9c958710497d95057909670b5 (commit)
       via  c08ec9f2612ffa2ceef5405d357e5c5b8cb608c9 (commit)
       via  af8d161b1c3466d2d6fdfb3b1ce94ca73d8fea86 (commit)
       via  54377a7bacc182ace0bb8b55a812e0a9fee5ced8 (commit)
       via  d704ced53ec06c1af67ef99bba6a20096056a67c (commit)
       via  54b9ce0a8263d590c0c7716df4aaf40568f316c6 (commit)
       via  c42b65151a730ff9b02cab601cfbb1078264025f (commit)
       via  fa4646d49dc0df5e4d6d9e36e34e84e41b78ba36 (commit)
       via  516c56772b9f290454768a37a1c5e3d168853561 (commit)
       via  e1b8ff8941da1b8f1eda141d8ec41f03fa9f9cfc (commit)
       via  c0d0d539515c7402dbb18e55052dd761066b08fd (commit)
       via  6debc9dd19b3441a974c8eae9788cfa80227badd (commit)
       via  e63938a485d0f2499a567a8fd3dd2343e6f2ffbf (commit)
       via  64ca396eef119278018dceb8ca3b6c51f7debb26 (commit)
       via  b71a9969c8ae16911ed19f439c74b2848879b462 (commit)
       via  cd98fa41731b9fbba04c282977b3a7a1b52db0e8 (commit)
       via  651e6f0c4eb492a48df0e56783a970c9391237d4 (commit)
       via  cf315eea954e291f56999eb5dcdec559a08e70c0 (commit)
       via  3f35626784f50e2693ebf793044698323a0a3e10 (commit)
       via  3eb7d9fc324d53f241bce67463c61d69d4f8377a (commit)
       via  182cff0a8e5dfce51f69bb57978b04ccdb2740a1 (commit)
       via  d21ce5cf54ce442bff3e20fd39fb94606f3491e8 (commit)
       via  1efba8f3b728a3b8aa3c64c5aa09f441318ff2a8 (commit)
       via  b584bdc5d741d713413db74ce4486201ed4f9cc1 (commit)
       via  6d868844fae9f52455b2e1954382bf9e4bb66c22 (commit)
       via  3b735dd9330e0989f51a76771c3303031154154e (commit)
       via  8ebe9d6acf1aef414231093c5c5cd8e2912cf84d (commit)
       via  2bbfc3fdfa59d668c291b7f4f3ad76979f30231e (commit)
       via  b6378ecb409ca394dd3cd866fb1749c5decb316c (commit)
       via  68dee98de77221374456e635881f7e268f2745ea (commit)
      from  6f80d59b4d111454ce848f18c93aec8a891ff908 (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 f523522e3b9024b706da52bcddbce42a58c56296
Author: Lisa Knox <lisaknox83 at gmail.com>
Date:   Mon Apr 22 10:55:12 2024 -0400

    21224: merge stable Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa.knox at curii.com>

diff --git a/services/workbench2/src/components/data-explorer/data-explorer.tsx b/services/workbench2/src/components/data-explorer/data-explorer.tsx
index 4737ed06dc..b596683fad 100644
--- a/services/workbench2/src/components/data-explorer/data-explorer.tsx
+++ b/services/workbench2/src/components/data-explorer/data-explorer.tsx
@@ -130,6 +130,9 @@ type DataExplorerProps<T> = DataExplorerDataProps<T> & DataExplorerActionProps<T
 
 export const DataExplorer = withStyles(styles)(
     class DataExplorerGeneric<T> extends React.Component<DataExplorerProps<T>> {
+        state = {
+            msToolbarInDetailsCard: true,
+        };
 
         multiSelectToolbarInTitle = !this.props.title && !this.props.progressBar;
 
@@ -139,6 +142,15 @@ export const DataExplorer = withStyles(styles)(
             }
         }
 
+        componentDidUpdate( prevProps: Readonly<DataExplorerProps<T>>, prevState: Readonly<{}>, snapshot?: any ): void {
+            const { selectedResourceUuid, currentRouteUuid } = this.props;
+            if(selectedResourceUuid !== prevProps.selectedResourceUuid || currentRouteUuid !== prevProps.currentRouteUuid) {
+                this.setState({
+                    multiSelectToolbarInTitle: selectedResourceUuid === this.props.currentRouteUuid,
+                })
+            }
+        }
+
         render() {
             const {
                 columns,
@@ -204,7 +216,7 @@ export const DataExplorer = withStyles(styles)(
                                 </Grid>
                             )}
                             {!!progressBar && progressBar}
-                            {this.multiSelectToolbarInTitle && <MultiselectToolbar injectedStyles={classes.msToolbarStyles} />}
+                            {this.multiSelectToolbarInTitle && !this.state.msToolbarInDetailsCard && <MultiselectToolbar injectedStyles={classes.msToolbarStyles} />}
                             {(!hideColumnSelector || !hideSearchInput || !!actions) && (
                                 <Grid
                                     className={classes.headerMenu}
diff --git a/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx b/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
index 0d74b6b38b..449bd2dcd5 100644
--- a/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
+++ b/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
@@ -126,7 +126,7 @@ export const MultiselectToolbar = connect(
         return (
             <React.Fragment>
                 <Toolbar
-                    className={classes.root}
+                    className={classNames(classes.root, injectedStyles)}
                     style={{ width: `${(actions.length * 2.5) + 6}rem`}}
                     data-cy='multiselect-toolbar'
                     >
@@ -349,12 +349,12 @@ function mapDispatchToProps(dispatch: Dispatch) {
             switch (selectedAction.name) {
                 case ContextMenuActionNames.MOVE_TO:
                 case ContextMenuActionNames.REMOVE:
-                    const firstResource = getResource(selectedToArray(checkedList)[0])(resources) as ContainerRequestResource | Resource;
+                    const firstResource = getResource(currentList[0])(resources) as ContainerRequestResource | Resource;
                     const action = findActionByName(selectedAction.name as string, kindToActionSet[firstResource.kind]);
                     if (action) action.execute(dispatch, kindGroups[firstResource.kind]);
                     break;
                 case ContextMenuActionNames.COPY_LINK_TO_CLIPBOARD:
-                    const selectedResources = selectedToArray(checkedList).map(uuid => getResource(uuid)(resources));
+                    const selectedResources = currentList.map(uuid => getResource(uuid)(resources));
                     dispatch<any>(copyToClipboardAction(selectedResources));
                     break;
                 default:
diff --git a/services/workbench2/src/views-components/context-menu/context-menu-action-set.ts b/services/workbench2/src/views-components/context-menu/context-menu-action-set.ts
index 38de735e29..fc1028aa68 100644
--- a/services/workbench2/src/views-components/context-menu/context-menu-action-set.ts
+++ b/services/workbench2/src/views-components/context-menu/context-menu-action-set.ts
@@ -57,6 +57,7 @@ export enum ContextMenuActionNames {
     SETUP_USER = 'Setup user',
     SHARE = 'Share',
     UNSELECT_ALL = 'Unselect all',
+    USER_ACCOUNT = 'User account',
     VIEW_DETAILS = 'View details',
     WRITE = 'Write',
 }
diff --git a/services/workbench2/src/views-components/context-menu/menu-item-sort.ts b/services/workbench2/src/views-components/context-menu/menu-item-sort.ts
index f331c60247..0e06be1685 100644
--- a/services/workbench2/src/views-components/context-menu/menu-item-sort.ts
+++ b/services/workbench2/src/views-components/context-menu/menu-item-sort.ts
@@ -11,6 +11,7 @@ import { MultiSelectMenuAction } from 'views-components/multiselect-toolbar/ms-m
 export enum ContextMenuKind {
     API_CLIENT_AUTHORIZATION = "ApiClientAuthorization",
     ROOT_PROJECT = "RootProject",
+    ROOT_PROJECT_ADMIN = "RootProjectAdmin",
     PROJECT = "Project",
     FILTER_GROUP = "FilterGroup",
     READONLY_PROJECT = "ReadOnlyProject",
@@ -47,6 +48,7 @@ export enum ContextMenuKind {
     VIRTUAL_MACHINE = "VirtualMachine",
     KEEP_SERVICE = "KeepService",
     USER = "User",
+    USER_DETAILS = "UserDetails",
     GROUPS = "Group",
     GROUP_MEMBER = "GroupMember",
     PERMISSION_EDIT = "PermissionEdit",
diff --git a/services/workbench2/src/views-components/data-explorer/data-explorer.tsx b/services/workbench2/src/views-components/data-explorer/data-explorer.tsx
index 034399b124..37a15bcf77 100644
--- a/services/workbench2/src/views-components/data-explorer/data-explorer.tsx
+++ b/services/workbench2/src/views-components/data-explorer/data-explorer.tsx
@@ -23,7 +23,7 @@ interface Props {
     working?: boolean;
 }
 
-const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect, detailsPanel, properties}: RootState, { id }: Props) => {
+const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect, selectedResourceUuid, properties}: RootState, { id }: Props) => {
     const working = !!progressIndicator.some(p => p.id === id && p.working);
     const dataExplorerState = getDataExplorer(dataExplorer, id);
     const currentRoute = router.location ? router.location.pathname : "";
@@ -34,6 +34,7 @@ const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect,
         paperKey: currentRoute,
         currentRouteUuid: properties.currentRouteUuid,
         isMSToolbarVisible,
+        selectedResourceUuid,
         checkedList: multiselect.checkedList,
         working,
     };
diff --git a/services/workbench2/src/views-components/data-explorer/renderers.tsx b/services/workbench2/src/views-components/data-explorer/renderers.tsx
index bb49b6cf42..853fd8c0e3 100644
--- a/services/workbench2/src/views-components/data-explorer/renderers.tsx
+++ b/services/workbench2/src/views-components/data-explorer/renderers.tsx
@@ -55,6 +55,7 @@ import { ProjectResource } from "models/project";
 import { ProcessResource } from "models/process";
 import { ServiceRepository } from "services/services";
 import { loadUsersPanel } from "store/users/users-actions";
+import { InlinePulser } from "components/loading/inline-pulser";
 
 export const toggleIsAdmin = (uuid: string) =>
     async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
@@ -65,7 +66,6 @@ export const toggleIsAdmin = (uuid: string) =>
         dispatch<any>(loadUsersPanel());
         return newActivity;
     };
-import { InlinePulser } from "components/loading/inline-pulser";
 
 const renderName = (dispatch: Dispatch, item: GroupContentsResource) => {
     const navFunc = "groupClass" in item && item.groupClass === GroupClass.ROLE ? navigateToGroupDetails : navigateTo;
diff --git a/services/workbench2/src/views-components/multiselect-toolbar/ms-user-details-action-set.ts b/services/workbench2/src/views-components/multiselect-toolbar/ms-user-details-action-set.ts
index 33698259c1..d9ef110741 100644
--- a/services/workbench2/src/views-components/multiselect-toolbar/ms-user-details-action-set.ts
+++ b/services/workbench2/src/views-components/multiselect-toolbar/ms-user-details-action-set.ts
@@ -6,12 +6,13 @@ import { AdvancedIcon, AttributesIcon, UserPanelIcon } from 'components/icon/ico
 import { openAdvancedTabDialog } from 'store/advanced-tab/advanced-tab';
 import { openUserAttributes } from 'store/users/users-actions';
 import { navigateToUserProfile } from 'store/navigation/navigation-action';
-import { MultiSelectMenuActionSet, MultiSelectMenuActionNames } from './ms-menu-actions';
+import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set";
+import { MultiSelectMenuActionSet } from './ms-menu-actions';
 
 export const UserDetailsActionSet: MultiSelectMenuActionSet= [
     [
         {
-            name: MultiSelectMenuActionNames.ATTRIBUTES,
+            name: ContextMenuActionNames.ATTRIBUTES,
             icon: AttributesIcon,
             hasAlts: false,
             isForMulti: false,
@@ -20,7 +21,7 @@ export const UserDetailsActionSet: MultiSelectMenuActionSet= [
             },
         },
         {
-            name: MultiSelectMenuActionNames.API_DETAILS,
+            name: ContextMenuActionNames.API_DETAILS,
             icon: AdvancedIcon,
             hasAlts: false,
             isForMulti: false,
@@ -29,7 +30,7 @@ export const UserDetailsActionSet: MultiSelectMenuActionSet= [
             },
         },
         {
-            name: MultiSelectMenuActionNames.USER_ACCOUNT,
+            name: ContextMenuActionNames.USER_ACCOUNT,
             icon: UserPanelIcon,
             hasAlts: false,
             isForMulti: false,
diff --git a/services/workbench2/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx b/services/workbench2/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx
index 19fcf58849..cf463fa76a 100644
--- a/services/workbench2/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx
+++ b/services/workbench2/src/views-components/sharing-dialog/sharing-invitation-form-component.tsx
@@ -4,7 +4,7 @@
 
 import React from 'react';
 import { Field, WrappedFieldProps, FieldArray, WrappedFieldArrayProps } from 'redux-form';
-import { Grid, FormControl, InputLabel, StyleRulesCallback, Divider } from '@material-ui/core';
+import { Grid, FormControl, InputLabel, StyleRulesCallback } from '@material-ui/core';
 import { PermissionSelect, parsePermissionLevel, formatPermissionLevel } from './permission-select';
 import { ParticipantSelect, Participant } from './participant-select';
 import { WithStyles } from '@material-ui/core/styles';
diff --git a/services/workbench2/src/views/project-panel/project-panel.tsx b/services/workbench2/src/views/project-panel/project-panel.tsx
index 0425335e42..433cb11209 100644
--- a/services/workbench2/src/views/project-panel/project-panel.tsx
+++ b/services/workbench2/src/views/project-panel/project-panel.tsx
@@ -278,7 +278,6 @@ export const ProjectPanel = withStyles(styles)(
                         contextMenuColumn={true}
                         defaultViewIcon={ProjectIcon}
                         defaultViewMessages={DEFAULT_VIEW_MESSAGES}
-                        selectedResourceUuid={this.props.currentItemId}
                     />
                 </div>
             }

commit 562687ce72e709d485aa47773117a51a764a6606
Merge: 6f80d59b4d 52d652233f
Author: Lisa Knox <lisaknox83 at gmail.com>
Date:   Fri Apr 19 14:40:16 2024 -0400

    Merge branch '21448-menu-reorder' into 21224-project-details
    
    refs #21448
    
    Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa.knox at curii.com>

diff --cc services/workbench2/cypress/e2e/details-card.spec.js
index 3fbfd97e22,0000000000..3fbfd97e22
mode 100644,000000..100644
--- a/services/workbench2/cypress/e2e/details-card.spec.js
+++ b/services/workbench2/cypress/e2e/details-card.spec.js
diff --cc services/workbench2/src/components/data-explorer/data-explorer.tsx
index 979fe35c08,ba710bc783..4737ed06dc
--- a/services/workbench2/src/components/data-explorer/data-explorer.tsx
+++ b/services/workbench2/src/components/data-explorer/data-explorer.tsx
@@@ -248,7 -194,7 +204,7 @@@ export const DataExplorer = withStyles(
                                  </Grid>
                              )}
                              {!!progressBar && progressBar}
-                             {this.multiSelectToolbarInTitle && !this.state.msToolbarInDetailsCard && <MultiselectToolbar injectedStyles={classes.msToolbarStyles} />}
 -                            {this.multiSelectToolbarInTitle && <MultiselectToolbar />}
++                            {this.multiSelectToolbarInTitle && <MultiselectToolbar injectedStyles={classes.msToolbarStyles} />}
                              {(!hideColumnSelector || !hideSearchInput || !!actions) && (
                                  <Grid
                                      className={classes.headerMenu}
@@@ -330,16 -276,15 +286,17 @@@
                                  onFiltersChange={onFiltersChange}
                                  onSortToggle={onSortToggle}
                                  extractKey={extractKey}
-                                 working={this.state.showLoading}
                                  defaultViewIcon={defaultViewIcon}
                                  defaultViewMessages={defaultViewMessages}
 -                                currentItemUuid={currentItemUuid}
                                  currentRoute={paperKey}
                                  toggleMSToolbar={toggleMSToolbar}
                                  setCheckedListOnStore={setCheckedListOnStore}
                                  checkedList={checkedList}
 +                                selectedResourceUuid={selectedResourceUuid}
 +                                setSelectedUuid={this.props.setSelectedUuid}
 +                                currentRouteUuid={this.props.currentRouteUuid}
+                                 working={working}
+                                 isNotFound={this.props.isNotFound}
                              />
                          </Grid>
                          <Grid
diff --cc services/workbench2/src/components/data-table/data-table.tsx
index 6e632e071a,7b78799457..e7a358580c
--- a/services/workbench2/src/components/data-table/data-table.tsx
+++ b/services/workbench2/src/components/data-table/data-table.tsx
@@@ -29,7 -29,7 +29,8 @@@ import { SvgIconProps } from "@material
  import ArrowDownwardIcon from "@material-ui/icons/ArrowDownward";
  import { createTree } from "models/tree";
  import { DataTableMultiselectOption } from "../data-table-multiselect-popover/data-table-multiselect-popover";
 +import { isExactlyOneSelected } from "store/multiselect/multiselect-actions";
+ import { PendingIcon } from "components/icon/icon";
  
  export type DataColumns<I, R> = Array<DataColumn<I, R>>;
  
@@@ -50,13 -50,12 +51,14 @@@ export interface DataTableDataProps<I> 
      working?: boolean;
      defaultViewIcon?: IconType;
      defaultViewMessages?: string[];
 -    currentItemUuid?: string;
 -    currentRoute?: string;
      toggleMSToolbar: (isVisible: boolean) => void;
      setCheckedListOnStore: (checkedList: TCheckedList) => void;
 +    currentRoute?: string;
 +    currentRouteUuid: string;
      checkedList: TCheckedList;
 +    selectedResourceUuid: string;
 +    setSelectedUuid: (uuid: string | null) => void;
+     isNotFound?: boolean;
  }
  
  type CssRules =
@@@ -175,15 -169,12 +173,21 @@@ export const DataTable = withStyles(sty
              if (prevProps.currentRoute !== this.props.currentRoute) {
                  this.initializeCheckedList([])
              }
 +            if (singleSelected && singleSelected !== isExactlyOneSelected(prevProps.checkedList)) {
 +                this.props.setSelectedUuid(singleSelected);
 +            }
 +            if (!singleSelected && !!currentRouteUuid && !this.isAnySelected()) {
 +                this.props.setSelectedUuid(currentRouteUuid);
 +            }
 +            if (!singleSelected && this.isAnySelected()) {
 +                this.props.setSelectedUuid(null);
 +            }
+             if(prevProps.working === true && this.props.working === false) {
+                 this.setState({ isLoaded: true });
+             }
+             if((this.props.items.length > 0) && !this.state.isLoaded) {
+                 this.setState({ isLoaded: true });
+             }
          }
  
          componentWillUnmount(): void {
diff --cc services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
index 137506e743,194950b134..0d74b6b38b
--- a/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
+++ b/services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
@@@ -33,32 -32,22 +32,23 @@@ import { CollectionResource } from "mod
  import { getProcess } from "store/processes/process";
  import { Process } from "store/processes/process";
  import { PublicFavoritesState } from "store/public-favorites/public-favorites-reducer";
 -import { isExactlyOneSelected } from "store/multiselect/multiselect-actions";
 +import { AuthState } from "store/auth/auth-reducer";
  import { IntersectionObserverWrapper } from "./ms-toolbar-overflow-wrapper";
 +import classNames from "classnames";
+ import { ContextMenuKind, sortMenuItems, menuDirection } from 'views-components/context-menu/menu-item-sort';
  
- const WIDTH_TRANSITION = 150
- 
- type CssRules = "root" | "transition" | "button" | "iconContainer" | "icon";
+ type CssRules = "root" | "button" | "iconContainer" | "icon" | "divider";
  
  const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
      root: {
          display: "flex",
          flexDirection: "row",
          width: 0,
 -        height: '2.7rem',
 +        height: '2.5rem',
          padding: 0,
-         transition: `width ${WIDTH_TRANSITION}ms`,
+         margin: "1rem auto auto 0.3rem",
          overflow: 'hidden',
      },
-     transition: {
-         display: "flex",
-         flexDirection: "row",
-         height: '2.5rem',
-         padding: 0,
-         overflow: 'hidden',
-         transition: `width ${WIDTH_TRANSITION}ms`,
-     },
      button: {
          width: "2.5rem",
          height: "2.5rem ",
@@@ -108,38 -86,24 +102,27 @@@ export const MultiselectToolbar = conne
      mapDispatchToProps
  )(
      withStyles(styles)((props: MultiselectToolbarProps & WithStyles<CssRules>) => {
 -        const { classes, checkedList, singleSelectedUuid, iconProps, user, disabledButtons } = props;
 -        const singleResourceKind = singleSelectedUuid ? [resourceToMsResourceKind(singleSelectedUuid, iconProps.resources, user)] : null
 +        const { classes, checkedList, iconProps, user, disabledButtons, location, isSubPanel, injectedStyles } = props;
 +        const selectedResourceUuid = isPathDisallowed(location) ? null : props.selectedResourceUuid;
 +        const singleResourceKind = selectedResourceUuid && !isSubPanel ? [resourceToMsResourceKind(selectedResourceUuid, iconProps.resources, user)] : null
          const currentResourceKinds = singleResourceKind ? singleResourceKind : Array.from(selectedToKindSet(checkedList));
-         const currentPathIsTrash = location.includes("/trash");
-         const [isTransitioning, setIsTransitioning] = useState(false);
-         let transitionTimeout;
-         
-         const handleTransition = () => {
-             setIsTransitioning(true)
-             transitionTimeout = setTimeout(() => {
-                 setIsTransitioning(false)
-             }, WIDTH_TRANSITION);
-         }
-         
-         useEffect(()=>{
-                 handleTransition()
-                 return () => {
-                     if(transitionTimeout) clearTimeout(transitionTimeout)
-                 };
-             // eslint-disable-next-line
-         }, [checkedList])
+         const currentPathIsTrash = window.location.pathname === "/trash";
  
-         const actions =
+         const rawActions =
              currentPathIsTrash && selectedToKindSet(checkedList).size
                  ? [msToggleTrashAction]
                  : selectActionsByKind(currentResourceKinds as string[], multiselectActionsFilters).filter((action) =>
 -                        singleSelectedUuid === null ? action.isForMulti : true
 +                        selectedResourceUuid === null ? action.isForMulti : true
                      );
+                     
+         const actions: ContextMenuAction[] | MultiSelectMenuAction[] = sortMenuItems(
+             singleResourceKind && singleResourceKind.length ? (singleResourceKind[0] as ContextMenuKind) : ContextMenuKind.MULTI,
+             rawActions,
+             menuDirection.HORIZONTAL
+         ); 
  
 +        const targetResources = selectedResourceUuid ? {[selectedResourceUuid]: true} as TCheckedList : checkedList
 +
          return (
              <React.Fragment>
                  <Toolbar
@@@ -155,10 -129,10 +148,10 @@@
                                  <Tooltip
                                      className={classes.button}
                                      data-targetid={name}
 -                                    title={currentPathIsTrash || (useAlts && useAlts(singleSelectedUuid, iconProps)) ? altName : name}
 +                                    title={currentPathIsTrash || (useAlts && useAlts(selectedResourceUuid, iconProps)) ? altName : name}
                                      key={i}
                                      disableFocusListener
-                                     >
+                                 >
                                      <span className={classes.iconContainer}>
                                          <IconButton
                                              data-cy='multiselect-button'
@@@ -278,19 -251,19 +271,19 @@@ const resourceToMsResourceKind = (uuid
          case ResourceKind.PROCESS:
              return isAdmin && isEditable
                  ? resource && isProcessCancelable(getProcess(resource.uuid)(resources) as Process)
-                     ? msMenuResourceKind.RUNNING_PROCESS_ADMIN
-                     : msMenuResourceKind.PROCESS_ADMIN
+                     ? ContextMenuKind.RUNNING_PROCESS_ADMIN
+                     : ContextMenuKind.PROCESS_ADMIN
                  : readonly
-                 ? msMenuResourceKind.READONLY_PROCESS_RESOURCE
+                 ? ContextMenuKind.READONLY_PROCESS_RESOURCE
                  : resource && isProcessCancelable(getProcess(resource.uuid)(resources) as Process)
-                 ? msMenuResourceKind.RUNNING_PROCESS_RESOURCE
-                 : msMenuResourceKind.PROCESS_RESOURCE;
+                 ? ContextMenuKind.RUNNING_PROCESS_RESOURCE
+                 : ContextMenuKind.PROCESS_RESOURCE;
          case ResourceKind.USER:
-             return isAdmin ? msMenuResourceKind.ROOT_PROJECT_ADMIN : msMenuResourceKind.ROOT_PROJECT;
 -            return ContextMenuKind.ROOT_PROJECT;
++            return isAdmin ? ContextMenuKind.ROOT_PROJECT_ADMIN : ContextMenuKind.ROOT_PROJECT;
          case ResourceKind.LINK:
-             return msMenuResourceKind.LINK;
+             return ContextMenuKind.LINK;
          case ResourceKind.WORKFLOW:
-             return isEditable ? msMenuResourceKind.WORKFLOW : msMenuResourceKind.READONLY_WORKFLOW;
+             return isEditable ? ContextMenuKind.WORKFLOW : ContextMenuKind.READONLY_WORKFLOW;
          default:
              return;
      }
@@@ -362,11 -323,10 +345,11 @@@ function mapDispatchToProps(dispatch: D
      return {
          executeMulti: (selectedAction: ContextMenuAction, checkedList: TCheckedList, resources: ResourcesState): void => {
              const kindGroups = groupByKind(checkedList, resources);
 +            const currentList = selectedToArray(checkedList)
              switch (selectedAction.name) {
-                 case MultiSelectMenuActionNames.MOVE_TO:
-                 case MultiSelectMenuActionNames.REMOVE:
-                     const firstResource = getResource(currentList[0])(resources) as ContainerRequestResource | Resource;
+                 case ContextMenuActionNames.MOVE_TO:
+                 case ContextMenuActionNames.REMOVE:
+                     const firstResource = getResource(selectedToArray(checkedList)[0])(resources) as ContainerRequestResource | Resource;
                      const action = findActionByName(selectedAction.name as string, kindToActionSet[firstResource.kind]);
                      if (action) action.execute(dispatch, kindGroups[firstResource.kind]);
                      break;
diff --cc services/workbench2/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts
index f7397a5d4e,2b30525e56..9af91daa53
--- a/services/workbench2/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts
+++ b/services/workbench2/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts
@@@ -15,57 -15,8 +15,9 @@@ import 
  } from 'views-components/multiselect-toolbar/ms-project-action-set';
  import { msProcessActionSet, msCommonProcessActionFilter, msAdminProcessActionFilter, msRunningProcessActionFilter } from 'views-components/multiselect-toolbar/ms-process-action-set';
  import { msWorkflowActionSet, msWorkflowActionFilter, msReadOnlyWorkflowActionFilter } from 'views-components/multiselect-toolbar/ms-workflow-action-set';
 +import { UserDetailsActionSet } from 'views-components/multiselect-toolbar/ms-user-details-action-set';
  import { ResourceKind } from 'models/resource';
- 
- export enum msMenuResourceKind {
-     API_CLIENT_AUTHORIZATION = 'ApiClientAuthorization',
-     ROOT_PROJECT = 'RootProject',
-     ROOT_PROJECT_ADMIN = 'RootProjectAdmin',
-     PROJECT = 'Project',
-     FILTER_GROUP = 'FilterGroup',
-     READONLY_PROJECT = 'ReadOnlyProject',
-     FROZEN_PROJECT = 'FrozenProject',
-     FROZEN_PROJECT_ADMIN = 'FrozenProjectAdmin',
-     PROJECT_ADMIN = 'ProjectAdmin',
-     FILTER_GROUP_ADMIN = 'FilterGroupAdmin',
-     RESOURCE = 'Resource',
-     FAVORITE = 'Favorite',
-     TRASH = 'Trash',
-     COLLECTION_FILES = 'CollectionFiles',
-     COLLECTION_FILES_MULTIPLE = 'CollectionFilesMultiple',
-     READONLY_COLLECTION_FILES = 'ReadOnlyCollectionFiles',
-     READONLY_COLLECTION_FILES_MULTIPLE = 'ReadOnlyCollectionFilesMultiple',
-     COLLECTION_FILES_NOT_SELECTED = 'CollectionFilesNotSelected',
-     COLLECTION_FILE_ITEM = 'CollectionFileItem',
-     COLLECTION_DIRECTORY_ITEM = 'CollectionDirectoryItem',
-     READONLY_COLLECTION_FILE_ITEM = 'ReadOnlyCollectionFileItem',
-     READONLY_COLLECTION_DIRECTORY_ITEM = 'ReadOnlyCollectionDirectoryItem',
-     COLLECTION = 'Collection',
-     COLLECTION_ADMIN = 'CollectionAdmin',
-     READONLY_COLLECTION = 'ReadOnlyCollection',
-     OLD_VERSION_COLLECTION = 'OldVersionCollection',
-     TRASHED_COLLECTION = 'TrashedCollection',
-     PROCESS = 'Process',
-     RUNNING_PROCESS_ADMIN = 'RunningProcessAdmin',
-     PROCESS_ADMIN = 'ProcessAdmin',
-     RUNNING_PROCESS_RESOURCE = 'RunningProcessResource',
-     PROCESS_RESOURCE = 'ProcessResource',
-     READONLY_PROCESS_RESOURCE = 'ReadOnlyProcessResource',
-     PROCESS_LOGS = 'ProcessLogs',
-     REPOSITORY = 'Repository',
-     SSH_KEY = 'SshKey',
-     VIRTUAL_MACHINE = 'VirtualMachine',
-     KEEP_SERVICE = 'KeepService',
-     USER = 'User',
-     GROUPS = 'Group',
-     GROUP_MEMBER = 'GroupMember',
-     PERMISSION_EDIT = 'PermissionEdit',
-     LINK = 'Link',
-     WORKFLOW = 'Workflow',
-     READONLY_WORKFLOW = 'ReadOnlyWorkflow',
-     SEARCH_RESULTS = 'SearchResults',
- }
+ import { ContextMenuKind } from 'views-components/context-menu/menu-item-sort';
  
  const {
      COLLECTION,
diff --cc services/workbench2/src/store/project-panel/project-panel-middleware-service.ts
index 5c356b5b96,e8d03dfcd7..61c89cd6a7
--- a/services/workbench2/src/store/project-panel/project-panel-middleware-service.ts
+++ b/services/workbench2/src/store/project-panel/project-panel-middleware-service.ts
@@@ -54,9 -55,10 +55,10 @@@ export class ProjectPanelMiddlewareServ
              api.dispatch(projectPanelDataExplorerIsNotSet());
          } else {
              try {
+                 api.dispatch<any>(dataExplorerActions.SET_IS_NOT_FOUND({ id: this.id, isNotFound: false }));
                  if (!background) { api.dispatch(progressIndicatorActions.START_WORKING(this.getId())); }
                  const response = await this.services.groupsService.contents(projectUuid, getParams(dataExplorer, !!isProjectTrashed));
 -                const resourceUuids = response.items.map(item => item.uuid);
 +                const resourceUuids = [...response.items.map(item => item.uuid), projectUuid];
                  api.dispatch<any>(updateFavorites(resourceUuids));
                  api.dispatch<any>(updatePublicFavorites(resourceUuids));
                  api.dispatch(updateResources(response.items));
diff --cc services/workbench2/src/store/projects/project-lock-actions.ts
index d4e633de84,cd72e35196..84cea43809
--- a/services/workbench2/src/store/projects/project-lock-actions.ts
+++ b/services/workbench2/src/store/projects/project-lock-actions.ts
@@@ -7,33 -7,25 +7,33 @@@ import { ServiceRepository } from "serv
  import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
  import { loadResource } from "store/resources/resources-actions";
  import { RootState } from "store/store";
- import { MultiSelectMenuActionNames } from "views-components/multiselect-toolbar/ms-menu-actions";
+ import { ContextMenuActionNames } from "views-components/context-menu/context-menu-action-set"; 
  import { addDisabledButton, removeDisabledButton } from "store/multiselect/multiselect-actions";
 +import { snackbarActions, SnackbarKind } from "store/snackbar/snackbar-actions";
  
  export const freezeProject = (uuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
-     dispatch<any>(addDisabledButton(MultiSelectMenuActionNames.FREEZE_PROJECT))
+     dispatch<any>(addDisabledButton(ContextMenuActionNames.FREEZE_PROJECT))
      const userUUID = getState().auth.user!.uuid;
 -    
 -    const updatedProject = await services.projectService.update(uuid, {
 -        frozenByUuid: userUUID,
 -    });
 -    
 +    let updatedProject;
 +
 +    try {
 +        updatedProject = await services.projectService.update(uuid, {
 +            frozenByUuid: userUUID,
 +        });
 +    } catch (e) {
 +        console.error(e);
 +        dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'Could not freeze project', hideDuration: 4000, kind: SnackbarKind.ERROR }));
 +    }
 +
      dispatch(projectPanelActions.REQUEST_ITEMS());
      dispatch<any>(loadResource(uuid, false));
-     dispatch<any>(removeDisabledButton(MultiSelectMenuActionNames.FREEZE_PROJECT))
+     dispatch<any>(removeDisabledButton(ContextMenuActionNames.FREEZE_PROJECT))
      return updatedProject;
  };
  
 +
  export const unfreezeProject = (uuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
-     dispatch<any>(addDisabledButton(MultiSelectMenuActionNames.FREEZE_PROJECT))
+     dispatch<any>(addDisabledButton(ContextMenuActionNames.FREEZE_PROJECT))
      const updatedProject = await services.projectService.update(uuid, {
          frozenByUuid: null,
      });
diff --cc services/workbench2/src/views-components/data-explorer/data-explorer.tsx
index 1b62c8dc5d,643949a20e..034399b124
--- a/services/workbench2/src/views-components/data-explorer/data-explorer.tsx
+++ b/services/workbench2/src/views-components/data-explorer/data-explorer.tsx
@@@ -11,9 -11,7 +11,8 @@@ import { dataExplorerActions } from "st
  import { DataColumn } from "components/data-table/data-column";
  import { DataColumns, TCheckedList } from "components/data-table/data-table";
  import { DataTableFilters } from "components/data-table-filters/data-table-filters-tree";
- import { LAST_REFRESH_TIMESTAMP } from "components/refresh-button/refresh-button";
  import { toggleMSToolbar, setCheckedListOnStore } from "store/multiselect/multiselect-actions";
 +import { setSelectedResourceUuid } from "store/selected-resource/selected-resource-actions";
  
  interface Props {
      id: string;
@@@ -21,24 -19,26 +20,22 @@@
      onContextMenu?: (event: React.MouseEvent<HTMLElement>, item: any, isAdmin?: boolean) => void;
      onRowDoubleClick: (item: any) => void;
      extractKey?: (item: any) => React.Key;
+     working?: boolean;
  }
  
- const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect, properties, selectedResourceUuid}: RootState, { id }: Props) => {
-     const progress = progressIndicator.find(p => p.id === id);
+ const mapStateToProps = ({ progressIndicator, dataExplorer, router, multiselect, detailsPanel, properties}: RootState, { id }: Props) => {
+     const working = !!progressIndicator.some(p => p.id === id && p.working);
      const dataExplorerState = getDataExplorer(dataExplorer, id);
      const currentRoute = router.location ? router.location.pathname : "";
-     const currentRefresh = localStorage.getItem(LAST_REFRESH_TIMESTAMP) || "";
 -    const isDetailsResourceChecked = multiselect.checkedList[detailsPanel.resourceUuid]
 -    const isOnlyOneSelected = Object.values(multiselect.checkedList).filter(x => x === true).length === 1;
 -    const currentItemUuid =
 -        currentRoute === '/workflows' ? properties.workflowPanelDetailsUuid : isDetailsResourceChecked && isOnlyOneSelected ? detailsPanel.resourceUuid : multiselect.selectedUuid;
      const isMSToolbarVisible = multiselect.isVisible;
      return {
          ...dataExplorerState,
-         working: !!progress?.working,
-         currentRefresh: currentRefresh,
          currentRoute: currentRoute,
          paperKey: currentRoute,
 -        currentItemUuid,
 +        currentRouteUuid: properties.currentRouteUuid,
-         selectedResourceUuid: selectedResourceUuid,
          isMSToolbarVisible,
          checkedList: multiselect.checkedList,
+         working,
      };
  };
  
diff --cc services/workbench2/src/views-components/data-explorer/renderers.tsx
index 45565c4a22,91b06c2b2f..bb49b6cf42
--- a/services/workbench2/src/views-components/data-explorer/renderers.tsx
+++ b/services/workbench2/src/views-components/data-explorer/renderers.tsx
@@@ -52,18 -54,7 +53,19 @@@ import { VirtualMachinesResource } fro
  import { CopyToClipboardSnackbar } from "components/copy-to-clipboard-snackbar/copy-to-clipboard-snackbar";
  import { ProjectResource } from "models/project";
  import { ProcessResource } from "models/process";
 +import { ServiceRepository } from "services/services";
 +import { loadUsersPanel } from "store/users/users-actions";
 +
 +export const toggleIsAdmin = (uuid: string) =>
 +    async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
 +        const { resources } = getState();
 +        const data = getResource<UserResource>(uuid)(resources);
 +        const isAdmin = data!.isAdmin;
 +        const newActivity = await services.userService.update(uuid, { isAdmin: !isAdmin });
 +        dispatch<any>(loadUsersPanel());
 +        return newActivity;
 +    };
+ import { InlinePulser } from "components/loading/inline-pulser";
  
  const renderName = (dispatch: Dispatch, item: GroupContentsResource) => {
      const navFunc = "groupClass" in item && item.groupClass === GroupClass.ROLE ? navigateToGroupDetails : navigateTo;
diff --cc services/workbench2/src/views/project-panel/project-panel.tsx
index 85ae063a79,2ddfca8178..0425335e42
--- a/services/workbench2/src/views/project-panel/project-panel.tsx
+++ b/services/workbench2/src/views/project-panel/project-panel.tsx
@@@ -51,11 -51,9 +51,10 @@@ import { GroupClass, GroupResource } fr
  import { CollectionResource } from 'models/collection';
  import { resourceIsFrozen } from 'common/frozen-resources';
  import { ProjectResource } from 'models/project';
- import { NotFoundView } from 'views/not-found-panel/not-found-panel';
  import { deselectAllOthers, toggleOne } from 'store/multiselect/multiselect-actions';
 +import { ProjectDetailsCard } from 'views-components/project-details-card/project-details-card';
  
- type CssRules = 'root' | 'button';
+ type CssRules = 'root' | 'button' ;
  
  const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
      root: {
@@@ -265,27 -262,20 +265,22 @@@ const mapStateToProps = (state: RootSta
  export const ProjectPanel = withStyles(styles)(
      connect(mapStateToProps)(
          class extends React.Component<ProjectPanelProps> {
+ 
              render() {
                  const { classes } = this.props;
- 
-                 return this.props.project ?
-                     <div data-cy='project-panel' className={classes.root}>
-                         <ProjectDetailsCard />
-                         <DataExplorer
-                             id={PROJECT_PANEL_ID}
-                             onRowClick={this.handleRowClick}
-                             onRowDoubleClick={this.handleRowDoubleClick}
-                             onContextMenu={this.handleContextMenu}
-                             contextMenuColumn={true}
-                             defaultViewIcon={ProjectIcon}
-                             defaultViewMessages={DEFAULT_VIEW_MESSAGES}
-                         />
-                     </div>
-                     :
-                     <NotFoundView
-                         icon={ProjectIcon}
-                         messages={["Project not found"]}
+                 return <div data-cy='project-panel' className={classes.root}>
++                    <ProjectDetailsCard />
+                     <DataExplorer
+                         id={PROJECT_PANEL_ID}
+                         onRowClick={this.handleRowClick}
+                         onRowDoubleClick={this.handleRowDoubleClick}
+                         onContextMenu={this.handleContextMenu}
+                         contextMenuColumn={true}
+                         defaultViewIcon={ProjectIcon}
+                         defaultViewMessages={DEFAULT_VIEW_MESSAGES}
++                        selectedResourceUuid={this.props.currentItemId}
                      />
+                 </div>
              }
  
              isCurrentItemChild = (resource: Resource) => {

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


hooks/post-receive
-- 




More information about the arvados-commits mailing list