客户联调

master
yujialong 3 years ago
parent 44a40dd2d6
commit 4138ce6628
  1. 12
      apis/modules/client.js
  2. 13
      libs/util.js
  3. 11
      pages.json
  4. 135
      pages/addClient/addClient.vue
  5. 110
      pages/clientDetail/clientDetail.vue
  6. 2
      uni_modules/hpy-form-select/changelog.md
  7. 255
      uni_modules/hpy-form-select/components/hpy-form-select/hpy-form-select.vue
  8. 87
      uni_modules/hpy-form-select/package.json
  9. 169
      uni_modules/hpy-form-select/readme.md
  10. 2
      uni_modules/uni-scss/variables.scss

@ -20,3 +20,15 @@ export const queryIndustryClass = (data) => {
export const queryIndustry = (data) => { export const queryIndustry = (data) => {
return get('nakadai/nakadai/hrIndustry/queryIndustry', data) return get('nakadai/nakadai/hrIndustry/queryIndustry', data)
} }
export const queryCustomerIsExists = (data) => {
return get('nakadai/nakadai/customer/queryCustomerIsExists', data)
}
export const addCustomer = (data) => {
return post('nakadai/nakadai/customer/addCustomer', data)
}
export const updateCustomer = (data) => {
return post('nakadai/nakadai/customer/updateCustomer', data)
}

@ -4,5 +4,18 @@ export default {
uni.navigateTo({ uni.navigateTo({
url url
}) })
},
// 成功提示
sucMsg(title) {
uni.showToast({
title
})
},
// 错误提示
errMsg(title) {
uni.showToast({
title,
icon: 'none'
})
} }
} }

@ -85,16 +85,7 @@
"enablePullDownRefresh": false "enablePullDownRefresh": false
} }
} },
,{
"path" : "pages/addClient/addClient",
"style" :
{
"navigationBarTitleText": "新建客户",
"enablePullDownRefresh": false
}
},
{ {
"path" : "pages/ordered/ordered", "path" : "pages/ordered/ordered",
"style" : "style" :

@ -1,135 +0,0 @@
<template>
<view class="container">
<uni-section title="基本信息" type="line">
<view class="form">
<uni-forms ref="baseForm" :modelValue="form" label-width="100">
<uni-forms-item label="客户名称" name="name" required>
<uni-combox :candidates="candidates" placeholder="请选择客户名称" v-model="form.name"></uni-combox>
</uni-forms-item>
<uni-forms-item label="省份">
<uni-easyinput v-model="form.provience" disabled />
</uni-forms-item>
<uni-forms-item label="城市">
<uni-easyinput v-model="form.city" disabled />
</uni-forms-item>
<uni-forms-item label="行业" required>
<uni-data-picker placeholder="请选择班级" popup-title="请选择行业" :localdata="dataTree" v-model="form.industryId"
@change="onchange">
</uni-data-picker>
</uni-forms-item>
<uni-forms-item label="联系人姓名" name="contact" required>
<uni-easyinput v-model="form.contact" placeholder="请输入联系人姓名" />
</uni-forms-item>
<uni-forms-item label="手机" name="contact">
<uni-easyinput v-model="form.contact" placeholder="请输入手机" />
</uni-forms-item>
<uni-forms-item label="账号" name="contact" required>
<uni-easyinput v-model="form.contact" placeholder="请以院校首字母+admin的格式来设置" />
</uni-forms-item>
<uni-forms-item label="职务" name="contact">
<uni-easyinput v-model="form.contact" placeholder="请输入职务" />
</uni-forms-item>
<uni-forms-item label="邮箱" name="contact">
<uni-easyinput v-model="form.contact" placeholder="请输入邮箱" />
</uni-forms-item>
<uni-forms-item label="产品到期时间">
<uni-datetime-picker type="datetime" return-type="timestamp"
v-model="form.datetimesingle" />
</uni-forms-item>
<uni-forms-item label="客户类型">
<uni-easyinput v-model="form.city" disabled />
</uni-forms-item>
</uni-forms>
<button type="primary" @click="submit('valiForm')">提交</button>
</view>
</uni-section>
</view>
</template>
<script>
export default {
data() {
return {
candidates: ['北京', '南京', '东京', '武汉', '天津', '上海', '海口'],
dataTree: [{
text: "一年级",
value: "1-0",
children: [{
text: "1.1班",
value: "1-1"
},
{
text: "1.2班",
value: "1-2"
}
]
},
{
text: "二年级",
value: "2-0",
children: [{
text: "2.1班",
value: "2-1"
},
{
text: "2.2班",
value: "2-2"
}
]
},
{
text: "三年级",
value: "3-0",
disable: true
}
],
form: {
name: '',
provience: '',
city: '',
industryId: '',
age: '',
introduction: '',
sex: 2,
hobby: [5],
datetimesingle: 1627529992399
},
sexs: [{
text: '男',
value: 0
}, {
text: '女',
value: 1
}, {
text: '保密',
value: 2
}],
}
},
onLoad() {
},
methods: {
onchange(e) {
console.log('---------onchange:', e);
},
submit(ref) {
this.$refs[ref].validate().then(res => {
console.log('success', res);
uni.showToast({
title: `校验通过`
})
}).catch(err => {
console.log('err', err);
})
},
}
}
</script>
<style scoped lang="scss">
.form {
padding: 15px;
background-color: #fff;
}
</style>

@ -5,31 +5,30 @@
<view class="name">{{ form.customerName }}</view> <view class="name">{{ form.customerName }}</view>
<view class="text">客户编号2124232</view> <view class="text">客户编号2124232</view>
<view class="text">客户类型{{ customerType }}</view> <view class="text">客户类型{{ customerType }}</view>
<view class="text">产品到期时间{{ form.expireDate }}</view> <view class="text">产品到期时间{{ form.expireDate || '' }}</view>
</view> </view>
</uni-card> </uni-card>
<uni-section title="基本信息" type="line"> <uni-section title="基本信息" type="line">
<view class="form"> <view class="form">
<uni-forms ref="baseForm" :modelValue="form" label-width="100" disabled> <uni-forms ref="form" :modelValue="form" :rules="rules" label-width="100" disabled>
<uni-forms-item label="客户名称" name="name" required> <uni-forms-item label="客户名称" name="schoolId" required>
<uni-easyinput v-if="isDetail" v-model="form.schoolId" disabled /> <uni-easyinput v-if="isDetail" v-model="form.customerName" disabled />
<uni-data-picker v-else placeholder="请选择学校" popup-title="请选择学校" :localdata="schoolList" :map="{text: 'schoolName', value: 'schoolId'}" v-model="form.schoolId"> <hpy-form-select v-else placeholder="请选择学校" :dataList="schoolList" text="schoolName" name="schoolId" v-model="form.schoolId" @change="schoolChange" hideBorder hideArrow/>
</uni-data-picker>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="省份"> <uni-forms-item label="省份">
<uni-easyinput v-model="form.provience" disabled /> <uni-easyinput v-model="form.provinceName" disabled />
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="城市"> <uni-forms-item label="城市">
<uni-easyinput v-model="form.city" disabled /> <uni-easyinput v-model="form.cityName" disabled />
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="行业类型" required> <uni-forms-item label="行业类型" name="industryClassId" required>
<uni-easyinput v-if="isDetail" v-model="form.industryClassId" disabled /> <uni-easyinput v-if="isDetail" v-model="form.industryClassName" disabled />
<uni-data-picker v-else placeholder="请选择行业类型" popup-title="请选择行业类型" preload :clear-icon="false" :localdata="industryClassList" :map="{text: 'industryClassName', value: 'industryClassId'}" v-model="form.industryClassId" @change="industryClassChange"> <uni-data-picker v-else placeholder="请选择行业类型" popup-title="请选择行业类型" preload :clear-icon="false" :localdata="industryClassList" :map="{text: 'industryClassName', value: 'industryClassId'}" v-model="form.industryClassId" @change="industryClassChange">
</uni-data-picker> </uni-data-picker>
</uni-forms-item> </uni-forms-item>
<uni-forms-item label="行业" required> <uni-forms-item label="行业" name="industryId" required>
<uni-easyinput v-if="isDetail" v-model="form.industryId" disabled /> <uni-easyinput v-if="isDetail" v-model="form.industryName" disabled />
<uni-data-picker v-else placeholder="请选择行业" popup-title="请选择行业" preload :clear-icon="false" :localdata="industryList" :map="{text: 'industryName', value: 'industryId'}" v-model="form.industryId" :readonly="form.industryClassId ? false : true"> <uni-data-picker v-else placeholder="请选择行业" popup-title="请选择行业" preload :clear-icon="false" :localdata="industryList" :map="{text: 'industryName', value: 'industryId'}" v-model="form.industryId" :readonly="form.industryClassId ? false : true">
</uni-data-picker> </uni-data-picker>
</uni-forms-item> </uni-forms-item>
@ -55,11 +54,12 @@
<uni-easyinput v-model="customerType" disabled /> <uni-easyinput v-model="customerType" disabled />
</uni-forms-item> </uni-forms-item>
</uni-forms> </uni-forms>
<button v-if="!isDetail" type="primary" @click="submit">提交</button>
</view> </view>
</uni-section> </uni-section>
<view class="action"> <view class="action">
<view class="item" @click="toPage('../addClient/addClient')"> <view class="item" @click="toPage(`../clientDetail/clientDetail?customerId=${customerId}`)">
<uni-icons class="icon" custom-prefix="iconfont" type="icon-edit" size="20" color="#959595"></uni-icons> <uni-icons class="icon" custom-prefix="iconfont" type="icon-edit" size="20" color="#959595"></uni-icons>
<view class="text">编辑</view> <view class="text">编辑</view>
</view> </view>
@ -76,7 +76,7 @@
</template> </template>
<script> <script>
import { queryCustomerDetails, querySchool, queryIndustryClass, queryIndustry } from '@/apis/modules/client.js' import { queryCustomerDetails, querySchool, queryIndustryClass, queryIndustry, queryCustomerIsExists, addCustomer, updateCustomer } from '@/apis/modules/client.js'
export default { export default {
data() { data() {
return { return {
@ -95,25 +95,62 @@
name: '到期', name: '到期',
value: 3 value: 3
}], }],
nameRepeat: false,
schoolList: [], schoolList: [],
industryClassList: [], industryClassList: [],
industryList: [], industryList: [],
form: { form: {
countries: '中国',
customerId: '', customerId: '',
customerName: '', customerName: '',
industryClassId: '', industryClassId: '',
industryId: '', industryId: '',
provinceId: '', provinceId: '',
provinceName: '',
account: '', account: '',
name: '', name: '',
phone: '', phone: '',
position: '', position: '',
cityId: '', cityId: '',
cityName: '',
customerType: '', customerType: '',
expireDate: '', expireDate: '',
email: '', email: '',
schoolId: '' schoolId: ''
}, },
//
rules: {
schoolId: {
rules: [{
required: true,
errorMessage: '请选择客户'
}]
},
industryClassId: {
rules: [{
required: true,
errorMessage: '请选择行业类型'
}]
},
industryId: {
rules: [{
required: true,
errorMessage: '请选择行业'
}]
},
name: {
rules: [{
required: true,
errorMessage: '联系人姓名不能为空'
}]
},
account: {
rules: [{
required: true,
errorMessage: '账号不能为空'
}]
},
},
customerType: '', customerType: '',
} }
}, },
@ -146,6 +183,25 @@
this.schoolList = list this.schoolList = list
}).catch(res => {}) }).catch(res => {})
}, },
//
schoolChange() {
const { form } = this
const { schoolId } = form
console.log(33, form)
const school = this.schoolList.find(e => e.schoolId === schoolId)
form.customerName = school.schoolName
form.provinceId = school.provinceId
form.provinceName = school.provinceName
form.cityId = school.cityId
form.cityName = school.cityName
queryCustomerIsExists({
schoolId
}).then(res => {
this.nameRepeat = false
}).catch(res => {
this.nameRepeat = true
})
},
// //
getIndustryClass() { getIndustryClass() {
queryIndustryClass().then(({ list }) => { queryIndustryClass().then(({ list }) => {
@ -154,7 +210,6 @@
}, },
// //
industryClassChange() { industryClassChange() {
console.log(this.form.industryClassId)
this.getIndustry() this.getIndustry()
}, },
// //
@ -168,7 +223,30 @@
// //
toPage(path) { toPage(path) {
this.$util.to(path) this.$util.to(path)
} },
//
submit(ref) {
this.$refs.form.validate().then(res => {
if (this.nameRepeat) return this.$util.errMsg('客户已存在!')
if (this.customerId) {
updateCustomer(this.form).then(res => {
this.$util.sucMsg('编辑成功')
setTimeout(() => {
this.$util.to('../clients/clients')
}, 1500)
}).catch(res => {})
} else {
addCustomer(this.form).then(res => {
this.$util.sucMsg('添加成功')
setTimeout(() => {
uni.navigateBack()
}, 1500)
}).catch(res => {})
}
}).catch(err => {
console.log('err', err);
})
},
} }
} }
</script> </script>

@ -0,0 +1,2 @@
## 0.0.10(2022-04-26)
- 适配uni-forms校验

@ -0,0 +1,255 @@
<template>
<view>
<picker :mode="mode" @change="chagne" :value="selectValue"
:range="range" :range-key="text" :start="start" :end="end" :fields="fields" :custom-item="customItem" :disabled="disabled">
<block v-if="islot">
<slot />
</block>
<block v-else>
<view class="select-picker" :class="hideBorder?'':'select-picker-border'">
<text class="placeholder" :class="selectValue === ''?'default':''">{{selectText}}</text>
<view class="select-picker-arrow-area" v-if="!hideArrow">
<view class="select-picker-arrow"></view>
</view>
</view>
</block>
</picker>
</view>
</template>
<script>
export default {
name:"hpy-form-select",
props:{
// 使
islot:{
type: [Boolean, String],
default: false
},
//
title:{
type: String,
default:'请选择'
},
// selector multiSelector
mode:{
type: String,
default: 'selector'
},
// "YYYY-MM-DD"
start:{
type: String,
default: ''
},
// "YYYY-MM-DD"
end:{
type: String,
default: ''
},
// yearmonthday dayApp 使 UI
fields:{
type: String,
default: 'day'
},
//
customItem:{
type: String,
default: ''
},
//
dataList:{
type:Array,
default:function(){
return []
}
},
// key
text:{
type:String,
default: ''
},
// key
name:{
type:String,
default: ''
},
//
value: {
type: [String, Number],
default () {
return '';
}
},
// TODO vue3
modelValue: {
type: [String, Number],
default() {
return '';
}
},
//
disabled:{
type: [Boolean, String],
default: false
},
//
hideBorder: {
type: [Boolean, String],
default: false
},
//
hideArrow:{
type: [Boolean, String],
default: false
}
},
data() {
return {
range: [],
selectValue:''
};
},
created() {
if (this.dataList && this.dataList.length !== 0) {
this.range = this.getDataList(this.dataList);
}
this.form = this.getForm('uniForms')
this.formItem = this.getForm('uniFormsItem')
if (this.formItem) {
if (this.formItem.name) {
this.rename = this.formItem.name
this.form.inputChildrens.push(this)
}
}
},
watch:{
dataList: {
handler(newVal) {
this.range = this.getDataList(newVal);
},
deep: true
},
value:{
handler(newVal) {
this.initSelected(newVal);
},
immediate: true
},
modelValue(newVal) {
this.initSelected(newVal);
}
},
computed:{
dataValue(){
if(this.value === '')return this.modelValue
if(this.modelValue === '') return this.value
return this.value
},
selectText(){
if(this.selectValue === ''){
return this.title;
}
if('date' == this.mode || 'time' == this.mode){
return this.selectValue;
}else{
if(!this.dataList || this.dataList.length == 0){
return this.title;
}
if(this.text){
return this.dataList[this.selectValue][this.text];
}
return this.dataList[this.selectValue];
}
}
},
methods:{
getForm(name = 'uniForms') {
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;
},
/**
* 获取渲染的新数组
*/
getDataList(value) {
//
let dataList = JSON.parse(JSON.stringify(value));
this.initSelected(this.dataValue);
return dataList;
},
//
initSelected(value){
if(!value){
this.selectValue = '';
return false;
}
if('date' == this.mode || 'time' == this.mode){
this.selectValue = value;
}else{
if(this.dataList.length > 0){
if(this.name){
this.dataList.some((item, index) => {
if(item[this.name] == value){
this.selectValue = index;
return true;
}
});
}else{
this.dataList.some((item, index) => {
if(item == value){
this.selectValue = index;
return true;
}
});
}
}
}
},
//
chagne(e){
const val = e.detail.value;
this.selectValue = val;
var inputVal = '', changeVal = '';
if('date' == this.mode || 'time' == this.mode){
inputVal = val;
changeVal = val;
}else{
if(this.dataList && this.dataList.length > 0){
let data = this.dataList[val];
if(this.name){
inputVal = data[this.name];
}else{
inputVal = data;
}
changeVal = {'index':val, 'value':inputVal, 'data':data};
}else{
this.selectValue = '';
changeVal = {'index':-1, 'value':inputVal, 'data':{}};
}
}
if (this.formItem) {
this.formItem.setValue(inputVal);
}
// TODO vue2
this.$emit('input', inputVal);
// // TOTO vue3
this.$emit('update:modelValue', inputVal);
this.$emit('change', changeVal);
}
}
}
</script>
<style lang="scss" scoped>
.select-picker {/* #ifndef APP-NVUE */display: flex;/* #endif */flex-direction: row;align-items: center;flex-wrap: nowrap;font-size: 14px;line-height: 38px;padding: 0 5px;overflow: hidden;/* #ifdef APP-NVUE */height: 40px;/* #endif */text-indent:4px;}
.select-picker-border{border: 1px solid #e5e5e5;border-radius: 5px;}
.is-input-error-border .select-picker-border{border-color: $uni-color-error;}
.select-picker-arrow-area {position: relative;width: 20px;/* #ifndef APP-NVUE */margin-left: auto;display: flex;/* #endif */justify-content: center;transform: rotate(-45deg);transform-origin: center;}
.select-picker-arrow{width:7px;height:7px;border-left:1px solid #999;border-bottom:1px solid #999}
.placeholder.default{color: grey;text-indent: 0px;}
</style>

@ -0,0 +1,87 @@
{
"id": "hpy-form-select",
"displayName": "picker选择器、下拉框,选择器",
"version": "0.0.10",
"description": "下拉选择器 基于 picker 简单封装",
"keywords": [
"picker",
"选择器",
"下拉选择"
],
"repository": "",
"engines": {
"HBuilderX": ""
},
"directories": {
"example": ""
},
"dcloudext": {
"category": [
"前端组件",
"通用组件"
],
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": ""
},
"uni_modules": {
"dependencies": [
"uni-load-more"
],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "y",
"app-nvue": "y"
},
"H5-mobile": {
"Safari": "y",
"Android Browser": "y",
"微信浏览器(Android)": "y",
"QQ浏览器(Android)": "y"
},
"H5-pc": {
"Chrome": "y",
"IE": "y",
"Edge": "y",
"Firefox": "y",
"Safari": "y"
},
"小程序": {
"微信": "y",
"阿里": "u",
"百度": "y",
"字节跳动": "y",
"QQ": "y"
},
"快应用": {
"华为": "y",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "y"
}
}
}
}
}

@ -0,0 +1,169 @@
## hpy-form-select 下拉选择器 基于 [picker](https://uniapp.dcloud.io/component/picker?id=picker) 简单封装
> **组件名:hpy-form-select
从底部弹起的滚动选择器。支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器
## API
### FilePicker Props
<table>
<tr>
<th>属性名</th>
<th>类型</th>
<th>默认值</th>
<th>说明</th>
</tr>
<tr>
<td>islot</td>
<td>Boolean | String</td>
<td>false</td>
<td>是否使用插槽</td>
</tr>
<tr>
<td>title</td>
<td>String</td>
<td>请选择</td>
<td>默认标题</td>
</tr>
<tr>
<td>mode</td>
<td>String</td>
<td>选择模式</td>
<td>selector | multiSelector</td>
</tr>
<tr>
<td>start</td>
<td>String</td>
<td></td>
<td>表示有效日期范围的开始,字符串格式为"YYYY-MM-DD"</td>
</tr>
<tr>
<td>end</td>
<td>String</td>
<td></td>
<td>表示有效日期范围的结束,字符串格式为"YYYY-MM-DD"</td>
</tr>
<tr>
<td>fields</td>
<td>String</td>
<td>day</td>
<td>有效值 year、month、day,表示选择器的粒度,默认为 day,App 端未配置此项时使用系统 UI</td>
</tr>
<tr>
<td>customItem</td>
<td>String</td>
<td></td>
<td>可为每一列的顶部添加一个自定义的项</td>
</tr>
<tr>
<td>dataList</td>
<td>Array</td>
<td></td>
<td>选择器数据</td>
</tr>
<tr>
<td>text</td>
<td>String</td>
<td></td>
<td>显示值的key</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td></td>
<td>保存值的key</td>
</tr>
<tr>
<td>v-model | value</td>
<td>Array | Object</td>
<td></td>
<td>绑定的数据</td>
</tr>
<tr>
<td>disabled</td>
<td>Boolean | String</td>
<td>false</td>
<td>是否禁用</td>
</tr>
<tr>
<td>hideBorder</td>
<td>Boolean | String</td>
<td>false</td>
<td>是否隐藏边框</td>
</tr>
<tr>
<td>hideArrow</td>
<td>Boolean | String</td>
<td>false</td>
<td>是否隐藏箭头</td>
</tr>
</table>
## 使用示例
## dataList 为对象数组时,name为实际保存的value值,text为显示的值
## dataList 为对象数组[{name:'张三', age:'18'}, {name:'李四', age:'19'}]时,需要设置name、text属性,name为实际保存的value值,text为显示的值
## <hpy-form-select :dataList="dataList" text="name" name="age" v-model="formData.age" @change="change" />
## ======================================================================================================
## dataList 为普通数组['张三', '李四'] name、text可不设置
## <hpy-form-select :dataList="dataList" v-model="formData.name" @change="change" />
## 类似:
## <select><option value="name">text</option></select>
```html
<hpy-form-select :dataList="hobbyList" text="text" name="value" v-model="formData.hobbySelect" @change="change" />
<uni-group title="基础信息" margin-top="0">
<uni-forms-item label="姓名" name="name">
<uni-easyinput type="text" v-model="formData.name" placeholder="请输入姓名" />
</uni-forms-item>
<uni-forms-item label="爱好2" name="hobby2">
<hpy-form-select :dataList="hobbyList" text="text" name="value" v-model="formData.hobbySelect"/>
</uni-forms-item>
<uni-forms-item label="爱好3" name="hobby3">
<hpy-form-select :dataList="hobbyList" text="text" name="value" v-model="formData.hobbySelect3" islot="true">
<view class="my-select">可自定义显示</view>
</hpy-form-select>
</uni-forms-item>
<uni-forms-item label="出生时间(年)" name="birthYear" >
<hpy-form-select mode="date" fields="year" v-model="formData.birthYear" />
</uni-forms-item>
</uni-group>
```
```javascript
export default {
data() {
return {
formData:{
hobbySelect:''
},
hobbyList: [{
text: '足球',
value: 1
}, {
text: '篮球',
value: 2
}, {
text: '游泳',
value: 3
}],
}
},
methods:{
change(e){
console.log(e.index);
console.log(e.value);
console.log(e.data);
}
}
}
```

@ -5,7 +5,7 @@ $uni-space-root: 2;
$uni-radius-root:5px; $uni-radius-root:5px;
// 主色 // 主色
$uni-primary: #007eff; $uni-primary: #2979ff;
$uni-primary-disable:mix(#fff,$uni-primary,50%); $uni-primary-disable:mix(#fff,$uni-primary,50%);
$uni-primary-light: mix(#fff,$uni-primary,80%); $uni-primary-light: mix(#fff,$uni-primary,80%);

Loading…
Cancel
Save