nutella_framework 0.4.13 → 0.4.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) 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/roomcast-bot/data/default/channels-data.json +1 -0
  6. data/framework_components/roomcast-bot/data/default/channels.json +1 -0
  7. data/framework_components/roomcast-bot/data/default/configs.json +1 -0
  8. data/framework_components/roomcast-bot/data/default/mapping.json +1 -0
  9. data/framework_components/roomcast-bot/roomcast_bot.rb +178 -0
  10. data/framework_components/roomcast-bot/startup +5 -0
  11. data/framework_components/roomcast-channel-creator/.gitignore +2 -0
  12. data/framework_components/roomcast-channel-creator/README.md +9 -0
  13. data/framework_components/roomcast-channel-creator/dist/app.js +29607 -0
  14. data/framework_components/roomcast-channel-creator/dist/css/font-awesome.min.css +4 -0
  15. data/framework_components/roomcast-channel-creator/dist/css/ionicons.min.css +11 -0
  16. data/framework_components/roomcast-channel-creator/dist/fonts/FontAwesome.otf +0 -0
  17. data/framework_components/roomcast-channel-creator/dist/fonts/fontawesome-webfont.eot +0 -0
  18. data/framework_components/roomcast-channel-creator/dist/fonts/fontawesome-webfont.svg +565 -0
  19. data/framework_components/roomcast-channel-creator/dist/fonts/fontawesome-webfont.ttf +0 -0
  20. data/framework_components/roomcast-channel-creator/dist/fonts/fontawesome-webfont.woff +0 -0
  21. data/framework_components/roomcast-channel-creator/dist/fonts/fontawesome-webfont.woff2 +0 -0
  22. data/framework_components/roomcast-channel-creator/dist/fonts/ionicons.eot +0 -0
  23. data/framework_components/roomcast-channel-creator/dist/fonts/ionicons.svg +2230 -0
  24. data/framework_components/roomcast-channel-creator/dist/fonts/ionicons.ttf +0 -0
  25. data/framework_components/roomcast-channel-creator/dist/fonts/ionicons.woff +0 -0
  26. data/framework_components/roomcast-channel-creator/dist/main.css +3304 -0
  27. data/framework_components/roomcast-channel-creator/dist/nutella_lib.js +5068 -0
  28. data/framework_components/roomcast-channel-creator/gulp/config.js +51 -0
  29. data/framework_components/roomcast-channel-creator/gulp/tasks/browserify.js +77 -0
  30. data/framework_components/roomcast-channel-creator/gulp/tasks/build.js +3 -0
  31. data/framework_components/roomcast-channel-creator/gulp/tasks/css.js +7 -0
  32. data/framework_components/roomcast-channel-creator/gulp/tasks/default.js +3 -0
  33. data/framework_components/roomcast-channel-creator/gulp/tasks/fonts.js +7 -0
  34. data/framework_components/roomcast-channel-creator/gulp/tasks/less.js +16 -0
  35. data/framework_components/roomcast-channel-creator/gulp/tasks/mui-fonts.js +7 -0
  36. data/framework_components/roomcast-channel-creator/gulp/tasks/nutella.js +7 -0
  37. data/framework_components/roomcast-channel-creator/gulp/tasks/setWatch.js +5 -0
  38. data/framework_components/roomcast-channel-creator/gulp/tasks/svgs.js +7 -0
  39. data/framework_components/roomcast-channel-creator/gulp/tasks/watch.js +12 -0
  40. data/framework_components/roomcast-channel-creator/gulp/util/bundleLogger.js +21 -0
  41. data/framework_components/roomcast-channel-creator/gulp/util/handleErrors.js +15 -0
  42. data/framework_components/roomcast-channel-creator/gulpfile.js +16 -0
  43. data/framework_components/roomcast-channel-creator/index.html +52 -0
  44. data/framework_components/roomcast-channel-creator/nutella.json +6 -0
  45. data/framework_components/roomcast-channel-creator/package.json +37 -0
  46. data/framework_components/roomcast-channel-creator/src/app/app.js +22 -0
  47. data/framework_components/roomcast-channel-creator/src/app/components/AnimationMixin.js +44 -0
  48. data/framework_components/roomcast-channel-creator/src/app/components/CataloguePage.js +130 -0
  49. data/framework_components/roomcast-channel-creator/src/app/components/Channel.js +378 -0
  50. data/framework_components/roomcast-channel-creator/src/app/components/ColorCell.js +28 -0
  51. data/framework_components/roomcast-channel-creator/src/app/components/ColorPicker.js +53 -0
  52. data/framework_components/roomcast-channel-creator/src/app/components/DetailPage.js +66 -0
  53. data/framework_components/roomcast-channel-creator/src/app/components/NutellaMixin.js +40 -0
  54. data/framework_components/roomcast-channel-creator/src/app/components/PageSliderMixin.js +68 -0
  55. data/framework_components/roomcast-channel-creator/src/app/components/Router.js +52 -0
  56. data/framework_components/roomcast-channel-creator/src/app/components/TopBar.js +86 -0
  57. data/framework_components/roomcast-channel-creator/src/app/components/main.js +333 -0
  58. data/framework_components/roomcast-channel-creator/src/css/font-awesome.min.css +4 -0
  59. data/framework_components/roomcast-channel-creator/src/css/ionicons.min.css +11 -0
  60. data/framework_components/roomcast-channel-creator/src/fonts/FontAwesome.otf +0 -0
  61. data/framework_components/roomcast-channel-creator/src/fonts/fontawesome-webfont.eot +0 -0
  62. data/framework_components/roomcast-channel-creator/src/fonts/fontawesome-webfont.svg +565 -0
  63. data/framework_components/roomcast-channel-creator/src/fonts/fontawesome-webfont.ttf +0 -0
  64. data/framework_components/roomcast-channel-creator/src/fonts/fontawesome-webfont.woff +0 -0
  65. data/framework_components/roomcast-channel-creator/src/fonts/fontawesome-webfont.woff2 +0 -0
  66. data/framework_components/roomcast-channel-creator/src/fonts/ionicons.eot +0 -0
  67. data/framework_components/roomcast-channel-creator/src/fonts/ionicons.svg +2230 -0
  68. data/framework_components/roomcast-channel-creator/src/fonts/ionicons.ttf +0 -0
  69. data/framework_components/roomcast-channel-creator/src/fonts/ionicons.woff +0 -0
  70. data/framework_components/roomcast-channel-creator/src/less/main.less +500 -0
  71. data/framework_components/roomcast-channel-creator/src/less/my_overrides.less +14 -0
  72. data/framework_components/roomcast-package-creator/.gitignore +2 -0
  73. data/framework_components/roomcast-package-creator/README.md +9 -0
  74. data/framework_components/roomcast-package-creator/dist/app.js +36624 -0
  75. data/framework_components/roomcast-package-creator/dist/css/font-awesome.min.css +4 -0
  76. data/framework_components/roomcast-package-creator/dist/css/ionicons.min.css +11 -0
  77. data/framework_components/roomcast-package-creator/dist/fonts/FontAwesome.otf +0 -0
  78. data/framework_components/roomcast-package-creator/dist/fonts/fontawesome-webfont.eot +0 -0
  79. data/framework_components/roomcast-package-creator/dist/fonts/fontawesome-webfont.svg +565 -0
  80. data/framework_components/roomcast-package-creator/dist/fonts/fontawesome-webfont.ttf +0 -0
  81. data/framework_components/roomcast-package-creator/dist/fonts/fontawesome-webfont.woff +0 -0
  82. data/framework_components/roomcast-package-creator/dist/fonts/fontawesome-webfont.woff2 +0 -0
  83. data/framework_components/roomcast-package-creator/dist/fonts/ionicons.eot +0 -0
  84. data/framework_components/roomcast-package-creator/dist/fonts/ionicons.svg +2230 -0
  85. data/framework_components/roomcast-package-creator/dist/fonts/ionicons.ttf +0 -0
  86. data/framework_components/roomcast-package-creator/dist/fonts/ionicons.woff +0 -0
  87. data/framework_components/roomcast-package-creator/dist/fonts/material-ui-icons.eot +0 -0
  88. data/framework_components/roomcast-package-creator/dist/fonts/material-ui-icons.svg +14 -0
  89. data/framework_components/roomcast-package-creator/dist/fonts/material-ui-icons.ttf +0 -0
  90. data/framework_components/roomcast-package-creator/dist/fonts/material-ui-icons.woff +0 -0
  91. data/framework_components/roomcast-package-creator/dist/main.css +5932 -0
  92. data/framework_components/roomcast-package-creator/dist/nutella_lib.js +5068 -0
  93. data/framework_components/roomcast-package-creator/gulp/config.js +51 -0
  94. data/framework_components/roomcast-package-creator/gulp/tasks/browserify.js +77 -0
  95. data/framework_components/roomcast-package-creator/gulp/tasks/build.js +3 -0
  96. data/framework_components/roomcast-package-creator/gulp/tasks/css.js +7 -0
  97. data/framework_components/roomcast-package-creator/gulp/tasks/default.js +3 -0
  98. data/framework_components/roomcast-package-creator/gulp/tasks/fonts.js +7 -0
  99. data/framework_components/roomcast-package-creator/gulp/tasks/less.js +16 -0
  100. data/framework_components/roomcast-package-creator/gulp/tasks/mui-fonts.js +7 -0
  101. data/framework_components/roomcast-package-creator/gulp/tasks/nutella.js +7 -0
  102. data/framework_components/roomcast-package-creator/gulp/tasks/setWatch.js +5 -0
  103. data/framework_components/roomcast-package-creator/gulp/tasks/svgs.js +7 -0
  104. data/framework_components/roomcast-package-creator/gulp/tasks/watch.js +12 -0
  105. data/framework_components/roomcast-package-creator/gulp/util/bundleLogger.js +21 -0
  106. data/framework_components/roomcast-package-creator/gulp/util/handleErrors.js +15 -0
  107. data/framework_components/roomcast-package-creator/gulpfile.js +16 -0
  108. data/framework_components/roomcast-package-creator/index.html +51 -0
  109. data/framework_components/roomcast-package-creator/nutella.json +6 -0
  110. data/framework_components/roomcast-package-creator/package.json +38 -0
  111. data/framework_components/roomcast-package-creator/src/app/app.js +19 -0
  112. data/framework_components/roomcast-package-creator/src/app/components/ButtonInteractionsMixin.js +45 -0
  113. data/framework_components/roomcast-package-creator/src/app/components/ChannelCard.js +87 -0
  114. data/framework_components/roomcast-package-creator/src/app/components/ChannelItem.js +71 -0
  115. data/framework_components/roomcast-package-creator/src/app/components/ChannelsCatalogue.js +64 -0
  116. data/framework_components/roomcast-package-creator/src/app/components/ChannelsPanel.js +127 -0
  117. data/framework_components/roomcast-package-creator/src/app/components/ConfigField.js +50 -0
  118. data/framework_components/roomcast-package-creator/src/app/components/ConfigurationsPanel.js +114 -0
  119. data/framework_components/roomcast-package-creator/src/app/components/ContextButton.js +37 -0
  120. data/framework_components/roomcast-package-creator/src/app/components/GlobalButton.js +26 -0
  121. data/framework_components/roomcast-package-creator/src/app/components/NutellaMixin.js +23 -0
  122. data/framework_components/roomcast-package-creator/src/app/components/PoolHeader.js +67 -0
  123. data/framework_components/roomcast-package-creator/src/app/components/PoolRow.js +160 -0
  124. data/framework_components/roomcast-package-creator/src/app/components/ResourceFamilyPool.js +168 -0
  125. data/framework_components/roomcast-package-creator/src/app/components/ResourcesPanel.js +76 -0
  126. data/framework_components/roomcast-package-creator/src/app/components/main.js +222 -0
  127. data/framework_components/roomcast-package-creator/src/app/components/material-ui/dialog_.jsx +66 -0
  128. data/framework_components/roomcast-package-creator/src/app/components/material-ui/drop-down-menu.jsx +163 -0
  129. data/framework_components/roomcast-package-creator/src/app/components/material-ui/enhanced-textarea.jsx +113 -0
  130. data/framework_components/roomcast-package-creator/src/app/components/material-ui/floating-action-button_.jsx +73 -0
  131. data/framework_components/roomcast-package-creator/src/app/components/material-ui/menu-item.jsx +100 -0
  132. data/framework_components/roomcast-package-creator/src/app/components/material-ui/menu.jsx +209 -0
  133. data/framework_components/roomcast-package-creator/src/app/components/material-ui/overlay.jsx +21 -0
  134. data/framework_components/roomcast-package-creator/src/app/components/material-ui/raised-button_.jsx +72 -0
  135. data/framework_components/roomcast-package-creator/src/app/components/material-ui/right-nav.jsx +108 -0
  136. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/drop-down-arrow.jsx +17 -0
  137. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/navigation-chevron-left.jsx +16 -0
  138. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/navigation-chevron-right.jsx +17 -0
  139. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/navigation-menu.jsx +16 -0
  140. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/svg-icon.jsx +23 -0
  141. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/toggle-check-box-checked.jsx +16 -0
  142. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/toggle-check-box-outline-blank.jsx +16 -0
  143. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/toggle-radio-button-off.jsx +16 -0
  144. data/framework_components/roomcast-package-creator/src/app/components/material-ui/svg-icons/toggle-radio-button-on.jsx +16 -0
  145. data/framework_components/roomcast-package-creator/src/app/components/material-ui/text-field.jsx +215 -0
  146. data/framework_components/roomcast-package-creator/src/app/components/material-ui/utils/css-event.js +52 -0
  147. data/framework_components/roomcast-package-creator/src/app/components/material-ui/utils/date-time.js +132 -0
  148. data/framework_components/roomcast-package-creator/src/app/components/material-ui/utils/dom.js +71 -0
  149. data/framework_components/roomcast-package-creator/src/app/components/material-ui/utils/events.js +34 -0
  150. data/framework_components/roomcast-package-creator/src/app/components/material-ui/utils/key-code.js +10 -0
  151. data/framework_components/roomcast-package-creator/src/app/components/material-ui/utils/key-line.js +13 -0
  152. data/framework_components/roomcast-package-creator/src/app/components/material-ui/utils/unique-id.js +7 -0
  153. data/framework_components/roomcast-package-creator/src/css/font-awesome.min.css +4 -0
  154. data/framework_components/roomcast-package-creator/src/css/ionicons.min.css +11 -0
  155. data/framework_components/roomcast-package-creator/src/fonts/FontAwesome.otf +0 -0
  156. data/framework_components/roomcast-package-creator/src/fonts/fontawesome-webfont.eot +0 -0
  157. data/framework_components/roomcast-package-creator/src/fonts/fontawesome-webfont.svg +565 -0
  158. data/framework_components/roomcast-package-creator/src/fonts/fontawesome-webfont.ttf +0 -0
  159. data/framework_components/roomcast-package-creator/src/fonts/fontawesome-webfont.woff +0 -0
  160. data/framework_components/roomcast-package-creator/src/fonts/fontawesome-webfont.woff2 +0 -0
  161. data/framework_components/roomcast-package-creator/src/fonts/ionicons.eot +0 -0
  162. data/framework_components/roomcast-package-creator/src/fonts/ionicons.svg +2230 -0
  163. data/framework_components/roomcast-package-creator/src/fonts/ionicons.ttf +0 -0
  164. data/framework_components/roomcast-package-creator/src/fonts/ionicons.woff +0 -0
  165. data/framework_components/roomcast-package-creator/src/less/drop-down-icon.less +43 -0
  166. data/framework_components/roomcast-package-creator/src/less/drop-down-menu.less +77 -0
  167. data/framework_components/roomcast-package-creator/src/less/enhanced-textarea.less +16 -0
  168. data/framework_components/roomcast-package-creator/src/less/main.less +491 -0
  169. data/framework_components/roomcast-package-creator/src/less/menu-item.less +69 -0
  170. data/framework_components/roomcast-package-creator/src/less/menu.less +50 -0
  171. data/framework_components/roomcast-package-creator/src/less/my_overrides.less +15 -0
  172. data/framework_components/roomcast-package-creator/src/less/svg-icon.less +11 -0
  173. data/framework_components/roomcast-package-creator/src/less/text-field.less +168 -0
  174. data/lib/commands/checkup.rb +1 -1
  175. data/nutella_lib/framework_net.rb +0 -1
  176. metadata +173 -4
@@ -0,0 +1,378 @@
1
+
2
+ var React = require('react');
3
+ var Mui = require('material-ui');
4
+ var Paper = Mui.Paper;
5
+ var NutellaMixin = require('./NutellaMixin');
6
+ var AnimationMixin = require('./AnimationMixin');
7
+ var ColorPicker = require('./ColorPicker');
8
+ var TextField = Mui.TextField;
9
+ var RadioButtonGroup = Mui.RadioButtonGroup;
10
+ var RadioButton = Mui.RadioButton;
11
+ var FlatButton = Mui.FlatButton;
12
+ //var queue = require("queue-async");
13
+
14
+ /**
15
+ * @prop channelId
16
+ * @prop channel
17
+ * @prop selected
18
+ * @prop onselectedChannel
19
+ */
20
+ var Channel = React.createClass({
21
+
22
+ mixins: [NutellaMixin, AnimationMixin],
23
+
24
+ componentDidMount: function() {
25
+ this.imageFile = null;
26
+ this.imageData_ = null;
27
+ },
28
+
29
+ /**
30
+ * State
31
+ * @returns selected: boolean
32
+ * side: 'front' or 'back'
33
+ */
34
+ getInitialState: function () {
35
+ return {
36
+ selected: false,
37
+ flipped: false,
38
+ modifyField: null
39
+ }
40
+ },
41
+
42
+ setModifyField: function(field) {
43
+ this.setState({
44
+ modifyField: field
45
+ });
46
+ },
47
+
48
+ componentWillReceiveProps: function(nextProps) {
49
+ if(nextProps.selected) {
50
+ this.setState({
51
+ selected: true
52
+ });
53
+ } else {
54
+ this.setState({
55
+ selected: false
56
+ });
57
+ this.setModifyField(null);
58
+ }
59
+
60
+ },
61
+
62
+ handleSelectChannel: function() {
63
+ this.props.onSelectChannel(this.props.channelId);
64
+ },
65
+
66
+ handleModifyIcon: function() {
67
+ this.setModifyField('icon');
68
+ },
69
+
70
+ flipCard: function() {
71
+ var self = this;
72
+ this.setState({
73
+ flipped: true
74
+ });
75
+ function callbackFlip() {
76
+ self.addCSSClass(self.refs.cardFront.getDOMNode(), 'hidden-card');
77
+ self.removeCSSClass(self.refs.cardBack.getDOMNode(), 'hidden-card');
78
+ self.flipY(self.refs.card.getDOMNode(), 90, 180, false);
79
+ }
80
+ this.flipY(this.refs.card.getDOMNode(), 0, 90, false, callbackFlip);
81
+ },
82
+
83
+ flipCardBack: function() {
84
+ var self = this;
85
+ this.setState({
86
+ flipped: false
87
+ });
88
+ function callbackFlip() {
89
+ self.addCSSClass(self.refs.cardBack.getDOMNode(), 'hidden-card');
90
+ self.removeCSSClass(self.refs.cardFront.getDOMNode(), 'hidden-card');
91
+ self.flipY(self.refs.card.getDOMNode(), 90, 0, true);
92
+ }
93
+ this.flipY(this.refs.card.getDOMNode(), 180, 90, true, callbackFlip);
94
+ },
95
+
96
+ handleDeleteCard: function() {
97
+ this.props.onDeleteCard(this.props.channelId);
98
+ },
99
+
100
+ addCSSClass: function(node, class_) {
101
+ node.className += ' ' + class_;
102
+ },
103
+
104
+ removeCSSClass: function(node, class_) {
105
+ var regex = new RegExp("(?:^|\\s)" + class_ + "(?!\\S)", "g");
106
+ node.className = node.className.replace(regex, '');
107
+ },
108
+
109
+ handleSetName: function() {
110
+ var value = this.refs['textFieldName' + this.props.channelId].getValue();
111
+ this.props.onSetName(value);
112
+ },
113
+
114
+ handleSetDescription: function() {
115
+ var value = this.refs['textFieldDescription' + this.props.channelId].getValue();
116
+ this.props.onSetDescription(value);
117
+ },
118
+
119
+ handleSetType: function(e, value) {
120
+ this.props.onSetType(value);
121
+ },
122
+
123
+ handleSetUrl: function() {
124
+ var value = this.refs['textFieldUrl' + this.props.channelId].getValue();
125
+ this.props.onSetUrl(value);
126
+ },
127
+
128
+ validateInputName: function() {
129
+ var value = this.refs['textFieldName' + this.props.channelId].getValue();
130
+ if(value.length > 30) {
131
+ event.returnValue = false;
132
+ }
133
+ },
134
+
135
+ validateInputDescription: function() {
136
+ var value = this.refs['textFieldDescription' + this.props.channelId].getValue();
137
+ if(value.length > 50) {
138
+ event.returnValue = false;
139
+ }
140
+ },
141
+
142
+ handleUploadImage: function(e) {
143
+ var node = e.target;
144
+ if (node.files && node.files[0]) {
145
+ var reader = new FileReader();
146
+ reader.onload = this.handleLoadedImage;
147
+ reader.readAsDataURL(node.files[0]);
148
+ // Store file for later upload
149
+ this.imageFile_ = node.files[0];
150
+ }
151
+ },
152
+
153
+ handleLoadedImage: function(e) {
154
+ // Set as temporary screenshot
155
+ var imageData = e.target.result;
156
+ this.imageData_ = imageData;
157
+ this.refs['channel' + this.props.channelId].getDOMNode().style.backgroundImage = 'url(' + imageData + ')';
158
+ },
159
+
160
+ /**
161
+ * Called on every Channel every time Save Changes is pressed
162
+ */
163
+ handleStoreImageOnServer: function() {
164
+ var self = this;
165
+ if(this.imageFile_) {
166
+ ReactMain.imagesQueue++;
167
+ nutella.net.bin.uploadFile(this.imageFile_, function(url) {
168
+ console.log('got url', url);
169
+ self.props.onSetScreenshot(self.props.channelId, url);
170
+ ReactMain.imagesQueue--;
171
+ if(ReactMain.imagesQueue === 0) {
172
+ self.props.onSaveCallback();
173
+ }
174
+ });
175
+ }
176
+ },
177
+
178
+ render: function() {
179
+
180
+ var colorPicker = null;
181
+ var onTouchTapIcon = this.handleModifyIcon;
182
+
183
+ var backgroundImage;
184
+ if(this.imageData_) {
185
+ backgroundImage = 'url(' + this.imageData_ + ')';
186
+ } else {
187
+ backgroundImage = 'url(' + this.props.channel.screenshot + ')';
188
+ }
189
+ var style = {
190
+ backgroundImage: backgroundImage,
191
+ backgroundSize: '100% 100%'
192
+ };
193
+
194
+ var iconStyle = {
195
+ backgroundColor: this.props.channel.icon
196
+ };
197
+
198
+ if(this.state.selected) {
199
+ if (this.state.modifyField === 'icon') {
200
+ colorPicker =
201
+ <ColorPicker ref='colorPicker'
202
+ onPickColor={this.props.onPickColor}/>;
203
+ onTouchTapIcon = null;
204
+ }
205
+ }
206
+
207
+ var urlPlaceholder;
208
+ switch(this.props.channel.type) {
209
+ case 'web':
210
+ urlPlaceholder = 'URL:';
211
+ break;
212
+ case 'iOS':
213
+ urlPlaceholder = 'Custom URL:';
214
+ break;
215
+ default:
216
+ urlPlaceholder = 'URL:';
217
+ }
218
+
219
+ var cardBack =
220
+ <div className='card-back hidden-card' ref='cardBack'>
221
+
222
+ <Paper className='channel'>
223
+
224
+ <div className='corner-icon flip-icon'> <i className="ion ion-android-settings" onTouchTap={this.flipCardBack} ></i> </div>
225
+
226
+ <div className='flex-centered' >
227
+ <div className='flex-content' >
228
+
229
+ <RadioButtonGroup
230
+ name="radio_buttons"
231
+ ref={'radioButtons' + this.props.channelId}
232
+ defaultSelected={this.props.channel.type}
233
+ onChange={this.handleSetType} >
234
+ <RadioButton
235
+ value="web"
236
+ label="Web channel"
237
+ defaultChecked={true} />
238
+ <RadioButton
239
+ value="iOS"
240
+ label="iOS app channel" />
241
+ </RadioButtonGroup>
242
+
243
+ <div className='url-div' >
244
+
245
+ <span> {urlPlaceholder} </span>
246
+ <TextField
247
+ ref={'textFieldUrl' + this.props.channelId}
248
+ hintText={''}
249
+ value={this.props.channel.url}
250
+ multiLine={true}
251
+ onChange={this.handleSetUrl} />
252
+
253
+ </div>
254
+ </div>
255
+
256
+ </div>
257
+
258
+ </Paper>
259
+
260
+ </div>;
261
+
262
+ var catalogueCard =
263
+ <div className='card-container hovering-layer catalogue-card-style' ref='cardContainer' >
264
+
265
+ <div className='card' ref='card'>
266
+
267
+ <div className='card-front' ref='cardFront'>
268
+
269
+ <div className='corner-icon delete-icon' > <i className="fa fa-times" ref='cornerIcon' onTouchTap={this.handleDeleteCard}></i> </div>
270
+
271
+ <Paper className='channel'
272
+ ref={'channel' + this.props.channelId}
273
+ style={style}
274
+ onTouchTap={this.handleSelectChannel} >
275
+
276
+ <div className='channel-div'>
277
+
278
+ <div className='channel-caption'>
279
+
280
+ <div className='icon-name-wrapper'>
281
+
282
+ <div className='channel-icon' ref='channelIcon' style={iconStyle} > </div>
283
+
284
+ <div className='name-wrapper'>
285
+ <p className='channel-name'> {this.props.channel.name} </p>
286
+ <p className='channel-description'> {this.props.channel.description} </p>
287
+ </div>
288
+
289
+ </div>
290
+
291
+ </div>
292
+
293
+ </div>
294
+
295
+ </Paper>
296
+
297
+ </div>
298
+
299
+ {cardBack}
300
+
301
+ </div>
302
+
303
+ </div>;
304
+
305
+ var detailCard =
306
+ <div className='card-container detail-card-style' ref='cardContainer' >
307
+
308
+ <div className='card' ref='card'>
309
+
310
+ <div className='card-front' ref='cardFront'>
311
+
312
+ {colorPicker}
313
+
314
+
315
+
316
+ <div className='corner-icon flip-icon' > <i className="ion ion-android-settings" ref='cornerIcon' onTouchTap={this.flipCard} ></i> </div>
317
+
318
+ <Paper className='channel'
319
+ ref={'channel' + this.props.channelId}
320
+ style={style} >
321
+
322
+ <div className='channel-div'>
323
+
324
+ <div className='channel-caption'>
325
+
326
+ <div className='upload-button-container' >
327
+ <FlatButton secondary={true}>
328
+ <span className="mui-flat-button-label upload-image-button">Upload screenshot</span>
329
+ <input type="file" id="imageButton" className="upload-image-input" onChange={this.handleUploadImage} ></input>
330
+ </FlatButton>
331
+ </div>
332
+
333
+ <div className='icon-name-wrapper'>
334
+
335
+ <div className='channel-icon modifiable' ref='channelIcon' style={iconStyle} onTouchTap={onTouchTapIcon} > </div>
336
+
337
+ <div className='name-wrapper-edit'>
338
+
339
+ <TextField
340
+ ref={'textFieldName' + this.props.channelId}
341
+ hintText={'Channel name'}
342
+ value={this.props.channel.name}
343
+ onChange={this.handleSetName}
344
+ onKeyPress={this.validateInputName} />
345
+
346
+ <TextField
347
+ ref={'textFieldDescription' + this.props.channelId}
348
+ hintText={'Channel description'}
349
+ value={this.props.channel.description}
350
+ onChange={this.handleSetDescription}
351
+ onKeyPress={this.validateInputDescription} />
352
+
353
+ </div>
354
+
355
+ </div>
356
+
357
+ </div>
358
+
359
+ </div>
360
+
361
+ </Paper>
362
+
363
+ </div>
364
+
365
+ {cardBack}
366
+
367
+ </div>
368
+
369
+ </div>;
370
+
371
+ return this.state.selected? detailCard : catalogueCard;
372
+
373
+ }
374
+
375
+ });
376
+
377
+ module.exports = Channel;
378
+
@@ -0,0 +1,28 @@
1
+
2
+ var React = require('react');
3
+ var Mui = require('material-ui');
4
+ var Paper = Mui.Paper;
5
+
6
+ var ColorCell = React.createClass({
7
+
8
+ handlePickColor: function() {
9
+ this.props.onPickColor(this.props.color);
10
+ },
11
+
12
+ render: function() {
13
+
14
+ var style = {
15
+ backgroundColor: this.props.color
16
+ };
17
+
18
+ return (
19
+
20
+ <div className='color-cell' style={style} onTouchTap={this.handlePickColor} > </div>
21
+
22
+ );
23
+
24
+ }
25
+
26
+ });
27
+
28
+ module.exports = ColorCell;
@@ -0,0 +1,53 @@
1
+
2
+ var React = require('react');
3
+ var Mui = require('material-ui');
4
+ var ColorCell = require('./ColorCell');
5
+
6
+ var ColorPicker = React.createClass({
7
+
8
+ componentWillMount: function() {
9
+
10
+ this.palette_ = [];
11
+ this.palette_.push(
12
+ '#f6e8c3',
13
+ '#c7eae5',
14
+ '#fde0ef',
15
+ '#e6f5d0',
16
+ '#e7d4e8',
17
+ '#fee0b6',
18
+ '#d1e5f0',
19
+ '#f46d43',
20
+ '#bdbdbd',
21
+ '#a8ddb5'
22
+ );
23
+
24
+ },
25
+
26
+ render: function() {
27
+ var self = this;
28
+
29
+ var colorsGrid = [];
30
+ this.palette_.forEach(function(c) {
31
+ colorsGrid.push(
32
+ <ColorCell color={c}
33
+ size={self.props.cellSize}
34
+ onPickColor={self.props.onPickColor}/>
35
+ );
36
+ });
37
+
38
+ return (
39
+
40
+ <div className='color-picker' >
41
+
42
+ {colorsGrid}
43
+
44
+ </div>
45
+
46
+ );
47
+
48
+ }
49
+
50
+ });
51
+
52
+ module.exports = ColorPicker;
53
+
@@ -0,0 +1,66 @@
1
+
2
+ var React = require('react');
3
+ var Channel = require('./Channel');
4
+
5
+ var DetailPage = React.createClass({
6
+
7
+ componentWillMount: function() {
8
+ this.updateDimensions();
9
+ },
10
+
11
+ componentDidMount: function() {
12
+ this.setState({
13
+ channel: this.props.channel
14
+ });
15
+
16
+ window.addEventListener("resize", this.updateDimensions);
17
+
18
+ },
19
+
20
+ componentWillUnmount: function() {
21
+ window.removeEventListener("resize", this.updateDimensions);
22
+ },
23
+
24
+ componentWillReceiveProps: function(nextProps) {
25
+ this.setState({
26
+ channel: nextProps.channel
27
+ });
28
+ },
29
+
30
+ getInitialState: function () {
31
+ return {
32
+ channel: this.props.channel,
33
+ windowSize: []
34
+ }
35
+ },
36
+
37
+ updateDimensions: function() {
38
+ this.setState({windowSize: [window.innerWidth, window.innerHeight]});
39
+ },
40
+
41
+ render: function() {
42
+
43
+ var channel =
44
+ <Channel
45
+ channel={this.state.channel}
46
+ selected={true} />;
47
+
48
+ var rightBarStyle = {
49
+ height: this.state.windowSize[1]
50
+ };
51
+
52
+ return (
53
+
54
+ <div className='detail-page' >
55
+ <div className="card-detail"> {channel} </div>
56
+ <div className="right-bar-detail" style={rightBarStyle} > </div>
57
+ </div>
58
+
59
+ );
60
+
61
+ }
62
+
63
+ });
64
+
65
+ module.exports = DetailPage;
66
+
@@ -0,0 +1,40 @@
1
+
2
+ var NutellaMixin = {
3
+
4
+ getChannelsForRid: function(message, rid) {
5
+ var myChannelsId = [];
6
+ var myChannels = [];
7
+ message.forEach(function(f) {
8
+ for (var i in f.items) {
9
+ var item = f.items[i];
10
+ if (item.name === 'iPad1') {
11
+ myChannelsId = item.channels;
12
+ break;
13
+ }
14
+ }
15
+ });
16
+ myChannelsId.forEach(function(id) {
17
+ myChannels.push(CHANNELS[id]);
18
+ });
19
+ },
20
+
21
+ getUrlForAsset: function(assetName, assetType) {
22
+
23
+ var broker = null;
24
+ if(query_parameters.broker) {
25
+ broker = query_parameters.broker;
26
+ } else {
27
+ broker = '52.1.142.215'; // TODO hardcoded broker
28
+ }
29
+
30
+ var runId = 'RoomQuake'; // TODO hardcoded runid
31
+ if(assetType == null) {
32
+ return 'http://' + broker + ':57880/roomcast/main-interface/assets/channels/' + '/' + assetName;
33
+ }
34
+ return 'http://' + broker + ':57880/roomcast/main-interface/assets/channels/' + runId + '/' + assetType + '/' + assetName;
35
+
36
+ }
37
+
38
+ };
39
+
40
+ module.exports = NutellaMixin;
@@ -0,0 +1,68 @@
1
+
2
+ var PageSliderMixin = {
3
+
4
+ getInitialState: function () {
5
+ return {
6
+ history: [],
7
+ pages: [],
8
+ animating: false
9
+ }
10
+ },
11
+ componentDidUpdate: function() {
12
+ var skippedCurrentFrame = false,
13
+ pageEl = this.getDOMNode().lastChild,
14
+ pages = this.state.pages,
15
+ l = pages.length,
16
+ transitionEndHandler = function() {
17
+ pageEl.removeEventListener('webkitTransitionEnd', transitionEndHandler);
18
+ pages.shift();
19
+ this.setState({pages: pages});
20
+ }.bind(this),
21
+ animate = function() {
22
+ if (!skippedCurrentFrame) {
23
+ skippedCurrentFrame = true;
24
+ requestAnimationFrame(animate.bind(this));
25
+ } else if (l > 0) {
26
+ pages[l - 1].props.position = "center transition";
27
+ this.setState({pages: pages, animating: false});
28
+ pageEl.addEventListener('webkitTransitionEnd', transitionEndHandler);
29
+ }
30
+ };
31
+
32
+ if (this.state.animating) {
33
+ requestAnimationFrame(animate.bind(this));
34
+ }
35
+ },
36
+ slidePage: function (page) {
37
+ var history = this.state.history,
38
+ pages = this.state.pages,
39
+ l = history.length,
40
+ hash = window.location.hash,
41
+ position = "center";
42
+
43
+ if (l === 0) {
44
+ history.push(hash);
45
+ } else if (hash === history[l - 2]) {
46
+ history.pop();
47
+ position = "left";
48
+ } else {
49
+ history.push(hash);
50
+ position = "right";
51
+ }
52
+
53
+ page.props.position = position;
54
+ pages.push(page);
55
+
56
+ this.setState({history: history, pages: pages, animating: position!=="center"});
57
+
58
+ },
59
+ render: function () {
60
+ return (
61
+ <div className="pageslider-container">
62
+ {this.state.pages}
63
+ </div>
64
+ );
65
+ }
66
+ };
67
+
68
+ module.exports = PageSliderMixin;
@@ -0,0 +1,52 @@
1
+
2
+ var Router = (function () {
3
+
4
+ "use strict";
5
+
6
+ var routes = [];
7
+
8
+ function addRoute(route, handler) {
9
+
10
+ routes.push({parts: route.split('/'), handler: handler});
11
+ }
12
+
13
+ function load(route) {
14
+ window.location.hash = route;
15
+ }
16
+
17
+ function start() {
18
+
19
+ var path = window.location.hash.substr(1),
20
+ parts = path.split('/'),
21
+ partsLength = parts.length;
22
+
23
+ for (var i = 0; i < routes.length; i++) {
24
+ var route = routes[i];
25
+ if (route.parts.length === partsLength) {
26
+ var params = [];
27
+ for (var j = 0; j < partsLength; j++) {
28
+ if (route.parts[j].substr(0, 1) === ':') {
29
+ params.push(parts[j]);
30
+ } else if (route.parts[j] !== parts[j]) {
31
+ break;
32
+ }
33
+ }
34
+ if (j === partsLength) {
35
+ route.handler.apply(undefined, params);
36
+ return;
37
+ }
38
+ }
39
+ }
40
+ }
41
+
42
+ window.onhashchange = start;
43
+
44
+ return {
45
+ addRoute: addRoute,
46
+ load: load,
47
+ start: start
48
+ };
49
+
50
+ }());
51
+
52
+ module.exports = Router;