mtl 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/Gemfile +9 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +104 -0
  6. data/Rakefile +6 -0
  7. data/app/assets/javascripts/mtl/clickables.coffee +25 -0
  8. data/app/assets/javascripts/mtl/collapsible.coffee +43 -0
  9. data/app/assets/javascripts/mtl/configuration.coffee.erb +1 -0
  10. data/app/assets/javascripts/mtl/document_modal.coffee +130 -0
  11. data/app/assets/javascripts/mtl/dropdown.coffee +24 -0
  12. data/app/assets/javascripts/mtl/hooks.coffee +14 -0
  13. data/app/assets/javascripts/mtl/icon.coffee.erb +17 -0
  14. data/app/assets/javascripts/mtl/modal.coffee +32 -0
  15. data/app/assets/javascripts/mtl/select.coffee +44 -0
  16. data/app/assets/javascripts/mtl/templates.coffee +4 -0
  17. data/app/assets/javascripts/mtl/toc.coffee +31 -0
  18. data/app/assets/javascripts/mtl.js +42 -0
  19. data/app/assets/stylesheets/mtl/all.scss +69 -0
  20. data/app/assets/stylesheets/mtl/extend/_avatars.scss +37 -0
  21. data/app/assets/stylesheets/mtl/extend/_buttons.scss +31 -0
  22. data/app/assets/stylesheets/mtl/extend/_cards.scss +21 -0
  23. data/app/assets/stylesheets/mtl/extend/_chips.scss +3 -0
  24. data/app/assets/stylesheets/mtl/extend/_collection-files.scss +108 -0
  25. data/app/assets/stylesheets/mtl/extend/_document-modals.scss +95 -0
  26. data/app/assets/stylesheets/mtl/extend/_dropdown.scss +12 -0
  27. data/app/assets/stylesheets/mtl/extend/_forms.scss +66 -0
  28. data/app/assets/stylesheets/mtl/extend/_global.scss +77 -0
  29. data/app/assets/stylesheets/mtl/extend/_grid.scss +25 -0
  30. data/app/assets/stylesheets/mtl/extend/_material-icons.scss +37 -0
  31. data/app/assets/stylesheets/mtl/extend/_mixins.scss +10 -0
  32. data/app/assets/stylesheets/mtl/extend/_roboto-rails.scss +49 -0
  33. data/app/assets/stylesheets/mtl/extend/_side-nav.scss +22 -0
  34. data/app/assets/stylesheets/mtl/extend/_toc.scss +12 -0
  35. data/app/assets/stylesheets/mtl/extend/_typography.scss +32 -0
  36. data/app/assets/stylesheets/mtl/extend/forms/_input-fields.scss +50 -0
  37. data/app/assets/stylesheets/mtl/layouts/_default.scss +220 -0
  38. data/app/assets/stylesheets/mtl/layouts/_single.scss +25 -0
  39. data/app/views/mtl/header.html.erb +25 -0
  40. data/bin/coffeelint.rb +16 -0
  41. data/lib/generators/mtl/install_generator.rb +20 -0
  42. data/lib/generators/mtl/templates/_color.scss +410 -0
  43. data/lib/generators/mtl/templates/_variables.scss +330 -0
  44. data/lib/generators/mtl/templates/mtl.scss +8 -0
  45. data/lib/generators/mtl/templates/simple_form.rb +211 -0
  46. data/lib/mtl/rails/card_file_presenter.rb +70 -0
  47. data/lib/mtl/rails/view_helpers.rb +412 -0
  48. data/lib/mtl/simple_form/suffix.rb +52 -0
  49. data/lib/mtl/version.rb +6 -0
  50. data/lib/mtl.rb +38 -0
  51. data/mtl.gemspec +35 -0
  52. data/package.json +11 -0
  53. data/spec/mtl/rails/card_file_presenter_spec.rb +126 -0
  54. data/spec/mtl/rails/view_helpers_spec.rb +193 -0
  55. data/spec/mtl/simple_form/suffix_spec.rb +39 -0
  56. data/spec/mtl_spec.rb +34 -0
  57. data/spec/spec_helper.rb +18 -0
  58. data/spec/support/dom.rb +15 -0
  59. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.eot +0 -0
  60. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.ijmap +1 -0
  61. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.svg +2373 -0
  62. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.ttf +0 -0
  63. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.woff +0 -0
  64. data/vendor/assets/fonts/material-icons/MaterialIcons-Regular.woff2 +0 -0
  65. data/vendor/assets/fonts/roboto/Roboto-Bold.eot +0 -0
  66. data/vendor/assets/fonts/roboto/Roboto-Bold.ttf +0 -0
  67. data/vendor/assets/fonts/roboto/Roboto-Bold.woff +0 -0
  68. data/vendor/assets/fonts/roboto/Roboto-Bold.woff2 +0 -0
  69. data/vendor/assets/fonts/roboto/Roboto-Light.eot +0 -0
  70. data/vendor/assets/fonts/roboto/Roboto-Light.ttf +0 -0
  71. data/vendor/assets/fonts/roboto/Roboto-Light.woff +0 -0
  72. data/vendor/assets/fonts/roboto/Roboto-Light.woff2 +0 -0
  73. data/vendor/assets/fonts/roboto/Roboto-Medium.eot +0 -0
  74. data/vendor/assets/fonts/roboto/Roboto-Medium.ttf +0 -0
  75. data/vendor/assets/fonts/roboto/Roboto-Medium.woff +0 -0
  76. data/vendor/assets/fonts/roboto/Roboto-Medium.woff2 +0 -0
  77. data/vendor/assets/fonts/roboto/Roboto-Regular.eot +0 -0
  78. data/vendor/assets/fonts/roboto/Roboto-Regular.ttf +0 -0
  79. data/vendor/assets/fonts/roboto/Roboto-Regular.woff +0 -0
  80. data/vendor/assets/fonts/roboto/Roboto-Regular.woff2 +0 -0
  81. data/vendor/assets/fonts/roboto/Roboto-Thin.eot +0 -0
  82. data/vendor/assets/fonts/roboto/Roboto-Thin.ttf +0 -0
  83. data/vendor/assets/fonts/roboto/Roboto-Thin.woff +0 -0
  84. data/vendor/assets/fonts/roboto/Roboto-Thin.woff2 +0 -0
  85. data/vendor/assets/javascripts/lodash.js +16607 -0
  86. data/vendor/assets/javascripts/materialize/animation.js +9 -0
  87. data/vendor/assets/javascripts/materialize/buttons.js +91 -0
  88. data/vendor/assets/javascripts/materialize/cards.js +26 -0
  89. data/vendor/assets/javascripts/materialize/carousel.js +454 -0
  90. data/vendor/assets/javascripts/materialize/character_counter.js +72 -0
  91. data/vendor/assets/javascripts/materialize/chips.js +267 -0
  92. data/vendor/assets/javascripts/materialize/collapsible.js +160 -0
  93. data/vendor/assets/javascripts/materialize/date_picker/picker.date.js +1430 -0
  94. data/vendor/assets/javascripts/materialize/date_picker/picker.js +1123 -0
  95. data/vendor/assets/javascripts/materialize/dropdown.js +265 -0
  96. data/vendor/assets/javascripts/materialize/forms.js +681 -0
  97. data/vendor/assets/javascripts/materialize/global.js +45 -0
  98. data/vendor/assets/javascripts/materialize/hammer.min.js +1 -0
  99. data/vendor/assets/javascripts/materialize/init.js +173 -0
  100. data/vendor/assets/javascripts/materialize/initial.js +11 -0
  101. data/vendor/assets/javascripts/materialize/jquery.easing.1.3.js +205 -0
  102. data/vendor/assets/javascripts/materialize/jquery.hammer.js +33 -0
  103. data/vendor/assets/javascripts/materialize/jquery.timeago.min.js +1 -0
  104. data/vendor/assets/javascripts/materialize/leanModal.js +192 -0
  105. data/vendor/assets/javascripts/materialize/materialbox.js +269 -0
  106. data/vendor/assets/javascripts/materialize/parallax.js +58 -0
  107. data/vendor/assets/javascripts/materialize/prism.js +8 -0
  108. data/vendor/assets/javascripts/materialize/pushpin.js +71 -0
  109. data/vendor/assets/javascripts/materialize/scrollFire.js +48 -0
  110. data/vendor/assets/javascripts/materialize/scrollspy.js +283 -0
  111. data/vendor/assets/javascripts/materialize/sideNav.js +352 -0
  112. data/vendor/assets/javascripts/materialize/slider.js +321 -0
  113. data/vendor/assets/javascripts/materialize/tabs.js +148 -0
  114. data/vendor/assets/javascripts/materialize/toasts.js +136 -0
  115. data/vendor/assets/javascripts/materialize/tooltip.js +230 -0
  116. data/vendor/assets/javascripts/materialize/transitions.js +169 -0
  117. data/vendor/assets/javascripts/materialize/velocity.min.js +5 -0
  118. data/vendor/assets/javascripts/materialize/waves.js +338 -0
  119. data/vendor/assets/javascripts/pdfobject.js +254 -0
  120. data/vendor/assets/stylesheets/materialize/_buttons.scss +211 -0
  121. data/vendor/assets/stylesheets/materialize/_cards.scss +185 -0
  122. data/vendor/assets/stylesheets/materialize/_carousel.scss +85 -0
  123. data/vendor/assets/stylesheets/materialize/_chips.scss +74 -0
  124. data/vendor/assets/stylesheets/materialize/_collapsible.scss +90 -0
  125. data/vendor/assets/stylesheets/materialize/_color.scss +412 -0
  126. data/vendor/assets/stylesheets/materialize/_dropdown.scss +57 -0
  127. data/vendor/assets/stylesheets/materialize/_global.scss +781 -0
  128. data/vendor/assets/stylesheets/materialize/_grid.scss +147 -0
  129. data/vendor/assets/stylesheets/materialize/_icons-material-design.scss +5 -0
  130. data/vendor/assets/stylesheets/materialize/_materialbox.scss +42 -0
  131. data/vendor/assets/stylesheets/materialize/_mixins.scss +5 -0
  132. data/vendor/assets/stylesheets/materialize/_modal.scss +90 -0
  133. data/vendor/assets/stylesheets/materialize/_navbar.scss +182 -0
  134. data/vendor/assets/stylesheets/materialize/_normalize.scss +424 -0
  135. data/vendor/assets/stylesheets/materialize/_prefixer.scss +384 -0
  136. data/vendor/assets/stylesheets/materialize/_preloader.scss +334 -0
  137. data/vendor/assets/stylesheets/materialize/_roboto.scss +49 -0
  138. data/vendor/assets/stylesheets/materialize/_sideNav.scss +219 -0
  139. data/vendor/assets/stylesheets/materialize/_slider.scss +92 -0
  140. data/vendor/assets/stylesheets/materialize/_table_of_contents.scss +33 -0
  141. data/vendor/assets/stylesheets/materialize/_tabs.scss +56 -0
  142. data/vendor/assets/stylesheets/materialize/_toast.scss +65 -0
  143. data/vendor/assets/stylesheets/materialize/_tooltip.scss +32 -0
  144. data/vendor/assets/stylesheets/materialize/_typography.scss +61 -0
  145. data/vendor/assets/stylesheets/materialize/_variables.scss +313 -0
  146. data/vendor/assets/stylesheets/materialize/_waves.scss +177 -0
  147. data/vendor/assets/stylesheets/materialize/date_picker/_default.date.scss +435 -0
  148. data/vendor/assets/stylesheets/materialize/date_picker/_default.scss +201 -0
  149. data/vendor/assets/stylesheets/materialize/date_picker/_default.time.scss +125 -0
  150. data/vendor/assets/stylesheets/materialize/forms/_checkboxes.scss +220 -0
  151. data/vendor/assets/stylesheets/materialize/forms/_file-input.scss +38 -0
  152. data/vendor/assets/stylesheets/materialize/forms/_forms.scss +22 -0
  153. data/vendor/assets/stylesheets/materialize/forms/_input-fields.scss +273 -0
  154. data/vendor/assets/stylesheets/materialize/forms/_radio-buttons.scss +119 -0
  155. data/vendor/assets/stylesheets/materialize/forms/_range.scss +159 -0
  156. data/vendor/assets/stylesheets/materialize/forms/_select.scss +116 -0
  157. data/vendor/assets/stylesheets/materialize/forms/_switches.scss +78 -0
  158. metadata +309 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d9b073c97518294bc993c6cd712fee39740397f0
4
+ data.tar.gz: 9d6c66b39bb9948369fbd340c98b5a4ac1a54db3
5
+ SHA512:
6
+ metadata.gz: 8f72c380af09be0c8bee8a8d94dd6a651d064da07e9b35018f8847a0bb5c7af4d7f506cd7dc6cb00d96b340d31d786d9a498ec00d5e6d5586715a83a538ff346
7
+ data.tar.gz: 8d1315bceb18bacec36926b18f42e34478ab13076f73c29d4fdfeb8b2ca1bef1792a1bf8ca217c1906ddbe5ec58ab74820cbf103a7440d8c292174215cb8476a
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /yard
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /node_modules/
11
+ /doc/*
12
+ !/doc/images
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mtl.gemspec
4
+ gemspec
5
+
6
+ # Linters
7
+ gem 'rubocop', require: false
8
+ gem 'scss_lint', require: false
9
+ gem 'coffeelint', require: false
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2016 at-point ag (Baar, Switzerland) https://at-point.ch
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # MTL: Materializer
2
+
3
+ ![Tardis: mtl](http://67.media.tumblr.com/5afe48c312ae01b8911eac26fa59dbb2/tumblr_ngya1wnTRm1sofmw0o1_500.gif)
4
+
5
+ [![Build Status](https://travis-ci.org/at-point/mtl.svg?branch=master)](https://travis-ci.org/at-point/mtl)
6
+
7
+ Welcome to **MTL: Materializer**, this is a Rails gem we use at [at-point](https://at-point.ch)
8
+ to simplify UI designs for back-office heavy applications by leveraging the following
9
+ tools:
10
+
11
+ - [Materialize CSS][materialize]
12
+ - [Material Icons][icons] font from Google
13
+ - [Rails][rails] and it's asset pipeline
14
+ - [Lodash][lodash] utilities
15
+ - Google Material Design
16
+
17
+ It requires jQuery (works very will with 3.x).
18
+
19
+ ## Installation
20
+
21
+ Add this line to your Rails application's `Gemfile`, it supports Rails 4.2+
22
+ (including Rails 5):
23
+
24
+ ```ruby
25
+ gem 'mtl', git: 'https://github.com/at-point/mtl'
26
+ ```
27
+
28
+ then execute:
29
+
30
+ ```bash
31
+ $> bundle
32
+ ```
33
+
34
+ And finally run the installer to copy the "base files" to your application:
35
+
36
+ ```
37
+ $> ./bin/rails generate mtl:install [--skip-simple-form]
38
+ # This copies the following files:
39
+ # - app/assets/stylesheets/mtl.scss
40
+ # - app/assets/stylesheets/mtl/_color.scss
41
+ # - app/assets/stylesheets/mtl/_variables.scss
42
+ # - config/initializers/simple_form.rb
43
+ ```
44
+
45
+ Last but not least change your `application.css` to include:
46
+
47
+ ```
48
+ //= require mtl
49
+ ```
50
+
51
+ Ensure it **does not contain** any reference to `require_tree .`, as this leads
52
+ to duplicate imports and weird asset pipeline errors.
53
+
54
+ ## Usage
55
+
56
+ Customize and adapt your styling as wanted, feel free to modify things in
57
+ `_variables.scss` to your liking. Try to avoid changing `_color.scss` when
58
+ possible.
59
+
60
+ ## Development
61
+
62
+ For development `node` and `npm` is required.
63
+
64
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run
65
+ `rake spec` to run the tests. You can also run `bin/console` for an interactive
66
+ prompt that will allow you to experiment.
67
+
68
+ To install this gem onto your local machine, run `bundle exec rake install`.
69
+ To release a new version, update the version number in `version.rb`, and then run
70
+ `bundle exec rake release`, which will create a git tag for the version, push
71
+ git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
72
+
73
+ ### Update materialize-css or icons
74
+
75
+ 1. Change version in `package.json`
76
+ 2. Run `npm update` to fetch the new version
77
+ 3. Run `./bin/pull-all`: this copies all resources to vendor/assets
78
+ 4. Follow _NEXT STEPS_ closely as defined in output of `pull-all`
79
+
80
+ ### Documentation
81
+
82
+ To generate the a browsable html documentation site, use following commands:
83
+
84
+ - `./bin/yardoc`
85
+ - `open doc/index.html`
86
+
87
+ ## Contributing
88
+
89
+ Bug reports and pull requests are welcome on GitHub at https://github.com/at-point/mtl.
90
+ This project is intended to be a safe, welcoming space for collaboration, and contributors
91
+ are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org)
92
+ code of conduct.
93
+
94
+ ### License
95
+
96
+ [MIT License][license]. Copyright 2016 at-point ag. https://at-point.ch
97
+
98
+ [materialize]: http://materializecss.com/
99
+ [icons]: https://design.google.com/icons/
100
+ [rails]: http://rubyonrails.org
101
+ [lodash]: https://lodash.com/
102
+
103
+ [header_helper.rb]: https://github.com/at-point/mtl/blob/master/lib/mtl/rails/header_helper.rb
104
+ [license]: https://github.com/at-point/mtl/blob/master/LICENSE.txt
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,25 @@
1
+ oldHref = $.rails.href
2
+ $.rails.href = (element) -> element.data('mtl-href') || oldHref(element)
3
+
4
+ $(document).on 'click', '[data-mtl-href]', (e) ->
5
+ link = $(this)
6
+ method = link.data('method')
7
+
8
+ return $.rails.stopEverything(e) if !$.rails.allowAction(link)
9
+
10
+ if method
11
+ $.rails.handleMethod link
12
+ return $.rails.stopEverything(e)
13
+
14
+ if Turbolinks?.supported?
15
+ Turbolinks.visit($(this).data('mtl-href'))
16
+ else
17
+ window.location.href = $(this).data('mtl-href')
18
+
19
+ $(document).on 'click', '[data-mtl-href] a', (ev) ->
20
+ ev.stopPropagation()
21
+
22
+ $(document).on 'click', '[data-mtl-submit]', (ev) ->
23
+ ev.preventDefault()
24
+ selector = $(this).data('mtl-submit')
25
+ $(selector).submit()
@@ -0,0 +1,43 @@
1
+ # Hooks for collapsibles, with (external) triggers
2
+
3
+ createTrigger = ($el) ->
4
+ $target = $($el.data('mtl-collapsible-toggle'))
5
+ currentIdx = $target.find('.collapsible-header.active:first').parent().index()
6
+ if currentIdx == -1
7
+ $target.find('.collapsible-header:first').addClass('active')
8
+ currentIdx = 0
9
+ else if currentIdx > 0
10
+ $el.addClass('active')
11
+
12
+ # hide collapsible-header and disable initial animation
13
+ $target.find('.collapsible-header').hide()
14
+ $target.find('.collapsible-header.active:first').siblings().css('display', 'block')
15
+
16
+ # enable accordion
17
+ createAccordion $target
18
+
19
+ # bind events
20
+ $el.off '.mtl-collapsible'
21
+ $el.on 'click.mtl-collapsible', (e) ->
22
+ e.preventDefault()
23
+ currentIdx = if currentIdx == 0
24
+ $el.addClass('active')
25
+ $target.find('.collapsible-header:last').trigger('click').parent().index()
26
+ else
27
+ $el.removeClass('active')
28
+ $target.find('.collapsible-header:first').trigger('click').parent().index()
29
+
30
+ createAccordion = ($el) ->
31
+ $el.data('collapsible', 'accordion')
32
+ .collapsible(accordion: true)
33
+
34
+ createExpandable = ($el) ->
35
+ $el.data('collapsible', 'expandable')
36
+ .collapsible(accordion: false)
37
+
38
+ init = ->
39
+ $('[data-mtl-collapsible="accordion"]').each -> createAccordion($(this))
40
+ $('[data-mtl-collapsible="expandable"]').each -> createExpandable($(this))
41
+ $('[data-mtl-collapsible-toggle]').each -> createTrigger($(this))
42
+
43
+ if Turbolinks? then $(document).on('turbolinks:load', init) else $(init)
@@ -0,0 +1 @@
1
+ @MTL.fileIcons = <%= Mtl.file_icons.to_json %>
@@ -0,0 +1,130 @@
1
+ IMAGE_EXTENSIONS = ['png', 'jpg', 'gif', 'bmp']
2
+ MTL.templates.document_modal = """
3
+ <div class="document-modal">
4
+ <div class="document-modal-dimmer" data-mtl-document-modal="close"></div>
5
+ <div class="document-modal-header">
6
+ <div class="document-modal-title left white-text">
7
+ <%= MTL.fileIcon(filename, { class: 'left' }) %>
8
+ <%- title %>
9
+ </div>
10
+ <div class="document-modal-toolbar right">
11
+ <a href="<%- url %>" target="_blank" download="<%- filename %>">
12
+ <%= MTL.icon('file_download', { class: 'white-text left' }) %>
13
+ </a>
14
+ <a href="#" data-mtl-document-modal="close">
15
+ <%= MTL.icon('close', { class: 'white-text left' }) %>
16
+ </a>
17
+ </div>
18
+ </div>
19
+
20
+ <div class="document-modal-content">
21
+ </div>
22
+
23
+ <% if(hasNext) { %>
24
+ <div class="document-modal-next btn black">
25
+ <%= MTL.icon('keyboard_arrow_right', { class: 'white-text' }) %>
26
+ </div>
27
+ <% } %>
28
+
29
+ <% if(hasPrev) { %>
30
+ <div class="document-modal-prev btn black">
31
+ <%= MTL.icon('keyboard_arrow_left', { class: 'white-text' }) %>
32
+ </div>
33
+ <% } %>
34
+ </div>
35
+ """
36
+
37
+ MTL.templates.no_preview = """
38
+ <div class="no-preview">
39
+ <p class="center">
40
+ <%= MTL.icon('visibility_off', { size: 'large grey-text' }) %>
41
+ </p>
42
+ <a href="<%- url %>" target="_blank" class="btn btn-primary truncate">
43
+ <%= MTL.icon('file_download', { class: 'left' }) %>
44
+ <%- title %>
45
+ </a>
46
+ </div>
47
+ """
48
+
49
+ nextFileCard = ($fileCard) ->
50
+ $fileCard.next('[data-mtl-document-modal="open"]')
51
+
52
+ prevFileCard = ($fileCard) ->
53
+ $fileCard.prev('[data-mtl-document-modal="open"]')
54
+
55
+ hasNextFileCard = ($fileCard) ->
56
+ nextFileCard($fileCard).length > 0
57
+
58
+ hasPrevFileCard = ($fileCard) ->
59
+ prevFileCard($fileCard).length > 0
60
+
61
+ fileExtension = (filename) ->
62
+ String(filename).toLowerCase().split('.').pop()
63
+
64
+ isImage = (filename) ->
65
+ _.includes(IMAGE_EXTENSIONS, fileExtension(filename))
66
+
67
+ isPDF = (filename) ->
68
+ fileExtension(filename) == 'pdf'
69
+
70
+ createPreview = ($container, title, filename, url) ->
71
+ switch
72
+ when isImage(filename)
73
+ $container.css 'height', 'auto'
74
+ $container.append($('<img/>', { src: url, alt: filename }))
75
+ when isPDF(filename) && PDFObject.supportsPDFs
76
+ $container.css 'height', '100%'
77
+ $pdfWrapper = $('<div/>').appendTo $container
78
+ PDFObject.embed(url, $pdfWrapper, { width: '800px' })
79
+ else
80
+ $container.css 'height', 'auto'
81
+ data = { title: title, filename: filename, url: url }
82
+ $container.append(MTL.renderTemplate('no_preview', data))
83
+
84
+ findOrCreateDocumentModal = ->
85
+ return $('<div/>').appendTo('body') unless $('body > .document-modal').first().length
86
+ $('body > .document-modal').first()
87
+
88
+ initDocumentModal = ($fileCard) ->
89
+ filename = $fileCard.data('mtl-document-name')
90
+ title = $fileCard.prop('title')
91
+ url = $fileCard.prop('href')
92
+ $modal = $(
93
+ MTL.renderTemplate(
94
+ 'document_modal',
95
+ filename: filename,
96
+ title: title,
97
+ url: url,
98
+ hasNext: hasNextFileCard($fileCard),
99
+ hasPrev: hasPrevFileCard($fileCard)
100
+ )
101
+ )
102
+ $modal.find('.document-modal-next').on('click', -> initDocumentModal(nextFileCard($fileCard)))
103
+ $modal.find('.document-modal-prev').on('click', -> initDocumentModal(prevFileCard($fileCard)))
104
+ createPreview($modal.find('.document-modal-content'), title, filename, url)
105
+ findOrCreateDocumentModal().replaceWith($modal)
106
+ $('body').addClass('no-scroll')
107
+
108
+ closeDocumentModal = ->
109
+ findOrCreateDocumentModal().remove()
110
+ $('body').removeClass('no-scroll')
111
+ $(document).off 'keydown.mtl-document-modal'
112
+
113
+ $(document).on 'click', '[data-mtl-document-modal="open"]', (e) ->
114
+ e.preventDefault()
115
+ initDocumentModal($(e.currentTarget))
116
+ $(document).on 'keydown.mtl-document-modal', (e) ->
117
+ switch e.keyCode
118
+ when 27 # esc
119
+ closeDocumentModal()
120
+ when 37 # left
121
+ findOrCreateDocumentModal().find('.document-modal-prev').trigger 'click'
122
+ when 39 # right
123
+ findOrCreateDocumentModal().find('.document-modal-next').trigger 'click'
124
+
125
+ $(document).on 'click', '[data-mtl-document-modal="close"]', (e) ->
126
+ e.preventDefault()
127
+ closeDocumentModal()
128
+
129
+
130
+
@@ -0,0 +1,24 @@
1
+ updateAttrs = ($el) ->
2
+ $el
3
+ .on('click', -> false)
4
+ .attr('data-constrainwidth', 'false')
5
+ .attr('data-beloworigin', 'true')
6
+ .attr('data-alignment', alignment($el))
7
+ .attr('data-activates', activator($el))
8
+
9
+ alignment = ($el) -> $el.data('alignment') || 'right'
10
+
11
+ activator = ($el) ->
12
+ id = $el.data('activates') || $el.attr('href') || $el.data('mtl-dropdown')
13
+ String(id).replace(/^#/, '')
14
+
15
+ init = ->
16
+ $('[data-mtl-dropdown]').each ->
17
+ $el = $(this)
18
+ updateAttrs($el).dropdown()
19
+
20
+ closeAll = ->
21
+ setTimeout -> $('[data-mtl-dropdown]').dropdown('close')
22
+
23
+ if Turbolinks? then $(document).on('turbolinks:load', init) else $(init)
24
+ $(window).on 'resize orientationchange', closeAll
@@ -0,0 +1,14 @@
1
+ # Hooks for Turbolinks / jQuery et all
2
+
3
+ # Hooks for data-mtl-*
4
+ initMtlHooks = ->
5
+ $('[data-mtl-nav="side"]').each -> $(this).sideNav()
6
+ $('[data-mtl-tabs]').tabs()
7
+
8
+ if Turbolinks? then $(document).on('turbolinks:load', initMtlHooks) else $(initMtlHooks)
9
+
10
+ # Things to run only once via on('ready') and need to be re-run in turbolinks
11
+ $ ->
12
+ $(document).on 'turbolinks:load', ->
13
+ Materialize.updateTextFields()
14
+ Waves.displayEffect()
@@ -0,0 +1,17 @@
1
+ icon = (code, options = {}) ->
2
+ options.class = [<%= Mtl.icon_class.to_json %>, options.size, options.class].join ' '
3
+ delete options.size
4
+ $("<i/>", options).html(code)[0].outerHTML
5
+
6
+ fileIcon = (filename, options = {}) ->
7
+ extension = String(filename).toLowerCase().split('.').pop();
8
+ [code, icon_class] = if MTL.fileIcons.hasOwnProperty(extension)
9
+ MTL.fileIcons[extension]
10
+ else
11
+ MTL.fileIcons.other
12
+
13
+ options.class = [icon_class, options.class].join ' '
14
+ icon(code, options)
15
+
16
+ @MTL.icon = icon
17
+ @MTL.fileIcon = fileIcon
@@ -0,0 +1,32 @@
1
+ MODAL_IDS = 1
2
+ MODAL_TEMPLATE = '
3
+ <div class="modal">
4
+ <div class="modal-content modal-loading">
5
+ Loading&hellip;
6
+ </div>
7
+ </div>
8
+ '
9
+
10
+ initModal = ($el) ->
11
+ return initXhrModal($el) if $el.data('mtl-modal') == 'xhr'
12
+ return initDefaultModal($el) if $el.data('mtl-modal') == 'default'
13
+
14
+ initXhrModal = ($el) ->
15
+ modalId = 'mtl-modal-' + (MODAL_IDS++)
16
+ ds = $el.prop('href')
17
+ $modal = $(MODAL_TEMPLATE).prop('id', modalId)
18
+ $modal.appendTo('body')
19
+ $modal.addClass(modalClass) if modalClass = $el.data('mtl-modal-class')
20
+ $el.prop('href', "##{modalId}")
21
+
22
+ initDefaultModal $el,
23
+ ready: -> $modal.load(ds)
24
+
25
+ initDefaultModal = ($el, options = {}) -> $el.leanModal(options)
26
+
27
+ $(document).on 'click', '[data-mtl-modal="close"]', (e) ->
28
+ e.preventDefault()
29
+ $(this).parents('.modal:first').closeModal()
30
+
31
+ init = -> $('[data-mtl-modal]').each -> initModal($(this))
32
+ if Turbolinks? then $(document).on('turbolinks:load', init) else $(init)
@@ -0,0 +1,44 @@
1
+ prepareSelect = ($el) ->
2
+ val = $el.val()
3
+ index = $el.prop('selectedIndex')
4
+
5
+ if !val || val.length == 0 || index == 0
6
+ $el.prop('selectedIndex', 0)
7
+ $el.data('mtl-select:is-all-selected', true)
8
+
9
+ $el
10
+
11
+ createSelectCallback = ($el) ->
12
+ ->
13
+ return unless $el.data('mtl-select') == 'multiple'
14
+
15
+ $dropdown = $el.prev('.multiple-select-dropdown')
16
+ val = $el.val()
17
+ index = $el.prop('selectedIndex')
18
+ isSelected = $el.data('mtl-select:is-all-selected')
19
+
20
+ # 1: Nothing has been selected => select "all"
21
+ if !val || val.length == 0
22
+ $el.data('mtl-select:is-all-selected', true)
23
+ $dropdown.find('li:first').trigger('click')
24
+ # 2: More than one item is selected and previously "all" was selected =>
25
+ # disable select "all"
26
+ else if val.length > 1 && isSelected
27
+ $el.data('mtl-select:is-all-selected', false)
28
+ $dropdown.find('li:first').trigger('click')
29
+ # 3: More than one item is selected and previously "all" was not selected =>
30
+ # select "all" again
31
+ else if val.length > 1 && index == 0
32
+ $el.data('mtl-select:is-all-selected', true)
33
+ $dropdown.find('li.active:not(:first)').trigger('click')
34
+
35
+ init = ->
36
+ $('select[data-mtl-select], .simple_form .input-field.select > select.select').each ->
37
+ $this = prepareSelect $(this)
38
+ $this.material_select(createSelectCallback($this))
39
+
40
+ teardown = ->
41
+ $('select.initialized').each -> $(this).material_select('destroy')
42
+
43
+ if Turbolinks? then $(document).on('turbolinks:load', init) else $(init)
44
+ $(document).on 'turbolinks:before-cache', teardown
@@ -0,0 +1,4 @@
1
+ @MTL.templates = {}
2
+ @MTL.renderTemplate = (name, data) ->
3
+ MTL.templates[name] = _.template(MTL.templates[name]) unless _.isFunction(MTL.templates[name])
4
+ MTL.templates[name](data)
@@ -0,0 +1,31 @@
1
+ TEMPLATE = _.template '''
2
+ <li>
3
+ <a href="#<%- id %>"><%- title %></a>
4
+ </li>
5
+ '''
6
+
7
+ createTocEntry = ($el) ->
8
+ # Ensure id and get title
9
+ title = $el.data('mtl-section')
10
+ id = $el.prop('id') || "mtl-toc-#{Materialize.guid()}"
11
+ $el.prop('id', id)
12
+
13
+ # Render
14
+ TEMPLATE(id: id, title: title)
15
+
16
+ initToc = ($wrapper) ->
17
+ # Clear
18
+ $wrapper.children().remove()
19
+
20
+ # Pin wrapper to top, if data-mtl-toc="pin"
21
+ $wrapper.pushpin(top: $wrapper.offset().top) if $wrapper.data('mtl-toc') == 'pin'
22
+
23
+ # Add entries
24
+ $sections = $('[data-mtl-section]').each ->
25
+ $wrapper.append createTocEntry($(this))
26
+
27
+ # Enable scrollspy
28
+ $sections.scrollSpy()
29
+
30
+ init = -> $('[data-mtl-toc]').each -> initToc($(this))
31
+ if Turbolinks? then $(document).on('turbolinks:load', init) else $(init)
@@ -0,0 +1,42 @@
1
+ //=require "materialize/jquery.easing.1.3"
2
+ //=require "materialize/velocity.min"
3
+ //=require "materialize/hammer.min"
4
+ //=require "materialize/jquery.hammer"
5
+ //=require "lodash"
6
+ //=require "pdfobject"
7
+
8
+ //=require "materialize/global"
9
+
10
+ //=require "materialize/collapsible"
11
+ //=require "materialize/dropdown"
12
+ //=require "materialize/leanModal"
13
+ //=require "materialize/materialbox"
14
+ //=require "materialize/parallax"
15
+ //=require "materialize/tabs"
16
+ //=require "materialize/tooltip"
17
+ //=require "materialize/waves"
18
+ //=require "materialize/toasts"
19
+ //=require "materialize/sideNav"
20
+ //=require "materialize/scrollspy"
21
+ //=require "materialize/forms"
22
+ //=require "materialize/slider"
23
+ //=require "materialize/date_picker/picker"
24
+ //=require "materialize/date_picker/picker.date"
25
+ //=require "materialize/pushpin"
26
+
27
+ //= require_self
28
+ //= require "mtl/configuration"
29
+ //= require "mtl/templates"
30
+ //= require "mtl/hooks"
31
+ //= require "mtl/clickables"
32
+ //= require "mtl/collapsible"
33
+ //= require "mtl/dropdown"
34
+ //= require "mtl/modal"
35
+ //= require "mtl/select"
36
+ //= require "mtl/toc"
37
+ //= require "mtl/icon"
38
+ //= require "mtl/document_modal"
39
+
40
+
41
+ // Export
42
+ window.MTL = {}
@@ -0,0 +1,69 @@
1
+ @charset 'UTF-8';
2
+
3
+ // Reset
4
+ @import 'materialize/normalize';
5
+
6
+ // components
7
+ @import 'materialize/global';
8
+ @import './extend/global';
9
+
10
+ @import './extend/material-icons';
11
+
12
+ @import 'materialize/grid';
13
+ @import './extend/grid';
14
+
15
+ @import 'materialize/navbar';
16
+
17
+ // @import 'materialize/roboto';
18
+ @import './extend/roboto-rails'; // using asset_url's
19
+
20
+ @import 'materialize/typography';
21
+
22
+ @import 'materialize/cards';
23
+ @import './extend/cards';
24
+
25
+ @import 'materialize/toast';
26
+
27
+ @import 'materialize/tabs';
28
+
29
+ @import 'materialize/tooltip';
30
+ @import 'materialize/buttons';
31
+ @import './extend/buttons';
32
+ @import 'materialize/dropdown';
33
+ @import 'extend/dropdown';
34
+ @import 'materialize/waves';
35
+ @import 'materialize/modal';
36
+ @import 'materialize/collapsible';
37
+
38
+ @import 'materialize/chips';
39
+ @import './extend/chips';
40
+
41
+ @import 'materialize/materialbox';
42
+ @import 'materialize/forms/forms';
43
+ @import './extend/forms';
44
+ @import './extend/forms/input-fields';
45
+ @import 'materialize/table_of_contents';
46
+ @import './extend/toc';
47
+
48
+ @import 'materialize/sideNav';
49
+ @import './extend/side-nav';
50
+
51
+ @import './extend/avatars';
52
+
53
+ @import 'materialize/preloader';
54
+ @import 'materialize/slider';
55
+ @import 'materialize/carousel';
56
+ @import 'materialize/date_picker/default';
57
+ @import 'materialize/date_picker/default.date';
58
+ @import 'materialize/date_picker/default.time';
59
+
60
+ // extending the materializer library even more
61
+ @import './extend/mixins';
62
+ @import './extend/collection-files';
63
+ @import './extend/typography';
64
+ @import './extend/document-modals';
65
+
66
+ // including layouts
67
+ html { height: 100%; } // yes, necessary
68
+ @import './layouts/default';
69
+ @import './layouts/single';