nutella_framework 0.4.27 → 0.4.28

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/VERSION +1 -1
  4. data/framework_components/order.json +2 -1
  5. data/framework_components/room-places-interface/.gitignore +3 -0
  6. data/framework_components/room-places-interface/LICENSE +21 -0
  7. data/framework_components/room-places-interface/Readme.md +0 -0
  8. data/framework_components/room-places-interface/bower.json +29 -0
  9. data/framework_components/room-places-interface/bower_components/bower-mqttws/.bower.json +23 -0
  10. data/framework_components/room-places-interface/bower_components/bower-mqttws/bower.json +14 -0
  11. data/framework_components/room-places-interface/bower_components/bower-mqttws/mqttws31.js +2081 -0
  12. data/framework_components/room-places-interface/bower_components/bower-mqttws/readme.md +4 -0
  13. data/framework_components/room-places-interface/bower_components/nutella_lib/.bower.json +37 -0
  14. data/framework_components/room-places-interface/bower_components/nutella_lib/LICENSE +21 -0
  15. data/framework_components/room-places-interface/bower_components/nutella_lib/README.md +15 -0
  16. data/framework_components/room-places-interface/bower_components/nutella_lib/bower.json +28 -0
  17. data/framework_components/room-places-interface/bower_components/nutella_lib/examples/browser/mqtt_client_hello_world.html +23 -0
  18. data/framework_components/room-places-interface/bower_components/nutella_lib/examples/browser/nutella_hello_world.html +52 -0
  19. data/framework_components/room-places-interface/bower_components/nutella_lib/examples/node/mqtt_client_hello_world.js +14 -0
  20. data/framework_components/room-places-interface/bower_components/nutella_lib/examples/node/nutella_hello_world.js +38 -0
  21. data/framework_components/room-places-interface/bower_components/nutella_lib/nutella_lib.js +789 -0
  22. data/framework_components/room-places-interface/bower_components/nutella_lib/package.json +30 -0
  23. data/framework_components/room-places-interface/css/animation.css +22 -0
  24. data/framework_components/room-places-interface/css/bootstrap.min.css +5 -0
  25. data/framework_components/room-places-interface/css/cursor.css +22 -0
  26. data/framework_components/room-places-interface/css/font-awesome/css/font-awesome.css +1801 -0
  27. data/framework_components/room-places-interface/css/font-awesome/css/font-awesome.min.css +4 -0
  28. data/framework_components/room-places-interface/css/font-awesome/fonts/FontAwesome.otf +0 -0
  29. data/framework_components/room-places-interface/css/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  30. data/framework_components/room-places-interface/css/font-awesome/fonts/fontawesome-webfont.svg +565 -0
  31. data/framework_components/room-places-interface/css/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  32. data/framework_components/room-places-interface/css/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  33. data/framework_components/room-places-interface/css/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  34. data/framework_components/room-places-interface/css/font-awesome/less/animated.less +34 -0
  35. data/framework_components/room-places-interface/css/font-awesome/less/bordered-pulled.less +16 -0
  36. data/framework_components/room-places-interface/css/font-awesome/less/core.less +13 -0
  37. data/framework_components/room-places-interface/css/font-awesome/less/fixed-width.less +6 -0
  38. data/framework_components/room-places-interface/css/font-awesome/less/font-awesome.less +17 -0
  39. data/framework_components/room-places-interface/css/font-awesome/less/icons.less +596 -0
  40. data/framework_components/room-places-interface/css/font-awesome/less/larger.less +13 -0
  41. data/framework_components/room-places-interface/css/font-awesome/less/list.less +19 -0
  42. data/framework_components/room-places-interface/css/font-awesome/less/mixins.less +27 -0
  43. data/framework_components/room-places-interface/css/font-awesome/less/path.less +15 -0
  44. data/framework_components/room-places-interface/css/font-awesome/less/rotated-flipped.less +20 -0
  45. data/framework_components/room-places-interface/css/font-awesome/less/stacked.less +20 -0
  46. data/framework_components/room-places-interface/css/font-awesome/less/variables.less +606 -0
  47. data/framework_components/room-places-interface/css/font-awesome/scss/_animated.scss +34 -0
  48. data/framework_components/room-places-interface/css/font-awesome/scss/_bordered-pulled.scss +16 -0
  49. data/framework_components/room-places-interface/css/font-awesome/scss/_core.scss +13 -0
  50. data/framework_components/room-places-interface/css/font-awesome/scss/_fixed-width.scss +6 -0
  51. data/framework_components/room-places-interface/css/font-awesome/scss/_icons.scss +596 -0
  52. data/framework_components/room-places-interface/css/font-awesome/scss/_larger.scss +13 -0
  53. data/framework_components/room-places-interface/css/font-awesome/scss/_list.scss +19 -0
  54. data/framework_components/room-places-interface/css/font-awesome/scss/_mixins.scss +27 -0
  55. data/framework_components/room-places-interface/css/font-awesome/scss/_path.scss +15 -0
  56. data/framework_components/room-places-interface/css/font-awesome/scss/_rotated-flipped.scss +20 -0
  57. data/framework_components/room-places-interface/css/font-awesome/scss/_stacked.scss +20 -0
  58. data/framework_components/room-places-interface/css/font-awesome/scss/_variables.scss +606 -0
  59. data/framework_components/room-places-interface/css/font-awesome/scss/font-awesome.scss +17 -0
  60. data/framework_components/room-places-interface/css/icomoon.css +57 -0
  61. data/framework_components/room-places-interface/css/page_layout.css +82 -0
  62. data/framework_components/room-places-interface/fonts/icomoon.eot +0 -0
  63. data/framework_components/room-places-interface/fonts/icomoon.svg +17 -0
  64. data/framework_components/room-places-interface/fonts/icomoon.ttf +0 -0
  65. data/framework_components/room-places-interface/fonts/icomoon.woff +0 -0
  66. data/framework_components/room-places-interface/gulpfile.js +24 -0
  67. data/framework_components/room-places-interface/index.html +73 -0
  68. data/framework_components/room-places-interface/index2.html +1753 -0
  69. data/framework_components/room-places-interface/js/component.js +438 -0
  70. data/framework_components/room-places-interface/js/lib/JSXTransformer-0.12.2.js +15199 -0
  71. data/framework_components/room-places-interface/js/lib/bootstrap.min.js +7 -0
  72. data/framework_components/room-places-interface/js/lib/d3.v3.min.js +5 -0
  73. data/framework_components/room-places-interface/js/lib/jquery-1.10.0.min.js +6 -0
  74. data/framework_components/room-places-interface/js/lib/nutella_lib.js +4145 -0
  75. data/framework_components/room-places-interface/js/lib/react-with-addons-0.12.2.js +19822 -0
  76. data/framework_components/room-places-interface/js/lib/underscore.js +6 -0
  77. data/framework_components/room-places-interface/js/map.js +1593 -0
  78. data/framework_components/room-places-interface/js/position.js +6 -0
  79. data/framework_components/room-places-interface/js/react/dist/beacon.js +30 -0
  80. data/framework_components/room-places-interface/js/react/dist/discrete.js +282 -0
  81. data/framework_components/room-places-interface/js/react/dist/interactive-label.js +54 -0
  82. data/framework_components/room-places-interface/js/react/dist/resource-add.js +203 -0
  83. data/framework_components/room-places-interface/js/react/dist/resource-table.js +227 -0
  84. data/framework_components/room-places-interface/js/react/dist/resource.js +433 -0
  85. data/framework_components/room-places-interface/js/react/src/beacon.js +30 -0
  86. data/framework_components/room-places-interface/js/react/src/discrete.js +282 -0
  87. data/framework_components/room-places-interface/js/react/src/interactive-label.js +54 -0
  88. data/framework_components/room-places-interface/js/react/src/resource-add.js +203 -0
  89. data/framework_components/room-places-interface/js/react/src/resource-table.js +227 -0
  90. data/framework_components/room-places-interface/js/react/src/resource.js +433 -0
  91. data/framework_components/room-places-interface/js/room.js +65 -0
  92. data/framework_components/room-places-interface/nutella.json +6 -0
  93. data/nutella_framework.gemspec +93 -5
  94. metadata +91 -3
@@ -0,0 +1,227 @@
1
+ var ResourceTable = React.createClass({displayName: "ResourceTable",
2
+ table: {
3
+ resource: "table.resource",
4
+ addResource: "table.addResource",
5
+ beacon: "table.beacon",
6
+ discrete: "table.discrete"
7
+ },
8
+ getInitialState: function () {
9
+ return {
10
+ resourceData: [],
11
+ beaconData: [],
12
+ tableOpen: this.table.resource
13
+ };
14
+ },
15
+ resourcesBuffer: undefined, // Used for not updating the interface every time a resource change
16
+ componentDidMount: function () {
17
+ self = this;
18
+
19
+ // Download all resources
20
+ nutella.net.request("location/resources", {}, function(reply) {
21
+ self.setState({resourceData: reply.resources});
22
+ });
23
+
24
+ // Wait for new added resources
25
+ nutella.net.subscribe("location/resources/added", function(message) {
26
+ var data = self.state.resourceData;
27
+ data = data.concat(message.resources);
28
+
29
+ self.setState({resourceData: data});
30
+ });
31
+
32
+ // Update the interface if the buffer is not empty
33
+ setInterval(function() {
34
+ if(self.resourceBuffer == undefined) {
35
+ return; // Return if buffer empty
36
+ }
37
+
38
+ var data = self.state.resourceData;
39
+
40
+ // Remove updated resources
41
+ data = data.filter(function(d) {
42
+ return $.inArray(d.rid, self.resourceBuffer.map(function(r) {
43
+ return r.rid;
44
+ })) == -1;
45
+ });
46
+
47
+ // Add updated resources from the buffer
48
+ data = data.concat(self.resourceBuffer);
49
+
50
+ self.setState({resourceData: data});
51
+
52
+ self.resourceBuffer = undefined; // Empty the buffer
53
+ }, 200);
54
+
55
+ // Wait for updated resources
56
+ nutella.net.subscribe("location/resources/updated", function(message) {
57
+ if(self.resourceBuffer == undefined) {
58
+ self.resourceBuffer = [];
59
+ }
60
+ self.resourceBuffer = self.resourceBuffer.filter(function(d) {
61
+ return $.inArray(d.rid, message.resources.map(function(r) {
62
+ return r.rid;
63
+ })) == -1;
64
+ });
65
+ self.resourceBuffer = self.resourceBuffer.concat(message.resources);
66
+ });
67
+
68
+ // Wait for removed resources
69
+ nutella.net.subscribe("location/resources/removed", function(message) {
70
+ var data = self.state.resourceData;
71
+ data = data.filter(function(d) {
72
+ return $.inArray(d.rid, message.resources.map(function(r) {
73
+ return r.rid;
74
+ })) == -1;
75
+ });
76
+
77
+ self.setState({resourceData: data});
78
+ });
79
+
80
+
81
+ // Download all beacons
82
+ nutella.net.request("beacon/beacons", {}, function(reply) {
83
+ self.setState({beaconData: reply.beacons});
84
+ });
85
+
86
+ // Wait for new added beacons
87
+ nutella.net.subscribe("beacon/beacons/added", function(message) {
88
+ var data = self.state.beaconData;
89
+ data = data.concat(message.beacons);
90
+
91
+ self.setState({beaconData: data});
92
+ });
93
+
94
+ // Wait for removed beacons
95
+ nutella.net.subscribe("beacon/beacons/removed", function(message) {
96
+ var data = self.state.beaconData;
97
+ data = data.filter(function(d) {
98
+ return $.inArray(d.rid, message.beacons.map(function(r) {
99
+ return r.rid;
100
+ })) == -1;
101
+ });
102
+
103
+ self.setState({beaconData: data});
104
+ });
105
+ },
106
+ updateResource: function(resource) {
107
+ nutella.net.publish("location/resource/update", resource);
108
+ },
109
+ removeResource: function(resource) {
110
+ nutella.net.publish("location/resource/remove", resource);
111
+ },
112
+ addResource: function(resource) {
113
+ nutella.net.publish("location/resource/add", resource);
114
+ },
115
+ showTable: function(table) {
116
+ if(this.state.tableOpen == table) {
117
+ this.setState({tableOpen: undefined});
118
+ }
119
+ else {
120
+ this.setState({tableOpen: table});
121
+ }
122
+ },
123
+ render: function() {
124
+ var self = this;
125
+
126
+ // Order the resource list
127
+ var resources = this.state.resourceData;
128
+ resources = resources.sort(function(a, b) {
129
+ if(a.type == "STATIC" && b.type == "DYNAMIC") {
130
+ return -1;
131
+ }
132
+ else if(a.type == "DYNAMIC" && b.type == "STATIC") {
133
+ return 1;
134
+ }
135
+ else {
136
+ return a.rid.localeCompare(b.rid);
137
+ }
138
+ });
139
+
140
+ var resourceRows = resources.map(function (resource, index) {
141
+ return (
142
+ React.createElement(Resource, {resource: resource,
143
+ key: resource.rid,
144
+ updateResource: self.updateResource,
145
+ removeResource: self.removeResource,
146
+ room: self.props.room})
147
+ );
148
+ });
149
+
150
+ // Order the resource list
151
+ var beacons = this.state.beaconData;
152
+ beacons = beacons.sort(function(a, b) {
153
+ return a.rid.localeCompare(b.rid)
154
+ });
155
+ beacons = beacons.filter(function(b) {
156
+
157
+ return $.inArray(b.rid, resources.map(function(r) {
158
+ return r.rid;
159
+ })) == -1;
160
+
161
+ });
162
+
163
+ var beaconRows = beacons.map(function (beacon, index) {
164
+ return (
165
+ React.createElement(Beacon, {beacon: beacon,
166
+ key: beacon.rid,
167
+ addResource: self.addResource,
168
+ updateResource: self.updateResource})
169
+ );
170
+ });
171
+
172
+ var resourceTableHeight = "40px";
173
+ var addResourceTableHeight = "40px";
174
+ var beaconTableHeight = "40px";
175
+ var discreteTableHeight = "40px";
176
+
177
+ switch(this.state.tableOpen) {
178
+ case this.table.resource:
179
+ resourceTableHeight = "500px";
180
+ break;
181
+ case this.table.addResource:
182
+ addResourceTableHeight = "300px";
183
+ break;
184
+ case this.table.beacon:
185
+ beaconTableHeight = "500px";
186
+ break;
187
+ case this.table.discrete:
188
+ discreteTableHeight = "500px";
189
+ break;
190
+ }
191
+
192
+ return(
193
+ React.createElement("div", null,
194
+ React.createElement("div", {className: "col-md-12 table-responsive table_container animated", style: {"overflowX": "scroll", maxHeight: resourceTableHeight}},
195
+ React.createElement("table", {className: "table table-bordered table-striped table-hover", id: "resource_table"},
196
+ React.createElement("thead", {onClick: _.partial(this.showTable, this.table.resource), className: "pointer"},
197
+ React.createElement("tr", null,
198
+ React.createElement("th", {className: "col-md-12 col-sm-12 col-xs-12 text-center"}, "Resources")
199
+ )
200
+ ),
201
+ React.createElement("tbody", null,
202
+ resourceRows
203
+ )
204
+ )
205
+ ),
206
+ React.createElement(ResourceAdd, {room: this.props.room, tableHeight: addResourceTableHeight, showTable: this.showTable}),
207
+ React.createElement("div", {className: "col-md-12 table-responsive table_container animated",
208
+ style: {
209
+ "overflowX": "scroll",
210
+ maxHeight: beaconTableHeight
211
+ }},
212
+ React.createElement("table", {className: "table table-bordered table-striped table-hover", id: "resource_table"},
213
+ React.createElement("thead", {onClick: _.partial(this.showTable, this.table.beacon), className: "pointer"},
214
+ React.createElement("tr", null,
215
+ React.createElement("th", {className: "col-md-12 col-sm-12 col-xs-12 text-center"}, "Beacons")
216
+ )
217
+ ),
218
+ React.createElement("tbody", null,
219
+ beaconRows
220
+ )
221
+ )
222
+ ),
223
+ React.createElement(Discrete, {room: this.props.room, tableHeight: discreteTableHeight, showTable: this.showTable})
224
+ )
225
+ );
226
+ }
227
+ });
@@ -0,0 +1,433 @@
1
+
2
+ var Resource = React.createClass({displayName: "Resource",
3
+ componentDidMount: function () {
4
+
5
+ },
6
+ handleParameterChange: function(event) {
7
+ var text = $("#"+event.target.id).text();
8
+
9
+ // Pressed return
10
+ if(event.which == 13) {
11
+ $("#"+event.target.id).blur();
12
+ $("#"+event.target.id).text(text);
13
+ }
14
+ },
15
+ handleUpdateParameters: function() {
16
+ var resource = this.props.resource;
17
+ delete resource["parameters"];
18
+
19
+ if(resource.continuous != undefined) {
20
+ if(resource.continuous.x != undefined) {
21
+ var number = parseFloat($("#"+this.props.resource.rid+"_parameter_x").attr("v"));
22
+ if(!isNaN(number))
23
+ resource.continuous.x = number;
24
+ }
25
+ if(resource.continuous.y != undefined) {
26
+ var number = parseFloat($("#"+this.props.resource.rid+"_parameter_y").attr("v"));
27
+ if(!isNaN(number))
28
+ resource.continuous.y = number;
29
+ }
30
+ }
31
+
32
+ if(resource.discrete != undefined) {
33
+ if(resource.discrete.x != undefined) {
34
+ var value = $("#"+this.props.resource.rid+"_parameter_x").attr("v");
35
+ value = value || $("#"+this.props.resource.rid+"_parameter_x").attr("value");
36
+ var number = parseFloat(value);
37
+ if(!isNaN(number))
38
+ resource.discrete.x = number;
39
+ else if(value.length > 0)
40
+ resource.discrete.x = value;
41
+ }
42
+ if(resource.discrete.y != undefined) {
43
+ var value = $("#"+this.props.resource.rid+"_parameter_y").attr("v");
44
+ value = value || $("#"+this.props.resource.rid+"_parameter_y").attr("value");
45
+ var number = parseFloat(value);
46
+ if(!isNaN(number))
47
+ resource.discrete.y = number;
48
+ else if(value.length > 0)
49
+ resource.discrete.y = value;
50
+ }
51
+ }
52
+
53
+ if(resource.proximity_range != undefined) {
54
+ var number = parseFloat($("#"+this.props.resource.rid+"_parameter_proximity").attr("v"));
55
+ if(!isNaN(number))
56
+ resource.proximity_range = number;
57
+ else
58
+ $("#"+this.props.resource.rid+"_parameter_proximity").val(resource.proximity_range);
59
+ }
60
+ this.props.updateResource(resource);
61
+ },
62
+ handleContinousPressed: function() {
63
+ var resource = this.props.resource;
64
+ delete resource["discrete"];
65
+ delete resource["proximity"];
66
+ delete resource["parameters"];
67
+ resource.continuous = {
68
+ x: this.props.room.x/2,
69
+ y: this.props.room.y/2
70
+ };
71
+ this.props.updateResource(resource);
72
+ },
73
+ handleDiscretePressed: function() {
74
+ var resource = this.props.resource;
75
+ delete resource["parameters"];
76
+ delete resource["continuous"];
77
+ delete resource["proximity"];
78
+ resource.discrete = {
79
+ x: 0,
80
+ y: 0
81
+ };
82
+ this.props.updateResource(resource);
83
+ },
84
+ handleProximityPressed: function() {
85
+ var resource = this.props.resource;
86
+ delete resource["parameters"];
87
+ delete resource["continuous"];
88
+ delete resource["discrete"];
89
+ resource.proximity = {};
90
+ this.props.updateResource(resource);
91
+ },
92
+ handleDisablePressed: function() {
93
+ var resource = this.props.resource;
94
+ delete resource["continuous"];
95
+ delete resource["discrete"];
96
+ delete resource["parameters"];
97
+ this.props.updateResource(resource);
98
+ },
99
+ handleDeletePressed: function() {
100
+ this.props.removeResource(this.props.resource);
101
+ },
102
+ handleStaticPressed: function() {
103
+ var resource = this.props.resource;
104
+ delete resource["parameters"];
105
+ if(resource.type == "STATIC")
106
+ return;
107
+
108
+ resource.type = "STATIC";
109
+ resource.proximity_range = 1;
110
+ delete resource["proximity"];
111
+ delete resource["parameters"];
112
+ this.props.updateResource(resource);
113
+ },
114
+ handleDynamicPressed: function() {
115
+ var resource = this.props.resource;
116
+ delete resource["parameters"];
117
+ if(resource.type == "DYNAMIC")
118
+ return;
119
+
120
+ resource.type = "DYNAMIC";
121
+ delete resource["proximity_range"];
122
+ this.props.updateResource(resource);
123
+ },
124
+ handleAddKey: function() {
125
+ var key = this.refs.key.getDOMNode().value.trim();
126
+ var value = this.refs.value.getDOMNode().value.trim();
127
+
128
+ this.refs.key.getDOMNode().value = "";
129
+ this.refs.value.getDOMNode().value = "";
130
+
131
+ var resource = this.props.resource;
132
+
133
+ resource.parameters = [];
134
+
135
+ resource.parameters.push({key: key, value: value});
136
+
137
+ this.props.updateResource(resource);
138
+ },
139
+ handleKeyEnterPressed: function(event) {
140
+ // Pressed return
141
+ if(event.which == 13) {
142
+ this.handleAddKey();
143
+ }
144
+ },
145
+ handleModifyKey: function(name, _key, _value) {
146
+ var key, value, prev_key = undefined;
147
+
148
+ var resource = this.props.resource;
149
+
150
+ switch(name) {
151
+ case "key":
152
+ key = _value;
153
+ prev_key = _key;
154
+ value = resource.parameters[prev_key];
155
+ break;
156
+ case "value":
157
+ prev_key = _key;
158
+ key = _key;
159
+ value = _value;
160
+ break;
161
+ }
162
+
163
+ /*
164
+ if(key == "") {
165
+ $("#" + event.target.id.substring(0, event.target.id.length - 1) + "k").focus();
166
+ return;
167
+ }
168
+ if(value == "") {
169
+ $("#" + event.target.id.substring(0, event.target.id.length - 1) + "v").focus();
170
+ return;
171
+ }
172
+ */
173
+
174
+
175
+ resource.parameters = [];
176
+
177
+ resource.parameters.push({key: prev_key, delete: true});
178
+ resource.parameters.push({key: key, value: value});
179
+
180
+ this.props.updateResource(resource);
181
+ },
182
+ handleDeleteKey: function(event) {
183
+ var key = event.target.id;
184
+
185
+ var resource = this.props.resource;
186
+
187
+ resource.parameters = [];
188
+
189
+ resource.parameters.push({key: key, delete: true});
190
+
191
+ this.props.updateResource(resource);
192
+ },
193
+ render: function () {
194
+ var self = this;
195
+
196
+ var parameters = [];
197
+
198
+ if(this.props.resource.continuous != undefined ) {
199
+
200
+ if(this.props.resource.continuous.x != undefined) {
201
+ parameters.push({key: "x", value: parseFloat(this.props.resource.continuous.x).toFixed(2)});
202
+ }
203
+
204
+ if(this.props.resource.continuous.y != undefined) {
205
+ parameters.push({key: "y", value: parseFloat(this.props.resource.continuous.y).toFixed(2)});
206
+ }
207
+ }
208
+
209
+ if(this.props.resource.discrete != undefined ) {
210
+
211
+ if(this.props.resource.discrete.x != undefined) {
212
+ var value = this.props.resource.discrete.x;
213
+
214
+ if(!isNaN(parseInt(value))) {
215
+ // Reduce precision
216
+ value = parseInt(value);
217
+ }
218
+
219
+ parameters.push({key: "x", value: value});
220
+ }
221
+
222
+ if(this.props.resource.discrete.y != undefined) {
223
+ var value = this.props.resource.discrete.y;
224
+
225
+ if(!isNaN(parseInt(value))) {
226
+ // Reduce precision
227
+ value = parseInt(value);
228
+ }
229
+
230
+ parameters.push({key: "y", value: value});
231
+ }
232
+ }
233
+
234
+ if(this.props.resource.proximity_range != undefined) {
235
+ parameters.push({key: "proximity", value: parseFloat(this.props.resource.proximity_range).toFixed(2)});
236
+ }
237
+
238
+
239
+
240
+ var parameterRows = parameters.map(function (parameter, index) {
241
+ return(
242
+ React.createElement("tr", null,
243
+ React.createElement("td", {className: "col-md-6 col-sm-6 col-xs-6"}, React.createElement("span", null, parameter.key)),
244
+ React.createElement("td", {className: "col-md-6 col-sm-6 col-xs-6"},
245
+ React.createElement(InteractiveLabel, {
246
+ id: self.props.resource.rid+"_parameter_"+parameter.key,
247
+ onKeyPress: self.handleParameterChange,
248
+ onValueChange: self.handleUpdateParameters,
249
+ labelValue: parameter.value,
250
+ labelKey: parameter.key})
251
+ )
252
+ )
253
+ );
254
+ });
255
+
256
+ var parameterTable =
257
+ React.createElement("table", {className: "table table-bordered table-striped table-hover", id: "resource_table"},
258
+ React.createElement("thead", null,
259
+ React.createElement("tr", null,
260
+ React.createElement("td", {className: "col-md-6 col-sm-6 col-xs-6"}, "Variable"),
261
+ React.createElement("td", {className: "col-md-6 col-sm-6 col-xs-6"}, "Value")
262
+ )
263
+ ),
264
+ React.createElement("tbody", null,
265
+ parameterRows
266
+ )
267
+ );
268
+
269
+ if(parameterRows.length == 0)
270
+ parameterTable = [];
271
+
272
+ var keyValueRows = [];
273
+
274
+ if(this.props.resource.parameters != undefined) {
275
+ keyValueRows = Object.keys(this.props.resource.parameters).map(function (key, index) {
276
+ return (
277
+ React.createElement("tr", null,
278
+ React.createElement("td", {className: "col-md-6 key-values"},
279
+ React.createElement(InteractiveLabel, {
280
+ id: self.props.resource.rid+"_"+key+"_k",
281
+ onKeyPress: self.handleParameterChange,
282
+ onValueChange: self.handleModifyKey,
283
+ labelName: "key",
284
+ labelValue: key,
285
+ labelKey: key})
286
+ ),
287
+ React.createElement("td", {className: "col-md-6 key-values"},
288
+ React.createElement(InteractiveLabel, {
289
+ id: self.props.resource.rid+"_"+key+"_k",
290
+ onKeyPress: self.handleParameterChange,
291
+ onValueChange: self.handleModifyKey,
292
+ labelName: "value",
293
+ labelValue: self.props.resource.parameters[key],
294
+ labelKey: key}),
295
+ React.createElement("button", {
296
+ type: "button",
297
+ onClick: self.handleDeleteKey,
298
+ id: key, className: "btn btn-default btn-xs right"},
299
+ React.createElement("span", {className: "glyphicon glyphicon-remove", id: key, "aria-hidden": "true"})
300
+ )
301
+ )
302
+ )
303
+ );
304
+ });
305
+ }
306
+
307
+ var type = "";
308
+
309
+ if(this.props.resource.type == "STATIC") {
310
+ type = React.createElement("b", null, "S");
311
+ }
312
+ else if(this.props.resource.type == "DYNAMIC") {
313
+ type = React.createElement("b", null, "D");
314
+ }
315
+
316
+ var trackingSystem = "";
317
+
318
+ if(this.props.resource.continuous != undefined) {
319
+ trackingSystem = React.createElement("i", {className: "fa fa-arrows fa-fw"});
320
+ }
321
+ else if(this.props.resource.discrete != undefined) {
322
+ trackingSystem = React.createElement("i", {className: "fa fa-th-large fa-fw"});
323
+ }
324
+ else if(this.props.resource.proximity != undefined) {
325
+ trackingSystem = React.createElement("i", {className: "fa fa-location-arrow fa-fw"});
326
+ }
327
+ else {
328
+ trackingSystem = React.createElement("i", {className: "fa fa-ban fa-fw"});
329
+ }
330
+
331
+ var model = "";
332
+ switch(this.props.resource.model) {
333
+ case "IMAC":
334
+ model = "icon-iMac";
335
+ break;
336
+ case "IPHONE":
337
+ model = "icon-iPhone";
338
+ break;
339
+ case "IPAD":
340
+ model = "icon-iPad";
341
+ break;
342
+ case "IBEACON":
343
+ model = "icon-iBeacon";
344
+ break;
345
+ case "ADISPLAY":
346
+ model = "icon-aDisplay";
347
+ break;
348
+ case "TTABLE":
349
+ model = "icon-tTable";
350
+ break;
351
+ case "OTHER":
352
+ model = "icon-other";
353
+ break;
354
+ }
355
+
356
+ var proximity = {};
357
+ if(this.props.resource.type == "DYNAMIC")
358
+ proximity = React.createElement("li", {onClick: this.handleProximityPressed}, React.createElement("a", {href: "#"}, React.createElement("i", {className: "fa fa-location-arrow fa-fw"}), " Proximity"));
359
+
360
+ return(
361
+
362
+ React.createElement("tr", null,
363
+ React.createElement("td", {className: "col-md-12 col-sm-12 col-xs-12"},
364
+ React.createElement("div", {className: "col-md-4 col-sm-4 col-xs-4"},
365
+ React.createElement("div", {className: "vertical-center"},
366
+ React.createElement("span", {className: model, style: {fontSize: "20"}}),
367
+ React.createElement("span", null, " ", this.props.resource.rid)
368
+ )
369
+ ),
370
+
371
+ React.createElement("div", {className: "col-md-8 col-sm-8 col-xs-8 right"},
372
+ React.createElement("div", {className: "btn-group"},
373
+ React.createElement("a", {className: "btn btn-default", href: "#"}, trackingSystem),
374
+ React.createElement("a", {className: "btn btn-default dropdown-toggle", "data-toggle": "dropdown", href: "#"},
375
+ React.createElement("span", {className: "fa fa-caret-down"})),
376
+ React.createElement("ul", {className: "dropdown-menu"},
377
+ React.createElement("li", {onClick: this.handleContinousPressed}, React.createElement("a", {href: "#"}, React.createElement("i", {className: "fa fa-arrows fa-fw"}), " Continuous")),
378
+ React.createElement("li", {onClick: this.handleDiscretePressed}, React.createElement("a", {href: "#"}, React.createElement("i", {className: "fa fa-th-large fa-fw"}), " Discrete")),
379
+ proximity,
380
+ /*<li onClick={this.handleDisablePressed}><a href="#"><i className="fa fa-ban fa-fw"></i> Disable</a></li>*/
381
+ React.createElement("li", {className: "divider"}),
382
+ React.createElement("li", {onClick: this.handleDeletePressed}, React.createElement("a", {href: "#"}, React.createElement("i", {className: "fa fa-trash-o fa-fw"}), " Delete"))
383
+ )
384
+ ),
385
+
386
+ React.createElement("div", {className: "btn-group", role: "group"},
387
+ React.createElement("div", {className: "btn-group", role: "group"},
388
+ React.createElement("button", {type: "button", className: "btn btn-default dropdown-toggle", "data-toggle": "dropdown", "aria-expanded": "false"},
389
+ type,
390
+ React.createElement("span", {className: "caret"})
391
+ ),
392
+ React.createElement("ul", {className: "dropdown-menu", role: "menu"},
393
+ React.createElement("li", {onClick: this.handleStaticPressed}, React.createElement("a", {href: "#"}, React.createElement("b", null, "S"), " Static")),
394
+ React.createElement("li", {onClick: this.handleDynamicPressed}, React.createElement("a", {href: "#"}, React.createElement("b", null, "D"), " Dynamic"))
395
+ )
396
+ )
397
+ ),
398
+
399
+ React.createElement("div", {className: "right", "data-toggle": "collapse", "data-target": "#collapse-"+this.props.resource.rid},
400
+ React.createElement("button", {type: "button", className: "btn btn-default"}, React.createElement("span", {className: "glyphicon glyphicon-chevron-down", "aria-hidden": "true"}))
401
+ )
402
+ ),
403
+
404
+ React.createElement("div", {className: "collapse", id: "collapse-"+this.props.resource.rid},
405
+ React.createElement("div", {style: {"padding": "20px"}},
406
+ parameterTable,
407
+ React.createElement("table", {className: "table table-bordered table-striped table-hover", id: "resource_table"},
408
+ React.createElement("thead", null,
409
+ React.createElement("tr", null,
410
+ React.createElement("td", {className: "col-md-6 col-sm-6 col-xs-6"}, "Key"),
411
+ React.createElement("td", {className: "col-md-6 col-sm-6 col-xs-6"}, "Value")
412
+ )
413
+ ),
414
+ React.createElement("tbody", null,
415
+ keyValueRows,
416
+ React.createElement("tr", null,
417
+ React.createElement("form", {onSubmit: this.handleAddKey},
418
+ React.createElement("td", {className: "col-md-6"}, React.createElement("input", {onKeyPress: this.handleKeyEnterPressed, type: "text", className: "form-control", placeholder: "key", ref: "key"})),
419
+ React.createElement("td", {className: "col-md-6"}, React.createElement("input", {onKeyPress: this.handleKeyEnterPressed, type: "text", className: "form-control", placeholder: "value", ref: "value"}))
420
+ )
421
+ )
422
+ )
423
+ )
424
+ )
425
+ )
426
+
427
+ )
428
+ )
429
+ );
430
+
431
+ }
432
+ });
433
+
@@ -0,0 +1,30 @@
1
+
2
+ var Beacon = React.createClass({
3
+ componentDidMount: function () {
4
+
5
+ },
6
+ handleAddPressed: function() {
7
+ var resource = {rid: this.props.beacon.rid, type: "DYNAMIC", model: "IBEACON", proximity: {}};
8
+
9
+ this.props.addResource(resource);
10
+ this.props.updateResource(resource);
11
+ },
12
+ render: function () {
13
+ var self = this;
14
+
15
+ return(
16
+ <tr>
17
+ <td className="col-md-12 col-sm-12 col-xs-12">
18
+ <div className="col-md-4 col-sm-4 col-xs-4"><div className="vertical-center"><span>{this.props.beacon.rid}</span></div></div>
19
+
20
+ <div className="right">
21
+ <button type="button" className="btn btn-default" onClick={this.handleAddPressed}><span className="glyphicon glyphicon-plus" aria-hidden="true"></span></button>
22
+ </div>
23
+
24
+ </td>
25
+ </tr>
26
+ );
27
+
28
+ }
29
+ });
30
+