Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wms-app
Project
Project
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
Graph
比较
统计图
议题
0
议题
0
列表
看板
标记
Milestones
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
刘旭
wms-app
Commits
5eae5d40
提交
5eae5d40
authored
6月 21, 2023
作者:
刘旭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
同步最新代码
上级
b7a98f8c
隐藏空白字符变更
内嵌
并排
正在显示
47 个修改的文件
包含
8368 行增加
和
314 行删除
+8368
-314
apply.ts
src/api/apply.ts
+10
-3
uniTable.vue
src/components/uniTable.vue
+73
-0
manifest.json
src/manifest.json
+1
-1
pages.json
src/pages.json
+7
-0
FormListItem.vue
src/pages/apply/components/FormListItem.vue
+1
-4
optionsMenuPopup.vue
src/pages/apply/components/optionsMenuPopup.vue
+74
-0
formDetail.vue
src/pages/apply/formDetail.vue
+55
-25
optionsMenu.vue
src/pages/apply/optionsMenu.vue
+124
-0
changelog.md
src/uni_modules/uni-datetime-picker/changelog.md
+140
-0
calendar-item.vue
...e-picker/components/uni-datetime-picker/calendar-item.vue
+177
-0
calendar.vue
...tetime-picker/components/uni-datetime-picker/calendar.vue
+929
-0
en.json
...tetime-picker/components/uni-datetime-picker/i18n/en.json
+22
-0
index.js
...etime-picker/components/uni-datetime-picker/i18n/index.js
+8
-0
zh-Hans.json
...e-picker/components/uni-datetime-picker/i18n/zh-Hans.json
+23
-0
zh-Hant.json
...e-picker/components/uni-datetime-picker/i18n/zh-Hant.json
+23
-0
time-picker.vue
...ime-picker/components/uni-datetime-picker/time-picker.vue
+934
-0
uni-datetime-picker.vue
...er/components/uni-datetime-picker/uni-datetime-picker.vue
+1032
-0
util.js
...ni-datetime-picker/components/uni-datetime-picker/util.js
+454
-0
package.json
src/uni_modules/uni-datetime-picker/package.json
+87
-0
readme.md
src/uni_modules/uni-datetime-picker/readme.md
+22
-0
changelog.md
src/uni_modules/uni-icons/changelog.md
+22
-0
icons.js
src/uni_modules/uni-icons/components/uni-icons/icons.js
+1169
-0
uni-icons.vue
src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
+96
-0
uniicons.css
src/uni_modules/uni-icons/components/uni-icons/uniicons.css
+663
-0
uniicons.ttf
src/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
+0
-0
package.json
src/uni_modules/uni-icons/package.json
+87
-0
readme.md
src/uni_modules/uni-icons/readme.md
+8
-0
_variables.scss
src/uni_modules/uni-scss/styles/setting/_variables.scss
+95
-111
changelog.md
src/uni_modules/uni-table/changelog.md
+27
-0
uni-table.vue
src/uni_modules/uni-table/components/uni-table/uni-table.vue
+455
-0
uni-tbody.vue
src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue
+29
-0
uni-td.vue
src/uni_modules/uni-table/components/uni-td/uni-td.vue
+90
-0
filter-dropdown.vue
...i_modules/uni-table/components/uni-th/filter-dropdown.vue
+511
-0
uni-th.vue
src/uni_modules/uni-table/components/uni-th/uni-th.vue
+285
-0
uni-thead.vue
src/uni_modules/uni-table/components/uni-thead/uni-thead.vue
+129
-0
table-checkbox.vue
...ni_modules/uni-table/components/uni-tr/table-checkbox.vue
+179
-0
uni-tr.vue
src/uni_modules/uni-table/components/uni-tr/uni-tr.vue
+171
-0
en.json
src/uni_modules/uni-table/i18n/en.json
+9
-0
es.json
src/uni_modules/uni-table/i18n/es.json
+9
-0
fr.json
src/uni_modules/uni-table/i18n/fr.json
+9
-0
index.js
src/uni_modules/uni-table/i18n/index.js
+12
-0
zh-Hans.json
src/uni_modules/uni-table/i18n/zh-Hans.json
+9
-0
zh-Hant.json
src/uni_modules/uni-table/i18n/zh-Hant.json
+9
-0
package.json
src/uni_modules/uni-table/package.json
+84
-0
readme.md
src/uni_modules/uni-table/readme.md
+13
-0
print.ts
src/utils/print.ts
+0
-169
request.ts
src/utils/request.ts
+2
-1
没有找到文件。
src/api/apply.ts
浏览文件 @
5eae5d40
...
...
@@ -13,7 +13,7 @@ export const getMetadataList = () => request('/lowcodeplatform-system/center/met
// 获取元数据
export
const
getMetadata
=
(
formId
:
string
)
=>
request
(
'/lowcodeplatform-system/center/metadata/detail'
,
'GET'
,
{
formId
});
export
const
getUserParameter
=
(
formId
:
string
)
=>
request
(
'/lowcodeplatform-system/center/business/getUserParameter'
,
'GET'
,
{
formId
});
...
...
@@ -38,4 +38,12 @@ export const getByBillNo = (data: any) =>
// 获取条码规则
export
const
getAnalysis
=
(
data
:
any
)
=>
request
(
'/wms-system/barcode/analysis'
,
'GET'
,
data
);
\ No newline at end of file
request
(
'/wms-system/barcode/analysis'
,
'GET'
,
data
);
// 获取规则选单
export
const
getRuleSelection
=
(
lowFormId
:
string
)
=>
request
(
'/lowcodeplatform-system/center/bill/transform/rule/selection'
,
'GET'
,
{
lowFormId
});
// 获取规则选单
export
const
changeDataById
=
(
data
:
any
)
=>
request
(
'/lowcodeplatform-system/center/bill/transform/change/databyid'
,
'POST'
,
data
);
src/components/uniTable.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-container"
>
<uni-table
ref=
"tableRef"
:loading=
"tableState.loading"
border
stripe
emptyText=
"暂无更多数据"
>
<uni-tr>
<uni-th
class=
""
width=
"70"
align=
"center"
>
操作
</uni-th>
<uni-th
v-for=
"(item, index) in fieldData"
:key=
"index"
width=
"200"
align=
"center"
>
{{
item
.
fieldName
}}
</uni-th>
</uni-tr>
<uni-tr
v-for=
"(item, index) in data"
:key=
"index"
>
<uni-td>
<slot
name=
"options"
></slot>
</uni-td>
<uni-td
v-for=
"(res, index) in fieldData"
:key=
"index"
align=
"center"
class=
"unitd"
>
{{
item
[
res
.
key
]
}}
</uni-td>
</uni-tr>
</uni-table>
</view>
</
template
>
<
script
setup
lang=
'ts'
>
import
{
ref
,
reactive
}
from
'vue'
const
props
=
defineProps
({
data
:
{
type
:
Array
,
default
:
[]
}
as
any
,
fieldData
:
{
type
:
Array
,
default
:
[]
}
as
any
})
const
tableState
=
reactive
({
searchVal
:
''
,
loading
:
false
,
selectedIndexs
:
[]
})
const
tableRef
=
ref
()
// 分页触发
const
change
=
(
e
:
any
)
=>
{
tableRef
.
value
.
table
.
clearSelection
()
tableState
.
selectedIndexs
.
length
=
0
}
// 搜索
const
search
=
()
=>
{
// tableState.getData(1, tableState.searchVal)
}
defineExpose
({
change
})
</
script
>
<
style
lang=
"scss"
scoped
>
/* #ifndef H5 */
/* page {
padding-top: 85px;
} */
/* #endif */
.uni-group
{
display
:
flex
;
align-items
:
center
;
}
.unitd
{
overflow
:
hidden
;
white-space
:
nowrap
;
text-overflow
:
ellipsis
;
width
:
200rpx
;
}
</
style
>
\ No newline at end of file
src/manifest.json
浏览文件 @
5eae5d40
{
"name"
:
"
pda
测试"
,
"name"
:
"
wms
测试"
,
"appid"
:
"__UNI__6D85B85"
,
"description"
:
""
,
"versionName"
:
"1.0.1"
,
...
...
src/pages.json
浏览文件 @
5eae5d40
...
...
@@ -62,6 +62,13 @@
"navigationStyle"
:
"custom"
,
"navigationBarBackgroundColor"
:
"#f6f6f6"
}
},
{
"path"
:
"pages/apply/optionsMenu"
,
"style"
:
{
"navigationStyle"
:
"custom"
,
"navigationBarBackgroundColor"
:
"#f6f6f6"
}
}
],
"tabBar"
:
{
...
...
src/pages/apply/components/FormListItem.vue
浏览文件 @
5eae5d40
...
...
@@ -13,10 +13,6 @@
<u-button
type=
"primary"
size=
"mini"
@
tap=
"handlePrint(res)"
>
打印
</u-button>
</u-divider>
</view>
<view
style=
"margin-top:4%; display: flex; flex-direction: row;"
>
<canvas
canvas-id=
"edit_area_canvas"
:style=
"
{ width: state.canvasWidth + 'px', height: state.canvasHeight + 'px' }">
</canvas>
</view>
</
template
>
<
script
setup
lang=
"ts"
>
...
...
@@ -60,6 +56,7 @@ const handlePrint = async (row: any) => {
let
printData
=
[]
as
any
[]
if
(
formId
==
'WMS_Receive'
)
{
const
{
data
:
serialList
}
=
await
getByBillNo
({
billNo
,
formId
})
console
.
log
(
serialList
);
if
(
serialList
.
data
.
length
===
0
)
return
uni
.
showToast
({
title
:
'该编码下无序列号'
,
icon
:
'none'
...
...
src/pages/apply/components/optionsMenuPopup.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<u-popup
v-model=
"props.modelValue"
mode=
"center"
closeable
@
close=
"handleClose"
>
<view
class=
"center-popup"
>
<view
class=
"content"
>
<view
class=
"title"
>
选单
</view>
<u-radio-group
v-model=
"radioValue"
>
<u-radio
v-for=
"(item, index) in list"
:key=
"index"
:name=
"item.upFormId"
>
{{
item
.
upFormName
}}
</u-radio>
</u-radio-group>
</view>
<view
class=
"footer"
>
<u-button
type=
"primary"
style=
"width: 70%"
@
tap=
"onConfirm"
>
确定
</u-button>
</view>
</view>
</u-popup>
</
template
>
<
script
setup
lang=
'ts'
>
import
{
ref
}
from
'vue'
const
props
=
defineProps
({
modelValue
:
{
type
:
Boolean
,
detault
:
false
},
list
:
{
type
:
Array
,
default
:
[]
}
as
any
})
const
emits
=
defineEmits
([
'update:modelValue'
,
'radioConfirm'
])
const
radioValue
=
ref
()
const
onConfirm
=
()
=>
{
emits
(
'radioConfirm'
,
radioValue
.
value
)
}
const
handleClose
=
()
=>
{
emits
(
'update:modelValue'
,
false
)
}
defineExpose
({
radioValue
})
</
script
>
<
style
lang=
"scss"
scoped
>
.center-popup
{
padding
:
40rpx
40rpx
;
min-height
:
500rpx
;
width
:
500rpx
;
display
:
flex
;
flex-direction
:
column
;
justify-content
:
space-between
;
.content
{
.title
{
font-size
:
32rpx
;
margin-bottom
:
20rpx
;
}
}
.footer
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
}
</
style
>
\ No newline at end of file
src/pages/apply/formDetail.vue
浏览文件 @
5eae5d40
<
template
>
<vk-header
:title=
"title"
back-icon-name=
"nav-back"
background=
"#3cbafd"
/>
<!--
<view
style=
"display: flex;"
>
-->
<!--
<button
@
tap=
"initSerialNumberData(
{ serialNumber: 'A043', curFormId: 'WMS_UpStock' })">A3031
</button>
-->
<!--
<button
@
tap=
"initSerialNumberData(
{ serialNumber: 'A033', curFormId: 'WMS_InStock' })">A3033
</button>
<button
@
tap=
"initSerialNumberData(
{ serialNumber: 'A035', curFormId: 'WMS_InStock' })">A3035
</button>
<button
@
tap=
"initSerialNumberData(
{ serialNumber: 'A037', curFormId: 'WMS_InStock' })">A3037
</button>
-->
<!--
</view>
-->
<!--
<button
@
tap=
"initSerialNumberData(
{ serialNumber: 'A087', curFormId: 'WMS_InStock' })">A087
</button>
-->
<view
class=
"header"
>
<view
class=
"scan-input"
>
<scanInput
:inputValue=
"inputValue"
/>
...
...
@@ -84,31 +78,47 @@
<u-action-sheet
:list=
"sheetList"
:cancel-btn=
"false"
v-model=
"sheetShow"
@
click=
"sheetClick"
/>
<u-modal
v-model=
"modelData.show"
width=
"300"
:content=
"modelData.content"
show-cancel-button
@
confirm=
"modelConfirm"
/>
<options-menu-popup
v-model=
"optionsMenuShow"
ref=
"optionsMenuRef"
:list=
"optionsMenuList"
@
radioConfirm=
"radioConfirm"
/>
</
template
>
<
script
setup
lang=
"ts"
>
import
{
nextTick
,
ref
}
from
'vue'
;
import
{
onLoad
}
from
'@dcloudio/uni-app'
;
import
{
getMetadata
,
getDataBySerialNumber
,
createBusiness
,
getAnalysis
}
from
'@/api/apply'
;
import
{
getMetadata
,
getDataBySerialNumber
,
createBusiness
,
getAnalysis
,
getRuleSelection
}
from
'@/api/apply'
;
import
vkHeader
from
'@/components/header/index.vue'
;
import
detailForm
from
'./components/detailForm.vue'
;
import
scanInput
from
'./components/scanInput.vue'
;
import
optionsMenuPopup
from
'./components/optionsMenuPopup.vue'
;
const
sheetShow
=
ref
(
false
);
const
optionsMenuShow
=
ref
(
false
);
const
list
=
ref
([]
as
any
);
const
optionsMenuList
=
ref
([]
as
any
);
const
optionsMenuRef
=
ref
([]
as
any
);
const
saveList
=
ref
([]
as
any
)
const
metadata
=
ref
();
const
metadataList
=
ref
([]
as
any
);
const
pageData
=
ref
();
const
title
=
ref
();
const
inputValue
=
ref
(
''
);
const
sheetList
=
ref
([{
text
:
'查询'
},
{
text
:
'清空'
}]);
const
sheetList
=
ref
([{
text
:
'查询'
},
{
text
:
'清空'
},
{
text
:
'选单'
}]);
const
modelData
=
ref
({
content
:
'确认提交?'
,
show
:
false
,
});
const
sheetShow
=
ref
(
false
);
const
list
=
ref
([]
as
any
);
const
saveList
=
ref
([]
as
any
)
onLoad
(()
=>
{
pageData
.
value
=
JSON
.
parse
(
uni
.
getStorageSync
(
'pageData'
)
as
any
);
title
.
value
=
pageData
.
value
.
title
;
init
();
});
const
handleInput
=
async
(
e
:
any
)
=>
{
let
barcodeList
=
uni
.
getStorageSync
(
'barcodeList'
)
...
...
@@ -152,9 +162,25 @@ const sheetClick = (index: number) => {
case
1
:
console
.
log
(
'撤销'
);
break
;
case
2
:
optionsMenu
()
optionsMenuShow
.
value
=
true
break
;
}
};
// 选单,相当于下推的某个前一个步骤
const
optionsMenu
=
async
()
=>
{
const
{
permTag
:
formId
}
=
JSON
.
parse
(
uni
.
getStorageSync
(
'pageData'
));
const
{
data
:
res
}
=
await
getRuleSelection
(
formId
)
if
(
res
.
code
===
200
)
{
console
.
log
(
res
.
data
);
optionsMenuList
.
value
=
res
.
data
.
records
optionsMenuRef
.
value
.
radioValue
=
optionsMenuList
.
value
[
0
]?.
upFormId
||
''
}
}
const
modelConfirm
=
async
()
=>
{
if
(
saveList
.
value
.
length
===
0
)
return
uni
.
showToast
({
title
:
'请先完成扫描'
,
...
...
@@ -223,14 +249,6 @@ const mergeList = (list: any[]) => {
return
data
;
}
onLoad
(()
=>
{
pageData
.
value
=
JSON
.
parse
(
uni
.
getStorageSync
(
'pageData'
)
as
any
);
title
.
value
=
pageData
.
value
.
title
;
init
();
});
const
metadata
=
ref
();
const
metadataList
=
ref
([]
as
any
);
const
initSerialNumberData
=
async
(
data
:
any
)
=>
{
console
.
log
(
data
,
'sss'
);
...
...
@@ -313,6 +331,8 @@ const filterList = (list: any[]) => {
};
const
baseDataFilter
=
(
list
:
any
[],
baseList
:
any
[])
=>
{
console
.
log
(
list
,
baseList
);
let
mobileList
=
[]
as
any
[];
let
dataList
=
[]
as
any
[];
const
recursiveFilter
=
(
item
:
any
)
=>
{
...
...
@@ -339,14 +359,16 @@ const baseDataFilter = (list: any[], baseList: any[]) => {
mobileList
=
[...
mobileList
,
item
];
};
list
.
forEach
(
item
=>
recursiveFilter
(
item
));
console
.
log
(
mobileList
,
'mobileList'
);
for
(
const
k
in
baseList
)
{
mobileList
.
map
((
item
:
any
)
=>
{
if
(
item
.
options
.
remoteFunc
===
k
)
{
let
obj
=
{}
as
any
const
label
=
item
.
options
.
props
.
label
const
value
=
item
.
options
.
props
.
value
if
(
baseList
[
k
][
0
][
label
])
obj
[
'label'
]
=
baseList
[
k
][
0
][
label
]
if
(
baseList
[
k
][
0
][
value
])
obj
[
'value'
]
=
baseList
[
k
][
0
][
value
]
if
(
baseList
[
k
]
.
length
&&
baseList
[
k
]
[
0
][
label
])
obj
[
'label'
]
=
baseList
[
k
][
0
][
label
]
if
(
baseList
[
k
]
.
length
&&
baseList
[
k
]
[
0
][
value
])
obj
[
'value'
]
=
baseList
[
k
][
0
][
value
]
if
(
obj
)
dataList
.
push
(
obj
)
}
})
...
...
@@ -359,6 +381,13 @@ const closeButton = (index: number) => {
saveList
.
value
.
splice
(
index
,
1
)
}
const
radioConfirm
=
(
upFormId
:
string
)
=>
{
if
(
!
upFormId
)
return
optionsMenuShow
.
value
=
false
const
list
=
optionsMenuList
.
value
.
filter
((
item
:
any
)
=>
item
.
upFormId
===
upFormId
)
uni
.
navigateTo
({
url
:
'/pages/apply/optionsMenu?list='
+
encodeURIComponent
(
JSON
.
stringify
(
list
[
0
]))
})
}
const
reset
=
()
=>
{
saveList
.
value
=
[]
inputValue
.
value
=
''
...
...
@@ -471,6 +500,7 @@ const reset = () => {
position
:
fixed
;
right
:
0
;
top
:
76%
;
z-index
:
999
;
/* #ifdef APP-PLUS */
width
:
100rpx
;
height
:
120rpx
;
...
...
src/pages/apply/optionsMenu.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<headers
title=
'选单'
back-icon-name=
"nav-back"
background=
"#3cbafd"
/>
<view>
<view
class=
"card"
v-for=
"(res, r) in businessList"
:key=
"r"
@
tap=
"optionsMenu(res)"
>
<block
v-for=
"(item, index) of res.arr"
:key=
"index"
>
<view
style=
"padding: 10rpx 0; display: flex; flex-direction: row;"
>
<view
style=
"margin-right: 5rpx; width: 200rpx;"
>
{{
item
.
label
}}
</view>
<view
style=
"flex: 1; overflow: hidden;text-overflow: ellipsis;white-space: nowrap;"
>
{{
item
.
value
}}
</view>
</view>
</block>
</view>
<view
class=
"uni-pagination-box"
>
<uni-pagination
show-icon
:page-size=
"listQuery.pageSize"
:current=
"listQuery.pageNo"
:total=
"listQuery.total"
/>
</view>
</view>
</
template
>
<
script
setup
lang=
'ts'
>
import
{
ref
,
reactive
}
from
'vue'
import
{
getBusinessList
,
changeDataById
}
from
'@/api/apply'
;
import
{
onLoad
}
from
'@dcloudio/uni-app'
;
import
{
sLoading
,
hLoading
}
from
'@/utils/util'
import
headers
from
'@/components/header/index.vue'
const
listQuery
=
reactive
({
formId
:
''
,
// 每页数据量
pageSize
:
10
,
// 当前页
pageNo
:
1
,
// 数据总量
total
:
0
,
})
const
fieldList
=
ref
()
const
dataList
=
ref
()
const
optionsMenuId
=
ref
()
const
upFormId
=
ref
()
const
businessList
=
ref
([]
as
any
)
const
optionsMenu
=
async
(
row
:
any
)
=>
{
if
(
row
)
{
const
data
=
{
ruleId
:
optionsMenuId
.
value
,
sourceId
:
row
.
id
}
const
{
data
:
res
}
=
await
changeDataById
(
data
)
console
.
log
(
res
);
if
(
res
.
code
===
200
)
{
uni
.
navigateBack
()
}
}
}
const
init
=
async
(
formId
:
string
)
=>
{
sLoading
()
listQuery
.
formId
=
formId
const
{
data
:
res
}
=
await
getBusinessList
(
listQuery
)
console
.
log
(
res
);
if
(
res
.
code
===
200
)
{
handleLoadData
(
res
.
data
)
listQuery
.
total
=
res
.
data
.
total
fieldList
.
value
=
res
.
data
.
fieldList
dataList
.
value
=
res
.
data
.
dataList
}
}
const
handleLoadData
=
(
data
:
any
)
=>
{
data
.
dataList
.
map
((
item
:
any
)
=>
{
let
business
=
{
id
:
item
.
id
,
arr
:
[]
as
any
}
data
.
fieldList
.
map
((
field
:
any
)
=>
{
let
obj
=
{}
as
any
obj
.
id
=
item
.
id
for
(
const
d
in
item
)
{
if
(
field
.
key
===
d
)
{
obj
.
label
=
field
.
fieldName
obj
.
value
=
item
[
d
]
business
.
arr
.
push
(
obj
)
}
}
})
businessList
.
value
.
push
(
business
)
})
hLoading
()
}
onLoad
((
option
:
any
)
=>
{
const
list
=
JSON
.
parse
(
decodeURIComponent
(
option
.
list
))
console
.
log
(
list
);
optionsMenuId
.
value
=
list
.
id
upFormId
.
value
=
list
.
upFormId
init
(
list
.
upFormId
)
})
</
script
>
<
style
lang=
"scss"
scoped
>
.card.box-list
{
display
:
flex
;
flex-direction
:
row
;
}
.uni-pagination-box
{
background-color
:
#fff
;
}
:deep
(
.uni-pagination--disabled
)
{
background-color
:
#fff
;
}
:deep
(
.uni-pagination--enabled
)
{
background-color
:
#fff
;
}
</
style
>
\ No newline at end of file
src/uni_modules/uni-datetime-picker/changelog.md
0 → 100644
浏览文件 @
5eae5d40
## 2.2.24(2023-06-02)
-
修复 部分情况修改时间,开始、结束时间显示异常的Bug
[
详情
](
https://ask.dcloud.net.cn/question/171146
)
-
优化 当前月可以选择上月、下月的日期
## 2.2.23(2023-05-02)
-
修复 部分情况修改时间,开始时间未更新
[
详情
](
https://github.com/dcloudio/uni-ui/issues/737
)
-
修复 部分平台及设备第一次点击无法显示弹框
-
修复 ios 日期格式未补零显示及使用异常
[
详情
](
https://ask.dcloud.net.cn/question/162979
)
## 2.2.22(2023-03-30)
-
修复 日历 picker 修改年月后,自动选中当月1日
[
详情
](
https://ask.dcloud.net.cn/question/165937
)
-
修复 小程序端 低版本 ios NaN
[
详情
](
https://ask.dcloud.net.cn/question/162979
)
## 2.2.21(2023-02-20)
-
修复 firefox 浏览器显示区域点击无法拉起日历弹框的Bug
[
详情
](
https://ask.dcloud.net.cn/question/163362
)
## 2.2.20(2023-02-17)
-
优化 值为空依然选中当天问题
-
优化 提供 default-value 属性支持配置选择器打开时默认显示的时间
-
优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间
-
优化 字节小程序日期时间范围选择,底部日期换行问题
## 2.2.19(2023-02-09)
-
修复 2.2.18 引起范围选择配置 end 选择无效的Bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/686
)
## 2.2.18(2023-02-08)
-
修复 移动端范围选择change事件触发异常的Bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/684
)
-
优化 PC端输入日期格式错误时返回当前日期时间
-
优化 PC端输入日期时间超出 start、end 限制的Bug
-
优化 移动端日期时间范围用法时间展示不完整问题
## 2.2.17(2023-02-04)
-
修复 小程序端绑定 Date 类型报错的Bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/679
)
-
修复 vue3 time-picker 无法显示绑定时分秒的Bug
## 2.2.16(2023-02-02)
-
修复 字节小程序报错的Bug
## 2.2.15(2023-02-02)
-
修复 某些情况切换月份错误的Bug
## 2.2.14(2023-01-30)
-
修复 某些情况切换月份错误的Bug
[
详情
](
https://ask.dcloud.net.cn/question/162033
)
## 2.2.13(2023-01-10)
-
修复 多次加载组件造成内存占用的Bug
## 2.2.12(2022-12-01)
-
修复 vue3 下 i18n 国际化初始值不正确的Bug
## 2.2.11(2022-09-19)
-
修复 支付宝小程序样式错乱的Bug
[
详情
](
https://github.com/dcloudio/uni-app/issues/3861
)
## 2.2.10(2022-09-19)
-
修复 反向选择日期范围,日期显示异常的Bug
[
详情
](
https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false
)
## 2.2.9(2022-09-16)
-
可以使用 uni-scss 控制主题色
## 2.2.8(2022-09-08)
-
修复 close事件无效的Bug
## 2.2.7(2022-09-05)
-
修复 移动端 maskClick 无效的Bug
[
详情
](
https://ask.dcloud.net.cn/question/140824
)
## 2.2.6(2022-06-30)
-
优化 组件样式,调整了组件图标大小、高度、颜色等,与uni-ui风格保持一致
## 2.2.5(2022-06-24)
-
修复 日历顶部年月及底部确认未国际化的Bug
## 2.2.4(2022-03-31)
-
修复 Vue3 下动态赋值,单选类型未响应的Bug
## 2.2.3(2022-03-28)
-
修复 Vue3 下动态赋值未响应的Bug
## 2.2.2(2021-12-10)
-
修复 clear-icon 属性在小程序平台不生效的Bug
## 2.2.1(2021-12-10)
-
修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的Bug
## 2.2.0(2021-11-19)
-
优化 组件UI,并提供设计资源
[
详情
](
https://uniapp.dcloud.io/component/uniui/resource
)
-
文档迁移
[
https://uniapp.dcloud.io/component/uniui/uni-datetime-picker
](
https://uniapp.dcloud.io/component/uniui/uni-datetime-picker
)
## 2.1.5(2021-11-09)
-
新增 提供组件设计资源,组件样式调整
## 2.1.4(2021-09-10)
-
修复 hide-second 在移动端的Bug
-
修复 单选赋默认值时,赋值日期未高亮的Bug
-
修复 赋默认值时,移动端未正确显示时间的Bug
## 2.1.3(2021-09-09)
-
新增 hide-second 属性,支持只使用时分,隐藏秒
## 2.1.2(2021-09-03)
-
优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次
-
优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法
-
优化 调整字号大小,美化日历界面
-
修复 因国际化导致的 placeholder 失效的Bug
## 2.1.1(2021-08-24)
-
新增 支持国际化
-
优化 范围选择器在 pc 端过宽的问题
## 2.1.0(2021-08-09)
-
新增 适配 vue3
## 2.0.19(2021-08-09)
-
新增 支持作为 uni-forms 子组件相关功能
-
修复 在 uni-forms 中使用时,选择时间报 NAN 错误的Bug
## 2.0.18(2021-08-05)
-
修复 type 属性动态赋值无效的Bug
-
修复 ‘确认’按钮被 tabbar 遮盖 bug
-
修复 组件未赋值时范围选左、右日历相同的Bug
## 2.0.17(2021-08-04)
-
修复 范围选未正确显示当前值的Bug
-
修复 h5 平台(移动端)报错 'cale' of undefined 的Bug
## 2.0.16(2021-07-21)
-
新增 return-type 属性支持返回 date 日期对象
## 2.0.15(2021-07-14)
-
修复 单选日期类型,初始赋值后不在当前日历的Bug
-
新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效)
-
优化 移动端移除显示框的清空按钮,无实际用途
## 2.0.14(2021-07-14)
-
修复 组件赋值为空,界面未更新的Bug
-
修复 start 和 end 不能动态赋值的Bug
-
修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的Bug
## 2.0.13(2021-07-08)
-
修复 范围选择不能动态赋值的Bug
## 2.0.12(2021-07-08)
-
修复 范围选择的初始时间在一个月内时,造成无法选择的bug
## 2.0.11(2021-07-08)
-
优化 弹出层在超出视窗边缘定位不准确的问题
## 2.0.10(2021-07-08)
-
修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的Bug
-
优化 弹出层在超出视窗边缘被遮盖的问题
## 2.0.9(2021-07-07)
-
新增 maskClick 事件
-
修复 特殊情况日历 rpx 布局错误的Bug,rpx -> px
-
修复 范围选择时清空返回值不合理的bug,
[
'', ''
]
->
[
]
## 2.0.8(2021-07-07)
-
新增 日期时间显示框支持插槽
## 2.0.7(2021-07-01)
-
优化 添加 uni-icons 依赖
## 2.0.6(2021-05-22)
-
修复 图标在小程序上不显示的Bug
-
优化 重命名引用组件,避免潜在组件命名冲突
## 2.0.5(2021-05-20)
-
优化 代码目录扁平化
## 2.0.4(2021-05-12)
-
新增 组件示例地址
## 2.0.3(2021-05-10)
-
修复 ios 下不识别 '-' 日期格式的Bug
-
优化 pc 下弹出层添加边框和阴影
## 2.0.2(2021-05-08)
-
修复 在 admin 中获取弹出层定位错误的bug
## 2.0.1(2021-05-08)
-
修复 type 属性向下兼容,默认值从 date 变更为 datetime
## 2.0.0(2021-04-30)
-
支持日历形式的日期+时间的范围选择
> 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)
## 1.0.6(2021-03-18)
-
新增 hide-second 属性,时间支持仅选择时、分
-
修复 选择跟显示的日期不一样的Bug
-
修复 chang事件触发2次的Bug
-
修复 分、秒 end 范围错误的Bug
-
优化 更好的 nvue 适配
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-calendar-item__weeks-box"
:class=
"
{
'uni-calendar-item--disable':weeks.disable,
'uni-calendar-item--before-checked-x':weeks.beforeMultiple,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--after-checked-x':weeks.afterMultiple,
}" @click="choiceDate(weeks)" @mouseenter="handleMousemove(weeks)">
<view
class=
"uni-calendar-item__weeks-box-item"
:class=
"
{
'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate
&&
(calendar.userChecked || !checkHover),
'uni-calendar-item--checked-range-text': checkHover,
'uni-calendar-item--before-checked':weeks.beforeMultiple,
'uni-calendar-item--multiple': weeks.multiple,
'uni-calendar-item--after-checked':weeks.afterMultiple,
'uni-calendar-item--disable':weeks.disable,
}">
<text
v-if=
"selected && weeks.extraInfo"
class=
"uni-calendar-item__weeks-box-circle"
></text>
<text
class=
"uni-calendar-item__weeks-box-text uni-calendar-item__weeks-box-text-disable uni-calendar-item--checked-text"
>
{{
weeks
.
date
}}
</text>
</view>
<view
:class=
"
{'uni-calendar-item--today': weeks.isToday}">
</view>
</view>
</
template
>
<
script
>
export
default
{
props
:
{
weeks
:
{
type
:
Object
,
default
()
{
return
{}
}
},
calendar
:
{
type
:
Object
,
default
:
()
=>
{
return
{}
}
},
selected
:
{
type
:
Array
,
default
:
()
=>
{
return
[]
}
},
checkHover
:
{
type
:
Boolean
,
default
:
false
}
},
methods
:
{
choiceDate
(
weeks
)
{
this
.
$emit
(
'change'
,
weeks
)
},
handleMousemove
(
weeks
)
{
this
.
$emit
(
'handleMouse'
,
weeks
)
}
}
}
</
script
>
<
style
lang=
"scss"
>
$uni-primary
:
#007aff
!
default
;
.uni-calendar-item__weeks-box
{
flex
:
1
;
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
column
;
justify-content
:
center
;
align-items
:
center
;
margin
:
1px
0
;
position
:
relative
;
}
.uni-calendar-item__weeks-box-text
{
font-size
:
14px
;
// font-family: Lato-Bold, Lato;
font-weight
:
bold
;
color
:
darken
(
$color
:
$uni-primary
,
$amount
:
40%
);
}
.uni-calendar-item__weeks-box-item
{
position
:
relative
;
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
column
;
justify-content
:
center
;
align-items
:
center
;
width
:
40px
;
height
:
40px
;
/* #ifdef H5 */
cursor
:
pointer
;
/* #endif */
}
.uni-calendar-item__weeks-box-circle
{
position
:
absolute
;
top
:
5px
;
right
:
5px
;
width
:
8px
;
height
:
8px
;
border-radius
:
8px
;
background-color
:
#dd524d
;
}
.uni-calendar-item__weeks-box
.uni-calendar-item--disable
{
cursor
:
default
;
}
.uni-calendar-item--disable
.uni-calendar-item__weeks-box-text-disable
{
color
:
#D1D1D1
;
}
.uni-calendar-item--today
{
position
:
absolute
;
top
:
10px
;
right
:
17%
;
background-color
:
#dd524d
;
width
:
6px
;
height
:
6px
;
border-radius
:
50%
;
}
.uni-calendar-item--extra
{
color
:
#dd524d
;
opacity
:
0
.8
;
}
.uni-calendar-item__weeks-box
.uni-calendar-item--checked
{
background-color
:
$uni-primary
;
border-radius
:
50%
;
box-sizing
:
border-box
;
border
:
3px
solid
#fff
;
}
.uni-calendar-item--checked
.uni-calendar-item--checked-text
{
color
:
#fff
;
}
.uni-calendar-item--multiple
.uni-calendar-item--checked-range-text
{
color
:
#333
;
}
.uni-calendar-item--multiple
{
background-color
:
#F6F7FC
;
// color: #fff;
}
.uni-calendar-item--multiple
.uni-calendar-item--before-checked
,
.uni-calendar-item--multiple
.uni-calendar-item--after-checked
{
background-color
:
$uni-primary
;
border-radius
:
50%
;
box-sizing
:
border-box
;
border
:
3px
solid
#F6F7FC
;
}
.uni-calendar-item--before-checked
.uni-calendar-item--checked-text
,
.uni-calendar-item--after-checked
.uni-calendar-item--checked-text
{
color
:
#fff
;
}
.uni-calendar-item--before-checked-x
{
border-top-left-radius
:
50px
;
border-bottom-left-radius
:
50px
;
box-sizing
:
border-box
;
background-color
:
#F6F7FC
;
}
.uni-calendar-item--after-checked-x
{
border-top-right-radius
:
50px
;
border-bottom-right-radius
:
50px
;
background-color
:
#F6F7FC
;
}
</
style
>
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-calendar"
@
mouseleave=
"leaveCale"
>
<view
v-if=
"!insert && show"
class=
"uni-calendar__mask"
:class=
"
{'uni-calendar--mask-show':aniMaskShow}"
@click="maskClick">
</view>
<view
v-if=
"insert || show"
class=
"uni-calendar__content"
:class=
"
{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow, 'uni-calendar__content-mobile': aniMaskShow}">
<view
class=
"uni-calendar__header"
:class=
"
{'uni-calendar__header-mobile' :!insert}">
<view
class=
"uni-calendar__header-btn-box"
@
click
.
stop=
"changeMonth('pre')"
>
<view
class=
"uni-calendar__header-btn uni-calendar--left"
></view>
</view>
<picker
mode=
"date"
:value=
"date"
fields=
"month"
@
change=
"bindDateChange"
>
<text
class=
"uni-calendar__header-text"
>
{{
(
nowDate
.
year
||
''
)
+
yearText
+
(
nowDate
.
month
||
''
)
+
monthText
}}
</text>
</picker>
<view
class=
"uni-calendar__header-btn-box"
@
click
.
stop=
"changeMonth('next')"
>
<view
class=
"uni-calendar__header-btn uni-calendar--right"
></view>
</view>
<view
v-if=
"!insert"
class=
"dialog-close"
@
click=
"close"
>
<view
class=
"dialog-close-plus"
data-id=
"close"
></view>
<view
class=
"dialog-close-plus dialog-close-rotate"
data-id=
"close"
></view>
</view>
</view>
<view
class=
"uni-calendar__box"
>
<view
v-if=
"showMonth"
class=
"uni-calendar__box-bg"
>
<text
class=
"uni-calendar__box-bg-text"
>
{{
nowDate
.
month
}}
</text>
</view>
<view
class=
"uni-calendar__weeks"
style=
"padding-bottom: 7px;"
>
<view
class=
"uni-calendar__weeks-day"
>
<text
class=
"uni-calendar__weeks-day-text"
>
{{
SUNText
}}
</text>
</view>
<view
class=
"uni-calendar__weeks-day"
>
<text
class=
"uni-calendar__weeks-day-text"
>
{{
MONText
}}
</text>
</view>
<view
class=
"uni-calendar__weeks-day"
>
<text
class=
"uni-calendar__weeks-day-text"
>
{{
TUEText
}}
</text>
</view>
<view
class=
"uni-calendar__weeks-day"
>
<text
class=
"uni-calendar__weeks-day-text"
>
{{
WEDText
}}
</text>
</view>
<view
class=
"uni-calendar__weeks-day"
>
<text
class=
"uni-calendar__weeks-day-text"
>
{{
THUText
}}
</text>
</view>
<view
class=
"uni-calendar__weeks-day"
>
<text
class=
"uni-calendar__weeks-day-text"
>
{{
FRIText
}}
</text>
</view>
<view
class=
"uni-calendar__weeks-day"
>
<text
class=
"uni-calendar__weeks-day-text"
>
{{
SATText
}}
</text>
</view>
</view>
<view
class=
"uni-calendar__weeks"
v-for=
"(item,weekIndex) in weeks"
:key=
"weekIndex"
>
<view
class=
"uni-calendar__weeks-item"
v-for=
"(weeks,weeksIndex) in item"
:key=
"weeksIndex"
>
<calendar-item
class=
"uni-calendar-item--hook"
:weeks=
"weeks"
:calendar=
"calendar"
:selected=
"selected"
:checkHover=
"range"
@
change=
"choiceDate"
@
handleMouse=
"handleMouse"
>
</calendar-item>
</view>
</view>
</view>
<view
v-if=
"!insert && !range && hasTime"
class=
"uni-date-changed uni-calendar--fixed-top"
style=
"padding: 0 80px;"
>
<view
class=
"uni-date-changed--time-date"
>
{{
tempSingleDate
?
tempSingleDate
:
selectDateText
}}
</view>
<time-picker
type=
"time"
:start=
"timepickerStartTime"
:end=
"timepickerEndTime"
v-model=
"time"
:disabled=
"!tempSingleDate"
:border=
"false"
:hide-second=
"hideSecond"
class=
"time-picker-style"
>
</time-picker>
</view>
<view
v-if=
"!insert && range && hasTime"
class=
"uni-date-changed uni-calendar--fixed-top"
>
<view
class=
"uni-date-changed--time-start"
>
<view
class=
"uni-date-changed--time-date"
>
{{
tempRange
.
before
?
tempRange
.
before
:
startDateText
}}
</view>
<time-picker
type=
"time"
:start=
"timepickerStartTime"
v-model=
"timeRange.startTime"
:border=
"false"
:hide-second=
"hideSecond"
:disabled=
"!tempRange.before"
class=
"time-picker-style"
>
</time-picker>
</view>
<view
style=
"line-height: 50px;"
>
<uni-icons
type=
"arrowthinright"
color=
"#999"
></uni-icons>
</view>
<view
class=
"uni-date-changed--time-end"
>
<view
class=
"uni-date-changed--time-date"
>
{{
tempRange
.
after
?
tempRange
.
after
:
endDateText
}}
</view>
<time-picker
type=
"time"
:end=
"timepickerEndTime"
v-model=
"timeRange.endTime"
:border=
"false"
:hide-second=
"hideSecond"
:disabled=
"!tempRange.after"
class=
"time-picker-style"
>
</time-picker>
</view>
</view>
<view
v-if=
"!insert"
class=
"uni-date-changed uni-date-btn--ok"
>
<view
class=
"uni-datetime-picker--btn"
@
click=
"confirm"
>
{{
confirmText
}}
</view>
</view>
</view>
</view>
</
template
>
<
script
>
import
{
Calendar
,
getDate
,
getTime
}
from
'./util.js'
;
import
calendarItem
from
'./calendar-item.vue'
import
timePicker
from
'./time-picker.vue'
import
{
initVueI18n
}
from
'@dcloudio/uni-i18n'
import
i18nMessages
from
'./i18n/index.js'
const
{
t
}
=
initVueI18n
(
i18nMessages
)
/**
* Calendar 日历
* @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等
* @tutorial https://ext.dcloud.net.cn/plugin?id=56
* @property {String} date 自定义当前时间,默认为今天
* @property {String} startDate 日期选择范围-开始日期
* @property {String} endDate 日期选择范围-结束日期
* @property {Boolean} range 范围选择
* @property {Boolean} insert = [true|false] 插入模式,默认为false
* @value true 弹窗模式
* @value false 插入模式
* @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容
* @property {Array} selected 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
* @property {Boolean} showMonth 是否选择月份为背景
* @property {[String} defaultValue 选择器打开时默认显示的时间
* @event {Function} change 日期改变,`insert :ture` 时生效
* @event {Function} confirm 确认选择`insert :false` 时生效
* @event {Function} monthSwitch 切换月份时触发
* @example <uni-calendar :insert="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
*/
export
default
{
components
:
{
calendarItem
,
timePicker
},
props
:
{
date
:
{
type
:
String
,
default
:
''
},
defTime
:
{
type
:
[
String
,
Object
],
default
:
''
},
selectableTimes
:
{
type
:
[
Object
],
default
()
{
return
{}
}
},
selected
:
{
type
:
Array
,
default
()
{
return
[]
}
},
startDate
:
{
type
:
String
,
default
:
''
},
endDate
:
{
type
:
String
,
default
:
''
},
startPlaceholder
:
{
type
:
String
,
default
:
''
},
endPlaceholder
:
{
type
:
String
,
default
:
''
},
range
:
{
type
:
Boolean
,
default
:
false
},
hasTime
:
{
type
:
Boolean
,
default
:
false
},
insert
:
{
type
:
Boolean
,
default
:
true
},
showMonth
:
{
type
:
Boolean
,
default
:
true
},
clearDate
:
{
type
:
Boolean
,
default
:
true
},
checkHover
:
{
type
:
Boolean
,
default
:
true
},
hideSecond
:
{
type
:
[
Boolean
],
default
:
false
},
pleStatus
:
{
type
:
Object
,
default
()
{
return
{
before
:
''
,
after
:
''
,
data
:
[],
fulldate
:
''
}
}
},
defaultValue
:
{
type
:
[
String
,
Object
,
Array
],
default
:
''
}
},
data
()
{
return
{
show
:
false
,
weeks
:
[],
calendar
:
{},
nowDate
:
{},
aniMaskShow
:
false
,
firstEnter
:
true
,
time
:
''
,
timeRange
:
{
startTime
:
''
,
endTime
:
''
},
tempSingleDate
:
''
,
tempRange
:
{
before
:
''
,
after
:
''
}
}
},
watch
:
{
date
:
{
immediate
:
true
,
handler
(
newVal
)
{
if
(
!
this
.
range
)
{
this
.
tempSingleDate
=
newVal
setTimeout
(()
=>
{
this
.
init
(
newVal
)
},
100
)
}
}
},
defTime
:
{
immediate
:
true
,
handler
(
newVal
)
{
if
(
!
this
.
range
)
{
this
.
time
=
newVal
}
else
{
this
.
timeRange
.
startTime
=
newVal
.
start
this
.
timeRange
.
endTime
=
newVal
.
end
}
}
},
startDate
(
val
)
{
// 字节小程序 watch 早于 created
if
(
!
this
.
cale
){
return
}
this
.
cale
.
setStartDate
(
val
)
this
.
cale
.
setDate
(
this
.
nowDate
.
fullDate
)
this
.
weeks
=
this
.
cale
.
weeks
},
endDate
(
val
)
{
// 字节小程序 watch 早于 created
if
(
!
this
.
cale
){
return
}
this
.
cale
.
setEndDate
(
val
)
this
.
cale
.
setDate
(
this
.
nowDate
.
fullDate
)
this
.
weeks
=
this
.
cale
.
weeks
},
selected
(
newVal
)
{
// 字节小程序 watch 早于 created
if
(
!
this
.
cale
){
return
}
this
.
cale
.
setSelectInfo
(
this
.
nowDate
.
fullDate
,
newVal
)
this
.
weeks
=
this
.
cale
.
weeks
},
pleStatus
:
{
immediate
:
true
,
handler
(
newVal
)
{
const
{
before
,
after
,
fulldate
,
which
}
=
newVal
this
.
tempRange
.
before
=
before
this
.
tempRange
.
after
=
after
setTimeout
(()
=>
{
if
(
fulldate
)
{
this
.
cale
.
setHoverMultiple
(
fulldate
)
if
(
before
&&
after
)
{
this
.
cale
.
lastHover
=
true
if
(
this
.
rangeWithinMonth
(
after
,
before
))
return
this
.
setDate
(
before
)
}
else
{
this
.
cale
.
setMultiple
(
fulldate
)
this
.
setDate
(
this
.
nowDate
.
fullDate
)
this
.
calendar
.
fullDate
=
''
this
.
cale
.
lastHover
=
false
}
}
else
{
// 字节小程序 watch 早于 created
if
(
!
this
.
cale
){
return
}
this
.
cale
.
setDefaultMultiple
(
before
,
after
)
if
(
which
===
'left'
&&
before
)
{
this
.
setDate
(
before
)
this
.
weeks
=
this
.
cale
.
weeks
}
else
if
(
after
)
{
this
.
setDate
(
after
)
this
.
weeks
=
this
.
cale
.
weeks
}
this
.
cale
.
lastHover
=
true
}
},
16
)
}
}
},
computed
:
{
timepickerStartTime
()
{
const
activeDate
=
this
.
range
?
this
.
tempRange
.
before
:
this
.
calendar
.
fullDate
return
activeDate
===
this
.
startDate
?
this
.
selectableTimes
.
start
:
''
},
timepickerEndTime
()
{
const
activeDate
=
this
.
range
?
this
.
tempRange
.
after
:
this
.
calendar
.
fullDate
return
activeDate
===
this
.
endDate
?
this
.
selectableTimes
.
end
:
''
},
/**
* for i18n
*/
selectDateText
()
{
return
t
(
"uni-datetime-picker.selectDate"
)
},
startDateText
()
{
return
this
.
startPlaceholder
||
t
(
"uni-datetime-picker.startDate"
)
},
endDateText
()
{
return
this
.
endPlaceholder
||
t
(
"uni-datetime-picker.endDate"
)
},
okText
()
{
return
t
(
"uni-datetime-picker.ok"
)
},
yearText
()
{
return
t
(
"uni-datetime-picker.year"
)
},
monthText
()
{
return
t
(
"uni-datetime-picker.month"
)
},
MONText
()
{
return
t
(
"uni-calender.MON"
)
},
TUEText
()
{
return
t
(
"uni-calender.TUE"
)
},
WEDText
()
{
return
t
(
"uni-calender.WED"
)
},
THUText
()
{
return
t
(
"uni-calender.THU"
)
},
FRIText
()
{
return
t
(
"uni-calender.FRI"
)
},
SATText
()
{
return
t
(
"uni-calender.SAT"
)
},
SUNText
()
{
return
t
(
"uni-calender.SUN"
)
},
confirmText
()
{
return
t
(
"uni-calender.confirm"
)
},
},
created
()
{
// 获取日历方法实例
this
.
cale
=
new
Calendar
({
selected
:
this
.
selected
,
startDate
:
this
.
startDate
,
endDate
:
this
.
endDate
,
range
:
this
.
range
,
})
// 选中某一天
this
.
init
(
this
.
date
)
},
methods
:
{
leaveCale
()
{
this
.
firstEnter
=
true
},
handleMouse
(
weeks
)
{
if
(
weeks
.
disable
)
return
if
(
this
.
cale
.
lastHover
)
return
let
{
before
,
after
}
=
this
.
cale
.
multipleStatus
if
(
!
before
)
return
this
.
calendar
=
weeks
// 设置范围选
this
.
cale
.
setHoverMultiple
(
this
.
calendar
.
fullDate
)
this
.
weeks
=
this
.
cale
.
weeks
// hover时,进入一个日历,更新另一个
if
(
this
.
firstEnter
)
{
this
.
$emit
(
'firstEnterCale'
,
this
.
cale
.
multipleStatus
)
this
.
firstEnter
=
false
}
},
rangeWithinMonth
(
A
,
B
)
{
const
[
yearA
,
monthA
]
=
A
.
split
(
'-'
)
const
[
yearB
,
monthB
]
=
B
.
split
(
'-'
)
return
yearA
===
yearB
&&
monthA
===
monthB
},
// 蒙版点击事件
maskClick
()
{
this
.
close
()
this
.
$emit
(
'maskClose'
)
},
clearCalender
()
{
if
(
this
.
range
)
{
this
.
timeRange
.
startTime
=
''
this
.
timeRange
.
endTime
=
''
this
.
tempRange
.
before
=
''
this
.
tempRange
.
after
=
''
this
.
cale
.
multipleStatus
.
before
=
''
this
.
cale
.
multipleStatus
.
after
=
''
this
.
cale
.
multipleStatus
.
data
=
[]
this
.
cale
.
lastHover
=
false
}
else
{
this
.
time
=
''
this
.
tempSingleDate
=
''
}
this
.
calendar
.
fullDate
=
''
this
.
setDate
(
new
Date
())
},
bindDateChange
(
e
)
{
const
value
=
e
.
detail
.
value
+
'-1'
this
.
setDate
(
value
)
},
/**
* 初始化日期显示
* @param {Object} date
*/
init
(
date
)
{
// 字节小程序 watch 早于 created
if
(
!
this
.
cale
){
return
}
this
.
cale
.
setDate
(
date
||
new
Date
())
this
.
weeks
=
this
.
cale
.
weeks
this
.
nowDate
=
this
.
cale
.
getInfo
(
date
)
this
.
calendar
=
{...
this
.
nowDate
}
if
(
!
date
){
// 优化date为空默认不选中今天
this
.
calendar
.
fullDate
=
''
if
(
this
.
defaultValue
&&
!
this
.
range
){
// 暂时只支持移动端非范围选择
const
defaultDate
=
new
Date
(
this
.
defaultValue
)
const
fullDate
=
getDate
(
defaultDate
)
const
year
=
defaultDate
.
getFullYear
()
const
month
=
defaultDate
.
getMonth
()
+
1
const
date
=
defaultDate
.
getDate
()
const
day
=
defaultDate
.
getDay
()
this
.
calendar
=
{
fullDate
,
year
,
month
,
date
,
day
},
this
.
tempSingleDate
=
fullDate
this
.
time
=
getTime
(
defaultDate
,
this
.
hideSecond
)
}
}
},
/**
* 打开日历弹窗
*/
open
()
{
// 弹窗模式并且清理数据
if
(
this
.
clearDate
&&
!
this
.
insert
)
{
this
.
cale
.
cleanMultipleStatus
()
this
.
init
(
this
.
date
)
}
this
.
show
=
true
this
.
$nextTick
(()
=>
{
setTimeout
(()
=>
{
this
.
aniMaskShow
=
true
},
50
)
})
},
/**
* 关闭日历弹窗
*/
close
()
{
this
.
aniMaskShow
=
false
this
.
$nextTick
(()
=>
{
setTimeout
(()
=>
{
this
.
show
=
false
this
.
$emit
(
'close'
)
},
300
)
})
},
/**
* 确认按钮
*/
confirm
()
{
this
.
setEmit
(
'confirm'
)
this
.
close
()
},
/**
* 变化触发
*/
change
()
{
if
(
!
this
.
insert
)
return
this
.
setEmit
(
'change'
)
},
/**
* 选择月份触发
*/
monthSwitch
()
{
let
{
year
,
month
}
=
this
.
nowDate
this
.
$emit
(
'monthSwitch'
,
{
year
,
month
:
Number
(
month
)
})
},
/**
* 派发事件
* @param {Object} name
*/
setEmit
(
name
)
{
if
(
!
this
.
range
){
if
(
!
this
.
calendar
.
fullDate
){
this
.
calendar
=
this
.
cale
.
getInfo
(
new
Date
())
this
.
tempSingleDate
=
this
.
calendar
.
fullDate
}
if
(
this
.
hasTime
&&
!
this
.
time
)
{
this
.
time
=
getTime
(
new
Date
(),
this
.
hideSecond
)
}
}
let
{
year
,
month
,
date
,
fullDate
,
extraInfo
}
=
this
.
calendar
this
.
$emit
(
name
,
{
range
:
this
.
cale
.
multipleStatus
,
year
,
month
,
date
,
time
:
this
.
time
,
timeRange
:
this
.
timeRange
,
fulldate
:
fullDate
,
extraInfo
:
extraInfo
||
{}
})
},
/**
* 选择天触发
* @param {Object} weeks
*/
choiceDate
(
weeks
)
{
if
(
weeks
.
disable
)
return
this
.
calendar
=
weeks
this
.
calendar
.
userChecked
=
true
// 设置多选
this
.
cale
.
setMultiple
(
this
.
calendar
.
fullDate
,
true
)
this
.
weeks
=
this
.
cale
.
weeks
this
.
tempSingleDate
=
this
.
calendar
.
fullDate
const
beforeDate
=
new
Date
(
this
.
cale
.
multipleStatus
.
before
).
getTime
()
const
afterDate
=
new
Date
(
this
.
cale
.
multipleStatus
.
after
).
getTime
()
// 如果先选择结束日期,后选择开始日期,需要交换
if
(
beforeDate
>
afterDate
&&
afterDate
)
{
this
.
tempRange
.
before
=
this
.
cale
.
multipleStatus
.
after
this
.
tempRange
.
after
=
this
.
cale
.
multipleStatus
.
before
}
else
{
this
.
tempRange
.
before
=
this
.
cale
.
multipleStatus
.
before
this
.
tempRange
.
after
=
this
.
cale
.
multipleStatus
.
after
}
this
.
change
()
},
changeMonth
(
type
)
{
let
newDate
if
(
type
===
'pre'
)
{
newDate
=
this
.
cale
.
getPreMonthObj
(
this
.
nowDate
.
fullDate
).
fullDate
}
else
if
(
type
===
'next'
)
{
newDate
=
this
.
cale
.
getNextMonthObj
(
this
.
nowDate
.
fullDate
).
fullDate
}
this
.
setDate
(
newDate
)
this
.
monthSwitch
()
},
/**
* 设置日期
* @param {Object} date
*/
setDate
(
date
)
{
this
.
cale
.
setDate
(
date
)
this
.
weeks
=
this
.
cale
.
weeks
this
.
nowDate
=
this
.
cale
.
getInfo
(
date
)
}
}
}
</
script
>
<
style
lang=
"scss"
>
$uni-primary
:
#007aff
!
default
;
.uni-calendar
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
column
;
}
.uni-calendar__mask
{
position
:
fixed
;
bottom
:
0
;
top
:
0
;
left
:
0
;
right
:
0
;
background-color
:
rgba
(
0
,
0
,
0
,
0
.4
);
transition-property
:
opacity
;
transition-duration
:
0
.3s
;
opacity
:
0
;
/* #ifndef APP-NVUE */
z-index
:
99
;
/* #endif */
}
.uni-calendar--mask-show
{
opacity
:
1
}
.uni-calendar--fixed
{
position
:
fixed
;
bottom
:
calc
(
var
(
--
window-bottom
));
left
:
0
;
right
:
0
;
transition-property
:
transform
;
transition-duration
:
0
.3s
;
transform
:
translateY
(
460px
);
/* #ifndef APP-NVUE */
z-index
:
99
;
/* #endif */
}
.uni-calendar--ani-show
{
transform
:
translateY
(
0
);
}
.uni-calendar__content
{
background-color
:
#fff
;
}
.uni-calendar__content-mobile
{
border-top-left-radius
:
10px
;
border-top-right-radius
:
10px
;
box-shadow
:
0px
0px
5px
3px
rgba
(
0
,
0
,
0
,
0
.1
);
}
.uni-calendar__header
{
position
:
relative
;
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
justify-content
:
center
;
align-items
:
center
;
height
:
50px
;
}
.uni-calendar__header-mobile
{
padding
:
10px
;
padding-bottom
:
0
;
}
.uni-calendar--fixed-top
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
justify-content
:
space-between
;
border-top-color
:
rgba
(
0
,
0
,
0
,
0
.4
);
border-top-style
:
solid
;
border-top-width
:
1px
;
}
.uni-calendar--fixed-width
{
width
:
50px
;
}
.uni-calendar__backtoday
{
position
:
absolute
;
right
:
0
;
top
:
25rpx
;
padding
:
0
5px
;
padding-left
:
10px
;
height
:
25px
;
line-height
:
25px
;
font-size
:
12px
;
border-top-left-radius
:
25px
;
border-bottom-left-radius
:
25px
;
color
:
#fff
;
background-color
:
#f1f1f1
;
}
.uni-calendar__header-text
{
text-align
:
center
;
width
:
100px
;
font-size
:
15px
;
color
:
#666
;
}
.uni-calendar__button-text
{
text-align
:
center
;
width
:
100px
;
font-size
:
14px
;
color
:
$uni-primary
;
/* #ifndef APP-NVUE */
letter-spacing
:
3px
;
/* #endif */
}
.uni-calendar__header-btn-box
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
align-items
:
center
;
justify-content
:
center
;
width
:
50px
;
height
:
50px
;
}
.uni-calendar__header-btn
{
width
:
9px
;
height
:
9px
;
border-left-color
:
#808080
;
border-left-style
:
solid
;
border-left-width
:
1px
;
border-top-color
:
#555555
;
border-top-style
:
solid
;
border-top-width
:
1px
;
}
.uni-calendar--left
{
transform
:
rotate
(
-45deg
);
}
.uni-calendar--right
{
transform
:
rotate
(
135deg
);
}
.uni-calendar__weeks
{
position
:
relative
;
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
}
.uni-calendar__weeks-item
{
flex
:
1
;
}
.uni-calendar__weeks-day
{
flex
:
1
;
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
column
;
justify-content
:
center
;
align-items
:
center
;
height
:
40px
;
border-bottom-color
:
#F5F5F5
;
border-bottom-style
:
solid
;
border-bottom-width
:
1px
;
}
.uni-calendar__weeks-day-text
{
font-size
:
12px
;
color
:
#B2B2B2
;
}
.uni-calendar__box
{
position
:
relative
;
// padding: 0 10px;
padding-bottom
:
7px
;
}
.uni-calendar__box-bg
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
justify-content
:
center
;
align-items
:
center
;
position
:
absolute
;
top
:
0
;
left
:
0
;
right
:
0
;
bottom
:
0
;
}
.uni-calendar__box-bg-text
{
font-size
:
200px
;
font-weight
:
bold
;
color
:
#999
;
opacity
:
0
.1
;
text-align
:
center
;
/* #ifndef APP-NVUE */
line-height
:
1
;
/* #endif */
}
.uni-date-changed
{
padding
:
0
10px
;
// line-height: 50px;
text-align
:
center
;
color
:
#333
;
border-top-color
:
#DCDCDC
;
;
border-top-style
:
solid
;
border-top-width
:
1px
;
flex
:
1
;
}
.uni-date-btn--ok
{
padding
:
20px
15px
;
}
.uni-date-changed--time-start
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
align-items
:
center
;
}
.uni-date-changed--time-end
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
align-items
:
center
;
}
.uni-date-changed--time-date
{
color
:
#999
;
line-height
:
50px
;
/* #ifdef MP-TOUTIAO */
font-size
:
16px
;
/* #endif */
margin-right
:
5px
;
// opacity: 0.6;
}
.time-picker-style
{
// width: 62px;
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
justify-content
:
center
;
align-items
:
center
}
.mr-10
{
margin-right
:
10px
;
}
.dialog-close
{
position
:
absolute
;
top
:
0
;
right
:
0
;
bottom
:
0
;
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
align-items
:
center
;
padding
:
0
25px
;
margin-top
:
10px
;
}
.dialog-close-plus
{
width
:
16px
;
height
:
2px
;
background-color
:
#737987
;
border-radius
:
2px
;
transform
:
rotate
(
45deg
);
}
.dialog-close-rotate
{
position
:
absolute
;
transform
:
rotate
(
-45deg
);
}
.uni-datetime-picker--btn
{
border-radius
:
100px
;
height
:
40px
;
line-height
:
40px
;
background-color
:
$uni-primary
;
color
:
#fff
;
font-size
:
16px
;
letter-spacing
:
2px
;
}
/* #ifndef APP-NVUE */
.uni-datetime-picker--btn
:active
{
opacity
:
0
.7
;
}
/* #endif */
</
style
>
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
0 → 100644
浏览文件 @
5eae5d40
{
"uni-datetime-picker.selectDate"
:
"select date"
,
"uni-datetime-picker.selectTime"
:
"select time"
,
"uni-datetime-picker.selectDateTime"
:
"select date and time"
,
"uni-datetime-picker.startDate"
:
"start date"
,
"uni-datetime-picker.endDate"
:
"end date"
,
"uni-datetime-picker.startTime"
:
"start time"
,
"uni-datetime-picker.endTime"
:
"end time"
,
"uni-datetime-picker.ok"
:
"ok"
,
"uni-datetime-picker.clear"
:
"clear"
,
"uni-datetime-picker.cancel"
:
"cancel"
,
"uni-datetime-picker.year"
:
"-"
,
"uni-datetime-picker.month"
:
""
,
"uni-calender.MON"
:
"MON"
,
"uni-calender.TUE"
:
"TUE"
,
"uni-calender.WED"
:
"WED"
,
"uni-calender.THU"
:
"THU"
,
"uni-calender.FRI"
:
"FRI"
,
"uni-calender.SAT"
:
"SAT"
,
"uni-calender.SUN"
:
"SUN"
,
"uni-calender.confirm"
:
"confirm"
}
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
0 → 100644
浏览文件 @
5eae5d40
import
en
from
'./en.json'
import
zhHans
from
'./zh-Hans.json'
import
zhHant
from
'./zh-Hant.json'
export
default
{
en
,
'zh-Hans'
:
zhHans
,
'zh-Hant'
:
zhHant
}
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
0 → 100644
浏览文件 @
5eae5d40
{
"uni-datetime-picker.selectDate"
:
"选择日期"
,
"uni-datetime-picker.selectTime"
:
"选择时间"
,
"uni-datetime-picker.selectDateTime"
:
"选择日期时间"
,
"uni-datetime-picker.startDate"
:
"开始日期"
,
"uni-datetime-picker.endDate"
:
"结束日期"
,
"uni-datetime-picker.startTime"
:
"开始时间"
,
"uni-datetime-picker.endTime"
:
"结束时间"
,
"uni-datetime-picker.ok"
:
"确定"
,
"uni-datetime-picker.clear"
:
"清除"
,
"uni-datetime-picker.cancel"
:
"取消"
,
"uni-datetime-picker.year"
:
"年"
,
"uni-datetime-picker.month"
:
"月"
,
"uni-calender.SUN"
:
"日"
,
"uni-calender.MON"
:
"一"
,
"uni-calender.TUE"
:
"二"
,
"uni-calender.WED"
:
"三"
,
"uni-calender.THU"
:
"四"
,
"uni-calender.FRI"
:
"五"
,
"uni-calender.SAT"
:
"六"
,
"uni-calender.confirm"
:
"确认"
}
\ No newline at end of file
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
0 → 100644
浏览文件 @
5eae5d40
{
"uni-datetime-picker.selectDate"
:
"選擇日期"
,
"uni-datetime-picker.selectTime"
:
"選擇時間"
,
"uni-datetime-picker.selectDateTime"
:
"選擇日期時間"
,
"uni-datetime-picker.startDate"
:
"開始日期"
,
"uni-datetime-picker.endDate"
:
"結束日期"
,
"uni-datetime-picker.startTime"
:
"開始时间"
,
"uni-datetime-picker.endTime"
:
"結束时间"
,
"uni-datetime-picker.ok"
:
"確定"
,
"uni-datetime-picker.clear"
:
"清除"
,
"uni-datetime-picker.cancel"
:
"取消"
,
"uni-datetime-picker.year"
:
"年"
,
"uni-datetime-picker.month"
:
"月"
,
"uni-calender.SUN"
:
"日"
,
"uni-calender.MON"
:
"一"
,
"uni-calender.TUE"
:
"二"
,
"uni-calender.WED"
:
"三"
,
"uni-calender.THU"
:
"四"
,
"uni-calender.FRI"
:
"五"
,
"uni-calender.SAT"
:
"六"
,
"uni-calender.confirm"
:
"確認"
}
\ No newline at end of file
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-datetime-picker"
>
<view
@
click=
"initTimePicker"
>
<slot>
<view
class=
"uni-datetime-picker-timebox-pointer"
:class=
"
{'uni-datetime-picker-disabled': disabled, 'uni-datetime-picker-timebox': border}">
<text
class=
"uni-datetime-picker-text"
>
{{
time
}}
</text>
<view
v-if=
"!time"
class=
"uni-datetime-picker-time"
>
<text
class=
"uni-datetime-picker-text"
>
{{
selectTimeText
}}
</text>
</view>
</view>
</slot>
</view>
<view
v-if=
"visible"
id=
"mask"
class=
"uni-datetime-picker-mask"
@
click=
"tiggerTimePicker"
></view>
<view
v-if=
"visible"
class=
"uni-datetime-picker-popup"
:class=
"[dateShow && timeShow ? '' : 'fix-nvue-height']"
:style=
"fixNvueBug"
>
<view
class=
"uni-title"
>
<text
class=
"uni-datetime-picker-text"
>
{{
selectTimeText
}}
</text>
</view>
<view
v-if=
"dateShow"
class=
"uni-datetime-picker__container-box"
>
<picker-view
class=
"uni-datetime-picker-view"
:indicator-style=
"indicatorStyle"
:value=
"ymd"
@
change=
"bindDateChange"
>
<picker-view-column>
<view
class=
"uni-datetime-picker-item"
v-for=
"(item,index) in years"
:key=
"index"
>
<text
class=
"uni-datetime-picker-item"
>
{{
lessThanTen
(
item
)
}}
</text>
</view>
</picker-view-column>
<picker-view-column>
<view
class=
"uni-datetime-picker-item"
v-for=
"(item,index) in months"
:key=
"index"
>
<text
class=
"uni-datetime-picker-item"
>
{{
lessThanTen
(
item
)
}}
</text>
</view>
</picker-view-column>
<picker-view-column>
<view
class=
"uni-datetime-picker-item"
v-for=
"(item,index) in days"
:key=
"index"
>
<text
class=
"uni-datetime-picker-item"
>
{{
lessThanTen
(
item
)
}}
</text>
</view>
</picker-view-column>
</picker-view>
<!-- 兼容 nvue 不支持伪类 -->
<text
class=
"uni-datetime-picker-sign sign-left"
>
-
</text>
<text
class=
"uni-datetime-picker-sign sign-right"
>
-
</text>
</view>
<view
v-if=
"timeShow"
class=
"uni-datetime-picker__container-box"
>
<picker-view
class=
"uni-datetime-picker-view"
:class=
"[hideSecond ? 'time-hide-second' : '']"
:indicator-style=
"indicatorStyle"
:value=
"hms"
@
change=
"bindTimeChange"
>
<picker-view-column>
<view
class=
"uni-datetime-picker-item"
v-for=
"(item,index) in hours"
:key=
"index"
>
<text
class=
"uni-datetime-picker-item"
>
{{
lessThanTen
(
item
)
}}
</text>
</view>
</picker-view-column>
<picker-view-column>
<view
class=
"uni-datetime-picker-item"
v-for=
"(item,index) in minutes"
:key=
"index"
>
<text
class=
"uni-datetime-picker-item"
>
{{
lessThanTen
(
item
)
}}
</text>
</view>
</picker-view-column>
<picker-view-column
v-if=
"!hideSecond"
>
<view
class=
"uni-datetime-picker-item"
v-for=
"(item,index) in seconds"
:key=
"index"
>
<text
class=
"uni-datetime-picker-item"
>
{{
lessThanTen
(
item
)
}}
</text>
</view>
</picker-view-column>
</picker-view>
<!-- 兼容 nvue 不支持伪类 -->
<text
class=
"uni-datetime-picker-sign"
:class=
"[hideSecond ? 'sign-center' : 'sign-left']"
>
:
</text>
<text
v-if=
"!hideSecond"
class=
"uni-datetime-picker-sign sign-right"
>
:
</text>
</view>
<view
class=
"uni-datetime-picker-btn"
>
<view
@
click=
"clearTime"
>
<text
class=
"uni-datetime-picker-btn-text"
>
{{
clearText
}}
</text>
</view>
<view
class=
"uni-datetime-picker-btn-group"
>
<view
class=
"uni-datetime-picker-cancel"
@
click=
"tiggerTimePicker"
>
<text
class=
"uni-datetime-picker-btn-text"
>
{{
cancelText
}}
</text>
</view>
<view
@
click=
"setTime"
>
<text
class=
"uni-datetime-picker-btn-text"
>
{{
okText
}}
</text>
</view>
</view>
</view>
</view>
</view>
</
template
>
<
script
>
import
{
initVueI18n
}
from
'@dcloudio/uni-i18n'
import
i18nMessages
from
'./i18n/index.js'
const
{
t
}
=
initVueI18n
(
i18nMessages
)
import
{
fixIosDateFormat
}
from
'./util'
/**
* DatetimePicker 时间选择器
* @description 可以同时选择日期和时间的选择器
* @tutorial https://ext.dcloud.net.cn/plugin?id=xxx
* @property {String} type = [datetime | date | time] 显示模式
* @property {Boolean} multiple = [true|false] 是否多选
* @property {String|Number} value 默认值
* @property {String|Number} start 起始日期或时间
* @property {String|Number} end 起始日期或时间
* @property {String} return-type = [timestamp | string]
* @event {Function} change 选中发生变化触发
*/
export
default
{
name
:
'UniDatetimePicker'
,
data
()
{
return
{
indicatorStyle
:
`height: 50px;`
,
visible
:
false
,
fixNvueBug
:
{},
dateShow
:
true
,
timeShow
:
true
,
title
:
'日期和时间'
,
// 输入框当前时间
time
:
''
,
// 当前的年月日时分秒
year
:
1920
,
month
:
0
,
day
:
0
,
hour
:
0
,
minute
:
0
,
second
:
0
,
// 起始时间
startYear
:
1920
,
startMonth
:
1
,
startDay
:
1
,
startHour
:
0
,
startMinute
:
0
,
startSecond
:
0
,
// 结束时间
endYear
:
2120
,
endMonth
:
12
,
endDay
:
31
,
endHour
:
23
,
endMinute
:
59
,
endSecond
:
59
,
}
},
props
:
{
type
:
{
type
:
String
,
default
:
'datetime'
},
value
:
{
type
:
[
String
,
Number
],
default
:
''
},
modelValue
:
{
type
:
[
String
,
Number
],
default
:
''
},
start
:
{
type
:
[
Number
,
String
],
default
:
''
},
end
:
{
type
:
[
Number
,
String
],
default
:
''
},
returnType
:
{
type
:
String
,
default
:
'string'
},
disabled
:
{
type
:
[
Boolean
,
String
],
default
:
false
},
border
:
{
type
:
[
Boolean
,
String
],
default
:
true
},
hideSecond
:
{
type
:
[
Boolean
,
String
],
default
:
false
}
},
watch
:
{
// #ifndef VUE3
value
:
{
handler
(
newVal
)
{
if
(
newVal
)
{
this
.
parseValue
(
fixIosDateFormat
(
newVal
))
this
.
initTime
(
false
)
}
else
{
this
.
time
=
''
this
.
parseValue
(
Date
.
now
())
}
},
immediate
:
true
},
// #endif
// #ifdef VUE3
modelValue
:
{
handler
(
newVal
)
{
if
(
newVal
)
{
this
.
parseValue
(
fixIosDateFormat
(
newVal
))
this
.
initTime
(
false
)
}
else
{
this
.
time
=
''
this
.
parseValue
(
Date
.
now
())
}
},
immediate
:
true
},
// #endif
type
:
{
handler
(
newValue
)
{
if
(
newValue
===
'date'
)
{
this
.
dateShow
=
true
this
.
timeShow
=
false
this
.
title
=
'日期'
}
else
if
(
newValue
===
'time'
)
{
this
.
dateShow
=
false
this
.
timeShow
=
true
this
.
title
=
'时间'
}
else
{
this
.
dateShow
=
true
this
.
timeShow
=
true
this
.
title
=
'日期和时间'
}
},
immediate
:
true
},
start
:
{
handler
(
newVal
)
{
this
.
parseDatetimeRange
(
fixIosDateFormat
(
newVal
),
'start'
)
},
immediate
:
true
},
end
:
{
handler
(
newVal
)
{
this
.
parseDatetimeRange
(
fixIosDateFormat
(
newVal
),
'end'
)
},
immediate
:
true
},
// 月、日、时、分、秒可选范围变化后,检查当前值是否在范围内,不在则当前值重置为可选范围第一项
months
(
newVal
)
{
this
.
checkValue
(
'month'
,
this
.
month
,
newVal
)
},
days
(
newVal
)
{
this
.
checkValue
(
'day'
,
this
.
day
,
newVal
)
},
hours
(
newVal
)
{
this
.
checkValue
(
'hour'
,
this
.
hour
,
newVal
)
},
minutes
(
newVal
)
{
this
.
checkValue
(
'minute'
,
this
.
minute
,
newVal
)
},
seconds
(
newVal
)
{
this
.
checkValue
(
'second'
,
this
.
second
,
newVal
)
}
},
computed
:
{
// 当前年、月、日、时、分、秒选择范围
years
()
{
return
this
.
getCurrentRange
(
'year'
)
},
months
()
{
return
this
.
getCurrentRange
(
'month'
)
},
days
()
{
return
this
.
getCurrentRange
(
'day'
)
},
hours
()
{
return
this
.
getCurrentRange
(
'hour'
)
},
minutes
()
{
return
this
.
getCurrentRange
(
'minute'
)
},
seconds
()
{
return
this
.
getCurrentRange
(
'second'
)
},
// picker 当前值数组
ymd
()
{
return
[
this
.
year
-
this
.
minYear
,
this
.
month
-
this
.
minMonth
,
this
.
day
-
this
.
minDay
]
},
hms
()
{
return
[
this
.
hour
-
this
.
minHour
,
this
.
minute
-
this
.
minMinute
,
this
.
second
-
this
.
minSecond
]
},
// 当前 date 是 start
currentDateIsStart
()
{
return
this
.
year
===
this
.
startYear
&&
this
.
month
===
this
.
startMonth
&&
this
.
day
===
this
.
startDay
},
// 当前 date 是 end
currentDateIsEnd
()
{
return
this
.
year
===
this
.
endYear
&&
this
.
month
===
this
.
endMonth
&&
this
.
day
===
this
.
endDay
},
// 当前年、月、日、时、分、秒的最小值和最大值
minYear
()
{
return
this
.
startYear
},
maxYear
()
{
return
this
.
endYear
},
minMonth
()
{
if
(
this
.
year
===
this
.
startYear
)
{
return
this
.
startMonth
}
else
{
return
1
}
},
maxMonth
()
{
if
(
this
.
year
===
this
.
endYear
)
{
return
this
.
endMonth
}
else
{
return
12
}
},
minDay
()
{
if
(
this
.
year
===
this
.
startYear
&&
this
.
month
===
this
.
startMonth
)
{
return
this
.
startDay
}
else
{
return
1
}
},
maxDay
()
{
if
(
this
.
year
===
this
.
endYear
&&
this
.
month
===
this
.
endMonth
)
{
return
this
.
endDay
}
else
{
return
this
.
daysInMonth
(
this
.
year
,
this
.
month
)
}
},
minHour
()
{
if
(
this
.
type
===
'datetime'
)
{
if
(
this
.
currentDateIsStart
)
{
return
this
.
startHour
}
else
{
return
0
}
}
if
(
this
.
type
===
'time'
)
{
return
this
.
startHour
}
},
maxHour
()
{
if
(
this
.
type
===
'datetime'
)
{
if
(
this
.
currentDateIsEnd
)
{
return
this
.
endHour
}
else
{
return
23
}
}
if
(
this
.
type
===
'time'
)
{
return
this
.
endHour
}
},
minMinute
()
{
if
(
this
.
type
===
'datetime'
)
{
if
(
this
.
currentDateIsStart
&&
this
.
hour
===
this
.
startHour
)
{
return
this
.
startMinute
}
else
{
return
0
}
}
if
(
this
.
type
===
'time'
)
{
if
(
this
.
hour
===
this
.
startHour
)
{
return
this
.
startMinute
}
else
{
return
0
}
}
},
maxMinute
()
{
if
(
this
.
type
===
'datetime'
)
{
if
(
this
.
currentDateIsEnd
&&
this
.
hour
===
this
.
endHour
)
{
return
this
.
endMinute
}
else
{
return
59
}
}
if
(
this
.
type
===
'time'
)
{
if
(
this
.
hour
===
this
.
endHour
)
{
return
this
.
endMinute
}
else
{
return
59
}
}
},
minSecond
()
{
if
(
this
.
type
===
'datetime'
)
{
if
(
this
.
currentDateIsStart
&&
this
.
hour
===
this
.
startHour
&&
this
.
minute
===
this
.
startMinute
)
{
return
this
.
startSecond
}
else
{
return
0
}
}
if
(
this
.
type
===
'time'
)
{
if
(
this
.
hour
===
this
.
startHour
&&
this
.
minute
===
this
.
startMinute
)
{
return
this
.
startSecond
}
else
{
return
0
}
}
},
maxSecond
()
{
if
(
this
.
type
===
'datetime'
)
{
if
(
this
.
currentDateIsEnd
&&
this
.
hour
===
this
.
endHour
&&
this
.
minute
===
this
.
endMinute
)
{
return
this
.
endSecond
}
else
{
return
59
}
}
if
(
this
.
type
===
'time'
)
{
if
(
this
.
hour
===
this
.
endHour
&&
this
.
minute
===
this
.
endMinute
)
{
return
this
.
endSecond
}
else
{
return
59
}
}
},
/**
* for i18n
*/
selectTimeText
()
{
return
t
(
"uni-datetime-picker.selectTime"
)
},
okText
()
{
return
t
(
"uni-datetime-picker.ok"
)
},
clearText
()
{
return
t
(
"uni-datetime-picker.clear"
)
},
cancelText
()
{
return
t
(
"uni-datetime-picker.cancel"
)
}
},
mounted
()
{
// #ifdef APP-NVUE
const
res
=
uni
.
getSystemInfoSync
();
this
.
fixNvueBug
=
{
top
:
res
.
windowHeight
/
2
,
left
:
res
.
windowWidth
/
2
}
// #endif
},
methods
:
{
/**
* @param {Object} item
* 小于 10 在前面加个 0
*/
lessThanTen
(
item
)
{
return
item
<
10
?
'0'
+
item
:
item
},
/**
* 解析时分秒字符串,例如:00:00:00
* @param {String} timeString
*/
parseTimeType
(
timeString
)
{
if
(
timeString
)
{
let
timeArr
=
timeString
.
split
(
':'
)
this
.
hour
=
Number
(
timeArr
[
0
])
this
.
minute
=
Number
(
timeArr
[
1
])
this
.
second
=
Number
(
timeArr
[
2
])
}
},
/**
* 解析选择器初始值,类型可以是字符串、时间戳,例如:2000-10-02、'08:30:00'、 1610695109000
* @param {String | Number} datetime
*/
initPickerValue
(
datetime
)
{
let
defaultValue
=
null
if
(
datetime
)
{
defaultValue
=
this
.
compareValueWithStartAndEnd
(
datetime
,
this
.
start
,
this
.
end
)
}
else
{
defaultValue
=
Date
.
now
()
defaultValue
=
this
.
compareValueWithStartAndEnd
(
defaultValue
,
this
.
start
,
this
.
end
)
}
this
.
parseValue
(
defaultValue
)
},
/**
* 初始值规则:
* - 用户设置初始值 value
* - 设置了起始时间 start、终止时间 end,并 start < value < end,初始值为 value, 否则初始值为 start
* - 只设置了起始时间 start,并 start < value,初始值为 value,否则初始值为 start
* - 只设置了终止时间 end,并 value < end,初始值为 value,否则初始值为 end
* - 无起始终止时间,则初始值为 value
* - 无初始值 value,则初始值为当前本地时间 Date.now()
* @param {Object} value
* @param {Object} dateBase
*/
compareValueWithStartAndEnd
(
value
,
start
,
end
)
{
let
winner
=
null
value
=
this
.
superTimeStamp
(
value
)
start
=
this
.
superTimeStamp
(
start
)
end
=
this
.
superTimeStamp
(
end
)
if
(
start
&&
end
)
{
if
(
value
<
start
)
{
winner
=
new
Date
(
start
)
}
else
if
(
value
>
end
)
{
winner
=
new
Date
(
end
)
}
else
{
winner
=
new
Date
(
value
)
}
}
else
if
(
start
&&
!
end
)
{
winner
=
start
<=
value
?
new
Date
(
value
)
:
new
Date
(
start
)
}
else
if
(
!
start
&&
end
)
{
winner
=
value
<=
end
?
new
Date
(
value
)
:
new
Date
(
end
)
}
else
{
winner
=
new
Date
(
value
)
}
return
winner
},
/**
* 转换为可比较的时间戳,接受日期、时分秒、时间戳
* @param {Object} value
*/
superTimeStamp
(
value
)
{
let
dateBase
=
''
if
(
this
.
type
===
'time'
&&
value
&&
typeof
value
===
'string'
)
{
const
now
=
new
Date
()
const
year
=
now
.
getFullYear
()
const
month
=
now
.
getMonth
()
+
1
const
day
=
now
.
getDate
()
dateBase
=
year
+
'/'
+
month
+
'/'
+
day
+
' '
}
if
(
Number
(
value
))
{
value
=
parseInt
(
value
)
dateBase
=
0
}
return
this
.
createTimeStamp
(
dateBase
+
value
)
},
/**
* 解析默认值 value,字符串、时间戳
* @param {Object} defaultTime
*/
parseValue
(
value
)
{
if
(
!
value
)
{
return
}
if
(
this
.
type
===
'time'
&&
typeof
value
===
"string"
)
{
this
.
parseTimeType
(
value
)
}
else
{
let
defaultDate
=
null
defaultDate
=
new
Date
(
value
)
if
(
this
.
type
!==
'time'
)
{
this
.
year
=
defaultDate
.
getFullYear
()
this
.
month
=
defaultDate
.
getMonth
()
+
1
this
.
day
=
defaultDate
.
getDate
()
}
if
(
this
.
type
!==
'date'
)
{
this
.
hour
=
defaultDate
.
getHours
()
this
.
minute
=
defaultDate
.
getMinutes
()
this
.
second
=
defaultDate
.
getSeconds
()
}
}
if
(
this
.
hideSecond
)
{
this
.
second
=
0
}
},
/**
* 解析可选择时间范围 start、end,年月日字符串、时间戳
* @param {Object} defaultTime
*/
parseDatetimeRange
(
point
,
pointType
)
{
// 时间为空,则重置为初始值
if
(
!
point
)
{
if
(
pointType
===
'start'
)
{
this
.
startYear
=
1920
this
.
startMonth
=
1
this
.
startDay
=
1
this
.
startHour
=
0
this
.
startMinute
=
0
this
.
startSecond
=
0
}
if
(
pointType
===
'end'
)
{
this
.
endYear
=
2120
this
.
endMonth
=
12
this
.
endDay
=
31
this
.
endHour
=
23
this
.
endMinute
=
59
this
.
endSecond
=
59
}
return
}
if
(
this
.
type
===
'time'
)
{
const
pointArr
=
point
.
split
(
':'
)
this
[
pointType
+
'Hour'
]
=
Number
(
pointArr
[
0
])
this
[
pointType
+
'Minute'
]
=
Number
(
pointArr
[
1
])
this
[
pointType
+
'Second'
]
=
Number
(
pointArr
[
2
])
}
else
{
if
(
!
point
)
{
pointType
===
'start'
?
this
.
startYear
=
this
.
year
-
60
:
this
.
endYear
=
this
.
year
+
60
return
}
if
(
Number
(
point
))
{
point
=
parseInt
(
point
)
}
// datetime 的 end 没有时分秒, 则不限制
const
hasTime
=
/
[
0-9
]
:
[
0-9
]
/
if
(
this
.
type
===
'datetime'
&&
pointType
===
'end'
&&
typeof
point
===
'string'
&&
!
hasTime
.
test
(
point
))
{
point
=
point
+
' 23:59:59'
}
const
pointDate
=
new
Date
(
point
)
this
[
pointType
+
'Year'
]
=
pointDate
.
getFullYear
()
this
[
pointType
+
'Month'
]
=
pointDate
.
getMonth
()
+
1
this
[
pointType
+
'Day'
]
=
pointDate
.
getDate
()
if
(
this
.
type
===
'datetime'
)
{
this
[
pointType
+
'Hour'
]
=
pointDate
.
getHours
()
this
[
pointType
+
'Minute'
]
=
pointDate
.
getMinutes
()
this
[
pointType
+
'Second'
]
=
pointDate
.
getSeconds
()
}
}
},
// 获取 年、月、日、时、分、秒 当前可选范围
getCurrentRange
(
value
)
{
const
range
=
[]
for
(
let
i
=
this
[
'min'
+
this
.
capitalize
(
value
)];
i
<=
this
[
'max'
+
this
.
capitalize
(
value
)];
i
++
)
{
range
.
push
(
i
)
}
return
range
},
// 字符串首字母大写
capitalize
(
str
)
{
return
str
.
charAt
(
0
).
toUpperCase
()
+
str
.
slice
(
1
)
},
// 检查当前值是否在范围内,不在则当前值重置为可选范围第一项
checkValue
(
name
,
value
,
values
)
{
if
(
values
.
indexOf
(
value
)
===
-
1
)
{
this
[
name
]
=
values
[
0
]
}
},
// 每个月的实际天数
daysInMonth
(
year
,
month
)
{
// Use 1 for January, 2 for February, etc.
return
new
Date
(
year
,
month
,
0
).
getDate
();
},
//兼容 iOS、safari 日期格式
fixIosDateFormat
(
value
)
{
if
(
typeof
value
===
'string'
)
{
value
=
value
.
replace
(
/-/g
,
'/'
)
}
return
value
},
/**
* 生成时间戳
* @param {Object} time
*/
createTimeStamp
(
time
)
{
if
(
!
time
)
return
if
(
typeof
time
===
"number"
)
{
return
time
}
else
{
time
=
time
.
replace
(
/-/g
,
'/'
)
if
(
this
.
type
===
'date'
)
{
time
=
time
+
' '
+
'00:00:00'
}
return
Date
.
parse
(
time
)
}
},
/**
* 生成日期或时间的字符串
*/
createDomSting
()
{
const
yymmdd
=
this
.
year
+
'-'
+
this
.
lessThanTen
(
this
.
month
)
+
'-'
+
this
.
lessThanTen
(
this
.
day
)
let
hhmmss
=
this
.
lessThanTen
(
this
.
hour
)
+
':'
+
this
.
lessThanTen
(
this
.
minute
)
if
(
!
this
.
hideSecond
)
{
hhmmss
=
hhmmss
+
':'
+
this
.
lessThanTen
(
this
.
second
)
}
if
(
this
.
type
===
'date'
)
{
return
yymmdd
}
else
if
(
this
.
type
===
'time'
)
{
return
hhmmss
}
else
{
return
yymmdd
+
' '
+
hhmmss
}
},
/**
* 初始化返回值,并抛出 change 事件
*/
initTime
(
emit
=
true
)
{
this
.
time
=
this
.
createDomSting
()
if
(
!
emit
)
return
if
(
this
.
returnType
===
'timestamp'
&&
this
.
type
!==
'time'
)
{
this
.
$emit
(
'change'
,
this
.
createTimeStamp
(
this
.
time
))
this
.
$emit
(
'input'
,
this
.
createTimeStamp
(
this
.
time
))
this
.
$emit
(
'update:modelValue'
,
this
.
createTimeStamp
(
this
.
time
))
}
else
{
this
.
$emit
(
'change'
,
this
.
time
)
this
.
$emit
(
'input'
,
this
.
time
)
this
.
$emit
(
'update:modelValue'
,
this
.
time
)
}
},
/**
* 用户选择日期或时间更新 data
* @param {Object} e
*/
bindDateChange
(
e
)
{
const
val
=
e
.
detail
.
value
this
.
year
=
this
.
years
[
val
[
0
]]
this
.
month
=
this
.
months
[
val
[
1
]]
this
.
day
=
this
.
days
[
val
[
2
]]
},
bindTimeChange
(
e
)
{
const
val
=
e
.
detail
.
value
this
.
hour
=
this
.
hours
[
val
[
0
]]
this
.
minute
=
this
.
minutes
[
val
[
1
]]
this
.
second
=
this
.
seconds
[
val
[
2
]]
},
/**
* 初始化弹出层
*/
initTimePicker
()
{
if
(
this
.
disabled
)
return
const
value
=
fixIosDateFormat
(
this
.
time
)
this
.
initPickerValue
(
value
)
this
.
visible
=
!
this
.
visible
},
/**
* 触发或关闭弹框
*/
tiggerTimePicker
(
e
)
{
this
.
visible
=
!
this
.
visible
},
/**
* 用户点击“清空”按钮,清空当前值
*/
clearTime
()
{
this
.
time
=
''
this
.
$emit
(
'change'
,
this
.
time
)
this
.
$emit
(
'input'
,
this
.
time
)
this
.
$emit
(
'update:modelValue'
,
this
.
time
)
this
.
tiggerTimePicker
()
},
/**
* 用户点击“确定”按钮
*/
setTime
()
{
this
.
initTime
()
this
.
tiggerTimePicker
()
}
}
}
</
script
>
<
style
lang=
"scss"
>
$uni-primary
:
#007aff
!
default
;
.uni-datetime-picker
{
/* #ifndef APP-NVUE */
/* width: 100%; */
/* #endif */
}
.uni-datetime-picker-view
{
height
:
130px
;
width
:
270px
;
/* #ifndef APP-NVUE */
cursor
:
pointer
;
/* #endif */
}
.uni-datetime-picker-item
{
height
:
50px
;
line-height
:
50px
;
text-align
:
center
;
font-size
:
14px
;
}
.uni-datetime-picker-btn
{
margin-top
:
60px
;
/* #ifndef APP-NVUE */
display
:
flex
;
cursor
:
pointer
;
/* #endif */
flex-direction
:
row
;
justify-content
:
space-between
;
}
.uni-datetime-picker-btn-text
{
font-size
:
14px
;
color
:
$uni-primary
;
}
.uni-datetime-picker-btn-group
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
}
.uni-datetime-picker-cancel
{
margin-right
:
30px
;
}
.uni-datetime-picker-mask
{
position
:
fixed
;
bottom
:
0px
;
top
:
0px
;
left
:
0px
;
right
:
0px
;
background-color
:
rgba
(
0
,
0
,
0
,
0
.4
);
transition-duration
:
0
.3s
;
z-index
:
998
;
}
.uni-datetime-picker-popup
{
border-radius
:
8px
;
padding
:
30px
;
width
:
270px
;
/* #ifdef APP-NVUE */
height
:
500px
;
/* #endif */
/* #ifdef APP-NVUE */
width
:
330px
;
/* #endif */
background-color
:
#fff
;
position
:
fixed
;
top
:
50%
;
left
:
50%
;
transform
:
translate
(
-50%
,
-50%
);
transition-duration
:
0
.3s
;
z-index
:
999
;
}
.fix-nvue-height
{
/* #ifdef APP-NVUE */
height
:
330px
;
/* #endif */
}
.uni-datetime-picker-time
{
color
:
grey
;
}
.uni-datetime-picker-column
{
height
:
50px
;
}
.uni-datetime-picker-timebox
{
border
:
1px
solid
#E5E5E5
;
border-radius
:
5px
;
padding
:
7px
10px
;
/* #ifndef APP-NVUE */
box-sizing
:
border-box
;
cursor
:
pointer
;
/* #endif */
}
.uni-datetime-picker-timebox-pointer
{
/* #ifndef APP-NVUE */
cursor
:
pointer
;
/* #endif */
}
.uni-datetime-picker-disabled
{
opacity
:
0
.4
;
/* #ifdef H5 */
cursor
:
not
-
allowed
!
important
;
/* #endif */
}
.uni-datetime-picker-text
{
font-size
:
14px
;
line-height
:
50px
}
.uni-datetime-picker-sign
{
position
:
absolute
;
top
:
53px
;
/* 减掉 10px 的元素高度,兼容nvue */
color
:
#999
;
/* #ifdef APP-NVUE */
font-size
:
16px
;
/* #endif */
}
.sign-left
{
left
:
86px
;
}
.sign-right
{
right
:
86px
;
}
.sign-center
{
left
:
135px
;
}
.uni-datetime-picker__container-box
{
position
:
relative
;
display
:
flex
;
align-items
:
center
;
justify-content
:
center
;
margin-top
:
40px
;
}
.time-hide-second
{
width
:
180px
;
}
</
style
>
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-date"
>
<view
class=
"uni-date-editor"
@
click=
"show"
>
<slot>
<view
class=
"uni-date-editor--x"
:class=
"
{'uni-date-editor--x__disabled': disabled,'uni-date-x--border': border}"
>
<view
v-if=
"!isRange"
class=
"uni-date-x uni-date-single"
>
<uni-icons
class=
"icon-calendar"
type=
"calendar"
color=
"#c0c4cc"
size=
"22"
></uni-icons>
<view
class=
"uni-date__x-input"
>
{{
displayValue
||
singlePlaceholderText
}}
</view>
</view>
<view
v-else
class=
"uni-date-x uni-date-range"
>
<uni-icons
class=
"icon-calendar"
type=
"calendar"
color=
"#c0c4cc"
size=
"22"
></uni-icons>
<view
class=
"uni-date__x-input text-center"
>
{{
displayRangeValue
.
startDate
||
startPlaceholderText
}}
</view>
<view
class=
"range-separator"
>
{{
rangeSeparator
}}
</view>
<view
class=
"uni-date__x-input text-center"
>
{{
displayRangeValue
.
endDate
||
endPlaceholderText
}}
</view>
</view>
<view
v-if=
"showClearIcon"
class=
"uni-date__icon-clear"
@
click
.
stop=
"clear"
>
<uni-icons
type=
"clear"
color=
"#c0c4cc"
size=
"22"
></uni-icons>
</view>
</view>
</slot>
</view>
<view
v-show=
"pickerVisible"
class=
"uni-date-mask--pc"
@
click=
"close"
></view>
<view
v-if=
"!isPhone"
v-show=
"pickerVisible"
ref=
"datePicker"
class=
"uni-date-picker__container"
>
<view
v-if=
"!isRange"
class=
"uni-date-single--x"
:style=
"pickerPositionStyle"
>
<view
class=
"uni-popper__arrow"
></view>
<view
v-if=
"hasTime"
class=
"uni-date-changed popup-x-header"
>
<input
class=
"uni-date__input text-center"
type=
"text"
v-model=
"inputDate"
:placeholder=
"selectDateText"
/>
<time-picker
type=
"time"
v-model=
"pickerTime"
:border=
"false"
:disabled=
"!inputDate"
:start=
"timepickerStartTime"
:end=
"timepickerEndTime"
:hideSecond=
"hideSecond"
style=
"width: 100%;"
>
<input
class=
"uni-date__input text-center"
type=
"text"
v-model=
"pickerTime"
:placeholder=
"selectTimeText"
:disabled=
"!inputDate"
/>
</time-picker>
</view>
<Calendar
ref=
"pcSingle"
:showMonth=
"false"
:start-date=
"calendarRange.startDate"
:end-date=
"calendarRange.endDate"
:date=
"calendarDate"
@
change=
"singleChange"
:default-value=
"defaultValue"
style=
"padding: 0 8px;"
/>
<view
v-if=
"hasTime"
class=
"popup-x-footer"
>
<text
class=
"confirm-text"
@
click=
"confirmSingleChange"
>
{{
okText
}}
</text>
</view>
</view>
<view
v-else
class=
"uni-date-range--x"
:style=
"pickerPositionStyle"
>
<view
class=
"uni-popper__arrow"
></view>
<view
v-if=
"hasTime"
class=
"popup-x-header uni-date-changed"
>
<view
class=
"popup-x-header--datetime"
>
<input
class=
"uni-date__input uni-date-range__input"
type=
"text"
v-model=
"tempRange.startDate"
:placeholder=
"startDateText"
/>
<time-picker
type=
"time"
v-model=
"tempRange.startTime"
:start=
"timepickerStartTime"
:border=
"false"
:disabled=
"!tempRange.startDate"
:hideSecond=
"hideSecond"
>
<input
class=
"uni-date__input uni-date-range__input"
type=
"text"
v-model=
"tempRange.startTime"
:placeholder=
"startTimeText"
:disabled=
"!tempRange.startDate"
/>
</time-picker>
</view>
<uni-icons
type=
"arrowthinright"
color=
"#999"
style=
"line-height: 40px;"
></uni-icons>
<view
class=
"popup-x-header--datetime"
>
<input
class=
"uni-date__input uni-date-range__input"
type=
"text"
v-model=
"tempRange.endDate"
:placeholder=
"endDateText"
/>
<time-picker
type=
"time"
v-model=
"tempRange.endTime"
:end=
"timepickerEndTime"
:border=
"false"
:disabled=
"!tempRange.endDate"
:hideSecond=
"hideSecond"
>
<input
class=
"uni-date__input uni-date-range__input"
type=
"text"
v-model=
"tempRange.endTime"
:placeholder=
"endTimeText"
:disabled=
"!tempRange.endDate"
/>
</time-picker>
</view>
</view>
<view
class=
"popup-x-body"
>
<Calendar
ref=
"left"
:showMonth=
"false"
:start-date=
"calendarRange.startDate"
:end-date=
"calendarRange.endDate"
:range=
"true"
:pleStatus=
"endMultipleStatus"
@
change=
"leftChange"
@
firstEnterCale=
"updateRightCale"
style=
"padding: 0 8px;"
/>
<Calendar
ref=
"right"
:showMonth=
"false"
:start-date=
"calendarRange.startDate"
:end-date=
"calendarRange.endDate"
:range=
"true"
@
change=
"rightChange"
:pleStatus=
"startMultipleStatus"
@
firstEnterCale=
"updateLeftCale"
style=
"padding: 0 8px;border-left: 1px solid #F1F1F1;"
/>
</view>
<view
v-if=
"hasTime"
class=
"popup-x-footer"
>
<text
@
click=
"clear"
>
{{
clearText
}}
</text>
<text
class=
"confirm-text"
@
click=
"confirmRangeChange"
>
{{
okText
}}
</text>
</view>
</view>
</view>
<Calendar
v-if=
"isPhone"
ref=
"mobile"
:clearDate=
"false"
:date=
"calendarDate"
:defTime=
"mobileCalendarTime"
:start-date=
"calendarRange.startDate"
:end-date=
"calendarRange.endDate"
:selectableTimes=
"mobSelectableTime"
:startPlaceholder=
"startPlaceholder"
:endPlaceholder=
"endPlaceholder"
:default-value=
"defaultValue"
:pleStatus=
"endMultipleStatus"
:showMonth=
"false"
:range=
"isRange"
:hasTime=
"hasTime"
:insert=
"false"
:hideSecond=
"hideSecond"
@
confirm=
"mobileChange"
@
maskClose=
"close"
/>
</view>
</
template
>
<
script
>
/**
* DatetimePicker 时间选择器
* @description 同时支持 PC 和移动端使用日历选择日期和日期范围
* @tutorial https://ext.dcloud.net.cn/plugin?id=3962
* @property {String} type 选择器类型
* @property {String|Number|Array|Date} value 绑定值
* @property {String} placeholder 单选择时的占位内容
* @property {String} start 起始时间
* @property {String} end 终止时间
* @property {String} start-placeholder 范围选择时开始日期的占位内容
* @property {String} end-placeholder 范围选择时结束日期的占位内容
* @property {String} range-separator 选择范围时的分隔符
* @property {Boolean} border = [true|false] 是否有边框
* @property {Boolean} disabled = [true|false] 是否禁用
* @property {Boolean} clearIcon = [true|false] 是否显示清除按钮(仅PC端适用)
* @property {[String} defaultValue 选择器打开时默认显示的时间
* @event {Function} change 确定日期时触发的事件
* @event {Function} maskClick 点击遮罩层触发的事件
* @event {Function} show 打开弹出层
* @event {Function} close 关闭弹出层
* @event {Function} clear 清除上次选中的状态和值
**/
import
Calendar
from
'./calendar.vue'
import
TimePicker
from
'./time-picker.vue'
import
{
initVueI18n
}
from
'@dcloudio/uni-i18n'
import
i18nMessages
from
'./i18n/index.js'
import
{
getDateTime
,
getDate
,
getTime
,
getDefaultSecond
,
dateCompare
,
checkDate
,
fixIosDateFormat
}
from
'./util'
export
default
{
name
:
'UniDatetimePicker'
,
options
:
{
virtualHost
:
true
},
components
:
{
Calendar
,
TimePicker
},
data
()
{
return
{
isRange
:
false
,
hasTime
:
false
,
displayValue
:
''
,
inputDate
:
''
,
calendarDate
:
''
,
pickerTime
:
''
,
calendarRange
:
{
startDate
:
''
,
startTime
:
''
,
endDate
:
''
,
endTime
:
''
},
displayRangeValue
:
{
startDate
:
''
,
endDate
:
''
,
},
tempRange
:
{
startDate
:
''
,
startTime
:
''
,
endDate
:
''
,
endTime
:
''
},
// 左右日历同步数据
startMultipleStatus
:
{
before
:
''
,
after
:
''
,
data
:
[],
fulldate
:
''
},
endMultipleStatus
:
{
before
:
''
,
after
:
''
,
data
:
[],
fulldate
:
''
},
pickerVisible
:
false
,
pickerPositionStyle
:
null
,
isEmitValue
:
false
,
isPhone
:
false
,
isFirstShow
:
true
,
i18nT
:
()
=>
{}
}
},
props
:
{
type
:
{
type
:
String
,
default
:
'datetime'
},
value
:
{
type
:
[
String
,
Number
,
Array
,
Date
],
default
:
''
},
modelValue
:
{
type
:
[
String
,
Number
,
Array
,
Date
],
default
:
''
},
start
:
{
type
:
[
Number
,
String
],
default
:
''
},
end
:
{
type
:
[
Number
,
String
],
default
:
''
},
returnType
:
{
type
:
String
,
default
:
'string'
},
placeholder
:
{
type
:
String
,
default
:
''
},
startPlaceholder
:
{
type
:
String
,
default
:
''
},
endPlaceholder
:
{
type
:
String
,
default
:
''
},
rangeSeparator
:
{
type
:
String
,
default
:
'-'
},
border
:
{
type
:
[
Boolean
],
default
:
true
},
disabled
:
{
type
:
[
Boolean
],
default
:
false
},
clearIcon
:
{
type
:
[
Boolean
],
default
:
true
},
hideSecond
:
{
type
:
[
Boolean
],
default
:
false
},
defaultValue
:
{
type
:
[
String
,
Object
,
Array
],
default
:
''
}
},
watch
:
{
type
:
{
immediate
:
true
,
handler
(
newVal
)
{
this
.
hasTime
=
newVal
.
indexOf
(
'time'
)
!==
-
1
this
.
isRange
=
newVal
.
indexOf
(
'range'
)
!==
-
1
}
},
// #ifndef VUE3
value
:
{
immediate
:
true
,
handler
(
newVal
)
{
if
(
this
.
isEmitValue
)
{
this
.
isEmitValue
=
false
return
}
this
.
initPicker
(
newVal
)
}
},
// #endif
// #ifdef VUE3
modelValue
:
{
immediate
:
true
,
handler
(
newVal
)
{
if
(
this
.
isEmitValue
)
{
this
.
isEmitValue
=
false
return
}
this
.
initPicker
(
newVal
)
}
},
// #endif
start
:
{
immediate
:
true
,
handler
(
newVal
)
{
if
(
!
newVal
)
return
this
.
calendarRange
.
startDate
=
getDate
(
newVal
)
if
(
this
.
hasTime
)
{
this
.
calendarRange
.
startTime
=
getTime
(
newVal
)
}
}
},
end
:
{
immediate
:
true
,
handler
(
newVal
)
{
if
(
!
newVal
)
return
this
.
calendarRange
.
endDate
=
getDate
(
newVal
)
if
(
this
.
hasTime
)
{
this
.
calendarRange
.
endTime
=
getTime
(
newVal
,
this
.
hideSecond
)
}
}
},
},
computed
:
{
timepickerStartTime
()
{
const
activeDate
=
this
.
isRange
?
this
.
tempRange
.
startDate
:
this
.
inputDate
return
activeDate
===
this
.
calendarRange
.
startDate
?
this
.
calendarRange
.
startTime
:
''
},
timepickerEndTime
()
{
const
activeDate
=
this
.
isRange
?
this
.
tempRange
.
endDate
:
this
.
inputDate
return
activeDate
===
this
.
calendarRange
.
endDate
?
this
.
calendarRange
.
endTime
:
''
},
mobileCalendarTime
()
{
const
timeRange
=
{
start
:
this
.
tempRange
.
startTime
,
end
:
this
.
tempRange
.
endTime
}
return
this
.
isRange
?
timeRange
:
this
.
pickerTime
},
mobSelectableTime
()
{
return
{
start
:
this
.
calendarRange
.
startTime
,
end
:
this
.
calendarRange
.
endTime
}
},
datePopupWidth
()
{
// todo
return
this
.
isRange
?
653
:
301
},
/**
* for i18n
*/
singlePlaceholderText
()
{
return
this
.
placeholder
||
(
this
.
type
===
'date'
?
this
.
selectDateText
:
this
.
selectDateTimeText
)
},
startPlaceholderText
()
{
return
this
.
startPlaceholder
||
this
.
startDateText
},
endPlaceholderText
()
{
return
this
.
endPlaceholder
||
this
.
endDateText
},
selectDateText
()
{
return
this
.
i18nT
(
"uni-datetime-picker.selectDate"
)
},
selectDateTimeText
()
{
return
this
.
i18nT
(
"uni-datetime-picker.selectDateTime"
)
},
selectTimeText
()
{
return
this
.
i18nT
(
"uni-datetime-picker.selectTime"
)
},
startDateText
()
{
return
this
.
startPlaceholder
||
this
.
i18nT
(
"uni-datetime-picker.startDate"
)
},
startTimeText
()
{
return
this
.
i18nT
(
"uni-datetime-picker.startTime"
)
},
endDateText
()
{
return
this
.
endPlaceholder
||
this
.
i18nT
(
"uni-datetime-picker.endDate"
)
},
endTimeText
()
{
return
this
.
i18nT
(
"uni-datetime-picker.endTime"
)
},
okText
()
{
return
this
.
i18nT
(
"uni-datetime-picker.ok"
)
},
clearText
()
{
return
this
.
i18nT
(
"uni-datetime-picker.clear"
)
},
showClearIcon
()
{
return
this
.
clearIcon
&&
!
this
.
disabled
&&
(
this
.
displayValue
||
(
this
.
displayRangeValue
.
startDate
&&
this
.
displayRangeValue
.
endDate
))
}
},
created
()
{
this
.
initI18nT
()
this
.
platform
()
},
methods
:
{
initI18nT
()
{
const
vueI18n
=
initVueI18n
(
i18nMessages
)
this
.
i18nT
=
vueI18n
.
t
},
initPicker
(
newVal
)
{
if
((
!
newVal
&&
!
this
.
defaultValue
)
||
Array
.
isArray
(
newVal
)
&&
!
newVal
.
length
)
{
this
.
$nextTick
(()
=>
{
this
.
clear
(
false
)
})
return
}
if
(
!
Array
.
isArray
(
newVal
)
&&
!
this
.
isRange
)
{
if
(
newVal
){
this
.
displayValue
=
this
.
inputDate
=
this
.
calendarDate
=
getDate
(
newVal
)
if
(
this
.
hasTime
)
{
this
.
pickerTime
=
getTime
(
newVal
,
this
.
hideSecond
)
this
.
displayValue
=
`
${
this
.
displayValue
}
${
this
.
pickerTime
}
`
}
}
else
if
(
this
.
defaultValue
){
this
.
inputDate
=
this
.
calendarDate
=
getDate
(
this
.
defaultValue
)
if
(
this
.
hasTime
){
this
.
pickerTime
=
getTime
(
this
.
defaultValue
,
this
.
hideSecond
)
}
}
}
else
{
const
[
before
,
after
]
=
newVal
if
(
!
before
&&
!
after
)
return
const
beforeDate
=
getDate
(
before
)
const
beforeTime
=
getTime
(
before
,
this
.
hideSecond
)
const
afterDate
=
getDate
(
after
)
const
afterTime
=
getTime
(
after
,
this
.
hideSecond
)
const
startDate
=
beforeDate
const
endDate
=
afterDate
this
.
displayRangeValue
.
startDate
=
this
.
tempRange
.
startDate
=
startDate
this
.
displayRangeValue
.
endDate
=
this
.
tempRange
.
endDate
=
endDate
if
(
this
.
hasTime
)
{
this
.
displayRangeValue
.
startDate
=
`
${
beforeDate
}
${
beforeTime
}
`
this
.
displayRangeValue
.
endDate
=
`
${
afterDate
}
${
afterTime
}
`
this
.
tempRange
.
startTime
=
beforeTime
this
.
tempRange
.
endTime
=
afterTime
}
const
defaultRange
=
{
before
:
beforeDate
,
after
:
afterDate
}
this
.
startMultipleStatus
=
Object
.
assign
({},
this
.
startMultipleStatus
,
defaultRange
,
{
which
:
'right'
})
this
.
endMultipleStatus
=
Object
.
assign
({},
this
.
endMultipleStatus
,
defaultRange
,
{
which
:
'left'
})
}
},
updateLeftCale
(
e
)
{
const
left
=
this
.
$refs
.
left
// 设置范围选
left
.
cale
.
setHoverMultiple
(
e
.
after
)
left
.
setDate
(
this
.
$refs
.
left
.
nowDate
.
fullDate
)
},
updateRightCale
(
e
)
{
const
right
=
this
.
$refs
.
right
// 设置范围选
right
.
cale
.
setHoverMultiple
(
e
.
after
)
right
.
setDate
(
this
.
$refs
.
right
.
nowDate
.
fullDate
)
},
platform
()
{
if
(
typeof
navigator
!==
"undefined"
){
this
.
isPhone
=
navigator
.
userAgent
.
toLowerCase
().
indexOf
(
'mobile'
)
!==
-
1
return
}
const
{
windowWidth
}
=
uni
.
getSystemInfoSync
()
this
.
isPhone
=
windowWidth
<=
500
this
.
windowWidth
=
windowWidth
},
show
()
{
if
(
this
.
disabled
)
{
return
}
this
.
platform
()
if
(
this
.
isPhone
)
{
setTimeout
(()
=>
{
this
.
$refs
.
mobile
.
open
()
},
0
);
return
}
this
.
pickerPositionStyle
=
{
top
:
'10px'
}
const
dateEditor
=
uni
.
createSelectorQuery
().
in
(
this
).
select
(
".uni-date-editor"
)
dateEditor
.
boundingClientRect
(
rect
=>
{
if
(
this
.
windowWidth
-
rect
.
left
<
this
.
datePopupWidth
)
{
this
.
pickerPositionStyle
.
right
=
0
}
}).
exec
()
setTimeout
(()
=>
{
this
.
pickerVisible
=
!
this
.
pickerVisible
if
(
!
this
.
isPhone
&&
this
.
isRange
&&
this
.
isFirstShow
)
{
this
.
isFirstShow
=
false
const
{
startDate
,
endDate
}
=
this
.
calendarRange
if
(
startDate
&&
endDate
)
{
if
(
this
.
diffDate
(
startDate
,
endDate
)
<
30
)
{
this
.
$refs
.
right
.
changeMonth
(
'pre'
)
}
}
else
{
this
.
$refs
.
right
.
changeMonth
(
'next'
)
this
.
$refs
.
right
.
cale
.
lastHover
=
false
}
}
},
50
)
},
close
()
{
setTimeout
(()
=>
{
this
.
pickerVisible
=
false
this
.
$emit
(
'maskClick'
,
this
.
value
)
this
.
$refs
.
mobile
&&
this
.
$refs
.
mobile
.
close
()
},
20
)
},
setEmit
(
value
)
{
if
(
this
.
returnType
===
"timestamp"
||
this
.
returnType
===
"date"
)
{
if
(
!
Array
.
isArray
(
value
))
{
if
(
!
this
.
hasTime
)
{
value
=
value
+
' '
+
'00:00:00'
}
value
=
this
.
createTimestamp
(
value
)
if
(
this
.
returnType
===
"date"
)
{
value
=
new
Date
(
value
)
}
}
else
{
if
(
!
this
.
hasTime
)
{
value
[
0
]
=
value
[
0
]
+
' '
+
'00:00:00'
value
[
1
]
=
value
[
1
]
+
' '
+
'00:00:00'
}
value
[
0
]
=
this
.
createTimestamp
(
value
[
0
])
value
[
1
]
=
this
.
createTimestamp
(
value
[
1
])
if
(
this
.
returnType
===
"date"
)
{
value
[
0
]
=
new
Date
(
value
[
0
])
value
[
1
]
=
new
Date
(
value
[
1
])
}
}
}
this
.
$emit
(
'update:modelValue'
,
value
)
this
.
$emit
(
'input'
,
value
)
this
.
$emit
(
'change'
,
value
)
this
.
isEmitValue
=
true
},
createTimestamp
(
date
)
{
date
=
fixIosDateFormat
(
date
)
return
Date
.
parse
(
new
Date
(
date
))
},
singleChange
(
e
)
{
this
.
calendarDate
=
this
.
inputDate
=
e
.
fulldate
if
(
this
.
hasTime
)
return
this
.
confirmSingleChange
()
},
confirmSingleChange
()
{
if
(
!
checkDate
(
this
.
inputDate
)){
const
now
=
new
Date
()
this
.
calendarDate
=
this
.
inputDate
=
getDate
(
now
)
this
.
pickerTime
=
getTime
(
now
,
this
.
hideSecond
)
}
let
startLaterInputDate
=
false
let
startDate
,
startTime
if
(
this
.
start
)
{
let
startString
=
this
.
start
if
(
typeof
this
.
start
===
'number'
){
startString
=
getDateTime
(
this
.
start
,
this
.
hideSecond
)
}
[
startDate
,
startTime
]
=
startString
.
split
(
' '
)
if
(
this
.
start
&&
!
dateCompare
(
startDate
,
this
.
inputDate
))
{
startLaterInputDate
=
true
this
.
inputDate
=
startDate
}
}
let
endEarlierInputDate
=
false
let
endDate
,
endTime
if
(
this
.
end
)
{
let
endString
=
this
.
end
if
(
typeof
this
.
end
===
'number'
){
endString
=
getDateTime
(
this
.
end
,
this
.
hideSecond
)
}
[
endDate
,
endTime
]
=
endString
.
split
(
' '
)
if
(
this
.
end
&&
!
dateCompare
(
this
.
inputDate
,
endDate
))
{
endEarlierInputDate
=
true
this
.
inputDate
=
endDate
}
}
if
(
this
.
hasTime
)
{
if
(
startLaterInputDate
){
this
.
pickerTime
=
startTime
||
getDefaultSecond
(
this
.
hideSecond
)
}
if
(
endEarlierInputDate
){
this
.
pickerTime
=
endTime
||
getDefaultSecond
(
this
.
hideSecond
)
}
if
(
!
this
.
pickerTime
){
this
.
pickerTime
=
getTime
(
Date
.
now
(),
this
.
hideSecond
)
}
this
.
displayValue
=
`
${
this
.
inputDate
}
${
this
.
pickerTime
}
`
}
else
{
this
.
displayValue
=
this
.
inputDate
}
this
.
setEmit
(
this
.
displayValue
)
this
.
pickerVisible
=
false
},
leftChange
(
e
)
{
const
{
before
,
after
}
=
e
.
range
this
.
rangeChange
(
before
,
after
)
const
obj
=
{
before
:
e
.
range
.
before
,
after
:
e
.
range
.
after
,
data
:
e
.
range
.
data
,
fulldate
:
e
.
fulldate
}
this
.
startMultipleStatus
=
Object
.
assign
({},
this
.
startMultipleStatus
,
obj
)
},
rightChange
(
e
)
{
const
{
before
,
after
}
=
e
.
range
this
.
rangeChange
(
before
,
after
)
const
obj
=
{
before
:
e
.
range
.
before
,
after
:
e
.
range
.
after
,
data
:
e
.
range
.
data
,
fulldate
:
e
.
fulldate
}
this
.
endMultipleStatus
=
Object
.
assign
({},
this
.
endMultipleStatus
,
obj
)
},
mobileChange
(
e
)
{
if
(
this
.
isRange
)
{
const
{
before
,
after
}
=
e
.
range
if
(
!
before
||
!
after
){
return
}
this
.
handleStartAndEnd
(
before
,
after
,
true
)
if
(
this
.
hasTime
)
{
const
{
startTime
,
endTime
}
=
e
.
timeRange
this
.
tempRange
.
startTime
=
startTime
this
.
tempRange
.
endTime
=
endTime
}
this
.
confirmRangeChange
()
}
else
{
if
(
this
.
hasTime
)
{
this
.
displayValue
=
e
.
fulldate
+
' '
+
e
.
time
}
else
{
this
.
displayValue
=
e
.
fulldate
}
this
.
setEmit
(
this
.
displayValue
)
}
this
.
$refs
.
mobile
.
close
()
},
rangeChange
(
before
,
after
)
{
if
(
!
(
before
&&
after
))
return
this
.
handleStartAndEnd
(
before
,
after
,
true
)
if
(
this
.
hasTime
)
return
this
.
confirmRangeChange
()
},
confirmRangeChange
()
{
if
(
!
this
.
tempRange
.
startDate
||
!
this
.
tempRange
.
endDate
)
{
this
.
pickerVisible
=
false
return
}
if
(
!
checkDate
(
this
.
tempRange
.
startDate
)){
this
.
tempRange
.
startDate
=
getDate
(
Date
.
now
())
}
if
(
!
checkDate
(
this
.
tempRange
.
endDate
)){
this
.
tempRange
.
endDate
=
getDate
(
Date
.
now
())
}
let
start
,
end
let
startDateLaterRangeStartDate
=
false
let
startDateLaterRangeEndDate
=
false
let
startDate
,
startTime
if
(
this
.
start
)
{
let
startString
=
this
.
start
if
(
typeof
this
.
start
===
'number'
){
startString
=
getDateTime
(
this
.
start
,
this
.
hideSecond
)
}
[
startDate
,
startTime
]
=
startString
.
split
(
' '
)
if
(
this
.
start
&&
!
dateCompare
(
this
.
start
,
this
.
tempRange
.
startDate
))
{
startDateLaterRangeStartDate
=
true
this
.
tempRange
.
startDate
=
startDate
}
if
(
this
.
start
&&
!
dateCompare
(
this
.
start
,
this
.
tempRange
.
endDate
))
{
startDateLaterRangeEndDate
=
true
this
.
tempRange
.
endDate
=
startDate
}
}
let
endDateEarlierRangeStartDate
=
false
let
endDateEarlierRangeEndDate
=
false
let
endDate
,
endTime
if
(
this
.
end
)
{
let
endString
=
this
.
end
if
(
typeof
this
.
end
===
'number'
){
endString
=
getDateTime
(
this
.
end
,
this
.
hideSecond
)
}
[
endDate
,
endTime
]
=
endString
.
split
(
' '
)
if
(
this
.
end
&&
!
dateCompare
(
this
.
tempRange
.
startDate
,
this
.
end
))
{
endDateEarlierRangeStartDate
=
true
this
.
tempRange
.
startDate
=
endDate
}
if
(
this
.
end
&&
!
dateCompare
(
this
.
tempRange
.
endDate
,
this
.
end
))
{
endDateEarlierRangeEndDate
=
true
this
.
tempRange
.
endDate
=
endDate
}
}
if
(
!
this
.
hasTime
)
{
start
=
this
.
displayRangeValue
.
startDate
=
this
.
tempRange
.
startDate
end
=
this
.
displayRangeValue
.
endDate
=
this
.
tempRange
.
endDate
}
else
{
if
(
startDateLaterRangeStartDate
){
this
.
tempRange
.
startTime
=
startTime
||
getDefaultSecond
(
this
.
hideSecond
)
}
else
if
(
endDateEarlierRangeStartDate
){
this
.
tempRange
.
startTime
=
endTime
||
getDefaultSecond
(
this
.
hideSecond
)
}
if
(
!
this
.
tempRange
.
startTime
){
this
.
tempRange
.
startTime
=
getTime
(
Date
.
now
(),
this
.
hideSecond
)
}
if
(
startDateLaterRangeEndDate
){
this
.
tempRange
.
endTime
=
startTime
||
getDefaultSecond
(
this
.
hideSecond
)
}
else
if
(
endDateEarlierRangeEndDate
){
this
.
tempRange
.
endTime
=
endTime
||
getDefaultSecond
(
this
.
hideSecond
)
}
if
(
!
this
.
tempRange
.
endTime
){
this
.
tempRange
.
endTime
=
getTime
(
Date
.
now
(),
this
.
hideSecond
)
}
start
=
this
.
displayRangeValue
.
startDate
=
`
${
this
.
tempRange
.
startDate
}
${
this
.
tempRange
.
startTime
}
`
end
=
this
.
displayRangeValue
.
endDate
=
`
${
this
.
tempRange
.
endDate
}
${
this
.
tempRange
.
endTime
}
`
}
if
(
!
dateCompare
(
start
,
end
)){
[
start
,
end
]
=
[
end
,
start
]
}
this
.
displayRangeValue
.
startDate
=
start
this
.
displayRangeValue
.
endDate
=
end
const
displayRange
=
[
start
,
end
]
this
.
setEmit
(
displayRange
)
this
.
pickerVisible
=
false
},
handleStartAndEnd
(
before
,
after
,
temp
=
false
)
{
if
(
!
(
before
&&
after
))
return
const
type
=
temp
?
'tempRange'
:
'range'
const
isStartEarlierEnd
=
dateCompare
(
before
,
after
)
this
[
type
].
startDate
=
isStartEarlierEnd
?
before
:
after
this
[
type
].
endDate
=
isStartEarlierEnd
?
after
:
before
},
/**
* 比较时间大小
*/
dateCompare
(
startDate
,
endDate
)
{
// 计算截止时间
startDate
=
new
Date
(
startDate
.
replace
(
'-'
,
'/'
).
replace
(
'-'
,
'/'
))
// 计算详细项的截止时间
endDate
=
new
Date
(
endDate
.
replace
(
'-'
,
'/'
).
replace
(
'-'
,
'/'
))
return
startDate
<=
endDate
},
/**
* 比较时间差
*/
diffDate
(
startDate
,
endDate
)
{
// 计算截止时间
startDate
=
new
Date
(
startDate
.
replace
(
'-'
,
'/'
).
replace
(
'-'
,
'/'
))
// 计算详细项的截止时间
endDate
=
new
Date
(
endDate
.
replace
(
'-'
,
'/'
).
replace
(
'-'
,
'/'
))
const
diff
=
(
endDate
-
startDate
)
/
(
24
*
60
*
60
*
1000
)
return
Math
.
abs
(
diff
)
},
clear
(
needEmit
=
true
)
{
if
(
!
this
.
isRange
)
{
this
.
displayValue
=
''
this
.
inputDate
=
''
this
.
pickerTime
=
''
if
(
this
.
isPhone
)
{
this
.
$refs
.
mobile
&&
this
.
$refs
.
mobile
.
clearCalender
()
}
else
{
this
.
$refs
.
pcSingle
&&
this
.
$refs
.
pcSingle
.
clearCalender
()
}
if
(
needEmit
)
{
this
.
$emit
(
'change'
,
''
)
this
.
$emit
(
'input'
,
''
)
this
.
$emit
(
'update:modelValue'
,
''
)
}
}
else
{
this
.
displayRangeValue
.
startDate
=
''
this
.
displayRangeValue
.
endDate
=
''
this
.
tempRange
.
startDate
=
''
this
.
tempRange
.
startTime
=
''
this
.
tempRange
.
endDate
=
''
this
.
tempRange
.
endTime
=
''
if
(
this
.
isPhone
)
{
this
.
$refs
.
mobile
&&
this
.
$refs
.
mobile
.
clearCalender
()
}
else
{
this
.
$refs
.
left
&&
this
.
$refs
.
left
.
clearCalender
()
this
.
$refs
.
right
&&
this
.
$refs
.
right
.
clearCalender
()
this
.
$refs
.
right
&&
this
.
$refs
.
right
.
changeMonth
(
'next'
)
}
if
(
needEmit
)
{
this
.
$emit
(
'change'
,
[])
this
.
$emit
(
'input'
,
[])
this
.
$emit
(
'update:modelValue'
,
[])
}
}
}
}
}
</
script
>
<
style
lang=
"scss"
>
$uni-primary
:
#007aff
!
default
;
.uni-date
{
width
:
100%
;
flex
:
1
;
}
.uni-date-x
{
display
:
flex
;
flex-direction
:
row
;
align-items
:
center
;
justify-content
:
center
;
border-radius
:
4px
;
background-color
:
#fff
;
color
:
#666
;
font-size
:
14px
;
flex
:
1
;
.icon-calendar
{
padding-left
:
3px
;
}
.range-separator
{
height
:
35px
;
/* #ifndef MP */
padding
:
0
2px
;
/* #endif */
line-height
:
35px
;
}
}
.uni-date-x--border
{
box-sizing
:
border-box
;
border-radius
:
4px
;
border
:
1px
solid
#e5e5e5
;
}
.uni-date-editor--x
{
display
:
flex
;
align-items
:
center
;
position
:
relative
;
}
.uni-date-editor--x
.uni-date__icon-clear
{
padding-right
:
3px
;
display
:
flex
;
align-items
:
center
;
/* #ifdef H5 */
cursor
:
pointer
;
/* #endif */
}
.uni-date__x-input
{
width
:
auto
;
height
:
35px
;
/* #ifndef MP */
padding-left
:
5px
;
/* #endif */
position
:
relative
;
flex
:
1
;
line-height
:
35px
;
font-size
:
14px
;
overflow
:
hidden
;
}
.text-center
{
text-align
:
center
;
}
.uni-date__input
{
height
:
40px
;
width
:
100%
;
line-height
:
40px
;
font-size
:
14px
;
}
.uni-date-range__input
{
text-align
:
center
;
max-width
:
142px
;
}
.uni-date-picker__container
{
position
:
relative
;
}
.uni-date-mask--pc
{
position
:
fixed
;
bottom
:
0px
;
top
:
0px
;
left
:
0px
;
right
:
0px
;
background-color
:
rgba
(
0
,
0
,
0
,
0
);
transition-duration
:
0
.3s
;
z-index
:
996
;
}
.uni-date-single--x
{
background-color
:
#fff
;
position
:
absolute
;
top
:
0
;
z-index
:
999
;
border
:
1px
solid
#EBEEF5
;
box-shadow
:
0
2px
12px
0
rgba
(
0
,
0
,
0
,
0
.1
);
border-radius
:
4px
;
}
.uni-date-range--x
{
background-color
:
#fff
;
position
:
absolute
;
top
:
0
;
z-index
:
999
;
border
:
1px
solid
#EBEEF5
;
box-shadow
:
0
2px
12px
0
rgba
(
0
,
0
,
0
,
0
.1
);
border-radius
:
4px
;
}
.uni-date-editor--x__disabled
{
opacity
:
0
.4
;
cursor
:
default
;
}
.uni-date-editor--logo
{
width
:
16px
;
height
:
16px
;
vertical-align
:
middle
;
}
/* 添加时间 */
.popup-x-header
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
}
.popup-x-header--datetime
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
flex
:
1
;
}
.popup-x-body
{
display
:
flex
;
}
.popup-x-footer
{
padding
:
0
15px
;
border-top-color
:
#F1F1F1
;
border-top-style
:
solid
;
border-top-width
:
1px
;
line-height
:
40px
;
text-align
:
right
;
color
:
#666
;
}
.popup-x-footer
text
:hover
{
color
:
$uni-primary
;
cursor
:
pointer
;
opacity
:
0
.8
;
}
.popup-x-footer
.confirm-text
{
margin-left
:
20px
;
color
:
$uni-primary
;
}
.uni-date-changed
{
text-align
:
center
;
color
:
#333
;
border-bottom-color
:
#F1F1F1
;
border-bottom-style
:
solid
;
border-bottom-width
:
1px
;
}
.uni-date-changed--time
text
{
height
:
50px
;
line-height
:
50px
;
}
.uni-date-changed
.uni-date-changed--time
{
flex
:
1
;
}
.uni-date-changed--time-date
{
color
:
#333
;
opacity
:
0
.6
;
}
.mr-50
{
margin-right
:
50px
;
}
/* picker 弹出层通用的指示小三角, todo:扩展至上下左右方向定位 */
.
uni-popper__arrow
,
.
uni-popper__arrow
:
:
after
{
position
:
absolute
;
display
:
block
;
width
:
0
;
height
:
0
;
border
:
6px
solid
transparent
;
border-top-width
:
0
;
}
.uni-popper__arrow
{
filter
:
drop-shadow
(
0
2px
12px
rgba
(
0
,
0
,
0
,
0
.03
));
top
:
-6px
;
left
:
10%
;
margin-right
:
3px
;
border-bottom-color
:
#EBEEF5
;
}
.
uni-popper__arrow
:
:
after
{
content
:
" "
;
top
:
1px
;
margin-left
:
-6px
;
border-bottom-color
:
#fff
;
}
</
style
>
src/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
0 → 100644
浏览文件 @
5eae5d40
class
Calendar
{
constructor
({
selected
,
startDate
,
endDate
,
range
,
}
=
{})
{
// 当前日期
this
.
date
=
this
.
getDateObj
(
new
Date
())
// 当前初入日期
// 打点信息
this
.
selected
=
selected
||
[];
// 起始时间
this
.
startDate
=
startDate
// 终止时间
this
.
endDate
=
endDate
// 是否范围选择
this
.
range
=
range
// 多选状态
this
.
cleanMultipleStatus
()
// 每周日期
this
.
weeks
=
{}
this
.
lastHover
=
false
}
/**
* 设置日期
* @param {Object} date
*/
setDate
(
date
)
{
const
selectDate
=
this
.
getDateObj
(
date
)
this
.
getWeeks
(
selectDate
.
fullDate
)
}
/**
* 清理多选状态
*/
cleanMultipleStatus
()
{
this
.
multipleStatus
=
{
before
:
''
,
after
:
''
,
data
:
[]
}
}
setStartDate
(
startDate
)
{
this
.
startDate
=
startDate
}
setEndDate
(
endDate
)
{
this
.
endDate
=
endDate
}
getPreMonthObj
(
date
){
date
=
fixIosDateFormat
(
date
)
date
=
new
Date
(
date
)
const
oldMonth
=
date
.
getMonth
()
date
.
setMonth
(
oldMonth
-
1
)
const
newMonth
=
date
.
getMonth
()
if
(
oldMonth
!==
0
&&
newMonth
-
oldMonth
===
0
){
date
.
setMonth
(
newMonth
-
1
)
}
return
this
.
getDateObj
(
date
)
}
getNextMonthObj
(
date
){
date
=
fixIosDateFormat
(
date
)
date
=
new
Date
(
date
)
const
oldMonth
=
date
.
getMonth
()
date
.
setMonth
(
oldMonth
+
1
)
const
newMonth
=
date
.
getMonth
()
if
(
newMonth
-
oldMonth
>
1
){
date
.
setMonth
(
newMonth
-
1
)
}
return
this
.
getDateObj
(
date
)
}
/**
* 获取指定格式Date对象
*/
getDateObj
(
date
)
{
date
=
fixIosDateFormat
(
date
)
date
=
new
Date
(
date
)
return
{
fullDate
:
getDate
(
date
),
year
:
date
.
getFullYear
(),
month
:
addZero
(
date
.
getMonth
()
+
1
),
date
:
addZero
(
date
.
getDate
()),
day
:
date
.
getDay
()
}
}
/**
* 获取上一个月日期集合
*/
getPreMonthDays
(
amount
,
dateObj
)
{
const
result
=
[]
for
(
let
i
=
amount
-
1
;
i
>=
0
;
i
--
)
{
const
month
=
dateObj
.
month
>
1
?
dateObj
.
month
-
1
:
12
const
year
=
month
===
12
?
dateObj
.
year
-
1
:
dateObj
.
year
const
date
=
new
Date
(
year
,
month
,
-
i
).
getDate
()
const
fullDate
=
`
${
year
}
-
${
addZero
(
month
)}
-
${
addZero
(
date
)}
`
let
multiples
=
this
.
multipleStatus
.
data
let
multiplesStatus
=
-
1
if
(
this
.
range
&&
multiples
)
{
multiplesStatus
=
multiples
.
findIndex
((
item
)
=>
{
return
this
.
dateEqual
(
item
,
fullDate
)
})
}
const
checked
=
multiplesStatus
!==
-
1
// 获取打点信息
const
extraInfo
=
this
.
selected
&&
this
.
selected
.
find
((
item
)
=>
{
if
(
this
.
dateEqual
(
fullDate
,
item
.
date
))
{
return
item
}
})
result
.
push
({
fullDate
,
year
,
month
,
date
,
multiple
:
this
.
range
?
checked
:
false
,
beforeMultiple
:
this
.
isLogicBefore
(
fullDate
,
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
),
afterMultiple
:
this
.
isLogicAfter
(
fullDate
,
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
),
disable
:
(
this
.
startDate
&&
!
dateCompare
(
this
.
startDate
,
fullDate
))
||
(
this
.
endDate
&&
!
dateCompare
(
fullDate
,
this
.
endDate
)),
isToday
:
fullDate
===
this
.
date
.
fullDate
,
userChecked
:
false
,
extraInfo
})
}
return
result
}
/**
* 获取本月日期集合
*/
getCurrentMonthDays
(
amount
,
dateObj
)
{
const
result
=
[]
const
fullDate
=
this
.
date
.
fullDate
for
(
let
i
=
1
;
i
<=
amount
;
i
++
)
{
const
currentDate
=
`
${
dateObj
.
year
}
-
${
dateObj
.
month
}
-
${
addZero
(
i
)}
`
const
isToday
=
fullDate
===
currentDate
// 获取打点信息
const
extraInfo
=
this
.
selected
&&
this
.
selected
.
find
((
item
)
=>
{
if
(
this
.
dateEqual
(
currentDate
,
item
.
date
))
{
return
item
}
})
// 日期禁用
let
disableBefore
=
true
let
disableAfter
=
true
if
(
this
.
startDate
)
{
disableBefore
=
dateCompare
(
this
.
startDate
,
currentDate
)
}
if
(
this
.
endDate
)
{
disableAfter
=
dateCompare
(
currentDate
,
this
.
endDate
)
}
let
multiples
=
this
.
multipleStatus
.
data
let
multiplesStatus
=
-
1
if
(
this
.
range
&&
multiples
)
{
multiplesStatus
=
multiples
.
findIndex
((
item
)
=>
{
return
this
.
dateEqual
(
item
,
currentDate
)
})
}
const
checked
=
multiplesStatus
!==
-
1
result
.
push
({
fullDate
:
currentDate
,
year
:
dateObj
.
year
,
month
:
dateObj
.
month
,
date
:
i
,
multiple
:
this
.
range
?
checked
:
false
,
beforeMultiple
:
this
.
isLogicBefore
(
currentDate
,
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
),
afterMultiple
:
this
.
isLogicAfter
(
currentDate
,
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
),
disable
:
(
this
.
startDate
&&
!
dateCompare
(
this
.
startDate
,
currentDate
))
||
(
this
.
endDate
&&
!
dateCompare
(
currentDate
,
this
.
endDate
)),
isToday
,
userChecked
:
false
,
extraInfo
})
}
return
result
}
/**
* 获取下一个月日期集合
*/
_getNextMonthDays
(
amount
,
dateObj
)
{
const
result
=
[]
const
month
=
dateObj
.
month
+
1
for
(
let
i
=
1
;
i
<=
amount
;
i
++
)
{
const
month
=
dateObj
.
month
===
12
?
1
:
dateObj
.
month
*
1
+
1
const
year
=
month
===
1
?
dateObj
.
year
+
1
:
dateObj
.
year
const
fullDate
=
`
${
year
}
-
${
addZero
(
month
)}
-
${
addZero
(
i
)}
`
let
multiples
=
this
.
multipleStatus
.
data
let
multiplesStatus
=
-
1
if
(
this
.
range
&&
multiples
)
{
multiplesStatus
=
multiples
.
findIndex
((
item
)
=>
{
return
this
.
dateEqual
(
item
,
fullDate
)
})
}
const
checked
=
multiplesStatus
!==
-
1
// 获取打点信息
const
extraInfo
=
this
.
selected
&&
this
.
selected
.
find
((
item
)
=>
{
if
(
this
.
dateEqual
(
fullDate
,
item
.
date
))
{
return
item
}
})
result
.
push
({
fullDate
,
year
,
date
:
i
,
month
,
multiple
:
this
.
range
?
checked
:
false
,
beforeMultiple
:
this
.
isLogicBefore
(
fullDate
,
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
),
afterMultiple
:
this
.
isLogicAfter
(
fullDate
,
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
),
disable
:
(
this
.
startDate
&&
!
dateCompare
(
this
.
startDate
,
fullDate
))
||
(
this
.
endDate
&&
!
dateCompare
(
fullDate
,
this
.
endDate
)),
isToday
:
fullDate
===
this
.
date
.
fullDate
,
userChecked
:
false
,
extraInfo
})
}
return
result
}
/**
* 获取当前日期详情
* @param {Object} date
*/
getInfo
(
date
)
{
if
(
!
date
)
{
date
=
new
Date
()
}
return
this
.
calendar
.
find
(
item
=>
item
.
fullDate
===
this
.
getDateObj
(
date
).
fullDate
)
}
/**
* 比较时间是否相等
*/
dateEqual
(
before
,
after
)
{
before
=
new
Date
(
fixIosDateFormat
(
before
))
after
=
new
Date
(
fixIosDateFormat
(
after
))
return
before
.
valueOf
()
===
after
.
valueOf
()
}
/**
* 比较真实起始日期
*/
isLogicBefore
(
currentDate
,
before
,
after
)
{
let
logicBefore
=
before
if
(
before
&&
after
)
{
logicBefore
=
dateCompare
(
before
,
after
)
?
before
:
after
}
return
this
.
dateEqual
(
logicBefore
,
currentDate
)
}
isLogicAfter
(
currentDate
,
before
,
after
)
{
let
logicAfter
=
after
if
(
before
&&
after
)
{
logicAfter
=
dateCompare
(
before
,
after
)
?
after
:
before
}
return
this
.
dateEqual
(
logicAfter
,
currentDate
)
}
/**
* 获取日期范围内所有日期
* @param {Object} begin
* @param {Object} end
*/
geDateAll
(
begin
,
end
)
{
var
arr
=
[]
var
ab
=
begin
.
split
(
'-'
)
var
ae
=
end
.
split
(
'-'
)
var
db
=
new
Date
()
db
.
setFullYear
(
ab
[
0
],
ab
[
1
]
-
1
,
ab
[
2
])
var
de
=
new
Date
()
de
.
setFullYear
(
ae
[
0
],
ae
[
1
]
-
1
,
ae
[
2
])
var
unixDb
=
db
.
getTime
()
-
24
*
60
*
60
*
1000
var
unixDe
=
de
.
getTime
()
-
24
*
60
*
60
*
1000
for
(
var
k
=
unixDb
;
k
<=
unixDe
;)
{
k
=
k
+
24
*
60
*
60
*
1000
arr
.
push
(
this
.
getDateObj
(
new
Date
(
parseInt
(
k
))).
fullDate
)
}
return
arr
}
/**
* 获取多选状态
*/
setMultiple
(
fullDate
)
{
if
(
!
this
.
range
)
return
let
{
before
,
after
}
=
this
.
multipleStatus
if
(
before
&&
after
)
{
if
(
!
this
.
lastHover
)
{
this
.
lastHover
=
true
return
}
this
.
multipleStatus
.
before
=
fullDate
this
.
multipleStatus
.
after
=
''
this
.
multipleStatus
.
data
=
[]
this
.
multipleStatus
.
fulldate
=
''
this
.
lastHover
=
false
}
else
{
if
(
!
before
)
{
this
.
multipleStatus
.
before
=
fullDate
this
.
lastHover
=
false
}
else
{
this
.
multipleStatus
.
after
=
fullDate
if
(
dateCompare
(
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
))
{
this
.
multipleStatus
.
data
=
this
.
geDateAll
(
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
);
}
else
{
this
.
multipleStatus
.
data
=
this
.
geDateAll
(
this
.
multipleStatus
.
after
,
this
.
multipleStatus
.
before
);
}
this
.
lastHover
=
true
}
}
this
.
getWeeks
(
fullDate
)
}
/**
* 鼠标 hover 更新多选状态
*/
setHoverMultiple
(
fullDate
)
{
if
(
!
this
.
range
||
this
.
lastHover
)
return
const
{
before
}
=
this
.
multipleStatus
if
(
!
before
)
{
this
.
multipleStatus
.
before
=
fullDate
}
else
{
this
.
multipleStatus
.
after
=
fullDate
if
(
dateCompare
(
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
))
{
this
.
multipleStatus
.
data
=
this
.
geDateAll
(
this
.
multipleStatus
.
before
,
this
.
multipleStatus
.
after
);
}
else
{
this
.
multipleStatus
.
data
=
this
.
geDateAll
(
this
.
multipleStatus
.
after
,
this
.
multipleStatus
.
before
);
}
}
this
.
getWeeks
(
fullDate
)
}
/**
* 更新默认值多选状态
*/
setDefaultMultiple
(
before
,
after
)
{
this
.
multipleStatus
.
before
=
before
this
.
multipleStatus
.
after
=
after
if
(
before
&&
after
)
{
if
(
dateCompare
(
before
,
after
))
{
this
.
multipleStatus
.
data
=
this
.
geDateAll
(
before
,
after
);
this
.
getWeeks
(
after
)
}
else
{
this
.
multipleStatus
.
data
=
this
.
geDateAll
(
after
,
before
);
this
.
getWeeks
(
before
)
}
}
}
/**
* 获取每周数据
* @param {Object} dateData
*/
getWeeks
(
dateData
)
{
const
{
year
,
month
,
}
=
this
.
getDateObj
(
dateData
)
const
preMonthDayAmount
=
new
Date
(
year
,
month
-
1
,
1
).
getDay
()
const
preMonthDays
=
this
.
getPreMonthDays
(
preMonthDayAmount
,
this
.
getDateObj
(
dateData
))
const
currentMonthDayAmount
=
new
Date
(
year
,
month
,
0
).
getDate
()
const
currentMonthDays
=
this
.
getCurrentMonthDays
(
currentMonthDayAmount
,
this
.
getDateObj
(
dateData
))
const
nextMonthDayAmount
=
42
-
preMonthDayAmount
-
currentMonthDayAmount
const
nextMonthDays
=
this
.
_getNextMonthDays
(
nextMonthDayAmount
,
this
.
getDateObj
(
dateData
))
const
calendarDays
=
[...
preMonthDays
,
...
currentMonthDays
,
...
nextMonthDays
]
const
weeks
=
new
Array
(
6
)
for
(
let
i
=
0
;
i
<
calendarDays
.
length
;
i
++
)
{
const
index
=
Math
.
floor
(
i
/
7
)
if
(
!
weeks
[
index
]){
weeks
[
index
]
=
new
Array
(
7
)
}
weeks
[
index
][
i
%
7
]
=
calendarDays
[
i
]
}
this
.
calendar
=
calendarDays
this
.
weeks
=
weeks
}
}
function
getDateTime
(
date
,
hideSecond
){
return
`
${
getDate
(
date
)}
${
getTime
(
date
,
hideSecond
)}
`
}
function
getDate
(
date
)
{
date
=
fixIosDateFormat
(
date
)
date
=
new
Date
(
date
)
const
year
=
date
.
getFullYear
()
const
month
=
date
.
getMonth
()
+
1
const
day
=
date
.
getDate
()
return
`
${
year
}
-
${
addZero
(
month
)}
-
${
addZero
(
day
)}
`
}
function
getTime
(
date
,
hideSecond
){
date
=
fixIosDateFormat
(
date
)
date
=
new
Date
(
date
)
const
hour
=
date
.
getHours
()
const
minute
=
date
.
getMinutes
()
const
second
=
date
.
getSeconds
()
return
hideSecond
?
`
${
addZero
(
hour
)}
:
${
addZero
(
minute
)}
`
:
`
${
addZero
(
hour
)}
:
${
addZero
(
minute
)}
:
${
addZero
(
second
)}
`
}
function
addZero
(
num
)
{
if
(
num
<
10
){
num
=
`0
${
num
}
`
}
return
num
}
function
getDefaultSecond
(
hideSecond
)
{
return
hideSecond
?
'00:00'
:
'00:00:00'
}
function
dateCompare
(
startDate
,
endDate
)
{
startDate
=
new
Date
(
fixIosDateFormat
(
startDate
))
endDate
=
new
Date
(
fixIosDateFormat
(
endDate
))
return
startDate
<=
endDate
}
function
checkDate
(
date
){
const
dateReg
=
/
((
19|20
)\d{2})(
-|
\/)\d{1,2}(
-|
\/)\d{1,2}
/g
return
date
.
match
(
dateReg
)
}
const
dateTimeReg
=
/^
\d{4}
-
(
0
?[
1-9
]
|1
[
012
])
-
(
0
?[
1-9
]
|
[
12
][
0-9
]
|3
[
01
])(
[
0-5
]?[
0-9
]
:
[
0-5
]?[
0-9
]
:
[
0-5
]?[
0-9
])?
$/
function
fixIosDateFormat
(
value
)
{
if
(
typeof
value
===
'string'
&&
dateTimeReg
.
test
(
value
))
{
value
=
value
.
replace
(
/-/g
,
'/'
)
}
return
value
}
export
{
Calendar
,
getDateTime
,
getDate
,
getTime
,
addZero
,
getDefaultSecond
,
dateCompare
,
checkDate
,
fixIosDateFormat
}
\ No newline at end of file
src/uni_modules/uni-datetime-picker/package.json
0 → 100644
浏览文件 @
5eae5d40
{
"id"
:
"uni-datetime-picker"
,
"displayName"
:
"uni-datetime-picker 日期选择器"
,
"version"
:
"2.2.24"
,
"description"
:
"uni-datetime-picker 日期时间选择器,支持日历,支持范围选择"
,
"keywords"
:
[
"uni-datetime-picker"
,
"uni-ui"
,
"uniui"
,
"日期时间选择器"
,
"日期时间"
],
"repository"
:
"https://github.com/dcloudio/uni-ui"
,
"engines"
:
{
"HBuilderX"
:
""
},
"directories"
:
{
"example"
:
"../../temps/example_temps"
},
"dcloudext"
:
{
"sale"
:
{
"regular"
:
{
"price"
:
"0.00"
},
"sourcecode"
:
{
"price"
:
"0.00"
}
},
"contact"
:
{
"qq"
:
""
},
"declaration"
:
{
"ads"
:
"无"
,
"data"
:
"无"
,
"permissions"
:
"无"
},
"npmurl"
:
"https://www.npmjs.com/package/@dcloudio/uni-ui"
,
"type"
:
"component-vue"
},
"uni_modules"
:
{
"dependencies"
:
[
"uni-scss"
,
"uni-icons"
],
"encrypt"
:
[],
"platforms"
:
{
"cloud"
:
{
"tcb"
:
"y"
,
"aliyun"
:
"y"
},
"client"
:
{
"App"
:
{
"app-vue"
:
"y"
,
"app-nvue"
:
"n"
},
"H5-mobile"
:
{
"Safari"
:
"y"
,
"Android Browser"
:
"y"
,
"微信浏览器(Android)"
:
"y"
,
"QQ浏览器(Android)"
:
"y"
},
"H5-pc"
:
{
"Chrome"
:
"y"
,
"IE"
:
"y"
,
"Edge"
:
"y"
,
"Firefox"
:
"y"
,
"Safari"
:
"y"
},
"小程序"
:
{
"微信"
:
"y"
,
"阿里"
:
"y"
,
"百度"
:
"y"
,
"字节跳动"
:
"y"
,
"QQ"
:
"y"
},
"快应用"
:
{
"华为"
:
"u"
,
"联盟"
:
"u"
},
"Vue"
:
{
"vue2"
:
"y"
,
"vue3"
:
"y"
}
}
}
}
}
src/uni_modules/uni-datetime-picker/readme.md
0 → 100644
浏览文件 @
5eae5d40
> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护`
## DatetimePicker 时间选择器
> **组件名:uni-datetime-picker**
> 代码块: `uDatetimePicker`
该组件的优势是,支持
**时间戳**
输入和输出(起始时间、终止时间也支持时间戳),可
**同时选择**
日期和时间。
若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。
**_点击 picker 默认值规则:_**
-
若设置初始值 value, 会显示在 picker 显示框中
-
若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
src/uni_modules/uni-icons/changelog.md
0 → 100644
浏览文件 @
5eae5d40
## 1.3.5(2022-01-24)
-
优化 size 属性可以传入不带单位的字符串数值
## 1.3.4(2022-01-24)
-
优化 size 支持其他单位
## 1.3.3(2022-01-17)
-
修复 nvue 有些图标不显示的bug,兼容老版本图标
## 1.3.2(2021-12-01)
-
优化 示例可复制图标名称
## 1.3.1(2021-11-23)
-
优化 兼容旧组件 type 值
## 1.3.0(2021-11-19)
-
新增 更多图标
-
优化 自定义图标使用方式
-
优化 组件UI,并提供设计资源,详见:
[
https://uniapp.dcloud.io/component/uniui/resource
](
https://uniapp.dcloud.io/component/uniui/resource
)
-
文档迁移,详见:
[
https://uniapp.dcloud.io/component/uniui/uni-icons
](
https://uniapp.dcloud.io/component/uniui/uni-icons
)
## 1.1.7(2021-11-08)
## 1.2.0(2021-07-30)
-
组件兼容 vue3,如何创建vue3项目,详见
[
uni-app 项目支持 vue3 介绍
](
https://ask.dcloud.net.cn/article/37834
)
## 1.1.5(2021-05-12)
-
新增 组件示例地址
## 1.1.4(2021-02-05)
-
调整为uni_modules目录规范
src/uni_modules/uni-icons/components/uni-icons/icons.js
0 → 100644
浏览文件 @
5eae5d40
export
default
{
"id"
:
"2852637"
,
"name"
:
"uniui图标库"
,
"font_family"
:
"uniicons"
,
"css_prefix_text"
:
"uniui-"
,
"description"
:
""
,
"glyphs"
:
[
{
"icon_id"
:
"25027049"
,
"name"
:
"yanse"
,
"font_class"
:
"color"
,
"unicode"
:
"e6cf"
,
"unicode_decimal"
:
59087
},
{
"icon_id"
:
"25027048"
,
"name"
:
"wallet"
,
"font_class"
:
"wallet"
,
"unicode"
:
"e6b1"
,
"unicode_decimal"
:
59057
},
{
"icon_id"
:
"25015720"
,
"name"
:
"settings-filled"
,
"font_class"
:
"settings-filled"
,
"unicode"
:
"e6ce"
,
"unicode_decimal"
:
59086
},
{
"icon_id"
:
"25015434"
,
"name"
:
"shimingrenzheng-filled"
,
"font_class"
:
"auth-filled"
,
"unicode"
:
"e6cc"
,
"unicode_decimal"
:
59084
},
{
"icon_id"
:
"24934246"
,
"name"
:
"shop-filled"
,
"font_class"
:
"shop-filled"
,
"unicode"
:
"e6cd"
,
"unicode_decimal"
:
59085
},
{
"icon_id"
:
"24934159"
,
"name"
:
"staff-filled-01"
,
"font_class"
:
"staff-filled"
,
"unicode"
:
"e6cb"
,
"unicode_decimal"
:
59083
},
{
"icon_id"
:
"24932461"
,
"name"
:
"VIP-filled"
,
"font_class"
:
"vip-filled"
,
"unicode"
:
"e6c6"
,
"unicode_decimal"
:
59078
},
{
"icon_id"
:
"24932462"
,
"name"
:
"plus_circle_fill"
,
"font_class"
:
"plus-filled"
,
"unicode"
:
"e6c7"
,
"unicode_decimal"
:
59079
},
{
"icon_id"
:
"24932463"
,
"name"
:
"folder_add-filled"
,
"font_class"
:
"folder-add-filled"
,
"unicode"
:
"e6c8"
,
"unicode_decimal"
:
59080
},
{
"icon_id"
:
"24932464"
,
"name"
:
"yanse-filled"
,
"font_class"
:
"color-filled"
,
"unicode"
:
"e6c9"
,
"unicode_decimal"
:
59081
},
{
"icon_id"
:
"24932465"
,
"name"
:
"tune-filled"
,
"font_class"
:
"tune-filled"
,
"unicode"
:
"e6ca"
,
"unicode_decimal"
:
59082
},
{
"icon_id"
:
"24932455"
,
"name"
:
"a-rilidaka-filled"
,
"font_class"
:
"calendar-filled"
,
"unicode"
:
"e6c0"
,
"unicode_decimal"
:
59072
},
{
"icon_id"
:
"24932456"
,
"name"
:
"notification-filled"
,
"font_class"
:
"notification-filled"
,
"unicode"
:
"e6c1"
,
"unicode_decimal"
:
59073
},
{
"icon_id"
:
"24932457"
,
"name"
:
"wallet-filled"
,
"font_class"
:
"wallet-filled"
,
"unicode"
:
"e6c2"
,
"unicode_decimal"
:
59074
},
{
"icon_id"
:
"24932458"
,
"name"
:
"paihangbang-filled"
,
"font_class"
:
"medal-filled"
,
"unicode"
:
"e6c3"
,
"unicode_decimal"
:
59075
},
{
"icon_id"
:
"24932459"
,
"name"
:
"gift-filled"
,
"font_class"
:
"gift-filled"
,
"unicode"
:
"e6c4"
,
"unicode_decimal"
:
59076
},
{
"icon_id"
:
"24932460"
,
"name"
:
"fire-filled"
,
"font_class"
:
"fire-filled"
,
"unicode"
:
"e6c5"
,
"unicode_decimal"
:
59077
},
{
"icon_id"
:
"24928001"
,
"name"
:
"refreshempty"
,
"font_class"
:
"refreshempty"
,
"unicode"
:
"e6bf"
,
"unicode_decimal"
:
59071
},
{
"icon_id"
:
"24926853"
,
"name"
:
"location-ellipse"
,
"font_class"
:
"location-filled"
,
"unicode"
:
"e6af"
,
"unicode_decimal"
:
59055
},
{
"icon_id"
:
"24926735"
,
"name"
:
"person-filled"
,
"font_class"
:
"person-filled"
,
"unicode"
:
"e69d"
,
"unicode_decimal"
:
59037
},
{
"icon_id"
:
"24926703"
,
"name"
:
"personadd-filled"
,
"font_class"
:
"personadd-filled"
,
"unicode"
:
"e698"
,
"unicode_decimal"
:
59032
},
{
"icon_id"
:
"24923351"
,
"name"
:
"back"
,
"font_class"
:
"back"
,
"unicode"
:
"e6b9"
,
"unicode_decimal"
:
59065
},
{
"icon_id"
:
"24923352"
,
"name"
:
"forward"
,
"font_class"
:
"forward"
,
"unicode"
:
"e6ba"
,
"unicode_decimal"
:
59066
},
{
"icon_id"
:
"24923353"
,
"name"
:
"arrowthinright"
,
"font_class"
:
"arrow-right"
,
"unicode"
:
"e6bb"
,
"unicode_decimal"
:
59067
},
{
"icon_id"
:
"24923353"
,
"name"
:
"arrowthinright"
,
"font_class"
:
"arrowthinright"
,
"unicode"
:
"e6bb"
,
"unicode_decimal"
:
59067
},
{
"icon_id"
:
"24923354"
,
"name"
:
"arrowthinleft"
,
"font_class"
:
"arrow-left"
,
"unicode"
:
"e6bc"
,
"unicode_decimal"
:
59068
},
{
"icon_id"
:
"24923354"
,
"name"
:
"arrowthinleft"
,
"font_class"
:
"arrowthinleft"
,
"unicode"
:
"e6bc"
,
"unicode_decimal"
:
59068
},
{
"icon_id"
:
"24923355"
,
"name"
:
"arrowthinup"
,
"font_class"
:
"arrow-up"
,
"unicode"
:
"e6bd"
,
"unicode_decimal"
:
59069
},
{
"icon_id"
:
"24923355"
,
"name"
:
"arrowthinup"
,
"font_class"
:
"arrowthinup"
,
"unicode"
:
"e6bd"
,
"unicode_decimal"
:
59069
},
{
"icon_id"
:
"24923356"
,
"name"
:
"arrowthindown"
,
"font_class"
:
"arrow-down"
,
"unicode"
:
"e6be"
,
"unicode_decimal"
:
59070
},{
"icon_id"
:
"24923356"
,
"name"
:
"arrowthindown"
,
"font_class"
:
"arrowthindown"
,
"unicode"
:
"e6be"
,
"unicode_decimal"
:
59070
},
{
"icon_id"
:
"24923349"
,
"name"
:
"arrowdown"
,
"font_class"
:
"bottom"
,
"unicode"
:
"e6b8"
,
"unicode_decimal"
:
59064
},{
"icon_id"
:
"24923349"
,
"name"
:
"arrowdown"
,
"font_class"
:
"arrowdown"
,
"unicode"
:
"e6b8"
,
"unicode_decimal"
:
59064
},
{
"icon_id"
:
"24923346"
,
"name"
:
"arrowright"
,
"font_class"
:
"right"
,
"unicode"
:
"e6b5"
,
"unicode_decimal"
:
59061
},
{
"icon_id"
:
"24923346"
,
"name"
:
"arrowright"
,
"font_class"
:
"arrowright"
,
"unicode"
:
"e6b5"
,
"unicode_decimal"
:
59061
},
{
"icon_id"
:
"24923347"
,
"name"
:
"arrowup"
,
"font_class"
:
"top"
,
"unicode"
:
"e6b6"
,
"unicode_decimal"
:
59062
},
{
"icon_id"
:
"24923347"
,
"name"
:
"arrowup"
,
"font_class"
:
"arrowup"
,
"unicode"
:
"e6b6"
,
"unicode_decimal"
:
59062
},
{
"icon_id"
:
"24923348"
,
"name"
:
"arrowleft"
,
"font_class"
:
"left"
,
"unicode"
:
"e6b7"
,
"unicode_decimal"
:
59063
},
{
"icon_id"
:
"24923348"
,
"name"
:
"arrowleft"
,
"font_class"
:
"arrowleft"
,
"unicode"
:
"e6b7"
,
"unicode_decimal"
:
59063
},
{
"icon_id"
:
"24923334"
,
"name"
:
"eye"
,
"font_class"
:
"eye"
,
"unicode"
:
"e651"
,
"unicode_decimal"
:
58961
},
{
"icon_id"
:
"24923335"
,
"name"
:
"eye-filled"
,
"font_class"
:
"eye-filled"
,
"unicode"
:
"e66a"
,
"unicode_decimal"
:
58986
},
{
"icon_id"
:
"24923336"
,
"name"
:
"eye-slash"
,
"font_class"
:
"eye-slash"
,
"unicode"
:
"e6b3"
,
"unicode_decimal"
:
59059
},
{
"icon_id"
:
"24923337"
,
"name"
:
"eye-slash-filled"
,
"font_class"
:
"eye-slash-filled"
,
"unicode"
:
"e6b4"
,
"unicode_decimal"
:
59060
},
{
"icon_id"
:
"24923305"
,
"name"
:
"info-filled"
,
"font_class"
:
"info-filled"
,
"unicode"
:
"e649"
,
"unicode_decimal"
:
58953
},
{
"icon_id"
:
"24923299"
,
"name"
:
"reload-01"
,
"font_class"
:
"reload"
,
"unicode"
:
"e6b2"
,
"unicode_decimal"
:
59058
},
{
"icon_id"
:
"24923195"
,
"name"
:
"mic_slash_fill"
,
"font_class"
:
"micoff-filled"
,
"unicode"
:
"e6b0"
,
"unicode_decimal"
:
59056
},
{
"icon_id"
:
"24923165"
,
"name"
:
"map-pin-ellipse"
,
"font_class"
:
"map-pin-ellipse"
,
"unicode"
:
"e6ac"
,
"unicode_decimal"
:
59052
},
{
"icon_id"
:
"24923166"
,
"name"
:
"map-pin"
,
"font_class"
:
"map-pin"
,
"unicode"
:
"e6ad"
,
"unicode_decimal"
:
59053
},
{
"icon_id"
:
"24923167"
,
"name"
:
"location"
,
"font_class"
:
"location"
,
"unicode"
:
"e6ae"
,
"unicode_decimal"
:
59054
},
{
"icon_id"
:
"24923064"
,
"name"
:
"starhalf"
,
"font_class"
:
"starhalf"
,
"unicode"
:
"e683"
,
"unicode_decimal"
:
59011
},
{
"icon_id"
:
"24923065"
,
"name"
:
"star"
,
"font_class"
:
"star"
,
"unicode"
:
"e688"
,
"unicode_decimal"
:
59016
},
{
"icon_id"
:
"24923066"
,
"name"
:
"star-filled"
,
"font_class"
:
"star-filled"
,
"unicode"
:
"e68f"
,
"unicode_decimal"
:
59023
},
{
"icon_id"
:
"24899646"
,
"name"
:
"a-rilidaka"
,
"font_class"
:
"calendar"
,
"unicode"
:
"e6a0"
,
"unicode_decimal"
:
59040
},
{
"icon_id"
:
"24899647"
,
"name"
:
"fire"
,
"font_class"
:
"fire"
,
"unicode"
:
"e6a1"
,
"unicode_decimal"
:
59041
},
{
"icon_id"
:
"24899648"
,
"name"
:
"paihangbang"
,
"font_class"
:
"medal"
,
"unicode"
:
"e6a2"
,
"unicode_decimal"
:
59042
},
{
"icon_id"
:
"24899649"
,
"name"
:
"font"
,
"font_class"
:
"font"
,
"unicode"
:
"e6a3"
,
"unicode_decimal"
:
59043
},
{
"icon_id"
:
"24899650"
,
"name"
:
"gift"
,
"font_class"
:
"gift"
,
"unicode"
:
"e6a4"
,
"unicode_decimal"
:
59044
},
{
"icon_id"
:
"24899651"
,
"name"
:
"link"
,
"font_class"
:
"link"
,
"unicode"
:
"e6a5"
,
"unicode_decimal"
:
59045
},
{
"icon_id"
:
"24899652"
,
"name"
:
"notification"
,
"font_class"
:
"notification"
,
"unicode"
:
"e6a6"
,
"unicode_decimal"
:
59046
},
{
"icon_id"
:
"24899653"
,
"name"
:
"staff"
,
"font_class"
:
"staff"
,
"unicode"
:
"e6a7"
,
"unicode_decimal"
:
59047
},
{
"icon_id"
:
"24899654"
,
"name"
:
"VIP"
,
"font_class"
:
"vip"
,
"unicode"
:
"e6a8"
,
"unicode_decimal"
:
59048
},
{
"icon_id"
:
"24899655"
,
"name"
:
"folder_add"
,
"font_class"
:
"folder-add"
,
"unicode"
:
"e6a9"
,
"unicode_decimal"
:
59049
},
{
"icon_id"
:
"24899656"
,
"name"
:
"tune"
,
"font_class"
:
"tune"
,
"unicode"
:
"e6aa"
,
"unicode_decimal"
:
59050
},
{
"icon_id"
:
"24899657"
,
"name"
:
"shimingrenzheng"
,
"font_class"
:
"auth"
,
"unicode"
:
"e6ab"
,
"unicode_decimal"
:
59051
},
{
"icon_id"
:
"24899565"
,
"name"
:
"person"
,
"font_class"
:
"person"
,
"unicode"
:
"e699"
,
"unicode_decimal"
:
59033
},
{
"icon_id"
:
"24899566"
,
"name"
:
"email-filled"
,
"font_class"
:
"email-filled"
,
"unicode"
:
"e69a"
,
"unicode_decimal"
:
59034
},
{
"icon_id"
:
"24899567"
,
"name"
:
"phone-filled"
,
"font_class"
:
"phone-filled"
,
"unicode"
:
"e69b"
,
"unicode_decimal"
:
59035
},
{
"icon_id"
:
"24899568"
,
"name"
:
"phone"
,
"font_class"
:
"phone"
,
"unicode"
:
"e69c"
,
"unicode_decimal"
:
59036
},
{
"icon_id"
:
"24899570"
,
"name"
:
"email"
,
"font_class"
:
"email"
,
"unicode"
:
"e69e"
,
"unicode_decimal"
:
59038
},
{
"icon_id"
:
"24899571"
,
"name"
:
"personadd"
,
"font_class"
:
"personadd"
,
"unicode"
:
"e69f"
,
"unicode_decimal"
:
59039
},
{
"icon_id"
:
"24899558"
,
"name"
:
"chatboxes-filled"
,
"font_class"
:
"chatboxes-filled"
,
"unicode"
:
"e692"
,
"unicode_decimal"
:
59026
},
{
"icon_id"
:
"24899559"
,
"name"
:
"contact"
,
"font_class"
:
"contact"
,
"unicode"
:
"e693"
,
"unicode_decimal"
:
59027
},
{
"icon_id"
:
"24899560"
,
"name"
:
"chatbubble-filled"
,
"font_class"
:
"chatbubble-filled"
,
"unicode"
:
"e694"
,
"unicode_decimal"
:
59028
},
{
"icon_id"
:
"24899561"
,
"name"
:
"contact-filled"
,
"font_class"
:
"contact-filled"
,
"unicode"
:
"e695"
,
"unicode_decimal"
:
59029
},
{
"icon_id"
:
"24899562"
,
"name"
:
"chatboxes"
,
"font_class"
:
"chatboxes"
,
"unicode"
:
"e696"
,
"unicode_decimal"
:
59030
},
{
"icon_id"
:
"24899563"
,
"name"
:
"chatbubble"
,
"font_class"
:
"chatbubble"
,
"unicode"
:
"e697"
,
"unicode_decimal"
:
59031
},
{
"icon_id"
:
"24881290"
,
"name"
:
"upload-filled"
,
"font_class"
:
"upload-filled"
,
"unicode"
:
"e68e"
,
"unicode_decimal"
:
59022
},
{
"icon_id"
:
"24881292"
,
"name"
:
"upload"
,
"font_class"
:
"upload"
,
"unicode"
:
"e690"
,
"unicode_decimal"
:
59024
},
{
"icon_id"
:
"24881293"
,
"name"
:
"weixin"
,
"font_class"
:
"weixin"
,
"unicode"
:
"e691"
,
"unicode_decimal"
:
59025
},
{
"icon_id"
:
"24881274"
,
"name"
:
"compose"
,
"font_class"
:
"compose"
,
"unicode"
:
"e67f"
,
"unicode_decimal"
:
59007
},
{
"icon_id"
:
"24881275"
,
"name"
:
"qq"
,
"font_class"
:
"qq"
,
"unicode"
:
"e680"
,
"unicode_decimal"
:
59008
},
{
"icon_id"
:
"24881276"
,
"name"
:
"download-filled"
,
"font_class"
:
"download-filled"
,
"unicode"
:
"e681"
,
"unicode_decimal"
:
59009
},
{
"icon_id"
:
"24881277"
,
"name"
:
"pengyouquan"
,
"font_class"
:
"pyq"
,
"unicode"
:
"e682"
,
"unicode_decimal"
:
59010
},
{
"icon_id"
:
"24881279"
,
"name"
:
"sound"
,
"font_class"
:
"sound"
,
"unicode"
:
"e684"
,
"unicode_decimal"
:
59012
},
{
"icon_id"
:
"24881280"
,
"name"
:
"trash-filled"
,
"font_class"
:
"trash-filled"
,
"unicode"
:
"e685"
,
"unicode_decimal"
:
59013
},
{
"icon_id"
:
"24881281"
,
"name"
:
"sound-filled"
,
"font_class"
:
"sound-filled"
,
"unicode"
:
"e686"
,
"unicode_decimal"
:
59014
},
{
"icon_id"
:
"24881282"
,
"name"
:
"trash"
,
"font_class"
:
"trash"
,
"unicode"
:
"e687"
,
"unicode_decimal"
:
59015
},
{
"icon_id"
:
"24881284"
,
"name"
:
"videocam-filled"
,
"font_class"
:
"videocam-filled"
,
"unicode"
:
"e689"
,
"unicode_decimal"
:
59017
},
{
"icon_id"
:
"24881285"
,
"name"
:
"spinner-cycle"
,
"font_class"
:
"spinner-cycle"
,
"unicode"
:
"e68a"
,
"unicode_decimal"
:
59018
},
{
"icon_id"
:
"24881286"
,
"name"
:
"weibo"
,
"font_class"
:
"weibo"
,
"unicode"
:
"e68b"
,
"unicode_decimal"
:
59019
},
{
"icon_id"
:
"24881288"
,
"name"
:
"videocam"
,
"font_class"
:
"videocam"
,
"unicode"
:
"e68c"
,
"unicode_decimal"
:
59020
},
{
"icon_id"
:
"24881289"
,
"name"
:
"download"
,
"font_class"
:
"download"
,
"unicode"
:
"e68d"
,
"unicode_decimal"
:
59021
},
{
"icon_id"
:
"24879601"
,
"name"
:
"help"
,
"font_class"
:
"help"
,
"unicode"
:
"e679"
,
"unicode_decimal"
:
59001
},
{
"icon_id"
:
"24879602"
,
"name"
:
"navigate-filled"
,
"font_class"
:
"navigate-filled"
,
"unicode"
:
"e67a"
,
"unicode_decimal"
:
59002
},
{
"icon_id"
:
"24879603"
,
"name"
:
"plusempty"
,
"font_class"
:
"plusempty"
,
"unicode"
:
"e67b"
,
"unicode_decimal"
:
59003
},
{
"icon_id"
:
"24879604"
,
"name"
:
"smallcircle"
,
"font_class"
:
"smallcircle"
,
"unicode"
:
"e67c"
,
"unicode_decimal"
:
59004
},
{
"icon_id"
:
"24879605"
,
"name"
:
"minus-filled"
,
"font_class"
:
"minus-filled"
,
"unicode"
:
"e67d"
,
"unicode_decimal"
:
59005
},
{
"icon_id"
:
"24879606"
,
"name"
:
"micoff"
,
"font_class"
:
"micoff"
,
"unicode"
:
"e67e"
,
"unicode_decimal"
:
59006
},
{
"icon_id"
:
"24879588"
,
"name"
:
"closeempty"
,
"font_class"
:
"closeempty"
,
"unicode"
:
"e66c"
,
"unicode_decimal"
:
58988
},
{
"icon_id"
:
"24879589"
,
"name"
:
"clear"
,
"font_class"
:
"clear"
,
"unicode"
:
"e66d"
,
"unicode_decimal"
:
58989
},
{
"icon_id"
:
"24879590"
,
"name"
:
"navigate"
,
"font_class"
:
"navigate"
,
"unicode"
:
"e66e"
,
"unicode_decimal"
:
58990
},
{
"icon_id"
:
"24879591"
,
"name"
:
"minus"
,
"font_class"
:
"minus"
,
"unicode"
:
"e66f"
,
"unicode_decimal"
:
58991
},
{
"icon_id"
:
"24879592"
,
"name"
:
"image"
,
"font_class"
:
"image"
,
"unicode"
:
"e670"
,
"unicode_decimal"
:
58992
},
{
"icon_id"
:
"24879593"
,
"name"
:
"mic"
,
"font_class"
:
"mic"
,
"unicode"
:
"e671"
,
"unicode_decimal"
:
58993
},
{
"icon_id"
:
"24879594"
,
"name"
:
"paperplane"
,
"font_class"
:
"paperplane"
,
"unicode"
:
"e672"
,
"unicode_decimal"
:
58994
},
{
"icon_id"
:
"24879595"
,
"name"
:
"close"
,
"font_class"
:
"close"
,
"unicode"
:
"e673"
,
"unicode_decimal"
:
58995
},
{
"icon_id"
:
"24879596"
,
"name"
:
"help-filled"
,
"font_class"
:
"help-filled"
,
"unicode"
:
"e674"
,
"unicode_decimal"
:
58996
},
{
"icon_id"
:
"24879597"
,
"name"
:
"plus-filled"
,
"font_class"
:
"paperplane-filled"
,
"unicode"
:
"e675"
,
"unicode_decimal"
:
58997
},
{
"icon_id"
:
"24879598"
,
"name"
:
"plus"
,
"font_class"
:
"plus"
,
"unicode"
:
"e676"
,
"unicode_decimal"
:
58998
},
{
"icon_id"
:
"24879599"
,
"name"
:
"mic-filled"
,
"font_class"
:
"mic-filled"
,
"unicode"
:
"e677"
,
"unicode_decimal"
:
58999
},
{
"icon_id"
:
"24879600"
,
"name"
:
"image-filled"
,
"font_class"
:
"image-filled"
,
"unicode"
:
"e678"
,
"unicode_decimal"
:
59000
},
{
"icon_id"
:
"24855900"
,
"name"
:
"locked-filled"
,
"font_class"
:
"locked-filled"
,
"unicode"
:
"e668"
,
"unicode_decimal"
:
58984
},
{
"icon_id"
:
"24855901"
,
"name"
:
"info"
,
"font_class"
:
"info"
,
"unicode"
:
"e669"
,
"unicode_decimal"
:
58985
},
{
"icon_id"
:
"24855903"
,
"name"
:
"locked"
,
"font_class"
:
"locked"
,
"unicode"
:
"e66b"
,
"unicode_decimal"
:
58987
},
{
"icon_id"
:
"24855884"
,
"name"
:
"camera-filled"
,
"font_class"
:
"camera-filled"
,
"unicode"
:
"e658"
,
"unicode_decimal"
:
58968
},
{
"icon_id"
:
"24855885"
,
"name"
:
"chat-filled"
,
"font_class"
:
"chat-filled"
,
"unicode"
:
"e659"
,
"unicode_decimal"
:
58969
},
{
"icon_id"
:
"24855886"
,
"name"
:
"camera"
,
"font_class"
:
"camera"
,
"unicode"
:
"e65a"
,
"unicode_decimal"
:
58970
},
{
"icon_id"
:
"24855887"
,
"name"
:
"circle"
,
"font_class"
:
"circle"
,
"unicode"
:
"e65b"
,
"unicode_decimal"
:
58971
},
{
"icon_id"
:
"24855888"
,
"name"
:
"checkmarkempty"
,
"font_class"
:
"checkmarkempty"
,
"unicode"
:
"e65c"
,
"unicode_decimal"
:
58972
},
{
"icon_id"
:
"24855889"
,
"name"
:
"chat"
,
"font_class"
:
"chat"
,
"unicode"
:
"e65d"
,
"unicode_decimal"
:
58973
},
{
"icon_id"
:
"24855890"
,
"name"
:
"circle-filled"
,
"font_class"
:
"circle-filled"
,
"unicode"
:
"e65e"
,
"unicode_decimal"
:
58974
},
{
"icon_id"
:
"24855891"
,
"name"
:
"flag"
,
"font_class"
:
"flag"
,
"unicode"
:
"e65f"
,
"unicode_decimal"
:
58975
},
{
"icon_id"
:
"24855892"
,
"name"
:
"flag-filled"
,
"font_class"
:
"flag-filled"
,
"unicode"
:
"e660"
,
"unicode_decimal"
:
58976
},
{
"icon_id"
:
"24855893"
,
"name"
:
"gear-filled"
,
"font_class"
:
"gear-filled"
,
"unicode"
:
"e661"
,
"unicode_decimal"
:
58977
},
{
"icon_id"
:
"24855894"
,
"name"
:
"home"
,
"font_class"
:
"home"
,
"unicode"
:
"e662"
,
"unicode_decimal"
:
58978
},
{
"icon_id"
:
"24855895"
,
"name"
:
"home-filled"
,
"font_class"
:
"home-filled"
,
"unicode"
:
"e663"
,
"unicode_decimal"
:
58979
},
{
"icon_id"
:
"24855896"
,
"name"
:
"gear"
,
"font_class"
:
"gear"
,
"unicode"
:
"e664"
,
"unicode_decimal"
:
58980
},
{
"icon_id"
:
"24855897"
,
"name"
:
"smallcircle-filled"
,
"font_class"
:
"smallcircle-filled"
,
"unicode"
:
"e665"
,
"unicode_decimal"
:
58981
},
{
"icon_id"
:
"24855898"
,
"name"
:
"map-filled"
,
"font_class"
:
"map-filled"
,
"unicode"
:
"e666"
,
"unicode_decimal"
:
58982
},
{
"icon_id"
:
"24855899"
,
"name"
:
"map"
,
"font_class"
:
"map"
,
"unicode"
:
"e667"
,
"unicode_decimal"
:
58983
},
{
"icon_id"
:
"24855825"
,
"name"
:
"refresh-filled"
,
"font_class"
:
"refresh-filled"
,
"unicode"
:
"e656"
,
"unicode_decimal"
:
58966
},
{
"icon_id"
:
"24855826"
,
"name"
:
"refresh"
,
"font_class"
:
"refresh"
,
"unicode"
:
"e657"
,
"unicode_decimal"
:
58967
},
{
"icon_id"
:
"24855808"
,
"name"
:
"cloud-upload"
,
"font_class"
:
"cloud-upload"
,
"unicode"
:
"e645"
,
"unicode_decimal"
:
58949
},
{
"icon_id"
:
"24855809"
,
"name"
:
"cloud-download-filled"
,
"font_class"
:
"cloud-download-filled"
,
"unicode"
:
"e646"
,
"unicode_decimal"
:
58950
},
{
"icon_id"
:
"24855810"
,
"name"
:
"cloud-download"
,
"font_class"
:
"cloud-download"
,
"unicode"
:
"e647"
,
"unicode_decimal"
:
58951
},
{
"icon_id"
:
"24855811"
,
"name"
:
"cloud-upload-filled"
,
"font_class"
:
"cloud-upload-filled"
,
"unicode"
:
"e648"
,
"unicode_decimal"
:
58952
},
{
"icon_id"
:
"24855813"
,
"name"
:
"redo"
,
"font_class"
:
"redo"
,
"unicode"
:
"e64a"
,
"unicode_decimal"
:
58954
},
{
"icon_id"
:
"24855814"
,
"name"
:
"images-filled"
,
"font_class"
:
"images-filled"
,
"unicode"
:
"e64b"
,
"unicode_decimal"
:
58955
},
{
"icon_id"
:
"24855815"
,
"name"
:
"undo-filled"
,
"font_class"
:
"undo-filled"
,
"unicode"
:
"e64c"
,
"unicode_decimal"
:
58956
},
{
"icon_id"
:
"24855816"
,
"name"
:
"more"
,
"font_class"
:
"more"
,
"unicode"
:
"e64d"
,
"unicode_decimal"
:
58957
},
{
"icon_id"
:
"24855817"
,
"name"
:
"more-filled"
,
"font_class"
:
"more-filled"
,
"unicode"
:
"e64e"
,
"unicode_decimal"
:
58958
},
{
"icon_id"
:
"24855818"
,
"name"
:
"undo"
,
"font_class"
:
"undo"
,
"unicode"
:
"e64f"
,
"unicode_decimal"
:
58959
},
{
"icon_id"
:
"24855819"
,
"name"
:
"images"
,
"font_class"
:
"images"
,
"unicode"
:
"e650"
,
"unicode_decimal"
:
58960
},
{
"icon_id"
:
"24855821"
,
"name"
:
"paperclip"
,
"font_class"
:
"paperclip"
,
"unicode"
:
"e652"
,
"unicode_decimal"
:
58962
},
{
"icon_id"
:
"24855822"
,
"name"
:
"settings"
,
"font_class"
:
"settings"
,
"unicode"
:
"e653"
,
"unicode_decimal"
:
58963
},
{
"icon_id"
:
"24855823"
,
"name"
:
"search"
,
"font_class"
:
"search"
,
"unicode"
:
"e654"
,
"unicode_decimal"
:
58964
},
{
"icon_id"
:
"24855824"
,
"name"
:
"redo-filled"
,
"font_class"
:
"redo-filled"
,
"unicode"
:
"e655"
,
"unicode_decimal"
:
58965
},
{
"icon_id"
:
"24841702"
,
"name"
:
"list"
,
"font_class"
:
"list"
,
"unicode"
:
"e644"
,
"unicode_decimal"
:
58948
},
{
"icon_id"
:
"24841489"
,
"name"
:
"mail-open-filled"
,
"font_class"
:
"mail-open-filled"
,
"unicode"
:
"e63a"
,
"unicode_decimal"
:
58938
},
{
"icon_id"
:
"24841491"
,
"name"
:
"hand-thumbsdown-filled"
,
"font_class"
:
"hand-down-filled"
,
"unicode"
:
"e63c"
,
"unicode_decimal"
:
58940
},
{
"icon_id"
:
"24841492"
,
"name"
:
"hand-thumbsdown"
,
"font_class"
:
"hand-down"
,
"unicode"
:
"e63d"
,
"unicode_decimal"
:
58941
},
{
"icon_id"
:
"24841493"
,
"name"
:
"hand-thumbsup-filled"
,
"font_class"
:
"hand-up-filled"
,
"unicode"
:
"e63e"
,
"unicode_decimal"
:
58942
},
{
"icon_id"
:
"24841494"
,
"name"
:
"hand-thumbsup"
,
"font_class"
:
"hand-up"
,
"unicode"
:
"e63f"
,
"unicode_decimal"
:
58943
},
{
"icon_id"
:
"24841496"
,
"name"
:
"heart-filled"
,
"font_class"
:
"heart-filled"
,
"unicode"
:
"e641"
,
"unicode_decimal"
:
58945
},
{
"icon_id"
:
"24841498"
,
"name"
:
"mail-open"
,
"font_class"
:
"mail-open"
,
"unicode"
:
"e643"
,
"unicode_decimal"
:
58947
},
{
"icon_id"
:
"24841488"
,
"name"
:
"heart"
,
"font_class"
:
"heart"
,
"unicode"
:
"e639"
,
"unicode_decimal"
:
58937
},
{
"icon_id"
:
"24839963"
,
"name"
:
"loop"
,
"font_class"
:
"loop"
,
"unicode"
:
"e633"
,
"unicode_decimal"
:
58931
},
{
"icon_id"
:
"24839866"
,
"name"
:
"pulldown"
,
"font_class"
:
"pulldown"
,
"unicode"
:
"e632"
,
"unicode_decimal"
:
58930
},
{
"icon_id"
:
"24813798"
,
"name"
:
"scan"
,
"font_class"
:
"scan"
,
"unicode"
:
"e62a"
,
"unicode_decimal"
:
58922
},
{
"icon_id"
:
"24813786"
,
"name"
:
"bars"
,
"font_class"
:
"bars"
,
"unicode"
:
"e627"
,
"unicode_decimal"
:
58919
},
{
"icon_id"
:
"24813788"
,
"name"
:
"cart-filled"
,
"font_class"
:
"cart-filled"
,
"unicode"
:
"e629"
,
"unicode_decimal"
:
58921
},
{
"icon_id"
:
"24813790"
,
"name"
:
"checkbox"
,
"font_class"
:
"checkbox"
,
"unicode"
:
"e62b"
,
"unicode_decimal"
:
58923
},
{
"icon_id"
:
"24813791"
,
"name"
:
"checkbox-filled"
,
"font_class"
:
"checkbox-filled"
,
"unicode"
:
"e62c"
,
"unicode_decimal"
:
58924
},
{
"icon_id"
:
"24813794"
,
"name"
:
"shop"
,
"font_class"
:
"shop"
,
"unicode"
:
"e62f"
,
"unicode_decimal"
:
58927
},
{
"icon_id"
:
"24813795"
,
"name"
:
"headphones"
,
"font_class"
:
"headphones"
,
"unicode"
:
"e630"
,
"unicode_decimal"
:
58928
},
{
"icon_id"
:
"24813796"
,
"name"
:
"cart"
,
"font_class"
:
"cart"
,
"unicode"
:
"e631"
,
"unicode_decimal"
:
58929
}
]
}
src/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<!-- #ifdef APP-NVUE -->
<text
:style=
"
{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">
{{
unicode
}}
</text>
<!-- #endif -->
<!-- #ifndef APP-NVUE -->
<text
:style=
"
{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick">
</text>
<!-- #endif -->
</
template
>
<
script
>
import
icons
from
'./icons.js'
;
const
getVal
=
(
val
)
=>
{
const
reg
=
/^
[
0-9
]
*$/g
return
(
typeof
val
===
'number'
||
reg
.
test
(
val
)
)?
val
+
'px'
:
val
;
}
// #ifdef APP-NVUE
var
domModule
=
weex
.
requireModule
(
'dom'
);
import
iconUrl
from
'./uniicons.ttf'
domModule
.
addRule
(
'fontFace'
,
{
'fontFamily'
:
"uniicons"
,
'src'
:
"url('"
+
iconUrl
+
"')"
});
// #endif
/**
* Icons 图标
* @description 用于展示 icons 图标
* @tutorial https://ext.dcloud.net.cn/plugin?id=28
* @property {Number} size 图标大小
* @property {String} type 图标图案,参考示例
* @property {String} color 图标颜色
* @property {String} customPrefix 自定义图标
* @event {Function} click 点击 Icon 触发事件
*/
export
default
{
name
:
'UniIcons'
,
emits
:[
'click'
],
props
:
{
type
:
{
type
:
String
,
default
:
''
},
color
:
{
type
:
String
,
default
:
'#333333'
},
size
:
{
type
:
[
Number
,
String
],
default
:
16
},
customPrefix
:{
type
:
String
,
default
:
''
}
},
data
()
{
return
{
icons
:
icons
.
glyphs
}
},
computed
:{
unicode
(){
let
code
=
this
.
icons
.
find
(
v
=>
v
.
font_class
===
this
.
type
)
if
(
code
){
return
unescape
(
`%u
${
code
.
unicode
}
`
)
}
return
''
},
iconSize
(){
return
getVal
(
this
.
size
)
}
},
methods
:
{
_onClick
()
{
this
.
$emit
(
'click'
)
}
}
}
</
script
>
<
style
lang=
"scss"
>
/* #ifndef APP-NVUE */
@import
'./uniicons.css'
;
@font-face
{
font-family
:
uniicons
;
src
:
url('./uniicons.ttf')
format
(
'truetype'
);
}
/* #endif */
.uni-icons
{
font-family
:
uniicons
;
text-decoration
:
none
;
text-align
:
center
;
}
</
style
>
src/uni_modules/uni-icons/components/uni-icons/uniicons.css
0 → 100644
浏览文件 @
5eae5d40
.uniui-color
:before
{
content
:
"\e6cf"
;
}
.uniui-wallet
:before
{
content
:
"\e6b1"
;
}
.uniui-settings-filled
:before
{
content
:
"\e6ce"
;
}
.uniui-auth-filled
:before
{
content
:
"\e6cc"
;
}
.uniui-shop-filled
:before
{
content
:
"\e6cd"
;
}
.uniui-staff-filled
:before
{
content
:
"\e6cb"
;
}
.uniui-vip-filled
:before
{
content
:
"\e6c6"
;
}
.uniui-plus-filled
:before
{
content
:
"\e6c7"
;
}
.uniui-folder-add-filled
:before
{
content
:
"\e6c8"
;
}
.uniui-color-filled
:before
{
content
:
"\e6c9"
;
}
.uniui-tune-filled
:before
{
content
:
"\e6ca"
;
}
.uniui-calendar-filled
:before
{
content
:
"\e6c0"
;
}
.uniui-notification-filled
:before
{
content
:
"\e6c1"
;
}
.uniui-wallet-filled
:before
{
content
:
"\e6c2"
;
}
.uniui-medal-filled
:before
{
content
:
"\e6c3"
;
}
.uniui-gift-filled
:before
{
content
:
"\e6c4"
;
}
.uniui-fire-filled
:before
{
content
:
"\e6c5"
;
}
.uniui-refreshempty
:before
{
content
:
"\e6bf"
;
}
.uniui-location-filled
:before
{
content
:
"\e6af"
;
}
.uniui-person-filled
:before
{
content
:
"\e69d"
;
}
.uniui-personadd-filled
:before
{
content
:
"\e698"
;
}
.uniui-back
:before
{
content
:
"\e6b9"
;
}
.uniui-forward
:before
{
content
:
"\e6ba"
;
}
.uniui-arrow-right
:before
{
content
:
"\e6bb"
;
}
.uniui-arrowthinright
:before
{
content
:
"\e6bb"
;
}
.uniui-arrow-left
:before
{
content
:
"\e6bc"
;
}
.uniui-arrowthinleft
:before
{
content
:
"\e6bc"
;
}
.uniui-arrow-up
:before
{
content
:
"\e6bd"
;
}
.uniui-arrowthinup
:before
{
content
:
"\e6bd"
;
}
.uniui-arrow-down
:before
{
content
:
"\e6be"
;
}
.uniui-arrowthindown
:before
{
content
:
"\e6be"
;
}
.uniui-bottom
:before
{
content
:
"\e6b8"
;
}
.uniui-arrowdown
:before
{
content
:
"\e6b8"
;
}
.uniui-right
:before
{
content
:
"\e6b5"
;
}
.uniui-arrowright
:before
{
content
:
"\e6b5"
;
}
.uniui-top
:before
{
content
:
"\e6b6"
;
}
.uniui-arrowup
:before
{
content
:
"\e6b6"
;
}
.uniui-left
:before
{
content
:
"\e6b7"
;
}
.uniui-arrowleft
:before
{
content
:
"\e6b7"
;
}
.uniui-eye
:before
{
content
:
"\e651"
;
}
.uniui-eye-filled
:before
{
content
:
"\e66a"
;
}
.uniui-eye-slash
:before
{
content
:
"\e6b3"
;
}
.uniui-eye-slash-filled
:before
{
content
:
"\e6b4"
;
}
.uniui-info-filled
:before
{
content
:
"\e649"
;
}
.uniui-reload
:before
{
content
:
"\e6b2"
;
}
.uniui-micoff-filled
:before
{
content
:
"\e6b0"
;
}
.uniui-map-pin-ellipse
:before
{
content
:
"\e6ac"
;
}
.uniui-map-pin
:before
{
content
:
"\e6ad"
;
}
.uniui-location
:before
{
content
:
"\e6ae"
;
}
.uniui-starhalf
:before
{
content
:
"\e683"
;
}
.uniui-star
:before
{
content
:
"\e688"
;
}
.uniui-star-filled
:before
{
content
:
"\e68f"
;
}
.uniui-calendar
:before
{
content
:
"\e6a0"
;
}
.uniui-fire
:before
{
content
:
"\e6a1"
;
}
.uniui-medal
:before
{
content
:
"\e6a2"
;
}
.uniui-font
:before
{
content
:
"\e6a3"
;
}
.uniui-gift
:before
{
content
:
"\e6a4"
;
}
.uniui-link
:before
{
content
:
"\e6a5"
;
}
.uniui-notification
:before
{
content
:
"\e6a6"
;
}
.uniui-staff
:before
{
content
:
"\e6a7"
;
}
.uniui-vip
:before
{
content
:
"\e6a8"
;
}
.uniui-folder-add
:before
{
content
:
"\e6a9"
;
}
.uniui-tune
:before
{
content
:
"\e6aa"
;
}
.uniui-auth
:before
{
content
:
"\e6ab"
;
}
.uniui-person
:before
{
content
:
"\e699"
;
}
.uniui-email-filled
:before
{
content
:
"\e69a"
;
}
.uniui-phone-filled
:before
{
content
:
"\e69b"
;
}
.uniui-phone
:before
{
content
:
"\e69c"
;
}
.uniui-email
:before
{
content
:
"\e69e"
;
}
.uniui-personadd
:before
{
content
:
"\e69f"
;
}
.uniui-chatboxes-filled
:before
{
content
:
"\e692"
;
}
.uniui-contact
:before
{
content
:
"\e693"
;
}
.uniui-chatbubble-filled
:before
{
content
:
"\e694"
;
}
.uniui-contact-filled
:before
{
content
:
"\e695"
;
}
.uniui-chatboxes
:before
{
content
:
"\e696"
;
}
.uniui-chatbubble
:before
{
content
:
"\e697"
;
}
.uniui-upload-filled
:before
{
content
:
"\e68e"
;
}
.uniui-upload
:before
{
content
:
"\e690"
;
}
.uniui-weixin
:before
{
content
:
"\e691"
;
}
.uniui-compose
:before
{
content
:
"\e67f"
;
}
.uniui-qq
:before
{
content
:
"\e680"
;
}
.uniui-download-filled
:before
{
content
:
"\e681"
;
}
.uniui-pyq
:before
{
content
:
"\e682"
;
}
.uniui-sound
:before
{
content
:
"\e684"
;
}
.uniui-trash-filled
:before
{
content
:
"\e685"
;
}
.uniui-sound-filled
:before
{
content
:
"\e686"
;
}
.uniui-trash
:before
{
content
:
"\e687"
;
}
.uniui-videocam-filled
:before
{
content
:
"\e689"
;
}
.uniui-spinner-cycle
:before
{
content
:
"\e68a"
;
}
.uniui-weibo
:before
{
content
:
"\e68b"
;
}
.uniui-videocam
:before
{
content
:
"\e68c"
;
}
.uniui-download
:before
{
content
:
"\e68d"
;
}
.uniui-help
:before
{
content
:
"\e679"
;
}
.uniui-navigate-filled
:before
{
content
:
"\e67a"
;
}
.uniui-plusempty
:before
{
content
:
"\e67b"
;
}
.uniui-smallcircle
:before
{
content
:
"\e67c"
;
}
.uniui-minus-filled
:before
{
content
:
"\e67d"
;
}
.uniui-micoff
:before
{
content
:
"\e67e"
;
}
.uniui-closeempty
:before
{
content
:
"\e66c"
;
}
.uniui-clear
:before
{
content
:
"\e66d"
;
}
.uniui-navigate
:before
{
content
:
"\e66e"
;
}
.uniui-minus
:before
{
content
:
"\e66f"
;
}
.uniui-image
:before
{
content
:
"\e670"
;
}
.uniui-mic
:before
{
content
:
"\e671"
;
}
.uniui-paperplane
:before
{
content
:
"\e672"
;
}
.uniui-close
:before
{
content
:
"\e673"
;
}
.uniui-help-filled
:before
{
content
:
"\e674"
;
}
.uniui-paperplane-filled
:before
{
content
:
"\e675"
;
}
.uniui-plus
:before
{
content
:
"\e676"
;
}
.uniui-mic-filled
:before
{
content
:
"\e677"
;
}
.uniui-image-filled
:before
{
content
:
"\e678"
;
}
.uniui-locked-filled
:before
{
content
:
"\e668"
;
}
.uniui-info
:before
{
content
:
"\e669"
;
}
.uniui-locked
:before
{
content
:
"\e66b"
;
}
.uniui-camera-filled
:before
{
content
:
"\e658"
;
}
.uniui-chat-filled
:before
{
content
:
"\e659"
;
}
.uniui-camera
:before
{
content
:
"\e65a"
;
}
.uniui-circle
:before
{
content
:
"\e65b"
;
}
.uniui-checkmarkempty
:before
{
content
:
"\e65c"
;
}
.uniui-chat
:before
{
content
:
"\e65d"
;
}
.uniui-circle-filled
:before
{
content
:
"\e65e"
;
}
.uniui-flag
:before
{
content
:
"\e65f"
;
}
.uniui-flag-filled
:before
{
content
:
"\e660"
;
}
.uniui-gear-filled
:before
{
content
:
"\e661"
;
}
.uniui-home
:before
{
content
:
"\e662"
;
}
.uniui-home-filled
:before
{
content
:
"\e663"
;
}
.uniui-gear
:before
{
content
:
"\e664"
;
}
.uniui-smallcircle-filled
:before
{
content
:
"\e665"
;
}
.uniui-map-filled
:before
{
content
:
"\e666"
;
}
.uniui-map
:before
{
content
:
"\e667"
;
}
.uniui-refresh-filled
:before
{
content
:
"\e656"
;
}
.uniui-refresh
:before
{
content
:
"\e657"
;
}
.uniui-cloud-upload
:before
{
content
:
"\e645"
;
}
.uniui-cloud-download-filled
:before
{
content
:
"\e646"
;
}
.uniui-cloud-download
:before
{
content
:
"\e647"
;
}
.uniui-cloud-upload-filled
:before
{
content
:
"\e648"
;
}
.uniui-redo
:before
{
content
:
"\e64a"
;
}
.uniui-images-filled
:before
{
content
:
"\e64b"
;
}
.uniui-undo-filled
:before
{
content
:
"\e64c"
;
}
.uniui-more
:before
{
content
:
"\e64d"
;
}
.uniui-more-filled
:before
{
content
:
"\e64e"
;
}
.uniui-undo
:before
{
content
:
"\e64f"
;
}
.uniui-images
:before
{
content
:
"\e650"
;
}
.uniui-paperclip
:before
{
content
:
"\e652"
;
}
.uniui-settings
:before
{
content
:
"\e653"
;
}
.uniui-search
:before
{
content
:
"\e654"
;
}
.uniui-redo-filled
:before
{
content
:
"\e655"
;
}
.uniui-list
:before
{
content
:
"\e644"
;
}
.uniui-mail-open-filled
:before
{
content
:
"\e63a"
;
}
.uniui-hand-down-filled
:before
{
content
:
"\e63c"
;
}
.uniui-hand-down
:before
{
content
:
"\e63d"
;
}
.uniui-hand-up-filled
:before
{
content
:
"\e63e"
;
}
.uniui-hand-up
:before
{
content
:
"\e63f"
;
}
.uniui-heart-filled
:before
{
content
:
"\e641"
;
}
.uniui-mail-open
:before
{
content
:
"\e643"
;
}
.uniui-heart
:before
{
content
:
"\e639"
;
}
.uniui-loop
:before
{
content
:
"\e633"
;
}
.uniui-pulldown
:before
{
content
:
"\e632"
;
}
.uniui-scan
:before
{
content
:
"\e62a"
;
}
.uniui-bars
:before
{
content
:
"\e627"
;
}
.uniui-cart-filled
:before
{
content
:
"\e629"
;
}
.uniui-checkbox
:before
{
content
:
"\e62b"
;
}
.uniui-checkbox-filled
:before
{
content
:
"\e62c"
;
}
.uniui-shop
:before
{
content
:
"\e62f"
;
}
.uniui-headphones
:before
{
content
:
"\e630"
;
}
.uniui-cart
:before
{
content
:
"\e631"
;
}
src/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
0 → 100644
浏览文件 @
5eae5d40
File added
src/uni_modules/uni-icons/package.json
0 → 100644
浏览文件 @
5eae5d40
{
"id"
:
"uni-icons"
,
"displayName"
:
"uni-icons 图标"
,
"version"
:
"1.3.5"
,
"description"
:
"图标组件,用于展示移动端常见的图标,可自定义颜色、大小。"
,
"keywords"
:
[
"uni-ui"
,
"uniui"
,
"icon"
,
"图标"
],
"repository"
:
"https://github.com/dcloudio/uni-ui"
,
"engines"
:
{
"HBuilderX"
:
"^3.2.14"
},
"directories"
:
{
"example"
:
"../../temps/example_temps"
},
"dcloudext"
:
{
"category"
:
[
"前端组件"
,
"通用组件"
],
"sale"
:
{
"regular"
:
{
"price"
:
"0.00"
},
"sourcecode"
:
{
"price"
:
"0.00"
}
},
"contact"
:
{
"qq"
:
""
},
"declaration"
:
{
"ads"
:
"无"
,
"data"
:
"无"
,
"permissions"
:
"无"
},
"npmurl"
:
"https://www.npmjs.com/package/@dcloudio/uni-ui"
},
"uni_modules"
:
{
"dependencies"
:
[
"uni-scss"
],
"encrypt"
:
[],
"platforms"
:
{
"cloud"
:
{
"tcb"
:
"y"
,
"aliyun"
:
"y"
},
"client"
:
{
"App"
:
{
"app-vue"
:
"y"
,
"app-nvue"
:
"y"
},
"H5-mobile"
:
{
"Safari"
:
"y"
,
"Android Browser"
:
"y"
,
"微信浏览器(Android)"
:
"y"
,
"QQ浏览器(Android)"
:
"y"
},
"H5-pc"
:
{
"Chrome"
:
"y"
,
"IE"
:
"y"
,
"Edge"
:
"y"
,
"Firefox"
:
"y"
,
"Safari"
:
"y"
},
"小程序"
:
{
"微信"
:
"y"
,
"阿里"
:
"y"
,
"百度"
:
"y"
,
"字节跳动"
:
"y"
,
"QQ"
:
"y"
},
"快应用"
:
{
"华为"
:
"u"
,
"联盟"
:
"u"
},
"Vue"
:
{
"vue2"
:
"y"
,
"vue3"
:
"y"
}
}
}
}
}
\ No newline at end of file
src/uni_modules/uni-icons/readme.md
0 → 100644
浏览文件 @
5eae5d40
## Icons 图标
> **组件名:uni-icons**
> 代码块: `uIcons`
用于展示 icons 图标 。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
src/uni_modules/uni-scss/styles/setting/_variables.scss
浏览文件 @
5eae5d40
// @use "sass:math";
@import
'../tools/functions.scss'
;
@import
'../tools/functions.scss'
;
// 间距基础倍数
$uni-space-root
:
2
!
default
;
// 边框半径默认值
$uni-radius-root
:
5px
!
default
;
$uni-radius-root
:
5px
!
default
;
$uni-radius
:
()
!
default
;
// 边框半径断点
$uni-radius
:
map-deep-merge
(
(
0
:
0
,
//
TODO
当前版本暂时不支持
sm
属性
//
'sm'
:
math
.
div
(
$uni-radius-root
,
2
)
,
null
:
$uni-radius-root
,
'lg'
:
$uni-radius-root
*
2
,
'xl'
:
$uni-radius-root
*
6
,
'pill'
:
9999px
,
'circle'
:
50%
,
)
,
$uni-radius
(
0
:
0
,
//
TODO
当前版本暂时不支持
sm
属性
//
'sm'
:
math
.
div
(
$uni-radius-root
,
2
)
,
null
:
$uni-radius-root
,
'lg'
:
$uni-radius-root
*
2
,
'xl'
:
$uni-radius-root
*
6
,
'pill'
:
9999px
,
'circle'
:
50%
)
,
$uni-radius
);
// 字体家族
$body-font-family
:
'Roboto'
,
sans-serif
!
default
;
...
...
@@ -26,109 +26,108 @@ $heading-font-family: $body-font-family !default;
$uni-headings
:
()
!
default
;
$letterSpacing
:
-0
.01562em
;
$uni-headings
:
map-deep-merge
(
(
'h1'
:
(
size
:
32px
,
weight
:
300
,
line-height
:
50px
,
//
letter-spacing
:-
0
.01562em
)
,
'h2'
:
(
size
:
28px
,
weight
:
300
,
line-height
:
40px
,
//
letter-spacing
:
-0
.00833em
)
,
'h3'
:
(
size
:
24px
,
weight
:
400
,
line-height
:
32px
,
//
letter-spacing
:
normal
)
,
'h4'
:
(
size
:
20px
,
weight
:
400
,
line-height
:
30px
,
//
letter-spacing
:
0
.00735em
)
,
'h5'
:
(
size
:
16px
,
weight
:
400
,
line-height
:
24px
,
//
letter-spacing
:
normal
)
,
'h6'
:
(
size
:
14px
,
weight
:
500
,
line-height
:
18px
,
//
letter-spacing
:
0
.0125em
(
'h1'
:
(
size
:
32px
,
weight
:
300
,
line-height
:
50px
,
//
letter-spacing
:-
0
.01562em
)
,
'h2'
:
(
size
:
28px
,
weight
:
300
,
line-height
:
40px
,
//
letter-spacing
:
-0
.00833em
)
,
'h3'
:
(
size
:
24px
,
weight
:
400
,
line-height
:
32px
,
//
letter-spacing
:
normal
)
,
'h4'
:
(
size
:
20px
,
weight
:
400
,
line-height
:
30px
,
//
letter-spacing
:
0
.00735em
)
,
'h5'
:
(
size
:
16px
,
weight
:
400
,
line-height
:
24px
,
//
letter-spacing
:
normal
)
,
'h6'
:
(
size
:
14px
,
weight
:
500
,
line-height
:
18px
,
//
letter-spacing
:
0
.0125em
)
,
'subtitle'
:
(
size
:
12px
,
weight
:
400
,
line-height
:
20px
,
//
letter-spacing
:
0
.00937em
)
,
'body'
:
(
font-size
:
14px
,
font-weight
:
400
,
line-height
:
22px
,
//
letter-spacing
:
0
.03125em
)
,
'caption'
:
(
'size'
:
12px
,
'weight'
:
400
,
'line-height'
:
20px
,
//
'letter-spacing'
:
0
.03333em
,
//
'text-transform'
:
false
)
)
,
'subtitle'
:
(
size
:
12px
,
weight
:
400
,
line-height
:
20px
,
//
letter-spacing
:
0
.00937em
)
,
'page'
:
(
font-size
:
14px
,
font-weight
:
400
,
line-height
:
22px
,
//
letter-spacing
:
0
.03125em
)
,
'caption'
:
(
'size'
:
12px
,
'weight'
:
400
,
'line-height'
:
20px
,
//
'letter-spacing'
:
0
.03333em
,
//
'text-transform'
:
false
,,
)
,
)
,
$uni-headings
$uni-headings
);
// 主色
$uni-primary
:
#2979ff
!
default
;
$uni-primary-disable
:
lighten
(
$uni-primary
,
20%
)
!
default
;
$uni-primary-light
:
lighten
(
$uni-primary
,
25%
)
!
default
;
$uni-primary-disable
:
lighten
(
$uni-primary
,
20%
)
!
default
;
$uni-primary-light
:
lighten
(
$uni-primary
,
25%
)
!
default
;
// 辅助色
// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
$uni-success
:
#18bc37
!
default
;
$uni-success-disable
:
lighten
(
$uni-success
,
20%
)
!
default
;
$uni-success-light
:
lighten
(
$uni-success
,
25%
)
!
default
;
$uni-success-disable
:
lighten
(
$uni-success
,
20%
)
!
default
;
$uni-success-light
:
lighten
(
$uni-success
,
25%
)
!
default
;
$uni-warning
:
#f3a73f
!
default
;
$uni-warning-disable
:
lighten
(
$uni-warning
,
20%
)
!
default
;
$uni-warning-light
:
lighten
(
$uni-warning
,
25%
)
!
default
;
$uni-warning-disable
:
lighten
(
$uni-warning
,
20%
)
!
default
;
$uni-warning-light
:
lighten
(
$uni-warning
,
25%
)
!
default
;
$uni-error
:
#e43d33
!
default
;
$uni-error-disable
:
lighten
(
$uni-error
,
20%
)
!
default
;
$uni-error-light
:
lighten
(
$uni-error
,
25%
)
!
default
;
$uni-error-disable
:
lighten
(
$uni-error
,
20%
)
!
default
;
$uni-error-light
:
lighten
(
$uni-error
,
25%
)
!
default
;
$uni-info
:
#8f939c
!
default
;
$uni-info-disable
:
lighten
(
$uni-info
,
20%
)
!
default
;
$uni-info-light
:
lighten
(
$uni-info
,
25%
)
!
default
;
$uni-info-disable
:
lighten
(
$uni-info
,
20%
)
!
default
;
$uni-info-light
:
lighten
(
$uni-info
,
25%
)
!
default
;
// 中性色
// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
$uni-main-color
:
#3a3a3a
!
default
;
// 主要文字
$uni-base-color
:
#6a6a6a
!
default
;
// 常规文字
$uni-secondary-color
:
#909399
!
default
;
// 次要文字
$uni-extra-color
:
#c7c7c7
!
default
;
// 辅助说明
$uni-main-color
:
#3a3a3a
!
default
;
// 主要文字
$uni-base-color
:
#6a6a6a
!
default
;
// 常规文字
$uni-secondary-color
:
#909399
!
default
;
// 次要文字
$uni-extra-color
:
#c7c7c7
!
default
;
// 辅助说明
// 边框颜色
$uni-border-1
:
#
f0f0f
0
!
default
;
$uni-border-2
:
#
ededed
!
default
;
$uni-border-3
:
#
dcdcdc
!
default
;
$uni-border-4
:
#
b9b9b
9
!
default
;
$uni-border-1
:
#
F0F0F
0
!
default
;
$uni-border-2
:
#
EDEDED
!
default
;
$uni-border-3
:
#
DCDCDC
!
default
;
$uni-border-4
:
#
B9B9B
9
!
default
;
// 常规色
$uni-black
:
#000000
!
default
;
$uni-white
:
#ffffff
!
default
;
$uni-transparent
:
rgba
(
$color
:
#000000
,
$alpha
:
0
,
)
!
default
;
$uni-transparent
:
rgba
(
$color
:
#000000
,
$alpha
:
0
)
!
default
;
// 背景色
$uni-bg-color
:
#f7f7f7
!
default
;
...
...
@@ -139,24 +138,9 @@ $uni-spacing-base: 15px !default;
$uni-spacing-lg
:
30px
!
default
;
// 阴影
$uni-shadow-sm
:
0
0
5px
rgba
(
$color
:
#d8d8d8
,
$alpha
:
0
.5
,
)
!
default
;
$uni-shadow-base
:
0
1px
8px
1px
rgba
(
$color
:
#a5a5a5
,
$alpha
:
0
.2
,
)
!
default
;
$uni-shadow-lg
:
0px
1px
10px
2px
rgba
(
$color
:
#a5a4a4
,
$alpha
:
0
.5
,
)
!
default
;
$uni-shadow-sm
:
0
0
5px
rgba
(
$color
:
#d8d8d8
,
$alpha
:
0
.5
)
!
default
;
$uni-shadow-base
:
0
1px
8px
1px
rgba
(
$color
:
#a5a5a5
,
$alpha
:
0
.2
)
!
default
;
$uni-shadow-lg
:
0px
1px
10px
2px
rgba
(
$color
:
#a5a4a4
,
$alpha
:
0
.5
)
!
default
;
// 蒙版
$uni-mask
:
rgba
(
$color
:
#000000
,
$alpha
:
0
.4
,
)
!
default
;
$uni-mask
:
rgba
(
$color
:
#000000
,
$alpha
:
0
.4
)
!
default
;
src/uni_modules/uni-table/changelog.md
0 → 100644
浏览文件 @
5eae5d40
## 1.2.3(2023-03-28)
-
修复 在vue3模式下可能会出现错误的问题
## 1.2.2(2022-11-29)
-
优化 主题样式
## 1.2.1(2022-06-06)
-
修复 微信小程序存在无使用组件的问题
## 1.2.0(2021-11-19)
-
优化 组件UI,并提供设计资源,详见:
[
https://uniapp.dcloud.io/component/uniui/resource
](
https://uniapp.dcloud.io/component/uniui/resource
)
-
文档迁移,详见:
[
https://uniapp.dcloud.io/component/uniui/uni-table
](
https://uniapp.dcloud.io/component/uniui/uni-table
)
## 1.1.0(2021-07-30)
-
组件兼容 vue3,如何创建vue3项目,详见
[
uni-app 项目支持 vue3 介绍
](
https://ask.dcloud.net.cn/article/37834
)
## 1.0.7(2021-07-08)
-
新增 uni-th 支持 date 日期筛选范围
## 1.0.6(2021-07-05)
-
新增 uni-th 支持 range 筛选范围
## 1.0.5(2021-06-28)
-
新增 uni-th 筛选功能
## 1.0.4(2021-05-12)
-
新增 示例地址
-
修复 示例项目缺少组件的Bug
## 1.0.3(2021-04-16)
-
新增 sortable 属性,是否开启单列排序
-
优化 表格多选逻辑
## 1.0.2(2021-03-22)
-
uni-tr 添加 disabled 属性,用于 type=selection 时,设置某行是否可由全选按钮控制
## 1.0.1(2021-02-05)
-
调整为uni_modules目录规范
src/uni_modules/uni-table/components/uni-table/uni-table.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-table-scroll"
:class=
"
{ 'table--border': border, 'border-none': !noData }">
<!-- #ifdef H5 -->
<table
class=
"uni-table"
border=
"0"
cellpadding=
"0"
cellspacing=
"0"
:class=
"
{ 'table--stripe': stripe }" :style="{ 'min-width': minWidth + 'px' }">
<slot></slot>
<tr
v-if=
"noData"
class=
"uni-table-loading"
>
<td
class=
"uni-table-text"
:class=
"
{ 'empty-border': border }">
{{
emptyText
}}
</td>
</tr>
<view
v-if=
"loading"
class=
"uni-table-mask"
:class=
"
{ 'empty-border': border }">
<div
class=
"uni-table--loader"
></div></view>
</table>
<!-- #endif -->
<!-- #ifndef H5 -->
<view
class=
"uni-table"
:style=
"
{ 'min-width': minWidth + 'px' }" :class="{ 'table--stripe': stripe }">
<slot></slot>
<view
v-if=
"noData"
class=
"uni-table-loading"
>
<view
class=
"uni-table-text"
:class=
"
{ 'empty-border': border }">
{{
emptyText
}}
</view>
</view>
<view
v-if=
"loading"
class=
"uni-table-mask"
:class=
"
{ 'empty-border': border }">
<div
class=
"uni-table--loader"
></div></view>
</view>
<!-- #endif -->
</view>
</
template
>
<
script
>
/**
* Table 表格
* @description 用于展示多条结构类似的数据
* @tutorial https://ext.dcloud.net.cn/plugin?id=3270
* @property {Boolean} border 是否带有纵向边框
* @property {Boolean} stripe 是否显示斑马线
* @property {Boolean} type 是否开启多选
* @property {String} emptyText 空数据时显示的文本内容
* @property {Boolean} loading 显示加载中
* @event {Function} selection-change 开启多选时,当选择项发生变化时会触发该事件
*/
export
default
{
name
:
'uniTable'
,
options
:
{
virtualHost
:
true
},
emits
:[
'selection-change'
],
props
:
{
data
:
{
type
:
Array
,
default
()
{
return
[]
}
},
// 是否有竖线
border
:
{
type
:
Boolean
,
default
:
false
},
// 是否显示斑马线
stripe
:
{
type
:
Boolean
,
default
:
false
},
// 多选
type
:
{
type
:
String
,
default
:
''
},
// 没有更多数据
emptyText
:
{
type
:
String
,
default
:
'没有更多数据'
},
loading
:
{
type
:
Boolean
,
default
:
false
},
rowKey
:
{
type
:
String
,
default
:
''
}
},
data
()
{
return
{
noData
:
true
,
minWidth
:
0
,
multiTableHeads
:
[]
}
},
watch
:
{
loading
(
val
)
{},
data
(
newVal
)
{
let
theadChildren
=
this
.
theadChildren
let
rowspan
=
1
if
(
this
.
theadChildren
)
{
rowspan
=
this
.
theadChildren
.
rowspan
}
// this.trChildren.length - rowspan
this
.
noData
=
false
// this.noData = newVal.length === 0
}
},
created
()
{
// 定义tr的实例数组
this
.
trChildren
=
[]
this
.
thChildren
=
[]
this
.
theadChildren
=
null
this
.
backData
=
[]
this
.
backIndexData
=
[]
},
methods
:
{
isNodata
()
{
let
theadChildren
=
this
.
theadChildren
let
rowspan
=
1
if
(
this
.
theadChildren
)
{
rowspan
=
this
.
theadChildren
.
rowspan
}
this
.
noData
=
this
.
trChildren
.
length
-
rowspan
<=
0
},
/**
* 选中所有
*/
selectionAll
()
{
let
startIndex
=
1
let
theadChildren
=
this
.
theadChildren
if
(
!
this
.
theadChildren
)
{
theadChildren
=
this
.
trChildren
[
0
]
}
else
{
startIndex
=
theadChildren
.
rowspan
-
1
}
let
isHaveData
=
this
.
data
&&
this
.
data
.
length
>
0
theadChildren
.
checked
=
true
theadChildren
.
indeterminate
=
false
this
.
trChildren
.
forEach
((
item
,
index
)
=>
{
if
(
!
item
.
disabled
)
{
item
.
checked
=
true
if
(
isHaveData
&&
item
.
keyValue
)
{
const
row
=
this
.
data
.
find
(
v
=>
v
[
this
.
rowKey
]
===
item
.
keyValue
)
if
(
!
this
.
backData
.
find
(
v
=>
v
[
this
.
rowKey
]
===
row
[
this
.
rowKey
]))
{
this
.
backData
.
push
(
row
)
}
}
if
(
index
>
(
startIndex
-
1
)
&&
this
.
backIndexData
.
indexOf
(
index
-
startIndex
)
===
-
1
)
{
this
.
backIndexData
.
push
(
index
-
startIndex
)
}
}
})
// this.backData = JSON.parse(JSON.stringify(this.data))
this
.
$emit
(
'selection-change'
,
{
detail
:
{
value
:
this
.
backData
,
index
:
this
.
backIndexData
}
})
},
/**
* 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)
*/
toggleRowSelection
(
row
,
selected
)
{
// if (!this.theadChildren) return
row
=
[].
concat
(
row
)
this
.
trChildren
.
forEach
((
item
,
index
)
=>
{
// if (item.keyValue) {
const
select
=
row
.
findIndex
(
v
=>
{
//
if
(
typeof
v
===
'number'
)
{
return
v
===
index
-
1
}
else
{
return
v
[
this
.
rowKey
]
===
item
.
keyValue
}
})
let
ischeck
=
item
.
checked
if
(
select
!==
-
1
)
{
if
(
typeof
selected
===
'boolean'
)
{
item
.
checked
=
selected
}
else
{
item
.
checked
=
!
item
.
checked
}
if
(
ischeck
!==
item
.
checked
)
{
this
.
check
(
item
.
rowData
||
item
,
item
.
checked
,
item
.
rowData
?
item
.
keyValue
:
null
,
true
)
}
}
// }
})
this
.
$emit
(
'selection-change'
,
{
detail
:
{
value
:
this
.
backData
,
index
:
this
.
backIndexData
}
})
},
/**
* 用于多选表格,清空用户的选择
*/
clearSelection
()
{
let
theadChildren
=
this
.
theadChildren
if
(
!
this
.
theadChildren
)
{
theadChildren
=
this
.
trChildren
[
0
]
}
// if (!this.theadChildren) return
theadChildren
.
checked
=
false
theadChildren
.
indeterminate
=
false
this
.
trChildren
.
forEach
(
item
=>
{
// if (item.keyValue) {
item
.
checked
=
false
// }
})
this
.
backData
=
[]
this
.
backIndexData
=
[]
this
.
$emit
(
'selection-change'
,
{
detail
:
{
value
:
[],
index
:
[]
}
})
},
/**
* 用于多选表格,切换所有行的选中状态
*/
toggleAllSelection
()
{
let
list
=
[]
let
startIndex
=
1
let
theadChildren
=
this
.
theadChildren
if
(
!
this
.
theadChildren
)
{
theadChildren
=
this
.
trChildren
[
0
]
}
else
{
startIndex
=
theadChildren
.
rowspan
-
1
}
this
.
trChildren
.
forEach
((
item
,
index
)
=>
{
if
(
!
item
.
disabled
)
{
if
(
index
>
(
startIndex
-
1
)
)
{
list
.
push
(
index
-
startIndex
)
}
}
})
this
.
toggleRowSelection
(
list
)
},
/**
* 选中\取消选中
* @param {Object} child
* @param {Object} check
* @param {Object} rowValue
*/
check
(
child
,
check
,
keyValue
,
emit
)
{
let
theadChildren
=
this
.
theadChildren
if
(
!
this
.
theadChildren
)
{
theadChildren
=
this
.
trChildren
[
0
]
}
let
childDomIndex
=
this
.
trChildren
.
findIndex
((
item
,
index
)
=>
child
===
item
)
if
(
childDomIndex
<
0
){
childDomIndex
=
this
.
data
.
findIndex
(
v
=>
v
[
this
.
rowKey
]
===
keyValue
)
+
1
}
const
dataLen
=
this
.
trChildren
.
filter
(
v
=>
!
v
.
disabled
&&
v
.
keyValue
).
length
if
(
childDomIndex
===
0
)
{
check
?
this
.
selectionAll
()
:
this
.
clearSelection
()
return
}
if
(
check
)
{
if
(
keyValue
)
{
this
.
backData
.
push
(
child
)
}
this
.
backIndexData
.
push
(
childDomIndex
-
1
)
}
else
{
const
index
=
this
.
backData
.
findIndex
(
v
=>
v
[
this
.
rowKey
]
===
keyValue
)
const
idx
=
this
.
backIndexData
.
findIndex
(
item
=>
item
===
childDomIndex
-
1
)
if
(
keyValue
)
{
this
.
backData
.
splice
(
index
,
1
)
}
this
.
backIndexData
.
splice
(
idx
,
1
)
}
const
domCheckAll
=
this
.
trChildren
.
find
((
item
,
index
)
=>
index
>
0
&&
!
item
.
checked
&&
!
item
.
disabled
)
if
(
!
domCheckAll
)
{
theadChildren
.
indeterminate
=
false
theadChildren
.
checked
=
true
}
else
{
theadChildren
.
indeterminate
=
true
theadChildren
.
checked
=
false
}
if
(
this
.
backIndexData
.
length
===
0
)
{
theadChildren
.
indeterminate
=
false
}
if
(
!
emit
)
{
this
.
$emit
(
'selection-change'
,
{
detail
:
{
value
:
this
.
backData
,
index
:
this
.
backIndexData
}
})
}
}
}
}
</
script
>
<
style
lang=
"scss"
>
$border-color
:
#ebeef5
;
.uni-table-scroll
{
width
:
100%
;
/* #ifndef APP-NVUE */
overflow-x
:
auto
;
/* #endif */
}
.uni-table
{
position
:
relative
;
width
:
100%
;
border-radius
:
5px
;
// box-shadow: 0px 0px 3px 1px rgba(0, 0, 0, 0.1);
background-color
:
#fff
;
/* #ifndef APP-NVUE */
box-sizing
:
border-box
;
display
:
table
;
overflow-x
:
auto
;
::v-deep
.uni-table-tr
:nth-child
(
n
+
2
)
{
&
:hover
{
background-color
:
#f5f7fa
;
}
}
::v-deep
.uni-table-thead
{
.uni-table-tr
{
// background-color: #f5f7fa;
&
:hover
{
background-color
:
#fafafa
;
}
}
}
/* #endif */
}
.table--border
{
border
:
1px
$border-color
solid
;
border-right
:
none
;
}
.border-none
{
/* #ifndef APP-NVUE */
border-bottom
:
none
;
/* #endif */
}
.table--stripe
{
/* #ifndef APP-NVUE */
::v-deep
.uni-table-tr
:nth-child
(
2n
+
3
)
{
background-color
:
#fafafa
;
}
/* #endif */
}
/* 表格加载、无数据样式 */
.uni-table-loading
{
position
:
relative
;
/* #ifndef APP-NVUE */
display
:
table-row
;
/* #endif */
height
:
50px
;
line-height
:
50px
;
overflow
:
hidden
;
box-sizing
:
border-box
;
}
.empty-border
{
border-right
:
1px
$border-color
solid
;
}
.uni-table-text
{
position
:
absolute
;
right
:
0
;
left
:
0
;
text-align
:
center
;
font-size
:
14px
;
color
:
#999
;
}
.uni-table-mask
{
position
:
absolute
;
top
:
0
;
bottom
:
0
;
left
:
0
;
right
:
0
;
background-color
:
rgba
(
255
,
255
,
255
,
0
.8
);
z-index
:
99
;
/* #ifndef APP-NVUE */
display
:
flex
;
margin
:
auto
;
transition
:
all
0
.5s
;
/* #endif */
justify-content
:
center
;
align-items
:
center
;
}
.uni-table--loader
{
width
:
30px
;
height
:
30px
;
border
:
2px
solid
#aaa
;
// border-bottom-color: transparent;
border-radius
:
50%
;
/* #ifndef APP-NVUE */
animation
:
2s
uni-table--loader
linear
infinite
;
/* #endif */
position
:
relative
;
}
@keyframes
uni-table--loader
{
0
%
{
transform
:
rotate
(
360deg
);
}
10
%
{
border-left-color
:
transparent
;
}
20
%
{
border-bottom-color
:
transparent
;
}
30
%
{
border-right-color
:
transparent
;
}
40
%
{
border-top-color
:
transparent
;
}
50
%
{
transform
:
rotate
(
0deg
);
}
60
%
{
border-top-color
:
transparent
;
}
70
%
{
border-left-color
:
transparent
;
}
80
%
{
border-bottom-color
:
transparent
;
}
90
%
{
border-right-color
:
transparent
;
}
100
%
{
transform
:
rotate
(
-360deg
);
}
}
</
style
>
src/uni_modules/uni-table/components/uni-tbody/uni-tbody.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<!-- #ifdef H5 -->
<tbody>
<slot></slot>
</tbody>
<!-- #endif -->
<!-- #ifndef H5 -->
<view><slot></slot></view>
<!-- #endif -->
</
template
>
<
script
>
export
default
{
name
:
'uniBody'
,
options
:
{
virtualHost
:
true
},
data
()
{
return
{
}
},
created
()
{},
methods
:
{}
}
</
script
>
<
style
>
</
style
>
src/uni_modules/uni-table/components/uni-td/uni-td.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<!-- #ifdef H5 -->
<td
class=
"uni-table-td"
:rowspan=
"rowspan"
:colspan=
"colspan"
:class=
"
{'table--border':border}" :style="{width:width + 'px','text-align':align}">
<slot></slot>
</td>
<!-- #endif -->
<!-- #ifndef H5 -->
<!-- :class="
{'table--border':border}" -->
<view
class=
"uni-table-td"
:class=
"
{'table--border':border}" :style="{width:width + 'px','text-align':align}">
<slot></slot>
</view>
<!-- #endif -->
</
template
>
<
script
>
/**
* Td 单元格
* @description 表格中的标准单元格组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=3270
* @property {Number} align = [left|center|right] 单元格对齐方式
*/
export
default
{
name
:
'uniTd'
,
options
:
{
virtualHost
:
true
},
props
:
{
width
:
{
type
:
[
String
,
Number
],
default
:
''
},
align
:
{
type
:
String
,
default
:
'left'
},
rowspan
:
{
type
:
[
Number
,
String
],
default
:
1
},
colspan
:
{
type
:
[
Number
,
String
],
default
:
1
}
},
data
()
{
return
{
border
:
false
};
},
created
()
{
this
.
root
=
this
.
getTable
()
this
.
border
=
this
.
root
.
border
},
methods
:
{
/**
* 获取父元素实例
*/
getTable
()
{
let
parent
=
this
.
$parent
;
let
parentName
=
parent
.
$options
.
name
;
while
(
parentName
!==
'uniTable'
)
{
parent
=
parent
.
$parent
;
if
(
!
parent
)
return
false
;
parentName
=
parent
.
$options
.
name
;
}
return
parent
;
},
}
}
</
script
>
<
style
lang=
"scss"
>
$border-color
:
#EBEEF5
;
.uni-table-td
{
display
:
table-cell
;
padding
:
8px
10px
;
font-size
:
14px
;
border-bottom
:
1px
$border-color
solid
;
font-weight
:
400
;
color
:
#606266
;
line-height
:
23px
;
box-sizing
:
border-box
;
}
.table--border
{
border-right
:
1px
$border-color
solid
;
}
</
style
>
src/uni_modules/uni-table/components/uni-th/filter-dropdown.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-filter-dropdown"
>
<view
class=
"dropdown-btn"
@
click=
"onDropdown"
>
<view
class=
"icon-select"
:class=
"
{active: canReset}" v-if="isSelect || isRange">
</view>
<view
class=
"icon-search"
:class=
"
{active: canReset}" v-if="isSearch">
<view
class=
"icon-search-0"
></view>
<view
class=
"icon-search-1"
></view>
</view>
<view
class=
"icon-calendar"
:class=
"
{active: canReset}" v-if="isDate">
<view
class=
"icon-calendar-0"
></view>
<view
class=
"icon-calendar-1"
></view>
</view>
</view>
<view
class=
"uni-dropdown-cover"
v-if=
"isOpened"
@
click=
"handleClose"
></view>
<view
class=
"dropdown-popup dropdown-popup-right"
v-if=
"isOpened"
@
click
.
stop
>
<!-- select-->
<view
v-if=
"isSelect"
class=
"list"
>
<label
class=
"flex-r a-i-c list-item"
v-for=
"(item,index) in dataList"
:key=
"index"
@
click=
"onItemClick($event, index)"
>
<check-box
class=
"check"
:checked=
"item.checked"
/>
<view
class=
"checklist-content"
>
<text
class=
"checklist-text"
:style=
"item.styleIconText"
>
{{
item
[
map
.
text
]
}}
</text>
</view>
</label>
</view>
<view
v-if=
"isSelect"
class=
"flex-r opera-area"
>
<view
class=
"flex-f btn btn-default"
:class=
"
{disable: !canReset}" @click="handleSelectReset">
{{
resource
.
reset
}}
</view>
<view
class=
"flex-f btn btn-submit"
@
click=
"handleSelectSubmit"
>
{{
resource
.
submit
}}
</view>
</view>
<!-- search -->
<view
v-if=
"isSearch"
class=
"search-area"
>
<input
class=
"search-input"
v-model=
"filterValue"
/>
</view>
<view
v-if=
"isSearch"
class=
"flex-r opera-area"
>
<view
class=
"flex-f btn btn-submit"
@
click=
"handleSearchSubmit"
>
{{
resource
.
search
}}
</view>
<view
class=
"flex-f btn btn-default"
:class=
"
{disable: !canReset}" @click="handleSearchReset">
{{
resource
.
reset
}}
</view>
</view>
<!-- range -->
<view
v-if=
"isRange"
>
<view
class=
"input-label"
>
{{
resource
.
gt
}}
</view>
<input
class=
"input"
v-model=
"gtValue"
/>
<view
class=
"input-label"
>
{{
resource
.
lt
}}
</view>
<input
class=
"input"
v-model=
"ltValue"
/>
</view>
<view
v-if=
"isRange"
class=
"flex-r opera-area"
>
<view
class=
"flex-f btn btn-default"
:class=
"
{disable: !canReset}" @click="handleRangeReset">
{{
resource
.
reset
}}
</view>
<view
class=
"flex-f btn btn-submit"
@
click=
"handleRangeSubmit"
>
{{
resource
.
submit
}}
</view>
</view>
<!-- date -->
<view
v-if=
"isDate"
>
<uni-datetime-picker
ref=
"datetimepicker"
:value=
"dateRange"
type=
"datetimerange"
return-type=
"timestamp"
@
change=
"datetimechange"
@
maskClick=
"timepickerclose"
>
<view></view>
</uni-datetime-picker>
</view>
</view>
</view>
</
template
>
<
script
>
import
checkBox
from
'../uni-tr/table-checkbox.vue'
const
resource
=
{
"reset"
:
"重置"
,
"search"
:
"搜索"
,
"submit"
:
"确定"
,
"filter"
:
"筛选"
,
"gt"
:
"大于等于"
,
"lt"
:
"小于等于"
,
"date"
:
"日期范围"
}
const
DropdownType
=
{
Select
:
"select"
,
Search
:
"search"
,
Range
:
"range"
,
Date
:
"date"
,
Timestamp
:
"timestamp"
}
export
default
{
name
:
'FilterDropdown'
,
emits
:[
'change'
],
components
:
{
checkBox
},
options
:
{
virtualHost
:
true
},
props
:
{
filterType
:
{
type
:
String
,
default
:
DropdownType
.
Select
},
filterData
:
{
type
:
Array
,
default
()
{
return
[]
}
},
mode
:
{
type
:
String
,
default
:
'default'
},
map
:
{
type
:
Object
,
default
()
{
return
{
text
:
'text'
,
value
:
'value'
}
}
},
filterDefaultValue
:
{
type
:
[
Array
,
String
],
default
()
{
return
""
}
}
},
computed
:
{
canReset
()
{
if
(
this
.
isSearch
)
{
return
this
.
filterValue
.
length
>
0
}
if
(
this
.
isSelect
)
{
return
this
.
checkedValues
.
length
>
0
}
if
(
this
.
isRange
)
{
return
(
this
.
gtValue
.
length
>
0
&&
this
.
ltValue
.
length
>
0
)
}
if
(
this
.
isDate
)
{
return
this
.
dateSelect
.
length
>
0
}
return
false
},
isSelect
()
{
return
this
.
filterType
===
DropdownType
.
Select
},
isSearch
()
{
return
this
.
filterType
===
DropdownType
.
Search
},
isRange
()
{
return
this
.
filterType
===
DropdownType
.
Range
},
isDate
()
{
return
(
this
.
filterType
===
DropdownType
.
Date
||
this
.
filterType
===
DropdownType
.
Timestamp
)
}
},
watch
:
{
filterData
(
newVal
)
{
this
.
_copyFilters
()
},
indeterminate
(
newVal
)
{
this
.
isIndeterminate
=
newVal
}
},
data
()
{
return
{
resource
,
enabled
:
true
,
isOpened
:
false
,
dataList
:
[],
filterValue
:
this
.
filterDefaultValue
,
checkedValues
:
[],
gtValue
:
''
,
ltValue
:
''
,
dateRange
:
[],
dateSelect
:
[]
};
},
created
()
{
this
.
_copyFilters
()
},
methods
:
{
_copyFilters
()
{
let
dl
=
JSON
.
parse
(
JSON
.
stringify
(
this
.
filterData
))
for
(
let
i
=
0
;
i
<
dl
.
length
;
i
++
)
{
if
(
dl
[
i
].
checked
===
undefined
)
{
dl
[
i
].
checked
=
false
}
}
this
.
dataList
=
dl
},
openPopup
()
{
this
.
isOpened
=
true
if
(
this
.
isDate
)
{
this
.
$nextTick
(()
=>
{
if
(
!
this
.
dateRange
.
length
)
{
this
.
resetDate
()
}
this
.
$refs
.
datetimepicker
.
show
()
})
}
},
closePopup
()
{
this
.
isOpened
=
false
},
handleClose
(
e
)
{
this
.
closePopup
()
},
resetDate
()
{
let
date
=
new
Date
()
let
dateText
=
date
.
toISOString
().
split
(
'T'
)[
0
]
this
.
dateRange
=
[
dateText
+
' 0:00:00'
,
dateText
+
' 23:59:59'
]
},
onDropdown
(
e
)
{
this
.
openPopup
()
},
onItemClick
(
e
,
index
)
{
let
items
=
this
.
dataList
let
listItem
=
items
[
index
]
if
(
listItem
.
checked
===
undefined
)
{
items
[
index
].
checked
=
true
}
else
{
items
[
index
].
checked
=
!
listItem
.
checked
}
let
checkvalues
=
[]
for
(
let
i
=
0
;
i
<
items
.
length
;
i
++
)
{
const
item
=
items
[
i
]
if
(
item
.
checked
)
{
checkvalues
.
push
(
item
.
value
)
}
}
this
.
checkedValues
=
checkvalues
},
datetimechange
(
e
)
{
this
.
closePopup
()
this
.
dateRange
=
e
this
.
dateSelect
=
e
this
.
$emit
(
'change'
,
{
filterType
:
this
.
filterType
,
filter
:
e
})
},
timepickerclose
(
e
)
{
this
.
closePopup
()
},
handleSelectSubmit
()
{
this
.
closePopup
()
this
.
$emit
(
'change'
,
{
filterType
:
this
.
filterType
,
filter
:
this
.
checkedValues
})
},
handleSelectReset
()
{
if
(
!
this
.
canReset
)
{
return
;
}
var
items
=
this
.
dataList
for
(
let
i
=
0
;
i
<
items
.
length
;
i
++
)
{
let
item
=
items
[
i
]
this
.
$set
(
item
,
'checked'
,
false
)
}
this
.
checkedValues
=
[]
this
.
handleSelectSubmit
()
},
handleSearchSubmit
()
{
this
.
closePopup
()
this
.
$emit
(
'change'
,
{
filterType
:
this
.
filterType
,
filter
:
this
.
filterValue
})
},
handleSearchReset
()
{
if
(
!
this
.
canReset
)
{
return
;
}
this
.
filterValue
=
''
this
.
handleSearchSubmit
()
},
handleRangeSubmit
(
isReset
)
{
this
.
closePopup
()
this
.
$emit
(
'change'
,
{
filterType
:
this
.
filterType
,
filter
:
isReset
===
true
?
[]
:
[
parseInt
(
this
.
gtValue
),
parseInt
(
this
.
ltValue
)]
})
},
handleRangeReset
()
{
if
(
!
this
.
canReset
)
{
return
;
}
this
.
gtValue
=
''
this
.
ltValue
=
''
this
.
handleRangeSubmit
(
true
)
}
}
}
</
script
>
<
style
lang=
"scss"
>
$uni-primary
:
#1890ff
!
default
;
.flex-r
{
display
:
flex
;
flex-direction
:
row
;
}
.flex-f
{
flex
:
1
;
}
.a-i-c
{
align-items
:
center
;
}
.j-c-c
{
justify-content
:
center
;
}
.icon-select
{
width
:
14px
;
height
:
16px
;
border
:
solid
6px
transparent
;
border-top
:
solid
6px
#ddd
;
border-bottom
:
none
;
background-color
:
#ddd
;
background-clip
:
content-box
;
box-sizing
:
border-box
;
}
.icon-select.active
{
background-color
:
$uni-primary
;
border-top-color
:
$uni-primary
;
}
.icon-search
{
width
:
12px
;
height
:
16px
;
position
:
relative
;
}
.icon-search-0
{
border
:
2px
solid
#ddd
;
border-radius
:
8px
;
width
:
7px
;
height
:
7px
;
}
.icon-search-1
{
position
:
absolute
;
top
:
8px
;
right
:
0
;
width
:
1px
;
height
:
7px
;
background-color
:
#ddd
;
transform
:
rotate
(
-45deg
);
}
.icon-search.active
.icon-search-0
{
border-color
:
$uni-primary
;
}
.icon-search.active
.icon-search-1
{
background-color
:
$uni-primary
;
}
.icon-calendar
{
color
:
#ddd
;
width
:
14px
;
height
:
16px
;
}
.icon-calendar-0
{
height
:
4px
;
margin-top
:
3px
;
margin-bottom
:
1px
;
background-color
:
#ddd
;
border-radius
:
2px
2px
1px
1px
;
position
:
relative
;
}
.icon-calendar-0
:before
,
.icon-calendar-0
:after
{
content
:
''
;
position
:
absolute
;
top
:
-3px
;
width
:
4px
;
height
:
3px
;
border-radius
:
1px
;
background-color
:
#ddd
;
}
.icon-calendar-0
:before
{
left
:
2px
;
}
.icon-calendar-0
:after
{
right
:
2px
;
}
.icon-calendar-1
{
height
:
9px
;
background-color
:
#ddd
;
border-radius
:
1px
1px
2px
2px
;
}
.icon-calendar.active
{
color
:
$uni-primary
;
}
.icon-calendar.active
.icon-calendar-0
,
.icon-calendar.active
.icon-calendar-1
,
.icon-calendar.active
.icon-calendar-0
:before
,
.icon-calendar.active
.icon-calendar-0
:after
{
background-color
:
$uni-primary
;
}
.uni-filter-dropdown
{
position
:
relative
;
font-weight
:
normal
;
}
.dropdown-popup
{
position
:
absolute
;
top
:
100%
;
background-color
:
#fff
;
box-shadow
:
0
3px
6px
-4px
#000000
1f
,
0
6px
16px
#000000
14
,
0
9px
28px
8px
#000000
0d
;
min-width
:
150px
;
z-index
:
1000
;
}
.dropdown-popup-left
{
left
:
0
;
}
.dropdown-popup-right
{
right
:
0
;
}
.uni-dropdown-cover
{
position
:
fixed
;
left
:
0
;
top
:
0
;
right
:
0
;
bottom
:
0
;
background-color
:
transparent
;
z-index
:
100
;
}
.list
{
margin-top
:
5px
;
margin-bottom
:
5px
;
}
.list-item
{
padding
:
5px
10px
;
text-align
:
left
;
}
.list-item
:hover
{
background-color
:
#f0f0f0
;
}
.check
{
margin-right
:
5px
;
}
.search-area
{
padding
:
10px
;
}
.search-input
{
font-size
:
12px
;
border
:
1px
solid
#f0f0f0
;
border-radius
:
3px
;
padding
:
2px
5px
;
min-width
:
150px
;
text-align
:
left
;
}
.input-label
{
margin
:
10px
10px
5px
10px
;
text-align
:
left
;
}
.input
{
font-size
:
12px
;
border
:
1px
solid
#f0f0f0
;
border-radius
:
3px
;
margin
:
10px
;
padding
:
2px
5px
;
min-width
:
150px
;
text-align
:
left
;
}
.opera-area
{
cursor
:
default
;
border-top
:
1px
solid
#ddd
;
padding
:
5px
;
}
.opera-area
.btn
{
font-size
:
12px
;
border-radius
:
3px
;
margin
:
5px
;
padding
:
4px
4px
;
}
.btn-default
{
border
:
1px
solid
#ddd
;
}
.btn-default.disable
{
border-color
:
transparent
;
}
.btn-submit
{
background-color
:
$uni-primary
;
color
:
#ffffff
;
}
</
style
>
src/uni_modules/uni-table/components/uni-th/uni-th.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<!-- #ifdef H5 -->
<th
:rowspan=
"rowspan"
:colspan=
"colspan"
class=
"uni-table-th"
:class=
"
{ 'table--border': border }" :style="{ width: customWidth + 'px', 'text-align': align }">
<view
class=
"uni-table-th-row"
>
<view
class=
"uni-table-th-content"
:style=
"
{ 'justify-content': contentAlign }" @click="sort">
<slot></slot>
<view
v-if=
"sortable"
class=
"arrow-box"
>
<text
class=
"arrow up"
:class=
"
{ active: ascending }" @click.stop="ascendingFn">
</text>
<text
class=
"arrow down"
:class=
"
{ active: descending }" @click.stop="descendingFn">
</text>
</view>
</view>
<dropdown
v-if=
"filterType || filterData.length"
:filterDefaultValue=
"filterDefaultValue"
:filterData=
"filterData"
:filterType=
"filterType"
@
change=
"ondropdown"
></dropdown>
</view>
</th>
<!-- #endif -->
<!-- #ifndef H5 -->
<view
class=
"uni-table-th"
:class=
"
{ 'table--border': border }" :style="{ width: customWidth + 'px', 'text-align': align }">
<slot></slot></view>
<!-- #endif -->
</
template
>
<
script
>
// #ifdef H5
import
dropdown
from
'./filter-dropdown.vue'
// #endif
/**
* Th 表头
* @description 表格内的表头单元格组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=3270
* @property {Number | String} width 单元格宽度(支持纯数字、携带单位px或rpx)
* @property {Boolean} sortable 是否启用排序
* @property {Number} align = [left|center|right] 单元格对齐方式
* @value left 单元格文字左侧对齐
* @value center 单元格文字居中
* @value right 单元格文字右侧对齐
* @property {Array} filterData 筛选数据
* @property {String} filterType [search|select] 筛选类型
* @value search 关键字搜素
* @value select 条件选择
* @event {Function} sort-change 排序触发事件
*/
export
default
{
name
:
'uniTh'
,
options
:
{
virtualHost
:
true
},
components
:
{
// #ifdef H5
dropdown
// #endif
},
emits
:[
'sort-change'
,
'filter-change'
],
props
:
{
width
:
{
type
:
[
String
,
Number
],
default
:
''
},
align
:
{
type
:
String
,
default
:
'left'
},
rowspan
:
{
type
:
[
Number
,
String
],
default
:
1
},
colspan
:
{
type
:
[
Number
,
String
],
default
:
1
},
sortable
:
{
type
:
Boolean
,
default
:
false
},
filterType
:
{
type
:
String
,
default
:
""
},
filterData
:
{
type
:
Array
,
default
()
{
return
[]
}
},
filterDefaultValue
:
{
type
:
[
Array
,
String
],
default
()
{
return
""
}
}
},
data
()
{
return
{
border
:
false
,
ascending
:
false
,
descending
:
false
}
},
computed
:
{
// 根据props中的width属性 自动匹配当前th的宽度(px)
customWidth
(){
if
(
typeof
this
.
width
===
'number'
){
return
this
.
width
}
else
if
(
typeof
this
.
width
===
'string'
)
{
let
regexHaveUnitPx
=
new
RegExp
(
/^
[
1-9
][
0-9
]
*px$/g
)
let
regexHaveUnitRpx
=
new
RegExp
(
/^
[
1-9
][
0-9
]
*rpx$/g
)
let
regexHaveNotUnit
=
new
RegExp
(
/^
[
1-9
][
0-9
]
*$/g
)
if
(
this
.
width
.
match
(
regexHaveUnitPx
)
!==
null
)
{
// 携带了 px
return
this
.
width
.
replace
(
'px'
,
''
)
}
else
if
(
this
.
width
.
match
(
regexHaveUnitRpx
)
!==
null
)
{
// 携带了 rpx
let
numberRpx
=
Number
(
this
.
width
.
replace
(
'rpx'
,
''
))
let
widthCoe
=
uni
.
getSystemInfoSync
().
screenWidth
/
750
return
Math
.
round
(
numberRpx
*
widthCoe
)
}
else
if
(
this
.
width
.
match
(
regexHaveNotUnit
)
!==
null
)
{
// 未携带 rpx或px 的纯数字 String
return
this
.
width
}
else
{
// 不符合格式
return
''
}
}
else
{
return
''
}
},
contentAlign
()
{
let
align
=
'left'
switch
(
this
.
align
)
{
case
'left'
:
align
=
'flex-start'
break
case
'center'
:
align
=
'center'
break
case
'right'
:
align
=
'flex-end'
break
}
return
align
}
},
created
()
{
this
.
root
=
this
.
getTable
(
'uniTable'
)
this
.
rootTr
=
this
.
getTable
(
'uniTr'
)
this
.
rootTr
.
minWidthUpdate
(
this
.
customWidth
?
this
.
customWidth
:
140
)
this
.
border
=
this
.
root
.
border
this
.
root
.
thChildren
.
push
(
this
)
},
methods
:
{
sort
()
{
if
(
!
this
.
sortable
)
return
this
.
clearOther
()
if
(
!
this
.
ascending
&&
!
this
.
descending
)
{
this
.
ascending
=
true
this
.
$emit
(
'sort-change'
,
{
order
:
'ascending'
})
return
}
if
(
this
.
ascending
&&
!
this
.
descending
)
{
this
.
ascending
=
false
this
.
descending
=
true
this
.
$emit
(
'sort-change'
,
{
order
:
'descending'
})
return
}
if
(
!
this
.
ascending
&&
this
.
descending
)
{
this
.
ascending
=
false
this
.
descending
=
false
this
.
$emit
(
'sort-change'
,
{
order
:
null
})
}
},
ascendingFn
()
{
this
.
clearOther
()
this
.
ascending
=
!
this
.
ascending
this
.
descending
=
false
this
.
$emit
(
'sort-change'
,
{
order
:
this
.
ascending
?
'ascending'
:
null
})
},
descendingFn
()
{
this
.
clearOther
()
this
.
descending
=
!
this
.
descending
this
.
ascending
=
false
this
.
$emit
(
'sort-change'
,
{
order
:
this
.
descending
?
'descending'
:
null
})
},
clearOther
()
{
this
.
root
.
thChildren
.
map
(
item
=>
{
if
(
item
!==
this
)
{
item
.
ascending
=
false
item
.
descending
=
false
}
return
item
})
},
ondropdown
(
e
)
{
this
.
$emit
(
"filter-change"
,
e
)
},
/**
* 获取父元素实例
*/
getTable
(
name
)
{
let
parent
=
this
.
$parent
let
parentName
=
parent
.
$options
.
name
while
(
parentName
!==
name
)
{
parent
=
parent
.
$parent
if
(
!
parent
)
return
false
parentName
=
parent
.
$options
.
name
}
return
parent
}
}
}
</
script
>
<
style
lang=
"scss"
>
$border-color
:
#ebeef5
;
$uni-primary
:
#007aff
!
default
;
.uni-table-th
{
padding
:
12px
10px
;
/* #ifndef APP-NVUE */
display
:
table-cell
;
box-sizing
:
border-box
;
/* #endif */
font-size
:
14px
;
font-weight
:
bold
;
color
:
#909399
;
border-bottom
:
1px
$border-color
solid
;
}
.uni-table-th-row
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
flex-direction
:
row
;
}
.table--border
{
border-right
:
1px
$border-color
solid
;
}
.uni-table-th-content
{
display
:
flex
;
align-items
:
center
;
flex
:
1
;
}
.arrow-box
{
}
.arrow
{
display
:
block
;
position
:
relative
;
width
:
10px
;
height
:
8px
;
// border: 1px red solid;
left
:
5px
;
overflow
:
hidden
;
cursor
:
pointer
;
}
.down
{
top
:
3px
;
::after
{
content
:
''
;
width
:
8px
;
height
:
8px
;
position
:
absolute
;
left
:
2px
;
top
:
-5px
;
transform
:
rotate
(
45deg
);
background-color
:
#ccc
;
}
&
.active
{
::after
{
background-color
:
$uni-primary
;
}
}
}
.up
{
::after
{
content
:
''
;
width
:
8px
;
height
:
8px
;
position
:
absolute
;
left
:
2px
;
top
:
5px
;
transform
:
rotate
(
45deg
);
background-color
:
#ccc
;
}
&
.active
{
::after
{
background-color
:
$uni-primary
;
}
}
}
</
style
>
src/uni_modules/uni-table/components/uni-thead/uni-thead.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<!-- #ifdef H5 -->
<thead
class=
"uni-table-thead"
>
<tr
class=
"uni-table-tr"
>
<th
:rowspan=
"rowspan"
colspan=
"1"
class=
"checkbox"
:class=
"
{ 'tr-table--border': border }">
<table-checkbox
:indeterminate=
"indeterminate"
:checked=
"checked"
@
checkboxSelected=
"checkboxSelected"
></table-checkbox>
</th>
</tr>
<slot></slot>
</thead>
<!-- #endif -->
<!-- #ifndef H5 -->
<view
class=
"uni-table-thead"
><slot></slot></view>
<!-- #endif -->
</
template
>
<
script
>
import
tableCheckbox
from
'../uni-tr/table-checkbox.vue'
export
default
{
name
:
'uniThead'
,
components
:
{
tableCheckbox
},
options
:
{
virtualHost
:
true
},
data
()
{
return
{
border
:
false
,
selection
:
false
,
rowspan
:
1
,
indeterminate
:
false
,
checked
:
false
}
},
created
()
{
this
.
root
=
this
.
getTable
()
// #ifdef H5
this
.
root
.
theadChildren
=
this
// #endif
this
.
border
=
this
.
root
.
border
this
.
selection
=
this
.
root
.
type
},
methods
:
{
init
(
self
)
{
this
.
rowspan
++
},
checkboxSelected
(
e
)
{
this
.
indeterminate
=
false
const
backIndexData
=
this
.
root
.
backIndexData
const
data
=
this
.
root
.
trChildren
.
filter
(
v
=>
!
v
.
disabled
&&
v
.
keyValue
)
if
(
backIndexData
.
length
===
data
.
length
)
{
this
.
checked
=
false
this
.
root
.
clearSelection
()
}
else
{
this
.
checked
=
true
this
.
root
.
selectionAll
()
}
},
/**
* 获取父元素实例
*/
getTable
(
name
=
'uniTable'
)
{
let
parent
=
this
.
$parent
let
parentName
=
parent
.
$options
.
name
while
(
parentName
!==
name
)
{
parent
=
parent
.
$parent
if
(
!
parent
)
return
false
parentName
=
parent
.
$options
.
name
}
return
parent
}
}
}
</
script
>
<
style
lang=
"scss"
>
$border-color
:
#ebeef5
;
.uni-table-thead
{
display
:
table-header-group
;
}
.uni-table-tr
{
/* #ifndef APP-NVUE */
display
:
table-row
;
transition
:
all
0
.3s
;
box-sizing
:
border-box
;
/* #endif */
border
:
1px
red
solid
;
background-color
:
#fafafa
;
}
.checkbox
{
padding
:
0
8px
;
width
:
26px
;
padding-left
:
12px
;
/* #ifndef APP-NVUE */
display
:
table-cell
;
vertical-align
:
middle
;
/* #endif */
color
:
#333
;
font-weight
:
500
;
border-bottom
:
1px
$border-color
solid
;
font-size
:
14px
;
// text-align: center;
}
.tr-table--border
{
border-right
:
1px
$border-color
solid
;
}
/* #ifndef APP-NVUE */
.uni-table-tr
{
::v-deep
.uni-table-th
{
&
.table--border
:last-child
{
// border-right: none;
}
}
::v-deep
.uni-table-td
{
&
.table--border
:last-child
{
// border-right: none;
}
}
}
/* #endif */
</
style
>
src/uni_modules/uni-table/components/uni-tr/table-checkbox.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<view
class=
"uni-table-checkbox"
@
click=
"selected"
>
<view
v-if=
"!indeterminate"
class=
"checkbox__inner"
:class=
"
{'is-checked':isChecked,'is-disable':isDisabled}">
<view
class=
"checkbox__inner-icon"
></view>
</view>
<view
v-else
class=
"checkbox__inner checkbox--indeterminate"
>
<view
class=
"checkbox__inner-icon"
></view>
</view>
</view>
</
template
>
<
script
>
export
default
{
name
:
'TableCheckbox'
,
emits
:[
'checkboxSelected'
],
props
:
{
indeterminate
:
{
type
:
Boolean
,
default
:
false
},
checked
:
{
type
:
[
Boolean
,
String
],
default
:
false
},
disabled
:
{
type
:
Boolean
,
default
:
false
},
index
:
{
type
:
Number
,
default
:
-
1
},
cellData
:
{
type
:
Object
,
default
()
{
return
{}
}
}
},
watch
:{
checked
(
newVal
){
if
(
typeof
this
.
checked
===
'boolean'
){
this
.
isChecked
=
newVal
}
else
{
this
.
isChecked
=
true
}
},
indeterminate
(
newVal
){
this
.
isIndeterminate
=
newVal
}
},
data
()
{
return
{
isChecked
:
false
,
isDisabled
:
false
,
isIndeterminate
:
false
}
},
created
()
{
if
(
typeof
this
.
checked
===
'boolean'
){
this
.
isChecked
=
this
.
checked
}
this
.
isDisabled
=
this
.
disabled
},
methods
:
{
selected
()
{
if
(
this
.
isDisabled
)
return
this
.
isIndeterminate
=
false
this
.
isChecked
=
!
this
.
isChecked
this
.
$emit
(
'checkboxSelected'
,
{
checked
:
this
.
isChecked
,
data
:
this
.
cellData
})
}
}
}
</
script
>
<
style
lang=
"scss"
>
$uni-primary
:
#007aff
!
default
;
$border-color
:
#DCDFE6
;
$disable
:
0
.4
;
.uni-table-checkbox
{
display
:
flex
;
flex-direction
:
row
;
align-items
:
center
;
justify-content
:
center
;
position
:
relative
;
margin
:
5px
0
;
cursor
:
pointer
;
// 多选样式
.checkbox__inner
{
/* #ifndef APP-NVUE */
flex-shrink
:
0
;
box-sizing
:
border-box
;
/* #endif */
position
:
relative
;
width
:
16px
;
height
:
16px
;
border
:
1px
solid
$border-color
;
border-radius
:
2px
;
background-color
:
#fff
;
z-index
:
1
;
.checkbox__inner-icon
{
position
:
absolute
;
/* #ifdef APP-NVUE */
top
:
2px
;
/* #endif */
/* #ifndef APP-NVUE */
top
:
2px
;
/* #endif */
left
:
5px
;
height
:
7px
;
width
:
3px
;
border
:
1px
solid
#fff
;
border-left
:
0
;
border-top
:
0
;
opacity
:
0
;
transform-origin
:
center
;
transform
:
rotate
(
45deg
);
box-sizing
:
content-box
;
}
&
.checkbox--indeterminate
{
border-color
:
$uni-primary
;
background-color
:
$uni-primary
;
.checkbox__inner-icon
{
position
:
absolute
;
opacity
:
1
;
transform
:
rotate
(
0deg
);
height
:
2px
;
top
:
0
;
bottom
:
0
;
margin
:
auto
;
left
:
0px
;
right
:
0px
;
bottom
:
0
;
width
:
auto
;
border
:
none
;
border-radius
:
2px
;
transform
:
scale
(
0
.5
);
background-color
:
#fff
;
}
}
&
:hover
{
border-color
:
$uni-primary
;
}
// 禁用
&
.is-disable
{
/* #ifdef H5 */
cursor
:
not
-
allowed
;
/* #endif */
background-color
:
#F2F6FC
;
border-color
:
$border-color
;
}
// 选中
&
.is-checked
{
border-color
:
$uni-primary
;
background-color
:
$uni-primary
;
.checkbox__inner-icon
{
opacity
:
1
;
transform
:
rotate
(
45deg
);
}
// 选中禁用
&
.is-disable
{
opacity
:
$disable
;
}
}
}
}
</
style
>
src/uni_modules/uni-table/components/uni-tr/uni-tr.vue
0 → 100644
浏览文件 @
5eae5d40
<
template
>
<!-- #ifdef H5 -->
<tr
class=
"uni-table-tr"
>
<th
v-if=
"selection === 'selection' && ishead"
class=
"checkbox"
:class=
"
{ 'tr-table--border': border }">
<table-checkbox
:checked=
"checked"
:indeterminate=
"indeterminate"
:disabled=
"disabled"
@
checkboxSelected=
"checkboxSelected"
></table-checkbox>
</th>
<slot></slot>
<!--
<uni-th
class=
"th-fixed"
>
123
</uni-th>
-->
</tr>
<!-- #endif -->
<!-- #ifndef H5 -->
<view
class=
"uni-table-tr"
>
<view
v-if=
"selection === 'selection' "
class=
"checkbox"
:class=
"
{ 'tr-table--border': border }">
<table-checkbox
:checked=
"checked"
:indeterminate=
"indeterminate"
:disabled=
"disabled"
@
checkboxSelected=
"checkboxSelected"
></table-checkbox>
</view>
<slot></slot>
</view>
<!-- #endif -->
</
template
>
<
script
>
import
tableCheckbox
from
'./table-checkbox.vue'
/**
* Tr 表格行组件
* @description 表格行组件 仅包含 th,td 组件
* @tutorial https://ext.dcloud.net.cn/plugin?id=
*/
export
default
{
name
:
'uniTr'
,
components
:
{
tableCheckbox
},
props
:
{
disabled
:
{
type
:
Boolean
,
default
:
false
},
keyValue
:
{
type
:
[
String
,
Number
],
default
:
''
}
},
options
:
{
virtualHost
:
true
},
data
()
{
return
{
value
:
false
,
border
:
false
,
selection
:
false
,
widthThArr
:
[],
ishead
:
true
,
checked
:
false
,
indeterminate
:
false
}
},
created
()
{
this
.
root
=
this
.
getTable
()
this
.
head
=
this
.
getTable
(
'uniThead'
)
if
(
this
.
head
)
{
this
.
ishead
=
false
this
.
head
.
init
(
this
)
}
this
.
border
=
this
.
root
.
border
this
.
selection
=
this
.
root
.
type
this
.
root
.
trChildren
.
push
(
this
)
const
rowData
=
this
.
root
.
data
.
find
(
v
=>
v
[
this
.
root
.
rowKey
]
===
this
.
keyValue
)
if
(
rowData
){
this
.
rowData
=
rowData
}
this
.
root
.
isNodata
()
},
mounted
()
{
if
(
this
.
widthThArr
.
length
>
0
)
{
const
selectionWidth
=
this
.
selection
===
'selection'
?
50
:
0
this
.
root
.
minWidth
=
this
.
widthThArr
.
reduce
((
a
,
b
)
=>
Number
(
a
)
+
Number
(
b
))
+
selectionWidth
}
},
// #ifndef VUE3
destroyed
()
{
const
index
=
this
.
root
.
trChildren
.
findIndex
(
i
=>
i
===
this
)
this
.
root
.
trChildren
.
splice
(
index
,
1
)
this
.
root
.
isNodata
()
},
// #endif
// #ifdef VUE3
unmounted
()
{
const
index
=
this
.
root
.
trChildren
.
findIndex
(
i
=>
i
===
this
)
this
.
root
.
trChildren
.
splice
(
index
,
1
)
this
.
root
.
isNodata
()
},
// #endif
methods
:
{
minWidthUpdate
(
width
)
{
this
.
widthThArr
.
push
(
width
)
},
// 选中
checkboxSelected
(
e
)
{
let
rootData
=
this
.
root
.
data
.
find
(
v
=>
v
[
this
.
root
.
rowKey
]
===
this
.
keyValue
)
this
.
checked
=
e
.
checked
this
.
root
.
check
(
rootData
||
this
,
e
.
checked
,
rootData
?
this
.
keyValue
:
null
)
},
change
(
e
)
{
this
.
root
.
trChildren
.
forEach
(
item
=>
{
if
(
item
===
this
)
{
this
.
root
.
check
(
this
,
e
.
detail
.
value
.
length
>
0
?
true
:
false
)
}
})
},
/**
* 获取父元素实例
*/
getTable
(
name
=
'uniTable'
)
{
let
parent
=
this
.
$parent
let
parentName
=
parent
.
$options
.
name
while
(
parentName
!==
name
)
{
parent
=
parent
.
$parent
if
(
!
parent
)
return
false
parentName
=
parent
.
$options
.
name
}
return
parent
}
}
}
</
script
>
<
style
lang=
"scss"
>
$border-color
:
#ebeef5
;
.uni-table-tr
{
/* #ifndef APP-NVUE */
display
:
table-row
;
transition
:
all
0
.3s
;
box-sizing
:
border-box
;
/* #endif */
}
.checkbox
{
padding
:
0
8px
;
width
:
26px
;
padding-left
:
12px
;
/* #ifndef APP-NVUE */
display
:
table-cell
;
vertical-align
:
middle
;
/* #endif */
color
:
#333
;
font-weight
:
500
;
border-bottom
:
1px
$border-color
solid
;
font-size
:
14px
;
// text-align: center;
}
.tr-table--border
{
border-right
:
1px
$border-color
solid
;
}
/* #ifndef APP-NVUE */
.uni-table-tr
{
::v-deep
.uni-table-th
{
&
.table--border
:last-child
{
// border-right: none;
}
}
::v-deep
.uni-table-td
{
&
.table--border
:last-child
{
// border-right: none;
}
}
}
/* #endif */
</
style
>
src/uni_modules/uni-table/i18n/en.json
0 → 100644
浏览文件 @
5eae5d40
{
"filter-dropdown.reset"
:
"Reset"
,
"filter-dropdown.search"
:
"Search"
,
"filter-dropdown.submit"
:
"Submit"
,
"filter-dropdown.filter"
:
"Filter"
,
"filter-dropdown.gt"
:
"Greater or equal to"
,
"filter-dropdown.lt"
:
"Less than or equal to"
,
"filter-dropdown.date"
:
"Date"
}
src/uni_modules/uni-table/i18n/es.json
0 → 100644
浏览文件 @
5eae5d40
{
"filter-dropdown.reset"
:
"Reiniciar"
,
"filter-dropdown.search"
:
"Búsqueda"
,
"filter-dropdown.submit"
:
"Entregar"
,
"filter-dropdown.filter"
:
"Filtrar"
,
"filter-dropdown.gt"
:
"Mayor o igual a"
,
"filter-dropdown.lt"
:
"Menos que o igual a"
,
"filter-dropdown.date"
:
"Fecha"
}
src/uni_modules/uni-table/i18n/fr.json
0 → 100644
浏览文件 @
5eae5d40
{
"filter-dropdown.reset"
:
"Réinitialiser"
,
"filter-dropdown.search"
:
"Chercher"
,
"filter-dropdown.submit"
:
"Soumettre"
,
"filter-dropdown.filter"
:
"Filtre"
,
"filter-dropdown.gt"
:
"Supérieur ou égal à"
,
"filter-dropdown.lt"
:
"Inférieur ou égal à"
,
"filter-dropdown.date"
:
"Date"
}
src/uni_modules/uni-table/i18n/index.js
0 → 100644
浏览文件 @
5eae5d40
import
en
from
'./en.json'
import
es
from
'./es.json'
import
fr
from
'./fr.json'
import
zhHans
from
'./zh-Hans.json'
import
zhHant
from
'./zh-Hant.json'
export
default
{
en
,
es
,
fr
,
'zh-Hans'
:
zhHans
,
'zh-Hant'
:
zhHant
}
src/uni_modules/uni-table/i18n/zh-Hans.json
0 → 100644
浏览文件 @
5eae5d40
{
"filter-dropdown.reset"
:
"重置"
,
"filter-dropdown.search"
:
"搜索"
,
"filter-dropdown.submit"
:
"确定"
,
"filter-dropdown.filter"
:
"筛选"
,
"filter-dropdown.gt"
:
"大于等于"
,
"filter-dropdown.lt"
:
"小于等于"
,
"filter-dropdown.date"
:
"日期范围"
}
src/uni_modules/uni-table/i18n/zh-Hant.json
0 → 100644
浏览文件 @
5eae5d40
{
"filter-dropdown.reset"
:
"重置"
,
"filter-dropdown.search"
:
"搜索"
,
"filter-dropdown.submit"
:
"確定"
,
"filter-dropdown.filter"
:
"篩選"
,
"filter-dropdown.gt"
:
"大於等於"
,
"filter-dropdown.lt"
:
"小於等於"
,
"filter-dropdown.date"
:
"日期範圍"
}
src/uni_modules/uni-table/package.json
0 → 100644
浏览文件 @
5eae5d40
{
"id"
:
"uni-table"
,
"displayName"
:
"uni-table 表格"
,
"version"
:
"1.2.3"
,
"description"
:
"表格组件,多用于展示多条结构类似的数据,如"
,
"keywords"
:
[
"uni-ui"
,
"uniui"
,
"table"
,
"表格"
],
"repository"
:
"https://github.com/dcloudio/uni-ui"
,
"engines"
:
{
"HBuilderX"
:
""
},
"directories"
:
{
"example"
:
"../../temps/example_temps"
},
"dcloudext"
:
{
"sale"
:
{
"regular"
:
{
"price"
:
"0.00"
},
"sourcecode"
:
{
"price"
:
"0.00"
}
},
"contact"
:
{
"qq"
:
""
},
"declaration"
:
{
"ads"
:
"无"
,
"data"
:
"无"
,
"permissions"
:
"无"
},
"npmurl"
:
"https://www.npmjs.com/package/@dcloudio/uni-ui"
,
"type"
:
"component-vue"
},
"uni_modules"
:
{
"dependencies"
:
[
"uni-scss"
,
"uni-datetime-picker"
],
"encrypt"
:
[],
"platforms"
:
{
"cloud"
:
{
"tcb"
:
"y"
,
"aliyun"
:
"y"
},
"client"
:
{
"App"
:
{
"app-vue"
:
"y"
,
"app-nvue"
:
"n"
},
"H5-mobile"
:
{
"Safari"
:
"y"
,
"Android Browser"
:
"y"
,
"微信浏览器(Android)"
:
"y"
,
"QQ浏览器(Android)"
:
"y"
},
"H5-pc"
:
{
"Chrome"
:
"y"
,
"IE"
:
"y"
,
"Edge"
:
"y"
,
"Firefox"
:
"y"
,
"Safari"
:
"y"
},
"小程序"
:
{
"微信"
:
"y"
,
"阿里"
:
"y"
,
"百度"
:
"y"
,
"字节跳动"
:
"n"
,
"QQ"
:
"y"
},
"快应用"
:
{
"华为"
:
"n"
,
"联盟"
:
"n"
},
"Vue"
:
{
"vue2"
:
"y"
,
"vue3"
:
"y"
}
}
}
}
}
\ No newline at end of file
src/uni_modules/uni-table/readme.md
0 → 100644
浏览文件 @
5eae5d40
## Table 表单
> 组件名:``uni-table``,代码块: `uTable`。
用于展示多条结构类似的数据
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-table)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
src/utils/print.ts
deleted
100644 → 0
浏览文件 @
b7a98f8c
// import { reactive } from "vue";
// import { createNew } from './ble/tsc'
// let blueTooth: any;
// const state: any = reactive({
// looptime: 0,
// currentTime: 1,
// lastData: 0,
// oneTimeData: 0,
// canvasWidth: 1050,
// canvasHeight: 750,
// buffSize: [],
// printNum: [],
// printerNum: 1,
// currentPrint: 1,
// isReceiptSend: false,
// isLabelSend: false
// })
// export const init = () => {
// let list = [] as any[]
// let numList = []
// let j = 0
// for (let i = 20; i < 200; i += 10) {
// list[j] = i;
// j++
// }
// for (let i = 1; i < 10; i++) {
// numList[i - 1] = i
// }
// state.buffSize = list;
// state.oneTimeData = list[0];
// state.printNum = numList;
// state.printerNum = numList[0];
// }
// export const labelTest = (tooth: any, printData?: any) => {
// blueTooth = tooth
// let canvasWidth = state.canvasWidth
// let canvasHeight = state.canvasHeight
// let { qrcode, barcode, fields } = printData
// // x 和 y: 文字的起始位置坐标,以毫米为单位。
// // font: 字体类型,可以是预装载的或者外部下载的字体。
// // x_ 和 y_: 水平和垂直缩放比例,范围为 0 - 10,可调整字体大小。
// // str: 要打印的文字内容。
// // codetype: 条形码类型,支持 CODE128、CODE39、CODE93 等多种类型。
// // height: 条码的高度,以毫米为单位。
// // readable: 是否在条形码下方打印可读的文字标签。0 表示不打印,1 表示打印。
// // narrow 和 wide: 条形码线条的宽度比例,范围为 1 - 10。
// // content: 条形码所表示的内容。
// let command = createNew()
// command.setSize(70, 52); // 设置页面大小
// command.setGap(0); //传感器 command.setCls(); //清除打印机缓存
// // command.setText(40, 50, 'TSS24.BF2', 1, 1, 'WMS编码号');
// // command.setBarCode(200, 40, 'EAN8', 64, 1, 3, 3, '1234567');
// // command.setText(40, 100, 'TSS24.BF2', 1, 1, '佳博智汇');
// // command.setText(40, 140, 'TSS24.BF2', 1, 1, 'h测试数字12345678');
// // command.setText(40, 180, 'TSS24.BF2', 1, 1, 'g测试数字12345678');
// // command.setText(40, 220, 'TSS24.BF2', 1, 1, 'f测试数字12345678');
// // command.setText(40, 260, 'TSS24.BF2', 1, 1, 'e测试数字12345678');
// // command.setText(40, 300, 'TSS24.BF2', 1, 1, 'd测试数字12345678');
// // command.setText(40, 340, 'TSS24.BF2', 1, 1, 'c测试数字12345678');
// // command.setText(40, 380, 'TSS24.BF2', 1, 1, 'b测试数字12345678');
// // command.setQR(300, 180, 'L', 8, 'A', 'www.smarnet.cc佳博智汇');
// command.setText(40, 50, 'TSS24.BF2', 1, 1, 'WMS编码号');
// command.setBarCode(200, 40, 'EAN8', 64, 1, 3, 3, barcode);
// let num = 60
// for (const k in fields) {
// command.setText(40, num + 40, 'TSS24.BF2', 1, 1, JSON.stringify(fields[k]));
// }
// command.setQR(300, 180, 'L', 6, 'A', JSON.stringify(qrcode));
// setTimeout(() => {
// uni.canvasGetImageData({
// canvasId: 'edit_area_canvas',
// x: 0,
// y: 0,
// width: canvasWidth,
// height: canvasHeight,
// success: function (res) {
// command.setBitmap(60, 0, 1, res)
// },
// complete: function () {
// command.setPagePrint()
// state.isLabelSend = true;
// prepareSend(command.getData())
// }
// })
// }, 300);
// }
// //准备发送,根据每次发送字节数来处理分包数量
// const prepareSend = (buff: any[]) => {
// console.log(buff.length, 'buff.length');
// let time = state.oneTimeData
// let looptime = (Number(buff.length) / Number(time));
// let lastData = (Number(buff.length) % Number(time));
// console.log(looptime + "---" + lastData)
// state.looptime = looptime + 1;
// state.lastData = lastData;
// state.currentTime = 1;
// Send(buff)
// }
// //分包发送
// const Send = (buff: any) => {
// let {
// currentTime,
// looptime: loopTime,
// lastData,
// oneTimeData: onTimeData,
// printerNum: printNum,
// currentPrint } = state;
// let buf;
// let dataView;
// if (currentTime < loopTime) {
// buf = new ArrayBuffer(onTimeData)
// dataView = new DataView(buf)
// for (var i = 0; i < onTimeData; ++i) {
// dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
// }
// } else {
// buf = new ArrayBuffer(lastData)
// dataView = new DataView(buf)
// for (var i = 0; i < lastData; ++i) {
// dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
// }
// }
// console.log("第" + currentTime + "次发送数据大小为:" + buf.byteLength)
// let BLEInformation = blueTooth.BLEInformation
// plus.bluetooth.writeBLECharacteristicValue({
// deviceId: BLEInformation.deviceId,
// serviceId: BLEInformation.writeServiceId,
// characteristicId: BLEInformation.writeCharaterId,
// value: buf,
// success: function (res) {
// console.log(res)
// },
// fail: function (e) {
// console.log(e)
// },
// complete: function () {
// currentTime++
// if (currentTime <= loopTime) {
// state.currentTime = currentTime;
// Send(buff)
// } else {
// uni.showToast({
// title: '已打印第' + currentPrint + '张',
// })
// if (currentPrint == printNum) {
// state.looptime = 0;
// state.lastData = 0;
// state.currentTime = 1;
// state.isReceiptSend = false;
// state.isLabelSend = false;
// state.currentPrint = 1;
// } else {
// currentPrint++;
// state.currentPrint = currentPrint;
// state.currentTime = 1;
// Send(buff)
// }
// }
// }
// })
// }
\ No newline at end of file
src/utils/request.ts
浏览文件 @
5eae5d40
...
...
@@ -2,6 +2,7 @@ import config from './config';
import
{
useGlobalStore
}
from
'@/store/useStore'
;
const
baseUrl
=
config
.
baseUrl
;
// 封装公共申请办法
function
request
(
url
:
string
,
...
...
@@ -9,7 +10,7 @@ function request(
data
?:
object
|
any
,
responseType
?:
string
)
{
return
new
Promise
<
any
>
(
function
(
resolve
,
reject
)
{
return
new
Promise
<
any
>
(
function
(
resolve
,
reject
)
{
let
header
:
any
;
const
globalStore
=
useGlobalStore
();
uni
.
showLoading
({
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论