diff --git a/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts-snapshots/default-doc-ci-chromium-linux.png b/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts-snapshots/default-doc-ci-chromium-linux.png
index 067d380974..18246e6b03 100644
Binary files a/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts-snapshots/default-doc-ci-chromium-linux.png and b/e2e/visual-comparison/docs/docs-visual-comparison.spec.ts-snapshots/default-doc-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-current-worksheet-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-current-worksheet-ci-chromium-linux.png
index 22cdc3f390..6cc852d87f 100644
Binary files a/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-current-worksheet-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-current-worksheet-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-other-worksheet-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-other-worksheet-ci-chromium-linux.png
index 18d58660f3..58232a98ad 100644
Binary files a/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-other-worksheet-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-filter-row-other-worksheet-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-hide-row-current-worksheet-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-hide-row-current-worksheet-ci-chromium-linux.png
index 9a0bde2c35..621567705c 100644
Binary files a/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-hide-row-current-worksheet-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-formula-related.spec.ts-snapshots/formula-hide-row-current-worksheet-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-gridlines.spec.ts-snapshots/sheets-no-gridlines-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-gridlines.spec.ts-snapshots/sheets-no-gridlines-ci-chromium-linux.png
index 30cceb1094..7701bd6e19 100644
Binary files a/e2e/visual-comparison/sheets/sheets-gridlines.spec.ts-snapshots/sheets-no-gridlines-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-gridlines.spec.ts-snapshots/sheets-no-gridlines-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/mergedCellsRenderingScrolling-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/mergedCellsRenderingScrolling-ci-chromium-linux.png
index 3a6ccc7511..229a0483f6 100644
Binary files a/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/mergedCellsRenderingScrolling-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/mergedCellsRenderingScrolling-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/renderingAfterScrollByAPI-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/renderingAfterScrollByAPI-ci-chromium-linux.png
index 264263698f..3c02c03cd1 100644
Binary files a/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/renderingAfterScrollByAPI-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-scroll.spec.ts-snapshots/renderingAfterScrollByAPI-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-switching-render-unit.spec.ts-snapshots/switching-render-unit-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-switching-render-unit.spec.ts-snapshots/switching-render-unit-ci-chromium-linux.png
index a5f6791490..a1ce64a557 100644
Binary files a/e2e/visual-comparison/sheets/sheets-switching-render-unit.spec.ts-snapshots/switching-render-unit-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-switching-render-unit.spec.ts-snapshots/switching-render-unit-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/dark-mode-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/dark-mode-ci-chromium-linux.png
index b4db561d1d..2114ff10bd 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/dark-mode-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/dark-mode-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png
index 0a35162d3e..53970b784e 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-fullpage-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-fullpage-ci-chromium-linux.png
index 8aef79e987..5a5e8c93ed 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-fullpage-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/default-sheet-fullpage-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/defaultstyle-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/defaultstyle-ci-chromium-linux.png
index 603fe0b550..b4ffab4fd3 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/defaultstyle-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/defaultstyle-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png
index 400130ef1b..07a11192b9 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/demo-sheet-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/facade-sheet-hooks-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/facade-sheet-hooks-ci-chromium-linux.png
index bd02e6fa2e..6c0c429b65 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/facade-sheet-hooks-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/facade-sheet-hooks-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/mergedCellsRendering-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/mergedCellsRendering-ci-chromium-linux.png
index 3a6ccc7511..229a0483f6 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/mergedCellsRendering-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/mergedCellsRendering-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-force-string-cell-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-force-string-cell-ci-chromium-linux.png
index 429a7db7d0..87d94ee824 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-force-string-cell-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-force-string-cell-ci-chromium-linux.png differ
diff --git a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-text-format-number-cell-ci-chromium-linux.png b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-text-format-number-cell-ci-chromium-linux.png
index 21692c332a..cc409e7b09 100644
Binary files a/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-text-format-number-cell-ci-chromium-linux.png and b/e2e/visual-comparison/sheets/sheets-visual-comparison.spec.ts-snapshots/set-text-format-number-cell-ci-chromium-linux.png differ
diff --git a/examples/src/sheets/custom-menu/controllers/custom-menu.controller.ts b/examples/src/sheets/custom-menu/controllers/custom-menu.controller.ts
index 6bf4a08838..74b53a12e0 100644
--- a/examples/src/sheets/custom-menu/controllers/custom-menu.controller.ts
+++ b/examples/src/sheets/custom-menu/controllers/custom-menu.controller.ts
@@ -16,7 +16,7 @@
import { Disposable, ICommandService, Inject, Injector } from '@univerjs/core';
import { AiSingle, BarChartSingle, CommentSingle } from '@univerjs/icons';
-import { ComponentManager, ContextMenuGroup, ContextMenuPosition, IMenuManagerService, MenuItemType, RibbonStartGroup } from '@univerjs/ui';
+import { ComponentManager, ContextMenuGroup, ContextMenuPosition, IMenuManagerService, MenuItemType, RibbonOthersGroup } from '@univerjs/ui';
import { DropdownListFirstItemOperation, DropdownListSecondItemOperation } from '../commands/operations/dropdown-list.operation';
import { SingleButtonOperation } from '../commands/operations/single-button.operation';
import { CUSTOM_MENU_DROPDOWN_LIST_OPERATION_ID, CustomMenuItemDropdownListFirstItemFactory, CustomMenuItemDropdownListMainButtonFactory, CustomMenuItemDropdownListSecondItemFactory } from './menu/dropdown-list.menu';
@@ -74,7 +74,7 @@ export class CustomMenuController extends Disposable {
},
}));
this._menuManagerService.mergeMenu({
- [RibbonStartGroup.OTHERS]: {
+ [RibbonOthersGroup.OTHERS]: {
[SingleButtonOperation.id]: {
order: 9999,
menuItemFactory: CustomMenuItemSingleButtonFactory,
diff --git a/examples/src/sheets/custom-plugin/import-csv-button.ts b/examples/src/sheets/custom-plugin/import-csv-button.ts
index 45297c3514..80c5c8f068 100644
--- a/examples/src/sheets/custom-plugin/import-csv-button.ts
+++ b/examples/src/sheets/custom-plugin/import-csv-button.ts
@@ -41,7 +41,7 @@ import {
ComponentManager,
IMenuManagerService,
MenuItemType,
- RibbonStartGroup,
+ RibbonOthersGroup,
} from '@univerjs/ui';
/**
@@ -210,7 +210,7 @@ class ImportCSVButtonPlugin extends Plugin {
});
this.menuManagerService.mergeMenu({
- [RibbonStartGroup.OTHERS]: {
+ [RibbonOthersGroup.OTHERS]: {
[buttonId]: {
order: 10,
menuItemFactory,
diff --git a/package.json b/package.json
index 06b1dbbea7..d810e695cb 100644
--- a/package.json
+++ b/package.json
@@ -56,7 +56,7 @@
"@types/fs-extra": "^11.0.4",
"@types/node": "^22.15.17",
"@types/react": "^19.1.4",
- "@types/react-dom": "^19.1.4",
+ "@types/react-dom": "^19.1.5",
"@univerjs-infra/shared": "workspace:*",
"@univerjs/design": "workspace:*",
"@vitejs/plugin-react": "^4.4.1",
@@ -89,7 +89,7 @@
},
"resolutions": {
"@types/react": "^19.1.3",
- "@types/react-dom": "^19.1.4",
+ "@types/react-dom": "^19.1.5",
"react": "^19.1.0",
"react-dom": "^19.1.0"
},
diff --git a/packages-experimental/debugger/src/controllers/menu.ts b/packages-experimental/debugger/src/controllers/menu.ts
index cf93c7e795..8fc9a3d352 100644
--- a/packages-experimental/debugger/src/controllers/menu.ts
+++ b/packages-experimental/debugger/src/controllers/menu.ts
@@ -99,11 +99,11 @@ export function ThemeMenuItemFactory(): IMenuSelectorItem {
type: MenuItemType.SELECTOR,
selections: [
{
- label: 'green',
+ label: '🟢',
value: greenTheme as any,
},
{
- label: 'default',
+ label: '🔵',
value: defaultTheme as any,
},
],
diff --git a/packages-experimental/debugger/src/controllers/multi-units/multi-units.menu.ts b/packages-experimental/debugger/src/controllers/multi-units/multi-units.menu.ts
index 255220cbea..89b04f8dcf 100644
--- a/packages-experimental/debugger/src/controllers/multi-units/multi-units.menu.ts
+++ b/packages-experimental/debugger/src/controllers/multi-units/multi-units.menu.ts
@@ -17,7 +17,7 @@
import type { IAccessor, IOperation, Workbook } from '@univerjs/core';
import type { IMenuSelectorItem, IValueOption, MenuSchemaType } from '@univerjs/ui';
import { CommandType, IUniverInstanceService, UniverInstanceType } from '@univerjs/core';
-import { MenuItemType, RibbonStartGroup } from '@univerjs/ui';
+import { MenuItemType, RibbonOthersGroup } from '@univerjs/ui';
import { merge, Observable, shareReplay } from 'rxjs';
export const SwitchUnitOperation: IOperation<{ value: string }> = {
@@ -53,7 +53,7 @@ function SwitchUnitMenuFactory(accessor: IAccessor): IMenuSelectorItem {
}
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.OTHERS]: {
+ [RibbonOthersGroup.OTHERS]: {
[SwitchUnitOperation.id]: {
order: 999,
menuItemFactory: SwitchUnitMenuFactory,
diff --git a/packages/action-recorder/src/controllers/action-recorder.menu.ts b/packages/action-recorder/src/controllers/action-recorder.menu.ts
index 3efacf0605..e1a7bc802d 100644
--- a/packages/action-recorder/src/controllers/action-recorder.menu.ts
+++ b/packages/action-recorder/src/controllers/action-recorder.menu.ts
@@ -69,7 +69,7 @@ export function ReplayLocalRecordOnActiveMenuItemFactory(): IMenuButtonItem {
export const menuSchema: MenuSchemaType = {
[RibbonStartGroup.OTHERS]: {
[RECORD_MENU_ITEM_ID]: {
- order: 10,
+ order: 2,
menuItemFactory: RecordMenuItemFactory,
[OpenRecordPanelOperation.id]: {
order: 1,
diff --git a/packages/design/src/helper/class-utilities.ts b/packages/design/src/helper/class-utilities.ts
index 089dd91039..1b78b104ad 100644
--- a/packages/design/src/helper/class-utilities.ts
+++ b/packages/design/src/helper/class-utilities.ts
@@ -26,3 +26,4 @@ export const borderTopClassName = clsx(borderBasicClassName, 'univer-border-t un
export const borderBottomClassName = clsx(borderBasicClassName, 'univer-border-b univer-border-0');
export const borderRightClassName = clsx(borderBasicClassName, 'univer-border-r univer-border-0');
export const divideYClassName = 'univer-divide-gray-200 dark:univer-divide-gray-600 univer-divide-y univer-divide-x-0 univer-divide-solid';
+export const divideXClassName = 'univer-divide-gray-200 dark:univer-divide-gray-600 univer-divide-x univer-divide-y-0 univer-divide-solid';
diff --git a/packages/design/src/index.ts b/packages/design/src/index.ts
index dc147bc43b..e22cf5f23b 100644
--- a/packages/design/src/index.ts
+++ b/packages/design/src/index.ts
@@ -69,6 +69,7 @@ export {
borderLeftClassName,
borderRightClassName,
borderTopClassName,
+ divideXClassName,
divideYClassName,
scrollbarClassName,
} from './helper/class-utilities';
diff --git a/packages/docs-drawing-ui/src/controllers/menu.schema.ts b/packages/docs-drawing-ui/src/controllers/menu.schema.ts
index 34194d5104..e0bd4d559e 100644
--- a/packages/docs-drawing-ui/src/controllers/menu.schema.ts
+++ b/packages/docs-drawing-ui/src/controllers/menu.schema.ts
@@ -15,7 +15,7 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonInsertGroup } from '@univerjs/ui';
import {
DOCS_IMAGE_MENU_ID,
IMAGE_MENU_UPLOAD_FLOAT_ID,
@@ -24,7 +24,7 @@ import {
} from '../views/menu/image.menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.LAYOUT]: {
+ [RibbonInsertGroup.MEDIA]: {
[DOCS_IMAGE_MENU_ID]: {
order: 0,
menuItemFactory: ImageMenuFactory,
diff --git a/packages/docs-hyper-link-ui/src/controllers/menu.schema.ts b/packages/docs-hyper-link-ui/src/controllers/menu.schema.ts
index 22eba71c27..3091de80ab 100644
--- a/packages/docs-hyper-link-ui/src/controllers/menu.schema.ts
+++ b/packages/docs-hyper-link-ui/src/controllers/menu.schema.ts
@@ -15,14 +15,14 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonInsertGroup } from '@univerjs/ui';
import { ShowDocHyperLinkEditPopupOperation } from '../commands/operations/popup.operation';
import { AddHyperLinkMenuItemFactory } from './menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.OTHERS]: {
+ [RibbonInsertGroup.MEDIA]: {
[ShowDocHyperLinkEditPopupOperation.id]: {
- order: 0,
+ order: 1,
menuItemFactory: AddHyperLinkMenuItemFactory,
},
},
diff --git a/packages/docs-thread-comment-ui/src/controllers/menu.schema.ts b/packages/docs-thread-comment-ui/src/controllers/menu.schema.ts
index b8ebeb011b..5493514180 100644
--- a/packages/docs-thread-comment-ui/src/controllers/menu.schema.ts
+++ b/packages/docs-thread-comment-ui/src/controllers/menu.schema.ts
@@ -15,7 +15,7 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonInsertGroup } from '@univerjs/ui';
import {
StartAddCommentOperation,
ToggleCommentPanelOperation,
@@ -23,9 +23,9 @@ import {
import { AddDocCommentMenuItemFactory, ToolbarDocCommentMenuItemFactory } from './menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.OTHERS]: {
+ [RibbonInsertGroup.MEDIA]: {
[ToggleCommentPanelOperation.id]: {
- order: 1,
+ order: 3,
menuItemFactory: ToolbarDocCommentMenuItemFactory,
},
},
diff --git a/packages/docs-ui/package.json b/packages/docs-ui/package.json
index a8a76a16c3..daac3e27a4 100644
--- a/packages/docs-ui/package.json
+++ b/packages/docs-ui/package.json
@@ -91,7 +91,7 @@
"@univerjs-infra/shared": "workspace:*",
"@univerjs/docs-drawing": "workspace:*",
"jest-canvas-mock": "^2.5.2",
- "jsdom": "^24.1.1",
+ "jsdom": "^26.1.0",
"postcss": "^8.5.3",
"react": "18.3.1",
"rxjs": "^7.8.2",
diff --git a/packages/docs-ui/src/controllers/menu.schema.ts b/packages/docs-ui/src/controllers/menu.schema.ts
index 2c24d06635..04f32baacb 100644
--- a/packages/docs-ui/src/controllers/menu.schema.ts
+++ b/packages/docs-ui/src/controllers/menu.schema.ts
@@ -15,7 +15,7 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonInsertGroup, RibbonStartGroup } from '@univerjs/ui';
import { DocCopyCommand, DocCopyCurrentParagraphCommand, DocCutCommand, DocCutCurrentParagraphCommand, DocPasteCommand } from '../commands/commands/clipboard.command';
import { DeleteCurrentParagraphCommand, DeleteLeftCommand } from '../commands/commands/doc-delete.command';
import { OpenHeaderFooterPanelCommand } from '../commands/commands/doc-header-footer.command';
@@ -131,14 +131,6 @@ export const menuSchema: MenuSchemaType = {
},
},
[RibbonStartGroup.LAYOUT]: {
- [TABLE_MENU_ID]: {
- order: 1,
- menuItemFactory: TableMenuFactory,
- [DocCreateTableOperation.id]: {
- order: 0,
- menuItemFactory: InsertTableMenuFactory,
- },
- },
[AlignLeftCommand.id]: {
order: 2,
menuItemFactory: AlignLeftMenuItemFactory,
@@ -184,6 +176,16 @@ export const menuSchema: MenuSchemaType = {
menuItemFactory: PageSettingMenuItemFactory,
},
},
+ [RibbonInsertGroup.MEDIA]: {
+ [TABLE_MENU_ID]: {
+ order: 2,
+ menuItemFactory: TableMenuFactory,
+ [DocCreateTableOperation.id]: {
+ order: 0,
+ menuItemFactory: InsertTableMenuFactory,
+ },
+ },
+ },
[ContextMenuPosition.MAIN_AREA]: {
[ContextMenuGroup.FORMAT]: {
[DocCopyCommand.name]: {
diff --git a/packages/docs-ui/src/views/doc-footer/DocFooter.tsx b/packages/docs-ui/src/views/doc-footer/DocFooter.tsx
index f72aa73aa8..5b3579535e 100644
--- a/packages/docs-ui/src/views/doc-footer/DocFooter.tsx
+++ b/packages/docs-ui/src/views/doc-footer/DocFooter.tsx
@@ -30,7 +30,11 @@ export function DocFooter() {
return workbook
? null
: isShow && (
-
+
diff --git a/packages/find-replace/src/controllers/menu.schema.ts b/packages/find-replace/src/controllers/menu.schema.ts
index b1b968aba1..e9a7152248 100644
--- a/packages/find-replace/src/controllers/menu.schema.ts
+++ b/packages/find-replace/src/controllers/menu.schema.ts
@@ -15,12 +15,12 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonDataGroup } from '@univerjs/ui';
import { OpenFindDialogOperation } from '../commands/operations/find-replace.operation';
import { FindReplaceMenuItemFactory } from './find-replace.menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.OTHERS]: {
+ [RibbonDataGroup.ORGANIZATION]: {
[OpenFindDialogOperation.id]: {
order: 2,
menuItemFactory: FindReplaceMenuItemFactory,
diff --git a/packages/sheets-conditional-formatting-ui/src/controllers/menu.schema.ts b/packages/sheets-conditional-formatting-ui/src/controllers/menu.schema.ts
index f35665f276..ac95d8f073 100644
--- a/packages/sheets-conditional-formatting-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-conditional-formatting-ui/src/controllers/menu.schema.ts
@@ -15,14 +15,14 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonDataGroup } from '@univerjs/ui';
import { OpenConditionalFormattingOperator } from '../commands/operations/open-conditional-formatting-panel';
import { FactoryManageConditionalFormattingRule } from '../menu/manage-rule';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_INSERT]: {
+ [RibbonDataGroup.RULES]: {
[OpenConditionalFormattingOperator.id]: {
- order: 0,
+ order: 1,
menuItemFactory: FactoryManageConditionalFormattingRule,
},
},
diff --git a/packages/sheets-data-validation-ui/src/controllers/menu.schema.ts b/packages/sheets-data-validation-ui/src/controllers/menu.schema.ts
index caed46bbaf..f6bc0033aa 100644
--- a/packages/sheets-data-validation-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-data-validation-ui/src/controllers/menu.schema.ts
@@ -15,7 +15,7 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonDataGroup } from '@univerjs/ui';
import { AddSheetDataValidationAndOpenCommand } from '../commands/commands/data-validation-ui.command';
import { OpenValidationPanelOperation } from '../commands/operations/data-validation.operation';
import {
@@ -26,9 +26,9 @@ import {
} from './dv.menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_INSERT]: {
+ [RibbonDataGroup.RULES]: {
[DATA_VALIDATION_MENU_ID]: {
- order: 9,
+ order: 0,
menuItemFactory: dataValidationMenuFactory,
[OpenValidationPanelOperation.id]: {
order: 0,
diff --git a/packages/sheets-drawing-ui/src/controllers/menu.schema.ts b/packages/sheets-drawing-ui/src/controllers/menu.schema.ts
index cc9d3562f6..0cb5885bff 100644
--- a/packages/sheets-drawing-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-drawing-ui/src/controllers/menu.schema.ts
@@ -15,14 +15,14 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonInsertGroup } from '@univerjs/ui';
import { InsertCellImageCommand, InsertFloatImageCommand } from '../commands/commands/insert-image.command';
import { ImageMenuFactory, SHEETS_IMAGE_MENU_ID, UploadCellImageMenuFactory, UploadFloatImageMenuFactory } from '../views/menu/image.menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_INSERT]: {
+ [RibbonInsertGroup.MEDIA]: {
[SHEETS_IMAGE_MENU_ID]: {
- order: 3,
+ order: 0,
menuItemFactory: ImageMenuFactory,
[InsertFloatImageCommand.id]: {
order: 0,
diff --git a/packages/sheets-filter-ui/src/controllers/menu.schema.ts b/packages/sheets-filter-ui/src/controllers/menu.schema.ts
index 7ac22a26d7..ae75291aa0 100644
--- a/packages/sheets-filter-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-filter-ui/src/controllers/menu.schema.ts
@@ -20,7 +20,7 @@ import {
ReCalcSheetsFilterCommand,
SmartToggleSheetsFilterCommand,
} from '@univerjs/sheets-filter';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonDataGroup } from '@univerjs/ui';
import {
ClearFilterCriteriaMenuItemFactory,
ReCalcFilterMenuItemFactory,
@@ -28,9 +28,9 @@ import {
} from './sheets-filter.menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_INSERT]: {
+ [RibbonDataGroup.ORGANIZATION]: {
[SmartToggleSheetsFilterCommand.id]: {
- order: 10,
+ order: 2,
menuItemFactory: SmartToggleFilterMenuItemFactory,
[ClearSheetsFilterCriteriaCommand.id]: {
order: 0,
diff --git a/packages/sheets-formula-ui/src/controllers/menu.schema.ts b/packages/sheets-formula-ui/src/controllers/menu.schema.ts
index b15e2b3d69..e8894348fc 100644
--- a/packages/sheets-formula-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-formula-ui/src/controllers/menu.schema.ts
@@ -16,22 +16,45 @@
import type { MenuSchemaType } from '@univerjs/ui';
import { PASTE_SPECIAL_MENU_ID } from '@univerjs/sheets-ui';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonFormulasGroup } from '@univerjs/ui';
import { SheetOnlyPasteFormulaCommand } from '../commands/commands/formula-clipboard.command';
import { InsertFunctionOperation } from '../commands/operations/insert-function.operation';
-import { MoreFunctionsOperation } from '../commands/operations/more-functions.operation';
-import { InsertFunctionMenuItemFactory, MoreFunctionsMenuItemFactory, PasteFormulaMenuItemFactory } from './menu';
+import {
+ InsertAVERAGEFunctionMenuItemFactory,
+ InsertCOUNTFunctionMenuItemFactory,
+ InsertMAXFunctionMenuItemFactory,
+ InsertMINFunctionMenuItemFactory,
+ InsertSUMFunctionMenuItemFactory,
+ MoreFunctionsMenuItemFactory,
+ PasteFormulaMenuItemFactory,
+} from './menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_INSERT]: {
- [InsertFunctionOperation.id]: {
- order: 1,
- menuItemFactory: InsertFunctionMenuItemFactory,
- [MoreFunctionsOperation.id]: {
- order: 1,
- menuItemFactory: MoreFunctionsMenuItemFactory,
- },
+ [RibbonFormulasGroup.BASIC]: {
+ [`${InsertFunctionOperation.id}.sum`]: {
+ order: 0,
+ menuItemFactory: InsertSUMFunctionMenuItemFactory,
},
+ [`${InsertFunctionOperation.id}.count`]: {
+ order: 0,
+ menuItemFactory: InsertCOUNTFunctionMenuItemFactory,
+ },
+ [`${InsertFunctionOperation.id}.average`]: {
+ order: 0,
+ menuItemFactory: InsertAVERAGEFunctionMenuItemFactory,
+ },
+ [`${InsertFunctionOperation.id}.max`]: {
+ order: 0,
+ menuItemFactory: InsertMAXFunctionMenuItemFactory,
+ },
+ [`${InsertFunctionOperation.id}.min`]: {
+ order: 0,
+ menuItemFactory: InsertMINFunctionMenuItemFactory,
+ },
+ },
+ [RibbonFormulasGroup.OTHERS]: {
+ order: 0,
+ menuItemFactory: MoreFunctionsMenuItemFactory,
},
[PASTE_SPECIAL_MENU_ID]: {
[SheetOnlyPasteFormulaCommand.id]: {
diff --git a/packages/sheets-formula-ui/src/controllers/menu.ts b/packages/sheets-formula-ui/src/controllers/menu.ts
index 980cb2807c..8a5551701c 100644
--- a/packages/sheets-formula-ui/src/controllers/menu.ts
+++ b/packages/sheets-formula-ui/src/controllers/menu.ts
@@ -20,12 +20,12 @@ import { IUniverInstanceService, UniverInstanceType } from '@univerjs/core';
import { RangeProtectionPermissionEditPoint, WorkbookEditablePermission, WorksheetEditPermission, WorksheetSetCellValuePermission } from '@univerjs/sheets';
import { getCurrentRangeDisable$ } from '@univerjs/sheets-ui';
import { getMenuHiddenObservable, IClipboardInterfaceService, MenuItemType } from '@univerjs/ui';
-
import { combineLatestWith, map, Observable, of, switchMap } from 'rxjs';
import { SheetOnlyPasteFormulaCommand } from '../commands/commands/formula-clipboard.command';
import { InsertFunctionOperation } from '../commands/operations/insert-function.operation';
import { MoreFunctionsOperation } from '../commands/operations/more-functions.operation';
+/** @deprecated */
export function InsertFunctionMenuItemFactory(accessor: IAccessor): IMenuItem {
return {
id: InsertFunctionOperation.id,
@@ -79,11 +79,113 @@ export function InsertFunctionMenuItemFactory(accessor: IAccessor): IMenuItem {
};
}
+// SUM
+export function InsertSUMFunctionMenuItemFactory(accessor: IAccessor): IMenuItem {
+ return {
+ id: InsertFunctionOperation.id,
+ title: 'SUM',
+ icon: 'SumSingle',
+ type: MenuItemType.BUTTON,
+ params: {
+ value: 'SUM',
+ },
+ hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
+ };
+}
+
+// COUNT
+export function InsertCOUNTFunctionMenuItemFactory(accessor: IAccessor): IMenuItem {
+ return {
+ id: InsertFunctionOperation.id,
+ title: 'COUNT',
+ icon: 'CntSingle',
+ type: MenuItemType.BUTTON,
+ params: {
+ value: 'COUNT',
+ },
+ hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
+ };
+}
+
+// AVERAGE
+export function InsertAVERAGEFunctionMenuItemFactory(accessor: IAccessor): IMenuItem {
+ return {
+ id: InsertFunctionOperation.id,
+ title: 'AVERAGE',
+ icon: 'AvgSingle',
+ type: MenuItemType.BUTTON,
+ params: {
+ value: 'AVERAGE',
+ },
+ hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
+ };
+}
+
+// MAX
+export function InsertMAXFunctionMenuItemFactory(accessor: IAccessor): IMenuItem {
+ return {
+ id: InsertFunctionOperation.id,
+ title: 'MAX',
+ icon: 'MaxSingle',
+ type: MenuItemType.BUTTON,
+ params: {
+ value: 'MAX',
+ },
+ hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
+ };
+}
+
+// MIN
+export function InsertMINFunctionMenuItemFactory(accessor: IAccessor): IMenuItem {
+ return {
+ id: InsertFunctionOperation.id,
+ title: 'MIN',
+ icon: 'MinSingle',
+ type: MenuItemType.BUTTON,
+ params: {
+ value: 'MIN',
+ },
+ hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
+ };
+}
+
+// More Functions
export function MoreFunctionsMenuItemFactory(accessor: IAccessor): IMenuItem {
return {
id: MoreFunctionsOperation.id,
title: 'formula.insert.more',
type: MenuItemType.BUTTON,
+ hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -110,7 +212,11 @@ export function PasteFormulaMenuItemFactory(accessor: IAccessor): IMenuItem {
type: MenuItemType.BUTTON,
title: 'formula.operation.pasteFormula',
disabled$: menuClipboardDisabledObservable(accessor).pipe(
- combineLatestWith(getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], rangeTypes: [RangeProtectionPermissionEditPoint], worksheetTypes: [WorksheetSetCellValuePermission, WorksheetEditPermission] })),
+ combineLatestWith(getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ worksheetTypes: [WorksheetSetCellValuePermission, WorksheetEditPermission],
+ })),
map(([d1, d2]) => d1 || d2)
),
};
diff --git a/packages/sheets-hyper-link-ui/src/controllers/menu.schema.ts b/packages/sheets-hyper-link-ui/src/controllers/menu.schema.ts
index 4720bfaa4e..8d41079187 100644
--- a/packages/sheets-hyper-link-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-hyper-link-ui/src/controllers/menu.schema.ts
@@ -15,18 +15,18 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonInsertGroup } from '@univerjs/ui';
import { InsertHyperLinkToolbarOperation } from '../commands/operations/popup.operations';
import { genZenEditorMenuId, insertLinkMenuFactory, insertLinkMenuToolbarFactory, zenEditorInsertLinkMenuFactory, zenEditorInsertLinkMenuToolbarFactory } from './menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.OTHERS]: {
+ [RibbonInsertGroup.MEDIA]: {
[InsertHyperLinkToolbarOperation.id]: {
- order: 2,
+ order: 1,
menuItemFactory: insertLinkMenuToolbarFactory,
},
[genZenEditorMenuId(InsertHyperLinkToolbarOperation.id)]: {
- order: 2,
+ order: 1,
menuItemFactory: zenEditorInsertLinkMenuToolbarFactory,
},
},
diff --git a/packages/sheets-numfmt-ui/src/controllers/menu.schema.ts b/packages/sheets-numfmt-ui/src/controllers/menu.schema.ts
index 189cb0fd98..ac95bea3bd 100644
--- a/packages/sheets-numfmt-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-numfmt-ui/src/controllers/menu.schema.ts
@@ -16,30 +16,30 @@
import type { MenuSchemaType } from '@univerjs/ui';
import { AddDecimalCommand, SetCurrencyCommand, SetPercentCommand, SubtractDecimalCommand } from '@univerjs/sheets-numfmt';
-import { RibbonStartGroup } from '@univerjs/ui';
+import { RibbonDataGroup } from '@univerjs/ui';
import { OpenNumfmtPanelOperator } from '../commands/operations/open.numfmt.panel.operation';
import { AddDecimalMenuItem, CurrencyMenuItem, FactoryOtherMenuItem, PercentMenuItem, SubtractDecimalMenuItem } from './menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_INSERT]: {
+ [RibbonDataGroup.FORMULAS]: {
[SetCurrencyCommand.id]: {
- order: 4,
+ order: 0,
menuItemFactory: CurrencyMenuItem,
},
[AddDecimalCommand.id]: {
- order: 5,
+ order: 1,
menuItemFactory: AddDecimalMenuItem,
},
[SubtractDecimalCommand.id]: {
- order: 6,
+ order: 2,
menuItemFactory: SubtractDecimalMenuItem,
},
[SetPercentCommand.id]: {
- order: 7,
+ order: 3,
menuItemFactory: PercentMenuItem,
},
[OpenNumfmtPanelOperator.id]: {
- order: 8,
+ order: 4,
menuItemFactory: FactoryOtherMenuItem,
},
},
diff --git a/packages/sheets-sort-ui/src/controllers/menu.schema.ts b/packages/sheets-sort-ui/src/controllers/menu.schema.ts
index 63e4ec2ab7..d30a221d3c 100644
--- a/packages/sheets-sort-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-sort-ui/src/controllers/menu.schema.ts
@@ -15,7 +15,7 @@
*/
import type { MenuSchemaType } from '@univerjs/ui';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonDataGroup } from '@univerjs/ui';
import {
SortRangeAscCommand,
SortRangeAscExtCommand,
@@ -46,9 +46,9 @@ import {
} from './sheets-sort.menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_INSERT]: {
+ [RibbonDataGroup.ORGANIZATION]: {
[SHEETS_SORT_MENU_ID]: {
- order: 2,
+ order: 3,
menuItemFactory: sortRangeMenuFactory,
[SortRangeAscCommand.id]: {
order: 0,
diff --git a/packages/sheets-table-ui/src/controllers/menu.schema.ts b/packages/sheets-table-ui/src/controllers/menu.schema.ts
index 6295c48088..86763fd3ad 100644
--- a/packages/sheets-table-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-table-ui/src/controllers/menu.schema.ts
@@ -16,12 +16,12 @@
import type { MenuSchemaType } from '@univerjs/ui';
import { SheetTableInsertColCommand, SheetTableInsertRowCommand, SheetTableRemoveColCommand, SheetTableRemoveRowCommand } from '@univerjs/sheets-table';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonDataGroup } from '@univerjs/ui';
import { OpenTableSelectorOperation } from '../commands/operations/open-table-selector.operation';
import { SHEET_TABLE_CONTEXT_INSERT_MENU_ID, SHEET_TABLE_CONTEXT_REMOVE_MENU_ID, SheetTableInsertColMenuFactory, SheetTableInsertContextMenuFactory, SheetTableInsertRowMenuFactory, SheetTableRemoveColMenuFactory, SheetTableRemoveContextMenuFactory, SheetTableRemoveRowMenuFactory, sheetTableToolbarInsertMenuFactory } from '../views/menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMULAS_VIEW]: {
+ [RibbonDataGroup.ORGANIZATION]: {
[OpenTableSelectorOperation.id]: {
order: 0,
menuItemFactory: sheetTableToolbarInsertMenuFactory,
diff --git a/packages/sheets-thread-comment-ui/src/controllers/menu.schema.ts b/packages/sheets-thread-comment-ui/src/controllers/menu.schema.ts
index bf8aae0ec0..567755892b 100644
--- a/packages/sheets-thread-comment-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-thread-comment-ui/src/controllers/menu.schema.ts
@@ -16,14 +16,14 @@
import type { MenuSchemaType } from '@univerjs/ui';
import { ToggleSheetCommentPanelOperation } from '@univerjs/thread-comment-ui';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonInsertGroup } from '@univerjs/ui';
import { ShowAddSheetCommentModalOperation } from '../commands/operations/comment.operation';
import { threadCommentMenuFactory, threadPanelMenuFactory } from './menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.OTHERS]: {
+ [RibbonInsertGroup.MEDIA]: {
[ToggleSheetCommentPanelOperation.id]: {
- order: 1,
+ order: 2,
menuItemFactory: threadPanelMenuFactory,
},
},
diff --git a/packages/sheets-ui/src/controllers/menu.schema.ts b/packages/sheets-ui/src/controllers/menu.schema.ts
index 46bdeadc41..9225618687 100644
--- a/packages/sheets-ui/src/controllers/menu.schema.ts
+++ b/packages/sheets-ui/src/controllers/menu.schema.ts
@@ -49,7 +49,7 @@ import {
SetWorksheetRowIsAutoHeightCommand,
ToggleGridlinesCommand,
} from '@univerjs/sheets';
-import { ContextMenuGroup, ContextMenuPosition, RibbonStartGroup } from '@univerjs/ui';
+import { ContextMenuGroup, ContextMenuPosition, RibbonPosition, RibbonStartGroup } from '@univerjs/ui';
import {
SheetCopyCommand,
// SheetCutCommand,
@@ -176,98 +176,108 @@ import {
} from './menu/sheet.menu';
export const menuSchema: MenuSchemaType = {
- [RibbonStartGroup.FORMAT]: {
- [SetOnceFormatPainterCommand.id]: {
- order: 0,
- menuItemFactory: FormatPainterMenuItemFactory,
- },
- [SetRangeBoldCommand.id]: {
- order: 1,
- menuItemFactory: BoldMenuItemFactory,
- },
- [SetRangeItalicCommand.id]: {
- order: 2,
- menuItemFactory: ItalicMenuItemFactory,
- },
- [SetRangeUnderlineCommand.id]: {
- order: 3,
- menuItemFactory: UnderlineMenuItemFactory,
- },
- [SetRangeStrickThroughCommand.id]: {
- order: 4,
- menuItemFactory: StrikeThroughMenuItemFactory,
- },
- [SetRangeFontFamilyCommand.id]: {
- order: 5,
- menuItemFactory: FontFamilySelectorMenuItemFactory,
- },
- [SetRangeFontSizeCommand.id]: {
- order: 6,
- menuItemFactory: FontSizeSelectorMenuItemFactory,
- },
- [SetRangeTextColorCommand.id]: {
- order: 7,
- menuItemFactory: TextColorSelectorMenuItemFactory,
- [ResetTextColorCommand.id]: {
- order: 0,
- menuItemFactory: ResetTextColorMenuItemFactory,
- },
- },
- [SetBackgroundColorCommand.id]: {
- order: 9,
- menuItemFactory: BackgroundColorSelectorMenuItemFactory,
- [ResetBackgroundColorCommand.id]: {
- order: 0,
- menuItemFactory: ResetBackgroundColorMenuItemFactory,
- },
- },
- [SetBorderBasicCommand.id]: {
- order: 10,
- menuItemFactory: CellBorderSelectorMenuItemFactory,
- },
- },
- [RibbonStartGroup.LAYOUT]: {
- [AddWorksheetMergeCommand.id]: {
- order: 0,
- menuItemFactory: CellMergeMenuItemFactory,
- [AddWorksheetMergeAllCommand.id]: {
- order: 0,
- menuItemFactory: CellMergeAllMenuItemFactory,
- },
- [AddWorksheetMergeVerticalCommand.id]: {
- order: 1,
- menuItemFactory: CellMergeVerticalMenuItemFactory,
- },
- [AddWorksheetMergeHorizontalCommand.id]: {
+ [RibbonPosition.START]: {
+ [RibbonStartGroup.HISTORY]: {
+ [SetOnceFormatPainterCommand.id]: {
order: 2,
- menuItemFactory: CellMergeHorizontalMenuItemFactory,
+ menuItemFactory: FormatPainterMenuItemFactory,
},
- [RemoveWorksheetMergeCommand.id]: {
+ [ClearSelectionAllCommand.id]: {
order: 3,
- menuItemFactory: CellMergeCancelMenuItemFactory,
+ menuItemFactory: ClearSelectionAllMenuItemFactory,
},
},
- [SetHorizontalTextAlignCommand.id]: {
- order: 1,
- menuItemFactory: HorizontalAlignMenuItemFactory,
+ [RibbonStartGroup.FORMAT]: {
+ [SetRangeFontFamilyCommand.id]: {
+ order: 1,
+ menuItemFactory: FontFamilySelectorMenuItemFactory,
+ },
+ [SetRangeFontSizeCommand.id]: {
+ order: 2,
+ menuItemFactory: FontSizeSelectorMenuItemFactory,
+ },
+ // TODO: fontsize +
+ // TODO: fontsize -
+ [SetRangeBoldCommand.id]: {
+ order: 5,
+ menuItemFactory: BoldMenuItemFactory,
+ },
+ [SetRangeItalicCommand.id]: {
+ order: 6,
+ menuItemFactory: ItalicMenuItemFactory,
+ },
+ [SetRangeUnderlineCommand.id]: {
+ order: 7,
+ menuItemFactory: UnderlineMenuItemFactory,
+ },
+ [SetRangeStrickThroughCommand.id]: {
+ order: 8,
+ menuItemFactory: StrikeThroughMenuItemFactory,
+ },
+ [SetRangeTextColorCommand.id]: {
+ order: 9,
+ menuItemFactory: TextColorSelectorMenuItemFactory,
+ [ResetTextColorCommand.id]: {
+ order: 0,
+ menuItemFactory: ResetTextColorMenuItemFactory,
+ },
+ },
+ [SetBackgroundColorCommand.id]: {
+ order: 10,
+ menuItemFactory: BackgroundColorSelectorMenuItemFactory,
+ [ResetBackgroundColorCommand.id]: {
+ order: 0,
+ menuItemFactory: ResetBackgroundColorMenuItemFactory,
+ },
+ },
+ [SetBorderBasicCommand.id]: {
+ order: 11,
+ menuItemFactory: CellBorderSelectorMenuItemFactory,
+ },
},
- [SetVerticalTextAlignCommand.id]: {
- order: 1,
- menuItemFactory: VerticalAlignMenuItemFactory,
+ [RibbonStartGroup.LAYOUT]: {
+ [SetHorizontalTextAlignCommand.id]: {
+ order: 0,
+ menuItemFactory: HorizontalAlignMenuItemFactory,
+ },
+ [SetVerticalTextAlignCommand.id]: {
+ order: 3,
+ menuItemFactory: VerticalAlignMenuItemFactory,
+ },
+ [SetTextWrapCommand.id]: {
+ order: 6,
+ menuItemFactory: WrapTextMenuItemFactory,
+ },
+ [SetTextRotationCommand.id]: {
+ order: 7,
+ menuItemFactory: TextRotateMenuItemFactory,
+ },
+ [AddWorksheetMergeCommand.id]: {
+ order: 8,
+ menuItemFactory: CellMergeMenuItemFactory,
+ [AddWorksheetMergeAllCommand.id]: {
+ order: 0,
+ menuItemFactory: CellMergeAllMenuItemFactory,
+ },
+ [AddWorksheetMergeVerticalCommand.id]: {
+ order: 1,
+ menuItemFactory: CellMergeVerticalMenuItemFactory,
+ },
+ [AddWorksheetMergeHorizontalCommand.id]: {
+ order: 2,
+ menuItemFactory: CellMergeHorizontalMenuItemFactory,
+ },
+ [RemoveWorksheetMergeCommand.id]: {
+ order: 3,
+ menuItemFactory: CellMergeCancelMenuItemFactory,
+ },
+ },
},
- [SetTextWrapCommand.id]: {
- order: 2,
- menuItemFactory: WrapTextMenuItemFactory,
- },
- [SetTextRotationCommand.id]: {
- order: 3,
- menuItemFactory: TextRotateMenuItemFactory,
- },
- },
- [RibbonStartGroup.OTHERS]: {
- [AddRangeProtectionFromToolbarCommand.id]: {
- order: 0,
- menuItemFactory: sheetPermissionToolbarMenuFactory,
+ [RibbonStartGroup.OTHERS]: {
+ [AddRangeProtectionFromToolbarCommand.id]: {
+ order: 0,
+ menuItemFactory: sheetPermissionToolbarMenuFactory,
+ },
},
},
[ContextMenuPosition.MAIN_AREA]: {
diff --git a/packages/sheets-ui/src/controllers/menu/clear.menu.ts b/packages/sheets-ui/src/controllers/menu/clear.menu.ts
index 80054cfe3e..5bfea07958 100644
--- a/packages/sheets-ui/src/controllers/menu/clear.menu.ts
+++ b/packages/sheets-ui/src/controllers/menu/clear.menu.ts
@@ -14,12 +14,20 @@
* limitations under the License.
*/
-import { ClearSelectionAllCommand, ClearSelectionContentCommand, ClearSelectionFormatCommand, RangeProtectionPermissionEditPoint, WorkbookEditablePermission, WorksheetEditPermission, WorksheetSetCellStylePermission, WorksheetSetCellValuePermission } from '@univerjs/sheets';
-import type { IMenuButtonItem, IMenuSelectorItem } from '@univerjs/ui';
-import { getMenuHiddenObservable, MenuItemType } from '@univerjs/ui';
-
import type { IAccessor } from '@univerjs/core';
+import type { IMenuButtonItem, IMenuSelectorItem } from '@univerjs/ui';
import { UniverInstanceType } from '@univerjs/core';
+import {
+ ClearSelectionAllCommand,
+ ClearSelectionContentCommand,
+ ClearSelectionFormatCommand,
+ RangeProtectionPermissionEditPoint,
+ WorkbookEditablePermission,
+ WorksheetEditPermission,
+ WorksheetSetCellStylePermission,
+ WorksheetSetCellValuePermission,
+} from '@univerjs/sheets';
+import { getMenuHiddenObservable, MenuItemType } from '@univerjs/ui';
import { getCurrentRangeDisable$, getObservableWithExclusiveRange$ } from './menu-util';
export const CLEAR_SELECTION_MENU_ID = 'sheet.menu.clear-selection';
@@ -37,8 +45,13 @@ export function ClearSelectionContentMenuItemFactory(accessor: IAccessor): IMenu
return {
id: ClearSelectionContentCommand.id,
type: MenuItemType.BUTTON,
+ icon: 'ClearFormat',
title: 'rightClick.clearContent',
- disabled$: getObservableWithExclusiveRange$(accessor, getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission], rangeTypes: [RangeProtectionPermissionEditPoint] })),
+ disabled$: getObservableWithExclusiveRange$(accessor, getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ })),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -46,8 +59,13 @@ export function ClearSelectionFormatMenuItemFactory(accessor: IAccessor): IMenuB
return {
id: ClearSelectionFormatCommand.id,
type: MenuItemType.BUTTON,
+ icon: 'ClearFormat',
title: 'rightClick.clearFormat',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -55,8 +73,13 @@ export function ClearSelectionAllMenuItemFactory(accessor: IAccessor): IMenuButt
return {
id: ClearSelectionAllCommand.id,
type: MenuItemType.BUTTON,
+ icon: 'ClearFormat',
title: 'rightClick.clearAll',
- disabled$: getObservableWithExclusiveRange$(accessor, getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] })),
+ disabled$: getObservableWithExclusiveRange$(accessor, getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellValuePermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ })),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
diff --git a/packages/sheets-ui/src/controllers/menu/menu.ts b/packages/sheets-ui/src/controllers/menu/menu.ts
index 1d28c1bb23..704e639148 100644
--- a/packages/sheets-ui/src/controllers/menu/menu.ts
+++ b/packages/sheets-ui/src/controllers/menu/menu.ts
@@ -319,7 +319,11 @@ export function UnderlineMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
subscriber.next(!!(isUnderline && isUnderline.s));
return disposable.dispose;
})),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }, true),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }, true),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -336,7 +340,11 @@ export function StrikeThroughMenuItemFactory(accessor: IAccessor): IMenuButtonIt
icon: 'StrikethroughSingle',
title: 'Set strike through',
tooltip: 'toolbar.strikethrough',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }, true),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }, true),
activated$: deriveStateFromActiveSheet$(univerInstanceService, false, ({ worksheet }) => new Observable
((subscriber) => {
const disposable = commandService.onCommandExecuted((c) => {
const id = c.id;
@@ -401,7 +409,11 @@ export function FontFamilySelectorMenuItemFactory(accessor: IAccessor): IMenuSel
value: item.value,
})),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }, true),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }, true),
value$: deriveStateFromActiveSheet$(univerInstanceService, defaultValue, ({ worksheet }) => new Observable((subscriber) => {
const updateSheet = () => {
let ff = defaultValue;
@@ -442,7 +454,11 @@ export function FontSizeSelectorMenuItemFactory(accessor: IAccessor): IMenuSelec
const contextService = accessor.get(IContextService);
const defaultValue = DEFAULT_STYLES.fs;
- const disabled$ = getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }, true);
+ const disabled$ = getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }, true);
return {
id: SetRangeFontSizeCommand.id,
@@ -507,7 +523,11 @@ export function ResetTextColorMenuItemFactory(accessor: IAccessor): IMenuButtonI
type: MenuItemType.BUTTON,
title: 'toolbar.resetColor',
icon: 'NoColor',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }, true),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }, true),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -543,7 +563,11 @@ export function TextColorSelectorMenuItemFactory(accessor: IAccessor): IMenuSele
return disposable.dispose;
}),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }, true),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }, true),
};
}
@@ -553,7 +577,11 @@ export function ResetBackgroundColorMenuItemFactory(accessor: IAccessor): IMenuB
type: MenuItemType.BUTTON,
title: 'toolbar.resetColor',
icon: 'NoColor',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -588,7 +616,11 @@ export function BackgroundColorSelectorMenuItemFactory(accessor: IAccessor): IMe
return disposable.dispose;
}),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -651,7 +683,11 @@ export function HorizontalAlignMenuItemFactory(accessor: IAccessor): IMenuSelect
return disposable.dispose;
})),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -714,7 +750,11 @@ export function VerticalAlignMenuItemFactory(accessor: IAccessor): IMenuSelector
return disposable.dispose;
})),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -777,7 +817,11 @@ export function WrapTextMenuItemFactory(accessor: IAccessor): IMenuSelectorItem<
return disposable.dispose;
})),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -863,7 +907,11 @@ export function TextRotateMenuItemFactory(accessor: IAccessor): IMenuSelectorIte
return disposable.dispose;
})),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -882,7 +930,11 @@ export function CopyMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
type: MenuItemType.BUTTON,
title: 'rightClick.copy',
icon: 'Copy',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookCopyPermission], worksheetTypes: [WorksheetCopyPermission], rangeTypes: [RangeProtectionPermissionViewPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookCopyPermission],
+ worksheetTypes: [WorksheetCopyPermission],
+ rangeTypes: [RangeProtectionPermissionViewPoint],
+ }),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -893,7 +945,11 @@ export function CutMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
commandId: CutCommand.id,
type: MenuItemType.BUTTON,
title: 'contextMenu.cut',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], rangeTypes: [RangeProtectionPermissionEditPoint], worksheetTypes: [WorksheetCopyPermission, WorksheetEditPermission] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ worksheetTypes: [WorksheetCopyPermission, WorksheetEditPermission],
+ }),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -906,7 +962,11 @@ export function PasteMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
title: 'rightClick.paste',
icon: 'PasteSpecial',
disabled$: menuClipboardDisabledObservable(accessor).pipe(
- combineLatestWith(getCurrentRangeDisable$(accessor, { rangeTypes: [RangeProtectionPermissionEditPoint], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission, WorksheetSetCellValuePermission], workbookTypes: [WorkbookEditablePermission] })),
+ combineLatestWith(getCurrentRangeDisable$(accessor, {
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission, WorksheetSetCellValuePermission],
+ workbookTypes: [WorkbookEditablePermission],
+ })),
map(([d1, d2]) => d1 || d2)
),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
@@ -930,7 +990,11 @@ export function PasteValueMenuItemFactory(accessor: IAccessor): IMenuButtonItem<
type: MenuItemType.BUTTON,
title: 'rightClick.pasteValue',
disabled$: menuClipboardDisabledObservable(accessor).pipe(
- combineLatestWith(getCurrentRangeDisable$(accessor, { rangeTypes: [RangeProtectionPermissionEditPoint], worksheetTypes: [WorksheetSetCellValuePermission, WorksheetEditPermission], workbookTypes: [WorkbookEditablePermission] })),
+ combineLatestWith(getCurrentRangeDisable$(accessor, {
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ worksheetTypes: [WorksheetSetCellValuePermission, WorksheetEditPermission],
+ workbookTypes: [WorkbookEditablePermission],
+ })),
map(([d1, d2]) => d1 || d2)
),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
@@ -943,7 +1007,11 @@ export function PasteFormatMenuItemFactory(accessor: IAccessor): IMenuButtonItem
type: MenuItemType.BUTTON,
title: 'rightClick.pasteFormat',
disabled$: menuClipboardDisabledObservable(accessor).pipe(
- combineLatestWith(getCurrentRangeDisable$(accessor, { rangeTypes: [RangeProtectionPermissionEditPoint], worksheetTypes: [WorksheetSetCellStylePermission, WorksheetEditPermission], workbookTypes: [WorkbookEditablePermission] })),
+ combineLatestWith(getCurrentRangeDisable$(accessor, {
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ worksheetTypes: [WorksheetSetCellStylePermission, WorksheetEditPermission],
+ workbookTypes: [WorkbookEditablePermission],
+ })),
map(([d1, d2]) => d1 || d2)
),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
@@ -956,7 +1024,11 @@ export function PasteColWidthMenuItemFactory(accessor: IAccessor): IMenuButtonIt
type: MenuItemType.BUTTON,
title: 'rightClick.pasteColWidth',
disabled$: menuClipboardDisabledObservable(accessor).pipe(
- combineLatestWith(getCurrentRangeDisable$(accessor, { rangeTypes: [RangeProtectionPermissionEditPoint], worksheetTypes: [WorksheetSetColumnStylePermission, WorksheetEditPermission], workbookTypes: [WorkbookEditablePermission] })),
+ combineLatestWith(getCurrentRangeDisable$(accessor, {
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ worksheetTypes: [WorksheetSetColumnStylePermission, WorksheetEditPermission],
+ workbookTypes: [WorkbookEditablePermission],
+ })),
map(([d1, d2]) => d1 || d2)
),
};
@@ -968,7 +1040,17 @@ export function PasteBesidesBorderMenuItemFactory(accessor: IAccessor): IMenuBut
type: MenuItemType.BUTTON,
title: 'rightClick.pasteBesidesBorder',
disabled$: menuClipboardDisabledObservable(accessor).pipe(
- combineLatestWith(getCurrentRangeDisable$(accessor, { rangeTypes: [RangeProtectionPermissionEditPoint], worksheetTypes: [WorksheetEditPermission, WorksheetSetCellStylePermission, WorksheetSetCellValuePermission, WorksheetSetRowStylePermission, WorksheetSetColumnStylePermission], workbookTypes: [WorkbookEditablePermission] })),
+ combineLatestWith(getCurrentRangeDisable$(accessor, {
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ worksheetTypes: [
+ WorksheetEditPermission,
+ WorksheetSetCellStylePermission,
+ WorksheetSetCellValuePermission,
+ WorksheetSetRowStylePermission,
+ WorksheetSetColumnStylePermission,
+ ],
+ workbookTypes: [WorkbookEditablePermission],
+ })),
map(([d1, d2]) => d1 || d2)
),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
@@ -981,7 +1063,11 @@ export function FitContentMenuItemFactory(accessor: IAccessor): IMenuButtonItem
type: MenuItemType.BUTTON,
icon: 'AutoHeight',
title: 'rightClick.fitContent',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetSetRowStylePermission, WorksheetEditPermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetSetRowStylePermission, WorksheetEditPermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -992,7 +1078,11 @@ export function ColAutoWidthMenuItemFactory(accessor: IAccessor): IMenuButtonIte
type: MenuItemType.BUTTON,
icon: 'AutoWidth',
title: 'rightClick.fitContent',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetSetRowStylePermission, WorksheetEditPermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetSetRowStylePermission, WorksheetEditPermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -1071,7 +1161,11 @@ export function HideRowMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
type: MenuItemType.BUTTON,
icon: 'Hide',
title: 'rightClick.hideSelectedRow',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetSetRowStylePermission, WorksheetEditPermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetSetRowStylePermission, WorksheetEditPermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -1082,7 +1176,11 @@ export function HideColMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
type: MenuItemType.BUTTON,
icon: 'Hide',
title: 'rightClick.hideSelectedColumn',
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetColumnStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetColumnStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
@@ -1120,7 +1218,11 @@ export function ShowRowMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
subscriber.next(!hasHiddenRowsInSelections());
return () => disposable.dispose();
})),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetRowStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetRowStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -1156,7 +1258,11 @@ export function ShowColMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
subscriber.next(!hasHiddenColsInSelections());
return () => disposable.dispose();
})),
- disabled$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetSetColumnStylePermission, WorksheetEditPermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ disabled$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetSetColumnStylePermission, WorksheetEditPermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -1197,7 +1303,11 @@ export function SetRowHeightMenuItemFactory(accessor: IAccessor): IMenuButtonIte
update();
return disposable.dispose;
})),
- hidden$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetRowStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ hidden$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetRowStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
@@ -1242,7 +1352,11 @@ export function SetColWidthMenuItemFactory(accessor: IAccessor): IMenuButtonItem
update();
return disposable.dispose;
})),
- hidden$: getCurrentRangeDisable$(accessor, { workbookTypes: [WorkbookEditablePermission], worksheetTypes: [WorksheetEditPermission, WorksheetSetColumnStylePermission], rangeTypes: [RangeProtectionPermissionEditPoint] }),
+ hidden$: getCurrentRangeDisable$(accessor, {
+ workbookTypes: [WorkbookEditablePermission],
+ worksheetTypes: [WorksheetEditPermission, WorksheetSetColumnStylePermission],
+ rangeTypes: [RangeProtectionPermissionEditPoint],
+ }),
};
}
diff --git a/packages/sheets-ui/src/views/sheet-bar/SheetBar.tsx b/packages/sheets-ui/src/views/sheet-bar/SheetBar.tsx
index bee7e3c2ec..88254c66fd 100644
--- a/packages/sheets-ui/src/views/sheet-bar/SheetBar.tsx
+++ b/packages/sheets-ui/src/views/sheet-bar/SheetBar.tsx
@@ -76,7 +76,7 @@ export const SheetBar = () => {
return (
-
+
);
diff --git a/packages/ui/src/controllers/menus/menu.schema.ts b/packages/ui/src/controllers/menus/menu.schema.ts
index 1ef18b82d3..f8100017b5 100644
--- a/packages/ui/src/controllers/menus/menu.schema.ts
+++ b/packages/ui/src/controllers/menus/menu.schema.ts
@@ -34,7 +34,7 @@ export const menuSchema: MenuSchemaType = {
},
[RibbonStartGroup.OTHERS]: {
[ToggleShortcutPanelOperation.id]: {
- order: 99,
+ order: 1,
menuItemFactory: ShortcutPanelMenuItemFactory,
},
},
diff --git a/packages/ui/src/controllers/shortcut-display/menu.ts b/packages/ui/src/controllers/shortcut-display/menu.ts
index 7220a211b5..c8ee78f671 100644
--- a/packages/ui/src/controllers/shortcut-display/menu.ts
+++ b/packages/ui/src/controllers/shortcut-display/menu.ts
@@ -16,9 +16,7 @@
import type { IAccessor } from '@univerjs/core';
import type { IMenuButtonItem } from '../../services/menu/menu';
-import { UniverInstanceType } from '@univerjs/core';
import { ToggleShortcutPanelOperation } from '../../commands/operations/toggle-shortcut-panel.operation';
-import { getMenuHiddenObservable } from '../../common/menu-hidden-observable';
import { MenuItemType } from '../../services/menu/menu';
export function ShortcutPanelMenuItemFactory(accessor: IAccessor): IMenuButtonItem {
@@ -28,7 +26,6 @@ export function ShortcutPanelMenuItemFactory(accessor: IAccessor): IMenuButtonIt
tooltip: 'toggle-shortcut-panel',
icon: 'KeyboardSingle',
type: MenuItemType.BUTTON,
- hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
- // disabled$: getCurrentSheetDisabled$(accessor),
+ // hidden$: getMenuHiddenObservable(accessor, UniverInstanceType.UNIVER_SHEET),
};
}
diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts
index aa2be3deb9..fc941e1b3c 100644
--- a/packages/ui/src/index.ts
+++ b/packages/ui/src/index.ts
@@ -131,7 +131,7 @@ export { type IDialogPartMethodOptions } from './views/components/dialog-part/in
export { FloatDom } from './views/components/dom/FloatDom';
export { GlobalZone } from './views/components/global-zone/GlobalZone';
export { CanvasPopup, SingleCanvasPopup } from './views/components/popup/CanvasPopup';
-export { ToolbarButton } from './views/components/ribbon/Button/ToolbarButton';
+export { ToolbarButton } from './views/components/ribbon/ToolbarButton';
export { useToolbarItemStatus } from './views/components/ribbon/hook';
export { Ribbon } from './views/components/ribbon/Ribbon';
export { ToolbarItem } from './views/components/ribbon/ToolbarItem';
diff --git a/packages/ui/src/locale/en-US.ts b/packages/ui/src/locale/en-US.ts
index 787c8b0fc4..e0aa92f9ab 100644
--- a/packages/ui/src/locale/en-US.ts
+++ b/packages/ui/src/locale/en-US.ts
@@ -33,11 +33,17 @@ const locale: typeof zhCN = {
},
ribbon: {
start: 'Start',
+ startDesc: 'Initiate the worksheet and set basic parameters.',
insert: 'Insert',
+ insertDesc: 'Insert rows, columns, charts and various other elements.',
formulas: 'Formulas',
+ formulasDesc: 'Use functions and formulas for data calculations.',
data: 'Data',
+ dataDesc: 'Manage data, including import, sorting and filtering.',
view: 'View',
+ viewDesc: 'Switch view modes and adjust the display effect.',
others: 'Others',
+ othersDesc: 'Other functions and settings.',
more: 'More',
},
fontFamily: {
diff --git a/packages/ui/src/locale/fa-IR.ts b/packages/ui/src/locale/fa-IR.ts
index 251ef08158..faebe1d8a4 100644
--- a/packages/ui/src/locale/fa-IR.ts
+++ b/packages/ui/src/locale/fa-IR.ts
@@ -33,11 +33,17 @@ const locale: typeof zhCN = {
},
ribbon: {
start: 'شروع',
+ startDesc: 'ایجاد کاربرگ و تنظیم پارامترهای اولیه.',
insert: 'درج',
+ insertDesc: 'درج ردیفها، ستونها، نمودارها و عناصر مختلف دیگر.',
formulas: 'فرمولها',
+ formulasDesc: 'استفاده از توابع و فرمولها برای محاسبات دادهها.',
data: 'دادهها',
+ dataDesc: 'ادغام و تجزیه دادهها.',
view: 'نمایش',
+ viewDesc: 'تغییر حالت نمایش و تنظیم اثرات نمایشی.',
others: 'دیگر',
+ othersDesc: 'سایر عملکردها و تنظیمات.',
more: 'بیشتر',
},
fontFamily: {
diff --git a/packages/ui/src/locale/fr-FR.ts b/packages/ui/src/locale/fr-FR.ts
index 64587b9518..498503c3f2 100644
--- a/packages/ui/src/locale/fr-FR.ts
+++ b/packages/ui/src/locale/fr-FR.ts
@@ -33,11 +33,17 @@ const locale: typeof enUS = {
},
ribbon: {
start: 'Démarrer',
+ startDesc: 'Initialiser la feuille de calcul et définir les paramètres de base.',
insert: 'Insérer',
+ insertDesc: 'Insérer des lignes, des colonnes, des graphiques et divers autres éléments.',
formulas: 'Formules',
+ formulasDesc: 'Utiliser des fonctions et des formules pour les calculs de données.',
data: 'Données',
+ dataDesc: 'Gérer les données, y compris l\'importation, le tri et le filtrage.',
view: 'Vue',
+ viewDesc: 'Changer les modes d\'affichage et ajuster l\'effet d\'affichage.',
others: 'Autres',
+ othersDesc: 'Autres fonctions et paramètres.',
more: 'Plus',
},
fontFamily: {
diff --git a/packages/ui/src/locale/ru-RU.ts b/packages/ui/src/locale/ru-RU.ts
index 89b9a2f52b..ac2572daef 100644
--- a/packages/ui/src/locale/ru-RU.ts
+++ b/packages/ui/src/locale/ru-RU.ts
@@ -33,11 +33,17 @@ const locale: typeof zhCN = {
},
ribbon: {
start: 'Начало',
+ startDesc: 'Инициализация рабочей таблицы и установка основных параметров.',
insert: 'Вставка',
+ insertDesc: 'Вставка строк, столбцов, графиков и различных других элементов.',
formulas: 'Формулы',
+ formulasDesc: 'Использование функций и формул для вычислений данных.',
data: 'Данные',
+ dataDesc: 'Управление данными, включая импорт, сортировку и фильтрацию.',
view: 'Вид',
+ viewDesc: 'Смена режимов отображения и настройка эффекта отображения.',
others: 'Другие',
+ othersDesc: 'Другие функции и настройки.',
more: 'Больше',
},
fontFamily: {
diff --git a/packages/ui/src/locale/vi-VN.ts b/packages/ui/src/locale/vi-VN.ts
index 4a2c3f9e34..e8a8b0465f 100644
--- a/packages/ui/src/locale/vi-VN.ts
+++ b/packages/ui/src/locale/vi-VN.ts
@@ -33,11 +33,17 @@ const locale: typeof zhCN = {
},
ribbon: {
start: 'Bắt đầu',
+ startDesc: 'Khởi tạo bảng tính và thiết lập các tham số cơ bản.',
insert: 'Chèn',
+ insertDesc: 'Chèn hàng, cột, biểu đồ và các phần tử khác.',
formulas: 'Công thức',
+ formulasDesc: 'Sử dụng hàm và công thức để tính toán dữ liệu.',
data: 'Dữ liệu',
+ dataDesc: 'Sắp xếp, lọc và phân tích dữ liệu.',
view: 'Xem',
+ viewDesc: 'Chuyển đổi chế độ xem và điều chỉnh hiệu ứng hiển thị.',
others: 'Khác',
+ othersDesc: 'Các chức năng và cài đặt khác.',
more: 'Thêm',
},
fontFamily: {
diff --git a/packages/ui/src/locale/zh-CN.ts b/packages/ui/src/locale/zh-CN.ts
index 1818c2624a..fe4bc34bee 100644
--- a/packages/ui/src/locale/zh-CN.ts
+++ b/packages/ui/src/locale/zh-CN.ts
@@ -31,11 +31,17 @@ const locale = {
},
ribbon: {
start: '开始',
+ startDesc: '初始化工作表并设置基本参数。',
insert: '插入',
+ insertDesc: '插入行、列、图表和各种其他元素。',
formulas: '公式',
+ formulasDesc: '使用函数和公式进行数据计算。',
data: '数据',
+ dataDesc: '管理数据,包括导入、排序和筛选。',
view: '视图',
+ viewDesc: '切换视图模式并调整显示效果。',
others: '其他',
+ othersDesc: '其他功能和设置。',
more: '更多',
},
fontFamily: {
diff --git a/packages/ui/src/locale/zh-TW.ts b/packages/ui/src/locale/zh-TW.ts
index 582e36ba89..70a032c693 100644
--- a/packages/ui/src/locale/zh-TW.ts
+++ b/packages/ui/src/locale/zh-TW.ts
@@ -33,11 +33,17 @@ const locale: typeof zhCN = {
},
ribbon: {
start: '開始',
+ startDesc: '初始化工作表並設定基本參數。',
insert: '插入',
+ insertDesc: '插入行、列、圖表和各種其他元素。',
formulas: '公式',
+ formulasDesc: '使用函數和公式進行數據計算。',
data: '資料',
+ dataDesc: '管理資料,包括匯入、排序和篩選。',
view: '視圖',
+ viewDesc: '切換視圖模式並調整顯示效果。',
others: '其他',
+ othersDesc: '其他功能和設定。',
more: '更多',
},
fontFamily: {
diff --git a/packages/ui/src/services/menu/menu-manager.service.ts b/packages/ui/src/services/menu/menu-manager.service.ts
index e6be3b6982..ac4f9b44a7 100644
--- a/packages/ui/src/services/menu/menu-manager.service.ts
+++ b/packages/ui/src/services/menu/menu-manager.service.ts
@@ -34,7 +34,7 @@ export interface IMenuSchema {
}
export interface IMenuManagerService {
- readonly menuChanged$: Observable
;
+ readonly menuChanged$: Observable;
mergeMenu(source: MenuSchemaType, target?: MenuSchemaType): void;
@@ -54,7 +54,7 @@ export type MenuSchemaType = {
};
export class MenuManagerService extends Disposable implements IMenuManagerService {
- readonly menuChanged$ = new Subject();
+ readonly menuChanged$ = new Subject();
private _menu: MenuSchemaType = {
[MenuManagerPosition.RIBBON]: {
@@ -69,39 +69,54 @@ export class MenuManagerService extends Disposable implements IMenuManagerServic
[RibbonStartGroup.LAYOUT]: {
order: 2,
},
- [RibbonStartGroup.FORMULAS_INSERT]: {
- order: 3,
- },
- [RibbonStartGroup.FORMULAS_VIEW]: {
- order: 4,
- },
- [RibbonStartGroup.FILE]: {
- order: 5,
- },
[RibbonStartGroup.OTHERS]: {
- order: 6,
+ order: 3,
},
},
[RibbonPosition.INSERT]: {
order: 1,
- [RibbonInsertGroup.OTHERS]: {
+ [RibbonInsertGroup.EDIT]: {
order: 0,
},
+ [RibbonInsertGroup.MEDIA]: {
+ order: 1,
+ },
+ [RibbonInsertGroup.OTHERS]: {
+ order: 2,
+ },
},
[RibbonPosition.FORMULAS]: {
order: 2,
- [RibbonFormulasGroup.OTHERS]: {
+ [RibbonFormulasGroup.BASIC]: {
order: 0,
},
+ [RibbonFormulasGroup.OTHERS]: {
+ order: 1,
+ },
},
[RibbonPosition.DATA]: {
order: 3,
- [RibbonDataGroup.OTHERS]: {
+ [RibbonDataGroup.FORMULAS]: {
order: 0,
},
+ [RibbonDataGroup.RULES]: {
+ order: 1,
+ },
+ [RibbonDataGroup.ORGANIZATION]: {
+ order: 2,
+ },
+ [RibbonDataGroup.OTHERS]: {
+ order: 3,
+ },
},
[RibbonPosition.VIEW]: {
order: 4,
+ [RibbonViewGroup.DISPLAY]: {
+ order: 0,
+ },
+ [RibbonViewGroup.VISIBILITY]: {
+ order: 0,
+ },
[RibbonViewGroup.OTHERS]: {
order: 0,
},
@@ -228,7 +243,7 @@ export class MenuManagerService extends Disposable implements IMenuManagerServic
const _key = key as keyof MenuSchemaType;
_target[_key] = merge({}, _target[_key], source[_key]);
- this.menuChanged$.next();
+ this.menuChanged$.next(Date.now());
} else if (typeof value === 'object') {
this.mergeMenu(source, value);
}
@@ -237,7 +252,7 @@ export class MenuManagerService extends Disposable implements IMenuManagerServic
appendRootMenu(source: MenuSchemaType): void {
this._menu = merge({}, this._menu, source);
- this.menuChanged$.next();
+ this.menuChanged$.next(Date.now());
}
private _buildMenuSchema(data: MenuSchemaType): IMenuSchema[] {
diff --git a/packages/ui/src/services/menu/menu.ts b/packages/ui/src/services/menu/menu.ts
index ea04e43325..3e9631ab9d 100644
--- a/packages/ui/src/services/menu/menu.ts
+++ b/packages/ui/src/services/menu/menu.ts
@@ -61,6 +61,7 @@ interface IMenuItemBase {
hidden$?: Observable;
disabled$?: Observable;
+ params?: any;
/** On observable value that should emit the value of the corresponding selection component. */
value$?: Observable;
}
diff --git a/packages/ui/src/services/menu/types.ts b/packages/ui/src/services/menu/types.ts
index f510587a09..0e2f2cf3b7 100644
--- a/packages/ui/src/services/menu/types.ts
+++ b/packages/ui/src/services/menu/types.ts
@@ -20,37 +20,42 @@ export enum MenuManagerPosition {
}
export enum RibbonPosition {
- START = 'ribbon.start',
- INSERT = 'ribbon.insert',
- FORMULAS = 'ribbon.formulas',
- DATA = 'ribbon.data',
- VIEW = 'ribbon.view',
- OTHERS = 'ribbon.others',
+ START = 'ribbon.start', // RibbonStartGroup
+ INSERT = 'ribbon.insert', // RibbonInsertGroup
+ FORMULAS = 'ribbon.formulas', // RibbonFormulasGroup
+ DATA = 'ribbon.data', // RibbonDataGroup
+ VIEW = 'ribbon.view', // RibbonViewGroup
+ OTHERS = 'ribbon.others', // RibbonOthersGroup
}
export enum RibbonStartGroup {
HISTORY = 'ribbon.start.history',
FORMAT = 'ribbon.start.format',
LAYOUT = 'ribbon.start.layout',
- FORMULAS_INSERT = 'ribbon.start.insert',
- FORMULAS_VIEW = 'ribbon.start.view',
- FILE = 'ribbon.start.file',
OTHERS = 'ribbon.start.others',
}
export enum RibbonInsertGroup {
+ EDIT = 'ribbon.insert.edit',
+ MEDIA = 'ribbon.insert.media',
OTHERS = 'ribbon.insert.others',
}
export enum RibbonFormulasGroup {
+ BASIC = 'ribbon.formulas.basic',
OTHERS = 'ribbon.formulas.others',
}
export enum RibbonDataGroup {
+ FORMULAS = 'ribbon.data.formulas',
+ RULES = 'ribbon.data.rules',
+ ORGANIZATION = 'ribbon.data.organization',
OTHERS = 'ribbon.data.others',
}
export enum RibbonViewGroup {
+ DISPLAY = 'ribbon.view.display',
+ VISIBILITY = 'ribbon.view.Visibility',
OTHERS = 'ribbon.view.others',
}
diff --git a/packages/ui/src/views/components/ribbon/Ribbon.tsx b/packages/ui/src/views/components/ribbon/Ribbon.tsx
index 9749390a42..8fb67e52cf 100644
--- a/packages/ui/src/views/components/ribbon/Ribbon.tsx
+++ b/packages/ui/src/views/components/ribbon/Ribbon.tsx
@@ -15,31 +15,44 @@
*/
import type { ComponentType } from 'react';
+import type { Observable } from 'rxjs';
import type { IMenuSchema } from '../../../services/menu/menu-manager.service';
import { LocaleService } from '@univerjs/core';
-import { borderBottomClassName, clsx } from '@univerjs/design';
-import { MoreFunctionSingle } from '@univerjs/icons';
+import { borderBottomClassName, borderClassName, clsx, divideXClassName, Dropdown } from '@univerjs/design';
+import { DatabaseSingle, EyeSingle, FunctionSingle, HomeSingle, InsertSingle, MoreDownSingle, MoreFunctionSingle } from '@univerjs/icons';
import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import { combineLatest } from 'rxjs';
import { IMenuManagerService } from '../../../services/menu/menu-manager.service';
import { MenuManagerPosition, RibbonPosition } from '../../../services/menu/types';
-import { useDependency } from '../../../utils/di';
+import { useDependency, useObservable } from '../../../utils/di';
import { ComponentContainer } from '../ComponentContainer';
-import { ToolbarButton } from '../ribbon/Button/ToolbarButton';
+import { ToolbarButton } from './ToolbarButton';
import { ToolbarItem } from './ToolbarItem';
-import { DropdownWrapper, TooltipWrapper } from './TooltipButtonWrapper';
interface IRibbonProps {
headerMenuComponents?: Set;
headerMenu?: boolean;
}
+const iconMap = {
+ [RibbonPosition.START]: HomeSingle,
+ [RibbonPosition.INSERT]: InsertSingle,
+ [RibbonPosition.FORMULAS]: FunctionSingle,
+ [RibbonPosition.DATA]: DatabaseSingle,
+ [RibbonPosition.VIEW]: EyeSingle,
+ [RibbonPosition.OTHERS]: MoreFunctionSingle,
+};
+
export function Ribbon(props: IRibbonProps) {
const { headerMenuComponents, headerMenu = true } = props;
const menuManagerService = useDependency(IMenuManagerService);
const localeService = useDependency(LocaleService);
- const fakeToolbarRef = useRef(null);
+ const menuChanged = useObservable(menuManagerService.menuChanged$);
+
+ const containerRef = useRef(null!);
+ const fakeToolbarRef = useRef(null!);
const toolbarItemRefs = useRef([]);
const [activatedTab, setActivatedTab] = useState(RibbonPosition.START);
- const [changingActiveTab, setChangingActiveTab] = useState(false);
+ const [groupSelectorVisible, setGroupSelectorVisible] = useState(false);
const [collapsedIds, setCollapsedIds] = useState([]);
-
- const separatorClassName = `[&>*:last-child:after]:univer-absolute [&>*:last-child:after]:-univer-right-2
- [&>*:last-child:after]:univer-top-1/2 [&>*:last-child:after]:univer-h-5 [&>*:last-child:after]:univer-translate-x-[3px]
- [&>*:last-child:after]:univer-w-px [&>*:last-child:after]:-univer-translate-y-1/2
- [&>*:last-child:after]:univer-bg-gray-200 [&>*:last-child:after]:univer-content-['']
- [&>*:last-child]:univer-relative dark:[&>*:last-child:after]:univer-bg-gray-600`;
+ // const [changingActiveTab, setChangingActiveTab] = useState(false);
const handleSelectTab = useCallback((group: IMenuSchema) => {
toolbarItemRefs.current = {};
- setChangingActiveTab(true);
- const timer = setTimeout(() => {
- setChangingActiveTab(false);
- }, 300);
+ // setChangingActiveTab(true);
+ // const timer = setTimeout(() => {
+ // setChangingActiveTab(false);
+ // }, 300);
setActivatedTab(group.key);
+ setGroupSelectorVisible(false);
return () => {
- clearTimeout(timer);
+ // clearTimeout(timer);
};
}, []);
// subscribe to menu changes
useEffect(() => {
- function getRibbon(): void {
- const ribbon = menuManagerService.getMenuByPositionKey(MenuManagerPosition.RIBBON);
- setRibbon(ribbon);
- }
- getRibbon();
+ const ribbon = menuManagerService.getMenuByPositionKey(MenuManagerPosition.RIBBON);
- const subscription = menuManagerService.menuChanged$.subscribe(getRibbon);
+ const hiddenObservaleMap: Observable[] = [];
+ const hiddenKeyMap: string[] = [];
+ for (const group of ribbon) {
+ if (group.children) {
+ for (const item of group.children) {
+ if (item.children) {
+ for (const child of item.children) {
+ if (child.item?.hidden$) {
+ hiddenObservaleMap.push(child.item.hidden$);
+ hiddenKeyMap.push(`${group.key}/${item.key}/${child.key}`);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ const subscription = combineLatest(hiddenObservaleMap)
+ // .pipe(debounceTime(300))
+ .subscribe((hiddenMap) => {
+ const newRibbon: IMenuSchema[] = [];
+
+ const hiddenPathMap = hiddenMap.map((hidden, index) => {
+ if (hidden) {
+ return hiddenKeyMap[index];
+ }
+ return null;
+ }).filter((item) => !!item) as string[];
+
+ for (const group of ribbon) {
+ const newGroup: IMenuSchema = { ...group, children: [] };
+
+ if (group.children?.length) {
+ for (const item of group.children) {
+ const newItem: IMenuSchema = { ...item, children: [] };
+ let shouldAddItem = true;
+
+ if (item.children?.length) {
+ for (const child of item.children) {
+ const path = `${group.key}/${item.key}/${child.key}`;
+
+ if (!hiddenPathMap.includes(path)) {
+ newItem.children?.push(child);
+ }
+ }
+
+ if (newItem.children?.every((child) => child.children?.length === 0)) {
+ shouldAddItem = false;
+ }
+ }
+
+ if (shouldAddItem) {
+ newGroup.children?.push(newItem);
+ }
+ }
+ }
+
+ if (newGroup.children?.length && newGroup.children.every((item) => item.children?.length)) {
+ newRibbon.push(newGroup);
+ }
+ }
+
+ setRibbon(newRibbon);
+ });
return () => {
subscription.unsubscribe();
};
- }, [menuManagerService]);
+ }, [menuChanged]);
const activeGroup = useMemo(() => {
const allGroups = ribbon.find((group) => group.key === activatedTab)?.children ?? [];
@@ -115,211 +183,230 @@ export function Ribbon(props: IRibbonProps) {
visibleGroups,
hiddenGroups,
};
- }, [ribbon, activatedTab, collapsedIds]);
+ }, [collapsedIds, ribbon, activatedTab]);
- // resize observer
useEffect(() => {
const observer = new ResizeObserver((entries) => {
- const toolbar = entries[0].target;
- const toolbarWidth = toolbar.clientWidth;
- const toolbarItems = Object.values(toolbarItemRefs.current);
- const sortedToolbarItems = toolbarItems.sort((a, b) => {
- if (a.groupOrder === b.groupOrder) {
- return a.order - b.order;
+ for (const entry of entries) {
+ const { width: avaliableWidth } = entry.contentRect;
+ const toolbarItems = Object.values(toolbarItemRefs.current);
+ const sortedToolbarItems = toolbarItems.sort((a, b) => {
+ if (a.groupOrder === b.groupOrder) {
+ return a.order - b.order;
+ }
+ return a.groupOrder - b.groupOrder;
+ });
+
+ const newCollapsedIds: string[] = [];
+ let totalWidth = 32;
+ const allGroups = ribbon.find((group) => group.key === activatedTab)?.children ?? [];
+
+ const gapWidth = (allGroups.length - 1) * 8;
+ totalWidth += gapWidth;
+
+ for (const { el, key } of sortedToolbarItems) {
+ if (!el) continue;
+
+ totalWidth += el?.getBoundingClientRect().width + 8;
+
+ if (totalWidth > avaliableWidth - gapWidth) {
+ newCollapsedIds.push(key);
+ }
}
- return a.groupOrder - b.groupOrder;
- });
- const newCollapsedIds: string[] = [];
- let totalWidth = 0;
-
- const allGroups = ribbon.find((group) => group.key === activatedTab)?.children ?? [];
-
- const gapWidth = (allGroups.length - 1) * 8;
- totalWidth += gapWidth;
-
- for (const { el, key } of sortedToolbarItems) {
- if (!el) continue;
-
- totalWidth += el?.getBoundingClientRect().width + 8;
-
- if (totalWidth > toolbarWidth - 32 - gapWidth) {
- newCollapsedIds.push(key);
- }
- }
-
- if (JSON.stringify(newCollapsedIds) !== JSON.stringify(collapsedIds)) {
setCollapsedIds(newCollapsedIds);
}
});
- if (fakeToolbarRef.current) {
- observer.observe(fakeToolbarRef.current);
- }
+ observer.observe(containerRef.current);
return () => {
observer.disconnect();
};
- }, [ribbon, activatedTab, collapsedIds]);
-
- const fakeToolbarContent = useMemo(() => (
- activeGroup.allGroups.map((groupItem) => (
-
-
- {groupItem.children?.map((child) => (
- child.item && (
- {
- if (ref?.el) {
- toolbarItemRefs.current[child.key] = {
- el: ref.el,
- key: child.key,
- groupOrder: groupItem.order,
- order: child.order,
- };
- }
- }}
- />
- )
- ))}
-
-
- ))
- ), [activeGroup.allGroups]);
+ }, [ribbon, activatedTab]);
return (
<>
- {/* header */}
- {headerMenu && (
-