手机端调整

rollback
xy 1 year 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> <template>
<div> <van-popup position="bottom" v-model="isShow">
<div class="van-dropdown-menu"> <div class="van-dropdown-menu">
<div class="van-dropdown-menu__bar van-dropdown-menu__bar--opened"> <div class="van-dropdown-menu__bar van-dropdown-menu__bar--opened">
<div role="button" tabindex="0" class="van-dropdown-menu__item"> <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-dropdown-menu__title" :class="[ showSelectMultiple ? 'van-dropdown-menu__title--active van-dropdown-menu__title--down' : '' ]" @click="selectActive()">
<div class="van-ellipsis">{{ selectName }}</div> <div class="van-ellipsis">{{ selectName }}</div>
</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="toggleAll()"></span>
<span v-if="all" @click="toggleFalseAll()"></span> <span v-if="all" @click="toggleFalseAll()"></span>
</div> </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>
</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"> <div ref="content" class="van-popup van-popup--bottom van-dropdown-item__content">
<van-checkbox-group v-model="checked" res="checkboxGroup" @change="selectDataOptsChange"> <van-checkbox-group v-model="checked" res="checkboxGroup" @change="selectDataOptsChange">
@ -29,7 +29,7 @@
</div> </div>
</div> </div>
</div> </van-popup>
</template> </template>
<script > <script >
import { Checkbox, CheckboxGroup, DropdownMenu, DropdownItem } from 'vant' import { Checkbox, CheckboxGroup, DropdownMenu, DropdownItem } from 'vant'
@ -88,6 +88,7 @@ export default {
}, },
data() { data() {
return { return {
isShow: false,
zIndex: PopupManager.nextZIndex(), zIndex: PopupManager.nextZIndex(),
showSelectMultiple: false, showSelectMultiple: false,
checked: [], checked: [],
@ -98,6 +99,12 @@ export default {
this.checked = this.checkedList this.checked = this.checkedList
}, },
methods: { methods: {
show() {
this.isShow = true
},
hide() {
this.isShow = false
},
selectActive() { selectActive() {
if (this.disabled) { if (this.disabled) {
return 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: {}, form: {},
jointlySignLog: [], // log jointlySignLog: [], // log
datetimeFormat: 'yyyy-MM-dd HH:mm', shortcuts: [
copyShortcuts: [
{ {
text: "一年前", text: "一年前",
onClick(picker) { onClick(picker) {
@ -86,55 +85,11 @@ export default {
}, },
}, },
{ {
text: "一前", text: "一季度前",
onClick(picker) { onClick(picker) {
picker.$emit( picker.$emit(
"pick", "pick",
moment().subtract(1, "months").toDate() moment().subtract(3, "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()
); );
}, },
}, },
@ -174,6 +129,12 @@ export default {
picker.$emit("pick", moment().add(1, "months").toDate()); picker.$emit("pick", moment().add(1, "months").toDate());
}, },
}, },
{
text: "一季度后",
onClick(picker) {
picker.$emit("pick", moment().add(3, "months").toDate());
},
},
{ {
text: "一年后", text: "一年后",
onClick(picker) { onClick(picker) {
@ -194,11 +155,22 @@ export default {
} }
let subFormName = this.fields.filter(i => i.type === 'relation').map(i => i.name) let subFormName = this.fields.filter(i => i.type === 'relation').map(i => i.name)
for (let i = 0;i < subFormName.length;i++) { for (let i = 0;i < subFormName.length;i++) {
let $subForm = this.$refs[`subForm-${subFormName[i]}`] if (this.device === 'desktop') {
if ($subForm) { let $subForm = this.$refs[`subForm-${subFormName[i]}`]
const errMap = await this.$refs[`subForm-${subFormName[i]}`].validate(true) if ($subForm) {
if (errMap) { const errMap = await this.$refs[`subForm-${subFormName[i]}`].validate(true)
throw new Error(errMap) 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: {}, computed: {},
watch: { watch: {
originalForm(newVal) { 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) { scriptContent(newVal) {
if (newVal) { if (newVal) {
@ -264,16 +245,19 @@ export default {
_writeable: this.isFirstNode, _writeable: this.isFirstNode,
}); });
} }
return h("div", [ return h("div", {
class: `form-${this.device}`
},[
h( h(
"el-form", "el-form",
{ {
ref: "elForm", ref: "elForm",
class: "form", class: "form",
props: { props: {
size: this.device === 'mobile' ? 'medium' : '',
model: this.form, model: this.form,
"label-position": "right", "label-position": "right",
"label-width": "130px", "label-width": this.device === 'mobile' ? "80px" : "130px",
rules: this.rules, rules: this.rules,
"inline-message": true, "inline-message": true,
}, },
@ -323,4 +307,60 @@ export default {
::v-deep .el-radio, .el-radio__input { ::v-deep .el-radio, .el-radio__input {
line-height: 1.5; 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> </style>

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

@ -57,7 +57,7 @@
<el-checkbox-group v-model="form.user_id" @change="handleCheckedUsersChange"> <el-checkbox-group v-model="form.user_id" @change="handleCheckedUsersChange">
<div v-for="group in pickUsers" :key="group.id"> <div v-for="group in pickUsers" :key="group.id">
<div class="group-name">{{ group.name }}</div> <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> </div>
</el-checkbox-group> </el-checkbox-group>
</div> </div>

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

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

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

Loading…
Cancel
Save