InfoHeader.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <template>
  2. <div class="container-fluid">
  3. <div class="navbar-header">
  4. <a class="navbar-brand">{{ headerName }}</a>
  5. </div>
  6. <div
  7. id="bs-example-navbar-collapse-2"
  8. class="collapse navbar-collapse"
  9. >
  10. <div
  11. class="navbar-form navbar-left"
  12. role="search"
  13. >
  14. <div class="dropdown float-left">
  15. <button
  16. id="dropdownMenuQueryFilter"
  17. class="btn btn-default dropdown-toggle"
  18. type="button"
  19. data-toggle="dropdown"
  20. aria-haspopup="true"
  21. aria-expanded="true"
  22. >
  23. <span class="glyphicon glyphicon-list-alt" />
  24. </button>
  25. <template v-if="infoFilterFieldsClone != null">
  26. <draggable
  27. v-model="infoFilterFieldsClone"
  28. item-key="key"
  29. class="dropdown-menu"
  30. @change="filterFieldSortChaned()"
  31. @click="stopPropagation($event)"
  32. >
  33. <template #item="{element}">
  34. <div style="margin-left: 15px;margin-right: 15px;">
  35. <div class="column">
  36. <input
  37. :id="'InfoForm' + '_' + infoWindowNo + '_' + element.fieldName"
  38. v-model="element.isShow"
  39. autocomplete="off"
  40. class="isShow-checkbox"
  41. type="checkbox"
  42. :disabled="element.mandatory && element.isShow"
  43. @change="visibleChanged(element)"
  44. />
  45. <label
  46. :for="'InfoForm' + '_' + infoWindowNo + '_' + element.fieldName"
  47. class="column-name"
  48. :class="{'column-red' : element.mandatory == true}"
  49. >{{ element.name }}</label>
  50. </div>
  51. </div>
  52. </template>
  53. </draggable>
  54. </template>
  55. </div>
  56. <div class="dropdown float-left dropdown-infoGrid">
  57. <button
  58. id="dropdownMenuQueryFilter2"
  59. class="btn btn-default dropdown-toggle"
  60. type="button"
  61. data-toggle="dropdown"
  62. aria-haspopup="true"
  63. aria-expanded="true"
  64. >
  65. <span class="glyphicon glyphicon-calendar" />
  66. </button>
  67. <template v-if="infoGridFieldsClone != null">
  68. <draggable
  69. v-model="infoGridFieldsClone"
  70. item-key="key"
  71. class="dropdown-menu"
  72. @change="gridFieldSortChaned()"
  73. @click="stopPropagation($event)"
  74. >
  75. <template #item="{element}">
  76. <div style="margin-left: 15px;margin-right: 15px;">
  77. <div class="column">
  78. <input
  79. :id="'InfoGrid' + '_' + infoWindowNo + '_' + element.fieldName"
  80. v-model="element.isShow"
  81. autocomplete="off"
  82. class="isShow-checkbox"
  83. type="checkbox"
  84. :disabled="element.mandatory && element.isShow"
  85. @change="gridFieldvisibleChanged(element)"
  86. />
  87. <label
  88. :for="'InfoGrid' + '_' + infoWindowNo + '_' + element.fieldName"
  89. class="column-name"
  90. :class="{'column-red' : element.mandatory == true}"
  91. >{{ element.name }}</label>
  92. </div>
  93. </div>
  94. </template>
  95. </draggable>
  96. </template>
  97. </div>
  98. <button
  99. v-if="htmlHelpUrl != undefined && htmlHelpUrl != ''"
  100. class="btn btn-default btn-help"
  101. @click="openHtmlHelp(htmlHelpUrl)"
  102. >
  103. <span class="glyphicon glyphicon-question-sign" />
  104. </button>
  105. </div>
  106. </div>
  107. </div>
  108. </template>
  109. <script>
  110. import draggable from 'vuedraggable';
  111. export default {
  112. components: {
  113. draggable,
  114. },
  115. props: {
  116. 'infoFilterFields': {
  117. type: Object,
  118. default: null,
  119. },
  120. 'headerName': {
  121. type: String,
  122. default: null,
  123. },
  124. 'infoGridFields': {
  125. type: Object,
  126. default: null,
  127. },
  128. 'htmlHelpUrl': {
  129. type: String,
  130. default: null,
  131. },
  132. 'infoWindowNo': {
  133. type: String,
  134. default: null,
  135. },
  136. },
  137. emits: ['gridFieldPropertyChanged', 'filterFieldPropertyChanged'],
  138. data: function () {
  139. return {
  140. sortMap: {},
  141. infoFilterFieldsClone: [],
  142. infoGridFieldsClone: [],
  143. };
  144. },
  145. watch: {
  146. 'infoFilterFields': function () {
  147. this.cloneInfoFilterFields();
  148. },
  149. 'infoGridFields': function () {
  150. this.cloneInfoGridFields();
  151. },
  152. },
  153. mounted: function () {
  154. this.cloneInfoFilterFields();
  155. this.cloneInfoGridFields();
  156. },
  157. methods: {
  158. cloneInfoFilterFields: function () {
  159. var _self = this;
  160. if (_self.infoFilterFields != null) {
  161. _self.infoFilterFieldsClone.splice(0, _self.infoFilterFieldsClone.length);
  162. let tempInfoFilterFields = [];
  163. for (var i = 0, len1 = _self.infoFilterFields.length; i < len1; i++) {
  164. var fieldClone = {
  165. 'key': ('InfoFormField' + '_' + _self.infoWindowNo + '_' + _self.infoFilterFields[i].fieldName),
  166. 'fieldName': _self.infoFilterFields[i].fieldName,
  167. 'name': _self.infoFilterFields[i].name,
  168. 'mandatory': _self.infoFilterFields[i].mandatory,
  169. 'isShow': _self.infoFilterFields[i].isShow,
  170. 'sortNo': _self.infoFilterFields[i].sortNo,
  171. };
  172. tempInfoFilterFields.push(fieldClone);
  173. }
  174. tempInfoFilterFields.sort(function (item1, item2) {
  175. return item1.sortNo - item2.sortNo;
  176. });
  177. tempInfoFilterFields.forEach(function(tempInfoFilterField){
  178. _self.infoFilterFieldsClone.push(tempInfoFilterField);
  179. });
  180. }
  181. },
  182. cloneInfoGridFields: function () {
  183. var _self = this;
  184. if (_self.infoGridFields != null) {
  185. _self.infoGridFieldsClone.splice(0, _self.infoGridFieldsClone.length);
  186. let tempInfoGridFields = [];
  187. for (var i = 0, len1 = _self.infoGridFields.length; i < len1; i++) {
  188. var fieldClone = {
  189. 'key': ('InfoGridField' + '_' + _self.infoWindowNo + '_' + _self.infoGridFields[i].fieldName),
  190. 'fieldName': _self.infoGridFields[i].fieldName,
  191. 'name': _self.infoGridFields[i].name,
  192. 'mandatory': _self.infoGridFields[i].mandatory,
  193. 'isShow': _self.infoGridFields[i].isShow,
  194. 'sortNo': _self.infoGridFields[i].sortNo,
  195. 'width': _self.infoGridFields[i].width,
  196. };
  197. tempInfoGridFields.push(fieldClone);
  198. }
  199. tempInfoGridFields.sort(function (item1, item2) {
  200. return item1.sortNo - item2.sortNo;
  201. });
  202. tempInfoGridFields.forEach(function(tempInfoGridField){
  203. _self.infoGridFieldsClone.push(tempInfoGridField);
  204. });
  205. }
  206. },
  207. /**
  208. * 打开帮助页面
  209. */
  210. openHtmlHelp: function (htmlHelpUrl) {
  211. window.open(htmlHelpUrl);
  212. },
  213. //将数据传递给父组件
  214. visibleChanged: function (infoFilterFieldItem) {
  215. var _self = this;
  216. _self.$nextTick(function () {
  217. if (infoFilterFieldItem.mandatory) {
  218. infoFilterFieldItem.ishow = true;
  219. return;
  220. }
  221. _self.$emit('filterFieldPropertyChanged', _self.infoFilterFieldsClone);
  222. });
  223. },
  224. gridFieldvisibleChanged: function (item) {
  225. var _self = this;
  226. _self.$nextTick(function () {
  227. if (item.mandatory) {
  228. item.ishow = true;
  229. return;
  230. }
  231. this.$emit('gridFieldPropertyChanged', _self.infoGridFieldsClone);
  232. });
  233. },
  234. // 停止冒泡
  235. stopPropagation: function (e) {
  236. e.stopPropagation();
  237. },
  238. filterFieldSortChaned: function () {
  239. console.log('filterFieldSortChaned');
  240. var _self = this;
  241. for (var i = 0, len1 = _self.infoFilterFieldsClone.length; i < len1; i++) {
  242. _self.infoFilterFieldsClone[i].sortNo = i * 10;
  243. }
  244. this.$emit('filterFieldPropertyChanged', _self.infoFilterFieldsClone);
  245. },
  246. gridFieldSortChaned: function () {
  247. console.log('gridFieldSortChaned');
  248. var _self = this;
  249. for (var i = 0, len1 = _self.infoGridFieldsClone.length; i < len1; i++) {
  250. _self.infoGridFieldsClone[i].sortNo = i * 10;
  251. }
  252. this.$emit('gridFieldPropertyChanged', _self.infoGridFieldsClone);
  253. },
  254. },
  255. };
  256. </script>
  257. <style scoped>
  258. .visible-checkbox {
  259. width: 17px;
  260. height: 17px;
  261. text-align: center;
  262. margin-right: 5px;
  263. margin-left: 15px;
  264. }
  265. .column-name {
  266. height: 25px;
  267. line-height: 25px;
  268. }
  269. .fa-arrow-up {
  270. float: right;
  271. height: 25px;
  272. line-height: 25px;
  273. text-align: center;
  274. margin-right: 10px;
  275. margin-left: 10px;
  276. }
  277. .fa-arrow-down {
  278. float: right;
  279. height: 25px;
  280. line-height: 25px;
  281. margin-right: 10px;
  282. margin-left: 10px;
  283. }
  284. .column-prop {
  285. display: block;
  286. width: 260px;
  287. }
  288. .clear-fix {
  289. clear: both;
  290. }
  291. .float-left {
  292. float: left;
  293. }
  294. .dropdown-infoGrid {
  295. margin-left: 10px;
  296. }
  297. .btn-help {
  298. margin-left: 20px;
  299. }
  300. </style>