The context menu supports scrolling, and you can use the spread.contextMenu.menuView.scrollable to control whether the context menu is able to scroll.
You can use the spread.contextMenu.menuView.maxHeight to set or get context menu's max height.
<template>
<div class="sample-tutorial">
<gc-spread-sheets class="sample-spreadsheets" @workbookInitialized="initSpread">
<gc-worksheet></gc-worksheet>
</gc-spread-sheets>
<div class="options-container">
<label>Try setting the height to 150 in the context menu below.</label>
<div class="option-row">
<div class="option-row">
<label for="contextMenuMaxHeight">Context Menu Max Height: </label>
<input type="text" id="contextMenuMaxHeight" @change="changeMaxHeight" />
<input type="button" id="setContextMenuMaxHeight" value="Set" @click="setMaxHeight" />
</div>
</div>
<div class="option-row">
<input type="checkbox" id="scrollable" checked @change="changeScrollable" />
<label for="scrollable">Enable Context Menu Scroll</label>
</div>
</div>
</div>
</template>
<script setup>
import { ref, watch } from "vue";
import "@mescius/spread-sheets-vue";
import GC from '@mescius/spread-sheets';
const spreadRef = ref(null);
const maxHeight = ref("");
const scrollable = ref(true);
let initSpread = function (spread) {
spreadRef.value = spread;
let sheet = spread.getActiveSheet();
sheet.suspendPaint();
let dataColumns = ["Name", "City", "Birthday", "Sex", "Weight", "Height"];
let data = [
["Bob", "New York", "1968/6/8", "M", "80", "180"],
["Betty", "New York", "1972/7/3", "F", "72", "168"],
["Cherry", "Washington", "1986/2/2", "F", "58", "161"],
["Gary", "New York", "1964/3/2", "M", "71", "179"],
["Hunk", "Washington", "1972/8/8", "M", "80", "171"],
["Eva", "Washington", "1993/2/15", "F", "71", "180"]
];
sheet.tables.addFromDataSource("table1", 1, 1, data, GC.Spread.Sheets.Tables.TableThemes.medium7);
sheet.getRange(-1, 1, -1, 6).width(80);
sheet.getRange(2, 3, 6, 1).formatter("mm-dd-yyyy");
let table = sheet.tables.findByName("table1");
table.setColumnName(0, dataColumns[0]);
table.setColumnName(1, dataColumns[1]);
table.setColumnName(2, dataColumns[2]);
table.setColumnName(3, dataColumns[3]);
table.setColumnName(4, dataColumns[4]);
table.setColumnName(5, dataColumns[5]);
sheet.resumePaint();
}
function changeScrollable(e) {
spreadRef.value.contextMenu.menuView.scrollable(e.target.checked);
}
function changeMaxHeight(e) {
maxHeight.value = e.target.value;
}
function setMaxHeight(e) {
spreadRef.value.contextMenu.menuView.maxHeight(+(maxHeight.value));
}
</script>
<style scoped>
#app {
height: 100%;
}
.sample-tutorial {
position: relative;
height: 100%;
overflow: hidden;
}
.sample-spreadsheets {
width: calc(100% - 280px);
height: 100%;
overflow: hidden;
float: left;
}
.options-container {
float: right;
width: 280px;
padding: 12px;
height: 100%;
box-sizing: border-box;
background: #fbfbfb;
overflow: auto;
}
.options-row {
font-size: 14px;
padding: 5px;
margin-top: 10px;
}
input {
display: inline-block;
}
input[type="text"] {
width: 200px;
}
input[type="button"] {
/* padding: 4px 6px;
width: 100%; */
margin-bottom: 10px;
}
label {
display: inline-block;
font-size: 13px;
}
p {
padding: 2px 10px;
background-color: #F4F8EB;
}
body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.desc {
padding: 2px 10px;
background-color: #F4F8EB;
}
.loginBox {
position: absolute;
left: 35%;
top: 30%;
background-color: white;
padding: 20px;
border: 1px solid #c6c6c6;
box-shadow: rgba(0, 0, 0, 0.4) 1px 2px 5px;
z-index: 2000;
height: 100px;
width: 200px;
}
.loginBoxLabel {
display: inline-block;
width: 200px;
text-align: center;
}
</style>
<!DOCTYPE html>
<html style="height:100%;font-size:14px;">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>SpreadJS VUE</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" type="text/css"
href="$DEMOROOT$/en/vue3/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css">
<script src="$DEMOROOT$/en/vue3/node_modules/systemjs/dist/system.src.js"></script>
<script src="./systemjs.config.js"></script>
<script src="./compiler.js" type="module"></script>
<script src="$DEMOROOT$/spread/source/data/sorting.js" type="text/javascript"></script>
<script>
var System = SystemJS;
System.import("./src/app.js");
System.import('$DEMOROOT$/en/lib/vue3/license.js');
</script>
</head>
<body>
<div id="app"></div>
</body>
</html>
(function (global) {
SystemJS.config({
transpiler: 'plugin-babel',
babelOptions: {
es2015: true
},
paths: {
// paths serve as alias
'npm:': 'node_modules/'
},
packageConfigPaths: [
'./node_modules/*/package.json',
"./node_modules/@mescius/*/package.json",
"./node_modules/@babel/*/package.json",
"./node_modules/@vue/*/package.json"
],
map: {
'vue': "npm:vue/dist/vue.esm-browser.js",
'tiny-emitter': 'npm:tiny-emitter/index.js',
'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js',
"systemjs-babel-build": "npm:systemjs-plugin-babel/systemjs-babel-browser.js",
'@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js',
'@mescius/spread-sheets-resources-en': 'npm:@mescius/spread-sheets-resources-en/index.js',
'@mescius/spread-sheets-vue': 'npm:@mescius/spread-sheets-vue/index.js'
},
meta: {
'*.css': { loader: 'systemjs-plugin-css' },
'*.vue': { loader: "../plugin-vue/index.js" }
}
});
})(this);