matestack-ui-core 0.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of matestack-ui-core might be problematic. Click here for more details.

Files changed (129) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +230 -0
  4. data/Rakefile +34 -0
  5. data/app/assets/config/basemate_ui_core_manifest.js +2 -0
  6. data/app/assets/javascripts/basemate/ui/core/application.js +15 -0
  7. data/app/assets/stylesheets/basemate/ui/core/application.css +15 -0
  8. data/app/concepts/absolute/cell/absolute.rb +17 -0
  9. data/app/concepts/absolute/view/absolute.haml +3 -0
  10. data/app/concepts/action/cell/action.rb +52 -0
  11. data/app/concepts/action/js/action.js +49 -0
  12. data/app/concepts/action/view/action.haml +3 -0
  13. data/app/concepts/app/cell/app.rb +76 -0
  14. data/app/concepts/app/js/app.js +27 -0
  15. data/app/concepts/app/js/store.js +71 -0
  16. data/app/concepts/app/utils/app_node.rb +53 -0
  17. data/app/concepts/app/view/app.haml +4 -0
  18. data/app/concepts/async/cell/async.rb +10 -0
  19. data/app/concepts/async/js/async.js +57 -0
  20. data/app/concepts/async/view/async.haml +2 -0
  21. data/app/concepts/br/cell/br.rb +5 -0
  22. data/app/concepts/br/view/br.haml +5 -0
  23. data/app/concepts/button/cell/button.rb +5 -0
  24. data/app/concepts/button/view/button.haml +7 -0
  25. data/app/concepts/component/cell/dynamic.rb +226 -0
  26. data/app/concepts/component/cell/static.rb +16 -0
  27. data/app/concepts/component/js/anonym-dynamic-component.js +10 -0
  28. data/app/concepts/component/js/component.js +60 -0
  29. data/app/concepts/component/utils/component_node.rb +69 -0
  30. data/app/concepts/component/view/children.haml +2 -0
  31. data/app/concepts/component/view/dynamic.haml +6 -0
  32. data/app/concepts/component/view/dynamic_without_rerender.haml +2 -0
  33. data/app/concepts/component/view/response.haml +2 -0
  34. data/app/concepts/component/view/response_dynamic.haml +7 -0
  35. data/app/concepts/component/view/response_dynamic_without_rerender.haml +3 -0
  36. data/app/concepts/component/view/static.haml +1 -0
  37. data/app/concepts/core/js/core.js +27 -0
  38. data/app/concepts/core/js/event-hub.js +5 -0
  39. data/app/concepts/div/cell/div.rb +6 -0
  40. data/app/concepts/div/view/div.haml +3 -0
  41. data/app/concepts/footer/cell/footer.rb +5 -0
  42. data/app/concepts/footer/view/footer.haml +3 -0
  43. data/app/concepts/form/cell/form.rb +71 -0
  44. data/app/concepts/form/cell/inline.rb +9 -0
  45. data/app/concepts/form/cell/input.rb +74 -0
  46. data/app/concepts/form/cell/select.rb +73 -0
  47. data/app/concepts/form/cell/submit.rb +9 -0
  48. data/app/concepts/form/js/form.js +136 -0
  49. data/app/concepts/form/view/form.haml +2 -0
  50. data/app/concepts/form/view/inline.haml +6 -0
  51. data/app/concepts/form/view/input.haml +29 -0
  52. data/app/concepts/form/view/select.haml +72 -0
  53. data/app/concepts/form/view/submit.haml +3 -0
  54. data/app/concepts/header/cell/header.rb +5 -0
  55. data/app/concepts/header/view/header.haml +3 -0
  56. data/app/concepts/heading/cell/heading.rb +5 -0
  57. data/app/concepts/heading/view/heading.haml +50 -0
  58. data/app/concepts/html/cell/html.rb +17 -0
  59. data/app/concepts/html/js/html.js +10 -0
  60. data/app/concepts/html/view/html.haml +3 -0
  61. data/app/concepts/icon/cell/icon.rb +5 -0
  62. data/app/concepts/icon/view/icon.haml +6 -0
  63. data/app/concepts/img/cell/img.rb +5 -0
  64. data/app/concepts/img/view/img.haml +1 -0
  65. data/app/concepts/input/cell/input.rb +5 -0
  66. data/app/concepts/input/view/input.haml +3 -0
  67. data/app/concepts/label/cell/label.rb +5 -0
  68. data/app/concepts/label/view/label.haml +7 -0
  69. data/app/concepts/li/cell/li.rb +5 -0
  70. data/app/concepts/li/view/li.haml +6 -0
  71. data/app/concepts/link/cell/link.rb +24 -0
  72. data/app/concepts/link/view/link.haml +6 -0
  73. data/app/concepts/main/cell/main.rb +5 -0
  74. data/app/concepts/main/view/main.haml +3 -0
  75. data/app/concepts/nav/cell/nav.rb +5 -0
  76. data/app/concepts/nav/view/nav.haml +3 -0
  77. data/app/concepts/ol/cell/ol.rb +5 -0
  78. data/app/concepts/ol/view/ol.haml +3 -0
  79. data/app/concepts/onclick/cell/onclick.rb +6 -0
  80. data/app/concepts/onclick/js/onclick.js +21 -0
  81. data/app/concepts/onclick/view/onclick.haml +2 -0
  82. data/app/concepts/page/cell/content.rb +5 -0
  83. data/app/concepts/page/cell/page.rb +128 -0
  84. data/app/concepts/page/js/content.js +17 -0
  85. data/app/concepts/page/utils/page_node.rb +66 -0
  86. data/app/concepts/page/view/content.haml +7 -0
  87. data/app/concepts/page/view/page.haml +9 -0
  88. data/app/concepts/partial/cell/partial.rb +5 -0
  89. data/app/concepts/partial/view/partial.haml +2 -0
  90. data/app/concepts/pg/cell/pg.rb +5 -0
  91. data/app/concepts/pg/view/pg.haml +8 -0
  92. data/app/concepts/plain/cell/plain.rb +10 -0
  93. data/app/concepts/progress/cell/progress.rb +5 -0
  94. data/app/concepts/progress/view/progress.haml +3 -0
  95. data/app/concepts/section/cell/section.rb +5 -0
  96. data/app/concepts/section/view/section.haml +3 -0
  97. data/app/concepts/shared/utils/to_cell.rb +126 -0
  98. data/app/concepts/slot/cell/slot.rb +10 -0
  99. data/app/concepts/slot/view/slot.haml +2 -0
  100. data/app/concepts/span/cell/span.rb +5 -0
  101. data/app/concepts/span/view/span.haml +3 -0
  102. data/app/concepts/table/cell/table.rb +5 -0
  103. data/app/concepts/table/view/table.haml +3 -0
  104. data/app/concepts/td/cell/td.rb +5 -0
  105. data/app/concepts/td/view/td.haml +8 -0
  106. data/app/concepts/th/cell/th.rb +5 -0
  107. data/app/concepts/th/view/th.haml +8 -0
  108. data/app/concepts/tr/cell/tr.rb +5 -0
  109. data/app/concepts/tr/view/tr.haml +3 -0
  110. data/app/concepts/transition/cell/transition.rb +31 -0
  111. data/app/concepts/transition/js/transition.js +26 -0
  112. data/app/concepts/transition/view/transition.haml +7 -0
  113. data/app/concepts/ul/cell/ul.rb +5 -0
  114. data/app/concepts/ul/view/ul.haml +3 -0
  115. data/app/concepts/view/cell/view.rb +7 -0
  116. data/app/concepts/view/js/view.js +42 -0
  117. data/app/concepts/view/view/view.haml +2 -0
  118. data/app/controllers/basemate/ui/core/application_controller.rb +9 -0
  119. data/app/controllers/basemate/ui/core/docs_controller.rb +17 -0
  120. data/app/helpers/matestack/ui/core/application_helper.rb +35 -0
  121. data/config/routes.rb +3 -0
  122. data/lib/matestack/ui/core.rb +15 -0
  123. data/lib/matestack/ui/core/engine.rb +19 -0
  124. data/lib/matestack/ui/core/version.rb +7 -0
  125. data/lib/tasks/matestack/ui/core_tasks.rake +4 -0
  126. data/vendor/assets/javascripts/manifest.json +4 -0
  127. data/vendor/assets/javascripts/matestack-ui-core.js +15055 -0
  128. data/vendor/assets/javascripts/matestack-ui-core.js.map +1 -0
  129. metadata +277 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6e54bd9269c669fa0d87f2052258961731162454a99417077e2102e5d391aee2
4
+ data.tar.gz: dbfb0a72d64c215d714c0340667e5f61c19fc0908875b5e1150be97c0c364f61
5
+ SHA512:
6
+ metadata.gz: b15dcdaa3f71f73c99adf5971ded4c558968c8e93f555e7b8593bf40a074ff7e72fbbff295ac939556aff71c29a1f439588445e01e74fc8af3406726139fb674
7
+ data.tar.gz: 767db8f8b1757b356178db83bba45da3427ba2195425670be4a0cc4912382ed2df6d9a19464d7d2d8dcfb805a000c2dca9962761de3966f525580839b06de77f
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2018 Jonas Jabari
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,230 @@
1
+ [![CircleCI](https://circleci.com/gh/basemate/matestack-ui-core/tree/master.svg?style=shield)](https://circleci.com/gh/basemate/matestack-ui-core/tree/master)
2
+
3
+ ![matestack logo](./logo.png)
4
+
5
+ # Matestack: Escape the frontend hustle
6
+
7
+ ## Create maintainable, dynamic and beautiful UIs easily
8
+
9
+ As a Rails Engine, matestack deeply integrates a Vue.js based UI into Rails, offering optional prebuilt components. Use it to write dynamic Web-UIs with minimum effort and maximum dev happiness in pure Ruby. The main goals are:
10
+
11
+ - Reduction of complexity of modern web development, moving front and backend closer together
12
+ - More maintainable UI code, using a component-based structure written in Ruby
13
+ - Increased development speed and happiness, offering prebuilt UI-Components for classic requirements
14
+ - Modern, dynamic UI feeling without the need to implement a separate JavaScript Application
15
+
16
+ matestack can progressively replace the classic Rails-View-Layer. You are able to use
17
+ it alongside your classic views and incrementally turn your Rails-App into a
18
+ dynamic Web-App.
19
+
20
+ ### Features:
21
+
22
+ #### Define your UI in a Ruby Class
23
+ ```ruby
24
+ class Pages::MyPage < Page::Cell::Page
25
+
26
+ def prepare
27
+ @technologies = ["Rails", "Vue.js", "Trailblazer", "Rspec", "Capybara"]
28
+ end
29
+
30
+ def response
31
+ components{
32
+ div id: "technologies" do
33
+ @technologies.each do |technology|
34
+ plain "matestack uses #{technology}"
35
+ end
36
+ end
37
+ }
38
+ end
39
+
40
+ end
41
+ ```
42
+ #### Create a Single Page Application without JavaScript
43
+
44
+ ```ruby
45
+ class Apps::MyApp < App::Cell::App
46
+
47
+ def response
48
+ components{
49
+ header do
50
+ heading size: 1, text: "My App"
51
+ end
52
+ nav do
53
+ transition path: :my_first_page_path do
54
+ button "Page 1"
55
+ end
56
+ transition path: :my_second_page_path do
57
+ button "Page 2"
58
+ end
59
+ end
60
+ main do
61
+ page_content #pages are dynamically yielded here, when buttons are clicked!
62
+ end
63
+ footer do
64
+ plain "That's it!"
65
+ end
66
+ }
67
+ end
68
+
69
+ end
70
+ ```
71
+
72
+ ```ruby
73
+ class Pages::MyApp::MyFirstPage < Page::Cell::Page
74
+
75
+ def response
76
+ components{
77
+ div id: "div-on-page-1" do
78
+ plain "My First Page"
79
+ end
80
+ }
81
+ end
82
+
83
+ end
84
+ ```
85
+ ```ruby
86
+ class Pages::MyApp::MySecondPage < Page::Cell::Page
87
+
88
+ def response
89
+ components{
90
+ div id: "div-on-page-2" do
91
+ plain "My Second Page"
92
+ end
93
+ }
94
+ end
95
+
96
+ end
97
+ ```
98
+ #### Handle User Interaction dynamically without JavaScript
99
+ ```ruby
100
+ class Pages::MyPage < Page::Cell::Page
101
+
102
+ def response
103
+ components {
104
+ action my_action_config do
105
+ button text: "Click me!"
106
+ end
107
+ #content gets rerendered without page reload if action succeeded
108
+ async rerender_on: "my_action_succeeded" do
109
+ div id: "my-div" do
110
+ plain DateTime.now
111
+ end
112
+ end
113
+ }
114
+ end
115
+
116
+ def my_action_config
117
+ {
118
+ method: :post,
119
+ path: :some_rails_routing_path,
120
+ success: {
121
+ emit: "my_action_succeeded"
122
+ }
123
+ }
124
+ end
125
+
126
+ end
127
+ ```
128
+ #### Handle User Input dynamically without JavaScript
129
+ ```ruby
130
+ class Pages::MyApp::MyFirstPage < Page::Cell::Page
131
+
132
+ def prepare
133
+ @my_model = MyModel.new
134
+ end
135
+
136
+ def response
137
+ components {
138
+ form my_form_config, :include do
139
+ form_input key: :some_model_attribute, type: :text
140
+ form_submit do
141
+ button text: "Submit me!"
142
+ end
143
+ end
144
+ async show_on: "form_has_errors", hide_after: 5000 do
145
+ plain "Data could not be submitted, please check form"
146
+ end
147
+ }
148
+ end
149
+
150
+ def my_form_config
151
+ {
152
+ for: @my_model,
153
+ method: :post,
154
+ path: :some_action_path,
155
+ success: {
156
+ transition: {
157
+ path: :my_second_page_path,
158
+ }
159
+ },
160
+ failure: {
161
+ emit: "form_has_errors"
162
+ }
163
+ }
164
+ end
165
+
166
+ end
167
+ ```
168
+ #### Websocket Integration without JavaScript
169
+ ```ruby
170
+ class Pages::MyPage < Page::Cell::Page
171
+
172
+ def prepare
173
+ @comments = Comment.last(5)
174
+ end
175
+
176
+ def response
177
+ components {
178
+ #content gets rerendered without page reload when
179
+ #websocket event is received
180
+ async rerender_on: "comments_changed" do
181
+ @comments.each do |comment|
182
+ div do
183
+ plain comment.content
184
+ end
185
+ end
186
+ end
187
+ }
188
+ end
189
+
190
+ end
191
+ ```
192
+ somewhere else on the backend:
193
+
194
+ ```ruby
195
+ ActionCable.server.broadcast("matestack_ui_core", {
196
+ message: "comments_changed"
197
+ })
198
+ ```
199
+
200
+ ### Documentation
201
+
202
+ Documentation can be found [here](./docs)
203
+
204
+ ### Changelog
205
+
206
+ Changelog can be found [here](./CHANGELOG.md)
207
+
208
+ ### Roadmap
209
+
210
+ Scheduled for 0.7.0:
211
+ - Webpacker/Yarn Integration
212
+ - Advanced Websockets Integration
213
+ - 1:n Relations in Form components
214
+ - More Form Components (Multi Select Components)
215
+ - Component Based Caching
216
+ - Rails View Integration
217
+ - Dockerized Core Development
218
+
219
+
220
+ ### Community
221
+
222
+ TODO: Gitter
223
+
224
+ ### Contribution
225
+
226
+ We are happy to accept contributors of any kind. Please refer to the [Contribution Guide](./docs/contribute)
227
+
228
+ ### License
229
+ The gem is available as open source under the terms of the
230
+ [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,34 @@
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 = 'Matestack::Ui::Core'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ load 'lib/tasks/matestack/ui/core_tasks.rake'
23
+
24
+ require 'bundler/gem_tasks'
25
+
26
+ require 'rake/testtask'
27
+
28
+ # Rake::TestTask.new(:test) do |t|
29
+ # t.libs << 'test'
30
+ # t.pattern = 'test/**/*_test.rb'
31
+ # t.verbose = false
32
+ # end
33
+ #
34
+ # task default: :test
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/matestack/ui/core .js
2
+ //= link_directory ../stylesheets/matestack/ui/core .css
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require rails-ujs
14
+ //= require activestorage
15
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,17 @@
1
+ module Absolute::Cell
2
+ class Absolute < Component::Cell::Static
3
+
4
+ def setup
5
+ style = "position: absolute;"
6
+ style << " top: #{options[:top]}px;" if options[:top]
7
+ style << " left: #{options[:left]}px;" if options[:left]
8
+ style << " right: #{options[:right]}px;" if options[:right]
9
+ style << " bottom: #{options[:bottom]}px;" if options[:bottom]
10
+ style << " z-index: #{options[:z]};" if options[:z]
11
+ @tag_attributes.merge!({
12
+ style: style
13
+ })
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ %div{@tag_attributes}
2
+ - if block_given?
3
+ = yield
@@ -0,0 +1,52 @@
1
+ module Action::Cell
2
+ class Action < Component::Cell::Dynamic
3
+
4
+ def setup
5
+ @component_config[:action_path] = action_path
6
+ @component_config[:method] = options[:method]
7
+ @component_config[:success] = options[:success]
8
+ unless options[:success].nil?
9
+ unless options[:success][:transition].nil?
10
+ @component_config[:success][:transition][:path] = transition_path options[:success]
11
+ end
12
+ end
13
+ @component_config[:failure] = options[:failure]
14
+ unless options[:failure].nil?
15
+ unless options[:failure][:transition].nil?
16
+ @component_config[:failure][:transition][:path] = transition_path options[:failure]
17
+ end
18
+ end
19
+ if options[:notify].nil?
20
+ @component_config[:notify] = true
21
+ end
22
+ end
23
+
24
+ def action_path
25
+ begin
26
+ if options[:path].is_a?(Symbol)
27
+ return ::Rails.application.routes.url_helpers.send(options[:path], options[:params])
28
+ else
29
+ return options[:path]
30
+ end
31
+ rescue
32
+ raise "Action path not found"
33
+ end
34
+ end
35
+
36
+ def transition_path callback_options
37
+ begin
38
+ if callback_options[:transition][:path].is_a?(Symbol)
39
+ return ::Rails.application.routes.url_helpers.send(
40
+ callback_options[:transition][:path],
41
+ callback_options[:transition][:params]
42
+ )
43
+ else
44
+ return callback_options[:transition][:path]
45
+ end
46
+ rescue
47
+ raise "Transition path not found"
48
+ end
49
+ end
50
+
51
+ end
52
+ end
@@ -0,0 +1,49 @@
1
+ import Vue from 'vue/dist/vue.esm'
2
+ import Vuex from 'vuex'
3
+ import axios from 'axios'
4
+
5
+ import matestackEventHub from 'core/js/event-hub'
6
+
7
+ import componentMixin from 'component/js/component'
8
+
9
+ const componentDef = {
10
+ mixins: [componentMixin],
11
+ data: function(){
12
+ return {}
13
+ },
14
+ methods: {
15
+ perform: function(){
16
+ const self = this
17
+ axios({
18
+ method: self.componentConfig["method"],
19
+ url: self.componentConfig["action_path"],
20
+ data: self.componentConfig["data"],
21
+ headers: {
22
+ 'X-CSRF-Token': document.getElementsByName("csrf-token")[0].getAttribute('content')
23
+ }
24
+ })
25
+ .then(function(response){
26
+ if (self.componentConfig["success"] != undefined && self.componentConfig["success"]["emit"] != undefined) {
27
+ matestackEventHub.$emit(self.componentConfig["success"]["emit"], response.data);
28
+ }
29
+ if (self.componentConfig["success"] != undefined && self.componentConfig["success"]["transition"] != undefined && self.$store != undefined) {
30
+ let path = self.componentConfig["success"]["transition"]["path"]
31
+ self.$store.dispatch('navigateTo', {url: path, backwards: false})
32
+ }
33
+ })
34
+ .catch(function(error){
35
+ if (self.componentConfig["failure"] != undefined && self.componentConfig["failure"]["emit"] != undefined) {
36
+ matestackEventHub.$emit(self.componentConfig["failure"]["emit"], error.response.data);
37
+ }
38
+ if (self.componentConfig["failure"] != undefined && self.componentConfig["failure"]["transition"] != undefined && self.$store != undefined) {
39
+ let path = self.componentConfig["failure"]["transition"]["path"]
40
+ self.$store.dispatch('navigateTo', {url: path, backwards: false})
41
+ }
42
+ })
43
+ }
44
+ }
45
+ }
46
+
47
+ let component = Vue.component('action-cell', componentDef)
48
+
49
+ export default componentDef