| <wxs src="../common/utils.wxs" module="_" /> | 
| <wxs src="./upload.wxs" module="this" /> | 
| <wxs src="./drag.wxs" module="handler" /> | 
|   | 
| <view style="{{_._style([style, customStyle])}}" class="{{classPrefix}} class {{prefix}}-class"> | 
|   <t-grid | 
|     gutter="{{gutter}}" | 
|     border="{{false}}" | 
|     align="center" | 
|     column="{{column}}" | 
|     style="{{draggable? 'overflow: visible' : ''}}" | 
|   > | 
|     <block wx:if="{{!dragLayout}}"> | 
|       <!-- 图片/视频 --> | 
|       <t-grid-item | 
|         wx:for="{{customFiles}}" | 
|         wx:key="url" | 
|         wx:for-item="file" | 
|         t-class="{{classPrefix}}__grid {{classPrefix}}__grid-file" | 
|         t-class-content="{{classPrefix}}__grid-content" | 
|         aria-role="presentation" | 
|       > | 
|         <view | 
|           class="{{classPrefix}}__wrapper {{disabled? classPrefix + '__wrapper--disabled' : '' }}" | 
|           style="{{gridItemStyle}}" | 
|           aria-role="{{ariaRole || this.getWrapperAriaRole(file)}}" | 
|           aria-label="{{ariaLabel || this.getWrapperAriaLabel(file)}}" | 
|         > | 
|           <t-image | 
|             wx:if="{{file.type !== 'video'}}" | 
|             data-file="{{file}}" | 
|             bind:tap="onProofTap" | 
|             data-index="{{index}}" | 
|             t-class="{{classPrefix}}__thumbnail" | 
|             style="{{imageProps && imageProps.style || ''}}" | 
|             src="{{file.url}}" | 
|             mode="{{imageProps && imageProps.mode || 'aspectFill'}}" | 
|             error="{{imageProps && imageProps.error || 'default'}}" | 
|             lazy="{{imageProps && imageProps.lazy || false}}" | 
|             loading="{{imageProps && imageProps.loading || 'default'}}" | 
|             shape="{{imageProps && imageProps.shape || 'round'}}" | 
|             webp="{{imageProps && imageProps.webp || false}}" | 
|             showMenuByLongpress="{{imageProps && imageProps.showMenuByLongpress || false}}" | 
|           /> | 
|           <video | 
|             data-file="{{file}}" | 
|             bind:tap="onFileClick" | 
|             wx:if="{{file.type === 'video'}}" | 
|             class="{{classPrefix}}__thumbnail" | 
|             src="{{file.url}}" | 
|             controls | 
|             autoplay="{{false}}" | 
|             objectFit="contain" | 
|           /> | 
|           <!-- 失败重试 --> | 
|           <view | 
|             data-index="{{index}}" | 
|             wx:if="{{file.status && file.status != 'done'}}" | 
|             class="{{classPrefix}}__progress-mask" | 
|             data-file="{{file}}" | 
|             bind:tap="onFileClick" | 
|           > | 
|             <block wx:if="{{file.status == 'loading'}}"> | 
|               <t-icon t-class="{{classPrefix}}__progress-loading" name="loading" size="24" aria-hidden /> | 
|               <view class="{{classPrefix}}__progress-text">{{file.percent ? file.percent + '%' : '上传中...'}}</view> | 
|             </block> | 
|             <t-icon wx:else name="{{file.status == 'reload' ? 'refresh' : 'close-circle'}}" size="24" aria-hidden /> | 
|             <view wx:if="{{file.status == 'reload' || file.status == 'failed'}}" class="{{classPrefix}}__progress-text"> | 
|               {{file.status == 'reload' ? '重新上传' : '上传失败'}} | 
|             </view> | 
|           </view> | 
|   | 
|           <!-- 删除 --> | 
|           <view | 
|             class="{{classPrefix}}__close-btn hotspot-expanded" | 
|             bindtap="onDelete" | 
|             data-index="{{index}}" | 
|             aria-role="button" | 
|             aria-label="删除" | 
|           > | 
|             <t-icon name="close" size="16" color="#fff" /> | 
|           </view> | 
|         </view> | 
|       </t-grid-item> | 
|   | 
|       <!-- 添加 --> | 
|       <t-grid-item | 
|         wx:if="{{customLimit > 0}}" | 
|         t-class="{{classPrefix}}__grid" | 
|         t-class-content="{{classPrefix}}__grid-content" | 
|         bindclick="onAddTap" | 
|         aria-label="上传" | 
|       > | 
|         <view class="{{classPrefix}}__wrapper" style="{{gridItemStyle}}"> | 
|           <slot name="add-content" /> | 
|           <block wx:if="{{addContent}}">{{addContent}}</block> | 
|           <view wx:else class="{{classPrefix}}__add-icon {{disabled? classPrefix + '__add-icon--disabled' : '' }}"> | 
|             <t-icon name="add" /> | 
|           </view> | 
|         </view> | 
|       </t-grid-item> | 
|     </block> | 
|     <block wx:else> | 
|       <view | 
|         class="{{classPrefix}}__drag" | 
|         list="{{dragList}}" | 
|         style="{{dragWrapStyle}};" | 
|         dragBaseData="{{dragBaseData}}" | 
|         change:list="{{handler.listObserver}}" | 
|         change:dragBaseData="{{handler.baseDataObserver}}" | 
|       > | 
|         <view | 
|           class="{{classPrefix}}__drag-item" | 
|           wx:for="{{customFiles}}" | 
|           wx:key="url" | 
|           wx:for-item="file" | 
|           style="width: {{100 / column}}%; --td-upload-drag-transition-duration: {{transition.duration}}ms; --td-upload-drag-transition-timing-function: {{transition.timingFunction}}" | 
|           bind:longpress="{{handler.longPress}}" | 
|           catch:touchmove="{{dragging ? handler.touchMove : ''}}" | 
|           catch:touchend="{{dragging ? handler.touchEnd : ''}}" | 
|           data-index="{{index}}" | 
|         > | 
|           <!-- 图片/视频 --> | 
|           <t-grid-item | 
|             t-class="{{classPrefix}}__grid {{classPrefix}}__grid-file" | 
|             t-class-content="{{classPrefix}}__grid-content" | 
|             aria-role="presentation" | 
|             style="width: 100%" | 
|           > | 
|             <view | 
|               class="{{classPrefix}}__wrapper {{disabled? classPrefix + '__wrapper--disabled' : '' }}" | 
|               style="{{gridItemStyle}};" | 
|               aria-role="{{ariaRole || this.getWrapperAriaRole(file)}}" | 
|               aria-label="{{ariaLabel || this.getWrapperAriaLabel(file)}}" | 
|             > | 
|               <t-image | 
|                 wx:if="{{file.type !== 'video'}}" | 
|                 data-file="{{file}}" | 
|                 bind:tap="onProofTap" | 
|                 data-index="{{index}}" | 
|                 t-class="{{classPrefix}}__thumbnail" | 
|                 style="{{imageProps && imageProps.style || ''}}" | 
|                 src="{{file.url}}" | 
|                 mode="{{imageProps && imageProps.mode || 'aspectFill'}}" | 
|                 error="{{imageProps && imageProps.error || 'default'}}" | 
|                 lazy="{{imageProps && imageProps.lazy || false}}" | 
|                 loading="{{imageProps && imageProps.loading || 'default'}}" | 
|                 shape="{{imageProps && imageProps.shape || 'round'}}" | 
|                 webp="{{imageProps && imageProps.webp || false}}" | 
|                 showMenuByLongpress="{{imageProps && imageProps.showMenuByLongpress || false}}" | 
|               /> | 
|               <video | 
|                 data-file="{{file}}" | 
|                 bind:tap="onFileClick" | 
|                 wx:if="{{file.type === 'video'}}" | 
|                 class="{{classPrefix}}__thumbnail" | 
|                 src="{{file.url}}" | 
|                 controls | 
|                 autoplay="{{false}}" | 
|                 objectFit="contain" | 
|               /> | 
|               <!-- 失败重试 --> | 
|               <view | 
|                 data-index="{{index}}" | 
|                 wx:if="{{file.status && file.status != 'done'}}" | 
|                 class="{{classPrefix}}__progress-mask" | 
|                 data-file="{{file}}" | 
|                 bind:tap="onFileClick" | 
|               > | 
|                 <block wx:if="{{file.status == 'loading'}}"> | 
|                   <t-icon t-class="{{classPrefix}}__progress-loading" name="loading" size="24" aria-hidden /> | 
|                   <view class="{{classPrefix}}__progress-text" | 
|                     >{{file.percent ? file.percent + '%' : '上传中...'}}</view | 
|                   > | 
|                 </block> | 
|                 <t-icon wx:else name="{{file.status == 'reload' ? 'refresh' : 'close-circle'}}" size="24" aria-hidden /> | 
|                 <view | 
|                   wx:if="{{file.status == 'reload' || file.status == 'failed'}}" | 
|                   class="{{classPrefix}}__progress-text" | 
|                 > | 
|                   {{file.status == 'reload' ? '重新上传' : '上传失败'}} | 
|                 </view> | 
|               </view> | 
|   | 
|               <!-- 删除 --> | 
|               <view | 
|                 class="{{classPrefix}}__close-btn hotspot-expanded" | 
|                 bindtap="onDelete" | 
|                 data-index="{{index}}" | 
|                 data-url="{{file.url}}" | 
|                 aria-role="button" | 
|                 aria-label="删除" | 
|               > | 
|                 <t-icon name="close" size="16" color="#fff" /> | 
|               </view> | 
|             </view> | 
|           </t-grid-item> | 
|           <!-- 添加 --> | 
|         </view> | 
|         <view class="{{classPrefix}}__drag-item" style="width: {{100 / column}}%" wx:if="{{customLimit > 0}}"> | 
|           <t-grid-item | 
|             t-class="{{classPrefix}}__grid" | 
|             t-class-content="{{classPrefix}}__grid-content" | 
|             bindclick="onAddTap" | 
|             aria-label="上传" | 
|             style="width: 100%" | 
|           > | 
|             <view class="{{classPrefix}}__wrapper" style="{{gridItemStyle}}"> | 
|               <slot name="add-content" /> | 
|               <block wx:if="{{addContent}}">{{addContent}}</block> | 
|               <view wx:else class="{{classPrefix}}__add-icon {{disabled? classPrefix + '__add-icon--disabled' : '' }}"> | 
|                 <t-icon name="add" /> | 
|               </view> | 
|             </view> | 
|           </t-grid-item> | 
|         </view> | 
|       </view> | 
|     </block> | 
|   </t-grid> | 
| </view> |