feat: nps评分 (#79)
* feat: nps评分功能 * feat: nps样式添加 * feat: 添加nps评分icon * feat: 基于修改建议修改nps评分组件 * feat: 将自定义类移入至设置器
This commit is contained in:
parent
071afbfec1
commit
05b9416cd9
@ -10,6 +10,8 @@ import { ResponseSchema } from 'src/models/responseSchema.entity';
|
|||||||
import { getListHeadByDataList } from '../utils';
|
import { getListHeadByDataList } from '../utils';
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class DataStatisticService {
|
export class DataStatisticService {
|
||||||
|
private radioType = ['radio-star', 'radio-nps'];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@InjectRepository(SurveyResponse)
|
@InjectRepository(SurveyResponse)
|
||||||
private readonly surveyResponseRepository: MongoRepository<SurveyResponse>,
|
private readonly surveyResponseRepository: MongoRepository<SurveyResponse>,
|
||||||
@ -66,7 +68,7 @@ export class DataStatisticService {
|
|||||||
}
|
}
|
||||||
// 处理选项的更多输入框
|
// 处理选项的更多输入框
|
||||||
if (
|
if (
|
||||||
itemConfig.type === 'radio-star' &&
|
this.radioType.includes(itemConfig.type) &&
|
||||||
!data[`${itemConfigKey}_custom`]
|
!data[`${itemConfigKey}_custom`]
|
||||||
) {
|
) {
|
||||||
data[`${itemConfigKey}_custom`] =
|
data[`${itemConfigKey}_custom`] =
|
||||||
|
BIN
web/public/imgs/question-type-snapshot/radio-nps.webp
Normal file
BIN
web/public/imgs/question-type-snapshot/radio-nps.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
@ -29,6 +29,10 @@ export const defaultQuestionConfig = {
|
|||||||
starStyle: 'star',
|
starStyle: 'star',
|
||||||
starMin: 1,
|
starMin: 1,
|
||||||
starMax: 5,
|
starMax: 5,
|
||||||
|
min: 0,
|
||||||
|
max: 10,
|
||||||
|
minMsg: '极不满意',
|
||||||
|
maxMsg: '十分满意',
|
||||||
// 分值对应的开关和输入框配置,因为不是固定从0开始,用对象比较合适
|
// 分值对应的开关和输入框配置,因为不是固定从0开始,用对象比较合适
|
||||||
rangeConfig: {},
|
rangeConfig: {},
|
||||||
// 选项
|
// 选项
|
||||||
|
@ -41,6 +41,13 @@ const menuItems = {
|
|||||||
icon: 'tixing-pingfen',
|
icon: 'tixing-pingfen',
|
||||||
title: '评分',
|
title: '评分',
|
||||||
},
|
},
|
||||||
|
'radio-nps': {
|
||||||
|
type: 'radio-nps',
|
||||||
|
path: 'NpsModule',
|
||||||
|
snapshot: '/imgs/question-type-snapshot/radio-nps.webp',
|
||||||
|
icon: 'NPSpingfen',
|
||||||
|
title: 'nps评分',
|
||||||
|
},
|
||||||
vote: {
|
vote: {
|
||||||
type: 'vote',
|
type: 'vote',
|
||||||
path: 'VoteModule',
|
path: 'VoteModule',
|
||||||
@ -57,7 +64,14 @@ const menuGroup = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '选择类题型',
|
title: '选择类题型',
|
||||||
questionList: ['radio', 'checkbox', 'binary-choice', 'radio-star', 'vote'],
|
questionList: [
|
||||||
|
'radio',
|
||||||
|
'checkbox',
|
||||||
|
'binary-choice',
|
||||||
|
'radio-star',
|
||||||
|
'radio-nps',
|
||||||
|
'vote',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
@form-change="onFormChange($event, item)"
|
@form-change="onFormChange($event, item)"
|
||||||
:inline="true"
|
:inline="true"
|
||||||
labelPosition="left"
|
labelPosition="left"
|
||||||
|
:class="item.contentClass"
|
||||||
></SettersField>
|
></SettersField>
|
||||||
</template>
|
</template>
|
||||||
<Component
|
<Component
|
||||||
@ -32,7 +33,11 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { get as _get, pick as _pick, isFunction as _isFunction } from 'lodash-es';
|
import {
|
||||||
|
get as _get,
|
||||||
|
pick as _pick,
|
||||||
|
isFunction as _isFunction,
|
||||||
|
} from 'lodash-es';
|
||||||
|
|
||||||
import FormItem from '@/materials/setters/widgets/FormItem.vue';
|
import FormItem from '@/materials/setters/widgets/FormItem.vue';
|
||||||
import setterLoader from '@/materials/setters/setterLoader';
|
import setterLoader from '@/materials/setters/setterLoader';
|
||||||
@ -170,4 +175,16 @@ export default {
|
|||||||
.config-form {
|
.config-form {
|
||||||
padding: 15px 0;
|
padding: 15px 0;
|
||||||
}
|
}
|
||||||
|
.nps-customed-config {
|
||||||
|
.el-form-item {
|
||||||
|
margin-right: 0px;
|
||||||
|
::v-deep .el-form-item__label {
|
||||||
|
width: 70px !important;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
::v-deep .el-input__inner {
|
||||||
|
width: 234px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -6,6 +6,7 @@ export default {
|
|||||||
checkbox: 'CheckboxModule',
|
checkbox: 'CheckboxModule',
|
||||||
'binary-choice': 'BinaryChoiceModule',
|
'binary-choice': 'BinaryChoiceModule',
|
||||||
'radio-star': 'StarModule',
|
'radio-star': 'StarModule',
|
||||||
|
'radio-nps': 'NpsModule',
|
||||||
city: 'CityModule',
|
city: 'CityModule',
|
||||||
vote: 'VoteModule',
|
vote: 'VoteModule',
|
||||||
'matrix-checkbox': 'GroupModule',
|
'matrix-checkbox': 'GroupModule',
|
||||||
|
@ -5,6 +5,7 @@ const config = {
|
|||||||
radio: '单选',
|
radio: '单选',
|
||||||
checkbox: '多选',
|
checkbox: '多选',
|
||||||
'radio-star': '评分',
|
'radio-star': '评分',
|
||||||
|
'radio-nps': 'NPS评分',
|
||||||
city: '城市选择',
|
city: '城市选择',
|
||||||
vote: '投票',
|
vote: '投票',
|
||||||
'binary-choice': '判断',
|
'binary-choice': '判断',
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import OptionConfig from '@/materials/questions/components/AdvancedConfig/OptionConfig.vue';
|
import OptionConfig from '@/materials/questions/components/AdvancedConfig/OptionConfig.vue';
|
||||||
import RateConfig from '../AdvancedConfig/RateConfig.vue';
|
import RateConfig from '../AdvancedConfig/RateConfig.vue';
|
||||||
import { defineComponent, ref, inject } from 'vue';
|
import { defineComponent, ref, computed, inject } from 'vue';
|
||||||
import ExtraIcon from '@/materials/questions/components/ExtraIcon.vue';
|
import ExtraIcon from '@/materials/questions/components/ExtraIcon.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -45,6 +45,28 @@ export default defineComponent({
|
|||||||
const openRateConfig = () => {
|
const openRateConfig = () => {
|
||||||
rateConfigVisible.value = true;
|
rateConfigVisible.value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isNps = computed(() => {
|
||||||
|
return moduleConfig.value.type === 'radio-nps';
|
||||||
|
});
|
||||||
|
|
||||||
|
const min = computed(() => {
|
||||||
|
const { min, starMin } = moduleConfig.value;
|
||||||
|
return isNps.value ? min : starMin;
|
||||||
|
});
|
||||||
|
|
||||||
|
const max = computed(() => {
|
||||||
|
const { max, starMax } = moduleConfig.value;
|
||||||
|
return isNps.value ? max : starMax;
|
||||||
|
});
|
||||||
|
|
||||||
|
const explain = computed(() => {
|
||||||
|
const { type } = moduleConfig.value;
|
||||||
|
if (type == 'radio-start') return true;
|
||||||
|
if (isNps.value) return false;
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
addOther,
|
addOther,
|
||||||
optionConfigVisible,
|
optionConfigVisible,
|
||||||
@ -54,10 +76,22 @@ export default defineComponent({
|
|||||||
handleChange,
|
handleChange,
|
||||||
moduleConfig,
|
moduleConfig,
|
||||||
rateConfigVisible,
|
rateConfigVisible,
|
||||||
|
min,
|
||||||
|
max,
|
||||||
|
isNps,
|
||||||
|
explain,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
const { showOthers, hasAdvancedConfig, hasAdvancedRateConfig } = this;
|
const {
|
||||||
|
showOthers,
|
||||||
|
hasAdvancedConfig,
|
||||||
|
hasAdvancedRateConfig,
|
||||||
|
min,
|
||||||
|
max,
|
||||||
|
explain,
|
||||||
|
isNps,
|
||||||
|
} = this;
|
||||||
return (
|
return (
|
||||||
<div class="option-edit-bar-wrap">
|
<div class="option-edit-bar-wrap">
|
||||||
<div class="option-edit-bar">
|
<div class="option-edit-bar">
|
||||||
@ -100,16 +134,17 @@ export default defineComponent({
|
|||||||
)}
|
)}
|
||||||
{this.rateConfigVisible && (
|
{this.rateConfigVisible && (
|
||||||
<RateConfig
|
<RateConfig
|
||||||
min={this.moduleConfig.starMin}
|
min={min}
|
||||||
max={this.moduleConfig.starMax}
|
max={max}
|
||||||
rangeConfig={this.moduleConfig.rangeConfig}
|
rangeConfig={this.moduleConfig.rangeConfig}
|
||||||
visible={this.rateConfigVisible}
|
visible={this.rateConfigVisible}
|
||||||
onVisibleChange={(val) => {
|
onVisibleChange={(val) => {
|
||||||
this.rateConfigVisible = val;
|
this.rateConfigVisible = val;
|
||||||
}}
|
}}
|
||||||
explain={true}
|
explain={explain}
|
||||||
dialogWidth="800px"
|
dialogWidth="800px"
|
||||||
onConfirm={this.handleChange}
|
onConfirm={this.handleChange}
|
||||||
|
class={[isNps ? 'nps-rate-config' : '']}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@ -147,6 +182,17 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.nps-rate-config {
|
||||||
|
::v-deep .row {
|
||||||
|
height: 47px;
|
||||||
|
}
|
||||||
|
::v-deep .text {
|
||||||
|
input {
|
||||||
|
height: 32px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.pop-title {
|
.pop-title {
|
||||||
font-family: PingFangSC-Medium;
|
font-family: PingFangSC-Medium;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
148
web/src/materials/questions/widgets/NpsModule/index.vue
Normal file
148
web/src/materials/questions/widgets/NpsModule/index.vue
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
<template>
|
||||||
|
<div class="nps-wrapper-main">
|
||||||
|
<div class="nps-row-msg">
|
||||||
|
<div class="nps-msg left">{{ minMsg }}</div>
|
||||||
|
<div class="nps-msg right">{{ maxMsg }}</div>
|
||||||
|
</div>
|
||||||
|
<BaseRate
|
||||||
|
:name="props.field"
|
||||||
|
:min="props.min"
|
||||||
|
:max="props.max"
|
||||||
|
:readonly="props.readonly"
|
||||||
|
:value="indexValue"
|
||||||
|
iconClass="number"
|
||||||
|
@change="confirmNps"
|
||||||
|
/>
|
||||||
|
<QuestionWithRule
|
||||||
|
v-if="isShowInput"
|
||||||
|
:showTitle="false"
|
||||||
|
:moduleConfig="moduleConfig"
|
||||||
|
@change="onMoreDataChange"
|
||||||
|
></QuestionWithRule>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import { defineProps, defineEmits, computed } from 'vue';
|
||||||
|
import QuestionWithRule from '@/materials/questions/widgets/QuestionRuleContainer';
|
||||||
|
import BaseRate from '../BaseRate';
|
||||||
|
const props = defineProps({
|
||||||
|
field: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
value: {
|
||||||
|
type: [String, Number],
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
min: {
|
||||||
|
type: Number,
|
||||||
|
default: 1,
|
||||||
|
},
|
||||||
|
max: {
|
||||||
|
type: Number,
|
||||||
|
default: 10,
|
||||||
|
},
|
||||||
|
minMsg: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
maxMsg: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
readonly: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
|
rangeConfig: {
|
||||||
|
type: Object,
|
||||||
|
default: () => {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const emit = defineEmits(['change']);
|
||||||
|
|
||||||
|
const rating = computed({
|
||||||
|
get() {
|
||||||
|
return props.value;
|
||||||
|
},
|
||||||
|
set(val) {
|
||||||
|
const key = props.field;
|
||||||
|
emit('change', {
|
||||||
|
key,
|
||||||
|
value: val,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const confirmNps = (num) => {
|
||||||
|
if (props.readonly) return;
|
||||||
|
rating.value = num + '';
|
||||||
|
};
|
||||||
|
|
||||||
|
const minMsg = computed(() => {
|
||||||
|
return props.minMsg || '极不满意';
|
||||||
|
});
|
||||||
|
|
||||||
|
const maxMsg = computed(() => {
|
||||||
|
return props.maxMsg || '十分满意';
|
||||||
|
});
|
||||||
|
|
||||||
|
const indexValue = computed(() => {
|
||||||
|
return props.value !== '' ? props.value : -1;
|
||||||
|
});
|
||||||
|
const currentRangeConfig = computed(() => {
|
||||||
|
return props.rangeConfig[rating.value];
|
||||||
|
});
|
||||||
|
const isShowInput = computed(() => {
|
||||||
|
return currentRangeConfig.value?.isShowInput;
|
||||||
|
});
|
||||||
|
const moduleConfig = computed(() => {
|
||||||
|
return {
|
||||||
|
type: 'selectMoreModule',
|
||||||
|
field: `${props.field}_${rating.value}`,
|
||||||
|
placeholder: props.rangeConfig[rating.value]?.text,
|
||||||
|
value: props.rangeConfig[rating.value]?.othersValue || '',
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const onMoreDataChange = (data) => {
|
||||||
|
const { key, value } = data;
|
||||||
|
emit('change', {
|
||||||
|
key,
|
||||||
|
value,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss" rel="stylesheet/scss" scoped>
|
||||||
|
.nps-wrapper-main {
|
||||||
|
.nps-row-msg {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
margin-bottom: 0.2rem;
|
||||||
|
.nps-msg {
|
||||||
|
flex: 1;
|
||||||
|
font-size: 0.22rem;
|
||||||
|
color: #92949d;
|
||||||
|
&.left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
&.right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
::v-deep .star-wrapper-main {
|
||||||
|
.star-item {
|
||||||
|
&:hover {
|
||||||
|
background-color: $primary-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&:has(.star-item:hover) .star-item:not(:hover, :hover ~ *) {
|
||||||
|
background-color: $primary-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
95
web/src/materials/questions/widgets/NpsModule/meta.js
Normal file
95
web/src/materials/questions/widgets/NpsModule/meta.js
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import basicConfig from '../../common/config/basicConfig';
|
||||||
|
import { Message } from 'element-ui';
|
||||||
|
|
||||||
|
const meta = {
|
||||||
|
title: '评分',
|
||||||
|
questExtra: ['listenMerge'],
|
||||||
|
type: 'radio-nps',
|
||||||
|
componentName: 'NpsModule',
|
||||||
|
formConfig: [
|
||||||
|
basicConfig,
|
||||||
|
{
|
||||||
|
name: 'min',
|
||||||
|
label: 'NPS量表最小值',
|
||||||
|
labelStyle: {
|
||||||
|
'font-weight': 'bold',
|
||||||
|
},
|
||||||
|
contentClass: 'nps-select-config',
|
||||||
|
key: 'min',
|
||||||
|
type: 'Select',
|
||||||
|
options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((v) => ({
|
||||||
|
value: v,
|
||||||
|
label: v,
|
||||||
|
})),
|
||||||
|
valueSetter: (val, moduleConfig) => {
|
||||||
|
if (moduleConfig['max'] && val >= moduleConfig['max']) {
|
||||||
|
Message({
|
||||||
|
type: 'info',
|
||||||
|
message: '最小值不可大于最大值',
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'max',
|
||||||
|
label: 'NPS量表最大值',
|
||||||
|
labelStyle: {
|
||||||
|
'font-weight': 'bold',
|
||||||
|
},
|
||||||
|
key: 'max',
|
||||||
|
type: 'Select',
|
||||||
|
contentClass: 'nps-select-config',
|
||||||
|
options: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map((v) => ({
|
||||||
|
value: v,
|
||||||
|
label: v,
|
||||||
|
})),
|
||||||
|
valueSetter: (val, moduleConfig) => {
|
||||||
|
if (moduleConfig['min'] && val <= moduleConfig['min']) {
|
||||||
|
Message({
|
||||||
|
type: 'info',
|
||||||
|
message: '最大值不可小于最小值',
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'npsMsg',
|
||||||
|
label: 'NPS两级文案',
|
||||||
|
labelStyle: {
|
||||||
|
'font-weight': 'bold',
|
||||||
|
},
|
||||||
|
contentClass: 'nps-customed-config',
|
||||||
|
type: 'Customed',
|
||||||
|
content: [
|
||||||
|
{
|
||||||
|
label: '最小值文案',
|
||||||
|
type: 'Input',
|
||||||
|
key: 'minMsg',
|
||||||
|
direction: 'horizon',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '最大值文案',
|
||||||
|
type: 'Input',
|
||||||
|
key: 'maxMsg',
|
||||||
|
direction: 'horizon',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
editConfigure: {
|
||||||
|
optionEdit: {
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
optionEditBar: {
|
||||||
|
show: true,
|
||||||
|
configure: {
|
||||||
|
showOthers: false,
|
||||||
|
showAdvancedRateConfig: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default meta;
|
@ -9,6 +9,7 @@
|
|||||||
@change="changeData"
|
@change="changeData"
|
||||||
popper-class="option-list-width"
|
popper-class="option-list-width"
|
||||||
:disabled="formConfig.disabled"
|
:disabled="formConfig.disabled"
|
||||||
|
:class="formConfig.contentClass"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in options"
|
v-for="item in options"
|
||||||
@ -34,6 +35,10 @@ export default {
|
|||||||
type: Object,
|
type: Object,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
moduleConfig: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
formConfig: {
|
formConfig: {
|
||||||
@ -57,8 +62,14 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
changeData(value) {
|
changeData(value) {
|
||||||
const key = this.formConfig.key;
|
const { key, valueSetter } = this.formConfig;
|
||||||
|
if (valueSetter && typeof valueSetter == 'function') {
|
||||||
|
let status = valueSetter(value, this.moduleConfig);
|
||||||
|
if (status) {
|
||||||
|
this.validValue = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
this.$emit(FORM_CHANGE_EVENT_KEY, {
|
this.$emit(FORM_CHANGE_EVENT_KEY, {
|
||||||
key,
|
key,
|
||||||
value,
|
value,
|
||||||
@ -71,7 +82,9 @@ export default {
|
|||||||
.option-list-width {
|
.option-list-width {
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
}
|
}
|
||||||
|
.nps-select-config {
|
||||||
|
width: 312px;
|
||||||
|
}
|
||||||
.select-option-quote,
|
.select-option-quote,
|
||||||
.originType {
|
.originType {
|
||||||
font-family: PingFangSC-Regular;
|
font-family: PingFangSC-Regular;
|
||||||
|
@ -34,6 +34,7 @@ const checkBoxTipSame = '请选择#min#项,少选择了#less#项';
|
|||||||
const textRangeMinTip = '至少输入#min#字';
|
const textRangeMinTip = '至少输入#min#字';
|
||||||
const numberRangeMinTip = '数字最小为#min#';
|
const numberRangeMinTip = '数字最小为#min#';
|
||||||
const numberRangeMaxTip = '数字最大为#max#';
|
const numberRangeMaxTip = '数字最大为#max#';
|
||||||
|
const radioType = ['radio-star', 'radio-nps'];
|
||||||
|
|
||||||
// 多选题的选项数目限制
|
// 多选题的选项数目限制
|
||||||
export function optionValidator(value, minNum, maxNum) {
|
export function optionValidator(value, minNum, maxNum) {
|
||||||
@ -198,7 +199,7 @@ const generateOthersKeyMap = (question) => {
|
|||||||
const { type, field, options, rangeConfig } = question;
|
const { type, field, options, rangeConfig } = question;
|
||||||
let othersKeyMap = undefined;
|
let othersKeyMap = undefined;
|
||||||
|
|
||||||
if (['radio-star'].includes(type)) {
|
if (radioType.includes(type)) {
|
||||||
othersKeyMap = {};
|
othersKeyMap = {};
|
||||||
for (const key in rangeConfig) {
|
for (const key in rangeConfig) {
|
||||||
if (rangeConfig[key].isShowInput) {
|
if (rangeConfig[key].isShowInput) {
|
||||||
@ -257,7 +258,7 @@ export default function (questionConfig) {
|
|||||||
|
|
||||||
// 对于选择题支持填写更多信息的,需要做是否必填的校验
|
// 对于选择题支持填写更多信息的,需要做是否必填的校验
|
||||||
if (_keys(othersKeyMap).length) {
|
if (_keys(othersKeyMap).length) {
|
||||||
if (['radio-star'].includes(type)) {
|
if (radioType.includes(type)) {
|
||||||
if (rangeConfig) {
|
if (rangeConfig) {
|
||||||
for (const key in rangeConfig) {
|
for (const key in rangeConfig) {
|
||||||
if (rangeConfig[key].isShowInput && rangeConfig[key].required) {
|
if (rangeConfig[key].isShowInput && rangeConfig[key].required) {
|
||||||
@ -275,7 +276,6 @@ export default function (questionConfig) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Object.assign(validMap, pre);
|
return Object.assign(validMap, pre);
|
||||||
}, {});
|
}, {});
|
||||||
return { rules };
|
return { rules };
|
||||||
|
Loading…
Reference in New Issue
Block a user