@aochuang/common 1.0.0 → 1.0.1

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 (194) hide show
  1. package/common/loading/index.js +7 -0
  2. package/common/loading/loading.vue +71 -0
  3. package/common/tips/index.js +7 -0
  4. package/common/tips/tips.vue +82 -0
  5. package/common/tooltip/index.js +7 -0
  6. package/common/tooltip/popper.js +18 -0
  7. package/common/tooltip/tooltip.vue +55 -0
  8. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-boolean.vue +33 -0
  9. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-date-range.vue +30 -0
  10. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-date.vue +41 -0
  11. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-datetime-range.vue +34 -0
  12. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-datetime.vue +41 -0
  13. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-number-range.vue +67 -0
  14. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-number.vue +35 -0
  15. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-string.vue +41 -0
  16. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item-value.vue +73 -0
  17. package/components/advanced-filter/advanced-filter-condition-item/advanced-filter-condition-item.vue +226 -0
  18. package/components/advanced-filter/advanced-filter-condition-toggle.vue +112 -0
  19. package/components/advanced-filter/advanced-filter-condition.vue +352 -0
  20. package/components/advanced-filter/advanced-filter-permanent-item.vue +10 -0
  21. package/components/advanced-filter/advanced-filter-permanent.vue +10 -0
  22. package/components/advanced-filter/advanced-filter-scene-form.vue +95 -0
  23. package/components/advanced-filter/advanced-filter-scene-item.vue +64 -0
  24. package/components/advanced-filter/advanced-filter-scene-manage.vue +264 -0
  25. package/components/advanced-filter/advanced-filter-scene-transfer.vue +283 -0
  26. package/components/advanced-filter/advanced-filter-scene.vue +199 -0
  27. package/components/advanced-filter/advanced-filter.vue +114 -0
  28. package/components/advanced-filter/index.js +36 -0
  29. package/components/advanced-filter/utils.js +132 -0
  30. package/components/autocomplete/autocomplete.vue +121 -0
  31. package/components/autocomplete/index.js +7 -0
  32. package/components/avatar/avatar.png +0 -0
  33. package/components/avatar/avatar.vue +212 -0
  34. package/components/avatar/index.js +7 -0
  35. package/components/brick-wall/brick-wall-skeleton.vue +125 -0
  36. package/components/brick-wall/brick-wall.vue +293 -0
  37. package/components/brick-wall/index.js +7 -0
  38. package/components/button/button.vue +537 -0
  39. package/components/button/index.js +7 -0
  40. package/components/button/utils.js +20 -0
  41. package/components/cascader/cascader.vue +184 -0
  42. package/components/cascader/index.js +7 -0
  43. package/components/cascader/util.js +50 -0
  44. package/components/checkbox/checkbox.vue +114 -0
  45. package/components/checkbox/index.js +7 -0
  46. package/components/checkbox-button/index.js +8 -0
  47. package/components/checkbox-group/checkbox-group.vue +11 -0
  48. package/components/checkbox-group/index.js +7 -0
  49. package/components/date-picker/date-picker.vue +300 -0
  50. package/components/date-picker/index.js +7 -0
  51. package/components/dialog/dialog.vue +182 -0
  52. package/components/dialog/index.js +14 -0
  53. package/components/dialog/utils.js +20 -0
  54. package/components/drawer/drawer.vue +186 -0
  55. package/components/drawer/index.js +14 -0
  56. package/components/drawer/utils.js +36 -0
  57. package/components/dropdown/dropdown-item.vue +63 -0
  58. package/components/dropdown/dropdown.vue +286 -0
  59. package/components/dropdown/index.js +16 -0
  60. package/components/empty/empty.vue +62 -0
  61. package/components/empty/index.js +7 -0
  62. package/components/filter/filter-group.vue +44 -0
  63. package/components/filter/filter-item.vue +122 -0
  64. package/components/filter/filter-more.vue +114 -0
  65. package/components/filter/filter.vue +407 -0
  66. package/components/filter/index.js +20 -0
  67. package/components/filter/refresh-line.svg +1 -0
  68. package/components/filter/util.js +5 -0
  69. package/components/form/form-cell.vue +231 -0
  70. package/components/form/form-group.vue +147 -0
  71. package/components/form/form-row.vue +51 -0
  72. package/components/form/form.vue +256 -0
  73. package/components/form/index.js +13 -0
  74. package/components/grid/grid-card-view/grid-card-view.vue +157 -0
  75. package/components/grid/grid-column.vue +136 -0
  76. package/components/grid/grid-filter/grid-filter-group.vue +41 -0
  77. package/components/grid/grid-filter/grid-filter-item.vue +68 -0
  78. package/components/grid/grid-filter/grid-filter.vue +115 -0
  79. package/components/grid/grid-filter/util.js +7 -0
  80. package/components/grid/grid-filter-operate/grid-filter-operate-item.vue +55 -0
  81. package/components/grid/grid-filter-operate/grid-filter-operate.vue +46 -0
  82. package/components/grid/grid-sort/grid-sort-proxy.js +27 -0
  83. package/components/grid/grid-sort/grid-sort.vue +205 -0
  84. package/components/grid/grid-sort/icons/asc.png +0 -0
  85. package/components/grid/grid-sort/icons/desc.png +0 -0
  86. package/components/grid/grid-sort/index.js +7 -0
  87. package/components/grid/grid-table-view/grid-table-view.vue +178 -0
  88. package/components/grid/grid-table.vue +547 -0
  89. package/components/grid/grid-toolbar/grid-batch-toolbar-proxy.js +21 -0
  90. package/components/grid/grid-toolbar/grid-batch-toolbar.vue +129 -0
  91. package/components/grid/grid-toolbar/grid-global-toolbar-proxy.js +21 -0
  92. package/components/grid/grid-toolbar/grid-global-toolbar.vue +37 -0
  93. package/components/grid/grid-toolbar/grid-more-toolbar-proxy.js +21 -0
  94. package/components/grid/grid-toolbar/grid-more-toolbar.vue +138 -0
  95. package/components/grid/grid-toolbar/grid-row-toolbar.vue +279 -0
  96. package/components/grid/grid-view-select.vue +78 -0
  97. package/components/grid/grid.vue +1102 -0
  98. package/components/grid/icons/more-line.svg +1 -0
  99. package/components/grid/icons/refresh.svg +14 -0
  100. package/components/grid/index.js +61 -0
  101. package/components/grid/util.js +31 -0
  102. package/components/icon/demo.css +539 -0
  103. package/components/icon/demo_index.html +7433 -0
  104. package/components/icon/icon.vue +96 -0
  105. package/components/icon/iconfont.css +1275 -0
  106. package/components/icon/iconfont.eot +0 -0
  107. package/components/icon/iconfont.js +1 -0
  108. package/components/icon/iconfont.json +2214 -0
  109. package/components/icon/iconfont.svg +455 -0
  110. package/components/icon/iconfont.ttf +0 -0
  111. package/components/icon/iconfont.woff +0 -0
  112. package/components/icon/iconfont.woff2 +0 -0
  113. package/components/icon/index.js +7 -0
  114. package/components/image/image.vue +299 -0
  115. package/components/image/index.js +12 -0
  116. package/components/image/util.js +26 -0
  117. package/components/index.js +153 -0
  118. package/components/loading/index.js +7 -0
  119. package/components/loading/loading.vue +130 -0
  120. package/components/menu/index.js +14 -0
  121. package/components/menu/menu-group.vue +240 -0
  122. package/components/menu/menu-item.vue +215 -0
  123. package/components/menu/menu.vue +64 -0
  124. package/components/message/index.js +19 -0
  125. package/components/message/message.js +28 -0
  126. package/components/message/message.less +6 -0
  127. package/components/message-box/index.js +10 -0
  128. package/components/message-box/message-box.js +140 -0
  129. package/components/message-box/message-box.less +5 -0
  130. package/components/pagination/index.js +7 -0
  131. package/components/pagination/pagination.vue +193 -0
  132. package/components/panel/index.js +7 -0
  133. package/components/panel/panel.vue +44 -0
  134. package/components/popover/index.js +7 -0
  135. package/components/popover/popover.vue +140 -0
  136. package/components/popup-select/index.js +7 -0
  137. package/components/popup-select/popup-select.vue +114 -0
  138. package/components/radio/index.js +7 -0
  139. package/components/radio/radio.vue +92 -0
  140. package/components/radio-button/index.js +7 -0
  141. package/components/radio-button/radio-button.vue +20 -0
  142. package/components/radio-group/index.js +7 -0
  143. package/components/radio-group/radio-group.vue +22 -0
  144. package/components/searchbox/index.js +7 -0
  145. package/components/searchbox/searchbox.vue +260 -0
  146. package/components/select/index.js +9 -0
  147. package/components/select/select-load-more.vue +53 -0
  148. package/components/select/select.vue +572 -0
  149. package/components/skeleton/index.js +14 -0
  150. package/components/skeleton/skeleton-rows.vue +52 -0
  151. package/components/skeleton/skeleton.vue +72 -0
  152. package/components/sortable/index.js +9 -0
  153. package/components/sortable/sortable-item.vue +77 -0
  154. package/components/sortable/sortable.vue +62 -0
  155. package/components/spinner/index.js +7 -0
  156. package/components/spinner/spinner.vue +121 -0
  157. package/components/spinner-range/index.js +7 -0
  158. package/components/spinner-range/spinner-range.vue +97 -0
  159. package/components/spinner-textarea/index.js +7 -0
  160. package/components/spinner-textarea/spinner-textarea.vue +65 -0
  161. package/components/switch/index.js +7 -0
  162. package/components/switch/switch.vue +105 -0
  163. package/components/tabs/index.js +10 -0
  164. package/components/tabs/tabs.vue +115 -0
  165. package/components/tag/index.js +9 -0
  166. package/components/tag/tag.less +30 -0
  167. package/components/text/index.js +7 -0
  168. package/components/text/text.vue +69 -0
  169. package/components/textarea/index.js +7 -0
  170. package/components/textarea/textarea.vue +229 -0
  171. package/components/textbox/index.js +7 -0
  172. package/components/textbox/textbox.vue +275 -0
  173. package/components/time-picker/index.js +7 -0
  174. package/components/time-picker/time-picker.vue +77 -0
  175. package/components/toolbar/index.js +14 -0
  176. package/components/toolbar/toolbar-item.vue +43 -0
  177. package/components/toolbar/toolbar.vue +81 -0
  178. package/components/tooltip/index.js +9 -0
  179. package/components/tooltip/tooltip.vue +86 -0
  180. package/components/transfer/index.js +7 -0
  181. package/components/transfer/transfer-load-more.vue +53 -0
  182. package/components/transfer/transfer.vue +245 -0
  183. package/components/tree/index.js +7 -0
  184. package/components/tree/tree.vue +326 -0
  185. package/components/tree/utils.js +122 -0
  186. package/components/video/index.js +7 -0
  187. package/components/video/video.vue +53 -0
  188. package/package.json +4 -1
  189. package/utils/date.js +55 -0
  190. package/utils/emitter.js +3 -0
  191. package/utils/json.js +19 -0
  192. package/utils/resize-event.js +35 -0
  193. package/utils/util.js +12 -0
  194. package/utils/utils.js +0 -0
@@ -0,0 +1,212 @@
1
+ <template>
2
+ <div class="ui-avatar" :class="[{'is-online': showOnline && online, 'is-link': isLink, 'has-info': $slots.info, 'is-round': round}, 'ui-avatar--' + size]" @click="handleClick">
3
+ <div class="ui-avatar__inner">
4
+ <div class="ui-avatar__main">
5
+ <ui-tooltip :content="name" :disabled="!name || !showTooltip">
6
+ <span class="ui-avatar__image" :style="{'line-height': imageSize}">
7
+ <ui-image
8
+ class="ui-avatar__image-img"
9
+ :src="showAvatarSrc"
10
+ :gray="showOnline && !online"
11
+ :alt="name"
12
+ :radius="imageRadius"
13
+ :width="imageSize"
14
+ :height="imageSize"
15
+ ></ui-image>
16
+ <span v-if="showOnline" class="ui-avatar__online" :title="online ? '在线' : '离线'"></span>
17
+ </span>
18
+ </ui-tooltip>
19
+ <div class="ui-avatar__info" v-if="(showName && (name || $slots.name)) || $slots.info">
20
+ <span v-if="showName" class="ui-avatar__name" :title="name">
21
+ <slot name="name">{{name}}</slot>
22
+ </span>
23
+ <slot name="info"></slot>
24
+ </div>
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </template>
29
+ <script>
30
+ import UiImage from '../image'
31
+
32
+ export default {
33
+ name: 'UiAvatar',
34
+ components: {
35
+ UiImage
36
+ },
37
+ props: {
38
+ src: {
39
+ type: String
40
+ },
41
+ defaultSrc: {
42
+ type: String
43
+ },
44
+ name: {
45
+ type: String
46
+ },
47
+ showName: {
48
+ type: Boolean,
49
+ default: true
50
+ },
51
+ radius: {
52
+ type: [Boolean, String],
53
+ default: true
54
+ },
55
+ round: {
56
+ type: Boolean,
57
+ default: false
58
+ },
59
+ size: {
60
+ type: String,
61
+ default: 'small',
62
+ validator (value) {
63
+ // large 72 * 72
64
+ // medium 36 * 36
65
+ // small 24 * 24
66
+ return ['large', 'medium', 'small', 'mini', 'custom'].indexOf(value) >= 0
67
+ }
68
+ },
69
+ showTooltip: {
70
+ type: Boolean,
71
+ default: false
72
+ },
73
+ showOnline: {
74
+ type: Boolean,
75
+ default: false
76
+ },
77
+ online: {
78
+ type: Boolean,
79
+ default: false
80
+ },
81
+ click: {
82
+ type: Function
83
+ }
84
+ },
85
+ computed: {
86
+ showAvatarSrc () {
87
+ return this.src || this.defaultSrc || require('./avatar.png')
88
+ },
89
+ isLink () {
90
+ return !!this.click
91
+ },
92
+ imageSize () {
93
+ const map = {
94
+ large: '72px',
95
+ medium: '36px',
96
+ small: '24px',
97
+ mini: '18px'
98
+ }
99
+ return map[this.size]
100
+ },
101
+ imageRadius () {
102
+ const map = {
103
+ large: 9,
104
+ medium: 6,
105
+ small: 3,
106
+ mini: 2
107
+ }
108
+ return map[this.size]
109
+ }
110
+ },
111
+ watch: {
112
+ cropable (val) {
113
+ if (!val) {
114
+ this.cropperVisbile = false
115
+ }
116
+ }
117
+ },
118
+ methods: {
119
+ handleClick (evt) {
120
+ this.click && this.click()
121
+ this.$emit('click', evt)
122
+ }
123
+ }
124
+ }
125
+ </script>
126
+ <style lang="less">
127
+ .ui-avatar{
128
+ display: inline-block;
129
+ max-width: 100%;
130
+ &.is-online{
131
+ .ui-avatar__online{
132
+ background-color: #12B875;
133
+ }
134
+ }
135
+ &.is-link {
136
+ cursor: pointer;
137
+ }
138
+ &.has-info{
139
+ .ui-avatar__main{
140
+ align-items: flex-start;
141
+ }
142
+ }
143
+ &.is-round {
144
+ .ui-avatar__image-img {
145
+ border-radius: 50%;
146
+ }
147
+ }
148
+ }
149
+ .ui-avatar__inner{
150
+ display: flex;
151
+ flex-direction: row;
152
+ align-items: center;
153
+ }
154
+ .ui-avatar__info{
155
+ line-height: 18px;
156
+ margin-left: 6px;
157
+ flex: 1;
158
+ min-width: 0;
159
+ white-space: nowrap;
160
+ overflow: hidden;
161
+ text-overflow: ellipsis;
162
+ }
163
+ .ui-avatar__image{
164
+ display: inline-block;
165
+ position: relative;
166
+ }
167
+ .ui-avatar__main{
168
+ display: flex;
169
+ flex-direction: row;
170
+ align-items: center;
171
+ min-width: 0;
172
+ }
173
+ .ui-avatar__image-img{
174
+ outline: 0;
175
+ overflow: hidden;
176
+ }
177
+ .ui-avatar__name{
178
+ }
179
+ .ui-avatar__upload{
180
+ margin-left: 12px;
181
+ color: #00A0EB;
182
+ cursor: pointer;
183
+ }
184
+ .ui-avatar__online{
185
+ width: 8px;
186
+ height: 8px;
187
+ border: 1px solid #fff;
188
+ background-color: #ccc;
189
+ position: absolute;
190
+ border-radius: 50%;
191
+ right: 0;
192
+ bottom: 0;
193
+ }
194
+ .ui-avatar--medium{
195
+ .ui-avatar__online{
196
+ bottom: 0;
197
+ right: 0;
198
+ }
199
+ }
200
+ .ui-avatar--small{
201
+ .ui-avatar__online{
202
+ bottom: -2px;
203
+ right: -2px;
204
+ }
205
+ }
206
+ .ui-avatar--mini{
207
+ .ui-avatar__online{
208
+ bottom: -3px;
209
+ right: -3px;
210
+ }
211
+ }
212
+ </style>
@@ -0,0 +1,7 @@
1
+ import Avatar from './avatar'
2
+
3
+ Avatar.install = (Vue) => {
4
+ Vue.component(Avatar.name, Avatar)
5
+ }
6
+
7
+ export default Avatar
@@ -0,0 +1,125 @@
1
+ <template>
2
+ <div class="ui-brick-wall-skeleton" :class="{'is-line-wrap': lineWrap}">
3
+ <div
4
+ class="ui-brick-wall-skeleton__item"
5
+ v-for="index in innerSpan"
6
+ :key="index"
7
+ >
8
+ <template v-if="index > 3">
9
+ <div
10
+ class="ui-brick-wall-skeleton__empty"
11
+ ></div>
12
+ </template>
13
+ <template v-else>
14
+ <div
15
+ class="ui-brick-wall-skeleton__card"
16
+ :style="colStyle"
17
+ >
18
+ <div class="ui-brick-wall-skeleton__card-main">
19
+ <div class="ui-brick-wall-skeleton__card-content">
20
+ <div class="ui-brick-wall-skeleton__card-avatar">
21
+ <ui-skeleton width="32px" height="32px"></ui-skeleton>
22
+ </div>
23
+ <div class="ui-brick-wall-skeleton__card-fields">
24
+ <div class="ui-brick-wall-skeleton__card-title">
25
+ <ui-skeleton width="30%" height="18px"></ui-skeleton>
26
+ </div>
27
+ <div class="ui-brick-wall-skeleton__card-description">
28
+ <ui-skeleton width="60%" height="18px"></ui-skeleton>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ <div class="ui-brick-wall-skeleton__card-tools">
33
+ <ui-skeleton width="30px" height="18px"></ui-skeleton>
34
+ </div>
35
+ </div>
36
+ <div class="ui-brick-wall-skeleton__card-addon">
37
+ <div class="ui-brick-wall-skeleton__card-addon-left">
38
+ <ui-skeleton width="70%" height="18px"></ui-skeleton>
39
+ </div>
40
+ <div class="ui-brick-wall-skeleton__card-addon-right">
41
+ <ui-skeleton width="30px" height="18px"></ui-skeleton>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </template>
46
+ </div>
47
+ </div>
48
+ </template>
49
+ <script>
50
+ import UiSkeleton from '../skeleton'
51
+
52
+ export default {
53
+ name: 'UiBrickWallSkeleton',
54
+ components: {
55
+ UiSkeleton
56
+ },
57
+ props: {
58
+ lineWrap: {
59
+ type: Boolean
60
+ },
61
+ span: {
62
+ type: Number
63
+ },
64
+ colStyle: {
65
+ type: Object
66
+ }
67
+ },
68
+ computed: {
69
+ innerSpan() {
70
+ return this.span || 3
71
+ }
72
+ }
73
+ }
74
+ </script>
75
+ <style lang="less">
76
+ .ui-brick-wall-skeleton{
77
+ display: flex;
78
+ flex: row;
79
+ &.is-line-wrap {
80
+ .ui-brick-wall-skeleton__item,
81
+ .ui-brick-wall-skeleton__empty{
82
+ flex: 1;
83
+ min-width: 0;
84
+ }
85
+ }
86
+ }
87
+ .ui-brick-wall-skeleton__item{
88
+ &:not(:last-child) {
89
+ margin-right: 24px;
90
+ }
91
+ }
92
+ .ui-brick-wall-skeleton__card{
93
+ border: 1px solid #eee;
94
+ border-radius: 4px;
95
+ padding: 12px;
96
+ }
97
+ .ui-brick-wall-skeleton__card-main{
98
+ display: flex;
99
+ flex-direction: row;
100
+ }
101
+ .ui-brick-wall-skeleton__card-content{
102
+ display: flex;
103
+ flex-direction: row;
104
+ flex: 1;
105
+ }
106
+ .ui-brick-wall-skeleton__card-fields{
107
+ flex: 1;
108
+ }
109
+ .ui-brick-wall-skeleton__card-avatar{
110
+ margin-right: 12px;
111
+ }
112
+ .ui-brick-wall-skeleton__card-title{
113
+ margin-bottom: 12px;
114
+ }
115
+ .ui-brick-wall-skeleton__card-addon{
116
+ border-top: 1px solid #eee;
117
+ padding: 12px 0 0;
118
+ margin-top: 12px;
119
+ display: flex;
120
+ flex-direction: row;
121
+ }
122
+ .ui-brick-wall-skeleton__card-addon-left{
123
+ flex: 1;
124
+ }
125
+ </style>
@@ -0,0 +1,293 @@
1
+ <template>
2
+ <div class="ui-brick-wall" :class="{'is-line-wrap': lineWrap}" :style="{height: height}">
3
+ <template v-if="innerLoading">
4
+ <brick-wall-skeleton
5
+ v-if="skeleton"
6
+ :line-wrap="lineWrap"
7
+ :span="innerSpan"
8
+ :col-style="colStyle"
9
+ ></brick-wall-skeleton>
10
+ </template>
11
+ <template v-else>
12
+ <ui-empty
13
+ icon="activity-line"
14
+ v-if="isEmpty"
15
+ ></ui-empty>
16
+ <template v-else>
17
+ <div
18
+ class="ui-brick-wall__row"
19
+ v-for="(row, rowIndex) in showData"
20
+ :key="rowIndex"
21
+ >
22
+ <div
23
+ class="ui-brick-wall__col"
24
+ :class="{'is-padding': itemPadding}"
25
+ v-for="(col, colIndex) in row"
26
+ :key="colIndex"
27
+ :style="colStyle"
28
+ @click="handleColClick(col)"
29
+ >
30
+ <template v-if="col !== null">
31
+ <slot name="item" :data="col" :selected="!!selectedMap[col[idField]]" :index="(rowIndex * innerSpan) + colIndex"></slot>
32
+ </template>
33
+ </div>
34
+ </div>
35
+ </template>
36
+ </template>
37
+ </div>
38
+ </template>
39
+ <script>
40
+ import UiEmpty from '../empty'
41
+ import BrickWallSkeleton from './brick-wall-skeleton.vue'
42
+
43
+ export default {
44
+ name: 'UiBrickWall',
45
+ components: {
46
+ UiEmpty,
47
+ BrickWallSkeleton
48
+ },
49
+ props: {
50
+ height: {
51
+ type: String
52
+ },
53
+ /**
54
+ * 显示加载中
55
+ */
56
+ loading: {
57
+ type: Boolean
58
+ },
59
+ skeleton: {
60
+ type: Boolean,
61
+ default: true
62
+ },
63
+ selectable: {
64
+ type: Boolean
65
+ },
66
+ multiple: {
67
+ type: Boolean
68
+ },
69
+ idField: {
70
+ type: String,
71
+ default: 'id'
72
+ },
73
+ /**
74
+ * 数据
75
+ */
76
+ data: {
77
+ type: Array,
78
+ default: () => []
79
+ },
80
+ /**
81
+ * 一行显示多少个
82
+ */
83
+ span: {
84
+ type: Number
85
+ },
86
+ /**
87
+ * 查询数据方法
88
+ */
89
+ queryMethod: {
90
+ type: Function
91
+ },
92
+ /**
93
+ * 基础宽度
94
+ * 会根据这个宽度自动计算span,如果设置了固定span,就不需要计算
95
+ */
96
+ baseWidth: {
97
+ type: Number
98
+ },
99
+ itemPadding: {
100
+ type: Boolean,
101
+ default: true
102
+ },
103
+ /**
104
+ * 是否换行
105
+ */
106
+ lineWrap: {
107
+ type: Boolean,
108
+ default: true
109
+ }
110
+ },
111
+ data() {
112
+ return {
113
+ innerLoading: false,
114
+ innerData: this.data,
115
+ width: null,
116
+ selectedMap: {}
117
+ }
118
+ },
119
+ computed: {
120
+ colStyle() {
121
+ if (this.lineWrap) {
122
+ return
123
+ }
124
+ if (!this.baseWidth) {
125
+ return
126
+ }
127
+ return {
128
+ width: this.baseWidth + 'px',
129
+ minWidth: this.baseWidth + 'px'
130
+ }
131
+ },
132
+ isEmpty() {
133
+ return !!(!this.innerData || !this.innerData.length)
134
+ },
135
+ innerSpan() {
136
+ if (this.span) {
137
+ return this.span
138
+ }
139
+ if (this.width && this.baseWidth) {
140
+ return Math.floor(this.width / this.baseWidth)
141
+ }
142
+ return 1
143
+ },
144
+ showData() {
145
+ if (this.lineWrap) {
146
+ const data = this.innerData || []
147
+ const last = data.length - 1
148
+ return data.reduce((rs, v, i) => {
149
+ const index = Math.floor(i / this.innerSpan)
150
+ if (!rs[index]) {
151
+ rs[index] = []
152
+ }
153
+ rs[index].push(v)
154
+ if (i === last) {
155
+ const sy = this.innerSpan * (index + 1) - (i + 1)
156
+ if (sy > 0) {
157
+ for (let j = 0; j < sy; j++) {
158
+ rs[index].push(null)
159
+ }
160
+ }
161
+ }
162
+ return rs
163
+ }, [])
164
+ } else {
165
+ return [this.innerData]
166
+ }
167
+ }
168
+ },
169
+ watch: {
170
+ data(newVal) {
171
+ this.innerData = newVal
172
+ }
173
+ },
174
+ mounted() {
175
+ this.loadData()
176
+ window.addEventListener('resize', this.handleWindowResize)
177
+ this.syncWidth()
178
+ },
179
+ methods: {
180
+ handleWindowResize() {
181
+ this.syncWidth()
182
+ },
183
+ handleColClick (col) {
184
+ if (!this.selectable) {
185
+ return
186
+ }
187
+ if (this.multiple) {
188
+ if (this.selectedMap[col[this.idField]]) {
189
+ this.$delete(this.selectedMap, col[this.idField])
190
+ } else {
191
+ this.$set(this.selectedMap, col[this.idField], col)
192
+ }
193
+ this.$emit('selection-change', {
194
+ selection: Object.keys(this.selectedMap).map(k => this.selectedMap[k])
195
+ })
196
+ } else {
197
+ this.selectedMap = {
198
+ [col[this.idField]]: col
199
+ }
200
+ this.$emit('select-change', {
201
+ item: col
202
+ })
203
+ }
204
+ },
205
+ syncWidth() {
206
+ if (!this.lineWrap) {
207
+ return
208
+ }
209
+ this.width = this.$el.clientWidth
210
+ },
211
+ loadData() {
212
+ if (!this.queryMethod) {
213
+ return
214
+ }
215
+ this.innerLoading = true
216
+ this.queryMethod().then(rs => {
217
+ this.innerData = rs
218
+ }).finally(() => {
219
+ this.innerLoading = false
220
+ })
221
+ },
222
+ reload() {
223
+ this.loadData()
224
+ },
225
+ toggleSelection (rows, isSelected) {
226
+ if (!rows) {
227
+ return
228
+ }
229
+ if (!Array.isArray(rows)) {
230
+ rows = [rows]
231
+ }
232
+ isSelected = !!isSelected
233
+ if (this.multiple) {
234
+ rows.forEach(row => {
235
+ if (isSelected) {
236
+ this.$set(this.selectedMap, row[this.idField], true)
237
+ } else {
238
+ this.$delete(this.selectedMap, row[this.idField])
239
+ }
240
+ })
241
+ } else {
242
+ if (isSelected) {
243
+ this.selectedMap = {
244
+ [rows[0][this.idField]]: true
245
+ }
246
+ } else {
247
+ this.selectedMap = {}
248
+ }
249
+ }
250
+ },
251
+ clearSelection () {
252
+ this.selectedMap = {}
253
+ }
254
+ },
255
+ beforeDestroy() {
256
+ window.removeEventListener('resize', this.handleWindowResize)
257
+ }
258
+ }
259
+ </script>
260
+ <style lang="less">
261
+ .ui-brick-wall{
262
+ margin-top: -8px;
263
+ margin-bottom: -8px;
264
+ flex: 1;
265
+ &:not(.is-line-wrap) {
266
+ overflow: auto;
267
+ .ui-brick-wall__col{
268
+ padding-bottom: 0;
269
+ }
270
+ }
271
+ &.is-line-wrap {
272
+ .ui-brick-wall__col{
273
+ flex: 1;
274
+ min-width: 0;
275
+ }
276
+ }
277
+ }
278
+ .ui-brick-wall__row{
279
+ display: flex;
280
+ flex-direction: row;
281
+ }
282
+ .ui-brick-wall__col {
283
+ &.is-padding {
284
+ padding: 8px;
285
+ }
286
+ &:last-child{
287
+ padding-right: 0;
288
+ }
289
+ &:first-child{
290
+ padding-left: 0;
291
+ }
292
+ }
293
+ </style>
@@ -0,0 +1,7 @@
1
+ import BrickWall from './brick-wall'
2
+
3
+ BrickWall.install = (Vue) => {
4
+ Vue.component(BrickWall.name, BrickWall)
5
+ }
6
+
7
+ export default BrickWall