Update: xpython板卡工具栏添加烧录额外固件选项
This commit is contained in:
@@ -507,6 +507,22 @@ class App extends Component {
|
|||||||
weight: 1
|
weight: 1
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.#nav_.register({
|
||||||
|
icon: 'icon-upload-1',
|
||||||
|
id: ['setting', 'firmware'],
|
||||||
|
displayText: Msg.Lang['nav.btn.setting.firmware'],
|
||||||
|
preconditionFn: () => {
|
||||||
|
if (goog.isElectron) {
|
||||||
|
return !!BOARD?.burn?.special;
|
||||||
|
} else {
|
||||||
|
return !!BOARD?.web?.burn?.special;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
callback: () => BU.burnWithSpecialBin(),
|
||||||
|
scopeType: Nav.Scope.RIGHT,
|
||||||
|
weight: 2
|
||||||
|
});
|
||||||
|
|
||||||
this.#nav_.register({
|
this.#nav_.register({
|
||||||
icon: 'icon-comment-1',
|
icon: 'icon-comment-1',
|
||||||
id: ['setting', 'feedback'],
|
id: ['setting', 'feedback'],
|
||||||
@@ -519,7 +535,7 @@ class App extends Component {
|
|||||||
Url.open(href);
|
Url.open(href);
|
||||||
},
|
},
|
||||||
scopeType: Nav.Scope.RIGHT,
|
scopeType: Nav.Scope.RIGHT,
|
||||||
weight: 2
|
weight: 3
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ LayerExt.DEFAULT_CONFIG = {
|
|||||||
resize: true,
|
resize: true,
|
||||||
shade: LayerExt.SHADE_ALL,
|
shade: LayerExt.SHADE_ALL,
|
||||||
success: null,
|
success: null,
|
||||||
|
beforeEnd: null,
|
||||||
end: null,
|
end: null,
|
||||||
cancel: null,
|
cancel: null,
|
||||||
resizing: null,
|
resizing: null,
|
||||||
@@ -122,6 +123,12 @@ LayerExt.open = (toolConfig) => {
|
|||||||
if (typeof success === 'function')
|
if (typeof success === 'function')
|
||||||
success(layero, index);
|
success(layero, index);
|
||||||
},
|
},
|
||||||
|
beforeEnd: function (layero, index, that) {
|
||||||
|
const { beforeEnd } = toolConfig;
|
||||||
|
if (typeof beforeEnd === 'function') {
|
||||||
|
beforeEnd(layero, index, that);
|
||||||
|
}
|
||||||
|
},
|
||||||
end: function () {
|
end: function () {
|
||||||
const { end } = toolConfig;
|
const { end } = toolConfig;
|
||||||
if (typeof end === 'function') {
|
if (typeof end === 'function') {
|
||||||
|
|||||||
@@ -1291,6 +1291,7 @@
|
|||||||
"Mixly.Msg",
|
"Mixly.Msg",
|
||||||
"Mixly.Workspace",
|
"Mixly.Workspace",
|
||||||
"Mixly.Debug",
|
"Mixly.Debug",
|
||||||
|
"Mixly.HTMLTemplate",
|
||||||
"Mixly.Electron.Serial"
|
"Mixly.Electron.Serial"
|
||||||
],
|
],
|
||||||
"provide": [
|
"provide": [
|
||||||
@@ -1550,6 +1551,7 @@
|
|||||||
{
|
{
|
||||||
"path": "/web/burn-upload.js",
|
"path": "/web/burn-upload.js",
|
||||||
"require": [
|
"require": [
|
||||||
|
"path",
|
||||||
"ESPTool",
|
"ESPTool",
|
||||||
"AdafruitESPTool",
|
"AdafruitESPTool",
|
||||||
"CryptoJS",
|
"CryptoJS",
|
||||||
@@ -1562,6 +1564,7 @@
|
|||||||
"Mixly.Msg",
|
"Mixly.Msg",
|
||||||
"Mixly.Workspace",
|
"Mixly.Workspace",
|
||||||
"Mixly.Debug",
|
"Mixly.Debug",
|
||||||
|
"Mixly.HTMLTemplate",
|
||||||
"Mixly.Web.Serial",
|
"Mixly.Web.Serial",
|
||||||
"Mixly.Web.USB",
|
"Mixly.Web.USB",
|
||||||
"Mixly.Web.Ampy"
|
"Mixly.Web.Ampy"
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ goog.require('Mixly.MString');
|
|||||||
goog.require('Mixly.Msg');
|
goog.require('Mixly.Msg');
|
||||||
goog.require('Mixly.Workspace');
|
goog.require('Mixly.Workspace');
|
||||||
goog.require('Mixly.Debug');
|
goog.require('Mixly.Debug');
|
||||||
|
goog.require('Mixly.HTMLTemplate');
|
||||||
goog.require('Mixly.Electron.Serial');
|
goog.require('Mixly.Electron.Serial');
|
||||||
goog.provide('Mixly.Electron.BU');
|
goog.provide('Mixly.Electron.BU');
|
||||||
|
|
||||||
@@ -22,7 +23,8 @@ const {
|
|||||||
Msg,
|
Msg,
|
||||||
Workspace,
|
Workspace,
|
||||||
Serial,
|
Serial,
|
||||||
Debug
|
Debug,
|
||||||
|
HTMLTemplate
|
||||||
} = Mixly;
|
} = Mixly;
|
||||||
|
|
||||||
const { BU } = Electron;
|
const { BU } = Electron;
|
||||||
@@ -46,6 +48,13 @@ BU.burning = false;
|
|||||||
|
|
||||||
BU.shell = null;
|
BU.shell = null;
|
||||||
|
|
||||||
|
BU.FILMWARE_LAYER = new HTMLTemplate(
|
||||||
|
goog.get(path.join(Env.templatePath, 'html/filmware-layer.html'))
|
||||||
|
).render({
|
||||||
|
cancel: Msg.Lang['nav.btn.cancel'],
|
||||||
|
burn: Msg.Lang['nav.btn.burn']
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @function 根据传入的stdout判断磁盘数量并选择对应操作
|
* @function 根据传入的stdout判断磁盘数量并选择对应操作
|
||||||
* @param type {string} 值为'burn' | 'upload'
|
* @param type {string} 值为'burn' | 'upload'
|
||||||
@@ -595,62 +604,52 @@ BU.runCmd = function (layerNum, type, port, command, sucFunc) {
|
|||||||
BU.burnWithSpecialBin = () => {
|
BU.burnWithSpecialBin = () => {
|
||||||
const { mainStatusBarTabs } = Mixly;
|
const { mainStatusBarTabs } = Mixly;
|
||||||
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
|
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
|
||||||
const $selector = $('#mixly-selector-type');
|
const firmwares = SELECTED_BOARD.burn.special;
|
||||||
let oldOption = $('#mixly-selector-type option:selected').val();
|
let menu = [];
|
||||||
$selector.empty();
|
for (let firmware of firmwares) {
|
||||||
const firmwareList = SELECTED_BOARD.burn.special;
|
|
||||||
let firmwareObj = {};
|
|
||||||
for (let firmware of firmwareList) {
|
|
||||||
if (!firmware?.name && !firmware?.command) return;
|
if (!firmware?.name && !firmware?.command) return;
|
||||||
firmwareObj[firmware.name] = firmware.command;
|
menu.push({
|
||||||
if (`${firmware.name}` == oldOption) {
|
id: firmware.command,
|
||||||
$selector.append($(`<option value="${firmware.name}" selected>${firmware.name}</option>`));
|
text: firmware.name
|
||||||
} else {
|
});
|
||||||
$selector.append($(`<option value="${firmware.name}">${firmware.name}</option>`));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
form.render();
|
LayerExt.open({
|
||||||
|
title: [Msg.Lang['nav.btn.burn'], '36px'],
|
||||||
let initBtnClicked = false;
|
area: ['400px', '160px'],
|
||||||
|
max: false,
|
||||||
const layerNum = layer.open({
|
min: false,
|
||||||
type: 1,
|
content: BU.FILMWARE_LAYER,
|
||||||
id: "serial-select",
|
|
||||||
title: "请选择固件:",
|
|
||||||
area: ['350px', '150px'],
|
|
||||||
content: $('#mixly-selector-div'),
|
|
||||||
shade: Mixly.LayerExt.SHADE_ALL,
|
shade: Mixly.LayerExt.SHADE_ALL,
|
||||||
resize: false,
|
resize: false,
|
||||||
closeBtn: 0,
|
success: function (layero, index) {
|
||||||
success: function (layero) {
|
const $select = layero.find('select');
|
||||||
$('#serial-select').css('height', '180px');
|
$select.select2({
|
||||||
$('#serial-select').css('overflow', 'inherit');
|
data: menu,
|
||||||
$(".layui-layer-page").css("z-index", "198910151");
|
minimumResultsForSearch: 50,
|
||||||
$("#mixly-selector-btn1").off("click").click(() => {
|
width: '360px',
|
||||||
layer.close(layerNum);
|
dropdownCssClass: 'mixly-scrollbar'
|
||||||
});
|
});
|
||||||
$("#mixly-selector-btn2").click(() => {
|
layero.find('button').click((event) => {
|
||||||
layer.close(layerNum);
|
const $target = $(event.currentTarget);
|
||||||
initBtnClicked = true;
|
const type = $target.attr('data-id');
|
||||||
|
const command = $select.val();
|
||||||
|
layer.close(index, () => {
|
||||||
|
if (type !== 'burn') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
statusBarTerminal.setValue('');
|
||||||
|
mainStatusBarTabs.changeTo('output');
|
||||||
|
mainStatusBarTabs.show();
|
||||||
|
BU.burning = true;
|
||||||
|
BU.uploading = false;
|
||||||
|
const port = Serial.getSelectedPortName();
|
||||||
|
BU.burnWithPort(port, command);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
end: function () {
|
beforeEnd: function (layero) {
|
||||||
$("#mixly-selector-btn1").off("click");
|
layero.find('select').select2('destroy');
|
||||||
$("#mixly-selector-btn2").off("click");
|
layero.find('button').off();
|
||||||
$('#mixly-selector-div').css('display', 'none');
|
|
||||||
$(".layui-layer-shade").remove();
|
|
||||||
if (initBtnClicked) {
|
|
||||||
let selectedFirmwareName = $('#mixly-selector-type option:selected').val();
|
|
||||||
statusBarTerminal.setValue('');
|
|
||||||
mainStatusBarTabs.changeTo('output');
|
|
||||||
mainStatusBarTabs.show();
|
|
||||||
BU.burning = true;
|
|
||||||
BU.uploading = false;
|
|
||||||
const port = Serial.getSelectedPortName();
|
|
||||||
BU.burnWithPort(port, firmwareObj[selectedFirmwareName]);
|
|
||||||
} else {
|
|
||||||
layer.msg(Msg.Lang['shell.burnCanceled'], { time: 1000 });
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
goog.loadJs('web', () => {
|
goog.loadJs('web', () => {
|
||||||
|
|
||||||
|
goog.require('path');
|
||||||
goog.require('ESPTool');
|
goog.require('ESPTool');
|
||||||
goog.require('AdafruitESPTool');
|
goog.require('AdafruitESPTool');
|
||||||
goog.require('CryptoJS');
|
goog.require('CryptoJS');
|
||||||
@@ -12,6 +13,7 @@ goog.require('Mixly.Boards');
|
|||||||
goog.require('Mixly.Msg');
|
goog.require('Mixly.Msg');
|
||||||
goog.require('Mixly.Workspace');
|
goog.require('Mixly.Workspace');
|
||||||
goog.require('Mixly.Debug');
|
goog.require('Mixly.Debug');
|
||||||
|
goog.require('Mixly.HTMLTemplate');
|
||||||
goog.require('Mixly.Web.Serial');
|
goog.require('Mixly.Web.Serial');
|
||||||
goog.require('Mixly.Web.USB');
|
goog.require('Mixly.Web.USB');
|
||||||
goog.require('Mixly.Web.Ampy');
|
goog.require('Mixly.Web.Ampy');
|
||||||
@@ -26,7 +28,8 @@ const {
|
|||||||
Boards,
|
Boards,
|
||||||
Msg,
|
Msg,
|
||||||
Workspace,
|
Workspace,
|
||||||
Debug
|
Debug,
|
||||||
|
HTMLTemplate
|
||||||
} = Mixly;
|
} = Mixly;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -47,6 +50,13 @@ const {
|
|||||||
BU.uploading = false;
|
BU.uploading = false;
|
||||||
BU.burning = false;
|
BU.burning = false;
|
||||||
|
|
||||||
|
BU.FILMWARE_LAYER = new HTMLTemplate(
|
||||||
|
goog.get(path.join(Env.templatePath, 'html/filmware-layer.html'))
|
||||||
|
).render({
|
||||||
|
cancel: Msg.Lang['nav.btn.cancel'],
|
||||||
|
burn: Msg.Lang['nav.btn.burn']
|
||||||
|
});
|
||||||
|
|
||||||
const BAUD = goog.platform() === 'darwin' ? 460800 : 921600;
|
const BAUD = goog.platform() === 'darwin' ? 460800 : 921600;
|
||||||
|
|
||||||
BU.requestPort = () => {
|
BU.requestPort = () => {
|
||||||
@@ -112,10 +122,17 @@ BU.initBurn = () => {
|
|||||||
BU.burnByUSB();
|
BU.burnByUSB();
|
||||||
} else {
|
} else {
|
||||||
const boardKey = Boards.getSelectedBoardKey();
|
const boardKey = Boards.getSelectedBoardKey();
|
||||||
|
const { web } = SELECTED_BOARD;
|
||||||
|
if (!web?.burn?.binFile) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (typeof web.burn.binFile !== 'object') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (boardKey.indexOf('micropython:esp32s2') !== -1) {
|
if (boardKey.indexOf('micropython:esp32s2') !== -1) {
|
||||||
BU.burnWithAdafruitEsptool();
|
BU.burnWithAdafruitEsptool(web.burn.binFile);
|
||||||
} else {
|
} else {
|
||||||
BU.burnWithEsptool();
|
BU.burnWithEsptool(web.burn.binFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -202,9 +219,7 @@ BU.burnByUSB = () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
BU.burnWithEsptool = async () => {
|
BU.burnWithEsptool = async (binFile) => {
|
||||||
const { web } = SELECTED_BOARD;
|
|
||||||
const { burn } = web;
|
|
||||||
const { mainStatusBarTabs } = Mixly;
|
const { mainStatusBarTabs } = Mixly;
|
||||||
const portName = Serial.getSelectedPortName();
|
const portName = Serial.getSelectedPortName();
|
||||||
if (!portName) {
|
if (!portName) {
|
||||||
@@ -251,12 +266,6 @@ BU.burnWithEsptool = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "...");
|
statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "...");
|
||||||
if (typeof burn.binFile !== 'object') {
|
|
||||||
statusBarTerminal.addValue(" Failed!\n" + Msg.Lang['shell.bin.readFailed'] + "!\n");
|
|
||||||
await transport.disconnect();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const { binFile } = burn;
|
|
||||||
let firmwarePromise = [];
|
let firmwarePromise = [];
|
||||||
statusBarTerminal.addValue("\n");
|
statusBarTerminal.addValue("\n");
|
||||||
for (let i of binFile) {
|
for (let i of binFile) {
|
||||||
@@ -322,9 +331,7 @@ BU.burnWithEsptool = async () => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
BU.burnWithAdafruitEsptool = async () => {
|
BU.burnWithAdafruitEsptool = async (binFile) => {
|
||||||
const { web } = SELECTED_BOARD;
|
|
||||||
const { burn } = web;
|
|
||||||
const { mainStatusBarTabs } = Mixly;
|
const { mainStatusBarTabs } = Mixly;
|
||||||
const portName = Serial.getSelectedPortName();
|
const portName = Serial.getSelectedPortName();
|
||||||
if (!portName) {
|
if (!portName) {
|
||||||
@@ -369,13 +376,6 @@ BU.burnWithAdafruitEsptool = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "...");
|
statusBarTerminal.addValue(Msg.Lang['shell.bin.reading'] + "...");
|
||||||
if (typeof burn.binFile !== 'object') {
|
|
||||||
statusBarTerminal.addValue(" Failed!\n" + Msg.Lang['shell.bin.readFailed'] + "!\n");
|
|
||||||
await espStub.disconnect();
|
|
||||||
await espStub.port.close();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const { binFile } = burn;
|
|
||||||
let firmwarePromise = [];
|
let firmwarePromise = [];
|
||||||
statusBarTerminal.addValue("\n");
|
statusBarTerminal.addValue("\n");
|
||||||
for (let i of binFile) {
|
for (let i of binFile) {
|
||||||
@@ -686,4 +686,63 @@ BU.uploadWithAvrUploader = async (endType, obj, layerType) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function 特殊固件的烧录
|
||||||
|
* @return {void}
|
||||||
|
**/
|
||||||
|
BU.burnWithSpecialBin = () => {
|
||||||
|
const { mainStatusBarTabs } = Mixly;
|
||||||
|
const statusBarTerminal = mainStatusBarTabs.getStatusBarById('output');
|
||||||
|
const firmwares = SELECTED_BOARD.web.burn.special;
|
||||||
|
let menu = [];
|
||||||
|
let firmwareMap = {};
|
||||||
|
for (let firmware of firmwares) {
|
||||||
|
if (!firmware?.name && !firmware?.binFile) return;
|
||||||
|
menu.push({
|
||||||
|
id: firmware.name,
|
||||||
|
text: firmware.name
|
||||||
|
});
|
||||||
|
firmwareMap[firmware.name] = firmware.binFile;
|
||||||
|
}
|
||||||
|
LayerExt.open({
|
||||||
|
title: [Msg.Lang['nav.btn.burn'], '36px'],
|
||||||
|
area: ['400px', '160px'],
|
||||||
|
max: false,
|
||||||
|
min: false,
|
||||||
|
content: BU.FILMWARE_LAYER,
|
||||||
|
shade: Mixly.LayerExt.SHADE_ALL,
|
||||||
|
resize: false,
|
||||||
|
success: function (layero, index) {
|
||||||
|
const $select = layero.find('select');
|
||||||
|
$select.select2({
|
||||||
|
data: menu,
|
||||||
|
minimumResultsForSearch: 50,
|
||||||
|
width: '360px',
|
||||||
|
dropdownCssClass: 'mixly-scrollbar'
|
||||||
|
});
|
||||||
|
layero.find('button').click((event) => {
|
||||||
|
const $target = $(event.currentTarget);
|
||||||
|
const type = $target.attr('data-id');
|
||||||
|
const binFile = firmwareMap[$select.val()];
|
||||||
|
layer.close(index, () => {
|
||||||
|
if (type !== 'burn') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const boardKey = Boards.getSelectedBoardKey();
|
||||||
|
const { web } = SELECTED_BOARD;
|
||||||
|
if (boardKey.indexOf('micropython:esp32s2') !== -1) {
|
||||||
|
BU.burnWithAdafruitEsptool(binFile);
|
||||||
|
} else {
|
||||||
|
BU.burnWithEsptool(binFile);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
beforeEnd: function (layero) {
|
||||||
|
layero.find('select').select2('destroy');
|
||||||
|
layero.find('button').off();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -284,6 +284,7 @@
|
|||||||
"nav.btn.file.exportAs": "Export lib",
|
"nav.btn.file.exportAs": "Export lib",
|
||||||
"nav.btn.setting": "Settings",
|
"nav.btn.setting": "Settings",
|
||||||
"nav.btn.setting.manageLibs": "Manage libs",
|
"nav.btn.setting.manageLibs": "Manage libs",
|
||||||
|
"nav.btn.setting.firmware": "Firmware",
|
||||||
"nav.btn.setting.feedback": "Feedback",
|
"nav.btn.setting.feedback": "Feedback",
|
||||||
"shell.compiling": "Compiling",
|
"shell.compiling": "Compiling",
|
||||||
"shell.compileFailed": "Compile failed",
|
"shell.compileFailed": "Compile failed",
|
||||||
|
|||||||
@@ -284,6 +284,7 @@
|
|||||||
"nav.btn.file.exportAs": "导出库",
|
"nav.btn.file.exportAs": "导出库",
|
||||||
"nav.btn.setting": "设置",
|
"nav.btn.setting": "设置",
|
||||||
"nav.btn.setting.manageLibs": "管理库",
|
"nav.btn.setting.manageLibs": "管理库",
|
||||||
|
"nav.btn.setting.firmware": "固件",
|
||||||
"nav.btn.setting.feedback": "反馈",
|
"nav.btn.setting.feedback": "反馈",
|
||||||
"shell.compiling": "编译中",
|
"shell.compiling": "编译中",
|
||||||
"shell.compileFailed": "编译失败",
|
"shell.compileFailed": "编译失败",
|
||||||
|
|||||||
@@ -284,6 +284,7 @@
|
|||||||
"nav.btn.file.exportAs": "匯出函式庫",
|
"nav.btn.file.exportAs": "匯出函式庫",
|
||||||
"nav.btn.setting": "設定",
|
"nav.btn.setting": "設定",
|
||||||
"nav.btn.setting.manageLibs": "管理函式庫",
|
"nav.btn.setting.manageLibs": "管理函式庫",
|
||||||
|
"nav.btn.setting.firmware": "韌體",
|
||||||
"nav.btn.setting.feedback": "回饋",
|
"nav.btn.setting.feedback": "回饋",
|
||||||
"shell.compiling": "編譯中",
|
"shell.compiling": "編譯中",
|
||||||
"shell.compileFailed": "編譯失敗",
|
"shell.compileFailed": "編譯失敗",
|
||||||
|
|||||||
19
common/templates/html/filmware-layer.html
Normal file
19
common/templates/html/filmware-layer.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<style>
|
||||||
|
div[m-id="{{d.mId}}"] > .select2-container {
|
||||||
|
margin: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div[m-id="{{d.mId}}"] > .layui-btn-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div m-id="{{d.mId}}" class="page-item">
|
||||||
|
<select class="type"></select>
|
||||||
|
<div class="layui-btn-container">
|
||||||
|
<button type="button" data-id="cancel" class="layui-btn layui-btn-sm self-adaption-btn">{{d.cancel}}</button>
|
||||||
|
<button type="button" data-id="burn" class="layui-btn layui-btn-sm self-adaption-btn">{{d.burn}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user