1647 lines
45 KiB
Vue
1647 lines
45 KiB
Vue
<template>
|
||
<view class="m-input-row" :class="{'after':after,'before':before}" :style="rowStyle">
|
||
<text v-if="title" class="m-title" :class="{'separate':separate}" :style="labelStyle">{{title}}</text>
|
||
<view class="m-input-view" :style="inputStyle">
|
||
<!-- hint 只读标签 -->
|
||
<template v-if="type==='hint'">
|
||
<scroll-view :style="{'width':showButton?'90%':'100%'}" class="scroll-view_H" scroll-x="true">
|
||
<view style="display: flex;">
|
||
<uni-icons v-if="hintIcons" :color="iconColor" :type="inputIcon"/>
|
||
<text class="m-input" :style="{'justify-content': tempalignment}">{{value.length<=0?placeholder:value}}</text>
|
||
</view>
|
||
</scroll-view>
|
||
</template>
|
||
<!-- numberbox 数字box -->
|
||
<template v-else-if="type==='numberbox'">
|
||
<view class="uni-numbox">
|
||
<view @click="calcValue('minus')" class="uni-numbox__minus">
|
||
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': value <= min || disabled }">-</text>
|
||
</view>
|
||
<input class="uni-numbox__value"
|
||
:disabled="disabled" :focus="focus"
|
||
type="number"
|
||
:value="value"
|
||
:placeholder="placeholder"
|
||
@input="onInput"
|
||
@confirm="onConfirm"
|
||
@blur="onBlurNumberbox"></input>
|
||
<view @click="calcValue('plus')" class="uni-numbox__plus">
|
||
<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': value >= max || disabled }">+</text>
|
||
</view>
|
||
</view>
|
||
<!-- 清空内容图标 -->
|
||
<uni-icons v-if="clearable&&value.length>0" type="clear" :color="iconColor" @click="clear" size="22"></uni-icons>
|
||
</template>
|
||
<!-- checkbox 复选框 -->
|
||
<template v-else-if="type==='checkbox'">
|
||
<checkbox-group @change="checkboxChange">
|
||
<view class="radio-checkbox-content"
|
||
v-for="(item, index) in temprange" :key="item[rangeKey]" :style="radioOrCheckboxStyle">
|
||
<checkbox :value="item[rangeKey]" :checked="item.checked"/>
|
||
<uni-notice-bar class="radio-checkbox-content-notice" :speed="30"
|
||
:scrollable="item[rangeVal].length>(8/columns)"
|
||
:single="true"
|
||
:text="item[rangeVal]"
|
||
@click="onNoticeClick('checkbox',index)"/>
|
||
</view>
|
||
</checkbox-group>
|
||
</template>
|
||
<!-- radio 单选框 -->
|
||
<template v-else-if="type==='radio'">
|
||
<radio-group @change="radioChange">
|
||
<view class="radio-checkbox-content" style="display: flex;"
|
||
v-for="(item, index) in temprange" :key="item[rangeKey]" :style="radioOrCheckboxStyle">
|
||
<radio :value="item[rangeKey]" :checked="item.checked"/>
|
||
<uni-notice-bar class="radio-checkbox-content-notice"
|
||
:speed="30"
|
||
:scrollable="item[rangeVal].length>(8/columns)"
|
||
:single="true"
|
||
:text="item[rangeVal]"
|
||
@click="onNoticeClick('radio',index)"/>
|
||
</view>
|
||
</radio-group>
|
||
</template>
|
||
<!-- switch 开关 -->
|
||
<template v-else-if="type==='switch'">
|
||
<switch :checked="switchResult" type="switch" @change="switchChange" />
|
||
<text style="font-size: 16px;" :style="{'color':switchResult?'#007aff':'#636363' }">
|
||
{{setSwitchResult}}
|
||
</text>
|
||
</template>
|
||
<!-- combox 下拉框 -->
|
||
<template v-else-if="type==='combox'">
|
||
<view class="uni-combox__input-box">
|
||
<uni-icons v-if="verify && comboxValue['index']<0 && comboxValue['val'] && comboxValue['val'].length>0" color="#ff0000" type="clear" size="5"></uni-icons>
|
||
<uni-icons v-if="verify && comboxValue['index']>=0" color="#00ff00" type="checkbox" size="5"></uni-icons>
|
||
<text v-if="showValueKey">{{comboxValue['key']+(comboxValue['key']?':':'')}}</text>
|
||
<input class="uni-combox__input" :focus="focus" type="text"
|
||
:value="comboxValue['val']||''"
|
||
:placeholder="placeholder"
|
||
@input="onInputCombox"
|
||
@focus="onFocusCombox"
|
||
@blur="onBlurCombox"
|
||
@confirm="onConfirmCombox" />
|
||
<uni-icons v-if="clearable && (comboxValue['val'] && comboxValue['val'].length>0)" :color="iconColor" type="clear" @click="clearCombox" size="22"></uni-icons>
|
||
<uni-icons v-if="!clearable || !comboxValue['val'] || comboxValue['val'].length <= 0" :color="iconColor" class="uni-combox__input-arrow" type="arrowdown" size="22" @click="toggleSelector"></uni-icons>
|
||
<view v-if="showSelector"
|
||
class="uni-combox__selector" :style="{'background-color':selectorColor}" >
|
||
<scroll-view scroll-y="true" scroll-x="true" class="uni-combox__selector-scroll">
|
||
<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0">
|
||
<text>{{ emptyTips }}</text>
|
||
</view>
|
||
<view class="uni-combox__selector-item" :style="{'text-align':showSelectorAlign}"
|
||
v-for="(item, index) in filterCandidates"
|
||
:key="index" v-if="item[rangeKey] && item[rangeVal]" @click="onSelectorClick(index)">
|
||
<text>{{
|
||
(showSelectorKey?(item[rangeKey]) :"")+
|
||
(showSelectorVal?(showSelectorKey?":":"")+item[rangeVal]:"")
|
||
}}</text>
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
<!-- slot 自定义卡槽容器 -->
|
||
<template v-else-if="type==='slot'">
|
||
<scroll-view :style="{'width':showButton?'90%':'100%'}" class="scroll-view_H" scroll-x="true">
|
||
<view style="display: flex;">
|
||
<slot name="slot"></slot>
|
||
</view>
|
||
</scroll-view>
|
||
</template>
|
||
<!-- date 时间 -->
|
||
<template v-else-if="type==='date'">
|
||
<!-- 日期 -->
|
||
<picker v-if="isDate" :style="{'width':isTime?'50%':'100%'}" mode="date" :value="defaultDate" fields="day" :start="startDate" :end="endDate" @change="bindDateChange">
|
||
<view class="m-input" style="padding-right:10px;">{{defaultDate}}</view>
|
||
</picker>
|
||
<!-- 时间 -->
|
||
<picker v-if="isTime" :style="{'width':isDate?'50%':'100%'}" mode="time" :value="defaultTime" :start="start" :end="end" @change="bindTimeChange">
|
||
<view class="m-input">{{defaultTime}}</view>
|
||
</picker>
|
||
<!-- 清空内容图标 -->
|
||
<uni-icons v-if="clearable&&(value.length>0||defaultDateTime)" type="clear" :color="iconColor" @click="clear" size="22"></uni-icons>
|
||
</template>
|
||
<!-- text password number 默认为input输入框 -->
|
||
<template v-else>
|
||
<input v-if="type!=='textarea'" class="m-input"
|
||
:maxlength=-1
|
||
:focus="focus"
|
||
:type="inputType"
|
||
:value="value"
|
||
@input="onInput"
|
||
@confirm="onConfirm"
|
||
@focus="onFocusInput"
|
||
@blur="onBlurInput"
|
||
:placeholder="placeholder"
|
||
:password="type==='password'&&!showPassword"></input>
|
||
|
||
<textarea v-else :style="{'height':rowHeight}"
|
||
class="m-input"
|
||
:maxlength=-1
|
||
:focus="focus"
|
||
:value="value"
|
||
@input="onInput"
|
||
@confirm="onConfirm"
|
||
@focus="onFocusInput"
|
||
@blur="onBlurInput"
|
||
:placeholder="placeholder"></textarea>
|
||
|
||
<!-- 清空内容图标 -->
|
||
<uni-icons v-if="clearable&&!displayable&&value.length>0" type="clear" :color="iconColor" @click="clear" size="22"></uni-icons>
|
||
<!-- 密码小眼睛图标 -->
|
||
<uni-icons v-if="displayable" :style="{color:showPassword?'#666666':'#cccccc'}" type="eye" @click="display" size="22"></uni-icons>
|
||
<!-- 扫描图标 -->
|
||
<uni-icons v-if="canScan&&(!clearable|| value.length<=0)" type="scan" :color="iconColor" size="22" @click="scan"/>
|
||
</template>
|
||
<!-- 输入框按钮 -->
|
||
<uni-icons v-if="showButton && buttonVal.length<=0" :color="iconColor" :type="buttonIcon" size="22" @click="buttonClick"></uni-icons>
|
||
<button v-if="showButton && buttonVal.length>0" class="rightButton" :type="buttonType" size="mini" :style="buttonStyle" @click="buttonClick">
|
||
{{buttonVal}}
|
||
</button>
|
||
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
// import permision from "@/common/permission.js"
|
||
export default {
|
||
props: {
|
||
// 标签
|
||
title: String,
|
||
// row高度
|
||
rowHeight:{
|
||
type: String,
|
||
default: '30px'
|
||
},
|
||
// 标签内容宽度
|
||
labelWidth: {
|
||
type: String,
|
||
default: 'auto'
|
||
},
|
||
// 输入框类型
|
||
type: {
|
||
type: String,
|
||
default: 'text'
|
||
},
|
||
// 输入框值
|
||
value: {
|
||
type:[Date, Object, Number, String, Boolean, Array],
|
||
default() {
|
||
return '';
|
||
}
|
||
},
|
||
// 是否必填
|
||
mandatory:{
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 默认必填背景颜色
|
||
mandatoryColor:{
|
||
type: String,
|
||
default: '#FFFFCC'
|
||
},
|
||
// 默认正常背景颜色
|
||
defaultColor:{
|
||
type: String,
|
||
default: '#ffffff'//#fffae8
|
||
},
|
||
// 默认只读背景颜色
|
||
readonlyColor:{
|
||
type: String,
|
||
default: '#f1f1f1'
|
||
},
|
||
// 默认图标颜色
|
||
iconColor:{
|
||
type: String,
|
||
default: '#666666'
|
||
},
|
||
// 输入框占位符提示信息
|
||
placeholder: String,
|
||
// 输入框占位符提示信息、只读字体颜色
|
||
placeholderColor:{
|
||
type: String,
|
||
default: '#8383a2'
|
||
},
|
||
// 容器顶部边框
|
||
before: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 容器底部边框
|
||
after: {
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
//标题和内容之间的分割线
|
||
separate:{
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
//输入内容框边框
|
||
inputBorder:{
|
||
type: Boolean,
|
||
default: true
|
||
},
|
||
//输入内容框边框颜色
|
||
inputBorderColor:{
|
||
type: String,
|
||
default:"#c5c5e1"
|
||
},
|
||
// 自动获取焦点
|
||
focus: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 输入框是否显示清除按钮
|
||
clearable: {
|
||
type: [Boolean, String],
|
||
default: true
|
||
},
|
||
// 是否显示密码可见按钮
|
||
displayable: {
|
||
type: [Boolean, String],
|
||
default: false
|
||
},
|
||
// 是否显示扫描按钮
|
||
canScan:{
|
||
type: [Boolean, String],
|
||
default: false
|
||
},
|
||
// 是否显示只读标签图标
|
||
hintIcons:{
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 是否显示按钮
|
||
showButton:{
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 输入框提示图标类型
|
||
inputIcon:{
|
||
type: String,
|
||
default: 'info'
|
||
},
|
||
// 按钮图标类型
|
||
buttonIcon:{
|
||
type: String,
|
||
default: 'checkmarkempty'
|
||
},
|
||
//按钮类型
|
||
buttonType:{
|
||
type: String,
|
||
default: 'primary'//primary、warn、default
|
||
},
|
||
//按钮宽度
|
||
buttonWidth:{
|
||
type: String,
|
||
default: ''
|
||
},
|
||
//按钮背景颜色
|
||
buttonColor:{
|
||
type: String,
|
||
default: '#f8f8f8'
|
||
},
|
||
//按钮字体颜色
|
||
buttonlabColor:{
|
||
type: String,
|
||
default: '#000000'
|
||
},
|
||
// 右侧按钮响应事件,false-执行自定义按钮点击事件 true-执行输入框提交事件
|
||
btConfirm:{
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
// 按钮内容
|
||
buttonVal:{
|
||
type: String,
|
||
default: ''
|
||
},
|
||
// 数字输入框最小值
|
||
min: {
|
||
type: Number,
|
||
default: 0
|
||
},
|
||
// 数字输入框最大值
|
||
max: {
|
||
type: Number,
|
||
default: 100
|
||
},
|
||
// 数字输入框步长间隔大小
|
||
step: {
|
||
type: Number,
|
||
default: 1
|
||
},
|
||
//数字输入框按钮是否为禁用状态
|
||
disabled: {
|
||
type: Boolean,
|
||
default: false
|
||
},
|
||
//开关、复选框、单选框、下拉框数据源(父控件的值)
|
||
range:{
|
||
type: [Array, Boolean, Object],
|
||
default() {
|
||
return [];
|
||
}
|
||
},
|
||
//开关、复选框、单选框、下拉框数据源对应的key字段名称
|
||
rangeKey:{
|
||
type: String,
|
||
default:'value'
|
||
},
|
||
//开关、复选框、单选框、下拉框数据源对应的value字段名称
|
||
rangeVal:{
|
||
type: String,
|
||
default:'name'
|
||
},
|
||
//开关、复选框、单选框、下拉框数据源对应默认选择项index
|
||
rangeSelect:{
|
||
type: Number,
|
||
default:-1
|
||
},
|
||
//复选框和单选框展示的列数
|
||
columns:{
|
||
type: Number,
|
||
default:2
|
||
},
|
||
//switch开关是否选中
|
||
checked:{
|
||
type: Boolean,
|
||
default:false
|
||
},
|
||
//下拉框筛选结果为空时显示的文字
|
||
emptyTips:{
|
||
type: String,
|
||
default: '无匹配项'
|
||
},
|
||
// 是否验证下拉框输入内容是否存在
|
||
verify:{
|
||
type: Boolean,
|
||
default:true
|
||
},
|
||
//下拉框输入内容是否自动补全(过滤的时候默认选择第一个选项)
|
||
automatic:{
|
||
type: Boolean,
|
||
default:true
|
||
},
|
||
//下拉框选择器是否显示key内容
|
||
showSelectorKey:{
|
||
type: Boolean,
|
||
default:false
|
||
},
|
||
//下拉框选择器是否显示valur内容
|
||
showSelectorVal:{
|
||
type: Boolean,
|
||
default:true
|
||
},
|
||
//下拉框输入值是否显示key内容
|
||
showValueKey:{
|
||
type: Boolean,
|
||
default:false
|
||
},
|
||
//下拉框选择器字体对齐方式
|
||
showSelectorAlign:{
|
||
type: String,
|
||
default:"left"
|
||
},
|
||
//标签颜色
|
||
labelColor:{
|
||
type: String,
|
||
default:"#000000"
|
||
},
|
||
//文本内容颜色
|
||
textColor:{
|
||
type: String,
|
||
default:"#0000ff"
|
||
},
|
||
//选择器背景颜色
|
||
selectorColor:{
|
||
type: String,
|
||
default:"#ffffff"
|
||
},
|
||
//是否显示日期
|
||
isDate:{
|
||
type: Boolean,
|
||
default:true
|
||
},
|
||
//是否显示时间
|
||
isTime:{
|
||
type: Boolean,
|
||
default:true
|
||
},
|
||
//是否默认日期和时间
|
||
defaultDateTime:{
|
||
type: Boolean,
|
||
default:false
|
||
},
|
||
//默认时间的时间间隔(比如昨天、明天:-1、1),默认0,天为单位
|
||
dayInterval:{
|
||
type: Number,
|
||
default:0
|
||
},
|
||
|
||
//最小日期
|
||
startDate:{
|
||
type: String,
|
||
default:''//getDate('start');
|
||
},
|
||
//最大日期
|
||
endDate:{
|
||
type: String,
|
||
default:''//getDate('end');
|
||
},
|
||
//最小时间
|
||
start:{
|
||
type: String,
|
||
default:'00:00'
|
||
},
|
||
//最大时间
|
||
end:{
|
||
type: String,
|
||
default:'23:59'
|
||
},
|
||
//日期结果
|
||
date:{
|
||
type: String,
|
||
default:''
|
||
},
|
||
//时间结果
|
||
time:{
|
||
type: String,
|
||
default:''
|
||
},
|
||
//内容对齐方式 默认左对齐 ;left:flex-start; center:center; right:flex-end;
|
||
alignment:{
|
||
type: String,
|
||
default:'left'
|
||
},
|
||
},
|
||
model: {
|
||
prop: 'value',
|
||
event: 'input'
|
||
},
|
||
data() {
|
||
return {
|
||
//默认日期
|
||
defaultDate:'选择日期',
|
||
//默认时间
|
||
defaultTime:'选择时间',
|
||
//显示密码明文
|
||
showPassword: false,
|
||
//switch是否选中结果(switchResult)
|
||
switchResult:false,
|
||
//显示/隐藏 下拉框选择器内容信息
|
||
showSelector: false,
|
||
//下拉框值内容显示
|
||
comboxValue:{index:-1, key:'', val:''},
|
||
//初始化数据开关。针对需要数据源,并且需要构建返回值结构的时候
|
||
initState:false,
|
||
//内容对齐方式 默认左对齐
|
||
tempalignment:'flex-start',
|
||
//开关、复选框、单选框、下拉框数据源(子控件的值)
|
||
temprange:{
|
||
type: [Array, Boolean, Object],
|
||
default() {
|
||
return [];
|
||
}
|
||
}
|
||
}
|
||
},
|
||
computed: {
|
||
// 针对密码输入框类型处理,为了显示和隐藏密码
|
||
inputType() {
|
||
const type = this.type;
|
||
return type === 'password' ? 'text' : type;
|
||
},
|
||
// 处理主容器样式css
|
||
rowStyle(){
|
||
const type = this.type;
|
||
if (this.rowHeight === '40px' && (type==='checkbox' || type==='radio')) {
|
||
//复选框和单选框自动设置高度
|
||
if (this.temprange.length > 1) {
|
||
const cbLen= Math.ceil(this.temprange.length/this.columns);
|
||
return {
|
||
height: ((cbLen>3 ? 3 : cbLen) * 40)+'px'
|
||
}
|
||
}
|
||
}
|
||
return {
|
||
height: this.rowHeight
|
||
}
|
||
},
|
||
// 处理标签样式css
|
||
labelStyle() {
|
||
let css={}
|
||
if (this.labelWidth !== 'auto') {
|
||
css['width']=this.labelWidth;
|
||
}
|
||
css['color']=this.labelColor;
|
||
return css;
|
||
},
|
||
// 处理输入部分样式css
|
||
inputStyle(){
|
||
let css={};
|
||
const type = this.type;
|
||
//设置备件颜色
|
||
if(type==='hint'){
|
||
css['background-color']=this.readonlyColor;
|
||
css['width']='90px';
|
||
css['color']=this.placeholderColor;
|
||
}else if(this.mandatory){
|
||
css['background-color']=this.mandatoryColor;
|
||
css['width']='90px';
|
||
css['color']=this.textColor;
|
||
}else{
|
||
css['background-color']=this.defaultColor;
|
||
css['width']='90px';
|
||
css['color']=this.textColor;
|
||
}
|
||
//数字box不用设置边距
|
||
if(type==='numberbox'){
|
||
css['padding']='0';
|
||
}
|
||
|
||
//增加边框
|
||
if(this.inputBorder && this.type!=='switch' && this.type!=='slot'){
|
||
css['border-style']='solid';
|
||
css['border-width']='1px';
|
||
css['border-color']=this.inputBorderColor;//'#c5c5e1';
|
||
}
|
||
//存在按钮的时候,并且为文字按钮的时候,容器右侧增加圆角
|
||
if(this.showButton && this.buttonVal!==''){
|
||
css['border-radius']='0 5px 5px 0';
|
||
}
|
||
|
||
//设置内容对齐方式
|
||
css['text-align']=this.alignment;
|
||
return css;
|
||
},
|
||
//按钮样式调整
|
||
buttonStyle(){
|
||
let css={};
|
||
if(this.buttonWidth!==''){
|
||
css['width']=this.buttonWidth;
|
||
}
|
||
if(this.buttonType==='default'){
|
||
css['background-color']= this.buttonColor;
|
||
css['color']= this.buttonlabColor;
|
||
}
|
||
return css;
|
||
},
|
||
// 复选框和单选框样式调整
|
||
radioOrCheckboxStyle(){
|
||
//复选框和单选框设置宽度
|
||
const ratio= Math.floor(100/this.columns);
|
||
return {
|
||
width: ratio+'%'
|
||
}
|
||
},
|
||
// 开关结果处理
|
||
setSwitchResult(){
|
||
if(this.temprange.length < 2)
|
||
return '';
|
||
if(this.switchResult){
|
||
return this.temprange[0][this.rangeVal];
|
||
}else{
|
||
return this.temprange[1][this.rangeVal];
|
||
}
|
||
},
|
||
// 得到过滤后的下拉框数据源(根据key进行过滤)
|
||
filterCandidatesKey() {
|
||
if(this.temprange.length<=0){
|
||
return [];
|
||
}
|
||
return this.temprange.filter((item, index, arr) => {
|
||
this.$set(item,'index',index);
|
||
return item[this.rangeKey].indexOf(this.value['key']) > -1;
|
||
});
|
||
},
|
||
// 得到过滤后的下拉框数据源(根据key或者val进行过滤)
|
||
filterCandidates() {
|
||
if(this.temprange.length<=0){
|
||
return [];
|
||
}
|
||
return this.temprange.filter((item, index, arr) => {
|
||
this.$set(item,'index',index);
|
||
let t =false;
|
||
//一:key、val都为空的时候;二:key、val都不为空,并且索引不小于0(有选中结果的情况)
|
||
if((!this.value['key'] && !this.value['val'])
|
||
||(this.value['key'] && this.value['val'] && (this.value['index']|| this.value['index']==0) && this.value['index']>=0)){
|
||
t=true;
|
||
}else{
|
||
//通过val进行过滤
|
||
if(this.value['val']){
|
||
t= item[this.rangeVal].indexOf(this.value['val']) > -1||
|
||
item[this.rangeKey].indexOf(this.value['val']) > -1;
|
||
}
|
||
//通过key进行过滤
|
||
if(this.value['key']){
|
||
t=t||item[this.rangeKey].indexOf(this.value['key']) > -1;
|
||
}
|
||
}
|
||
return t;
|
||
});
|
||
},
|
||
// 得到下拉框选择器数据源的数据长度,用于提示是否有匹配选择项
|
||
filterCandidatesLength() {
|
||
return this.filterCandidates.length;
|
||
}
|
||
},
|
||
watch: {
|
||
//内容对齐方式监听
|
||
alignment(newVal,oldVal){
|
||
if (JSON.stringify(newVal)!=JSON.stringify(oldVal)) {
|
||
this.setAlignment();
|
||
}
|
||
},
|
||
|
||
//内容值改变
|
||
value(newVal, oldVal) {
|
||
//用户自定义修改、返回值改变的时候,针对一些需要重新整理的结果集进行处理。
|
||
//(现在操作可能不是最优的,因为控件这个操作主要是针对开发的时候通过代码去改,如果通过控件去操作会导致进行两次整理数据,效率会减慢,先用着)
|
||
let BeforeNewVal=newVal;
|
||
if (JSON.stringify(newVal)!=JSON.stringify(oldVal)) {
|
||
switch (this.type){
|
||
case 'switch'://开关
|
||
if((newVal===true || newVal===false) && this.temprange.length>=2){//只设置直接赋值true、false,暂时不提供其他赋值方式
|
||
let switchV={"result":false,key:'',val:''};
|
||
let i=0;
|
||
if(newVal===true){
|
||
this.switchResult=true;
|
||
switchV.result=true;
|
||
}else{
|
||
this.switchResult=false;
|
||
switchV.result=true;
|
||
i=1;
|
||
}
|
||
switchV.key=this.temprange[i][this.rangeKey];
|
||
switchV.val=this.temprange[i][this.rangeVal];
|
||
newVal=switchV;
|
||
}
|
||
break;
|
||
case 'date'://日期时间
|
||
if(newVal==''){
|
||
this.defaultDate='选择日期';
|
||
this.defaultTime='选择时间';
|
||
}
|
||
newVal =this.operationDateValue();
|
||
break;
|
||
case 'combox'://下拉框
|
||
// console.log("##############"+JSON.stringify(this.temprange))
|
||
// console.log('@@@@@@@@@@@@@@'+JSON.stringify(newVal))
|
||
if(this.temprange.length<=0)
|
||
break;
|
||
|
||
// console.log('$$$$$$$$$$$$$')
|
||
let comboxV={
|
||
index:newVal.index||-1,
|
||
key:newVal.key||'',
|
||
val:newVal.val||'',
|
||
};
|
||
if((newVal.index || newVal.index==0) && newVal.index>=0){ //优先通过索引过滤整理数据
|
||
comboxV={
|
||
index:newVal.index,
|
||
key:this.temprange[newVal.index][this.rangeKey],
|
||
val:this.temprange[newVal.index][this.rangeVal]
|
||
};
|
||
}else if(newVal.key){//通过key过滤整理数据
|
||
let filterItem=this.filterCandidatesKey;
|
||
if(filterItem.length>0){
|
||
comboxV={
|
||
index:filterItem[0].index,
|
||
key:filterItem[0][this.rangeKey],
|
||
val:filterItem[0][this.rangeVal]
|
||
};
|
||
}
|
||
}else if((typeof newVal=='string') && newVal.constructor==String){//直接赋key值
|
||
if(newVal){
|
||
let filterItem=this.temprange.filter((item, index, arr) => {
|
||
this.$set(item,'index',index);
|
||
return item[this.rangeKey].indexOf(newVal) > -1;
|
||
});
|
||
if(filterItem.length>0){
|
||
comboxV={
|
||
index:filterItem[0].index,
|
||
key:filterItem[0][this.rangeKey],
|
||
val:filterItem[0][this.rangeVal]
|
||
};
|
||
}
|
||
}
|
||
}else if((typeof newVal=='number')&& newVal.constructor==Number){//直接赋索引值
|
||
if(newVal >= 0){
|
||
comboxV={
|
||
index:newVal,
|
||
key:this.temprange[newVal][this.rangeKey],
|
||
val:this.temprange[newVal][this.rangeVal]
|
||
};
|
||
}
|
||
}
|
||
newVal=comboxV;
|
||
this.comboxValue=comboxV;
|
||
// console.log('@@@@@@@@@@@@@@'+JSON.stringify(this.comboxValue))
|
||
break;
|
||
case 'checkbox'://复选框
|
||
if(this.temprange.length<=0)
|
||
break;
|
||
let checkboxV={
|
||
indexs:newVal.indexs||[],
|
||
keys:newVal.keys||[],
|
||
vals:newVal.vals||[],
|
||
};
|
||
let selectK=[];
|
||
let selectV=[];
|
||
let selectI=[];
|
||
if(newVal.indexs){//优先通过索引过滤整理数据
|
||
this.temprange.forEach((item, index) => {
|
||
if(newVal.indexs.includes(index)){
|
||
this.$set(item,'checked',true)
|
||
}else{
|
||
this.$set(item,'checked',false)
|
||
}
|
||
if(item.checked){
|
||
selectK.push(item[this.rangeKey]);
|
||
selectV.push(item[this.rangeVal]);
|
||
selectI.push(index);
|
||
}
|
||
})
|
||
}else if(newVal.keys){//通过key过滤整理数据
|
||
this.temprange.forEach((item, index) => {
|
||
if(newVal.keys.includes(item[this.rangeKey])){
|
||
this.$set(item,'checked',true)
|
||
}else{
|
||
this.$set(item,'checked',false)
|
||
}
|
||
if(item.checked){
|
||
selectK.push(item[this.rangeKey]);
|
||
selectV.push(item[this.rangeVal]);
|
||
selectI.push(index);
|
||
}
|
||
})
|
||
}
|
||
checkboxV.indexs=selectI;
|
||
checkboxV.keys=selectK;
|
||
checkboxV.vals=selectV;
|
||
newVal=checkboxV;
|
||
break;
|
||
case 'radio'://单选框
|
||
if(this.temprange.length<=0)
|
||
break;
|
||
let radioV={
|
||
index:newVal.index||-1,
|
||
key:newVal.key||'',
|
||
val:newVal.val||'',
|
||
};
|
||
if((newVal.index || newVal.index==0) && newVal.index>=0){ //优先通过索引过滤整理数据
|
||
this.temprange[newVal.index].checked=true;
|
||
radioV={
|
||
index:newVal.index,
|
||
key:this.temprange[newVal.index][this.rangeKey],
|
||
val:this.temprange[newVal.index][this.rangeVal]
|
||
};
|
||
}else if(newVal.key){//通过key过滤整理数据
|
||
let filterItem=this.filterCandidatesKey;
|
||
if(filterItem.length>0){
|
||
this.temprange[filterItem[0].index].checked=true;
|
||
radioV={
|
||
index:filterItem[0].index,
|
||
key:filterItem[0][this.rangeKey],
|
||
val:filterItem[0][this.rangeVal]
|
||
};
|
||
}
|
||
}else if((typeof newVal=='string') && newVal.constructor==String){//直接赋key值
|
||
if(newVal){
|
||
let filterItem=this.temprange.filter((item, index, arr) => {
|
||
this.$set(item,'index',index);
|
||
return item[this.rangeKey].indexOf(newVal) > -1;
|
||
});
|
||
if(filterItem.length>0){
|
||
this.temprange[filterItem[0].index].checked=true;
|
||
radioV={
|
||
index:filterItem[0].index,
|
||
key:filterItem[0][this.rangeKey],
|
||
val:filterItem[0][this.rangeVal]
|
||
};
|
||
}
|
||
}
|
||
}else if((typeof newVal=='number')&& newVal.constructor==Number){//直接赋索引值
|
||
if(newVal >= 0){
|
||
this.temprange[newVal].checked=true;
|
||
radioV={
|
||
index:newVal,
|
||
key:this.temprange[newVal][this.rangeKey],
|
||
val:this.temprange[newVal][this.rangeVal]
|
||
};
|
||
}
|
||
}
|
||
newVal=radioV;
|
||
// 把旧的结果改回去
|
||
if(oldVal.index && oldVal.index>=0){
|
||
this.temprange[oldVal.index].checked=false;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
let setOnChange=true; //判断是否需要设置 change 事件
|
||
//整理之后的结果集合判断是否一致,不一致就反馈到夫控件
|
||
if (JSON.stringify(BeforeNewVal)!=JSON.stringify(newVal)) {
|
||
this.$emit('input', newVal);
|
||
setOnChange=false;//因为还会返回一次值到父控件,所以不需要触发change事件
|
||
}
|
||
//用来初始化的时候不进行触发change事件
|
||
if(!this.initState){
|
||
if (JSON.stringify(newVal)!=JSON.stringify(oldVal) && setOnChange) {
|
||
this.$emit('change', newVal);
|
||
}
|
||
}else{
|
||
this.initState=false;
|
||
}
|
||
},
|
||
//数据源变化,更新界面数据绑定信息
|
||
range(newVal,oldVal){
|
||
//数据源是在页面data中定义,然后通过方法进行赋值的,重新调用初始化数据操作
|
||
if (newVal !== oldVal) {
|
||
//注:这里两个对象判断相等应该是没用的,需要转换成字符串或者其他操作去进行比对,因为表格数据量大,就不比对了,先这样放着
|
||
this.temprange=JSON.parse(JSON.stringify(this.range));
|
||
this.init();
|
||
}
|
||
}
|
||
},
|
||
created() {
|
||
this.temprange=JSON.parse(JSON.stringify(this.range));
|
||
//初始化内容对齐方式
|
||
this.setAlignment();
|
||
//在模板渲染成html前调用,初始化属性值。
|
||
switch (this.type){
|
||
case 'switch':
|
||
this.switchResult=this.checked;
|
||
break;
|
||
case 'date':
|
||
let resultDate =this.operationDateValue();
|
||
this.$emit('input', resultDate);
|
||
break;
|
||
}
|
||
},
|
||
mounted() {
|
||
//在模板渲染成html后调用,初始化页面完成后,对html的dom节点进行一些需要的操作。
|
||
// if(this.temprange.length>0){
|
||
//数据源是在页面data中进行了初始化的,就调用初始化数据操作
|
||
this.init();
|
||
// }
|
||
},
|
||
methods: {
|
||
//设置内容对齐方式
|
||
setAlignment(){
|
||
switch (this.alignment){
|
||
case 'center':
|
||
this.tempalignment='center';
|
||
break;
|
||
case 'right':
|
||
this.tempalignment='flex-end';
|
||
break;
|
||
default:
|
||
this.tempalignment='flex-start';
|
||
break;
|
||
}
|
||
},
|
||
//整合时间类型返回值整理
|
||
operationDateValue(){
|
||
let d='';
|
||
let t='';
|
||
let result='';
|
||
if(this.value.length>0){
|
||
if(this.value.length>15){
|
||
d=this.isDate?this.value.substring(0,10):'';
|
||
t=this.isTime?' '+this.value.substring(11,this.value.length):'';
|
||
this.defaultDate=this.value.substring(0,10);
|
||
this.defaultTime=this.value.substring(11,this.value.length);
|
||
}else{
|
||
//已经填写日期
|
||
if(this.value.length>=10 && this.value.length<15){
|
||
d=this.isDate?this.value.substring(0,10):'';
|
||
this.defaultDate=this.value.substring(0,10);
|
||
}
|
||
//已经填写时间
|
||
if(this.value.length>=5 && this.value.length<10){
|
||
t=this.isTime?' '+this.value.substring(this.value.length-5,this.value.length):'';
|
||
this.defaultTime=this.value.substring(this.value.length-5,this.value.length);
|
||
}
|
||
}
|
||
if(d!='' || t!=''){
|
||
result=(this.isDate?d:'')+(this.isTime?t:'');
|
||
}
|
||
}else{
|
||
this.defaultDate=this.date.length>0
|
||
?this.date
|
||
:this.defaultDateTime?getDate(this.type,this.dayInterval):this.defaultDate;
|
||
this.defaultTime=this.time.length>0
|
||
?this.time
|
||
:this.defaultDateTime?getTime(this.type):this.defaultTime;
|
||
d=this.defaultDate==='选择日期'?'':this.defaultDate;
|
||
t=this.defaultTime==='选择时间'?'':' '+this.defaultTime;
|
||
result=(this.isDate?d:'')+(this.isTime?t:'');
|
||
}
|
||
return result;
|
||
},
|
||
//初始化数据(针对有数据源的,range)
|
||
init(){
|
||
this.initState=true;
|
||
const items = this.temprange;
|
||
var result={};
|
||
switch (this.type){
|
||
case 'checkbox':
|
||
result={indexs:[],keys:[],vals:[]};
|
||
var selectK=[];
|
||
var selectV=[];
|
||
var selectI=[];
|
||
for (var i = 0, lenI = items.length; i < lenI; ++i) {
|
||
const item = items[i]
|
||
if(item.checked){
|
||
selectK.push(item[this.rangeKey]);
|
||
selectV.push(item[this.rangeVal]);
|
||
selectI.push(i);
|
||
}
|
||
}
|
||
result.indexs=selectI;
|
||
result.keys=selectK;
|
||
result.vals=selectV;
|
||
this.$emit('input', result);
|
||
break;
|
||
case 'radio':
|
||
var select=false;
|
||
result={index:-1,key:'',val:''};
|
||
for (var i = 0, lenI = items.length; i < lenI; ++i) {
|
||
const item = items[i];
|
||
if(item['checked'] && !select){
|
||
result={
|
||
index:i,
|
||
key:item[this.rangeKey],
|
||
val:item[this.rangeVal]
|
||
};
|
||
select=true;
|
||
continue;
|
||
}
|
||
this.$set(item,'checked',false);
|
||
}
|
||
this.$emit('input', result);
|
||
break;
|
||
case 'switch':
|
||
result={
|
||
result:this.switchResult,
|
||
key:'',
|
||
val:'',
|
||
};
|
||
if(items.length<2){
|
||
this.$emit('input', result);
|
||
break;
|
||
}
|
||
var i=this.switchResult?0:1;
|
||
result.key=this.temprange[i][this.rangeKey];
|
||
result.val=this.temprange[i][this.rangeVal];
|
||
this.$emit('input', result);
|
||
break;
|
||
case 'combox':
|
||
result={index:-1,key:'',val:''};
|
||
if(this.value!=={} && this.value.index>=0 && (this.temprange.length-1)>=this.value.index){
|
||
result={
|
||
index:this.value.index,
|
||
key:this.temprange[this.value.index][this.rangeKey],
|
||
val:this.temprange[this.value.index][this.rangeVal]
|
||
};
|
||
}
|
||
this.$emit('input', result);
|
||
break;
|
||
}
|
||
},
|
||
//密码框眼睛图标点击切换显示隐藏密码
|
||
display() {
|
||
this.showPassword = !this.showPassword
|
||
},
|
||
//普通输入框清空图标事件
|
||
clear() {
|
||
this.$emit('input', '');
|
||
this.$emit('clear', '');
|
||
//时间控件清空操作
|
||
if(this.type==='date'){
|
||
this.defaultDate='选择日期';
|
||
this.defaultTime='选择时间';
|
||
}
|
||
},
|
||
//按钮点击事件
|
||
buttonClick(){
|
||
if(this.btConfirm){
|
||
this.$emit('confirm', this.value);
|
||
}else{
|
||
this.$emit('buttonClick', this.value);
|
||
}
|
||
},
|
||
//普通输入框输入事件
|
||
onInput(e) {
|
||
this.$emit('input', e.detail.value);
|
||
},
|
||
//普通输入框提交事件
|
||
onConfirm(e){
|
||
this.$emit('confirm', e.detail.value);
|
||
},
|
||
//数字box输入框【+】【-】按钮点击事件
|
||
calcValue(type) {
|
||
if (this.disabled) {
|
||
return;
|
||
}
|
||
const scale = this.getDecimalScale();
|
||
let value = this.value * scale;
|
||
let step = this.step * scale;
|
||
if (type === "minus") {
|
||
value -= step;
|
||
if (value < (this.min * scale)) {
|
||
return;
|
||
}
|
||
if (value > (this.max * scale)) {
|
||
value = this.max * scale
|
||
}
|
||
} else if (type === "plus") {
|
||
value += step;
|
||
if (value > (this.max * scale)) {
|
||
return;
|
||
}
|
||
if (value < (this.min * scale)) {
|
||
value = this.min * scale
|
||
}
|
||
}
|
||
this.$emit('input', String(value / scale));
|
||
},
|
||
//数字box输入框值转换
|
||
getDecimalScale() {
|
||
let scale = 1;
|
||
// 浮点型
|
||
if (~~this.step !== this.step) {
|
||
scale = Math.pow(10, (this.step + "").split(".")[1].length);
|
||
}
|
||
return scale;
|
||
},
|
||
// 数字box输入框失去焦点事件
|
||
onBlurNumberbox(e) {
|
||
let value = e.detail.value;
|
||
if (!value) {
|
||
this.$emit('input', '');
|
||
return;
|
||
}
|
||
value = +value;
|
||
if (value > this.max) {
|
||
value = this.max;
|
||
} else if (value < this.min) {
|
||
value = this.min;
|
||
}
|
||
this.$emit('input', value);
|
||
},
|
||
//复选框选择项改变事件
|
||
checkboxChange(e){
|
||
var items = this.temprange;
|
||
var checkboxV={indexs:[],keys:[],vals:[]};
|
||
var selectK=[];
|
||
var selectV=[];
|
||
var selectI=[];
|
||
for (var i = 0, lenI = items.length; i < lenI; ++i) {
|
||
const item = items[i]
|
||
if(e.detail.value.includes(item[this.rangeKey])){
|
||
this.$set(item,'checked',true)
|
||
}else{
|
||
this.$set(item,'checked',false)
|
||
}
|
||
if(item.checked){
|
||
selectK.push(item[this.rangeKey]);
|
||
selectV.push(item[this.rangeVal]);
|
||
selectI.push(i);
|
||
}
|
||
}
|
||
checkboxV.indexs=selectI;
|
||
checkboxV.keys=selectK;
|
||
checkboxV.vals=selectV;
|
||
this.$emit('input', checkboxV);
|
||
},
|
||
//单选框选择项改变事件
|
||
radioChange(e) {
|
||
var items = this.temprange;
|
||
var radioV={};
|
||
for (var i = 0, lenI = items.length; i < lenI; ++i) {
|
||
const item = items[i]
|
||
if(e.target.value===item[this.rangeKey]){
|
||
this.$set(item,'checked',true);
|
||
radioV={index:i,key:e.target.value,val:item[this.rangeVal]};
|
||
}else{
|
||
this.$set(item,'checked',false);
|
||
}
|
||
}
|
||
this.$emit('input', radioV);
|
||
},
|
||
//复选框、单选框字体点击事件
|
||
onNoticeClick(type,index){
|
||
let item =this.temprange[index];
|
||
let results={};
|
||
if(type==='checkbox'){
|
||
results={
|
||
indexs:this.value.indexs,
|
||
keys:this.value.keys,
|
||
vals:this.value.vals
|
||
};
|
||
if(item['checked']){ //取消选择
|
||
let oldIndex = results.indexs.indexOf(index);
|
||
if (index > -1) {
|
||
results.indexs.splice(oldIndex, 1);
|
||
results.keys.splice(oldIndex, 1);
|
||
results.vals.splice(oldIndex, 1);
|
||
}
|
||
this.$set(item,'checked',false);
|
||
}else{ //选择
|
||
results.indexs.push(index);
|
||
results.keys.push(item[this.rangeKey]);
|
||
results.vals.push(item[this.rangeVal]);
|
||
this.$set(item,'checked',true);
|
||
}
|
||
this.$emit('input', results);
|
||
}else if(type==='radio'){
|
||
this.$set(this.temprange[this.value.index],'checked',false);
|
||
results={
|
||
index:index,
|
||
key:item[this.rangeKey],
|
||
val:item[this.rangeVal]
|
||
};
|
||
this.$set(item,'checked',!item['checked']);
|
||
this.$emit('input', results);
|
||
}
|
||
},
|
||
//开关选择项改变事件
|
||
switchChange(e) {
|
||
this.switchResult=e.target.value;
|
||
var result={result:this.switchResult,key:'',val:''};
|
||
var i=this.switchResult ? 0 : 1;
|
||
if (this.temprange.length<2){
|
||
this.$emit('input', result);
|
||
return;
|
||
}
|
||
result.key=this.temprange[i][this.rangeKey];
|
||
result.val=this.temprange[i][this.rangeVal];
|
||
this.$emit('input', result);
|
||
},
|
||
//下拉框展开图标点击事件
|
||
toggleSelector() {
|
||
this.showSelector = !this.showSelector;
|
||
},
|
||
//下拉框清空图标点击事件
|
||
clearCombox(){
|
||
this.$emit('input', {index:-1, key:'', val:''});
|
||
},
|
||
//下拉框输入内容事件
|
||
onInputCombox(e) {
|
||
this.$emit('input', {index:-1, key:'', val:e.detail.value});
|
||
setTimeout(()=>{
|
||
let filter= this.filterCandidates;
|
||
if(filter.length === 1 && filter[0][this.rangeVal]===e.detail.value){
|
||
let result={
|
||
index:filter[0]["index"],
|
||
key:filter[0][this.rangeKey],
|
||
val:filter[0][this.rangeVal]
|
||
};
|
||
this.$emit('input', result);
|
||
}
|
||
}, 100);
|
||
},
|
||
//下拉框提交内容事件
|
||
onConfirmCombox(){
|
||
this.$emit('confirm', this.value);
|
||
},
|
||
//输入框类得到焦点
|
||
onFocusInput(){
|
||
this.$emit('resetFocus', true);
|
||
this.$emit('focus', this.value);
|
||
},
|
||
//输入框类失去焦点
|
||
onBlurInput(){
|
||
this.$emit('resetFocus', false);
|
||
this.$emit('blur', this.value);
|
||
},
|
||
//下拉框得到焦点事件
|
||
onFocusCombox() {
|
||
this.showSelector = true;
|
||
this.$emit('focus', this.value);
|
||
},
|
||
//下拉框失去焦点事件
|
||
onBlurCombox() {
|
||
//需要延迟执行,防止输入框失去焦点后,马上隐藏选项内容信息,导致无法选择
|
||
setTimeout(()=>{
|
||
const filter= this.filterCandidates;
|
||
var result=this.value;
|
||
if(filter.length<=0){
|
||
result=this.verify
|
||
? {index:-1, key:'', val:''}
|
||
: result;
|
||
}else if(this.value['index']<0 && this.value['val'].length>0){
|
||
if(this.automatic){
|
||
result={
|
||
index:filter[0]['index'],
|
||
key:filter[0][this.rangeKey],
|
||
val:filter[0][this.rangeVal]
|
||
}
|
||
}else if(this.verify && result['index']<=0){
|
||
result={index:-1, key:'', val:''};
|
||
}
|
||
}
|
||
this.$emit('input', result);
|
||
this.$emit('blur', result);
|
||
this.showSelector = false;
|
||
}, 100);
|
||
},
|
||
//下拉框选择器内容选项点击事件
|
||
onSelectorClick(index) {
|
||
this.showSelector = false;
|
||
const item =this.filterCandidates[index];
|
||
const result={
|
||
index:item["index"],
|
||
key:item[this.rangeKey],
|
||
val:item[this.rangeVal]
|
||
};
|
||
this.$emit('input', result);
|
||
},
|
||
//时间输入框-日期点击选择事件
|
||
bindDateChange(e) {
|
||
this.defaultDate = e.detail.value
|
||
let result=(this.isDate?this.defaultDate:'')+(this.isTime &&this.defaultTime!=='选择时间' ?(' '+this.defaultTime):'');
|
||
this.$emit('input', result);
|
||
this.$emit('confirm', {date:e.detail.value,time:this.defaultTime==='选择时间'?'':this.defaultTime});
|
||
},
|
||
//时间输入框-时间点击选择事件
|
||
bindTimeChange(e) {
|
||
this.defaultTime = e.detail.value
|
||
let result=(this.isDate&&this.defaultDate!=='选择日期'?this.defaultDate:'')+(this.isTime?(' '+this.defaultTime):'');
|
||
this.$emit('input', result);
|
||
this.$emit('confirm', {date:this.defaultTime==='选择日期'?'':this.defaultTime, time:e.detail.value});
|
||
},
|
||
|
||
//跳转到微信扫一扫,用于在微信推广吧。
|
||
// scan(){
|
||
// if (plus.os.name == "iOS") {
|
||
// plus.runtime.openURL("weixin://scanqrcode")
|
||
// } else if (plus.os.name == "andriod") {
|
||
// var Intent = plus.android.importClass("android.content.Intent");
|
||
// var ComponentName = plus.android.importClass('android.content.ComponentName')
|
||
// var intent = new Intent();
|
||
// intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI"));
|
||
// intent.putExtra("LauncherUI.From.Scaner.Shortcut", true);
|
||
// intent.setFlags(335544320);
|
||
// intent.setAction("android.intent.action.VIEW");
|
||
// var main = plus.android.runtimeMainActivity();
|
||
// main.startActivity(intent);
|
||
// }
|
||
// }
|
||
|
||
//扫一扫事件
|
||
async scan() {
|
||
let status = await this.checkPermission();
|
||
if (status !== 1) {
|
||
return;
|
||
}
|
||
uni.scanCode({
|
||
success: (res) => {
|
||
this.$emit('input', res.result);
|
||
this.$emit('confirm', res.result);
|
||
},
|
||
fail: (err) => {
|
||
uni.getSetting({
|
||
success: (res) => {
|
||
let authStatus = res.authSetting['scope.camera'];
|
||
if (!authStatus) {
|
||
uni.showModal({
|
||
title: '授权失败',
|
||
content: 'Hello uni-app需要使用您的相机,请在设置界面打开相关权限',
|
||
success: (res) => {
|
||
if (res.confirm) {
|
||
uni.openSetting()
|
||
}
|
||
}
|
||
})
|
||
}
|
||
}
|
||
})
|
||
}
|
||
});
|
||
},
|
||
|
||
//扫一扫功能必须的手机权限验证
|
||
async checkPermission(code) {
|
||
let status = permision.isIOS ? await permision.requestIOS('camera') :
|
||
await permision.requestAndroid('android.permission.CAMERA');
|
||
if (status === null || status === 1) {
|
||
status = 1;
|
||
} else {
|
||
uni.showModal({
|
||
content: "需要相机权限",
|
||
confirmText: "设置",
|
||
success: function(res) {
|
||
if (res.confirm) {
|
||
permision.gotoAppSetting();
|
||
}
|
||
}
|
||
})
|
||
}
|
||
return status;
|
||
}
|
||
|
||
}
|
||
}
|
||
//获取日期,只在时间类型控件才使用
|
||
function getDate(type, dayInterval) {
|
||
if(type!=='date')
|
||
return '';
|
||
let dateTime = new Date();
|
||
dateTime=dateTime.setDate(dateTime.getDate()+dayInterval);
|
||
const date=new Date(dateTime)
|
||
let year = date.getFullYear();
|
||
let month = date.getMonth() + 1;
|
||
let day = date.getDate();
|
||
if (type === 'start') {
|
||
year = year - 60;
|
||
} else if (type === 'end') {
|
||
year = year + 2;
|
||
}
|
||
month = month > 9 ? month : '0' + month;;
|
||
day = day > 9 ? day : '0' + day;
|
||
return `${year}-${month}-${day}`;
|
||
}
|
||
|
||
//获取时间,只在时间类型控件才使用
|
||
function getTime(type){
|
||
if(type!=='date')
|
||
return '';
|
||
|
||
const date = new Date();
|
||
let h=date.getHours();
|
||
let m =date.getMinutes();
|
||
return (h<10?'0'+h:h)+':'+(m<10?'0'+m:m);
|
||
}
|
||
|
||
</script>
|
||
|
||
<style>
|
||
|
||
.rightButton {
|
||
padding:0 20rpx;
|
||
height: 30px;
|
||
margin-left: 10rpx;
|
||
}
|
||
|
||
.scroll-view_H {
|
||
white-space: nowrap;
|
||
/* width: 100%; */
|
||
}
|
||
|
||
.uni-combox {
|
||
display: flex;
|
||
height: 40px;
|
||
line-height: 40px;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
position: relative;
|
||
}
|
||
|
||
.uni-combox.before::before {
|
||
position: absolute;
|
||
right: 0;
|
||
top: 0;
|
||
left: 0;
|
||
height: 1px;
|
||
content: '';
|
||
-webkit-transform: scaleY(0.5);
|
||
transform: scaleY(0.5);
|
||
background-color: #c8c7cc;
|
||
z-index: 99; /* 这里会被input覆盖1px给了一个置顶 */
|
||
}
|
||
|
||
.uni-combox.after::after {
|
||
position: absolute;
|
||
right: 0;
|
||
bottom: 0;
|
||
left: 0;
|
||
height: 1px;
|
||
content: '';
|
||
-webkit-transform: scaleY(0.5);
|
||
transform: scaleY(0.5);
|
||
background-color: #c8c7cc;
|
||
}
|
||
|
||
.uni-combox__input-box {
|
||
position: relative;
|
||
display: flex;
|
||
flex: 1;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
/* color: #0000ff; */
|
||
height: 100%;
|
||
}
|
||
|
||
.uni-combox__input {
|
||
flex: 1;
|
||
font-size: 16px;
|
||
height: 22px;
|
||
line-height: 22px;
|
||
}
|
||
|
||
.uni-combox__input-arrow {
|
||
/* padding: 10px; */
|
||
}
|
||
|
||
.uni-combox__selector {
|
||
box-sizing: border-box;
|
||
position: absolute;
|
||
top: 42px;
|
||
left: 0;
|
||
width: 100%;
|
||
background-color: #ffffff;
|
||
border-radius: 6px;
|
||
box-shadow: #dddddd 4px 4px 8px, #dddddd -4px -4px 8px;
|
||
z-index: 99;
|
||
}
|
||
|
||
.uni-combox__selector-scroll {
|
||
max-height: 200px;
|
||
box-sizing: border-box;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
.uni-combox__selector::before {
|
||
content: '';
|
||
position: absolute;
|
||
width: 0;
|
||
height: 0;
|
||
border-bottom: solid 6px #ffffff;
|
||
border-right: solid 6px transparent;
|
||
border-left: solid 6px transparent;
|
||
left: 50%;
|
||
top: -6px;
|
||
margin-left: -6px;
|
||
}
|
||
|
||
.uni-combox__selector-empty,
|
||
.uni-combox__selector-item {
|
||
/* #ifdef APP-NVUE */
|
||
display: flex;
|
||
/* #endif */
|
||
line-height: 36px;
|
||
font-size: 14px;
|
||
text-align: left;
|
||
border-bottom: solid 1px #dddddd;
|
||
margin: 0px 10px;
|
||
}
|
||
|
||
.uni-combox__selector-empty:last-child,
|
||
.uni-combox__selector-item:last-child {
|
||
border-bottom: none;
|
||
}
|
||
|
||
uni-radio-group, uni-checkbox-group{
|
||
width: 100%;
|
||
height: 100%;
|
||
/* max-height: 120px; */
|
||
overflow-y: scroll;
|
||
}
|
||
|
||
.radio-checkbox-content
|
||
{
|
||
display: flex;
|
||
float: left;
|
||
margin: 2px 0;
|
||
}
|
||
|
||
.radio-checkbox-content-notice{
|
||
padding:0;
|
||
margin-bottom:0;
|
||
}
|
||
|
||
.uni-numbox {
|
||
display: flex;
|
||
flex-direction: row;
|
||
height: 28px;
|
||
line-height: 28px;
|
||
width: 100%;
|
||
}
|
||
|
||
.uni-numbox__value {
|
||
height: 28px;
|
||
width: 100%;
|
||
text-align: center;
|
||
font-size: 16px;
|
||
border-style: solid;
|
||
border-color: #e5e5e5;
|
||
border-width: 0 1px 0 1px;
|
||
}
|
||
|
||
.uni-numbox__minus {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 30px;
|
||
height: 28px;
|
||
font-size: 20px;
|
||
color: #333;
|
||
background-color: #f8f8f8;
|
||
border-style: solid;
|
||
border-color: #e5e5e5;
|
||
border-top-left-radius: 3px;
|
||
border-bottom-left-radius: 3px;
|
||
border-width: 0 0 0 1px;
|
||
}
|
||
|
||
.uni-numbox__plus {
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 30px;
|
||
height: 28px;
|
||
border-width: 0 1px 1px 0;
|
||
border-style: solid;
|
||
border-color: #e5e5e5;
|
||
border-top-right-radius: 3px;
|
||
border-bottom-right-radius: 3px;
|
||
background-color: #f8f8f8;
|
||
}
|
||
|
||
.uni-numbox--text {
|
||
font-size: 40rpx;
|
||
color: #333;
|
||
}
|
||
|
||
.uni-numbox--disabled {
|
||
color: #c0c0c0;
|
||
}
|
||
|
||
.m-input-view {
|
||
display: inline-flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
width: 100%;
|
||
flex: 1;
|
||
padding: 0 0 0 5px;
|
||
}
|
||
|
||
.m-input-row {
|
||
display: flex;
|
||
flex-direction: row;
|
||
position: relative;
|
||
font-size: 16px;
|
||
line-height: 30px;
|
||
height: 30px;
|
||
padding: 5px 1px;
|
||
}
|
||
|
||
.m-input-row.before::before {
|
||
position: absolute;
|
||
right: 0;
|
||
top: 0;
|
||
left: 0;
|
||
height: 1px;
|
||
content: '';
|
||
-webkit-transform: scaleY(.5);
|
||
transform: scaleY(.5);
|
||
background-color: #b0b0d9;
|
||
}
|
||
|
||
.m-input-row.after::after {
|
||
position: absolute;
|
||
right: 0;
|
||
bottom: 0;
|
||
left: 0;
|
||
height: 1px;
|
||
content: '';
|
||
-webkit-transform: scaleY(.5);
|
||
transform: scaleY(.5);
|
||
background-color: #b0b0d9;
|
||
}
|
||
|
||
.m-title {
|
||
/* width: 25%; */
|
||
width: 80px;
|
||
padding-left: 5px;
|
||
}
|
||
|
||
/* 标签右侧边框 */
|
||
.m-title.separate::after {
|
||
position: absolute;
|
||
bottom: 0;
|
||
top: 0;
|
||
width: 1px;
|
||
content: '';
|
||
background-color: #b0b0d9;
|
||
}
|
||
|
||
.m-input {
|
||
width: 100%;
|
||
display: flex;
|
||
flex: 1;
|
||
font-size: 16px;
|
||
}
|
||
|
||
</style>
|