MaterialItem.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { css, cx } from "@linaria/core";
  2. import { IconDelete } from "@queenjs/icons";
  3. import { Image, View } from "@queenjs/ui";
  4. import { defineUI } from "queenjs";
  5. import { any, string } from "vue-types";
  6. const renderStatus = {
  7. succ: "",
  8. error: "渲染失败",
  9. default: "渲染中…",
  10. };
  11. export default defineUI({
  12. props: {
  13. record: any(),
  14. use: string<"show" | "select" | "task">(),
  15. },
  16. emits: ["delete", "download", "use", "preview"],
  17. setup(props, { emit }) {
  18. return () => {
  19. const { record, use } = props;
  20. // console.error("record: ", record);
  21. return (
  22. <div class={cx(itemStyles, "relative")}>
  23. <View ratio={1.4} class="overflow-hidden card">
  24. {record.fileType == "video" ? (
  25. <video src={record.file?.url} class="h-1/1 w-1/1" />
  26. ) : (
  27. <Image
  28. class="h-1/1 w-1/1"
  29. src={
  30. record?.thumbnail || record?.thumbnailUrl || record.file?.url
  31. }
  32. />
  33. )}
  34. {use == "task" && record.status !== "succ" && (
  35. <div class="waiting absolute inset-0 z-2 flex items-center justify-center text-white">
  36. {(renderStatus as any)[record.status || "default"]}
  37. </div>
  38. )}
  39. {use !== "task" && (
  40. <div class="absolute inset-0 flex items-center justify-center z-2 opacity-0 hover:opacity-100 transition-all text-white">
  41. {use == "show" && (
  42. <IconDelete
  43. class="icon_del absolute right-5px top-5px p-3px rounded-2px text-14px cursor-pointer"
  44. onClick={() => emit("delete")}
  45. />
  46. )}
  47. <div
  48. class="rounded-1/2 text-center w-56px leading-56px cursor-pointer orange"
  49. onClick={() => emit("preview")}
  50. >
  51. 预览
  52. </div>
  53. {use == "show" && (
  54. <div
  55. class="btn_circle rounded-1/2 text-center w-56px leading-56px cursor-pointer"
  56. onClick={() => emit("download")}
  57. >
  58. 下载
  59. </div>
  60. )}
  61. {use == "select" && (
  62. <div
  63. class="btn_circle rounded-1/2 text-center w-56px leading-56px cursor-pointer"
  64. onClick={(e) => {
  65. e.stopPropagation();
  66. emit("use");
  67. }}
  68. >
  69. 使用
  70. </div>
  71. )}
  72. </div>
  73. )}
  74. </View>
  75. {record.name && (
  76. <div class="py-8px px-10px" style={{ backgroundColor: "#262626" }}>
  77. {record.name}
  78. </div>
  79. )}
  80. </div>
  81. );
  82. };
  83. },
  84. });
  85. const itemStyles = css`
  86. .card {
  87. background-color: #e1e5e8;
  88. }
  89. .orange {
  90. background-color: rgba(232, 139, 0, 0.5);
  91. &:hover {
  92. background-color: rgba(232, 139, 0, 0.7);
  93. }
  94. }
  95. .btn_circle {
  96. background-color: rgba(0, 0, 0, 0.7);
  97. &:hover {
  98. background-color: rgba(0, 0, 0, 0.8);
  99. }
  100. &:not(:nth-of-type(1)) {
  101. margin-left: 10px;
  102. }
  103. }
  104. .icon_del {
  105. background-color: rgba(0, 0, 0, 0.5);
  106. &:hover {
  107. background-color: rgba(0, 0, 0, 0.6);
  108. }
  109. }
  110. .waiting {
  111. background-color: rgba(0, 0, 0, 0.3);
  112. }
  113. `;