Browse Source

test: 提交交付物选择检查人样式修改

project
song 4 years ago
parent
commit
b8d5aeb4e2
  1. 3
      CHANGELOG.md
  2. 6
      rest/project.http
  3. 84
      src/components/ChooseChecker/ChooseChecker.vue
  4. 342
      src/components/ld-select/ld-select.vue
  5. 2
      src/plugins/p-delivery-history/p-delivery-history.vue
  6. 28
      src/plugins/p-upload-deliverable/p-upload-deliverable.vue

3
CHANGELOG.md

@ -1,4 +1,4 @@
# 0.1.0 (2021-09-01)
# 0.1.0 (2021-09-02)
### 🌟 新功能
范围|描述|commitId
@ -107,6 +107,7 @@
- | 上下滚动时间轴 | [d533a01](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/d533a01)
- | 下拉加载定期任务传参,时间格式化修改 | [0b95a0e](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/0b95a0e)
- | 交付物+考勤管理 | [7020c78](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/7020c78)
- | 交付物显示样式修改 | [be2f3cd](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/be2f3cd)
- | 任务开始时间延迟插件 | [992a313](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/992a313)
- | 修改main | [749ae9a](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/749ae9a)
- | 修改定期任务状态0和4时不加载圆圈 | [30e352f](https://dd.tall.wiki/gitea/wally/tall-mui-3-project/commits/30e352f)

6
rest/project.http

@ -1,7 +1,7 @@
### login
# @name login
POST https://test.tall.wiki/gateway/tall/v1.0/users/signin
POST https://www.tall.wiki/gateway/tall/v1.0/users/signin
content-type: application/json;charset=utf-8
{
@ -18,7 +18,7 @@ content-type: application/json;charset=utf-8
### 导入插件
# POST http://127.0.0.1:7220/plugin/import
POST http://test.tall.wiki/gateway/pluginshop/plugin/import
POST http://www.tall.wiki/gateway/pluginshop/plugin/import
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer {{login.response.body.$.data.token}}
@ -34,6 +34,6 @@ Content-Type: xlsx
### 更新redis内的插件信息
POST http://test.tall.wiki/gateway/pluginshop/plugin/updatePluginOfRedis
POST http://www.tall.wiki/gateway/pluginshop/plugin/updatePluginOfRedis
content-type: application/json;charset=utf-8
Authorization: Bearer {{login.response.body.$.data.token}}

84
src/components/ChooseChecker/ChooseChecker.vue

@ -0,0 +1,84 @@
<template>
<view class="my-3" v-if="allMembers && allMembers.length">
<view class="flex justify-between">
<view class="flex flex-wrap text-center items-center">
<u-tag
:type="member.checked ? 'primary' : 'info'"
v-for="(member, index) in topMembers"
:key="member.memberId"
class="mb-2 mr-3"
style="width: 60px"
:text="member.name"
:closeable="false"
@click="tagClick(index, member, 'topMembers')"
/>
<span class="ml-2" @click="show = !show">...</span>
</view>
</view>
<!-- 折叠起来的 -->
<view class="flex flex-wrap text-center items-center" v-if="show">
<u-tag
:type="member.checked ? 'primary' : 'info'"
v-for="(member, index) in bottomMembers"
:key="member.memberId"
class="mb-2 mr-3"
style="width: 60px"
:text="member.name"
:closeable="false"
@click="tagClick(index, member, 'bottomMembers')"
/>
</view>
</view>
</template>
<script>
import { mapState } from 'vuex';
export default {
props: {
checkerList: {
default: () => [],
type: Array,
},
},
data() {
return { allMembers: [], show: false, topMembers: [], bottomMembers: [] };
},
computed: mapState('role', ['members']),
mounted() {
if (this.members && this.members.length) {
this.allMembers = this.members;
// TODO:
this.allMembers.forEach(item => {
item.checked = false;
});
this.topMembers = this.members.slice(0, 3);
this.bottomMembers = this.members.slice(3);
}
},
methods: {
tagClick(index, item, membersType) {
//
const arr = this.$u.deepClone(this[membersType]);
arr[index].checked = !arr[index].checked;
this[membersType] = [...arr];
// idcheckerList
this.$emit('setCheckerList', arr[index].checked, item);
},
//
clearChecked() {
for (let i = 0; i < this.topMembers.length; i++) {
this.topMembers[i].checked = false;
}
for (let i = 0; i < this.bottomMembers.length; i++) {
this.bottomMembers[i].checked = false;
}
},
},
};
</script>

342
src/components/ld-select/ld-select.vue

@ -1,342 +0,0 @@
<template>
<view class="main">
<view :style="disabled ? 'background-color:#f5f7fa' : ''" class="input">
<input
:placeholder="placeholder"
:style="disabled ? 'color:#c0c4cc' : ''"
@click="showModal"
class="text-sm"
disabled
v-model="_value"
/>
<u-icon @click="empty" color="#C0C4CC" name="close-circle-fill" size="32" v-if="clearable && !disabled && showClearable"></u-icon>
</view>
<view :class="isShowModal ? 'show' : ''" @tap="hideModal" class="select-modal">
<view :style="{ backgroundColor: bgColor }" @tap.stop class="select-dialog">
<view class="select-bar bg-white">
<view @tap="cancelClick" class="action text-gray">{{ cancelText }}</view>
<view @tap="confirmClick" class="action text-blue">{{ confirmText }}</view>
</view>
<view class="select-content">
<view
:key="index"
:style="valueIndexOf(item) ? 'color:' + selectColor + ';background-color:' + selectBgColor + ';' : 'color:' + color + ';'"
@click="select(item)"
class="select-item"
v-for="(item, index) in list"
>
<view class="title">{{ getLabelKeyValue(item) }}</view>
<u-icon name="checkbox-mark" v-if="valueIndexOf(item)"></u-icon>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return { isShowModal: false, showClearable: false };
},
props: {
value: {
type: [Number, String, Array, Object],
default: null,
},
placeholder: {
//
default: '',
type: String,
},
multiple: {
//
default: false,
type: Boolean,
},
list: {
default: () => [],
type: Array,
},
valueKey: {
// listvalueKey
default: 'value',
type: String,
},
labelKey: {
// listlabelKey
default: 'label',
type: String,
},
disabled: {
default: false,
type: Boolean,
},
clearable: {
default: false,
type: Boolean,
},
cancelText: {
default: '取消',
type: String,
},
confirmText: {
default: '确定',
type: String,
},
color: {
default: '#000000',
type: String,
},
selectColor: {
default: '#0081ff',
type: String,
},
bgColor: {
default: '#F1F1F1',
type: String,
},
selectBgColor: {
default: '#FFFFFF',
type: String,
},
},
computed: {
_value: {
get() {
return this.get_value(this.value);
},
set(val) {
this.$emit('change', val);
},
},
},
created() {},
methods: {
get_value(val) {
// ,
if (val || val === 0) {
if (Array.isArray(val)) {
if (val.length > 0) {
this.showClearable = true;
} else {
this.showClearable = false;
}
let chooseAttr = [];
val.forEach(item => {
let choose = this.list.find(temp => {
let val_val = this.getValueKeyValue(temp);
return item === val_val;
});
chooseAttr.push(choose);
});
let values = chooseAttr.map(temp => this.getLabelKeyValue(temp)).join(',');
return values;
} else {
let choose = this.list.find(temp => {
let val_val = this.getValueKeyValue(temp);
return val === val_val;
});
return this.getLabelKeyValue(choose);
}
} else {
console.log('val2', val);
return '';
}
},
select(item) {
//
let val = this.getValueKeyValue(item);
if (this.multiple) {
let _value = this.value;
let index = _value.indexOf(val);
if (index != -1) {
_value.splice(index, 1);
this.$emit('change', _value);
} else {
_value.push(val);
this.$emit('change', _value);
}
} else {
this.$emit('change', val);
this.hideModal();
}
},
valueIndexOf(item) {
let val = this.getValueKeyValue(item);
if (Array.isArray(this.value)) {
return this.value.indexOf(val) != -1;
} else {
return this.value === val;
}
},
getLabelKeyValue(item) {
// label
return item[this.labelKey];
},
getValueKeyValue(item) {
// value
return item[this.valueKey];
},
empty() {
//
if (this.multiple) {
this.$emit('change', []);
} else {
this.$emit('change', '');
}
},
cancelClick() {
//
this.$emit('cancel', this._value);
this.hideModal();
},
confirmClick() {
//
this.$emit('confirm', this._value);
this.hideModal();
},
showModal() {
// model
if (!this.disabled) {
this.isShowModal = true;
}
},
hideModal() {
// model
this.isShowModal = false;
},
},
};
</script>
<style>
@font-face {
font-family: 'selectIcon';
src: url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.eot?t=1590375117208'); /* IE9 */
src: url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.eot?t=1590375117208#iefix') format('embedded-opentype'),
/* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ url('//at.alicdn.com/t/font_1833441_ycfzdhg2u3.svg?t=1590375117208#selectIcon')
format('svg'); /* iOS 4.1- */
}
.selectIcon {
font-family: 'selectIcon' !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icongou:before {
content: '\e61c';
}
.iconcross:before {
content: '\e61a';
}
</style>
<style lang="scss" scoped>
.main {
font-size: 30rpx;
}
.bg-white {
background-color: #ffffff;
}
.text-blue {
color: #0081ff;
}
.text-green {
color: #39b54a;
}
.input {
display: flex;
align-items: center;
font-size: 28rpx;
height: 60rpx;
padding: 10rpx 20rpx;
border-radius: 8rpx;
border-style: solid;
border-width: 1rpx;
border-color: rgb(220, 223, 230);
input {
flex: 1;
}
}
.select-modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 9999;
opacity: 0;
outline: 0;
text-align: center;
-ms-transform: scale(1.185);
transform: scale(1.185);
backface-visibility: hidden;
perspective: 2000rpx;
background: rgba(0, 0, 0, 0.6);
transition: all 0.3s ease-in-out 0s;
pointer-events: none;
margin-bottom: -1000rpx;
&::before {
content: '\200B';
display: inline-block;
height: 100%;
vertical-align: bottom;
}
.select-dialog {
position: relative;
display: inline-block;
margin-left: auto;
margin-right: auto;
background-color: #f8f8f8;
overflow: hidden;
width: 100%;
border-radius: 0;
.select-content {
// background-color: #F1F1F1;
max-height: 420rpx;
overflow: auto;
.select-item {
padding: 20rpx;
display: flex;
.title {
flex: 1;
}
}
}
}
}
.select-modal.show {
opacity: 1;
transition-duration: 0.3s;
-ms-transform: scale(1);
transform: scale(1);
overflow-x: hidden;
overflow-y: auto;
pointer-events: auto;
margin-bottom: 0;
}
.select-bar {
padding: 0 20rpx;
display: flex;
position: relative;
align-items: center;
min-height: 80rpx;
justify-content: space-between;
.action {
display: flex;
align-items: center;
height: 100%;
justify-content: center;
max-width: 100%;
}
}
.uni-input-input,
.uni-input-placeholder {
color: #c0c4cc;
font-size: 28rpx;
}
</style>

2
src/plugins/p-delivery-history/p-delivery-history.vue

@ -12,7 +12,7 @@
<a :href="list.content" class="text-blue-500" target="_blank" v-if="CheckUrl(list.content)">{{ list.content }}</a>
<span v-else>{{ list.content }}</span>
</view>
<view :key="checker.checkerId" v-for="checker in list.checkerList">
<view :key="checker.checkerId" v-for="checker in list.checkerList" class="mb-2">
<view class="flex justify-between">
<view class="font-bold">
{{ checker.checkerName }}

28
src/plugins/p-upload-deliverable/p-upload-deliverable.vue

@ -3,17 +3,8 @@
<view class="py-2">
<u-input :auto-height="autoHeight" :border="border" :height="height" :type="type" v-model="content" width="100" />
<ld-select
:list="checkers"
:multiple="true"
@change="selectChange2"
class="my-3"
clearable
label-key="label"
placeholder="选择检查人"
v-model="checkerList"
value-key="value"
></ld-select>
<!-- 选择检查人 -->
<ChooseChecker ref="checker" :checkerList="checkerList" @setCheckerList="setCheckerList"></ChooseChecker>
<view class="flex justify-between">
<u-button @click="submit" class="m-0" size="mini" type="primary">提交</u-button>
@ -26,12 +17,12 @@
</template>
<script>
import ldSelect from '@/components/ld-select/ld-select.vue';
import ChooseChecker from '@/components/ChooseChecker/ChooseChecker.vue';
import { mapState, mapGetters } from 'vuex';
export default {
name: 'p-upload-deliverable',
components: { ldSelect },
components: { ChooseChecker },
props: { task: { type: Object, default: null } },
data() {
return {
@ -62,8 +53,14 @@ export default {
},
methods: {
selectChange2(val) {
this.checkerList = val;
//
setCheckerList(checked, item) {
if (checked) {
this.checkerList.push(item.memberId);
} else {
const index = this.checkerList.findIndex(checker => checker === item.memberId);
this.checkerList.splice(index, 1);
}
},
//
@ -84,6 +81,7 @@ export default {
this.$t.ui.showToast('交付物提交成功');
this.content = '';
this.checkerList = [];
this.$refs.checker.clearChecked();
} catch (error) {
console.error('p-upload-deliverable.vue submit error: ', error);
this.$t.ui.showToast('交付物提交失败,请稍后重试');

Loading…
Cancel
Save