From 0f7f13306b9acb6c2d2275ec7402d513e76c4fcb Mon Sep 17 00:00:00 2001 From: fofolee Date: Fri, 8 Apr 2022 19:08:16 +0800 Subject: [PATCH] =?UTF-8?q?api=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/preload.js | 187 +++++------------------------------------ src/js/quickcommand.js | 158 +++++++++++++++++----------------- 2 files changed, 95 insertions(+), 250 deletions(-) diff --git a/public/preload.js b/public/preload.js index d373ed8..f1d6e74 100644 --- a/public/preload.js +++ b/public/preload.js @@ -56,7 +56,7 @@ const shortCodes = [ ctlKey = utools.isMacOs() ? 'command' : 'control' -quickcommand = { +window.quickcommand = { // 模拟复制操作 simulateCopy: function() { utools.simulateKeyboardTap('c', ctlKey); @@ -92,163 +92,13 @@ quickcommand = { }) }, - // 显示选项列表 showSelectList: function(selects, opt = {}) { - return new Promise((reslove, reject) => { - if (!(selects instanceof Array)) return reject(new TypeError(`应为 Array, 而非 ${typeof selects}`)) - opt.optionType || (opt.optionType = 'plaintext') - typeof opt.placeholder == 'undefined' && (opt.placeholder = "搜索,支持拼音") - typeof opt.enableSearch == 'undefined' && (opt.enableSearch = true) - if ($('#quickselect').length) $('#quickselect').remove() - let cancelButton = opt.showCancelButton ? '' : '' - $("body").append(`
${cancelButton}
`) - let item, data = [] - selects.forEach((s, i) => { - item = {} - if (opt.optionType == 'json') { - item.text = '' - Object.keys(s).forEach(k => item[k] = s[k]) - item.id = i - s.icon && (item.text += `
`) - s.title && (item.text += `
${s.title}
`) - s.description && (item.text += `
${s.description}
`) - } else { - item = { - id: i, - text: s - } - } - data.push(item) - }) - $('#selectBox').data('options', data) - $('#selectBox').data('type', opt.optionType) - var prefer = { - // data: data, - width: "100%", - dropdownParent: $("#quickselect"), - closeOnSelect: false, - // 支持无限滚动 - ajax: { - transport: (params, success, failure) => { - let cont, pageSize = 50 - let term = (params.data.term || '').toLowerCase() - let page = (params.data.page || 1) - let items = $('#selectBox').data('options') - let results = items.filter(x => { - if (opt.optionType == 'json') cont = x.title - else if (opt.optionType == 'html') cont = x.text.replace(/<[^<>]+>/g, '') - else cont = 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.optionType != 'plaintext') prefer.escapeMarkup = markup => markup - $('#selectBox').select2(prefer) - $('#selectBox').val(null).trigger('change') - $('#selectBox').select2('open') - $("#quickselect .select2-search__field").focus() - $('#quickselect .select2').hide() - opt.optionType == 'plaintext' && $('.select2-results').css({ - 'line-height': '40px' - }) - modWindowHeight($('.select2-results').outerHeight()) - opt.enableSearch && utools.setSubInput(({ - text - }) => { - $("#quickselect .select2-search__field").val(text).trigger('input') - modWindowHeight($('.select2-results').outerHeight()) - }, opt.placeholder) - // 关闭列表 - let closeSelect = () => { - $('#selectBox').off('select2:select') - utools.removeSubInput() - $("#quickselect").remove() - } - $('#selectBox').on('select2:select', function(e) { - let result = $('#selectBox').data('options')[$(this).val()] - delete result.selected - closeSelect() - reslove(result) - }) - $('.circleButton').click(() => { - closeSelect() - reslove(false) - }) - }); + return new Promise((reslove, reject) => {}) }, - // 更新选项列表 updateSelectList: function(opt, id) { - if (!$('#selectBox').length) throw '当前没有选择列表, 请结合 quickcommand.showSelectList 使用' - let data = $('#selectBox').data('options') - let num = data.length - typeof id == 'undefined' && (id = num) - if (id > num) throw 'id 不能大于当前列表数' - let optionType = $('#selectBox').data('type') - let item = { - id: id - } - if (optionType == 'json') { - item.text = '' - if (!(opt instanceof Object)) throw '更新的选项格式与当前的不一致' - Object.keys(opt).forEach(k => item[k] = opt[k]) - opt.icon && (item.text += `
`) - opt.title && (item.text += `
${opt.title}
`) - opt.description && (item.text += `
${opt.description}
`) - } else { - item.text = opt - } - data[id] && (data[id] = item) || data.push(item) - $('#selectBox').data('options', data).val(null).trigger('change') - $("#quickselect .select2-search__field").trigger('input') - modWindowHeight($('.select2-results').outerHeight()) - }, - // 显示文本输入框 - showTextAera: function(placeholder = "", value = "") { - return new Promise((reslove, reject) => { - utools.setExpendHeight(550) - var html = ` -
- - -
` - $("body").append(html) - $("#quicktextarea").addClass("fadeInUpWindow") - $(".circleButton").click(function() { - $("#quicktextarea").addClass("fadeOutDownWindow") - setTimeout(() => { - $("#quicktextarea").remove() - }, 300); - reslove($("#quicktextarea > textarea").val()) - }) - }); - }, - - showConfirmBox: async function(title) { - let options = { - text: title, - icon: 'warning', - showCancelButton: true, - confirmButtonColor: '#3085d6', - cancelButtonColor: '#d33', - confirmButtonText: '确定!', - cancelButtonText: '手抖...' - } - utools.setExpendHeight(550) - let result = await Swal.fire(options) - if (result.value) return true; }, // 关闭进程 @@ -345,22 +195,22 @@ if (process.platform !== 'linux') quickcommand.runInTerminal = function(cmdline, } let getCommandToLaunchTerminal = (cmdline, dir) => { - let cd = '' - if (utools.isWindows()) { - let appPath = path.join(utools.getPath('home'), '/AppData/Local/Microsoft/WindowsApps/') - // 直接 existsSync wt.exe 无效 - if (fs.existsSync(appPath) && fs.readdirSync(appPath).includes('wt.exe')) { - cmdline = cmdline.replace(/"/g, `\\"`) - if (dir) cd = `-d "${dir.replace(/\\/g, '/')}"` - command = `${appPath}wt.exe ${cd} cmd /k "${cmdline}"` - } else { - cmdline = cmdline.replace(/"/g, `^"`) - if (dir) cd = `cd /d "${dir.replace(/\\/g, '/')}" &&` - command = `${cd} start "" cmd /k "${cmdline}"` - } - } else { + let cd = '' + if (utools.isWindows()) { + let appPath = path.join(utools.getPath('home'), '/AppData/Local/Microsoft/WindowsApps/') + // 直接 existsSync wt.exe 无效 + if (fs.existsSync(appPath) && fs.readdirSync(appPath).includes('wt.exe')) { cmdline = cmdline.replace(/"/g, `\\"`) - if (dir) cd = `cd ${dir.replace(/ /g, `\\\\ `)} &&` + if (dir) cd = `-d "${dir.replace(/\\/g, '/')}"` + command = `${appPath}wt.exe ${cd} cmd /k "${cmdline}"` + } else { + cmdline = cmdline.replace(/"/g, `^"`) + if (dir) cd = `cd /d "${dir.replace(/\\/g, '/')}" &&` + command = `${cd} start "" cmd /k "${cmdline}"` + } + } else { + cmdline = cmdline.replace(/"/g, `\\"`) + if (dir) cd = `cd ${dir.replace(/ /g, `\\\\ `)} &&` if (fs.existsSync('/Applications/iTerm.app')) { command = `osascript -e 'tell application "iTerm" create window with default profile @@ -515,7 +365,8 @@ runCodeInVm = (cmd, cb, enterData = {}) => { }); let liteErr = e => { - return e?.stack.replace(/([ ] +at.+)|(.+\.js:\d+)/g, '').trim() + if (!e) return + return e.stack.replace(/([ ] +at.+)|(.+\.js:\d+)/g, '').trim() } // 错误处理 diff --git a/src/js/quickcommand.js b/src/js/quickcommand.js index 055a606..a4f3e79 100644 --- a/src/js/quickcommand.js +++ b/src/js/quickcommand.js @@ -11,96 +11,90 @@ import inputBox from "../components/quickcommandUI/InputBox" import buttonBox from "../components/quickcommandUI/ButtonBox" import TextArea from "../components/quickcommandUI/TextArea" - -let showInputBox = (options = ["请输入"], title = "") => { - return new Promise((reslove, reject) => { - let props = { - labels: [], - values: [], - hints: [], - title: title - } - if (!(options instanceof Object)) return reject(new TypeError("必须为数组或对象")) - if (options instanceof Array) props.labels = options - else Object.assign(props, options) - Dialog.create({ - component: inputBox, - componentProps: props - }).onOk(results => { - reslove(Array.from(results)) - }).onCancel(() => { - console.log('取消') +const quickcommand = { + showInputBox: (options = ["请输入"], title = "") => { + return new Promise((reslove, reject) => { + let props = { + labels: [], + values: [], + hints: [], + title: title + } + if (!(options instanceof Object)) return reject(new TypeError("必须为数组或对象")) + if (options instanceof Array) props.labels = options + else Object.assign(props, options) + Dialog.create({ + component: inputBox, + componentProps: props + }).onOk(results => { + reslove(Array.from(results)) + }).onCancel(() => { + console.log('取消') + }) }) - }) -}; + }, -let showButtonBox = (labels = ["确定"], title = "") => { - return new Promise((reslove, reject) => { - if (!(labels instanceof Array)) return reject(new TypeError("必须为数组")) - let props = { - labels: labels, - title: title - } - Dialog.create({ - component: buttonBox, - componentProps: props - }).onOk(results => { - reslove(results) - }).onCancel(() => { - console.log('取消') + showButtonBox: (labels = ["确定"], title = "") => { + return new Promise((reslove, reject) => { + if (!(labels instanceof Array)) return reject(new TypeError("必须为数组")) + let props = { + labels: labels, + title: title + } + Dialog.create({ + component: buttonBox, + componentProps: props + }).onOk(results => { + reslove(results) + }).onCancel(() => { + console.log('取消') + }) }) - }) -}; + }, -let showConfirmBox = (message = "", title = "提示") => { - return new Promise((reslove, reject) => { - Dialog.create({ - title: title, + showConfirmBox: (message = "", title = "提示") => { + return new Promise((reslove, reject) => { + Dialog.create({ + title: title, + message: message, + cancel: true, + persistent: true + }).onOk(() => { + reslove(true) + }).onCancel(() => { + reslove(false) + }) + }) + }, + + showMessageBox: (message, icon = 'success', time = 3000) => { + if (icon === 'success') icon = 'positive' + if (icon === 'error') icon = 'negative' + Notify.create({ + type: icon, message: message, - cancel: true, - persistent: true - }).onOk(() => { - reslove(true) - }).onCancel(() => { - reslove(false) + timeout: time, + position: 'top', }) - }) -} + }, -let showMessageBox = (message, icon = 'success', time = 3000) => { - if (icon === 'success') icon = 'positive' - if (icon === 'error') icon = 'negative' - Notify.create({ - type: icon, - message: message, - timeout: time, - position: 'top', - }) -} - -let showTextArea = (placeholder = "", value = "") => { - return new Promise((reslove, reject) => { - let props = { - placeholder: placeholder, - value: value - } - Dialog.create({ - component: TextArea, - componentProps: props - }).onOk(results => { - reslove(results) - }).onCancel(() => { - console.log('取消') + showTextArea: (placeholder = "", value = "") => { + return new Promise((reslove, reject) => { + let props = { + placeholder: placeholder, + value: value + } + Dialog.create({ + component: TextArea, + componentProps: props + }).onOk(results => { + reslove(results) + }).onCancel(() => { + console.log('取消') + }) }) - }) + } } - -export default { - showInputBox, - showMessageBox, - showConfirmBox, - showButtonBox, - showTextArea -}; \ No newline at end of file +export default quickcommand