[ACS-5281] Changed editable state of metadata content based on change o… (#3400)

* ACS-5281 Changed editable state of metadata content based on change of file lock state

* ACS-5281 Updated versions

* ACS-5281 Reverted change

* ACS-5281 Upgrade version

* ACS-5281 Small correction

* ACS-5281 Fixed e2e
This commit is contained in:
AleksanderSklorz
2023-08-27 10:00:35 +02:00
committed by GitHub
parent bc9c58176f
commit aec6852672
45 changed files with 455 additions and 364 deletions

View File

@@ -5,10 +5,10 @@
"license": "LGPL-3.0",
"scripts": {},
"peerDependencies": {
"@alfresco/adf-content-services": "^6.3.0-5833590093",
"@alfresco/adf-core": "6.3.0-5833590093",
"@alfresco/adf-extensions": "6.3.0-5833590093",
"@alfresco/js-api": ">=6.3.0-1104",
"@alfresco/adf-content-services": "^6.3.0-5977252204",
"@alfresco/adf-core": "6.3.0-5977252204",
"@alfresco/adf-extensions": "6.3.0-5977252204",
"@alfresco/js-api": ">=6.3.0-1172",
"@angular/animations": "^14.1.3",
"@angular/common": "^14.1.3",
"@angular/compiler": "^14.1.3",

View File

@@ -27,7 +27,7 @@ import { ShowHeaderMode } from '@alfresco/adf-core';
import { ContentActionRef, DocumentListPresetRef, SelectionState } from '@alfresco/adf-extensions';
import { OnDestroy, OnInit, OnChanges, ViewChild, SimpleChanges, Directive, inject } from '@angular/core';
import { Store } from '@ngrx/store';
import { MinimalNodeEntity, MinimalNodeEntryEntity, NodePaging } from '@alfresco/js-api';
import { NodeEntry, Node, NodePaging } from '@alfresco/js-api';
import { Observable, Subject, Subscription } from 'rxjs';
import { takeUntil, map } from 'rxjs/operators';
import { DocumentBasePageService } from './document-base-page.service';
@@ -58,7 +58,7 @@ export abstract class PageComponent implements OnInit, OnDestroy, OnChanges {
title = 'Page';
infoDrawerOpened$: Observable<boolean>;
node: MinimalNodeEntryEntity;
node: Node;
selection: SelectionState;
sharedPreviewUrl$: Observable<string>;
actions: Array<ContentActionRef> = [];
@@ -144,7 +144,7 @@ export abstract class PageComponent implements OnInit, OnDestroy, OnChanges {
this.store.dispatch(new SetSelectedNodesAction([]));
}
showPreview(node: MinimalNodeEntity, extras?: ViewNodeExtras) {
showPreview(node: NodeEntry, extras?: ViewNodeExtras) {
if (node && node.entry) {
if (this.fileAutoDownloadService?.shouldFileAutoDownload(node.entry?.content?.sizeInBytes)) {
this.fileAutoDownloadService.autoDownloadFile(node);
@@ -180,7 +180,7 @@ export abstract class PageComponent implements OnInit, OnDestroy, OnChanges {
return null;
}
reload(selectedNode?: MinimalNodeEntity): void {
reload(selectedNode?: NodeEntry): void {
if (this.isOutletPreviewUrl()) {
return;
}

View File

@@ -22,9 +22,9 @@
* from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
*/
import { MinimalNodeEntity, MinimalNodeEntryEntity } from '@alfresco/js-api';
import { NodeEntry, Node } from '@alfresco/js-api';
export abstract class DocumentBasePageService {
abstract canUpdateNode(node: MinimalNodeEntity): boolean;
abstract canUploadContent(node: MinimalNodeEntryEntity): boolean;
abstract canUpdateNode(node: NodeEntry): boolean;
abstract canUploadContent(node: Node): boolean;
}

View File

@@ -26,7 +26,7 @@ import { TestBed, ComponentFixture } from '@angular/core/testing';
import { PageComponent } from './document-base-page.component';
import { ReloadDocumentListAction, SetSelectedNodesAction, AppState, ViewNodeAction } from '@alfresco/aca-shared/store';
import { AppExtensionService } from '@alfresco/aca-shared';
import { MinimalNodeEntity, NodePaging, RepositoryInfo } from '@alfresco/js-api';
import { NodeEntry, NodePaging, RepositoryInfo, VersionInfo } from '@alfresco/js-api';
import { DocumentBasePageService } from './document-base-page.service';
import { Store, StoreModule } from '@ngrx/store';
import { Component, Injectable } from '@angular/core';
@@ -141,7 +141,14 @@ describe('PageComponent', () => {
provide: DiscoveryApiService,
useValue: {
ecmProductInfo$: new BehaviorSubject<RepositoryInfo | null>(null),
getEcmProductInfo: (): Observable<RepositoryInfo> => of(new RepositoryInfo({ version: '10.0.0' }))
getEcmProductInfo: (): Observable<RepositoryInfo> =>
of(
new RepositoryInfo({
version: {
major: '10.0.0'
} as VersionInfo
})
)
}
},
AppExtensionService
@@ -198,7 +205,7 @@ describe('PageComponent', () => {
entry: {
id: 'node-id'
}
} as MinimalNodeEntity;
} as NodeEntry;
spyOn(store, 'dispatch');
component.reload(node);
@@ -244,7 +251,7 @@ describe('PageComponent', () => {
entry: {
id: 'node-id'
}
} as MinimalNodeEntity;
} as NodeEntry;
component.showPreview(node);
expect(store.dispatch).toHaveBeenCalledWith(new ViewNodeAction(node.entry.id));
@@ -260,7 +267,7 @@ describe('PageComponent', () => {
'cm:destination': 'original-node-id'
}
}
} as MinimalNodeEntity;
} as NodeEntry;
component.showPreview(linkNode);
const id = linkNode.entry.properties['cm:destination'];
@@ -298,7 +305,14 @@ describe('Info Drawer state', () => {
provide: DiscoveryApiService,
useValue: {
ecmProductInfo$: new BehaviorSubject<RepositoryInfo | null>(null),
getEcmProductInfo: (): Observable<RepositoryInfo> => of(new RepositoryInfo({ version: '10.0.0' }))
getEcmProductInfo: (): Observable<RepositoryInfo> =>
of(
new RepositoryInfo({
version: {
major: '10.0.0'
} as VersionInfo
})
)
}
},
provideMockStore({

View File

@@ -23,7 +23,7 @@
*/
import { Component, HostListener, Input, OnChanges, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { MinimalNodeEntity, MinimalNodeEntryEntity, SiteEntry } from '@alfresco/js-api';
import { NodeEntry, Node, SiteEntry } from '@alfresco/js-api';
import { ContentActionRef, ExtensionsModule, SidebarTabRef } from '@alfresco/adf-extensions';
import { Store } from '@ngrx/store';
import { SetInfoDrawerStateAction, ToggleInfoDrawerAction, infoDrawerPreview } from '@alfresco/aca-shared/store';
@@ -50,10 +50,10 @@ export class InfoDrawerComponent implements OnChanges, OnInit, OnDestroy {
nodeId: string;
@Input()
node: MinimalNodeEntity;
node: NodeEntry;
isLoading = false;
displayNode: MinimalNodeEntryEntity | SiteEntry;
displayNode: Node | SiteEntry;
tabs: Array<SidebarTabRef> = [];
actions: Array<ContentActionRef> = [];
onDestroy$ = new Subject<boolean>();

View File

@@ -48,7 +48,7 @@ import { STORE_INITIAL_APP_DATA } from '../../../store/src/states/app.state';
import { provideMockStore } from '@ngrx/store/testing';
import { CommonModule } from '@angular/common';
import { RouterTestingModule } from '@angular/router/testing';
import { RepositoryInfo } from '@alfresco/js-api';
import { RepositoryInfo, VersionInfo } from '@alfresco/js-api';
import { MatDialogModule } from '@angular/material/dialog';
import { TranslateModule } from '@ngx-translate/core';
import { Store } from '@ngrx/store';
@@ -81,7 +81,14 @@ describe('AppService', () => {
provide: DiscoveryApiService,
useValue: {
ecmProductInfo$: new BehaviorSubject<RepositoryInfo>(null),
getEcmProductInfo: (): Observable<RepositoryInfo> => of(new RepositoryInfo({ version: '10.0.0' }))
getEcmProductInfo: (): Observable<RepositoryInfo> =>
of(
new RepositoryInfo({
version: {
major: '10.0.0'
} as VersionInfo
})
)
}
},
{

View File

@@ -26,7 +26,6 @@ import { Injectable } from '@angular/core';
import { AlfrescoApiService, UserPreferencesService } from '@alfresco/adf-core';
import { Observable, from } from 'rxjs';
import {
MinimalNodeEntity,
NodePaging,
Node,
DeletedNodesPaging,
@@ -37,9 +36,9 @@ import {
SharedLinkPaging,
SearchRequest,
ResultSetPaging,
SiteBody,
SiteBodyCreate,
SiteEntry,
FavoriteBody,
FavoriteBodyCreate,
FavoriteEntry,
NodesApi,
TrashcanApi,
@@ -139,7 +138,7 @@ export class ContentApiService {
* @param options Optional parameters supported by JS-API
* @returns Node information
*/
getNode(nodeId: string, options: any = {}): Observable<MinimalNodeEntity> {
getNode(nodeId: string, options: any = {}): Observable<NodeEntry> {
const defaults = {
include: ['path', 'properties', 'allowableOperations', 'permissions', 'definition']
};
@@ -199,7 +198,7 @@ export class ContentApiService {
return from(this.trashcanApi.listDeletedNodes(queryOptions));
}
restoreNode(nodeId: string): Observable<MinimalNodeEntity> {
restoreNode(nodeId: string): Observable<NodeEntry> {
return from(this.trashcanApi.restoreDeletedNode(nodeId));
}
@@ -299,7 +298,7 @@ export class ContentApiService {
}
createSite(
siteBody: SiteBody,
siteBody: SiteBodyCreate,
opts?: {
fields?: Array<string>;
skipConfiguration?: boolean;
@@ -313,12 +312,12 @@ export class ContentApiService {
return from(this.sitesApi.getSite(siteId, opts));
}
updateLibrary(siteId: string, siteBody: SiteBody): Observable<SiteEntry> {
updateLibrary(siteId: string, siteBody: SiteBodyCreate): Observable<SiteEntry> {
return from(this.sitesApi.updateSite(siteId, siteBody));
}
addFavorite(nodes: Array<MinimalNodeEntity>): Observable<FavoriteEntry> {
const payload: FavoriteBody[] = nodes.map((node) => {
addFavorite(nodes: Array<NodeEntry>): Observable<FavoriteEntry> {
const payload: FavoriteBodyCreate[] = nodes.map((node) => {
const { isFolder, nodeId, id } = node.entry as any;
const siteId = node.entry['guid'];
const type = siteId ? 'site' : isFolder ? 'folder' : 'file';
@@ -336,7 +335,7 @@ export class ContentApiService {
return from(this.favoritesApi.createFavorite('-me-', payload as any));
}
removeFavorite(nodes: Array<MinimalNodeEntity>): Observable<any> {
removeFavorite(nodes: Array<NodeEntry>): Observable<any> {
return from(
Promise.all(
nodes.map((node: any) => {
@@ -347,7 +346,7 @@ export class ContentApiService {
);
}
unlockNode(nodeId: string, opts?: any): Promise<MinimalNodeEntity> {
unlockNode(nodeId: string, opts?: any): Promise<NodeEntry> {
return this.nodesApi.unlockNode(nodeId, opts);
}

View File

@@ -23,7 +23,7 @@
*/
import { Action } from '@ngrx/store';
import { SiteBody } from '@alfresco/js-api';
import { SiteBodyCreate } from '@alfresco/js-api';
import { ModalConfiguration } from '../models/modal-configuration';
export enum LibraryActionTypes {
@@ -53,7 +53,7 @@ export class NavigateLibraryAction implements Action {
export class UpdateLibraryAction implements Action {
readonly type = LibraryActionTypes.Update;
constructor(public payload?: SiteBody) {}
constructor(public payload?: SiteBodyCreate) {}
}
export class LeaveLibraryAction implements Action {

View File

@@ -23,7 +23,7 @@
*/
import { Action } from '@ngrx/store';
import { MinimalNodeEntity } from '@alfresco/js-api';
import { NodeEntry } from '@alfresco/js-api';
import { ModalConfiguration } from '../models/modal-configuration';
export enum NodeActionTypes {
@@ -54,13 +54,13 @@ export enum NodeActionTypes {
export class SetSelectedNodesAction implements Action {
readonly type = NodeActionTypes.SetSelection;
constructor(public payload: MinimalNodeEntity[] = []) {}
constructor(public payload: NodeEntry[] = []) {}
}
export class DeleteNodesAction implements Action {
readonly type = NodeActionTypes.Delete;
constructor(public payload: MinimalNodeEntity[] = []) {}
constructor(public payload: NodeEntry[] = []) {}
}
export class UndoDeleteNodesAction implements Action {
@@ -72,19 +72,19 @@ export class UndoDeleteNodesAction implements Action {
export class RestoreDeletedNodesAction implements Action {
readonly type = NodeActionTypes.RestoreDeleted;
constructor(public payload: Array<MinimalNodeEntity>) {}
constructor(public payload: Array<NodeEntry>) {}
}
export class PurgeDeletedNodesAction implements Action {
readonly type = NodeActionTypes.PurgeDeleted;
constructor(public payload: Array<MinimalNodeEntity>) {}
constructor(public payload: Array<NodeEntry>) {}
}
export class DownloadNodesAction implements Action {
readonly type = NodeActionTypes.Download;
constructor(public payload: MinimalNodeEntity[] = [], public configuration?: ModalConfiguration) {}
constructor(public payload: NodeEntry[] = [], public configuration?: ModalConfiguration) {}
}
export class CreateFolderAction implements Action {
@@ -96,60 +96,60 @@ export class CreateFolderAction implements Action {
export class EditFolderAction implements Action {
readonly type = NodeActionTypes.EditFolder;
constructor(public payload: MinimalNodeEntity, public configuration?: ModalConfiguration) {}
constructor(public payload: NodeEntry, public configuration?: ModalConfiguration) {}
}
export class ShareNodeAction implements Action {
readonly type = NodeActionTypes.Share;
constructor(public payload: MinimalNodeEntity, public configuration?: ModalConfiguration) {}
constructor(public payload: NodeEntry, public configuration?: ModalConfiguration) {}
}
export class UnshareNodesAction implements Action {
readonly type = NodeActionTypes.Unshare;
constructor(public payload: Array<MinimalNodeEntity>) {}
constructor(public payload: Array<NodeEntry>) {}
}
export class CopyNodesAction implements Action {
readonly type = NodeActionTypes.Copy;
constructor(public payload: Array<MinimalNodeEntity>, public configuration?: ModalConfiguration) {}
constructor(public payload: Array<NodeEntry>, public configuration?: ModalConfiguration) {}
}
export class MoveNodesAction implements Action {
readonly type = NodeActionTypes.Move;
constructor(public payload: Array<MinimalNodeEntity>, public configuration?: ModalConfiguration) {}
constructor(public payload: Array<NodeEntry>, public configuration?: ModalConfiguration) {}
}
export class ManagePermissionsAction implements Action {
readonly type = NodeActionTypes.ManagePermissions;
constructor(public payload: MinimalNodeEntity) {}
constructor(public payload: NodeEntry) {}
}
export class ExpandInfoDrawerAction implements Action {
readonly type = NodeActionTypes.ExpandInfoDrawer;
constructor(public payload: MinimalNodeEntity) {}
constructor(public payload: NodeEntry) {}
}
export class PrintFileAction implements Action {
readonly type = NodeActionTypes.PrintFile;
constructor(public payload: MinimalNodeEntity) {}
constructor(public payload: NodeEntry) {}
}
export class ManageVersionsAction implements Action {
readonly type = NodeActionTypes.ManageVersions;
constructor(public payload: MinimalNodeEntity, public configuration?: ModalConfiguration) {}
constructor(public payload: NodeEntry, public configuration?: ModalConfiguration) {}
}
export class EditOfflineAction implements Action {
readonly type = NodeActionTypes.EditOffline;
constructor(public payload: any) {}
constructor(public payload: NodeEntry) {}
}
export class UnlockWriteAction implements Action {
@@ -161,22 +161,22 @@ export class UnlockWriteAction implements Action {
export class AddFavoriteAction implements Action {
readonly type = NodeActionTypes.AddFavorite;
constructor(public payload: Array<MinimalNodeEntity>) {}
constructor(public payload: Array<NodeEntry>) {}
}
export class RemoveFavoriteAction implements Action {
readonly type = NodeActionTypes.RemoveFavorite;
constructor(public payload: Array<MinimalNodeEntity>) {}
constructor(public payload: Array<NodeEntry>) {}
}
export class ManageAspectsAction implements Action {
readonly type = NodeActionTypes.ChangeAspects;
constructor(public payload: MinimalNodeEntity, public configuration?: ModalConfiguration) {}
constructor(public payload: NodeEntry, public configuration?: ModalConfiguration) {}
}
export class ManageRulesAction implements Action {
readonly type = NodeActionTypes.ManageRules;
constructor(public payload: MinimalNodeEntity) {}
constructor(public payload: NodeEntry) {}
}

View File

@@ -23,7 +23,7 @@
*/
import { Action } from '@ngrx/store';
import { MinimalNodeEntity } from '@alfresco/js-api';
import { NodeEntry } from '@alfresco/js-api';
import { RouterActionTypes } from './router-action-types';
export class NavigateUrlAction implements Action {
@@ -41,13 +41,13 @@ export class NavigateRouteAction implements Action {
export class NavigateToFolder implements Action {
readonly type = RouterActionTypes.NavigateFolder;
constructor(public payload: MinimalNodeEntity) {}
constructor(public payload: NodeEntry) {}
}
export class NavigateToParentFolder implements Action {
readonly type = RouterActionTypes.NavigateParentFolder;
constructor(public payload: MinimalNodeEntity) {}
constructor(public payload: NodeEntry) {}
}
export class NavigateToPreviousPage implements Action {

View File

@@ -23,7 +23,7 @@
*/
import { Action } from '@ngrx/store';
import { MinimalNodeEntity } from '@alfresco/js-api';
import { NodeEntry } from '@alfresco/js-api';
export enum ViewerActionTypes {
ViewFile = 'VIEW_FILE',
@@ -43,7 +43,7 @@ export interface ViewNodeExtras {
export class ViewFileAction implements Action {
readonly type = ViewerActionTypes.ViewFile;
constructor(public payload?: MinimalNodeEntity, public parentId?: string) {}
constructor(public payload?: NodeEntry, public parentId?: string) {}
}
export class ViewNodeAction implements Action {
@@ -61,17 +61,17 @@ export class ViewNodeVersionAction implements Action {
export class FullscreenViewerAction implements Action {
readonly type = ViewerActionTypes.FullScreen;
constructor(public payload: MinimalNodeEntity) {}
constructor(public payload: NodeEntry) {}
}
export class ClosePreviewAction implements Action {
readonly type = ViewerActionTypes.ClosePreview;
constructor(public payload?: MinimalNodeEntity) {}
constructor(public payload?: NodeEntry) {}
}
export class RefreshPreviewAction implements Action {
readonly type = ViewerActionTypes.RefreshPreview;
constructor(public payload?: MinimalNodeEntity) {}
constructor(public payload?: NodeEntry) {}
}
export class PluginPreviewAction implements Action {

View File

@@ -25,7 +25,7 @@
import { Injectable } from '@angular/core';
import { Router } from '@angular/router';
import { Actions, ofType, createEffect } from '@ngrx/effects';
import { MinimalNodeEntryEntity, PathInfoEntity } from '@alfresco/js-api';
import { Node, PathInfo } from '@alfresco/js-api';
import { map } from 'rxjs/operators';
import { Store } from '@ngrx/store';
import { AppStore } from '../states/app.state';
@@ -97,7 +97,7 @@ export class RouterEffects {
{ dispatch: false }
);
private navigateToFolder(node: MinimalNodeEntryEntity) {
private navigateToFolder(node: Node) {
let link: any[] = null;
const { path, id } = node;
@@ -122,7 +122,7 @@ export class RouterEffects {
}
}
private navigateToParentFolder(node: MinimalNodeEntryEntity) {
private navigateToParentFolder(node: Node) {
let link: any[] = null;
const { path } = node;
@@ -147,7 +147,7 @@ export class RouterEffects {
}
}
private isLibraryContent(path: PathInfoEntity): boolean {
private isLibraryContent(path: PathInfo): boolean {
return path && path.elements.length >= 2 && path.elements[1].name === 'Sites';
}
}