WidgetColItem.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. <template>
  2. <div
  3. class="widget-col widget-view"
  4. :class="{
  5. active: selectWidget.key && selectWidget.key == element.key,
  6. 'is_hidden': element.options.hidden
  7. }"
  8. @click.stop="handleSelectWidget(index)"
  9. @mouseover.stop="handleMouseover"
  10. @mouseout="handleMouseout"
  11. ref="widgetCol"
  12. >
  13. <el-row
  14. :type="element.options.flex ? 'flex' : ''"
  15. :gutter="element.options.gutter || 0"
  16. :justify="element.options.justify"
  17. :align="element.options.align"
  18. :class="{
  19. [element.options && element.options.customClass]: element.options && element.options.customClass?true: false
  20. }"
  21. >
  22. <el-col
  23. class="widget-col-item"
  24. v-for="(item, i) in element.columns" :key="item.key"
  25. :class="{
  26. active: selectWidget.key && selectWidget.key == item.key,
  27. [item.options && item.options.customClass]: item.options && item.options.customClass?true: false
  28. }"
  29. @click.stop.native="handleSelectItemWidget(i)"
  30. :span="getColSpan(item.options)"
  31. :offset="item.options ? item.options.offset : 0"
  32. :push="item.options ? item.options.push : 0"
  33. :pull="item.options ? item.options.pull : 0"
  34. @mouseover.stop.native="handleMouseoverCol(i)"
  35. @mouseout.native="handleMouseoutCol(i)"
  36. ref="widgetColItem"
  37. >
  38. <!-- <div v-if="element.columns[i].list.length == 0" class="widget-empty">{{$t('fm.description.tableEmpty')}}</div> -->
  39. <draggable
  40. v-model="item.list"
  41. v-bind="{group:{name: 'people', put: handlePut}, ghostClass: 'ghost',animation: 200, handle: '.drag-widget'}"
  42. :no-transition-on-drag="true"
  43. @add="handleWidgetColAdd($event, element, i)"
  44. @update="handleWidgetColUpdate"
  45. @start="setDragging(true)"
  46. @end="setDragging(false)"
  47. class="widget-col-list"
  48. >
  49. <template v-for="(col, colindex) in item.list" v-if="col && col.key">
  50. <widget-col-item
  51. v-if="col.type === 'grid'"
  52. :key="col.key"
  53. :element="col"
  54. :select.sync="selectWidget"
  55. :index="colindex" :data="item"
  56. @select-change="handleSelectChange($event, item)"
  57. :platform="platform"
  58. :form-key="formKey"
  59. :subform="subform"
  60. >
  61. </widget-col-item>
  62. <widget-tab-item
  63. v-else-if="col.type === 'tabs'"
  64. :key="col.key"
  65. :element="col"
  66. :select.sync="selectWidget"
  67. :index="colindex" :data="item"
  68. @select-change="handleSelectChange($event, item)"
  69. :platform="platform"
  70. :form-key="formKey"
  71. :subform="subform"
  72. >
  73. </widget-tab-item>
  74. <widget-collapse
  75. v-else-if="col.type === 'collapse'"
  76. :key="col.key"
  77. :element="col"
  78. :select.sync="selectWidget"
  79. :index="colindex"
  80. :data="item"
  81. @select-change="handleSelectChange($event, item)"
  82. :platform="platform"
  83. :form-key="formKey"
  84. :subform="subform"
  85. >
  86. </widget-collapse>
  87. <widget-report
  88. v-else-if="col.type === 'report'"
  89. :key="col.key"
  90. :element="col"
  91. :select.sync="selectWidget"
  92. :index="colindex" :data="item"
  93. @select-change="handleSelectChange($event, item)"
  94. :platform="platform"
  95. :form-key="formKey"
  96. :subform="subform"
  97. >
  98. </widget-report>
  99. <widget-table
  100. v-else-if="col.type === 'table'"
  101. :key="col.key"
  102. :element="col"
  103. :select.sync="selectWidget"
  104. :index="colindex" :data="item"
  105. @select-change="handleSelectChange($event, item)"
  106. :platform="platform"
  107. :form-key="formKey"
  108. >
  109. </widget-table>
  110. <widget-sub-form
  111. v-else-if="col.type === 'subform'"
  112. :key="col.key"
  113. :element="col"
  114. :select.sync="selectWidget"
  115. :index="colindex"
  116. :data="item"
  117. @select-change="handleSelectChange($event, item)"
  118. :platform="platform"
  119. :form-key="formKey"
  120. >
  121. </widget-sub-form>
  122. <widget-card
  123. v-else-if="col.type === 'card'"
  124. :key="col.key"
  125. :element="col"
  126. :select.sync="selectWidget"
  127. :index="colindex"
  128. :data="item"
  129. @select-change="handleSelectChange($event, item)"
  130. :platform="platform"
  131. :form-key="formKey"
  132. >
  133. </widget-card>
  134. <widget-group
  135. v-else-if="col.type === 'group'"
  136. :key="col.key"
  137. :element="col"
  138. :select.sync="selectWidget"
  139. :index="colindex"
  140. :data="item"
  141. @select-change="handleSelectChange($event, item)"
  142. :platform="platform"
  143. :form-key="formKey"
  144. >
  145. </widget-group>
  146. <widget-inline
  147. v-else-if="col.type === 'inline'"
  148. :key="col.key"
  149. :element="col"
  150. :select.sync="selectWidget"
  151. :index="colindex" :data="item"
  152. @select-change="handleSelectChange($event, item)"
  153. :platform="platform"
  154. :form-key="formKey"
  155. >
  156. </widget-inline>
  157. <widget-form-item
  158. v-else
  159. :key="col.key"
  160. :element="col"
  161. :select.sync="selectWidget"
  162. :index="colindex" :data="item"
  163. @select-change="handleSelectChange($event, item)"
  164. :form-key="formKey"
  165. >
  166. </widget-form-item>
  167. </template>
  168. </draggable>
  169. <div class="widget-view-action widget-col-action" v-if="selectWidget.key == item.key">
  170. <i class="fm-iconfont icon-icon_clone" @click.stop="handleColItemClone(index, i)" :title="$t('fm.tooltip.clone')"></i>
  171. <i class="fm-iconfont icon-trash" @click.stop="handleColItemDelete(index, i)" v-if="element.columns.length > 1" :title="$t('fm.tooltip.trash')"></i>
  172. </div>
  173. <div class="widget-view-type ">
  174. <span>{{item.type ? $t('fm.components.fields.' + item.type) : ''}}</span>
  175. </div>
  176. </el-col>
  177. </el-row>
  178. <div class="widget-view-action widget-col-action" v-if="selectWidget.key == element.key">
  179. <i class="fm-iconfont icon-tianjiazengjiajia" @click.stop="handleAddCol(index)" :title="$t('fm.actions.addColumn')"></i>
  180. <i class="fm-iconfont icon-icon_clone" @click.stop="handleColClone(index)" :title="$t('fm.tooltip.clone')"></i>
  181. <i class="fm-iconfont icon-trash" @click.stop="handleWidgetDelete(index)" :title="$t('fm.tooltip.trash')"></i>
  182. </div>
  183. <div class="widget-view-drag widget-col-drag" v-if="selectWidget.key == element.key">
  184. <i class="fm-iconfont icon-drag drag-widget"></i>
  185. </div>
  186. <div class="widget-view-model " :style="{'color': element.options.dataBind ? '' : '#666'}">
  187. <span>{{element.model}}</span>
  188. </div>
  189. <div class="widget-view-type ">
  190. <span>{{element.type ? $t('fm.components.fields.' + element.type) : ''}}</span>
  191. </div>
  192. </div>
  193. </template>
  194. <script>
  195. import WidgetFormItem from './WidgetFormItem'
  196. import WidgetTable from './WidgetTable'
  197. import WidgetTabItem from './WidgetTabItem'
  198. import WidgetInline from './WidgetInline'
  199. import Draggable from 'vuedraggable'
  200. import _ from 'lodash'
  201. import { CloneLayout } from '../util/layout-clone.js'
  202. import { EventBus } from '../util/event-bus.js'
  203. import { generateKeyToTD, generateKeyToTH, generateKeyToCol, fixDraggbleList, addClass, removeClass } from '../util'
  204. export default {
  205. name: 'widget-col-item',
  206. components: {
  207. Draggable,
  208. WidgetFormItem,
  209. WidgetTable,
  210. WidgetTabItem,
  211. WidgetInline,
  212. WidgetReport: () => import('./WidgetReport.vue'),
  213. WidgetCollapse: () => import('./WidgetCollapse.vue'),
  214. WidgetSubForm: () => import('./WidgetSubForm.vue'),
  215. WidgetCard: () => import('./WidgetCard.vue'),
  216. WidgetGroup: () => import('./WidgetGroup.vue')
  217. },
  218. props: ['element', 'select', 'index', 'data', 'platform', 'formKey', 'subform'],
  219. inject: ['getDragging', 'setDragging'],
  220. data () {
  221. return {
  222. selectWidget: this.select || {},
  223. selectIndex: -1
  224. }
  225. },
  226. methods: {
  227. handleMouseover (e) {
  228. !this.getDragging() && addClass(this.$refs['widgetCol'], 'is-hover')
  229. },
  230. handleMouseout (e) {
  231. removeClass(this.$refs['widgetCol'], 'is-hover')
  232. },
  233. handleMouseoverCol (i) {
  234. addClass(this.$refs['widgetColItem'][i].$el, 'is-hover')
  235. },
  236. handleMouseoutCol (i) {
  237. !this.getDragging() && removeClass(this.$refs['widgetColItem'][i].$el, 'is-hover')
  238. },
  239. handlePut (a, b, c) {
  240. if (c.className.split(' ').indexOf('widget-dialog') >=0 || c.className.split(' ').indexOf('dialog-put') >= 0 || c.children[0].className.split(' ').indexOf('dialog-put') >= 0) {
  241. return false
  242. }
  243. return true
  244. },
  245. getColSpan (options) {
  246. if (this.platform == 'pc') {
  247. return options && options.md
  248. }
  249. if (this.platform == 'pad') {
  250. return options && options.sm
  251. }
  252. if (this.platform == 'mobile') {
  253. return options && options.xs
  254. }
  255. },
  256. handleSelectWidget (index) {
  257. this.selectWidget = this.data.list[index]
  258. },
  259. handleSelectItemWidget (i) {
  260. this.selectWidget = this.data.list[this.index].columns[i]
  261. this.selectIndex = i
  262. },
  263. handleWidgetDelete (index) {
  264. if (this.data.list.length == 1) {
  265. this.$emit('select-change', -1)
  266. } else {
  267. if (this.data.list.length - 1 == index) {
  268. this.$emit('select-change', index - 1)
  269. } else {
  270. this.$emit('select-change', index)
  271. }
  272. }
  273. this.data.list.splice(index, 1)
  274. setTimeout(() => {
  275. EventBus.$emit('on-history-add-' + this.formKey)
  276. }, 20)
  277. },
  278. handleColItemDelete (index, i) {
  279. this.data.list[index].columns.splice(i, 1)
  280. if (i == 0) {
  281. this.selectWidget = this.data.list[index].columns[0]
  282. } else {
  283. this.selectWidget = this.data.list[index].columns[i - 1]
  284. }
  285. setTimeout(() => {
  286. EventBus.$emit('on-history-add-' + this.formKey)
  287. }, 20)
  288. },
  289. handleAddCol (index) {
  290. this.data.list[index].columns.push({
  291. type: 'col',
  292. options: {
  293. span: 24,
  294. offset: 0,
  295. push: 0,
  296. pull: 0,
  297. xs: 24,
  298. sm: 24,
  299. md: 24,
  300. lg: 24,
  301. xl: 24,
  302. customClass: ''
  303. },
  304. list: [],
  305. key: Math.random().toString(36).slice(-8)
  306. })
  307. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  308. },
  309. handleColClone (index) {
  310. let cloneData = _.cloneDeep(this.data.list[index])
  311. this.data.list.splice(index + 1, 0, CloneLayout(cloneData))
  312. this.$nextTick(() => {
  313. this.selectWidget = this.data.list[index + 1]
  314. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  315. })
  316. },
  317. handleColItemClone (index, i) {
  318. let cloneData = _.cloneDeep(this.data.list[index].columns[i])
  319. this.data.list[index].columns.splice(i + 1, 0, CloneLayout(cloneData))
  320. this.$nextTick(() => {
  321. this.selectWidget = this.data.list[index].columns[i + 1]
  322. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  323. })
  324. },
  325. handleWidgetColUpdate (evt) {
  326. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  327. },
  328. handleWidgetColAdd ($event, row, colIndex) {
  329. const newIndex = $event.newIndex
  330. fixDraggbleList(row.columns[colIndex].list, newIndex)
  331. this.$set(row.columns[colIndex].list, newIndex, _.cloneDeep(row.columns[colIndex].list[newIndex]))
  332. const key = Math.random().toString(36).slice(-8)
  333. this.$set(row.columns[colIndex].list, newIndex, {
  334. ...row.columns[colIndex].list[newIndex],
  335. options: {
  336. ...row.columns[colIndex].list[newIndex].options,
  337. remoteFunc: row.columns[colIndex].list[newIndex].options.remoteFunc || 'func_'+key,
  338. remoteOption: row.columns[colIndex].list[newIndex].options.remoteOption || 'option_'+key,
  339. tableColumn: false,
  340. subform: this.subform ? true : false
  341. },
  342. novalid: {
  343. ...row.columns[colIndex].list[newIndex].novalid,
  344. },
  345. key: row.columns[colIndex].list[newIndex].key ? row.columns[colIndex].list[newIndex].key : key,
  346. model: row.columns[colIndex].list[newIndex].model ? row.columns[colIndex].list[newIndex].model : row.columns[colIndex].list[newIndex].type + '_' + key,
  347. rules: row.columns[colIndex].list[newIndex].rules ? [...row.columns[colIndex].list[newIndex].rules] : []
  348. })
  349. if (row.columns[colIndex].list[newIndex].type == 'report') {
  350. row.columns[colIndex].list[newIndex].rows = generateKeyToTD(row.columns[colIndex].list[newIndex].rows)
  351. row.columns[colIndex].list[newIndex].headerRow = generateKeyToTH(row.columns[colIndex].list[newIndex].headerRow)
  352. }
  353. if (row.columns[colIndex].list[newIndex].type == 'grid') {
  354. row.columns[colIndex].list[newIndex].columns = generateKeyToCol(row.columns[colIndex].list[newIndex].columns)
  355. }
  356. this.selectWidget = row.columns[colIndex].list[newIndex]
  357. this.$nextTick(() => { EventBus.$emit('on-history-add-' + this.formKey) })
  358. },
  359. handleSelectChange (index, item) {
  360. setTimeout(() => {
  361. index >=0 ? (this.selectWidget = item.list[index]) : (this.selectWidget = {})
  362. })
  363. }
  364. },
  365. watch: {
  366. select (val) {
  367. this.selectWidget = val
  368. },
  369. selectWidget: {
  370. deep: false,
  371. handler (val) {
  372. this.$emit('update:select', val)
  373. }
  374. },
  375. }
  376. }
  377. </script>