Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ci: disposing unit should not emit error #2529

Merged
merged 13 commits into from
Jun 15, 2024
Prev Previous commit
Next Next commit
fix: change logic of permission menu
  • Loading branch information
ybzky committed Jun 15, 2024
commit 1d8ef9f08d656edf43e9643e6c359a0d40187b7e
214 changes: 73 additions & 141 deletions packages/sheets-ui/src/controllers/menu/menu-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,137 +51,65 @@ export function getCurrentRangeDisable$(accessor: IAccessor, permissionTypes: IP
const selectionManagerService = accessor.get(SelectionManagerService);
const rangeProtectionRuleModel = accessor.get(RangeProtectionRuleModel);
const worksheetRuleModel = accessor.get(WorksheetProtectionRuleModel);
const workbook = univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!;
const workbook$ = univerInstanceService.getCurrentTypeOfUnit$<Workbook>(UniverInstanceType.UNIVER_SHEET);
const userManagerService = accessor.get(UserManagerService);
const contextService = accessor.get(IContextService);
const focusedOnDrawing$ = contextService.subscribeContextValue$(FOCUSING_COMMON_DRAWINGS).pipe(startWith(false));
if (!workbook) {
return of(true);
}

return combineLatest([userManagerService.currentUser$, workbook.activeSheet$, selectionManagerService.selectionMoveEnd$, focusedOnDrawing$]).pipe(
switchMap(([_, __, selection, focusOnDrawings]) => {
if (focusOnDrawings) {
return combineLatest([userManagerService.currentUser$, workbook$, selectionManagerService.selectionMoveEnd$, focusedOnDrawing$]).pipe(
switchMap(([_, workbook, selection, focusOnDrawings]) => {
if (focusOnDrawings || !workbook) {
return of(true);
}

const worksheet = workbook.getActiveSheet();
if (!worksheet) {
return of(true);
}

const unitId = workbook.getUnitId();
const subUnitId = worksheet.getSheetId();

const permissionService = accessor.get(IPermissionService);

const { workbookTypes = [WorkbookEditablePermission], worksheetTypes, rangeTypes } = permissionTypes;

const permissionIds: string[] = [];

workbookTypes?.forEach((F) => {
permissionIds.push(new F(unitId).id);
});

worksheetTypes?.forEach((F) => {
permissionIds.push(new F(unitId, subUnitId).id);
});

const worksheetRule = worksheetRuleModel.getRule(unitId, subUnitId);

if (worksheetRule) {
return permissionService.composePermission$(permissionIds).pipe(map((list) => {
return list.some((item) => item.value === false);
}));
}

const selectionRanges = selection?.map((selection) => selection.range);
const rules = rangeProtectionRuleModel.getSubunitRuleList(unitId, subUnitId).filter((rule) => {
return selectionRanges?.some((range) => {
return rule.ranges.some((ruleRange) => Rectangle.intersects(range, ruleRange));
});
});

rangeTypes?.forEach((F) => {
rules.forEach((rule) => {
permissionIds.push(new F(unitId, subUnitId, rule.permissionId).id);
});
});

return permissionService.composePermission$(permissionIds).pipe(map((list) => {
return list.some((item) => item.value === false);
}));
})
);
}

export function getCommentDisable$(accessor: IAccessor, permissionTypes: IPermissionTypes = {}) {
const univerInstanceService = accessor.get(IUniverInstanceService);
const selectionManagerService = accessor.get(SelectionManagerService);
const rangeProtectionRuleModel = accessor.get(RangeProtectionRuleModel);
const worksheetRuleModel = accessor.get(WorksheetProtectionRuleModel);
const userManagerService = accessor.get(UserManagerService);

const contextService = accessor.get(IContextService);
const focusedOnDrawing$ = contextService.subscribeContextValue$(FOCUSING_COMMON_DRAWINGS);

return combineLatest([userManagerService.currentUser$, selectionManagerService.selectionMoveEnd$, focusedOnDrawing$]).pipe(
switchMap(([_, __, focusOnDrawing]) => {
const workbook = univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET);
if (!workbook) {
return of(true);
}

if (focusOnDrawing) {
return of(true);
}

const worksheet = workbook.getActiveSheet();
if (!worksheet) {
return of(true);
}

const unitId = workbook.getUnitId();
const subUnitId = worksheet.getSheetId();

const permissionService = accessor.get(IPermissionService);

const { workbookTypes = [WorkbookEditablePermission], worksheetTypes, rangeTypes } = permissionTypes;
return workbook.activeSheet$.pipe(
switchMap((worksheet) => {
if (!worksheet) {
return of(true);
}
const unitId = workbook.getUnitId();
const subUnitId = worksheet.getSheetId();

const permissionIds: string[] = [];
const permissionService = accessor.get(IPermissionService);

workbookTypes?.forEach((F) => {
permissionIds.push(new F(unitId).id);
});
const { workbookTypes = [WorkbookEditablePermission], worksheetTypes, rangeTypes } = permissionTypes;

worksheetTypes?.forEach((F) => {
permissionIds.push(new F(unitId, subUnitId).id);
});
const permissionIds: string[] = [];

const worksheetRule = worksheetRuleModel.getRule(unitId, subUnitId);
workbookTypes?.forEach((F) => {
permissionIds.push(new F(unitId).id);
});

if (worksheetRule) {
return permissionService.composePermission$(permissionIds).pipe(map((list) => {
return list.some((item) => item.value === false);
}));
}
worksheetTypes?.forEach((F) => {
permissionIds.push(new F(unitId, subUnitId).id);
});

const selectionRanges = selectionManagerService.getSelections()?.map((selection) => selection.range);
const rules = rangeProtectionRuleModel.getSubunitRuleList(unitId, subUnitId).filter((rule) => {
return selectionRanges?.some((range) => {
return rule.ranges.some((ruleRange) => Rectangle.intersects(range, ruleRange));
});
});
const worksheetRule = worksheetRuleModel.getRule(unitId, subUnitId);

rangeTypes?.forEach((F) => {
rules.forEach((rule) => {
permissionIds.push(new F(unitId, subUnitId, rule.permissionId).id);
});
});
if (worksheetRule) {
return permissionService.composePermission$(permissionIds).pipe(map((list) => {
return list.some((item) => item.value === false);
}));
}

return permissionService.composePermission$(permissionIds).pipe(map((list) => {
return list.some((item) => item.value === false);
}));
const selectionRanges = selection?.map((selection) => selection.range);
const rules = rangeProtectionRuleModel.getSubunitRuleList(unitId, subUnitId).filter((rule) => {
return selectionRanges?.some((range) => {
return rule.ranges.some((ruleRange) => Rectangle.intersects(range, ruleRange));
});
});

rangeTypes?.forEach((F) => {
rules.forEach((rule) => {
permissionIds.push(new F(unitId, subUnitId, rule.permissionId).id);
});
});

return permissionService.composePermission$(permissionIds).pipe(map((list) => {
return list.some((item) => item.value === false);
}));
})
);
})
);
}
Expand Down Expand Up @@ -416,39 +344,43 @@ export function getCellMenuHidden$(accessor: IAccessor, type: 'row' | 'col') {

export function getWorkbookPermissionDisable$(accessor: IAccessor, workbookPermissionTypes: WorkbookPermissionPointConstructor[]) {
const univerInstanceService = accessor.get(IUniverInstanceService);
const workbook = univerInstanceService.getCurrentUnitForType<Workbook>(UniverInstanceType.UNIVER_SHEET)!;
const workbook$ = univerInstanceService.getCurrentTypeOfUnit$<Workbook>(UniverInstanceType.UNIVER_SHEET)!;
const worksheetRuleModel = accessor.get(WorksheetProtectionRuleModel);
const selectionRuleModel = accessor.get(RangeProtectionRuleModel);
const permissionService = accessor.get(IPermissionService);
const unitId = workbook.getUnitId();

const activeSheet$ = workbook.activeSheet$;

const userManagerService = accessor.get(UserManagerService);

return combineLatest([userManagerService.currentUser$, activeSheet$]).pipe(
switchMap(([_user, activeSheet]) => {
if (!activeSheet) {
return combineLatest([userManagerService.currentUser$, workbook$]).pipe(
switchMap(([_user, workbook]) => {
if (!workbook) {
return of(true);
}
const workbookPermissionIds: string[] = [];
workbookPermissionTypes.forEach((F) => workbookPermissionIds.push(new F(unitId).id));
const workbookPermission$ = permissionService.composePermission$(workbookPermissionIds).pipe(map((list) => list.every((item) => item.value === true)));
const workbookManageCollaboratorPermission$ = permissionService.getPermissionPoint$(new WorkbookManageCollaboratorPermission(unitId).id)?.pipe(map((permission) => permission.value)) ?? of(false);

return combineLatest([workbookPermission$, workbookManageCollaboratorPermission$]).pipe(
map(([basePermission, manageable]) => {
if (!basePermission) {
return true;
}

const subUnitId = activeSheet.getSheetId();
const worksheetRule = worksheetRuleModel.getRule(unitId, subUnitId);
const worksheetRuleList = selectionRuleModel.getSubunitRuleList(unitId, subUnitId);
if (worksheetRule || worksheetRuleList.length) {
return !manageable;
return workbook.activeSheet$.pipe(
switchMap((activeSheet) => {
if (!activeSheet) {
return of(true);
}
return false;
const unitId = workbook.getUnitId();
const workbookPermissionIds: string[] = [];
workbookPermissionTypes.forEach((F) => workbookPermissionIds.push(new F(unitId).id));
const workbookPermission$ = permissionService.composePermission$(workbookPermissionIds).pipe(map((list) => list.every((item) => item.value === true)));
const workbookManageCollaboratorPermission$ = permissionService.getPermissionPoint$(new WorkbookManageCollaboratorPermission(unitId).id)?.pipe(map((permission) => permission.value)) ?? of(false);

return combineLatest([workbookPermission$, workbookManageCollaboratorPermission$]).pipe(
map(([basePermission, manageable]) => {
if (!basePermission) {
return true;
}

const subUnitId = activeSheet.getSheetId();
const worksheetRule = worksheetRuleModel.getRule(unitId, subUnitId);
const worksheetRuleList = selectionRuleModel.getSubunitRuleList(unitId, subUnitId);
if (worksheetRule || worksheetRuleList.length) {
return !manageable;
}
return false;
})
);
})
);
})
Expand Down
Loading