[ACS-9765]: adds rma related rules for create/copy/move folders

This commit is contained in:
Anton Ramanovich
2026-03-11 17:21:41 +01:00
parent 34f865067a
commit 9650924493
4 changed files with 58 additions and 17 deletions
@@ -987,7 +987,8 @@
"!app.navigation.isTrashcan", "!app.navigation.isTrashcan",
"!app.navigation.isLibraries", "!app.navigation.isLibraries",
"app.selection.notEmpty", "app.selection.notEmpty",
"app.selection.canDelete" "app.selection.canDelete",
"!app.selection.isRmaSystemContainer"
] ]
} }
}, },
@@ -1003,7 +1004,8 @@
"visible": [ "visible": [
"app.selection.notEmpty", "app.selection.notEmpty",
"!app.navigation.isTrashcan", "!app.navigation.isTrashcan",
"!app.navigation.isLibraries" "!app.navigation.isLibraries",
"!app.selection.isRmaSystemContainer"
] ]
} }
}, },
@@ -153,6 +153,7 @@ import { IsFeatureSupportedInCurrentAcsPipe } from './pipes/is-feature-supported
'app.selection.folder': rules.hasFolderSelected, 'app.selection.folder': rules.hasFolderSelected,
'app.selection.folder.canUpdate': rules.canUpdateSelectedFolder, 'app.selection.folder.canUpdate': rules.canUpdateSelectedFolder,
'app.selection.displayedKnowledgeRetrievalButton': rules.canDisplayKnowledgeRetrievalButton, 'app.selection.displayedKnowledgeRetrievalButton': rules.canDisplayKnowledgeRetrievalButton,
'app.selection.isRmaSystemContainer': rules.isRmaSystemContainer,
'app.navigation.folder.canCreate': rules.canCreateFolder, 'app.navigation.folder.canCreate': rules.canCreateFolder,
'app.navigation.isTrashcan': rules.isTrashcan, 'app.navigation.isTrashcan': rules.isTrashcan,
+42 -13
View File
@@ -23,7 +23,14 @@
*/ */
import * as app from './app.rules'; import * as app from './app.rules';
import { createVersionRule, getFileExtension, isPreferencesApiAvailable, isNodeInfoAvailable, isBulkActionsAvailable } from './app.rules'; import {
createVersionRule,
getFileExtension,
isPreferencesApiAvailable,
isNodeInfoAvailable,
isBulkActionsAvailable,
isRmaSystemContainer
} from './app.rules';
import { TestRuleContext } from './test-rule-context'; import { TestRuleContext } from './test-rule-context';
import { NodeEntry, RepositoryInfo, StatusInfo } from '@alfresco/js-api'; import { NodeEntry, RepositoryInfo, StatusInfo } from '@alfresco/js-api';
import { ProfileState, RuleContext } from '@alfresco/adf-extensions'; import { ProfileState, RuleContext } from '@alfresco/adf-extensions';
@@ -858,42 +865,39 @@ describe('app.evaluators', () => {
}); });
describe('canCreateFolder', () => { describe('canCreateFolder', () => {
it('should return false when content service is disabled', () => {
context.appConfig = { get: () => false } as any;
expect(app.canCreateFolder(context)).toBeFalse();
});
it('should return false when user is outside personal files or libraries', () => { it('should return false when user is outside personal files or libraries', () => {
context.appConfig = { get: () => true } as any;
context.navigation.url = '/favorite/test'; context.navigation.url = '/favorite/test';
expect(app.canCreateFolder(context)).toBeFalse(); expect(app.canCreateFolder(context)).toBeFalse();
}); });
it('should return false when current folder does not exist', () => { it('should return false when current folder does not exist', () => {
context.appConfig = { get: () => true } as any;
context.navigation.url = '/personal-files/test'; context.navigation.url = '/personal-files/test';
context.navigation.currentFolder = null; context.navigation.currentFolder = null;
expect(app.canCreateFolder(context)).toBeFalse(); expect(app.canCreateFolder(context)).toBeFalse();
}); });
it('should return false when permission check fails', () => { it('should return false when permission check fails', () => {
context.appConfig = { get: () => true } as any;
context.navigation.url = '/personal-files/test'; context.navigation.url = '/personal-files/test';
context.navigation.currentFolder = {} as any; context.navigation.currentFolder = {} as any;
context.permissions = { check: () => false }; context.permissions = { check: () => false };
expect(app.canCreateFolder(context)).toBeFalse(); expect(app.canCreateFolder(context)).toBeFalse();
}); });
it('should return true when permission requirements are met', () => { it('should return true when permission requirements are met and current folder is not rma restricted one', () => {
context.appConfig = { get: () => true } as any;
context.navigation.url = '/personal-files/test'; context.navigation.url = '/personal-files/test';
context.navigation.currentFolder = {} as any; context.navigation.currentFolder = { nodeType: 'rma:filePlan' } as any;
context.permissions = { check: () => true }; context.permissions = { check: () => true };
expect(app.canCreateFolder(context)).toBeTrue(); expect(app.canCreateFolder(context)).toBeTrue();
}); });
it('should return false when permission requirements are met BUT current folder is rma restricted one', () => {
context.navigation.url = '/personal-files/test';
context.navigation.currentFolder = { nodeType: 'rma:hold' } as any;
context.permissions = { check: () => true };
expect(app.canCreateFolder(context)).toBeFalse();
});
it('should verify is user has create permission on current folder', () => { it('should verify is user has create permission on current folder', () => {
context.appConfig = { get: () => true } as any;
context.navigation.url = '/personal-files/test'; context.navigation.url = '/personal-files/test';
context.navigation.currentFolder = { allowableOperations: ['create'] } as any; context.navigation.currentFolder = { allowableOperations: ['create'] } as any;
spyOn(context.permissions, 'check'); spyOn(context.permissions, 'check');
@@ -1315,6 +1319,31 @@ describe('Versions compatibility', () => {
expect(rule(makeContext('25.0.1.1-rc'))).toBe(false); expect(rule(makeContext('25.0.1.1-rc'))).toBe(false);
}); });
}); });
describe('isRmaSystemContainer', () => {
const prepareRuleContext = (nodeType: string | string[]): RuleContext => {
const nodes = Array.isArray(nodeType) ? nodeType.map((type) => ({ entry: { nodeType: type } })) : [{ entry: { nodeType } }];
return {
selection: {
nodes
}
} as RuleContext;
};
it('should return false when node is not rma system container', () => {
expect(isRmaSystemContainer(prepareRuleContext('rma:filePlan'))).toBeFalse();
});
it('should return true when node is rma system container', () => {
expect(isRmaSystemContainer(prepareRuleContext('rma:holdContainer'))).toBeTrue();
expect(isRmaSystemContainer(prepareRuleContext('rma:transferContainer'))).toBeTrue();
expect(isRmaSystemContainer(prepareRuleContext('rma:unfiledRecordContainer'))).toBeTrue();
});
it('should return true when at least one selected node is an rma system container', () => {
expect(isRmaSystemContainer(prepareRuleContext(['cm:folder', 'rma:transferContainer']))).toBeTrue();
});
});
}); });
function createTestContext(): TestRuleContext { function createTestContext(): TestRuleContext {
+11 -2
View File
@@ -27,6 +27,7 @@ import { RuleContext } from '@alfresco/adf-extensions';
import * as navigation from './navigation.rules'; import * as navigation from './navigation.rules';
import * as repository from './repository.rules'; import * as repository from './repository.rules';
import { isAdmin } from './user.rules'; import { isAdmin } from './user.rules';
import { isRmaRestrictedCreateFolder, isRmaSystemFolder } from '@alfresco/aca-shared';
/* cspell:disable */ /* cspell:disable */
export const supportedExtensions = { export const supportedExtensions = {
@@ -197,7 +198,7 @@ export function canCreateFolder(context: AcaRuleContext): boolean {
const { currentFolder } = context.navigation; const { currentFolder } = context.navigation;
if (currentFolder) { if (currentFolder) {
return context.permissions.check(currentFolder, ['create']); return context.permissions.check(currentFolder, ['create']) && !isRmaRestrictedCreateFolder(currentFolder);
} }
} }
return false; return false;
@@ -364,7 +365,7 @@ export function canUploadVersion(context: RuleContext): boolean {
export const canPrintFile = (context: RuleContext): boolean => { export const canPrintFile = (context: RuleContext): boolean => {
const nodeEntry = context.selection.file.entry; const nodeEntry = context.selection.file.entry;
const mediaMimeTypes = ['video/mp4', 'video/webm', 'video/ogg', 'audio/mpeg', 'audio/mp3', 'audio/ogg', 'audio/wav']; const mediaMimeTypes = ['video/mp4', 'video/webm', 'video/ogg', 'audio/mpeg', 'audio/mp3', 'audio/ogg', 'audio/wav'];
return !mediaMimeTypes.includes(nodeEntry.content.mimeType); return !mediaMimeTypes.includes(nodeEntry.content?.mimeType);
}; };
/** /**
@@ -512,6 +513,14 @@ export function createVersionRule(minimalVersion: string): (context: RuleContext
}; };
} }
/**
* Checks if the folder is a Records Management site's system folder
* JSON ref: `app.selection.isRmaSystemContainer`
*/
export const isRmaSystemContainer = (context: RuleContext): boolean => {
return context.selection.nodes.some((node) => isRmaSystemFolder(node.entry));
};
function isVersionCompatible(currentVersion: string, minimalVersion: string): boolean { function isVersionCompatible(currentVersion: string, minimalVersion: string): boolean {
if (!currentVersion || !minimalVersion) { if (!currentVersion || !minimalVersion) {
return false; return false;