rails_vue_melt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1d1d0c588ea63fa010025d75154666f382469e6a
4
+ data.tar.gz: 27395b5d4d5f7287160ce3922deb00876a39a117
5
+ SHA512:
6
+ metadata.gz: b7daa9fd6e8dbd9233f37d63bcea7d132f2685c25a7e14245902bcdf2c9b08b238e90a7944a22f90cd4c36c278c21093030cace6aa67f3060642ba3341cf9e3c
7
+ data.tar.gz: 1766a400402fb44ec0d4b779569971f1166e3910125aa334b8e4d20a8dc4f9c5daf04bdd8e7c79c9e0b29a7ef71430a81f260fa8ac89e778a8f82e9c3c3dccf2
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017 midnightSuyama
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # RailsVueMelt
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/rails_vue_melt.svg)](http://badge.fury.io/rb/rails_vue_melt)
4
+ [![CircleCI](https://circleci.com/gh/midnightSuyama/rails_vue_melt.svg?style=shield)](https://circleci.com/gh/midnightSuyama/rails_vue_melt)
5
+
6
+ Rails view with webpack=vue optimizer
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'rails_vue_melt'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install rails_vue_melt
23
+
24
+ ## Usage
25
+
26
+ $ rails new APP_PATH --webpack=vue
27
+ ...
28
+ $ rails generate vue_melt
29
+
30
+ ### Generate
31
+
32
+ #### create `app/javascript/packs/vue_melt`
33
+
34
+ * application.js
35
+ * options/
36
+ * users.js
37
+ * components/
38
+ * Hello.vue
39
+ * store/
40
+ * index.js
41
+ * getters.js
42
+ * actions.js
43
+ * mutations.js
44
+ * mutation-types.js
45
+
46
+ #### insert `app/views/layouts/application.html.erb`
47
+
48
+ ```html
49
+ <%= javascript_pack_tag 'vue_melt/application' %>
50
+ <meta name="turbolinks-cache-control" content="no-cache">
51
+ ```
52
+
53
+ #### gsub `config/webpack/loaders/vue.js`
54
+
55
+ ```javascript
56
+ extractCSS: false,
57
+ ```
58
+
59
+ #### install packages
60
+
61
+ * [vuex](https://www.npmjs.com/package/vuex)
62
+ * [vue-assign-model](https://www.npmjs.com/package/vue-assign-model)
63
+ * [lodash.clonedeep](https://www.npmjs.com/package/lodash.clonedeep)
64
+
65
+ ### Example
66
+
67
+ ```erb
68
+ <!-- app/views/**/*.html.erb -->
69
+
70
+ <div data-vue="users">
71
+ <input value="Example" v-model="user.name">
72
+ <p>User Name: {{ user.name }}</p>
73
+
74
+ <hello></hello>
75
+ </div>
76
+ ```
77
+
78
+ Add `data-vue` attribute, the value is file name in `app/javascript/packs/vue_melt/options`. Vue instance is mounted at `turbolinks:load` event and unmounted at `turbolinks:visit` event.
79
+
80
+ Before Vue rendering, `value`, `checked` or `selected` attributes of elements with `v-model` is automatically assigned to Vue model. Therefore, `form_with` and so on using Active Model can use data binding easily.
81
+
82
+ #### accepts_nested_attributes_for
83
+
84
+ JSON of `data-vue-model` is assigned to Vue model. Also, `v-model` with prefix `_` is not assigned for `v-for` scope.
85
+
86
+ ```erb
87
+ <!-- app/views/**/*.html.erb -->
88
+
89
+ <div data-vue="users">
90
+ <%= content_tag :div, 'data-vue-model': "{ \"items\": #{user.items.to_json} }" do %>
91
+ <div v-for="(_item, i) in items">
92
+ <input type="text" :name="'user[items_attributes][' + i + '][name]'" v-model="_item.name">
93
+ <input type="hidden" :name="'user[items_attributes][' + i + '][id]'" :value="_item.id" v-if="_item.id">
94
+ </div>
95
+ <% end %>
96
+ </div>
97
+ ```
98
+
99
+ With Add and Remove function:
100
+
101
+ ```erb
102
+ <!-- app/views/**/*.html.erb -->
103
+
104
+ <div data-vue="users">
105
+ <%= content_tag :div, 'data-vue-model': "{ \"items\": #{user.items.to_json}, \"items_destroy_ids\": [] }" do %>
106
+ <div v-for="(_item, i) in items">
107
+ <input type="text" :name="'user[items_attributes][' + i + '][name]'" v-model="_item.name">
108
+ <input type="hidden" :name="'user[items_attributes][' + i + '][id]'" :value="_item.id" v-if="_item.id">
109
+ <button type="button" @click="_item.hasOwnProperty('id') ? items_destroy_ids.push(items.splice(i, 1)[0].id) : items.splice(i, 1)">Remove</button>
110
+ </div>
111
+
112
+ <template v-for="(id, i) in items_destroy_ids">
113
+ <input type="hidden" :name="'user[items_attributes][' + (items.length+i) + '][id]'" :value="id">
114
+ <input type="hidden" :name="'user[items_attributes][' + (items.length+i) + '][_destroy]'" value="1">
115
+ </template>
116
+
117
+ <button type="button" @click="items.push({ name: '' })">Add</button>
118
+ <% end %>
119
+ </div>
120
+ ```
121
+
122
+ ## Development
123
+
124
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
125
+
126
+ ## Contributing
127
+
128
+ Bug reports and pull requests are welcome on GitHub at https://github.com/midnightSuyama/rails_vue_melt.
129
+
130
+ ## License
131
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'RailsVueMelt'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ require 'bundler/gem_tasks'
23
+
24
+ require 'rspec/core/rake_task'
25
+
26
+ RSpec::Core::RakeTask.new(:spec)
27
+
28
+ task default: :spec
@@ -0,0 +1,33 @@
1
+ import Vue from 'vue/dist/vue.esm'
2
+ import store from './store'
3
+ import cloneDeep from 'lodash.clonedeep'
4
+
5
+ import VueAssignModel from 'vue-assign-model'
6
+ Vue.use(VueAssignModel)
7
+
8
+ const storeState = cloneDeep(store.state)
9
+ var vms = []
10
+ var options = {}
11
+ var requireContext = require.context("./options", false, /\.js$/)
12
+ requireContext.keys().forEach(key => {
13
+ let name = key.split('/').pop().split('.').shift()
14
+ options[name] = requireContext(key).default
15
+ })
16
+
17
+ document.addEventListener('turbolinks:load', () => {
18
+ let templates = document.querySelectorAll('[data-vue]')
19
+ for (let el of templates) {
20
+ let vm = new Vue(
21
+ Object.assign(options[el.dataset.vue], { el, store })
22
+ )
23
+ vms.push(vm)
24
+ }
25
+ })
26
+
27
+ document.addEventListener('turbolinks:visit', () => {
28
+ for (let vm of vms) {
29
+ vm.$destroy()
30
+ }
31
+ vms = []
32
+ store.replaceState(cloneDeep(storeState))
33
+ })
@@ -0,0 +1,20 @@
1
+ <template>
2
+ <div>
3
+ <p>{{ message }}</p>
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ export default {
9
+ data: () => ({
10
+ message: 'Hello Vue!'
11
+ })
12
+ }
13
+ </script>
14
+
15
+ <style scoped>
16
+ p {
17
+ font-size: 2em;
18
+ text-align: center;
19
+ }
20
+ </style>
@@ -0,0 +1,9 @@
1
+ import Hello from '../components/Hello.vue'
2
+
3
+ export default {
4
+ components: {
5
+ Hello
6
+ },
7
+ data: () => ({
8
+ })
9
+ }
@@ -0,0 +1 @@
1
+ import * as types from './mutation-types'
File without changes
@@ -0,0 +1,17 @@
1
+ import Vue from 'vue/dist/vue.esm'
2
+ import Vuex from 'vuex'
3
+ import * as getters from './getters'
4
+ import * as actions from './actions'
5
+ import * as mutations from './mutations'
6
+
7
+ Vue.use(Vuex)
8
+
9
+ const state = {
10
+ }
11
+
12
+ export default new Vuex.Store({
13
+ state,
14
+ getters,
15
+ actions,
16
+ mutations
17
+ })
@@ -0,0 +1 @@
1
+ import * as types from './mutation-types'
@@ -0,0 +1,21 @@
1
+ class VueMeltGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('../source', __FILE__)
3
+
4
+ def create
5
+ directory '.', 'app/javascript/packs/vue_melt'
6
+ end
7
+
8
+ def edit
9
+ inject_into_file 'app/views/layouts/application.html.erb', before: /^\s*<\/head>/ do
10
+ <<-EOS
11
+ <%= javascript_pack_tag 'vue_melt/application' %>
12
+ <meta name="turbolinks-cache-control" content="no-cache">
13
+ EOS
14
+ end
15
+ gsub_file 'config/webpack/loaders/vue.js', 'extractCSS: true,', 'extractCSS: false,'
16
+ end
17
+
18
+ def yarn
19
+ run 'yarn add vuex vue-assign-model lodash.clonedeep'
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module RailsVueMelt
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,2 @@
1
+ module RailsVueMelt
2
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails_vue_melt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - midnightSuyama
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.1.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.1.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: generator_spec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Rails view with webpack=vue optimizer
56
+ email:
57
+ - midnightSuyama@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - MIT-LICENSE
63
+ - README.md
64
+ - Rakefile
65
+ - lib/generators/vue_melt/source/application.js
66
+ - lib/generators/vue_melt/source/components/Hello.vue
67
+ - lib/generators/vue_melt/source/options/users.js
68
+ - lib/generators/vue_melt/source/store/actions.js
69
+ - lib/generators/vue_melt/source/store/getters.js
70
+ - lib/generators/vue_melt/source/store/index.js
71
+ - lib/generators/vue_melt/source/store/mutation-types.js
72
+ - lib/generators/vue_melt/source/store/mutations.js
73
+ - lib/generators/vue_melt/vue_melt_generator.rb
74
+ - lib/rails_vue_melt.rb
75
+ - lib/rails_vue_melt/version.rb
76
+ homepage: https://github.com/midnightSuyama/rails_vue_melt
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.5.2
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Rails view with webpack=vue optimizer
100
+ test_files: []