import * as Adapter from 'enzyme-adapter-react-16';
import DataExplorer from "./data-explorer";
-import ContextMenu from "../context-menu/context-menu";
import ColumnSelector from "../column-selector/column-selector";
import DataTable from "../data-table/data-table";
import SearchInput from "../search-input/search-input";
import { TablePagination } from "@material-ui/core";
-import { MockItem } from "../data-table/data-table.test";
configure({ adapter: new Adapter() });
const onSearch = jest.fn();
const dataExplorer = mount(<DataExplorer
{...mockDataExplorerProps()}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={[{ name: "item 1" }]}
searchValue="search value"
onSearch={onSearch} />);
expect(dataExplorer.find(SearchInput).prop("value")).toEqual("search value");
{...mockDataExplorerProps()}
columns={columns}
onColumnToggle={onColumnToggle}
- items={[{ key: "1", name: "item 1" }] as MockItem[]} />);
+ items={[{ name: "item 1" }]} />);
expect(dataExplorer.find(ColumnSelector).prop("columns")).toBe(columns);
dataExplorer.find(ColumnSelector).prop("onColumnToggle")("columns");
expect(onColumnToggle).toHaveBeenCalledWith("columns");
const onSortToggle = jest.fn();
const onRowClick = jest.fn();
const columns = [{ name: "Column 1", render: jest.fn(), selected: true }];
- const items = [{ key: "1", name: "item 1" }] as MockItem[];
+ const items = [{ name: "item 1" }];
const dataExplorer = mount(<DataExplorer
{...mockDataExplorerProps()}
columns={columns}
const onChangeRowsPerPage = jest.fn();
const dataExplorer = mount(<DataExplorer
{...mockDataExplorerProps()}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={[{ name: "item 1" }]}
page={10}
rowsPerPage={50}
onChangePage={onChangePage}
onFiltersChange: jest.fn(),
onSortToggle: jest.fn(),
onRowClick: jest.fn(),
+ onRowDoubleClick: jest.fn(),
onColumnToggle: jest.fn(),
onChangePage: jest.fn(),
onChangeRowsPerPage: jest.fn(),
import { mount, configure } from "enzyme";
import { TableHead, TableCell, Typography, TableBody, Button, TableSortLabel } from "@material-ui/core";
import * as Adapter from "enzyme-adapter-react-16";
-import DataTable, { DataColumns, DataItem } from "./data-table";
+import DataTable, { DataColumns } from "./data-table";
import DataTableFilters from "../data-table-filters/data-table-filters";
import { SortDirection } from "./data-column";
configure({ adapter: new Adapter() });
-export interface MockItem extends DataItem {
- name: string;
-}
-
describe("<DataTable />", () => {
it("shows only selected columns", () => {
- const columns: DataColumns<MockItem> = [
+ const columns: DataColumns<string> = [
{
name: "Column 1",
render: () => <span />,
];
const dataTable = mount(<DataTable
columns={columns}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={[{ key: "1", name: "item 1" }]}
onFiltersChange={jest.fn()}
onRowClick={jest.fn()}
+ onRowDoubleClick={jest.fn()}
onContextMenu={jest.fn()}
onSortToggle={jest.fn()} />);
expect(dataTable.find(TableHead).find(TableCell)).toHaveLength(2);
});
it("renders column name", () => {
- const columns: DataColumns<MockItem> = [
+ const columns: DataColumns<string> = [
{
name: "Column 1",
render: () => <span />,
];
const dataTable = mount(<DataTable
columns={columns}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={["item 1"]}
onFiltersChange={jest.fn()}
onRowClick={jest.fn()}
+ onRowDoubleClick={jest.fn()}
onContextMenu={jest.fn()}
onSortToggle={jest.fn()} />);
expect(dataTable.find(TableHead).find(TableCell).text()).toBe("Column 1");
});
it("uses renderHeader instead of name prop", () => {
- const columns: DataColumns<MockItem> = [
+ const columns: DataColumns<string> = [
{
name: "Column 1",
renderHeader: () => <span>Column Header</span>,
];
const dataTable = mount(<DataTable
columns={columns}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={[]}
onFiltersChange={jest.fn()}
onRowClick={jest.fn()}
+ onRowDoubleClick={jest.fn()}
onContextMenu={jest.fn()}
onSortToggle={jest.fn()} />);
expect(dataTable.find(TableHead).find(TableCell).text()).toBe("Column Header");
});
it("passes column key prop to corresponding cells", () => {
- const columns: DataColumns<MockItem> = [
+ const columns: DataColumns<string> = [
{
name: "Column 1",
key: "column-1-key",
];
const dataTable = mount(<DataTable
columns={columns}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={["item 1"]}
onFiltersChange={jest.fn()}
onRowClick={jest.fn()}
+ onRowDoubleClick={jest.fn()}
onContextMenu={jest.fn()}
onSortToggle={jest.fn()} />);
expect(dataTable.find(TableHead).find(TableCell).key()).toBe("column-1-key");
});
it("renders items", () => {
- const columns: DataColumns<MockItem> = [
+ const columns: DataColumns<string> = [
{
name: "Column 1",
- render: (item) => <Typography>{item.name}</Typography>,
+ render: (item) => <Typography>{item}</Typography>,
selected: true
},
{
name: "Column 2",
- render: (item) => <Button>{item.name}</Button>,
+ render: (item) => <Button>{item}</Button>,
selected: true
}
];
const dataTable = mount(<DataTable
columns={columns}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={["item 1"]}
onFiltersChange={jest.fn()}
onRowClick={jest.fn()}
+ onRowDoubleClick={jest.fn()}
onContextMenu={jest.fn()}
onSortToggle={jest.fn()} />);
expect(dataTable.find(TableBody).find(Typography).text()).toBe("item 1");
});
it("passes sorting props to <TableSortLabel />", () => {
- const columns: DataColumns<MockItem> = [{
+ const columns: DataColumns<string> = [{
name: "Column 1",
sortDirection: SortDirection.Asc,
selected: true,
- render: (item) => <Typography>{item.name}</Typography>
+ render: (item) => <Typography>{item}</Typography>
}];
const onSortToggle = jest.fn();
const dataTable = mount(<DataTable
columns={columns}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={["item 1"]}
onFiltersChange={jest.fn()}
onRowClick={jest.fn()}
+ onRowDoubleClick={jest.fn()}
onContextMenu={jest.fn()}
onSortToggle={onSortToggle} />);
expect(dataTable.find(TableSortLabel).prop("active")).toBeTruthy();
});
it("passes filter props to <DataTableFilter />", () => {
- const columns: DataColumns<MockItem> = [{
+ const columns: DataColumns<string> = [{
name: "Column 1",
sortDirection: SortDirection.Asc,
selected: true,
filters: [{ name: "Filter 1", selected: true }],
- render: (item) => <Typography>{item.name}</Typography>
+ render: (item) => <Typography>{item}</Typography>
}];
const onFiltersChange = jest.fn();
const dataTable = mount(<DataTable
columns={columns}
- items={[{ key: "1", name: "item 1" }] as MockItem[]}
+ items={[]}
onFiltersChange={onFiltersChange}
onRowClick={jest.fn()}
+ onRowDoubleClick={jest.fn()}
onSortToggle={jest.fn()}
onContextMenu={jest.fn()} />);
expect(dataTable.find(DataTableFilters).prop("filters")).toBe(columns[0].filters);
//
// SPDX-License-Identifier: AGPL-3.0
-import { ResourceKind } from '../../models/kinds';
import ProjectItem from './items/project-item';
import CollectionItem from './items/collection-item';
import ProcessItem from './items/process-item';
import EmptyItem from './items/empty-item';
import { DetailsPanelResource } from '../../views-components/details-panel/details-panel';
import { EmptyResource } from '../../models/empty';
+import { ResourceKind } from '../../models/resource';
export default class DetailsPanelFactory {
static createItem(res: DetailsPanelResource): AbstractItem {
import { mount } from 'enzyme';
import * as Enzyme from 'enzyme';
import * as Adapter from 'enzyme-adapter-react-16';
-import { Collapse } from '@material-ui/core';
-import CircularProgress from '@material-ui/core/CircularProgress';
import ListItem from "@material-ui/core/ListItem/ListItem";
-import Tree, {TreeItem} from './tree';
-import { Project } from '../../models/project';
+import Tree, { TreeItem } from './tree';
+import { ProjectResource } from '../../models/project';
+import { mockProjectResource } from '../../models/test-utils';
+
Enzyme.configure({ adapter: new Adapter() });
describe("Tree component", () => {
- it("should render ListItem", () => {
- const project: TreeItem<Project> = {
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- },
+ it("should render ListItem", () => {
+ const project: TreeItem<ProjectResource> = {
+ data: mockProjectResource(),
id: "3",
open: true,
- active: true,
- status: 1,
+ active: true,
+ status: 1,
};
- const wrapper = mount(<Tree render={project => <div/>} toggleItem={() => { }} items={[project]}/>)
- expect(wrapper.find(ListItem)).toHaveLength(1);
- });
-
+ const wrapper = mount(<Tree
+ render={project => <div />}
+ toggleItemOpen={jest.fn()}
+ toggleItemActive={jest.fn()}
+ onContextMenu={jest.fn()}
+ items={[project]} />);
+ expect(wrapper.find(ListItem)).toHaveLength(1);
+ });
+
it("should render arrow", () => {
- const project: TreeItem<Project> = {
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- },
+ const project: TreeItem<ProjectResource> = {
+ data: mockProjectResource(),
id: "3",
open: true,
- active: true,
- status: 1,
+ active: true,
+ status: 1,
};
- const wrapper = mount(<Tree render={project => <div/>} toggleItem={() => { }} items={[project]}/>)
- expect(wrapper.find('i')).toHaveLength(1);
- });
+ const wrapper = mount(<Tree
+ render={project => <div />}
+ toggleItemOpen={jest.fn()}
+ toggleItemActive={jest.fn()}
+ onContextMenu={jest.fn()}
+ items={[project]} />);
+ expect(wrapper.find('i')).toHaveLength(1);
+ });
});
+++ /dev/null
-// Copyright (C) The Arvados Authors. All rights reserved.
-//
-// SPDX-License-Identifier: AGPL-3.0
-
-export enum ResourceKind {
- Collection = "arvados#collection",
- ContainerRequest = "arvados#containerRequest",
- Group = "arvados#group",
- Process = "arvados#containerRequest",
- Project = "arvados#group",
- Workflow = "arvados#workflow"
-}
\ No newline at end of file
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+// import { default as unionize, ofType, UnionOf } from "unionize";
+
+// const actions = unionize({
+// OPEN_CONTEXT_MENU: ofType<{position: {x: number, y: number}}>()
+// }, {
+// tag: 'type',
+// value: 'payload'
+// });
+
+// export type ContextMenuAction = UnionOf<typeof actions>;
+// export default actions;
\ No newline at end of file
--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+// import actions, { DetailsPanelAction } from "./details-panel-action";
+// import { Resource, ResourceKind } from "../../models/resource";
+
+// export interface ContextMenuState {
+// position: {
+// x: number;
+// y: number;
+// },
+// resource: {
+// uuid: string;
+// kind: ResourceKind.
+// }
+// }
+
+// const initialState = {
+// item: null,
+// isOpened: false
+// };
+
+// const reducer = (state: DetailsPanelState = initialState, action: DetailsPanelAction) =>
+// actions.match(action, {
+// default: () => state,
+// LOAD_DETAILS: () => state,
+// LOAD_DETAILS_SUCCESS: ({ item }) => ({ ...state, item }),
+// TOGGLE_DETAILS_PANEL: () => ({ ...state, isOpened: !state.isOpened })
+// });
+
+// export default reducer;
import { unionize, ofType, UnionOf } from "unionize";
import CommonResourceService from "../../common/api/common-resource-service";
-import { ResourceKind } from "../../models/kinds";
import { Dispatch } from "redux";
-import { groupsService } from "../../services/services";
import { serverApi } from "../../common/api/server-api";
-import { Resource } from "../../models/resource";
+import { Resource, ResourceKind } from "../../models/resource";
const actions = unionize({
TOGGLE_DETAILS_PANEL: ofType<{}>(),
import dataExplorerActions from "../data-explorer/data-explorer-action";
import { PROJECT_PANEL_ID } from "../../views/project-panel/project-panel";
import { RootState } from "../store";
-import { ResourceKind } from "../../models/kinds";
-import { Resource } from "../../models/resource";
+import { Resource, ResourceKind } from "../../models/resource";
export const getResourceUrl = <T extends Resource>(resource: T): string => {
switch (resource.kind) {
import projectsReducer, { getTreePath } from "./project-reducer";
import actions from "./project-action";
import { TreeItem, TreeItemStatus } from "../../components/tree/tree";
-import { ResourceKind } from "../../models/kinds";
import { mockProjectResource } from "../../models/test-utils";
-import { ProjectResource } from "../../models/project";
-import { GroupClass } from "../../models/group";
describe('project-reducer', () => {
<MainAppBar
user={user}
onDetailsPanelToggle={jest.fn()}
+ onContextMenu={jest.fn()}
{...{ searchText: "", breadcrumbs: [], menuItems: { accountMenu: [], helpMenu: [], anonymousMenu: [] }, onSearch: jest.fn(), onBreadcrumbClick: jest.fn(), onMenuItemClick: jest.fn() }}
/>
);
<MainAppBar
menuItems={menuItems}
onDetailsPanelToggle={jest.fn()}
+ onContextMenu={jest.fn()}
{...{ searchText: "", breadcrumbs: [], onSearch: jest.fn(), onBreadcrumbClick: jest.fn(), onMenuItemClick: jest.fn() }}
/>
);
searchText="search text"
searchDebounce={2000}
onSearch={onSearch}
+ onContextMenu={jest.fn()}
onDetailsPanelToggle={jest.fn()}
{...{ user, breadcrumbs: [], menuItems: { accountMenu: [], helpMenu: [], anonymousMenu: [] }, onBreadcrumbClick: jest.fn(), onMenuItemClick: jest.fn() }}
/>
<MainAppBar
breadcrumbs={items}
onBreadcrumbClick={onBreadcrumbClick}
+ onContextMenu={jest.fn()}
onDetailsPanelToggle={jest.fn()}
{...{ user, searchText: "", menuItems: { accountMenu: [], helpMenu: [], anonymousMenu: [] }, onSearch: jest.fn(), onMenuItemClick: jest.fn() }}
/>
<MainAppBar
menuItems={menuItems}
onMenuItemClick={onMenuItemClick}
+ onContextMenu={jest.fn()}
onDetailsPanelToggle={jest.fn()}
{...{ user, searchText: "", breadcrumbs: [], onSearch: jest.fn(), onBreadcrumbClick: jest.fn() }}
/>
import ProjectTree from './project-tree';
import { TreeItem } from '../../components/tree/tree';
-import { Project } from '../../models/project';
-import { ResourceKind } from "../../models/resource";
+import { ProjectResource } from '../../models/project';
+import { mockProjectResource } from '../../models/test-utils';
Enzyme.configure({ adapter: new Adapter() });
describe("ProjectTree component", () => {
it("should render ListItemIcon", () => {
- const project: TreeItem<Project> = {
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- kind: ResourceKind.PROJECT
- },
+ const project: TreeItem<ProjectResource> = {
+ data: mockProjectResource(),
id: "3",
open: true,
active: true,
status: 1
};
- const wrapper = mount(<ProjectTree projects={[project]} toggleOpen={jest.fn()} toggleActive={jest.fn()} />);
+ const wrapper = mount(<ProjectTree
+ projects={[project]}
+ toggleOpen={jest.fn()}
+ toggleActive={jest.fn()}
+ onContextMenu={jest.fn()} />);
expect(wrapper.find(ListItemIcon)).toHaveLength(1);
});
it("should render 2 ListItemIcons", () => {
- const project: Array<TreeItem<Project>> = [
+ const project: Array<TreeItem<ProjectResource>> = [
{
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- kind: ResourceKind.PROJECT
- },
+ data: mockProjectResource(),
id: "3",
open: false,
active: true,
status: 1
},
{
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- kind: ResourceKind.PROJECT
- },
+ data: mockProjectResource(),
id: "3",
open: false,
active: true,
status: 1
}
];
- const wrapper = mount(<ProjectTree projects={project} toggleOpen={jest.fn()} toggleActive={jest.fn()} />);
+ const wrapper = mount(<ProjectTree
+ projects={project}
+ toggleOpen={jest.fn()}
+ toggleActive={jest.fn()}
+ onContextMenu={jest.fn()} />);
expect(wrapper.find(ListItemIcon)).toHaveLength(2);
});
it("should render Collapse", () => {
- const project: Array<TreeItem<Project>> = [
+ const project: Array<TreeItem<ProjectResource>> = [
{
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- kind: ResourceKind.PROJECT
- },
+ data: mockProjectResource(),
id: "3",
open: true,
active: true,
status: 2,
items: [
{
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- kind: ResourceKind.PROJECT
- },
+ data: mockProjectResource(),
id: "3",
open: true,
active: true,
]
}
];
- const wrapper = mount(<ProjectTree projects={project} toggleOpen={jest.fn()} toggleActive={jest.fn()}/>);
+ const wrapper = mount(<ProjectTree
+ projects={project}
+ toggleOpen={jest.fn()}
+ toggleActive={jest.fn()}
+ onContextMenu={jest.fn()} />);
expect(wrapper.find(Collapse)).toHaveLength(1);
});
it("should render CircularProgress", () => {
- const project: TreeItem<Project> = {
- data: {
- name: "sample name",
- createdAt: "2018-06-12",
- modifiedAt: "2018-06-13",
- uuid: "uuid",
- ownerUuid: "ownerUuid",
- href: "href",
- kind: ResourceKind.PROJECT
- },
+ const project: TreeItem<ProjectResource> = {
+ data: mockProjectResource(),
id: "3",
open: false,
active: true,
status: 1
};
- const wrapper = mount(<ProjectTree projects={[project]} toggleOpen={jest.fn()} toggleActive={jest.fn()} />);
+ const wrapper = mount(<ProjectTree
+ projects={[project]}
+ toggleOpen={jest.fn()}
+ toggleActive={jest.fn()}
+ onContextMenu={jest.fn()} />);
expect(wrapper.find(CircularProgress)).toHaveLength(1);
});
//
// SPDX-License-Identifier: AGPL-3.0
-import { ResourceKind } from "../../models/kinds";
import { GroupContentsResource } from "../../services/groups-service/groups-service";
+import { ResourceKind } from "../../models/resource";
export interface ProjectPanelItem {
uuid: string;
import { DataColumns } from '../../components/data-table/data-table';
import { RouteComponentProps } from 'react-router';
import { RootState } from '../../store/store';
-import { ResourceKind } from '../../models/kinds';
import { DataTableFilterItem } from '../../components/data-table-filters/data-table-filters';
import { ContainerRequestState } from '../../models/container-request';
import { SortDirection } from '../../components/data-table/data-column';
+import { ResourceKind } from '../../models/resource';
export const PROJECT_PANEL_ID = "projectPanel";
import { authService } from '../../services/services';
import detailsPanelActions, { loadDetails } from "../../store/details-panel/details-panel-action";
-import { ResourceKind } from '../../models/kinds';
import { SidePanelIdentifiers } from '../../store/side-panel/side-panel-reducer';
import { ProjectResource } from '../../models/project';
+import { ResourceKind } from '../../models/resource';
const drawerWidth = 240;
const appBarHeight = 100;