tao_ui 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/config/locales/tao_ui/components/tree/en.yml +6 -0
  3. data/config/locales/tao_ui/components/tree/zh-CN.yml +6 -0
  4. data/lib/assets/javascripts/tao/ui/dialog/index.coffee +11 -1
  5. data/lib/assets/javascripts/tao/ui/index.coffee +3 -0
  6. data/lib/assets/javascripts/tao/ui/mobile/slide_box/index.coffee +1 -3
  7. data/lib/assets/javascripts/tao/ui/popover/index.coffee +11 -1
  8. data/lib/assets/javascripts/tao/ui/shared/slide_box/export.coffee +11 -0
  9. data/lib/assets/javascripts/tao/ui/slide_box/index.coffee +1 -3
  10. data/lib/assets/javascripts/tao/ui/sortable.coffee +140 -0
  11. data/lib/assets/javascripts/tao/ui/table/element.coffee +13 -0
  12. data/lib/assets/javascripts/tao/ui/table/expandable.coffee +61 -0
  13. data/lib/assets/javascripts/tao/ui/table/index.coffee +6 -0
  14. data/lib/assets/javascripts/tao/ui/table/selectable.coffee +52 -0
  15. data/lib/assets/javascripts/tao/ui/tree/element.coffee +58 -0
  16. data/lib/assets/javascripts/tao/ui/tree/index.coffee +5 -0
  17. data/lib/assets/javascripts/tao/ui/tree/item.coffee +86 -0
  18. data/lib/assets/stylesheets/tao/ui/index.scss +2 -0
  19. data/lib/assets/stylesheets/tao/ui/mobile/buttons.scss +6 -0
  20. data/lib/assets/stylesheets/tao/ui/mobile/slide_box.scss +1 -1
  21. data/lib/assets/stylesheets/tao/ui/shared/_buttons.scss +1 -1
  22. data/lib/assets/stylesheets/tao/ui/shared/_tables.scss +3 -2
  23. data/lib/assets/stylesheets/tao/ui/shared/variables/_base.scss +1 -0
  24. data/lib/assets/stylesheets/tao/ui/shared/variables/_buttons.scss +1 -1
  25. data/lib/assets/stylesheets/tao/ui/shared/variables/_tables.scss +2 -0
  26. data/lib/assets/stylesheets/tao/ui/sortable.scss +16 -0
  27. data/lib/assets/stylesheets/tao/ui/tables.scss +77 -0
  28. data/lib/assets/stylesheets/tao/ui/tree.scss +126 -0
  29. data/lib/tao_ui/action_view/helpers.rb +23 -0
  30. data/lib/tao_ui/components.rb +3 -0
  31. data/lib/tao_ui/components/icon_component.rb +0 -2
  32. data/lib/tao_ui/components/slide_box_component.rb +0 -2
  33. data/lib/tao_ui/components/sortable_component.rb +17 -0
  34. data/lib/tao_ui/components/table/base_builder.rb +58 -0
  35. data/lib/tao_ui/components/table/body_builder.rb +30 -0
  36. data/lib/tao_ui/components/table/head_builder.rb +15 -0
  37. data/lib/tao_ui/components/table/row_builder.rb +53 -0
  38. data/lib/tao_ui/components/table/table_builder.rb +35 -0
  39. data/lib/tao_ui/components/table_component.rb +40 -0
  40. data/lib/tao_ui/components/tree/item_component.rb +121 -0
  41. data/lib/tao_ui/components/tree/list_component.rb +51 -0
  42. data/lib/tao_ui/components/tree_component.rb +43 -0
  43. data/lib/tao_ui/engine.rb +7 -0
  44. data/lib/tao_ui/version.rb +1 -1
  45. data/lib/views/components/tao_ui/components/_confirm_dialog.html.erb +2 -2
  46. data/lib/views/components/tao_ui/components/_confirm_popover.html.erb +2 -2
  47. data/lib/views/components/tao_ui/components/_message_dialog.html.erb +1 -1
  48. metadata +26 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 841fce6a55ee514e77c1ed90b33f6c61d24e45e3
4
- data.tar.gz: 50243fe3e1cc627cc8aee3e790fb6ad5ff74f712
3
+ metadata.gz: a1c1bccc0ee34c50adb3a33ea9518467baded118
4
+ data.tar.gz: c07e17ea24685306501e40b19f482494ce813e9b
5
5
  SHA512:
6
- metadata.gz: 64a759788b0e0926fb9aef4a0ffd76aa8ca556fbe750b6933369f7e5d735025df26dd0b54d2bdfe389b14d874af931388a856fac836c79d4de44956321a02ca0
7
- data.tar.gz: 4feec975f323094c0d032a7a41a7592d4b55ce9dc1c06b8340acdfe087f86c21c3a8c73e6b995f125b6732810848c1aaeb0e188d4e3dffc0507c3401c5cc8c08
6
+ metadata.gz: 3d1f8a06f43ded1c8cb3ae312dda29362a3d716b87863c96137be5475bb667f2a426104938b3935ea8f6ea386a7b3e4eee96f06d76d4b6a205d9a581163b729f
7
+ data.tar.gz: 2e13f7440facfaffd146a524fb45d8c2a53e055eccf482ad530c04f264e0821576a0fbffe8a6420732dcff7eb6e61595e09787d3ec1baa5826c2304d9994f130
@@ -0,0 +1,6 @@
1
+ en:
2
+ tao_ui:
3
+ components:
4
+ tree:
5
+ item:
6
+ loading: Loading
@@ -0,0 +1,6 @@
1
+ zh-CN:
2
+ tao_ui:
3
+ components:
4
+ tree:
5
+ item:
6
+ loading: 正在加载
@@ -3,4 +3,14 @@
3
3
  #= require ./message
4
4
  #= require ./confirm
5
5
 
6
- window.TaoDialog = Tao.Dialog = {}
6
+ window.TaoDialog = Tao.Dialog =
7
+
8
+ closeAll: ->
9
+ $('.tao-dialog').each (i, dialog) ->
10
+ dialog.active = false
11
+ null
12
+
13
+ removeAll: ->
14
+ $('.tao-dialog').each (i, dialog) ->
15
+ dialog.remove()
16
+ null
@@ -1,9 +1,12 @@
1
1
  #= require_self
2
2
  #= require tao/ui/shared/ujs
3
3
  #= require ./icons
4
+ #= require ./table
4
5
  #= require ./slide_box
5
6
  #= require ./popover
6
7
  #= require ./tooltip
7
8
  #= require ./dialog
9
+ #= require ./sortable
10
+ #= require ./tree
8
11
 
9
12
  window.Tao ||= {}
@@ -1,4 +1,2 @@
1
- #= require_self
1
+ #= require tao/ui/shared/slide_box/export
2
2
  #= require ./element
3
-
4
- Tao.SlideBox = {}
@@ -3,4 +3,14 @@
3
3
  #= require ./confirm
4
4
  #= require ./create
5
5
 
6
- window.TaoPopover = Tao.Popover = {}
6
+ window.TaoPopover = Tao.Popover =
7
+
8
+ closeAll: ->
9
+ $('.tao-popover').each (i, dialog) ->
10
+ dialog.active = false
11
+ null
12
+
13
+ removeAll: ->
14
+ $('.tao-popover').each (i, dialog) ->
15
+ dialog.remove()
16
+ null
@@ -0,0 +1,11 @@
1
+ Tao.SlideBox =
2
+
3
+ closeAll: ->
4
+ $('.tao-slide-box').each (i, dialog) ->
5
+ dialog.active = false
6
+ null
7
+
8
+ removeAll: ->
9
+ $('.tao-slide-box').each (i, dialog) ->
10
+ dialog.remove()
11
+ null
@@ -1,4 +1,2 @@
1
- #= require_self
1
+ #= require tao/ui/shared/slide_box/export
2
2
  #= require ./element
3
-
4
- Tao.SlideBox = {}
@@ -0,0 +1,140 @@
1
+ class Tao.Sortable extends TaoComponent
2
+
3
+ @tag 'tao-sortable'
4
+
5
+ @attribute 'groupSelector'
6
+
7
+ @attribute 'itemSelector', default: '[draggable="true"]'
8
+
9
+ @attribute 'axis', default: 'y'
10
+
11
+ _connected: ->
12
+ @on 'dragstart', @itemSelector, (e) =>
13
+ e.stopPropagation()
14
+ $item = $ e.currentTarget
15
+ itemRect = $item.get(0).getBoundingClientRect()
16
+ @_startDragging $item
17
+
18
+ e.originalEvent.dataTransfer.effectAllowed = 'move'
19
+ e.originalEvent.dataTransfer.setData 'text/plain', 'tao-sortable'
20
+ e.originalEvent.dataTransfer.setDragImage(
21
+ @_sortingItem.get(0),
22
+ e.clientX - itemRect.left,
23
+ e.clientY - itemRect.top
24
+ )
25
+ null
26
+
27
+ _disconnected: ->
28
+ @off()
29
+ $(document).off ".tao-sortable-#{@taoId}"
30
+
31
+ _startDragging: ($item) ->
32
+ @trigger 'tao:beforeSortStart', [$item]
33
+ @_sortingItem = $item
34
+ setTimeout -> $item.addClass('tao-sortable-sorting')
35
+ @trigger 'tao:sortStart', [@_sortingItem]
36
+
37
+ $(window).on "scroll.tao-sortable-#{@taoId}", _.throttle (e) =>
38
+ @_expireDimensionCache()
39
+ null
40
+ , 100
41
+
42
+ $(document).on "dragover.tao-sortable-#{@taoId}", _.throttle (e) =>
43
+ e.preventDefault()
44
+ @_performDragging x: e.clientX, y: e.clientY
45
+ e.originalEvent.dataTransfer.dropEffect = 'move'
46
+ null
47
+ , 100
48
+
49
+ $(document).on "dragend.tao-sortable-#{@taoId}", (e) =>
50
+ e.preventDefault()
51
+ @_stopDragging()
52
+ $(document).off ".tao-sortable-#{@taoId}"
53
+ $(window).off ".tao-sortable-#{@taoId}"
54
+ null
55
+
56
+ _performDragging: (mousePosition) ->
57
+ return unless @_sortingItem
58
+ item = @_findNearestItem mousePosition
59
+ return unless item && item.el.get(0) != @_sortingItem.get(0)
60
+
61
+ @_moveItem item, mousePosition
62
+ @_expireDimensionCache()
63
+
64
+ _stopDragging: ->
65
+ @_sortingItem.removeClass('tao-sortable-sorting')
66
+ @trigger 'tao:sortEnd', [@_sortingItem]
67
+ @_sortingItem = null
68
+
69
+ _findNearestItem: (mousePosition, dimensions = @_itemDimensions()) ->
70
+ minDistance = null
71
+ nearestItem = null
72
+
73
+ dimensions.forEach (item) =>
74
+ distance = @_getDistanceFromItem item, mousePosition
75
+ if _.isNil(minDistance) || minDistance > distance
76
+ minDistance = distance
77
+ nearestItem = item
78
+
79
+ if nearestItem.type == 'group' && nearestItem.items &&
80
+ nearestItem.items.length > 0
81
+ nearestItem = @_findNearestItem mousePosition, nearestItem.items
82
+
83
+ nearestItem
84
+
85
+ _moveItem: (item, mousePosition) ->
86
+ if item.type == 'group'
87
+ item.el.append @_sortingItem
88
+ else
89
+ method = if (@axis == 'y' && mousePosition.y > item.center.y) ||
90
+ (@axis == 'x' && mousePosition.x > item.center.x)
91
+ 'after'
92
+ else
93
+ 'before'
94
+ item.el[method] @_sortingItem
95
+
96
+ _itemDimensions: ->
97
+ @_dimentions ||= do =>
98
+ if @groupSelector
99
+ @jq.find(@groupSelector).map (i, groupEl) =>
100
+ @_getGroupDimension groupEl
101
+ .get()
102
+ else
103
+ @jq.find(@itemSelector).map (i, itemEl) =>
104
+ @_getItemDimension itemEl
105
+ .get()
106
+
107
+ _getGroupDimension: (groupEl) ->
108
+ $group = $ groupEl
109
+ dimension = $group.get(0).getBoundingClientRect()
110
+
111
+ type: 'group'
112
+ el: $group
113
+ dimension: dimension
114
+ center: @_getCenterPointOfDimension(dimension)
115
+ items: $group.find(@itemSelector).map (i, itemEl) =>
116
+ @_getItemDimension itemEl
117
+ .get()
118
+
119
+ _getItemDimension: (itemEl) ->
120
+ $item = $ itemEl
121
+ dimension = $item.get(0).getBoundingClientRect()
122
+
123
+ type: 'item'
124
+ el: $item
125
+ dimension: dimension
126
+ center: @_getCenterPointOfDimension(dimension)
127
+
128
+ _getCenterPointOfDimension: (dimension) ->
129
+ x: dimension.left + (dimension.width / 2)
130
+ y: dimension.top + (dimension.height / 2)
131
+
132
+ _getDistanceFromItem: (item, position) ->
133
+ deltaX = Math.abs(position.x - item.center.x)
134
+ deltaY = Math.abs(position.y - item.center.y)
135
+ Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2))
136
+
137
+ _expireDimensionCache: ->
138
+ @_dimentions = null
139
+
140
+ TaoComponent.register Tao.Sortable
@@ -0,0 +1,13 @@
1
+ class Tao.Table.Element extends TaoComponent
2
+
3
+ @tag 'tao-table'
4
+
5
+ @include Tao.Table.Selectable
6
+
7
+ @include Tao.Table.Expandable
8
+
9
+ _connected: ->
10
+ @_initSelectable()
11
+ @_initExpandable()
12
+
13
+ TaoComponent.register Tao.Table.Element
@@ -0,0 +1,61 @@
1
+ Tao.Table.Expandable = ->
2
+
3
+ @attribute 'expandable', type: 'boolean'
4
+
5
+ _initExpandable: ->
6
+ @on 'click', 'tbody > tr.expandable', (e) =>
7
+ return if !@expandable || $(e.target).is('a, input')
8
+ $row = $ e.currentTarget
9
+ if $row.hasClass 'expanded'
10
+ @collapseRow $row
11
+ @trigger 'tao:expandRow', $row
12
+ else
13
+ @expandRow $row
14
+ @trigger 'tao:collapseRow', $row
15
+ null
16
+
17
+ expandRow: (row) ->
18
+ $row = $ row
19
+ return @ if $row.is('.disabled, .hidden, .expanded, .expanding')
20
+
21
+ $panel = $row.next('.expandable-panel')
22
+ return @ unless $panel.length > 0
23
+ $panelWrapper = $panel.find('> td > div:first')
24
+
25
+ $panel.show()
26
+ $panel[0].offsetHeight # force reflow
27
+ $panelWrapper.one 'transitionend', (e) ->
28
+ $row.removeClass 'expanding'
29
+
30
+ $row.addClass 'expanded expanding'
31
+ $panel.addClass 'expanded'
32
+ $panelWrapper.css 'height', $panelWrapper[0].scrollHeight
33
+ @_loadRemotePanel $panel
34
+ @
35
+
36
+ collapseRow: (row) ->
37
+ $row = $ row
38
+ return @ if $row.is('.disabled, .hidden, :not(.expanded), .collapsing')
39
+
40
+ $panel = $row.next('.expandable-panel')
41
+ return @ unless $panel.length > 0
42
+ $panelWrapper = $panel.find('> td > div:first')
43
+
44
+ $panelWrapper.one 'transitionend', (e) ->
45
+ $row.removeClass 'collapsing'
46
+ $panel.hide()
47
+
48
+ $row.removeClass 'expanded'
49
+ .addClass 'collapsing'
50
+ $panel.removeClass 'expanded'
51
+ $panelWrapper.css 'height', 0
52
+ @
53
+
54
+ _loadRemotePanel: ($panel) ->
55
+ return unless $panel.is('[data-url]')
56
+ $.ajax
57
+ url: $panel.data('url')
58
+ method: 'get'
59
+ dataType: 'script'
60
+ .done ->
61
+ $panel.removeAttr 'data-url'
@@ -0,0 +1,6 @@
1
+ #= require_self
2
+ #= require ./selectable
3
+ #= require ./expandable
4
+ #= require ./element
5
+
6
+ Tao.Table = {}
@@ -0,0 +1,52 @@
1
+ Tao.Table.Selectable = ->
2
+
3
+ @attribute 'selectable', type: 'boolean'
4
+
5
+ @get 'selectedRows', ->
6
+ @jq.find('tbody > tr.selected')
7
+
8
+ _initSelectable: ->
9
+ @on 'tao:change', '.td-checkbox tao-check-box', (e) =>
10
+ cb = e.currentTarget
11
+ $row = cb.jq.closest('tr')
12
+ @toggleSelectRow $row, cb.checked
13
+ @trigger 'tao:selectedChange', [@selectedRows]
14
+
15
+ @on 'tao:change', '.th-checkbox tao-check-box', (e) =>
16
+ cb = e.currentTarget
17
+ if cb.checked
18
+ @selectAllRows()
19
+ else
20
+ @unselectAllRows()
21
+ @trigger 'tao:selectedChange', [@selectedRows]
22
+
23
+ toggleSelectRow: (row, selected) ->
24
+ return @ unless @selectable
25
+
26
+ $row = $ row
27
+ currentSelected = $row.hasClass('selected')
28
+ selected = !currentSelected if _.isNil selected
29
+ if $row.is('.disabled, .hidden, .expandable-panel')\
30
+ || selected == currentSelected
31
+ return @
32
+
33
+ $row.toggleClass 'selected', selected
34
+ cb = $row.find('.td-checkbox tao-check-box').get(0)
35
+ cb.checked = selected if cb.checked != selected
36
+ @
37
+
38
+ selectRow: (row) ->
39
+ @toggleSelectRow row, true
40
+
41
+ unselectRow: (row) ->
42
+ @toggleSelectRow row, false
43
+
44
+ selectAllRows: ->
45
+ return @ unless @selectable
46
+ @jq.find('tbody > tr').each (i, row) => @selectRow(row)
47
+ @
48
+
49
+ unselectAllRows: ->
50
+ return @ unless @selectable
51
+ @jq.find('tbody > tr').each (i, row) => @unselectRow(row)
52
+ @
@@ -0,0 +1,58 @@
1
+ class Tao.Tree.Element extends TaoComponent
2
+
3
+ @tag 'tao-tree'
4
+
5
+ @attribute 'selectable', 'associatedSelect', type: 'boolean'
6
+
7
+ @get 'selectedItems', ->
8
+ if @associatedSelect
9
+ @_getAssociatedSelectedItems()
10
+ else
11
+ @jq.find('.tao-tree-item[selected]').get()
12
+
13
+ _connected: ->
14
+ @_bind()
15
+
16
+ _disconnected: ->
17
+ @off()
18
+
19
+ _bind: ->
20
+ @on 'tao-tree-item:selectedChange', '.tao-tree-item', (e) =>
21
+ item = e.currentTarget
22
+ return unless item == e.target
23
+ @_refreshAssociatedItems(item) if @associatedSelect
24
+ @trigger 'tao-tree:selectedChange', [@selectedItems]
25
+ null
26
+
27
+ _refreshAssociatedItems: (item) ->
28
+ item.jq.find('.tao-tree-item').prop('selected', item.selected)
29
+ @_refreshAncestorItems(item)
30
+
31
+ _refreshAncestorItems: (item) ->
32
+ $parentItem = $(item).parent().closest('.tao-tree-item', @)
33
+ return unless $parentItem.length > 0
34
+
35
+ $items = $parentItem.find('> .tao-tree-list > .tao-tree-item')
36
+ if $items.filter('[selected], [indeterminate]').length == 0
37
+ $parentItem.prop 'selected', false
38
+ $parentItem.prop 'indeterminate', false
39
+ else if $items.filter(':not([selected])').length == 0
40
+ $parentItem.prop 'selected', true
41
+ $parentItem.prop 'indeterminate', false
42
+ else
43
+ $parentItem.prop 'selected', false
44
+ $parentItem.prop 'indeterminate', true
45
+
46
+ @_refreshAncestorItems $parentItem
47
+
48
+ _getAssociatedSelectedItems: ($list = @jq.find('> .tao-tree-list')) ->
49
+ selectedItems = []
50
+ $list.find('> .tao-tree-item').each (i, item) =>
51
+ if item.selected
52
+ selectedItems.push item
53
+ else if ($childList = item.jq.find('> .tao-tree-list')).length > 0
54
+ selectedItems = selectedItems.concat @_getAssociatedSelectedItems($childList)
55
+ selectedItems
56
+
57
+
58
+ TaoComponent.register Tao.Tree.Element
@@ -0,0 +1,5 @@
1
+ #= require_self
2
+ #= require ./item
3
+ #= require ./element
4
+
5
+ Tao.Tree = {}