glimmer-dsl-opal 0.5.1 → 0.6.0

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +84 -3
  4. data/VERSION +1 -1
  5. data/app/assets/images/glimmer/images/calendar.gif +0 -0
  6. data/app/assets/images/glimmer/images/ui-icons_222222_256x240.png +0 -0
  7. data/app/assets/images/glimmer/images/ui-icons_444444_256x240.png +0 -0
  8. data/app/assets/images/glimmer/images/ui-icons_555555_256x240.png +0 -0
  9. data/app/assets/images/glimmer/images/ui-icons_777620_256x240.png +0 -0
  10. data/app/assets/images/glimmer/images/ui-icons_777777_256x240.png +0 -0
  11. data/app/assets/images/glimmer/images/ui-icons_cc0000_256x240.png +0 -0
  12. data/app/assets/images/glimmer/images/ui-icons_ffffff_256x240.png +0 -0
  13. data/app/assets/stylesheets/glimmer.css +15 -0
  14. data/app/assets/stylesheets/glimmer/jquery-ui.css +1312 -0
  15. data/app/assets/stylesheets/glimmer/jquery-ui.structure.css +886 -0
  16. data/app/assets/stylesheets/glimmer/jquery-ui.theme.css +443 -0
  17. data/app/assets/stylesheets/glimmer/jquery.ui.timepicker.css +57 -0
  18. data/lib/glimmer-dsl-opal.rb +14 -6
  19. data/lib/glimmer-dsl-opal/ext/date.rb +38 -3
  20. data/lib/glimmer-dsl-opal/samples/hello/hello_date_time.rb +63 -0
  21. data/lib/glimmer-dsl-opal/vendor/jquery-ui-timepicker/GPL-LICENSE.txt +278 -0
  22. data/lib/glimmer-dsl-opal/vendor/jquery-ui-timepicker/MIT-LICENSE.txt +20 -0
  23. data/lib/glimmer-dsl-opal/vendor/jquery-ui-timepicker/jquery.ui.timepicker.css +57 -0
  24. data/lib/glimmer-dsl-opal/vendor/jquery-ui-timepicker/jquery.ui.timepicker.js +1496 -0
  25. data/lib/glimmer-dsl-opal/vendor/jquery-ui/AUTHORS.txt +333 -0
  26. data/lib/glimmer-dsl-opal/vendor/jquery-ui/LICENSE.txt +43 -0
  27. data/lib/glimmer-dsl-opal/vendor/jquery-ui/images/ui-icons_444444_256x240.png +0 -0
  28. data/lib/glimmer-dsl-opal/vendor/jquery-ui/images/ui-icons_555555_256x240.png +0 -0
  29. data/lib/glimmer-dsl-opal/vendor/jquery-ui/images/ui-icons_777620_256x240.png +0 -0
  30. data/lib/glimmer-dsl-opal/vendor/jquery-ui/images/ui-icons_777777_256x240.png +0 -0
  31. data/lib/glimmer-dsl-opal/vendor/jquery-ui/images/ui-icons_cc0000_256x240.png +0 -0
  32. data/lib/glimmer-dsl-opal/vendor/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  33. data/lib/glimmer-dsl-opal/vendor/jquery-ui/jquery-ui.min.css +7 -0
  34. data/lib/glimmer-dsl-opal/vendor/jquery-ui/jquery-ui.min.js +13 -0
  35. data/lib/glimmer-dsl-opal/vendor/jquery-ui/jquery-ui.structure.min.css +5 -0
  36. data/lib/glimmer-dsl-opal/vendor/jquery-ui/jquery-ui.theme.min.css +5 -0
  37. data/lib/glimmer-dsl-opal/vendor/jquery-ui/package.json +74 -0
  38. data/lib/glimmer/dsl/opal/shell_expression.rb +7 -2
  39. data/lib/glimmer/dsl/opal/widget_expression.rb +5 -0
  40. data/lib/glimmer/engine.rb +9 -0
  41. data/lib/glimmer/swt.rb +3 -3
  42. data/lib/glimmer/swt/button_proxy.rb +1 -1
  43. data/lib/glimmer/swt/checkbox_proxy.rb +1 -0
  44. data/lib/glimmer/swt/date_time_proxy.rb +144 -0
  45. data/lib/glimmer/swt/make_shift_shell_proxy.rb +4 -4
  46. data/lib/glimmer/swt/message_box_proxy.rb +6 -6
  47. data/lib/glimmer/swt/radio_proxy.rb +1 -0
  48. data/lib/glimmer/swt/tab_folder_proxy.rb +3 -3
  49. data/lib/glimmer/swt/table_proxy.rb +10 -10
  50. data/lib/glimmer/swt/text_proxy.rb +2 -2
  51. data/lib/glimmer/swt/widget_proxy.rb +23 -7
  52. metadata +35 -2
@@ -13,14 +13,14 @@ module Glimmer
13
13
  include TopLevelExpression
14
14
  include ParentExpression
15
15
 
16
- def interpret(parent, keyword, *args, &block)
16
+ def interpret(parent, keyword, *args, &block)
17
17
  if Glimmer::UI::CustomShell.requested_and_not_handled?
18
18
  parameters = Glimmer::UI::CustomShell.request_parameter_string.split("&").map {|str| str.split("=")}.to_h
19
19
  `history.pushState(#{parameters.merge('custom_shell_handled' => 'true')}, document.title, #{"?#{Glimmer::UI::CustomShell.encoded_request_parameter_string}&custom_shell_handled=true"})`
20
20
  custom_shell_keyword = parameters.delete('custom_shell')
21
21
  CustomWidgetExpression.new.interpret(nil, custom_shell_keyword, *[parameters])
22
22
  `history.pushState(#{parameters.reject {|k,v| k == 'custom_shell_handled'}}, document.title, #{"?#{Glimmer::UI::CustomShell.encoded_request_parameter_string.sub('&custom_shell_handled=true', '')}"})`
23
- # just a placeholder that has an open method # TODO return an actual CustomShell in the future that does the work happening above in the #open method
23
+ # just a placeholder that has an open method # TODO return an actual CustomShell in the future that does the work happening above in the #open method
24
24
  Glimmer::SWT::MakeShiftShellProxy.new
25
25
  else
26
26
  Glimmer::SWT::ShellProxy.new(*args)
@@ -30,6 +30,11 @@ module Glimmer
30
30
  def add_content(parent, &content)
31
31
  content.call(parent) if parent.is_a?(Glimmer::SWT::ShellProxy)
32
32
  end
33
+
34
+ def add_content(parent, &block)
35
+ super(parent, &block)
36
+ parent.post_add_content
37
+ end
33
38
  end
34
39
  end
35
40
  end
@@ -18,6 +18,11 @@ module Glimmer
18
18
  def interpret(parent, keyword, *args, &block)
19
19
  Glimmer::SWT::WidgetProxy.for(keyword, parent, args)
20
20
  end
21
+
22
+ def add_content(parent, &block)
23
+ super(parent, &block)
24
+ parent.post_add_content
25
+ end
21
26
  end
22
27
  end
23
28
  end
@@ -0,0 +1,9 @@
1
+ module Glimmer
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Glimmer
4
+
5
+ initializer "glimmer.assets.precompile" do |app|
6
+ app.config.assets.precompile += %w( glimmer.css jquery-ui.css jquery-ui.structure.css jquery-ui.theme.css jquery.ui.timepicker.css )
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  # Copyright (c) 2020 Andy Maleh
2
- #
2
+ #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining
4
4
  # a copy of this software and associated documentation files (the
5
5
  # "Software"), to deal in the Software without restriction, including
@@ -7,10 +7,10 @@
7
7
  # distribute, sublicense, and/or sell copies of the Software, and to
8
8
  # permit persons to whom the Software is furnished to do so, subject to
9
9
  # the following conditions:
10
- #
10
+ #
11
11
  # The above copyright notice and this permission notice shall be
12
12
  # included in all copies or substantial portions of the Software.
13
- #
13
+ #
14
14
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
15
  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
16
  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -6,7 +6,7 @@ module Glimmer
6
6
  module SWT
7
7
  class ButtonProxy < WidgetProxy
8
8
  class << self
9
- def create(parent, args)
9
+ def create(keyword, parent, args)
10
10
  if args.to_a.include?(:radio)
11
11
  RadioProxy.new(parent, args)
12
12
  elsif args.to_a.include?(:check)
@@ -3,6 +3,7 @@ require 'glimmer/swt/widget_proxy'
3
3
  module Glimmer
4
4
  module SWT
5
5
  class CheckboxProxy < WidgetProxy
6
+ # TODO add a create method that ensures passing :check style in if not there
6
7
  STYLE=<<~CSS
7
8
  .checkbox {
8
9
  display: inline;
@@ -0,0 +1,144 @@
1
+ require 'glimmer/swt/widget_proxy'
2
+
3
+ module Glimmer
4
+ module SWT
5
+ class DateTimeProxy < WidgetProxy
6
+ class << self
7
+ def create(keyword, parent, args)
8
+ case keyword
9
+ when 'date'
10
+ args += [:date]
11
+ when 'date_drop_down'
12
+ args += [:date, :drop_down]
13
+ when 'time'
14
+ args += [:time]
15
+ when 'calendar'
16
+ args += [:calendar]
17
+ end
18
+ new(parent, args)
19
+ end
20
+ end
21
+
22
+ def initialize(parent, args)
23
+ super(parent, args)
24
+ end
25
+
26
+ def post_add_content
27
+ # TODO handle date_drop_down version
28
+ if time?
29
+ dom_element.timepicker({
30
+ showPeriod: true,
31
+ showLeadingZero: true,
32
+ showOn: 'both',
33
+ button: "##{time_button_id}",
34
+ })
35
+ else
36
+ options = {}
37
+ if drop_down?
38
+ options = {
39
+ showOn: 'both',
40
+ buttonImage: 'assets/glimmer/images/calendar.gif',
41
+ buttonImageOnly: true,
42
+ buttonText: 'Select date'
43
+ }
44
+ end
45
+ dom_element.datepicker(options)
46
+ end
47
+ date_time_value = self.date_time
48
+ @added_content = true
49
+ self.date_time = date_time_value
50
+ end
51
+
52
+ def date?
53
+ args.to_a.include?(:date)
54
+ end
55
+
56
+ def time?
57
+ args.to_a.include?(:time)
58
+ end
59
+
60
+ def drop_down?
61
+ args.to_a.include?(:drop_down)
62
+ end
63
+
64
+ def calendar?
65
+ args.to_a.include?(:calendar)
66
+ end
67
+
68
+ def date_time
69
+ if @added_content
70
+ default_date = DateTime.new if @date_time.nil?
71
+ default_year = @date_time&.year || default_date.year
72
+ default_month = @date_time&.month || default_date.month
73
+ default_day = @date_time&.day || default_date.day
74
+ default_hour = @date_time&.hour || default_date.hour
75
+ default_min = @date_time&.min || default_date.min
76
+ default_sec = @date_time&.sec || default_date.sec
77
+ if time?
78
+ @date_time = DateTime.new(default_year, default_month, default_day, dom_element.timepicker('getHour').to_i, dom_element.timepicker('getMinute').to_i, default_sec)
79
+ else
80
+ @date_time = DateTime.new(dom_element.datepicker('getDate')&.year.to_i, dom_element.datepicker('getDate')&.month.to_i, dom_element.datepicker('getDate')&.day.to_i, default_hour, default_min, default_sec)
81
+ end
82
+ @date_time = @date_time&.to_datetime
83
+ else
84
+ @initial_date_time
85
+ end
86
+ end
87
+
88
+ def date_time=(value)
89
+ if @added_content
90
+ @date_time = value&.to_datetime || DateTime.new
91
+ if time?
92
+ dom_element.timepicker('setTime', "#{@date_time.hour}:#{@date_time.min}")
93
+ else
94
+ dom_element.datepicker('setDate', @date_time.to_time)
95
+ end
96
+ else
97
+ @initial_date_time = value
98
+ end
99
+ end
100
+
101
+ # TODO add date, time, year, month, day, hours, minutes, seconds attribute methods
102
+
103
+ def observation_request_to_event_mapping
104
+ {
105
+ 'on_widget_selected' => [
106
+ {
107
+ event: 'change'
108
+ },
109
+ ],
110
+ }
111
+ end
112
+
113
+ def time_button_id
114
+ "#{id}-time-button"
115
+ end
116
+
117
+ def time_button_class
118
+ "#{name}-time-button"
119
+ end
120
+
121
+ def element
122
+ calendar? ? 'div' : 'input'
123
+ end
124
+
125
+ def dom
126
+ @dom ||= html {
127
+ span {
128
+ send(element, type: 'text', id: id, class: name)
129
+ button(id: time_button_id, class: time_button_class, style: "border: none; background: url(assets/glimmer/images/ui-icons_222222_256x240.png) -80px, -96px; width: 16px; height: 16px;") if time?
130
+ }
131
+ }.to_s
132
+ end
133
+
134
+ end
135
+
136
+ # Aliases: `date`, `date_drop_down`, `time`, and `calendar`
137
+ DateProxy = DateTimeProxy
138
+ DateDropDownProxy = DateTimeProxy
139
+ TimeProxy = DateTimeProxy
140
+ CalendarProxy = DateTimeProxy
141
+
142
+ end
143
+
144
+ end
@@ -1,5 +1,5 @@
1
1
  # Copyright (c) 2020 Andy Maleh
2
- #
2
+ #
3
3
  # Permission is hereby granted, free of charge, to any person obtaining
4
4
  # a copy of this software and associated documentation files (the
5
5
  # "Software"), to deal in the Software without restriction, including
@@ -7,10 +7,10 @@
7
7
  # distribute, sublicense, and/or sell copies of the Software, and to
8
8
  # permit persons to whom the Software is furnished to do so, subject to
9
9
  # the following conditions:
10
- #
10
+ #
11
11
  # The above copyright notice and this permission notice shall be
12
12
  # included in all copies or substantial portions of the Software.
13
- #
13
+ #
14
14
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
15
  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
16
  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
@@ -26,7 +26,7 @@ module Glimmer
26
26
  # No Op
27
27
  end
28
28
 
29
- def add_child(child)
29
+ def post_initialize_child(child)
30
30
  # No Op
31
31
  end
32
32
 
@@ -37,7 +37,7 @@ module Glimmer
37
37
  end
38
38
 
39
39
  def open
40
- document.add_child(self)
40
+ document.post_initialize_child(self)
41
41
  end
42
42
 
43
43
  def hide
@@ -53,11 +53,11 @@ module Glimmer
53
53
  end
54
54
 
55
55
  def selector
56
- super + ' .close'
56
+ super + ' .close'
57
57
  end
58
58
 
59
59
  def listener_path
60
- path + ' .close'
60
+ path + ' .close'
61
61
  end
62
62
 
63
63
  def observation_request_to_event_mapping
@@ -66,7 +66,7 @@ module Glimmer
66
66
  event: 'click'
67
67
  },
68
68
  }
69
- end
69
+ end
70
70
 
71
71
  def style_dom_modal_css
72
72
  <<~CSS
@@ -119,11 +119,11 @@ module Glimmer
119
119
  modal_text = text
120
120
  modal_message = message
121
121
  modal_class = ['modal', name].join(' ')
122
- @dom ||= html {
122
+ @dom ||= html {
123
123
  div(id: modal_id, style: modal_style, class: modal_class) {
124
124
  style(class: 'modal-style') {
125
125
  style_dom_modal_css #.split("\n").map(&:strip).join(' ')
126
- }
126
+ }
127
127
  div(class: 'modal-content') {
128
128
  header(class: 'text') {
129
129
  modal_text
@@ -3,6 +3,7 @@ require 'glimmer/swt/widget_proxy'
3
3
  module Glimmer
4
4
  module SWT
5
5
  class RadioProxy < WidgetProxy
6
+ # TODO add a create method that ensures passing :radio style in if not there
6
7
  STYLE=<<~CSS
7
8
  .radio {
8
9
  display: inline;
@@ -2,7 +2,7 @@ require 'glimmer/swt/widget_proxy'
2
2
 
3
3
  module Glimmer
4
4
  module SWT
5
- class TabFolderProxy < WidgetProxy
5
+ class TabFolderProxy < WidgetProxy
6
6
  attr_reader :tabs
7
7
 
8
8
  def initialize(parent, args)
@@ -10,9 +10,9 @@ module Glimmer
10
10
  @tabs = []
11
11
  end
12
12
 
13
- def add_child(child)
13
+ def post_initialize_child(child)
14
14
  unless @children.include?(child)
15
- @children << child
15
+ @children << child
16
16
  tabs_dom_element.append(child.tab_dom)
17
17
  child.render
18
18
  end
@@ -16,11 +16,11 @@ module Glimmer
16
16
  end
17
17
 
18
18
  # Only table_columns may be added as children
19
- def add_child(child)
19
+ def post_initialize_child(child)
20
20
  if child.is_a?(TableColumnProxy)
21
21
  @columns << child
22
22
  else
23
- @children << child
23
+ @children << child
24
24
  end
25
25
  child.redraw
26
26
  end
@@ -36,14 +36,14 @@ module Glimmer
36
36
  changed.each(&:redraw)
37
37
  end
38
38
 
39
- def items=(new_items)
39
+ def items=(new_items)
40
40
  @children = new_items
41
41
  redraw
42
42
  end
43
43
 
44
44
  def search(&condition)
45
45
  items.select {|item| condition.nil? || condition.call(item)}
46
- end
46
+ end
47
47
 
48
48
  def index_of(item)
49
49
  items.index(item)
@@ -84,9 +84,9 @@ module Glimmer
84
84
  event.singleton_class.send(:define_method, :column_index) do
85
85
  (table_data || event.target).attr('data-column-index')
86
86
  end
87
- event_listener.call(event)
87
+ event_listener.call(event)
88
88
  }
89
- }
89
+ }
90
90
 
91
91
  {
92
92
  'on_mouse_down' => {
@@ -102,7 +102,7 @@ module Glimmer
102
102
 
103
103
  def redraw
104
104
  super()
105
- @columns.to_a.each(&:redraw)
105
+ @columns.to_a.each(&:redraw)
106
106
  end
107
107
 
108
108
  def element
@@ -125,7 +125,7 @@ module Glimmer
125
125
  Document.find(items_path)
126
126
  end
127
127
 
128
- def columns_dom
128
+ def columns_dom
129
129
  tr {
130
130
  }
131
131
  end
@@ -134,9 +134,9 @@ module Glimmer
134
134
  thead {
135
135
  columns_dom
136
136
  }
137
- end
137
+ end
138
138
 
139
- def items_dom
139
+ def items_dom
140
140
  tbody {
141
141
  }
142
142
  end
@@ -21,12 +21,12 @@ module Glimmer
21
21
  event_handler: -> (event_listener) {
22
22
  -> (event) {
23
23
  @text = event.target.value
24
- event_listener.call(event)
24
+ event_listener.call(event)
25
25
  }
26
26
  }
27
27
  }
28
28
  }
29
- end
29
+ end
30
30
 
31
31
  def dom
32
32
  text_text = @text
@@ -35,7 +35,7 @@ module Glimmer
35
35
  # Factory Method that translates a Glimmer DSL keyword into a WidgetProxy object
36
36
  def for(keyword, parent, args)
37
37
  the_widget_class = widget_class(keyword)
38
- the_widget_class.respond_to?(:create) ? the_widget_class.create(parent, args) : the_widget_class.new(parent, args)
38
+ the_widget_class.respond_to?(:create) ? the_widget_class.create(keyword, parent, args) : the_widget_class.new(parent, args)
39
39
  end
40
40
 
41
41
  def widget_class(keyword)
@@ -103,7 +103,18 @@ module Glimmer
103
103
  @children = Set.new # TODO consider moving to composite
104
104
  @enabled = true
105
105
  DEFAULT_INITIALIZERS[self.class.underscored_widget_name(self)]&.call(self)
106
- @parent.add_child(self) # TODO rename to post_initialize_child to be closer to glimmer-dsl-swt terminology
106
+ @parent.post_initialize_child(self) # TODO rename to post_initialize_child to be closer to glimmer-dsl-swt terminology
107
+ end
108
+
109
+ # Executes for the parent of a child that just got added
110
+ def post_initialize_child(child)
111
+ @children << child
112
+ child.render
113
+ end
114
+
115
+ # Executes at the closing of a parent widget curly braces after all children/properties have been added/set
116
+ def post_add_content
117
+ # No Op by default
107
118
  end
108
119
 
109
120
  def css_classes
@@ -123,11 +134,6 @@ module Glimmer
123
134
  'div'
124
135
  end
125
136
 
126
- def add_child(child)
127
- @children << child
128
- child.render
129
- end
130
-
131
137
  def enabled=(value)
132
138
  @enabled = value
133
139
  dom_element.prop('disabled', !@enabled)
@@ -248,6 +254,8 @@ module Glimmer
248
254
  Document.find(path)
249
255
  end
250
256
 
257
+ # TODO consider adding a default #dom method implementation for the common case, automatically relying on #element and other methods to build the dom html
258
+
251
259
  def style_element
252
260
  style_element_id = "#{id}-style"
253
261
  style_element_selector = "style##{style_element_id}"
@@ -458,6 +466,13 @@ module Glimmer
458
466
  # }
459
467
  # end,
460
468
  # },
469
+ DateTimeProxy => { #radio?
470
+ :date_time => lambda do |observer|
471
+ on_widget_selected { |selection_event|
472
+ observer.call(date_time)
473
+ }
474
+ end
475
+ },
461
476
  RadioProxy => { #radio?
462
477
  :selection => lambda do |observer|
463
478
  on_widget_selected { |selection_event|
@@ -491,6 +506,7 @@ require 'glimmer/swt/button_proxy'
491
506
  require 'glimmer/swt/combo_proxy'
492
507
  require 'glimmer/swt/checkbox_proxy'
493
508
  require 'glimmer/swt/composite_proxy'
509
+ require 'glimmer/swt/date_time_proxy'
494
510
  require 'glimmer/swt/group_proxy'
495
511
  require 'glimmer/swt/label_proxy'
496
512
  require 'glimmer/swt/list_proxy'