PageFormSetting.vue 11 KB

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