Skip to content

Commit d32ef7a

Browse files
committedJun 4, 2016
handle toggle topPanel on window close/open
1 parent 20d49d7 commit d32ef7a

40 files changed

+9140
-42
lines changed
 

Diff for: ‎.gitignore

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
1-
.DS_Store
21
node_modules
3-
npm-debug.log
4-
test
5-
tutorial-builder.mindnode
2+
tutorial/.tmp.*

Diff for: ‎coderoad.json

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
{
2+
"info": {
3+
"title": "Project Title",
4+
"description": "Project description."
5+
},
6+
"pages": [
7+
{
8+
"title": "Add & Subtract",
9+
"description": "Writing basic functions.\n\nA function has inputs and outputs. The inputs we call \"parameters\" and wrap them in `(` brackets `)`.\n\nThe output is `return`ed from the function.\n\n```\n // input\nfunction doSomething(parameter) {\n // output\n return parameter;\n}\n```\n\nTry making your own basic functions.",
10+
"tasks": [
11+
{
12+
"description": "write a function `addOne` that adds one to a number",
13+
"tests": [
14+
"01/01"
15+
],
16+
"hints": [
17+
"return the parameter + 1",
18+
"second hint"
19+
],
20+
"actions": [
21+
"open('page-01.js')",
22+
"set('// addOne\nfunction addOne(x) {\n return ::>\n}\n')"
23+
]
24+
},
25+
{
26+
"description": "write a function `subtractOne` that subtracts one from a number",
27+
"tests": [
28+
"01/02"
29+
],
30+
"hints": [
31+
"return the parameter - 1"
32+
],
33+
"actions": [
34+
"insert('\n// subtractOne\nfunction subtractOne(x) {\n return ::>\n}\n')"
35+
]
36+
}
37+
],
38+
"onPageComplete": "Continue to learn more about multiply & divide"
39+
},
40+
{
41+
"title": "Divide & Multiply",
42+
"description": "Writing basic functions continued.\n\nWe'll write two more basic functions, this time without any help.",
43+
"tasks": [
44+
{
45+
"description": "write a function `divideOne` divides a number by 1",
46+
"tests": [
47+
"02/01"
48+
],
49+
"actions": [
50+
"open('page-02.js')",
51+
"set('// divideOne\nfunction divideOne(x) {\n return ::>\n}\n')"
52+
]
53+
},
54+
{
55+
"description": "write a function `mutiplyone` that multiplies a number by 1",
56+
"tests": [
57+
"02/02"
58+
],
59+
"actions": [
60+
"insert('\n// multiplyOne\nfunction multiplyOne(x) {\n return ::>\n}\n')"
61+
]
62+
}
63+
]
64+
}
65+
]
66+
}

Diff for: ‎lib/actions.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ var tutorial_1 = require('./modules/tutorial');
1010
exports.tutorialInit = tutorial_1.tutorialInit;
1111
exports.tutorialLoad = tutorial_1.tutorialLoad;
1212
exports.tutorialPageAdd = tutorial_1.tutorialPageAdd;
13+
var window_1 = require('./modules/window');
14+
exports.windowToggle = window_1.windowToggle;
1315
var alert_1 = require('core-coderoad/lib/alert');
1416
exports.alertOpen = alert_1.alertOpen;
1517
exports.alertClose = alert_1.alertClose;
@@ -22,5 +24,3 @@ exports.editorSave = editor_1.editorSave;
2224
exports.editorSet = editor_1.editorSet;
2325
var route_1 = require('core-coderoad/lib/route');
2426
exports.routeSet = route_1.routeSet;
25-
var window_1 = require('core-coderoad/lib/window');
26-
exports.windowToggle = window_1.windowToggle;

Diff for: ‎lib/components/AppMenu/CloseWindow.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var React = require('react');
1717
var react_redux_1 = require('react-redux');
1818
var IconButton_1 = require('material-ui/IconButton');
1919
var close_1 = require('material-ui/svg-icons/navigation/close');
20+
var actions_1 = require('../../actions');
2021
var CloseWindow = (function (_super) {
2122
__extends(CloseWindow, _super);
2223
function CloseWindow() {
@@ -28,7 +29,7 @@ var CloseWindow = (function (_super) {
2829
CloseWindow = __decorate([
2930
react_redux_1.connect(null, function (dispatch) {
3031
return {
31-
windowToggle: function () { return dispatch({ type: 'WINDOW_TOGGLE' }); }
32+
windowToggle: function () { return dispatch(actions_1.windowToggle()); }
3233
};
3334
}),
3435
__metadata('design:paramtypes', [])

Diff for: ‎lib/components/Page/Tasks/index.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ var styles = {
1616
}
1717
};
1818
var Tasks = function (_a) {
19-
var tasks = _a.tasks, page = _a.page;
20-
return (React.createElement("div", null, tasks.map(function (task, index) { return (React.createElement(Card_1.Card, {style: styles.card}, React.createElement(Card_1.CardTitle, null, "Task ", index + 1, React.createElement(Tests_1.default, {style: { float: 'right' }, tests: task.tests})), React.createElement(Tabs_1.Tabs, {tabItemContainerStyle: styles.tabBar}, React.createElement(Tabs_1.Tab, {label: 'Description'}, React.createElement(Task_1.default, {key: index.toString(), index: index, task: task})), React.createElement(Tabs_1.Tab, {label: 'Actions'}, React.createElement(TaskActions_1.default, {actions: task.actions})), React.createElement(Tabs_1.Tab, {label: 'Hints'}, React.createElement(Hints_1.default, {hints: task.hints}))))); }), React.createElement(TasksComplete_1.default, {page: page})));
19+
var tasks = _a.tasks, page = _a.page, config = _a.config;
20+
return (React.createElement("div", null, tasks.map(function (task, index) { return (React.createElement(Card_1.Card, {style: styles.card}, React.createElement(Card_1.CardTitle, null, "Task ", index + 1, React.createElement(Tests_1.default, {style: { float: 'right' }, tests: task.tests, config: config})), React.createElement(Tabs_1.Tabs, {tabItemContainerStyle: styles.tabBar}, React.createElement(Tabs_1.Tab, {label: 'Description'}, React.createElement(Task_1.default, {key: index.toString(), index: index, task: task})), React.createElement(Tabs_1.Tab, {label: 'Actions'}, React.createElement(TaskActions_1.default, {actions: task.actions})), React.createElement(Tabs_1.Tab, {label: 'Hints'}, React.createElement(Hints_1.default, {hints: task.hints}))))); }), React.createElement(TasksComplete_1.default, {page: page})));
2121
};
2222
Object.defineProperty(exports, "__esModule", { value: true });
2323
exports.default = Tasks;

Diff for: ‎lib/components/Page/Tests/index.js

+41-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,45 @@
11
"use strict";
2-
var React = require('react');
3-
var Tests = function (_a) {
4-
var tests = _a.tests, style = _a.style;
5-
return (React.createElement("div", {style: style}, tests.map(function (test) { return React.createElement("p", null, test); })));
2+
var __extends = (this && this.__extends) || function (d, b) {
3+
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
4+
function __() { this.constructor = d; }
5+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
6+
};
7+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11+
return c > 3 && r && Object.defineProperty(target, key, r), r;
612
};
13+
var __metadata = (this && this.__metadata) || function (k, v) {
14+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15+
};
16+
var React = require('react');
17+
var react_redux_1 = require('react-redux');
18+
var path_1 = require('path');
19+
var actions_1 = require('../../../actions');
20+
var config_options_1 = require('../../../config-options');
21+
var Tests = (function (_super) {
22+
__extends(Tests, _super);
23+
function Tests() {
24+
_super.apply(this, arguments);
25+
}
26+
Tests.prototype.render = function () {
27+
var _this = this;
28+
var _a = this.props, tests = _a.tests, config = _a.config, style = _a.style, open = _a.open;
29+
var suffix = config_options_1.default[config.language].suffix;
30+
return (React.createElement("div", {style: style}, tests.map(function (test) { return (React.createElement("button", {onClick: open.bind(_this, test.concat('.' + suffix))}, test)); })));
31+
};
32+
Tests = __decorate([
33+
react_redux_1.connect(null, function (dispatch) {
34+
return {
35+
open: function (file) {
36+
dispatch(actions_1.editorOpen(path_1.join('tutorial', file)));
37+
}
38+
};
39+
}),
40+
__metadata('design:paramtypes', [])
41+
], Tests);
42+
return Tests;
43+
}(React.Component));
744
Object.defineProperty(exports, "__esModule", { value: true });
845
exports.default = Tests;

Diff for: ‎lib/components/Page/index.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@ var Page = (function (_super) {
2020
Page.prototype.componentDidMount = function () {
2121
Top_1.default.toggle(true);
2222
};
23+
Page.prototype.componentDidUnmount = function () {
24+
Top_1.default.toggle(false);
25+
};
2326
Page.prototype.render = function () {
24-
var _a = this.props, tutorial = _a.tutorial, pagePosition = _a.pagePosition;
27+
var _a = this.props, tutorial = _a.tutorial, pagePosition = _a.pagePosition, packageJson = _a.packageJson;
2528
var page = tutorial.pages[pagePosition];
2629
if (!page) {
2730
return null;
2831
}
29-
return (React.createElement("section", {style: styles, className: 'cr-page'}, React.createElement(index_1.ContentCard, {title: page.title, content: page.description}), React.createElement(Tasks_1.default, {tasks: page.tasks, page: page})));
32+
return (React.createElement("section", {style: styles, className: 'cr-page'}, React.createElement(index_1.ContentCard, {title: page.title, content: page.description}), React.createElement(Tasks_1.default, {tasks: page.tasks, page: page, config: packageJson.config})));
3033
};
3134
return Page;
3235
}(React.Component));

Diff for: ‎lib/components/TopPanel/Top.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ var Top = {
77
_this.top = document.createElement('div');
88
_this.top.setAttribute('id', 'crb-top');
99
_this.top.style.height = '33px';
10-
_this.top.hidden = true;
10+
Top.toggle(false);
1111
return _this.top;
1212
},
1313
toggle: function (open) {
14-
_this.top.hidden = !open || !_this.top.hidden;
14+
_this.top.hidden = !open;
1515
},
1616
unmount: function () {
1717
ReactDOM.unmountComponentAtNode(_this.root);

Diff for: ‎lib/config-options.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
"use strict";
22
var tutorialConfigOptions = {
33
JS: {
4+
suffix: 'js',
45
runners: [
56
'mocha-coderoad'
67
]
78
},
89
Python: {
10+
suffix: 'py',
911
runners: [
1012
'pytest-coderoad'
1113
]

Diff for: ‎lib/modules/window/actions.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"use strict";
2+
var types_1 = require('./types');
3+
function windowToggle() {
4+
return function (dispatch, getState) {
5+
var route = getState().route;
6+
dispatch({ type: types_1.WINDOW_TOGGLE, payload: { route: route } });
7+
};
8+
}
9+
exports.windowToggle = windowToggle;

Diff for: ‎lib/modules/window/index.js

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"use strict";
2+
var reducer_1 = require('./reducer');
3+
exports.reducer = reducer_1.default;
4+
var actions_1 = require('./actions');
5+
exports.windowToggle = actions_1.windowToggle;

Diff for: ‎lib/modules/window/reducer.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"use strict";
2+
var types_1 = require('./types');
3+
var Top_1 = require('../../components/TopPanel/Top');
4+
function windowToggle(open, action) {
5+
if (open === void 0) { open = false; }
6+
switch (action.type) {
7+
case types_1.WINDOW_TOGGLE:
8+
if (open) {
9+
Top_1.default.toggle(false);
10+
}
11+
else if (!open && action.payload.route === 'page') {
12+
Top_1.default.toggle(true);
13+
}
14+
return !open;
15+
default:
16+
return open;
17+
}
18+
}
19+
Object.defineProperty(exports, "__esModule", { value: true });
20+
exports.default = windowToggle;

Diff for: ‎lib/modules/window/types.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
"use strict";
2+
exports.WINDOW_TOGGLE = 'WINDOW_TOGGLE';

Diff for: ‎lib/reducers.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ var page_position_1 = require('./modules/page-position');
44
var setup_1 = require('./modules/setup');
55
var package_json_1 = require('./modules/package-json');
66
var tutorial_1 = require('./modules/tutorial');
7+
var window_1 = require('./modules/window');
78
var alert_1 = require('core-coderoad/lib/alert');
89
var editor_1 = require('core-coderoad/lib/editor');
910
var route_1 = require('core-coderoad/lib/route');
10-
var window_1 = require('core-coderoad/lib/window');
1111
Object.defineProperty(exports, "__esModule", { value: true });
1212
exports.default = redux_1.combineReducers({
1313
alert: alert_1.reducer, checks: setup_1.reducer, editor: editor_1.reducer, dir: editor_1.dir,

Diff for: ‎lib/subscriptions.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
"use strict";
22
var CompositeDisposable = require('atom').CompositeDisposable;
33
var store_1 = require('./store');
4+
var actions_1 = require('./actions');
45
var Root_1 = require('./components/Root');
56
var Top_1 = require('./components/TopPanel/Top');
67
var subscriptions = null;
78
function onActivate() {
89
subscriptions = new CompositeDisposable;
910
subscriptions.add(atom.commands.add('atom-workspace', {
10-
'cb-viewer:toggle': function () { return store_1.default.dispatch({ type: 'WINDOW_TOGGLE' }); }
11+
'cb-viewer:toggle': function () { return store_1.default.dispatch(actions_1.windowToggle()); }
1112
}));
1213
return subscriptions;
1314
}

Diff for: ‎src/actions.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ export {pageSet} from './modules/page-position';
22
export {pjSave} from './modules/package-json';
33
export {setupVerify, setupPackage} from './modules/setup';
44
export {tutorialInit, tutorialLoad, tutorialPageAdd} from './modules/tutorial';
5+
export {windowToggle} from './modules/window';
56

67
export {alertOpen, alertClose, alertReplay} from 'core-coderoad/lib/alert';
78
export {editorDevToolsToggle, editorOpen, editorInsert,
89
editorSave, editorSet} from 'core-coderoad/lib/editor';
910
export {routeSet} from 'core-coderoad/lib/route';
10-
export {windowToggle} from 'core-coderoad/lib/window';

Diff for: ‎src/components/AppMenu/CloseWindow.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import * as React from 'react';
22
import {connect} from 'react-redux';
33
import IconButton from 'material-ui/IconButton';
44
import NavigationClose from 'material-ui/svg-icons/navigation/close';
5+
import {windowToggle} from '../../actions';
56

67
@connect(null, (dispatch) => {
78
return {
8-
windowToggle: () => dispatch({ type: 'WINDOW_TOGGLE'})
9+
windowToggle: () => dispatch(windowToggle())
910
};
1011
})
1112
export default class CloseWindow extends React.Component<{

Diff for: ‎src/components/Page/Tasks/index.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ const styles = {
2121
};
2222

2323
const Tasks: React.StatelessComponent<{
24-
tasks: CR.Task[], page: CR.Page
25-
}> = ({tasks, page}) => (
24+
tasks: CR.Task[], page: CR.Page, config: Tutorial.Config
25+
}> = ({tasks, page, config}) => (
2626
<div>
2727
{tasks.map((task: CR.Task, index: number) => (
2828
<Card style={styles.card}>
@@ -31,6 +31,7 @@ const Tasks: React.StatelessComponent<{
3131
<Tests
3232
style={{float: 'right'}}
3333
tests={task.tests}
34+
config={config}
3435
/>
3536
</CardTitle>
3637
<Tabs tabItemContainerStyle={styles.tabBar}>

Diff for: ‎src/components/Page/Tests/index.tsx

+28-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
11
import * as React from 'react';
2+
import {connect} from 'react-redux';
3+
import {join} from 'path';
4+
import {editorOpen} from '../../../actions';
5+
import tutorialConfigOptions from '../../../config-options';
26

3-
4-
const Tests: React.StatelessComponent<{
5-
tests: string[], style: Object
6-
}> = ({tests, style}) => (
7-
<div style={style}>
8-
{tests.map(test => <p>{test}</p>)}
9-
</div>
10-
);
11-
export default Tests;
7+
@connect(null, dispatch => {
8+
return {
9+
open: (file: string) => {
10+
dispatch(editorOpen(join('tutorial', file)));
11+
}
12+
};
13+
})
14+
export default class Tests extends React.Component<{
15+
tests: string[], config: Tutorial.Config, style?: Object, open?: (file: string) => any
16+
}, {}> {
17+
render() {
18+
const {tests, config, style, open} = this.props;
19+
const suffix = tutorialConfigOptions[config.language].suffix;
20+
return (
21+
<div style={style}>
22+
{tests.map(test => (
23+
<button onClick={
24+
open.bind(this, test.concat('.' + suffix))
25+
}>{test}</button>
26+
))}
27+
</div>
28+
);
29+
}
30+
}

Diff for: ‎src/components/Page/index.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@ const styles = {
1111
};
1212

1313
export default class Page extends React.Component<{
14-
tutorial: CR.Tutorial, pagePosition: number
14+
tutorial: CR.Tutorial, pagePosition: number, packageJson: PackageJson
1515
}, {}> {
1616
componentDidMount() {
1717
Top.toggle(true);
1818
}
19+
componentDidUnmount() {
20+
Top.toggle(false);
21+
}
1922
render() {
20-
const {tutorial, pagePosition} = this.props;
23+
const {tutorial, pagePosition, packageJson} = this.props;
2124
const page = tutorial.pages[pagePosition];
2225

2326
if (!page) { return null; }
@@ -31,6 +34,7 @@ export default class Page extends React.Component<{
3134
<Tasks
3235
tasks={page.tasks}
3336
page={page}
37+
config={packageJson.config}
3438
/>
3539
</section>
3640
);

0 commit comments

Comments
 (0)
Please sign in to comment.