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

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 (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