选项列表支持无限滚动

This commit is contained in:
fofolee 2020-06-29 20:57:06 +08:00
parent 0231b95c8a
commit d814bd352a

View File

@ -6,6 +6,7 @@ const electron = require('electron')
const { NodeVM } = require('vm2') const { NodeVM } = require('vm2')
const path = require("path") const path = require("path")
const util = require("util") const util = require("util")
const PinyinMatch = require('pinyin-match');
fofoCommon = require('./common').fofo fofoCommon = require('./common').fofo
@ -59,11 +60,13 @@ let getSleepCodeByShell = ms => {
} }
quickcommand = { quickcommand = {
// 模拟复制操作
simulateCopy: function() { simulateCopy: function() {
var ctlKey = utools.isMacOs() ? 'command' : 'control'; var ctlKey = utools.isMacOs() ? 'command' : 'control';
utools.simulateKeyboardTap('c', ctlKey); utools.simulateKeyboardTap('c', ctlKey);
}, },
// 模拟粘贴操作
simulatePaste: function() { simulatePaste: function() {
var ctlKey = utools.isMacOs() ? 'command' : 'control'; var ctlKey = utools.isMacOs() ? 'command' : 'control';
utools.simulateKeyboardTap('v', ctlKey); utools.simulateKeyboardTap('v', ctlKey);
@ -79,6 +82,7 @@ quickcommand = {
return (end - start) return (end - start)
}, },
// 重写 setTimeout
setTimeout: function(callback, ms) { setTimeout: function(callback, ms) {
var start = new Date().getTime() var start = new Date().getTime()
child_process.exec(getSleepCodeByShell(ms), { timeout: ms }, (err, stdout, stderr) => { child_process.exec(getSleepCodeByShell(ms), { timeout: ms }, (err, stdout, stderr) => {
@ -87,6 +91,7 @@ quickcommand = {
}) })
}, },
// 显示输入框
showInputBox: function (callback, placeHolders) { showInputBox: function (callback, placeHolders) {
let helps = `正确用法: let helps = `正确用法:
quickcommand.showInputBox(yourinput => { quickcommand.showInputBox(yourinput => {
@ -116,6 +121,7 @@ quickcommand = {
swalOneByOne(options) swalOneByOne(options)
}, },
// 显示选项按钮
showButtonBox: function (callback, buttons) { showButtonBox: function (callback, buttons) {
let helps = `正确用法: let helps = `正确用法:
quickcommand.showButtonBox(yourchoise => { quickcommand.showButtonBox(yourchoise => {
@ -145,6 +151,7 @@ quickcommand = {
swalOneByOne(options) swalOneByOne(options)
}, },
// 显示自动消失的提示框
showMessageBox: function (title, icon = "success") { showMessageBox: function (title, icon = "success") {
var options = { var options = {
icon: icon, icon: icon,
@ -160,42 +167,66 @@ quickcommand = {
swalOneByOne(options) swalOneByOne(options)
}, },
showSelectList: function (callback, selects, placeholder = "搜索", closeOnSelect = true) { // 显示选项列表
showSelectList: function (callback, selects, opt = {}) {
let helps = `正确用法: let helps = `正确用法:
quickcommand.showSelectList(choise => { quickcommand.showSelectList(choise => {
var index = choise.index var index = choise.index
var text = choise.text var text = choise.text
//do something... //do something...
}, [option1, option2...], placeholder, closeOnSelect)` }, [option1, option2...], { placeholder, enableHTML, closeOnSelect })`
if (!(callback instanceof Function)) throw helps if (!(callback instanceof Function)) throw helps
if (!(selects instanceof Array)) throw helps if (!(selects instanceof Array)) throw helps
opt.placeholder || (opt.placeholder = "搜索,支持拼音")
opt.enableHTML || (opt.enableHTML = false)
typeof opt.closeOnSelect == 'undefined' && (opt.closeOnSelect = true)
// 调整插件高度 // 调整插件高度
let modWindowHeight = num => { let modWindowHeight = () => {
if(!$("#customize").is(":parent")) utools.setExpendHeight(num > 10 ? 550 : 50 * num); var height = $('.select2-results').height()
if (!$("#customize").is(":parent")) utools.setExpendHeight(height > 600 ? 600 : height);
} }
var html = `<div id="quickselect"><select id="selectBox">` if ($('#quickselect').length) $('#quickselect').remove()
$("body").append(`<div id="quickselect"><select id="selectBox"></select></div>`)
var selectBoxNumbers = selects.length var selectBoxNumbers = selects.length
modWindowHeight(selectBoxNumbers) var data = []
for (let i = 0; i < selectBoxNumbers; i++) { for (let i = 0; i < selectBoxNumbers; i++) {
html += `<option value="${i}">${selects[i]}</option>` data.push({ id: i, text: selects[i] })
} }
html += `</select></div>` var prefer = {
$("body").append(html) data: data,
$('#selectBox').select2({
width: "100%", width: "100%",
dropdownParent: $("#quickselect"), dropdownParent: $("#quickselect"),
closeOnSelect: closeOnSelect closeOnSelect: opt.closeOnSelect,
}) // 支持无限滚动
ajax: {
transport: (params, success, failure) => {
let pageSize = 50
let term = (params.data.term || '').toLowerCase()
let page = (params.data.page || 1)
let results = data.filter(x => {
cont = opt.enableHTML ? x.text.replace(/<[^<>]+>/g, '') : x.text
return cont.toLowerCase().includes(term) || PinyinMatch.match(cont, term)
})
let paged = results.slice((page -1) * pageSize, page * pageSize)
let options = { results: paged, pagination: { more: results.length >= page * pageSize } }
success(options)
}
},
}
// 显示html时不转义标签
if (opt.enableHTML) prefer.escapeMarkup = markup => markup
$('#selectBox').select2(prefer)
$('#selectBox').val(null).trigger('change') $('#selectBox').val(null).trigger('change')
$('#selectBox').select2('open') $('#selectBox').select2('open')
$('#quickselect .select2').hide() $('#quickselect .select2').hide()
modWindowHeight()
utools.setSubInput(({text})=>{ utools.setSubInput(({text})=>{
$("#quickselect .select2-search__field").val(text).trigger('input') $("#quickselect .select2-search__field").val(text).trigger('input')
modWindowHeight($('#quickselect .select2-results__option').length) modWindowHeight()
}, placeholder) }, opt.placeholder)
$('#selectBox').on('select2:select', function (e) { $('#selectBox').on('select2:select', function (e) {
callback({ index: $(this).val(), text: $(`option[value="${$(this).val()}"]`).text() }) callback({ index: $(this).val(), text: $(`option[value="${$(this).val()}"]`).text() })
if (closeOnSelect) { if (opt.closeOnSelect) {
$('#selectBox').off('select2:select') $('#selectBox').off('select2:select')
utools.removeSubInput() utools.removeSubInput()
$("#quickselect").remove() $("#quickselect").remove()
@ -203,14 +234,16 @@ quickcommand = {
}) })
}, },
updateSelectList: function (opt, selected = false) { // 更新选项列表,暂时禁用
if(!$('#selectBox').length) throw '当前没有选择列表, 请结合 quickcommand.showSelectList 使用' // updateSelectList: function (opt, selected = false) {
var num = $('#quickselect .select2-results__option').length // if(!$('#selectBox').length) throw '当前没有选择列表, 请结合 quickcommand.showSelectList 使用'
$('#selectBox').append(new Option(opt, num, selected, selected)).trigger('change') // var num = $('#quickselect .select2-results__option').length
$("#quickselect .select2-search__field").trigger('input') // $('#selectBox').append(new Option(opt, num, selected, selected)).trigger('change')
if (!$("#customize").is(":parent")) utools.setExpendHeight(num > 10 ? 550 : 50 * num); // $("#quickselect .select2-search__field").trigger('input')
}, // if (!$("#customize").is(":parent")) utools.setExpendHeight($('.select2-results').height() > 600 ? 600 : $('.select2-results').height());
// },
// 显示文本输入框
showTextAera: function (callback, placeholder = "") { showTextAera: function (callback, placeholder = "") {
let helps = `正确用法: let helps = `正确用法:
quickcommand.showTextAera(text => { quickcommand.showTextAera(text => {
@ -232,8 +265,14 @@ quickcommand = {
}) })
}, },
// 关闭进程
kill: function (pid) { kill: function (pid) {
process.kill(pid) process.kill(pid)
},
// dom 解析
htmlParse: function (html) {
return new DOMParser().parseFromString(html, 'text/html')
} }
} }
@ -318,17 +357,26 @@ runCodeInVm = (cmd, cb, payload = "") => {
} }
let cbUnhandledError = e => { let cbUnhandledError = e => {
window.removeEventListener('error', cbUnhandledError) removeAllListener()
cb(null, e.error.toString()) cb(null, e.error.toString())
} }
let cbUnhandledRejection = e => { let cbUnhandledRejection = e => {
window.removeEventListener('unhandledrejection', cbUnhandledRejection) removeAllListener()
cb(null, e.reason.toString()) cb(null, e.reason.toString())
} }
window.addEventListener('error', cbUnhandledError) let removeAllListener = () => {
window.addEventListener('unhandledrejection', cbUnhandledRejection); window.removeEventListener('error', cbUnhandledError)
window.removeEventListener('unhandledrejection', cbUnhandledRejection)
delete window.isWatchingError
}
if (!window.isWatchingError) {
window.addEventListener('error', cbUnhandledError)
window.addEventListener('unhandledrejection', cbUnhandledRejection)
window.isWatchingError = true
}
} }
// shell代码提示当前环境变量下的所有命令 // shell代码提示当前环境变量下的所有命令