Skip to content

Commit 053bfee

Browse files
committed
Revision component list working.
1 parent a437020 commit 053bfee

15 files changed

+251
-56
lines changed

app/app-tray.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { Tray, app, Menu } from 'electron';
2+
3+
export default class AppTray extends Tray {
4+
constructor(iconPath, mainWindow) {
5+
super(iconPath);
6+
7+
this.mainWindow = mainWindow;
8+
9+
this.setToolTip('Code Sentinel');
10+
this.on('click', this.onClick.bind(this));
11+
this.on('right-click', this.onRightClick.bind(this));
12+
}
13+
14+
onClick(event, bounds) {
15+
// Click event bounds
16+
const { x, y } = bounds;
17+
18+
// Window height and width
19+
const { height, width } = this.mainWindow.getBounds();
20+
21+
if (this.mainWindow.isVisible()) {
22+
this.mainWindow.hide();
23+
} else {
24+
const yPosition = process.platform === 'darwin' ? y : y - height;
25+
this.mainWindow.setBounds({
26+
x: x - width / 2,
27+
y: yPosition,
28+
height,
29+
width
30+
});
31+
this.mainWindow.show();
32+
}
33+
}
34+
35+
onRightClick() {
36+
const menuConfig = Menu.buildFromTemplate([
37+
{
38+
label: 'Quit',
39+
click: () => app.quit()
40+
}
41+
]);
42+
43+
this.popUpContextMenu(menuConfig);
44+
}
45+
}

app/app.global.css

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,38 @@
11
@import "~font-awesome/css/font-awesome.css";
22

3+
.loader-hidden {
4+
display: none !important;
5+
}
6+
7+
.loader-active {
8+
display: block !important;
9+
position: absolute !important;
10+
top: 30%;
11+
left: 25em;
12+
}
13+
314
body {
415
position: relative;
5-
color: white;
16+
color: black;
617
height: 100vh;
7-
background-color: #232c39;
8-
background-image: linear-gradient(45deg, rgba(0, 216, 255, 0.5) 10%, rgba(0, 1, 127, 0.7));
9-
font-family: Arial, Helvetica, Helvetica Neue, serif;
1018
overflow-y: hidden;
19+
background-color: #657ba0;
1120
}
1221

1322
h2 {
1423
margin: 0;
1524
font-size: 2.25rem;
1625
font-weight: bold;
1726
letter-spacing: -0.025em;
18-
color: #fff;
19-
}
20-
21-
p {
22-
font-size: 24px;
27+
color: black;
2328
}
2429

2530
li {
2631
list-style: none;
2732
}
2833

2934
a {
30-
color: white;
35+
color: black;
3136
opacity: 0.75;
3237
text-decoration: none;
3338
}

app/app.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
<html>
33
<head>
44
<meta charset="utf-8">
5-
<title>Hello Electron React!</title>
5+
<title>Code Sentinel</title>
6+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.1/css/materialize.min.css">
7+
<link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
8+
<link href="https://cdnjs.cloudflare.com/ajax/libs/loaders.css/0.1.2/loaders.min.css" rel="stylesheet" />
69
<script>
710
(function() {
811
if (!process.env.HOT) {

app/components/Home.css

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
.container {
22
position: absolute;
3-
top: 30%;
3+
top: 5%;
44
left: 10px;
55
text-align: center;
66
}
77

88
.container h2 {
9-
font-size: 5rem;
9+
font-size: 2rem;
10+
text-align: center !important;
1011
}
1112

1213
.container a {

app/components/Home.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
11
// @flow
22
import React, { Component } from 'react';
33
import { Link } from 'react-router-dom';
4+
import { Loader } from 'react-loaders';
45
import SvnRevisionList from './SvnRevisionList';
56
import styles from './Home.css';
67

78
export default class Home extends Component {
9+
10+
state: {
11+
loading: boolean
12+
};
13+
14+
constructor(props) {
15+
super(props);
16+
this.state = {
17+
loading: true
18+
};
19+
}
20+
21+
onRevisionLoaded() {
22+
this.setState({ loading: false });
23+
console.log('state: ', this.state.loading);
24+
}
25+
826
render() {
927
return (
1028
<div>
11-
<div className={styles.container} data-tid="container">
12-
<h2>Home</h2>
13-
<SvnRevisionList />
14-
<Link to="/counter">to Counter</Link>
29+
<div className="loader-container" key="loader">
30+
<Loader type="pacman" active={this.state.loading} size="lg" />
31+
</div>
32+
<div className={styles.container} style={this.state.loading ? { display: 'none' } : { }} data-tid="container" key="home-container">
33+
<SvnRevisionList onRevisionLoaded={() => this.onRevisionLoaded()} />
1534
</div>
1635
</div>
1736
);

app/components/SvnRevisionList.css

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.video-select-screen h4, .video-select-screen-small h4 {
2-
text-align: center;
2+
text-align: left;
33
}
44

55
.video-list .collection-item {
@@ -71,3 +71,15 @@
7171
align-self: center;
7272
width: 50%;
7373
}
74+
75+
div {
76+
text-align: left !important;
77+
}
78+
79+
i {
80+
position: absolute !important;
81+
}
82+
83+
p {
84+
margin-left: 2.5em;
85+
}

app/components/SvnRevisionList.js

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,54 +2,82 @@
22
import React, { Component } from 'react';
33
import { Link } from 'react-router-dom';
44
import path from 'path';
5+
import util from 'util';
56
import _ from 'lodash';
67
import dateFormat from 'dateformat';
8+
import { func, array } from 'prop-types';
79
import DiffSvn2Git from 'diffsvn2git';
810
import styles from './SvnRevisionList.css';
911

1012
const workingPath = path.resolve('tmp/repo');
11-
console.log('working path: ', workingPath);
1213
const diffSvn2Git = new DiffSvn2Git({ cwd: workingPath });
1314

1415
export default class SvnRevisionList extends Component {
1516

17+
propTypes: {
18+
onRevisionLoaded: func.isRequired
19+
};
20+
21+
state: {
22+
revisions: array,
23+
onRevisionLoaded: func.isRequired
24+
};
25+
1626
constructor(props) {
1727
super(props);
1828
this.state = {
1929
revisions: []
2030
};
2131
}
2232

33+
componentDidUpdate() {
34+
35+
}
36+
2337
componentWillMount() {
2438
const self = this;
25-
console.log('Init render');
26-
diffSvn2Git.listRevisionsByDate('2015-04-12').then((loadedRevisions) => {
27-
console.log(loadedRevisions);
39+
40+
diffSvn2Git.listRevisionsByDate('2011-04-15').then((loadedRevisions) => {
2841

2942
self.setState({
30-
revisions: loadedRevisions
43+
revisions: loadedRevisions
3144
});
45+
console.log('onRevisionLoaded');
46+
this.props.onRevisionLoaded();
3247
});
33-
console.log('End render');
3448
}
3549

36-
render() {
37-
let rows = [];
38-
39-
console.log('Revisions: ', this.state.revisions);
40-
this.state.revisions.forEach(revision => {
41-
rows.push(<li className="collection-item avatar" key={revision.author}>
42-
<i className="material-icons circle btn-floating">review</i>
50+
createItem(rows: Array<any>, revision: Object) {
51+
rows.push(
52+
<li key={revision.$.revision}>
4353
<div style={styles.fileName}>
54+
<i className="material-icons">label</i>
4455
<p>{`r${revision.$.revision} | ${dateFormat(revision.date, 'dd/mm/yyyy HH:MM:ss')} | ${revision.author} | ${revision.msg}`}</p>
4556
</div>
46-
</li>);
57+
</li>
58+
);
59+
}
60+
61+
render() {
62+
const rows = [];
63+
64+
this.state.revisions.forEach(revisionList => {
65+
if (util.isArray(revisionList)) {
66+
revisionList.forEach(revision => {
67+
this.createItem(rows, revision);
68+
});
69+
} else {
70+
this.createItem(rows, revisionList);
71+
}
4772
});
4873

4974
return (
50-
<ul className="collection video-list">
51-
{rows}
52-
</ul>
75+
<div>
76+
<ul className="video-list">
77+
{rows}
78+
</ul>
79+
</div>
5380
);
5481
}
82+
5583
}

app/main.development.js

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
/* eslint global-require: 1, flowtype-errors/show-errors: 0 */
22
// @flow
3-
import { app, BrowserWindow } from 'electron';
3+
import { app, BrowserWindow, Tray, Menu } from 'electron';
4+
import path from 'path';
45
import MenuBuilder from './menu';
56

7+
let tray = null;
8+
69
let mainWindow = null;
10+
const iconPath = path.join(__dirname, 'robot-ico.png');
711

812
if (process.env.NODE_ENV === 'production') {
913
const sourceMapSupport = require('source-map-support');
@@ -12,7 +16,6 @@ if (process.env.NODE_ENV === 'production') {
1216

1317
if (process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true') {
1418
require('electron-debug')();
15-
const path = require('path');
1619
const p = path.join(__dirname, '..', 'app', 'node_modules');
1720
require('module').globalPaths.push(p);
1821
}
@@ -26,8 +29,8 @@ const installExtensions = async () => {
2629
];
2730

2831
return Promise
29-
.all(extensions.map(name => installer.default(installer[name], forceDownload)))
30-
.catch(console.log);
32+
.all(extensions.map(name => installer.default(installer[name], forceDownload)))
33+
.catch(console.log);
3134
};
3235

3336

@@ -46,27 +49,56 @@ app.on('ready', async () => {
4649
}
4750

4851
mainWindow = new BrowserWindow({
49-
show: false,
50-
width: 1024,
51-
height: 728
52+
height: 700,
53+
width: 728,
54+
resizable: false,
55+
webPreferences: { backgroundThrottling: false },
56+
icon: iconPath
5257
});
53-
5458
mainWindow.loadURL(`file://${__dirname}/app.html`);
5559

5660
// @TODO: Use 'ready-to-show' event
5761
// https://github.com/electron/electron/blob/master/docs/api/browser-window.md#using-ready-to-show-event
5862
mainWindow.webContents.on('did-finish-load', () => {
5963
if (!mainWindow) {
60-
throw new Error('"mainWindow" is not defined');
64+
throw new Error('"mainWindow" is not defined');
6165
}
6266
mainWindow.show();
6367
mainWindow.focus();
6468
});
6569

66-
mainWindow.on('closed', () => {
67-
mainWindow = null;
70+
mainWindow.on('minimize', (event) => {
71+
event.preventDefault();
72+
mainWindow.hide();
73+
});
74+
75+
mainWindow.on('close', (event) => {
76+
if (!app.isQuiting) {
77+
event.preventDefault();
78+
mainWindow.hide();
79+
} else {
80+
mainWindow = null;
81+
}
82+
return false;
6883
});
6984

7085
const menuBuilder = new MenuBuilder(mainWindow);
7186
menuBuilder.buildMenu();
87+
88+
tray = new Tray(iconPath);
89+
tray.setToolTip('Code Sentinel');
90+
tray.on('click', () => {
91+
mainWindow.show();
92+
});
93+
94+
tray.on('right-click', () => {
95+
const menuConfig = Menu.buildFromTemplate([
96+
{
97+
label: 'Quit',
98+
click: () => app.quit()
99+
}
100+
]);
101+
102+
this.popUpContextMenu(menuConfig);
103+
});
72104
});

app/menu.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export default class MenuBuilder {
2828
}
2929

3030
setupDevelopmentEnvironment() {
31-
this.mainWindow.openDevTools();
31+
// this.mainWindow.openDevTools();
3232
this.mainWindow.webContents.on('context-menu', (e, props) => {
3333
const { x, y } = props;
3434

0 commit comments

Comments
 (0)