PageSearchSetting.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. <template>
  2. <div class="full-height">
  3. <vxe-grid
  4. ref="tableRef"
  5. row-key
  6. :size="tableSizeConfig"
  7. :columns="columns"
  8. :data="data"
  9. align="center"
  10. highlight-hover-row
  11. stripe
  12. v-bind="$attrs"
  13. >
  14. <template #table-drop="{ rowIndex }">
  15. <div class="table-drop" :data-id="rowIndex">
  16. <MenuOutlined />
  17. </div>
  18. </template>
  19. <template #table-title="{ row }">
  20. <a-input v-model:value="row.title" :disabled="!row.visible" :size="formSizeConfig" />
  21. </template>
  22. <template #table-visible="{ row }">
  23. <a-checkbox v-model:checked="row.visible" :size="formSizeConfig" />
  24. </template>
  25. <template #table-hidden="{ row }">
  26. <a-checkbox v-model:checked="row.hidden" :disabled="!row.visible" :size="formSizeConfig" />
  27. </template>
  28. <template #table-readonly="{ row }">
  29. <a-checkbox
  30. v-model:checked="row.readonly"
  31. :disabled="!row.visible"
  32. :size="formSizeConfig"
  33. />
  34. </template>
  35. <template #table-used="{ row }">
  36. <a-checkbox v-model:checked="row.used" :disabled="!row.visible" :size="formSizeConfig" />
  37. </template>
  38. <template #table-searchSymbol="{ row }">
  39. <a-select
  40. v-model:value="row.searchSymbol"
  41. :disabled="!row.visible"
  42. :size="formSizeConfig"
  43. style="width: 100px"
  44. >
  45. <a-select-option v-for="item in searchSymbolList" :key="item" :value="item">
  46. {{ item }}
  47. </a-select-option>
  48. </a-select>
  49. </template>
  50. <template #table-useTableSearch="{ row }">
  51. <a-checkbox
  52. v-model:checked="row.useTableSearch"
  53. :disabled="!row.visible"
  54. :size="formSizeConfig"
  55. />
  56. </template>
  57. <template #table-tableName="{ row }">
  58. <a-input
  59. v-model:value="row.tableName"
  60. :disabled="!(row.useTableSearch && row.visible)"
  61. :size="formSizeConfig"
  62. />
  63. </template>
  64. <template #table-keyColumnName="{ row }">
  65. <a-input
  66. v-model:value="row.keyColumnName"
  67. :disabled="!(row.useTableSearch && row.visible)"
  68. :size="formSizeConfig"
  69. />
  70. </template>
  71. <template #table-valueColumnName="{ row }">
  72. <a-input
  73. v-model:value="row.valueColumnName"
  74. :disabled="!(row.useTableSearch && row.visible)"
  75. :size="formSizeConfig"
  76. />
  77. </template>
  78. <template #table-tableWhere="{ row }">
  79. <a-input v-model:value="row.tableWhere" :size="formSizeConfig" />
  80. </template>
  81. <template #table-controlType="{ row }">
  82. <a-select
  83. v-model:value="row.controlType"
  84. :disabled="!row.visible"
  85. style="width: 100px"
  86. :size="formSizeConfig"
  87. >
  88. <a-select-option v-for="item in controlList" :key="item.key" :value="item.key">
  89. {{ $t(item.value) }}
  90. </a-select-option>
  91. </a-select>
  92. <a-tooltip v-if="row.controlType === 'selectTable'" placement="top">
  93. <template #title>
  94. <span>选择表格</span>
  95. </template>
  96. <PlusOutlined
  97. :style="{ cursor: 'pointer', 'margin-left': '5px' }"
  98. @click="() => handleShowChoseSelectTable(row)"
  99. />
  100. </a-tooltip>
  101. </template>
  102. <template #table-rules="{ row }">
  103. <a-select
  104. v-model:value="row.rules"
  105. :disabled="!row.visible"
  106. mode="multiple"
  107. :size="formSizeConfig"
  108. style="width: 160px"
  109. >
  110. <a-select-option v-for="item in ruleList" :key="item.key" :value="item.key">
  111. {{ item.value }}
  112. </a-select-option>
  113. </a-select>
  114. </template>
  115. <template #table-visible-header="{ column }">
  116. <a-checkbox v-model:checked="headerVisibleCheckboxChecked" :size="formSizeConfig" />
  117. {{ $t(column.title.replace('{', '').replace('}', '')) }}
  118. </template>
  119. <template #table-hidden-header="{ column }">
  120. <a-checkbox v-model:checked="headerHiddenCheckboxChecked" :size="formSizeConfig" />
  121. {{ $t(column.title.replace('{', '').replace('}', '')) }}
  122. </template>
  123. <template #table-readonly-header="{ column }">
  124. <a-checkbox v-model:checked="headerReadonlyCheckboxChecked" :size="formSizeConfig" />
  125. {{ $t(column.title.replace('{', '').replace('}', '')) }}
  126. </template>
  127. <template #table-used-header="{ column }">
  128. <a-checkbox v-model:checked="headerUseCheckboxChecked" :size="formSizeConfig" />
  129. {{ $t(column.title.replace('{', '').replace('}', '')) }}
  130. </template>
  131. </vxe-grid>
  132. <PageAddendumTableChoseModal
  133. @ok="handleChoseTable"
  134. :select-table-list="currentRow.selectTableList == null ? [] : currentRow.selectTableList"
  135. @register="registerSelectTableModal"
  136. />
  137. </div>
  138. </template>
  139. <script lang="ts">
  140. import { defineComponent, onMounted, ref, toRefs, watch } from 'vue';
  141. import type { Ref, PropType } from 'vue';
  142. import { MenuOutlined, PlusOutlined } from '@ant-design/icons-vue';
  143. import PageAddendumTableChoseModal from '../PageAddendumTableChoseModal.vue';
  144. import { useSizeSetting } from '@/hooks/setting/UseSizeSetting';
  145. import { useVxeTableSortable } from '@/components/SmartTable';
  146. import {
  147. controlList,
  148. getRuleList,
  149. searchSymbolList,
  150. vueTableHeaderCheckboxSupport,
  151. vueChoseSelectTableSupport,
  152. } from '../PageSettingSupport';
  153. import { useI18n } from '@/hooks/web/useI18n';
  154. const copyField = [
  155. 'columnName',
  156. 'remarks',
  157. 'nullable',
  158. 'javaProperty',
  159. 'extType',
  160. 'javaType',
  161. 'simpleJavaType',
  162. ];
  163. /**
  164. * 创建数据
  165. */
  166. const createDataFromTableData = (tableData: Array<any>, editData: Ref | undefined) => {
  167. if (editData && editData.value) {
  168. return editData.value;
  169. }
  170. return tableData.map((item) => {
  171. const data: any = {};
  172. copyField.forEach((field) => {
  173. data[field] = item[field];
  174. });
  175. return Object.assign(data, {
  176. title: data.remarks,
  177. readonly: false,
  178. visible: true,
  179. hidden: false,
  180. used: true,
  181. controlType: 'INPUT',
  182. searchSymbol: '=',
  183. rules: [],
  184. useTableSearch: false,
  185. });
  186. });
  187. };
  188. /**
  189. * 搜索配置页面
  190. */
  191. export default defineComponent({
  192. name: 'PageSearchSetting',
  193. components: {
  194. MenuOutlined,
  195. PlusOutlined,
  196. PageAddendumTableChoseModal,
  197. },
  198. props: {
  199. tableData: {
  200. type: Array as PropType<Array<any>>,
  201. default: () => [],
  202. },
  203. editData: {
  204. type: Array as PropType<Array<any>>,
  205. },
  206. },
  207. setup(props) {
  208. const { t } = useI18n();
  209. const { tableData, editData } = toRefs(props);
  210. const sizeConfigHoops = useSizeSetting();
  211. const tableRef = ref();
  212. const data = ref<Array<any>>([]);
  213. const currentRow = ref<any>({});
  214. watch(tableData, () => {
  215. data.value = createDataFromTableData(tableData.value, editData);
  216. });
  217. onMounted(() => {
  218. data.value = createDataFromTableData(tableData.value, editData);
  219. });
  220. const getData = () => {
  221. return data.value;
  222. };
  223. return {
  224. ...sizeConfigHoops,
  225. data,
  226. getData,
  227. tableRef,
  228. currentRow,
  229. ...vueChoseSelectTableSupport(currentRow),
  230. ...useVxeTableSortable(tableRef, '.table-drop', data),
  231. ruleList: ref(getRuleList(t)),
  232. controlList: ref(controlList),
  233. searchSymbolList: ref(searchSymbolList),
  234. headerVisibleCheckboxChecked: vueTableHeaderCheckboxSupport(data, 'visible').checked,
  235. headerHiddenCheckboxChecked: vueTableHeaderCheckboxSupport(data, 'hidden', false).checked,
  236. headerReadonlyCheckboxChecked: vueTableHeaderCheckboxSupport(data, 'readonly', false)
  237. .checked,
  238. headerUseCheckboxChecked: vueTableHeaderCheckboxSupport(data, 'used', true).checked,
  239. };
  240. },
  241. data() {
  242. return {
  243. columns: [
  244. {
  245. title: '#',
  246. field: 'drop',
  247. width: 80,
  248. slots: {
  249. default: 'table-drop',
  250. },
  251. },
  252. {
  253. title: '{generator.views.tableField.title.columnName}',
  254. field: 'columnName',
  255. width: 160,
  256. align: 'left',
  257. headerAlign: 'center',
  258. },
  259. {
  260. title: '{generator.views.tableSetting.title.title}',
  261. field: 'title',
  262. width: 160,
  263. align: 'left',
  264. headerAlign: 'center',
  265. slots: {
  266. default: 'table-title',
  267. },
  268. },
  269. {
  270. title: '{generator.views.formSetting.title.controlType}',
  271. field: 'controlType',
  272. width: 150,
  273. slots: {
  274. default: 'table-controlType',
  275. },
  276. },
  277. {
  278. title: '{generator.views.formSetting.title.readonly}',
  279. field: 'readonly',
  280. width: 110,
  281. slots: {
  282. default: 'table-readonly',
  283. header: 'table-readonly-header',
  284. },
  285. },
  286. {
  287. title: '{generator.views.tableSetting.title.visible}',
  288. field: 'visible',
  289. width: 110,
  290. slots: {
  291. default: 'table-visible',
  292. header: 'table-visible-header',
  293. },
  294. },
  295. {
  296. title: '{generator.views.tableSetting.title.hidden}',
  297. field: 'hidden',
  298. width: 110,
  299. slots: {
  300. default: 'table-hidden',
  301. header: 'table-hidden-header',
  302. },
  303. },
  304. {
  305. title: '{generator.views.formSetting.title.used}',
  306. field: 'used',
  307. width: 110,
  308. slots: {
  309. default: 'table-used',
  310. header: 'table-used-header',
  311. },
  312. },
  313. {
  314. title: '{generator.views.searchSetting.title.searchSymbol}',
  315. field: 'searchSymbol',
  316. width: 120,
  317. slots: {
  318. default: 'table-searchSymbol',
  319. },
  320. },
  321. {
  322. title: '{generator.views.formSetting.title.useTableSearch}',
  323. field: 'useTableSearch',
  324. width: 110,
  325. slots: {
  326. default: 'table-useTableSearch',
  327. },
  328. },
  329. {
  330. title: '{generator.views.code.table.tableName}',
  331. field: 'tableName',
  332. width: 120,
  333. slots: {
  334. default: 'table-tableName',
  335. },
  336. },
  337. {
  338. title: '{generator.views.formSetting.title.keyColumnName}',
  339. field: 'keyColumnName',
  340. width: 120,
  341. slots: {
  342. default: 'table-keyColumnName',
  343. },
  344. },
  345. {
  346. title: '{generator.views.formSetting.title.valueColumnName}',
  347. field: 'valueColumnName',
  348. width: 120,
  349. slots: {
  350. default: 'table-valueColumnName',
  351. },
  352. },
  353. {
  354. title: '{generator.views.formSetting.title.tableWhere}',
  355. field: 'tableWhere',
  356. minWidth: 180,
  357. slots: {
  358. default: 'table-tableWhere',
  359. },
  360. },
  361. {
  362. title: '{generator.views.code.table.remarks}',
  363. field: 'remarks',
  364. minWidth: 160,
  365. align: 'left',
  366. headerAlign: 'center',
  367. },
  368. ],
  369. };
  370. },
  371. });
  372. </script>
  373. <style scoped></style>