InfoMultiSearchWidget.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. <template>
  2. <div class="content">
  3. <div class="box">
  4. <span
  5. v-for="(item, index) in selectedDatas"
  6. :key="item + '-' + index"
  7. class="selected-tag"
  8. >
  9. {{ item.value }}
  10. <button
  11. type="button"
  12. class="close"
  13. aria-label="Remove option"
  14. @click="deleteSelected(item)"
  15. >
  16. <span aria-hidden="true">&times;</span>
  17. </button>
  18. </span>
  19. <span
  20. class="glyphicon glyphicon-search search-icon"
  21. @click="showSearchDialog"
  22. />
  23. </div>
  24. <Modal
  25. ref="modal"
  26. :full="true"
  27. @ok="searchDialogOk"
  28. @cancel="searchDialogCancel"
  29. >
  30. <template #header>
  31. <div>{{ infoWindowDto.name }}</div>
  32. </template>
  33. <template #default>
  34. <!-- <InfoFilter
  35. ref="info"
  36. :field-value="fieldValue"
  37. :where-clause-source="whereClauseSource"
  38. :is-search-widget="true"
  39. @data-selected="dataSelected"
  40. @delete-selected="deleteSelected"
  41. /> -->
  42. </template>
  43. </Modal>
  44. <Loading ref="loading" />
  45. </div>
  46. </template>
  47. <script>
  48. var Modal = require('../../modal/src/Modal.vue').default;
  49. // var InfoFilter = require('./InfoWindow.vue').default;
  50. var Loading = require('../../loading/src/Loading.vue').default;
  51. export default {
  52. components: {
  53. Modal,
  54. // InfoFilter,
  55. Loading,
  56. },
  57. props: {
  58. 'infoWindowNo':{
  59. type: String,
  60. default: null,
  61. },
  62. 'fieldValue': {
  63. type: Object,
  64. default: null,
  65. },
  66. 'whereClauseSource': {
  67. type: Object,
  68. default: null,
  69. },
  70. 'displayName': {
  71. type: String,
  72. default: null,
  73. },
  74. },
  75. emits: ['valueChanged'],
  76. data: function () {
  77. return {
  78. labelNames: [],
  79. infoWindowDto: {},
  80. infoWindowData: {},
  81. isShowAuto: false,
  82. searchText: '',
  83. selectIndex: -1,
  84. selectedDatas: [],
  85. };
  86. },
  87. computed: {
  88. },
  89. watch: {
  90. fieldValue: function (to) {
  91. this.reComputeSearchText(to);
  92. },
  93. },
  94. mounted: function () {
  95. this.reComputeSearchText(this.fieldValue);
  96. },
  97. methods: {
  98. // 显示搜索对话框
  99. showSearchDialog: function () {
  100. var _self = this;
  101. _self.$refs.modal.showModal();
  102. _self.$nextTick(function () {
  103. _self.$refs.modal.showModal();
  104. if (_self.$refs.info.infoWindowNo != _self.infoWindowNo) {
  105. _self.$refs.info.loadByInfoWindowNo(_self.infoWindowNo);
  106. } else {
  107. _self.$refs.info.refresh();
  108. }
  109. });
  110. },
  111. searchDialogOk: function () {
  112. },
  113. searchDialogCancel: function () {
  114. },
  115. // 数据已经选择
  116. dataSelected: function (data) {
  117. var _self = this;
  118. if (data == undefined) {
  119. return;
  120. }
  121. console.log('已经选择了数据:' + data.id);
  122. var newIds = [];
  123. if (_self.fieldValue.ids != undefined) {
  124. for (var i = 0; i < _self.fieldValue.ids.length; i++) {
  125. newIds.push(_self.fieldValue.ids[i]);
  126. }
  127. }
  128. if (newIds.indexOf(data.id) < 0) {
  129. newIds.push(data.id);
  130. }
  131. var displayValue = _self.fieldValue.displayValue;
  132. if (_self.displayName != undefined && _self.displayName != '') {
  133. var arr = _self.displayName.split(',');
  134. var text = '';
  135. arr.forEach(function (item) {
  136. console.log('选择的text:' + data.data[item].displayValue[0]);
  137. text += data.data[item].displayValue[0];
  138. });
  139. displayValue.push(text);
  140. }
  141. var newFieldValue = {
  142. displayValue: displayValue,
  143. fieldType: 'MultiSearchBoxEditor',
  144. ids: newIds,
  145. };
  146. _self.$emit('valueChanged', newFieldValue);
  147. },
  148. // 值改变
  149. valueChanged: function (fieldValue) {
  150. this.$emit('valueChanged', fieldValue);
  151. this.reComputeSearchText(fieldValue);
  152. },
  153. /**
  154. * 重新计算显示值
  155. * @package [fieldValue]
  156. * @return {[type]}
  157. */
  158. reComputeSearchText: function (fieldValue) {
  159. var arr = [];
  160. var ids = fieldValue.ids;
  161. var displayValue = fieldValue.displayValue;
  162. if (ids != undefined && displayValue != undefined && ids.length == displayValue.length) {
  163. for (var i = 0; i < ids.length; i++) {
  164. var obj = {
  165. id: ids[i],
  166. value: displayValue[i],
  167. };
  168. arr.push(obj);
  169. }
  170. }
  171. return this.selectedDatas = arr;
  172. },
  173. // 删除选中数据
  174. deleteSelected: function (item) {
  175. var id = item.id;
  176. var _self = this;
  177. var newIds = [];
  178. var displayValues = [];
  179. if (_self.fieldValue.ids != undefined) {
  180. for (let i = 0; i < _self.fieldValue.ids.length; i++) {
  181. newIds.push(_self.fieldValue.ids[i]);
  182. }
  183. }
  184. if (_self.fieldValue.displayValue != undefined) {
  185. for (let i = 0; i < _self.fieldValue.displayValue.length; i++) {
  186. displayValues.push(_self.fieldValue.displayValue[i]);
  187. }
  188. }
  189. var index = newIds.indexOf(id);
  190. if (index > -1) {
  191. newIds.splice(index, 1);
  192. _self.fieldValue.ids.splice(index, 1);
  193. if (displayValues.length > index) {
  194. displayValues.splice(index, 1);
  195. _self.fieldValue.displayValue.splice(index, 1);
  196. }
  197. }
  198. var newFieldValue = {
  199. displayValue: displayValues,
  200. fieldType: 'MultiSearchBoxEditor',
  201. ids: newIds,
  202. };
  203. this.$emit('valueChanged', newFieldValue);
  204. this.reComputeSearchText(newFieldValue);
  205. },
  206. },
  207. };
  208. </script>
  209. <style scoped>
  210. .required-mark {
  211. color: red;
  212. margin-right: 10px;
  213. }
  214. .box {
  215. width: 200px;
  216. min-height: 34px;
  217. border: 1px solid rgba(60, 60, 60, 0.26);
  218. border-radius: 4px;
  219. white-space: normal;
  220. transition: border-radius 0.25s;
  221. background-color: #ffffff;
  222. position: relative;
  223. }
  224. .search-icon {
  225. position: absolute;
  226. top: 9px;
  227. right: 7px;
  228. }
  229. .selected-tag {
  230. color: #333;
  231. background-color: #f0f0f0;
  232. border: 1px solid #ccc;
  233. border-radius: 4px;
  234. height: 26px;
  235. margin: 4px 1px 0px 3px;
  236. padding: 3px 0.25em;
  237. line-height: 34px;
  238. }
  239. .close {
  240. float: none;
  241. margin-right: 0;
  242. font-size: 20px;
  243. appearance: none;
  244. padding: 0;
  245. cursor: pointer;
  246. background: 0 0;
  247. border: 0;
  248. font-weight: 700;
  249. line-height: 1;
  250. color: #000;
  251. text-shadow: 0 1px 0 #fff;
  252. filter: alpha(opacity=20);
  253. opacity: 0.2;
  254. }
  255. .div-readonly {
  256. background-color: #eee !important;
  257. }
  258. .content {
  259. display: inline-block !important;
  260. width: 200px;
  261. }
  262. </style>