coprl 3.0.0.beta.2 → 3.0.0.beta.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +9 -15
  3. data/CHANGELOG.md +57 -0
  4. data/Gemfile +12 -1
  5. data/Gemfile.lock +105 -36
  6. data/README.md +3 -3
  7. data/app/demo/components/dialogs.pom +1 -1
  8. data/app/demo/components/nav/menu.pom +0 -1
  9. data/app/demo/components/snackbar.pom +9 -3
  10. data/app/demo/events/content_as_form.pom +3 -3
  11. data/app/demo/events/halted.pom +23 -0
  12. data/app/demo/events/nav/drawer.pom +1 -1
  13. data/app/demo/events/tagged_input.pom +2 -2
  14. data/app/demo/patterns/search_select.pom +1 -1
  15. data/app/demo/plugins/animate.pom +144 -0
  16. data/app/demo/plugins/cacheable.pom +64 -0
  17. data/app/demo/plugins/clipboard.pom +21 -0
  18. data/app/demo/plugins/color_picker.pom +17 -0
  19. data/app/demo/plugins/google_maps.pom +24 -0
  20. data/app/demo/plugins/iframe.pom +14 -0
  21. data/app/demo/plugins/image_crop.pom +1 -1
  22. data/app/demo/plugins/markup.pom +14 -0
  23. data/app/demo/plugins/nav/drawer.pom +1 -1
  24. data/app/demo/plugins/script.pom +17 -0
  25. data/app/demo/plugins/scroll_to.pom +22 -0
  26. data/app/demo/plugins/timer.pom +24 -0
  27. data/app/demo/shared/context_list.pom +1 -1
  28. data/config.ru +15 -1
  29. data/coprl.gemspec +1 -2
  30. data/lib/coprl/presenters/cli.rb +10 -0
  31. data/lib/coprl/presenters/dsl/components/actions/base.rb +5 -1
  32. data/lib/coprl/presenters/dsl/components/base.rb +6 -4
  33. data/lib/coprl/presenters/dsl/components/event.rb +6 -1
  34. data/lib/coprl/presenters/dsl/components/multi_select.rb +3 -3
  35. data/lib/coprl/presenters/dsl/components/table.rb +2 -2
  36. data/lib/coprl/presenters/dsl/definition.rb +2 -2
  37. data/lib/coprl/presenters/dsl/user_interface.rb +2 -2
  38. data/lib/coprl/presenters/generators/plugin.rb +21 -6
  39. data/lib/coprl/presenters/generators/templates/plugin/.github/workflows/semantic-release.yml +41 -0
  40. data/lib/coprl/presenters/generators/templates/plugin/.releaserc +15 -0
  41. data/lib/coprl/presenters/generators/templates/plugin/.ruby-version +1 -0
  42. data/lib/coprl/presenters/generators/templates/plugin/README.md.tt +34 -0
  43. data/lib/coprl/presenters/generators/templates/plugin/demo/plugin.pom.tt +15 -0
  44. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/components/actions/dsl.rb.tt +1 -1
  45. data/lib/coprl/presenters/generators/templates/plugin/lib/coprl/presenters/plugins/version.rb.tt +3 -0
  46. data/lib/coprl/presenters/generators/templates/plugin/presenter_plugin.gemspec.tt +8 -7
  47. data/lib/coprl/presenters/generators/templates/plugin/views/components/application/component.erb.tt +1 -1
  48. data/lib/coprl/presenters/helpers/rails.rb +1 -4
  49. data/lib/coprl/presenters/helpers/rails/routes.rb +14 -0
  50. data/lib/coprl/presenters/rails/concerns/coprl_partial.rb +51 -0
  51. data/lib/coprl/presenters/rails/engine.rb +5 -0
  52. data/lib/coprl/presenters/rails/railtie.rb +6 -14
  53. data/lib/coprl/presenters/rails/reloader.rb +15 -0
  54. data/lib/coprl/presenters/settings.rb +1 -1
  55. data/lib/coprl/presenters/version.rb +1 -1
  56. data/lib/coprl/presenters/web_client/helpers/headers.rb +8 -6
  57. data/lib/coprl/presenters/web_client/helpers/rails.rb +1 -0
  58. data/lib/coprl/presenters/web_client/helpers/rails/template_helper.rb +10 -0
  59. data/lib/coprl/presenters/web_client/helpers/sinatra.rb +1 -0
  60. data/lib/coprl/presenters/web_client/helpers/sinatra/template_helper.rb +20 -0
  61. data/lib/coprl/presenters/web_client/plugin_views_path.rb +5 -5
  62. data/public/bundle.js +10 -4
  63. data/public/wc.js +10 -4
  64. data/rails-engine/app/controllers/coprl_controller.rb +1 -1
  65. data/rails-engine/app/views/layouts/coprl.html.erb +4 -4
  66. data/rails-engine/config/initializers/presenters.rb +4 -2
  67. data/rails-engine/config/initializers/routes.rb +5 -0
  68. data/rails-engine/config/initializers/session.rb +8 -0
  69. data/views/mdc/assets/js/components/events/posts.js +10 -6
  70. data/views/mdc/body/{_preamble.erb → _wrapper.erb} +16 -5
  71. data/views/mdc/components/_card.erb +2 -2
  72. data/views/mdc/components/_checkbox.erb +1 -1
  73. data/views/mdc/components/_chip.erb +2 -2
  74. data/views/mdc/components/_content.erb +2 -2
  75. data/views/mdc/components/_datetime.erb +1 -1
  76. data/views/mdc/components/_dialog.erb +2 -2
  77. data/views/mdc/components/_form.erb +2 -2
  78. data/views/mdc/components/_grid.erb +2 -2
  79. data/views/mdc/components/_hidden_field.erb +1 -1
  80. data/views/mdc/components/_multi_select.erb +1 -1
  81. data/views/mdc/components/_number_field.erb +1 -1
  82. data/views/mdc/components/_radio_button.erb +1 -1
  83. data/views/mdc/components/_rich_text_area.erb +1 -1
  84. data/views/mdc/components/_select.erb +1 -1
  85. data/views/mdc/components/_slider.erb +2 -2
  86. data/views/mdc/components/_stepper.erb +4 -4
  87. data/views/mdc/components/_switch.erb +1 -1
  88. data/views/mdc/components/_text_area.erb +1 -1
  89. data/views/mdc/components/_text_field.erb +1 -1
  90. data/views/mdc/components/buttons/_image.erb +1 -1
  91. data/views/mdc/components/unordered_list/_list_item.erb +3 -3
  92. data/views/mdc/layout.erb +4 -4
  93. metadata +33 -30
  94. data/app/demo/components/google_maps.pom +0 -22
  95. data/app/demo/components/snackbar_attached.pom +0 -6
  96. data/lib/coprl/presenters/generators/templates/plugin/README.md +0 -253
  97. data/lib/coprl/presenters/plugins/google_maps.rb +0 -24
  98. data/lib/coprl/presenters/plugins/google_maps/google_map.erb +0 -10
  99. data/lib/coprl/presenters/plugins/google_maps/google_map.rb +0 -41
  100. data/views/mdc/body/_postamble.erb +0 -17
@@ -0,0 +1,23 @@
1
+ Coprl::Presenters.define(:halted) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :events_drawer
5
+
6
+ indented_grid do
7
+ display 'Halted Events'
8
+ body 'This demonstrates how to respond to failed, or halted events'
9
+
10
+ content do
11
+ button :failed_post do
12
+ event :click do
13
+ posts '_echo_', status: 500
14
+ end
15
+ event 'V:eventsHalted' do
16
+ snackbar 'That did not work! Please try again later.'
17
+ end
18
+ end
19
+
20
+ end
21
+ end
22
+ attach :code, file: __FILE__
23
+ end
@@ -1,7 +1,7 @@
1
1
  Coprl::Presenters.define(:events_drawer) do
2
2
  helpers Coprl::Presenters::Helpers::Inflector
3
3
 
4
- events = %i[field_level_events form_level_events tagged_input parallel_events].sort
4
+ events = %i[field_level_events form_level_events tagged_input parallel_events halted].sort
5
5
  actions = %i[dialog replaces loads toggle_visibility snackbar updates deletes posts clear last_response prompt_if_dirty].sort
6
6
 
7
7
  drawer 'Events' do
@@ -18,11 +18,11 @@ Coprl::Presenters.define(:tagged_input) do
18
18
 
19
19
  title 'Example'
20
20
 
21
- content tag: :somefields do
21
+ content input_tag: :somefields do
22
22
  radio_button text: :on, name: :check_me, value: :on, checked: true
23
23
  radio_button text: :off, name: :check_me, value: :off
24
24
  end
25
- text_field name: :myfield2, tag: :somefields do
25
+ text_field name: :myfield2, input_tag: :somefields do
26
26
  label 'More Data to post'
27
27
  end
28
28
 
@@ -21,7 +21,7 @@ Coprl::Presenters.define(:search_select) do
21
21
 
22
22
  page_title 'Search and Select Pattern'
23
23
  indented_grid do
24
- grid tag: :input_data_container do
24
+ grid input_tag: :input_data_container do
25
25
  column 6 do
26
26
  grid do
27
27
  column 4 do
@@ -0,0 +1,144 @@
1
+ Coprl::Presenters.define(:animate, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :animate, :scroll_to
6
+ page_title 'Animate', id: :page_title
7
+
8
+ indented_grid do
9
+ grid do
10
+ column 4 do
11
+ heading "Animations plugin", id: :animate_heading
12
+ subheading "Just-add-POM CSS animations"
13
+ body "It is based on [animate.css](https://animate.style/)."
14
+ end
15
+ column 8 do
16
+ [["Attention seekers",
17
+ %i( bounce
18
+ flash
19
+ pulse
20
+ rubber_band
21
+ shake_x
22
+ shake_y
23
+ head_shake
24
+ swing
25
+ tada
26
+ wobble
27
+ jello
28
+ heart_beat)],
29
+ ["Back entrances",
30
+ %i( back_in_down
31
+ back_in_left
32
+ back_in_right
33
+ back_in_up)],
34
+ ["Back exits",
35
+ %i( back_out_down
36
+ back_out_left
37
+ back_out_right
38
+ back_out_up)],
39
+ ["Bouncing entrances",
40
+ %i( bounce_in
41
+ bounce_in_down
42
+ bounce_in_left
43
+ bounce_in_right
44
+ bounce_in_up)],
45
+ ["Bouncing exits",
46
+ %i( bounce_out
47
+ bounce_out_down
48
+ bounce_out_left
49
+ bounce_out_right
50
+ bounce_out_up)],
51
+ ["Fading entrances",
52
+ %i( fade_in
53
+ fade_in_down
54
+ fade_in_down_big
55
+ fade_in_left
56
+ fade_in_left_big
57
+ fade_in_right
58
+ fade_in_right_big
59
+ fade_in_up
60
+ fade_in_up_big
61
+ fade_in_top_left
62
+ fade_in_top_right
63
+ fade_in_bottom_left
64
+ fade_in_bottom_right)],
65
+ ["Fading exits",
66
+ %i( fade_out
67
+ fade_out_down
68
+ fade_out_down_big
69
+ fade_out_left
70
+ fade_out_left_big
71
+ fade_out_right
72
+ fade_out_right_big
73
+ fade_out_up
74
+ fade_out_up_big
75
+ fade_out_top_left
76
+ fade_out_top_right
77
+ fade_out_bottom_right
78
+ fade_out_bottom_left)],
79
+ ["Flippers",
80
+ %i( flip
81
+ flip_in_x
82
+ flip_in_y
83
+ flip_out_x
84
+ flip_out_y)],
85
+ ["lightspeed",
86
+ %i( light_speed_in_right
87
+ light_speed_in_left
88
+ light_speed_out_right
89
+ light_speed_out_left)],
90
+ ["Rotating entrances",
91
+ %i( rotate_in
92
+ rotate_in_down_left
93
+ rotate_in_down_right
94
+ rotate_in_up_left
95
+ rotate_in_up_right)],
96
+ ["Rotating exits",
97
+ %i( rotate_out
98
+ rotate_out_down_left
99
+ rotate_out_down_right
100
+ rotate_out_up_left
101
+ rotate_out_up_right)],
102
+ ["Specials",
103
+ %i( hinge
104
+ jack_in_the_box
105
+ roll_in
106
+ roll_out)],
107
+ ["Zooming entrances",
108
+ %i( zoom_in
109
+ zoom_in_down
110
+ zoom_in_left
111
+ zoom_in_right
112
+ zoom_in_up)],
113
+ ["Zooming exits",
114
+ %i( zoom_out
115
+ zoom_out_down
116
+ zoom_out_left
117
+ zoom_out_right
118
+ zoom_out_up)],
119
+ ["Sliding entrances",
120
+ %i( slide_in_down
121
+ slide_in_left
122
+ slide_in_right
123
+ slide_in_up)],
124
+ ["Sliding exits",
125
+ %i( slide_out_down
126
+ slide_out_left
127
+ slide_out_right
128
+ slide_out_up)]].each do |animiation_title, animiations|
129
+ subtitle animiation_title
130
+ animiations.each do |animation|
131
+ button animation do
132
+ event :click do
133
+ scroll_to :page_title
134
+ animate :animate_heading, animation, wait: true
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ attach :code, file: __FILE__
143
+ end
144
+ end
@@ -0,0 +1,64 @@
1
+ require 'ostruct'
2
+
3
+ Coprl::Presenters.define(:cacheable, namespace: :plugins) do
4
+ helpers Demo::Helpers::IndentedGrid
5
+ attach :top_nav
6
+ attach :plugin_drawer
7
+ plugin :cacheable
8
+
9
+ page_title 'Cacheable'
10
+
11
+ helpers do
12
+ def cache_object
13
+ OpenStruct.new(cache_key: 'wild')
14
+ end
15
+
16
+ def cache_objects
17
+ [
18
+ OpenStruct.new(cache_key: 'abc'),
19
+ OpenStruct.new(cache_key: '123'),
20
+ ]
21
+ end
22
+ end
23
+
24
+ indented_grid do
25
+ body <<~DOC
26
+ The caching plugin provides russian doll caching support.
27
+ Declare the plugin in your pom, `plugin :cacheable`, or configure it globally:
28
+
29
+ ```
30
+ Coprl::Presenters::Settings.configure do |config|
31
+ config.presenters.plugins.push(:cacheable)
32
+ end
33
+ ```
34
+
35
+ For Rails it automatically uses the Rails::Cache. For other Rack apps you need to configure it with a block:
36
+
37
+ ```
38
+ Coprl::Presenters::Plugins::Cacheable::Settings.configure do |config|
39
+ # A cache needs to respond to fetch(key, &block) and exist?(key) or has_key?(key)
40
+ config.cache=cache_store
41
+ end
42
+ ```
43
+ Simply wrap your POM with the cache directive.
44
+ Complex keys are supported. If an object responds to `cache_key` then that will be used for it.
45
+ An object that responds to `map` will be expanded. As a last resort `to_s` is used.
46
+
47
+ Examples (refresh your browser to observe cached values):
48
+ DOC
49
+ title "Not cached at #{DateTime.now}"
50
+ cache :remember_me do
51
+ title "Simple Cache Key - cached at #{DateTime.now}"
52
+ end
53
+
54
+ cache [:title, cache_object, cache_objects] do
55
+ title "Complex Cache Key - cached at #{DateTime.now}"
56
+ end
57
+ blank
58
+ body <<~DOC
59
+ Note: Confusion alert ... if you are using shotgun for the demo, it **will not cache**, since the demo uses an in memory cache and shotgun reloads its entire process with each refresh.
60
+ DOC
61
+
62
+ end
63
+ attach :code, file: __FILE__
64
+ end
@@ -0,0 +1,21 @@
1
+ Coprl::Presenters.define(:clipboard, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :clipboard
6
+ page_title 'Clipboard'
7
+
8
+ indented_grid do
9
+ headline 'Copy'
10
+ text_field id: :copy_me do
11
+ value "Don't copy that floppy!"
12
+ end
13
+ button :copy, type: :raised do
14
+ event :click do
15
+ clipboard copy: :copy_me
16
+ end
17
+ end
18
+ end
19
+
20
+ attach :code, file: __FILE__
21
+ end
@@ -0,0 +1,17 @@
1
+ Coprl::Presenters.define(:color_picker, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :color_picker
6
+ page_title 'Color picker'
7
+
8
+ indented_grid do
9
+ subheading 'Add a Color picker to your page'
10
+ color_picker 'color',
11
+ value: '#f44336',
12
+ color_per_row: 7,
13
+ color_size: 25
14
+
15
+ attach :code, file: __FILE__
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ Coprl::Presenters.define(:google_maps, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :google_maps
6
+ page_title 'Maps'
7
+
8
+ indented_grid do
9
+ unless ENV['GOOGLE_API_KEY']
10
+ headline 'You must define the ENV variable GOOGLE_API_KEY for this to render a map'
11
+ subtitle 'Dev hint: Create an .env file with a `GOOGLE_API_KEY=yourkey` and restart. Goto [Google Using API Keys](https://developers.google.com/maps/documentation/javascript/get-api-key) to create a key.'
12
+ end
13
+ subheading 'Static Maps'
14
+ address = '125 Park Street, Traverse City, MI'
15
+ google_map address: address, height: "300px", width: "400px" do
16
+ event :click do
17
+ loads "https://www.google.com/maps/place/#{address}"
18
+ end
19
+ end
20
+
21
+ attach :code, file: __FILE__
22
+ end
23
+
24
+ end
@@ -0,0 +1,14 @@
1
+ Coprl::Presenters.define(:iframe, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :iframe
6
+ page_title 'Iframe'
7
+
8
+
9
+ indented_grid do
10
+ subheading 'Embed an iFrame'
11
+ iframe 'https://en.wikipedia.org/wiki/Special:Random', height: "500px",scrolling: :yes # | :no (default)
12
+ attach :code, file: __FILE__
13
+ end
14
+ end
@@ -20,7 +20,7 @@ Coprl::Presenters.define(:image_crop, namespace: :plugins) do
20
20
  grid do
21
21
  column 12 do
22
22
  card do
23
- text 'Drop it here'
23
+ text 'Drop an image or click'
24
24
  button icon: :cloud_upload
25
25
  end
26
26
  end
@@ -0,0 +1,14 @@
1
+ Coprl::Presenters.define(:markup, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :markup
6
+ page_title 'Markup'
7
+
8
+
9
+ indented_grid do
10
+ markup "<h1>Hello Cruel World</h1>"
11
+
12
+ attach :code, file: __FILE__
13
+ end
14
+ end
@@ -7,7 +7,7 @@ Coprl::Presenters.define(:plugin_drawer, namespace: :plugins) do
7
7
  loads :index
8
8
  end
9
9
  end
10
- %i(image_crop chart).sort.each do |comp|
10
+ %i(image_crop chart google_maps cacheable script scroll_to clipboard markup iframe color_picker timer animate).sort.each do |comp|
11
11
  item titleize(comp) do
12
12
  event :click do
13
13
  loads comp
@@ -0,0 +1,17 @@
1
+ Coprl::Presenters.define(:script, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :script
6
+ page_title 'Script'
7
+
8
+ script inline: <<~JAVASCRIPT
9
+ alert( 'Hello, world!' );
10
+ JAVASCRIPT
11
+ indented_grid do
12
+ subheading 'You can write arbitrary javascript using the script component. For example, the alert you just dismissed.'
13
+
14
+ attach :code, file: __FILE__
15
+ end
16
+
17
+ end
@@ -0,0 +1,22 @@
1
+ Coprl::Presenters.define(:scroll_to, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :scroll_to
6
+ page_title 'Scroll to'
7
+
8
+ indented_grid do
9
+ subheading 'Sometimes you need to scroll to find content after some action. This is what the scroll to plugin is for.'
10
+ button :scroll do
11
+ event :click do
12
+ scroll_to :scroll_target #, smooth: true, offset: 100
13
+ end
14
+ end
15
+ (1..100).each do
16
+ body '.'
17
+ end
18
+ title 'Thanks for scrolling here', id: :scroll_target
19
+
20
+ attach :code, file: __FILE__
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ Coprl::Presenters.define(:timer, namespace: :plugins) do
2
+ helpers Demo::Helpers::IndentedGrid
3
+ attach :top_nav
4
+ attach :plugin_drawer
5
+ plugin :timer
6
+ page_title 'Timer'
7
+
8
+ indented_grid do
9
+ subheading 'Using an expiration timer'
10
+
11
+ count_down_timer DateTime.now + + Rational(130, 60 * 60 * 24), # add 2 minutes and 10 seconds
12
+ expired_message: 'Something important (shoping cart for example) has Expired',
13
+ safe_color: 'green',
14
+ warn_color: 'red',
15
+ delete_url: 'TODO', # TODO URL to delete something on expiration
16
+ delete_params: {}, # parmeters to pass on expiration
17
+ redirect_url: 'TODO', # Where to redirect after delete?
18
+ redirect_params: {} do
19
+ icon 'fas fa-stopwatch', color: :white
20
+ end
21
+
22
+ attach :code, file: __FILE__
23
+ end
24
+ end