--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { ContextMenuActionSet } from "../context-menu-action-set";
+
+export const emptyActionSet: ContextMenuActionSet = [];
+
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { ContextMenuActionSet } from "../context-menu-action-set";
+import actions from "../../../store/project/project-action";
+import { IconTypes } from "../../../components/icon/icon";
+
+export const projectActionSet: ContextMenuActionSet = [[{
+ icon: IconTypes.FOLDER,
+ name: "New project",
+ execute: (dispatch, resource) => {
+ dispatch(actions.OPEN_PROJECT_CREATOR({ ownerUuid: resource.uuid }));
+ }
+}, {
+ icon: IconTypes.ANNOUNCEMENT,
+ name: "Share",
+ execute: () => { return; }
+}]];
\ No newline at end of file
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { ContextMenuActionSet } from "../context-menu-action-set";
+import actions from "../../../store/project/project-action";
+import { IconTypes } from "../../../components/icon/icon";
+
+export const rootProjectActionSet: ContextMenuActionSet = [[{
+ icon: IconTypes.FOLDER,
+ name: "New project",
+ execute: (dispatch, resource) => {
+ dispatch(actions.OPEN_PROJECT_CREATOR({ ownerUuid: resource.uuid }));
+ }
+}]];
\ No newline at end of file
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import { Dispatch } from "redux";
+import { ContextMenuItem } from "../../components/context-menu/context-menu";
+import { ContextMenuResource } from "../../store/context-menu/context-menu-reducer";
+
+export interface ContextMenuAction extends ContextMenuItem {
+ execute(dispatch: Dispatch, resource: ContextMenuResource): void;
+}
+
+export type ContextMenuActionSet = Array<Array<ContextMenuAction>>;
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import { Dispatch } from "redux";
-import { ContextMenuItemGroup, ContextMenuItem } from "../../components/context-menu/context-menu";
-import { ContextMenuResource } from "../../store/context-menu/context-menu-reducer";
-
-export interface ContextMenuItemSet {
- handleItem (dispatch: Dispatch, action: ContextMenuItem, resource: ContextMenuResource): void;
- getItems (): ContextMenuItemGroup[];
-}
import ContextMenu, { ContextMenuProps, ContextMenuItem } from "../../components/context-menu/context-menu";
import { createAnchorAt } from "../../components/popover/helpers";
import { ContextMenuResource } from "../../store/context-menu/context-menu-reducer";
-import { ContextMenuItemSet } from "./context-menu-item-set";
-import { emptyItemSet } from "./item-sets/empty-item-set";
+import { ContextMenuActionSet, ContextMenuAction } from "./context-menu-action-set";
+import { emptyActionSet } from "./action-sets/empty-action-set";
type DataProps = Pick<ContextMenuProps, "anchorEl" | "items"> & { resource?: ContextMenuResource };
const mapStateToProps = (state: RootState): DataProps => {
const { position, resource } = state.contextMenu;
return {
anchorEl: resource ? createAnchorAt(position) : undefined,
- items: getMenuItemSet(resource).getItems(),
+ items: getMenuItemSet(resource),
resource
};
};
onClose: () => {
dispatch(actions.CLOSE_CONTEXT_MENU());
},
- onItemClick: (item: ContextMenuItem, resource?: ContextMenuResource) => {
+ onItemClick: (action: ContextMenuAction, resource?: ContextMenuResource) => {
dispatch(actions.CLOSE_CONTEXT_MENU());
if (resource) {
- getMenuItemSet(resource).handleItem(dispatch, item, resource);
+ action.execute(dispatch, resource);
}
}
});
export const ContextMenuHOC = connect(mapStateToProps, mapDispatchToProps, mergeProps)(ContextMenu);
-const menuItemSets = new Map<string, ContextMenuItemSet>();
+const menuItemSets = new Map<string, ContextMenuActionSet>();
-export const addMenuItemsSet = (name: string, itemSet: ContextMenuItemSet) => {
+export const addMenuItemsSet = (name: string, itemSet: ContextMenuActionSet) => {
menuItemSets.set(name, itemSet);
};
-const getMenuItemSet = (resource?: ContextMenuResource): ContextMenuItemSet => {
- return resource ? menuItemSets.get(resource.kind) || emptyItemSet : emptyItemSet;
+const getMenuItemSet = (resource?: ContextMenuResource): ContextMenuActionSet => {
+ return resource ? menuItemSets.get(resource.kind) || emptyActionSet : emptyActionSet;
};
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import { ContextMenuItemGroup } from "../../../components/context-menu/context-menu";
-import { ContextMenuItemSet } from "../context-menu-item-set";
-
-export const emptyItemSet: ContextMenuItemSet = {
- getItems: () => items,
- handleItem: () => { return; }
-};
-
-const items: ContextMenuItemGroup[] = [];
\ No newline at end of file
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import { ContextMenuItemGroup } from "../../../components/context-menu/context-menu";
-import { ContextMenuItemSet } from "../context-menu-item-set";
-import actions from "../../../store/project/project-action";
-import { IconTypes } from "../../../components/icon/icon";
-
-export const projectItemSet: ContextMenuItemSet = {
- getItems: () => items,
- handleItem: (dispatch, item, resource) => {
- if (item.name === "New project") {
- dispatch(actions.OPEN_PROJECT_CREATOR({ ownerUuid: resource.uuid }));
- }
- }
-};
-
-const items: ContextMenuItemGroup[] = [[{
- icon: IconTypes.FOLDER,
- name: "New project"
-}, {
- icon: IconTypes.ANNOUNCEMENT,
- name: "Share"
-}]];
\ No newline at end of file
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-import { ContextMenuItemGroup } from "../../../components/context-menu/context-menu";
-import { ContextMenuItemSet } from "../context-menu-item-set";
-import actions from "../../../store/project/project-action";
-import { IconTypes } from "../../../components/icon/icon";
-
-export const rootProjectItemSet: ContextMenuItemSet = {
- getItems: () => items,
- handleItem: (dispatch, item, resource) => {
- if (item.name === "New project") {
- dispatch(actions.OPEN_PROJECT_CREATOR({ ownerUuid: resource.uuid }));
- }
- }
-};
-
-const items: ContextMenuItemGroup[] = [[{
- icon: IconTypes.FOLDER,
- name: "New project"
-}]];
\ No newline at end of file