Skip to content

Commit 46e590d

Browse files
committed
Merge branch 'master' of https://github.com/AvocadoHQ/avocado
2 parents 7ad9ff6 + 4660f05 commit 46e590d

File tree

16 files changed

+171
-70
lines changed

16 files changed

+171
-70
lines changed

Diff for: app/frontend/js/components/BooleanCheck.vue

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<template>
2+
<component :is="component" :class="classes" />
3+
</template>
4+
5+
<script>
6+
export default {
7+
props: {
8+
checked: Boolean,
9+
},
10+
computed: {
11+
classes() {
12+
let classes = 'h-5 float-left'
13+
14+
if (this.checked) {
15+
classes += ' text-green-600'
16+
} else {
17+
classes += ' text-red-600'
18+
}
19+
20+
return classes
21+
},
22+
component() {
23+
if (this.checked) return 'check-circle-icon'
24+
25+
return 'x-circle-icon'
26+
},
27+
},
28+
}
29+
</script>

Diff for: app/frontend/js/components/Edit/BooleanGroupField.vue

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
:name="name"
1010
:checked="value"
1111
:disabled="disabled"
12+
class="w-3 h-3"
1213
/>
13-
<label>{{ labelForOption(name) }}</label>
14+
<label class="ml-1">{{ labelForOption(name) }}</label>
1415
</div>
1516
</template>
1617
</div>

Diff for: app/frontend/js/components/Index/BooleanField.vue

+7-23
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,17 @@
11
<template>
2-
<index-field-wrapper :field="field" class="text-center">
3-
<component :is="component"
4-
v-if="component"
5-
:class="classes"
6-
/>
2+
<index-field-wrapper :field="field">
3+
<boolean-check
4+
v-if="field.value != null"
5+
:checked="field.value" />
76
<empty-dash v-else />
87
</index-field-wrapper>
98
</template>
109

1110
<script>
11+
import BooleanCheck from '@/js/components/BooleanCheck.vue'
12+
1213
export default {
1314
props: ['field'],
14-
computed: {
15-
classes() {
16-
let classes = 'h-6'
17-
18-
if (this.field.value) {
19-
classes += ' text-green-600'
20-
} else {
21-
classes += ' text-red-600'
22-
}
23-
24-
return classes
25-
},
26-
component() {
27-
if (this.field.value) return 'check-circle-icon'
28-
29-
return 'x-circle-icon'
30-
},
31-
},
15+
components: { BooleanCheck },
3216
}
3317
</script>
+24-21
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,39 @@
11
<template>
22
<index-field-wrapper :field="field" class="text-center">
3-
<template v-if="isVisible">
4-
<div class="space-y-3" v-if="value">
5-
<template v-for="(val, key, index) in value">
6-
<div v-bind:key="index">{{ emoji(val) }} {{ label(key) }}</div>
7-
</template>
8-
</div>
9-
<empty-dash v-else />
3+
<template v-if="value">
4+
<v-popover>
5+
<a href="javascript:void(0);" class="tooltip-target">View</a>
6+
<template slot="popover">
7+
<div class="space-y-2">
8+
<template v-for="(val, key, index) in value">
9+
<div v-bind:key="index">
10+
<boolean-check :checked="val"/>
11+
<div class="ml-6 text-left py-px">{{ label(key) }}</div>
12+
</div>
13+
</template>
14+
</div>
15+
</template>
16+
</v-popover>
1017
</template>
11-
<a href="javascript:void(0);"
12-
@click="toggleView"
13-
v-else
14-
>
15-
View
16-
</a>
18+
<empty-dash v-else />
1719
</index-field-wrapper>
1820
</template>
1921

22+
<style>
23+
.tooltip-inner, .popover-inner {
24+
padding: 1rem !important;
25+
background-color: #ffffff !important;
26+
}
27+
</style>
28+
2029
<script>
30+
import BooleanCheck from '@/js/components/BooleanCheck.vue'
2131
import FormField from '@/js/mixins/form-field'
2232
2333
export default {
2434
mixins: [FormField],
2535
props: ['field'],
36+
components: { BooleanCheck },
2637
data: () => ({
2738
isVisible: false,
2839
}),
@@ -40,19 +51,11 @@ export default {
4051
this.value = result
4152
}
4253
},
43-
emoji(booly) {
44-
if (booly === true) return ''
45-
46-
return ''
47-
},
4854
label(key) {
4955
if (this.field.options[key]) return this.field.options[key]
5056
5157
return key
5258
},
53-
toggleView() {
54-
this.isVisible = true
55-
},
5659
},
5760
}
5861
</script>

Diff for: app/frontend/js/components/Show/BooleanField.vue

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
<template>
22
<show-field-wrapper :field="field" :index="index">
3-
<div v-if="value" v-text="value"></div>
3+
<boolean-check
4+
v-if="field.value != null"
5+
:checked="field.value" />
46
<empty-dash v-else />
57
</show-field-wrapper>
68
</template>
79

810
<script>
11+
import BooleanCheck from '@/js/components/BooleanCheck.vue'
12+
913
export default {
1014
props: ['field', 'index'],
11-
computed: {
12-
value() {
13-
if (this.field.value) return ''
14-
15-
return ''
16-
},
17-
},
15+
components: { BooleanCheck },
1816
}
1917
</script>

Diff for: app/frontend/js/components/Show/BooleanGroupField.vue

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
<template>
22
<show-field-wrapper :field="field" :index="index">
3-
<div class="space-y-3" v-if="value">
3+
<div class="space-y-2" v-if="value">
44
<template v-for="(val, key, index) in value">
5-
<div v-bind:key="index">{{ emoji(val) }} {{ label(key) }}</div>
5+
<div v-bind:key="index">
6+
<boolean-check :checked="val"/>
7+
<div class="ml-6 text-left py-px">{{ label(key) }}</div>
8+
</div>
69
</template>
710
</div>
811
<empty-dash v-else />
912
</show-field-wrapper>
1013
</template>
1114

1215
<script>
16+
import BooleanCheck from '@/js/components/BooleanCheck.vue'
1317
import FormField from '@/js/mixins/form-field'
1418
1519
export default {
1620
mixins: [FormField],
1721
props: ['field', 'index'],
22+
components: { BooleanCheck },
1823
methods: {
1924
setInitialValue() {
2025
if (this.field.value) {
@@ -29,11 +34,6 @@ export default {
2934
this.value = result
3035
}
3136
},
32-
emoji(booly) {
33-
if (booly === true) return ''
34-
35-
return ''
36-
},
3737
label(key) {
3838
if (this.field.options[key]) return this.field.options[key]
3939

Diff for: app/frontend/js/views/ResourceIndex.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ export default {
312312
return this.meta.per_page_steps
313313
},
314314
fieldId() {
315-
return this.field ? this.field.id : null
315+
return this.field ? this.field.id : undefined
316316
},
317317
},
318318
methods: {

Diff for: lib/avocado/app/fields/boolean_field.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def initialize(name, **args, &block)
1818

1919
def hydrate_field(fields, model, resource, view)
2020
{
21-
value: fields[:value] == @true_value,
21+
value: fields[:value].present? ? fields[:value] == @true_value : fields[:value],
2222
true_value: @true_value,
2323
false_value: @false_value,
2424
}

Diff for: lib/avocado/app/fields/field.rb

+11
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Field
2121
attr_accessor :block
2222
attr_accessor :placeholder
2323
attr_accessor :help
24+
attr_accessor :default
2425

2526
def initialize(id, **args, &block)
2627
super(id, **args, &block)
@@ -46,6 +47,7 @@ def initialize(id, **args, &block)
4647
format_using: false,
4748
placeholder: id.to_s.camelize,
4849
help: nil,
50+
default: nil,
4951
}
5052

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

83+
# Set default value for create view
84+
if view === :create
85+
if fields[:default].present? and fields[:default].respond_to? :call
86+
fields[:value] = fields[:default].call model, resource, view, self
87+
else
88+
fields[:value] = fields[:default]
89+
end
90+
end
91+
8192
# Run callback block if present
8293
if computable and @block.present?
8394
fields[:computed_value] = @block.call model, resource, view, self

Diff for: lib/avocado/app/fields/hidden_field.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ def initialize(name, **args, &block)
1010

1111
super(name, **args, &block)
1212

13-
only_on :edit
13+
only_on [:edit, :create]
1414
end
1515
end
1616
end

Diff for: spec/dummy/app/models/user.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class User < ApplicationRecord
1414
has_one_attached :cv
1515

1616
def is_admin?
17-
roles['admin'] === true
17+
roles.present? and roles['admin'] === true
1818
end
1919

2020
def name

Diff for: spec/dummy/app/services/avocado/resources/team.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def initialize
99
fields do
1010
id
1111
text :name
12-
textarea :description, rows: 5, readonly: false, hide_on: :index, format_using: -> (value) { value.to_s.truncate 30 }, required: true
12+
textarea :description, rows: 5, readonly: false, hide_on: :index, format_using: -> (value) { value.to_s.truncate 30 }, required: true, default: 'This team is wonderful!'
1313

1414
number :members_count do |model|
1515
model.members.count

Diff for: spec/dummy/app/services/avocado/resources/team_membership.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def initialize
88

99
fields do
1010
id
11-
select :level, options: { beginner: 'Beginner', intermediate: 'Intermediate', advanced: 'Advanced' }
11+
select :level, options: { beginner: 'Beginner', intermediate: 'Intermediate', advanced: 'Advanced' }, default: -> (model, resource, view, field) { Time.now.hour < 12 ? 'advanced' : 'beginner' }
1212
belongs_to :user
1313
belongs_to :team
1414
end

Diff for: spec/dummy/app/services/avocado/resources/user.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def initialize
2929
heading '<div class="text-gray-300 uppercase font-bold">DEV</div>', as_html: true
3030
code :custom_css, theme: 'dracula', language: 'css', help: "This enables you to edit the user's custom styles."
3131

32-
hidden :team_id # For testing purposes
32+
hidden :team_id, default: 0 # For testing purposes
3333

3434
has_and_belongs_to_many :projects
3535
has_many :posts

Diff for: spec/system/avocado/boolean_group_field_spec.rb

+6-3
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,12 @@
4444
user_id = page.find('[field-id="id"] [data-slot="value"]').text
4545
expect(current_path).to eql "/avocado/resources/users/#{user_id}"
4646

47-
expect(find_field_value_element(:roles)).to have_text '✅ Administrator'
48-
expect(find_field_value_element(:roles)).to have_text '❌ Manager'
49-
expect(find_field_value_element(:roles)).to have_text '❌ Writer'
47+
expect(page.all("[field-id='roles'] [data-slot='value'] svg")[0]['class']).to have_text 'text-green-600'
48+
expect(find_field_value_element(:roles)).to have_text 'Administrator'
49+
expect(page.all("[field-id='roles'] [data-slot='value'] svg")[1]['class']).to have_text 'text-red-600'
50+
expect(find_field_value_element(:roles)).to have_text 'Manager'
51+
expect(page.all("[field-id='roles'] [data-slot='value'] svg")[2]['class']).to have_text 'text-red-600'
52+
expect(find_field_value_element(:roles)).to have_text 'Writer'
5053
end
5154
end
5255
end

0 commit comments

Comments
 (0)