Commit a53a9695 authored by Яков's avatar Яков
Browse files

выбор загруженных

parent 95adc509
{ {
"name": "react-ag-qeditor", "name": "react-ag-qeditor",
"version": "1.1.44", "version": "1.1.45",
"description": "WYSIWYG html editor", "description": "WYSIWYG html editor",
"author": "atma", "author": "atma",
"license": "MIT", "license": "MIT",
......
...@@ -139,6 +139,9 @@ const QEditor = ({ ...@@ -139,6 +139,9 @@ const QEditor = ({
const [buttonLinkData, setButtonLinkData] = useState(defaultButtonLinkData) const [buttonLinkData, setButtonLinkData] = useState(defaultButtonLinkData)
const [suggestedFiles, setSuggestedFiles] = useState([]) const [suggestedFiles, setSuggestedFiles] = useState([])
const [suggestedLoading, setSuggestedLoading] = useState(false) const [suggestedLoading, setSuggestedLoading] = useState(false)
const [suggestPage, setSuggestPage] = useState(1)
const [suggestTotal, setSuggestTotal] = useState(0)
const SUGGEST_LIMIT = 20
let formRef = useRef(null); let formRef = useRef(null);
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
...@@ -187,23 +190,37 @@ const QEditor = ({ ...@@ -187,23 +190,37 @@ const QEditor = ({
file: 'file' file: 'file'
} }
useEffect(() => {
setSuggestPage(1)
setSuggestTotal(0)
setSuggestedFiles([])
}, [innerModalType])
useEffect(() => { useEffect(() => {
if (!modalIsOpen || !uploadOptions.suggestUrl || !SUGGEST_TYPES.includes(innerModalType)) { if (!modalIsOpen || !uploadOptions.suggestUrl || !SUGGEST_TYPES.includes(innerModalType)) {
setSuggestedFiles([]) setSuggestedFiles([])
setSuggestTotal(0)
return return
} }
let cancelled = false let cancelled = false
setSuggestedLoading(true) setSuggestedLoading(true)
axios.get(uploadOptions.suggestUrl, { params: { type: SUGGEST_TYPE_MAP[innerModalType] } }) axios.get(uploadOptions.suggestUrl, {
params: {
type: SUGGEST_TYPE_MAP[innerModalType],
page: suggestPage,
limit: SUGGEST_LIMIT
}
})
.then(response => { .then(response => {
if (!cancelled && response.data.state === 'success' && Array.isArray(response.data.files)) { if (!cancelled && response.data.state === 'success' && Array.isArray(response.data.files)) {
setSuggestedFiles(response.data.files) setSuggestedFiles(response.data.files)
setSuggestTotal(response.data.total || response.data.files.length)
} }
}) })
.catch(() => {}) .catch(() => {})
.finally(() => { if (!cancelled) setSuggestedLoading(false) }) .finally(() => { if (!cancelled) setSuggestedLoading(false) })
return () => { cancelled = true } return () => { cancelled = true }
}, [modalIsOpen, innerModalType]) }, [modalIsOpen, innerModalType, suggestPage])
const editWord = (values) => { const editWord = (values) => {
...@@ -839,12 +856,13 @@ const QEditor = ({ ...@@ -839,12 +856,13 @@ const QEditor = ({
if (suggestedLoading) { if (suggestedLoading) {
return <div className='atma-editor-suggest-loading'>Загрузка файлов...</div> return <div className='atma-editor-suggest-loading'>Загрузка файлов...</div>
} }
if (suggestedFiles.length === 0) { if (!suggestedLoading && suggestedFiles.length === 0) {
return null return null
} }
const isVideo = innerModalType === 'video' const isVideo = innerModalType === 'video'
const isAudio = innerModalType === 'audio' const isAudio = innerModalType === 'audio'
const isFile = innerModalType === 'file' const isFile = innerModalType === 'file'
const totalPages = Math.ceil(suggestTotal / SUGGEST_LIMIT)
return ( return (
<div className='atma-editor-suggest'> <div className='atma-editor-suggest'>
<div className='atma-editor-suggest-title'>Ранее загруженные файлы</div> <div className='atma-editor-suggest-title'>Ранее загруженные файлы</div>
...@@ -885,6 +903,25 @@ const QEditor = ({ ...@@ -885,6 +903,25 @@ const QEditor = ({
) )
})} })}
</div> </div>
{totalPages > 1 && (
<div className='atma-editor-suggest-pagination'>
<button
type='button'
className='atma-editor-suggest-page-btn'
disabled={suggestPage <= 1}
onClick={() => setSuggestPage(p => p - 1)}
>&#8592;</button>
<span className='atma-editor-suggest-page-info'>
{suggestPage} / {totalPages}
</span>
<button
type='button'
className='atma-editor-suggest-page-btn'
disabled={suggestPage >= totalPages}
onClick={() => setSuggestPage(p => p + 1)}
>&#8594;</button>
</div>
)}
</div> </div>
) )
} }
...@@ -918,8 +955,8 @@ const QEditor = ({ ...@@ -918,8 +955,8 @@ const QEditor = ({
case 'audio': case 'audio':
return ( return (
<Fragment> <Fragment>
{getSuggestionsSection()}
{getUploader({accept: '.wav, .mp3, .ogg'})} {getUploader({accept: '.wav, .mp3, .ogg'})}
{getSuggestionsSection()}
</Fragment> </Fragment>
) )
case 'iframe_pdf': case 'iframe_pdf':
...@@ -943,29 +980,29 @@ const QEditor = ({ ...@@ -943,29 +980,29 @@ const QEditor = ({
case 'video': case 'video':
return ( return (
<Fragment> <Fragment>
{getSuggestionsSection()}
{getUploader({accept: 'video/mp4,.mp4'})} {getUploader({accept: 'video/mp4,.mp4'})}
{getSuggestionsSection()}
</Fragment> </Fragment>
) )
case 'image': case 'image':
return ( return (
<Fragment> <Fragment>
{getSuggestionsSection()}
{getUploader({accept: 'image/*'})} {getUploader({accept: 'image/*'})}
{getSuggestionsSection()}
</Fragment> </Fragment>
) )
case 'interactiveImage': case 'interactiveImage':
return ( return (
<Fragment> <Fragment>
{getSuggestionsSection()}
{getUploader({accept: 'image/*', multiple: false})} {getUploader({accept: 'image/*', multiple: false})}
{getSuggestionsSection()}
</Fragment> </Fragment>
) )
case 'file': case 'file':
return ( return (
<Fragment> <Fragment>
{getSuggestionsSection()}
{getUploader({accept: '*', afterParams: ['no_convert=1']})} {getUploader({accept: '*', afterParams: ['no_convert=1']})}
{getSuggestionsSection()}
</Fragment> </Fragment>
) )
case 'buttonLink': case 'buttonLink':
......
...@@ -861,16 +861,16 @@ body{ ...@@ -861,16 +861,16 @@ body{
background-position: center; background-position: center;
background-repeat: no-repeat; background-repeat: no-repeat;
cursor: pointer; cursor: pointer;
border: 2px solid transparent; box-shadow: 0 0 0 2px transparent;
transition: border-color 0.15s; transition: box-shadow 0.2s ease;
overflow: hidden; overflow: hidden;
&:hover{ &:hover{
border-color: #adb0b6; box-shadow: 0 0 0 2px #adb0b6;
} }
&.selected{ &.selected{
border-color: #1790FF; box-shadow: 0 0 0 2px #1790FF;
&::after{ &::after{
content: ''; content: '';
...@@ -920,6 +920,47 @@ body{ ...@@ -920,6 +920,47 @@ body{
display: block; display: block;
} }
} }
&-pagination{
display: flex;
align-items: center;
gap: 8px;
margin-top: 12px;
}
&-page-btn{
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
border-radius: 6px;
border: 1px solid #CCD1D9;
background: #fff;
cursor: pointer;
font-size: 14px;
color: #434A53;
transition: background 0.15s, border-color 0.15s;
padding: 0;
line-height: 1;
&:hover:not(:disabled){
background: #F5F7FA;
border-color: #adb0b6;
}
&:disabled{
opacity: 0.35;
cursor: default;
}
}
&-page-info{
font-size: 13px;
color: #656D77;
min-width: 44px;
text-align: center;
}
} }
&-btn{ &-btn{
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment