playbook_ui 7.16.0.pre.alpha3 → 8.0.0.pre.alpha4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_overrides.scss +0 -4
  3. data/app/pb_kits/playbook/pb_docs/kit_api.html.erb +12 -0
  4. data/app/pb_kits/playbook/pb_docs/kit_api.rb +19 -0
  5. data/app/pb_kits/playbook/pb_docs/kit_example.html.erb +28 -0
  6. data/app/pb_kits/playbook/pb_docs/kit_example.rb +46 -0
  7. data/app/pb_kits/playbook/pb_filter/filter.html.erb +86 -0
  8. data/app/pb_kits/playbook/pb_filter/filter.rb +9 -5
  9. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +2 -2
  10. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -1
  11. data/app/pb_kits/playbook/pb_form/docs/_form_simple_form.html.erb +1 -2
  12. data/app/pb_kits/playbook/pb_form/form.html.erb +7 -0
  13. data/app/pb_kits/playbook/pb_form/form.rb +12 -14
  14. data/app/pb_kits/playbook/pb_form/form_builder.rb +1 -1
  15. data/app/pb_kits/playbook/pb_form/form_builder/action_area.html.erb +3 -0
  16. data/app/pb_kits/playbook/pb_form/form_builder/action_area.rb +5 -21
  17. data/app/pb_kits/playbook/pb_form/form_with.html.erb +18 -0
  18. data/app/pb_kits/playbook/pb_form/form_with.rb +34 -0
  19. data/app/pb_kits/playbook/pb_form/{_form_simple_form.html.erb → simple_form.html.erb} +3 -3
  20. data/app/pb_kits/playbook/pb_form/simple_form.rb +63 -0
  21. data/app/pb_kits/playbook/pb_layout/{_item.html.erb → item.html.erb} +1 -1
  22. data/app/pb_kits/playbook/pb_layout/item.rb +1 -5
  23. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +1 -0
  24. data/lib/playbook.rb +14 -8
  25. data/lib/playbook/classnames.rb +34 -0
  26. data/lib/playbook/engine.rb +4 -10
  27. data/lib/playbook/kit_base.rb +13 -1
  28. data/lib/playbook/kit_resolver.rb +23 -0
  29. data/lib/playbook/markdown.rb +4 -0
  30. data/lib/playbook/markdown/helper.rb +153 -0
  31. data/lib/playbook/pb_doc_helper.rb +85 -0
  32. data/lib/playbook/pb_kit_helper.rb +3 -24
  33. data/lib/playbook/props.rb +3 -118
  34. data/lib/playbook/spacing.rb +76 -0
  35. data/lib/playbook/version.rb +1 -1
  36. data/lib/playbook/z_index.rb +31 -0
  37. metadata +29 -23
  38. data/app/controllers/playbook/application_controller.rb +0 -15
  39. data/app/helpers/playbook/application_helper.rb +0 -30
  40. data/app/helpers/playbook/pb_doc_helper.rb +0 -206
  41. data/app/helpers/playbook/pb_sample_helper.rb +0 -64
  42. data/app/helpers/playbook/redcarpet_helper.rb +0 -151
  43. data/app/pb_kits/playbook/config/_kit_example.html.erb +0 -23
  44. data/app/pb_kits/playbook/config/_kit_samples_list.html.erb +0 -3
  45. data/app/pb_kits/playbook/config/_kit_ui.html.erb +0 -43
  46. data/app/pb_kits/playbook/config/_pb_kit_api.html.erb +0 -16
  47. data/app/pb_kits/playbook/pb_filter/_filter.html.erb +0 -6
  48. data/app/pb_kits/playbook/pb_filter/templates/_core.html.erb +0 -67
  49. data/app/pb_kits/playbook/pb_filter/templates/_default.html.erb +0 -23
  50. data/app/pb_kits/playbook/pb_form/_form_form_with.html.erb +0 -13
  51. data/app/pb_kits/playbook/pb_form/form/form_with_form.rb +0 -39
  52. data/app/pb_kits/playbook/pb_form/form/simple_form_form.rb +0 -46
  53. data/app/pb_kits/playbook/pb_form/form_builder/form_with_form_builder.rb +0 -11
  54. data/app/pb_kits/playbook/pb_form/form_builder/simple_form_builder.rb +0 -25
  55. data/app/pb_kits/playbook/pb_kit/base.rb +0 -99
@@ -1,8 +1,8 @@
1
- <%= simple_form_for *object.merged_form_system_options do |form| %>
2
- <% instance_exec form, &object.children %>
1
+ <%= simple_form_for model, options do |form| %>
2
+ <% instance_exec form, &children %>
3
3
  <% end %>
4
4
 
5
- <% if object.validate %>
5
+ <% if validate %>
6
6
  <% content_for :pb_js do %>
7
7
  <%= javascript_tag do %>
8
8
  window.addEventListener('DOMContentLoaded', function() {
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(SimpleForm)
4
+ module Playbook
5
+ module PbForm
6
+ class SimpleForm < Playbook::KitBase
7
+ class FormBuilder < ::SimpleForm::FormBuilder
8
+ include ::Playbook::PbForm::FormBuilder
9
+
10
+ def input(attribute_name, options = {}, &block)
11
+ super(
12
+ attribute_name,
13
+ options.deep_merge(label: false, input_html: {
14
+ props: {
15
+ label: true,
16
+ },
17
+ }),
18
+ &block
19
+ )
20
+ end
21
+ end
22
+
23
+ prop :options, type: Playbook::Props::Hash, default: {}
24
+ prop :validate, type: Playbook::Props::Boolean, default: false
25
+
26
+ def options
27
+ {
28
+ builder: Playbook::PbForm::SimpleForm::FormBuilder,
29
+ html: html_options,
30
+ data: data,
31
+ url: "",
32
+ }.merge(prop(:options))
33
+ end
34
+
35
+ def model
36
+ prop(:options).fetch(:model, nil)
37
+ end
38
+
39
+ def data
40
+ prop(:data).merge("pb-form-validation" => validate)
41
+ end
42
+
43
+ def classname
44
+ [generate_classname("pb-form"), html[:class]].join(" ")
45
+ end
46
+
47
+ def html
48
+ prop(:options).fetch(:html, {})
49
+ end
50
+
51
+ def render_in(view_context, &_block)
52
+ super(view_context, &nil)
53
+ end
54
+
55
+ private
56
+
57
+ def html_options
58
+ html.merge(class: classname)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -2,5 +2,5 @@
2
2
  id: object.id,
3
3
  data: object.data,
4
4
  class: object.classname) do %>
5
- <%= capture(&object.children) %>
5
+ <%= content %>
6
6
  <% end %>
@@ -2,11 +2,7 @@
2
2
 
3
3
  module Playbook
4
4
  module PbLayout
5
- class Item
6
- include Playbook::Props
7
-
8
- partial "pb_layout/item"
9
-
5
+ class Item < Playbook::KitBase
10
6
  prop :size, type: Playbook::Props::Enum,
11
7
  values: %w[sm md lg],
12
8
  default: "sm"
@@ -40,6 +40,7 @@ module Playbook
40
40
  id: id,
41
41
  isMulti: true,
42
42
  label: label,
43
+ name: name,
43
44
  options: options,
44
45
  placeholder: placeholder,
45
46
  }
data/lib/playbook.rb CHANGED
@@ -9,8 +9,10 @@ require "view_component/engine"
9
9
  require "playbook/props"
10
10
  require "playbook/version"
11
11
  require "playbook/pb_kit_helper"
12
+ require "playbook/pb_doc_helper"
12
13
  require "playbook/kit_base"
13
- require "playbook/markdown/template_handler"
14
+ require "playbook/kit_resolver"
15
+ require "playbook/markdown"
14
16
  require "playbook/engine" if defined?(Rails)
15
17
 
16
18
  module Playbook
@@ -19,12 +21,16 @@ module Playbook
19
21
  class ConflictingPropsError < StandardError; end
20
22
  class MissingPropError < StandardError; end
21
23
 
22
- class << self
23
- def webpacker
24
- @webpacker ||= ::Webpacker::Instance.new(
25
- root_path: ROOT_PATH,
26
- config_path: ROOT_PATH.join("config/webpacker.yml")
27
- )
28
- end
24
+ module_function
25
+
26
+ def webpacker
27
+ @webpacker ||= ::Webpacker::Instance.new(
28
+ root_path: ROOT_PATH,
29
+ config_path: ROOT_PATH.join("config/webpacker.yml")
30
+ )
31
+ end
32
+
33
+ def kit_path(kit, *args)
34
+ Playbook::Engine.root.join("app/pb_kits/playbook/pb_#{kit}", *args)
29
35
  end
30
36
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module Classnames
5
+ def self.included(base)
6
+ base.prop :classname
7
+ base.prop :dark, type: Playbook::Props::Boolean, default: false
8
+ end
9
+
10
+ def generate_classname(*name_parts, separator: "_")
11
+ [
12
+ name_parts.compact.join(separator),
13
+ prop(:classname),
14
+ spacing_props,
15
+ dark_props,
16
+ max_width_props,
17
+ z_index_props,
18
+ ].compact.join(" ")
19
+ end
20
+
21
+ def generate_classname_without_spacing(*name_parts, separator: "_")
22
+ [
23
+ name_parts.compact.join(separator),
24
+ prop(:classname),
25
+ ].compact.join(" ")
26
+ end
27
+
28
+ private
29
+
30
+ def dark_props
31
+ dark ? "dark" : nil
32
+ end
33
+ end
34
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "sassc-rails"
3
4
  require "slim-rails"
4
5
 
@@ -13,18 +14,11 @@ module Playbook
13
14
  config.view_component.render_monkey_patch_enabled = false
14
15
 
15
16
  config.assets.paths ||= []
16
- config.assets.paths << "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/fonts"
17
- config.assets.paths << "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook/pb_*"
17
+ config.assets.paths << Playbook::Engine.root.join("fonts")
18
+ config.assets.paths << Playbook::Engine.root.join("app/pb_kits/playbook/pb_*")
18
19
 
19
20
  config.sass.load_paths ||= []
20
- config.sass.load_paths << "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook"
21
-
22
- initializer "playbook_ui.add_view_paths", after: :add_view_paths do |_app|
23
- ActiveSupport.on_load(:action_controller) do
24
- append_view_path "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook"
25
- append_view_path "#{Gem.loaded_specs['playbook_ui'].full_gem_path}/app/pb_kits/playbook/config"
26
- end
27
- end
21
+ config.sass.load_paths << Playbook::Engine.root.join("app/pb_kits/playbook")
28
22
 
29
23
  initializer "webpacker.proxy" do |app|
30
24
  insert_middleware = begin
@@ -1,9 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "playbook/classnames"
4
+ require "playbook/spacing"
5
+ require "playbook/z_index"
6
+
3
7
  module Playbook
4
8
  class KitBase < ViewComponent::Base
5
- include Playbook::Props
6
9
  include Playbook::PbKitHelper
10
+ include Playbook::Props
11
+ include Playbook::Classnames
12
+ include Playbook::Spacing
13
+ include Playbook::ZIndex
14
+
15
+ prop :id
16
+ prop :data, type: Playbook::Props::Hash, default: {}
17
+ prop :aria, type: Playbook::Props::Hash, default: {}
18
+ prop :children, type: Playbook::Props::Proc
7
19
 
8
20
  def object
9
21
  self
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ class KitResolver
5
+ def self.resolve(*args)
6
+ @resolver ||= new
7
+ @resolver.resolve(*args)
8
+ end
9
+
10
+ def initialize
11
+ @cache = Hash.new do |cache, kit_name|
12
+ is_subkit = kit_name.match(%r{[/\\]})
13
+ folder = is_subkit ? kit_name.split("/")[0] : kit_name
14
+ item = is_subkit ? kit_name.split("/")[-1] : kit_name
15
+ @cache[kit_name] = "Playbook::Pb#{folder.camelize}::#{item.camelize}"
16
+ end
17
+ end
18
+
19
+ def resolve(kit_name)
20
+ @cache[kit_name].safe_constantize
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "playbook/markdown/template_handler"
4
+ require "playbook/markdown/helper"
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "redcarpet"
4
+ require "rouge"
5
+ require "rouge/plugins/redcarpet"
6
+ require "action_view"
7
+
8
+ module Playbook
9
+ module Markdown
10
+ module Helper
11
+ def markdown(text)
12
+ options = {
13
+ filter_html: false,
14
+ hard_wrap: true,
15
+ link_attributes: { rel: "nofollow", target: "_blank" },
16
+ space_after_headers: true,
17
+ fenced_code_blocks: true,
18
+ no_styles: false,
19
+ safe_links_only: true,
20
+ }
21
+
22
+ extensions = {
23
+ autolink: true,
24
+ superscript: true,
25
+ fenced_code_blocks: true,
26
+ tables: true,
27
+ disable_indented_code_blocks: false,
28
+ strikethrough: true,
29
+ underline: true,
30
+ highlight: true,
31
+ footnotes: true,
32
+ with_toc_data: true,
33
+ }
34
+
35
+ renderer = HTMLBlockCode.new(options)
36
+ markdown = Redcarpet::Markdown.new(renderer, extensions)
37
+
38
+ markdown.render(text).html_safe
39
+ end
40
+
41
+ def rouge(text, language)
42
+ formatter = Rouge::Formatters::HTML.new(scope: ".highlight")
43
+ lexer = Rouge::Lexer.find(language)
44
+ formatter.format(lexer.lex(text))
45
+ end
46
+
47
+ def rouge_markdown(text)
48
+ render_options = {
49
+ filter_html: true,
50
+ hard_wrap: true,
51
+ link_attributes: { rel: "nofollow" },
52
+ }
53
+ renderer = HTML.new(render_options)
54
+
55
+ extensions = {
56
+ autolink: true,
57
+ fenced_code_blocks: true,
58
+ lax_spacing: true,
59
+ no_intra_emphasis: true,
60
+ strikethrough: true,
61
+ superscript: true,
62
+ }
63
+ markdown = Redcarpet::Markdown.new(renderer, extensions)
64
+ markdown.render(text)
65
+ end
66
+ end
67
+
68
+ class HTML < Redcarpet::Render::HTML
69
+ include Rouge::Plugins::Redcarpet
70
+ end
71
+
72
+ class HTMLBlockCode < Redcarpet::Render::HTML
73
+ include ActionView::Helpers::AssetTagHelper
74
+ def header(title, level)
75
+ if level == 7
76
+ @headers ||= []
77
+ permalink = title.gsub(/\W+/, "-")
78
+ if @headers.include?(permalink)
79
+ permalink += "_1"
80
+ loop do
81
+ break unless @headers.include?(permalink)
82
+
83
+ permalink.gsub!(/\_(\d+)$/, "_#{Regexp.last_match(1).to_i + 1}")
84
+ end
85
+ end
86
+ @headers << permalink
87
+ %(\n<a name="#{permalink}" class="markdown-header-anchor anchor" href="##{permalink}"><span class="fa fa-link anchor-icon"></span></a><h#{level} id=\"#{permalink}\">#{title}</h#{level}>\n)
88
+ else
89
+ %(\n<h#{level}>#{title}</h#{level}>\n)
90
+ end
91
+ end
92
+
93
+ def image(link, title, alt_text)
94
+ image_tag(link, title: title, alt: alt_text, class: "imageloader lazyload")
95
+ end
96
+
97
+ def preprocess(full_document)
98
+ full_document.gsub(/\[component (.*)\]/) do
99
+ @string = Regexp.last_match(1)
100
+ @default_height = "160"
101
+ @attr = ["", @default_height]
102
+
103
+ # Set src from attributes
104
+ @string.gsub(/src="(.*?)"/) do
105
+ @attr[0] = Regexp.last_match(1)
106
+ end
107
+
108
+ # Set height from attributes
109
+ @string.gsub(/height="(.*?)"/) do
110
+ @attr[1] = (Regexp.last_match(1) || @default_height)
111
+ end
112
+
113
+ %(\n<div class="uix-component-frame"><iframe scrolling="no" id="component-preview" src="#{@attr[0]}" width="100%" height="#{@attr[1]}"></iframe><a href="#{@attr[0]}" target="_blank" class="uix-component-link">View component</a></div>\n)
114
+ end
115
+ end
116
+
117
+ def list(contents, _list_type)
118
+ @contents = contents
119
+ @list_items = contents.split("\n")
120
+
121
+ if @list_items[0].include?("[do]") || @list_items[0].include?("[dont]")
122
+ @element_items = []
123
+ @list_items.each do |item, _index|
124
+ item.gsub(%r{\<li>(.*)\</li>}) do
125
+ @element_items.push(Regexp.last_match(1))
126
+ end
127
+ end
128
+
129
+ # Doing both because we could have either/both
130
+ # clean up
131
+ @dont_items, @trash_items_dont = @element_items.partition { |x, _i| x.include? "[dont]" }
132
+ @do_items, @trash_items_do = @element_items.partition { |x, _i| x.include? "[do]" }
133
+
134
+ @do_list = []
135
+ @do_items.each do |item, _index|
136
+ @do_list.push("<li>#{item.sub('[do] ', '')}</li>")
137
+ end
138
+ @do_list = "<ul class='uix-ruleset do-list'>#{@do_list.join('')}</ul>"
139
+
140
+ @dont_list = []
141
+ @dont_items.each do |item, _index|
142
+ @dont_list.push("<li>#{item.sub('[dont] ', '')}</li>")
143
+ end
144
+ @dont_list = "<ul class='uix-ruleset dont-list'>#{@dont_list.join('')}</ul>"
145
+
146
+ "<div class='row uix-ruleset-block'><div class='col-sm-6'>#{@do_list}</div><div class='col-sm-6'>#{@dont_list}</div></div>"
147
+ else
148
+ @contents
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDocHelper
5
+ def pb_kit_title(title)
6
+ title.remove("pb_").titleize.tr("_", " ")
7
+ end
8
+
9
+ def pb_kit(kit: "", type: "rails", show_code: true, limit_examples: false, dark_mode: false)
10
+ examples = pb_doc_kit_examples(kit, type)
11
+ examples = examples.first(1) if limit_examples
12
+ examples.map do |example|
13
+ pb_rails "docs/kit_example", props: {
14
+ kit: kit,
15
+ example_title: example.values.first,
16
+ example_key: example.keys.first,
17
+ show_code: show_code,
18
+ type: type,
19
+ dark: dark_mode
20
+ }
21
+ end.join.yield_self(&method(:raw))
22
+ end
23
+
24
+ # Deal with lists of kits, used in Playbook doc and Externally
25
+ def pb_kits(type: "rails", limit_examples: false, dark_mode: false)
26
+ display_kits = []
27
+ kits = get_kits
28
+ kits.each do |kit|
29
+ if kit.is_a?(Hash)
30
+ nav_hash_array(kit).each do |sub_kit|
31
+ display_kits << render_pb_doc_kit(sub_kit, type, limit_examples, false, dark_mode)
32
+ end
33
+ else
34
+ display_kits << render_pb_doc_kit(kit, type, limit_examples, false, dark_mode)
35
+ end
36
+ end
37
+ raw("<div class='pb--docItem'>" + display_kits.join("</div><div class='pb--docItem'>") + "</div>")
38
+ end
39
+
40
+ def get_kits
41
+ menu = YAML.load_file(Playbook::Engine.root.join("app/pb_kits/playbook/data/menu.yml"))
42
+ menu["kits"]
43
+ end
44
+
45
+ def render_pb_doc_kit(kit, type, limit_examples, code = true, dark_mode = false)
46
+ title = pb_doc_render_clickable_title(kit, type)
47
+ ui = raw("<div class='pb--docItem-ui'>
48
+ #{pb_kit(kit: kit, type: type, show_code: code, limit_examples: limit_examples, dark_mode: dark_mode)}</div>")
49
+ title + ui
50
+ end
51
+
52
+ private
53
+
54
+ def pb_doc_kit_path(kit, *args)
55
+ Playbook.kit_path(kit, "docs", *args)
56
+ end
57
+
58
+ def pb_doc_kit_examples(kit, type)
59
+ example_file = pb_doc_kit_path(kit, "example.yml")
60
+ if File.exist?(example_file)
61
+ examples_list = YAML.load_file(example_file)
62
+ .inject({}) { |item, (k, v)| item[k.to_sym] = v; item }
63
+ examples_list.dig(:examples, type) || []
64
+ else
65
+ []
66
+ end
67
+ end
68
+
69
+ def pb_doc_render_clickable_title(kit, type)
70
+ url = "#"
71
+ begin
72
+ url = if type == "react"
73
+ kit_show_reacts_path(kit)
74
+ else
75
+ kit_show_path(kit)
76
+ end
77
+ # FIXME this is here because this helper generates a link for playbook website,
78
+ # but shouldn't do anything when used elsewhere
79
+ rescue
80
+ puts "Kit Path Not Avaliable"
81
+ end
82
+ render inline: "<a href='#{url}'>#{pb_rails(:title, props: { text: pb_kit_title(kit), tag: 'h3', size: 2 })}</a>"
83
+ end
84
+ end
85
+ end