<template>
  <div>
    <el-dialog
      :title="title"
      :destroy-on-close="true"
      :visible.sync="Visible"
      width="650px"
      @close="handleClose"
      :close-on-click-modal="false"
      top="10vh"
    >
      <el-form
        ref="form"
        :model="form"
        :rules="rules"
        size="small"
        label-width="130px"
      >
        <el-form-item label="父级菜单" prop="parentId">
          <treeselect
            v-model="form.parentId"
            :options="menuList"
            :normalizer="normalizer"
            :show-count="true"
            placeholder="选择父级菜单"
          />
        </el-form-item>
        <el-form-item label="菜单类型" prop="menuType">
          <el-radio-group v-model="form.menuType">
            <el-radio
              v-for="(item, key) in dict.menuType"
              :key="key"
              :label="Number(key)"
              >{{ item }}</el-radio
            >
          </el-radio-group>
        </el-form-item>

        <el-form-item label="菜单名称" prop="name">
          <el-input
            placeholder="请输入菜单名称"
            v-model="form.name"
            clearable
          ></el-input>
        </el-form-item>
        <el-form-item label="菜单图标" prop="imgPath" v-if="form.menuType != 2">
          <IconSelect v-model="form.imgPath"></IconSelect>
        </el-form-item>

        <el-form-item
          label="权限类型"
          prop="authType"
          v-if="form.menuType != 2"
        >
          <el-select
            clearable
            v-model="form.authType"
            placeholder="请选择权限类型"
          >
            <el-option
              v-for="(item, key) in dict.authType"
              :key="key"
              :label="item"
              :value="Number(key)"
            >
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item prop="url" v-if="form.menuType != 2">
          <span slot="label">
            <el-tooltip content="访问的路由地址,如:`system`" placement="top">
              <i class="el-icon-question"></i>
            </el-tooltip>
            路由地址
          </span>
          <el-input
            clearable
            placeholder="请输入菜单路由地址"
            v-model="form.url"
          ></el-input>
        </el-form-item>
        <el-form-item prop="component" v-if="form.menuType != 2">
          <span slot="label">
            <el-tooltip
              content="访问的组件路径,如:`pages/system/menu/Menu`,默认在`src`目录下"
              placement="top"
            >
              <i class="el-icon-question"></i>
            </el-tooltip>
            组件路径
          </span>
          <el-input
            clearable
            placeholder="请输入组件路径"
            v-model="form.component"
          ></el-input>
        </el-form-item>
        <el-form-item prop="activeDir" v-if="form.menuType != 2">
          <span slot="label">
            <el-tooltip content="顶部菜单栏激活路由" placement="top">
              <i class="el-icon-question"></i>
            </el-tooltip>
            激活菜单
          </span>
          <el-input
            clearable
            placeholder="请输入激活菜单地址"
            v-model="form.activeDir"
          ></el-input>
        </el-form-item>
        <el-form-item prop="perms" v-if="form.menuType == 2">
          <span slot="label">
            <el-tooltip
              content="控制器中定义的权限字符,如:'system:menu:add'"
              placement="top"
            >
              <i class="el-icon-question"></i>
            </el-tooltip>
            权限字符
          </span>
          <el-input
            clearable
            placeholder="请输入权限字符"
            v-model="form.perms"
          ></el-input>
        </el-form-item>
        <el-row>
          <el-col :span="12" v-if="form.menuType != 2">
            <el-form-item prop="visible">
              <span slot="label">
                <el-tooltip
                  content="控制路由和子路由是否显示在菜单栏"
                  placement="top"
                >
                  <i class="el-icon-question"></i>
                </el-tooltip>
                显示状态
              </span>
              <el-radio-group v-model="form.visible">
                <el-radio
                  v-for="(item, key) in dict.visible"
                  :key="key"
                  :label="Number(key)"
                  >{{ item }}</el-radio
                >
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12" v-if="form.menuType != 2">
            <el-form-item prop="cache">
              <span slot="label">
                <el-tooltip
                  content="选择是则会被`keep-alive`缓存"
                  placement="top"
                >
                  <i class="el-icon-question"></i>
                </el-tooltip>
                是否缓存
              </span>
              <el-radio-group v-model="form.cache">
                <el-radio :label="1">是</el-radio>
                <el-radio :label="0">否</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12" v-if="form.menuType != 2">
            <el-form-item prop="hideChildrenInMenu">
              <span slot="label">
                <el-tooltip
                  content="强制菜单显示为Item而不是SubItem"
                  placement="top"
                >
                  <i class="el-icon-question"></i>
                </el-tooltip>
                是否隐藏子菜单
              </span>
              <el-radio-group v-model="form.hideChildrenInMenu">
                <el-radio :label="1">是</el-radio>
                <el-radio :label="0">否</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="菜单状态" prop="status">
              <el-radio-group v-model="form.status">
                <el-radio
                  v-for="(item, key) in dict.status"
                  :key="key"
                  :label="Number(key)"
                  >{{ item }}</el-radio
                >
              </el-radio-group>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button size="small" @click="handleRest">重 置</el-button>
        <el-button
          size="small"
          type="primary"
          :loading="loading"
          @click="handleOk"
          >确 定</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>

<script>
import { saveMenu } from "@/api/system";
import IconSelect from "./IconSelect.vue";
import iconJson from "@/assets/icon.json";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  components: {
    IconSelect,
    Treeselect,
  },
  props: {
    title: {
      type: String,
      required: true,
      default: "",
    },
    show: {
      type: Boolean,
      required: true,
      default: false,
    },
    menuList: {
      required: true,
      type: Array,
      default: () => [],
    },
    dict: {
      required: true,
      type: Object,
      default: () => {},
    },
  },
  data() {
    return {
      iconJson,
      loading: false,
      defaultProps: {
        children: "childList",
        label: "name",
      },
      form: {
        name: "", // 菜单名称
        url: "", // 路由地址
        ancestors: "", // 当前激活根目录
        parentId: 0, // 父菜单ID,一级菜单的该字段值为-1
        linkType: 0, // 链接方式 (0.普通,1.弹出,2.脚本)
        imgPath: "", // 主菜单图标,主菜单图标的css样式名
        buttonImgPath: "", // 按钮图标,按钮图标的css样式名
        imgCommPath: "", // 常用菜单图标,常用菜单图标的css样式名
        commMenu: 1, // 是否常用菜单 (0.非常用,1.常用)
        component: "", // vue组件路径
        menuType: 0, // 菜单类型 (0.目录,1.菜单,2.按钮)
        authType: 0, // 权限类型 (0.无限制,1.无需登录查看,2.需要登录查看,3.需要角色权限查看)
        visible: 0, // 菜单显示状态 (0.显示,1.隐藏)
        perms: "", // 权限标识,多个逗号分割
        remark: "", // 备注信息
        orderId: "", // 排序编号
        status: 1, // 菜单状态 (0.停用,1.启用)
        cache: 0, // 是否缓存
        activeDir: "", // 激活菜单
        hideChildrenInMenu: 1, // 是否隐藏子菜单
      },
      rules: {
        name: [{ required: true, message: "请输入菜单名称", trigger: "blur" }],
        url: [
          { required: true, message: "请输入菜单访问地址", trigger: "blur" },
        ],
        component: [
          { required: true, message: "请输入组件路径", trigger: "blur" },
        ],
        authType: [
          { required: true, message: "请输入选择权限类型", trigger: "change" },
        ],
      },
    };
  },
  computed: {
    Visible: {
      get() {
        return this.show;
      },
      set(val) {
        this.$emit("update:show", val);
      },
    },
  },
  methods: {
    // 确定
    handleOk() {
      this.$refs.form.validate(async (valid) => {
        if (valid) {
          this.loading = true;
          let res = await saveMenu(this.form);
          let { code, msg } = res.data;
          if (code === 1) {
            this.$message.success(msg);
            this.$emit("success");
            this.handleClose();
          }
          this.loading = false;
        }
      });
    },
    // 新增
    onAdd() {
      Object.assign(this.form, this.$options.data().form);
      this.form.id && this.$delete(this.form, "id");
    },
    // 编辑
    onEdit(row) {
      setTimeout(() => {
        this.form = { ...row };
      }, 10);
    },
    // 重置
    handleRest() {
      this.$resetForm("form");
    },
    // 关闭
    handleClose() {
      this.$resetForm("form");
      this.Visible = false;
    },
    /** 转换菜单数据结构 */
    normalizer(node) {
      if (node.childList && !node.childList.length) {
        delete node.childList;
      }
      return {
        id: node.id,
        label: node.name,
        children: node.childList,
      };
    },
    changeParent(row) {
      console.log(row);
    },
  },
};
</script>

<style lang="less" scoped>
// :deep(.el-dialog__body) {
//   max-height: 600px;
//   overflow: auto;
// }
:deep(.el-select) {
  width: 100%;
}
</style>