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