Skip to content

Commit

Permalink
feature: fields Default Option (#88)
Browse files Browse the repository at this point in the history
Co-authored-by: Adrian Marin <[email protected]>
  • Loading branch information
mihaimdm22 and adrianthedev authored Jul 28, 2020
1 parent 48b1b4b commit 4660f05
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 5 deletions.
2 changes: 1 addition & 1 deletion app/frontend/js/views/ResourceIndex.vue
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ export default {
return this.meta.per_page_steps
},
fieldId() {
return this.field ? this.field.id : null
return this.field ? this.field.id : undefined
},
},
methods: {
Expand Down
11 changes: 11 additions & 0 deletions lib/avocado/app/fields/field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Field
attr_accessor :block
attr_accessor :placeholder
attr_accessor :help
attr_accessor :default

def initialize(id, **args, &block)
super(id, **args, &block)
Expand All @@ -46,6 +47,7 @@ def initialize(id, **args, &block)
format_using: false,
placeholder: id.to_s.camelize,
help: nil,
default: nil,
}

# Set the values in the following order
Expand Down Expand Up @@ -78,6 +80,15 @@ def fetch_for_resource(model, resource, view)
# Set initial value
fields[:value] = model.send(id) if model_or_class(model) == 'model' and model.methods.include? id

# Set default value for create view
if view === :create
if fields[:default].present? and fields[:default].respond_to? :call
fields[:value] = fields[:default].call model, resource, view, self
else
fields[:value] = fields[:default]
end
end

# Run callback block if present
if computable and @block.present?
fields[:computed_value] = @block.call model, resource, view, self
Expand Down
2 changes: 1 addition & 1 deletion lib/avocado/app/fields/hidden_field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ def initialize(name, **args, &block)

super(name, **args, &block)

only_on :edit
only_on [:edit, :create]
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion spec/dummy/app/services/avocado/resources/team.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def initialize
fields do
id
text :name
textarea :description, rows: 5, readonly: false, hide_on: :index, format_using: -> (value) { value.to_s.truncate 30 }, required: true
textarea :description, rows: 5, readonly: false, hide_on: :index, format_using: -> (value) { value.to_s.truncate 30 }, required: true, default: 'This team is wonderful!'

number :members_count do |model|
model.members.count
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def initialize

fields do
id
select :level, options: { beginner: 'Beginner', intermediate: 'Intermediate', advanced: 'Advanced' }
select :level, options: { beginner: 'Beginner', intermediate: 'Intermediate', advanced: 'Advanced' }, default: -> (model, resource, view, field) { Time.now.hour < 12 ? 'advanced' : 'beginner' }
belongs_to :user
belongs_to :team
end
Expand Down
2 changes: 1 addition & 1 deletion spec/dummy/app/services/avocado/resources/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def initialize
heading '<div class="text-gray-300 uppercase font-bold">DEV</div>', as_html: true
code :custom_css, theme: 'dracula', language: 'css', help: "This enables you to edit the user's custom styles."

hidden :team_id # For testing purposes
hidden :team_id, default: 0 # For testing purposes

has_and_belongs_to_many :projects
has_many :posts
Expand Down
72 changes: 72 additions & 0 deletions spec/system/avocado/default_field_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
require 'rails_helper'

RSpec.describe 'DefaultField', type: :system do
describe 'with a default value (team - description)' do

context 'create' do
it 'checks presence of default team description' do
visit '/avocado/resources/teams/new'
wait_for_loaded

expect(find("[field-id='description'] [data-slot='value'] textarea").value).to have_text 'This team is wonderful!'
end

it 'saves team and checks for default team description value' do
visit '/avocado/resources/teams/new'
wait_for_loaded

expect(Team.count).to eql 0

fill_in 'name', with: 'Joshua Josh'

click_on 'Save'
wait_for_loaded

expect(current_path).to eql "/avocado/resources/teams/#{Team.last.id}"
expect(find_field_element(:description)).to have_text 'This team is wonderful!'
end
end
end

describe 'with a computable default value (team_membership - level)' do
let!(:user) { create :user, first_name: 'Mihai', last_name: 'Marin' }
let!(:team) { create :team, name: 'Apple' }

context 'create' do
it 'checks presence of default team membership level' do
visit '/avocado/resources/team_memberships/new'
wait_for_loaded

if Time.now.hour < 12
expect(find_field_element(:level)).to have_text 'Advanced'
else
expect(find_field_element(:level)).to have_text 'Beginner'
end
end

it 'saves team membership and checks for default team membership level value' do
visit '/avocado/resources/team_memberships/new'
wait_for_loaded

expect(TeamMembership.count).to eql 0

select 'Mihai Marin', from: :user
select 'Apple', from: :team

click_on 'Save'
wait_for_loaded

expect(current_path).to eql "/avocado/resources/team_memberships/#{TeamMembership.last.id}"

if Time.now.hour < 12
expect(find_field_element(:level)).to have_text 'advanced'
else
expect(find_field_element(:level)).to have_text 'beginner'
end

expect(find_field_element(:user)).to have_text 'Mihai Marin'
expect(find_field_element(:team)).to have_text 'Apple'
end
end
end
end

0 comments on commit 4660f05

Please sign in to comment.