columns.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import Sortable from "sortablejs";
  2. import { ref, nextTick } from "vue";
  3. import { clone } from "@pureadmin/utils";
  4. import { tableDataDrag } from "../../data";
  5. // 行拖拽演示
  6. export function useColumns() {
  7. const dataList = ref(clone(tableDataDrag, true));
  8. const rowDrop = (event: { preventDefault: () => void }) => {
  9. event.preventDefault();
  10. nextTick(() => {
  11. const wrapper: HTMLElement = document.querySelector(
  12. ".el-table__body-wrapper tbody"
  13. );
  14. Sortable.create(wrapper, {
  15. animation: 300,
  16. handle: ".drag-btn",
  17. onEnd: ({ newIndex, oldIndex }) => {
  18. const currentRow = dataList.value.splice(oldIndex, 1)[0];
  19. dataList.value.splice(newIndex, 0, currentRow);
  20. }
  21. });
  22. });
  23. };
  24. const columns: TableColumnList = [
  25. // {
  26. // width: 60,
  27. // cellRenderer: () => (
  28. // <iconify-icon-online
  29. // icon="icon-park-outline:drag"
  30. // class="drag-btn cursor-grab"
  31. // onMouseenter={(event: { preventDefault: () => void }) =>
  32. // rowDrop(event)
  33. // }
  34. // />
  35. // )
  36. // },
  37. {
  38. label: "ID",
  39. prop: "id",
  40. cellRenderer: ({ row }) => (
  41. <div class="flex items-center">
  42. <iconify-icon-online
  43. icon="icon-park-outline:drag"
  44. class="drag-btn cursor-grab"
  45. onMouseenter={(event: { preventDefault: () => void }) =>
  46. rowDrop(event)
  47. }
  48. />
  49. <p class="ml-[16px]">{row.id}</p>
  50. </div>
  51. )
  52. },
  53. {
  54. label: "日期",
  55. prop: "date"
  56. },
  57. {
  58. label: "姓名",
  59. prop: "name"
  60. }
  61. ];
  62. return {
  63. columns,
  64. dataList
  65. };
  66. }