Showing
5 changed files
with
199 additions
and
24 deletions
| ... | ... | @@ -30,7 +30,7 @@ export function getProductBook(data: {pro_line: string}) { |
| 30 | 30 | |
| 31 | 31 | /**获取文件预览地址 |
| 32 | 32 | * **/ |
| 33 | -export function getFilePreview(fileId: string) { | |
| 33 | +export function getFilePreview(fileId?: string) { | |
| 34 | 34 | return get( |
| 35 | 35 | `/open/qgyun-service-fs-manager/file/p/origin/${fileId}`, |
| 36 | 36 | { | ... | ... |
| 1 | 1 | import React, {useEffect, useState} from 'react' |
| 2 | 2 | import './style.less' |
| 3 | 3 | import NavBar from '@/components/nav-bar' |
| 4 | -import {baseColorPrimary} from "@/utils/common"; | |
| 5 | -import {hexToRgba} from "@/utils/utils"; | |
| 6 | 4 | import _mp4 from './mp4.png'; |
| 7 | 5 | import _pdf from './pdf.png'; |
| 6 | +import _preview from './preview.png'; | |
| 8 | 7 | |
| 9 | 8 | import {useSearchParams} from "react-router-dom"; |
| 10 | -import {getProductBook} from "@/api/apiConfig"; | |
| 11 | -import {SpinLoading} from 'antd-mobile' | |
| 9 | +import {getFilePreview, getProductBook} from "@/api/apiConfig"; | |
| 10 | +import {SpinLoading, Checkbox} from 'antd-mobile' | |
| 11 | +import { useNavigate } from "react-router-dom"; | |
| 12 | 12 | |
| 13 | 13 | interface ListType { |
| 14 | 14 | id: string; |
| ... | ... | @@ -16,10 +16,16 @@ interface ListType { |
| 16 | 16 | type: 'pdf' | 'mp4' | string |
| 17 | 17 | } |
| 18 | 18 | |
| 19 | +type CheckboxValue = string | number | |
| 20 | + | |
| 19 | 21 | const ProductionList: React.FC = () => { |
| 20 | 22 | const [title, setTitle] = useState<string>(''); |
| 21 | 23 | const [list, setList] = useState<ListType[]>([]); |
| 22 | 24 | const [show, setShow] = useState<boolean>(false); |
| 25 | + const [showBatch, setShowBatch] = useState<boolean>(false); | |
| 26 | + const navigate = useNavigate(); | |
| 27 | + const [checkItems, setCheckItems] = useState<CheckboxValue[]>([]) | |
| 28 | + const [checkValues, setCheckValues] = useState<CheckboxValue[]>([]) | |
| 23 | 29 | |
| 24 | 30 | |
| 25 | 31 | // 因是hook,必须写在组件的顶部执行,useSearchParams() 返回的是数组 |
| ... | ... | @@ -40,15 +46,18 @@ const ProductionList: React.FC = () => { |
| 40 | 46 | setShow(false); |
| 41 | 47 | getProductBook({pro_line: id}).then((res: any) => { |
| 42 | 48 | setShow(true); |
| 49 | + let _checkItems = []; | |
| 43 | 50 | const _list = res?.product_book?.map((item: any) => { |
| 51 | + _checkItems.push(item?.guide_book_file_info_?.[0]?.fileId); | |
| 44 | 52 | const _arr = item?.guide_book_file_info_?.[0]?.name?.split('.') || []; |
| 45 | 53 | return { |
| 46 | - id: item?.id || '', | |
| 54 | + id: item?.guide_book_file_info_?.[0]?.fileId || '', | |
| 47 | 55 | name: _arr?.[0] || '', |
| 48 | 56 | type: _arr?.[1] || '', |
| 49 | 57 | } |
| 50 | 58 | }) || []; |
| 51 | 59 | setList(_list) |
| 60 | + setCheckItems(_checkItems) | |
| 52 | 61 | }).catch((e: any) => { |
| 53 | 62 | setShow(true); |
| 54 | 63 | setList([]) |
| ... | ... | @@ -56,32 +65,109 @@ const ProductionList: React.FC = () => { |
| 56 | 65 | } |
| 57 | 66 | }, [id]) |
| 58 | 67 | |
| 68 | + const rightInfo = ( | |
| 69 | + <div className={'production-list_nav-right'}> | |
| 70 | + <span | |
| 71 | + className={'production-list_nav-right-info'} | |
| 72 | + onClick={() => setShowBatch(true)} | |
| 73 | + >批量操作</span> | |
| 74 | + </div> | |
| 75 | + ) | |
| 76 | + | |
| 77 | + const checkboxChange = (value: CheckboxValue[]) => { | |
| 78 | + console.log('checkboxChange-value', value) | |
| 79 | + setCheckValues(value) | |
| 80 | + } | |
| 81 | + const toDetail = (ids: CheckboxValue[]) => { | |
| 82 | + console.log('toDetail-ids', ids) | |
| 83 | + if (ids?.[0]) { | |
| 84 | + const _id: string = ids?.[0].toString() || ''; | |
| 85 | + getFilePreview(_id).then((res: any) => { | |
| 86 | + console.log('res', res) | |
| 87 | + window.open(res, '_blank') | |
| 88 | + }).catch((err: any) => { | |
| 89 | + console.log('err', err) | |
| 90 | + }) | |
| 91 | + } | |
| 92 | + // navigate(`/production/detail?id=${item?.id}&name=${item?.name}`); | |
| 93 | + } | |
| 59 | 94 | |
| 60 | 95 | return ( |
| 61 | 96 | <div className={'sxjx-content-main sxjx-layout-main-unfoot'}> |
| 62 | - <div className={'production-list'}> | |
| 63 | - <NavBar title={title} showBack={true}/> | |
| 97 | + <div className={`production-list ${showBatch ? 'production-list--batch' : ''}`}> | |
| 98 | + <NavBar title={title} showBack={true} rightInfo={ !showBatch ? rightInfo : ''}/> | |
| 64 | 99 | { |
| 65 | 100 | !show ? <SpinLoading color='primary'/> : |
| 66 | 101 | <div className={'production-list_list'}> |
| 67 | - { | |
| 68 | - list?.map((item: any) => { | |
| 69 | - return <div | |
| 70 | - key={item?.id} | |
| 71 | - className={'production-list_list-item'} | |
| 72 | - style={{backgroundColor: hexToRgba(baseColorPrimary, 0.55)}} | |
| 73 | - > | |
| 74 | - <img className={'production-list_list-item-img'} | |
| 75 | - src={item?.type === 'mp4' ? _mp4 : _pdf}/> | |
| 76 | - <div className={'omit2 production-list_list-item-name'}> | |
| 77 | - {item?.name} | |
| 102 | + <Checkbox.Group | |
| 103 | + onChange={checkboxChange} | |
| 104 | + value={checkValues} | |
| 105 | + > | |
| 106 | + { | |
| 107 | + list?.map((item: ListType) => { | |
| 108 | + return <div | |
| 109 | + key={item?.id} | |
| 110 | + className={`production-list_list-item ${item?.id}`} | |
| 111 | + style={{backgroundColor: '#fff'}} | |
| 112 | + onClick={() => { | |
| 113 | + if (!showBatch) { | |
| 114 | + toDetail([item?.id || '']) | |
| 115 | + } | |
| 116 | + }} | |
| 117 | + > | |
| 118 | + <img className={'production-list_list-item-img'} | |
| 119 | + src={item?.type === 'mp4' ? _mp4 : _pdf}/> | |
| 120 | + <div className={'omit2 production-list_list-item-name'}> | |
| 121 | + {item?.name} | |
| 122 | + </div> | |
| 123 | + { | |
| 124 | + showBatch ? <Checkbox key={item?.id} value={item?.id} /> : '' | |
| 125 | + } | |
| 78 | 126 | </div> |
| 79 | - </div> | |
| 80 | - }) | |
| 81 | - } | |
| 127 | + }) | |
| 128 | + } | |
| 129 | + </Checkbox.Group> | |
| 82 | 130 | |
| 131 | + | |
| 132 | + </div> | |
| 133 | + } | |
| 134 | + { | |
| 135 | + showBatch ? <div className={'production-list--batch_info'}> | |
| 136 | + <div className={'production-list--batch_info-top'}> | |
| 137 | + <Checkbox | |
| 138 | + indeterminate={checkValues.length > 0 && checkValues?.length < checkItems?.length} | |
| 139 | + checked={checkValues?.length === checkItems?.length} | |
| 140 | + onChange={checked => { | |
| 141 | + if (checked) { | |
| 142 | + setCheckValues(checkItems) | |
| 143 | + } else { | |
| 144 | + setCheckValues([]) | |
| 145 | + } | |
| 146 | + }} | |
| 147 | + > | |
| 148 | + 全选 | |
| 149 | + </Checkbox> | |
| 150 | + <div className={'production-list--batch_info-top-choose'}>已选择<span>{checkValues?.length}</span>条</div> | |
| 151 | + <div className={'production-list--batch_info-top-close'} | |
| 152 | + onClick={() => { | |
| 153 | + setShowBatch(false); | |
| 154 | + setCheckValues([]) | |
| 155 | + }} | |
| 156 | + >取消</div> | |
| 157 | + </div> | |
| 158 | + <div className={'production-list--batch_info-bottom'}> | |
| 159 | + <div className={'production-list--batch_info-bottom_item'}> | |
| 160 | + <img className={'production-list--batch_info-bottom_item-icon'} src={_preview} alt=""/> | |
| 161 | + <span className={'production-list--batch_info-bottom_item-info'} | |
| 162 | + onClick={() => { | |
| 163 | + toDetail(checkValues) | |
| 164 | + }} | |
| 165 | + >预览</span> | |
| 166 | + </div> | |
| 83 | 167 | </div> |
| 168 | + </div> : '' | |
| 84 | 169 | } |
| 170 | + | |
| 85 | 171 | </div> |
| 86 | 172 | </div> |
| 87 | 173 | ) | ... | ... |
src/pages/production/list/preview.png
0 → 100644
1.57 KB
| 1 | 1 | .production-list { |
| 2 | 2 | background: #f7f7f7; |
| 3 | 3 | |
| 4 | + &--batch { | |
| 5 | + margin-bottom: 221px; | |
| 6 | + | |
| 7 | + &_info { | |
| 8 | + position: fixed; | |
| 9 | + bottom: 0; | |
| 10 | + left: 0; | |
| 11 | + right: 0; | |
| 12 | + background: #fff; | |
| 13 | + height: calc(221px + env(safe-area-inset-bottom)); | |
| 14 | + height: calc(221px + env(safe-area-inset-bottom)); | |
| 15 | + z-index: 100; | |
| 16 | + &-top { | |
| 17 | + height: 100px; | |
| 18 | + border-bottom: 1px solid #eee; | |
| 19 | + padding: 0 60px; | |
| 20 | + display: flex; | |
| 21 | + justify-content: space-between; | |
| 22 | + align-items: center; | |
| 23 | + font-size: 28px; | |
| 24 | + | |
| 25 | + .adm-checkbox { | |
| 26 | + --icon-size: 28px; | |
| 27 | + --font-size: 28px; | |
| 28 | + color: #aeb1b8; | |
| 29 | + } | |
| 30 | + | |
| 31 | + &-choose { | |
| 32 | + color: #aeb1b8; | |
| 33 | + cursor: pointer; | |
| 34 | + span { | |
| 35 | + color: #1677ff; | |
| 36 | + padding: 0 10px; | |
| 37 | + } | |
| 38 | + } | |
| 39 | + &-close { | |
| 40 | + color: #1677ff; | |
| 41 | + } | |
| 42 | + } | |
| 43 | + &-bottom { | |
| 44 | + height: 120px; | |
| 45 | + display: flex; | |
| 46 | + justify-content: center; | |
| 47 | + align-items: center; | |
| 48 | + | |
| 49 | + &_item { | |
| 50 | + display: flex; | |
| 51 | + flex-direction: column; | |
| 52 | + cursor: pointer; | |
| 53 | + &-icon { | |
| 54 | + width: 56px; | |
| 55 | + height: 56px; | |
| 56 | + } | |
| 57 | + &-info { | |
| 58 | + font-size: 20px; | |
| 59 | + width: 56px; | |
| 60 | + text-align: center; | |
| 61 | + color: #333; | |
| 62 | + } | |
| 63 | + } | |
| 64 | + | |
| 65 | + } | |
| 66 | + } | |
| 67 | + } | |
| 68 | + | |
| 4 | 69 | .adm-spin-loading { |
| 5 | 70 | --size: 60px; |
| 6 | 71 | margin: 300px auto 0; |
| ... | ... | @@ -14,7 +79,7 @@ |
| 14 | 79 | &-item { |
| 15 | 80 | width: 312px; |
| 16 | 81 | height: 312px; |
| 17 | - color: #fff; | |
| 82 | + color: #333; | |
| 18 | 83 | margin-right: 60px; |
| 19 | 84 | margin-bottom: 60px; |
| 20 | 85 | cursor: pointer; |
| ... | ... | @@ -27,6 +92,8 @@ |
| 27 | 92 | text-align: center; |
| 28 | 93 | flex-direction: column; |
| 29 | 94 | |
| 95 | + position: relative; | |
| 96 | + | |
| 30 | 97 | &:nth-child(5n) { |
| 31 | 98 | margin-right: 0; |
| 32 | 99 | } |
| ... | ... | @@ -42,6 +109,28 @@ |
| 42 | 109 | height: 80px; |
| 43 | 110 | line-height: 40px; |
| 44 | 111 | } |
| 112 | + | |
| 113 | + .adm-checkbox { | |
| 114 | + position: absolute; | |
| 115 | + top: 0; | |
| 116 | + left: 30px; | |
| 117 | + width: 100%; | |
| 118 | + height: 100%; | |
| 119 | + --icon-size: 30px; | |
| 120 | + display: flex; | |
| 121 | + align-items: start; | |
| 122 | + padding-top: 30px; | |
| 123 | + } | |
| 124 | + } | |
| 125 | + } | |
| 126 | + | |
| 127 | + &_nav-right { | |
| 128 | + font-size: 26px; | |
| 129 | + padding-right: 20px; | |
| 130 | + &-info { | |
| 131 | + cursor: pointer; | |
| 132 | + display: inline-block; | |
| 133 | + padding: 0 10px; | |
| 45 | 134 | } |
| 46 | 135 | } |
| 47 | 136 | } |
| \ No newline at end of file | ... | ... |