Browse Source

refactor:[资源库管理][钥匙关管理]前端模块化重构

luojie
15881625488@163.com 3 weeks ago
parent
commit
589e1f1ef9
4 changed files with 664 additions and 0 deletions
  1. +47
    -0
      src/api/business/mjy/mjy.js
  2. +249
    -0
      src/views/business/resource/mjy/list.vue
  3. +171
    -0
      src/views/business/resource/zcg/comps/Ysff.vue
  4. +197
    -0
      src/views/business/resource/zcg/comps/Ysgh.vue

+ 47
- 0
src/api/business/mjy/mjy.js View File

@ -0,0 +1,47 @@
import request from '@/utils/request'
// 查询麻精药列表
export function mjy_list(query) {
return request({
url: '/system/business/mjy/list',
method: 'get',
params: query
})
}
// 查询麻精药详情
export function mjy_info(query) {
return request({
url: '/system/business/mjy/info',
method: 'get',
params: query
})
}
// 钥匙发放
export function mjy_yygh(data) {
return request({
url: '/system/business/mjy/ysgh',
method: 'post',
data: data
})
}
//钥匙归还
export function mjy_yyff(data) {
return request({
url: '/system/business/mjy/ysff',
method: 'post',
data: data
})
}
//批量钥匙归还
export function mjy_ysghBatch(data) {
return request({
url: '/system/business/mjy/ysghBatch',
method: 'post',
data: data
})
}

+ 249
- 0
src/views/business/resource/mjy/list.vue View File

@ -0,0 +1,249 @@
<template>
<div class="app-container mjy">
<el-form :model="queryParams" ref="queryForm" class="search-area" size="small" :inline="true" label-width="88px">
<!-- 名称 -->
<el-form-item :label="$t('page.business.zykgl.mjy.mc') + ':'">
<el-input v-model="queryParams.mc" clearable @change="handleQuery" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
<!-- 编号 -->
<el-form-item :label="$t('page.business.zykgl.mjy.bh') + ':'">
<el-input v-model="queryParams.bh" clearable @change="handleQuery" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
<!-- 借阅状态 -->
<el-form-item :label="$t('page.business.zykgl.mjy.jyzt') + ':'">
<el-select v-model="queryParams.jyzt" :placeholder="$t('form.placeholderSelect')" clearable
@change="handleQuery">
<el-option key="1" :label="$t('page.business.zykgl.jyzt.wjy')" value="1" />
<el-option key="3" :label="$t('page.business.zykgl.jyzt.djy')" value="3" />
<el-option key="5" :label="$t('page.business.zykgl.jyzt.jyz')" value="5" />
</el-select>
</el-form-item>
<!-- 制剂状态 -->
<el-form-item :label="$t('page.business.zykgl.mjy.zjzt') + ':'">
<el-select v-model="queryParams.zjzt" :placeholder="$t('form.placeholderSelect')" clearable
@change="handleQuery">
<el-option key="1" :label="$t('page.business.zykgl.zjzt.rk')" value="1" />
<el-option key="3" :label="$t('page.business.zykgl.zjzt.yff')" value="3" />
<el-option key="5" :label="$t('page.business.zykgl.zjzt.ysd')" value="5" />
<el-option key="7" :label="$t('page.business.zykgl.zjzt.dgd')" value="7" />
<el-option key="9" :label="$t('page.business.zykgl.zjzt.gd')" value="9" />
<el-option key="11" :label="$t('page.business.zykgl.zjzt.djd')" value="11" />
</el-select>
</el-form-item>
<!-- 失效日期 -->
<el-form-item :label="$t('page.business.zykgl.mjy.sxrq') + ':'">
<el-date-picker v-model="daterange" class="chat-histogram-daterange" type="daterange" range-separator="-"
:start-placeholder="$t('form.startDate')" :end-placeholder="$t('form.endDate')" value-format="yyyy-MM-dd"
@change="handleQuery" style="width: 250px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">{{ $t('form.search') }}</el-button>
<el-button icon="el-icon-refresh" @click="resetQuery">{{ $t('form.reset') }}</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<!-- 批量发放 -->
<el-button type="primary" :disabled="multiple" @click="handlePlff" v-hasPermi="['business:resource:mjy:ff']">{{
$t('page.business.zykgl.mjy.plff') }}</el-button>
</el-col>
<el-col :span="1.5">
<!-- 批量处置药剂 -->
<el-button type="primary" :disabled="multiple" @click="handlePlczyj"
v-hasPermi="['business:resource:mjy:czyj']">{{ $t('page.business.zykgl.mjy.plczyj') }}</el-button>
</el-col>
<el-col :span="1.5">
<!-- 批量处置容器 -->
<el-button type="primary" :disabled="multiple" @click="handlePlczrq"
v-hasPermi="['business:resource:mjy:czrq']">{{ $t('page.business.zykgl.mjy.plczrq') }}</el-button>
</el-col>
<el-col :span="1.5">
<!-- 钥匙发放 -->
<el-button type="primary" :disabled="multiple" @click="handleYsff"
v-hasPermi="['business:resource:mjy:ysff']">{{ $t('page.business.zykgl.mjy.ysff') }}</el-button>
</el-col>
<el-col :span="1.5">
<!-- 批量锁定 -->
<el-button type="primary" :disabled="multiple" @click="handlePlsd" v-hasPermi="['business:resource:mjy:sd']">{{
$t('page.business.zykgl.mjy.plsd') }}</el-button>
</el-col>
<el-col :span="1.5">
<!-- 批量归档 -->
<el-button type="primary" :disabled="multiple" @click="handlePlgd" v-hasPermi="['business:resource:mjy:gd']">{{
$t('page.business.zykgl.mjy.plgd') }}</el-button>
</el-col>
<el-col :span="1.5">
<!-- 导出 -->
<el-button type="primary" :disabled="multiple" @click="handleDc" v-hasPermi="['business:resource:mjy:dc']">{{
$t('form.export') }}</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" :selectable="checkSelectable" />
<el-table-column :label="$t('page.business.zykgl.mjy.mc')" align="left" prop="mc" :show-overflow-tooltip="true" />
<el-table-column :label="$t('page.business.zykgl.mjy.bh')" align="center" prop="bh"
:show-overflow-tooltip="true" />
<el-table-column :label="$t('page.business.zykgl.mjy.nd')" align="center">
<template slot-scope="scope">
{{ scope.row.nd }}{{ scope.row.nddw }}
</template>
</el-table-column>
<el-table-column :label="$t('page.business.zykgl.mjy.kcl')" align="center">
<template slot-scope="scope">
{{ scope.row.kc }}{{ scope.row.kcdw }}
</template>
</el-table-column>
<el-table-column :label="$t('page.business.zykgl.mjy.sxrq')" align="center" prop="sxrq" width="150px" />
<el-table-column :label="$t('page.business.zykgl.mjy.zcgMc')" align="center" prop="zcgMc" width="130px" />
<el-table-column :label="$t('page.business.zykgl.mjy.cctj')" align="center" prop="cctj" width="130px" />
<el-table-column :label="$t('page.business.zykgl.mjy.ccwz')" align="center" prop="ccwz" width="130px" />
<el-table-column :label="$t('page.business.zykgl.mjy.zjzt')" align="center" width="150px">
<template slot-scope="scope">
<span v-if="scope.row.zjzt == 1">{{ $t('page.business.zykgl.zjzt.rk') }}</span>
<span v-if="scope.row.zjzt == 3">{{ $t('page.business.zykgl.zjzt.yff') }}</span>
<span v-if="scope.row.zjzt == 5">{{ $t('page.business.zykgl.zjzt.ysd') }}</span>
<span v-if="scope.row.zjzt == 7">{{ $t('page.business.zykgl.zjzt.dgd') }}</span>
<span v-if="scope.row.zjzt == 9">{{ $t('page.business.zykgl.zjzt.gd') }}</span>
<span v-if="scope.row.zjzt == 11">{{ $t('page.business.zykgl.zjzt.djd') }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('page.business.zykgl.mjy.jyzt')" align="center" width="150px">
<template slot-scope="scope">
<span v-if="scope.row.jyzt == 1">{{ $t('page.business.zykgl.jyzt.wjy') }}</span>
<span v-if="scope.row.jyzt == 3">{{ $t('page.business.zykgl.jyzt.djy') }}</span>
<span v-if="scope.row.jyzt == 5">{{ $t('page.business.zykgl.jyzt.jyz') }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('form.operate')" fixed="right" align="center" class-name="small-padding fixed-width"
width="250px">
<template slot-scope="scope">
<!-- 详情 -->
<el-button size="mini" type="text" @click="handleffys(scope.row)"
v-hasPermi="['business:resource:mjy:list']">{{ $t('page.business.zykgl.mjy.xq') }}</el-button>
<!-- 发放 -->
<el-button size="mini" type="text" @click="handleffys(scope.row)" v-hasPermi="['business:resource:mjy:ff']">{{
$t('page.business.zykgl.mjy.ff') }}</el-button>
<!-- 归还 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:gh']">{{
$t('page.business.zykgl.mjy.gh') }}</el-button>
<!-- 处置药剂 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)"
v-hasPermi="['business:resource:mjy:czyj']">{{
$t('page.business.zykgl.mjy.czyj') }}</el-button>
<!-- 处置容器 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)"
v-hasPermi="['business:resource:mjy:czrq']">{{
$t('page.business.zykgl.mjy.czrq') }}</el-button>
<!-- 编辑 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:bj']">{{
$t('form.edit') }}</el-button>
<!-- 审核编辑 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)"
v-hasPermi="['business:resource:mjy:shbj']">{{
$t('page.business.zykgl.mjy.shbj') }}</el-button>
<!-- 修改库存 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)"
v-hasPermi="['business:resource:mjy:xgkc']">{{
$t('page.business.zykgl.mjy.xgkc') }}</el-button>
<!-- 审核修改库存 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)"
v-hasPermi="['business:resource:mjy:shxgkc']">{{
$t('page.business.zykgl.mjy.shxgkc') }}</el-button>
<!-- 锁定 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:sd']">{{
$t('page.business.zykgl.mjy.sd') }}</el-button>
<!-- 解锁 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:js']">{{
$t('page.business.zykgl.mjy.js') }}</el-button>
<!-- 归档 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:gd']">{{
$t('page.business.zykgl.mjy.gd') }}</el-button>
<!-- 解档 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:jd']">{{
$t('page.business.zykgl.mjy.jd') }}</el-button>
<!-- 借阅 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:jy']">{{
$t('page.business.zykgl.mjy.jy') }}</el-button>
<!-- 归还 -->
<el-button size="mini" type="text" @click="handleghys(scope.row)" v-hasPermi="['business:resource:mjy:gh']">{{
$t('page.business.zykgl.mjy.gh') }}</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
</div>
</template>
<script>
import { mjy_list, mjy_info } from "@/api/business/mjy/mjy"
export default {
name: "Mjy",
data() {
return {
daterange: [],
loading: true,
single: true,
multiple: true,
total: 0,
list: [],
//
selectList: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
mc: null,
jyzt: null,
zjzt: null,
bh: null,
startDate: null,
endDate: null,
},
}
},
created() {
this.getList()
},
methods: {
getList() {
if (this.daterange != null && this.daterange.length > 0) {
this.queryParams.startDate = this.daterange[0]
this.queryParams.endDate = moment().add(this.daterange[1], 'days').format('YYYY-MM-DD');
} else {
this.queryParams.startDate = ''
this.queryParams.endDate = ''
}
this.loading = true
mjy_list(this.queryParams).then(response => {
this.list = response.rows
this.total = response.total
this.loading = false
})
},
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
resetQuery() {
this.resetForm("queryForm")
this.handleQuery()
},
handleSelectionChange(selection) {
this.single = selection.length !== 1
this.multiple = !selection.length
this.selectList = selection
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss">
.mjy {}
</style>

+ 171
- 0
src/views/business/resource/zcg/comps/Ysff.vue View File

@ -0,0 +1,171 @@
<template>
<div class="app-container">
<!-- 钥匙发放弹窗 -->
<el-dialog :title="$t('page.business.zykgl.zcg.ysff')" :visible.sync="open" width="800px" append-to-body
:close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="130px">
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.zcg')" prop="mc">
<el-input type="text" v-model="form.mc" maxlength="50" disabled
:placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.glyj')" prop="glyj">
<el-input type="text" v-model="form.glyj" maxlength="500" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.qmyy')" prop="qmyy">
<el-input type="text" :value="$t('page.business.zykgl.zcg.ysff')" maxlength="50" disabled
:placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item :label="$t('page.business.zykgl.zcg.remark')" prop="remark">
<el-input type="textarea" v-model="form.remark" :rows="2" maxlength="500"
:placeholder="$t('form.placeholderInput')">
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.lqr1Id')" prop="lqr1Id">
<el-input type="text" v-model="form.lqr1Id" maxlength="50" :placeholder="$t('form.placeholderSelect')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.lqr1mm')" prop="lqr1mm">
<el-input type="text" v-model="form.lqr1mm" maxlength="20" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.lqr2Id')" prop="lqr2Id">
<el-input type="text" v-model="form.lqr2Id" maxlength="50" :placeholder="$t('form.placeholderSelect')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.lqr2mm')" prop="lqr2mm">
<el-input type="text" v-model="form.lqr2mm" maxlength="20" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.ffr')">
<el-input type="text" v-model="nickName" maxlength="50" disabled
:placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.ffrmm')" prop="ffrmm">
<el-input type="text" v-model="form.ffrmm" maxlength="20" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="save">{{ $t('form.confirm') }}</el-button>
<el-button @click="cancel">{{ $t('form.cancel') }}</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { zcg_yyff } from "@/api/business/zcg/zcg"
import { mapGetters } from 'vuex'
export default {
name: "Zcg",
data() {
return {
open: false,
form: {},
rules: {
glyj: [{
required: true,
message: ' ',
trigger: 'blur'
}],
lqr1Id: [{
required: true,
message: ' ',
trigger: 'blur'
}],
lqr2Id: [{
required: true,
message: ' ',
trigger: 'blur'
}],
lqr1mm: [{
required: true,
message: ' ',
trigger: 'blur'
}],
lqr2mm: [{
required: true,
message: ' ',
trigger: 'blur'
}],
ffrmm: [{
required: true,
message: ' ',
trigger: 'blur'
}],
}
}
},
computed: {
...mapGetters([
'nickName'
]),
},
created() {
},
methods: {
cancel() {
this.open = false
},
reset() {
this.form = {
id: null,
mc: null,
glyj: null,
qmyy: '钥匙发放',
remark: null,
lqr1Id: null,
lqr2Id: null,
lqr1mm: null,
lqr2mm: null,
ffrmm: null
}
this.resetForm("form")
},
show(row) {
this.reset()
this.form.id = row.id
this.form.mc = row.mc
this.open = true
},
save() {
this.$refs["form"].validate(valid => {
if (valid) {
zcg_yyff(this.form).then(response => {
this.open = false
this.$emit('callback')
})
}
})
}
}
}
</script>

+ 197
- 0
src/views/business/resource/zcg/comps/Ysgh.vue View File

@ -0,0 +1,197 @@
G<template>
<div class="app-container">
<!-- 钥匙归还弹窗 -->
<el-dialog :title="$t('page.business.zykgl.zcg.ysgh')" :visible.sync="open" width="1000px" append-to-body
:close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="130px">
<template v-if="isBatch">
<el-alert :title="$t('page.business.zykgl.zcg.ysghts') + ':'" type="error" :closable="false">
</el-alert>
<el-row style="margin:10px 0px;">
<el-col :span="24">
<el-table :data="selectList" border>
<el-table-column :label="$t('page.business.zykgl.zcg.zcg')" align="left" prop="mc" width="200px" />
<el-table-column :label="$t('page.business.zykgl.zcg.ys1jyr')" align="center" prop="lqr1Mc"
width="150px" />
<el-table-column :label="$t('page.business.zykgl.zcg.ys2jyr')" align="center" prop="lqr2Mc"
width="150px" />
<el-table-column :label="$t('page.business.zykgl.zcg.glyj')" align="center" prop="glyj" />
</el-table>
</el-col>
</el-row>
</template>
<template v-else>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.zcg')" prop="mc">
<el-input type="text" v-model="form.mc" maxlength="50" disabled
:placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.glyj')" prop="glyj">
<el-input type="text" v-model="form.glyj" maxlength="50" disabled
:placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
</template>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.ghr1Id')" prop="ghr1Id">
<el-input type="text" v-model="form.ghr1Id" maxlength="50" :placeholder="$t('form.placeholderSelect')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.ghr1mm')" prop="ghr1mm">
<el-input type="text" v-model="form.ghr1mm" maxlength="20" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.ghr2Id')" prop="ghr2Id">
<el-input type="text" v-model="form.ghr2Id" maxlength="50" :placeholder="$t('form.placeholderSelect')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.ghr2mm')" prop="ghr2mm">
<el-input type="text" v-model="form.ghr2mm" maxlength="20" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.jsr')">
<el-input type="text" v-model="nickName" maxlength="50" disabled
:placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.jsrmm')" prop="jsrmm">
<el-input type="text" v-model="form.jsrmm" maxlength="20" :placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="$t('page.business.zykgl.zcg.qmyy')" prop="qmyy">
<el-input type="text" :value="$t('page.business.zykgl.zcg.ysgh')" maxlength="50" disabled
:placeholder="$t('form.placeholderInput')" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="save">{{ $t('form.confirm') }}</el-button>
<el-button @click="cancel">{{ $t('form.cancel') }}</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { zcg_yygh, zcg_ysghBatch } from "@/api/business/zcg/zcg"
import { mapGetters } from 'vuex'
export default {
name: "ZcgYsgh",
data() {
return {
isBatch: false,
ids: [],
selectList: [],
open: false,
form: {},
rules: {
ghr1Id: [{
required: true,
message: ' ',
trigger: 'blur'
}],
ghr2Id: [{
required: true,
message: ' ',
trigger: 'blur'
}],
ghr1mm: [{
required: true,
message: ' ',
trigger: 'blur'
}],
ghr2mm: [{
required: true,
message: ' ',
trigger: 'blur'
}],
jsrmm: [{
required: true,
message: ' ',
trigger: 'blur'
}],
}
}
},
computed: {
...mapGetters([
'nickName'
]),
},
created() {
},
methods: {
showBatch(val) {
this.reset()
this.isBatch = true
this.form.ids = val.map(item => item.id)
this.selectList = val
this.open = true
},
cancel() {
this.open = false
},
reset() {
this.form = {
id: null,
ids: null,
mc: null,
qmyy: '钥匙归还',
ghr1Id: null,
ghr2Id: null,
ghr1mm: null,
ghr2mm: null,
jsrmm: null
}
this.resetForm("form")
},
show(row) {
this.reset()
this.isBatch = false
this.form.ids = []
this.selectList = []
this.form.id = row.id
this.form.mc = row.mc
this.form.glyj = row.glyj
this.open = true
},
save() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.isBatch) {
zcg_ysghBatch(this.form).then(response => {
this.open = false
this.$emit('callback')
})
} else {
zcg_yygh(this.form).then(response => {
this.open = false
this.$emit('callback')
})
}
}
})
}
}
}
</script>

Loading…
Cancel
Save