Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
malwaredllc
GitHub Repository: malwaredllc/byob
Path: blob/master/web-gui/buildyourownbotnet/assets/js/jquery-terminal/examples/dialog.js
1293 views
1
/**
2
* jQuery Plugin for text based dialogs that look
3
* like dialog linux command it use cmd plugin from
4
* jQuery Terminal
5
*
6
* Copyright (c) 2017 Jakub Jankiewicz <http://jcubic.pl/me>
7
*
8
* Linceses under MIT license
9
*/
10
/* global jQuery setTimeout */
11
(function($) {
12
$.dialog = {
13
defaults: {
14
cols: 50,
15
rows: 8,
16
title: '',
17
message: '',
18
cancel: $.noop
19
},
20
strings: {
21
ok: '_OK',
22
cancel: '_Cancel'
23
}
24
};
25
function get_char_size() {
26
var temp = $('<div class="dialog temp"><div class="box"><span>'+
27
'&nbsp;</span></div></div>').appendTo('body');
28
var rect = temp.find('span')[0].getBoundingClientRect();
29
var result = {
30
width: rect.width,
31
height: rect.height
32
};
33
temp.remove();
34
return result;
35
}
36
function chunks(str, length) {
37
if (str.length <= length) {
38
return [str];
39
}
40
var num_chunks = Math.ceil(str.length / length);
41
var result = [];
42
for(var i = 0, o = 0; i < num_chunks; ++i, o += length) {
43
result.push(str.substr(o, length));
44
}
45
return result;
46
}
47
function str_repeat(str, n) {
48
return new Array(n).join(str);
49
}
50
$.fn.dialog = function(fn, options) {
51
fn = fn || $.noop;
52
var chars = {
53
hor: '─',
54
ver: '│',
55
nw: '┌',
56
cw: '├',
57
sw: '└',
58
ne: '┐',
59
ce: '┤',
60
se: '┘'
61
};
62
var settings = $.extend({}, $.dialog.defaults, options || {});
63
var cols = settings.cols > 20 ? settings.cols : 20;
64
var rows = settings.rows > 8 ? settings.rows : 8;
65
function line(container, left, right, options) {
66
var settings = $.extend({
67
bottom: false,
68
reverse: false,
69
length: cols
70
}, options || {});
71
var first, second;
72
if (settings.bottom) {
73
first = left;
74
second = str_repeat(chars.hor, settings.length - 2) + right;
75
} else {
76
first = left + str_repeat(chars.hor, settings.length - 2);
77
second = right;
78
}
79
container.append('<span class="' +
80
(settings.reverse ? 'dark' : 'light') +
81
'">' + first + '</span>');
82
container.append('<span class="' +
83
(settings.reverse ? 'light' : 'dark') +
84
'">' + second + '</span>');
85
}
86
function update_css_var() {
87
self[0].style.setProperty('--char-width', char_size.width);
88
self[0].style.setProperty('--char-height', char_size.height);
89
}
90
if (this.length > 1) {
91
var args = [].slice.call(arguments);
92
return this.each(function() {
93
$.fn.dialog.apply(this, args);
94
});
95
}
96
var char_size = get_char_size();
97
var self = $(this).addClass('dialog');
98
update_css_var();
99
var box = $('<div class="box"/>');
100
var top = $('<div class="top"/>').appendTo(box);
101
line(top, chars.nw, chars.ne);
102
103
var width;
104
105
var title = $('<div class="title"><span>' + settings.title +
106
'</span></div>').appendTo(box);
107
108
if (settings.message) {
109
var header = $('<div class="header"/>').appendTo(box);
110
var size = cols - 5;
111
width = char_size.width * size;
112
chunks(settings.message, size).forEach(function(line) {
113
var $line = $('<div class="line"/>').appendTo(header);
114
$line.append('<span class="left light">' + chars.ver +
115
'&nbsp;</span>');
116
$('<span>' + line + '</span>').width(width).appendTo($line);
117
$line.append('<span class="left dark">&nbsp;' + chars.ver +
118
'</span>');
119
});
120
}
121
122
var input = $('<div class="input"/>').appendTo(box);
123
124
var input_line = $('<div class="line"/>').appendTo(input);
125
var input_left = $('<div class="left light">' + chars.ver +
126
'&nbsp;</div>').appendTo(input_line);
127
var input_top = $('<div class="top"/>').appendTo(input_line);
128
line(input_top, chars.nw, chars.ne, {length: cols-4, reverse: true});
129
var input_right = $('<div class="right dark">&nbsp;' + chars.ver +
130
'</div>').appendTo(input_line);
131
132
input_line = $('<div class="line"/>').appendTo(input);
133
$('<div class="left light">' + chars.ver + '&nbsp;</div>')
134
.appendTo(input_line);
135
$('<div class="left dark">' + chars.ver + '</div>')
136
.appendTo(input_line);
137
fn = fn.bind(self);
138
width = char_size.width * (cols - 7);
139
var cmd = $('<div/>').appendTo(input_line).cmd({
140
width: width,
141
prompt: '',
142
commands: fn,
143
keydown: function() {
144
setTimeout(function() {
145
cmd.scrollLeft(cmd.prop('scrollWidth'));
146
}, 0);
147
},
148
keymap: {
149
UP: up,
150
ARROWUP: up,
151
DOWN: down,
152
ARROWDOWN: down
153
}
154
});
155
cmd.on('click', function() {
156
cmd.enable();
157
buttons.find('.selected, .active').removeClass('selected active');
158
buttons.find('.ok').addClass('active');
159
});
160
$('<div class="right light">' + chars.ver + '</div>')
161
.appendTo(input_line);
162
$('<div class="right dark">&nbsp;' + chars.ver + '</div>')
163
.appendTo(input_line);
164
165
input_line = $('<div class="line"/>').appendTo(input);
166
$('<div class="left light">' + chars.ver + '&nbsp;</div>')
167
.appendTo(input_line);
168
var input_bottom = $('<div class="bottom"/>').appendTo(input_line);
169
line(input_bottom, chars.sw, chars.se, {
170
length: cols-4,
171
reverse: true,
172
bottom: true
173
});
174
$('<div class="right dark">&nbsp;' + chars.ver + '</div>')
175
.appendTo(input_line);
176
177
var separator = $('<div class="separator"/>').appendTo(box);
178
line(separator, chars.cw, chars.ce);
179
180
var button_line = $('<div class="buttons-line"/>').appendTo(box);
181
$('<div class="left light">' + chars.ver + '</div>')
182
.appendTo(button_line);
183
width = char_size.width * (cols - 3);
184
var buttons = $('<div class="buttons"/>')
185
.appendTo(button_line).width(width);
186
function tag(str) {
187
return str.replace(/_(.)/, '<span class="mark">$1</span>');
188
}
189
$('<button class="ok active">' + tag($.dialog.strings.ok) +
190
'</button>').appendTo(buttons);
191
$('<button class="cancel">' + tag($.dialog.strings.cancel) +
192
'</button>').appendTo(buttons);
193
$('<div class="right dark">' + chars.ver +
194
'</div>').appendTo(button_line);
195
196
buttons.on('click', '.ok', function() {
197
cmd.disable();
198
$(this).addClass('selected active').next()
199
.removeClass('selected active');
200
fn(cmd.get());
201
}).on('click', '.cancel', function() {
202
cmd.disable();
203
$(this).addClass('selected active').prev()
204
.removeClass('selected active');
205
settings.cancel.call(self, cmd.get());
206
});
207
function up() {
208
setTimeout(function() {
209
cmd.disable();
210
}, 0);
211
var active = buttons.find('.cancel').addClass('selected active')
212
.prev().removeClass('selected active');
213
}
214
function down() {
215
setTimeout(function() {
216
cmd.disable();
217
}, 0);
218
var active = buttons.find('.ok').addClass('selected active')
219
.next().removeClass('selected active');
220
}
221
function keydown(e) {
222
var key = e.key.toUpperCase();
223
var map = {
224
ARROWUP: 'UP',
225
ARROWDOWN: 'DOWN',
226
ARROWLEFT: 'LEFT',
227
ARROWRIGHT: 'RIGHT'
228
};
229
if (map[key]) {
230
key = map[key];
231
}
232
var active = buttons.find('.active');
233
switch (key) {
234
case 'ENTER':
235
if (!cmd.isenabled()) {
236
active.click();
237
}
238
break;
239
case 'LEFT':
240
if (!cmd.isenabled()) {
241
if (active.is('.ok')) {
242
cmd.enable();
243
active.removeClass('selected');
244
} else {
245
active.removeClass('active selected').prev()
246
.addClass('active selected');
247
}
248
}
249
break;
250
case 'RIGHT':
251
if (!cmd.isenabled()) {
252
if (active.is('.cancel')) {
253
cmd.enable();
254
active.removeClass('selected');
255
} else {
256
active.removeClass('active selected').next()
257
.addClass('active selected');
258
}
259
}
260
break;
261
case 'UP':
262
if (!cmd.isenabled()) {
263
if (active.is('.ok')) {
264
cmd.enable();
265
active.removeClass('selected active');
266
buttons.find('.ok').addClass('active');
267
} else {
268
active.removeClass('active selected').prev()
269
.addClass('active selected');
270
}
271
}
272
break;
273
case 'DOWN':
274
if (!cmd.isenabled()) {
275
if (active.is('.cancel')) {
276
cmd.enable();
277
active.removeClass('selected active');
278
buttons.find('.ok').addClass('active');
279
} else {
280
active.removeClass('active selected').next()
281
.addClass('active selected');
282
}
283
}
284
break;
285
}
286
}
287
$(document).on('keydown', keydown);
288
var bottom = $('<div class="bottom"/>').appendTo(box);
289
line(bottom, chars.sw, chars.se, {bottom: true});
290
291
box.appendTo(self);
292
293
$.extend(self, {
294
destroy: function() {
295
self.removeClass('dialog');
296
$(document).off('keydown', keydown);
297
cmd.destroy();
298
box.remove();
299
},
300
cmd: function() {
301
return cmd;
302
},
303
refresh: function() {
304
char_size = get_char_size();
305
update_css_var();
306
}
307
});
308
return self;
309
};
310
})(jQuery);
311
312