matestack-ui-core 0.7.2.1 → 1.0.0.rc.1
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.
- checksums.yaml +4 -4
- data/LICENSE +8 -0
- data/README.md +28 -204
- data/Rakefile +32 -0
- data/app/concepts/matestack/ui/core/abbr/abbr.haml +2 -2
- data/app/concepts/matestack/ui/core/abbr/abbr.rb +3 -2
- data/app/concepts/matestack/ui/core/action/action.js +114 -11
- data/app/concepts/matestack/ui/core/action/action.rb +41 -13
- data/app/concepts/matestack/ui/core/{component/response_dynamic.haml → actionview/dynamic.haml} +2 -3
- data/app/concepts/matestack/ui/core/actionview/dynamic.rb +28 -0
- data/app/concepts/matestack/ui/core/{component → actionview}/static.haml +0 -0
- data/app/concepts/matestack/ui/core/actionview/static.rb +28 -0
- data/app/concepts/matestack/ui/core/address/address.haml +2 -2
- data/app/concepts/matestack/ui/core/address/address.rb +1 -1
- data/app/concepts/matestack/ui/core/app/app.haml +2 -3
- data/app/concepts/matestack/ui/core/app/app.js +18 -4
- data/app/concepts/matestack/ui/core/app/app.rb +34 -81
- data/app/concepts/matestack/ui/core/app/location.js +9 -0
- data/app/concepts/matestack/ui/core/app/store.js +35 -6
- data/app/concepts/matestack/ui/core/area/area.haml +1 -0
- data/app/concepts/matestack/ui/core/area/area.rb +20 -0
- data/app/concepts/matestack/ui/core/aside/aside.haml +3 -0
- data/app/concepts/matestack/ui/core/aside/aside.rb +5 -0
- data/app/concepts/matestack/ui/core/async/async.haml +6 -2
- data/app/concepts/matestack/ui/core/async/async.js +64 -8
- data/app/concepts/matestack/ui/core/async/async.rb +29 -4
- data/app/concepts/matestack/ui/core/async/children_wrapper.haml +2 -0
- data/app/concepts/matestack/ui/core/{pg/pg.haml → b/b.haml} +1 -1
- data/app/concepts/matestack/ui/core/b/b.rb +5 -0
- data/app/concepts/matestack/ui/core/bdi/bdi.haml +5 -0
- data/app/concepts/matestack/ui/core/bdi/bdi.rb +4 -0
- data/app/concepts/matestack/ui/core/bdo/bdo.haml +5 -0
- data/app/concepts/matestack/ui/core/bdo/bdo.rb +11 -0
- data/app/concepts/matestack/ui/core/cite/cite.haml +5 -0
- data/app/concepts/matestack/ui/core/cite/cite.rb +5 -0
- data/app/concepts/matestack/ui/core/code/code.haml +5 -0
- data/app/concepts/matestack/ui/core/code/code.rb +5 -0
- data/app/concepts/matestack/ui/core/collection/content/content.js +4 -4
- data/app/concepts/matestack/ui/core/collection/content/content.rb +2 -2
- data/app/concepts/matestack/ui/core/collection/content/page/link/link.rb +4 -2
- data/app/concepts/matestack/ui/core/collection/filter/filter.js +3 -3
- data/app/concepts/matestack/ui/core/collection/filter/filter.rb +4 -5
- data/app/concepts/matestack/ui/core/collection/filter/select/select.haml +10 -0
- data/app/concepts/matestack/ui/core/collection/filter/select/select.rb +29 -0
- data/app/concepts/matestack/ui/core/collection/helper.rb +14 -6
- data/app/concepts/matestack/ui/core/collection/order/order.js +4 -4
- data/app/concepts/matestack/ui/core/collection/order/order.rb +4 -5
- data/app/concepts/matestack/ui/core/collection/order/toggle/indicator/indicator.rb +6 -5
- data/app/concepts/matestack/ui/core/component/anonym-dynamic-component.js +1 -1
- data/app/concepts/matestack/ui/core/component/base.rb +424 -0
- data/app/concepts/matestack/ui/core/component/children.haml +2 -2
- data/app/concepts/matestack/ui/core/component/component.js +1 -55
- data/app/concepts/matestack/ui/core/component/dynamic.haml +1 -1
- data/app/concepts/matestack/ui/core/component/dynamic.rb +24 -239
- data/app/concepts/matestack/ui/core/component/rerender.rb +8 -0
- data/app/concepts/matestack/ui/core/component/static.rb +3 -12
- data/app/concepts/matestack/ui/core/data/data.haml +5 -0
- data/app/concepts/matestack/ui/core/data/data.rb +9 -0
- data/app/concepts/matestack/ui/core/datalist/datalist.haml +3 -0
- data/app/concepts/matestack/ui/core/datalist/datalist.rb +5 -0
- data/app/concepts/matestack/ui/core/dd/dd.haml +5 -0
- data/app/concepts/matestack/ui/core/dd/dd.rb +5 -0
- data/app/concepts/matestack/ui/core/del/del.haml +5 -0
- data/app/concepts/matestack/ui/core/del/del.rb +4 -0
- data/app/concepts/matestack/ui/core/dfn/dfn.haml +5 -0
- data/app/concepts/matestack/ui/core/dfn/dfn.rb +6 -0
- data/app/concepts/matestack/ui/core/dialog/dialog.haml +5 -0
- data/app/concepts/matestack/ui/core/dialog/dialog.rb +9 -0
- data/app/concepts/matestack/ui/core/dl/dl.haml +5 -0
- data/app/concepts/matestack/ui/core/dl/dl.rb +5 -0
- data/app/concepts/matestack/ui/core/dt/dt.haml +5 -0
- data/app/concepts/matestack/ui/core/dt/dt.rb +5 -0
- data/app/concepts/matestack/ui/core/em/em.haml +5 -0
- data/app/concepts/matestack/ui/core/em/em.rb +5 -0
- data/app/concepts/matestack/ui/core/fieldset/fieldset.haml +5 -0
- data/app/concepts/matestack/ui/core/fieldset/fieldset.rb +9 -0
- data/app/concepts/matestack/ui/core/figure/figure.haml +3 -0
- data/app/concepts/matestack/ui/core/figure/figure.rb +5 -0
- data/app/concepts/matestack/ui/core/form/checkbox/checkbox.rb +79 -0
- data/app/concepts/matestack/ui/core/form/form.js +266 -96
- data/app/concepts/matestack/ui/core/form/form.rb +29 -2
- data/app/concepts/matestack/ui/core/form/has_errors.rb +54 -0
- data/app/concepts/matestack/ui/core/form/has_input_html_attributes.rb +13 -0
- data/app/concepts/matestack/ui/core/form/input/input.rb +39 -52
- data/app/concepts/matestack/ui/core/form/radio/radio.rb +71 -0
- data/app/concepts/matestack/ui/core/form/select/select.haml +9 -76
- data/app/concepts/matestack/ui/core/form/select/select.rb +64 -49
- data/app/concepts/matestack/ui/core/form/submit/submit.rb +4 -1
- data/app/concepts/matestack/ui/core/form/textarea/textarea.rb +28 -0
- data/app/concepts/matestack/ui/core/form/utils.rb +47 -0
- data/app/concepts/matestack/ui/core/heading/heading.rb +2 -0
- data/app/concepts/matestack/ui/core/iframe/iframe.haml +5 -0
- data/app/concepts/matestack/ui/core/iframe/iframe.rb +14 -0
- data/app/concepts/matestack/ui/core/img/img.rb +1 -0
- data/app/concepts/matestack/ui/core/input/input.haml +1 -3
- data/app/concepts/matestack/ui/core/input/input.rb +8 -0
- data/app/concepts/matestack/ui/core/ins/ins.haml +5 -0
- data/app/concepts/matestack/ui/core/ins/ins.rb +10 -0
- data/app/concepts/matestack/ui/core/isolated/children_wrapper.haml +2 -0
- data/app/concepts/matestack/ui/core/isolated/isolated.haml +10 -0
- data/app/concepts/matestack/ui/core/isolated/isolated.js +108 -0
- data/app/concepts/matestack/ui/core/isolated/isolated.rb +59 -0
- data/app/concepts/matestack/ui/core/js/core.js +43 -19
- data/app/concepts/matestack/ui/core/kbd/kbd.haml +5 -0
- data/app/concepts/matestack/ui/core/kbd/kbd.rb +4 -0
- data/app/concepts/matestack/ui/core/label/label.rb +6 -1
- data/app/concepts/matestack/ui/core/legend/legend.haml +5 -0
- data/app/concepts/matestack/ui/core/legend/legend.rb +5 -0
- data/app/concepts/matestack/ui/core/link/link.rb +7 -6
- data/app/concepts/matestack/ui/core/{absolute/absolute.haml → map/map.haml} +1 -1
- data/app/concepts/matestack/ui/core/map/map.rb +11 -0
- data/app/concepts/matestack/ui/core/mark/mark.haml +5 -0
- data/app/concepts/matestack/ui/core/mark/mark.rb +4 -0
- data/app/concepts/matestack/ui/core/meter/meter.haml +4 -0
- data/app/concepts/matestack/ui/core/meter/meter.rb +14 -0
- data/app/concepts/matestack/ui/core/noscript/noscript.haml +5 -0
- data/app/concepts/matestack/ui/core/noscript/noscript.rb +5 -0
- data/app/concepts/matestack/ui/core/object/object.haml +1 -0
- data/app/concepts/matestack/ui/core/object/object.rb +15 -0
- data/app/concepts/matestack/ui/core/onclick/onclick.js +2 -3
- data/app/concepts/matestack/ui/core/onclick/onclick.rb +1 -0
- data/app/concepts/matestack/ui/core/optgroup/optgroup.haml +3 -0
- data/app/concepts/matestack/ui/core/optgroup/optgroup.rb +10 -0
- data/app/concepts/matestack/ui/core/option/option.haml +5 -0
- data/app/concepts/matestack/ui/core/option/option.rb +12 -0
- data/app/concepts/matestack/ui/core/output/output.haml +5 -0
- data/app/concepts/matestack/ui/core/output/output.rb +11 -0
- data/app/concepts/matestack/ui/core/page/{content.js → content/content.js} +8 -2
- data/app/concepts/matestack/ui/core/page/content/content.rb +29 -0
- data/app/concepts/matestack/ui/core/page/page.haml +3 -9
- data/app/concepts/matestack/ui/core/page/page.rb +15 -160
- data/app/concepts/matestack/ui/core/param/param.haml +1 -0
- data/app/concepts/matestack/ui/core/param/param.rb +10 -0
- data/app/concepts/matestack/ui/core/picture/picture.haml +3 -0
- data/app/concepts/matestack/ui/core/picture/picture.rb +4 -0
- data/app/concepts/matestack/ui/core/plain/plain.rb +1 -1
- data/app/concepts/matestack/ui/core/pre/pre.haml +5 -0
- data/app/concepts/matestack/ui/core/pre/pre.rb +5 -0
- data/app/concepts/matestack/ui/core/progress/progress.rb +1 -1
- data/app/concepts/matestack/ui/core/q/q.haml +5 -0
- data/app/concepts/matestack/ui/core/q/q.rb +11 -0
- data/app/concepts/matestack/ui/core/rp/rp.haml +5 -0
- data/app/concepts/matestack/ui/core/rp/rp.rb +5 -0
- data/app/concepts/matestack/ui/core/rt/rt.haml +5 -0
- data/app/concepts/matestack/ui/core/rt/rt.rb +5 -0
- data/app/concepts/matestack/ui/core/ruby/ruby.haml +5 -0
- data/app/concepts/matestack/ui/core/ruby/ruby.rb +5 -0
- data/app/concepts/matestack/ui/core/s/s.haml +5 -0
- data/app/concepts/matestack/ui/core/s/s.rb +6 -0
- data/app/concepts/matestack/ui/core/samp/samp.haml +5 -0
- data/app/concepts/matestack/ui/core/samp/samp.rb +4 -0
- data/app/concepts/matestack/ui/core/slot/slot.rb +2 -2
- data/app/concepts/matestack/ui/core/sup/sup.haml +5 -0
- data/app/concepts/matestack/ui/core/sup/sup.rb +5 -0
- data/app/concepts/matestack/ui/core/template/template.haml +3 -0
- data/app/concepts/matestack/ui/core/template/template.rb +4 -0
- data/app/concepts/matestack/ui/core/textarea/textarea.haml +2 -0
- data/app/concepts/matestack/ui/core/textarea/textarea.rb +10 -0
- data/app/concepts/matestack/ui/core/toggle/toggle.haml +2 -0
- data/app/concepts/matestack/ui/core/toggle/toggle.js +71 -0
- data/app/concepts/matestack/ui/core/toggle/toggle.rb +14 -0
- data/app/concepts/matestack/ui/core/transition/transition.js +18 -2
- data/app/concepts/matestack/ui/core/transition/transition.rb +2 -1
- data/app/concepts/matestack/ui/core/u/u.haml +5 -0
- data/app/concepts/matestack/ui/core/u/u.rb +6 -0
- data/app/concepts/matestack/ui/core/unescaped/unescaped.rb +7 -0
- data/app/concepts/matestack/ui/core/var/var.haml +5 -0
- data/app/concepts/matestack/ui/core/var/var.rb +4 -0
- data/app/concepts/matestack/ui/core/video/video.haml +3 -1
- data/app/concepts/matestack/ui/core/video/video.rb +17 -1
- data/app/concepts/matestack/ui/core/view/view.haml +1 -2
- data/app/concepts/matestack/ui/core/view/view.rb +27 -2
- data/app/concepts/matestack/ui/core/wbr/wbr.haml +1 -0
- data/app/concepts/matestack/ui/core/wbr/wbr.rb +4 -0
- data/app/concepts/matestack/ui/core/youtube/youtube.rb +1 -1
- data/app/helpers/matestack/ui/core/application_helper.rb +89 -17
- data/app/javascript/matestack-ui-core/index.js +22 -0
- data/app/javascript/matestack-ui-core/styles/index.scss +5 -0
- data/app/javascript/packs/matestack-ui-core.js +8 -0
- data/app/lib/matestack/ui/component.rb +1 -0
- data/app/lib/matestack/ui/core/has_view_context.rb +14 -0
- data/app/lib/matestack/ui/core/html_attributes.rb +43 -0
- data/app/lib/matestack/ui/core/properties.rb +88 -0
- data/app/lib/matestack/ui/core/rendering/default_renderer_class_determiner.rb +33 -0
- data/app/lib/matestack/ui/core/rendering/main_renderer.rb +199 -0
- data/app/lib/matestack/ui/dynamic_actionview_component.rb +1 -0
- data/app/lib/matestack/ui/isolated_component.rb +1 -0
- data/app/lib/matestack/ui/static_actionview_component.rb +1 -0
- data/app/lib/matestack/ui/vue_js_component.rb +1 -0
- data/config/routes.rb +0 -1
- data/lib/generators/matestack/app/USAGE +21 -0
- data/lib/generators/matestack/app/app_generator.rb +25 -0
- data/lib/generators/{matestack_app/templates/matestack_app_controller.erb → matestack/app/templates/app/controllers/%file_name%_controller.rb.tt} +0 -2
- data/lib/generators/matestack/app/templates/app/matestack/apps/%file_name%.rb.tt +28 -0
- data/lib/generators/matestack/component/USAGE +20 -0
- data/lib/generators/matestack/component/component_generator.rb +29 -0
- data/lib/generators/{matestack_component/templates/matestack_component.haml.erb → matestack/component/templates/app/matestack/components/%namespace%/%file_name%.haml.tt} +0 -0
- data/lib/generators/{matestack_component/templates/matestack_component.js.erb → matestack/component/templates/app/matestack/components/%namespace%/%file_name%.js.tt} +2 -2
- data/lib/generators/matestack/component/templates/app/matestack/components/%namespace%/%file_name%.rb.tt +11 -0
- data/lib/generators/{matestack_component/templates/matestack_component.scss.erb → matestack/component/templates/app/matestack/components/%namespace%/%file_name%.scss.tt} +0 -0
- data/lib/generators/matestack/core/component/USAGE +16 -0
- data/lib/generators/matestack/core/component/component_generator.rb +23 -0
- data/lib/generators/matestack/core/component/templates/app/concepts/matestack/ui/core/%file_name%/%file_name%.haml.tt +5 -0
- data/lib/generators/matestack/core/component/templates/app/concepts/matestack/ui/core/%file_name%/%file_name%.rb.tt +4 -0
- data/lib/generators/matestack/core/component/templates/docs/components/%file_name%.md.tt +45 -0
- data/lib/generators/matestack/core/component/templates/spec/usage/components/%file_name%_spec.rb +31 -0
- data/lib/generators/matestack/page/USAGE +28 -0
- data/lib/generators/matestack/page/page_generator.rb +54 -0
- data/lib/generators/matestack/page/templates/app/matestack/pages/%app_name%/%namespace%/%file_name%.rb.tt +29 -0
- data/lib/matestack/ui/core.rb +5 -2
- data/lib/matestack/ui/core/cell.rb +31 -0
- data/lib/matestack/ui/core/component/registry.rb +47 -0
- data/lib/matestack/ui/core/components.rb +267 -0
- data/lib/matestack/ui/core/dsl.rb +6 -0
- data/lib/matestack/ui/core/engine.rb +16 -0
- data/lib/matestack/ui/core/version.rb +1 -1
- data/vendor/assets/javascripts/dist/manifest.json +18 -0
- data/vendor/assets/javascripts/dist/manifest.json.br +0 -0
- data/vendor/assets/javascripts/dist/manifest.json.gz +0 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.css +3 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.css.map +1 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.js +17060 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.js.map +1 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.min.css +0 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.min.js +3 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.LICENSE.txt +18 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.gz +0 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.map +1 -0
- data/vendor/assets/javascripts/dist/matestack-ui-core.min.js.map.gz +0 -0
- data/vendor/assets/javascripts/matestack-ui-core.js.erb +2 -0
- data/vendor/assets/stylesheets/dist +1 -0
- data/vendor/assets/stylesheets/matestack-ui-core.css.erb +2 -0
- metadata +188 -89
- data/MIT-LICENSE +0 -20
- data/app/concepts/matestack/ui/core/absolute/absolute.rb +0 -17
- data/app/concepts/matestack/ui/core/component/response.haml +0 -2
- data/app/concepts/matestack/ui/core/component/response_dynamic_without_rerender.haml +0 -3
- data/app/concepts/matestack/ui/core/form/inline/inline.haml +0 -6
- data/app/concepts/matestack/ui/core/form/inline/inline.rb +0 -9
- data/app/concepts/matestack/ui/core/form/input/input.haml +0 -27
- data/app/concepts/matestack/ui/core/html/html.haml +0 -3
- data/app/concepts/matestack/ui/core/html/html.js +0 -10
- data/app/concepts/matestack/ui/core/html/html.rb +0 -17
- data/app/concepts/matestack/ui/core/isolate/isolate.haml +0 -2
- data/app/concepts/matestack/ui/core/isolate/isolate.rb +0 -11
- data/app/concepts/matestack/ui/core/page/content.haml +0 -7
- data/app/concepts/matestack/ui/core/page/content.rb +0 -5
- data/app/concepts/matestack/ui/core/pg/pg.rb +0 -5
- data/app/concepts/matestack/ui/core/view/view.js +0 -42
- data/app/lib/matestack/ui/core/app_node.rb +0 -53
- data/app/lib/matestack/ui/core/component_node.rb +0 -73
- data/app/lib/matestack/ui/core/page_node.rb +0 -96
- data/app/lib/matestack/ui/core/to_cell.rb +0 -129
- data/lib/generators/matestack_app/USAGE +0 -21
- data/lib/generators/matestack_app/matestack_app_generator.rb +0 -26
- data/lib/generators/matestack_app/templates/matestack_app.erb +0 -26
- data/lib/generators/matestack_component/USAGE +0 -20
- data/lib/generators/matestack_component/matestack_component_generator.rb +0 -30
- data/lib/generators/matestack_component/templates/matestack_component.rb.erb +0 -13
- data/lib/generators/matestack_page/USAGE +0 -28
- data/lib/generators/matestack_page/matestack_page_generator.rb +0 -41
- data/lib/generators/matestack_page/templates/matestack_page.erb +0 -15
- data/vendor/assets/javascripts/manifest.json +0 -4
- data/vendor/assets/javascripts/matestack-ui-core.js +0 -15309
- data/vendor/assets/javascripts/matestack-ui-core.js.map +0 -1
@@ -0,0 +1 @@
|
|
1
|
+
%wbr{@tag_attributes}
|
@@ -1,34 +1,106 @@
|
|
1
1
|
module Matestack
|
2
2
|
module Ui
|
3
3
|
module Core
|
4
|
+
# We're called ApplicationHelper but all we do so far is rendering.
|
4
5
|
module ApplicationHelper
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
# Allow the definition of a controller wide get_matestack_app_class
|
8
|
+
#
|
9
|
+
# class SomeController < ActionController::Base
|
10
|
+
# matestack_app MyAppClass
|
11
|
+
# #...
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
def self.included(base)
|
15
|
+
base.extend(ClassMethods)
|
11
16
|
end
|
17
|
+
module ClassMethods
|
18
|
+
def matestack_app _class
|
19
|
+
@matestack_app_class = _class
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_matestack_app_class
|
23
|
+
if defined?(@matestack_app_class)
|
24
|
+
@matestack_app_class
|
25
|
+
else
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
12
29
|
|
13
|
-
def render_component(page_class, component_key)
|
14
|
-
page_class.new(nil, context: {
|
15
|
-
params: params,
|
16
|
-
request: request
|
17
|
-
}, controller_instance: self).call(:show, component_key)
|
18
30
|
end
|
19
31
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
32
|
+
# Matestack allows you to use `render` to render matestack pages.
|
33
|
+
#
|
34
|
+
# render Pages::Member::Bookings::Index
|
35
|
+
# render matestack: Pages::Member::Bookings::Index
|
36
|
+
#
|
37
|
+
def render(*args)
|
38
|
+
if (matestack_class = args.first).is_a?(Class) && (matestack_class < Matestack::Ui::Page)
|
39
|
+
options_hash = args[1].is_a?(Hash) ? args[1] : {}
|
40
|
+
Rendering::MainRenderer.render(self, matestack_class, options_hash)
|
41
|
+
elsif (options = args.first).is_a?(Hash) &&
|
42
|
+
(matestack_arg = options[:matestack]) &&
|
43
|
+
matestack_arg.is_a?(Class) &&
|
44
|
+
(matestack_arg < Matestack::Ui::Page)
|
45
|
+
Rendering::MainRenderer.render(self, matestack_arg, options)
|
46
|
+
else
|
47
|
+
if params[:component_class].present? && !((options = args.first).is_a?(Hash) && options[:html].present?)
|
48
|
+
Rendering::MainRenderer.render(self, Matestack::Ui::Page, {})
|
49
|
+
else
|
50
|
+
super
|
51
|
+
end
|
24
52
|
end
|
25
|
-
|
26
|
-
|
53
|
+
end
|
54
|
+
|
55
|
+
# TODO: maybe/Axe remove this?
|
56
|
+
# Matestack allows implicit rendering. The matestack page class name is inferred from the
|
57
|
+
# controller path and action name.
|
58
|
+
#
|
59
|
+
# class Clients::BookingsController < ApplicationController
|
60
|
+
# def index
|
61
|
+
# @bookings = Booking.all
|
62
|
+
# # looks for Pages::Clients::Bookings::Index
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# def show
|
66
|
+
# @booking = Booking.find params[:id]
|
67
|
+
# # looks for Pages::Clients::Bookings::Show
|
68
|
+
# end
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# In this example, `clients/bookings#index` will render `Pages::Clients::Bookings::Index`,
|
72
|
+
# `clients/bookings#show` will render `Pages::Clients::Bookings::Show`.
|
73
|
+
#
|
74
|
+
# Custom action names translate also into page names.
|
75
|
+
#
|
76
|
+
# class Clients::BookingsController < ApplicationController
|
77
|
+
# def step1
|
78
|
+
# # looks for Pages::Clients::Bookings::Step1
|
79
|
+
# end
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# In this example, the `clients/bookings#step1` action will render
|
83
|
+
# `Pages::Clients::Bookings::Step1`.
|
84
|
+
#
|
85
|
+
def default_render(*args)
|
86
|
+
matestack_page_class =
|
87
|
+
Rendering::DefaultRendererClassDeterminer.determine_class(controller_path, action_name)
|
88
|
+
if matestack_page_class
|
89
|
+
render matestack_page_class
|
27
90
|
else
|
28
|
-
|
91
|
+
super
|
29
92
|
end
|
30
93
|
end
|
31
94
|
|
95
|
+
# Kept around for compatibility. Probably worth removing.
|
96
|
+
def responder_for(*args)
|
97
|
+
render(*args)
|
98
|
+
end
|
99
|
+
|
100
|
+
def matestack_component(component, options = {}, &block)
|
101
|
+
context = (options[:matestack_context] ||= {}).merge(controller: @_controller)
|
102
|
+
Matestack::Ui::Core::Component::Base.new(options.merge(matestack_context: context)).send(component, options.merge(matestack_context: context), &block)
|
103
|
+
end
|
32
104
|
end
|
33
105
|
end
|
34
106
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import Vue from 'vue/dist/vue.esm'
|
2
|
+
import Vuex from 'vuex'
|
3
|
+
import axios from 'axios'
|
4
|
+
|
5
|
+
// Import from app/concepts/matestack/ui/core:
|
6
|
+
import matestackEventHub from '../../../app/concepts/matestack/ui/core/js/event-hub'
|
7
|
+
import componentMixin from '../../../app/concepts/matestack/ui/core/component/component'
|
8
|
+
import matestackUiCore from '../../../app/concepts/matestack/ui/core/js/core'
|
9
|
+
|
10
|
+
import styles from './styles/index.scss'
|
11
|
+
|
12
|
+
const MatestackUiCore = {
|
13
|
+
Vue,
|
14
|
+
Vuex,
|
15
|
+
axios,
|
16
|
+
matestackEventHub,
|
17
|
+
componentMixin
|
18
|
+
}
|
19
|
+
|
20
|
+
window.MatestackUiCore = MatestackUiCore
|
21
|
+
|
22
|
+
export default MatestackUiCore
|
@@ -0,0 +1,8 @@
|
|
1
|
+
// // Add polyfills for the asset pipeline
|
2
|
+
// // https://github.com/matestack/matestack-ui-core/issues/238#issuecomment-583905838
|
3
|
+
//
|
4
|
+
// import 'core-js/stable'
|
5
|
+
// import 'regenerator-runtime/runtime'
|
6
|
+
|
7
|
+
import '../matestack-ui-core/index'
|
8
|
+
export default MatestackUiCore
|
@@ -0,0 +1 @@
|
|
1
|
+
Matestack::Ui::Component = Matestack::Ui::Core::Component::Static
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Matestack::Ui::Core::HasViewContext
|
2
|
+
def initialize(*args)
|
3
|
+
super
|
4
|
+
@view_context = @options.dig(:context, :view_context)
|
5
|
+
end
|
6
|
+
|
7
|
+
def method_missing(*args, &block)
|
8
|
+
if @view_context.respond_to? args.first
|
9
|
+
@view_context.send(*args, &block)
|
10
|
+
else
|
11
|
+
raise NameError, "NameError: undefined method or local variable `#{args.first}' for #{self.class.name}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Matestack::Ui::Core::HtmlAttributes
|
2
|
+
|
3
|
+
HTML_GLOBAL_ATTRIBUTES = [
|
4
|
+
:accesskey, :class, :contenteditable, :data, :dir, :draggable,
|
5
|
+
:hidden, :id, :lang, :spellcheck, :style, :tabindex, :title, :translate
|
6
|
+
]
|
7
|
+
|
8
|
+
HTML_EVENT_ATTRIBUTES = [
|
9
|
+
:onafterprint, :onbeforeprint, :onbeforeunload, :onerror, :onhashchange, :onload, :onmessage,
|
10
|
+
:onoffline, :ononline, :onpagehide, :onpageshow, :onpopstate, :onresize, :onstorage, :onunload
|
11
|
+
]
|
12
|
+
|
13
|
+
# prepend the initializer and add class methods
|
14
|
+
def self.included(base)
|
15
|
+
base.class_eval do
|
16
|
+
extend ClassMethods
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
|
22
|
+
def inherited(subclass)
|
23
|
+
subclass.html_attributes *self.allowed_html_attributes
|
24
|
+
end
|
25
|
+
|
26
|
+
def html_attributes(*attributes)
|
27
|
+
attributes.each do |attribute|
|
28
|
+
allowed_html_attributes.push(attribute)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def allowed_html_attributes
|
33
|
+
@allowed_html_attributes.flatten!&.uniq! if defined? @allowed_html_attributes
|
34
|
+
@allowed_html_attributes ||= []
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
def html_attributes
|
40
|
+
options.slice(*self.class.allowed_html_attributes).merge((options[:attributes] || {}))
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Matestack::Ui::Core::Properties
|
2
|
+
|
3
|
+
class PropertyMissingException < StandardError
|
4
|
+
end
|
5
|
+
|
6
|
+
class PropertyOverwritingExistingMethodException < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
# prepend the initializer and add class methods
|
10
|
+
def self.included(base)
|
11
|
+
base.class_eval do
|
12
|
+
extend ClassMethods
|
13
|
+
end
|
14
|
+
base.send :prepend, Initializer
|
15
|
+
end
|
16
|
+
|
17
|
+
# initializer calls super and creates instance methods for defined required and optional properties afterwards
|
18
|
+
module Initializer
|
19
|
+
def initialize(model=nil, options={})
|
20
|
+
options = model.dup if options.empty? && model.is_a?(Hash)
|
21
|
+
required_hooks(options)
|
22
|
+
optional_hooks(options)
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
# define optinoal properties for custom components with `optional :foo, :bar`
|
29
|
+
def optional(*properties)
|
30
|
+
add_properties_to_list(optional_properties, properties)
|
31
|
+
end
|
32
|
+
|
33
|
+
# define required properties for custom components with `requires :title, :foo, :bar`
|
34
|
+
def requires(*properties)
|
35
|
+
add_properties_to_list(requires_properties, properties)
|
36
|
+
end
|
37
|
+
|
38
|
+
def add_properties_to_list(list, properties)
|
39
|
+
properties.each do |property|
|
40
|
+
if property.is_a? Hash
|
41
|
+
property.each { |tmp_property| list.push(tmp_property) }
|
42
|
+
else
|
43
|
+
list.push(property)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# array of properties created from the component
|
49
|
+
def optional_properties
|
50
|
+
@component_properties ||= []
|
51
|
+
end
|
52
|
+
|
53
|
+
# array of required properties from the component
|
54
|
+
def requires_properties
|
55
|
+
@requires_properties ||= []
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def optional_hooks(options)
|
60
|
+
self.class.optional_properties.compact.each do |prop|
|
61
|
+
if prop.is_a? Array
|
62
|
+
hash = prop.flatten
|
63
|
+
options[hash.last[:as]] = options[hash.first]
|
64
|
+
prop = hash.last[:as]
|
65
|
+
end
|
66
|
+
raise PropertyOverwritingExistingMethodException, "Optional property #{prop} would overwrite already defined instance method for #{self.class}" if self.respond_to? prop
|
67
|
+
send(:define_singleton_method, prop) do
|
68
|
+
options[prop]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def required_hooks(options)
|
74
|
+
self.class.requires_properties.compact.each do |prop|
|
75
|
+
if prop.is_a? Array
|
76
|
+
hash = prop.flatten
|
77
|
+
options[hash.last[:as]] = options[hash.first]
|
78
|
+
prop = hash.last[:as]
|
79
|
+
end
|
80
|
+
raise PropertyMissingException, "Required property #{prop} is missing for #{self.class}" if options[prop].nil?
|
81
|
+
raise PropertyOverwritingExistingMethodException, "Required property #{prop} would overwrite already defined instance method for #{self.class}" if self.respond_to? prop
|
82
|
+
send(:define_singleton_method, prop) do
|
83
|
+
options[prop]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Handles the default rendering mechanism
|
2
|
+
#
|
3
|
+
# Not really compatible with the new flexible naming schemes
|
4
|
+
module Matestack::Ui::Core::Rendering::DefaultRendererClassDeterminer
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def determine_class(controller_path, action_name)
|
8
|
+
possible_default_render_matestack_page_class_names(controller_path, action_name).each do |class_name|
|
9
|
+
begin
|
10
|
+
return matestack_class = class_name.constantize
|
11
|
+
rescue NameError
|
12
|
+
end
|
13
|
+
end
|
14
|
+
return nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def possible_default_render_matestack_page_class_names(controller_path, action_name)
|
18
|
+
possible_default_render_matestack_page_paths(controller_path, action_name).collect { |page_path|
|
19
|
+
page_path.split("/").collect { |str| str.camelcase }.join("::")
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def possible_default_render_matestack_page_paths(controller_path, action_name)
|
24
|
+
paths = []
|
25
|
+
paths << "pages/#{controller_path}/#{action_name}"
|
26
|
+
paths << "pages/#{controller_path}" if action_name == "index"
|
27
|
+
paths << "pages/#{controller_path.singularize}" if action_name == "show"
|
28
|
+
paths << "#{controller_path}/#{action_name}_page"
|
29
|
+
paths << "#{controller_path}_page" if action_name == "index"
|
30
|
+
paths << "#{controller_path.singularize}_page" if action_name == "show"
|
31
|
+
paths
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,199 @@
|
|
1
|
+
# The main renderer that is usually called to determine how to perform rendering
|
2
|
+
module Matestack::Ui::Core::Rendering::MainRenderer
|
3
|
+
module_function
|
4
|
+
|
5
|
+
EMPTY_JSON = "{}"
|
6
|
+
|
7
|
+
# Instead of rendering without an app class, we always have an "empty" app class
|
8
|
+
# to fall back to
|
9
|
+
DEFAULT_APP_CLASS = Matestack::Ui::Core::App::App
|
10
|
+
|
11
|
+
def render(controller_instance, page_class, options)
|
12
|
+
app_class = resolve_app_class(controller_instance, options)
|
13
|
+
|
14
|
+
params = controller_instance.params
|
15
|
+
|
16
|
+
context = create_context_hash(controller_instance)
|
17
|
+
|
18
|
+
if params[:only_page]
|
19
|
+
# standalone page rendering, used when performing a transition
|
20
|
+
page_instance = page_class.new(controller_instance: controller_instance, context: context)
|
21
|
+
render_matestack_object(controller_instance, page_instance)
|
22
|
+
elsif (params[:component_key].present? && params[:component_class].blank?)
|
23
|
+
# async component rerendering from non isolated context
|
24
|
+
component_key = params[:component_key]
|
25
|
+
page_instance = page_class.new(controller_instance: controller_instance, context: context)
|
26
|
+
render_component(component_key, page_instance, controller_instance, context)
|
27
|
+
elsif (params[:component_class].present? && params[:component_key].blank?)
|
28
|
+
# isolated component rendering
|
29
|
+
component_class = params[:component_class]
|
30
|
+
page_instance = page_class.new(controller_instance: controller_instance, context: context)
|
31
|
+
public_options = JSON.parse(params[:public_options]).with_indifferent_access rescue nil
|
32
|
+
render_isolated_component(component_class, page_instance, controller_instance, context, public_options)
|
33
|
+
elsif (params[:component_class].present? && params[:component_key].present?)
|
34
|
+
# async component rerendering from isolated context
|
35
|
+
component_class_name = params[:component_class]
|
36
|
+
component_key = params[:component_key]
|
37
|
+
page_instance = page_class.new(controller_instance: controller_instance, context: context)
|
38
|
+
if params[:public_options].present?
|
39
|
+
public_options = JSON.parse(params[:public_options]).with_indifferent_access
|
40
|
+
else
|
41
|
+
public_options = nil
|
42
|
+
end
|
43
|
+
component_class = resolve_isolated_component(component_class_name)
|
44
|
+
if component_class
|
45
|
+
component_instance = component_class.new(public_options: public_options, context: context)
|
46
|
+
if component_instance.authorized?
|
47
|
+
render_component(component_key, component_instance, controller_instance, context)
|
48
|
+
else
|
49
|
+
raise "not authorized"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
else
|
53
|
+
if app_class == false
|
54
|
+
page_instance = page_class.new(controller_instance: controller_instance, context: context)
|
55
|
+
render_matestack_object(controller_instance, page_instance, layout: true)
|
56
|
+
else
|
57
|
+
app_instance = app_class.new(page_class, controller_instance, context)
|
58
|
+
render_matestack_object(controller_instance, app_instance, layout: true)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_context_hash(controller_instance)
|
64
|
+
{
|
65
|
+
view_context: controller_instance.view_context,
|
66
|
+
params: controller_instance.params,
|
67
|
+
request: controller_instance.request
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def render_matestack_object(controller_instance, object, opts = {}, render_method = :show)
|
72
|
+
object.prepare
|
73
|
+
object.response if object.respond_to? :response
|
74
|
+
rendering_options = {html: object.call(render_method)}.merge!(opts)
|
75
|
+
controller_instance.render rendering_options
|
76
|
+
end
|
77
|
+
|
78
|
+
def render_component(component_key, page_instance, controller_instance, context)
|
79
|
+
matched_component = nil
|
80
|
+
|
81
|
+
page_instance.matestack_set_skip_defer(false)
|
82
|
+
|
83
|
+
page_instance.prepare
|
84
|
+
page_instance.response
|
85
|
+
|
86
|
+
matched_component = dig_for_component(component_key, page_instance)
|
87
|
+
|
88
|
+
unless matched_component.nil?
|
89
|
+
render_matestack_object(controller_instance, matched_component, {}, :render_content)
|
90
|
+
else
|
91
|
+
# some 404 probably
|
92
|
+
raise Exception, "Async component with id #{component_key} could not be found while rerendering."
|
93
|
+
end
|
94
|
+
rescue Exception => e
|
95
|
+
Rails.logger.warn e
|
96
|
+
render json: {}, status: :not_found
|
97
|
+
end
|
98
|
+
|
99
|
+
def dig_for_component component_key, component_instance
|
100
|
+
matched_component = nil
|
101
|
+
|
102
|
+
component_instance.children.each do |child|
|
103
|
+
if child.respond_to?(:get_component_key)
|
104
|
+
if child.get_component_key == component_key
|
105
|
+
matched_component = child
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
if matched_component.nil?
|
111
|
+
component_instance.children.each do |child|
|
112
|
+
if child.children.any?
|
113
|
+
matched_component = dig_for_component(component_key, child)
|
114
|
+
break if !matched_component.nil?
|
115
|
+
end
|
116
|
+
end
|
117
|
+
return matched_component
|
118
|
+
else
|
119
|
+
return matched_component
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
# TODO: too many arguments maybe get some of them together?
|
125
|
+
def render_isolated_component(component_class_name, page_instance, controller_instance, context, public_options = nil)
|
126
|
+
component_class = resolve_isolated_component(component_class_name)
|
127
|
+
|
128
|
+
if component_class
|
129
|
+
component_instance = component_class.new(public_options: public_options, context: context)
|
130
|
+
if component_instance.authorized?
|
131
|
+
render_matestack_object(controller_instance, component_instance, {}, :render_isolated_content)
|
132
|
+
else
|
133
|
+
# some 4xx? 404?
|
134
|
+
raise "not authorized"
|
135
|
+
end
|
136
|
+
else
|
137
|
+
# some 404 probably
|
138
|
+
raise "component not found"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def resolve_component(name)
|
143
|
+
constant = const_get(name)
|
144
|
+
# change to specific AsyncComponent parent class
|
145
|
+
if constant < Matestack::Ui::Core::Async::Async
|
146
|
+
constant
|
147
|
+
else
|
148
|
+
nil
|
149
|
+
end
|
150
|
+
rescue NameError
|
151
|
+
nil
|
152
|
+
end
|
153
|
+
|
154
|
+
def resolve_isolated_component(name)
|
155
|
+
constant = const_get(name)
|
156
|
+
if constant < Matestack::Ui::Core::Isolated::Isolated
|
157
|
+
constant
|
158
|
+
else
|
159
|
+
nil
|
160
|
+
end
|
161
|
+
rescue NameError
|
162
|
+
nil
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
def resolve_app_class(controller_instance, options)
|
167
|
+
app_class = DEFAULT_APP_CLASS
|
168
|
+
|
169
|
+
controller_level_app_class = controller_instance.class.get_matestack_app_class
|
170
|
+
action_level_app_class = options[:matestack_app]
|
171
|
+
|
172
|
+
if !controller_level_app_class.nil?
|
173
|
+
if controller_level_app_class == false
|
174
|
+
app_class = false
|
175
|
+
else
|
176
|
+
if controller_level_app_class.is_a?(Class) && (controller_level_app_class < Matestack::Ui::App)
|
177
|
+
app_class = controller_level_app_class
|
178
|
+
else
|
179
|
+
raise "#{controller_level_app_class} is not a valid Matestack::Ui::App class"
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
if !action_level_app_class.nil?
|
184
|
+
if action_level_app_class == false
|
185
|
+
app_class = false
|
186
|
+
else
|
187
|
+
matestack_app_class = action_level_app_class
|
188
|
+
if action_level_app_class.is_a?(Class) && (action_level_app_class < Matestack::Ui::App)
|
189
|
+
app_class = action_level_app_class
|
190
|
+
else
|
191
|
+
raise "#{action_level_app_class} is not a valid Matestack::Ui::App class"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
return app_class
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|