CollectionItem.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { css, cx } from "@linaria/core";
  2. import Select from "@queenjs-modules/queditor/components/FormUI/Items/Select";
  3. import { IconMore } from "@queenjs/icons";
  4. import { Image, View } from "@queenjs/ui";
  5. import { Dropdown, Menu } from "ant-design-vue";
  6. import dayjs from "dayjs";
  7. import { defineUI } from "queenjs";
  8. import { any } from "vue-types";
  9. export default defineUI({
  10. props: {
  11. record: any(),
  12. },
  13. emits: ["edit", "preview", "menu"],
  14. setup(props, { emit }) {
  15. return () => {
  16. const { record } = props;
  17. const options = record?.statues?.map((e: string) => {
  18. return { label: e, value: e };
  19. });
  20. return (
  21. <div class={cx(itemStyles, "relative")}>
  22. <View ratio={1.4} class=" relative">
  23. <Image class="h-1/1 w-1/1 bg-[#ebebeb]" src={record?.cover} />
  24. <div class="absolute inset-0 flex items-center justify-center transition-opacity">
  25. <div
  26. class="text-white icon_action w-60px leading-60px cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
  27. onClick={() => emit("preview", record)}
  28. >
  29. 查看
  30. </div>
  31. {record.statues && record.statues.length > 0 && (
  32. <div class={"select_box w-100px"}>
  33. <Select
  34. class={"w-full"}
  35. value={record.status}
  36. options={options}
  37. onChange={(v) => {
  38. record.status = v;
  39. emit("edit", record);
  40. }}
  41. ></Select>
  42. </div>
  43. )}
  44. </div>
  45. </View>
  46. <div class="item_footer rounded-b-4px flex items-center justify-between p-15px">
  47. <div class="w-0 flex-1">
  48. <div class="text-white text-bold truncate">{record.title}</div>
  49. <div class="flex items-center text-opacity-60 text-white text-12px mt-5px">
  50. {dayjs(record.updateTime).format("YYYY.MM.DD")}
  51. </div>
  52. </div>
  53. <Dropdown
  54. placement="bottom"
  55. overlay={
  56. <Menu class="w-90px">
  57. <Menu.Item>
  58. <div onClick={() => emit("menu", "update")}>编辑</div>
  59. </Menu.Item>
  60. <Menu.Item>
  61. <div onClick={() => emit("menu", "delete")}>删除</div>
  62. </Menu.Item>
  63. </Menu>
  64. }
  65. >
  66. <IconMore class="ml-10px text-22px cursor-pointer" />
  67. </Dropdown>
  68. </div>
  69. </div>
  70. );
  71. };
  72. },
  73. });
  74. const itemStyles = css`
  75. .item_footer {
  76. background: #414141;
  77. }
  78. .icon_action {
  79. background-color: rgba(0, 0, 0, 0.8);
  80. }
  81. .select_box {
  82. position: absolute;
  83. left: 10px;
  84. top: 10px;
  85. .ant-select {
  86. font-size: 12px;
  87. .ant-select-selector {
  88. height: 24px;
  89. background-color: @inf-component-bg;
  90. .ant-select-selection-item {
  91. line-height: 22px;
  92. }
  93. }
  94. }
  95. }
  96. `;