abyme 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 75ea02cf1745593dc62c0bd09cf27fa431f73916142bf5a51266bfe12e065e9e
4
- data.tar.gz: 8bd81717590e1a37c7c4d4011f4061a5da49cc2bee542e2648f41af0442b9a0e
3
+ metadata.gz: 54da5a9a0118b560b3e9006d85f175d3a84ccd067a8654a61c4a46dfeb5ba15b
4
+ data.tar.gz: 3d836ed9cf5564e2b311a8e100466bc589307c0c5bf77f527fae70c94bc05fb9
5
5
  SHA512:
6
- metadata.gz: ab0079016a2c44ec66bdc343e85fa44332f496e815c696f7a8ae2a8de40bb8d379a0a605193d385065d40fb43a4fd7f40fae3f51572fe03c93732753a7b0e1b7
7
- data.tar.gz: ec0134da02c6b2c550577a907402288d4e51e6721c7afa4a0fad8bb080941d8a6e5e91213ad2f88b2aab798f827b45ef1a44cd95ae07de946fab9d2fcb9c4495
6
+ metadata.gz: e7095310324451424bccce250acd5cddd059108861581169990ec1be1abe8e5a9453aaf7710f1cb62d63bebbb5af4220f6257897119d43477e2a923b01067d3e
7
+ data.tar.gz: 20bb396ba92d7b739fdf137d37627163f71f3dbc4dbbe84ea346d24ccbe7317af2b253a1b451e52a650da0e01b078a153e8565e268475765769347e2c1e56be5
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ yarn-error.log
10
+ /node_modules
11
+
12
+ # rspec failure tracking
13
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.6.3
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in abyme.gemspec
4
+ gemspec
@@ -0,0 +1,35 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ abyme (0.1.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ diff-lcs (1.4.4)
10
+ rake (13.0.1)
11
+ rspec (3.9.0)
12
+ rspec-core (~> 3.9.0)
13
+ rspec-expectations (~> 3.9.0)
14
+ rspec-mocks (~> 3.9.0)
15
+ rspec-core (3.9.2)
16
+ rspec-support (~> 3.9.3)
17
+ rspec-expectations (3.9.2)
18
+ diff-lcs (>= 1.2.0, < 2.0)
19
+ rspec-support (~> 3.9.0)
20
+ rspec-mocks (3.9.1)
21
+ diff-lcs (>= 1.2.0, < 2.0)
22
+ rspec-support (~> 3.9.0)
23
+ rspec-support (3.9.3)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ abyme!
30
+ bundler (~> 2.0)
31
+ rake (~> 13.0)
32
+ rspec (~> 3.0)
33
+
34
+ BUNDLED WITH
35
+ 2.0.2
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Louis Sommer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,123 @@
1
+ # Abyme 🕳
2
+
3
+ abyme is a modern take on handling dynamic nested forms in Rails 6+ using StimulusJS.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'abyme'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+ $ yarn add 'abyme'
17
+
18
+
19
+ Assuming you [already installed Stimulus](https://stimulusjs.org/handbook/introduction), add this in `app/javascript/controllers/index.js` :
20
+ ```javascript
21
+ // app/javascript/controllers/index.js
22
+ import { Application } from "stimulus"
23
+ import { definitionsFromContext } from "stimulus/webpack-helpers"
24
+ // Add this line below
25
+ import { AbymeController } from 'abyme'
26
+
27
+ const application = Application.start()
28
+ const context = require.context("controllers", true, /_controller\.js$/)
29
+ application.load(definitionsFromContext(context))
30
+ // And this one
31
+ application.register('abyme', AbymeController)
32
+ ```
33
+
34
+ ## What are nested forms and why a new gem ?
35
+
36
+ Nested forms (or more accurately *nested fields* or *nested attributes*) are forms that deal with associated models. Let's picture a `Project` model that `has_many :tasks`. A nested form will allow you to create a project along with one or several tasks **within a single form**. If `Tasks` were to have associations on their own, like `:comments`, you could also, still in the same form, instantiate comments along with their parent models.
37
+
38
+ Rails provides [its own helper](https://api.rubyonrails.org/v6.0.1/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for) to handle nested attributes. **abyme** is basically a smart wrapper around it, offering easier syntax along with some fancy additions. To work properly, some configuration will be required in both models and controllers (see below).
39
+
40
+ What Rails doesn't provide natively is the possibility to **dynamically add new associations on the fly**, which requires Javascript implementation. What this means it that you would normally have to know in advance how many fields you'd like to display (1, 2 or any number of `:tasks`), which isn't very usable in this day and age. This is what the [cocoon gem](https://github.com/nathanvda/cocoon) has been helping with for the past 7 years. This gem still being implemented in JQuery (which [Rails dropped as a dependency](https://github.com/rails/rails/issues/25208)), we wanted to propose a more plug'n'play approach, using Basecamp's [Stimulus](https://stimulusjs.org/) instead.
41
+
42
+ ## Basic Configuration
43
+
44
+ ### Models
45
+ Let's consider a to-do application with Projects having many Taks, themselves having many Comments.
46
+ ```ruby
47
+ # models/project.rb
48
+ class Project < ApplicationRecord
49
+ has_many :tasks, inverse_of: :project, dependent: :destroy
50
+ validates :title, :description, presence: true
51
+ end
52
+
53
+ # models/task.rb
54
+ class Task < ApplicationRecord
55
+ belongs_to :project
56
+ has_many :comments, inverse_of: :project, dependent: :destroy
57
+ validates :title, :description, presence: true
58
+ end
59
+
60
+ # models/comment.rb
61
+ class Comment < ApplicationRecord
62
+ belongs_to :task
63
+ validates :content, presence: true
64
+ end
65
+ ```
66
+ The end-goal is to be able to create a project along with different tasks, and immediately add comments to some of these tasks ; all in a single form.
67
+ What we'll have is a 2-level nested form. Thus, we'll need to add these lines to both `Project` and `Task` :
68
+ ```ruby
69
+ # models/project.rb
70
+ class Project < ApplicationRecord
71
+ include Abyme::Model
72
+ #...
73
+ abyme_for :tasks
74
+ end
75
+
76
+ # models/task.rb
77
+ class Task < ApplicationRecord
78
+ include Abyme::Model
79
+ #...
80
+ abyme_for :comments
81
+ end
82
+ ```
83
+
84
+ ### Controller
85
+ Since we're dealing with one form, we're only concerned with one controller : the one the form routes to. In our example, this would be the `ProjectsController`.
86
+ The only configuration needed here will be our strong_params. Nested attributes require a very specific syntax to white-list the permitted attributes. It looks like this :
87
+
88
+ ```ruby
89
+ def project_params
90
+ params.require(:project).permit(
91
+ :title, :description, tasks_attributes: [
92
+ :id, :title, :description, :_destroy, comments_attributes: [
93
+ :id, :content, :_destroy
94
+ ]
95
+ ]
96
+ )
97
+ end
98
+ ```
99
+ A few explanations here.
100
+
101
+ * To permit a nested model attributes in your params, you'll need to pass the `association_attributes: [...]` hash at the end of your resource attributes. Key will always be `association_name` followed by `_attributes`, while the value will be an array of symbolized attributes, just like usual.
102
+
103
+ **Note**: if your association is a singular one (`has_one` or `belongs_to`, the association will be singular ; if a Project `has_one :owner`, you would then need to pass `owner_attributes: [...]`)
104
+
105
+ * You may have remarked the presence of `id` and `_destroy` among those params. These are necessary for edit actions : if you want to allow your users to destroy or update existing records, these are **mandatory**. Otherwise, Rails won't be able to recognize these records as existing ones, and will just create new ones.
106
+
107
+ ### View
108
+
109
+ TODO...
110
+
111
+ ## Development
112
+
113
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
114
+
115
+ 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).
116
+
117
+ ## Contributing
118
+
119
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/abyme.
120
+
121
+ ## License
122
+
123
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -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
Binary file
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "abyme/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "abyme"
7
+ spec.version = Abyme::VERSION::STRING
8
+ spec.authors = ["Romain Sanson", "Louis Sommer"]
9
+ spec.email = ["louis.sommer@hey.com"]
10
+
11
+ spec.summary = "abyme is the modern way to handle dynamic nested forms in Rails 6+."
12
+ # spec.description = %q{TODO: Write a longer description or delete this line.}
13
+ spec.homepage = "https://github.com/bear-in-mind/abyme"
14
+ spec.license = "MIT"
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/bear-in-mind/abyme"
18
+ spec.metadata["changelog_uri"] = "https://github.com/bear-in-mind/abyme"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|node_modules)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency "bundler", "~> 2.0"
30
+ spec.add_development_dependency "rake", "~> 13.0"
31
+ spec.add_development_dependency "rspec", "~> 3.0"
32
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "abyme"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,71 @@
1
+ import { Controller } from 'stimulus';
2
+
3
+ export default class extends Controller {
4
+ static targets = ['template', 'associations'];
5
+
6
+ connect() {
7
+ console.log('Abyme Connect');
8
+ }
9
+
10
+ get position() {
11
+ return this.associationsTarget.dataset.abymePosition === 'end' ? 'beforeend' : 'afterbegin';
12
+ }
13
+
14
+ add_association(event) {
15
+ event.preventDefault();
16
+
17
+ let html = this.templateTarget.innerHTML.replace(
18
+ /NEW_RECORD/g,
19
+ new Date().getTime()
20
+ );
21
+
22
+ if (html.match(/<template[\s\S]+<\/template>/)) {
23
+ const template = html
24
+ .match(/<template[\s\S]+<\/template>/)[0]
25
+ .replace(/(\[\d{12,}\])(\[[^\[\]]+\]"){1}/g, `[NEW_RECORD]$2`);
26
+
27
+ html = html.replace(/<template[\s\S]+<\/template>/g, template);
28
+ }
29
+
30
+ this.create_event('before-add', html)
31
+ this.associationsTarget.insertAdjacentHTML(this.position, html);
32
+ this.create_event('after-add', html)
33
+ }
34
+
35
+ remove_association(event) {
36
+ event.preventDefault();
37
+
38
+ this.create_event('before-remove')
39
+ let wrapper = event.target.closest('.abyme--fields');
40
+ wrapper.querySelector("input[name*='_destroy']").value = 1;
41
+ wrapper.style.display = 'none';
42
+ this.create_event('after-remove')
43
+ }
44
+
45
+ create_event(stage, html = null) {
46
+ const event = new CustomEvent(`abyme:${stage}`, { detail: {controller: this, content: html} })
47
+ this.element.dispatchEvent(event)
48
+ // WIP
49
+ this.dispatch(event, stage)
50
+ }
51
+
52
+ // WIP : Trying to integrate event handling through controller inheritance
53
+ dispatch(event, stage) {
54
+ if (stage === 'before-add' && this.abymeBeforeAdd) this.abymeBeforeAdd(event)
55
+ if (stage === 'after-add' && this.abymeAfterAdd) this.abymeAfterAdd(event)
56
+ if (stage === 'before-remove' && this.abymeBeforeRemove) this.abymeBeforeAdd(event)
57
+ if (stage === 'after-remove' && this.abymeAfterRemove) this.abymeAfterRemove(event)
58
+ }
59
+
60
+ abymeBeforeAdd(event) {
61
+ }
62
+
63
+ abymeAfterAdd(event) {
64
+ }
65
+
66
+ abymeBeforeRemove(event) {
67
+ }
68
+
69
+ abymeAfterRemove(event) {
70
+ }
71
+ }
@@ -0,0 +1,2 @@
1
+ import AbymeController from './abyme_controller';
2
+ export { AbymeController };
@@ -0,0 +1,8 @@
1
+ require "abyme/version"
2
+ require 'abyme/view_helpers'
3
+ require 'abyme/engine'
4
+
5
+ module Abyme
6
+ class Error < StandardError; end
7
+ autoload :Model, 'abyme/model'
8
+ end
@@ -0,0 +1,61 @@
1
+ module Abyme
2
+ class AbymeBuilder < ActionView::Base
3
+ include ActionView
4
+
5
+ def initialize(association:, form:, lookup_context:, &block)
6
+ @association = association
7
+ @form = form
8
+ @lookup_context = lookup_context
9
+ yield(self) if block_given?
10
+ end
11
+
12
+ def records(options = {})
13
+ persisted_records_for(@association, @form, options) do |form|
14
+ render_association_partial(form, options)
15
+ end
16
+ end
17
+
18
+ def new_records(options = {}, &block)
19
+ new_records_for(@association, @form, options) do |form|
20
+ render_association_partial(form, options)
21
+ end
22
+ end
23
+
24
+ # def add_association(options = {}, &block)
25
+ # action = 'click->abyme#add_association'
26
+ # create_button(action, options, &block)
27
+ # end
28
+
29
+ # def remove_association(options = {}, &block)
30
+ # action = 'click->abyme#remove_association'
31
+ # create_button(action, options, &block)
32
+ # end
33
+
34
+ private
35
+
36
+ def render_association_partial(form, options)
37
+ partial = options[:partial] || "shared/#{@association.to_s.singularize}_fields"
38
+ # ActionController::Base.render(partial: "shared/#{@association.to_s.singularize}_fields", locals: { f: form })
39
+ ActionController::Base.render(partial: partial, locals: { f: form })
40
+ end
41
+
42
+ # def create_button(action, options, &block)
43
+ # options[:attributes] = {} if options[:attributes].nil?
44
+ # options[:tag] = :button if options[:tag].nil?
45
+
46
+ # if block_given?
47
+ # concat content_tag(options[:tag], { data: { action: action }}.merge(options[:attributes])) do
48
+ # # capture(&block)
49
+ # yield
50
+ # end
51
+ # else
52
+ # render content_tag(options[:tag], options[:content], {data: { action: action }}.merge(options[:attributes]))
53
+ # end
54
+ # end
55
+
56
+ # def formatize(association)
57
+ # association.class.name.tableize
58
+ # end
59
+
60
+ end
61
+ end
@@ -0,0 +1,12 @@
1
+ module Abyme
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Abyme
4
+
5
+ config.after_initialize do
6
+ ActiveSupport.on_load :action_view do
7
+ # ActionView::Base.send :include, Abyme::ViewHelpers
8
+ include Abyme::ViewHelpers
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module Abyme
2
+ module Model
3
+ extend ActiveSupport::Concern
4
+
5
+ class_methods do
6
+ def abyme_for(association, options = {})
7
+ default_options = {reject_if: :all_blank, allow_destroy: true}
8
+ accepts_nested_attributes_for association, default_options.merge(options)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Abyme
2
+ module VERSION
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ PATCH = 3
6
+
7
+ STRING = [MAJOR, MINOR, PATCH].join(".")
8
+ end
9
+ end
@@ -0,0 +1,104 @@
1
+ require 'abyme/abyme_builder'
2
+
3
+ module Abyme
4
+ module ViewHelpers
5
+
6
+ def abymize(association, form, options = {}, &block)
7
+ content_tag(:div, data: { controller: 'abyme' }, id: "abyme--#{association}") do
8
+ if block_given?
9
+ yield(Abyme::AbymeBuilder.new(association: association, form: form, lookup_context: self.lookup_context))
10
+ else
11
+ model = association.to_s.singularize.classify.constantize
12
+ concat(persisted_records_for(association, form, options))
13
+ concat(new_records_for(association, form, options))
14
+ concat(add_association(content: options[:add] || "Add #{model}"))
15
+ end
16
+ end
17
+ end
18
+
19
+ def new_records_for(association, form, options = {}, &block)
20
+ content_tag(:div, data: { target: 'abyme.associations', association: association, abyme_position: options[:position] || :end }) do
21
+ content_tag(:template, class: "abyme--#{association.to_s.singularize}_template", data: { target: 'abyme.template' }) do
22
+ form.fields_for association, association.to_s.classify.constantize.new, child_index: 'NEW_RECORD' do |f|
23
+ content_tag(:div, basic_markup(options[:html])) do
24
+ if block_given?
25
+ # Here, f is the fields_for ; f.object becomes association.new rather than the original form.object
26
+ yield(f)
27
+ else
28
+ render "shared/#{association.to_s.singularize}_fields", f: f
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ def persisted_records_for(association, form, options = {})
37
+ if options[:collection]
38
+ records = options[:collection]
39
+ else
40
+ records = form.object.send(association)
41
+ end
42
+
43
+ if options[:order].present?
44
+ records = records.order(options[:order])
45
+
46
+ # GET INVALID RECORDS
47
+ invalids = form.object.send(association).reject(&:persisted?)
48
+
49
+ if invalids.any?
50
+ records = records.to_a.concat(invalids)
51
+ end
52
+ end
53
+
54
+ form.fields_for(association, records) do |f|
55
+ content_tag(:div, basic_markup(options[:html])) do
56
+ if block_given?
57
+ yield(f)
58
+ else
59
+ render "shared/#{association.to_s.singularize}_fields", f: f
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def add_association(options = {}, &block)
66
+ action = 'click->abyme#add_association'
67
+ create_button(action, options, &block)
68
+ end
69
+
70
+ def remove_association(options = {}, &block)
71
+ action = 'click->abyme#remove_association'
72
+ create_button(action, options, &block)
73
+ end
74
+
75
+ private
76
+
77
+ def create_button(action, options, &block)
78
+ options[:html] ||= {}
79
+ options[:tag] ||= :button
80
+ options[:content] ||= 'Add Association'
81
+
82
+ if block_given?
83
+ content_tag(options[:tag], { data: { action: action } }.merge(options[:html])) do
84
+ capture(&block)
85
+ end
86
+ else
87
+ content_tag(options[:tag], options[:content], { data: { action: action } }.merge(options[:html]))
88
+ end
89
+ end
90
+
91
+ def basic_markup(html)
92
+
93
+ if html && html[:class]
94
+ html[:class] = 'abyme--fields ' + html[:class]
95
+ else
96
+ html ||= {}
97
+ html[:class] = 'abyme--fields'
98
+ end
99
+
100
+ return html
101
+ end
102
+
103
+ end
104
+ end
Binary file
@@ -0,0 +1,25 @@
1
+ # require 'rails/generators'
2
+ # require 'json'
3
+
4
+ # module Abyme
5
+ # module Generators
6
+ # class InstallGenerator < Rails::Generators::Base
7
+ # source_root File.expand_path("templates", __dir__)
8
+
9
+ # def setup
10
+ # # Creating stimulus abyme_controller.js file
11
+ # # ==========================================
12
+ # template "abyme_controller.js", "app/javascript/controllers/abyme_controller.js"
13
+ # add_stimulus
14
+ # end
15
+
16
+ # def add_stimulus
17
+ # # Checking if stimulus is present in package.json => yarn add if it's not
18
+ # # =======================================================================
19
+ # package = JSON.parse(File.open('package.json').read)
20
+ # exec('yarn add stimulus') if !package['dependencies'].keys.include?('stimulus')
21
+ # end
22
+
23
+ # end
24
+ # end
25
+ # end
@@ -0,0 +1,17 @@
1
+ import { Controller } from 'stimulus';
2
+
3
+ export default class extends Controller {
4
+ connect() {
5
+ console.log('Abyme Controller Connected');
6
+ }
7
+
8
+ add_association(event) {
9
+ event.preventDefault();
10
+ console.log('Add Association');
11
+ }
12
+
13
+ remove_association(event) {
14
+ event.preventDefault();
15
+ console.log('Remove Association');
16
+ }
17
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "abyme",
3
+ "version": "0.1.2",
4
+ "description": "JS companion to abyme gem",
5
+ "main": "javascript/index.js",
6
+ "files": [
7
+ "package.json",
8
+ "javascript/**/*"
9
+ ],
10
+ "directories": {
11
+ "lib": "javascript"
12
+ },
13
+ "repository": {
14
+ "url": "https://github.com/bear-in-mind/abyme",
15
+ "type": "git"
16
+ },
17
+ "author": "Romain Sanson <romain.sanson@hey.com> & Louis Sommer <louis.sommer@hey.com>",
18
+ "license": "MIT",
19
+ "private": false,
20
+ "homepage": "https://github.com/bear-in-mind/abyme",
21
+ "bugs": "https://github.com/bear-in-mind/abyme/issues",
22
+ "dependencies": {
23
+ "stimulus": "^1.1.1"
24
+ }
25
+ }
@@ -0,0 +1,35 @@
1
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2
+ # yarn lockfile v1
3
+
4
+
5
+ "@stimulus/core@^1.1.1":
6
+ version "1.1.1"
7
+ resolved "https://registry.yarnpkg.com/@stimulus/core/-/core-1.1.1.tgz#42b0cfe5b73ca492f41de64b77a03980bae92c82"
8
+ integrity sha512-PVJv7IpuQx0MVPCBblXc6O2zbCmU8dlxXNH4bC9KK6LsvGaE+PCXXrXQfXUwAsse1/CmRu/iQG7Ov58himjiGg==
9
+ dependencies:
10
+ "@stimulus/mutation-observers" "^1.1.1"
11
+
12
+ "@stimulus/multimap@^1.1.1":
13
+ version "1.1.1"
14
+ resolved "https://registry.yarnpkg.com/@stimulus/multimap/-/multimap-1.1.1.tgz#b95e3fd607345ab36e5d5b55486ee1a12d56b331"
15
+ integrity sha512-26R1fI3a8uUj0WlMmta4qcfIQGlagegdP4PTz6lz852q/dXlG6r+uPS/bx+H8GtfyS+OOXVr3SkZ0Zg0iRqRfQ==
16
+
17
+ "@stimulus/mutation-observers@^1.1.1":
18
+ version "1.1.1"
19
+ resolved "https://registry.yarnpkg.com/@stimulus/mutation-observers/-/mutation-observers-1.1.1.tgz#0f6c6f081308427fed2a26360dda0c173b79cfc0"
20
+ integrity sha512-/zCnnw1KJlWO2mrx0yxYaRFZWMGnDMdOgSnI4hxDLxdWVuL2HMROU8FpHWVBLjKY3T9A+lGkcrmPGDHF3pfS9w==
21
+ dependencies:
22
+ "@stimulus/multimap" "^1.1.1"
23
+
24
+ "@stimulus/webpack-helpers@^1.1.1":
25
+ version "1.1.1"
26
+ resolved "https://registry.yarnpkg.com/@stimulus/webpack-helpers/-/webpack-helpers-1.1.1.tgz#eff60cd4e58b921d1a2764dc5215f5141510f2c2"
27
+ integrity sha512-XOkqSw53N9072FLHvpLM25PIwy+ndkSSbnTtjKuyzsv8K5yfkFB2rv68jU1pzqYa9FZLcvZWP4yazC0V38dx9A==
28
+
29
+ stimulus@^1.1.1:
30
+ version "1.1.1"
31
+ resolved "https://registry.yarnpkg.com/stimulus/-/stimulus-1.1.1.tgz#53c2fded6849e7b85eed3ed8dd76e33abd74bec5"
32
+ integrity sha512-R0mBqKp48YnRDZOxZ8hiOH4Ilph3Yj78CIFTBkCwyHs4iGCpe7xlEdQ7cjIxb+7qVCSxFKgxO+mAQbsNgt/5XQ==
33
+ dependencies:
34
+ "@stimulus/core" "^1.1.1"
35
+ "@stimulus/webpack-helpers" "^1.1.1"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abyme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Romain Sanson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-10-12 00:00:00.000000000 Z
12
+ date: 2020-10-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -59,7 +59,33 @@ email:
59
59
  executables: []
60
60
  extensions: []
61
61
  extra_rdoc_files: []
62
- files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - Gemfile
67
+ - Gemfile.lock
68
+ - LICENSE.txt
69
+ - README.md
70
+ - Rakefile
71
+ - abyme-0.1.2.gem
72
+ - abyme.gemspec
73
+ - bin/console
74
+ - bin/setup
75
+ - javascript/abyme_controller.js
76
+ - javascript/index.js
77
+ - lib/abyme.rb
78
+ - lib/abyme/abyme_builder.rb
79
+ - lib/abyme/engine.rb
80
+ - lib/abyme/model.rb
81
+ - lib/abyme/version.rb
82
+ - lib/abyme/view_helpers.rb
83
+ - lib/generators/.DS_Store
84
+ - lib/generators/abyme/install_generator.rb
85
+ - lib/generators/abyme/templates/abyme_controller.js
86
+ - package.json
87
+ - yarn-error.log
88
+ - yarn.lock
63
89
  homepage: https://github.com/bear-in-mind/abyme
64
90
  licenses:
65
91
  - MIT