vxe-pc-ui 3.14.26 → 3.14.28
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/es/date-panel/src/date-panel.js +11 -10
- package/es/date-panel/style.css +4 -0
- package/es/date-panel/style.min.css +1 -1
- package/es/date-range-picker/src/date-range-picker.js +17 -0
- package/es/form/src/form.js +56 -15
- package/es/form/style.css +2 -2
- package/es/form/style.min.css +1 -1
- package/es/radio/style.css +2 -2
- package/es/radio/style.min.css +1 -1
- package/es/select/src/select.js +4 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table-select/src/table-select.js +4 -1
- package/es/tree-select/src/tree-select.js +4 -1
- package/es/ui/index.js +1 -1
- package/es/ui/src/log.js +1 -1
- package/es/upload/src/upload.js +53 -3
- package/es/vxe-date-panel/style.css +4 -0
- package/es/vxe-date-panel/style.min.css +1 -1
- package/es/vxe-form/style.css +2 -2
- package/es/vxe-form/style.min.css +1 -1
- package/es/vxe-radio/style.css +2 -2
- package/es/vxe-radio/style.min.css +1 -1
- package/lib/date-panel/src/date-panel.js +46 -10
- package/lib/date-panel/src/date-panel.min.js +1 -1
- package/lib/date-panel/style/style.css +4 -0
- package/lib/date-panel/style/style.min.css +1 -1
- package/lib/date-range-picker/src/date-range-picker.js +21 -3
- package/lib/date-range-picker/src/date-range-picker.min.js +1 -1
- package/lib/form/src/form.js +64 -19
- package/lib/form/src/form.min.js +1 -1
- package/lib/form/style/style.css +2 -2
- package/lib/form/style/style.min.css +1 -1
- package/lib/index.umd.js +211 -42
- package/lib/index.umd.min.js +1 -1
- package/lib/radio/style/style.css +2 -2
- package/lib/radio/style/style.min.css +1 -1
- package/lib/select/src/select.js +6 -1
- package/lib/select/src/select.min.js +1 -1
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table-select/src/table-select.js +4 -1
- package/lib/table-select/src/table-select.min.js +1 -1
- package/lib/tree-select/src/tree-select.js +4 -1
- package/lib/tree-select/src/tree-select.min.js +1 -1
- package/lib/ui/index.js +1 -1
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/upload/src/upload.js +65 -5
- package/lib/upload/src/upload.min.js +1 -1
- package/lib/vxe-date-panel/style/style.css +4 -0
- package/lib/vxe-date-panel/style/style.min.css +1 -1
- package/lib/vxe-form/style/style.css +2 -2
- package/lib/vxe-form/style/style.min.css +1 -1
- package/lib/vxe-radio/style/style.css +2 -2
- package/lib/vxe-radio/style/style.min.css +1 -1
- package/package.json +1 -1
- package/packages/date-panel/src/date-panel.ts +11 -10
- package/packages/date-range-picker/src/date-range-picker.ts +18 -0
- package/packages/form/src/form.ts +63 -18
- package/packages/form/src/util.ts +1 -1
- package/packages/select/src/select.ts +4 -1
- package/packages/table-select/src/table-select.ts +4 -1
- package/packages/tree-select/src/tree-select.ts +4 -1
- package/packages/upload/src/upload.ts +73 -5
- package/styles/components/date-panel.scss +4 -0
- package/styles/components/form.scss +2 -2
- package/styles/components/radio.scss +2 -2
- package/types/components/date-panel.d.ts +7 -0
- package/types/components/form.d.ts +21 -2
- package/types/components/notice-bar.d.ts +4 -0
- package/types/components/upload.d.ts +36 -1
- /package/es/icon/{iconfont.1780292452483.ttf → iconfont.1780570410811.ttf} +0 -0
- /package/es/icon/{iconfont.1780292452483.woff → iconfont.1780570410811.woff} +0 -0
- /package/es/icon/{iconfont.1780292452483.woff2 → iconfont.1780570410811.woff2} +0 -0
- /package/es/{iconfont.1780292452483.ttf → iconfont.1780570410811.ttf} +0 -0
- /package/es/{iconfont.1780292452483.woff → iconfont.1780570410811.woff} +0 -0
- /package/es/{iconfont.1780292452483.woff2 → iconfont.1780570410811.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1780292452483.ttf → iconfont.1780570410811.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1780292452483.woff → iconfont.1780570410811.woff} +0 -0
- /package/lib/icon/style/{iconfont.1780292452483.woff2 → iconfont.1780570410811.woff2} +0 -0
- /package/lib/{iconfont.1780292452483.ttf → iconfont.1780570410811.ttf} +0 -0
- /package/lib/{iconfont.1780292452483.woff → iconfont.1780570410811.woff} +0 -0
- /package/lib/{iconfont.1780292452483.woff2 → iconfont.1780570410811.woff2} +0 -0
|
@@ -66,6 +66,51 @@ function hideDropTip ($xeUpload: VxeUploadConstructor) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
const handleClearFile = ($xeUpload: VxeUploadConstructor, evnt: Event | null) => {
|
|
70
|
+
const reactData = $xeUpload.reactData
|
|
71
|
+
|
|
72
|
+
const { fileList } = reactData
|
|
73
|
+
const urlProp = $xeUpload.computeUrlProp
|
|
74
|
+
const rest: Promise<{
|
|
75
|
+
url: string
|
|
76
|
+
status: boolean
|
|
77
|
+
}>[] = []
|
|
78
|
+
XEUtils.lastEach(fileList, (item, index) => {
|
|
79
|
+
rest.push(
|
|
80
|
+
$xeUpload.removeFileEvent(evnt, item, index).then(status => {
|
|
81
|
+
return { url: item[urlProp], status }
|
|
82
|
+
})
|
|
83
|
+
)
|
|
84
|
+
})
|
|
85
|
+
return Promise.all(rest)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function handleRemoveFile ($xeUpload: VxeUploadConstructor, evnt: Event | null, urlOrItem: string | VxeUploadDefines.FileObjItem | string[] | VxeUploadDefines.FileObjItem[] | null) {
|
|
89
|
+
const reactData = $xeUpload.reactData
|
|
90
|
+
|
|
91
|
+
const { fileList } = reactData
|
|
92
|
+
const urlProp = $xeUpload.computeUrlProp
|
|
93
|
+
const urls = (XEUtils.isArray(urlOrItem) ? urlOrItem : [urlOrItem])
|
|
94
|
+
const rest: Promise<{
|
|
95
|
+
url: string
|
|
96
|
+
status: boolean
|
|
97
|
+
}>[] = []
|
|
98
|
+
urls.forEach((obj: any) => {
|
|
99
|
+
if (obj) {
|
|
100
|
+
const url = XEUtils.isString(obj) ? obj : obj[urlProp]
|
|
101
|
+
const index = XEUtils.findIndexOf(fileList, fileItem => fileItem[urlProp] === url)
|
|
102
|
+
if (index > -1) {
|
|
103
|
+
rest.push(
|
|
104
|
+
$xeUpload.removeFileEvent(evnt, fileList[index], index).then(status => {
|
|
105
|
+
return { url: url, status }
|
|
106
|
+
})
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
return Promise.all(rest)
|
|
112
|
+
}
|
|
113
|
+
|
|
69
114
|
function createReactData (): UploadReactData {
|
|
70
115
|
return {
|
|
71
116
|
isDragUploadStatus: false,
|
|
@@ -528,6 +573,16 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
528
573
|
const $xeUpload = this
|
|
529
574
|
return $xeUpload.handleChoose(null)
|
|
530
575
|
},
|
|
576
|
+
clear () {
|
|
577
|
+
const $xeUpload = this
|
|
578
|
+
|
|
579
|
+
return handleClearFile($xeUpload, null)
|
|
580
|
+
},
|
|
581
|
+
clearByEvent (evnt: Event) {
|
|
582
|
+
const $xeUpload = this
|
|
583
|
+
|
|
584
|
+
return handleClearFile($xeUpload, evnt)
|
|
585
|
+
},
|
|
531
586
|
getPendingFiles () {
|
|
532
587
|
const $xeUpload = this
|
|
533
588
|
const reactData = $xeUpload.reactData
|
|
@@ -611,6 +666,16 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
611
666
|
}
|
|
612
667
|
return $xeUpload.$nextTick()
|
|
613
668
|
},
|
|
669
|
+
remove (urlOrItem: string | string[] | VxeUploadDefines.FileObjItem | VxeUploadDefines.FileObjItem[] | null) {
|
|
670
|
+
const $xeUpload = this
|
|
671
|
+
|
|
672
|
+
return handleRemoveFile($xeUpload, null, urlOrItem)
|
|
673
|
+
},
|
|
674
|
+
removeByEvent (evnt: Event, urlOrItem: string | string[] | VxeUploadDefines.FileObjItem | VxeUploadDefines.FileObjItem[] | null) {
|
|
675
|
+
const $xeUpload = this
|
|
676
|
+
|
|
677
|
+
return handleRemoveFile($xeUpload, evnt, urlOrItem)
|
|
678
|
+
},
|
|
614
679
|
getFieldKey (item: VxeUploadDefines.FileObjItem) {
|
|
615
680
|
const $xeUpload = this
|
|
616
681
|
|
|
@@ -1040,7 +1105,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
1040
1105
|
// 错误文件类型
|
|
1041
1106
|
})
|
|
1042
1107
|
},
|
|
1043
|
-
handleRemoveEvent (evnt:
|
|
1108
|
+
handleRemoveEvent (evnt: Event | null, item: VxeUploadDefines.FileObjItem, index: number) {
|
|
1044
1109
|
const $xeUpload = this
|
|
1045
1110
|
const reactData = $xeUpload.reactData
|
|
1046
1111
|
const $xeForm = $xeUpload.$xeForm
|
|
@@ -1051,17 +1116,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
1051
1116
|
$xeUpload.handleChange(fileList)
|
|
1052
1117
|
// 自动更新校验状态
|
|
1053
1118
|
if ($xeForm && formItemInfo) {
|
|
1054
|
-
$xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, fileList)
|
|
1119
|
+
$xeForm.triggerItemEvent(evnt || { type: 'remove' }, formItemInfo.itemConfig.field, fileList)
|
|
1120
|
+
}
|
|
1121
|
+
if (evnt) {
|
|
1122
|
+
$xeUpload.dispatchEvent('remove', { option: item }, evnt)
|
|
1055
1123
|
}
|
|
1056
|
-
$xeUpload.dispatchEvent('remove', { option: item }, evnt)
|
|
1057
1124
|
},
|
|
1058
|
-
removeFileEvent (evnt:
|
|
1125
|
+
removeFileEvent (evnt: Event | null, item: VxeUploadDefines.FileObjItem, index: number) {
|
|
1059
1126
|
const $xeUpload = this
|
|
1060
1127
|
const props = $xeUpload
|
|
1061
1128
|
|
|
1062
1129
|
const beforeRemoveFn = props.beforeRemoveMethod || getConfig().upload.beforeRemoveMethod
|
|
1063
1130
|
const removeFn = props.removeMethod || getConfig().upload.removeMethod
|
|
1064
|
-
Promise.resolve(
|
|
1131
|
+
return Promise.resolve(
|
|
1065
1132
|
beforeRemoveFn
|
|
1066
1133
|
? beforeRemoveFn({
|
|
1067
1134
|
$upload: $xeUpload,
|
|
@@ -1085,6 +1152,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
1085
1152
|
} else {
|
|
1086
1153
|
$xeUpload.dispatchEvent('remove-fail', { option: item }, evnt)
|
|
1087
1154
|
}
|
|
1155
|
+
return status
|
|
1088
1156
|
})
|
|
1089
1157
|
},
|
|
1090
1158
|
handleDownloadEvent (evnt: MouseEvent, item: VxeUploadDefines.FileObjItem) {
|
|
@@ -187,6 +187,7 @@
|
|
|
187
187
|
flex-direction: row;
|
|
188
188
|
}
|
|
189
189
|
.vxe-date-panel--view-item {
|
|
190
|
+
position: relative;
|
|
190
191
|
padding: 0.2em;
|
|
191
192
|
&.is--prev,
|
|
192
193
|
&.is--next {
|
|
@@ -246,6 +247,9 @@
|
|
|
246
247
|
}
|
|
247
248
|
}
|
|
248
249
|
}
|
|
250
|
+
&.is--range-selected {
|
|
251
|
+
background-color: var(--vxe-ui-font-primary-tinge-color);
|
|
252
|
+
}
|
|
249
253
|
&.is--range-disabled {
|
|
250
254
|
.vxe-date-panel--view-item-inner {
|
|
251
255
|
color: var(--vxe-ui-input-disabled-color);
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
pointer-events: auto;
|
|
140
140
|
}
|
|
141
141
|
.vxe-form-item--valid-error-theme-beautify {
|
|
142
|
-
padding: 0.
|
|
142
|
+
padding: 0.15em 0.6em 0.2em 0.6em;
|
|
143
143
|
color: #fff;
|
|
144
144
|
background-color: var(--vxe-ui-status-error-color);
|
|
145
145
|
.vxe-form-item--valid-error-msg {
|
|
@@ -211,7 +211,7 @@
|
|
|
211
211
|
box-shadow: 2px 2px 4px -2px rgba(0,0,0,.5);
|
|
212
212
|
}
|
|
213
213
|
.vxe-form-item--valid-error-icon-theme-beautify {
|
|
214
|
-
padding: 0.
|
|
214
|
+
padding: 0.15em 0.6em 0.2em 0.6em;
|
|
215
215
|
color: #fff;
|
|
216
216
|
background-color: var(--vxe-ui-status-error-color);
|
|
217
217
|
.vxe-form-item--valid-error-msg {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/*radio-group*/
|
|
4
4
|
.vxe-radio-group {
|
|
5
|
-
display: inline-
|
|
5
|
+
display: inline-flex;
|
|
6
6
|
vertical-align: middle;
|
|
7
7
|
line-height: 1;
|
|
8
8
|
font-size: 0;
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
/*radio*/
|
|
17
17
|
.vxe-radio {
|
|
18
|
-
display: inline-
|
|
18
|
+
display: inline-flex;
|
|
19
19
|
vertical-align: middle;
|
|
20
20
|
white-space: nowrap;
|
|
21
21
|
line-height: 1;
|
|
@@ -19,6 +19,12 @@ export namespace VxeDatePanelPropTypes {
|
|
|
19
19
|
export type Size = VxeComponentSizeType
|
|
20
20
|
export type ModelValue = string | number | Date | null
|
|
21
21
|
export type ClassName = string
|
|
22
|
+
export type CellClassName = string | ((params: {
|
|
23
|
+
$datePanel: VxeDatePanelConstructor
|
|
24
|
+
type: string
|
|
25
|
+
viewType: VxeDatePanelDefines.DatePanelType
|
|
26
|
+
date: Date
|
|
27
|
+
}) => string)
|
|
22
28
|
export type Type = 'date' | 'time' | 'datetime' | 'week' | 'month' | 'quarter' | 'year'
|
|
23
29
|
export type Multiple = boolean
|
|
24
30
|
export type LimitCount = string | number
|
|
@@ -68,6 +74,7 @@ export interface VxeDatePanelProps {
|
|
|
68
74
|
size?: VxeDatePanelPropTypes.Size
|
|
69
75
|
value?: VxeDatePanelPropTypes.ModelValue
|
|
70
76
|
className?: VxeDatePanelPropTypes.ClassName
|
|
77
|
+
cellClassName?: VxeDatePanelPropTypes.CellClassName
|
|
71
78
|
type?: VxeDatePanelPropTypes.Type
|
|
72
79
|
multiple?: VxeDatePanelPropTypes.Multiple
|
|
73
80
|
limitCount?: VxeDatePanelPropTypes.LimitCount
|
|
@@ -161,7 +161,7 @@ export interface FormPrivateComputed {
|
|
|
161
161
|
}
|
|
162
162
|
export interface VxeFormPrivateComputed extends FormPrivateComputed { }
|
|
163
163
|
|
|
164
|
-
export interface FormReactData {
|
|
164
|
+
export interface FormReactData<D = any> {
|
|
165
165
|
collapseAll: boolean
|
|
166
166
|
staticItems: any[]
|
|
167
167
|
formItems: VxeFormDefines.ItemInfo[]
|
|
@@ -182,6 +182,8 @@ export interface FormInternalData {
|
|
|
182
182
|
label?: any
|
|
183
183
|
}
|
|
184
184
|
}>
|
|
185
|
+
fullItemIdData: Record<string, VxeFormDefines.ItemCacheItem>
|
|
186
|
+
fullItemFieldData: Record<string, VxeFormDefines.ItemCacheItem>
|
|
185
187
|
}
|
|
186
188
|
|
|
187
189
|
export interface FormMethods<D = any> {
|
|
@@ -221,6 +223,18 @@ export interface FormMethods<D = any> {
|
|
|
221
223
|
* 获取表单项列表
|
|
222
224
|
*/
|
|
223
225
|
getItems(): VxeFormDefines.ItemInfo[]
|
|
226
|
+
/**
|
|
227
|
+
* 加载表单项
|
|
228
|
+
*/
|
|
229
|
+
loadItems(items: VxeFormPropTypes.Items | VxeFormDefines.ItemInfo[]): Promise<any>
|
|
230
|
+
/**
|
|
231
|
+
* 隐藏指定项
|
|
232
|
+
*/
|
|
233
|
+
hideItem(fieldOrItems?: VxeFormItemPropTypes.Field | VxeFormItemPropTypes.Field[] | VxeFormDefines.ItemInfo | VxeFormDefines.ItemInfo[] | null): Promise<void>
|
|
234
|
+
/**
|
|
235
|
+
* 显示指定项
|
|
236
|
+
*/
|
|
237
|
+
showItem(fieldOrItems?: VxeFormItemPropTypes.Field | VxeFormItemPropTypes.Field[] | VxeFormDefines.ItemInfo | VxeFormDefines.ItemInfo[] | null): Promise<void>
|
|
224
238
|
/**
|
|
225
239
|
* 根据列的字段名获取表单项
|
|
226
240
|
* @param field 字段名
|
|
@@ -228,7 +242,7 @@ export interface FormMethods<D = any> {
|
|
|
228
242
|
*/
|
|
229
243
|
getItemByField(field: VxeFormItemPropTypes.Field): VxeFormDefines.ItemInfo | null
|
|
230
244
|
/**
|
|
231
|
-
*
|
|
245
|
+
* 手动关闭 tooltip 提示
|
|
232
246
|
*/
|
|
233
247
|
closeTooltip(): Promise<any>
|
|
234
248
|
/**
|
|
@@ -288,6 +302,11 @@ export type VxeFormEmits = [
|
|
|
288
302
|
]
|
|
289
303
|
|
|
290
304
|
export namespace VxeFormDefines {
|
|
305
|
+
export interface ItemCacheItem {
|
|
306
|
+
item: ItemInfo
|
|
307
|
+
index: number
|
|
308
|
+
items: ItemInfo[]
|
|
309
|
+
}
|
|
291
310
|
export class ItemInfo {
|
|
292
311
|
id: string
|
|
293
312
|
|
|
@@ -85,10 +85,14 @@ export namespace VxeNoticeBarEvents {
|
|
|
85
85
|
|
|
86
86
|
export namespace VxeNoticeBarSlotTypes {
|
|
87
87
|
export interface DefaultSlotParams {}
|
|
88
|
+
export interface PrefixSlotParams {}
|
|
89
|
+
export interface SuffixSlotParams {}
|
|
88
90
|
}
|
|
89
91
|
|
|
90
92
|
export interface VxeNoticeBarSlots {
|
|
91
93
|
default?: (params: VxeNoticeBarSlotTypes.DefaultSlotParams) => any
|
|
94
|
+
prefix?: (params: VxeNoticeBarSlotTypes.PrefixSlotParams) => any
|
|
95
|
+
suffix?: (params: VxeNoticeBarSlotTypes.SuffixSlotParams) => any
|
|
92
96
|
}
|
|
93
97
|
|
|
94
98
|
export const NoticeBar: typeof VxeNoticeBar
|
|
@@ -212,6 +212,7 @@ export interface VxeUploadProps {
|
|
|
212
212
|
}
|
|
213
213
|
|
|
214
214
|
export interface UploadPrivateComputed {
|
|
215
|
+
computeUrlProp: string
|
|
215
216
|
}
|
|
216
217
|
export interface VxeUploadPrivateComputed extends UploadPrivateComputed { }
|
|
217
218
|
|
|
@@ -251,6 +252,20 @@ export interface UploadMethods {
|
|
|
251
252
|
* 用于 auto-upload 模式,手动调用上传附件;如果传 true,这包含未上传和上传失败的都会重新提交
|
|
252
253
|
*/
|
|
253
254
|
submit(isFull?: boolean): Promise<void>
|
|
255
|
+
/**
|
|
256
|
+
* 清除所有文件
|
|
257
|
+
*/
|
|
258
|
+
clear(): Promise<{
|
|
259
|
+
url: string
|
|
260
|
+
status: boolean
|
|
261
|
+
}[]>
|
|
262
|
+
/**
|
|
263
|
+
* 区别就是会触发对应的事件
|
|
264
|
+
*/
|
|
265
|
+
clearByEvent(event: Event): Promise<{
|
|
266
|
+
url: string
|
|
267
|
+
status: boolean
|
|
268
|
+
}[]>
|
|
254
269
|
/**
|
|
255
270
|
* 获取更多弹窗的可视状态
|
|
256
271
|
*/
|
|
@@ -267,8 +282,28 @@ export interface UploadMethods {
|
|
|
267
282
|
* 关闭更多弹窗
|
|
268
283
|
*/
|
|
269
284
|
closeMore(): Promise<void>
|
|
285
|
+
/**
|
|
286
|
+
* 删除指定文件
|
|
287
|
+
*/
|
|
288
|
+
remove(urlOrItem: string | VxeUploadDefines.FileObjItem | string[] | VxeUploadDefines.FileObjItem[] | null): Promise<{
|
|
289
|
+
url: string
|
|
290
|
+
status: boolean
|
|
291
|
+
}[]>
|
|
292
|
+
/**
|
|
293
|
+
* 区别就是会触发对应的事件
|
|
294
|
+
*/
|
|
295
|
+
removeByEvent(event: Event, urlOrItem: string | VxeUploadDefines.FileObjItem | string[] | VxeUploadDefines.FileObjItem[] | null): Promise<{
|
|
296
|
+
url: string
|
|
297
|
+
status: boolean
|
|
298
|
+
}[]>
|
|
299
|
+
}
|
|
300
|
+
export interface VxeUploadMethods extends UploadMethods {
|
|
301
|
+
/**
|
|
302
|
+
* 内部方法
|
|
303
|
+
* @private
|
|
304
|
+
*/
|
|
305
|
+
removeFileEvent(evnt: Event | null, item: VxeUploadDefines.FileObjItem, index: number): Promise<any>
|
|
270
306
|
}
|
|
271
|
-
export interface VxeUploadMethods extends UploadMethods { }
|
|
272
307
|
|
|
273
308
|
export interface UploadPrivateMethods { }
|
|
274
309
|
export interface VxeUploadPrivateMethods extends UploadPrivateMethods { }
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|