1 <div class=
"box box-primary" id=
"control">
2 <div class=
"box-header">
3 <div class=
"col-sm-9" style=
"padding-top:8px;">
4 <i class=
"fa fa-database"> </i>
5 <h1 class=
"box-title" style=
"font-weight:bold;" id=
"id_h1_page_title">x
</h1>
7 <div class=
"col-sm-1" style=
"padding-top:2px;">
8 <button id=
"id_btn_reset" class=
"btn btn-sm btn-danger btn-del"><i class=
"fa fa-trash"></i><span id=
"id_btn_span_reset">Reset
</span></button>
10 <div class=
"col-sm-2" style=
"font-size:16px;padding-top:8px;">
11 <a id=
"id_a_official_doc" target=
"_blank" href=
"https://www.ventoy.net/en/plugin_persistence.html"><span class=
"fa fa-link"></span><span id=
"id_span_official_doc">官网文档
</span></a>
16 <div class=
"box-body">
17 <div class=
"nav-tabs-custom">
18 <ul class=
"nav nav-tabs" id=
"id_tab_persistence">
19 <li class=
""><a href=
"#tab_0" data-toggle=
"tab" aria-expanded=
"false" style=
"font-weight:bold" >persistence
</a></li>
20 <li class=
""><a href=
"#tab_1" data-toggle=
"tab" aria-expanded=
"false" style=
"font-weight:bold">persistence_legacy
</a></li>
21 <li class=
""><a href=
"#tab_2" data-toggle=
"tab" aria-expanded=
"false" style=
"font-weight:bold">persistence_uefi
</a></li>
22 <li class=
""><a href=
"#tab_3" data-toggle=
"tab" aria-expanded=
"false" style=
"font-weight:bold">persistence_ia32
</a></li>
23 <li class=
""><a href=
"#tab_4" data-toggle=
"tab" aria-expanded=
"false" style=
"font-weight:bold">persistence_aa64
</a></li>
24 <li class=
""><a href=
"#tab_5" data-toggle=
"tab" aria-expanded=
"false" style=
"font-weight:bold">persistence_mips
</a></li>
28 <table id=
"id_persistence_tbl" class=
"table table-bordered" >
31 <th style=
"width: 5%;">#
</th>
32 <th id=
"id_th_persistence_set" style=
"width: 80%;"></th>
33 <th id=
"id_th_operation" style=
"width: 10%;"></th>
41 <script type=
"text/javascript">
43 function VtoyPageLanguageChange(newlang) {
44 VtoyCommonChangeLanguage(newlang);
45 $('h1[id=id_h1_page_title]').text(g_vtoy_cur_language.STR_PLUG_PERSISTENCE);
47 $("span[id=id_span_file_exist]").each(function(){
48 $(this).text(g_vtoy_cur_language.STR_FILE_EXIST);
50 $("span[id=id_span_file_nonexist]").each(function(){
51 $(this).text(g_vtoy_cur_language.STR_FILE_NONEXIST);
53 $("span[id=id_span_file_fuzzy]").each(function(){
54 $(this).text(g_vtoy_cur_language.STR_FILE_FUZZY);
57 $("span[id=id_span_dir_exist]").each(function(){
58 $(this).text(g_vtoy_cur_language.STR_DIR_EXIST);
61 $("span[id=id_span_dir_nonexist]").each(function(){
62 $(this).text(g_vtoy_cur_language.STR_DIR_NONEXIST);
65 $("th[id=id_th_persist_dat]").each(function(){
66 $(this).text(g_vtoy_cur_language.STR_PERSISTENCE_DAT);
69 if (newlang === 'en') {
70 $('#id_th_autoins_path').text('Absolute Path');
71 $('#id_th_persistence_set').text('Setting');
73 $('#id_th_autoins_path').text('绝对路径');
74 $('#id_th_persistence_set').text('设置');
79 function VtoySaveCurrentPage(index) {
84 var timeouten = $('#id_timeout_en_' + index).is(':checked');
85 var autoselen = $('#id_autosel_en_' + index).is(':checked');
88 timeoutval = parseInt($('#id_text_timeout_' + index).val());
92 autoselval = parseInt($('#id_text_autosel_' + index).val());
96 method : 'save_persistence',
97 index: current_tab_index,
101 timeouten: timeouten,
104 Message.success(g_vtoy_cur_language.STR_SAVE_SUCCESS);
108 function OnInputTextChange() {
109 var id = $(this).attr('id');
110 var value = $(this).val();
113 if (typeof(id) == 'undefined' || id.length <=
16) {
117 var index = parseInt(id.substr(
16));
118 var data = m_data_persistence[current_tab_index][index];
120 if (/^[
0-
9][
0-
9]*$/.test(value)) {
121 intval = parseInt(value);
123 if (id.startsWith('id_text_autosel_')) {
124 var list = m_data_persistence[current_tab_index][index].list;
125 if (intval
> list.length) {
126 Message.error(g_vtoy_cur_language.STR_INVALID_AUTOSEL);
127 $(this).val(data.autosel);
132 VtoySaveCurrentPage(index);
134 Message.error(g_vtoy_cur_language.STR_INVALID_NUMBER);
136 if (id.startsWith('id_text_timeout_')) {
137 $(this).val(data.timeout);
139 $(this).val(data.autosel);
144 function OnCheckBoxChange() {
148 var id = $(this).attr('id');
149 var checked = $(this).is(':checked');
151 if (typeof(id) == 'undefined' || id.length <=
14) {
155 index = parseInt(id.substr(
14));
156 var data = m_data_persistence[current_tab_index][index];
158 if (id.startsWith('id_timeout_en_')) {
159 textid = 'input[id=id_text_timeout_' + index + ']';
160 value = data.timeout;
161 data.timeouten = checked;
163 textid = 'input[id=id_text_autosel_' + index + ']';
164 value = data.autosel;
165 data.autoselen = checked;
169 $(textid).attr("disabled", false);
170 $(textid).val(value);
173 $(textid).attr("disabled", true);
177 VtoySaveCurrentPage(index);
181 function FillPersistenceInnerTable(i, data) {
182 var td1, td2, td3, td4;
183 var inner = data.list;
184 var tabid = '#tbl_inner_' + (i +
1);
185 var $inner_tbl = $(tabid + ' tbody');
187 var inaddbtn = ventoy_get_xslg_addbtn('PersistenceInnerAddBtn');
188 var indelbtn = ventoy_get_xslg_delbtn('PersistenceInnerDelBtn');
192 for (var j =
0; j < inner.length; j++) {
194 td1 = '
<td style=
"width: 5%;">'+(j+
1)+'
</td>';
195 td2 = '
<td>'+inner[j].path+'
</td>';
196 td3 = '
<td style=
"width: 10%;">'+ventoy_get_status_line(
0, inner[j].valid)+'
</td>';
197 td4 = '
<td style=
"width: 10%;">' + indelbtn + '
</td>';
199 $tr = $('
<tr>' + td1 + td2 + td3 + td4 + '
</tr>');
200 $tr.data('path', inner[j].path);
201 $tr.data('index', j);
202 $tr.data('outpath', data.path);
203 $tr.data('outindex', i);
205 $inner_tbl.append($tr);
208 $tr = $('
<tr><td></td><td></td><td></td><td>'+inaddbtn+'
</td></tr>');
209 $tr.data('outpath', data.path);
210 $tr.data('outindex', i);
212 $inner_tbl.append($tr);
215 function FillPersistenceTable(data) {
216 var td1, td2, td3, td4, td5;
217 var addbtn = ventoy_get_addbtn('PersistenceAddBtn');
218 var delbtn = ventoy_get_delbtn('PersistenceDelBtn');
220 var $tbl = $("#id_persistence_tbl tbody");
223 for (var i =
0; i < data.length; i++) {
226 var tdtimeout, timeoutdisable, timeoutval;
227 var tdautosel, autoseldisable, autoselval;
228 if (data[i].timeouten) {
229 tdtimeout = '
<th style=
"width:10%;"><input id=
"id_timeout_en_'+i+'" checked=
"checked" type=
"checkbox"/> timeout
</th>';
230 timeoutval = data[i].timeout;
233 tdtimeout = '
<th style=
"width:10%;"><input id=
"id_timeout_en_'+i+'" type=
"checkbox"/> timeout
</th>';
235 timeoutdisable='
disabled="disabled"';
237 if (data[i].autoselen) {
238 tdautosel = '
<th style=
"width:10%;"><input id=
"id_autosel_en_'+i+'" checked=
"checked" type=
"checkbox"/> autosel
</th>';
239 autoselval = data[i].autosel;
242 tdautosel = '
<th style=
"width:10%;"><input id=
"id_autosel_en_'+i+'" type=
"checkbox"/> autosel
</th>';
244 autoseldisable='
disabled="disabled"';
248 var tdtype = (data[i].type ===
0) ? "image" : "parent";
249 var tdtbl1 ='
<table class=
"table table-condensed">'+
252 '
<th>'+tdtype+'
</th>'+
253 '
<th style=
"width:10%;">Status
</th>'+
259 '
<td style=
"width:70%;vertical-align: middle;">' + data[i].path + '
</td>' +
260 '
<td style=
"vertical-align: middle;">' + ventoy_get_status_line(data[i].type, data[i].valid) + '
</td>' +
261 '
<td><div style=
"padding-left:0;" class=
"col-sm-8"><input type=
"text" '+timeoutdisable+'
value=
"'+timeoutval+'" class=
"form-control" id=
"id_text_timeout_'+i+'"/></div></td>'+
262 '
<td><div style=
"padding-left:0;" class=
"col-sm-8"><input type=
"text" '+autoseldisable+'
value=
"'+autoselval+'" class=
"form-control" id=
"id_text_autosel_'+i+'"/></div></td></tr>'+
264 '
<tr><td></td><td></td><td></td><td></td></tr>'+
268 var tdtbl2 = '
<table class=
"table table-bordered" id=
"tbl_inner_' + (i+1) + '">'+
269 '
<thead><tr><th>#
</th><th id=
"id_th_persist_dat">'+g_vtoy_cur_language.STR_PERSISTENCE_DAT+'
</th><th id=
"id_th_status">'+g_vtoy_cur_language.STR_STATUS+'
</th><th id=
"id_th_operation">'+g_vtoy_cur_language.STR_OPERATION+'
</th></tr></thead><tbody></tbody></table>';
271 td1 = '
<td style=
"vertical-align: middle;">' + (i +
1) + '
</td>';
272 td2 = '
<td>' + tdtbl1 + tdtbl2 + '
</td>';
273 td3 = '
<td style=
"vertical-align: middle;text-align: center;">' + delbtn + '
</td>';
274 $tr = $('
<tr>' + td1 + td2 + td3 + '
</tr>');
276 $tr.data('path', data[i].path);
277 $tr.data('index', i);
281 $tbl.append('
<tr><td></td><td></td><td style=
"vertical-align: middle;text-align: center;">' + addbtn + '
</td></tr>');
283 $('input[type=text]').each(function (){
284 var id = $(this).attr('id');
285 if (typeof(id) == 'undefined') {
289 if (id.startsWith('id_text_timeout_') || id.startsWith('id_text_autosel_')) {
290 $(this).change(OnInputTextChange);
294 $('input[type=checkbox]').each(function (){
295 var id = $(this).attr('id');
296 if (id.startsWith('id_timeout_en_') || id.startsWith('id_autosel_en_')) {
297 $(this).click(OnCheckBoxChange);
301 for (var i =
0; i < data.length; i++) {
302 FillPersistenceInnerTable(i, data[i]);
306 function VtoyFillCurrentPageItem(data) {
307 FillPersistenceTable(data);
311 function OnClickMultiModeTab() {
312 var href = $(this).attr('href');
313 var index = parseInt(href.substr(
5,
1));
315 if (index <
0 || index
>= g_vtoy_data_default_index || current_tab_index === index) {
319 current_tab_index = index;
320 VtoyFillCurrentPageItem(m_data_persistence[index]);
323 function AddPersistenceEntry(type, exist1, path1, path2) {
324 var list = m_data_persistence[current_tab_index];
335 call_array[
0] = path2.substr(g_current_dir.length);
336 data_array[
0].path = path2.substr(g_current_dir.length);
339 "path": path1.substr(g_current_dir.length),
347 for (var i =
0; i < list.length; i++) {
348 if (list[i].path === data.path) {
349 Message.error(g_vtoy_cur_language.STR_DUPLICATE_PATH);
355 method : 'persistence_add',
356 index: current_tab_index,
362 FillPersistenceTable(list);
363 Message.success(g_vtoy_cur_language.STR_SAVE_SUCCESS);
367 function OnAddImagePersistence(exist1, path1, path2) {
368 AddPersistenceEntry(
0, exist1, path1, path2);
371 function OnPersistenceAddClick() {
372 var tip1 = (g_current_os === 'windows') ? '\\ISO\\ubuntu-
20.04-desktop-amd64.iso' : "/ISO/ubuntu-
20.04-desktop-amd64.iso";
373 var tip2 = (g_current_os === 'windows') ? '\\ISO\\ubuntu-*****-desktop-amd64.iso' : "/ISO/ubuntu-*****-desktop-amd64.iso";
374 var tip3 = (g_current_os === 'windows') ? '\\ventoy\\ubuntu_persistence.dat' : "/ventoy/ubuntu_persistence.dat";
376 "title": g_vtoy_cur_language.STR_SET_PERSISTENCE,
377 "label1": g_vtoy_cur_language.STR_FILE_PATH,
378 "label2": g_vtoy_cur_language.STR_SET_PERSISTENCE_DAT,
379 "tip1": g_current_dir + tip1,
380 "tip2": g_current_dir + tip2,
381 "tip3": g_current_dir + tip3
384 VtoySetFileFile(OnAddImagePersistence, para);
387 function PersistenceDelEntry(path, index) {
389 method : 'persistence_del',
390 index: current_tab_index,
393 m_data_persistence[current_tab_index].splice(index,
1);
394 FillPersistenceTable(m_data_persistence[current_tab_index]);
395 Message.success(g_vtoy_cur_language.STR_SAVE_SUCCESS);
399 function OnPersistenceDelClick() {
400 var $tr = $(this).closest('tr');
401 var path = $tr.data('path');
402 var index = $tr.data('index');
404 PersistenceDelEntry(path, index);
410 function OnAddPersistenceDatFile(root, valid, extra) {
411 var path = root.substr(g_current_dir.length);
412 var data = m_data_persistence[current_tab_index][m_out_index];
414 for (var i =
0; i < data.list.length; i++) {
415 if (data.list[i].path === path) {
416 Message.error(g_vtoy_cur_language.STR_DUPLICATE_PATH);
422 method : 'persistence_add_inner',
423 index: current_tab_index,
433 data.list.push(node);
434 FillPersistenceInnerTable(m_out_index, data);
435 Message.success(g_vtoy_cur_language.STR_SAVE_SUCCESS);
440 function OnPersistenceInnerAddClick() {
441 var $tr = $(this).closest('tr');
442 var outpath = $tr.data('outpath');
443 var outindex = $tr.data('outindex');
445 var tip = (g_current_os === 'windows') ? '\\ventoy\\ubuntu_persistence.dat' : "/ventoy/ubuntu_persistence.dat";
447 "title": g_vtoy_cur_language.STR_ADD_PERSISTENCE_DAT,
449 "tip1": g_current_dir + tip,
456 m_out_index = outindex;
457 m_out_path = outpath;
458 VtoySelectFilePath(OnAddPersistenceDatFile, para);
461 function PersistenceDelInnerEntry(outpath, outindex, path, index) {
463 method : 'persistence_del_inner',
464 index: current_tab_index,
468 var data = m_data_persistence[current_tab_index][outindex];
470 data.list.splice(index,
1);
471 FillPersistenceInnerTable(outindex, m_data_persistence[current_tab_index][outindex]);
472 Message.success(g_vtoy_cur_language.STR_SAVE_SUCCESS);
476 function OnPersistenceInnerDelClick() {
477 var $tr = $(this).closest('tr');
479 var path = $tr.data('path');
480 var index = $tr.data('index');
481 var outpath = $tr.data('outpath');
482 var outindex = $tr.data('outindex');
484 var list = m_data_persistence[current_tab_index][outindex].list;
486 if (list.length ===
1) {
487 ventoy_confirm(g_vtoy_cur_language.STR_DEL_LAST, PersistenceDelEntry, outpath, outindex);
489 PersistenceDelInnerEntry(outpath, outindex, path, index);
498 var m_data_persistence;
499 var current_tab_index =
0;
500 callVtoySync({method : 'get_persistence'}, function(data) {
501 m_data_persistence = data;
504 $("#id_persistence_tbl").on('click', '.PersistenceAddBtn', OnPersistenceAddClick);
505 $("#id_persistence_tbl").on('click', '.PersistenceDelBtn', OnPersistenceDelClick);
506 $("#id_persistence_tbl").on('click', '.PersistenceInnerAddBtn', OnPersistenceInnerAddClick);
507 $("#id_persistence_tbl").on('click', '.PersistenceInnerDelBtn', OnPersistenceInnerDelClick);
509 $('#id_tab_persistence a[
href="#tab_0"]').click(OnClickMultiModeTab);
510 $('#id_tab_persistence a[
href="#tab_1"]').click(OnClickMultiModeTab);
511 $('#id_tab_persistence a[
href="#tab_2"]').click(OnClickMultiModeTab);
512 $('#id_tab_persistence a[
href="#tab_3"]').click(OnClickMultiModeTab);
513 $('#id_tab_persistence a[
href="#tab_4"]').click(OnClickMultiModeTab);
514 $('#id_tab_persistence a[
href="#tab_5"]').click(OnClickMultiModeTab);
515 function UpdateTabTitleIcon(data) {
516 CommonUpdateTabTitleIcon(data.exist_persistence, '#id_tab_persistence a[
href="#tab_', 'persistence');
518 $('#id_btn_reset').click(function() {
519 Modal.confirm({msg:GetResetTabConfigTipMsg(current_tab_index, 'persistence')}).on(function(e) {
522 method : 'persistence_del',
523 index: current_tab_index,
529 m_data_persistence[current_tab_index].length =
0;
530 VtoyFillCurrentPageItem(m_data_persistence[g_vtoy_data_default_index]);
531 Message.success(g_vtoy_cur_language.STR_SAVE_SUCCESS);
536 $('#id_tab_persistence a[
href="#tab_0"]').tab('show');
537 VtoyFillCurrentPageItem(m_data_persistence[
0]);
538 VtoyPageLanguageChange(g_current_language);