import { ref, reactive, toRaw, computed, watch, type Ref, isRef } from "vue";
import { Options, Menu, DEFAULT_MENU, Column, Record } from "./type";
import Drag from "./drag";
import { deepCopy, readTextToClipboard, validatorDecimal } from "./util";
import { saveAs } from 'file-saver';
import * as XLSX from 'xlsx';
export default class extends Drag {
constructor(options: Options) {
super(options);
// 注册菜单
const menus = toRaw(this.props.menus) || this.getDefaultMenus();
menus.forEach((menu: Menu | string) => {
if (!menu) return;
const key = typeof menu === "string" ? menu : menu.key ?? this.createId();
if (!this[key] && key === menu) return;
// 新菜单
if (!this[key]) this.registerMenu(key, menu as Menu);
else this.registerMenu(key, Object.assign(this[key], menu));
});
const closeMenus = (e: MouseEvent) => {
if (e.button === 2) return;
this.closeMenus();
};
watch(this.showMenus, (value) => {
let stopWatch: any;
if (value) {
this.resetMenuStatus();
stopWatch = watch(this.selectedState, (value) => {
if (value) {
this.resetMenuStatus();
}
});
document.body.addEventListener("mouseup", closeMenus);
document.body.addEventListener("click", closeMenus);
document.body.addEventListener("wheel", closeMenus);
} else {
stopWatch?.();
document.body.removeEventListener("mouseup", closeMenus);
document.body.removeEventListener("click", closeMenus);
document.body.removeEventListener("wheel", closeMenus);
Promise.resolve().then(() => {
this.resetMenuStatus();
});
}
});
}
showMenus = ref(false);
menuList = ref