You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
5.5 KiB
JavaScript
217 lines
5.5 KiB
JavaScript
'use strict';
|
|
|
|
|
|
define('taskbar', ['benchpress', 'translator'], function (Benchpress, translator) {
|
|
var taskbar = {};
|
|
|
|
taskbar.init = function () {
|
|
var self = this;
|
|
|
|
Benchpress.parse('modules/taskbar', {}, function (html) {
|
|
self.taskbar = $(html);
|
|
self.tasklist = self.taskbar.find('ul');
|
|
$(document.body).append(self.taskbar);
|
|
|
|
self.taskbar.on('click', 'li', function () {
|
|
var $btn = $(this);
|
|
var module = $btn.attr('data-module');
|
|
var uuid = $btn.attr('data-uuid');
|
|
|
|
require([module], function (module) {
|
|
if (!$btn.hasClass('active')) {
|
|
minimizeAll();
|
|
module.load(uuid);
|
|
taskbar.toggleNew(uuid, false);
|
|
|
|
taskbar.tasklist.removeClass('active');
|
|
$btn.addClass('active');
|
|
} else {
|
|
module.minimize(uuid);
|
|
}
|
|
});
|
|
|
|
return false;
|
|
});
|
|
});
|
|
|
|
$(window).on('action:app.loggedOut', function () {
|
|
taskbar.closeAll();
|
|
});
|
|
};
|
|
|
|
taskbar.close = function (module, uuid) {
|
|
// Sends signal to the appropriate module's .close() fn (if present)
|
|
var btnEl = taskbar.tasklist.find('[data-module="' + module + '"][data-uuid="' + uuid + '"]');
|
|
var fnName = 'close';
|
|
|
|
// TODO: Refactor chat module to not take uuid in close instead of by jQuery element
|
|
if (module === 'chat') {
|
|
fnName = 'closeByUUID';
|
|
}
|
|
|
|
if (btnEl.length) {
|
|
require([module], function (module) {
|
|
if (typeof module[fnName] === 'function') {
|
|
module[fnName](uuid);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
|
|
taskbar.closeAll = function (module) {
|
|
// module is optional
|
|
var selector = '[data-uuid]';
|
|
|
|
if (module) {
|
|
selector = '[data-module="' + module + '"]' + selector;
|
|
}
|
|
|
|
taskbar.tasklist.find(selector).each(function (idx, el) {
|
|
taskbar.close(module || el.getAttribute('data-module'), el.getAttribute('data-uuid'));
|
|
});
|
|
};
|
|
|
|
taskbar.discard = function (module, uuid) {
|
|
var btnEl = taskbar.tasklist.find('[data-module="' + module + '"][data-uuid="' + uuid + '"]');
|
|
btnEl.remove();
|
|
|
|
update();
|
|
};
|
|
|
|
taskbar.push = function (module, uuid, options, callback) {
|
|
callback = callback || function () {};
|
|
var element = taskbar.tasklist.find('li[data-uuid="' + uuid + '"]');
|
|
|
|
var data = {
|
|
module: module,
|
|
uuid: uuid,
|
|
options: options,
|
|
element: element,
|
|
};
|
|
|
|
$(window).trigger('filter:taskbar.push', data);
|
|
|
|
if (!element.length && data.module) {
|
|
createTaskbarItem(data, callback);
|
|
} else {
|
|
callback(element);
|
|
}
|
|
};
|
|
|
|
taskbar.get = function (module) {
|
|
var items = $('[data-module="' + module + '"]').map(function (idx, el) {
|
|
return $(el).data();
|
|
});
|
|
|
|
return items;
|
|
};
|
|
|
|
taskbar.minimize = function (module, uuid) {
|
|
var btnEl = taskbar.tasklist.find('[data-module="' + module + '"][data-uuid="' + uuid + '"]');
|
|
btnEl.toggleClass('active', false);
|
|
};
|
|
|
|
taskbar.toggleNew = function (uuid, state, silent) {
|
|
var btnEl = taskbar.tasklist.find('[data-uuid="' + uuid + '"]');
|
|
btnEl.toggleClass('new', state);
|
|
|
|
if (!silent) {
|
|
$(window).trigger('action:taskbar.toggleNew', uuid);
|
|
}
|
|
};
|
|
|
|
taskbar.updateActive = function (uuid) {
|
|
var tasks = taskbar.tasklist.find('li');
|
|
tasks.removeClass('active');
|
|
tasks.filter('[data-uuid="' + uuid + '"]').addClass('active');
|
|
|
|
$('[data-uuid]:not([data-module])').toggleClass('modal-unfocused', true);
|
|
$('[data-uuid="' + uuid + '"]:not([data-module])').toggleClass('modal-unfocused', false);
|
|
};
|
|
|
|
taskbar.isActive = function (uuid) {
|
|
var taskBtn = taskbar.tasklist.find('li[data-uuid="' + uuid + '"]');
|
|
return taskBtn.hasClass('active');
|
|
};
|
|
|
|
function update() {
|
|
var tasks = taskbar.tasklist.find('li');
|
|
|
|
if (tasks.length > 0) {
|
|
taskbar.taskbar.attr('data-active', '1');
|
|
} else {
|
|
taskbar.taskbar.removeAttr('data-active');
|
|
}
|
|
}
|
|
|
|
function minimizeAll() {
|
|
taskbar.tasklist.find('.active').removeClass('active');
|
|
}
|
|
|
|
function createTaskbarItem(data, callback) {
|
|
translator.translate(data.options.title, function (taskTitle) {
|
|
var title = $('<div></div>').text(taskTitle || 'NodeBB Task').html();
|
|
|
|
var taskbarEl = $('<li></li>')
|
|
.addClass(data.options.className)
|
|
.html('<a href="#"' + (data.options.image ? ' style="background-image: url(\'' + data.options.image + '\'); background-size: cover;"' : '') + '>' +
|
|
(data.options.icon ? '<i class="fa ' + data.options.icon + '"></i> ' : '') +
|
|
'<span component="taskbar/title">' + title + '</span>' +
|
|
'</a>')
|
|
.attr({
|
|
title: title,
|
|
'data-module': data.module,
|
|
'data-uuid': data.uuid,
|
|
})
|
|
.addClass(data.options.state !== undefined ? data.options.state : 'active');
|
|
|
|
if (!data.options.state || data.options.state === 'active') {
|
|
minimizeAll();
|
|
}
|
|
|
|
taskbar.tasklist.append(taskbarEl);
|
|
update();
|
|
|
|
data.element = taskbarEl;
|
|
|
|
taskbarEl.data(data);
|
|
$(window).trigger('action:taskbar.pushed', data);
|
|
callback(taskbarEl);
|
|
});
|
|
}
|
|
|
|
var processUpdate = function (element, key, value) {
|
|
switch (key) {
|
|
case 'title':
|
|
element.find('[component="taskbar/title"]').text(value);
|
|
break;
|
|
case 'icon':
|
|
element.find('i').attr('class', 'fa fa-' + value);
|
|
break;
|
|
case 'image':
|
|
element.find('a').css('background-image', 'url("' + value + '")');
|
|
break;
|
|
case 'background-color':
|
|
element.find('a').css('background-color', value);
|
|
break;
|
|
}
|
|
};
|
|
|
|
taskbar.update = function (module, uuid, options) {
|
|
var element = taskbar.tasklist.find('[data-module="' + module + '"][data-uuid="' + uuid + '"]');
|
|
if (!element.length) {
|
|
return;
|
|
}
|
|
var data = element.data();
|
|
|
|
Object.keys(options).forEach(function (key) {
|
|
data[key] = options[key];
|
|
processUpdate(element, key, options[key]);
|
|
});
|
|
|
|
element.data(data);
|
|
};
|
|
|
|
return taskbar;
|
|
});
|