playbook_ui 4.3.1 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/playbook/pb_doc_helper.rb +23 -0
  3. data/app/pb_kits/playbook/_playbook.scss +1 -0
  4. data/app/pb_kits/playbook/config/_kit_ui.html.erb +40 -0
  5. data/app/pb_kits/playbook/data/menu.yml +2 -1
  6. data/app/pb_kits/playbook/index.js +2 -0
  7. data/app/pb_kits/playbook/packs/examples.js +5 -0
  8. data/app/pb_kits/playbook/packs/kits/pb_date_range_stacked.js +1 -0
  9. data/app/pb_kits/playbook/packs/site_styles/docs/_kit_doc.scss +4 -1
  10. data/app/pb_kits/playbook/packs/site_styles/docs/_markdown.scss +3 -3
  11. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.html.erb +24 -0
  12. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.jsx +68 -0
  13. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.scss +7 -0
  14. data/app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.rb +19 -0
  15. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_dark.html.erb +1 -0
  16. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_dark.jsx +14 -0
  17. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_default.html.erb +1 -0
  18. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_default.jsx +13 -0
  19. data/app/pb_kits/playbook/pb_date_range_stacked/docs/example.yml +11 -0
  20. data/app/pb_kits/playbook/pb_date_range_stacked/docs/index.js +2 -0
  21. data/app/pb_kits/playbook/pb_popover/_popover.html.erb +0 -17
  22. data/app/pb_kits/playbook/pb_popover/docs/_popover_with_button.jsx +1 -0
  23. data/app/pb_kits/playbook/pb_popover/index.js +50 -0
  24. data/app/pb_kits/playbook/pb_popover/popover.rb +10 -4
  25. data/app/pb_kits/playbook/pb_section_separator/docs/_description.md +3 -0
  26. data/app/pb_kits/playbook/pb_section_separator/docs/_footer.md +2 -0
  27. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.md +1 -0
  28. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text_background.md +1 -0
  29. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_context.html.erb +51 -0
  30. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  31. data/app/pb_kits/playbook/pb_typeahead/index.js +35 -8
  32. data/app/pb_kits/playbook/vendor.js +0 -4
  33. data/app/views/playbook/pages/kit_show.html.slim +9 -0
  34. data/lib/playbook/version.rb +1 -1
  35. metadata +20 -4
  36. data/app/pb_kits/playbook/config/_kit_ui.html.slim +0 -34
  37. data/app/pb_kits/playbook/pb_popover/_popover.js +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2511d44a10345d1827a31ca450fbc31170726b201a87de90ec7ecf005826cbb7
4
- data.tar.gz: d14f6540f660c158d3722f38614e1efc9489906034323584a34801c7a359c7db
3
+ metadata.gz: e9e67b7c641a97dec35678810ee27d5b1d81d107387628f195e22c0cd1c8b85a
4
+ data.tar.gz: bf29ef64507bbf6c46cf63589ef0756a9c136041f62dbe981f8d7265365d415f
5
5
  SHA512:
6
- metadata.gz: 31b86ad405494ebbe3a19923a41b48af7227617416f41690602761b7a762096c77853f4ef9ebce3e2c72b9f40e802c1b90529025cb23632d27bc83176cad2e8d
7
- data.tar.gz: d1e5c82bc28edcfcf1b6b738260f62e3a07480f76eab3229047188bcfaff67c5544da8ae5309dc4e084aa3fc14d7024a5b8631c8b1506ceb36502624025eec90
6
+ metadata.gz: c0e229990f55c9d8f9d2d63f2a35033585cdcba14e6cdb547a55319565fe6b9f492ac0bbd8cd48c8b7e2400247ee77f6cc2036737c6950e4f539094bb5b802ae
7
+ data.tar.gz: 7909e078c4de087285d5c36165b467812814952c1cc1aa5b336da1926f79cd2b898f71bdeb27cbe9e31894db4fadc5531bf999f0f835ece642611560df03214d
@@ -15,6 +15,29 @@ module Playbook
15
15
  end
16
16
  end
17
17
 
18
+ def read_file(filename)
19
+ if File.file?(filename)
20
+ File.read(filename)
21
+ else
22
+ ""
23
+ end
24
+ end
25
+
26
+ def get_kit_description(kit)
27
+ filename = "#{Playbook::Engine.root}/app/pb_kits/playbook/pb_#{@kit}/docs/_description.md"
28
+ read_file(filename)
29
+ end
30
+
31
+ def get_per_sample_descriptions(kit, key)
32
+ filename = "#{Playbook::Engine.root}/app/pb_kits/playbook/pb_#{kit}/docs/_#{key}.md"
33
+ read_file(filename)
34
+ end
35
+
36
+ def get_kit_footer(kit)
37
+ filename = "#{Playbook::Engine.root}/app/pb_kits/playbook/pb_#{kit}/docs/_footer.md"
38
+ read_file(filename)
39
+ end
40
+
18
41
  def pb_kit(kit: "", type: "rails", show_code: true)
19
42
  @type = type
20
43
  @kit_examples = get_kit_examples(kit, type)
@@ -13,6 +13,7 @@
13
13
  @import 'pb_dashboard_value/dashboard_value';
14
14
  @import 'pb_date/date';
15
15
  @import 'pb_date_range_inline/date_range_inline';
16
+ @import 'pb_date_range_stacked/date_range_stacked';
16
17
  @import 'pb_date_stacked/date_stacked';
17
18
  @import 'pb_date_year_stacked/date_year_stacked';
18
19
  @import 'pb_distribution_bar/distribution_bar';
@@ -0,0 +1,40 @@
1
+
2
+ <% type ||= "rails" %>
3
+
4
+ <% if type == "react" %>
5
+ <% contents = File.read("#{Playbook::Engine.root}/app/pb_kits/playbook/pb_#{@kit_examples[:kit]}/docs/_#{key}.jsx") %>
6
+ <% else %>
7
+ <% contents = File.read("#{Playbook::Engine.root}/app/pb_kits/playbook/pb_#{@kit_examples[:kit]}/docs/_#{key}.html.erb") %>
8
+ <% end %>
9
+
10
+ <div class="pb--kit-example">
11
+ <%= pb_rails("caption", props: { text: item }) %>
12
+ <br>
13
+ <% if type == "rails" %>
14
+ <%= render partial: "pb_#{@kit_examples[:kit]}/docs/#{key}" %>
15
+ <% elsif type == "react" %>
16
+ <%= pb_react(key.camelize) %>
17
+ <% end %>
18
+ <br>
19
+ </div>
20
+
21
+ <% if @show_code%>
22
+ <div class="markdown pb--kit-example-markdown">
23
+ <%= markdown(get_per_sample_descriptions(@kit_examples[:kit], key)) %>
24
+ </div>
25
+ <div class="pb--codeControls">
26
+ <ul>
27
+ <li>
28
+ <a href="#" data-toggle="code_example">Code Example</a>
29
+ </li>
30
+ </ul>
31
+ </div>
32
+ <div class="pb--codeCopy" data-action="toggle" data-togglable="code_example">
33
+ <a href="#" data-toggle="false" class="pb--close-toggle">Close</a>
34
+ <% if type == "rails" %>
35
+ <pre class="highlight"><%= raw rouge(contents, "erb") %></pre>
36
+ <% elsif type == "react" %>
37
+ <pre class="highlight"><%= raw rouge(contents, "react")%></pre>
38
+ <% end %>
39
+ </div>
40
+ <% end %>
@@ -44,7 +44,7 @@ kits:
44
44
  - section_separator
45
45
  - source
46
46
  - star_rating
47
- - stat_changea
47
+ - stat_change
48
48
  - table
49
49
  - typography:
50
50
  - body
@@ -56,6 +56,7 @@ kits:
56
56
  - dashboard_value
57
57
  - date
58
58
  - date_range_inline
59
+ - date_range_stacked
59
60
  - date_stacked
60
61
  - date_year_stacked
61
62
  - home_address_street
@@ -13,6 +13,7 @@ export Currency from './pb_currency/_currency.jsx'
13
13
  export DashboardValue from './pb_dashboard_value/_dashboard_value.jsx'
14
14
  export Date from './pb_date/_date.jsx'
15
15
  export DateRangeInline from './pb_date_range_inline/_date_range_inline.jsx'
16
+ export DateRangeStacked from './pb_date_range_stacked/_date_range_stacked.jsx'
16
17
  export DateStacked from './pb_date_stacked/_date_stacked.jsx'
17
18
  export DateYearStacked from './pb_date_year_stacked/_date_year_stacked.jsx'
18
19
  export DistributionBar from './pb_distribution_bar/_distribution_bar.jsx'
@@ -73,3 +74,4 @@ export dashboardValueSettings from './pb_dashboard_value/dashboardValueSettings'
73
74
  // Other JS/Plugins
74
75
  export pbChart from './plugins/pb_chart.js'
75
76
  export PbTypeahead from './pb_typeahead'
77
+ export PbPopover from './pb_popover'
@@ -27,6 +27,7 @@ import * as Currency from 'pb_currency/docs'
27
27
  import * as DashboardValue from 'pb_dashboard_value/docs'
28
28
  import * as Date from 'pb_date/docs'
29
29
  import * as DateRangeInline from 'pb_date_range_inline/docs'
30
+ import * as DateRangeStacked from 'pb_date_range_stacked/docs'
30
31
  import * as DateStacked from 'pb_date_stacked/docs'
31
32
  import * as DateYearStacked from 'pb_date_year_stacked/docs'
32
33
  import * as DistributionBar from 'pb_distribution_bar/docs'
@@ -80,6 +81,9 @@ import * as UserBadge from 'pb_user_badge/docs'
80
81
  import PbTypeahead from 'pb_typeahead'
81
82
  PbTypeahead.start()
82
83
 
84
+ import PbPopover from 'pb_popover'
85
+ PbPopover.start()
86
+
83
87
  WebpackerReact.setup({
84
88
  ...Avatar,
85
89
  ...Badge,
@@ -95,6 +99,7 @@ WebpackerReact.setup({
95
99
  ...DashboardValue,
96
100
  ...Date,
97
101
  ...DateRangeInline,
102
+ ...DateRangeStacked,
98
103
  ...DateStacked,
99
104
  ...DateYearStacked,
100
105
  ...DistributionBar,
@@ -0,0 +1 @@
1
+ import '../../pb_date_range_stacked/_date_range_stacked.jsx'
@@ -36,9 +36,12 @@
36
36
  font-weight: 600;
37
37
  z-index: 100;
38
38
  }
39
+
40
+ .pb--kit-example, .pb--kit-example-markdown {
41
+ padding: calc(2rem + 4px) 2rem 1rem;
42
+ }
39
43
 
40
44
  .pb--kit-example {
41
- padding: calc(2rem + 4px) 2rem 1rem;
42
45
  position: relative;
43
46
 
44
47
  &::after {
@@ -36,12 +36,12 @@
36
36
  code {
37
37
  background: #122b3b;
38
38
  color: #faf6e4;
39
- padding: 0.5rem 1.5rem;
40
- margin: 1rem 0;
39
+ padding: 0.1rem 0.3rem;
40
+ margin: 1rem 5px;
41
41
  box-shadow: 0 2px 10px $shadow;
42
42
  border-radius: 0.25rem;
43
43
  overflow: hidden;
44
- font-size: 1rem;
44
+ font-size: 14px;
45
45
  }
46
46
 
47
47
  body {
@@ -0,0 +1,24 @@
1
+ <%= content_tag(:div,
2
+ id: object.id,
3
+ data: object.data,
4
+ class: object.classname) do %>
5
+
6
+ <%= pb_rails("flex", props: {vertical: "center"}) do %>
7
+ <%= pb_rails("flex/flex_item") do %>
8
+ <%= pb_rails("date_year_stacked", props: { align: 'right',
9
+ date: object.start_date,
10
+ dark: object.dark }) %>
11
+ <% end %>
12
+ <%= pb_rails("flex/flex_item") do %>
13
+ <div>
14
+ <%= pb_rails("body", props: { tag: "span", color: "light" }) do %>
15
+ <%= pb_rails("icon", props: { icon: "long-arrow-right", fixed_width: true, classname: "pb_date_range_stacked_arrow" }) %>
16
+ <% end %>
17
+ </div>
18
+ <% end %>
19
+ <%= pb_rails("flex/flex_item") do %>
20
+ <%= pb_rails("date_year_stacked", props: { date: object.end_date,
21
+ dark: object.dark }) %>
22
+ <% end %>
23
+ <% end %>
24
+ <% end %>
@@ -0,0 +1,68 @@
1
+ /* @flow */
2
+
3
+ import React from 'react'
4
+ import classnames from 'classnames'
5
+
6
+ import { buildCss } from '../utilities/props'
7
+
8
+ import {
9
+ Body,
10
+ DateYearStacked,
11
+ Flex,
12
+ FlexItem,
13
+ Icon,
14
+ } from '../'
15
+
16
+ type DateRangeStackedProps = {
17
+ className?: String | Array<String>,
18
+ data?: String,
19
+ dark?: Boolean,
20
+ endDate: String,
21
+ id?: String,
22
+ startDate: String
23
+ }
24
+
25
+ const DateRangeStacked = ({
26
+ className,
27
+ dark = false,
28
+ endDate,
29
+ startDate,
30
+ }: DateRangeStackedProps) => {
31
+ const css = classnames(className, buildCss('pb_date_range_stacked'))
32
+
33
+ return (
34
+ <div className={css}>
35
+ <Flex vertical="center">
36
+ <FlexItem>
37
+ <DateYearStacked
38
+ align="right"
39
+ dark={dark}
40
+ date={startDate}
41
+ />
42
+ </FlexItem>
43
+ <FlexItem>
44
+ <div>
45
+ <Body
46
+ color="light"
47
+ tag="span"
48
+ >
49
+ <Icon
50
+ className="pb_date_range_stacked_arrow"
51
+ fixedWidth
52
+ icon="long-arrow-right"
53
+ />
54
+ </Body>
55
+ </div>
56
+ </FlexItem>
57
+ <FlexItem>
58
+ <DateYearStacked
59
+ dark={dark}
60
+ date={endDate}
61
+ />
62
+ </FlexItem>
63
+ </Flex>
64
+ </div>
65
+ )
66
+ }
67
+
68
+ export default DateRangeStacked
@@ -0,0 +1,7 @@
1
+ @import "../tokens/spacing";
2
+
3
+ [class^=pb_date_range_stacked] {
4
+ .pb_date_range_stacked_arrow {
5
+ margin: 0 ($space_sm - 3) 0;
6
+ }
7
+ }
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbDateRangeStacked
5
+ class DateRangeStacked
6
+ include Playbook::Props
7
+
8
+ partial "pb_date_range_stacked/date_range_stacked"
9
+
10
+ prop :dark, type: Playbook::Props::Boolean, default: false
11
+ prop :end_date, type: Playbook::Props::Date, required: true
12
+ prop :start_date, type: Playbook::Props::Date, required: true
13
+
14
+ def classname
15
+ generate_classname("pb_date_range_stacked")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1 @@
1
+ <%= pb_rails("date_range_stacked", props: { start_date: Date.new(2019, 06, 18), end_date: Date.new(2020, 03, 20), dark: true }) %>
@@ -0,0 +1,14 @@
1
+ import React from 'react'
2
+ import { DateRangeStacked } from '../../'
3
+
4
+ const DateRangeStackedDark = () => (
5
+ <div>
6
+ <DateRangeStacked
7
+ dark
8
+ endDate={new Date('20 Mar 2020')}
9
+ startDate={new Date('18 Jun 2019')}
10
+ />
11
+ </div>
12
+ )
13
+
14
+ export default DateRangeStackedDark
@@ -0,0 +1 @@
1
+ <%= pb_rails("date_range_stacked", props: { start_date: Date.new(2019, 06, 18), end_date: Date.new(2020, 03, 20) }) %>
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import { DateRangeStacked } from '../../'
3
+
4
+ const DateRangeStackedDefault = () => (
5
+ <div>
6
+ <DateRangeStacked
7
+ endDate={new Date('20 Mar 2020')}
8
+ startDate={new Date('18 Jun 2019')}
9
+ />
10
+ </div>
11
+ )
12
+
13
+ export default DateRangeStackedDefault
@@ -0,0 +1,11 @@
1
+ examples:
2
+
3
+ rails:
4
+ - date_range_stacked_default: Default
5
+ - date_range_stacked_dark: Dark
6
+
7
+
8
+ react:
9
+ - date_range_stacked_default: Default
10
+ - date_range_stacked_dark: Dark
11
+
@@ -0,0 +1,2 @@
1
+ export { default as DateRangeStackedDefault } from './_date_range_stacked_default.jsx'
2
+ export { default as DateRangeStackedDark } from './_date_range_stacked_dark.jsx'
@@ -8,20 +8,3 @@
8
8
  <% end %>
9
9
  </div>
10
10
  <% end %>
11
-
12
-
13
- <%# Javascript for the Popover Instance %>
14
- <% content_for :pb_js do %>
15
- <%= javascript_tag do %>
16
- window.addEventListener('DOMContentLoaded', function() {
17
- new PbPopover(
18
- "#<%= object.trigger_element_id %>",
19
- "#<%= object.tooltip_id %>",
20
- "<%= object.position %>",
21
- <%= object.popover_offset %>,
22
- )
23
- })
24
- <% end %>
25
- <% end %>
26
-
27
-
@@ -24,6 +24,7 @@ export default class PopoverWithButton extends React.Component {
24
24
 
25
25
  return (
26
26
  <PbReactPopover
27
+ offset
27
28
  placement="bottom"
28
29
  reference={popoverReference}
29
30
  show={this.state.showPopover}
@@ -0,0 +1,50 @@
1
+ import PbEnhancedElement from '../pb_enhanced_element'
2
+ import Popper from 'popper.js'
3
+
4
+ const POPOVER_OFFSET_Y = '0,8'
5
+
6
+ export default class PbPopover extends PbEnhancedElement {
7
+ static get selector() {
8
+ return '[data-pb-popover-kit]'
9
+ }
10
+
11
+ connect() {
12
+ this.popper = new Popper(this.triggerElement, this.tooltip, {
13
+ placement: this.position,
14
+ modifiers: {
15
+ offset: {
16
+ offset: this.offset,
17
+ },
18
+ },
19
+ })
20
+
21
+ this.triggerElement.addEventListener('click', () => {
22
+ this.tooltip.classList.toggle('show')
23
+ this.popper.scheduleUpdate()
24
+ })
25
+ }
26
+
27
+ get triggerElement() {
28
+ return this._triggerElement = (this._triggerElement || document.querySelector(`#${this.triggerElementId}`))
29
+ }
30
+
31
+ get tooltip() {
32
+ return this._tooltip = (this._tooltip || this.element.querySelector(`#${this.tooltipId}`))
33
+ }
34
+
35
+ get position() {
36
+ return this.element.dataset.pbPopoverPosition
37
+ }
38
+
39
+ get triggerElementId() {
40
+ return this.element.dataset.pbPopoverTriggerElementId
41
+ }
42
+
43
+ get tooltipId() {
44
+ return this.element.dataset.pbPopoverTooltipId
45
+ }
46
+
47
+ get offset() {
48
+ return this.element.dataset.pbPopoverOffset === 'true' ? POPOVER_OFFSET_Y : '0,0'
49
+ }
50
+ }
@@ -11,13 +11,19 @@ module Playbook
11
11
  prop :tooltip_id
12
12
  prop :offset, type: Playbook::Props::Boolean, default: false
13
13
 
14
- def popover_offset
15
- offset ? "0, 8" : "0, 0"
16
- end
17
-
18
14
  def classname
19
15
  generate_classname("pb_popover_kit")
20
16
  end
17
+
18
+ def data
19
+ Hash(values[:data]).merge(
20
+ pb_popover_kit: true,
21
+ pb_popover_position: position,
22
+ pb_popover_trigger_element_id: trigger_element_id,
23
+ pb_popover_tooltip_id: tooltip_id,
24
+ pb_popover_offset: offset,
25
+ )
26
+ end
21
27
  end
22
28
  end
23
29
  end
@@ -0,0 +1,3 @@
1
+ Section separator is a divider line that compartmentalizes content, typically used on cards or white backgrounds.
2
+
3
+
@@ -0,0 +1,2 @@
1
+ ### Things to Avoid
2
+ Do not use section separators to handle lists. Use List Kit.
@@ -0,0 +1 @@
1
+ This should only be use on white backgrounds. This adds a white background that will be very noticeable on other background colors.
@@ -0,0 +1 @@
1
+ This should only be use on light backgrounds (with our variable `$bg_light`).
@@ -0,0 +1,51 @@
1
+ <%= pb_rails("select", props: {
2
+ label: "Colors",
3
+ name: "foo",
4
+ data: { context_select: true },
5
+ options: [
6
+ { value: "red", value_text: "Red" },
7
+ { value: "orange", value_text: "Orange" },
8
+ { value: "yellow", value_text: "Yellow" },
9
+ { value: "green", value_text: "Green" },
10
+ { value: "blue", value_text: "Blue" },
11
+ { value: "purple", value_text: "Purple" },
12
+ ]
13
+ }) %>
14
+ <%= pb_rails("typeahead", props: { label: "Crayola Crayons", name: :foo, data: { typeahead_example2: true, search_context_value_selector: "[data-context-select] select" } }) %>
15
+
16
+ <br><br><br>
17
+
18
+
19
+ <%= javascript_tag defer: "defer" do %>
20
+ document.addEventListener("pb-typeahead-kit-search", function(event) {
21
+ if (!event.target.dataset.typeaheadExample2) return;
22
+
23
+ const fuzzyMatch = function(string, term) {
24
+ const ratio = 0.5;
25
+ string = string.toLowerCase();
26
+ const compare = term.toLowerCase();
27
+ let matches = 0;
28
+
29
+ if (string.indexOf(compare) > -1) return true;
30
+
31
+ for (let index = 0; index < compare.length; index++) {
32
+ if (string.indexOf(compare[index]) > -1) {
33
+ matches += 1
34
+ } else {
35
+ matches -=1;
36
+ }
37
+ }
38
+
39
+ return (matches / string.length >= ratio || term == "")
40
+ };
41
+
42
+ const colors = { red: ["Red", "Scarlet", "Chestnut", "Mahogany"],
43
+ orange: ["Orange", "Apricot", "Peach", "Melon", "Burnt Sienna", "Macaroni and Cheese"],
44
+ yellow: ["Yellow", "Gold", "Goldenrod", "Canary", "Laser Lemon"],
45
+ green: ["Green", "Olive Green", "Granny Smith Apple", "Spring Green", "Sea Green"],
46
+ blue: ["Blue", "Cerulean", "Bluetiful", "Sky Blue", "Cadet Blue", "Cornflower"],
47
+ purple: ["Violet", "Indigo", "Wisteria", "Purple Mountain Majesty", "Lavender"] };
48
+
49
+ event.detail.setResults(colors[event.detail.searchingContext].filter((color) => fuzzyMatch(color, event.detail.searchingFor)).map((color) => document.createTextNode(color)));
50
+ })
51
+ <% end %>
@@ -1,3 +1,4 @@
1
1
  examples:
2
2
  rails:
3
3
  - typeahead_default: Default
4
+ - typeahead_with_context: With Context
@@ -25,24 +25,27 @@ export default class PbTypeahead extends PbEnhancedElement {
25
25
 
26
26
  search() {
27
27
  if (this.searchTerm.length < this.searchTermMinimumLength) return this.clearResults()
28
- if (this.resultsOptionCache.has(this.searchTerm)) return this.showResults()
28
+
29
+ this.showResults()
29
30
 
30
31
  const searchTerm = this.searchTerm
32
+ const searchContext = this.searchContext
31
33
  const search = {
32
34
  searchingFor: searchTerm,
35
+ searchingContext: searchContext,
33
36
  setResults: (results) => {
34
- this.resultsCacheUpdate(searchTerm, results)
37
+ this.resultsCacheUpdate(searchTerm, searchContext, results)
35
38
  },
36
39
  }
37
-
38
40
  this.element.dispatchEvent(new CustomEvent('pb-typeahead-kit-search', { bubbles: true, detail: search }))
39
41
  }
40
42
 
41
- resultsCacheUpdate(searchTerm, results) {
42
- if (this.resultsOptionCache.has(searchTerm)) this.resultsOptionCache.delete(searchTerm)
43
+ resultsCacheUpdate(searchTerm, searchContext, results) {
44
+ const searchTermAndContext = this.cacheKeyFor(searchTerm, searchContext)
45
+ if (this.resultsOptionCache.has(searchTermAndContext)) this.resultsOptionCache.delete(searchTermAndContext)
43
46
  if (this.resultsOptionCache.size > 32) this.resultsOptionCache.delete(this.resultsOptionCache.keys[0])
44
47
 
45
- this.resultsOptionCache.set(searchTerm, results)
48
+ this.resultsOptionCache.set(searchTermAndContext, results)
46
49
  this.showResults()
47
50
  }
48
51
 
@@ -58,10 +61,10 @@ export default class PbTypeahead extends PbEnhancedElement {
58
61
  }
59
62
 
60
63
  showResults() {
61
- if (!this.resultsOptionCache.has(this.searchTerm)) return
64
+ if (!this.resultsOptionCache.has(this.searchTermAndContext)) return
62
65
 
63
66
  this.clearResults()
64
- for (const result of this.resultsOptionCache.get(this.searchTerm)) {
67
+ for (const result of this.resultsOptionCache.get(this.searchTermAndContext)) {
65
68
  this.resultsElement.appendChild(this.newResultOption(result.cloneNode(true)))
66
69
  }
67
70
  for (const result of this.resultsElement.querySelectorAll('[data-result-option-item]')) {
@@ -126,6 +129,30 @@ export default class PbTypeahead extends PbEnhancedElement {
126
129
  return this.searchInput.value
127
130
  }
128
131
 
132
+ get searchContext() {
133
+ if (this._searchContext) return this._searchContext
134
+
135
+ const selector = this.element.dataset.searchContextValueSelector
136
+ if (selector) return (
137
+ this.element.parentNode.querySelector(selector) ||
138
+ this.element.closest(selector)
139
+ ).value
140
+
141
+ return null
142
+ }
143
+
144
+ set searchContext(value) {
145
+ this._searchContext = value
146
+ }
147
+
148
+ get searchTermAndContext() {
149
+ return this.cacheKeyFor(this.searchTerm, this.searchContext)
150
+ }
151
+
152
+ cacheKeyFor(searchTerm, searchContext) {
153
+ return [searchTerm, JSON.stringify(searchContext)].join()
154
+ }
155
+
129
156
  searchInputClear() {
130
157
  this.searchInput.value = ''
131
158
  }
@@ -7,7 +7,3 @@ import './pb_form/pb_form_validation'
7
7
 
8
8
  // Lazy image loading
9
9
  import 'lazysizes'
10
-
11
- // Popovers
12
- import PbPopover from './pb_popover/_popover.js'
13
- window.PbPopover = PbPopover
@@ -1,6 +1,9 @@
1
1
  div class="pb--kit-show #{@kit}-kit"
2
2
  = pb_rails("title", props: { text: pb_kit_title(@kit), tag: "h1", size: 1 })
3
+ div class="markdown"
4
+ = markdown(get_kit_description(@kit))
3
5
 
6
+ div
4
7
  .pb--kit-type-nav
5
8
  - if has_kit_type?(@kit, "rails")
6
9
  a href="#{kit_show_rails_path(@kit)}" class="#{'active' if action_name == 'kit_show_rails'}" Rails
@@ -9,6 +12,12 @@ div class="pb--kit-show #{@kit}-kit"
9
12
 
10
13
  - if(action_name == "kit_show_rails")
11
14
  = pb_kit(kit: @kit)
15
+ .markdown
16
+ br
17
+ = markdown(get_kit_footer(@kit))
12
18
  = pb_kit_api(@kit)
13
19
  - else
14
20
  = pb_kit(kit: @kit, type: "react")
21
+ .markdown
22
+ br
23
+ = markdown(get_kit_footer(@kit))
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Playbook
4
- VERSION = "4.3.1"
4
+ VERSION = "4.4.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playbook_ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.1
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Power UX
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-02-14 00:00:00.000000000 Z
12
+ date: 2020-02-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -413,7 +413,7 @@ files:
413
413
  - app/pb_kits/playbook/_playbook.scss
414
414
  - app/pb_kits/playbook/config/_kit_example.html.erb
415
415
  - app/pb_kits/playbook/config/_kit_samples_list.html.erb
416
- - app/pb_kits/playbook/config/_kit_ui.html.slim
416
+ - app/pb_kits/playbook/config/_kit_ui.html.erb
417
417
  - app/pb_kits/playbook/config/_pb_kit_api.html.erb
418
418
  - app/pb_kits/playbook/data/menu.yml
419
419
  - app/pb_kits/playbook/index.js
@@ -435,6 +435,7 @@ files:
435
435
  - app/pb_kits/playbook/packs/kits/pb_dashboard_value.js
436
436
  - app/pb_kits/playbook/packs/kits/pb_date.js
437
437
  - app/pb_kits/playbook/packs/kits/pb_date_range_inline.js
438
+ - app/pb_kits/playbook/packs/kits/pb_date_range_stacked.js
438
439
  - app/pb_kits/playbook/packs/kits/pb_date_stacked.js
439
440
  - app/pb_kits/playbook/packs/kits/pb_date_year_stacked.js
440
441
  - app/pb_kits/playbook/packs/kits/pb_distribution_bar.js
@@ -678,6 +679,16 @@ files:
678
679
  - app/pb_kits/playbook/pb_date_range_inline/docs/_date_range_inline_default.jsx
679
680
  - app/pb_kits/playbook/pb_date_range_inline/docs/example.yml
680
681
  - app/pb_kits/playbook/pb_date_range_inline/docs/index.js
682
+ - app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.html.erb
683
+ - app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.jsx
684
+ - app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.scss
685
+ - app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.rb
686
+ - app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_dark.html.erb
687
+ - app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_dark.jsx
688
+ - app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_default.html.erb
689
+ - app/pb_kits/playbook/pb_date_range_stacked/docs/_date_range_stacked_default.jsx
690
+ - app/pb_kits/playbook/pb_date_range_stacked/docs/example.yml
691
+ - app/pb_kits/playbook/pb_date_range_stacked/docs/index.js
681
692
  - app/pb_kits/playbook/pb_date_stacked/_date_stacked.html.erb
682
693
  - app/pb_kits/playbook/pb_date_stacked/_date_stacked.jsx
683
694
  - app/pb_kits/playbook/pb_date_stacked/_date_stacked.scss
@@ -1039,7 +1050,6 @@ files:
1039
1050
  - app/pb_kits/playbook/pb_pill/docs/index.js
1040
1051
  - app/pb_kits/playbook/pb_pill/pill.rb
1041
1052
  - app/pb_kits/playbook/pb_popover/_popover.html.erb
1042
- - app/pb_kits/playbook/pb_popover/_popover.js
1043
1053
  - app/pb_kits/playbook/pb_popover/_popover.jsx
1044
1054
  - app/pb_kits/playbook/pb_popover/_popover.scss
1045
1055
  - app/pb_kits/playbook/pb_popover/docs/_popover_default.html.erb
@@ -1052,6 +1062,7 @@ files:
1052
1062
  - app/pb_kits/playbook/pb_popover/docs/_popover_with_circle.html.erb
1053
1063
  - app/pb_kits/playbook/pb_popover/docs/example.yml
1054
1064
  - app/pb_kits/playbook/pb_popover/docs/index.js
1065
+ - app/pb_kits/playbook/pb_popover/index.js
1055
1066
  - app/pb_kits/playbook/pb_popover/popover.rb
1056
1067
  - app/pb_kits/playbook/pb_progress_pills/_progress_pills.html.erb
1057
1068
  - app/pb_kits/playbook/pb_progress_pills/_progress_pills.jsx
@@ -1096,12 +1107,16 @@ files:
1096
1107
  - app/pb_kits/playbook/pb_section_separator/_section_separator.html.erb
1097
1108
  - app/pb_kits/playbook/pb_section_separator/_section_separator.jsx
1098
1109
  - app/pb_kits/playbook/pb_section_separator/_section_separator.scss
1110
+ - app/pb_kits/playbook/pb_section_separator/docs/_description.md
1111
+ - app/pb_kits/playbook/pb_section_separator/docs/_footer.md
1099
1112
  - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_line.html.erb
1100
1113
  - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_line.jsx
1101
1114
  - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.html.erb
1102
1115
  - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.jsx
1116
+ - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.md
1103
1117
  - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text_background.html.erb
1104
1118
  - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text_background.jsx
1119
+ - app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text_background.md
1105
1120
  - app/pb_kits/playbook/pb_section_separator/docs/example.yml
1106
1121
  - app/pb_kits/playbook/pb_section_separator/docs/index.js
1107
1122
  - app/pb_kits/playbook/pb_section_separator/section_separator.rb
@@ -1317,6 +1332,7 @@ files:
1317
1332
  - app/pb_kits/playbook/pb_typeahead/_typeahead.html.erb
1318
1333
  - app/pb_kits/playbook/pb_typeahead/_typeahead.scss
1319
1334
  - app/pb_kits/playbook/pb_typeahead/docs/_typeahead_default.html.erb
1335
+ - app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_context.html.erb
1320
1336
  - app/pb_kits/playbook/pb_typeahead/docs/example.yml
1321
1337
  - app/pb_kits/playbook/pb_typeahead/index.js
1322
1338
  - app/pb_kits/playbook/pb_typeahead/typeahead.rb
@@ -1,34 +0,0 @@
1
- - type ||= "rails"
2
-
3
- - if type == "react"
4
- - contents = File.read("#{Playbook::Engine.root}/app/pb_kits/playbook/pb_#{@kit_examples[:kit]}/docs/_#{key}.jsx")
5
- - else
6
- - contents = File.read("#{Playbook::Engine.root}/app/pb_kits/playbook/pb_#{@kit_examples[:kit]}/docs/_#{key}.html.erb")
7
-
8
- .pb--kit-example
9
- = pb_rails("caption", props: { text: item })
10
- br
11
- - if type == "rails"
12
- = render partial: "pb_#{@kit_examples[:kit]}/docs/#{key}"
13
- - elsif type == "react"
14
- = pb_react(key.camelize)
15
- br
16
-
17
- - if @samples
18
- = render partial: "kit_samples_list"
19
-
20
- - if defined?(rouge)
21
- - if @show_code
22
- .pb--codeControls
23
- ul
24
- li
25
- a href="#" data-toggle="code_example" Code Example
26
-
27
- .pb--codeCopy data-action="toggle" data-togglable="code_example"
28
- a.pb--close-toggle href="#" data-toggle="false" Close
29
- pre.highlight
30
- - if type == "rails"
31
- = raw rouge(contents, "erb")
32
- - elsif type == "react"
33
- = raw rouge(contents, "react")
34
-
@@ -1,46 +0,0 @@
1
- import Popper from 'popper.js'
2
-
3
- class PbPopover {
4
- constructor(
5
- triggerElement = '#triggerElement',
6
- tooltip = '#tooltip',
7
- placement = 'left',
8
- offset,
9
- ) {
10
- this.triggerElement = triggerElement
11
- this.tooltip = tooltip
12
- this.placement = placement
13
- this.offset = offset
14
- this.setupPopper()
15
- }
16
-
17
- //getters
18
- get referenceElement() {
19
- return document.querySelector(this.triggerElement)
20
- }
21
- get popoverTooltip() {
22
- return document.querySelector(this.tooltip)
23
- }
24
-
25
- attachEvents() {
26
- this.referenceElement.addEventListener('click', () => {
27
- this.popoverTooltip.classList.toggle('show')
28
- this.popper.scheduleUpdate()
29
- })
30
- }
31
-
32
- setupPopper() {
33
- this.popper = new Popper(this.referenceElement, this.popoverTooltip, {
34
- placement: this.placement,
35
- modifiers: {
36
- offset: {
37
- offset: this.offset,
38
- },
39
- },
40
- })
41
-
42
- this.attachEvents()
43
- }
44
- }
45
-
46
- export default PbPopover