move code from app here
This commit is contained in:
parent
c9031f9dd2
commit
1181dd0bfd
2
app/javascript/vue_r.rb
Normal file
2
app/javascript/vue_r.rb
Normal file
@ -0,0 +1,2 @@
|
||||
require "vue_r/application"
|
||||
require "vue_r/mounter"
|
67
app/javascript/vue_r/application.rb
Normal file
67
app/javascript/vue_r/application.rb
Normal file
@ -0,0 +1,67 @@
|
||||
module VueR
|
||||
class Application
|
||||
|
||||
def initialize(hash)
|
||||
hash.each do |k,v|
|
||||
wrap_attr(k,v)
|
||||
end
|
||||
@effect = nil
|
||||
@subscribers = {}
|
||||
end
|
||||
|
||||
def wrap_attr(k,v)
|
||||
instance_variable_set "@#{k}" , v
|
||||
define_getter(k)
|
||||
define_setter(k)
|
||||
end
|
||||
|
||||
def define_getter(k)
|
||||
self.class.define_method k.to_sym do
|
||||
track(k)
|
||||
instance_variable_get "@#{k}".to_sym
|
||||
end
|
||||
end
|
||||
|
||||
def define_setter(k)
|
||||
self.class.define_method "#{k}=".to_sym do |new_v|
|
||||
instance_variable_set "@#{k}" , new_v
|
||||
trigger(k)
|
||||
end
|
||||
end
|
||||
|
||||
def track( key )
|
||||
puts "Tracking:#{key}-#{@effect.hash}"
|
||||
return unless @effect
|
||||
get_subscribers_for(key) << @effect
|
||||
end
|
||||
|
||||
def trigger(key)
|
||||
puts "Trigger:#{key}"
|
||||
effects = get_subscribers_for(key)
|
||||
effects.each {|effect| effect.call() }
|
||||
end
|
||||
|
||||
def get_subscribers_for(key)
|
||||
key = key.to_sym
|
||||
unless @subscribers.has_key?(key)
|
||||
@subscribers[key] = Set.new
|
||||
end
|
||||
@subscribers[key]
|
||||
end
|
||||
|
||||
def mount(on_class)
|
||||
@mounter = Mounter.new(on_class , self)
|
||||
@mounter.mount
|
||||
end
|
||||
|
||||
def watch_effect( update_proc )
|
||||
effect = Proc.new do
|
||||
@effect = effect
|
||||
update_proc.call
|
||||
@effect = nil
|
||||
end
|
||||
effect.call
|
||||
end
|
||||
|
||||
end
|
||||
end
|
64
app/javascript/vue_r/mounter.rb
Normal file
64
app/javascript/vue_r/mounter.rb
Normal file
@ -0,0 +1,64 @@
|
||||
require 'opal-parser'
|
||||
|
||||
module VueR
|
||||
class Mounter
|
||||
HANDLEBARS = /{{\s?([^}]*)\s?}}/
|
||||
def initialize( id , app )
|
||||
@root = $document[id]
|
||||
@application = app
|
||||
end
|
||||
|
||||
def mount
|
||||
mount_Element(@root)
|
||||
end
|
||||
|
||||
def mount_Text elem
|
||||
text = elem.text
|
||||
scan = text.scan(HANDLEBARS)
|
||||
return unless scan.length > 0
|
||||
raise "only one curly per text implemented not:#{scan.length}" if scan.length > 1
|
||||
match = text.match(HANDLEBARS)
|
||||
str_before = text[0 ... match.begin(0)]
|
||||
str_after = text[ match.end(0) .. -1]
|
||||
ruby = match[0][2 ... -2]
|
||||
puts "Text: #{ruby}"
|
||||
proc = Proc.new do
|
||||
elem.text = str_before + @application.eval(ruby).to_s + str_after
|
||||
end
|
||||
@application.watch_effect(proc)
|
||||
end
|
||||
|
||||
def mount_Element(elem)
|
||||
elem.attributes.each do |name , value|
|
||||
mount_attribute(elem , name) if name.start_with?("r_")
|
||||
mount_event(elem , name) if name.start_with?("e_")
|
||||
end
|
||||
elem.children.each do |elem|
|
||||
base_name = elem.class.to_s.split("::").last
|
||||
send "mount_#{base_name}" , elem
|
||||
end
|
||||
end
|
||||
|
||||
def mount_attribute(element , name)
|
||||
native_name = name[2 .. -1]
|
||||
ruby = element[name]
|
||||
old_value = element[native_name]
|
||||
puts "Attribute: #{ruby}"
|
||||
proc = Proc.new do
|
||||
element[native_name] = old_value + " " + @application.eval(ruby).to_s
|
||||
end
|
||||
@application.watch_effect(proc)
|
||||
end
|
||||
|
||||
|
||||
def mount_event(element , name)
|
||||
native_name = name.gsub("e_" , "")
|
||||
ruby = element[name]
|
||||
puts "Event: #{native_name}:#{ruby}"
|
||||
element.on!(native_name) do
|
||||
got = @application.eval(ruby)
|
||||
puts "Clicked #{got}"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
10
test/dummy/app/views/images/_form.html.haml
Normal file
10
test/dummy/app/views/images/_form.html.haml
Normal file
@ -0,0 +1,10 @@
|
||||
= form_for @kantum do |f|
|
||||
- if @kantum.errors.any?
|
||||
#error_explanation
|
||||
%h2= "#{pluralize(@kantum.errors.count, "error")} prohibited this kantum from being saved:"
|
||||
%ul
|
||||
- @kantum.errors.full_messages.each do |message|
|
||||
%li= message
|
||||
|
||||
.actions
|
||||
= f.submit 'Save'
|
7
test/dummy/app/views/images/edit.html.haml
Normal file
7
test/dummy/app/views/images/edit.html.haml
Normal file
@ -0,0 +1,7 @@
|
||||
%h1 Editing kantum
|
||||
|
||||
= render 'form'
|
||||
|
||||
= link_to 'Show', @kantum
|
||||
\|
|
||||
= link_to 'Back', kanta_path
|
19
test/dummy/app/views/images/index.html.haml
Normal file
19
test/dummy/app/views/images/index.html.haml
Normal file
@ -0,0 +1,19 @@
|
||||
%h1 Listing kanta
|
||||
|
||||
%table
|
||||
%thead
|
||||
%tr
|
||||
%th
|
||||
%th
|
||||
%th
|
||||
|
||||
%tbody
|
||||
- @kanta.each do |kantum|
|
||||
%tr
|
||||
%td= link_to 'Show', kantum
|
||||
%td= link_to 'Edit', edit_kantum_path(kantum)
|
||||
%td= link_to 'Destroy', kantum, method: :delete, data: { confirm: 'Are you sure?' }
|
||||
|
||||
%br
|
||||
|
||||
= link_to 'New Kantum', new_kantum_path
|
5
test/dummy/app/views/images/new.html.haml
Normal file
5
test/dummy/app/views/images/new.html.haml
Normal file
@ -0,0 +1,5 @@
|
||||
%h1 New kantum
|
||||
|
||||
= render 'form'
|
||||
|
||||
= link_to 'Back', kanta_path
|
19
test/dummy/app/views/images/show.html.haml
Normal file
19
test/dummy/app/views/images/show.html.haml
Normal file
@ -0,0 +1,19 @@
|
||||
#app
|
||||
.flex.justify-center
|
||||
= #@image.attributes
|
||||
|
||||
.flex.justify-center
|
||||
%a.underline{ e_click: "bg_change" , r_class: 'back'}
|
||||
{{ back }}
|
||||
:opal
|
||||
class Clicker < VueR::Application
|
||||
def bg_change
|
||||
self.state = !self.state
|
||||
end
|
||||
def back
|
||||
self.state ? "bg-cyan-50" : "bg-cyan-200"
|
||||
end
|
||||
end
|
||||
|
||||
kanta = Clicker.new(bg: 'bg-cyan-200' , state: true)
|
||||
kanta.mount("#app")
|
Loading…
Reference in New Issue
Block a user