手机端调整

rollback
xy 11 months ago
parent d24c9e9bcf
commit 2308dc4fa7

@ -0,0 +1,8 @@
import request from "@/utils/request";
export function statistic(name, params) {
return request({
method: 'get',
url: `/api/oa/flow-statistic/${name}`,
params
})
}

@ -1,20 +1,20 @@
<template>
<div>
<van-popup position="bottom" v-model="isShow">
<div class="van-dropdown-menu">
<div class="van-dropdown-menu__bar van-dropdown-menu__bar--opened">
<div role="button" tabindex="0" class="van-dropdown-menu__item">
<div class="van-dropdown-menu__title" :class="[ showSelectMultiple ? 'van-dropdown-menu__title--active van-dropdown-menu__title--down' : '' ]" @click="selectActive()">
<div class="van-ellipsis">{{ selectName }}</div>
</div>
<div v-if="showSelectMultiple" class="btn_left">
<div v-show="showSelectMultiple" class="btn_left">
<span v-if="!all" @click="toggleAll()"></span>
<span v-if="all" @click="toggleFalseAll()"></span>
</div>
<div v-if="showSelectMultiple" class="btn_true" @click="submitSelect()"></div>
<div v-show="showSelectMultiple" class="btn_true" @click="submitSelect()"></div>
</div>
</div>
</div>
<div v-if="showSelectMultiple" class="van-dropdown-item van-dropdown-item--down" style="top: 40.9531px;">
<div v-if="showSelectMultiple" class="van-dropdown-item van-dropdown-item--down" style="top: 40.9531px;bottom: 39px;">
<div ref="content" class="van-popup van-popup--bottom van-dropdown-item__content">
<van-checkbox-group v-model="checked" res="checkboxGroup" @change="selectDataOptsChange">
@ -29,7 +29,7 @@
</div>
</div>
</div>
</van-popup>
</template>
<script >
import { Checkbox, CheckboxGroup, DropdownMenu, DropdownItem } from 'vant'
@ -88,6 +88,7 @@ export default {
},
data() {
return {
isShow: false,
zIndex: PopupManager.nextZIndex(),
showSelectMultiple: false,
checked: [],
@ -98,6 +99,12 @@ export default {
this.checked = this.checkedList
},
methods: {
show() {
this.isShow = true
},
hide() {
this.isShow = false
},
selectActive() {
if (this.disabled) {
return

@ -0,0 +1,42 @@
<template>
<van-popup position="bottom" v-model="isShow">
<van-picker
show-toolbar
:columns="columns"
value-key="name"
@confirm="onConfirm"
/>
</van-popup>
</template>
<script>
export default {
props: {
columns: {
type: Array,
default: () => [],
required: true
}
},
data() {
return {
isShow: false,
}
},
methods: {
show() {
this.isShow = true
},
hide() {
this.isShow = false
},
onConfirm(e) {
this.$emit('confirm', e)
}
},
computed: {},
}
</script>
<style scoped lang="scss">
</style>

File diff suppressed because it is too large Load Diff

@ -1,34 +0,0 @@
export default function (device) {
return device === 'desktop' ?
new Map([
['text', 'el-input'],
['textarea', 'el-input'],
['date', 'el-date-picker'],
['datetime', 'el-date-picker'],
['select', 'el-select'],
['radio', 'el-radio-group'],
['file', 'el-upload'],
['label', 'div'],
['static', 'el-link'],
['hr', 'el-divider'],
['choice', 'el-select'],
['choices', 'el-select'],
['sign', 'el-image'],
['relation-flow','el-select']
]) :
new Map([
['text', 'van-field'],
['textarea', 'van-field'],
['date', 'van-cell'],
['datetime', 'van-datetime-picker'],
['select', 'van-picker'],
['radio', 'van-radio-group'],
['file', 'el-upload'],
['label', 'van-tag'],
['static', 'el-link'],
['hr', 'van-divide'],
['choice', 'van-picker'],
['choices', 'van-checkbox'],
['sign', 'van-image']
])
}

@ -74,8 +74,7 @@ export default {
form: {},
jointlySignLog: [], // log
datetimeFormat: 'yyyy-MM-dd HH:mm',
copyShortcuts: [
shortcuts: [
{
text: "一年前",
onClick(picker) {
@ -86,55 +85,11 @@ export default {
},
},
{
text: "一前",
text: "一季度前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "months").toDate()
);
},
},
{
text: "一周前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "weeks").toDate()
);
},
},
{
text: "今天",
onClick(picker) {
picker.$emit("pick", new Date());
},
},
{
text: "一周后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "weeks").toDate());
},
},
{
text: "一月后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "months").toDate());
},
},
{
text: "一年后",
onClick(picker) {
picker.$emit("pick", moment().add(1, "years").toDate());
},
},
],
shortcuts: [
{
text: "一年前",
onClick(picker) {
picker.$emit(
"pick",
moment().subtract(1, "years").toDate()
moment().subtract(3, "months").toDate()
);
},
},
@ -174,6 +129,12 @@ export default {
picker.$emit("pick", moment().add(1, "months").toDate());
},
},
{
text: "一季度后",
onClick(picker) {
picker.$emit("pick", moment().add(3, "months").toDate());
},
},
{
text: "一年后",
onClick(picker) {
@ -194,11 +155,22 @@ export default {
}
let subFormName = this.fields.filter(i => i.type === 'relation').map(i => i.name)
for (let i = 0;i < subFormName.length;i++) {
let $subForm = this.$refs[`subForm-${subFormName[i]}`]
if ($subForm) {
const errMap = await this.$refs[`subForm-${subFormName[i]}`].validate(true)
if (errMap) {
throw new Error(errMap)
if (this.device === 'desktop') {
let $subForm = this.$refs[`subForm-${subFormName[i]}`]
if ($subForm) {
const errMap = await this.$refs[`subForm-${subFormName[i]}`].validate(true)
if (errMap) {
throw new Error(errMap)
}
}
} else {
if (this.form[subFormName[i]] instanceof Array) {
for (let j = 0;j < this.form[subFormName[i]].length;j++) {
let $subForm = this.$refs[`elSubForm-${subFormName[i]}${j}`]
if ($subForm) {
await $subForm.validate()
}
}
}
}
}
@ -207,7 +179,16 @@ export default {
computed: {},
watch: {
originalForm(newVal) {
this.form = deepCopy(newVal);
this.form = deepCopy(newVal)
// let copyForm = deepCopy(newVal);
// for (let key in copyForm) {
// Object.defineProperty(this.form, key, {
// value: copyForm[key],
// enumerable: true,
// writable: this.writeable.indexOf(this.fields.find(field => field.name === key)?.id) !== -1,
// configurable: true
// })
// }
},
scriptContent(newVal) {
if (newVal) {
@ -264,16 +245,19 @@ export default {
_writeable: this.isFirstNode,
});
}
return h("div", [
return h("div", {
class: `form-${this.device}`
},[
h(
"el-form",
{
ref: "elForm",
class: "form",
props: {
size: this.device === 'mobile' ? 'medium' : '',
model: this.form,
"label-position": "right",
"label-width": "130px",
"label-width": this.device === 'mobile' ? "80px" : "130px",
rules: this.rules,
"inline-message": true,
},
@ -323,4 +307,60 @@ export default {
::v-deep .el-radio, .el-radio__input {
line-height: 1.5;
}
.form-mobile {
.form {
grid-template-columns: repeat(1, 1fr);
box-shadow: 0 8px 12px #ebedf0;
background: #fff;
}
::v-deep .el-form-item {
border: none;
position: relative;
&::after {
content: '';
height: 1px;
background: #ebedf0;
position: absolute;
width: 90%;
left: 5%;
bottom: -0.5px;
}
}
::v-deep .el-form-item:nth-child(1) {
border-radius: 6px 6px 0 0;
}
::v-deep .el-form-item:nth-last-child(1) {
border-radius: 0 0 6px 6px;
}
}
</style>
<style lang="scss">
.form-mobile {
.el-input__inner {
border: none;
}
.el-date-picker.has-sidebar {
position: fixed !important;
top: 0 !important;
left: 0!important;
width: 100vw !important;
height: 100vh !important;
margin-top: 0 !important;
}
.el-picker-panel__body-wrapper {
height: calc(100% - 39px);
display: flex;
flex-direction: column;
}
.el-picker-panel__sidebar {
flex: 1;
}
.el-picker-panel__body {
flex: 0;
margin-left: 0 !important;
}
.el-date-picker .el-picker-panel__content {
width: calc(100% - 30px);
}
}
</style>

@ -19,8 +19,8 @@
storage
:padding="false"
:position="$store.getters.device === 'mobile' ? {} : pos">
<div style="max-height: 60vh;overflow-y: scroll;">
<MobileForm
<div :style="$store.getters.device === 'desktop' ? 'max-height: 60vh' : '' ">
<DesktopForm
device="mobile"
ref="mobileForm"
:config="config"
@ -30,8 +30,9 @@
:original-form="form"
:readable="config.customModel ? config.customModel.fields.map(i => i.id) : []"
:writeable="[]"
:needFlowTitle="false"
:logs="config.logs"
></MobileForm>
></DesktopForm>
</div>
</vxe-modal>
</div>
@ -42,12 +43,12 @@ import {
fieldConfig,
view,
} from "@/api/flow";
import MobileForm from "@/views/flow/MobileForm.vue";
import DesktopForm from "@/views/flow/DesktopForm.vue";
import { PopupManager } from 'element-ui/lib/utils/popup'
export default {
components: {
MobileForm
DesktopForm
},
props: {
isShow: {

@ -57,7 +57,7 @@
<el-checkbox-group v-model="form.user_id" @change="handleCheckedUsersChange">
<div v-for="group in pickUsers" :key="group.id">
<div class="group-name">{{ group.name }}</div>
<el-checkbox v-for="user in group.users" :checked="group.users.length === 1" :label="user.id">{{ user.name }}</el-checkbox>
<el-checkbox v-for="user in group.users" :label="user.id">{{ user.name }}</el-checkbox>
</div>
</el-checkbox-group>
</div>

@ -47,40 +47,21 @@
</div>
<div class="form-container" id="print-content">
<template v-if="device === 'desktop'">
<DesktopForm
:device="device"
ref="desktopForm"
:config="config"
:is-first-node="isFirstNode"
:sub-form="subConfig"
:fields="fields"
:original-form="form"
:readable="readableFields"
:script-content="scriptContent"
:writeable="writeableFields"
:rules="rules"
:sub-rules="subRules"
:logs="config.logs"
></DesktopForm>
</template>
<template v-else>
<MobileForm
:device="device"
ref="mobileForm"
:config="config"
:is-first-node="isFirstNode"
:sub-form="subConfig"
:fields="fields"
:original-form="form"
:readable="readableFields"
:script-content="scriptContent"
:writeable="writeableFields"
:rules="rules"
:sub-rules="subRules"
:logs="config.logs"
></MobileForm>
</template>
<DesktopForm
:device="device"
ref="desktopForm"
:config="config"
:is-first-node="isFirstNode"
:sub-form="subConfig"
:fields="fields"
:original-form="form"
:readable="readableFields"
:script-content="scriptContent"
:writeable="writeableFields"
:rules="rules"
:sub-rules="subRules"
:logs="config.logs"
></DesktopForm>
</div>
</template>
@ -468,7 +449,6 @@ export default {
}
},
trigger: "blur",
pattern: validation.get(rule),
message: `${field.label}必须为${validationName.get(rule)}`,
};
}
@ -484,7 +464,7 @@ export default {
};
default:
return {
validator: ({ cellValue }) => {
validator: this.device === 'desktop' ? ({ cellValue }) => {
return new Promise((resolve, reject) => {
if (validation.get(rule).test(cellValue) || cellValue === '') {
resolve()
@ -496,6 +476,16 @@ export default {
);
}
})
} : (myRule, value, callback) => {
if (validation.get(rule).test(value) || value === '') {
callback();
} else {
callback(
new Error(
`${field.label}必须为${validationName.get(rule)}`
)
);
}
},
trigger: "blur",
pattern: validation.get(rule),
@ -506,7 +496,9 @@ export default {
}
if (field.type === "relation") {
this.subRules[`${field.name}_rules`] = {}
object[field.name] = [{}];
let temp = {}
this.subConfig.get(field.sub_custom_model_id)?.customModel?.fields?.forEach(field => temp[field.name] = '')
object[field.name] = [temp];
this.generateForm(
object[field.name][0],
@ -526,6 +518,7 @@ export default {
});
this.form['flow_title'] = this.config?.flow?.title ?? `${this.config.customModel.name}${this.$store.getters.name} ${this.$moment().format('YYYY-MM-DD HH:mm')}`
},
formatTime(time) {
const days = parseInt(time / (1000 * 60 * 60 * 24));
const hours = parseInt((time % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
@ -564,8 +557,9 @@ export default {
}
});
this.config = res;
// form
this.generateForm(this.form, fields);
this.form = Object.assign({}, this.form);
// form
const { data } = res?.flow;
for (let key in data) {
try {
@ -576,7 +570,7 @@ export default {
if (typeof item[key] === 'string') {
try {
// JSON
const parsedValue = JSONBigint.parse(item[key]);
const parsedValue = JSONBigint({ storeAsString: true }).parse(item[key]);
//
item[key] = parsedValue;
} catch (e) {
@ -596,7 +590,6 @@ export default {
name: i.original_name,
url: i.url,
response: i,
TYPE_FILE: 1
}))
} else {
this.form[key] = ''
@ -606,6 +599,7 @@ export default {
}
}
}
this.form = Object.assign({}, this.form);
loading.close();
} catch (err) {
console.error(err);
@ -676,7 +670,7 @@ export default {
if (typeof item[key] === 'string') {
try {
// JSON
const parsedValue = JSONBigint.parse(item[key]);
const parsedValue = JSONBigint({ storeAsString: true }).parse(item[key]);
//
item[key] = parsedValue;
} catch (e) {
@ -719,25 +713,14 @@ export default {
return
}
let copyForm;
if (this.device === "desktop") {
try {
await this.$refs['desktopForm'].validate()
} catch (err) {
console.warn(err)
this.$message.warning('数据校验失败')
return
}
copyForm = deepCopy(this.$refs["desktopForm"].form);
} else {
try {
await this.$refs['mobileForm'].validate()
} catch (err) {
console.warn(err)
this.$message.warning('数据校验失败')
return
}
copyForm = deepCopy(this.$refs["mobileForm"].form);
try {
await this.$refs['desktopForm'].validate()
} catch (err) {
console.warn(err)
this.$message.warning('数据校验失败')
return
}
copyForm = deepCopy(this.$refs["desktopForm"].form);
const uploadHandler = (form, fields) => {
let keys = Object.keys(form)
keys.forEach(key => {
@ -772,13 +755,13 @@ export default {
}
copyForm["current_node_id"] = this.config.currentNode.id;
try {
let callback;
let callback = () => {};
switch (type) {
case "only-submit":
if (this.$route.query.flow_id) {
copyForm["temporary_save"] = 1;
}
callback = () => this.$router.push("/flow/list/todo");
callback = () => this.$router.push("/flow/list/todo")
break;
case "assign":
if (this.$route.query.flow_id) {

@ -157,7 +157,7 @@
>撤回</el-button
>
<el-button
v-if="row.can_delete"
v-if="row.can_delete || ($store.state.user.adminId === 1)"
plain
type="danger"
size="mini"
@ -301,7 +301,7 @@
>撤回</el-button
>
<el-button
v-if="row.can_delete"
v-if="row.can_delete || ($store.state.user.adminId === 1)"
plain
type="danger"
size="mini"
@ -515,10 +515,12 @@ export default {
} catch (err) {}
},
async destroy(row) {
try {
await destroy({ id: row.id });
await this.getList();
} catch (err) {}
if (row.can_delete || (this.$store.state.user.adminId === 1)) {
try {
await destroy({ id: row.id });
await this.getList();
} catch (err) {}
}
},
async getList() {

@ -18,6 +18,8 @@
<span class="svg-container">
<svg-icon icon-class="user" />
</span>
<input v-model="loginForm.pretend_user" style="display: none;" />
<el-input ref="username" v-model="loginForm.username" placeholder="请输入登录名" name="username" type="text"
tabindex="1" auto-complete="on" />
</div>
@ -81,6 +83,7 @@ export default {
loginForm: {
username: '',
password: '',
pretend_user: '',
//code: ''
},
loginRules: {

Loading…
Cancel
Save