mxit-rails 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/README.md +62 -19
  2. data/app/assets/images/mxit_rails/emoticons.png +0 -0
  3. data/app/assets/javascripts/mxit_rails/emulator.js +22 -15
  4. data/app/assets/stylesheets/mxit_rails/emulator.css.scss +13 -2
  5. data/app/assets/stylesheets/mxit_rails/included.css.scss +53 -0
  6. data/app/helpers/mxit_rails_helper.rb +1 -1
  7. data/app/views/emulator/index.html.erb +39 -25
  8. data/app/views/layouts/mxit.html.erb +5 -4
  9. data/lib/mxit_rails/engine.rb +3 -0
  10. data/lib/mxit_rails/page.rb +66 -3
  11. data/lib/mxit_rails/styles.rb +54 -4
  12. data/lib/mxit_rails/version.rb +1 -1
  13. data/test/dummy/app/views/form/index/age.html.erb +1 -1
  14. data/test/dummy/app/views/form/index/done.html.erb +1 -1
  15. data/test/dummy/app/views/form/index/gender.html.erb +1 -1
  16. data/test/dummy/app/views/form/index/name.html.erb +1 -1
  17. data/test/dummy/app/views/form/index/start.html.erb +1 -1
  18. data/test/dummy/app/views/form/index/surname.html.erb +1 -1
  19. data/test/dummy/app/views/index/index.html.erb +2 -7
  20. data/test/dummy/app/views/welcome/easter_egg.html.erb +1 -1
  21. data/test/dummy/app/views/welcome/index.html.erb +1 -1
  22. data/test/dummy/log/development.log +3085 -0
  23. data/test/dummy/tmp/cache/assets/CE2/D30/sprockets%2Fd3a004deb91b48186689a96981c6b02b +0 -0
  24. data/test/dummy/tmp/cache/assets/CEA/D60/sprockets%2Fdf3c6b2c7584552f8929860e75cb0a51 +0 -0
  25. data/test/dummy/tmp/cache/assets/D03/D30/sprockets%2F039aef99b893884717dd47cbd5a47788 +0 -0
  26. data/test/dummy/tmp/cache/assets/D54/750/sprockets%2Fc16371b1a234c7c56cb01cb28a8bc5c3 +0 -0
  27. data/test/dummy/tmp/cache/assets/D5B/540/sprockets%2Fe0e490354c54e5a850a6e3c3aa1ecb15 +0 -0
  28. data/test/dummy/tmp/cache/assets/D6F/560/sprockets%2Fa572b066d908bae0d01dbc85f86a57d9 +0 -0
  29. data/test/dummy/tmp/cache/assets/DAA/B80/sprockets%2Ff8082150f8c8beafcd445cc79a9a6a85 +0 -0
  30. data/test/dummy/tmp/cache/assets/DFB/940/sprockets%2F2faff4be90929be6a1b1de49ea25e33b +0 -0
  31. data/test/dummy/tmp/cache/assets/E15/260/sprockets%2Fea9c788716af4ccb19ff8e1d7ea47b8e +0 -0
  32. data/test/dummy/tmp/cache/assets/E26/4F0/sprockets%2F1cd8dafcb93f36aea8c2cf9d04c322d3 +0 -0
  33. data/test/dummy/tmp/cache/assets/E4F/E70/sprockets%2Fd9fffd76ac7c8ee08bedf3e257c81f99 +0 -0
  34. metadata +7 -4
  35. data/test/dummy/tmp/pids/server.pid +0 -1
data/README.md CHANGED
@@ -2,32 +2,43 @@ Mxit Rails
2
2
  ==========
3
3
 
4
4
  A gem that includes a simple and opinionated templating framework for Rails-based Mxit apps.
5
- This includes a rough layout, support for styles similar to CSS classes, wrapped inputs, and
5
+ This includes a layout framework, support for styles (similar to CSS classes), abstraction of inputs and multi-step forms, and
6
6
  an elegant way to support Mxit's conversation-based interface.
7
7
 
8
+ It also includes a browser-based *emulator* with a lot of functionality to simplify and streamline the development process.
9
+
8
10
  Later versions will also include wrappers for important Mxit APIs.
9
11
 
12
+
10
13
  Sample App
11
14
  ----------
12
15
  A basic to-do app has been set up as an example of the gem in use. It can be seen at [mxit-to-do](https://github.com/linsen/mxit-to-do).
13
16
 
17
+
14
18
  Installation
15
19
  ------------
16
20
  To use the gem, just include the gem your rails projects' gemfile:
17
21
 
18
- gem 'mxit-rails', '~> 0.2.7'
22
+ gem 'mxit-rails', '~> 0.3.2'
23
+
24
+ [Heroku](https://devcenter.heroku.com/articles/rails3) provides the simplest way to get a rails app running on the web.
25
+
26
+ [Showoff.io](https://showoff.io) is a great tool for development, allowing you to access localhost from Mxit.
27
+
28
+ Look at [Mxit Apps](wiki/Mxit-Apps) on the wiki for more information.
19
29
 
20
- The newest version is 0.2.7 - it is not recommended to use any earlier versions.
21
30
 
22
31
  Basic usage
23
32
  -----------
24
- To set up a controller to use the gem, you need to include the `MxitRails::Page` module:
33
+ To set up a specific controller to use the gem, you need to include the `MxitRails::Page` module:
25
34
 
26
35
  include MxitRails::Page
27
36
 
28
37
  This creates a few helper methods that can be used within that controller
29
38
 
30
39
  - `input input_name, input_label` - Define the page's input field with a name (symbol) and text label
40
+ - `select select_name, select_label, select_options, options` - Create a single-select input with a name (symbol) and text label
41
+ - `multi_select select_name, select_label, select_options, options` - Create a multi-select input with a name (symbol) and text label
31
42
  - `validate type, [parameter], message` - Set up validations on the input field.
32
43
  - `validate message, &block` - A custom message with a block providing a `true` (valid) or `false` (invalid) value.
33
44
  Note that the block must not use a `return` statement
@@ -40,6 +51,10 @@ Currently the following validations are available:
40
51
  - `:length, exact_length`
41
52
  - `:min_length, min`
42
53
  - `:max_length, max`
54
+ - `:min_value, min`
55
+ - `:max_value, max`
56
+ - `:cellphone_number`
57
+ - `:sa_id_number`
43
58
 
44
59
 
45
60
  Multi-step forms
@@ -57,14 +72,19 @@ The gem allows the easy set up of multi-step forms within a single controller ac
57
72
 
58
73
  The order in which steps are defined will be the order they are presented to users in. Each step should have its own view file, in
59
74
  `app/views/controller/action/step`. Each step has access to the same helper methods as the controller itself. For steps that don't
60
- have an input field, a `proceed` helper method is provided
75
+ have an input field (either `input`, `select` or `multi_select`), a `proceed` helper method is provided
61
76
 
62
77
  - `proceed message` - Show a proceed link rather than a form input
63
78
 
64
79
  Users will only proceed to the next step in the form if all validations of the previous step pass.
65
-
66
80
  If the action has a `submit` block (defined outside of the `form`), it will only be executed after the last step is completed.
67
81
 
82
+ There are three methods to change flow within a form. All will create a redirect, but a `return` statement should accompany them in the action
83
+ to avoid double rendering.
84
+ - `skip_to step_name` - Skip to the specified step
85
+ - `reset!` - Reset the whole form
86
+ - `submit!` - Submit the form with whatever values have been filled in so far
87
+
68
88
 
69
89
  Styles
70
90
  ------
@@ -75,25 +95,28 @@ and can be declared in any controller with the `mxit_style` macro. It is recomm
75
95
 
76
96
  To include a style in a template, use the `mxit_style` helper method. Any number of styles can be given as parameters to this method.
77
97
 
78
- <p style="<%= mxit_style :author %>">Lewis Carroll</p>
98
+ <span style="<%= mxit_style :author %>">Lewis Carroll</span>
79
99
 
80
100
  The following special styles are used in the overall layout, and it is thus recommended that they be defined. Note that links can only be styled per-page, not per link.
81
101
 
82
102
  - `:body` - The page body (`body` element in html)
83
- - `:title` - The page title
84
103
  - `:link` - The colour of links in the page
85
104
  - `:link_hover` - The colour and background colour of highlighted links.
86
105
 
87
106
 
88
107
  Layout
89
108
  ------
90
- The gem currently includes a default layout that has a title bar, an optional navigation link, and a form input below the body where appropriate.
91
- The title and navigation should be defined with `content_for` blocks, addressing `:title` and `:navigation` respectively.
109
+ The gem currently includes a default layout that creates the necessary html headers, and includes the form at the bottom of the page.
110
+
111
+ There is a `mxit_table_row` helper method (which takes a list of styles) that will create a new table cell.
112
+ All cells will be 100% width, and are intended to be used only to create blocks of colour in the app (e.g. title bars).
113
+
114
+ Calling `mxit_table_row` with no parameters will create a row with the `body` style applied
92
115
 
93
116
 
94
117
  Emulator
95
118
  --------
96
- The mxit-rails gem is provided with an emulator to aid development. It can be accessed at `/emulator`. The url will dynamically update to show
119
+ The mxit-rails gem is provided with a feature-rich emulator to aid development. It can be accessed at `/emulator`. The url will dynamically update to show
97
120
  the current URL of the page shown as a suffix, e.g. `emulator/path_to/page`. Certain parts of the app can similarly be loaded directly by
98
121
  navigating to their corresponding URL.
99
122
 
@@ -104,12 +127,32 @@ To set the root URL of the emulator, add the following line to `config/applicati
104
127
 
105
128
  Mxit Headers
106
129
  ------------
107
- The gem automatically parses (some) Mxit headers and makes them available in the `mxit_params` hash. When using the emulator these values are spoofed with cookies, but in a way transparent to the app itself. Currently the following are available:
108
-
109
- - `:mxit_id` - The user's Mxit ID (m-ID). From the `X-Mxit-UserId-R` header
110
- - `:mxit_login` - The user's Mxit Login name. From the `X-Mxit-Login` or `X-Mxit-ID-R` header
111
- - `:display_name` - The user's current nickname. From the `X-Mxit-Nick` header
112
- - `:distribution_code` - The distribution code corresponding to the specific installaction of the Mxit app on the user's phone.
113
- The first part of the `X-Mxit-Device-Info` header.
114
- - `:mobile_number` - The user's mobile number as in their profile. The second part of the `X-Mxit-Device-Info` header.
130
+ The gem automatically parses (some) Mxit headers and makes them available in the `mxit_params` hash. When using the emulator these values are spoofed with cookies, but in a way transparent to the app itself. Look at Mxit's [Documentation](http://dev.mxit.com/docs/mobi-portal-api#headers) for more details. Currently the following are available:
131
+
132
+ - `:mxit_id` - The user's Mxit ID (m-ID). From `X-Mxit-UserId-R`
133
+ - `:mxit_login` - The user's Mxit Login name. From `X-Mxit-Login` or `X-Mxit-ID-R`
134
+ - `:display_name`, `:nick` - The user's current nickname. From `X-Mxit-Nick`
135
+ - `:screen_width` - From 'UA-Pixels'
136
+ - `:screen_height` - From 'UA-Pixels'
137
+ - `:device_user_agent` - The agent string of the requesting device, e.g. "SonyEricsson?/K800i". From `X-Device-User-Agent`
138
+ - `:contact` - The Mxit service name, e.g. "books@mxit.com". From `X-Mxit-Contact`
139
+ - `:location` - The user's current location. From `X-Mxit-Location`. Automatically split into components (in `mxit_params`) as well:
140
+ - `:country_code` - ISO 3166-1 alpha-2 Country Code
141
+ - `:country_name`
142
+ - `:principal_subdivision_code`
143
+ - `:principal_subdivision_name`
144
+ - `:city_code`
145
+ - `:city_name`
146
+ - `:network_operator_id`
147
+ - `:client_features_bitset`
148
+ - `:cell_id`
149
+ - `:profile` - The user's profile details. From `X-Mxit-Profile`. Automatically split into components (in `mxit_params`) as well:
150
+ - `:language_code` - ISO_639-1 or ISO_639-2 language code
151
+ - `:registered_country_code` - Registered ISO 3166-1 alpha-2 Country Code
152
+ - `:date_of_birth` - A ruby Date object where it can be parsed to a Date, otherwise just the string from the header
153
+ - `:gender` - a symbol (`:male`, `:female` or `:unknown`)
154
+ - `:tariff_plan` - a symbol (`:free`, `:freestyler` or `:unknown`)
155
+ - `:user_input` - Any input typed in not matching a link on the page. HTML escaping is undone. From `X-Mxit-User-Input`.
156
+ - Note that spaces are converted to `+` characters, and `+` characters are not escaped, so if the user enters a `+` it will appear as a space in rails.
157
+ - This field wil *only* be set if the user enters text that is not a link on the page (case sensitive match to the link text), and if there isn't a form input on the page.
115
158
 
@@ -35,23 +35,17 @@ Emulator = (function() {
35
35
 
36
36
  setCookie: function() {
37
37
  // Create cookies. Use only lowercase cookie names - the server expects this (case insensitivity seems dodgy)
38
- $.cookie('x-mxit-login', localStorage.getItem('mxit-login'), {path: '/'});
39
38
  $.cookie('x-mxit-userid-r', localStorage.getItem('mxit-id'), {path: '/'});
39
+ $.cookie('x-mxit-login', localStorage.getItem('mxit-login'), {path: '/'});
40
40
  $.cookie('x-mxit-nick', localStorage.getItem('mxit-nick'), {path: '/'});
41
+ $.cookie('x-mxit-contact', localStorage.getItem('mxit-contact'), {path: '/'});
42
+ $.cookie('x-mxit-location', localStorage.getItem('mxit-location'), {path: '/'});
43
+ $.cookie('x-mxit-profile', localStorage.getItem('mxit-profile'), {path: '/'});
41
44
  $.cookie('x-mxit-device-info', localStorage.getItem('mxit-distribution-code') + ',' + localStorage.getItem('mxit-msisdn'), {path: '/'});
42
45
 
43
- if (MXIT_PATH && (MXIT_PATH != ''))
44
- Emulator.setUrl(MXIT_PATH);
45
- else
46
- Emulator.home();
47
- },
46
+ $.cookie('ua-pixels', '240x320', {path: '/'});
47
+ $.cookie('x-device-user-agent', 'EMULATOR', {path: '/'});
48
48
 
49
- clearCookie: function() {
50
- // Create cookies. Use only lowercase cookie names - the server expects this (case insensitivity seems dodgy)
51
- $.cookie('x-mxit-login', null, {path: '/'});
52
- $.cookie('x-mxit-userid-r', null, {path: '/'});
53
- $.cookie('x-mxit-nick', null, {path: '/'});
54
- $.cookie('x-mxit-device-info', null, {path: '/'});
55
49
 
56
50
  if (MXIT_PATH && (MXIT_PATH != ''))
57
51
  Emulator.setUrl(MXIT_PATH);
@@ -86,8 +80,9 @@ Emulator = (function() {
86
80
  editCredentials: function() {
87
81
  $('#center').hide();
88
82
  $('#inputs').show();
83
+ $('#link').hide();
89
84
 
90
- values = ['id', 'login', 'nick', 'distribution-code', 'msisdn'];
85
+ values = ['id', 'login', 'nick', 'contact', 'location', 'profile', 'distribution-code', 'msisdn'];
91
86
  for (var i in values) {
92
87
  var str = values[i];
93
88
  var value = localStorage.getItem('mxit-' + str);
@@ -95,15 +90,27 @@ Emulator = (function() {
95
90
  }
96
91
  },
97
92
 
93
+ clearCredentials: function() {
94
+ values = ['id', 'login', 'nick', 'contact', 'location', 'profile', 'distribution-code', 'msisdn'];
95
+ for (var i in values) {
96
+ var str = values[i];
97
+ $('#mxit-' + str + '-input').val('');
98
+ }
99
+ },
100
+
98
101
  saveCredentials: function() {
99
- values = ['id', 'login', 'nick', 'distribution-code', 'msisdn'];
102
+ values = ['id', 'login', 'nick', 'contact', 'location', 'profile',, 'distribution-code', 'msisdn'];
100
103
  for (var i in values) {
101
104
  var str = values[i];
102
- localStorage.setItem('mxit-' + str, $('#mxit-' + str + '-input').val());
105
+ var val = $('#mxit-' + str + '-input').val();
106
+ if (val == '')
107
+ val = $('#mxit-' + str + '-input').attr('placeholder');
108
+ localStorage.setItem('mxit-' + str, val);
103
109
  }
104
110
 
105
111
  $('#inputs').hide();
106
112
  $('#center').show();
113
+ $('#link').show();
107
114
  Emulator.setCredentials();
108
115
  },
109
116
 
@@ -87,7 +87,13 @@ iframe {
87
87
  }
88
88
  #inputs {
89
89
  display: none;
90
- padding: 10px;
90
+ padding: 20px 10px 10px 10px;
91
+ position: absolute;
92
+ top: 37px;
93
+ bottom: 0;
94
+ left: 0;
95
+ right: 0;
96
+ background-color: #fff;
91
97
  }
92
98
  #inputs label {
93
99
  font-size: 12px;
@@ -100,7 +106,7 @@ iframe {
100
106
  font-size: 16px;
101
107
  border: 1px solid #bbb;
102
108
  border-radius: 5px;
103
- width: 208px;
109
+ width: 95%;
104
110
  height: 22px;
105
111
  }
106
112
  #save {
@@ -108,6 +114,11 @@ iframe {
108
114
  display: block;
109
115
  text-align: center;
110
116
  }
117
+ #clear {
118
+ position: absolute;
119
+ right: 20px;
120
+ top: 3px;
121
+ }
111
122
 
112
123
 
113
124
  .link .icon {
@@ -5,6 +5,59 @@ html, body {
5
5
  font-weight: normal;
6
6
  }
7
7
 
8
+ .emulator td {
9
+ padding: 2px;
10
+ }
11
+
8
12
  .emulator form {
9
13
  display: none;
10
14
  }
15
+
16
+ .emulator .emoticon {
17
+ height: 32px;
18
+ line-height: 32px;
19
+ width: 32px;
20
+ display: inline-block;
21
+ background-repeat: no-repeat;
22
+ text-indent: 100px;
23
+ overflow: hidden;
24
+
25
+ &.happy {background-position: 0px 0px;}
26
+ &.sad {background-position: -32px 0px;}
27
+ &.winking {background-position: -64px 0px;}
28
+ &.excited {background-position: -96px 0px;}
29
+ &.shocked {background-position: -128px 0px;}
30
+ &.surprised {background-position: -160px 0px;}
31
+ &.tongue_out {background-position: -192px 0px;}
32
+ &.embarrassed {background-position: -224px 0px;}
33
+ &.cool {background-position: -256px 0px;}
34
+ &.heart {background-position: -288px 0px;}
35
+ &.flower {background-position: -320px 0px;}
36
+ &.male {background-position: -352px 0px;}
37
+ &.female {background-position: -384px 0px;}
38
+ &.star {background-position: -416px 0px;}
39
+ &.chilli {background-position: -448px 0px;}
40
+ &.kiss {background-position: -480px 0px;}
41
+ &.idea {background-position: -512px 0px;}
42
+ &.extremely_angry {background-position: -544px 0px;}
43
+ &.censored {background-position: -576px 0px;}
44
+ &.grumpy {background-position: -608px 0px;}
45
+ &.coffee {background-position: -640px 0px;}
46
+ &.mr_green {background-position: -672px 0px;}
47
+ &.sick {background-position: -704px 0px;}
48
+ &.wtf {background-position: -736px 0px;}
49
+ &.in_love {background-position: -768px 0px;}
50
+ &.rolling_eyes {background-position: -800px 0px;}
51
+ &.crying {background-position: -832px 0px;}
52
+ &.thinking {background-position: -864px 0px;}
53
+ &.drooling {background-position: -896px 0px;}
54
+ &.sleepy {background-position: -928px 0px;}
55
+ &.liar {background-position: -960px 0px;}
56
+ &.nerdy {background-position: -992px 0px;}
57
+ &.pirate {background-position: -1024px 0px;}
58
+ &.bored {background-position: -1056px 0px;}
59
+ &.cold {background-position: -1088px 0px;}
60
+ &.confused {background-position: -1120px 0px;}
61
+ &.hungry {background-position: -1152px 0px;}
62
+ &.stressed {background-position: -1184px 0px;}
63
+ }
@@ -50,7 +50,7 @@ module MxitRailsHelper
50
50
 
51
51
  output = "<a href=\"#{target}\">"
52
52
  if @_mxit.numbered_list
53
- output += "#{@_mxit_select_index}</a>) #{content}"
53
+ output += "#{@_mxit_select_index})</a> #{content}"
54
54
  else
55
55
  output += "#{label}</a>"
56
56
  output = (selected ? '+ ' : '- ') + output
@@ -45,35 +45,49 @@
45
45
  <div id="phone">
46
46
  <div id="screen">
47
47
  <iframe id="center" class="content" onLoad="Emulator.updateIframe()"></iframe>
48
-
49
- <div id="inputs">
50
- <div>
51
- <label for="mxit-id-input">Mxit ID</label>
52
- <input type="text" placeholder="Mxit ID" id="mxit-id-input" value="m987654321" />
53
- </div>
54
- <div>
55
- <label for="mxit-login-input">Mxit Login</label>
56
- <input type="text" placeholder="Mxit Login" id="mxit-login-input"/>
57
- </div>
58
- <div>
59
- <label for="mxit-nick-input">Display Name (Nick)</label>
60
- <input type="text" placeholder="Nickname" id="mxit-nick-input"/>
61
- </div>
62
- <div>
63
- <label for="mxit-distribution-code-input">Distribution Code</label>
64
- <input type="text" placeholder="Distribution Code" id="mxit-distribution-code-input" value="DISTRO_CODE"/>
65
- </div>
66
- <div>
67
- <label for="mxit-msisdn-input">MSISDN (Cell No)</label>
68
- <input type="text" placeholder="MSISDN" id="mxit-msisdn-input" />
69
- </div>
70
-
71
- <a id="save" class="go link" onclick="Emulator.saveCredentials()">Save <span class="icon"><span class="image"></span></span></a>
72
- </div>
73
48
  </div>
74
49
  <input id="phone-input" type="text" autocomplete="off" />
75
50
  </div>
76
51
 
52
+ <div id="inputs">
53
+ <a id="clear" class="go link" onclick="Emulator.clearCredentials()">Clear All <span class="icon"><span class="image"></span></span></a>
54
+ <div>
55
+ <label for="mxit-id-input">Mxit ID</label>
56
+ <input type="text" placeholder="m987654321" id="mxit-id-input" />
57
+ </div>
58
+ <div>
59
+ <label for="mxit-login-input">Mxit Login</label>
60
+ <input type="text" placeholder="MxitLogin" id="mxit-login-input"/>
61
+ </div>
62
+ <div>
63
+ <label for="mxit-nick-input">Display Name (Nick)</label>
64
+ <input type="text" placeholder="Nickname" id="mxit-nick-input"/>
65
+ </div>
66
+ <div>
67
+ <label for="mxit-contact-input">Contact</label>
68
+ <input type="text" placeholder="ContactName" id="mxit-contact-input" />
69
+ </div>
70
+ <div>
71
+ <label for="mxit-location-input">Location</label>
72
+ <input type="text" placeholder="ZA,South Africa,11,Western Cape,23,Kraaifontein,88,13072382,8fbe253" id="mxit-location-input" />
73
+ </div>
74
+ <div>
75
+ <label for="mxit-profile-input">Profile</label>
76
+ <input type="text" placeholder="en,ZA,1984-01-01,male,1" id="mxit-profile-input" />
77
+ </div>
78
+ <div>
79
+ <label for="mxit-distribution-code-input">Distribution Code - Only available to authorised apps</label>
80
+ <input type="text" placeholder="DISTRO_CODE" id="mxit-distribution-code-input" />
81
+ </div>
82
+ <div>
83
+ <label for="mxit-msisdn-input">MSISDN (Cell No) - Only available to authorised apps</label>
84
+ <input type="text" placeholder="27820123456" id="mxit-msisdn-input" />
85
+ </div>
86
+
87
+ <p>Leave fields blank to set them to the default value</p>
88
+ <a id="save" class="go link" onclick="Emulator.saveCredentials()">Save <span class="icon"><span class="image"></span></span></a>
89
+ </div>
90
+
77
91
  <div id="fadeout"></div>
78
92
 
79
93
  </body>
@@ -7,10 +7,11 @@
7
7
 
8
8
  <meta name="mxit" content="no_prefix,show_progress,clear_on_new,no_heading" />
9
9
 
10
- <% if request.headers['x-mxit-login'].nil? %>
10
+ <% if @_mxit_emulator %>
11
11
  <!-- Include a CSS file, but only in a browser/emulator, not on mxit -->
12
12
  <%= stylesheet_link_tag "mxit_rails/included" %>
13
13
  <style type="text/css">
14
+ .emulator .emoticon { background-image: url(<%= image_path("mxit_rails/emoticons.png"); %>) }
14
15
  a:focus { outline: none; <%= mxit_style :link_hover %> }
15
16
  </style>
16
17
  <% end %>
@@ -33,13 +34,13 @@
33
34
 
34
35
  <br />
35
36
  <% if @_mxit.input %>
36
- <% if @_mxit.input_label %>
37
+ <% unless @_mxit.input_label.blank? %>
37
38
  <%= mxit_proceed @_mxit.input_label %>
38
39
  <% end %>
39
40
 
40
41
  <% elsif @_mxit.select %>
41
42
  <% if @_mxit.multi_select %>
42
- <% if @_mxit.select_label %>
43
+ <% unless @_mxit.select_label.blank? %>
43
44
  <%= @_mxit.select_label %><br />
44
45
  <% end %>
45
46
 
@@ -50,7 +51,7 @@
50
51
  <%= mxit_proceed link_to(@_mxit.multi_select_next, "#{request.path}?_mxit_rails_submit=true&_mxit_rails_multi_select=#{@_mxit.select}") %>
51
52
 
52
53
  <% else %>
53
- <% if @_mxit.select_label %>
54
+ <% unless @_mxit.select_label.blank? %>
54
55
  <%= mxit_proceed @_mxit.select_label %>
55
56
  <% end %>
56
57
  <% @_mxit.select_options.each do |value, label| %>
@@ -1,4 +1,7 @@
1
1
  module MxitRails
2
2
  class Engine < ::Rails::Engine
3
+ initializer "precompile", :group => :all do |app|
4
+ app.config.assets.precompile += %w( mxit_rails/emulator.js mxit_rails/emulator.css mxit_rails/included.css )
5
+ end
3
6
  end
4
7
  end