view_component_storybook 0.2.0 → 0.3.0
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/README.md +11 -12
- data/lib/view_component/storybook.rb +1 -1
- data/lib/view_component/storybook/{knobs.rb → controls.rb} +2 -2
- data/lib/view_component/storybook/{knobs → controls}/array_config.rb +10 -8
- data/lib/view_component/storybook/{knobs/knob_config.rb → controls/control_config.rb} +19 -8
- data/lib/view_component/storybook/{knobs → controls}/date_config.rb +13 -13
- data/lib/view_component/storybook/{knobs → controls}/number_config.rb +12 -10
- data/lib/view_component/storybook/{knobs → controls}/object_config.rb +2 -2
- data/lib/view_component/storybook/{knobs → controls}/options_config.rb +7 -5
- data/lib/view_component/storybook/{knobs → controls}/simple_config.rb +4 -4
- data/lib/view_component/storybook/dsl.rb +1 -1
- data/lib/view_component/storybook/dsl/controls_dsl.rb +81 -0
- data/lib/view_component/storybook/dsl/story_dsl.rb +4 -4
- data/lib/view_component/storybook/stories.rb +0 -3
- data/lib/view_component/storybook/story_config.rb +9 -7
- data/lib/view_component/storybook/version.rb +1 -1
- metadata +10 -10
- data/lib/view_component/storybook/dsl/knobs_dsl.rb +0 -81
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 69b5a85793ed8d4ecfe45be21c90a95894f001403ea9a6c086c9822e5b4fca4d
         | 
| 4 | 
            +
              data.tar.gz: 15b8f5b6430c46b5a3cd453602c4705dea94784b574f6d3a1a9b1ab39c40d1bb
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: '091149f57b05dc6bf82b1dac987ab6dbaaa6655e8c0833517eb575d8ce8abb05e75b8919a63799ad4efaa5da1722fbf5bee7f34c4680a12f969c6996532e53f7'
         | 
| 7 | 
            +
              data.tar.gz: bf0f10bc68bc35197ca9485efbc3fe18bcad98b110df969f3219daeaeb4797f1c1e7c6eb4ce3aeb737246571227c91c466b4d7c63dd4ff141c0a3962b47caf29
         | 
    
        data/README.md
    CHANGED
    
    | @@ -4,7 +4,7 @@ The ViewComponent::Storybook gem provides Ruby api for writing stories describin | |
| 4 4 |  | 
| 5 5 | 
             
            ## Features
         | 
| 6 6 | 
             
            * A Ruby DSL for writing Stories describing View Components
         | 
| 7 | 
            -
            * A Rails controller backend for Storybook Server compatible with  | 
| 7 | 
            +
            * A Rails controller backend for Storybook Server compatible with Strobook Controls Addon parameters
         | 
| 8 8 | 
             
            * Coming Soon: Rake tasks to watch View Components and Stories and trigger Storybook hot reloading
         | 
| 9 9 |  | 
| 10 10 | 
             
            ## Installation
         | 
| @@ -18,9 +18,9 @@ The ViewComponent::Storybook gem provides Ruby api for writing stories describin | |
| 18 18 |  | 
| 19 19 | 
             
            ### Storybook Installation
         | 
| 20 20 |  | 
| 21 | 
            -
            1. Add Storybook server as a dev dependedncy. The Storybook  | 
| 21 | 
            +
            1. Add Storybook server as a dev dependedncy. The Storybook Controls addon isn't needed but is strongly recommended
         | 
| 22 22 | 
             
               ```sh
         | 
| 23 | 
            -
               yarn add @storybook/server @storybook/addon- | 
| 23 | 
            +
               yarn add @storybook/server @storybook/addon-controls --dev
         | 
| 24 24 | 
             
               ```
         | 
| 25 25 | 
             
            2. Add an NPM script to your package.json in order to start the storybook later in this guide
         | 
| 26 26 | 
             
               ```json
         | 
| @@ -30,28 +30,27 @@ The ViewComponent::Storybook gem provides Ruby api for writing stories describin | |
| 30 30 | 
             
                 }
         | 
| 31 31 | 
             
               }
         | 
| 32 32 | 
             
               ```    
         | 
| 33 | 
            -
            3. Create the .storybook/main.js file to configure Storybook to find the json stories the gem creates. Also configure the  | 
| 33 | 
            +
            3. Create the .storybook/main.js file to configure Storybook to find the json stories the gem creates. Also configure the Controls addon:
         | 
| 34 34 | 
             
               ```javascript
         | 
| 35 35 | 
             
               module.exports = {
         | 
| 36 36 | 
             
                 stories: ['../test/components/**/*.stories.json'],
         | 
| 37 37 | 
             
                 addons: [
         | 
| 38 | 
            -
                   '@storybook/addon- | 
| 38 | 
            +
                   '@storybook/addon-controls',
         | 
| 39 39 | 
             
                 ],
         | 
| 40 40 | 
             
               };
         | 
| 41 41 | 
             
               ```
         | 
| 42 42 | 
             
            4. Create the .storybook/preview.js file to configure Storybook with the Rails application url to call for the html content of the stories
         | 
| 43 43 | 
             
               ```javascript
         | 
| 44 | 
            -
               import { addParameters } from '@storybook/server';
         | 
| 45 44 |  | 
| 46 | 
            -
                | 
| 45 | 
            +
               export const parameters = {
         | 
| 47 46 | 
             
                 server: {
         | 
| 48 47 | 
             
                   url: `http://localhost:3000/rails/stories`,
         | 
| 49 48 | 
             
                 },
         | 
| 50 | 
            -
               } | 
| 49 | 
            +
               };
         | 
| 51 50 | 
             
               ```
         | 
| 52 51 |  | 
| 53 52 |  | 
| 54 | 
            -
            Note: `@storybook/server` will be part of the upcoming Storybook 6.0 release. Until that is released you'll need to use an [ | 
| 53 | 
            +
            Note: `@storybook/server` will be part of the upcoming Storybook 6.0 release. Until that is released you'll need to use an [rc release](https://github.com/storybookjs/storybook/releases/tag/v6.0.0-rc.14)
         | 
| 55 54 |  | 
| 56 55 | 
             
            ## Usage
         | 
| 57 56 |  | 
| @@ -74,13 +73,13 @@ We can write a stories desecibing the `ButtonComponent` | |
| 74 73 | 
             
            ```ruby
         | 
| 75 74 | 
             
            class ButtonComponentStories < ViewComponent::Storybook::Stories
         | 
| 76 75 | 
             
              story(:with_short_text) do
         | 
| 77 | 
            -
                 | 
| 76 | 
            +
                controls do
         | 
| 78 77 | 
             
                  text(:button_text, 'OK')
         | 
| 79 78 | 
             
                end
         | 
| 80 79 | 
             
              end
         | 
| 81 80 |  | 
| 82 81 | 
             
              story(:with_long_text) do
         | 
| 83 | 
            -
                 | 
| 82 | 
            +
                controls do
         | 
| 84 83 | 
             
                  text(:button_text, 'Push Me Please!')
         | 
| 85 84 | 
             
                end
         | 
| 86 85 | 
             
              end
         | 
| @@ -121,7 +120,7 @@ Coming Soon | |
| 121 120 |  | 
| 122 121 | 
             
            #### Parameters
         | 
| 123 122 | 
             
            #### Layout
         | 
| 124 | 
            -
            ####  | 
| 123 | 
            +
            #### Controls
         | 
| 125 124 |  | 
| 126 125 |  | 
| 127 126 | 
             
            ## Development
         | 
| @@ -4,10 +4,10 @@ require "active_support/dependencies/autoload" | |
| 4 4 |  | 
| 5 5 | 
             
            module ViewComponent
         | 
| 6 6 | 
             
              module Storybook
         | 
| 7 | 
            -
                module  | 
| 7 | 
            +
                module Controls
         | 
| 8 8 | 
             
                  extend ActiveSupport::Autoload
         | 
| 9 9 |  | 
| 10 | 
            -
                  autoload : | 
| 10 | 
            +
                  autoload :ControlConfig
         | 
| 11 11 | 
             
                  autoload :SimpleConfig
         | 
| 12 12 | 
             
                  autoload :NumberConfig
         | 
| 13 13 | 
             
                  autoload :OptionsConfig
         | 
| @@ -2,21 +2,17 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module ViewComponent
         | 
| 4 4 | 
             
              module Storybook
         | 
| 5 | 
            -
                module  | 
| 6 | 
            -
                  class ArrayConfig <  | 
| 5 | 
            +
                module Controls
         | 
| 6 | 
            +
                  class ArrayConfig < ControlConfig
         | 
| 7 7 | 
             
                    attr_reader :separator
         | 
| 8 8 |  | 
| 9 9 | 
             
                    validates :value, :separator, presence: true
         | 
| 10 10 |  | 
| 11 | 
            -
                    def initialize(component, param, value, separator = ",", name: nil | 
| 12 | 
            -
                      super(component, param, value, name: name | 
| 11 | 
            +
                    def initialize(component, param, value, separator = ",", name: nil)
         | 
| 12 | 
            +
                      super(component, param, value, name: name)
         | 
| 13 13 | 
             
                      @separator = separator
         | 
| 14 14 | 
             
                    end
         | 
| 15 15 |  | 
| 16 | 
            -
                    def to_csf_params
         | 
| 17 | 
            -
                      super.merge(value: value, separator: separator)
         | 
| 18 | 
            -
                    end
         | 
| 19 | 
            -
             | 
| 20 16 | 
             
                    def type
         | 
| 21 17 | 
             
                      :array
         | 
| 22 18 | 
             
                    end
         | 
| @@ -28,6 +24,12 @@ module ViewComponent | |
| 28 24 | 
             
                        super(param)
         | 
| 29 25 | 
             
                      end
         | 
| 30 26 | 
             
                    end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    private
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def csf_control_params
         | 
| 31 | 
            +
                      super.merge(separator: separator)
         | 
| 32 | 
            +
                    end
         | 
| 31 33 | 
             
                  end
         | 
| 32 34 | 
             
                end
         | 
| 33 35 | 
             
              end
         | 
| @@ -2,28 +2,28 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module ViewComponent
         | 
| 4 4 | 
             
              module Storybook
         | 
| 5 | 
            -
                module  | 
| 6 | 
            -
                  class  | 
| 5 | 
            +
                module Controls
         | 
| 6 | 
            +
                  class ControlConfig
         | 
| 7 7 | 
             
                    include ActiveModel::Validations
         | 
| 8 8 |  | 
| 9 | 
            -
                    attr_reader :component, :param, :value, :name | 
| 9 | 
            +
                    attr_reader :component, :param, :value, :name
         | 
| 10 10 |  | 
| 11 11 | 
             
                    validates :component, :param, presence: true
         | 
| 12 12 | 
             
                    validates :param, inclusion: { in: ->(knob_config) { knob_config.component_params } }, unless: -> { component.nil? }
         | 
| 13 13 |  | 
| 14 | 
            -
                    def initialize(component, param, value, name: nil | 
| 14 | 
            +
                    def initialize(component, param, value, name: nil)
         | 
| 15 15 | 
             
                      @component = component
         | 
| 16 16 | 
             
                      @param = param
         | 
| 17 17 | 
             
                      @value = value
         | 
| 18 18 | 
             
                      @name = name || param.to_s.humanize.titlecase
         | 
| 19 | 
            -
                      @group_id = group_id
         | 
| 20 19 | 
             
                    end
         | 
| 21 20 |  | 
| 22 21 | 
             
                    def to_csf_params
         | 
| 23 22 | 
             
                      validate!
         | 
| 24 | 
            -
                       | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 23 | 
            +
                      {
         | 
| 24 | 
            +
                        args: { param => csf_value },
         | 
| 25 | 
            +
                        argTypes: { param => { control: csf_control_params, name: name } }
         | 
| 26 | 
            +
                      }
         | 
| 27 27 | 
             
                    end
         | 
| 28 28 |  | 
| 29 29 | 
             
                    def value_from_param(param)
         | 
| @@ -33,6 +33,17 @@ module ViewComponent | |
| 33 33 | 
             
                    def component_params
         | 
| 34 34 | 
             
                      @component_params ||= component && component.instance_method(:initialize).parameters.map(&:last)
         | 
| 35 35 | 
             
                    end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    private
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    # provide extension points for subclasses to vary the value
         | 
| 40 | 
            +
                    def csf_value
         | 
| 41 | 
            +
                      value
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    def csf_control_params
         | 
| 45 | 
            +
                      { type: type }
         | 
| 46 | 
            +
                    end
         | 
| 36 47 | 
             
                  end
         | 
| 37 48 | 
             
                end
         | 
| 38 49 | 
             
              end
         | 
| @@ -2,21 +2,12 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module ViewComponent
         | 
| 4 4 | 
             
              module Storybook
         | 
| 5 | 
            -
                module  | 
| 6 | 
            -
                  class DateConfig <  | 
| 5 | 
            +
                module Controls
         | 
| 6 | 
            +
                  class DateConfig < ControlConfig
         | 
| 7 7 | 
             
                    validates :value, presence: true
         | 
| 8 8 |  | 
| 9 | 
            -
                    def initialize(component, param, value, name: nil | 
| 10 | 
            -
                      super(component, param, value, name: name | 
| 11 | 
            -
                    end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                    def to_csf_params
         | 
| 14 | 
            -
                      csf_params = super
         | 
| 15 | 
            -
                      params_value = value
         | 
| 16 | 
            -
                      params_value = params_value.in_time_zone if params_value.is_a?(Date)
         | 
| 17 | 
            -
                      params_value = params_value.iso8601 if params_value.is_a?(Time)
         | 
| 18 | 
            -
                      csf_params[:value] = params_value
         | 
| 19 | 
            -
                      csf_params
         | 
| 9 | 
            +
                    def initialize(component, param, value, name: nil)
         | 
| 10 | 
            +
                      super(component, param, value, name: name)
         | 
| 20 11 | 
             
                    end
         | 
| 21 12 |  | 
| 22 13 | 
             
                    def type
         | 
| @@ -30,6 +21,15 @@ module ViewComponent | |
| 30 21 | 
             
                        super(param)
         | 
| 31 22 | 
             
                      end
         | 
| 32 23 | 
             
                    end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    private
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    def csf_value
         | 
| 28 | 
            +
                      params_value = value
         | 
| 29 | 
            +
                      params_value = params_value.in_time_zone if params_value.is_a?(Date)
         | 
| 30 | 
            +
                      params_value = params_value.iso8601 if params_value.is_a?(Time)
         | 
| 31 | 
            +
                      params_value
         | 
| 32 | 
            +
                    end
         | 
| 33 33 | 
             
                  end
         | 
| 34 34 | 
             
                end
         | 
| 35 35 | 
             
              end
         | 
| @@ -2,14 +2,14 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module ViewComponent
         | 
| 4 4 | 
             
              module Storybook
         | 
| 5 | 
            -
                module  | 
| 6 | 
            -
                  class NumberConfig <  | 
| 5 | 
            +
                module Controls
         | 
| 6 | 
            +
                  class NumberConfig < ControlConfig
         | 
| 7 7 | 
             
                    attr_reader :options
         | 
| 8 8 |  | 
| 9 9 | 
             
                    validates :value, presence: true
         | 
| 10 10 |  | 
| 11 | 
            -
                    def initialize(component, param, value, options = {}, name: nil | 
| 12 | 
            -
                      super(component, param, value, name: name | 
| 11 | 
            +
                    def initialize(component, param, value, options = {}, name: nil)
         | 
| 12 | 
            +
                      super(component, param, value, name: name)
         | 
| 13 13 | 
             
                      @options = options
         | 
| 14 14 | 
             
                    end
         | 
| 15 15 |  | 
| @@ -17,12 +17,6 @@ module ViewComponent | |
| 17 17 | 
             
                      :number
         | 
| 18 18 | 
             
                    end
         | 
| 19 19 |  | 
| 20 | 
            -
                    def to_csf_params
         | 
| 21 | 
            -
                      params = super
         | 
| 22 | 
            -
                      params[:options] = options unless options.empty?
         | 
| 23 | 
            -
                      params
         | 
| 24 | 
            -
                    end
         | 
| 25 | 
            -
             | 
| 26 20 | 
             
                    def value_from_param(param)
         | 
| 27 21 | 
             
                      if param.is_a?(String) && param.present?
         | 
| 28 22 | 
             
                        (param.to_f % 1) > 0 ? param.to_f : param.to_i
         | 
| @@ -30,6 +24,14 @@ module ViewComponent | |
| 30 24 | 
             
                        super(param)
         | 
| 31 25 | 
             
                      end
         | 
| 32 26 | 
             
                    end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    private
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def csf_control_params
         | 
| 31 | 
            +
                      params = super
         | 
| 32 | 
            +
                      params[:options] = options unless options.empty?
         | 
| 33 | 
            +
                      params
         | 
| 34 | 
            +
                    end
         | 
| 33 35 | 
             
                  end
         | 
| 34 36 | 
             
                end
         | 
| 35 37 | 
             
              end
         | 
| @@ -2,8 +2,8 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module ViewComponent
         | 
| 4 4 | 
             
              module Storybook
         | 
| 5 | 
            -
                module  | 
| 6 | 
            -
                  class OptionsConfig <  | 
| 5 | 
            +
                module Controls
         | 
| 6 | 
            +
                  class OptionsConfig < ControlConfig
         | 
| 7 7 | 
             
                    TYPES = %i[select radios].freeze
         | 
| 8 8 |  | 
| 9 9 | 
             
                    attr_reader :type, :options
         | 
| @@ -12,13 +12,15 @@ module ViewComponent | |
| 12 12 | 
             
                    validates :type, inclusion: { in: TYPES }, unless: -> { type.nil? }
         | 
| 13 13 | 
             
                    validates :value, inclusion: { in: ->(config) { config.options.values } }, unless: -> { options.nil? || value.nil? }
         | 
| 14 14 |  | 
| 15 | 
            -
                    def initialize(type, component, param, options, default_value, name: nil | 
| 16 | 
            -
                      super(component, param, default_value, name: name | 
| 15 | 
            +
                    def initialize(type, component, param, options, default_value, name: nil)
         | 
| 16 | 
            +
                      super(component, param, default_value, name: name)
         | 
| 17 17 | 
             
                      @type = type
         | 
| 18 18 | 
             
                      @options = options
         | 
| 19 19 | 
             
                    end
         | 
| 20 20 |  | 
| 21 | 
            -
                     | 
| 21 | 
            +
                    private
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    def csf_control_params
         | 
| 22 24 | 
             
                      super.merge(options: options)
         | 
| 23 25 | 
             
                    end
         | 
| 24 26 | 
             
                  end
         | 
| @@ -2,8 +2,8 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module ViewComponent
         | 
| 4 4 | 
             
              module Storybook
         | 
| 5 | 
            -
                module  | 
| 6 | 
            -
                  class SimpleConfig <  | 
| 5 | 
            +
                module Controls
         | 
| 6 | 
            +
                  class SimpleConfig < ControlConfig
         | 
| 7 7 | 
             
                    TYPES = %i[text boolean color].freeze
         | 
| 8 8 | 
             
                    BOOLEAN_VALUES = [true, false].freeze
         | 
| 9 9 |  | 
| @@ -15,8 +15,8 @@ module ViewComponent | |
| 15 15 | 
             
                    validates :type, presence: true
         | 
| 16 16 | 
             
                    validates :type, inclusion: { in: TYPES }, unless: -> { type.nil? }
         | 
| 17 17 |  | 
| 18 | 
            -
                    def initialize(type, component, param, value, name: nil | 
| 19 | 
            -
                      super(component, param, value, name: name | 
| 18 | 
            +
                    def initialize(type, component, param, value, name: nil)
         | 
| 19 | 
            +
                      super(component, param, value, name: name)
         | 
| 20 20 | 
             
                      @type = type
         | 
| 21 21 | 
             
                    end
         | 
| 22 22 |  | 
| @@ -0,0 +1,81 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ViewComponent
         | 
| 4 | 
            +
              module Storybook
         | 
| 5 | 
            +
                module Dsl
         | 
| 6 | 
            +
                  class ControlsDsl
         | 
| 7 | 
            +
                    attr_reader :component, :controls
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                    def initialize(component)
         | 
| 10 | 
            +
                      @component = component
         | 
| 11 | 
            +
                      @controls = []
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def text(param, value, name: nil)
         | 
| 15 | 
            +
                      controls << Controls::SimpleConfig.new(:text, component, param, value, name: name)
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    def boolean(param, value, name: nil)
         | 
| 19 | 
            +
                      controls << Controls::SimpleConfig.new(:boolean, component, param, value, name: name)
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    def number(param, value, options = {}, name: nil)
         | 
| 23 | 
            +
                      controls << Controls::NumberConfig.new(component, param, value, options, name: name)
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    def color(param, value, name: nil)
         | 
| 27 | 
            +
                      controls << Controls::SimpleConfig.new(:color, component, param, value, name: name)
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def object(param, value, name: nil)
         | 
| 31 | 
            +
                      controls << Controls::ObjectConfig.new(component, param, value, name: name)
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def select(param, options, value, name: nil)
         | 
| 35 | 
            +
                      controls << Controls::OptionsConfig.new(:select, component, param, options, value, name: name)
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def radios(param, options, value, name: nil)
         | 
| 39 | 
            +
                      controls << Controls::OptionsConfig.new(:radios, component, param, options, value, name: name)
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    def array(param, value, separator = ",", name: nil)
         | 
| 43 | 
            +
                      controls << Controls::ArrayConfig.new(component, param, value, separator, name: name)
         | 
| 44 | 
            +
                    end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                    def date(param, value, name: nil)
         | 
| 47 | 
            +
                      controls << Controls::DateConfig.new(component, param, value, name: name)
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    def respond_to_missing?(_method)
         | 
| 51 | 
            +
                      true
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    def method_missing(method, *args)
         | 
| 55 | 
            +
                      value = args.first
         | 
| 56 | 
            +
                      knob_method = case value
         | 
| 57 | 
            +
                                    when Date
         | 
| 58 | 
            +
                                      :date
         | 
| 59 | 
            +
                                    when Array
         | 
| 60 | 
            +
                                      :array
         | 
| 61 | 
            +
                                    when Hash
         | 
| 62 | 
            +
                                      :object
         | 
| 63 | 
            +
                                    when Numeric
         | 
| 64 | 
            +
                                      :number
         | 
| 65 | 
            +
                                    when TrueClass, FalseClass
         | 
| 66 | 
            +
                                      :boolean
         | 
| 67 | 
            +
                                    when String
         | 
| 68 | 
            +
                                      :text
         | 
| 69 | 
            +
                                    end
         | 
| 70 | 
            +
                      if knob_method
         | 
| 71 | 
            +
                        send(knob_method, method, *args)
         | 
| 72 | 
            +
                      else
         | 
| 73 | 
            +
                        super
         | 
| 74 | 
            +
                      end
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                    Controls = ViewComponent::Storybook::Controls
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
            end
         | 
| @@ -12,10 +12,10 @@ module ViewComponent | |
| 12 12 | 
             
                      @story_config.parameters = params
         | 
| 13 13 | 
             
                    end
         | 
| 14 14 |  | 
| 15 | 
            -
                    def  | 
| 16 | 
            -
                       | 
| 17 | 
            -
                       | 
| 18 | 
            -
                      @story_config. | 
| 15 | 
            +
                    def controls(&block)
         | 
| 16 | 
            +
                      controls_dsl = ControlsDsl.new(story_config.component)
         | 
| 17 | 
            +
                      controls_dsl.instance_eval(&block)
         | 
| 18 | 
            +
                      @story_config.controls = controls_dsl.controls
         | 
| 19 19 | 
             
                    end
         | 
| 20 20 |  | 
| 21 21 | 
             
                    def layout(layout)
         | 
| @@ -26,10 +26,7 @@ module ViewComponent | |
| 26 26 | 
             
                    end
         | 
| 27 27 |  | 
| 28 28 | 
             
                    def to_csf_params
         | 
| 29 | 
            -
                      stories_csf = story_configs.map(&:to_csf_params)
         | 
| 30 | 
            -
             | 
| 31 29 | 
             
                      csf_params = { title: title }
         | 
| 32 | 
            -
                      csf_params[:addons] = ["knobs"] if stories_csf.any? { |csf| csf.key?(:knobs) }
         | 
| 33 30 | 
             
                      csf_params[:parameters] = parameters if parameters.present?
         | 
| 34 31 | 
             
                      csf_params[:stories] = story_configs.map(&:to_csf_params)
         | 
| 35 32 | 
             
                      csf_params
         | 
| @@ -6,28 +6,30 @@ module ViewComponent | |
| 6 6 | 
             
                  include ActiveModel::Validations
         | 
| 7 7 |  | 
| 8 8 | 
             
                  attr_reader :id, :name, :component
         | 
| 9 | 
            -
                  attr_accessor : | 
| 9 | 
            +
                  attr_accessor :controls, :parameters, :layout, :content_block
         | 
| 10 10 |  | 
| 11 11 | 
             
                  def initialize(id, name, component, layout)
         | 
| 12 12 | 
             
                    @id = id
         | 
| 13 13 | 
             
                    @name = name
         | 
| 14 14 | 
             
                    @component = component
         | 
| 15 15 | 
             
                    @layout = layout
         | 
| 16 | 
            -
                    @ | 
| 16 | 
            +
                    @controls = []
         | 
| 17 17 | 
             
                  end
         | 
| 18 18 |  | 
| 19 19 | 
             
                  def to_csf_params
         | 
| 20 20 | 
             
                    csf_params = { name: name, parameters: { server: { id: id } } }
         | 
| 21 21 | 
             
                    csf_params.deep_merge!(parameters: parameters) if parameters.present?
         | 
| 22 | 
            -
                     | 
| 22 | 
            +
                    controls.each do |control|
         | 
| 23 | 
            +
                      csf_params.deep_merge!(control.to_csf_params)
         | 
| 24 | 
            +
                    end
         | 
| 23 25 | 
             
                    csf_params
         | 
| 24 26 | 
             
                  end
         | 
| 25 27 |  | 
| 26 28 | 
             
                  def values_from_params(params)
         | 
| 27 | 
            -
                     | 
| 28 | 
            -
                      value =  | 
| 29 | 
            -
                      value =  | 
| 30 | 
            -
                      [ | 
| 29 | 
            +
                    controls.map do |control|
         | 
| 30 | 
            +
                      value = control.value_from_param(params[control.param])
         | 
| 31 | 
            +
                      value = control.value if value.nil? # nil only not falsey
         | 
| 32 | 
            +
                      [control.param, value]
         | 
| 31 33 | 
             
                    end.to_h
         | 
| 32 34 | 
             
                  end
         | 
| 33 35 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: view_component_storybook
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jon Palmer
         | 
| @@ -162,18 +162,18 @@ files: | |
| 162 162 | 
             
            - app/controllers/view_component/storybook/stories_controller.rb
         | 
| 163 163 | 
             
            - app/views/view_component/storybook/stories/show.html.erb
         | 
| 164 164 | 
             
            - lib/view_component/storybook.rb
         | 
| 165 | 
            +
            - lib/view_component/storybook/controls.rb
         | 
| 166 | 
            +
            - lib/view_component/storybook/controls/array_config.rb
         | 
| 167 | 
            +
            - lib/view_component/storybook/controls/control_config.rb
         | 
| 168 | 
            +
            - lib/view_component/storybook/controls/date_config.rb
         | 
| 169 | 
            +
            - lib/view_component/storybook/controls/number_config.rb
         | 
| 170 | 
            +
            - lib/view_component/storybook/controls/object_config.rb
         | 
| 171 | 
            +
            - lib/view_component/storybook/controls/options_config.rb
         | 
| 172 | 
            +
            - lib/view_component/storybook/controls/simple_config.rb
         | 
| 165 173 | 
             
            - lib/view_component/storybook/dsl.rb
         | 
| 166 | 
            -
            - lib/view_component/storybook/dsl/ | 
| 174 | 
            +
            - lib/view_component/storybook/dsl/controls_dsl.rb
         | 
| 167 175 | 
             
            - lib/view_component/storybook/dsl/story_dsl.rb
         | 
| 168 176 | 
             
            - lib/view_component/storybook/engine.rb
         | 
| 169 | 
            -
            - lib/view_component/storybook/knobs.rb
         | 
| 170 | 
            -
            - lib/view_component/storybook/knobs/array_config.rb
         | 
| 171 | 
            -
            - lib/view_component/storybook/knobs/date_config.rb
         | 
| 172 | 
            -
            - lib/view_component/storybook/knobs/knob_config.rb
         | 
| 173 | 
            -
            - lib/view_component/storybook/knobs/number_config.rb
         | 
| 174 | 
            -
            - lib/view_component/storybook/knobs/object_config.rb
         | 
| 175 | 
            -
            - lib/view_component/storybook/knobs/options_config.rb
         | 
| 176 | 
            -
            - lib/view_component/storybook/knobs/simple_config.rb
         | 
| 177 177 | 
             
            - lib/view_component/storybook/stories.rb
         | 
| 178 178 | 
             
            - lib/view_component/storybook/story_config.rb
         | 
| 179 179 | 
             
            - lib/view_component/storybook/tasks/write_stories_json.rake
         | 
| @@ -1,81 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module ViewComponent
         | 
| 4 | 
            -
              module Storybook
         | 
| 5 | 
            -
                module Dsl
         | 
| 6 | 
            -
                  class KnobsDsl
         | 
| 7 | 
            -
                    attr_reader :component, :knobs
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                    def initialize(component)
         | 
| 10 | 
            -
                      @component = component
         | 
| 11 | 
            -
                      @knobs = []
         | 
| 12 | 
            -
                    end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                    def text(param, value, group_id: nil, name: nil)
         | 
| 15 | 
            -
                      knobs << Knobs::SimpleConfig.new(:text, component, param, value, group_id: group_id, name: name)
         | 
| 16 | 
            -
                    end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                    def boolean(param, value, group_id: nil, name: nil)
         | 
| 19 | 
            -
                      knobs << Knobs::SimpleConfig.new(:boolean, component, param, value, group_id: group_id, name: name)
         | 
| 20 | 
            -
                    end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                    def number(param, value, options = {}, group_id: nil, name: nil)
         | 
| 23 | 
            -
                      knobs << Knobs::NumberConfig.new(component, param, value, options, group_id: group_id, name: name)
         | 
| 24 | 
            -
                    end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
                    def color(param, value, group_id: nil, name: nil)
         | 
| 27 | 
            -
                      knobs << Knobs::SimpleConfig.new(:color, component, param, value, group_id: group_id, name: name)
         | 
| 28 | 
            -
                    end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                    def object(param, value, group_id: nil, name: nil)
         | 
| 31 | 
            -
                      knobs << Knobs::ObjectConfig.new(component, param, value, group_id: group_id, name: name)
         | 
| 32 | 
            -
                    end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                    def select(param, options, value, group_id: nil, name: nil)
         | 
| 35 | 
            -
                      knobs << Knobs::OptionsConfig.new(:select, component, param, options, value, group_id: group_id, name: name)
         | 
| 36 | 
            -
                    end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                    def radios(param, options, value, group_id: nil, name: nil)
         | 
| 39 | 
            -
                      knobs << Knobs::OptionsConfig.new(:radios, component, param, options, value, group_id: group_id, name: name)
         | 
| 40 | 
            -
                    end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                    def array(param, value, separator = ",", group_id: nil, name: nil)
         | 
| 43 | 
            -
                      knobs << Knobs::ArrayConfig.new(component, param, value, separator, group_id: group_id, name: name)
         | 
| 44 | 
            -
                    end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                    def date(param, value, group_id: nil, name: nil)
         | 
| 47 | 
            -
                      knobs << Knobs::DateConfig.new(component, param, value, group_id: group_id, name: name)
         | 
| 48 | 
            -
                    end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                    def respond_to_missing?(_method)
         | 
| 51 | 
            -
                      true
         | 
| 52 | 
            -
                    end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                    def method_missing(method, *args)
         | 
| 55 | 
            -
                      value = args.first
         | 
| 56 | 
            -
                      knob_method = case value
         | 
| 57 | 
            -
                                    when Date
         | 
| 58 | 
            -
                                      :date
         | 
| 59 | 
            -
                                    when Array
         | 
| 60 | 
            -
                                      :array
         | 
| 61 | 
            -
                                    when Hash
         | 
| 62 | 
            -
                                      :object
         | 
| 63 | 
            -
                                    when Numeric
         | 
| 64 | 
            -
                                      :number
         | 
| 65 | 
            -
                                    when TrueClass, FalseClass
         | 
| 66 | 
            -
                                      :boolean
         | 
| 67 | 
            -
                                    when String
         | 
| 68 | 
            -
                                      :text
         | 
| 69 | 
            -
                                    end
         | 
| 70 | 
            -
                      if knob_method
         | 
| 71 | 
            -
                        send(knob_method, method, *args)
         | 
| 72 | 
            -
                      else
         | 
| 73 | 
            -
                        super
         | 
| 74 | 
            -
                      end
         | 
| 75 | 
            -
                    end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                    Knobs = ViewComponent::Storybook::Knobs
         | 
| 78 | 
            -
                  end
         | 
| 79 | 
            -
                end
         | 
| 80 | 
            -
              end
         | 
| 81 | 
            -
            end
         |