vr-uniapp/src/views/layout/components/navbar/index.vue

200 lines
6.9 KiB
Vue

<template>
<!-- 顶部导航栏 -->
<div class="navbar">
<div class="nav-left">
<!-- <icon name="arrow-left" color="f">返回</icon> -->
<div class="flex-row align-c">
<div class="name">
<div class="flex-row align-c gap-10 c-pointer" @click="dialog_visible = true">
<image-empty :src="modelValue.logo" class="round img" error-img-style="width: 2.2rem;height: 2.2rem;" />
<div>{{ modelValue.name }}</div>
<icon name="edit" color="#7DBEFF"></icon>
</div>
</div>
</div>
</div>
<div class="nav-right">
<el-button class="btn-plain" @click="upload_manage"></el-button>
<el-button class="btn-plain" :class="saveDisabled ? 'disabled' : ''" :disabled="saveDisabled" @click="preview_event"></el-button>
<el-button class="btn-plain" :class="saveDisabled ? 'disabled' : ''" :disabled="saveDisabled" @click="save_event"></el-button>
<el-button class="btn-white" :class="saveDisabled ? 'disabled' : ''" :disabled="saveDisabled" @click="save_close_event"></el-button>
</div>
</div>
<el-dialog v-model="dialog_visible" class="radius-lg" width="650" draggable :close-on-click-modal="false" append-to-body>
<template #header>
<div class="title re">
<div class="middle size-16 fw-b">基础信息</div>
</div>
</template>
<div class="content pa-20">
<el-form ref="ruleFormRef" :model="form" :rules="rules" label-width="50" status-icon @submit.prevent>
<el-form-item label="封面">
<upload v-model="form.logo" :limit="1"></upload>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" placeholder="请输入名称" clearable @keyup.enter="confirm_event(ruleFormRef)" />
</el-form-item>
<el-form-item label="描述">
<el-input v-model="form.describe" placeholder="请输入描述" :rows="4" type="textarea" clearable @keyup.enter="confirm_event(ruleFormRef)" />
</el-form-item>
<el-form-item label="状态">
<el-switch v-model="form.is_enable" active-value="1" inactive-value="0"></el-switch>
</el-form-item>
</el-form>
</div>
<template #footer>
<span class="dialog-footer">
<el-button class="plr-28 ptb-10" @click="dialog_visible = false">取消</el-button>
<el-button class="plr-28 ptb-10" type="primary" @click="confirm_event(ruleFormRef)">确定</el-button>
</span>
</template>
</el-dialog>
<upload v-model:visible-dialog="is_custom_dialog" is-custom-dialog :is-check-confirm="false"></upload>
</template>
<script setup lang="ts">
import { FormInstance, FormRules } from 'element-plus';
const props = defineProps({
saveDisabled: {
type: Boolean,
default: false,
},
});
const modelValue = defineModel({ type: Object, default: {} });
// #region --------------------start
const is_custom_dialog = ref(false);
const dialog_visible = ref(false);
watch(dialog_visible, (val) => {
if (val) {
form.value = {
logo: modelValue.value.logo.length > 0 ? [{ url: modelValue.value.logo }] : [],
name: modelValue.value.name,
describe: modelValue.value.describe,
is_enable: modelValue.value.is_enable.toString(),
};
}
});
const form = ref({
logo: [] as any[],
name: '',
describe: '',
is_enable: '',
});
const ruleFormRef = ref<FormInstance>();
const rules = reactive<FormRules>({
name: [
{ required: true, trigger: 'blur', message: '请输入模版名称' },
{ min: 1, max: 60, message: '名称长度1~60个字符', trigger: 'blur' },
],
});
// #endregion 变量 --------------------end
const emit = defineEmits(['preview', 'save', 'saveClose']);
// 点击上传管理时的事件处理函数。
const upload_manage = () => {
is_custom_dialog.value = true;
};
// * 点击预览时的事件处理函数。
const preview_event = () => {
emit('preview', true);
};
// 点击仅保存时的事件处理函数。
const save_event = () => {
emit('save', true);
};
// 点击保存并关闭时的事件处理函数。
const save_close_event = () => {
emit('saveClose', true);
};
const confirm_event = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
dialog_visible.value = false;
modelValue.value = {
...form.value,
logo: form.value.logo.length > 0 ? form.value.logo[0].url : '',
};
}
// else {
// console.log('error submit!', fields);
// }
});
};
</script>
<style lang="scss" scoped>
.navbar {
height: 6rem;
padding: 0 3rem;
display: flex;
justify-content: space-between;
align-items: center;
background-color: $cr-primary;
.nav-left {
display: flex;
align-items: center;
.name {
// padding-left: 2rem;
// margin: 0 2rem;
color: #fff;
position: relative;
// &::before {
// content: '';
// display: inline-block;
// width: 0.1rem;
// height: 65%;
// background-color: #fff;
// position: absolute;
// left: 0;
// top: 50%;
// transform: translateY(-50%);
// }
.img {
width: 2.2rem;
height: 2.2rem;
}
}
}
.nav-right {
display: flex;
gap: 1.2rem;
.btn-plain {
background-color: transparent;
border-color: #fff;
color: #fff;
&:hover {
background-color: #fff;
border-color: #fff;
color: $cr-primary;
}
&.disabled {
opacity: 0.5;
&:hover {
background-color: transparent;
border-color: #fff;
color: #fff;
}
}
}
.btn-white {
background-color: #fff;
border-color: #fff;
color: $cr-primary;
&:hover {
background-color: #1e7ede;
border-color: #1e7ede;
color: #fff;
}
&.disabled {
opacity: 0.5;
&:hover {
background-color: #fff;
border-color: #fff;
color: $cr-primary;
}
}
}
}
}
</style>