Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
U
uni-pdtravel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
panyongping
uni-pdtravel
Commits
5f76ef21
Commit
5f76ef21
authored
Apr 28, 2024
by
潘永坪
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
购票须知退票规则修改
parent
5fdde65d
Changes
57
Show whitespace changes
Inline
Side-by-side
Showing
57 changed files
with
9073 additions
and
39 deletions
+9073
-39
buyKnow.vue
components/buyKnow.vue
+51
-1
distributionCombiChoose.vue
...ation/distributionCombiChoose/distributionCombiChoose.vue
+46
-33
scenicCombiOrder.vue
pages/scenic/scenicCombiOrder/scenicCombiOrder.vue
+2
-2
scenicSingleOrder.vue
pages/scenic/scenicSingleOrder/scenicSingleOrder.vue
+9
-3
changelog.md
uni_modules/uni-datetime-picker/changelog.md
+160
-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
+947
-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
+22
-0
zh-Hant.json
...e-picker/components/uni-datetime-picker/i18n/zh-Hant.json
+22
-0
time-picker.vue
...ime-picker/components/uni-datetime-picker/time-picker.vue
+940
-0
uni-datetime-picker.vue
...er/components/uni-datetime-picker/uni-datetime-picker.vue
+1057
-0
util.js
...ni-datetime-picker/components/uni-datetime-picker/util.js
+421
-0
package.json
uni_modules/uni-datetime-picker/package.json
+88
-0
readme.md
uni_modules/uni-datetime-picker/readme.md
+21
-0
changelog.md
uni_modules/uni-icons/changelog.md
+40
-0
uni-icons.uvue
uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
+91
-0
uni-icons.vue
uni_modules/uni-icons/components/uni-icons/uni-icons.vue
+110
-0
uniicons.css
uni_modules/uni-icons/components/uni-icons/uniicons.css
+664
-0
uniicons.ttf
uni_modules/uni-icons/components/uni-icons/uniicons.ttf
+0
-0
uniicons_file.ts
uni_modules/uni-icons/components/uni-icons/uniicons_file.ts
+664
-0
uniicons_file_vue.js
...dules/uni-icons/components/uni-icons/uniicons_file_vue.js
+649
-0
package.json
uni_modules/uni-icons/package.json
+88
-0
readme.md
uni_modules/uni-icons/readme.md
+8
-0
changelog.md
uni_modules/uni-scss/changelog.md
+8
-0
index.scss
uni_modules/uni-scss/index.scss
+1
-0
package.json
uni_modules/uni-scss/package.json
+82
-0
readme.md
uni_modules/uni-scss/readme.md
+4
-0
index.scss
uni_modules/uni-scss/styles/index.scss
+7
-0
_border.scss
uni_modules/uni-scss/styles/setting/_border.scss
+3
-0
_color.scss
uni_modules/uni-scss/styles/setting/_color.scss
+66
-0
_radius.scss
uni_modules/uni-scss/styles/setting/_radius.scss
+55
-0
_space.scss
uni_modules/uni-scss/styles/setting/_space.scss
+56
-0
_styles.scss
uni_modules/uni-scss/styles/setting/_styles.scss
+167
-0
_text.scss
uni_modules/uni-scss/styles/setting/_text.scss
+24
-0
_variables.scss
uni_modules/uni-scss/styles/setting/_variables.scss
+146
-0
functions.scss
uni_modules/uni-scss/styles/tools/functions.scss
+19
-0
theme.scss
uni_modules/uni-scss/theme.scss
+31
-0
variables.scss
uni_modules/uni-scss/variables.scss
+62
-0
changelog.md
uni_modules/uni-table/changelog.md
+29
-0
uni-table.vue
uni_modules/uni-table/components/uni-table/uni-table.vue
+455
-0
uni-tbody.vue
uni_modules/uni-table/components/uni-tbody/uni-tbody.vue
+29
-0
uni-td.vue
uni_modules/uni-table/components/uni-td/uni-td.vue
+90
-0
filter-dropdown.vue
uni_modules/uni-table/components/uni-th/filter-dropdown.vue
+511
-0
uni-th.vue
uni_modules/uni-table/components/uni-th/uni-th.vue
+285
-0
uni-thead.vue
uni_modules/uni-table/components/uni-thead/uni-thead.vue
+129
-0
table-checkbox.vue
uni_modules/uni-table/components/uni-tr/table-checkbox.vue
+179
-0
uni-tr.vue
uni_modules/uni-table/components/uni-tr/uni-tr.vue
+175
-0
en.json
uni_modules/uni-table/i18n/en.json
+9
-0
es.json
uni_modules/uni-table/i18n/es.json
+9
-0
fr.json
uni_modules/uni-table/i18n/fr.json
+9
-0
index.js
uni_modules/uni-table/i18n/index.js
+12
-0
zh-Hans.json
uni_modules/uni-table/i18n/zh-Hans.json
+9
-0
zh-Hant.json
uni_modules/uni-table/i18n/zh-Hant.json
+9
-0
package.json
uni_modules/uni-table/package.json
+83
-0
readme.md
uni_modules/uni-table/readme.md
+13
-0
No files found.
components/buyKnow.vue
View file @
5f76ef21
...
@@ -33,7 +33,57 @@
...
@@ -33,7 +33,57 @@
</text>
</text>
</view>
</view>
</view>
</view>
</view>
<!-- 退票规则 -->
<view
class=
"middle-list"
style=
"border-bottom: none;"
>
<view
class=
"middle-title"
>
<text
v-if=
"buyKnowData.backChangeRule == 0"
>
不可退换
</text>
<text
v-if=
"buyKnowData.backChangeRule == 1"
>
有条件退
</text>
<text
v-if=
"buyKnowData.backChangeRule == 2"
>
随时可退
</text>
</view>
<view
class=
"middle-content"
v-if=
"buyKnowData.backChangeRule == 1"
>
<uni-table
border
>
<uni-tr>
<uni-th
align=
"center"
>
取消时间(当地时间)
</uni-th>
<uni-th
align=
"center"
>
损失费用
</uni-th>
</uni-tr>
<uni-tr>
<uni-td
align=
"center"
>
<!-- 使用时期前 -->
<text
v-if=
"buyKnowData.productRefundRuleVo.refundTimeRule==1"
>
<text
v-if=
"buyKnowData.productRefundRuleVo.refundRuleList[0].refundDay==0"
>
使用日期当天
{{
buyKnowData
.
productRefundRuleVo
.
refundRuleList
[
0
].
refundTime
}}
之前可退
</text>
<text
v-else
>
使用日期前
{{
buyKnowData
.
productRefundRuleVo
.
refundRuleList
[
0
].
refundDay
}}
天
{{
buyKnowData
.
productRefundRuleVo
.
refundRuleList
[
0
].
refundTime
}}
之前可退
</text>
</text>
<!-- 过期后 -->
<text
v-if=
"buyKnowData.productRefundRuleVo.refundTimeRule==2"
>
<text
v-if=
"buyKnowData.productRefundRuleVo.refundRuleList[0].refundDay==0"
>
过期当天
{{
buyKnowData
.
productRefundRuleVo
.
refundRuleList
[
0
].
refundTime
}}
之前可退
</text>
<text
v-else
>
过期后
{{
buyKnowData
.
productRefundRuleVo
.
refundRuleList
[
0
].
refundDay
}}
天
{{
buyKnowData
.
productRefundRuleVo
.
refundRuleList
[
0
].
refundTime
}}
之前可退
</text>
</text>
</uni-td>
<uni-td
align=
"center"
>
<!-- 无手续费 -->
<text
v-if=
"buyKnowData.productRefundRuleVo.refundRuleList[0].isOrderFee==0"
>
0
</text>
<!-- 需要手续费 -->
<text
v-if=
"buyKnowData.productRefundRuleVo.refundRuleList[0].isOrderFee==1"
>
<text
v-if=
"buyKnowData.productRefundRuleVo.refundRuleList[0].refundPoundageType==0"
>
按订单buyKnowData.productRefundRuleVo.refundRuleList[0].refundPoundage
</text>
<text
v-if=
"buyKnowData.productRefundRuleVo.refundRuleList[0].refundPoundageType==1"
>
按数量buyKnowData.productRefundRuleVo.refundRuleList[0].refundPoundage
</text>
</text>
</uni-td>
</uni-tr>
</uni-table>
</view>
</view>
</view>
</view>
</view>
...
...
pages/combination/distributionCombiChoose/distributionCombiChoose.vue
View file @
5f76ef21
...
@@ -350,6 +350,7 @@ export default {
...
@@ -350,6 +350,7 @@ export default {
}
}
let
newTimestamp
=
uni
.
getStorageSync
(
'newTimestamp'
)
||
''
let
newTimestamp
=
uni
.
getStorageSync
(
'newTimestamp'
)
||
''
let
token
=
uni
.
getStorageSync
(
'token'
)
let
token
=
uni
.
getStorageSync
(
'token'
)
let
queryFun
=
()
=>
{
if
(
token
)
{
if
(
token
)
{
uni
.
getLocation
({
uni
.
getLocation
({
type
:
'wgs84'
,
type
:
'wgs84'
,
...
@@ -384,6 +385,18 @@ export default {
...
@@ -384,6 +385,18 @@ export default {
}
}
})
})
}
}
}
//#ifdef MP-WEIXIN
queryFun
()
//#endif
//#ifdef MP-ALIPAY
setTimeout
(()
=>
{
queryFun
()
},
500
)
//#endif
},
},
methods
:
{
methods
:
{
//---商品列表
//---商品列表
...
...
pages/scenic/scenicCombiOrder/scenicCombiOrder.vue
View file @
5f76ef21
...
@@ -18,9 +18,9 @@
...
@@ -18,9 +18,9 @@
<view
@
click=
"showBuyKnow(index)"
class=
"buyKnow"
>
<view
@
click=
"showBuyKnow(index)"
class=
"buyKnow"
>
<view>
<view>
<text
v-if=
"item.backChangeRule == 0"
>
不可退换
</text>
<text
v-if=
"item.backChangeRule == 0"
>
不可退换
</text>
<text
v-if=
"item.backChangeRule == 1"
>
可
退
</text>
<text
v-if=
"item.backChangeRule == 1"
>
有条件
退
</text>
<text
v-if=
"item.backChangeRule == 2"
>
随时可退
</text>
<text
v-if=
"item.backChangeRule == 2"
>
随时可退
</text>
<text
v-if=
"item.isFetch == 1"
>
无需取号
</text>
<text
v-if=
"item.isFetch == 1"
style=
"margin-left: 10rpx;"
>
无需取号
</text>
</view>
</view>
<view>
<view>
购买须知
购买须知
...
...
pages/scenic/scenicSingleOrder/scenicSingleOrder.vue
View file @
5f76ef21
...
@@ -17,9 +17,9 @@
...
@@ -17,9 +17,9 @@
<view
@
click=
"showBuyKnow()"
class=
"buyKnow"
>
<view
@
click=
"showBuyKnow()"
class=
"buyKnow"
>
<view>
<view>
<text
v-if=
"productIfo.backChangeRule == 0"
>
不可退换
</text>
<text
v-if=
"productIfo.backChangeRule == 0"
>
不可退换
</text>
<text
v-if=
"productIfo.backChangeRule == 1"
>
可
退
</text>
<text
v-if=
"productIfo.backChangeRule == 1"
>
有条件
退
</text>
<text
v-if=
"productIfo.backChangeRule == 2"
>
随时可退
</text>
<text
v-if=
"productIfo.backChangeRule == 2"
>
随时可退
</text>
<text
v-if=
"productIfo.isFetch == 1"
>
无需取号
</text>
<text
v-if=
"productIfo.isFetch == 1"
style=
"margin-left: 10rpx;"
>
无需取号
</text>
</view>
</view>
<view>
<view>
购买须知
购买须知
...
@@ -470,9 +470,15 @@ export default {
...
@@ -470,9 +470,15 @@ export default {
this
.
orderSource
=
this
.
$commonjs
.
getKey
(
option
,
'orderSource'
)
||
''
this
.
orderSource
=
this
.
$commonjs
.
getKey
(
option
,
'orderSource'
)
||
''
this
.
thirdOpenid
=
this
.
$commonjs
.
getKey
(
option
,
'thirdOpenid'
)
||
''
//第三方openid
this
.
thirdOpenid
=
this
.
$commonjs
.
getKey
(
option
,
'thirdOpenid'
)
||
''
//第三方openid
this
.
productId
=
this
.
$commonjs
.
getKey
(
option
,
'productId'
)
||
''
this
.
productId
=
this
.
$commonjs
.
getKey
(
option
,
'productId'
)
||
''
//#ifdef MP-WEIXIN
this
.
initData
()
//页面初始化数据
//#endif
//#ifdef MP-ALIPAY
//解决支付宝小程序新增联系人时,数据变化间隔太短,部分手机无法监听并执行相关逻辑,所以延迟500毫秒再调接口
setTimeout
(()
=>
{
setTimeout
(()
=>
{
this
.
initData
()
//页面初始化数据
this
.
initData
()
//页面初始化数据
},
1000
)
},
500
)
//#endif
this
.
docQuery
=
uni
.
createSelectorQuery
().
in
(
this
)
this
.
docQuery
=
uni
.
createSelectorQuery
().
in
(
this
)
},
},
computed
:
{
computed
:
{
...
...
uni_modules/uni-datetime-picker/changelog.md
0 → 100644
View file @
5f76ef21
## 2.2.34(2024-04-24)
-
新增 日期点击事件,在点击日期时会触发该事件。
## 2.2.33(2024-04-15)
-
修复 抖音小程序事件传递失效bug
## 2.2.32(2024-02-20)
-
修复 日历的close事件触发异常的bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/844
)
## 2.2.31(2024-02-20)
-
修复 h5平台 右边日历的月份默认+1的bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/841
)
## 2.2.30(2024-01-31)
-
修复 隐藏“秒”时,在IOS15及以下版本时出现 结束时间在开始时间之前 的bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/788
)
## 2.2.29(2024-01-20)
-
新增 show事件,弹窗弹出时触发该事件
[
详情
](
https://github.com/dcloudio/uni-app/issues/4694
)
## 2.2.28(2024-01-18)
-
去除 noChange事件,当进行日期范围选择时,若只选了一天,则开始结束日期都为同一天
[
详情
](
https://github.com/dcloudio/uni-ui/issues/815
)
## 2.2.27(2024-01-10)
-
优化 增加noChange事件,当进行日期范围选择时,若有空值,则触发该事件
[
详情
](
https://github.com/dcloudio/uni-ui/issues/815
)
## 2.2.26(2024-01-08)
-
修复 字节小程序时间选择范围器失效问题
[
详情
](
https://github.com/dcloudio/uni-ui/issues/834
)
## 2.2.25(2023-10-18)
-
修复 PC端初次修改时间,开始时间未更新的Bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/737
)
## 2.2.24(2023-06-02)
-
修复 部分情况修改时间,开始、结束时间显示异常的Bug
[
详情
](
https://ask.dcloud.net.cn/question/171146
)
-
优化 当前月可以选择上月、下月的日期的Bug
## 2.2.23(2023-05-02)
-
修复 部分情况修改时间,开始时间未更新的Bug
[
详情
](
https://github.com/dcloudio/uni-ui/issues/737
)
-
修复 部分平台及设备第一次点击无法显示弹框的Bug
-
修复 ios 日期格式未补零显示及使用异常的Bug
[
详情
](
https://ask.dcloud.net.cn/question/162979
)
## 2.2.22(2023-03-30)
-
修复 日历 picker 修改年月后,自动选中当月1日的Bug
[
详情
](
https://ask.dcloud.net.cn/question/165937
)
-
修复 小程序端 低版本 ios NaN的Bug
[
详情
](
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 属性支持配置选择器打开时默认显示的时间
-
优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间
-
优化 字节小程序日期时间范围选择,底部日期换行的Bug
## 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 适配
uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
0 → 100644
View file @
5f76ef21
<
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=
"maskClick"
>
<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
},
options
:
{
// #ifdef MP-TOUTIAO
virtualHost
:
false
,
// #endif
// #ifndef MP-TOUTIAO
virtualHost
:
true
// #endif
},
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
(
isSingleChange
)
{
if
(
!
this
.
insert
&&
!
isSingleChange
)
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
(
true
)
},
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
>
uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
0 → 100644
View file @
5f76ef21
{
"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"
}
uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
0 → 100644
View file @
5f76ef21
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
}
uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
0 → 100644
View file @
5f76ef21
{
"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
uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
0 → 100644
View file @
5f76ef21
{
"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
uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
0 → 100644
View file @
5f76ef21
<
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
,
}
},
options
:
{
// #ifdef MP-TOUTIAO
virtualHost
:
false
,
// #endif
// #ifndef MP-TOUTIAO
virtualHost
:
true
// #endif
},
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
();
},
/**
* 生成时间戳
* @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
>
uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
0 → 100644
View file @
5f76ef21
<
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"
@
change=
"calendarClick"
/>
</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
:
{
// #ifdef MP-TOUTIAO
virtualHost
:
false
,
// #endif
// #ifndef MP-TOUTIAO
virtualHost
:
true
// #endif
},
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
()
{
this
.
$emit
(
"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')
if
(
this
.
isPhone
)
{
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
)
this
.
$emit
(
'calendarClick'
,
e
)
},
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
)
this
.
$emit
(
'calendarClick'
,
e
)
},
mobileChange
(
e
)
{
if
(
this
.
isRange
)
{
const
{
before
,
after
}
=
e
.
range
if
(
!
before
)
{
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
)
return
if
(
!
after
)
after
=
before
;
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'
,
[])
}
}
},
calendarClick
(
e
)
{
this
.
$emit
(
'calendarClick'
,
e
)
}
}
}
</
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
>
uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
0 → 100644
View file @
5f76ef21
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
result
.
push
({
date
:
new
Date
(
dateObj
.
year
,
month
,
-
i
).
getDate
(),
month
,
disable
:
true
})
}
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
info
=
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
,
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
),
month
:
dateObj
.
month
,
disable
:
(
this
.
startDate
&&
!
dateCompare
(
this
.
startDate
,
currentDate
))
||
(
this
.
endDate
&&
!
dateCompare
(
currentDate
,
this
.
endDate
)),
isToday
,
userChecked
:
false
,
extraInfo
:
info
})
}
return
result
}
/**
* 获取下一个月日期集合
*/
_getNextMonthDays
(
amount
,
dateObj
)
{
const
result
=
[]
const
month
=
dateObj
.
month
+
1
for
(
let
i
=
1
;
i
<=
amount
;
i
++
)
{
result
.
push
({
date
:
i
,
month
,
disable
:
true
})
}
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
.
multipleStatus
.
after
=
undefined
;
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
)
{
//抖音小程序点击会触发hover事件,需要避免一下
// #ifndef MP-TOUTIAO
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
)
// #endif
}
/**
* 更新默认值多选状态
*/
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
)
}
//ios低版本15及以下,无法匹配 没有 ’秒‘ 时的情况,所以需要在末尾 秒 加上 问号
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
}
uni_modules/uni-datetime-picker/package.json
0 → 100644
View file @
5f76ef21
{
"id"
:
"uni-datetime-picker"
,
"displayName"
:
"uni-datetime-picker 日期选择器"
,
"version"
:
"2.2.34"
,
"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"
,
"alipay"
:
"n"
},
"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"
}
}
}
}
}
uni_modules/uni-datetime-picker/readme.md
0 → 100644
View file @
5f76ef21
> `重要通知:组件升级更新 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
uni_modules/uni-icons/changelog.md
0 → 100644
View file @
5f76ef21
## 2.0.9(2024-01-12)
fix: 修复图标大小默认值错误的问题
## 2.0.8(2023-12-14)
-
修复 项目未使用 ts 情况下,打包报错的bug
## 2.0.7(2023-12-14)
-
修复 size 属性为 string 时,不加单位导致尺寸异常的bug
## 2.0.6(2023-12-11)
-
优化 兼容老版本icon类型,如 top ,bottom 等
## 2.0.5(2023-12-11)
-
优化 兼容老版本icon类型,如 top ,bottom 等
## 2.0.4(2023-12-06)
-
优化 uni-app x 下示例项目图标排序
## 2.0.3(2023-12-06)
-
修复 nvue下引入组件报错的bug
## 2.0.2(2023-12-05)
-优化 size 属性支持单位
## 2.0.1(2023-12-05)
-
新增 uni-app x 支持定义图标
## 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目录规范
uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
0 → 100644
View file @
5f76ef21
<template>
<text class="uni-icons" :style="styleObj">
<slot>{{unicode}}</slot>
</text>
</template>
<script>
import { fontData, IconsDataItem } from './uniicons_file'
/**
* Icons 图标
* @description 用于展示 icon 图标
* @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: "uni-icons",
props: {
type: {
type: String,
default: ''
},
color: {
type: String,
default: '#333333'
},
size: {
type: Object,
default: 16
},
fontFamily: {
type: String,
default: ''
}
},
data() {
return {};
},
computed: {
unicode() : string {
let codes = fontData.find((item : IconsDataItem) : boolean => { return item.font_class == this.type })
if (codes !== null) {
return codes.unicode
}
return ''
},
iconSize() : string {
const size = this.size
if (typeof size == 'string') {
const reg = /^[0-9]*$/g
return reg.test(size as string) ? '' + size + 'px' : '' + size;
// return '' + this.size
}
return this.getFontSize(size as number)
},
styleObj() : UTSJSONObject {
if (this.fontFamily !== '') {
return { color: this.color, fontSize: this.iconSize, fontFamily: this.fontFamily }
}
return { color: this.color, fontSize: this.iconSize }
}
},
created() { },
methods: {
/**
* 字体大小
*/
getFontSize(size : number) : string {
return size + 'px';
},
},
}
</script>
<style scoped>
@font-face {
font-family: UniIconsFontFamily;
src: url('./uniicons.ttf');
}
.uni-icons {
font-family: UniIconsFontFamily;
font-size: 18px;
font-style: normal;
color: #333;
}
</style>
uni_modules/uni-icons/components/uni-icons/uni-icons.vue
0 → 100644
View file @
5f76ef21
<
template
>
<!-- #ifdef APP-NVUE -->
<text
:style=
"styleObj"
class=
"uni-icons"
@
click=
"_onClick"
>
{{
unicode
}}
</text>
<!-- #endif -->
<!-- #ifndef APP-NVUE -->
<text
:style=
"styleObj"
class=
"uni-icons"
:class=
"['uniui-'+type,customPrefix,customPrefix?type:'']"
@
click=
"_onClick"
>
<slot></slot>
</text>
<!-- #endif -->
</
template
>
<
script
>
import
{
fontData
}
from
'./uniicons_file_vue.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
:
''
},
fontFamily
:
{
type
:
String
,
default
:
''
}
},
data
()
{
return
{
icons
:
fontData
}
},
computed
:
{
unicode
()
{
let
code
=
this
.
icons
.
find
(
v
=>
v
.
font_class
===
this
.
type
)
if
(
code
)
{
return
code
.
unicode
}
return
''
},
iconSize
()
{
return
getVal
(
this
.
size
)
},
styleObj
()
{
if
(
this
.
fontFamily
!==
''
)
{
return
`color:
${
this
.
color
}
; font-size:
${
this
.
iconSize
}
; font-family:
${
this
.
fontFamily
}
;`
}
return
`color:
${
this
.
color
}
; font-size:
${
this
.
iconSize
}
;`
}
},
methods
:
{
_onClick
()
{
this
.
$emit
(
'click'
)
}
}
}
</
script
>
<
style
lang=
"scss"
>
/* #ifndef APP-NVUE */
@import
'./uniicons.css'
;
@font-face
{
font-family
:
uniicons
;
src
:
url('./uniicons.ttf')
;
}
/* #endif */
.uni-icons
{
font-family
:
uniicons
;
text-decoration
:
none
;
text-align
:
center
;
}
</
style
>
uni_modules/uni-icons/components/uni-icons/uniicons.css
0 → 100644
View file @
5f76ef21
.uniui-cart-filled
:before
{
content
:
"\e6d0"
;
}
.uniui-gift-filled
:before
{
content
:
"\e6c4"
;
}
.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-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-arrowthinleft
:before
{
content
:
"\e6d2"
;
}
.uniui-arrowthinup
:before
{
content
:
"\e6d3"
;
}
.uniui-arrowthindown
:before
{
content
:
"\e6d4"
;
}
.uniui-back
:before
{
content
:
"\e6b9"
;
}
.uniui-forward
:before
{
content
:
"\e6ba"
;
}
.uniui-arrow-right
:before
{
content
:
"\e6bb"
;
}
.uniui-arrow-left
:before
{
content
:
"\e6bc"
;
}
.uniui-arrow-up
:before
{
content
:
"\e6bd"
;
}
.uniui-arrow-down
:before
{
content
:
"\e6be"
;
}
.uniui-arrowthinright
:before
{
content
:
"\e6d1"
;
}
.uniui-down
:before
{
content
:
"\e6b8"
;
}
.uniui-bottom
:before
{
content
:
"\e6b8"
;
}
.uniui-arrowright
:before
{
content
:
"\e6d5"
;
}
.uniui-right
:before
{
content
:
"\e6b5"
;
}
.uniui-up
:before
{
content
:
"\e6b6"
;
}
.uniui-top
:before
{
content
:
"\e6b6"
;
}
.uniui-left
:before
{
content
:
"\e6b7"
;
}
.uniui-arrowup
:before
{
content
:
"\e6d6"
;
}
.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-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"
;
}
uni_modules/uni-icons/components/uni-icons/uniicons.ttf
0 → 100644
View file @
5f76ef21
File added
uni_modules/uni-icons/components/uni-icons/uniicons_file.ts
0 → 100644
View file @
5f76ef21
export
type
IconsData
=
{
id
:
string
name
:
string
font_family
:
string
css_prefix_text
:
string
description
:
string
glyphs
:
Array
<
IconsDataItem
>
}
export
type
IconsDataItem
=
{
font_class
:
string
unicode
:
string
}
export
const
fontData
=
[
{
"font_class"
:
"arrow-down"
,
"unicode"
:
"
\
ue6be"
},
{
"font_class"
:
"arrow-left"
,
"unicode"
:
"
\
ue6bc"
},
{
"font_class"
:
"arrow-right"
,
"unicode"
:
"
\
ue6bb"
},
{
"font_class"
:
"arrow-up"
,
"unicode"
:
"
\
ue6bd"
},
{
"font_class"
:
"auth"
,
"unicode"
:
"
\
ue6ab"
},
{
"font_class"
:
"auth-filled"
,
"unicode"
:
"
\
ue6cc"
},
{
"font_class"
:
"back"
,
"unicode"
:
"
\
ue6b9"
},
{
"font_class"
:
"bars"
,
"unicode"
:
"
\
ue627"
},
{
"font_class"
:
"calendar"
,
"unicode"
:
"
\
ue6a0"
},
{
"font_class"
:
"calendar-filled"
,
"unicode"
:
"
\
ue6c0"
},
{
"font_class"
:
"camera"
,
"unicode"
:
"
\
ue65a"
},
{
"font_class"
:
"camera-filled"
,
"unicode"
:
"
\
ue658"
},
{
"font_class"
:
"cart"
,
"unicode"
:
"
\
ue631"
},
{
"font_class"
:
"cart-filled"
,
"unicode"
:
"
\
ue6d0"
},
{
"font_class"
:
"chat"
,
"unicode"
:
"
\
ue65d"
},
{
"font_class"
:
"chat-filled"
,
"unicode"
:
"
\
ue659"
},
{
"font_class"
:
"chatboxes"
,
"unicode"
:
"
\
ue696"
},
{
"font_class"
:
"chatboxes-filled"
,
"unicode"
:
"
\
ue692"
},
{
"font_class"
:
"chatbubble"
,
"unicode"
:
"
\
ue697"
},
{
"font_class"
:
"chatbubble-filled"
,
"unicode"
:
"
\
ue694"
},
{
"font_class"
:
"checkbox"
,
"unicode"
:
"
\
ue62b"
},
{
"font_class"
:
"checkbox-filled"
,
"unicode"
:
"
\
ue62c"
},
{
"font_class"
:
"checkmarkempty"
,
"unicode"
:
"
\
ue65c"
},
{
"font_class"
:
"circle"
,
"unicode"
:
"
\
ue65b"
},
{
"font_class"
:
"circle-filled"
,
"unicode"
:
"
\
ue65e"
},
{
"font_class"
:
"clear"
,
"unicode"
:
"
\
ue66d"
},
{
"font_class"
:
"close"
,
"unicode"
:
"
\
ue673"
},
{
"font_class"
:
"closeempty"
,
"unicode"
:
"
\
ue66c"
},
{
"font_class"
:
"cloud-download"
,
"unicode"
:
"
\
ue647"
},
{
"font_class"
:
"cloud-download-filled"
,
"unicode"
:
"
\
ue646"
},
{
"font_class"
:
"cloud-upload"
,
"unicode"
:
"
\
ue645"
},
{
"font_class"
:
"cloud-upload-filled"
,
"unicode"
:
"
\
ue648"
},
{
"font_class"
:
"color"
,
"unicode"
:
"
\
ue6cf"
},
{
"font_class"
:
"color-filled"
,
"unicode"
:
"
\
ue6c9"
},
{
"font_class"
:
"compose"
,
"unicode"
:
"
\
ue67f"
},
{
"font_class"
:
"contact"
,
"unicode"
:
"
\
ue693"
},
{
"font_class"
:
"contact-filled"
,
"unicode"
:
"
\
ue695"
},
{
"font_class"
:
"down"
,
"unicode"
:
"
\
ue6b8"
},
{
"font_class"
:
"bottom"
,
"unicode"
:
"
\
ue6b8"
},
{
"font_class"
:
"download"
,
"unicode"
:
"
\
ue68d"
},
{
"font_class"
:
"download-filled"
,
"unicode"
:
"
\
ue681"
},
{
"font_class"
:
"email"
,
"unicode"
:
"
\
ue69e"
},
{
"font_class"
:
"email-filled"
,
"unicode"
:
"
\
ue69a"
},
{
"font_class"
:
"eye"
,
"unicode"
:
"
\
ue651"
},
{
"font_class"
:
"eye-filled"
,
"unicode"
:
"
\
ue66a"
},
{
"font_class"
:
"eye-slash"
,
"unicode"
:
"
\
ue6b3"
},
{
"font_class"
:
"eye-slash-filled"
,
"unicode"
:
"
\
ue6b4"
},
{
"font_class"
:
"fire"
,
"unicode"
:
"
\
ue6a1"
},
{
"font_class"
:
"fire-filled"
,
"unicode"
:
"
\
ue6c5"
},
{
"font_class"
:
"flag"
,
"unicode"
:
"
\
ue65f"
},
{
"font_class"
:
"flag-filled"
,
"unicode"
:
"
\
ue660"
},
{
"font_class"
:
"folder-add"
,
"unicode"
:
"
\
ue6a9"
},
{
"font_class"
:
"folder-add-filled"
,
"unicode"
:
"
\
ue6c8"
},
{
"font_class"
:
"font"
,
"unicode"
:
"
\
ue6a3"
},
{
"font_class"
:
"forward"
,
"unicode"
:
"
\
ue6ba"
},
{
"font_class"
:
"gear"
,
"unicode"
:
"
\
ue664"
},
{
"font_class"
:
"gear-filled"
,
"unicode"
:
"
\
ue661"
},
{
"font_class"
:
"gift"
,
"unicode"
:
"
\
ue6a4"
},
{
"font_class"
:
"gift-filled"
,
"unicode"
:
"
\
ue6c4"
},
{
"font_class"
:
"hand-down"
,
"unicode"
:
"
\
ue63d"
},
{
"font_class"
:
"hand-down-filled"
,
"unicode"
:
"
\
ue63c"
},
{
"font_class"
:
"hand-up"
,
"unicode"
:
"
\
ue63f"
},
{
"font_class"
:
"hand-up-filled"
,
"unicode"
:
"
\
ue63e"
},
{
"font_class"
:
"headphones"
,
"unicode"
:
"
\
ue630"
},
{
"font_class"
:
"heart"
,
"unicode"
:
"
\
ue639"
},
{
"font_class"
:
"heart-filled"
,
"unicode"
:
"
\
ue641"
},
{
"font_class"
:
"help"
,
"unicode"
:
"
\
ue679"
},
{
"font_class"
:
"help-filled"
,
"unicode"
:
"
\
ue674"
},
{
"font_class"
:
"home"
,
"unicode"
:
"
\
ue662"
},
{
"font_class"
:
"home-filled"
,
"unicode"
:
"
\
ue663"
},
{
"font_class"
:
"image"
,
"unicode"
:
"
\
ue670"
},
{
"font_class"
:
"image-filled"
,
"unicode"
:
"
\
ue678"
},
{
"font_class"
:
"images"
,
"unicode"
:
"
\
ue650"
},
{
"font_class"
:
"images-filled"
,
"unicode"
:
"
\
ue64b"
},
{
"font_class"
:
"info"
,
"unicode"
:
"
\
ue669"
},
{
"font_class"
:
"info-filled"
,
"unicode"
:
"
\
ue649"
},
{
"font_class"
:
"left"
,
"unicode"
:
"
\
ue6b7"
},
{
"font_class"
:
"link"
,
"unicode"
:
"
\
ue6a5"
},
{
"font_class"
:
"list"
,
"unicode"
:
"
\
ue644"
},
{
"font_class"
:
"location"
,
"unicode"
:
"
\
ue6ae"
},
{
"font_class"
:
"location-filled"
,
"unicode"
:
"
\
ue6af"
},
{
"font_class"
:
"locked"
,
"unicode"
:
"
\
ue66b"
},
{
"font_class"
:
"locked-filled"
,
"unicode"
:
"
\
ue668"
},
{
"font_class"
:
"loop"
,
"unicode"
:
"
\
ue633"
},
{
"font_class"
:
"mail-open"
,
"unicode"
:
"
\
ue643"
},
{
"font_class"
:
"mail-open-filled"
,
"unicode"
:
"
\
ue63a"
},
{
"font_class"
:
"map"
,
"unicode"
:
"
\
ue667"
},
{
"font_class"
:
"map-filled"
,
"unicode"
:
"
\
ue666"
},
{
"font_class"
:
"map-pin"
,
"unicode"
:
"
\
ue6ad"
},
{
"font_class"
:
"map-pin-ellipse"
,
"unicode"
:
"
\
ue6ac"
},
{
"font_class"
:
"medal"
,
"unicode"
:
"
\
ue6a2"
},
{
"font_class"
:
"medal-filled"
,
"unicode"
:
"
\
ue6c3"
},
{
"font_class"
:
"mic"
,
"unicode"
:
"
\
ue671"
},
{
"font_class"
:
"mic-filled"
,
"unicode"
:
"
\
ue677"
},
{
"font_class"
:
"micoff"
,
"unicode"
:
"
\
ue67e"
},
{
"font_class"
:
"micoff-filled"
,
"unicode"
:
"
\
ue6b0"
},
{
"font_class"
:
"minus"
,
"unicode"
:
"
\
ue66f"
},
{
"font_class"
:
"minus-filled"
,
"unicode"
:
"
\
ue67d"
},
{
"font_class"
:
"more"
,
"unicode"
:
"
\
ue64d"
},
{
"font_class"
:
"more-filled"
,
"unicode"
:
"
\
ue64e"
},
{
"font_class"
:
"navigate"
,
"unicode"
:
"
\
ue66e"
},
{
"font_class"
:
"navigate-filled"
,
"unicode"
:
"
\
ue67a"
},
{
"font_class"
:
"notification"
,
"unicode"
:
"
\
ue6a6"
},
{
"font_class"
:
"notification-filled"
,
"unicode"
:
"
\
ue6c1"
},
{
"font_class"
:
"paperclip"
,
"unicode"
:
"
\
ue652"
},
{
"font_class"
:
"paperplane"
,
"unicode"
:
"
\
ue672"
},
{
"font_class"
:
"paperplane-filled"
,
"unicode"
:
"
\
ue675"
},
{
"font_class"
:
"person"
,
"unicode"
:
"
\
ue699"
},
{
"font_class"
:
"person-filled"
,
"unicode"
:
"
\
ue69d"
},
{
"font_class"
:
"personadd"
,
"unicode"
:
"
\
ue69f"
},
{
"font_class"
:
"personadd-filled"
,
"unicode"
:
"
\
ue698"
},
{
"font_class"
:
"personadd-filled-copy"
,
"unicode"
:
"
\
ue6d1"
},
{
"font_class"
:
"phone"
,
"unicode"
:
"
\
ue69c"
},
{
"font_class"
:
"phone-filled"
,
"unicode"
:
"
\
ue69b"
},
{
"font_class"
:
"plus"
,
"unicode"
:
"
\
ue676"
},
{
"font_class"
:
"plus-filled"
,
"unicode"
:
"
\
ue6c7"
},
{
"font_class"
:
"plusempty"
,
"unicode"
:
"
\
ue67b"
},
{
"font_class"
:
"pulldown"
,
"unicode"
:
"
\
ue632"
},
{
"font_class"
:
"pyq"
,
"unicode"
:
"
\
ue682"
},
{
"font_class"
:
"qq"
,
"unicode"
:
"
\
ue680"
},
{
"font_class"
:
"redo"
,
"unicode"
:
"
\
ue64a"
},
{
"font_class"
:
"redo-filled"
,
"unicode"
:
"
\
ue655"
},
{
"font_class"
:
"refresh"
,
"unicode"
:
"
\
ue657"
},
{
"font_class"
:
"refresh-filled"
,
"unicode"
:
"
\
ue656"
},
{
"font_class"
:
"refreshempty"
,
"unicode"
:
"
\
ue6bf"
},
{
"font_class"
:
"reload"
,
"unicode"
:
"
\
ue6b2"
},
{
"font_class"
:
"right"
,
"unicode"
:
"
\
ue6b5"
},
{
"font_class"
:
"scan"
,
"unicode"
:
"
\
ue62a"
},
{
"font_class"
:
"search"
,
"unicode"
:
"
\
ue654"
},
{
"font_class"
:
"settings"
,
"unicode"
:
"
\
ue653"
},
{
"font_class"
:
"settings-filled"
,
"unicode"
:
"
\
ue6ce"
},
{
"font_class"
:
"shop"
,
"unicode"
:
"
\
ue62f"
},
{
"font_class"
:
"shop-filled"
,
"unicode"
:
"
\
ue6cd"
},
{
"font_class"
:
"smallcircle"
,
"unicode"
:
"
\
ue67c"
},
{
"font_class"
:
"smallcircle-filled"
,
"unicode"
:
"
\
ue665"
},
{
"font_class"
:
"sound"
,
"unicode"
:
"
\
ue684"
},
{
"font_class"
:
"sound-filled"
,
"unicode"
:
"
\
ue686"
},
{
"font_class"
:
"spinner-cycle"
,
"unicode"
:
"
\
ue68a"
},
{
"font_class"
:
"staff"
,
"unicode"
:
"
\
ue6a7"
},
{
"font_class"
:
"staff-filled"
,
"unicode"
:
"
\
ue6cb"
},
{
"font_class"
:
"star"
,
"unicode"
:
"
\
ue688"
},
{
"font_class"
:
"star-filled"
,
"unicode"
:
"
\
ue68f"
},
{
"font_class"
:
"starhalf"
,
"unicode"
:
"
\
ue683"
},
{
"font_class"
:
"trash"
,
"unicode"
:
"
\
ue687"
},
{
"font_class"
:
"trash-filled"
,
"unicode"
:
"
\
ue685"
},
{
"font_class"
:
"tune"
,
"unicode"
:
"
\
ue6aa"
},
{
"font_class"
:
"tune-filled"
,
"unicode"
:
"
\
ue6ca"
},
{
"font_class"
:
"undo"
,
"unicode"
:
"
\
ue64f"
},
{
"font_class"
:
"undo-filled"
,
"unicode"
:
"
\
ue64c"
},
{
"font_class"
:
"up"
,
"unicode"
:
"
\
ue6b6"
},
{
"font_class"
:
"top"
,
"unicode"
:
"
\
ue6b6"
},
{
"font_class"
:
"upload"
,
"unicode"
:
"
\
ue690"
},
{
"font_class"
:
"upload-filled"
,
"unicode"
:
"
\
ue68e"
},
{
"font_class"
:
"videocam"
,
"unicode"
:
"
\
ue68c"
},
{
"font_class"
:
"videocam-filled"
,
"unicode"
:
"
\
ue689"
},
{
"font_class"
:
"vip"
,
"unicode"
:
"
\
ue6a8"
},
{
"font_class"
:
"vip-filled"
,
"unicode"
:
"
\
ue6c6"
},
{
"font_class"
:
"wallet"
,
"unicode"
:
"
\
ue6b1"
},
{
"font_class"
:
"wallet-filled"
,
"unicode"
:
"
\
ue6c2"
},
{
"font_class"
:
"weibo"
,
"unicode"
:
"
\
ue68b"
},
{
"font_class"
:
"weixin"
,
"unicode"
:
"
\
ue691"
}
]
as
IconsDataItem
[]
// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)
uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js
0 → 100644
View file @
5f76ef21
export
const
fontData
=
[
{
"font_class"
:
"arrow-down"
,
"unicode"
:
"
\
ue6be"
},
{
"font_class"
:
"arrow-left"
,
"unicode"
:
"
\
ue6bc"
},
{
"font_class"
:
"arrow-right"
,
"unicode"
:
"
\
ue6bb"
},
{
"font_class"
:
"arrow-up"
,
"unicode"
:
"
\
ue6bd"
},
{
"font_class"
:
"auth"
,
"unicode"
:
"
\
ue6ab"
},
{
"font_class"
:
"auth-filled"
,
"unicode"
:
"
\
ue6cc"
},
{
"font_class"
:
"back"
,
"unicode"
:
"
\
ue6b9"
},
{
"font_class"
:
"bars"
,
"unicode"
:
"
\
ue627"
},
{
"font_class"
:
"calendar"
,
"unicode"
:
"
\
ue6a0"
},
{
"font_class"
:
"calendar-filled"
,
"unicode"
:
"
\
ue6c0"
},
{
"font_class"
:
"camera"
,
"unicode"
:
"
\
ue65a"
},
{
"font_class"
:
"camera-filled"
,
"unicode"
:
"
\
ue658"
},
{
"font_class"
:
"cart"
,
"unicode"
:
"
\
ue631"
},
{
"font_class"
:
"cart-filled"
,
"unicode"
:
"
\
ue6d0"
},
{
"font_class"
:
"chat"
,
"unicode"
:
"
\
ue65d"
},
{
"font_class"
:
"chat-filled"
,
"unicode"
:
"
\
ue659"
},
{
"font_class"
:
"chatboxes"
,
"unicode"
:
"
\
ue696"
},
{
"font_class"
:
"chatboxes-filled"
,
"unicode"
:
"
\
ue692"
},
{
"font_class"
:
"chatbubble"
,
"unicode"
:
"
\
ue697"
},
{
"font_class"
:
"chatbubble-filled"
,
"unicode"
:
"
\
ue694"
},
{
"font_class"
:
"checkbox"
,
"unicode"
:
"
\
ue62b"
},
{
"font_class"
:
"checkbox-filled"
,
"unicode"
:
"
\
ue62c"
},
{
"font_class"
:
"checkmarkempty"
,
"unicode"
:
"
\
ue65c"
},
{
"font_class"
:
"circle"
,
"unicode"
:
"
\
ue65b"
},
{
"font_class"
:
"circle-filled"
,
"unicode"
:
"
\
ue65e"
},
{
"font_class"
:
"clear"
,
"unicode"
:
"
\
ue66d"
},
{
"font_class"
:
"close"
,
"unicode"
:
"
\
ue673"
},
{
"font_class"
:
"closeempty"
,
"unicode"
:
"
\
ue66c"
},
{
"font_class"
:
"cloud-download"
,
"unicode"
:
"
\
ue647"
},
{
"font_class"
:
"cloud-download-filled"
,
"unicode"
:
"
\
ue646"
},
{
"font_class"
:
"cloud-upload"
,
"unicode"
:
"
\
ue645"
},
{
"font_class"
:
"cloud-upload-filled"
,
"unicode"
:
"
\
ue648"
},
{
"font_class"
:
"color"
,
"unicode"
:
"
\
ue6cf"
},
{
"font_class"
:
"color-filled"
,
"unicode"
:
"
\
ue6c9"
},
{
"font_class"
:
"compose"
,
"unicode"
:
"
\
ue67f"
},
{
"font_class"
:
"contact"
,
"unicode"
:
"
\
ue693"
},
{
"font_class"
:
"contact-filled"
,
"unicode"
:
"
\
ue695"
},
{
"font_class"
:
"down"
,
"unicode"
:
"
\
ue6b8"
},
{
"font_class"
:
"bottom"
,
"unicode"
:
"
\
ue6b8"
},
{
"font_class"
:
"download"
,
"unicode"
:
"
\
ue68d"
},
{
"font_class"
:
"download-filled"
,
"unicode"
:
"
\
ue681"
},
{
"font_class"
:
"email"
,
"unicode"
:
"
\
ue69e"
},
{
"font_class"
:
"email-filled"
,
"unicode"
:
"
\
ue69a"
},
{
"font_class"
:
"eye"
,
"unicode"
:
"
\
ue651"
},
{
"font_class"
:
"eye-filled"
,
"unicode"
:
"
\
ue66a"
},
{
"font_class"
:
"eye-slash"
,
"unicode"
:
"
\
ue6b3"
},
{
"font_class"
:
"eye-slash-filled"
,
"unicode"
:
"
\
ue6b4"
},
{
"font_class"
:
"fire"
,
"unicode"
:
"
\
ue6a1"
},
{
"font_class"
:
"fire-filled"
,
"unicode"
:
"
\
ue6c5"
},
{
"font_class"
:
"flag"
,
"unicode"
:
"
\
ue65f"
},
{
"font_class"
:
"flag-filled"
,
"unicode"
:
"
\
ue660"
},
{
"font_class"
:
"folder-add"
,
"unicode"
:
"
\
ue6a9"
},
{
"font_class"
:
"folder-add-filled"
,
"unicode"
:
"
\
ue6c8"
},
{
"font_class"
:
"font"
,
"unicode"
:
"
\
ue6a3"
},
{
"font_class"
:
"forward"
,
"unicode"
:
"
\
ue6ba"
},
{
"font_class"
:
"gear"
,
"unicode"
:
"
\
ue664"
},
{
"font_class"
:
"gear-filled"
,
"unicode"
:
"
\
ue661"
},
{
"font_class"
:
"gift"
,
"unicode"
:
"
\
ue6a4"
},
{
"font_class"
:
"gift-filled"
,
"unicode"
:
"
\
ue6c4"
},
{
"font_class"
:
"hand-down"
,
"unicode"
:
"
\
ue63d"
},
{
"font_class"
:
"hand-down-filled"
,
"unicode"
:
"
\
ue63c"
},
{
"font_class"
:
"hand-up"
,
"unicode"
:
"
\
ue63f"
},
{
"font_class"
:
"hand-up-filled"
,
"unicode"
:
"
\
ue63e"
},
{
"font_class"
:
"headphones"
,
"unicode"
:
"
\
ue630"
},
{
"font_class"
:
"heart"
,
"unicode"
:
"
\
ue639"
},
{
"font_class"
:
"heart-filled"
,
"unicode"
:
"
\
ue641"
},
{
"font_class"
:
"help"
,
"unicode"
:
"
\
ue679"
},
{
"font_class"
:
"help-filled"
,
"unicode"
:
"
\
ue674"
},
{
"font_class"
:
"home"
,
"unicode"
:
"
\
ue662"
},
{
"font_class"
:
"home-filled"
,
"unicode"
:
"
\
ue663"
},
{
"font_class"
:
"image"
,
"unicode"
:
"
\
ue670"
},
{
"font_class"
:
"image-filled"
,
"unicode"
:
"
\
ue678"
},
{
"font_class"
:
"images"
,
"unicode"
:
"
\
ue650"
},
{
"font_class"
:
"images-filled"
,
"unicode"
:
"
\
ue64b"
},
{
"font_class"
:
"info"
,
"unicode"
:
"
\
ue669"
},
{
"font_class"
:
"info-filled"
,
"unicode"
:
"
\
ue649"
},
{
"font_class"
:
"left"
,
"unicode"
:
"
\
ue6b7"
},
{
"font_class"
:
"link"
,
"unicode"
:
"
\
ue6a5"
},
{
"font_class"
:
"list"
,
"unicode"
:
"
\
ue644"
},
{
"font_class"
:
"location"
,
"unicode"
:
"
\
ue6ae"
},
{
"font_class"
:
"location-filled"
,
"unicode"
:
"
\
ue6af"
},
{
"font_class"
:
"locked"
,
"unicode"
:
"
\
ue66b"
},
{
"font_class"
:
"locked-filled"
,
"unicode"
:
"
\
ue668"
},
{
"font_class"
:
"loop"
,
"unicode"
:
"
\
ue633"
},
{
"font_class"
:
"mail-open"
,
"unicode"
:
"
\
ue643"
},
{
"font_class"
:
"mail-open-filled"
,
"unicode"
:
"
\
ue63a"
},
{
"font_class"
:
"map"
,
"unicode"
:
"
\
ue667"
},
{
"font_class"
:
"map-filled"
,
"unicode"
:
"
\
ue666"
},
{
"font_class"
:
"map-pin"
,
"unicode"
:
"
\
ue6ad"
},
{
"font_class"
:
"map-pin-ellipse"
,
"unicode"
:
"
\
ue6ac"
},
{
"font_class"
:
"medal"
,
"unicode"
:
"
\
ue6a2"
},
{
"font_class"
:
"medal-filled"
,
"unicode"
:
"
\
ue6c3"
},
{
"font_class"
:
"mic"
,
"unicode"
:
"
\
ue671"
},
{
"font_class"
:
"mic-filled"
,
"unicode"
:
"
\
ue677"
},
{
"font_class"
:
"micoff"
,
"unicode"
:
"
\
ue67e"
},
{
"font_class"
:
"micoff-filled"
,
"unicode"
:
"
\
ue6b0"
},
{
"font_class"
:
"minus"
,
"unicode"
:
"
\
ue66f"
},
{
"font_class"
:
"minus-filled"
,
"unicode"
:
"
\
ue67d"
},
{
"font_class"
:
"more"
,
"unicode"
:
"
\
ue64d"
},
{
"font_class"
:
"more-filled"
,
"unicode"
:
"
\
ue64e"
},
{
"font_class"
:
"navigate"
,
"unicode"
:
"
\
ue66e"
},
{
"font_class"
:
"navigate-filled"
,
"unicode"
:
"
\
ue67a"
},
{
"font_class"
:
"notification"
,
"unicode"
:
"
\
ue6a6"
},
{
"font_class"
:
"notification-filled"
,
"unicode"
:
"
\
ue6c1"
},
{
"font_class"
:
"paperclip"
,
"unicode"
:
"
\
ue652"
},
{
"font_class"
:
"paperplane"
,
"unicode"
:
"
\
ue672"
},
{
"font_class"
:
"paperplane-filled"
,
"unicode"
:
"
\
ue675"
},
{
"font_class"
:
"person"
,
"unicode"
:
"
\
ue699"
},
{
"font_class"
:
"person-filled"
,
"unicode"
:
"
\
ue69d"
},
{
"font_class"
:
"personadd"
,
"unicode"
:
"
\
ue69f"
},
{
"font_class"
:
"personadd-filled"
,
"unicode"
:
"
\
ue698"
},
{
"font_class"
:
"personadd-filled-copy"
,
"unicode"
:
"
\
ue6d1"
},
{
"font_class"
:
"phone"
,
"unicode"
:
"
\
ue69c"
},
{
"font_class"
:
"phone-filled"
,
"unicode"
:
"
\
ue69b"
},
{
"font_class"
:
"plus"
,
"unicode"
:
"
\
ue676"
},
{
"font_class"
:
"plus-filled"
,
"unicode"
:
"
\
ue6c7"
},
{
"font_class"
:
"plusempty"
,
"unicode"
:
"
\
ue67b"
},
{
"font_class"
:
"pulldown"
,
"unicode"
:
"
\
ue632"
},
{
"font_class"
:
"pyq"
,
"unicode"
:
"
\
ue682"
},
{
"font_class"
:
"qq"
,
"unicode"
:
"
\
ue680"
},
{
"font_class"
:
"redo"
,
"unicode"
:
"
\
ue64a"
},
{
"font_class"
:
"redo-filled"
,
"unicode"
:
"
\
ue655"
},
{
"font_class"
:
"refresh"
,
"unicode"
:
"
\
ue657"
},
{
"font_class"
:
"refresh-filled"
,
"unicode"
:
"
\
ue656"
},
{
"font_class"
:
"refreshempty"
,
"unicode"
:
"
\
ue6bf"
},
{
"font_class"
:
"reload"
,
"unicode"
:
"
\
ue6b2"
},
{
"font_class"
:
"right"
,
"unicode"
:
"
\
ue6b5"
},
{
"font_class"
:
"scan"
,
"unicode"
:
"
\
ue62a"
},
{
"font_class"
:
"search"
,
"unicode"
:
"
\
ue654"
},
{
"font_class"
:
"settings"
,
"unicode"
:
"
\
ue653"
},
{
"font_class"
:
"settings-filled"
,
"unicode"
:
"
\
ue6ce"
},
{
"font_class"
:
"shop"
,
"unicode"
:
"
\
ue62f"
},
{
"font_class"
:
"shop-filled"
,
"unicode"
:
"
\
ue6cd"
},
{
"font_class"
:
"smallcircle"
,
"unicode"
:
"
\
ue67c"
},
{
"font_class"
:
"smallcircle-filled"
,
"unicode"
:
"
\
ue665"
},
{
"font_class"
:
"sound"
,
"unicode"
:
"
\
ue684"
},
{
"font_class"
:
"sound-filled"
,
"unicode"
:
"
\
ue686"
},
{
"font_class"
:
"spinner-cycle"
,
"unicode"
:
"
\
ue68a"
},
{
"font_class"
:
"staff"
,
"unicode"
:
"
\
ue6a7"
},
{
"font_class"
:
"staff-filled"
,
"unicode"
:
"
\
ue6cb"
},
{
"font_class"
:
"star"
,
"unicode"
:
"
\
ue688"
},
{
"font_class"
:
"star-filled"
,
"unicode"
:
"
\
ue68f"
},
{
"font_class"
:
"starhalf"
,
"unicode"
:
"
\
ue683"
},
{
"font_class"
:
"trash"
,
"unicode"
:
"
\
ue687"
},
{
"font_class"
:
"trash-filled"
,
"unicode"
:
"
\
ue685"
},
{
"font_class"
:
"tune"
,
"unicode"
:
"
\
ue6aa"
},
{
"font_class"
:
"tune-filled"
,
"unicode"
:
"
\
ue6ca"
},
{
"font_class"
:
"undo"
,
"unicode"
:
"
\
ue64f"
},
{
"font_class"
:
"undo-filled"
,
"unicode"
:
"
\
ue64c"
},
{
"font_class"
:
"up"
,
"unicode"
:
"
\
ue6b6"
},
{
"font_class"
:
"top"
,
"unicode"
:
"
\
ue6b6"
},
{
"font_class"
:
"upload"
,
"unicode"
:
"
\
ue690"
},
{
"font_class"
:
"upload-filled"
,
"unicode"
:
"
\
ue68e"
},
{
"font_class"
:
"videocam"
,
"unicode"
:
"
\
ue68c"
},
{
"font_class"
:
"videocam-filled"
,
"unicode"
:
"
\
ue689"
},
{
"font_class"
:
"vip"
,
"unicode"
:
"
\
ue6a8"
},
{
"font_class"
:
"vip-filled"
,
"unicode"
:
"
\
ue6c6"
},
{
"font_class"
:
"wallet"
,
"unicode"
:
"
\
ue6b1"
},
{
"font_class"
:
"wallet-filled"
,
"unicode"
:
"
\
ue6c2"
},
{
"font_class"
:
"weibo"
,
"unicode"
:
"
\
ue68b"
},
{
"font_class"
:
"weixin"
,
"unicode"
:
"
\
ue691"
}
]
// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)
uni_modules/uni-icons/package.json
0 → 100644
View file @
5f76ef21
{
"id"
:
"uni-icons"
,
"displayName"
:
"uni-icons 图标"
,
"version"
:
"2.0.9"
,
"description"
:
"图标组件,用于展示移动端常见的图标,可自定义颜色、大小。"
,
"keywords"
:
[
"uni-ui"
,
"uniui"
,
"icon"
,
"图标"
],
"repository"
:
"https://github.com/dcloudio/uni-ui"
,
"engines"
:
{
"HBuilderX"
:
"^3.2.14"
},
"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"
],
"encrypt"
:
[],
"platforms"
:
{
"cloud"
:
{
"tcb"
:
"y"
,
"aliyun"
:
"y"
},
"client"
:
{
"App"
:
{
"app-vue"
:
"y"
,
"app-nvue"
:
"y"
,
"app-uvue"
:
"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"
,
"钉钉"
:
"y"
,
"快手"
:
"y"
,
"飞书"
:
"y"
,
"京东"
:
"y"
},
"快应用"
:
{
"华为"
:
"y"
,
"联盟"
:
"y"
},
"Vue"
:
{
"vue2"
:
"y"
,
"vue3"
:
"y"
}
}
}
}
}
uni_modules/uni-icons/readme.md
0 → 100644
View file @
5f76ef21
## Icons 图标
> **组件名:uni-icons**
> 代码块: `uIcons`
用于展示 icons 图标 。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
uni_modules/uni-scss/changelog.md
0 → 100644
View file @
5f76ef21
## 1.0.3(2022-01-21)
-
优化 组件示例
## 1.0.2(2021-11-22)
-
修复 / 符号在 vue 不同版本兼容问题引起的报错问题
## 1.0.1(2021-11-22)
-
修复 vue3中scss语法兼容问题
## 1.0.0(2021-11-18)
-
init
uni_modules/uni-scss/index.scss
0 → 100644
View file @
5f76ef21
@import
'./styles/index.scss'
;
uni_modules/uni-scss/package.json
0 → 100644
View file @
5f76ef21
{
"id"
:
"uni-scss"
,
"displayName"
:
"uni-scss 辅助样式"
,
"version"
:
"1.0.3"
,
"description"
:
"uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。"
,
"keywords"
:
[
"uni-scss"
,
"uni-ui"
,
"辅助样式"
],
"repository"
:
"https://github.com/dcloudio/uni-ui"
,
"engines"
:
{
"HBuilderX"
:
"^3.1.0"
},
"dcloudext"
:
{
"category"
:
[
"JS SDK"
,
"通用 SDK"
],
"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"
:
[],
"encrypt"
:
[],
"platforms"
:
{
"cloud"
:
{
"tcb"
:
"y"
,
"aliyun"
:
"y"
},
"client"
:
{
"App"
:
{
"app-vue"
:
"y"
,
"app-nvue"
:
"u"
},
"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"
},
"快应用"
:
{
"华为"
:
"n"
,
"联盟"
:
"n"
},
"Vue"
:
{
"vue2"
:
"y"
,
"vue3"
:
"y"
}
}
}
}
}
uni_modules/uni-scss/readme.md
0 → 100644
View file @
5f76ef21
`uni-sass`
是
`uni-ui`
提供的一套全局样式 ,通过一些简单的类名和
`sass`
变量,实现简单的页面布局操作,比如颜色、边距、圆角等。
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
\ No newline at end of file
uni_modules/uni-scss/styles/index.scss
0 → 100644
View file @
5f76ef21
@import
'./setting/_variables.scss'
;
@import
'./setting/_border.scss'
;
@import
'./setting/_color.scss'
;
@import
'./setting/_space.scss'
;
@import
'./setting/_radius.scss'
;
@import
'./setting/_text.scss'
;
@import
'./setting/_styles.scss'
;
uni_modules/uni-scss/styles/setting/_border.scss
0 → 100644
View file @
5f76ef21
.uni-border
{
border
:
1px
$uni-border-1
solid
;
}
\ No newline at end of file
uni_modules/uni-scss/styles/setting/_color.scss
0 → 100644
View file @
5f76ef21
// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐
// @mixin get-styles($k,$c) {
// @if $k == size or $k == weight{
// font-#{$k}:#{$c}
// }@else{
// #{$k}:#{$c}
// }
// }
$uni-ui-color
:(
//
主色
primary
:
$uni-primary
,
primary-disable
:
$uni-primary-disable
,
primary-light
:
$uni-primary-light
,
//
辅助色
success
:
$uni-success
,
success-disable
:
$uni-success-disable
,
success-light
:
$uni-success-light
,
warning
:
$uni-warning
,
warning-disable
:
$uni-warning-disable
,
warning-light
:
$uni-warning-light
,
error
:
$uni-error
,
error-disable
:
$uni-error-disable
,
error-light
:
$uni-error-light
,
info
:
$uni-info
,
info-disable
:
$uni-info-disable
,
info-light
:
$uni-info-light
,
//
中性色
main-color
:
$uni-main-color
,
base-color
:
$uni-base-color
,
secondary-color
:
$uni-secondary-color
,
extra-color
:
$uni-extra-color
,
//
背景色
bg-color
:
$uni-bg-color
,
//
边框颜色
border-1
:
$uni-border-1
,
border-2
:
$uni-border-2
,
border-3
:
$uni-border-3
,
border-4
:
$uni-border-4
,
//
黑色
black
:
$uni-black
,
//
白色
white
:
$uni-white
,
//
透明
transparent
:
$uni-transparent
)
!
default
;
@each
$key
,
$child
in
$uni-ui-color
{
.uni-
#{
""
+
$key
}
{
color
:
$child
;
}
.uni-
#{
""
+
$key
}
-bg
{
background-color
:
$child
;
}
}
.uni-shadow-sm
{
box-shadow
:
$uni-shadow-sm
;
}
.uni-shadow-base
{
box-shadow
:
$uni-shadow-base
;
}
.uni-shadow-lg
{
box-shadow
:
$uni-shadow-lg
;
}
.uni-mask
{
background-color
:
$uni-mask
;
}
uni_modules/uni-scss/styles/setting/_radius.scss
0 → 100644
View file @
5f76ef21
@mixin
radius
(
$r
,
$d
:
null
,
$important
:
false
){
$radius-value
:
map-get
(
$uni-radius
,
$r
)
if
(
$important
,
!
important
,
null
);
// Key exists within the $uni-radius variable
@if
(
map-has-key
(
$uni-radius
,
$r
)
and
$d
){
@if
$d
==
t
{
border-top-left-radius
:
$radius-value
;
border-top-right-radius
:
$radius-value
;
}
@else
if
$d
==
r
{
border-top-right-radius
:
$radius-value
;
border-bottom-right-radius
:
$radius-value
;
}
@else
if
$d
==
b
{
border-bottom-left-radius
:
$radius-value
;
border-bottom-right-radius
:
$radius-value
;
}
@else
if
$d
==
l
{
border-top-left-radius
:
$radius-value
;
border-bottom-left-radius
:
$radius-value
;
}
@else
if
$d
==
tl
{
border-top-left-radius
:
$radius-value
;
}
@else
if
$d
==
tr
{
border-top-right-radius
:
$radius-value
;
}
@else
if
$d
==
br
{
border-bottom-right-radius
:
$radius-value
;
}
@else
if
$d
==
bl
{
border-bottom-left-radius
:
$radius-value
;
}
}
@else
{
border-radius
:
$radius-value
;
}
}
@each
$key
,
$child
in
$uni-radius
{
@if
(
$key
){
.uni-radius-
#{
""
+
$key
}
{
@include
radius
(
$key
)
}
}
@else
{
.uni-radius
{
@include
radius
(
$key
)
}
}
}
@each
$direction
in
t
,
r
,
b
,
l
,
tl
,
tr
,
br
,
bl
{
@each
$key
,
$child
in
$uni-radius
{
@if
(
$key
){
.uni-radius-
#{
""
+
$direction
}
-
#{
""
+
$key
}
{
@include
radius
(
$key
,
$direction
,
false
)
}
}
@else
{
.uni-radius-
#{
$direction
}
{
@include
radius
(
$key
,
$direction
,
false
)
}
}
}
}
uni_modules/uni-scss/styles/setting/_space.scss
0 → 100644
View file @
5f76ef21
@mixin
fn
(
$space
,
$direction
,
$size
,
$n
)
{
@if
$n
{
#{
$space
}
-
#{
$direction
}
:
#{
$size
*
$uni-space-root
}
px
}
@else
{
#{
$space
}
-
#{
$direction
}
:
#{
-
$size
*
$uni-space-root
}
px
}
}
@mixin
get-styles
(
$direction
,
$i
,
$space
,
$n
){
@if
$direction
==
t
{
@include
fn
(
$space
,
top
,
$i
,
$n
);
}
@if
$direction
==
r
{
@include
fn
(
$space
,
right
,
$i
,
$n
);
}
@if
$direction
==
b
{
@include
fn
(
$space
,
bottom
,
$i
,
$n
);
}
@if
$direction
==
l
{
@include
fn
(
$space
,
left
,
$i
,
$n
);
}
@if
$direction
==
x
{
@include
fn
(
$space
,
left
,
$i
,
$n
);
@include
fn
(
$space
,
right
,
$i
,
$n
);
}
@if
$direction
==
y
{
@include
fn
(
$space
,
top
,
$i
,
$n
);
@include
fn
(
$space
,
bottom
,
$i
,
$n
);
}
@if
$direction
==
a
{
@if
$n
{
#{
$space
}
:
#{
$i
*
$uni-space-root
}
px
;
}
@else
{
#{
$space
}
:
#{
-
$i
*
$uni-space-root
}
px
;
}
}
}
@each
$orientation
in
m
,
p
{
$space
:
margin
;
@if
$orientation
==
m
{
$space
:
margin
;
}
@else
{
$space
:
padding
;
}
@for
$i
from
0
through
16
{
@each
$direction
in
t
,
r
,
b
,
l
,
x
,
y
,
a
{
.uni-
#{
$orientation
}#{
$direction
}
-
#{
$i
}
{
@include
get-styles
(
$direction
,
$i
,
$space
,
true
);
}
.uni-
#{
$orientation
}#{
$direction
}
-n
#{
$i
}
{
@include
get-styles
(
$direction
,
$i
,
$space
,
false
);
}
}
}
}
\ No newline at end of file
uni_modules/uni-scss/styles/setting/_styles.scss
0 → 100644
View file @
5f76ef21
/* #ifndef APP-NVUE */
$-color-white
:
#fff
;
$-color-black
:
#000
;
@mixin
base-style
(
$color
)
{
color
:
#fff
;
background-color
:
$color
;
border-color
:
mix
(
$-color-black
,
$color
,
8%
);
&
:not
([
hover-class
])
:active
{
background
:
mix
(
$-color-black
,
$color
,
10%
);
border-color
:
mix
(
$-color-black
,
$color
,
20%
);
color
:
$-color-white
;
outline
:
none
;
}
}
@mixin
is-color
(
$color
)
{
@include
base-style
(
$color
);
&
[
loading
]
{
@include
base-style
(
$color
);
&
:
:
before
{
margin-right
:
5px
;
}
}
&
[
disabled
]
{
&
,
&
[
loading
],
&
:not
([
hover-class
])
:active
{
color
:
$-color-white
;
border-color
:
mix
(
darken
(
$color
,
10%
)
,
$-color-white
);
background-color
:
mix
(
$color
,
$-color-white
);
}
}
}
@mixin
base-plain-style
(
$color
)
{
color
:
$color
;
background-color
:
mix
(
$-color-white
,
$color
,
90%
);
border-color
:
mix
(
$-color-white
,
$color
,
70%
);
&
:not
([
hover-class
])
:active
{
background
:
mix
(
$-color-white
,
$color
,
80%
);
color
:
$color
;
outline
:
none
;
border-color
:
mix
(
$-color-white
,
$color
,
50%
);
}
}
@mixin
is-plain
(
$color
){
&
[
plain
]
{
@include
base-plain-style
(
$color
);
&
[
loading
]
{
@include
base-plain-style
(
$color
);
&
:
:
before
{
margin-right
:
5px
;
}
}
&
[
disabled
]
{
&
,
&
:active
{
color
:
mix
(
$-color-white
,
$color
,
40%
);
background-color
:
mix
(
$-color-white
,
$color
,
90%
);
border-color
:
mix
(
$-color-white
,
$color
,
80%
);
}
}
}
}
.uni-btn
{
margin
:
5px
;
color
:
#393939
;
border
:
1px
solid
#ccc
;
font-size
:
16px
;
font-weight
:
200
;
background-color
:
#F9F9F9
;
// TODO 暂时处理边框隐藏一边的问题
overflow
:
visible
;
&
:
:
after
{
border
:
none
;
}
&
:not
([
type
]),
&
[
type
=
default
]
{
color
:
#999
;
&
[
loading
]
{
background
:
none
;
&
:
:
before
{
margin-right
:
5px
;
}
}
&
[
disabled
]
{
color
:
mix
(
$-color-white
,
#999
,
60%
);
&
,
&
[
loading
],
&
:active
{
color
:
mix
(
$-color-white
,
#999
,
60%
);
background-color
:
mix
(
$-color-white
,
$-color-black
,
98%
);
border-color
:
mix
(
$-color-white
,
#999
,
85%
);
}
}
&
[
plain
]
{
color
:
#999
;
background
:
none
;
border-color
:
$uni-border-1
;
&
:not
([
hover-class
])
:active
{
background
:
none
;
color
:
mix
(
$-color-white
,
$-color-black
,
80%
);
border-color
:
mix
(
$-color-white
,
$-color-black
,
90%
);
outline
:
none
;
}
&
[
disabled
]
{
&
,
&
[
loading
],
&
:active
{
background
:
none
;
color
:
mix
(
$-color-white
,
#999
,
60%
);
border-color
:
mix
(
$-color-white
,
#999
,
85%
);
}
}
}
}
&
:not
([
hover-class
])
:active
{
color
:
mix
(
$-color-white
,
$-color-black
,
50%
);
}
&
[
size
=
mini
]
{
font-size
:
16px
;
font-weight
:
200
;
border-radius
:
8px
;
}
&
.uni-btn-small
{
font-size
:
14px
;
}
&
.uni-btn-mini
{
font-size
:
12px
;
}
&
.uni-btn-radius
{
border-radius
:
999px
;
}
&
[
type
=
primary
]
{
@include
is-color
(
$uni-primary
);
@include
is-plain
(
$uni-primary
)
}
&
[
type
=
success
]
{
@include
is-color
(
$uni-success
);
@include
is-plain
(
$uni-success
)
}
&
[
type
=
error
]
{
@include
is-color
(
$uni-error
);
@include
is-plain
(
$uni-error
)
}
&
[
type
=
warning
]
{
@include
is-color
(
$uni-warning
);
@include
is-plain
(
$uni-warning
)
}
&
[
type
=
info
]
{
@include
is-color
(
$uni-info
);
@include
is-plain
(
$uni-info
)
}
}
/* #endif */
uni_modules/uni-scss/styles/setting/_text.scss
0 → 100644
View file @
5f76ef21
@mixin
get-styles
(
$k
,
$c
)
{
@if
$k
==
size
or
$k
==
weight
{
font-
#{
$k
}
:
#{
$c
}
}
@else
{
#{
$k
}
:
#{
$c
}
}
}
@each
$key
,
$child
in
$uni-headings
{
/* #ifndef APP-NVUE */
.uni-
#{
$key
}
{
@each
$k
,
$c
in
$child
{
@include
get-styles
(
$k
,
$c
)
}
}
/* #endif */
/* #ifdef APP-NVUE */
.container
.uni-
#{
$key
}
{
@each
$k
,
$c
in
$child
{
@include
get-styles
(
$k
,
$c
)
}
}
/* #endif */
}
uni_modules/uni-scss/styles/setting/_variables.scss
0 → 100644
View file @
5f76ef21
// @use "sass:math";
@import
'../tools/functions.scss'
;
// 间距基础倍数
$uni-space-root
:
2
!
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
);
// 字体家族
$body-font-family
:
'Roboto'
,
sans-serif
!
default
;
// 文本
$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
)
,
'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
)
)
,
$uni-headings
);
// 主色
$uni-primary
:
#2979ff
!
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-warning
:
#f3a73f
!
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-info
:
#8f939c
!
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-border-1
:
#F0F0F0
!
default
;
$uni-border-2
:
#EDEDED
!
default
;
$uni-border-3
:
#DCDCDC
!
default
;
$uni-border-4
:
#B9B9B9
!
default
;
// 常规色
$uni-black
:
#000000
!
default
;
$uni-white
:
#ffffff
!
default
;
$uni-transparent
:
rgba
(
$color
:
#000000
,
$alpha
:
0
)
!
default
;
// 背景色
$uni-bg-color
:
#f7f7f7
!
default
;
/* 水平间距 */
$uni-spacing-sm
:
8px
!
default
;
$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-mask
:
rgba
(
$color
:
#000000
,
$alpha
:
0
.4
)
!
default
;
uni_modules/uni-scss/styles/tools/functions.scss
0 → 100644
View file @
5f76ef21
// 合并 map
@function
map-deep-merge
(
$parent-map
,
$child-map
){
$result
:
$parent-map
;
@each
$key
,
$child
in
$child-map
{
$parent-has-key
:
map-has-key
(
$result
,
$key
);
$parent-value
:
map-get
(
$result
,
$key
);
$parent-type
:
type-of
(
$parent-value
);
$child-type
:
type-of
(
$child
);
$parent-is-map
:
$parent-type
==
map
;
$child-is-map
:
$child-type
==
map
;
@if
(
not
$parent-has-key
)
or
(
$parent-type
!=
$child-type
)
or
(
not
(
$parent-is-map
and
$child-is-map
)){
$result
:
map-merge
(
$result
,
(
$key
:
$child
));
}
@else
{
$result
:
map-merge
(
$result
,
(
$key
:
map-deep-merge
(
$parent-value
,
$child
)
));
}
}
@return
$result
;
};
uni_modules/uni-scss/theme.scss
0 → 100644
View file @
5f76ef21
// 间距基础倍数
$uni-space-root
:
2
;
// 边框半径默认值
$uni-radius-root
:
5px
;
// 主色
$uni-primary
:
#2979ff
;
// 辅助色
$uni-success
:
#4cd964
;
// 警告色
$uni-warning
:
#f0ad4e
;
// 错误色
$uni-error
:
#dd524d
;
// 描述色
$uni-info
:
#909399
;
// 中性色
$uni-main-color
:
#303133
;
$uni-base-color
:
#606266
;
$uni-secondary-color
:
#909399
;
$uni-extra-color
:
#C0C4CC
;
// 背景色
$uni-bg-color
:
#f5f5f5
;
// 边框颜色
$uni-border-1
:
#DCDFE6
;
$uni-border-2
:
#E4E7ED
;
$uni-border-3
:
#EBEEF5
;
$uni-border-4
:
#F2F6FC
;
// 常规色
$uni-black
:
#000000
;
$uni-white
:
#ffffff
;
$uni-transparent
:
rgba
(
$color
:
#000000
,
$alpha
:
0
);
uni_modules/uni-scss/variables.scss
0 → 100644
View file @
5f76ef21
@import
'./styles/setting/_variables.scss'
;
// 间距基础倍数
$uni-space-root
:
2
;
// 边框半径默认值
$uni-radius-root
:
5px
;
// 主色
$uni-primary
:
#2979ff
;
$uni-primary-disable
:
mix
(
#fff
,
$uni-primary
,
50%
);
$uni-primary-light
:
mix
(
#fff
,
$uni-primary
,
80%
);
// 辅助色
// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。
$uni-success
:
#18bc37
;
$uni-success-disable
:
mix
(
#fff
,
$uni-success
,
50%
);
$uni-success-light
:
mix
(
#fff
,
$uni-success
,
80%
);
$uni-warning
:
#f3a73f
;
$uni-warning-disable
:
mix
(
#fff
,
$uni-warning
,
50%
);
$uni-warning-light
:
mix
(
#fff
,
$uni-warning
,
80%
);
$uni-error
:
#e43d33
;
$uni-error-disable
:
mix
(
#fff
,
$uni-error
,
50%
);
$uni-error-light
:
mix
(
#fff
,
$uni-error
,
80%
);
$uni-info
:
#8f939c
;
$uni-info-disable
:
mix
(
#fff
,
$uni-info
,
50%
);
$uni-info-light
:
mix
(
#fff
,
$uni-info
,
80%
);
// 中性色
// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。
$uni-main-color
:
#3a3a3a
;
// 主要文字
$uni-base-color
:
#6a6a6a
;
// 常规文字
$uni-secondary-color
:
#909399
;
// 次要文字
$uni-extra-color
:
#c7c7c7
;
// 辅助说明
// 边框颜色
$uni-border-1
:
#F0F0F0
;
$uni-border-2
:
#EDEDED
;
$uni-border-3
:
#DCDCDC
;
$uni-border-4
:
#B9B9B9
;
// 常规色
$uni-black
:
#000000
;
$uni-white
:
#ffffff
;
$uni-transparent
:
rgba
(
$color
:
#000000
,
$alpha
:
0
);
// 背景色
$uni-bg-color
:
#f7f7f7
;
/* 水平间距 */
$uni-spacing-sm
:
8px
;
$uni-spacing-base
:
15px
;
$uni-spacing-lg
:
30px
;
// 阴影
$uni-shadow-sm
:
0
0
5px
rgba
(
$color
:
#d8d8d8
,
$alpha
:
0
.5
);
$uni-shadow-base
:
0
1px
8px
1px
rgba
(
$color
:
#a5a5a5
,
$alpha
:
0
.2
);
$uni-shadow-lg
:
0px
1px
10px
2px
rgba
(
$color
:
#a5a4a4
,
$alpha
:
0
.5
);
// 蒙版
$uni-mask
:
rgba
(
$color
:
#000000
,
$alpha
:
0
.4
);
uni_modules/uni-table/changelog.md
0 → 100644
View file @
5f76ef21
## 1.2.4(2023-12-19)
-
修复 uni-tr只有一列时minWidth计算错误,列变化实时计算更新
## 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目录规范
uni_modules/uni-table/components/uni-table/uni-table.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-table/components/uni-tbody/uni-tbody.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-table/components/uni-td/uni-td.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-table/components/uni-th/filter-dropdown.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-table/components/uni-th/uni-th.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-table/components/uni-thead/uni-thead.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-table/components/uni-tr/table-checkbox.vue
0 → 100644
View file @
5f76ef21
<
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
>
uni_modules/uni-table/components/uni-tr/uni-tr.vue
0 → 100644
View file @
5f76ef21
<
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
=
Number
(
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
)
if
(
this
.
widthThArr
.
length
>
0
)
{
const
selectionWidth
=
this
.
selection
===
'selection'
?
50
:
0
;
this
.
root
.
minWidth
=
Number
(
this
.
widthThArr
.
reduce
((
a
,
b
)
=>
Number
(
a
)
+
Number
(
b
)))
+
selectionWidth
;
}
},
// 选中
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
>
uni_modules/uni-table/i18n/en.json
0 → 100644
View file @
5f76ef21
{
"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"
}
uni_modules/uni-table/i18n/es.json
0 → 100644
View file @
5f76ef21
{
"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"
}
uni_modules/uni-table/i18n/fr.json
0 → 100644
View file @
5f76ef21
{
"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"
}
uni_modules/uni-table/i18n/index.js
0 → 100644
View file @
5f76ef21
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
}
uni_modules/uni-table/i18n/zh-Hans.json
0 → 100644
View file @
5f76ef21
{
"filter-dropdown.reset"
:
"重置"
,
"filter-dropdown.search"
:
"搜索"
,
"filter-dropdown.submit"
:
"确定"
,
"filter-dropdown.filter"
:
"筛选"
,
"filter-dropdown.gt"
:
"大于等于"
,
"filter-dropdown.lt"
:
"小于等于"
,
"filter-dropdown.date"
:
"日期范围"
}
uni_modules/uni-table/i18n/zh-Hant.json
0 → 100644
View file @
5f76ef21
{
"filter-dropdown.reset"
:
"重置"
,
"filter-dropdown.search"
:
"搜索"
,
"filter-dropdown.submit"
:
"確定"
,
"filter-dropdown.filter"
:
"篩選"
,
"filter-dropdown.gt"
:
"大於等於"
,
"filter-dropdown.lt"
:
"小於等於"
,
"filter-dropdown.date"
:
"日期範圍"
}
uni_modules/uni-table/package.json
0 → 100644
View file @
5f76ef21
{
"id"
:
"uni-table"
,
"displayName"
:
"uni-table 表格"
,
"version"
:
"1.2.4"
,
"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
uni_modules/uni-table/readme.md
0 → 100644
View file @
5f76ef21
## Table 表单
> 组件名:``uni-table``,代码块: `uTable`。
用于展示多条结构类似的数据
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-table)
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment