diff --git a/.vscode/launch.json b/.vscode/launch.json index d6aacd6..a9a4763 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,9 +2,9 @@ "configurations": [ { "type": "chrome", - "name": "http://localhost:8000/metas/big-image-preview", + "name": "lambo", "request": "launch", - "url": "http://localhost:8000/metas/big-image-preview" + "url": "http://localhost:8000/metas" } ] } diff --git a/packages/biz/CHANGELOG.md b/packages/biz/CHANGELOG.md index d61aa1c..84a4297 100644 --- a/packages/biz/CHANGELOG.md +++ b/packages/biz/CHANGELOG.md @@ -1,5 +1,18 @@ # @zhst/biz +## 0.17.0 + +### Minor Changes + +- 视频添加 OD 框,查看大图首次点击修复 + +### Patch Changes + +- Updated dependencies + - @zhst/meta@0.15.0 + - @zhst/func@0.10.2 + - @zhst/hooks@0.9.2 + ## 0.16.1 ### Patch Changes diff --git a/packages/biz/package.json b/packages/biz/package.json index 65ce32d..741d8f7 100644 --- a/packages/biz/package.json +++ b/packages/biz/package.json @@ -1,6 +1,6 @@ { "name": "@zhst/biz", - "version": "0.16.1", + "version": "0.17.0", "description": "业务库", "keywords": [ "business", @@ -47,6 +47,7 @@ "antd": "^5.12.5", "classnames": "^2.5.1", "dayjs": "^1.11.10", - "rc-util": "^5.38.1" + "rc-util": "^5.38.1", + "react-infinite-scroll-component": "^6.1.0" } } diff --git a/packages/biz/src/index.tsx b/packages/biz/src/index.tsx index d480cf5..49585bc 100644 --- a/packages/biz/src/index.tsx +++ b/packages/biz/src/index.tsx @@ -17,4 +17,5 @@ export { default as ViewLargerImageModal, useViewLargerImageModal } from './View export type { VideoPlayerCardProps } from './VideoPlayerCard' export { default as VideoPlayerCard } from './VideoPlayerCard' export { default as RealTimeMonitor } from './RealTimeMonitor' - +export { default as InfiniteList } from './infiniteList' +// export type { InfiniteListProps, InfiniteListRefProps } from './infiniteList' diff --git a/packages/biz/src/infiniteList/InfiniteList.tsx b/packages/biz/src/infiniteList/InfiniteList.tsx new file mode 100644 index 0000000..19769bb --- /dev/null +++ b/packages/biz/src/infiniteList/InfiniteList.tsx @@ -0,0 +1,126 @@ +/** + * Created by jiangzhixiong + */ + +import React, { forwardRef, ReactNode, useContext, useImperativeHandle, useRef } from 'react' +import { ConfigProvider } from '@zhst/meta'; +import { Divider, Flex } from 'antd'; +import classNames from 'classnames'; +import InfiniteScroll from 'react-infinite-scroll-component'; +import { SearchCard, SearchCardProps } from './components'; +import './index.less' + +const { ConfigContext } = ConfigProvider + +export interface InfiniteListProps { + type?: 'custom' | 'auto' + prefixCls?: string; + height?: number; + itemRender?: (data?: any) => React.ReactNode + loading?: boolean; // + data: any[]; + targetId?: string; // 滚动列表 ID + loadMore?: (data?: any) => any; + params?: { + [key: string]: any; + } + hasMore: boolean; + endMessage?: ReactNode + loadingMessage?: ReactNode + onItemClick?: (data: any) => void; + searchCardProps?: SearchCardProps +} + +export interface InfiniteListRefProps { + +} + +const InfiniteList = forwardRef((props, ref) => { + const { + prefixCls: customizePrefixCls, + height, + type = 'auto', + loadingMessage =

加载中...

, + targetId = 'scrollableDiv', + itemRender, + hasMore, + onItemClick, + loadMore, + data = [], + endMessage = 没有更多数据了...🤐, + searchCardProps + } = props + const { getPrefixCls } = useContext(ConfigContext); + const componentName = getPrefixCls('biz-infinite-list', customizePrefixCls); + const listRef = useRef(null); + + + useImperativeHandle(ref, () => ({ + + })) + + return ( +
+ {/* {loading ? ( +

加载中...

+ ) : ( + + {data?.list?.map((item) => ( + itemRender?.(item) || ( +
+ +
+ ) + ))} +
+ )} */} + {}} + hasMore={hasMore} + loader={loadingMessage} + endMessage={endMessage} + scrollableTarget={targetId} + > + + {data?.map((item) => ( + itemRender?.(item) || ( +
{ + onItemClick?.(item) + }} + > + +
+ ) + ))} +
+
+ {/*
+ {!noMore && ( + + )} + + {noMore && 没有更多数据了} +
*/} +
+ ) +}) + +export default InfiniteList diff --git a/packages/biz/src/infiniteList/components/SearchCard.tsx b/packages/biz/src/infiniteList/components/SearchCard.tsx new file mode 100644 index 0000000..00be99c --- /dev/null +++ b/packages/biz/src/infiniteList/components/SearchCard.tsx @@ -0,0 +1,94 @@ +/** + * Created by jiangzhixiong on 2024/04/28 + */ + +import React, { forwardRef, useContext, useImperativeHandle } from 'react' +import { ConfigProvider, EMPTY_BASE64 } from '@zhst/meta' +import { Flex, Image } from 'antd'; +import './index.less' + +const { ConfigContext } = ConfigProvider + +export interface SearchCardProps { + prefixCls?: string; + id?: string; + key?: string; + url?: string; + data?: { + key?: string; + url?: string; + sort?: number; + title?: string; + subtitle?: string; + } + onCreateTxt?: string; + onCreate?: (data: any) => void; + onAddTxt?: string; + onAdd?: (data: any) => void; + onRemoveTxt?: string; + onRemove?: (data: any) => void; + customOptionRender?: React.ReactNode +} + +export interface SearchCardRefProps { +} + +const SearchCard = forwardRef((props, ref) => { + const { + prefixCls: customizePrefixCls, + url, + id, + key, + data, + onCreate, + onCreateTxt = '创建检索', + onAddTxt = '添加目标', + onRemoveTxt = '移除轨迹', + onAdd, + onRemove, + customOptionRender + } = props + const { getPrefixCls } = useContext(ConfigContext) + const componentName = getPrefixCls('biz-search-card', customizePrefixCls); + + const stopBumble = (e: React.MouseEvent, fn: ((data: any) => void) | undefined, data: { url?: string | undefined; key?: string | undefined; title?: string | undefined; subtitle?: string | undefined; } | undefined) => { + e.stopPropagation() + fn?.(data) + } + + useImperativeHandle(ref, () => ({ + + })) + + return ( +
+ +
+

04/28 08:21:58

+

西2-1

+
+
+ ) +}) + +export default SearchCard diff --git a/packages/biz/src/infiniteList/components/index.less b/packages/biz/src/infiniteList/components/index.less new file mode 100644 index 0000000..5ad9d06 --- /dev/null +++ b/packages/biz/src/infiniteList/components/index.less @@ -0,0 +1,75 @@ +.zhst-biz-search-card { + border: 2px solid transparent; + transition: .1s ease-in all; + cursor: pointer; + + &:hover { + border: 2px solid #09f; + + .zhst-biz-search-card-main-opt { + display: flex; + } + } + + &-main { + position: relative; + width: 184px; + height: 240px; + + &-num { + position: absolute; + right: 2px; + top: 2px; + width: 20px; + height: 20px; + text-align: center; + color: rgb(153, 153, 153); + background-color: rgba(255, 255, 255, 75%); + z-index: 1; + border-radius: 3px; + } + + &-opt { + display: none; + position: absolute; + padding: 6px 3px; + left: 0; + width: 100%; + bottom: 0; + font-size: 12px; + background-color: #09f; + color: #fff; + box-sizing: border-box; + transition: .2s ease-in all; + + a { + color: #fff; + + &:hover { + opacity: 0.9; + } + } + } + } + + &-footer { + padding: 12px; + font-size: 12px; + text-align: center; + + &-tit { + margin: 0; + line-height: 20px; + } + + &-subtitle { + margin: 0; + line-height: 20px; + transition: .1s ease-in all; + + &:hover { + color: #09f; + } + } + } +} diff --git a/packages/biz/src/infiniteList/components/index.tsx b/packages/biz/src/infiniteList/components/index.tsx new file mode 100644 index 0000000..a096de9 --- /dev/null +++ b/packages/biz/src/infiniteList/components/index.tsx @@ -0,0 +1,6 @@ +/** + * Created by jiangzhixiong on 2024/04/28 + */ + +export { default as SearchCard } from './SearchCard' +export type { SearchCardProps, SearchCardRefProps } from './SearchCard' diff --git a/packages/biz/src/infiniteList/demo/basic.tsx b/packages/biz/src/infiniteList/demo/basic.tsx new file mode 100644 index 0000000..ccf2506 --- /dev/null +++ b/packages/biz/src/infiniteList/demo/basic.tsx @@ -0,0 +1,43 @@ +import React, { useEffect, useState } from 'react' +import { InfiniteList } from '@zhst/biz' + +export default () => { + const [data, setData] = useState([]) + const [loading, setLoading] = useState(false) + + const loadMoreData = () => { + if (loading) { + return; + } + setLoading(true); + fetch('https://randomuser.me/api/?results=10&inc=id,key,name,gender,email,nat,picture&noinfo') + .then((res) => res.json()) + .then((body) => { + setData([...data, ...body.results]); + setLoading(false); + }) + .catch(() => { + setLoading(false); + }); + }; + + useEffect(() => { + loadMoreData(); + }, []); + + return ( + console.log('item点击:', _data)} + searchCardProps={{ + onAdd: (_data) => console.log('新增', _data), + onCreate: (_data) => console.log('创建', _data), + onRemove: (_data) => console.log('删除', _data), + }} + /> + ) +} diff --git a/packages/biz/src/infiniteList/demo/custom.tsx b/packages/biz/src/infiniteList/demo/custom.tsx new file mode 100644 index 0000000..b163507 --- /dev/null +++ b/packages/biz/src/infiniteList/demo/custom.tsx @@ -0,0 +1,51 @@ +import React, { useEffect, useState } from 'react' +import { InfiniteList } from '@zhst/biz' +import { Button, Input, Space } from 'antd' + +export default () => { + const [data, setData] = useState([]) + const [loading, setLoading] = useState(false) + const [params, setParams] = useState({}) + + const loadMoreData = (params?: { name: string; age?: number; sex: string; tel: number }) => { + if (loading) { + return; + } + setLoading(true); + fetch('https://randomuser.me/api/?results=10&inc=id,key,name,gender,email,nat,picture&noinfo') + .then((res) => res.json()) + .then((body) => { + setData([...data, ...body.results]); + setLoading(false); + }) + .catch(() => { + setLoading(false); + }); + }; + + useEffect(() => { + loadMoreData(); + }, []); + + return ( + + + setParams(pre => ({ ...pre, name: e.target.value }))} style={{ width: '120px' }} /> + setParams(pre => ({ ...pre, age: e.target.value }))} style={{ width: '120px' }} /> + setParams(pre => ({ ...pre, sex: e.target.value }))} style={{ width: '120px' }} /> + setParams(pre => ({ ...pre, tel: e.target.value }))} style={{ width: '120px' }} /> + + + loadMoreData(params)} + height={300} + hasMore={data.length < 100} + data={data} + type="custom" + loadingMessage={} + onItemClick={data => console.log('item点击:', data)} + /> + + ) +} diff --git a/packages/biz/src/infiniteList/demo/customItem.tsx b/packages/biz/src/infiniteList/demo/customItem.tsx new file mode 100644 index 0000000..1a769d4 --- /dev/null +++ b/packages/biz/src/infiniteList/demo/customItem.tsx @@ -0,0 +1,66 @@ +import React, { useEffect, useState } from 'react' +import { InfiniteList } from '@zhst/biz' +import { Button, Input, Space } from 'antd' + +interface IData { name: string; age?: number; sex: string; tel: number } + +export default () => { + const [data, setData] = useState([]) + const [loading, setLoading] = useState(false) + const [params, setParams] = useState({ + name: '', + tel: 123, + age: 12, + sex: '男' + }) + + const loadMoreData = (params?: IData) => { + if (loading) { + return; + } + setLoading(true); + fetch('https://randomuser.me/api/?results=10&inc=id,key,name,gender,email,nat,picture&noinfo', { + }) + .then((res) => res.json()) + .then((body) => { + setData([...data, ...body.results]); + setLoading(false); + }) + .catch(() => { + setLoading(false); + }); + }; + + useEffect(() => { + loadMoreData(); + }, []); + + return ( + + + setParams(pre => ({ ...pre, name: e.target.value }))} style={{ width: '120px' }} /> + setParams(pre => ({ ...pre, age: Number(e.target.value) }))} style={{ width: '120px' }} /> + setParams(pre => ({ ...pre, sex: e.target.value }))} style={{ width: '120px' }} /> + setParams(pre => ({ ...pre, tel: Number(e.target.value) }))} style={{ width: '120px' }} /> + + + loadMoreData(params)} + height={300} + hasMore={data.length < 100} + data={data} + type="custom" + loadingMessage={} + itemRender={() => { + return ( +
+ 自定义的子元素 +
+ ) + }} + onItemClick={data => console.log('item点击:', data)} + /> +
+ ) +} diff --git a/packages/biz/src/infiniteList/demo/mock.ts b/packages/biz/src/infiniteList/demo/mock.ts new file mode 100644 index 0000000..e0e4bc7 --- /dev/null +++ b/packages/biz/src/infiniteList/demo/mock.ts @@ -0,0 +1,17 @@ +const resultData = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13']; + +export function getLoadMoreList(nextId: string | undefined, limit: number): Promise { + let start = 0; + const end = start + limit; + const list = resultData.slice(start, end); + const nId = resultData.length >= end ? resultData[end] : undefined; + return new Promise((resolve) => { + setTimeout(() => { + resolve({ + list, + nextId: nId, + isNoMore: list.length > 20 + }); + }, 1000); + }); +} diff --git a/packages/biz/src/infiniteList/index.less b/packages/biz/src/infiniteList/index.less new file mode 100644 index 0000000..4594e52 --- /dev/null +++ b/packages/biz/src/infiniteList/index.less @@ -0,0 +1,5 @@ +.zhst-biz-infinite-list { + &::-webkit-scrollbar { + display: none; + } +} diff --git a/packages/biz/src/infiniteList/index.md b/packages/biz/src/infiniteList/index.md new file mode 100644 index 0000000..429bc77 --- /dev/null +++ b/packages/biz/src/infiniteList/index.md @@ -0,0 +1,21 @@ +--- +category: Components +title: infiniteList 无限滚动列表 +toc: content +group: + title: 数据展示 +--- + +无限滚动列表 + +## 代码演示 + +基本用法 +手动触发 +自定义子元素 + +## API + +| 参数 | 说明 | 类型 | 默认值 | 版本 | +| --- | --- | --- | --- | --- | +| data | 数据源 | Array[] | [] | - | diff --git a/packages/biz/src/infiniteList/index.tsx b/packages/biz/src/infiniteList/index.tsx new file mode 100644 index 0000000..96c3c5a --- /dev/null +++ b/packages/biz/src/infiniteList/index.tsx @@ -0,0 +1,5 @@ +import InfinityList from './InfiniteList' + +// export { InfiniteListProps, InfiniteListRefProps } from './InfiniteList' + +export default InfinityList diff --git a/packages/material/CHANGELOG.md b/packages/material/CHANGELOG.md index 5783315..2424b0a 100644 --- a/packages/material/CHANGELOG.md +++ b/packages/material/CHANGELOG.md @@ -1,5 +1,19 @@ # @zhst/material +## 0.11.0 + +### Minor Changes + +- 视频添加 OD 框,查看大图首次点击修复 + +### Patch Changes + +- Updated dependencies + - @zhst/meta@0.15.0 + - @zhst/biz@0.17.0 + - @zhst/func@0.10.2 + - @zhst/hooks@0.9.2 + ## 0.10.4 ### Patch Changes diff --git a/packages/material/package.json b/packages/material/package.json index 67100f8..b167231 100644 --- a/packages/material/package.json +++ b/packages/material/package.json @@ -1,6 +1,6 @@ { "name": "@zhst/material", - "version": "0.10.4", + "version": "0.11.0", "description": "物料库", "keywords": [ "business", diff --git a/packages/meta/src/ImageEditor/viewer/index.ts b/packages/meta/src/ImageEditor/viewer/index.ts index a93d7a5..a565c65 100644 --- a/packages/meta/src/ImageEditor/viewer/index.ts +++ b/packages/meta/src/ImageEditor/viewer/index.ts @@ -21,6 +21,9 @@ export interface Option { * @default: true */ scaleAble?: boolean; + width?: number; + height?: number; + backgroundColor?: string; /* * 是否允许拖拽 @@ -81,7 +84,11 @@ class Viewer { } build() { + const { width = 300, height = 150 } = this.options const canvas = document.createElement('canvas'); + + canvas.width = width || canvas.width + canvas.height = height || canvas.height addClass(canvas, CLASS_CANVAS); this.element.appendChild(canvas); this.canvas = canvas; diff --git a/packages/meta/src/index.tsx b/packages/meta/src/index.tsx index e1ef97f..1eb8bdc 100644 --- a/packages/meta/src/index.tsx +++ b/packages/meta/src/index.tsx @@ -102,3 +102,4 @@ export type { AppProps } from './app'; export { default as notification } from './notification'; export type { ArgsProps as NotificationArgsProps } from './notification'; export { default as ButtonList } from './ButtonList' +export * from './utils' diff --git a/packages/meta/src/utils/index.ts b/packages/meta/src/utils/index.ts index e69de29..f87cf01 100644 --- a/packages/meta/src/utils/index.ts +++ b/packages/meta/src/utils/index.ts @@ -0,0 +1 @@ +export * from './constants'