tao_form 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (208) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +10 -0
  5. data/lib/assets/icons/arrow-down.svg +12 -0
  6. data/lib/assets/icons/arrow-left.svg +12 -0
  7. data/lib/assets/icons/arrow-right.svg +12 -0
  8. data/lib/assets/icons/calendar.svg +12 -0
  9. data/lib/assets/icons/checkbox.svg +12 -0
  10. data/lib/assets/icons/clock.svg +12 -0
  11. data/lib/assets/icons/search.svg +12 -0
  12. data/lib/assets/icons/success.svg +12 -0
  13. data/lib/assets/javascripts/tao/form/element.coffee +16 -0
  14. data/lib/assets/javascripts/tao/form/fields/checkbox.coffee +14 -0
  15. data/lib/assets/javascripts/tao/form/fields/index.coffee +9 -0
  16. data/lib/assets/javascripts/tao/form/fields/moment_picker/element.coffee +38 -0
  17. data/lib/assets/javascripts/tao/form/fields/moment_picker/index.coffee +7 -0
  18. data/lib/assets/javascripts/tao/form/fields/moment_picker/result.coffee +25 -0
  19. data/lib/assets/javascripts/tao/form/fields/moment_picker/segment_list.coffee +14 -0
  20. data/lib/assets/javascripts/tao/form/fields/radio.coffee +14 -0
  21. data/lib/assets/javascripts/tao/form/fields/select/element.coffee +79 -0
  22. data/lib/assets/javascripts/tao/form/fields/select/index.coffee +8 -0
  23. data/lib/assets/javascripts/tao/form/fields/select/list.coffee +98 -0
  24. data/lib/assets/javascripts/tao/form/fields/select/multiple_result.coffee +41 -0
  25. data/lib/assets/javascripts/tao/form/fields/select/result.coffee +39 -0
  26. data/lib/assets/javascripts/tao/form/fields/switch.coffee +14 -0
  27. data/lib/assets/javascripts/tao/form/index.coffee +17 -0
  28. data/lib/assets/javascripts/tao/form/mobile/element.coffee +5 -0
  29. data/lib/assets/javascripts/tao/form/mobile/fields/checkbox.coffee +5 -0
  30. data/lib/assets/javascripts/tao/form/mobile/fields/index.coffee +9 -0
  31. data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/element.coffee +36 -0
  32. data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/index.coffee +7 -0
  33. data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/result.coffee +5 -0
  34. data/lib/assets/javascripts/tao/form/mobile/fields/moment_picker/segment_list.coffee +24 -0
  35. data/lib/assets/javascripts/tao/form/mobile/fields/radio.coffee +5 -0
  36. data/lib/assets/javascripts/tao/form/mobile/fields/select/element.coffee +61 -0
  37. data/lib/assets/javascripts/tao/form/mobile/fields/select/index.coffee +8 -0
  38. data/lib/assets/javascripts/tao/form/mobile/fields/select/list.coffee +13 -0
  39. data/lib/assets/javascripts/tao/form/mobile/fields/select/multiple_result.coffee +5 -0
  40. data/lib/assets/javascripts/tao/form/mobile/fields/select/result.coffee +5 -0
  41. data/lib/assets/javascripts/tao/form/mobile/fields/switch.coffee +5 -0
  42. data/lib/assets/javascripts/tao/form/mobile/index.coffee +10 -0
  43. data/lib/assets/javascripts/tao/form/shared/element/base.coffee +48 -0
  44. data/lib/assets/javascripts/tao/form/shared/fields/checkbox.coffee +21 -0
  45. data/lib/assets/javascripts/tao/form/shared/fields/date_picker.coffee +10 -0
  46. data/lib/assets/javascripts/tao/form/shared/fields/datetime_picker.coffee +62 -0
  47. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/element/base.coffee +52 -0
  48. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/result/base.coffee +39 -0
  49. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segment_list/base.coffee +85 -0
  50. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/base.coffee +25 -0
  51. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/date_segment.coffee +95 -0
  52. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/hour_segment.coffee +28 -0
  53. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/index.coffee +1 -0
  54. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/minute_segment.coffee +28 -0
  55. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/month_segment.coffee +46 -0
  56. data/lib/assets/javascripts/tao/form/shared/fields/moment_picker/segments/year_segment.coffee +57 -0
  57. data/lib/assets/javascripts/tao/form/shared/fields/month_picker.coffee +10 -0
  58. data/lib/assets/javascripts/tao/form/shared/fields/radio.coffee +19 -0
  59. data/lib/assets/javascripts/tao/form/shared/fields/select/element/base.coffee +122 -0
  60. data/lib/assets/javascripts/tao/form/shared/fields/select/list/base.coffee +79 -0
  61. data/lib/assets/javascripts/tao/form/shared/fields/select/models/data_provider.coffee +75 -0
  62. data/lib/assets/javascripts/tao/form/shared/fields/select/models/index.coffee +2 -0
  63. data/lib/assets/javascripts/tao/form/shared/fields/select/models/option.coffee +37 -0
  64. data/lib/assets/javascripts/tao/form/shared/fields/select/multiple_result/base.coffee +81 -0
  65. data/lib/assets/javascripts/tao/form/shared/fields/select/result/base.coffee +57 -0
  66. data/lib/assets/javascripts/tao/form/shared/fields/switch.coffee +19 -0
  67. data/lib/assets/javascripts/tao/form/shared/fields/time_picker.coffee +10 -0
  68. data/lib/assets/javascripts/tao/form/shared/mixins/checkable.coffee +11 -0
  69. data/lib/assets/javascripts/tao/ui/icons/form.coffee +11 -0
  70. data/lib/assets/stylesheets/tao/form/_globals.scss +3 -0
  71. data/lib/assets/stylesheets/tao/form/_mixins.scss +28 -0
  72. data/lib/assets/stylesheets/tao/form/_variables.scss +3 -0
  73. data/lib/assets/stylesheets/tao/form/fields/checkbox.scss +36 -0
  74. data/lib/assets/stylesheets/tao/form/fields/datetime_picker.scss +22 -0
  75. data/lib/assets/stylesheets/tao/form/fields/index.scss +6 -0
  76. data/lib/assets/stylesheets/tao/form/fields/moment_picker/index.scss +10 -0
  77. data/lib/assets/stylesheets/tao/form/fields/moment_picker/result.scss +61 -0
  78. data/lib/assets/stylesheets/tao/form/fields/moment_picker/segment_list.scss +53 -0
  79. data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/date_segment.scss +17 -0
  80. data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/hour_segment.scss +15 -0
  81. data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/minute_segment.scss +17 -0
  82. data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/month_segment.scss +15 -0
  83. data/lib/assets/stylesheets/tao/form/fields/moment_picker/segments/year_segment.scss +15 -0
  84. data/lib/assets/stylesheets/tao/form/fields/radio.scss +33 -0
  85. data/lib/assets/stylesheets/tao/form/fields/select/index.scss +10 -0
  86. data/lib/assets/stylesheets/tao/form/fields/select/list.scss +61 -0
  87. data/lib/assets/stylesheets/tao/form/fields/select/multiple_result.scss +72 -0
  88. data/lib/assets/stylesheets/tao/form/fields/select/result.scss +101 -0
  89. data/lib/assets/stylesheets/tao/form/fields/switch.scss +12 -0
  90. data/lib/assets/stylesheets/tao/form/index.scss +5 -0
  91. data/lib/assets/stylesheets/tao/form/inputs/boolean.scss +8 -0
  92. data/lib/assets/stylesheets/tao/form/inputs/group.scss +2 -0
  93. data/lib/assets/stylesheets/tao/form/inputs/index.scss +1 -0
  94. data/lib/assets/stylesheets/tao/form/inputs/text.scss +2 -0
  95. data/lib/assets/stylesheets/tao/form/layout.scss +148 -0
  96. data/lib/assets/stylesheets/tao/form/mobile/_globals.scss +3 -0
  97. data/lib/assets/stylesheets/tao/form/mobile/_mixins.scss +22 -0
  98. data/lib/assets/stylesheets/tao/form/mobile/_variables.scss +3 -0
  99. data/lib/assets/stylesheets/tao/form/mobile/fields/checkbox.scss +2 -0
  100. data/lib/assets/stylesheets/tao/form/mobile/fields/datetime_picker.scss +18 -0
  101. data/lib/assets/stylesheets/tao/form/mobile/fields/index.scss +1 -0
  102. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/index.scss +9 -0
  103. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/result.scss +19 -0
  104. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segment_list.scss +52 -0
  105. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/date_segment.scss +14 -0
  106. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/hour_segment.scss +14 -0
  107. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/minute_segment.scss +14 -0
  108. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/month_segment.scss +14 -0
  109. data/lib/assets/stylesheets/tao/form/mobile/fields/moment_picker/segments/year_segment.scss +14 -0
  110. data/lib/assets/stylesheets/tao/form/mobile/fields/radio.scss +2 -0
  111. data/lib/assets/stylesheets/tao/form/mobile/fields/select/index.scss +66 -0
  112. data/lib/assets/stylesheets/tao/form/mobile/fields/select/list.scss +10 -0
  113. data/lib/assets/stylesheets/tao/form/mobile/fields/select/multiple_result.scss +12 -0
  114. data/lib/assets/stylesheets/tao/form/mobile/fields/select/result.scss +28 -0
  115. data/lib/assets/stylesheets/tao/form/mobile/fields/switch.scss +2 -0
  116. data/lib/assets/stylesheets/tao/form/mobile/index.scss +5 -0
  117. data/lib/assets/stylesheets/tao/form/mobile/inputs/boolean.scss +7 -0
  118. data/lib/assets/stylesheets/tao/form/mobile/inputs/group.scss +6 -0
  119. data/lib/assets/stylesheets/tao/form/mobile/inputs/index.scss +1 -0
  120. data/lib/assets/stylesheets/tao/form/mobile/inputs/text.scss +2 -0
  121. data/lib/assets/stylesheets/tao/form/mobile/layout.scss +137 -0
  122. data/lib/assets/stylesheets/tao/form/mobile/reset.scss +30 -0
  123. data/lib/assets/stylesheets/tao/form/mobile/variables/_base.scss +12 -0
  124. data/lib/assets/stylesheets/tao/form/mobile/variables/_moment_picker.scss +9 -0
  125. data/lib/assets/stylesheets/tao/form/mobile/variables/_select.scss +9 -0
  126. data/lib/assets/stylesheets/tao/form/reset.scss +30 -0
  127. data/lib/assets/stylesheets/tao/form/shared/fields/_checkbox.scss +61 -0
  128. data/lib/assets/stylesheets/tao/form/shared/fields/_radio.scss +53 -0
  129. data/lib/assets/stylesheets/tao/form/shared/fields/_switch.scss +56 -0
  130. data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/_result.scss +46 -0
  131. data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/_segment_list.scss +93 -0
  132. data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_date_segment.scss +50 -0
  133. data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_hour_segment.scss +35 -0
  134. data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_minute_segment.scss +23 -0
  135. data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_month_segment.scss +27 -0
  136. data/lib/assets/stylesheets/tao/form/shared/fields/moment_picker/segments/_year_segment.scss +27 -0
  137. data/lib/assets/stylesheets/tao/form/shared/fields/select/_list.scss +136 -0
  138. data/lib/assets/stylesheets/tao/form/shared/fields/select/_multiple_result.scss +46 -0
  139. data/lib/assets/stylesheets/tao/form/shared/inputs/_boolean.scss +5 -0
  140. data/lib/assets/stylesheets/tao/form/shared/inputs/_group.scss +25 -0
  141. data/lib/assets/stylesheets/tao/form/shared/inputs/_text.scss +33 -0
  142. data/lib/assets/stylesheets/tao/form/variables/_base.scss +15 -0
  143. data/lib/assets/stylesheets/tao/form/variables/_moment_picker.scss +9 -0
  144. data/lib/assets/stylesheets/tao/form/variables/_select.scss +10 -0
  145. data/lib/tao_form.rb +5 -0
  146. data/lib/tao_form/components.rb +10 -0
  147. data/lib/tao_form/components/check_box_component.rb +29 -0
  148. data/lib/tao_form/components/date_picker_component.rb +25 -0
  149. data/lib/tao_form/components/datetime_picker_component.rb +50 -0
  150. data/lib/tao_form/components/field_component.rb +15 -0
  151. data/lib/tao_form/components/form_component.rb +24 -0
  152. data/lib/tao_form/components/moment_picker/base.rb +68 -0
  153. data/lib/tao_form/components/moment_picker/result_component.rb +31 -0
  154. data/lib/tao_form/components/moment_picker/segment_list_component.rb +36 -0
  155. data/lib/tao_form/components/moment_picker/segments.rb +6 -0
  156. data/lib/tao_form/components/moment_picker/segments/base.rb +17 -0
  157. data/lib/tao_form/components/moment_picker/segments/date_segment_component.rb +21 -0
  158. data/lib/tao_form/components/moment_picker/segments/hour_segment_component.rb +21 -0
  159. data/lib/tao_form/components/moment_picker/segments/minute_segment_component.rb +28 -0
  160. data/lib/tao_form/components/moment_picker/segments/month_segment_component.rb +15 -0
  161. data/lib/tao_form/components/moment_picker/segments/year_segment_component.rb +21 -0
  162. data/lib/tao_form/components/month_picker_component.rb +23 -0
  163. data/lib/tao_form/components/radio_button_component.rb +29 -0
  164. data/lib/tao_form/components/select/list_component.rb +23 -0
  165. data/lib/tao_form/components/select/multiple_result_component.rb +23 -0
  166. data/lib/tao_form/components/select/result_component.rb +35 -0
  167. data/lib/tao_form/components/select_component.rb +78 -0
  168. data/lib/tao_form/components/switch_component.rb +11 -0
  169. data/lib/tao_form/components/time_picker_component.rb +29 -0
  170. data/lib/tao_form/engine.rb +15 -0
  171. data/lib/tao_form/inputs.rb +9 -0
  172. data/lib/tao_form/inputs/boolean_input.rb +30 -0
  173. data/lib/tao_form/inputs/collection_check_boxes_input.rb +19 -0
  174. data/lib/tao_form/inputs/collection_radio_buttons_input.rb +19 -0
  175. data/lib/tao_form/inputs/collection_select_input.rb +21 -0
  176. data/lib/tao_form/inputs/date_time_input.rb +22 -0
  177. data/lib/tao_form/inputs/grouped_collection_select_input.rb +22 -0
  178. data/lib/tao_form/inputs/month_input.rb +7 -0
  179. data/lib/tao_form/inputs/numeric_input.rb +19 -0
  180. data/lib/tao_form/inputs/string_input.rb +19 -0
  181. data/lib/tao_form/version.rb +3 -0
  182. data/lib/views/components/tao_form/components/_check_box.html.erb +10 -0
  183. data/lib/views/components/tao_form/components/_datetime_picker.html.erb +7 -0
  184. data/lib/views/components/tao_form/components/_moment_picker.html+mobile.erb +17 -0
  185. data/lib/views/components/tao_form/components/_moment_picker.html.erb +4 -0
  186. data/lib/views/components/tao_form/components/_radio_button.html.erb +9 -0
  187. data/lib/views/components/tao_form/components/_select.html+mobile.erb +27 -0
  188. data/lib/views/components/tao_form/components/_select.html.erb +4 -0
  189. data/lib/views/components/tao_form/components/_switch.html.erb +10 -0
  190. data/lib/views/components/tao_form/components/moment_picker/_result.html+mobile.erb +11 -0
  191. data/lib/views/components/tao_form/components/moment_picker/_result.html.erb +14 -0
  192. data/lib/views/components/tao_form/components/moment_picker/_segment_list.html+mobile.erb +8 -0
  193. data/lib/views/components/tao_form/components/moment_picker/_segment_list.html.erb +4 -0
  194. data/lib/views/components/tao_form/components/moment_picker/segment_list/_labels.html.erb +13 -0
  195. data/lib/views/components/tao_form/components/moment_picker/segment_list/_segments.html.erb +7 -0
  196. data/lib/views/components/tao_form/components/moment_picker/segments/_date_segment.html.erb +14 -0
  197. data/lib/views/components/tao_form/components/moment_picker/segments/_hour_segment.html.erb +14 -0
  198. data/lib/views/components/tao_form/components/moment_picker/segments/_minute_segment.html.erb +9 -0
  199. data/lib/views/components/tao_form/components/moment_picker/segments/_month_segment.html.erb +16 -0
  200. data/lib/views/components/tao_form/components/moment_picker/segments/_year_segment.html.erb +10 -0
  201. data/lib/views/components/tao_form/components/select/_list.html.erb +18 -0
  202. data/lib/views/components/tao_form/components/select/_multiple_result.html+mobile.erb +3 -0
  203. data/lib/views/components/tao_form/components/select/_multiple_result.html.erb +7 -0
  204. data/lib/views/components/tao_form/components/select/_result.html+mobile.erb +10 -0
  205. data/lib/views/components/tao_form/components/select/_result.html.erb +14 -0
  206. data/vendor/assets/javascripts/moment.js +4463 -0
  207. data/vendor/assets/javascripts/moment/zh-cn.js +112 -0
  208. metadata +334 -0
@@ -0,0 +1,10 @@
1
+
2
+ class Tao.Form.MonthPicker extends Tao.Form.MomentPicker.Element
3
+
4
+ @tag 'tao-month-picker'
5
+
6
+ @attribute 'valueFormat', default: 'YYYY-MM'
7
+
8
+ @attribute 'displayFormat', default: 'YYYY-MM'
9
+
10
+ TaoComponent.register Tao.Form.MonthPicker
@@ -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,2 @@
1
+ #= require ./option
2
+ #= require ./data_provider
@@ -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()