papayaui 0.2.13 → 0.2.14

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/.DS_Store CHANGED
Binary file
@@ -47,7 +47,7 @@
47
47
  <view v-if="loading" :class="ns.e('loading')">
48
48
  <loadmore :status="LoadStatusEnum.LOADING" />
49
49
  </view>
50
- <view v-if="!currentData.length && !loading" :class="ns.e('empty')">无数据</view>
50
+ <view v-if="!currentData.length && !loading" :class="ns.e('empty')">{{ emptyText }}</view>
51
51
  <SafeBottom v-if="safeAreaInsetBottom && !localState.hasConfirm" />
52
52
  </scroll-view>
53
53
  <SearchView
@@ -56,6 +56,7 @@
56
56
  :options="treeData"
57
57
  :field-names="_fieldNames"
58
58
  :search-text="searchText"
59
+ :empty-text="emptyText"
59
60
  :lazy-search="lazySearch"
60
61
  :is-selected="isSelected"
61
62
  :safe-area-inset-bottom="safeAreaInsetBottom && !localState.hasConfirm"
@@ -81,6 +81,13 @@ export const cascaderProps = {
81
81
  type: String,
82
82
  default: '重置',
83
83
  },
84
+ /**
85
+ * 数据为空时的提示文案
86
+ */
87
+ emptyText: {
88
+ type: String,
89
+ default: '无数据',
90
+ },
84
91
  /**
85
92
  * 确定后是否重置数据
86
93
  */
@@ -130,6 +137,10 @@ export const cascaderSearchViewProps = {
130
137
  type: String,
131
138
  required: true,
132
139
  },
140
+ emptyText: {
141
+ type: String,
142
+ required: true,
143
+ },
133
144
  lazySearch: Function as PropType<
134
145
  (searchText: string) => CascaderOption[] | Promise<CascaderOption[]>
135
146
  >,
@@ -10,7 +10,7 @@
10
10
  <view v-if="loading" :class="ns.e('loading')">
11
11
  <loadmore :status="LoadStatusEnum.LOADING" />
12
12
  </view>
13
- <view v-if="!searchData.length && !loading" :class="ns.e('empty')">无数据</view>
13
+ <view v-if="!searchData.length && !loading" :class="ns.e('empty')">{{ emptyText }}</view>
14
14
  <SafeBottom v-if="safeAreaInsetBottom" />
15
15
  </scroll-view>
16
16
  </template>
@@ -44,7 +44,7 @@
44
44
  <LoadMore
45
45
  v-if="!filterOptions.length || !!pagination"
46
46
  :status="loadStatus"
47
- :config="{ nomore: isEmpty ? '无数据' : '没有更多了' }"
47
+ :config="{ nomore: isEmpty ? emptyText : '没有更多了' }"
48
48
  :full-page="isEmpty"
49
49
  :show-text="!onlyOnePage"
50
50
  @next="onScrollNext"
@@ -88,6 +88,13 @@ export const pickerPopupProps = {
88
88
  type: String,
89
89
  default: '确定',
90
90
  },
91
+ /**
92
+ * 数据为空时的提示文案
93
+ */
94
+ emptyText: {
95
+ type: String,
96
+ default: '无数据',
97
+ },
91
98
  /**
92
99
  * 确定后是否重置数据
93
100
  */
@@ -27,6 +27,10 @@
27
27
  <Demo7 />
28
28
  </DocDemoBlock>
29
29
 
30
+ <DocDemoBlock title="其他文件类型" card>
31
+ <Demo8 />
32
+ </DocDemoBlock>
33
+
30
34
  <pa-safe-bottom />
31
35
  </template>
32
36
 
@@ -38,6 +42,7 @@ import Demo4 from '../../demos/uploader/demo-4.vue'
38
42
  import Demo5 from '../../demos/uploader/demo-5.vue'
39
43
  import Demo6 from '../../demos/uploader/demo-6.vue'
40
44
  import Demo7 from '../../demos/uploader/demo-7.vue'
45
+ import Demo8 from '../../demos/uploader/demo-8.vue'
41
46
  import DocDemoBlock from '../../doc/doc-demo-block.vue'
42
47
  </script>
43
48
 
@@ -1,10 +1,12 @@
1
1
  import type { ExtractPropTypes, PropType } from 'vue'
2
2
  import { isArray, isNumber, isObject } from '../../utils'
3
3
 
4
+ export type FileMediaType = 'image' | 'video'
5
+ export type FileOtherType = 'word' | 'excel' | 'ppt' | 'pdf' | 'markdown' | 'zip' | 'file'
4
6
  export type FileItem = {
5
7
  name?: string
6
8
  url: string
7
- type?: 'image' | 'video'
9
+ type?: FileMediaType | FileOtherType
8
10
  status?: 'ready' | 'uploading' | 'success' | 'error'
9
11
  deletable?: boolean
10
12
  thumbUrl?: string
@@ -24,6 +24,43 @@
24
24
  overflow: hidden;
25
25
  }
26
26
 
27
+ &-type-word,
28
+ &-type-excel,
29
+ &-type-ppt,
30
+ &-type-pdf,
31
+ &-type-markdown,
32
+ &-type-zip,
33
+ &-type-file {
34
+ display: flex;
35
+ flex-direction: column;
36
+ align-items: center;
37
+ justify-content: center;
38
+ background-color: #f7f8fa;
39
+ font-size: _var(uploader-preview-file-size, 36px);
40
+ color: _var(uploader-preview-file-color, _var(color-black-3));
41
+ text {
42
+ font-size: _var(uploader-preview-file-text-size, 14px);
43
+ }
44
+ }
45
+ &-type-word {
46
+ color: #285898;
47
+ }
48
+ &-type-excel {
49
+ color: #15723b;
50
+ }
51
+ &-type-ppt {
52
+ color: #cd3f2b;
53
+ }
54
+ &-type-pdf {
55
+ color: #b40009;
56
+ }
57
+ &-type-markdown {
58
+ color: #6188bd;
59
+ }
60
+ &-type-zip {
61
+ color: #f2bb3c;
62
+ }
63
+
27
64
  &-delete {
28
65
  position: absolute;
29
66
  top: 0;
@@ -4,14 +4,22 @@
4
4
  <slot v-if="$slots.default" />
5
5
  <template v-else>
6
6
  <view v-for="(file, index) in fileList" :key="index" :class="ns.e('preview')">
7
- <view :class="ns.e('preview-image')" :style="sizeStyle">
7
+ <view
8
+ :class="[ns.e('preview-image'), ns.e(`preview-type-${file.type ?? 'image'}`)]"
9
+ :style="sizeStyle"
10
+ >
8
11
  <ImageComponent
12
+ v-if="!file.type || file.type === 'image' || file.type === 'video'"
9
13
  :src="file.thumbUrl ?? file.url"
10
14
  width="100%"
11
15
  height="100%"
12
16
  mode="aspectFill"
13
17
  @click="onPreview(file, index)"
14
18
  />
19
+ <template v-else>
20
+ <IconComponent :name="(file.type !== 'file' ? `file-` : '') + file.type" />
21
+ <text>{{ file.type }}</text>
22
+ </template>
15
23
  </view>
16
24
  <view
17
25
  v-if="deletable && file.deletable !== false"
@@ -42,7 +50,7 @@ import useNamespace from '../../core/useNamespace'
42
50
  import { getUnitValue } from '../../utils'
43
51
  import IconComponent from '../icon/icon.vue'
44
52
  import ImageComponent from '../image/image.vue'
45
- import type { FileItem } from './props'
53
+ import type { FileItem, FileMediaType } from './props'
46
54
  import { uploaderProps, uploaderEmits } from './props'
47
55
 
48
56
  const ns = useNamespace('uploader')
@@ -129,26 +137,27 @@ const afterRead = (fileList: FileItem[]) => {
129
137
  }
130
138
 
131
139
  const onPreview = (file: FileItem, index: number) => {
132
- if (!props.previewFullImage) return
133
- // #ifdef MP
134
- uni.previewMedia({
135
- sources: props.fileList,
136
- current: index,
137
- fail: () => {
138
- // 前面的API可能存在兼容问题,失败时使用降级方法
139
- uni.previewImage({
140
- urls: props.fileList.map((file) => file.url),
141
- current: index,
142
- })
143
- },
144
- })
145
- // #endif
146
- // #ifndef MP
147
- uni.previewImage({
148
- urls: props.fileList.map((file) => file.url),
149
- current: index,
150
- })
151
- // #endif
140
+ if (props.previewFullImage && ['image', 'video'].includes(file.type ?? 'image')) {
141
+ // #ifdef MP
142
+ uni.previewMedia({
143
+ sources: props.fileList.map((file) => ({ url: file.url, type: file.type as FileMediaType })),
144
+ current: index,
145
+ fail: () => {
146
+ // 前面的API可能存在兼容问题,失败时使用降级方法
147
+ uni.previewImage({
148
+ urls: props.fileList.map((file) => file.url),
149
+ current: index,
150
+ })
151
+ },
152
+ })
153
+ // #endif
154
+ // #ifndef MP
155
+ uni.previewImage({
156
+ urls: props.fileList.map((file) => file.url),
157
+ current: index,
158
+ })
159
+ // #endif
160
+ }
152
161
  emit('click-preview', file, index)
153
162
  }
154
163
 
@@ -0,0 +1,39 @@
1
+ <template>
2
+ <pa-uploader v-model:file-list="fileList" />
3
+ </template>
4
+
5
+ <script setup lang="ts">
6
+ import { ref } from 'vue'
7
+ import type { FileItem } from '../..'
8
+
9
+ const fileList = ref<FileItem[]>([
10
+ {
11
+ url: '',
12
+ type: 'word',
13
+ },
14
+ {
15
+ url: '',
16
+ type: 'excel',
17
+ },
18
+ {
19
+ url: '',
20
+ type: 'ppt',
21
+ },
22
+ {
23
+ url: '',
24
+ type: 'pdf',
25
+ },
26
+ {
27
+ url: '',
28
+ type: 'markdown',
29
+ },
30
+ {
31
+ url: '',
32
+ type: 'zip',
33
+ },
34
+ {
35
+ url: '',
36
+ type: 'file',
37
+ },
38
+ ])
39
+ </script>
package/fonts/.DS_Store CHANGED
Binary file
@@ -1,8 +1,8 @@
1
1
  @font-face {
2
2
  font-family: "pa-icon"; /* Project id 3668565 */
3
- src: url('iconfont.woff2?t=1692684761658') format('woff2'),
4
- url('iconfont.woff?t=1692684761658') format('woff'),
5
- url('iconfont.ttf?t=1692684761658') format('truetype');
3
+ src: url('iconfont.woff2?t=1715567017689') format('woff2'),
4
+ url('iconfont.woff?t=1715567017689') format('woff'),
5
+ url('iconfont.ttf?t=1715567017689') format('truetype');
6
6
  }
7
7
 
8
8
  .pa-icon {
@@ -13,6 +13,38 @@
13
13
  -moz-osx-font-smoothing: grayscale;
14
14
  }
15
15
 
16
+ .pa-icon-refresh:before {
17
+ content: "\e6a4";
18
+ }
19
+
20
+ .pa-icon-file-excel:before {
21
+ content: "\e7b8";
22
+ }
23
+
24
+ .pa-icon-file-pdf:before {
25
+ content: "\e7ba";
26
+ }
27
+
28
+ .pa-icon-file-markdown:before {
29
+ content: "\e7bb";
30
+ }
31
+
32
+ .pa-icon-file-ppt:before {
33
+ content: "\e7bc";
34
+ }
35
+
36
+ .pa-icon-file-word:before {
37
+ content: "\e7bd";
38
+ }
39
+
40
+ .pa-icon-file:before {
41
+ content: "\e7be";
42
+ }
43
+
44
+ .pa-icon-file-zip:before {
45
+ content: "\e7bf";
46
+ }
47
+
16
48
  .pa-icon-order:before {
17
49
  content: "\e66d";
18
50
  }