SearchWidget.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <template>
  2. <div class="input-group">
  3. <input
  4. aria-describedby="addon"
  5. type="text"
  6. class="form-control"
  7. :class="validInput"
  8. style="border-top-right-radius: 0; border-bottom-right-radius: 0;"
  9. :value="searchText"
  10. :readonly="readonly"
  11. @input="textChange($event)"
  12. @keyup.up="selectUp"
  13. @keyup.down="selectDown"
  14. @keyup.enter="selectEnter"
  15. @keyup.esc="$refs.autoComplete.hide()"
  16. />
  17. <div :class="[classSize != undefined ? 'input-group-btn classSize' : 'input-group-btn']">
  18. <button
  19. type="button"
  20. :class="[classSize != undefined ? 'btn btn-default classSize' : 'btn btn-default']"
  21. @click="showSearchDialog"
  22. >
  23. <span class="glyphicon glyphicon-search" />
  24. </button>
  25. <slot name="button1" />
  26. <slot name="button2" />
  27. <slot name="button3" />
  28. </div>
  29. <Modal
  30. ref="modal"
  31. :full="true"
  32. @ok="searchDialogOk"
  33. @cancel="searchDialogCancel"
  34. >
  35. <template #default>
  36. <info
  37. ref="info"
  38. :field-value="fieldValue"
  39. :where-clause="whereClause"
  40. :is-search-widget="true"
  41. :model-data="modelData"
  42. @data-selected="dataSelected"
  43. />
  44. </template>
  45. <template #header>
  46. <div>{{ titleName }}</div>
  47. </template>
  48. </Modal>
  49. <SearchAutoCompleteWidget
  50. ref="autoComplete"
  51. :info-window-no="infoWindowNo"
  52. :where-clause="whereClause"
  53. class="auto-complete"
  54. @select-data="dataSelected"
  55. />
  56. <Loading ref="loading" />
  57. </div>
  58. </template>
  59. <script>
  60. var Modal = require('../../modal/src/Modal.vue').default;
  61. var Info = require('./InfoWindow.vue').default;
  62. var SearchAutoCompleteWidget = require('./SearchAutoCompleteWidget.vue').default;
  63. var Loading = require('../../loading/src/Loading.vue').default;
  64. export default {
  65. name: 'SearchWidget',
  66. components: {
  67. Modal, Info, SearchAutoCompleteWidget, Loading,
  68. },
  69. // infoWindowNo: 查询窗口编号
  70. // fieldValue: 显示的值
  71. // fieldValue:{
  72. // displayValue: ['Jack'],
  73. // fieldType: 'Key',
  74. // id: 1
  75. // }
  76. // titleName: 弹出窗口的标题
  77. // displayName: 文本框中显示的字段
  78. // whereClause: 约束条件
  79. props: {
  80. 'infoWindowNo':{
  81. type: String,
  82. default: null,
  83. },
  84. 'fieldValue': {
  85. type: Object,
  86. default: null,
  87. },
  88. 'titleName':{
  89. type: String,
  90. default: null,
  91. },
  92. 'displayName':{
  93. type: String,
  94. default: null,
  95. },
  96. 'whereClause':{
  97. type: String,
  98. default: null,
  99. },
  100. 'readonly': {
  101. type: Boolean,
  102. default: false,
  103. },
  104. 'modelData': {
  105. type: Object,
  106. default: null,
  107. },
  108. 'classSize':{
  109. type: String,
  110. default: null,
  111. },
  112. },
  113. emits: ['valueChanged', 'dataSelected'],
  114. data: function () {
  115. var inputSearchText = this.initSearchText(this.fieldValue);
  116. return {
  117. isVisible: [],
  118. searchText: inputSearchText,
  119. leftPosition: 0,
  120. };
  121. },
  122. computed: {
  123. /**
  124. * 是否是有效的数据
  125. */
  126. validInput: function () {
  127. var _self = this;
  128. var isValid = true;
  129. if (this.searchText != undefined && this.searchText.length > 0) {
  130. if (this.fieldValue != undefined && (this.fieldValue.id == undefined || this.fieldValue.id <= 0)) {
  131. isValid = false;
  132. } else if (this.fieldValue != undefined && (this.fieldValue.displayValue != undefined && this.fieldValue.displayValue[0] != this.searchText)) {
  133. isValid = false;
  134. }
  135. }
  136. var isflag = false;
  137. if (_self.classSize != undefined) {
  138. isflag = true;
  139. }
  140. var ss = {
  141. 'invalid-input': isValid == false,
  142. 'classSize': isflag == true,
  143. };
  144. return ss;
  145. },
  146. },
  147. watch: {
  148. redraw: function () {
  149. console.log('searchWidgetRedraw');
  150. },
  151. fieldValue: {
  152. handler(currentValue, oldValue) {
  153. console.log('currentValue:' + JSON.stringify(currentValue));
  154. this.searchText = this.initSearchText(currentValue);
  155. console.log('searchText:' + this.searchText);
  156. },
  157. deep: true,
  158. },
  159. // 查询条件变化时,重新查询数据
  160. whereClause: function () {
  161. this.$refs.info.loadByInfoWindowNo(this.infoWindowNo);
  162. },
  163. },
  164. created: function () {
  165. },
  166. methods: {
  167. selectDown: function () {
  168. this.$refs.autoComplete.selectDown();
  169. },
  170. selectUp: function () {
  171. this.$refs.autoComplete.selectUp();
  172. },
  173. selectEnter: function () {
  174. var _self = this;
  175. var data = _self.$refs.autoComplete.getSelectData();
  176. if (data != undefined) {
  177. _self.dataSelected(data);
  178. _self.$refs.autoComplete.hide();
  179. } else {
  180. if (_self.searchText == undefined || _self.searchText.length == 0) {
  181. if (_self.$refs.autoComplete.isVisible() == true) {
  182. _self.$refs.autoComplete.hide();
  183. } else {
  184. _self.$refs.autoComplete.initSearch('');
  185. }
  186. }
  187. }
  188. },
  189. // 显示搜索对话框
  190. showSearchDialog: function () {
  191. var _self = this;
  192. // 如果是只读,则直接返回。
  193. if (_self.readonly != undefined && _self.readonly == true) {
  194. return;
  195. }
  196. console.log(this.$refs.modal);
  197. this.$refs.modal.showModal();
  198. _self.$refs.autoComplete.hide();
  199. if (this.$refs.info.infoWindowNo != _self.infoWindowNo) {
  200. this.$refs.info.loadByInfoWindowNo(this.infoWindowNo);
  201. } else {
  202. _self.$refs.info.refresh();
  203. }
  204. },
  205. /**
  206. * 搜索框【确定】按钮点击事件
  207. */
  208. searchDialogOk: function () {
  209. var _self = this;
  210. var selectedModelDatas = _self.$refs.info.getSelectedModelDatas();
  211. if (selectedModelDatas != undefined || selectedModelDatas.length > 0) {
  212. // 选中了数据,更新数据
  213. _self.dataSelected(selectedModelDatas[0]);
  214. }
  215. },
  216. searchDialogCancel: function () {
  217. },
  218. // 输入的文本发生改变
  219. textChange: function (e) {
  220. var text = e.target.value;
  221. console.log('textChange: ' + text);
  222. if (text == undefined || text.length == 0) {
  223. var newFieldValue = {
  224. id: undefined,
  225. displayValue: [],
  226. fieldType: 'Key',
  227. };
  228. this.$emit('valueChanged', newFieldValue);
  229. }
  230. this.$refs.autoComplete.initSearch(text);
  231. },
  232. // 数据已经选择
  233. dataSelected: function (modelData) {
  234. var _self = this;
  235. this.$refs.modal.hideModal();
  236. _self.$refs.autoComplete.hide();
  237. if (modelData == undefined) {
  238. return;
  239. }
  240. console.log('已经选择了数据:' + modelData.id);
  241. var displayValue = '';
  242. if (modelData.data && modelData.data[_self.displayName]) {
  243. displayValue = modelData.data[_self.displayName].displayValue[0];
  244. } else if (modelData[_self.displayName]) {
  245. displayValue = modelData[_self.displayName];
  246. }
  247. var newFieldValue = {
  248. id: modelData.id,
  249. displayValue: [displayValue],
  250. fieldType: 'Key',
  251. };
  252. if (newFieldValue.displayValue.length > 0) {
  253. _self.searchText = newFieldValue.displayValue[0];
  254. }
  255. this.$emit('valueChanged', newFieldValue);
  256. this.$emit('dataSelected', modelData);
  257. },
  258. initSearchText: function (tempFieldValue) {
  259. if (tempFieldValue == undefined || tempFieldValue.displayValue == undefined || tempFieldValue.displayValue.length == 0) {
  260. return '';
  261. } else {
  262. return tempFieldValue.displayValue[0];
  263. }
  264. },
  265. },
  266. };
  267. </script>
  268. <style scoped>
  269. .auto-complete {
  270. left: 0px;
  271. top: 34px;
  272. }
  273. .m-input-group-addon {
  274. border-top-right-radius: 5px !important;
  275. border-bottom-right-radius: 5px !important;
  276. }
  277. .invalid-input {
  278. color: #fff;
  279. background-color: #d9534f;
  280. border-color: #d43f3a;
  281. }
  282. .classSize {
  283. font-size: 40px;
  284. height: 60px;
  285. }
  286. </style>