index.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <div class="editable-element-shape"
  3. :class="{ 'lock': elementInfo.lock }"
  4. :style="{
  5. top: elementInfo.top + 'px',
  6. left: elementInfo.left + 'px',
  7. width: elementInfo.width + 'px',
  8. }"
  9. @mousedown="$event => handleSelectElement($event)"
  10. >
  11. <div
  12. class="element-content"
  13. v-contextmenu="contextmenus"
  14. >
  15. <EditableTable
  16. :data="elementInfo.data"
  17. :colWidths="elementInfo.colWidths"
  18. @change="data => updateTableCells(data)"
  19. />
  20. </div>
  21. </div>
  22. </template>
  23. <script lang="ts">
  24. import { defineComponent, PropType } from 'vue'
  25. import { PPTShapeElement, TableCell } from '@/types/slides'
  26. import { ContextmenuItem } from '@/components/Contextmenu/types'
  27. import EditableTable from './EditableTable.vue'
  28. export default defineComponent({
  29. name: 'editable-element-shape',
  30. components: {
  31. EditableTable,
  32. },
  33. props: {
  34. elementInfo: {
  35. type: Object as PropType<PPTShapeElement>,
  36. required: true,
  37. },
  38. selectElement: {
  39. type: Function as PropType<(e: MouseEvent, element: PPTShapeElement, canMove?: boolean) => void>,
  40. required: true,
  41. },
  42. contextmenus: {
  43. type: Function as PropType<() => ContextmenuItem[]>,
  44. },
  45. },
  46. setup(props) {
  47. const handleSelectElement = (e: MouseEvent) => {
  48. if(props.elementInfo.lock) return
  49. e.stopPropagation()
  50. props.selectElement(e, props.elementInfo)
  51. }
  52. const updateTableCells = (data: TableCell[][]) => {
  53. console.log(data)
  54. }
  55. return {
  56. handleSelectElement,
  57. updateTableCells,
  58. }
  59. },
  60. })
  61. </script>
  62. <style lang="scss" scoped>
  63. .editable-element-shape {
  64. position: absolute;
  65. cursor: move;
  66. &.lock .element-content {
  67. cursor: default;
  68. }
  69. }
  70. .element-content {
  71. width: 100%;
  72. height: 100%;
  73. position: relative;
  74. }
  75. </style>