tao_form 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +10 -0
- data/lib/assets/icons/arrow-down.svg +12 -0
- data/lib/assets/icons/arrow-left.svg +12 -0
- data/lib/assets/icons/arrow-right.svg +12 -0
- data/lib/assets/icons/calendar.svg +12 -0
- data/lib/assets/icons/checkbox.svg +12 -0
- data/lib/assets/icons/clock.svg +12 -0
- data/lib/assets/icons/search.svg +12 -0
- data/lib/assets/icons/success.svg +12 -0
- data/lib/assets/javascripts/tao/form/element.coffee +16 -0
- data/lib/assets/javascripts/tao/form/fields/checkbox.coffee +14 -0
- data/lib/assets/javascripts/tao/form/fields/index.coffee +9 -0
- data/lib/assets/javascripts/tao/form/fields/moment_picker/element.coffee +38 -0
- data/lib/assets/javascripts/tao/form/fields/moment_picker/index.coffee +7 -0
- data/lib/assets/javascripts/tao/form/fields/moment_picker/result.coffee +25 -0
- data/lib/assets/javascripts/tao/form/fields/moment_picker/segment_list.coffee +14 -0
- data/lib/assets/javascripts/tao/form/fields/radio.coffee +14 -0
- data/lib/assets/javascripts/tao/form/fields/select/element.coffee +79 -0
- data/lib/assets/javascripts/tao/form/fields/select/index.coffee +8 -0
- data/lib/assets/javascripts/tao/form/fields/select/list.coffee +98 -0
- data/lib/assets/javascripts/tao/form/fields/select/multiple_result.coffee +41 -0
- data/lib/assets/javascripts/tao/form/fields/select/result.coffee +39 -0
- data/lib/assets/javascripts/tao/form/fields/switch.coffee +14 -0
- data/lib/assets/javascripts/tao/form/index.coffee +17 -0
- data/lib/assets/javascripts/tao/form/mobile/element.coffee +5 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/checkbox.coffee +5 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/index.coffee +9 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/element.coffee +36 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/index.coffee +7 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/result.coffee +5 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/segment_list.coffee +24 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/radio.coffee +5 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/select/element.coffee +61 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/select/index.coffee +8 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/select/list.coffee +13 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/select/multiple_result.coffee +5 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/select/result.coffee +5 -0
- data/lib/assets/javascripts/tao/form/mobile/fields/switch.coffee +5 -0
- data/lib/assets/javascripts/tao/form/mobile/index.coffee +10 -0
- data/lib/assets/javascripts/tao/form/shared/element/base.coffee +48 -0
- data/lib/assets/javascripts/tao/form/shared/fields/checkbox.coffee +21 -0
- data/lib/assets/javascripts/tao/form/shared/fields/date_picker.coffee +10 -0
- data/lib/assets/javascripts/tao/form/shared/fields/datetime_picker.coffee +62 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/element/base.coffee +52 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/result/base.coffee +39 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segment_list/base.coffee +85 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/base.coffee +25 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/date_segment.coffee +95 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/hour_segment.coffee +28 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/index.coffee +1 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/minute_segment.coffee +28 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/month_segment.coffee +46 -0
- data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/year_segment.coffee +57 -0
- data/lib/assets/javascripts/tao/form/shared/fields/month_picker.coffee +10 -0
- data/lib/assets/javascripts/tao/form/shared/fields/radio.coffee +19 -0
- data/lib/assets/javascripts/tao/form/shared/fields/select/element/base.coffee +122 -0
- data/lib/assets/javascripts/tao/form/shared/fields/select/list/base.coffee +79 -0
- data/lib/assets/javascripts/tao/form/shared/fields/select/models/data_provider.coffee +75 -0
- data/lib/assets/javascripts/tao/form/shared/fields/select/models/index.coffee +2 -0
- data/lib/assets/javascripts/tao/form/shared/fields/select/models/option.coffee +37 -0
- data/lib/assets/javascripts/tao/form/shared/fields/select/multiple_result/base.coffee +81 -0
- data/lib/assets/javascripts/tao/form/shared/fields/select/result/base.coffee +57 -0
- data/lib/assets/javascripts/tao/form/shared/fields/switch.coffee +19 -0
- data/lib/assets/javascripts/tao/form/shared/fields/time_picker.coffee +10 -0
- data/lib/assets/javascripts/tao/form/shared/mixins/checkable.coffee +11 -0
- data/lib/assets/javascripts/tao/ui/icons/form.coffee +11 -0
- data/lib/assets/stylesheets/tao/form/_globals.scss +3 -0
- data/lib/assets/stylesheets/tao/form/_mixins.scss +28 -0
- data/lib/assets/stylesheets/tao/form/_variables.scss +3 -0
- data/lib/assets/stylesheets/tao/form/fields/checkbox.scss +36 -0
- data/lib/assets/stylesheets/tao/form/fields/datetime_picker.scss +22 -0
- data/lib/assets/stylesheets/tao/form/fields/index.scss +6 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/index.scss +10 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/result.scss +61 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/segment_list.scss +53 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/date_segment.scss +17 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/hour_segment.scss +15 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/minute_segment.scss +17 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/month_segment.scss +15 -0
- data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/year_segment.scss +15 -0
- data/lib/assets/stylesheets/tao/form/fields/radio.scss +33 -0
- data/lib/assets/stylesheets/tao/form/fields/select/index.scss +10 -0
- data/lib/assets/stylesheets/tao/form/fields/select/list.scss +61 -0
- data/lib/assets/stylesheets/tao/form/fields/select/multiple_result.scss +72 -0
- data/lib/assets/stylesheets/tao/form/fields/select/result.scss +101 -0
- data/lib/assets/stylesheets/tao/form/fields/switch.scss +12 -0
- data/lib/assets/stylesheets/tao/form/index.scss +5 -0
- data/lib/assets/stylesheets/tao/form/inputs/boolean.scss +8 -0
- data/lib/assets/stylesheets/tao/form/inputs/group.scss +2 -0
- data/lib/assets/stylesheets/tao/form/inputs/index.scss +1 -0
- data/lib/assets/stylesheets/tao/form/inputs/text.scss +2 -0
- data/lib/assets/stylesheets/tao/form/layout.scss +148 -0
- data/lib/assets/stylesheets/tao/form/mobile/_globals.scss +3 -0
- data/lib/assets/stylesheets/tao/form/mobile/_mixins.scss +22 -0
- data/lib/assets/stylesheets/tao/form/mobile/_variables.scss +3 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/checkbox.scss +2 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/datetime_picker.scss +18 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/index.scss +1 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/index.scss +9 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/result.scss +19 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segment_list.scss +52 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/date_segment.scss +14 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/hour_segment.scss +14 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/minute_segment.scss +14 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/month_segment.scss +14 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/year_segment.scss +14 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/radio.scss +2 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/select/index.scss +66 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/select/list.scss +10 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/select/multiple_result.scss +12 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/select/result.scss +28 -0
- data/lib/assets/stylesheets/tao/form/mobile/fields/switch.scss +2 -0
- data/lib/assets/stylesheets/tao/form/mobile/index.scss +5 -0
- data/lib/assets/stylesheets/tao/form/mobile/inputs/boolean.scss +7 -0
- data/lib/assets/stylesheets/tao/form/mobile/inputs/group.scss +6 -0
- data/lib/assets/stylesheets/tao/form/mobile/inputs/index.scss +1 -0
- data/lib/assets/stylesheets/tao/form/mobile/inputs/text.scss +2 -0
- data/lib/assets/stylesheets/tao/form/mobile/layout.scss +137 -0
- data/lib/assets/stylesheets/tao/form/mobile/reset.scss +30 -0
- data/lib/assets/stylesheets/tao/form/mobile/variables/_base.scss +12 -0
- data/lib/assets/stylesheets/tao/form/mobile/variables/_moment_picker.scss +9 -0
- data/lib/assets/stylesheets/tao/form/mobile/variables/_select.scss +9 -0
- data/lib/assets/stylesheets/tao/form/reset.scss +30 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/_checkbox.scss +61 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/_radio.scss +53 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/_switch.scss +56 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/_result.scss +46 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/_segment_list.scss +93 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_date_segment.scss +50 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_hour_segment.scss +35 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_minute_segment.scss +23 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_month_segment.scss +27 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_year_segment.scss +27 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/select/_list.scss +136 -0
- data/lib/assets/stylesheets/tao/form/shared/fields/select/_multiple_result.scss +46 -0
- data/lib/assets/stylesheets/tao/form/shared/inputs/_boolean.scss +5 -0
- data/lib/assets/stylesheets/tao/form/shared/inputs/_group.scss +25 -0
- data/lib/assets/stylesheets/tao/form/shared/inputs/_text.scss +33 -0
- data/lib/assets/stylesheets/tao/form/variables/_base.scss +15 -0
- data/lib/assets/stylesheets/tao/form/variables/_moment_picker.scss +9 -0
- data/lib/assets/stylesheets/tao/form/variables/_select.scss +10 -0
- data/lib/tao_form.rb +5 -0
- data/lib/tao_form/components.rb +10 -0
- data/lib/tao_form/components/check_box_component.rb +29 -0
- data/lib/tao_form/components/date_picker_component.rb +25 -0
- data/lib/tao_form/components/datetime_picker_component.rb +50 -0
- data/lib/tao_form/components/field_component.rb +15 -0
- data/lib/tao_form/components/form_component.rb +24 -0
- data/lib/tao_form/components/moment_picker/base.rb +68 -0
- data/lib/tao_form/components/moment_picker/result_component.rb +31 -0
- data/lib/tao_form/components/moment_picker/segment_list_component.rb +36 -0
- data/lib/tao_form/components/moment_picker/segments.rb +6 -0
- data/lib/tao_form/components/moment_picker/segments/base.rb +17 -0
- data/lib/tao_form/components/moment_picker/segments/date_segment_component.rb +21 -0
- data/lib/tao_form/components/moment_picker/segments/hour_segment_component.rb +21 -0
- data/lib/tao_form/components/moment_picker/segments/minute_segment_component.rb +28 -0
- data/lib/tao_form/components/moment_picker/segments/month_segment_component.rb +15 -0
- data/lib/tao_form/components/moment_picker/segments/year_segment_component.rb +21 -0
- data/lib/tao_form/components/month_picker_component.rb +23 -0
- data/lib/tao_form/components/radio_button_component.rb +29 -0
- data/lib/tao_form/components/select/list_component.rb +23 -0
- data/lib/tao_form/components/select/multiple_result_component.rb +23 -0
- data/lib/tao_form/components/select/result_component.rb +35 -0
- data/lib/tao_form/components/select_component.rb +78 -0
- data/lib/tao_form/components/switch_component.rb +11 -0
- data/lib/tao_form/components/time_picker_component.rb +29 -0
- data/lib/tao_form/engine.rb +15 -0
- data/lib/tao_form/inputs.rb +9 -0
- data/lib/tao_form/inputs/boolean_input.rb +30 -0
- data/lib/tao_form/inputs/collection_check_boxes_input.rb +19 -0
- data/lib/tao_form/inputs/collection_radio_buttons_input.rb +19 -0
- data/lib/tao_form/inputs/collection_select_input.rb +21 -0
- data/lib/tao_form/inputs/date_time_input.rb +22 -0
- data/lib/tao_form/inputs/grouped_collection_select_input.rb +22 -0
- data/lib/tao_form/inputs/month_input.rb +7 -0
- data/lib/tao_form/inputs/numeric_input.rb +19 -0
- data/lib/tao_form/inputs/string_input.rb +19 -0
- data/lib/tao_form/version.rb +3 -0
- data/lib/views/components/tao_form/components/_check_box.html.erb +10 -0
- data/lib/views/components/tao_form/components/_datetime_picker.html.erb +7 -0
- data/lib/views/components/tao_form/components/_moment_picker.html+mobile.erb +17 -0
- data/lib/views/components/tao_form/components/_moment_picker.html.erb +4 -0
- data/lib/views/components/tao_form/components/_radio_button.html.erb +9 -0
- data/lib/views/components/tao_form/components/_select.html+mobile.erb +27 -0
- data/lib/views/components/tao_form/components/_select.html.erb +4 -0
- data/lib/views/components/tao_form/components/_switch.html.erb +10 -0
- data/lib/views/components/tao_form/components/moment_picker/_result.html+mobile.erb +11 -0
- data/lib/views/components/tao_form/components/moment_picker/_result.html.erb +14 -0
- data/lib/views/components/tao_form/components/moment_picker/_segment_list.html+mobile.erb +8 -0
- data/lib/views/components/tao_form/components/moment_picker/_segment_list.html.erb +4 -0
- data/lib/views/components/tao_form/components/moment_picker/segment_list/_labels.html.erb +13 -0
- data/lib/views/components/tao_form/components/moment_picker/segment_list/_segments.html.erb +7 -0
- data/lib/views/components/tao_form/components/moment_picker/segments/_date_segment.html.erb +14 -0
- data/lib/views/components/tao_form/components/moment_picker/segments/_hour_segment.html.erb +14 -0
- data/lib/views/components/tao_form/components/moment_picker/segments/_minute_segment.html.erb +9 -0
- data/lib/views/components/tao_form/components/moment_picker/segments/_month_segment.html.erb +16 -0
- data/lib/views/components/tao_form/components/moment_picker/segments/_year_segment.html.erb +10 -0
- data/lib/views/components/tao_form/components/select/_list.html.erb +18 -0
- data/lib/views/components/tao_form/components/select/_multiple_result.html+mobile.erb +3 -0
- data/lib/views/components/tao_form/components/select/_multiple_result.html.erb +7 -0
- data/lib/views/components/tao_form/components/select/_result.html+mobile.erb +10 -0
- data/lib/views/components/tao_form/components/select/_result.html.erb +14 -0
- data/vendor/assets/javascripts/moment.js +4463 -0
- data/vendor/assets/javascripts/moment/zh-cn.js +112 -0
- metadata +334 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
class Tao.Form.RadioBase extends TaoComponent
|
2
|
+
|
3
|
+
@include Tao.Form.Mixins.Checkable
|
4
|
+
|
5
|
+
@tag 'tao-radio-button'
|
6
|
+
|
7
|
+
_connected: ->
|
8
|
+
@field = @jq.find('input:radio')
|
9
|
+
@_bind()
|
10
|
+
|
11
|
+
_bind: ->
|
12
|
+
@on 'click', '.radio-wrapper', (e) =>
|
13
|
+
if @field.is(':enabled')
|
14
|
+
@_toggleChecked()
|
15
|
+
@trigger 'change'
|
16
|
+
false
|
17
|
+
|
18
|
+
_disconnected: ->
|
19
|
+
@off()
|
@@ -0,0 +1,122 @@
|
|
1
|
+
#= require tao/form/shared/fields/select/models/data_provider
|
2
|
+
|
3
|
+
DataProvider = Tao.Form.Select.DataProvider
|
4
|
+
|
5
|
+
class Tao.Form.Select.ElementBase extends TaoComponent
|
6
|
+
|
7
|
+
@tag 'tao-select'
|
8
|
+
|
9
|
+
@attribute 'multiple', type: 'boolean'
|
10
|
+
|
11
|
+
@attribute 'active', 'selected', type: 'boolean', observe: true
|
12
|
+
|
13
|
+
@attribute 'remote', type: 'hash'
|
14
|
+
|
15
|
+
@attribute 'searchableSize', type: 'number', default: 8
|
16
|
+
|
17
|
+
@get 'value', ->
|
18
|
+
@field.val()
|
19
|
+
|
20
|
+
_connected: ->
|
21
|
+
@field = @jq.find 'select'
|
22
|
+
@selectedOption = if @multiple then [] else null
|
23
|
+
|
24
|
+
@dataProvider = new DataProvider
|
25
|
+
remote: @remote
|
26
|
+
field: @field
|
27
|
+
|
28
|
+
@result = @findComponent '.select-result', =>
|
29
|
+
@_resultReady()
|
30
|
+
|
31
|
+
@list = @findComponent '.select-list', =>
|
32
|
+
@_listReady()
|
33
|
+
|
34
|
+
@_bind()
|
35
|
+
|
36
|
+
_resultReady: ->
|
37
|
+
if @multiple
|
38
|
+
values = @field.val()
|
39
|
+
if values && _.isArray(values)
|
40
|
+
@selectOption(value) for value in values
|
41
|
+
else
|
42
|
+
@selectOption @field.val()
|
43
|
+
|
44
|
+
_listReady: ->
|
45
|
+
options = @dataProvider.unselectedOptions()
|
46
|
+
@list.setOptions options, @remote?.totalOptionSize
|
47
|
+
@list.searchable = if @remote
|
48
|
+
@dataProvider.options.length < @remote.totalOptionSize
|
49
|
+
else
|
50
|
+
@dataProvider.options.length > @searchableSize
|
51
|
+
|
52
|
+
_bind: ->
|
53
|
+
@_bindResultEvents()
|
54
|
+
@_bindListEvents()
|
55
|
+
|
56
|
+
_bindResultEvents: ->
|
57
|
+
@on 'activeClick', '.select-result', (e) =>
|
58
|
+
@_toggleActive()
|
59
|
+
null
|
60
|
+
|
61
|
+
if @multiple
|
62
|
+
@on 'unselectOption', '.select-result', (e, option) =>
|
63
|
+
_.remove @selectedOption, (opt) -> opt.value == option.value
|
64
|
+
@selected = false if @selectedOption.length == 0
|
65
|
+
@_filterList ''
|
66
|
+
@trigger 'change', @selectedOption
|
67
|
+
null
|
68
|
+
else
|
69
|
+
@on 'clear', '.select-result', (e) =>
|
70
|
+
@active = false
|
71
|
+
@selectedOption = null
|
72
|
+
@selected = false
|
73
|
+
@_filterList ''
|
74
|
+
@trigger 'change', @selectedOption
|
75
|
+
null
|
76
|
+
|
77
|
+
_bindListEvents: ->
|
78
|
+
@on 'selectOption', '.select-list', (e, option) =>
|
79
|
+
@selectOption option
|
80
|
+
@trigger 'change', @selectedOption
|
81
|
+
null
|
82
|
+
|
83
|
+
@on 'search', '.select-list', (e, value) =>
|
84
|
+
@_filterList value
|
85
|
+
|
86
|
+
_disconnected: ->
|
87
|
+
@off()
|
88
|
+
@dataProvider = null
|
89
|
+
|
90
|
+
_toggleActive: ->
|
91
|
+
@active = !@active
|
92
|
+
|
93
|
+
_filterList: (value) ->
|
94
|
+
@list.loading = true
|
95
|
+
@dataProvider.filter value, (options, totalSize) =>
|
96
|
+
@list.loading = false
|
97
|
+
options = @dataProvider.unselectedOptions options
|
98
|
+
@list.setOptions options, totalSize
|
99
|
+
|
100
|
+
selectOption: (option) ->
|
101
|
+
option = @dataProvider.getOption option
|
102
|
+
return false unless option && option != @selectedOption
|
103
|
+
@result.selectOption option
|
104
|
+
if @multiple
|
105
|
+
@selectedOption.push option
|
106
|
+
else
|
107
|
+
@selectedOption = option
|
108
|
+
@selected = true
|
109
|
+
true
|
110
|
+
|
111
|
+
unselectOption: (option) ->
|
112
|
+
if @multiple
|
113
|
+
option = @dataProvider.getOption option
|
114
|
+
return false unless option && (option in @selectedOption)
|
115
|
+
@result.unselectOption option
|
116
|
+
_.remove @selectedOption, (opt) -> opt.value == option.value
|
117
|
+
@selected = false if @selectedOption.length == 0
|
118
|
+
else
|
119
|
+
@result.unselectOption()
|
120
|
+
@selectedOption = null
|
121
|
+
@selected = false
|
122
|
+
true
|
@@ -0,0 +1,79 @@
|
|
1
|
+
#= require tao/form/shared/fields/select/models/option
|
2
|
+
|
3
|
+
Option = Tao.Form.Select.Option
|
4
|
+
|
5
|
+
class Tao.Form.Select.ListBase extends TaoComponent
|
6
|
+
|
7
|
+
@tag 'tao-select-list'
|
8
|
+
|
9
|
+
@attribute 'empty', 'loading', 'searching', 'searchable', type: 'boolean'
|
10
|
+
|
11
|
+
@attribute 'hiddenSize', type: 'number', observe: true
|
12
|
+
|
13
|
+
@attribute 'maxListSize', type: 'number', default: 20
|
14
|
+
|
15
|
+
_connected: ->
|
16
|
+
@searchField = @jq.find('.search-field')
|
17
|
+
@_bind()
|
18
|
+
|
19
|
+
_disconnected: ->
|
20
|
+
@off()
|
21
|
+
|
22
|
+
_bind: ->
|
23
|
+
@on 'input', '.search-field', _.debounce (e) =>
|
24
|
+
val = @searchField.val()
|
25
|
+
@searching = !!val
|
26
|
+
@trigger 'search', [val]
|
27
|
+
, 200
|
28
|
+
|
29
|
+
@on 'click', '.option', (e) =>
|
30
|
+
$option = $ e.currentTarget
|
31
|
+
option = $option.data('option')
|
32
|
+
@trigger('selectOption', [option]) if option
|
33
|
+
null
|
34
|
+
|
35
|
+
_hiddenSizeChanged: ->
|
36
|
+
@jq.find('.tips .size').text(@hiddenSize)
|
37
|
+
|
38
|
+
_refreshScrollPosition: ->
|
39
|
+
@_reflow()
|
40
|
+
@jq.find('.list-wrapper').scrollTop 0
|
41
|
+
|
42
|
+
setOptions: (options, totalSize) ->
|
43
|
+
@options = options.slice 0, @maxListSize
|
44
|
+
@hiddenSize = (totalSize || @options.length) - @options.length
|
45
|
+
$list = @jq.find('.options-list').empty()
|
46
|
+
|
47
|
+
if @options.length > 0
|
48
|
+
@empty = false
|
49
|
+
|
50
|
+
@_lastRenderGroup = null
|
51
|
+
for option in @options
|
52
|
+
if option.data.group && @_lastRenderGroup != option.data.group
|
53
|
+
@_lastRenderGroup = option.data.group
|
54
|
+
$list.append @_renderGroup(option.data.group)
|
55
|
+
$list.append @_renderOption(option)
|
56
|
+
|
57
|
+
@_refreshScrollPosition()
|
58
|
+
else
|
59
|
+
@empty = true
|
60
|
+
|
61
|
+
_renderGroup: (name) ->
|
62
|
+
$('<div>', class: 'optgroup').text(name)
|
63
|
+
|
64
|
+
_renderOption: (option) ->
|
65
|
+
$option = $("""
|
66
|
+
<div class="option">
|
67
|
+
<span class="name"></span>
|
68
|
+
<span class="hint"></span>
|
69
|
+
</div>
|
70
|
+
""").data('option', option)
|
71
|
+
$option.find('.name').text(option.data.label || option.text)
|
72
|
+
$option.find('.hint').text(option.data.hint) if option.data.hint
|
73
|
+
$option.attr 'data-value', option.value
|
74
|
+
$option
|
75
|
+
|
76
|
+
reset: ->
|
77
|
+
@searchField.val ''
|
78
|
+
@searching = false
|
79
|
+
@trigger 'search', ['']
|
@@ -0,0 +1,75 @@
|
|
1
|
+
|
2
|
+
Option = Tao.Form.Select.Option
|
3
|
+
|
4
|
+
class Tao.Form.Select.DataProvider extends TaoModule
|
5
|
+
|
6
|
+
@option 'remote', default: false
|
7
|
+
|
8
|
+
@option 'field'
|
9
|
+
|
10
|
+
_init: ->
|
11
|
+
@options = @field.find('option').map (i, optionEl) =>
|
12
|
+
Option.fromElement optionEl
|
13
|
+
.get()
|
14
|
+
|
15
|
+
@field.on 'addOption', (e, option) =>
|
16
|
+
if option.data?.group
|
17
|
+
index = _.findIndex @options, (opt) -> opt.data?.group == option.data?.group
|
18
|
+
@options.splice index, 0, option
|
19
|
+
else
|
20
|
+
@options.unshift option
|
21
|
+
|
22
|
+
getOption: (value) ->
|
23
|
+
return value if value instanceof Option
|
24
|
+
return null if _.isNull(value) || _.isUndefined(value)
|
25
|
+
|
26
|
+
result = @options.filter (option) -> option.value == value
|
27
|
+
if result.length > 0 then result[0] else null
|
28
|
+
|
29
|
+
filter: (value, callback) ->
|
30
|
+
if @remote && @options.length < @remote.totalOptionSize
|
31
|
+
if value
|
32
|
+
@_fetch value, callback
|
33
|
+
else
|
34
|
+
callback? @options, @remote.totalOptionSize
|
35
|
+
else
|
36
|
+
options = @options.filter (option) -> option.match(value)
|
37
|
+
callback? options
|
38
|
+
|
39
|
+
null
|
40
|
+
|
41
|
+
_fetch: (value, callback) ->
|
42
|
+
return unless @remote && @remote.url
|
43
|
+
|
44
|
+
$.ajax
|
45
|
+
url: @remote.url
|
46
|
+
data: _.extend {}, @remote.params,
|
47
|
+
"#{@remote.searchKey}": value
|
48
|
+
dataType: 'json'
|
49
|
+
.done (result) ->
|
50
|
+
options = if _.isArray(result.options) && result.options.length > 0 && _.isArray(result.options[0])
|
51
|
+
result.options.reduce (opts, group) ->
|
52
|
+
return unless _.isArray(group) && group.length > 1 && _.isArray(group[1])
|
53
|
+
group[1].forEach (opt) ->
|
54
|
+
opts.push Option.fromJson(opt, group[0])
|
55
|
+
opts
|
56
|
+
, []
|
57
|
+
else if _.isPlainObject(result.options)
|
58
|
+
_.flatten(
|
59
|
+
for groupName, opts of result.options
|
60
|
+
Option.fromJson(opt, groupName) for opt in opts
|
61
|
+
)
|
62
|
+
else if _.isArray result.options
|
63
|
+
(Option.fromJson(option) for option in result.options)
|
64
|
+
else
|
65
|
+
[]
|
66
|
+
|
67
|
+
callback? options, result.totalSize
|
68
|
+
|
69
|
+
unselectedOptions: (options = @options) ->
|
70
|
+
options.filter (option) =>
|
71
|
+
value = @field.val()
|
72
|
+
if _.isArray(value)
|
73
|
+
!(option.value in value)
|
74
|
+
else
|
75
|
+
option.value != value
|
@@ -0,0 +1,37 @@
|
|
1
|
+
|
2
|
+
# instance of this class should be immutable
|
3
|
+
|
4
|
+
class Tao.Form.Select.Option extends TaoModule
|
5
|
+
|
6
|
+
@option 'text', 'value', 'data'
|
7
|
+
|
8
|
+
@fromElement: (element) ->
|
9
|
+
$element = $ element
|
10
|
+
return unless (value = $element.val()) && !$element.is(':disabled')
|
11
|
+
|
12
|
+
data = $element.data()
|
13
|
+
data.group = $element.parent('optgroup').prop('label') if $element.parent('optgroup').length
|
14
|
+
|
15
|
+
new @
|
16
|
+
text: $element.text()
|
17
|
+
value: value
|
18
|
+
data: data
|
19
|
+
|
20
|
+
@fromJson: (json, group) ->
|
21
|
+
data = if json.length > 2 then json[2] else {}
|
22
|
+
data.group = group if group
|
23
|
+
|
24
|
+
new @
|
25
|
+
text: json[0]
|
26
|
+
value: json[1]
|
27
|
+
data: data
|
28
|
+
|
29
|
+
_init: ->
|
30
|
+
if @data
|
31
|
+
@data[_.camelCase key.replace(/^data-/, '')] = value for key, value of @data
|
32
|
+
else
|
33
|
+
@data = {}
|
34
|
+
|
35
|
+
match: (value) ->
|
36
|
+
filterKey = @data.searchKey || @text
|
37
|
+
String(filterKey).toLowerCase().indexOf(value.toLowerCase()) > -1
|
@@ -0,0 +1,81 @@
|
|
1
|
+
|
2
|
+
class Tao.Form.Select.MultipleResultBase extends TaoComponent
|
3
|
+
|
4
|
+
@tag 'tao-multiple-select-result'
|
5
|
+
|
6
|
+
@attribute 'selected', type: 'boolean'
|
7
|
+
|
8
|
+
@attribute 'disabled', type: 'boolean', observe: true
|
9
|
+
|
10
|
+
_connected: ->
|
11
|
+
@field = @jq.find 'select'
|
12
|
+
@selectedOption = []
|
13
|
+
@_bind()
|
14
|
+
|
15
|
+
_disconnected: ->
|
16
|
+
@off()
|
17
|
+
|
18
|
+
_bind: ->
|
19
|
+
@on 'click', 'select', =>
|
20
|
+
@trigger 'activeClick'
|
21
|
+
false
|
22
|
+
|
23
|
+
@on 'click', '.selected-item', (e) =>
|
24
|
+
return if @disabled
|
25
|
+
$option = $ e.currentTarget
|
26
|
+
option = $option.data 'option'
|
27
|
+
@unselectOption option
|
28
|
+
@trigger 'unselectOption', [option]
|
29
|
+
false
|
30
|
+
|
31
|
+
selectOption: (option) ->
|
32
|
+
return false unless option && !(option in @selectedOption)
|
33
|
+
|
34
|
+
unless @jq.find(".selected-item[data-value='#{option.value}']").length > 0
|
35
|
+
$item = @_generateItem(option)
|
36
|
+
if @selectedOption.length > 0
|
37
|
+
@jq.find('.selected-item:last').after $item
|
38
|
+
else
|
39
|
+
@jq.prepend $item
|
40
|
+
|
41
|
+
@selectedOption.push option
|
42
|
+
@_setSelectedOption option
|
43
|
+
@selected = true
|
44
|
+
true
|
45
|
+
|
46
|
+
unselectOption: (option) ->
|
47
|
+
return false unless option && option in @selectedOption
|
48
|
+
@jq.find(".selected-item[data-value='#{option.value}']").remove()
|
49
|
+
_.remove @selectedOption, (opt) -> opt.value == option.value
|
50
|
+
@_setUnselectedOption option
|
51
|
+
@selected = false if @selectedOption.length == 0
|
52
|
+
true
|
53
|
+
|
54
|
+
_setSelectedOption: (option) ->
|
55
|
+
return unless option
|
56
|
+
$option = @field.find("option[value='#{option.value}']")
|
57
|
+
$option = @_generateOption(option) unless $option.length > 0
|
58
|
+
$option.prop 'selected', true
|
59
|
+
|
60
|
+
_setUnselectedOption: (option) ->
|
61
|
+
return unless option
|
62
|
+
$option = @field.find("option[value='#{option.value}']")
|
63
|
+
$option.prop 'selected', false
|
64
|
+
|
65
|
+
_generateOption: (option) ->
|
66
|
+
$option = $('<option>', test: option.text, value: option.value).appendTo(@field)
|
67
|
+
@field.trigger 'addOption', option, $option
|
68
|
+
$option
|
69
|
+
|
70
|
+
_generateItem: (option) ->
|
71
|
+
$item = $("""
|
72
|
+
<a href="javascript:;" class="selected-item" tabindex="-1">
|
73
|
+
<span class="name"></span>
|
74
|
+
</a>
|
75
|
+
""")
|
76
|
+
|
77
|
+
$item.append Tao.iconTag('close')
|
78
|
+
$item.attr 'data-value', option.value
|
79
|
+
.data 'option', option
|
80
|
+
.find('.name').text option.text
|
81
|
+
$item
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
class Tao.Form.Select.ResultBase extends TaoComponent
|
3
|
+
|
4
|
+
@tag 'tao-select-result'
|
5
|
+
|
6
|
+
@attribute 'selected', 'clearable', type: 'boolean'
|
7
|
+
|
8
|
+
@attribute 'disabled', type: 'boolean', observe: true
|
9
|
+
|
10
|
+
_connected: ->
|
11
|
+
@field = @jq.find 'select'
|
12
|
+
@_bind()
|
13
|
+
|
14
|
+
_disconnected: ->
|
15
|
+
@off()
|
16
|
+
|
17
|
+
_bind: ->
|
18
|
+
@on 'click', 'select', =>
|
19
|
+
@trigger 'activeClick'
|
20
|
+
false
|
21
|
+
|
22
|
+
@on 'click', '.link-clear', (e) =>
|
23
|
+
return if @disabled
|
24
|
+
@clear() && @trigger('clear')
|
25
|
+
false
|
26
|
+
|
27
|
+
selectOption: (option) ->
|
28
|
+
return false unless option
|
29
|
+
@selectedOption = option
|
30
|
+
@selected = true
|
31
|
+
@_setSelectedOption option
|
32
|
+
@jq.find('.selected-text').text option.text
|
33
|
+
true
|
34
|
+
|
35
|
+
unselectOption: (option = @selectedOption) ->
|
36
|
+
return false unless option
|
37
|
+
@selectedOption = null
|
38
|
+
@selected = false
|
39
|
+
@_setSelectedOption false
|
40
|
+
@jq.find('.selected-text').text ''
|
41
|
+
true
|
42
|
+
|
43
|
+
_setSelectedOption: (option) ->
|
44
|
+
@field.find('option:selected').prop 'selected', false
|
45
|
+
return unless option
|
46
|
+
|
47
|
+
$option = @field.find("option[value='#{option.value}']")
|
48
|
+
$option = @_generateOption(option) unless $option.length > 0
|
49
|
+
$option.prop 'selected', true
|
50
|
+
|
51
|
+
_generateOption: (option) ->
|
52
|
+
$option = $('<option>', test: option.text, value: option.value).appendTo(@field)
|
53
|
+
@field.trigger 'addOption', option, $option
|
54
|
+
$option
|
55
|
+
|
56
|
+
clear: ->
|
57
|
+
@unselectOption()
|