cy.getAll('@mySharedWritableProject', '@testTargetCollection')
.then(function ([mySharedWritableProject, testTargetCollection]) {
cy.loginAs(adminUser);
-
+
cy.get('[data-cy=side-panel-tree]').contains('My Favorites').click();
const newProjectName = `New project name ${mySharedWritableProject.name}`;
cy.testEditProjectOrCollection('main', mySharedWritableProject.name, newProjectName, newProjectDescription);
cy.testEditProjectOrCollection('main', testTargetCollection.name, newCollectionName, newCollectionDescription, false);
-
+
cy.get('[data-cy=side-panel-tree]').contains('Projects').click();
cy.get('main').contains(newProjectName).rightclick();
cy.get('[data-cy=side-panel-tree]').contains('Public Favorites').click();
cy.testEditProjectOrCollection('main', newProjectName, mySharedWritableProject.name, 'newProjectDescription');
- cy.testEditProjectOrCollection('main', newCollectionName, testTargetCollection.name, 'newCollectionDescription', false);
+ cy.testEditProjectOrCollection('main', newCollectionName, testTargetCollection.name, 'newCollectionDescription', false);
});
});
//
// SPDX-License-Identifier: AGPL-3.0
-import { AxiosInstance } from 'axios';
-import { WebDAV } from 'common/webdav';
-import { ApiActions } from '../api/api-actions';
+import axios, { AxiosInstance } from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import { CollectionResource } from 'models/collection';
import { AuthService } from '../auth-service/auth-service';
import { CollectionService } from './collection-service';
describe('collection-service', () => {
let collectionService: CollectionService;
- let serverApi;
+ let serverApi: AxiosInstance;
+ let axiosMock: MockAdapter;
let webdavClient: any;
let authService;
let actions;
beforeEach(() => {
- serverApi = {} as AxiosInstance;
+ serverApi = axios.create();
+ axiosMock = new MockAdapter(serverApi);
webdavClient = {
delete: jest.fn(),
} as any;
authService = {} as AuthService;
- actions = {} as ApiActions;
+ actions = {
+ progressFn: jest.fn(),
+ } as any;
collectionService = new CollectionService(serverApi, webdavClient, authService, actions);
collectionService.update = jest.fn();
});
+ describe('update', () => {
+ it('should call put selecting updated fields + others', async () => {
+ serverApi.put = jest.fn(() => Promise.resolve({ data: {} }));
+ const data: Partial<CollectionResource> = {
+ name: 'foo',
+ };
+ const expected = {
+ collection: {
+ ...data,
+ preserve_version: true,
+ },
+ select: ['uuid', 'name', 'version', 'modified_at'],
+ }
+ collectionService = new CollectionService(serverApi, webdavClient, authService, actions);
+ await collectionService.update('uuid', data);
+ expect(serverApi.put).toHaveBeenCalledWith('/collections/uuid', expected);
+ });
+ });
+
describe('deleteFiles', () => {
it('should remove no files', async () => {
// given
}
update(uuid: string, data: Partial<CollectionResource>) {
- return super.update(uuid, { ...data, preserveVersion: true });
+ const select = [...Object.keys(data), 'version', 'modifiedAt'];
+ return super.update(uuid, { ...data, preserveVersion: true }, select);
}
async files(uuid: string) {
return super.create(payload);
}
- update(uuid: string, data: Partial<T>) {
+ update(uuid: string, data: Partial<T>, select?: string[]) {
let payload: any;
if (data !== undefined) {
this.readOnlyFields.forEach( field => delete data[field] );
payload = {
[this.resourceType.slice(0, -1)]: CommonService.mapKeys(snakeCase)(data),
};
+ if (select !== undefined && select.length > 0) {
+ payload.select = ['uuid', ...select.map(field => snakeCase(field))];
+ };
}
return super.update(uuid, payload);
}
import { navigateTo } from 'store/navigation/navigation-action';
import { loadDetailsPanel } from 'store/details-panel/details-panel-action';
import { addProperty, deleteProperty } from "lib/resource-properties";
+import { getResource } from "store/resources/resources";
export const collectionPanelActions = unionize({
SET_COLLECTION: ofType<CollectionResource>(),
dispatch(resourcesActions.SET_RESOURCES([collection]));
if (collection.fileCount <= COLLECTION_PANEL_LOAD_FILES_THRESHOLD &&
!getState().collectionPanel.loadBigCollections) {
- // dispatch<any>(loadCollectionFiles(collection.uuid));
}
return collection;
};
const properties = Object.assign({}, item.properties);
const key = data.keyID || data.key;
const value = data.valueID || data.value;
+ const cachedCollection = getResource<CollectionResource>(item.uuid)(getState().resources);
services.collectionService.update(
item.uuid, {
properties: addProperty(properties, key, value)
}
).then(updatedCollection => {
+ updatedCollection = {...cachedCollection, ...updatedCollection};
dispatch(collectionPanelActions.SET_COLLECTION(updatedCollection));
dispatch(resourcesActions.SET_RESOURCES([updatedCollection]));
dispatch(snackbarActions.OPEN_SNACKBAR({
if (!item) { return; }
const properties = Object.assign({}, item.properties);
+ const cachedCollection = getResource<CollectionResource>(item.uuid)(getState().resources);
services.collectionService.update(
item.uuid, {
properties: deleteProperty(properties, key, value)
}
).then(updatedCollection => {
+ updatedCollection = {...cachedCollection, ...updatedCollection};
dispatch(collectionPanelActions.SET_COLLECTION(updatedCollection));
dispatch(resourcesActions.SET_RESOURCES([updatedCollection]));
dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Tag has been successfully deleted.", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
import { snackbarActions, SnackbarKind } from "../snackbar/snackbar-actions";
import { updateResources } from "../resources/resources-actions";
import { loadDetailsPanel } from "../details-panel/details-panel-action";
+import { getResource } from "store/resources/resources";
export interface CollectionUpdateFormDialogData {
uuid: string;
dispatch(startSubmit(COLLECTION_UPDATE_FORM_NAME));
dispatch(progressIndicatorActions.START_WORKING(COLLECTION_UPDATE_FORM_NAME));
+ const cachedCollection = getResource<CollectionResource>(collection.uuid)(getState().resources);
services.collectionService.update(uuid, {
name: collection.name,
storageClassesDesired: collection.storageClassesDesired,
description: collection.description }
).then(updatedCollection => {
+ updatedCollection = {...cachedCollection, ...updatedCollection};
dispatch(collectionPanelActions.LOAD_COLLECTION_SUCCESS({ item: updatedCollection as CollectionResource }));
dispatch(dialogActions.CLOSE_DIALOG({ id: COLLECTION_UPDATE_FORM_NAME }));
dispatch(progressIndicatorActions.STOP_WORKING(COLLECTION_UPDATE_FORM_NAME));
isWritable = true;
} else {
const itemOwner = getResource<GroupResource | UserResource>(item.ownerUuid)(state.resources);
- if (itemOwner) {
+ if (itemOwner && itemOwner.writableBy) {
isWritable = itemOwner.writableBy.indexOf(currentUserUUID || '') >= 0;
}
}