tao_form 0.1.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.
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()