PromotionItem.tsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import { css, cx } from "@linaria/core";
  2. import { IconMore } from "@queenjs/icons";
  3. import { Image, View } from "@queenjs/ui";
  4. import { Divider, Dropdown, Menu, Tag } from "ant-design-vue";
  5. import { EyeOutlined } from "@ant-design/icons-vue";
  6. import dayjs from "dayjs";
  7. import { defineUI } from "queenjs";
  8. import { any, bool } from "vue-types";
  9. import { useAuth } from "@queenjs-modules/auth";
  10. // const ShareBox = defineComponent({
  11. // props: {
  12. // id: string(),
  13. // },
  14. // setup(props) {
  15. // let shareLink = location.origin + "/share.html?id=" + props.id;
  16. // if (location.host == "www.infish.cn") {
  17. // shareLink =
  18. // location.origin + "/projects/queenshowv1/share.html?id=" + props.id;
  19. // }
  20. // const qrUrl = useQRCode(shareLink);
  21. // const { copy, copied } = useClipboard();
  22. // return () => (
  23. // <div class="p-20px bg-dark-500 text-center">
  24. // <img src={qrUrl.value} />
  25. // <div class="mb-20px"></div>
  26. // <Button onClick={() => copy(shareLink)} disabled={copied.value}>
  27. // {copied.value ? "已复制" : "复制链接"}
  28. // </Button>
  29. // </div>
  30. // );
  31. // },
  32. // });
  33. export default defineUI({
  34. props: {
  35. record: any(),
  36. isPc: bool().def(false),
  37. },
  38. emits: ["edit", "preview", "menu"],
  39. setup(props, { emit }) {
  40. const auth = useAuth();
  41. return () => {
  42. const { record, isPc } = props;
  43. //@ts-ignore
  44. const isSys = (auth.store.userInfo.roles || []).indexOf("system") > -1;
  45. return (
  46. <div class={cx(itemStyles, "relative")}>
  47. <View ratio={1} class="overflow-hidden relative">
  48. <Image
  49. class="h-1/1 w-1/1 !object-contain bg-[#ebebeb]"
  50. src={record?.thumbnail}
  51. />
  52. {isSys && (
  53. <Tag
  54. color="#E88B00"
  55. // color="rgba(0, 0, 0, 0.4)"
  56. class="absolute top-0 left-0 z-1 !rounded-none"
  57. >
  58. {record.published ? "已发布" : "未发布"}
  59. </Tag>
  60. )}
  61. <div class="absolute inset-0 flex items-center justify-center opacity-0 hover:opacity-100 transition-opacity">
  62. <div
  63. class="text-white icon_action w-60px leading-60px orange cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
  64. onClick={() => emit("edit", props.record)}
  65. >
  66. 编辑
  67. </div>
  68. {isPc ? (
  69. <div
  70. class="text-white icon_action w-60px leading-60px ml-10px cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
  71. onClick={() => emit("menu", "copyLink")}
  72. >
  73. 链接
  74. </div>
  75. ) : (
  76. <div
  77. class="text-white icon_action w-60px leading-60px ml-10px cursor-pointer rounded-1/2 text-center transition-opacity hover:opacity-90 active:opacity-80"
  78. onClick={() => emit("menu", "share")}
  79. >
  80. 分享
  81. </div>
  82. )}
  83. </div>
  84. </View>
  85. <div class="item_footer rounded-b-4px flex items-center justify-between p-15px">
  86. <div class="flex-1 w-0">
  87. <div class="text-white text-bold truncate text-14px">
  88. {record.title}
  89. </div>
  90. <div class="flex items-center text-opacity-60 text-white text-12px mt-5px">
  91. {dayjs(record.updateTime).format("YYYY.MM.DD")}
  92. {/* 发布 */}
  93. <Divider type="vertical"></Divider>
  94. {record.views || 0} <EyeOutlined class={"ml-6px"} />
  95. </div>
  96. </div>
  97. <Dropdown
  98. placement="bottom"
  99. overlay={
  100. <Menu class={cx("w-90px", menuStyles)}>
  101. {/* <Menu.Item>复制</Menu.Item> */}
  102. <Menu.Item
  103. onClick={() => {
  104. emit("menu", "send");
  105. }}
  106. >
  107. 发送到
  108. </Menu.Item>
  109. <Menu.Item>
  110. <div onClick={() => emit("menu", "stat")}>统计分析</div>
  111. </Menu.Item>
  112. <Menu.Item>
  113. <div onClick={() => emit("menu", "copy")}>复制作品</div>
  114. </Menu.Item>
  115. <Menu.Item>
  116. <div onClick={() => emit("menu", "edit")}>编辑</div>
  117. </Menu.Item>
  118. {/* <Menu.Item>
  119. <div onClick={() => emit("menu", "rename")}>重命名</div>
  120. </Menu.Item> */}
  121. <Menu.Item>
  122. <div onClick={() => emit("menu", "delete")}>删除</div>
  123. </Menu.Item>
  124. {isSys && !record.published && (
  125. <Menu.Item>
  126. <div onClick={() => emit("menu", "publish")}>
  127. 发布平台
  128. </div>
  129. </Menu.Item>
  130. )}
  131. {isSys && record.published && (
  132. <Menu.Item>
  133. <div onClick={() => emit("menu", "unpublish")}>
  134. 取消平台发布
  135. </div>
  136. </Menu.Item>
  137. )}
  138. {/* {isSys && (
  139. <Menu.Item>
  140. <div onClick={() => emit("menu", "thumbnail")}>
  141. 替换封面
  142. </div>
  143. </Menu.Item>
  144. )} */}
  145. </Menu>
  146. }
  147. >
  148. <IconMore class="ml-10px text-22px cursor-pointer" />
  149. </Dropdown>
  150. </div>
  151. </div>
  152. );
  153. };
  154. },
  155. });
  156. const itemStyles = css`
  157. /* 修复hover时,页面滚动条抖动的bug */
  158. > div {
  159. font-size: 0;
  160. > div * {
  161. font-size: 14px;
  162. }
  163. }
  164. .item_footer {
  165. background: #414141;
  166. }
  167. .icon_action {
  168. background-color: rgba(0, 0, 0, 0.8);
  169. &.orange {
  170. background-color: rgba(232, 139, 0, 0.8);
  171. }
  172. }
  173. `;
  174. const menuStyles = css`
  175. .ant-dropdown-menu-item,
  176. .ant-dropdown-menu-submenu-title {
  177. font-size: 12px;
  178. }
  179. `;