beer-assembly-biz 1.1.3-alpha.1 → 1.1.3-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/media/Media.js ADDED
@@ -0,0 +1,241 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { Button, Checkbox, ConfigProvider, Form, Input, Select, Space, Spin, theme, Tree, Typography } from 'antd';
3
+ import { Flux } from 'beer-assembly-plus';
4
+ import { CaretDownOutlined, CloudUploadOutlined, SearchOutlined, UnorderedListOutlined } from '@ant-design/icons';
5
+ import { css } from '@emotion/css';
6
+ export const Media = (props) => {
7
+ const { token } = theme.useToken();
8
+ const [form] = Form.useForm();
9
+ const [loading, setLoading] = useState(false);
10
+ const [keyword, setKeyword] = useState('');
11
+ const [selectedKeys, setSelectedKeys] = useState([]);
12
+ const [expandedKeys, setExpandedKeys] = useState([]);
13
+ const onChange = (current) => {
14
+ if (current !== undefined && current?.sortType !== undefined) {
15
+ onDirectoryChange();
16
+ return;
17
+ }
18
+ const values = form.getFieldsValue();
19
+ props?.onFileChange?.(Object.keys(values)
20
+ .filter(key => values[key] === true)
21
+ .map((key) => {
22
+ return (props?.items ?? []).find(it => it.key === key);
23
+ })
24
+ .filter(it => it !== undefined));
25
+ };
26
+ const onDirectoryChange = (key) => {
27
+ key = key === undefined ? selectedKeys?.[0] : key;
28
+ if (key === undefined) {
29
+ return;
30
+ }
31
+ setSelectedKeys([key]);
32
+ props?.onDirectoryChange?.(key, form.getFieldValue('sortType') ?? 'DEFAULT', (status) => {
33
+ setLoading(status);
34
+ });
35
+ };
36
+ const recursion = (items, depth = 3) => {
37
+ if (depth <= 0) {
38
+ return [];
39
+ }
40
+ const result = items.filter(item => (item?.children ?? []).length > 0) ?? [];
41
+ return [...(result.map(item => item.key)), ...recursion(result?.map(item => item?.children ?? [])
42
+ .flat(), depth - 1)];
43
+ };
44
+ useEffect(() => {
45
+ const values = {};
46
+ for (const key of (props?.value?.map(item => item.key) ?? [])) {
47
+ values[key] = true;
48
+ }
49
+ form.setFieldsValue(values);
50
+ }, [props?.value]);
51
+ useEffect(() => {
52
+ if (selectedKeys.length > 0) {
53
+ return;
54
+ }
55
+ if (props?.directoryItems === undefined) {
56
+ return;
57
+ }
58
+ const directoryItem = props?.directoryItems?.[0];
59
+ if (directoryItem === undefined) {
60
+ return;
61
+ }
62
+ const directoryItemKey = directoryItem.key;
63
+ setSelectedKeys([directoryItemKey]);
64
+ setExpandedKeys(recursion(props?.directoryItems?.filter(item => (item.children ?? []).length > 0) ?? []));
65
+ onDirectoryChange(directoryItemKey);
66
+ form.setFieldsValue({ sortType: 'CREATE_TIME_DESC' });
67
+ }, [props?.directoryItems]);
68
+ return React.createElement(ConfigProvider, { theme: {
69
+ algorithm: theme.defaultAlgorithm,
70
+ token: {
71
+ colorBgContainerDisabled: '#fff',
72
+ colorBgTextHover: 'rgba(6,6,6,0.06)'
73
+ },
74
+ components: {
75
+ Tree: {
76
+ paddingXS: 0,
77
+ borderRadius: 2,
78
+ directoryNodeSelectedBg: token.colorPrimaryBg,
79
+ directoryNodeSelectedColor: token.colorPrimary,
80
+ // 屏蔽样式
81
+ nodeHoverColor: 'none',
82
+ nodeSelectedColor: '#333',
83
+ indentSize: 6,
84
+ titleHeight: 20,
85
+ fontSize: 13
86
+ }
87
+ }
88
+ } },
89
+ React.createElement("div", { style: {
90
+ ...(props?.style ?? {}),
91
+ borderRadius: token.borderRadius + 2,
92
+ display: 'flex',
93
+ justifyContent: 'space-between',
94
+ userSelect: 'none',
95
+ alignItems: 'stretch'
96
+ } },
97
+ React.createElement(Tree.DirectoryTree, { className: css `
98
+ .ant-tree-treenode {
99
+ padding-inline: 4px;
100
+ align-items: center;
101
+ }
102
+ `, expandAction: false, style: {
103
+ height: '100%',
104
+ display: 'block',
105
+ minWidth: props?.directoryWidth ?? 180,
106
+ maxWidth: props?.directoryWidth ?? 180,
107
+ paddingBlockStart: 12,
108
+ paddingInlineEnd: 12,
109
+ overflow: 'auto'
110
+ }, onSelect: (selectKeys) => {
111
+ const key = selectKeys[selectKeys.length - 1];
112
+ onDirectoryChange(key);
113
+ }, onExpand: (expandedKeys) => {
114
+ setExpandedKeys(expandedKeys);
115
+ }, treeData: props?.directoryItems ?? [], selectedKeys: selectedKeys, expandedKeys: expandedKeys, icon: false, switcherIcon: () => {
116
+ return React.createElement(CaretDownOutlined, { style: {
117
+ fontSize: 10,
118
+ marginBlockEnd: 2
119
+ } });
120
+ }, titleRender: (data) => {
121
+ return React.createElement("div", { style: {
122
+ display: 'flex',
123
+ alignItems: 'center',
124
+ height: 30
125
+ } },
126
+ React.createElement("div", { style: {
127
+ width: data?.width ?? 100,
128
+ overflow: 'hidden',
129
+ textOverflow: 'ellipsis',
130
+ whiteSpace: 'nowrap'
131
+ } }, data.title));
132
+ } }),
133
+ React.createElement(Form, { style: {
134
+ width: '100%',
135
+ paddingBlockStart: 12,
136
+ paddingLeft: 12,
137
+ borderLeft: '1px solid rgba(0,0,0,0.08)'
138
+ }, form: form, onValuesChange: (current) => onChange(current) },
139
+ React.createElement(Flux, { style: {
140
+ justifyContent: 'space-between',
141
+ paddingInlineStart: 2,
142
+ paddingInlineEnd: 6,
143
+ paddingBlockEnd: 12,
144
+ borderBottom: '1px solid rgba(0,0,0,0.08)'
145
+ } },
146
+ React.createElement(Space, null,
147
+ React.createElement(Form.Item, { noStyle: true, name: "sortType" },
148
+ React.createElement(Select, { options: [{
149
+ label: '文件名称(升序)',
150
+ value: 'NAME_ASC'
151
+ }, {
152
+ label: '文件名称(降序)',
153
+ value: 'NAME_DESC'
154
+ }, {
155
+ label: '上传时间(升序)',
156
+ value: 'CREATE_TIME_ASC'
157
+ }, {
158
+ label: '上传时间(降序)',
159
+ value: 'CREATE_TIME_DESC'
160
+ }], prefix: React.createElement(UnorderedListOutlined, { style: { marginRight: 4 } }) })),
161
+ React.createElement(Input, { placeholder: "\u8BF7\u8F93\u5165\u6587\u4EF6\u540D\u79F0", prefix: React.createElement(SearchOutlined, { style: { marginRight: 4 } }), onChange: (e) => {
162
+ setKeyword(e.target.value);
163
+ } })),
164
+ React.createElement(Button, { icon: React.createElement(CloudUploadOutlined, { style: {
165
+ marginRight: 0,
166
+ fontSize: token.fontSize + 2
167
+ } }), type: "primary", onClick: () => {
168
+ props?.onUpload?.();
169
+ } }, "\u672C\u5730\u4E0A\u4F20")),
170
+ React.createElement(Spin, { spinning: loading },
171
+ React.createElement(Flux, { style: {
172
+ marginBlock: 4,
173
+ paddingBlock: 4,
174
+ paddingInlineStart: 2,
175
+ paddingInlineEnd: 6,
176
+ flexWrap: 'wrap',
177
+ overflow: 'auto',
178
+ height: props?.height ?? 500
179
+ }, size: 12, alignItems: "flex-start" }, props?.items?.filter(item => {
180
+ return item?.fileName?.indexOf(keyword) > -1;
181
+ })
182
+ .map((item, i) => (React.createElement("div", { key: i, style: {
183
+ width: 140,
184
+ borderRadius: token.borderRadius + 2,
185
+ border: '1px solid rgba(0,0,0,0.1)',
186
+ overflow: 'hidden',
187
+ position: 'relative',
188
+ padding: 4,
189
+ cursor: (props?.maxLength ?? 1) <= (props?.value ?? []).length && props?.value?.find(it => it.key === item.key) === undefined ? 'not-allowed' : 'pointer'
190
+ }, className: css `
191
+ &:hover {
192
+ outline: 1px solid ${token.colorPrimary} !important;
193
+ border-color: ${token.colorPrimary} !important;
194
+ }
195
+ ` },
196
+ React.createElement(Form.Item, { noStyle: true, name: [item.key], valuePropName: "checked" },
197
+ React.createElement(Checkbox, { style: {
198
+ position: 'absolute',
199
+ top: 8,
200
+ right: 12
201
+ }, disabled: (props?.maxLength ?? 1) <= (props?.value ?? []).length && props?.value?.find(it => it.key === item.key) === undefined })),
202
+ React.createElement("div", { onClick: () => {
203
+ const status = form.getFieldValue([item.key]);
204
+ if ((props?.maxLength ?? 1) <= (props?.value ?? []).length && !(status === true)) {
205
+ return;
206
+ }
207
+ form.setFieldsValue({
208
+ [item.key]: !form.getFieldValue([item.key])
209
+ });
210
+ onChange();
211
+ } },
212
+ React.createElement("img", { src: item?.preview ?? item?.url, alt: "", style: {
213
+ display: 'block',
214
+ width: 140,
215
+ height: 120,
216
+ objectFit: 'cover',
217
+ userSelect: 'none',
218
+ pointerEvents: 'none',
219
+ borderRadius: token.borderRadius
220
+ } }),
221
+ React.createElement("div", { style: {
222
+ padding: '2px 2px 0 2px'
223
+ } },
224
+ React.createElement(Typography.Paragraph, { ellipsis: true, style: {
225
+ margin: 0,
226
+ padding: 0,
227
+ fontSize: 12,
228
+ lineHeight: 1.6,
229
+ color: '#333'
230
+ } }, item?.fileName),
231
+ React.createElement(Flux, { style: {
232
+ margin: 0,
233
+ padding: 0,
234
+ lineHeight: 1.45,
235
+ fontSize: token.fontSize - 2,
236
+ justifyContent: 'space-between',
237
+ color: '#666'
238
+ } },
239
+ React.createElement("span", null, item?.attribute?.resolution),
240
+ React.createElement("span", null, item?.fileLength))))))))))));
241
+ };
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from 'react';
2
+ import { Handler } from '../type';
3
+ import { DirectoryItem, MediaItem } from './Media';
4
+ /**
5
+ * 图片空间模态框.
6
+ */
7
+ export declare class MediaModals {
8
+ /**
9
+ * 打开图片选择模态框.
10
+ * @param request 请求接口.
11
+ */
12
+ static use(request: {
13
+ getDirectory: () => Promise<DirectoryItem[]>;
14
+ getItems: (directoryId: string, sortType: string) => Promise<MediaItem[]>;
15
+ uploadFile: (file: File) => Promise<boolean>;
16
+ }): [Handler<MediaItem[]>, ReactNode];
17
+ }