InfoWindow.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <template>
  2. <div>
  3. <component
  4. :is="componentName" ref="infoComponent" :field-value="fieldValue" :info-window="infoWindowDto"
  5. :where-clause-source="whereClauseSource" :is-search-widget="isSearchWidget" :parent-model-data="parentModelData"
  6. :model-data="modelData" :multiple="multiple" @data-selected="dataSelected" @delete-selected="deleteSelected"
  7. />
  8. <Loading v-if="loading" />
  9. </div>
  10. </template>
  11. <script>
  12. var Common = require('../../common/Common.js').default;
  13. var Notify = require('../../common/Notify.js').default;
  14. var CssUtil = require('../../common/CssUtil.js').default;
  15. var JsUtil = require('../../common/JsUtil.js').default;
  16. var QueryPage = require('./QueryPage.vue').default;
  17. var Loading = require('../../loading/src/Loading.vue').default;
  18. var ClientOrganization = require('../../client-organization/src/ClientOrganization.vue').default;
  19. export default {
  20. name: 'InfoWindow',
  21. components: {
  22. QueryPage,
  23. Loading,
  24. 'ClientOrganization': ClientOrganization,
  25. },
  26. props: {
  27. 'whereClauseSource': {
  28. type: Object,
  29. default: null,
  30. },
  31. 'isSearchWidget': {
  32. type: Boolean,
  33. default: null,
  34. },
  35. 'parentModelData': {
  36. type: Object,
  37. default: null,
  38. },
  39. 'modelData': {
  40. type: Object,
  41. default: null,
  42. },
  43. 'fieldValue': {
  44. type: Object,
  45. default: null,
  46. },
  47. /**
  48. * 查询窗口编号
  49. */
  50. 'infoWindowNo': {
  51. type: String,
  52. default: null,
  53. },
  54. /**
  55. * 是否多选
  56. */
  57. 'multiple': {
  58. type: Boolean,
  59. default: false,
  60. },
  61. },
  62. emits: ['dataSelected', 'valueChanged', 'deleteSelected'],
  63. data: function () {
  64. return {
  65. 'infoWindowDto': {},
  66. // 显示部件名称
  67. 'componentName': '',
  68. loading: false,
  69. moduleDtos: [],
  70. };
  71. },
  72. watch: {
  73. 'infoWindowNo': {
  74. handler: function (newValue, oldValue) {
  75. let _self = this;
  76. if (newValue != oldValue) {
  77. this.$nextTick(function () {
  78. _self.loadData();
  79. });
  80. }
  81. },
  82. immediate: true,
  83. },
  84. },
  85. mounted: function () {
  86. },
  87. methods: {
  88. /**
  89. * 加载数据
  90. */
  91. loadData: function () {
  92. if (this.infoWindowNo == null || this.infoWindowNo.length == 0) {
  93. return;
  94. }
  95. var _self = this;
  96. _self.loading = true;
  97. $.ajax({
  98. url: Common.getApiURL('InfoWindowResource/uniqueByNo'),
  99. type: 'GET',
  100. dataType: 'json',
  101. data: { 'infoWindowNo': _self.infoWindowNo },
  102. beforeSend: function (request) {
  103. Common.addTokenToRequest(request);
  104. },
  105. success: function (data) {
  106. _self.loading = false;
  107. console.log(data);
  108. _self.infoWindowDto = data;
  109. // 计算显示的部件
  110. if (_self.infoWindowDto.componentName != undefined && _self.infoWindowDto.componentName != '') {
  111. _self.componentName = _self.infoWindowDto.componentName;
  112. _self.dynamicInit();
  113. } else if (_self.infoWindowDto.infoWindowType == undefined || _self.infoWindowDto.infoWindowType == 'TableGrid'
  114. || _self.infoWindowDto.infoWindowType == 'NONE') {
  115. _self.componentName = 'QueryPage';
  116. }
  117. _self.$nextTick(function () {
  118. if (_self.infoWindowDto.componentName == undefined || _self.infoWindowDto.componentName == '') {
  119. if (_self.infoWindowDto.infoWindowType == undefined || _self.infoWindowDto.infoWindowType == 'TableGrid' || _self.infoWindowDto.infoWindowType == 'NONE') {
  120. _self.$refs.infoComponent.initWidget(data);
  121. } else {
  122. _self.$refs.infoComponent.initWidget(data);
  123. }
  124. }
  125. });
  126. },
  127. error: function (XMLHttpRequest, textStatus, errorThrown) {
  128. _self.loading = false;
  129. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  130. },
  131. });
  132. },
  133. /**
  134. * 动态初始化仪表盘
  135. */
  136. dynamicInit: function () {
  137. let _self = this;
  138. const componentName = _self.infoWindowDto.componentName;
  139. const cssUrl = _self.infoWindowDto.cssUrl;
  140. if(cssUrl != null && cssUrl != undefined){
  141. CssUtil.dynamicLoadCss(cssUrl, componentName);
  142. }
  143. const jsUrl = _self.infoWindowDto.jsUrl;
  144. if(jsUrl != null && jsUrl != undefined){
  145. let promise = JsUtil.dynamicLoadJsModule(jsUrl);
  146. promise.then(remoteComponent => {
  147. console.log('remoteComponent:' + remoteComponent.default.name);
  148. if(componentName !== remoteComponent.default.name){
  149. let errorMessage = '数据字典-查询窗口自定义组件部件名称定义的是' + componentName + ',但是程序中name定义的是' + remoteComponent.default.name + ',两者必须相同。';
  150. console.error(errorMessage);
  151. Notify.error('查询窗口自定义组件定义错误', errorMessage, false);
  152. }
  153. window.app.component(componentName, remoteComponent.default);
  154. }, errorData => {
  155. console.error(errorData);
  156. });
  157. }
  158. },
  159. /**
  160. * 数据选择事件
  161. */
  162. dataSelected: function (data) {
  163. this.$emit('dataSelected', data);
  164. },
  165. valueChanged: function (fieldValue) {
  166. this.$emit('valueChanged', fieldValue);
  167. },
  168. /**
  169. * 数据删除事件
  170. */
  171. deleteSelected: function (data) {
  172. this.$emit('deleteSelected', data);
  173. },
  174. /**
  175. * 获取选择的数据
  176. */
  177. getSelectedModelDatas: function (data) {
  178. var _self = this;
  179. return _self.$refs.infoComponent.getSelectedModelDatas();
  180. },
  181. refresh: function () {
  182. var _self = this;
  183. if (_self.$refs.infoComponent != undefined) {
  184. if (_self.componentName == 'QueryPage') {
  185. _self.$refs.infoComponent.pageSearch();
  186. } else if (_self.componentName == 'ClientOrganization') {
  187. _self.$refs.infoComponent.refresh();
  188. }
  189. }
  190. },
  191. },
  192. };
  193. </script>