glimmer-dsl-opal 0.0.3 → 0.0.8

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/README.md +1049 -35
  4. data/VERSION +1 -1
  5. data/lib/glimmer-dsl-opal.rb +5 -2
  6. data/lib/glimmer/data_binding/ext/observable_model.rb +40 -0
  7. data/lib/glimmer/data_binding/list_selection_binding.rb +51 -0
  8. data/lib/glimmer/data_binding/table_items_binding.rb +67 -0
  9. data/lib/glimmer/dsl/opal/async_exec_expression.rb +17 -0
  10. data/lib/glimmer/dsl/opal/browser_expression.rb +17 -0
  11. data/lib/glimmer/dsl/opal/column_properties_expression.rb +22 -0
  12. data/lib/glimmer/dsl/opal/dsl.rb +14 -0
  13. data/lib/glimmer/dsl/opal/list_expression.rb +17 -0
  14. data/lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb +42 -0
  15. data/lib/glimmer/dsl/opal/message_box_expression.rb +20 -0
  16. data/lib/glimmer/dsl/opal/observe_expression.rb +32 -0
  17. data/lib/glimmer/dsl/opal/tab_folder_expression.rb +17 -0
  18. data/lib/glimmer/dsl/opal/tab_item_expression.rb +17 -0
  19. data/lib/glimmer/dsl/opal/table_column_expression.rb +17 -0
  20. data/lib/glimmer/dsl/opal/table_expression.rb +17 -0
  21. data/lib/glimmer/dsl/opal/table_items_data_binding_expression.rb +29 -0
  22. data/lib/glimmer/opal/display_proxy.rb +23 -0
  23. data/lib/glimmer/opal/div_proxy.rb +11 -2
  24. data/lib/glimmer/opal/document_proxy.rb +141 -11
  25. data/lib/glimmer/opal/element_proxy.rb +38 -15
  26. data/lib/glimmer/opal/grid_layout_proxy.rb +3 -1
  27. data/lib/glimmer/opal/iframe_proxy.rb +23 -0
  28. data/lib/glimmer/opal/input_proxy.rb +8 -4
  29. data/lib/glimmer/opal/label_proxy.rb +1 -1
  30. data/lib/glimmer/opal/layout_data_proxy.rb +23 -2
  31. data/lib/glimmer/opal/list_proxy.rb +80 -0
  32. data/lib/glimmer/opal/modal.rb +94 -0
  33. data/lib/glimmer/opal/point.rb +5 -0
  34. data/lib/glimmer/opal/select_proxy.rb +1 -1
  35. data/lib/glimmer/opal/tab_folder.rb +53 -0
  36. data/lib/glimmer/opal/tab_item.rb +98 -0
  37. data/lib/glimmer/opal/table_column.rb +50 -0
  38. data/lib/glimmer/opal/table_item.rb +136 -0
  39. data/lib/glimmer/opal/table_proxy.rb +149 -0
  40. data/lib/samples/elaborate/contact_manager.rb +1 -2
  41. data/lib/samples/elaborate/login.rb +0 -1
  42. data/lib/samples/elaborate/tic_tac_toe.rb +5 -5
  43. data/lib/samples/hello/hello_tab.rb +2 -2
  44. metadata +30 -14
  45. data/lib/glimmer/config.rb +0 -22
  46. data/lib/glimmer/dsl/engine.rb +0 -193
  47. data/lib/glimmer/dsl/expression.rb +0 -42
  48. data/lib/glimmer/dsl/expression_handler.rb +0 -48
  49. data/lib/glimmer/dsl/parent_expression.rb +0 -12
  50. data/lib/glimmer/dsl/static_expression.rb +0 -36
  51. data/lib/glimmer/dsl/top_level_expression.rb +0 -7
  52. data/lib/glimmer/error.rb +0 -6
  53. data/lib/glimmer/invalid_keyword_error.rb +0 -6
@@ -0,0 +1,136 @@
1
+ require 'glimmer/opal/element_proxy'
2
+
3
+ module Glimmer
4
+ module Opal
5
+ class TableItem < ElementProxy
6
+ attr_reader :data
7
+
8
+ def initialize(parent, args)
9
+ super(parent, args)
10
+ on_widget_selected { |event|
11
+ parent.select(parent.index_of(self), event.meta?)
12
+ }
13
+ end
14
+
15
+ def get_text(index)
16
+ text_array[index]
17
+ end
18
+
19
+ def set_text(index, text_value)
20
+ text_array[index] = text_value
21
+ redraw
22
+ end
23
+
24
+ def text_array
25
+ @text_array ||= []
26
+ end
27
+
28
+ def get_data(key = nil)
29
+ if key.nil?
30
+ @data
31
+ else
32
+ data_hash[key]
33
+ end
34
+ end
35
+
36
+ def set_data(key = nil, data_value)
37
+ if key.nil?
38
+ @data = data_value
39
+ else
40
+ data_hash[key] = data_value
41
+ end
42
+ end
43
+
44
+ def data_hash
45
+ @data_hash ||= {}
46
+ end
47
+
48
+ def name
49
+ 'tr'
50
+ end
51
+
52
+ def edit(column_index)
53
+ return if @edit_column_index == column_index.to_i
54
+ parent.select(parent.index_of(self), false)
55
+ @edit_column_index = column_index.to_i
56
+ redraw
57
+ end
58
+
59
+ def on_widget_selected(&block)
60
+ event = 'click'
61
+ delegate = $document.on(event, selector, &block)
62
+ EventListenerProxy.new(element_proxy: self, event: event, selector: selector, delegate: delegate)
63
+ end
64
+
65
+ def max_column_width(column_index)
66
+ parent.dom.css("tr td:nth-child(#{column_index + 1})").first.width
67
+ end
68
+
69
+ def dom
70
+ table_item_id = id
71
+ table_item_id_style = css
72
+ table_item_css_classes = css_classes
73
+ table_item_selection = parent.selection.include?(self)
74
+ if table_item_selection
75
+ table_item_css_classes << 'selected'
76
+ else
77
+ table_item_css_classes.delete('selected')
78
+ end
79
+ table_item_text_array = text_array
80
+ table_item_edit_column_index = @edit_column_index
81
+ table_item_max_width = max_column_width(table_item_edit_column_index) if table_item_edit_column_index
82
+ table_item_edit_handler = lambda do |event, cancel = false|
83
+ Async::Task.new do
84
+ text_value = event.target.value
85
+ edit_property = parent.column_properties[table_item_edit_column_index]
86
+ edit_model = get_data
87
+ if !cancel && edit_model.send(edit_property) != text_value
88
+ edit_model.send("#{edit_property}=", text_value)
89
+ set_text(table_item_edit_column_index, text_value)
90
+ end
91
+ @edit_column_index = nil
92
+ redraw
93
+ end
94
+ end
95
+ table_item_edit_cancel_handler = lambda do |event|
96
+ Async::Task.new do
97
+ table_item_edit_handler.call(event, true)
98
+ end
99
+ end
100
+ table_item_edit_key_handler = lambda do |event|
101
+ Async::Task.new do
102
+ if event.code == 13
103
+ table_item_edit_handler.call(event)
104
+ elsif event.code == 27
105
+ table_item_edit_cancel_handler.call(event)
106
+ end
107
+ end
108
+ end
109
+ @dom ||= DOM {
110
+ tr(id: table_item_id, style: table_item_id_style, class: table_item_css_classes.to_a.join(' ')) {
111
+ table_item_text_array.each_with_index do |table_item_text, column_index|
112
+ td('data-column-index' => column_index) {
113
+ if table_item_edit_column_index == column_index
114
+ input(type: 'text', value: table_item_text, style: "max-width: #{table_item_max_width - 11}px;")
115
+ else
116
+ table_item_text
117
+ end
118
+ }
119
+ end
120
+ }
121
+ }.tap do |the_dom|
122
+ if table_item_edit_column_index
123
+ table_item_input = the_dom.css("td:nth-child(#{table_item_edit_column_index + 1}) input").first
124
+ if table_item_input
125
+ Async::Task.new do
126
+ table_item_input.focus
127
+ table_item_input.on('keyup', &table_item_edit_key_handler)
128
+ table_item_input.on('focusout', &table_item_edit_cancel_handler)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
@@ -0,0 +1,149 @@
1
+ require 'glimmer/opal/element_proxy'
2
+ require 'glimmer/opal/table_column'
3
+
4
+ module Glimmer
5
+ module Opal
6
+ class TableProxy < ElementProxy
7
+ attr_reader :columns, :selection
8
+ attr_accessor :column_properties
9
+ alias items children
10
+
11
+ def initialize(parent, args)
12
+ super(parent, args)
13
+ @columns = []
14
+ @children = []
15
+ @selection = []
16
+ end
17
+
18
+ # Only table_columns may be added as children
19
+ def add_child(child)
20
+ if child.is_a?(TableColumn)
21
+ @columns << child
22
+ columns_dom << child.dom
23
+ else
24
+ @children << child
25
+ items_dom << child.dom
26
+ end
27
+ end
28
+
29
+ def remove_all
30
+ items.clear
31
+ @items_dom = nil
32
+ end
33
+
34
+ def selection=(new_selection)
35
+ changed = (@selection + new_selection) - (@selection & new_selection)
36
+ @selection = new_selection
37
+ changed.each(&:redraw)
38
+ end
39
+
40
+ def items=(new_items)
41
+ @children = new_items
42
+ redraw
43
+ end
44
+
45
+ def search(&condition)
46
+ items.select {|item| condition.nil? || condition.call(item)}
47
+ end
48
+
49
+ def index_of(item)
50
+ items.index(item)
51
+ end
52
+
53
+ def select(index, meta = false)
54
+ new_selection = @selection.clone
55
+ selected_item = items[index]
56
+ if @selection.include?(selected_item)
57
+ new_selection.delete(selected_item) if meta
58
+ else
59
+ new_selection = [] if !meta || (!has_style?(:multi) && @selection.to_a.size >= 1)
60
+ new_selection << selected_item
61
+ end
62
+ self.selection = new_selection
63
+ end
64
+
65
+ def edit_table_item(table_item, column_index)
66
+ table_item.edit(column_index)
67
+ end
68
+
69
+ def selector
70
+ super + ' tbody'
71
+ end
72
+
73
+ def observation_request_to_event_mapping
74
+ {
75
+ 'on_mouse_down' => {
76
+ event: 'mousedown',
77
+ event_handler: -> (event_listener) {
78
+ -> (event) {
79
+ event.singleton_class.send(:define_method, :table_item=) do |item|
80
+ @table_item = item
81
+ end
82
+ event.singleton_class.send(:define_method, :table_item) do
83
+ @table_item
84
+ end
85
+ table_row = event.target.ancestors('tr').first
86
+ table_data = event.target.ancestors('td').first
87
+ event.table_item = items.detect {|item| item.id == table_row.attributes['id']}
88
+ event.singleton_class.send(:define_method, :column_index) do
89
+ (table_data || event.target).attributes['data-column-index']
90
+ end
91
+ event_listener.call(event)
92
+ }
93
+ }
94
+ }
95
+ }
96
+ end
97
+
98
+ def redraw
99
+ if @dom
100
+ old_dom = @dom
101
+ @dom = nil
102
+ old_dom.replace dom
103
+ else
104
+ dom
105
+ end
106
+ if @last_redrawn_children != @children
107
+ items_dom.clear
108
+ @last_redrawn_children = @children
109
+ @children = []
110
+ @last_redrawn_children.each do |child|
111
+ add_child(child)
112
+ end
113
+ end
114
+ end
115
+
116
+ def columns_dom
117
+ @columns_dom ||= DOM {
118
+ tr {
119
+ }
120
+ }
121
+ end
122
+
123
+ def thead_dom
124
+ @thead_dom ||= DOM {
125
+ thead {
126
+ }
127
+ }.tap {|the_dom| the_dom << columns_dom }
128
+ end
129
+
130
+ def items_dom
131
+ @items_dom ||= DOM {
132
+ tbody {
133
+ }
134
+ }
135
+ end
136
+
137
+ def dom
138
+ table_id = id
139
+ table_id_style = css
140
+ table_id_css_classes = css_classes
141
+ table_id_css_classes_string = table_id_css_classes.to_a.join(' ')
142
+ @dom ||= DOM {
143
+ table(id: table_id, style: table_id_style, class: table_id_css_classes_string) {
144
+ }
145
+ }.tap {|the_dom| the_dom >> thead_dom }.tap {|the_dom| the_dom << items_dom }
146
+ end
147
+ end
148
+ end
149
+ end
@@ -81,8 +81,7 @@ class ContactManager
81
81
  @contact_manager_presenter.toggle_sort(:email)
82
82
  }
83
83
  }
84
- items bind(@contact_manager_presenter, :results),
85
- column_properties(:first_name, :last_name, :email)
84
+ items bind(@contact_manager_presenter, :results), column_properties(:first_name, :last_name, :email)
86
85
  on_mouse_down { |event|
87
86
  table_proxy.edit_table_item(event.table_item, event.column_index)
88
87
  }
@@ -1,4 +1,3 @@
1
- require "java"
2
1
  require "observer"
3
2
 
4
3
  #Presents login screen data
@@ -37,11 +37,11 @@ class TicTacToe
37
37
  display_game_over_message("Draw!")
38
38
  end
39
39
 
40
- def display_game_over_message(message)
41
- message_box = MessageBox.new(@shell.swt_widget)
42
- message_box.setText("Game Over")
43
- message_box.setMessage(message)
44
- message_box.open
40
+ def display_game_over_message(message_text)
41
+ message_box(@shell) {
42
+ text 'Game Over'
43
+ message message_text
44
+ }.open
45
45
  @tic_tac_toe_board.reset
46
46
  end
47
47
 
@@ -2,7 +2,7 @@ class HelloTab
2
2
  include Glimmer
3
3
  def launch
4
4
  shell {
5
- text "Hello Tab"
5
+ text "Hello, Tab!"
6
6
  tab_folder {
7
7
  tab_item {
8
8
  text "English"
@@ -13,7 +13,7 @@ class HelloTab
13
13
  tab_item {
14
14
  text "French"
15
15
  label {
16
- text "Bonjour Univers!"
16
+ text "Bonjour, Univers!"
17
17
  }
18
18
  }
19
19
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glimmer-dsl-opal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - AndyMaleh
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-17 00:00:00.000000000 Z
11
+ date: 2020-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: glimmer
@@ -168,14 +168,16 @@ files:
168
168
  - README.md
169
169
  - VERSION
170
170
  - lib/glimmer-dsl-opal.rb
171
- - lib/glimmer/config.rb
172
171
  - lib/glimmer/data_binding/element_binding.rb
172
+ - lib/glimmer/data_binding/ext/observable_model.rb
173
+ - lib/glimmer/data_binding/list_selection_binding.rb
173
174
  - lib/glimmer/data_binding/observable_element.rb
174
- - lib/glimmer/dsl/engine.rb
175
- - lib/glimmer/dsl/expression.rb
176
- - lib/glimmer/dsl/expression_handler.rb
175
+ - lib/glimmer/data_binding/table_items_binding.rb
176
+ - lib/glimmer/dsl/opal/async_exec_expression.rb
177
177
  - lib/glimmer/dsl/opal/bind_expression.rb
178
+ - lib/glimmer/dsl/opal/browser_expression.rb
178
179
  - lib/glimmer/dsl/opal/button_expression.rb
180
+ - lib/glimmer/dsl/opal/column_properties_expression.rb
179
181
  - lib/glimmer/dsl/opal/combo_expression.rb
180
182
  - lib/glimmer/dsl/opal/combo_selection_data_binding_expression.rb
181
183
  - lib/glimmer/dsl/opal/composite_expression.rb
@@ -184,25 +186,39 @@ files:
184
186
  - lib/glimmer/dsl/opal/grid_layout_expression.rb
185
187
  - lib/glimmer/dsl/opal/label_expression.rb
186
188
  - lib/glimmer/dsl/opal/layout_data_expression.rb
189
+ - lib/glimmer/dsl/opal/list_expression.rb
190
+ - lib/glimmer/dsl/opal/list_selection_data_binding_expression.rb
191
+ - lib/glimmer/dsl/opal/message_box_expression.rb
192
+ - lib/glimmer/dsl/opal/observe_expression.rb
187
193
  - lib/glimmer/dsl/opal/property_expression.rb
188
194
  - lib/glimmer/dsl/opal/shell_expression.rb
195
+ - lib/glimmer/dsl/opal/tab_folder_expression.rb
196
+ - lib/glimmer/dsl/opal/tab_item_expression.rb
197
+ - lib/glimmer/dsl/opal/table_column_expression.rb
198
+ - lib/glimmer/dsl/opal/table_expression.rb
199
+ - lib/glimmer/dsl/opal/table_items_data_binding_expression.rb
189
200
  - lib/glimmer/dsl/opal/text_expression.rb
190
201
  - lib/glimmer/dsl/opal/widget_listener_expression.rb
191
- - lib/glimmer/dsl/parent_expression.rb
192
- - lib/glimmer/dsl/static_expression.rb
193
- - lib/glimmer/dsl/top_level_expression.rb
194
- - lib/glimmer/error.rb
195
- - lib/glimmer/invalid_keyword_error.rb
202
+ - lib/glimmer/opal/display_proxy.rb
196
203
  - lib/glimmer/opal/div_proxy.rb
197
204
  - lib/glimmer/opal/document_proxy.rb
198
205
  - lib/glimmer/opal/element_proxy.rb
199
206
  - lib/glimmer/opal/event_listener_proxy.rb
200
207
  - lib/glimmer/opal/grid_layout_proxy.rb
208
+ - lib/glimmer/opal/iframe_proxy.rb
201
209
  - lib/glimmer/opal/input_proxy.rb
202
210
  - lib/glimmer/opal/label_proxy.rb
203
211
  - lib/glimmer/opal/layout_data_proxy.rb
212
+ - lib/glimmer/opal/list_proxy.rb
213
+ - lib/glimmer/opal/modal.rb
214
+ - lib/glimmer/opal/point.rb
204
215
  - lib/glimmer/opal/property_owner.rb
205
216
  - lib/glimmer/opal/select_proxy.rb
217
+ - lib/glimmer/opal/tab_folder.rb
218
+ - lib/glimmer/opal/tab_item.rb
219
+ - lib/glimmer/opal/table_column.rb
220
+ - lib/glimmer/opal/table_item.rb
221
+ - lib/glimmer/opal/table_proxy.rb
206
222
  - lib/samples/elaborate/contact_manager.rb
207
223
  - lib/samples/elaborate/contact_manager/contact.rb
208
224
  - lib/samples/elaborate/contact_manager/contact_manager_presenter.rb
@@ -226,7 +242,7 @@ homepage: http://github.com/AndyObtiva/glimmer-dsl-opal
226
242
  licenses:
227
243
  - MIT
228
244
  metadata: {}
229
- post_install_message:
245
+ post_install_message:
230
246
  rdoc_options: []
231
247
  require_paths:
232
248
  - lib
@@ -242,7 +258,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
258
  version: '0'
243
259
  requirements: []
244
260
  rubygems_version: 3.1.2
245
- signing_key:
261
+ signing_key:
246
262
  specification_version: 4
247
263
  summary: Glimmer DSL for Opal
248
264
  test_files: []
@@ -1,22 +0,0 @@
1
- module Glimmer
2
- module Config
3
- class << self
4
- # Returns Glimmer logger (standard Ruby logger)
5
- def logger
6
- # unless defined? @@logger
7
- # @@logger = Logger.new(STDOUT).tap {|logger| logger.level = Logger::WARN}
8
- # end
9
- @@logger if defined? @@logger
10
- end
11
-
12
- def enable_logging
13
- @@logger = Logger.new(STDOUT).tap {|logger| logger.level = Logger::WARN}
14
- end
15
- end
16
- end
17
- end
18
-
19
- if ENV['GLIMMER_LOGGER_LEVEL']
20
- Glimmer::Config.enable_logging
21
- Glimmer::Config.logger.level = ENV['GLIMMER_LOGGER_LEVEL'].downcase
22
- end