SearchWidget.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  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,
  68. // Info,
  69. SearchAutoCompleteWidget,
  70. Loading,
  71. },
  72. // infoWindowNo: 查询窗口编号
  73. // fieldValue: 显示的值
  74. // fieldValue:{
  75. // displayValue: ['Jack'],
  76. // fieldType: 'Key',
  77. // id: 1
  78. // }
  79. // titleName: 弹出窗口的标题
  80. // displayName: 文本框中显示的字段
  81. // whereClause: 约束条件
  82. props: {
  83. 'infoWindowNo':{
  84. type: String,
  85. default: null,
  86. },
  87. 'fieldValue': {
  88. type: Object,
  89. default: null,
  90. },
  91. 'titleName':{
  92. type: String,
  93. default: null,
  94. },
  95. 'displayName':{
  96. type: String,
  97. default: null,
  98. },
  99. 'whereClause':{
  100. type: String,
  101. default: null,
  102. },
  103. 'readonly': {
  104. type: Boolean,
  105. default: false,
  106. },
  107. 'modelData': {
  108. type: Object,
  109. default: null,
  110. },
  111. 'classSize':{
  112. type: String,
  113. default: null,
  114. },
  115. },
  116. emits: ['valueChanged', 'dataSelected'],
  117. data: function () {
  118. var inputSearchText = this.initSearchText(this.fieldValue);
  119. return {
  120. isVisible: [],
  121. searchText: inputSearchText,
  122. leftPosition: 0,
  123. };
  124. },
  125. computed: {
  126. /**
  127. * 是否是有效的数据
  128. */
  129. validInput: function () {
  130. var _self = this;
  131. var isValid = true;
  132. if (this.searchText != undefined && this.searchText.length > 0) {
  133. if (this.fieldValue != undefined && (this.fieldValue.id == undefined || this.fieldValue.id <= 0)) {
  134. isValid = false;
  135. } else if (this.fieldValue != undefined && (this.fieldValue.displayValue != undefined && this.fieldValue.displayValue[0] != this.searchText)) {
  136. isValid = false;
  137. }
  138. }
  139. var isflag = false;
  140. if (_self.classSize != undefined) {
  141. isflag = true;
  142. }
  143. var ss = {
  144. 'invalid-input': isValid == false,
  145. 'classSize': isflag == true,
  146. };
  147. return ss;
  148. },
  149. },
  150. watch: {
  151. redraw: function () {
  152. console.log('searchWidgetRedraw');
  153. },
  154. fieldValue: {
  155. handler(currentValue, oldValue) {
  156. console.log('currentValue:' + JSON.stringify(currentValue));
  157. this.searchText = this.initSearchText(currentValue);
  158. console.log('searchText:' + this.searchText);
  159. },
  160. deep: true,
  161. },
  162. // 查询条件变化时,重新查询数据
  163. whereClause: function () {
  164. this.$refs.info.loadByInfoWindowNo(this.infoWindowNo);
  165. },
  166. },
  167. created: function () {
  168. },
  169. methods: {
  170. selectDown: function () {
  171. this.$refs.autoComplete.selectDown();
  172. },
  173. selectUp: function () {
  174. this.$refs.autoComplete.selectUp();
  175. },
  176. selectEnter: function () {
  177. var _self = this;
  178. var data = _self.$refs.autoComplete.getSelectData();
  179. if (data != undefined) {
  180. _self.dataSelected(data);
  181. _self.$refs.autoComplete.hide();
  182. } else {
  183. if (_self.searchText == undefined || _self.searchText.length == 0) {
  184. if (_self.$refs.autoComplete.isVisible() == true) {
  185. _self.$refs.autoComplete.hide();
  186. } else {
  187. _self.$refs.autoComplete.initSearch('');
  188. }
  189. }
  190. }
  191. },
  192. // 显示搜索对话框
  193. showSearchDialog: function () {
  194. var _self = this;
  195. // 如果是只读,则直接返回。
  196. if (_self.readonly != undefined && _self.readonly == true) {
  197. return;
  198. }
  199. console.log(this.$refs.modal);
  200. this.$refs.modal.showModal();
  201. _self.$refs.autoComplete.hide();
  202. if (this.$refs.info.infoWindowNo != _self.infoWindowNo) {
  203. this.$refs.info.loadByInfoWindowNo(this.infoWindowNo);
  204. } else {
  205. _self.$refs.info.refresh();
  206. }
  207. },
  208. /**
  209. * 搜索框【确定】按钮点击事件
  210. */
  211. searchDialogOk: function () {
  212. var _self = this;
  213. var selectedModelDatas = _self.$refs.info.getSelectedModelDatas();
  214. if (selectedModelDatas != undefined || selectedModelDatas.length > 0) {
  215. // 选中了数据,更新数据
  216. _self.dataSelected(selectedModelDatas[0]);
  217. }
  218. },
  219. searchDialogCancel: function () {
  220. },
  221. // 输入的文本发生改变
  222. textChange: function (e) {
  223. var text = e.target.value;
  224. console.log('textChange: ' + text);
  225. if (text == undefined || text.length == 0) {
  226. var newFieldValue = {
  227. id: undefined,
  228. displayValue: [],
  229. fieldType: 'Key',
  230. };
  231. this.$emit('valueChanged', newFieldValue);
  232. }
  233. this.$refs.autoComplete.initSearch(text);
  234. },
  235. // 数据已经选择
  236. dataSelected: function (modelData) {
  237. var _self = this;
  238. this.$refs.modal.hideModal();
  239. _self.$refs.autoComplete.hide();
  240. if (modelData == undefined) {
  241. return;
  242. }
  243. console.log('已经选择了数据:' + modelData.id);
  244. var displayValue = '';
  245. if (modelData.data && modelData.data[_self.displayName]) {
  246. displayValue = modelData.data[_self.displayName].displayValue[0];
  247. } else if (modelData[_self.displayName]) {
  248. displayValue = modelData[_self.displayName];
  249. }
  250. var newFieldValue = {
  251. id: modelData.id,
  252. displayValue: [displayValue],
  253. fieldType: 'Key',
  254. };
  255. if (newFieldValue.displayValue.length > 0) {
  256. _self.searchText = newFieldValue.displayValue[0];
  257. }
  258. this.$emit('valueChanged', newFieldValue);
  259. this.$emit('dataSelected', modelData);
  260. },
  261. initSearchText: function (tempFieldValue) {
  262. if (tempFieldValue == undefined || tempFieldValue.displayValue == undefined || tempFieldValue.displayValue.length == 0) {
  263. return '';
  264. } else {
  265. return tempFieldValue.displayValue[0];
  266. }
  267. },
  268. },
  269. };
  270. </script>
  271. <style scoped>
  272. .auto-complete {
  273. left: 0px;
  274. top: 34px;
  275. }
  276. .m-input-group-addon {
  277. border-top-right-radius: 5px !important;
  278. border-bottom-right-radius: 5px !important;
  279. }
  280. .invalid-input {
  281. color: #fff;
  282. background-color: #d9534f;
  283. border-color: #d43f3a;
  284. }
  285. .classSize {
  286. font-size: 40px;
  287. height: 60px;
  288. }
  289. </style>