Преглед изворни кода

添加表格的行列数修改

pipipi-pikachu пре 5 година
родитељ
комит
cd47e26a6d
1 измењених фајлова са 69 додато и 2 уклоњено
  1. 69 2
      src/views/Editor/Toolbar/ElementStylePanel/TableStylePanel.vue

+ 69 - 2
src/views/Editor/Toolbar/ElementStylePanel/TableStylePanel.vue

@@ -111,14 +111,22 @@
     <div class="row">
     <div class="row">
       <div style="flex: 2;">行数:</div>
       <div style="flex: 2;">行数:</div>
       <InputNumber 
       <InputNumber 
-        :value="rowCount" 
+        :min="minRowCount"
+        :max="20"
+        v-model:value="rowCount" 
+        @pressEnter="e => setTableRow(e)"
+        @blur="e => setTableRow(e)"
         style="flex: 3;" 
         style="flex: 3;" 
       />
       />
     </div>
     </div>
     <div class="row">
     <div class="row">
       <div style="flex: 2;">列数:</div>
       <div style="flex: 2;">列数:</div>
       <InputNumber 
       <InputNumber 
-        :value="colCount" 
+        :min="minColCount"
+        :max="20"
+        v-model:value="colCount" 
+        @pressEnter="e => setTableCol(e)"
+        @blur="e => setTableCol(e)"
         style="flex: 3;" 
         style="flex: 3;" 
       />
       />
     </div>
     </div>
@@ -182,8 +190,11 @@ import { useStore } from 'vuex'
 import { MutationTypes, State } from '@/store'
 import { MutationTypes, State } from '@/store'
 import { PPTTableElement, TableCell, TableCellStyle, TableTheme } from '@/types/slides'
 import { PPTTableElement, TableCell, TableCellStyle, TableTheme } from '@/types/slides'
 import emitter, { EmitterEvents } from '@/utils/emitter'
 import emitter, { EmitterEvents } from '@/utils/emitter'
+import { createRandomCode } from '@/utils/common'
 import useHistorySnapshot from '@/hooks/useHistorySnapshot'
 import useHistorySnapshot from '@/hooks/useHistorySnapshot'
 
 
+import { message } from 'ant-design-vue'
+
 import ElementOutline from '../common/ElementOutline.vue'
 import ElementOutline from '../common/ElementOutline.vue'
 import ColorButton from '../common/ColorButton.vue'
 import ColorButton from '../common/ColorButton.vue'
 
 
@@ -213,6 +224,8 @@ export default defineComponent({
     const hasTheme = ref(false)
     const hasTheme = ref(false)
     const rowCount = ref(0)
     const rowCount = ref(0)
     const colCount = ref(0)
     const colCount = ref(0)
+    const minRowCount = ref(0)
+    const minColCount = ref(0)
 
 
     watch(handleElement, () => {
     watch(handleElement, () => {
       if(!handleElement.value) return
       if(!handleElement.value) return
@@ -222,6 +235,9 @@ export default defineComponent({
 
 
       rowCount.value = handleElement.value.data.length
       rowCount.value = handleElement.value.data.length
       colCount.value = handleElement.value.data[0].length
       colCount.value = handleElement.value.data[0].length
+
+      minRowCount.value = handleElement.value.data.length
+      minColCount.value = handleElement.value.data[0].length
     }, { deep: true, immediate: true })
     }, { deep: true, immediate: true })
 
 
     const selectedCells = ref<string[]>([])
     const selectedCells = ref<string[]>([])
@@ -327,7 +343,54 @@ export default defineComponent({
       addHistorySnapshot()
       addHistorySnapshot()
     }
     }
 
 
+    const setTableRow = (e: KeyboardEvent) => {
+      const value = +(e.target as HTMLInputElement).value
+      const rowCount = handleElement.value.data.length
+
+      if(value <= rowCount) return message.warning('设置行数不能少于当前值')
+
+      const rowCells: TableCell[] = new Array(colCount.value).fill({ id: createRandomCode(), colspan: 1, rowspan: 1, text: '' })
+      const newTableCells: TableCell[][] = new Array(value - rowCount).fill(rowCells)
+
+      const tableCells: TableCell[][] = JSON.parse(JSON.stringify(handleElement.value.data))
+      tableCells.push(...newTableCells)
+
+      const props = { data: tableCells }
+      store.commit(MutationTypes.UPDATE_ELEMENT, { id: handleElement.value.id, props })
+      addHistorySnapshot()
+    }
+
+    const setTableCol = (e: KeyboardEvent) => {
+      const value = +(e.target as HTMLInputElement).value
+      const colCount = handleElement.value.data[0].length
+
+      if(value <= colCount) return message.warning('设置列数不能少于当前值')
+
+      const tableCells = handleElement.value.data.map(item => {
+        const cells: TableCell[] = new Array(value - colCount).fill({ id: createRandomCode(), colspan: 1, rowspan: 1, text: '' })
+        item.push(...cells)
+        return item
+      })
+
+      const colSizeList = handleElement.value.colWidths.map(item => item * handleElement.value.width)
+      const newColSizeList = new Array(value - colCount).fill(100)
+      colSizeList.push(...newColSizeList)
+
+      const width = handleElement.value.width + 100 * (value - colCount)
+      const colWidths = colSizeList.map(item => item / width)
+
+      const props = {
+        width,
+        data: tableCells,
+        colWidths,
+      }
+      store.commit(MutationTypes.UPDATE_ELEMENT, { id: handleElement.value.id, props })
+
+      addHistorySnapshot()
+    }
+
     return {
     return {
+      handleElement,
       availableFonts,
       availableFonts,
       fontSizeOptions,
       fontSizeOptions,
       textAttrs,
       textAttrs,
@@ -335,9 +398,13 @@ export default defineComponent({
       theme,
       theme,
       rowCount,
       rowCount,
       colCount,
       colCount,
+      minRowCount,
+      minColCount,
       hasTheme,
       hasTheme,
       toggleTheme,
       toggleTheme,
       updateTheme,
       updateTheme,
+      setTableRow,
+      setTableCol,
     }
     }
   },
   },
 })
 })