Skip to content

Commit 263ac61

Browse files
committed
attach hints to bottom
1 parent 49d5e4b commit 263ac61

File tree

16 files changed

+157
-26
lines changed

16 files changed

+157
-26
lines changed

lib/components/page/page.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var tasks_1 = require('./tasks/tasks');
1313
var hints_1 = require('./hints/hints');
1414
var page_complete_1 = require('./complete/page-complete');
1515
var toolbar_1 = require('./toolbar/toolbar');
16+
var progress_bar_1 = require('./progress-bar');
1617
var pageStyle = {
1718
height: '100%',
1819
width: '100%'
@@ -29,7 +30,7 @@ var Page = (function (_super) {
2930
var _a = this.props, page = _a.page, taskPosition = _a.taskPosition, hintPosition = _a.hintPosition, tasks = _a.tasks, testRun = _a.testRun;
3031
var currentTask = taskPosition <= tasks.length ? tasks[taskPosition] : null;
3132
var allComplete = taskPosition >= tasks.length;
32-
return (React.createElement(Paper_1.default, {style: pageStyle, zDepth: 1, className: 'cr-page', ref: 'page'}, React.createElement(content_1.PageContent, {page: page}), React.createElement(Divider_1.default, null), React.createElement(tasks_1.Tasks, {tasks: tasks, taskPosition: taskPosition, testRun: testRun}), React.createElement("div", {className: 'listEnd', ref: 'listEnd'}), React.createElement(hints_1.Hints, {task: currentTask, hintPosition: hintPosition}), React.createElement(page_complete_1.PageCompleteMessage, {page: page}), React.createElement(toolbar_1.PageToolbar, {tasks: tasks, taskPosition: taskPosition})));
33+
return (React.createElement(Paper_1.default, {style: pageStyle, zDepth: 1, className: 'cr-page', ref: 'page'}, React.createElement(content_1.PageContent, {page: page}), React.createElement(Divider_1.default, null), React.createElement(tasks_1.Tasks, {tasks: tasks, taskPosition: taskPosition, testRun: testRun}), React.createElement("div", {className: 'listEnd', ref: 'listEnd'}), React.createElement(page_complete_1.PageCompleteMessage, {page: page}), React.createElement(hints_1.Hints, {task: currentTask, hintPosition: hintPosition}), React.createElement(toolbar_1.PageToolbar, {tasks: tasks, taskPosition: taskPosition}, React.createElement(progress_bar_1.ProgressBar, {taskPosition: taskPosition, taskCount: tasks.length}))));
3334
};
3435
return Page;
3536
}(React.Component));

lib/components/page/progress-bar.js

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"use strict";
2+
var React = require('react');
3+
var LinearProgress_1 = require('material-ui/LinearProgress');
4+
exports.ProgressBar = function (_a) {
5+
var taskPosition = _a.taskPosition, taskCount = _a.taskCount;
6+
var progress = (taskPosition / taskCount) * 100;
7+
return React.createElement(LinearProgress_1.default, {mode: 'determinate', value: progress, style: { height: '10px' }});
8+
};
+2-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
"use strict";
22
var React = require('react');
33
var Toolbar_1 = require('material-ui/Toolbar');
4-
var progress_bar_1 = require('./progress-bar');
54
var buttons_1 = require('./buttons');
65
exports.PageToolbar = function (_a) {
7-
var tasks = _a.tasks, taskPosition = _a.taskPosition;
8-
return (React.createElement("section", {className: 'cr-page-toolbar'}, React.createElement(progress_bar_1.ProgressBar, {taskPosition: taskPosition, taskCount: tasks.length}), React.createElement(Toolbar_1.Toolbar, null, React.createElement(Toolbar_1.ToolbarGroup, {float: 'left'}, React.createElement(buttons_1.ToggleLog, null)), React.createElement(Toolbar_1.ToolbarGroup, {float: 'right'}, taskPosition >= tasks.length ?
6+
var tasks = _a.tasks, taskPosition = _a.taskPosition, children = _a.children;
7+
return (React.createElement("section", {className: 'cr-page-toolbar'}, children, React.createElement(Toolbar_1.Toolbar, null, React.createElement(Toolbar_1.ToolbarGroup, {float: 'left'}, React.createElement(buttons_1.ToggleLog, null)), React.createElement(Toolbar_1.ToolbarGroup, {float: 'right'}, taskPosition >= tasks.length ?
98
React.createElement(buttons_1.Continue, null) : React.createElement(buttons_1.Save, null)))));
109
};

lib/reducers/reducer.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ var task_position_1 = require('./task-position/task-position');
1010
var hint_position_1 = require('./hint-position/hint-position');
1111
var task_tests_1 = require('./task-tests/task-tests');
1212
var alert_1 = require('./alert/alert');
13-
var run_tests_1 = require('./run-tests/run-tests');
13+
var test_run_1 = require('./test-run/test-run');
1414
var editor_actions_1 = require('./editor-actions/editor-actions');
1515
var tutorials_1 = require('./tutorials/tutorials');
1616
var log_1 = require('./log/log');
@@ -20,6 +20,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
2020
exports.default = redux_1.combineReducers({
2121
globals: globals_1.default, tutorialInfo: tutorial_info_1.default, route: route_1.default, progress: progress_1.default, position: position_1.default,
2222
page: page_1.default, tasks: tasks_1.default, taskPosition: task_position_1.default, hintPosition: hint_position_1.default,
23-
taskTests: task_tests_1.default, alert: alert_1.default, testRun: run_tests_1.default, editorActions: editor_actions_1.default,
23+
taskTests: task_tests_1.default, alert: alert_1.default, testRun: test_run_1.default, editorActions: editor_actions_1.default,
2424
tutorials: tutorials_1.default, log: log_1.default, checks: checks_1.default
2525
});
+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
"use strict";
2+
var path_1 = require('path');
3+
var fs_1 = require('fs');
4+
var comments = {
5+
py: '#'
6+
};
7+
function loaderRegex(fileType) {
8+
var comment = '\/{2,3}';
9+
if (comments[fileType]) {
10+
comment = comments[fileType];
11+
}
12+
return new RegExp("^" + comment + " ?load\\(['\"](.+)['\"](, ?true)?\\)", 'm');
13+
}
14+
function parseLoaders(data, fileType) {
15+
var i = -1;
16+
var lines = data.split('\n');
17+
var filesLoaded = [];
18+
var loaderMatch = loaderRegex(fileType);
19+
while (i < lines.length - 1) {
20+
i += 1;
21+
var loader = lines[i].match(loaderMatch);
22+
if (loader) {
23+
var fileToLoad = loader[1];
24+
if (filesLoaded.indexOf(fileToLoad) > -1) {
25+
console.log("\"" + fileToLoad + "\" already loaded.");
26+
continue;
27+
}
28+
var pathToFile = null;
29+
if (loader[2]) {
30+
pathToFile = path_1.normalize(path_1.join(window.coderoad.tutorialDir, fileToLoad));
31+
}
32+
else {
33+
pathToFile = path_1.normalize(path_1.join(window.coderoad.dir, fileToLoad));
34+
}
35+
try {
36+
lines[i] = fs_1.readFileSync(pathToFile, 'utf8');
37+
}
38+
catch (e) {
39+
var message = 'File not found: ' + pathToFile;
40+
lines[i] = message;
41+
console.log(message);
42+
}
43+
}
44+
}
45+
return lines.join('\n');
46+
}
47+
Object.defineProperty(exports, "__esModule", { value: true });
48+
exports.default = parseLoaders;

lib/reducers/test-run/run.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"use strict";
2+
var test_result_1 = require('./test-result');
3+
var store_1 = require('../../store/store');
4+
var fs_1 = require('fs');
5+
var path_1 = require('path');
6+
var parse_loaders_1 = require('./parse-loaders');
7+
function runTaskTests(setup) {
8+
var tests = store_1.store.getState().taskTests;
9+
if (tests && tests.length) {
10+
var config = window.coderoad;
11+
config.taskPosition = store_1.store.getState().taskPosition;
12+
var output = parse_loaders_1.default(tests, window.coderoad.suffix);
13+
var target = path_1.join(window.coderoad.tutorialDir || window.coderoad.dir, "_tmp." + window.coderoad.suffix);
14+
fs_1.writeFileSync(target, output, 'utf8');
15+
window.coderoad.runner(target, config, test_result_1.handleResult);
16+
}
17+
return true;
18+
}
19+
exports.runTaskTests = runTaskTests;

lib/reducers/test-run/test-result.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"use strict";
2+
var store_1 = require('../../store/store');
3+
var _actions_1 = require('../../actions/_actions');
4+
function handleResult(result) {
5+
store_1.store.dispatch(_actions_1.testComplete());
6+
if (result.completed) {
7+
store_1.store.dispatch(_actions_1.testResult(result));
8+
store_1.store.dispatch(_actions_1.completePage());
9+
}
10+
else if (!result.pass) {
11+
store_1.store.dispatch(_actions_1.testResult(result));
12+
}
13+
else if (result.pass) {
14+
result.msg = "Task " + result.taskPosition + " Complete";
15+
store_1.store.dispatch(_actions_1.testResult(result));
16+
}
17+
}
18+
exports.handleResult = handleResult;
19+
;

lib/reducers/test-run/test-run.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"use strict";
2+
var _types_1 = require('../../actions/_types');
3+
var run_1 = require('./run');
4+
var pageTimeout = 2000;
5+
var previous = new Date().getTime();
6+
function runTestReducer(testRun, action) {
7+
if (testRun === void 0) { testRun = false; }
8+
switch (action.type) {
9+
case _types_1.TEST_RUN:
10+
var current = new Date().getTime();
11+
if (current - previous > pageTimeout) {
12+
previous = current;
13+
return run_1.runTaskTests();
14+
}
15+
return false;
16+
case _types_1.TEST_COMPLETE:
17+
return false;
18+
case _types_1.PAGE_SET:
19+
previous = new Date().getTime();
20+
return false;
21+
default:
22+
return testRun;
23+
}
24+
}
25+
Object.defineProperty(exports, "__esModule", { value: true });
26+
exports.default = runTestReducer;

src/components/page/_page.less

+3-13
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,10 @@
11
@import 'tasks/_tasks';
22
@import 'chapter/_chapter';
3+
@import 'toolbar/_toolbar';
4+
@import 'complete/_page-complete';
5+
@import 'hints/_hints';
36

47
.cr-page {
58
position: relative;
69
overflow-y: scroll;
7-
&-listEnd {
8-
9-
}
10-
&-onComplete {
11-
margin-bottom: 70px;
12-
}
13-
&-toolbar {
14-
position: fixed;
15-
bottom: 0;
16-
right: 0;
17-
height: 60px;
18-
width: 400px;
19-
}
2010
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.cr-page-onComplete {
2+
margin-bottom: 70px;
3+
}

src/components/page/hints/_hints.less

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.cr-task-hints {
2+
position: fixed;
3+
bottom: 60px;
4+
right: 0;
5+
margin: 0;
6+
width: 400px;
7+
text-align: center;
8+
}

src/components/page/page.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {Tasks} from './tasks/tasks';
77
import {Hints} from './hints/hints';
88
import {PageCompleteMessage} from './complete/page-complete';
99
import {PageToolbar} from './toolbar/toolbar';
10+
import {ProgressBar} from './progress-bar';
1011

1112
const pageStyle = {
1213
height: '100%',
@@ -38,9 +39,11 @@ render() {
3839

3940
<Tasks tasks={tasks} taskPosition={taskPosition} testRun={testRun} />
4041
<div className='listEnd' ref='listEnd'></div>
41-
<Hints task={currentTask} hintPosition={hintPosition} />
4242
<PageCompleteMessage page={page} />
43-
<PageToolbar tasks={tasks} taskPosition={taskPosition} />
43+
<Hints task={currentTask} hintPosition={hintPosition} />
44+
<PageToolbar tasks={tasks} taskPosition={taskPosition}>
45+
<ProgressBar taskPosition={taskPosition} taskCount={tasks.length}/>
46+
</PageToolbar>
4447
</Paper>
4548
);
4649
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.cr-page-toolbar {
2+
position: fixed;
3+
bottom: 0;
4+
right: 0;
5+
height: 60px;
6+
width: 400px;
7+
}

src/components/page/toolbar/toolbar.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import * as React from 'react';
22
import {Toolbar, ToolbarGroup} from 'material-ui/Toolbar';
3-
import {ProgressBar} from './progress-bar';
43
import {ToggleLog, Save, Continue} from './buttons';
54

65
export const PageToolbar: React.StatelessComponent<{
7-
tasks: CR.Task[], taskPosition: number
8-
}> = ({tasks, taskPosition}) => (
6+
tasks: CR.Task[], taskPosition: number, children?: any
7+
}> = ({tasks, taskPosition, children}) => (
98
<section className='cr-page-toolbar'>
10-
<ProgressBar taskPosition={taskPosition} taskCount={tasks.length}/>
9+
10+
{children}
1111

1212
<Toolbar>
1313
<ToolbarGroup float='left'>

tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@
114114
"src/components/page/hints/buttons.tsx",
115115
"src/components/page/hints/hints.tsx",
116116
"src/components/page/page.tsx",
117+
"src/components/page/progress-bar.tsx",
117118
"src/components/page/tasks/tasks.tsx",
118119
"src/components/page/toolbar/buttons.tsx",
119-
"src/components/page/toolbar/progress-bar.tsx",
120120
"src/components/page/toolbar/toolbar.tsx",
121121
"src/components/progress/progress.tsx",
122122
"src/components/render.tsx",

0 commit comments

Comments
 (0)