robeaux 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gruntfile.js +43 -0
- data/Makefile +11 -2
- data/README.markdown +2 -0
- data/css/main.css +1 -0
- data/css/style.css +113 -24
- data/css/themes/blackboard.css +1 -0
- data/css/themes/dark.css +1 -0
- data/css/themes/gray.css +1 -0
- data/css/themes/whiteboard.css +1 -0
- data/images/bullet-connections-2.png +0 -0
- data/images/bullet-connections.png +0 -0
- data/images/bullet-devices-2.png +0 -0
- data/images/bullet-devices.png +0 -0
- data/images/devices-image-2.png +0 -0
- data/images/devices-image.png +0 -0
- data/images/logo-robeaux.png +0 -0
- data/images/robots-icon_03.png +0 -0
- data/index.html +15 -8
- data/js/controllers/widget_editor_ctrl.js +44 -0
- data/js/controllers/widgets_ctrl.js +40 -0
- data/js/directives/widget.js +50 -0
- data/js/router.js +5 -0
- data/js/services/themes.js +9 -5
- data/js/services/widgets.js +86 -0
- data/js/vendor/angular-route.min.js +1 -2
- data/js/vendor/angular.min.js +208 -206
- data/js/widgets/attitude.html +32 -0
- data/js/widgets/attitude.js +27 -0
- data/js/widgets/mindwave.html +51 -0
- data/js/widgets/mindwave.js +23 -0
- data/less/app.less +21 -0
- data/less/objects/buttons.less +32 -0
- data/less/objects/connections.less +28 -0
- data/less/objects/device.less +30 -0
- data/less/objects/forms.less +29 -0
- data/less/objects/list.less +27 -0
- data/less/objects/nav.less +33 -0
- data/less/objects/robot.less +43 -0
- data/less/objects/themes.less +18 -0
- data/less/objects/widgets.less +85 -0
- data/less/support/buttons.less +39 -0
- data/less/support/container.less +9 -0
- data/less/support/forms.less +18 -0
- data/less/support/mixins.less +3 -0
- data/less/themes/blackboard.less +158 -0
- data/less/themes/dark.less +148 -0
- data/less/themes/default.less +52 -0
- data/less/themes/gray.less +121 -0
- data/less/themes/whiteboard.less +152 -0
- data/less/vendor/elements.less +156 -0
- data/less/vendor/normalize.less +425 -0
- data/less/vendor/semantic-grid.less +67 -0
- data/less/views/devices.less +47 -0
- data/less/views/robots.less +132 -0
- data/less/views/themes.less +31 -0
- data/less/views/widgets.less +50 -0
- data/package.json +6 -3
- data/partials/device.html +66 -57
- data/partials/index.html +12 -6
- data/partials/robot.html +104 -51
- data/partials/themes.html +32 -29
- data/partials/widget_editor.html +68 -0
- data/robeaux.gemspec +1 -1
- data/test/controllers/device_commands_ctrl.js +129 -0
- data/test/controllers/device_events_ctrl.js +82 -0
- data/test/controllers/index_ctrl.js +48 -0
- data/test/controllers/nav_ctrl.js +40 -0
- data/test/controllers/robot_commands_ctrl.js +127 -0
- data/test/controllers/robot_ctrl.js +62 -0
- data/test/controllers/themes_ctrl.js +96 -0
- data/test/controllers/widget_editor_ctrl.js +111 -0
- data/test/controllers/widgets_ctrl.js +74 -0
- data/test/functions/functions.js +30 -0
- data/test/karma.conf.js +3 -7
- data/test/karma_test_all.conf.js +23 -0
- data/test/karma_test_controllers.conf.js +19 -0
- data/test/karma_test_functions.conf.js +14 -0
- data/test/karma_test_services.conf.js +17 -0
- data/test/services/themes.js +122 -0
- data/test/services/widgets.js +104 -0
- data/test/support/themes.json +9 -0
- data/test/support/widgets.json +18 -0
- data/test/vendor/angular-mocks.js +13 -13
- data/test/vendor/jquery.js +8 -8
- metadata +69 -3
- data/test/main.js +0 -248
@@ -0,0 +1,132 @@
|
|
1
|
+
body {
|
2
|
+
background: @body-background-color;
|
3
|
+
font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
4
|
+
color: @body-text-color;
|
5
|
+
}
|
6
|
+
|
7
|
+
.container-wrap {
|
8
|
+
margin-bottom: 30px;
|
9
|
+
}
|
10
|
+
|
11
|
+
.container, .robot, .widgets, .connections, .themes {
|
12
|
+
width: @gridsystem-width;
|
13
|
+
padding:0;
|
14
|
+
.container();
|
15
|
+
}
|
16
|
+
|
17
|
+
.row {
|
18
|
+
background: #fff;
|
19
|
+
padding: 15px 0;
|
20
|
+
margin-top: 10px;
|
21
|
+
.clearfix();
|
22
|
+
}
|
23
|
+
|
24
|
+
.robot-details {
|
25
|
+
.column(12);
|
26
|
+
}
|
27
|
+
|
28
|
+
.robot {
|
29
|
+
|
30
|
+
h2 {
|
31
|
+
.column(12);
|
32
|
+
text-align: center;
|
33
|
+
margin-bottom: 15px;
|
34
|
+
}
|
35
|
+
|
36
|
+
.input, .results {
|
37
|
+
.column(6);
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
.robot-detail {
|
42
|
+
.widgets {
|
43
|
+
.new-widget-instance {
|
44
|
+
height: 100vh;
|
45
|
+
width: 100%;
|
46
|
+
}
|
47
|
+
|
48
|
+
.active-widgets {
|
49
|
+
|
50
|
+
.add-widget {
|
51
|
+
.column(3);
|
52
|
+
}
|
53
|
+
|
54
|
+
button {
|
55
|
+
font-size: 2em;
|
56
|
+
}
|
57
|
+
|
58
|
+
widget {
|
59
|
+
.column(9);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
63
|
+
.panel {
|
64
|
+
margin: 10% auto;
|
65
|
+
width: 600px;
|
66
|
+
|
67
|
+
.type {
|
68
|
+
.column(5);
|
69
|
+
}
|
70
|
+
|
71
|
+
.attrs {
|
72
|
+
.column(7);
|
73
|
+
|
74
|
+
label {
|
75
|
+
.column(4);
|
76
|
+
}
|
77
|
+
|
78
|
+
input {
|
79
|
+
.column(8);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
.robot-devices {
|
86
|
+
.column(6);
|
87
|
+
}
|
88
|
+
|
89
|
+
.robot-connection {
|
90
|
+
.column(6);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
.commands, .device-commands {
|
95
|
+
.param {
|
96
|
+
.row(6);
|
97
|
+
height: 40px;
|
98
|
+
|
99
|
+
input[type='text'] {
|
100
|
+
.column(2,6);
|
101
|
+
}
|
102
|
+
|
103
|
+
select {
|
104
|
+
.column(1.5,6);
|
105
|
+
}
|
106
|
+
|
107
|
+
.close {
|
108
|
+
.column(0.5,6);
|
109
|
+
line-height: 34px;
|
110
|
+
&:hover {
|
111
|
+
color: #f00;
|
112
|
+
cursor: pointer;
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
.input>select, &>select {
|
118
|
+
width: 100%;
|
119
|
+
.container-block();
|
120
|
+
margin-bottom: 15px;
|
121
|
+
}
|
122
|
+
|
123
|
+
button {
|
124
|
+
width: 70%;
|
125
|
+
margin-top: 15px;
|
126
|
+
.container-block();
|
127
|
+
}
|
128
|
+
|
129
|
+
table {
|
130
|
+
width: 100%;
|
131
|
+
}
|
132
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
.themes {
|
2
|
+
.sidebar {
|
3
|
+
.column(4);
|
4
|
+
}
|
5
|
+
|
6
|
+
.new-theme {
|
7
|
+
.row(4);
|
8
|
+
|
9
|
+
input {
|
10
|
+
.column(3,4);
|
11
|
+
}
|
12
|
+
|
13
|
+
button {
|
14
|
+
.column(1,4);
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
.editor {
|
19
|
+
.column(8);
|
20
|
+
|
21
|
+
textarea {
|
22
|
+
width: 100%;
|
23
|
+
height: 250px;
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
.footer {
|
28
|
+
.clearfix();
|
29
|
+
.column(12);
|
30
|
+
}
|
31
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
.widgets {
|
2
|
+
.sidebar {
|
3
|
+
.column(3);
|
4
|
+
}
|
5
|
+
|
6
|
+
.new-widget {
|
7
|
+
.row(3);
|
8
|
+
|
9
|
+
input {
|
10
|
+
.column(2, 3);
|
11
|
+
}
|
12
|
+
|
13
|
+
button {
|
14
|
+
.column(1, 3);
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
.new-attr {
|
19
|
+
.row(9);
|
20
|
+
|
21
|
+
input {
|
22
|
+
.column(5, 9);
|
23
|
+
}
|
24
|
+
|
25
|
+
button {
|
26
|
+
.column(3, 9);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
.editor {
|
31
|
+
.column(9);
|
32
|
+
}
|
33
|
+
|
34
|
+
.attrs {
|
35
|
+
.column(9, 9);
|
36
|
+
}
|
37
|
+
|
38
|
+
.field {
|
39
|
+
.column(4.5, 9);
|
40
|
+
|
41
|
+
textarea {
|
42
|
+
width: 100%;
|
43
|
+
min-height: 250px;
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
.footer {
|
48
|
+
.column(12);
|
49
|
+
}
|
50
|
+
}
|
data/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "robeaux",
|
3
|
-
"version": "0.
|
3
|
+
"version": "0.3.0",
|
4
4
|
"description": "An AngularJS interface for the CPPP-IO API spec",
|
5
5
|
"homepage": "http://cylonjs.com",
|
6
6
|
"bugs": "https://github.com/hybridgroup/robeaux/issues",
|
@@ -11,8 +11,11 @@
|
|
11
11
|
},
|
12
12
|
"license": "Apache 2.0",
|
13
13
|
"devDependencies": {
|
14
|
+
"grunt": "^0.4.5",
|
15
|
+
"grunt-contrib-less": "^0.12.0",
|
16
|
+
"grunt-contrib-watch": "^0.6.1",
|
14
17
|
"karma": "~0.12.16",
|
15
|
-
"karma-
|
16
|
-
"karma-
|
18
|
+
"karma-jasmine": "~0.1.5",
|
19
|
+
"karma-phantomjs-launcher": "~0.1"
|
17
20
|
}
|
18
21
|
}
|
data/partials/device.html
CHANGED
@@ -1,67 +1,76 @@
|
|
1
|
-
<
|
2
|
-
<
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<div class="device-commands" ng-controller="DeviceCommandsCtrl">
|
8
|
-
<select ng-model="command" ng-options="cmd for cmd in device.commands">
|
9
|
-
</select>
|
10
|
-
|
11
|
-
<div class="params">
|
12
|
-
<div class="param" ng-repeat="param in device.params">
|
13
|
-
<input placeholder='name' type="text" ng-model="param.name" ng-focus="addParam($last)">
|
14
|
-
<input placeholder='value' type="text" ng-model="param.value" ng-focus="addParam($last)">
|
15
|
-
<select ng-options="type for type in types" ng-model="param.type"></select>
|
16
|
-
<span class="close" ng-click="removeParam($index)">X</span>
|
17
|
-
</div>
|
1
|
+
<section class="device-detail">
|
2
|
+
<div class="row">
|
3
|
+
<div class="device-header">
|
4
|
+
<h2>Commands</h2>
|
5
|
+
<h2>Events</h2>
|
18
6
|
</div>
|
7
|
+
</div>
|
19
8
|
|
20
|
-
|
9
|
+
<div class="row row-device">
|
10
|
+
<div class="container">
|
11
|
+
<div class="device-commands" ng-controller="DeviceCommandsCtrl">
|
12
|
+
<select ng-model="command" ng-options="cmd for cmd in device.commands">
|
13
|
+
</select>
|
21
14
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
15
|
+
<div class="params">
|
16
|
+
<div class="param" ng-repeat="param in device.params">
|
17
|
+
<input placeholder='name' type="text" ng-model="param.name" ng-focus="addParam($last)">
|
18
|
+
<input placeholder='value' type="text" ng-model="param.value" ng-focus="addParam($last)">
|
19
|
+
<select ng-options="type for type in types" ng-model="param.type"></select>
|
20
|
+
<span class="close" ng-click="removeParam($index)">✖</span>
|
21
|
+
</div>
|
22
|
+
</div>
|
26
23
|
|
27
|
-
|
28
|
-
<tr class="result" ng-repeat="entry in device.results">
|
29
|
-
<td>{{entry.result}}</td>
|
30
|
-
</tr>
|
31
|
-
</tbody>
|
32
|
-
</table>
|
33
|
-
</div>
|
24
|
+
<button class="btn btn-run" ng-click="submit()" ng-disabled="isDisabled()">run</button>
|
34
25
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
26
|
+
<table class="results">
|
27
|
+
<thead>
|
28
|
+
<tr>
|
29
|
+
<th>Results</th>
|
30
|
+
</tr>
|
31
|
+
</thead>
|
32
|
+
<tbody>
|
33
|
+
<tr class="result" ng-repeat="entry in device.results">
|
34
|
+
<td>{{entry.result}}</td>
|
35
|
+
</tr>
|
36
|
+
</tbody>
|
37
|
+
</table>
|
38
|
+
</div>
|
39
|
+
|
40
|
+
<div class="device-events" ng-controller="DeviceEventsCtrl">
|
41
|
+
<div class="input">
|
42
|
+
<input type="text" ng-model="eventName" placeholder="event name">
|
43
|
+
<button class="btn btn-robot" ng-click="listen()">listen</button>
|
44
|
+
</div>
|
40
45
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
46
|
+
<div class="listeners-div">
|
47
|
+
<table class="listeners">
|
48
|
+
<thead>
|
49
|
+
<th colspan="2">Listeners</th>
|
50
|
+
</thead>
|
45
51
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
<tbody>
|
53
|
+
<tr class="listener" ng-repeat="(name, listeners) in device.listeners">
|
54
|
+
<td>{{name}}</td>
|
55
|
+
<td class="remove" ng-click="remove(name)">remove</td>
|
56
|
+
</tr>
|
57
|
+
</tbody>
|
58
|
+
</table>
|
59
|
+
</div>
|
53
60
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
61
|
+
<table class="events">
|
62
|
+
<thead>
|
63
|
+
<th colspan="2">Events</th>
|
64
|
+
</thead>
|
58
65
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
+
<tbody>
|
67
|
+
<tr class="event" ng-repeat="event in device.events">
|
68
|
+
<td>{{event.name}}</td>
|
69
|
+
<td>{{event.data}}</td>
|
70
|
+
</tr>
|
71
|
+
</tbody>
|
72
|
+
</table>
|
73
|
+
</div>
|
74
|
+
</div>
|
66
75
|
</div>
|
67
|
-
</
|
76
|
+
</section>
|
data/partials/index.html
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
<div class="robots">
|
2
|
-
<div class="
|
3
|
-
<
|
4
|
-
|
2
|
+
<div class="row" ng-repeat="robot in robots" ng-click="details(robot.name)">
|
3
|
+
<div class="robot">
|
4
|
+
<div class="robot-details">
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
<span class="btn btn-robot btn-big">robot</span>
|
7
|
+
<span class="name">{{robot.name}}</span>
|
8
|
+
|
9
|
+
<div class="details">
|
10
|
+
<span class="bullet-connections"><strong>Connections</strong> {{robot.connections.length}}</span>
|
11
|
+
<span class="bullet-devices"><strong>Devices</strong> {{robot.devices.length}}</span>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
</div>
|
9
15
|
</div>
|
10
16
|
</div>
|
11
17
|
</div>
|
data/partials/robot.html
CHANGED
@@ -1,74 +1,127 @@
|
|
1
1
|
<div class="robot-detail">
|
2
|
-
<div class="robot" ng-class="{'with-commands': (robot.commands.length > 0)}">
|
3
|
-
<span class="icon">robot</span>
|
4
|
-
<span class="name">{{robot.name}}</span>
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
<!-- begin robot section -->
|
4
|
+
<div class="row">
|
5
|
+
<div class="robot" ng-class="{'with-commands': (robot.commands.length > 0)}">
|
6
|
+
<div class="robot-details">
|
7
|
+
<span class="btn btn-robot btn-big">robot</span>
|
8
|
+
<span class="name">{{robot.name}}</span>
|
9
|
+
|
10
|
+
<div class="details">
|
11
|
+
<span class="bullet-connections"><strong>Connections</strong> {{robot.connections.length}}</span>
|
12
|
+
<span class="bullet-devices"><strong>Devices</strong> {{robot.devices.length}}</span>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="commands" ng-if="(robot.commands.length > 0)" ng-controller="RobotCommandsCtrl">
|
17
|
+
<h2>Commands</h2>
|
18
|
+
<div class="input">
|
19
|
+
<select ng-model="command" ng-options="cmd for cmd in robot.commands">
|
20
|
+
</select>
|
10
21
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
<div class="param" ng-repeat="param in robot.params">
|
19
|
-
<input placeholder='name' type="text" ng-model="param.name" ng-focus="addParam($last)">
|
20
|
-
<input placeholder='value' type="text" ng-model="param.value" ng-focus="addParam($last)">
|
21
|
-
<select ng-options="type for type in types" ng-model="param.type"></select>
|
22
|
-
<span class="close" ng-click="removeParam($index)">X</span>
|
22
|
+
<div class="params">
|
23
|
+
<div class="param" ng-repeat="param in robot.params">
|
24
|
+
<input placeholder='name' type="text" ng-model="param.name" ng-focus="addParam($last)">
|
25
|
+
<input placeholder='value' type="text" ng-model="param.value" ng-focus="addParam($last)">
|
26
|
+
<select ng-options="type for type in types" ng-model="param.type"></select>
|
27
|
+
<span class="close" ng-click="removeParam($index)">✖</span>
|
28
|
+
</div>
|
23
29
|
</div>
|
30
|
+
|
31
|
+
<button class="btn btn-run" ng-click="submit()" ng-disabled="isDisabled()">run</button>
|
24
32
|
</div>
|
25
33
|
|
26
|
-
<
|
27
|
-
|
34
|
+
<div class="results">
|
35
|
+
<table>
|
36
|
+
<thead>
|
37
|
+
<th>Results</th>
|
38
|
+
</thead>
|
28
39
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
<tr class="result" ng-repeat="entry in robot.results">
|
37
|
-
<td>{{entry.result}}</td>
|
38
|
-
</tr>
|
39
|
-
</tbody>
|
40
|
-
</table>
|
40
|
+
<tbody>
|
41
|
+
<tr class="result" ng-repeat="entry in robot.results">
|
42
|
+
<td>{{entry.result}}</td>
|
43
|
+
</tr>
|
44
|
+
</tbody>
|
45
|
+
</table>
|
46
|
+
</div>
|
41
47
|
</div>
|
42
48
|
</div>
|
43
49
|
</div>
|
50
|
+
<!-- end robot section -->
|
44
51
|
|
45
|
-
|
46
|
-
|
52
|
+
<!-- begin widgets -->
|
53
|
+
<div class="row">
|
54
|
+
<div class="widgets" ng-controller="WidgetsCtrl">
|
55
|
+
<div class="new-widget-instance" ng-show="newWidget">
|
56
|
+
<div class="panel">
|
57
|
+
<div class="panel-header">
|
58
|
+
<span class="close" ng-click="newWidget = null"> ✖ </span>
|
59
|
+
<h2>New Widget Instance</h2>
|
60
|
+
</div>
|
47
61
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
ng-click="select(device)">
|
54
|
-
<span class="icon">device</span>
|
55
|
-
<span class="name">{{device.name}}</span>
|
62
|
+
<div class="panel-body">
|
63
|
+
<div class="type">
|
64
|
+
<h3>Widget Type:</h3>
|
65
|
+
<select ng-model="newWidget.base" ng-options="w.name for w in widgets.list"></select>
|
66
|
+
</div>
|
56
67
|
|
57
|
-
|
58
|
-
|
68
|
+
<div class="attrs" ng-if="newWidget.base.attrs.length">
|
69
|
+
<h3>Params:</h3>
|
70
|
+
|
71
|
+
<div class="attr-element" ng-repeat="attr in newWidget.base.attrs">
|
72
|
+
<label>{{attr}}</label>
|
73
|
+
<input type="text" ng-model="newWidget.attrs[attr]">
|
74
|
+
</div>
|
75
|
+
</div>
|
76
|
+
</div>
|
77
|
+
|
78
|
+
<div class="panel-footer">
|
79
|
+
<button class="btn btn-device" ng-click="newActiveWidget(newWidget)">Create</button>
|
80
|
+
<button class="btn btn-run" ng-click="newWidget = null">Close</button>
|
81
|
+
</div>
|
59
82
|
</div>
|
60
83
|
</div>
|
84
|
+
|
85
|
+
<div class="active-widgets">
|
86
|
+
<div class="add-widget">
|
87
|
+
<button class="btn btn-robot btn-big" ng-click="newWidget = { base: '', attrs: {} }"> + </button>
|
88
|
+
</div>
|
89
|
+
|
90
|
+
<widget ng-repeat="widget in activeWidgets" data-name="{{widget.name}}" data-attrs="{{widget.attrs}}">
|
91
|
+
<span class="close" ng-click="removeWidget($index)"> ✖ </span>
|
92
|
+
</widget>
|
93
|
+
</div>
|
61
94
|
</div>
|
95
|
+
</div>
|
96
|
+
<!-- end widgets -->
|
62
97
|
|
63
|
-
|
64
|
-
<div class="connection" ng-repeat="connection in robot.connections">
|
65
|
-
<span class="icon">connection</span>
|
66
|
-
<span class="name">{{connection.name}}</span>
|
98
|
+
<div ng-show="device" ng-include="'/partials/device.html'"></div>
|
67
99
|
|
68
|
-
|
69
|
-
|
100
|
+
<!-- begin connections -->
|
101
|
+
<section class="row">
|
102
|
+
<div class="connections">
|
103
|
+
<div class="robot-devices">
|
104
|
+
<div class="device" ng-class="{selected: selected(device)}" ng-repeat="device in robot.devices">
|
105
|
+
<button ng-click="select(device)" class="btn btn-device">device</button>
|
106
|
+
<span class="name">{{device.name}}</span>
|
107
|
+
|
108
|
+
<div class="details">
|
109
|
+
<span>{{device.connection}}</span>
|
110
|
+
</div>
|
111
|
+
</div>
|
112
|
+
</div>
|
113
|
+
|
114
|
+
<div class="robot-connections">
|
115
|
+
<div class="connection" ng-repeat="connection in robot.connections">
|
116
|
+
<span class="btn btn-connect">connection</span>
|
117
|
+
<span class="name">{{connection.name}}</span>
|
118
|
+
|
119
|
+
<div class="details">
|
120
|
+
<span ng-if="connection.port">{{connection.port}}</span>
|
121
|
+
</div>
|
70
122
|
</div>
|
71
123
|
</div>
|
72
124
|
</div>
|
73
125
|
</section>
|
126
|
+
<!-- end connections -->
|
74
127
|
</div>
|
data/partials/themes.html
CHANGED
@@ -1,39 +1,42 @@
|
|
1
|
-
<div class="
|
2
|
-
<div class="
|
3
|
-
<
|
1
|
+
<div class="row">
|
2
|
+
<div class="themes">
|
3
|
+
<div class="sidebar">
|
4
|
+
<h2>Themes</h2>
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
<
|
6
|
+
<div class="new-theme">
|
7
|
+
<input type="text" ng-model="name" placeholder="new theme name">
|
8
|
+
<button ng-click="add(name)" class="btn btn-device">Add</button>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="list">
|
12
|
+
<div class="theme"
|
13
|
+
ng-repeat="theme in themes.list | filter:{custom: true}"
|
14
|
+
ng-click="edit(theme)"
|
15
|
+
ng-class="{selected: (editing === theme)}">
|
16
|
+
{{theme.name}}
|
17
|
+
<span class="close" ng-if="theme.custom" ng-click="remove(theme.name)">✖</span>
|
18
|
+
</div>
|
12
19
|
</div>
|
13
|
-
</div>
|
14
20
|
|
15
|
-
<div class="new-theme">
|
16
|
-
<input type="text" ng-model="name" placeholder="new theme name">
|
17
|
-
<button ng-click="add(name)">add new theme</button>
|
18
21
|
</div>
|
19
|
-
</div>
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
+
<div class="editor">
|
24
|
+
<h2>Editor</h2>
|
23
25
|
|
24
|
-
|
25
|
-
|
26
|
-
|
26
|
+
<textarea ng-disabled="!editing" ng-model="editing.css" ng-blur="themes.save()" placeholder="write your css here">
|
27
|
+
</textarea>
|
28
|
+
</div>
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
<div class="footer">
|
31
|
+
<button class="btn btn-save" ng-click="themes.save()">save</button>
|
32
|
+
<button class="btn btn-reset" ng-click="themes.reset()">reset</button>
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
<div class="selector">
|
35
|
+
<span>use theme: </span>
|
36
|
+
<select ng-model="themes.active"
|
37
|
+
ng-options="theme.name for theme in themes.list">
|
38
|
+
</select>
|
39
|
+
</div>
|
37
40
|
</div>
|
38
41
|
</div>
|
39
|
-
</div>
|
42
|
+
</div>
|