EditFillTable.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <template>
  2. <div class="edit-fill-table ">
  3. <el-form
  4. ref="modalFormComp"
  5. :model="modalForm"
  6. :rules="rules"
  7. :key="modalForm.id"
  8. label-width="100px"
  9. >
  10. <el-form-item prop="tdCount" label="行列数:">
  11. <el-row>
  12. <el-col class="text-right" :span="3">
  13. <span>行:</span>
  14. </el-col>
  15. <el-col :span="6">
  16. <el-input-number
  17. style="width:60px;"
  18. v-model="modalForm.rowCount"
  19. :min="2"
  20. :max="16"
  21. :step="1"
  22. step-strictly
  23. :controls="false"
  24. ></el-input-number>
  25. </el-col>
  26. <el-col class="text-right" :span="3">
  27. <span>列:</span>
  28. </el-col>
  29. <el-col :span="6">
  30. <el-input-number
  31. style="width:60px;"
  32. v-model="modalForm.colCount"
  33. :min="2"
  34. :max="16"
  35. :step="1"
  36. step-strictly
  37. :controls="false"
  38. ></el-input-number>
  39. </el-col>
  40. </el-row>
  41. </el-form-item>
  42. <el-form-item prop="padding" label="网格内边距:">
  43. <el-row>
  44. <el-col class="text-right" :span="3">
  45. <span>上下:</span>
  46. </el-col>
  47. <el-col :span="6">
  48. <el-input-number
  49. style="width:60px;"
  50. v-model="modalForm.paddingTop"
  51. :min="2"
  52. :max="16"
  53. :step="1"
  54. step-strictly
  55. :controls="false"
  56. ></el-input-number>
  57. </el-col>
  58. <el-col class="text-right" :span="3">
  59. <span>左右:</span>
  60. </el-col>
  61. <el-col :span="6">
  62. <el-input-number
  63. style="width:60px;"
  64. v-model="modalForm.paddingLeft"
  65. :min="2"
  66. :max="16"
  67. :step="1"
  68. step-strictly
  69. :controls="false"
  70. ></el-input-number>
  71. </el-col>
  72. </el-row>
  73. </el-form-item>
  74. <el-form-item label="线条类型:">
  75. <line-style-select v-model="modalForm.lineStyle"></line-style-select>
  76. </el-form-item>
  77. <el-form-item label="字号:">
  78. <size-select v-model="modalForm.fontSize"></size-select>
  79. </el-form-item>
  80. <el-form-item prop="lineHeight" label="行高:">
  81. <el-input-number
  82. style="width:125px;"
  83. v-model="modalForm.lineHeight"
  84. :min="20"
  85. :max="100"
  86. :step="1"
  87. step-strictly
  88. :controls="false"
  89. ></el-input-number>
  90. </el-form-item>
  91. <el-form-item label="网格内容设置:"></el-form-item>
  92. <table class="table table-nopad">
  93. <tr v-for="rowNo in modalForm.rowCount" :key="rowNo">
  94. <td v-for="colNo in modalForm.colCount" :key="colNo">
  95. <el-input
  96. v-model="modalForm.content[`${rowNo}_${colNo}`]"
  97. clearable
  98. style="width: 100%"
  99. ></el-input>
  100. </td>
  101. </tr>
  102. </table>
  103. </el-form>
  104. </div>
  105. </template>
  106. <script>
  107. import LineStyleSelect from "../../components/common/LineStyleSelect";
  108. import SizeSelect from "../../components/common/SizeSelect";
  109. import { deepCopy, objAssign } from "../../plugins/utils";
  110. const initModalForm = {
  111. id: "",
  112. colCount: 3,
  113. rowCount: 3,
  114. paddingTop: 5,
  115. paddingleft: 5,
  116. fontSize: "14px",
  117. lineHeight: 30,
  118. lineStyle: "solid",
  119. content: {}
  120. };
  121. export default {
  122. name: "edit-fill-table",
  123. components: { LineStyleSelect, SizeSelect },
  124. props: {
  125. instance: {
  126. type: Object,
  127. default() {
  128. return {};
  129. }
  130. }
  131. },
  132. data() {
  133. const tdCountValidater = (rule, value, callback) => {
  134. if (!this.modalForm.rowCount || !this.modalForm.colCount) {
  135. return callback(new Error("请输入完整的行列数"));
  136. }
  137. callback();
  138. };
  139. const paddingValidater = (rule, value, callback) => {
  140. if (!this.modalForm.paddingTop || !this.modalForm.paddingleft) {
  141. return callback(new Error("请输入完整的网格内边距"));
  142. }
  143. callback();
  144. };
  145. return {
  146. modalForm: { ...initModalForm },
  147. rules: {
  148. tdCount: [
  149. {
  150. required: true,
  151. validator: tdCountValidater,
  152. trigger: "change"
  153. }
  154. ],
  155. padding: [
  156. {
  157. required: true,
  158. validator: paddingValidater,
  159. trigger: "change"
  160. }
  161. ]
  162. }
  163. };
  164. },
  165. mounted() {
  166. this.initData(this.instance);
  167. },
  168. methods: {
  169. initData(val) {
  170. this.modalForm = objAssign(initModalForm, val);
  171. this.modalForm.paddingTop = val.padding[0];
  172. this.modalForm.paddingLeft = val.padding[1];
  173. let content = {};
  174. for (let rowNo = 0; rowNo < val.rowCount; rowNo++) {
  175. for (let colNo = 0; colNo < val.colCount; colNo++) {
  176. const field = `${rowNo}_${colNo}`;
  177. content[field] = val[field] || "";
  178. }
  179. }
  180. this.modalForm.content = content;
  181. },
  182. async submit() {
  183. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  184. if (!valid) return;
  185. const data = deepCopy(this.modalForm);
  186. const model = objAssign(this.instance, data);
  187. model.padding = [data.paddingTop, data.paddingLeft];
  188. this.$emit("modified", model);
  189. }
  190. }
  191. };
  192. </script>
  193. <style scoped>
  194. .table-nopad td,
  195. .table-nopad th {
  196. padding: 0;
  197. }
  198. </style>