Comparar commits

...

5 Commits

Autor SHA1 Mensagem Data
Wallace Breza dd0727d022 Fixed editor sidebar bad css class 2019-08-27 08:32:37 -07:00
Wallace Breza d562d56ae9 Reverted window.require changes and enabled node integration 2019-08-27 08:15:31 -07:00
Wallace Breza b38ffe4a99 Fixes electron mocks in tests 2019-08-27 08:15:31 -07:00
Wallace Breza b1bf5cce8f Fixing issue with dependency updates 2019-08-27 08:15:31 -07:00
Wallace Breza 111077275b Updated VoTT dependencies 2019-08-27 08:15:30 -07:00
18 arquivos alterados com 10093 adições e 6720 exclusões
+1 -1
Ver Arquivo
@@ -19,6 +19,6 @@ linux:
target:
- snap
publish: null
electronVersion: 3.0.13
electronVersion: 6.0.3
extraFiles:
- "cocoSSDModel"
+9907 -6570
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+83 -81
Ver Arquivo
@@ -14,50 +14,6 @@
"license": "MIT",
"private": true,
"main": "build/main.js",
"dependencies": {
"@azure/storage-blob": "^10.3.0",
"@tensorflow/tfjs": "^1.0.3",
"@types/snapsvg": "^0.4.35",
"axios": "^0.18.0",
"bootstrap": "^4.1.3",
"buffer-reverse": "^1.0.1",
"crypto-js": "^3.1.9-1",
"dotenv": "^7.0.0",
"google-protobuf": "^3.6.1",
"jpeg-js": "^0.3.4",
"json2csv": "^4.5.0",
"lodash": "^4.17.11",
"md5.js": "^1.3.5",
"node-fetch": "^2.3.0",
"node-int64": "^0.4.0",
"rc-align": "^2.4.5",
"rc-checkbox": "^2.1.6",
"rc-menu": "^7.4.21",
"rc-slider": "^8.6.7",
"react": "^16.7.0",
"react-appinsights": "^3.0.0-rc.5",
"react-color": "^2.17.0",
"react-dom": "^16.7.0",
"react-jsonschema-form": "^1.3.0",
"react-localization": "^1.0.13",
"react-modal": "^3.8.1",
"react-redux": "^5.1.1",
"react-router-dom": "^4.3.1",
"react-scripts": "2.1.1",
"react-split-pane": "^0.1.87",
"react-tag-input": "^6.1.0",
"react-toastify": "^4.5.2",
"react-virtualized": "^9.21.0",
"react-vis": "^1.11.6",
"reactstrap": "^6.5.0",
"redux": "^4.0.1",
"redux-thunk": "^2.3.0",
"rimraf": "^2.6.2",
"shortid": "^2.2.14",
"video-react": "^0.13.2",
"vott-ct": "2.1.24",
"vott-react": "^0.2.10"
},
"scripts": {
"start": "nf start -p 3000",
"compile": "tsc",
@@ -84,6 +40,89 @@
"postinstall": "electron-builder install-app-deps",
"predebug": "npm run build && npm run webpack:dev"
},
"dependencies": {
"@azure/storage-blob": "^10.4.0",
"@tensorflow/tfjs": "^1.2.8",
"@types/snapsvg": "^0.4.35",
"axios": "^0.18.0",
"bootstrap": "^4.1.3",
"buffer-reverse": "^1.0.1",
"crypto-js": "^3.1.9-1",
"dotenv": "^7.0.0",
"google-protobuf": "^3.6.1",
"jpeg-js": "^0.3.4",
"json2csv": "^4.5.0",
"lodash": "^4.17.11",
"md5.js": "^1.3.5",
"node-fetch": "^2.3.0",
"node-int64": "^0.4.0",
"rc-align": "^2.4.5",
"rc-checkbox": "^2.1.6",
"rc-menu": "^7.4.21",
"rc-slider": "^8.6.7",
"react": "^16.9.0",
"react-appinsights": "^3.0.0",
"react-color": "^2.17.0",
"react-dom": "^16.9.0",
"react-jsonschema-form": "^1.3.0",
"react-localization": "^1.0.13",
"react-modal": "^3.8.1",
"react-redux": "^5.1.1",
"react-router-dom": "^4.3.1",
"react-scripts": "^3.1.1",
"react-split-pane": "^0.1.87",
"react-tag-input": "^6.1.0",
"react-toastify": "^4.5.2",
"react-virtualized": "^9.21.1",
"react-vis": "^1.11.6",
"reactstrap": "^6.5.0",
"redux": "^4.0.4",
"redux-thunk": "^2.3.0",
"rimraf": "^2.6.2",
"shortid": "^2.2.14",
"video-react": "^0.13.9",
"vott-ct": "2.1.24",
"vott-react": "^0.2.10"
},
"devDependencies": {
"@fortawesome/fontawesome-free": "^5.5.0",
"@types/axios": "^0.14.0",
"@types/dotenv": "^6.1.0",
"@types/enzyme": "^3.10.3",
"@types/jest": "^23.3.13",
"@types/json2csv": "^4.4.0",
"@types/node": "10.12.7",
"@types/react": "^16.9.2",
"@types/react-dom": "^16.9.0",
"@types/react-jsonschema-form": "^1.0.12",
"@types/react-router-dom": "^4.3.5",
"@types/react-split-pane": "^0.1.67",
"@types/react-toastify": "^4.0.1",
"@types/reactstrap": "^6.4.3",
"@types/redux-logger": "^3.0.6",
"@types/redux-mock-store": "^1.0.0",
"cross-env": "^5.2.0",
"electron": "^6.0.4",
"electron-builder": "^21.2.0",
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0",
"eslint": "^6.2.2",
"foreman": "^3.0.1",
"jest-enzyme": "^7.1.0",
"jquery": "^3.3.1",
"node-sass": "^4.10.0",
"popper.js": "^1.14.6",
"react-test-renderer": "^16.9.0",
"redux-immutable-state-invariant": "^2.1.0",
"redux-logger": "^3.0.6",
"redux-mock-store": "^1.5.3",
"ts-loader": "^5.3.0",
"tslint": "^5.11.0",
"typescript": "^3.5.3",
"webpack": "^4.39.1",
"webpack-cli": "^3.3.7",
"webpack-merge": "^4.1.5"
},
"eslintConfig": {
"extends": "react-app"
},
@@ -93,43 +132,6 @@
"not ie <= 11",
"not op_mini all"
],
"devDependencies": {
"@fortawesome/fontawesome-free": "^5.5.0",
"@types/axios": "^0.14.0",
"@types/dotenv": "^6.1.0",
"@types/enzyme": "^3.1.15",
"@types/jest": "23.3.9",
"@types/json2csv": "^4.4.0",
"@types/node": "10.12.7",
"@types/react": "16.7.6",
"@types/react-dom": "16.0.9",
"@types/react-jsonschema-form": "^1.0.12",
"@types/react-router-dom": "^4.3.1",
"@types/react-split-pane": "^0.1.67",
"@types/react-toastify": "^4.0.1",
"@types/reactstrap": "^6.4.3",
"@types/redux-logger": "^3.0.6",
"@types/redux-mock-store": "^1.0.0",
"cross-env": "^5.2.0",
"electron": "^3.0.13",
"electron-builder": "^20.38.3",
"enzyme": "^3.7.0",
"enzyme-adapter-react-16": "^1.7.0",
"foreman": "^3.0.1",
"jest-enzyme": "^7.0.1",
"jquery": "^3.3.1",
"node-sass": "^4.10.0",
"popper.js": "^1.14.6",
"redux-immutable-state-invariant": "^2.1.0",
"redux-logger": "^3.0.6",
"redux-mock-store": "^1.5.3",
"ts-loader": "^5.3.0",
"tslint": "^5.11.0",
"typescript": "^3.1.6",
"webpack": "^4.19.1",
"webpack-cli": "^3.1.2",
"webpack-merge": "^4.1.5"
},
"engines": {
"node": ">=10.14.2",
"npm": ">=6.4.1"
+29 -25
Ver Arquivo
@@ -1,6 +1,6 @@
import {
app, ipcMain, BrowserWindow, BrowserWindowConstructorOptions,
Menu, MenuItemConstructorOptions,
Menu, MenuItemConstructorOptions, MenuItem,
} from "electron";
import { IpcMainProxy } from "./common/ipcMainProxy";
import LocalFileSystem from "./providers/storage/localFileSystem";
@@ -18,13 +18,16 @@ function createWindow() {
titleBarStyle: "hidden",
backgroundColor: "#272B30",
show: false,
// Node Integration is now disabled by default
// https://github.com/electron/electron/pull/16235
webPreferences: {
nodeIntegration: true,
},
};
const staticUrl = process.env.ELECTRON_START_URL || `file:///${__dirname}/index.html`;
if (process.env.ELECTRON_START_URL) {
windowOptions.webPreferences = {
webSecurity: false,
};
windowOptions.webPreferences.webSecurity = false;
}
mainWindow = new BrowserWindow(windowOptions);
@@ -70,20 +73,21 @@ function onToggleDevTools() {
*/
function registerContextMenu(browserWindow: BrowserWindow): void {
const selectionMenu = Menu.buildFromTemplate([
{ role: "copy", accelerator: "CmdOrCtrl+C" },
{ type: "separator" },
{ role: "selectall", accelerator: "CmdOrCtrl+A" },
new MenuItem({ role: "copy", accelerator: "CmdOrCtrl+C" }),
new MenuItem({ role: "copy", accelerator: "CmdOrCtrl+C" }),
new MenuItem({ type: "separator" }),
new MenuItem({ role: "selectAll", accelerator: "CmdOrCtrl+A" }),
]);
const inputMenu = Menu.buildFromTemplate([
{ role: "undo", accelerator: "CmdOrCtrl+Z" },
{ role: "redo", accelerator: "CmdOrCtrl+Shift+Z" },
{ type: "separator" },
{ role: "cut", accelerator: "CmdOrCtrl+X" },
{ role: "copy", accelerator: "CmdOrCtrl+C" },
{ role: "paste", accelerator: "CmdOrCtrl+V" },
{ type: "separator" },
{ role: "selectall", accelerator: "CmdOrCtrl+A" },
new MenuItem({ role: "undo", accelerator: "CmdOrCtrl+Z" }),
new MenuItem({ role: "redo", accelerator: "CmdOrCtrl+Shift+Z" }),
new MenuItem({ type: "separator" }),
new MenuItem({ role: "cut", accelerator: "CmdOrCtrl+X" }),
new MenuItem({ role: "copy", accelerator: "CmdOrCtrl+C" }),
new MenuItem({ role: "paste", accelerator: "CmdOrCtrl+V" }),
new MenuItem({ type: "separator" }),
new MenuItem({ role: "selectAll", accelerator: "CmdOrCtrl+A" }),
]);
browserWindow.webContents.on("context-menu", (e, props) => {
@@ -107,16 +111,16 @@ function registerContextMenu(browserWindow: BrowserWindow): void {
},
{ role: "editMenu" },
{
label: "View", submenu: [
{ role: "reload" },
{ type: "separator" },
{ role: "toggleDevTools" },
{ role: "toggleFullScreen" },
{ type: "separator" },
{ role: "resetZoom" },
{ role: "zoomIn" },
{ role: "zoomOut" },
],
label: "View", submenu: Menu.buildFromTemplate([
new MenuItem({ role: "reload" }),
new MenuItem({ type: "separator" }),
new MenuItem({ role: "toggleDevTools" }),
new MenuItem({ role: "togglefullscreen" }),
new MenuItem({ type: "separator" }),
new MenuItem({ role: "resetZoom" }),
new MenuItem({ role: "zoomIn" }),
new MenuItem({ role: "zoomOut" }),
]),
},
{ role: "windowMenu" },
];
@@ -73,7 +73,7 @@ describe("LocalFileSystem Storage Provider", () => {
it("selectContainer opens a dialog and resolves with selected path", async () => {
const expectedContainerPath = "/path/to/container";
const mockMethod = dialog.showOpenDialog as jest.Mock;
mockMethod.mockReturnValue([expectedContainerPath]);
mockMethod.mockReturnValue(Promise.resolve({ filePaths: [expectedContainerPath] }));
const result = await localFileSystem.selectContainer();
expect(result).toEqual(expectedContainerPath);
@@ -81,9 +81,10 @@ describe("LocalFileSystem Storage Provider", () => {
it("selectContainer rejects when a folder path is not returned", async () => {
const mockMethod = dialog.showOpenDialog as jest.Mock;
mockMethod.mockReturnValue([]);
mockMethod.mockReturnValue(Promise.resolve({ filePaths: [] }));
await expect(localFileSystem.selectContainer()).rejects.not.toBeNull();
const result = await localFileSystem.selectContainer();
expect(result).toEqual("");
});
it("deleting file that doesn't exist resolves successfully", async () => {
+11 -13
Ver Arquivo
@@ -12,20 +12,18 @@ export default class LocalFileSystem implements IStorageProvider {
constructor(private browserWindow: BrowserWindow) { }
public selectContainer(): Promise<string> {
return new Promise<string>((resolve, reject) => {
const filePaths = dialog.showOpenDialog(this.browserWindow, {
title: strings.connections.providers.local.selectFolder,
buttonLabel: strings.connections.providers.local.chooseFolder,
properties: ["openDirectory", "createDirectory"],
});
if (!filePaths || filePaths.length !== 1) {
return reject();
}
resolve(filePaths[0]);
public async selectContainer(): Promise<string> {
const dialogResult = await dialog.showOpenDialog(this.browserWindow, {
title: strings.connections.providers.local.selectFolder,
buttonLabel: strings.connections.providers.local.chooseFolder,
properties: ["openDirectory", "createDirectory"],
});
if (!dialogResult.filePaths || dialogResult.filePaths.length !== 1) {
return "";
}
return dialogResult.filePaths[0];
}
public readText(filePath: string): Promise<string> {
-1
Ver Arquivo
@@ -5,7 +5,6 @@ import {
TokenCredential, AnonymousCredential, ContainerURL,
StorageURL, ServiceURL, Credential, Aborter, BlockBlobURL,
} from "@azure/storage-blob";
import { BlobDeleteResponse } from "@azure/storage-blob/typings/lib/generated/lib/models";
/**
* Options for Azure Cloud Storage
@@ -21,7 +21,7 @@ describe("Alert component", () => {
it("Renders nothing if not activated", () => {
const wrapper = createComponent(defaultProps);
expect(wrapper.html()).toBeNull();
expect(wrapper.html()).toEqual("");
});
it("Renders modal when activated", () => {
@@ -161,7 +161,7 @@ describe("Video Asset Component", () => {
};
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(3).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(3).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).toBeCalled();
expect(videoPlayerMock.prototype.seek).toBeCalledWith(expectedAsset.timestamp);
@@ -174,7 +174,7 @@ describe("Video Asset Component", () => {
onBeforeAssetChangedHandler.mockImplementationOnce(() => false);
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(3).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(3).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).not.toBeCalled();
expect(videoPlayerMock.prototype.seek).not.toBeCalled();
@@ -190,8 +190,8 @@ describe("Video Asset Component", () => {
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(3).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(2).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(3).find("button").simulate("click");
wrapper.find(CustomVideoPlayerButton).at(2).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).toBeCalled();
expect(videoPlayerMock.prototype.seek).toBeCalledWith(expectedAsset.timestamp);
@@ -203,7 +203,7 @@ describe("Video Asset Component", () => {
onBeforeAssetChangedHandler.mockImplementationOnce(() => false);
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(3).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(3).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).not.toBeCalled();
expect(videoPlayerMock.prototype.seek).not.toBeCalled();
@@ -214,8 +214,8 @@ describe("Video Asset Component", () => {
const currentAsset = childAssets[0];
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(3).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(1).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(3).find("button").simulate("click");
wrapper.find(CustomVideoPlayerButton).at(1).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).toBeCalled();
expect(videoPlayerMock.prototype.seek).toBeCalledWith(
@@ -227,7 +227,7 @@ describe("Video Asset Component", () => {
onBeforeAssetChangedHandler.mockImplementationOnce(() => false);
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(3).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(3).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).not.toBeCalled();
expect(videoPlayerMock.prototype.seek).not.toBeCalled();
@@ -237,7 +237,7 @@ describe("Video Asset Component", () => {
const currentAsset = childAssets[4];
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(0).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(0).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).toBeCalled();
expect(videoPlayerMock.prototype.seek).toBeCalledWith(
@@ -249,7 +249,7 @@ describe("Video Asset Component", () => {
onBeforeAssetChangedHandler.mockImplementationOnce(() => false);
setupMoveFrameTest(currentAsset);
wrapper.find(CustomVideoPlayerButton).at(0).simulate("click");
wrapper.find(CustomVideoPlayerButton).at(0).find("button").simulate("click");
expect(videoPlayerMock.prototype.pause).not.toBeCalled();
expect(videoPlayerMock.prototype.seek).not.toBeCalled();
@@ -22,7 +22,7 @@ describe("Confirm component", () => {
it("Renders nothing if not activiated", () => {
const wrapper = createComponent(defaultProps);
expect(wrapper.html()).toBeNull();
expect(wrapper.html()).toEqual("");
});
it("Renders modal when activiated", () => {
@@ -97,4 +97,4 @@ export class ConnectionPicker extends React.Component<IConnectionPickerProps, IC
}
}
export const ConnectionPickerWithRouter = withRouter<IConnectionPickerProps>(ConnectionPicker);
export const ConnectionPickerWithRouter = withRouter(ConnectionPicker);
@@ -2,7 +2,7 @@ import React from "react";
import { IActiveLearningFormProps, ActiveLearningForm, IActiveLearningFormState } from "./activeLearningForm";
import { ReactWrapper, mount } from "enzyme";
import { ModelPathType, IActiveLearningSettings } from "../../../../models/applicationState";
import Form from "react-jsonschema-form";
import Form, { IChangeEvent } from "react-jsonschema-form";
describe("Active Learning Form", () => {
const onChangeHandler = jest.fn();
@@ -21,6 +21,17 @@ describe("Active Learning Form", () => {
onCancel: onCancelHandler,
};
const defaultEvent: IChangeEvent = {
edit: false,
errorSchema: null,
errors: [],
idSchema: null,
schema: null,
status: null,
uiSchema: null,
formData: null,
};
function createComponent(props?: IActiveLearningFormProps)
: ReactWrapper<IActiveLearningFormProps, IActiveLearningFormState> {
props = props || defaultProps;
@@ -72,16 +83,16 @@ describe("Active Learning Form", () => {
};
// Set type to URL
wrapper.find(Form).props().onChange({ formData: { modelPathType: ModelPathType.Url } });
wrapper.find(Form).props().onChange({ ...defaultEvent, formData: { modelPathType: ModelPathType.Url } });
// Set the remaining settings
wrapper.find(Form).props().onChange({ formData });
wrapper.find(Form).props().onChange({ ...defaultEvent, formData });
expect(wrapper.state().formData).toEqual(formData);
expect(onChangeHandler).toBeCalledWith(formData);
});
it("submits form data to the registered submit handler", () => {
const wrapper = createComponent();
wrapper.find(Form).props().onSubmit({ formData: defaultProps.settings });
wrapper.find(Form).props().onSubmit({ ...defaultEvent, formData: defaultProps.settings });
expect(onSubmitHandler).toBeCalledWith(defaultProps.settings);
});
@@ -1,6 +1,6 @@
import React from "react";
import Form, { ISubmitEvent, IChangeEvent, Widget } from "react-jsonschema-form";
import { IActiveLearningSettings, ModelPathType } from "../../../../models/applicationState";
import { IActiveLearningSettings } from "../../../../models/applicationState";
import { strings, addLocValues } from "../../../../common/strings";
import CustomFieldTemplate from "../../common/customField/customFieldTemplate";
import LocalFolderPicker from "../../common/localFolderPicker/localFolderPicker";
@@ -42,7 +42,7 @@ export default class EditorSideBar extends React.Component<IEditorSideBarProps,
public render() {
return (
<div className="editor-page-bottombar-nav">
<div className="editor-page-sidebar-nav">
<AutoSizer>
{({ height, width }) => (
<List
+4 -5
Ver Arquivo
@@ -3,7 +3,6 @@ import Menu, { MenuItem, SubMenu, Divider } from "rc-menu";
import { PlatformType } from "../../../common/hostProcess";
import "./titleBar.scss";
import { strings } from "../../../common/strings";
import { HelpMenu } from "./helpMenu";
export interface ITitleBarProps extends React.Props<TitleBar> {
icon?: string | JSX.Element;
@@ -88,23 +87,23 @@ export class TitleBar extends React.Component<ITitleBarProps, ITitleBarState> {
{this.state.platform === PlatformType.Windows &&
<ul>
<li title={strings.titleBar.minimize} className="btn-window-minimize"
onClick={this.minimizeWindow}>
onClick={this.minimizeWindow}>
<i className="far fa-window-minimize" />
</li>
{!this.state.maximized &&
<li title={strings.titleBar.maximize} className="btn-window-maximize"
onClick={this.maximizeWindow}>
onClick={this.maximizeWindow}>
<i className="far fa-window-maximize" />
</li>
}
{this.state.maximized &&
<li title={strings.titleBar.restore} className="btn-window-restore"
onClick={this.unmaximizeWindow}>
onClick={this.unmaximizeWindow}>
<i className="far fa-window-restore" />
</li>
}
<li title={strings.titleBar.close} className="btn-window-close"
onClick={this.closeWindow}>
onClick={this.closeWindow}>
<i className="fas fa-times" />
</li>
</ul>
+1 -1
Ver Arquivo
@@ -40,7 +40,7 @@ export const reducer = (state: IProject = null, action: AnyAction): IProject =>
const updatedAssets = { ...state.assets } || {};
updatedAssets[action.payload.asset.id] = { ...action.payload.asset };
const assetTags = new Set();
const assetTags = new Set<string>();
action.payload.regions.forEach((region) => region.tags.forEach((tag) => assetTags.add(tag)));
const newTags: ITag[] = state.tags ? [...state.tags] : [];
+19 -1
Ver Arquivo
@@ -1,10 +1,28 @@
import { configure } from 'enzyme';
import 'jest-enzyme';
import Adapter from 'enzyme-adapter-react-16';
import { TextEncoder, TextDecoder } from 'util';
Object.defineProperties(global, {
TextEncoder: {
value: TextEncoder,
writable: true,
configurable: true,
enumerable: false
},
TextDecoder: {
value: TextDecoder,
writable: true,
configurable: true,
enumerable: false
}
});
configure({ adapter: new Adapter() });
// Silence console.log and console.group statements in testing
console.log = console.group = function() {};
console.log = console.group = function () { };
const electronMock = {
ipcRenderer: {
send: jest.fn(),
+4
Ver Arquivo
@@ -25,5 +25,9 @@
},
"include": [
"src"
],
"exclude": [
"**/*.test.ts",
"**/*.test.tsx"
]
}