ihave.to
Version:
Catch ideas. As they come and let them grow with your team in real time
504 lines (413 loc) • 21.7 kB
JavaScript
/*global $*/
/*global CONF*/
/*global Post*/
/*global Board*/
/*global Screens*/
/*global Apprise*/
/*global Settings*/
/*global Template*/
/*global PostWindow*/
/*global Timeline*/
/*global showMessage*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// General Navigation Handling
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Show navigation tooltip
(function () {
"use strict";
$(document).on('mouseover', 'nav#cmd > ul > li > a', function () {
// Show navigation Information layer
if (CONF.DOM.CMD_INFO.hasClass(CONF.PROPS.STRING.ENABLED)) {
var sTranslate = $(this).attr('id').toUpperCase() + '_INFO';
CONF.DOM.CMD_INFO.text(sTranslate.translate()).fadeIn(CONF.PROPS.INT.FAST);
}
})
// Hide navigation Tooltip
.on('mouseout', 'nav#cmd > ul > li > a', function () {
// Hide navigation Information layer
if (CONF.DOM.CMD_INFO.hasClass(CONF.PROPS.STRING.ENABLED)) {
CONF.DOM.CMD_INFO.text('').fadeOut(CONF.PROPS.INT.FAST);
}
})
// Activate button on navigation
.on(CONF.EVENTS.CLICK, 'nav#cmd > ul > li > a', function () {
// handle comands
if (!$(this).hasClass(CONF.PROPS.STRING.ACTIVE)) {
// Trigger disable currently active element
$(this).closest('ul').find('.active').trigger(CONF.EVENTS.CLICK);
// Make element active
$(this).addClass(CONF.PROPS.STRING.ACTIVE);
}
})
// Disable button on navigation
.on(CONF.EVENTS.CLICK, 'nav#cmd > ul > li > a.active', function () {
// remove navigation active state
$(this).removeClass(CONF.PROPS.STRING.ACTIVE);
})
// Leave subnavigation level
.on(CONF.EVENTS.CLICK, '#back', function () {
var oBgUrl = $('#screen-bg-url');
//
if (oBgUrl.length === 1) {
var sUploadedBgVal = oBgUrl.val().trim().split('/').pop();
if (sUploadedBgVal.length > 0) {
$.post('/unlink-wp', {image: sUploadedBgVal});
}
}
CONF.DOM.CMD.trigger('setMainNav');
CONF.DOM.CMD.find('.active').trigger(CONF.EVENTS.CLICK);
CONF.DOM.CMD.find('#back').trigger(CONF.EVENTS.CLICK);
CONF.DOM.UIWINDOW.trigger('hideUi');
})
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Main Navigaton
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Open create new post view
.on(CONF.EVENTS.CLICK, '#new_post', function (event, oSettings) {
var oPostConfig;
var oOrigin = false;
var oPostPos = {
left: 0,
top: 0
};
if (oSettings === undefined) {
oSettings = {};
}
if (oSettings.origin !== undefined) {
oOrigin = oSettings.origin;
}
if (oSettings.left !== undefined) {
oPostPos.left = oSettings.left;
}
if (oSettings.top !== undefined) {
oPostPos.top = oSettings.top;
}
if (oOrigin) {
var oPost = new Post(oOrigin);
oPostConfig = {
defaultcolor: oPost.getColor(),
content: oPost.getContent(),
headline: 'EDIT_POST'.translate(),
origin: oPost.getId()
};
}
if ($(this).hasClass('active')) {
CONF.DOM.UIWINDOW.trigger('showUi');
CONF.DOM.CMD.trigger('setPostNav', oPostPos);
CONF.DOM.UIWINDOW.children('.cmd').html(new PostWindow(oPostConfig).deliver());
var oTextarea = CONF.DOM.UIWINDOW.find('textarea');
oTextarea.val(oTextarea.val().toString().br2nl());
oTextarea.focus();
}
})
.on(CONF.EVENTS.CLICK, '#timeline', function () {
var sActiveScreen;
var oTimeline;
if ($(this).hasClass('active')) {
sActiveScreen = CONF.DOM.BOARDPOSTS.data('activescreen');
CONF.DOM.UIWINDOW.trigger('showUi');
CONF.DOM.CMD.trigger('setTimelineNav');
oTimeline = new Timeline(CONF.BOARD.PRIVATE.SCREENS[sActiveScreen].POSTS, CONF.BOARD.SETTINGS.COLORS);
CONF.DOM.UIWINDOW.children('.cmd').css({
margin: 0,
padding: 0,
width: 100 + '%',
minHeight: 100 + '%',
maxWidth: 'none'
}
).html(oTimeline.render());
}
})
// Sort posts chronological
.on(CONF.EVENTS.CLICK, '#chrono', function () {
var oNormalScreen = $('.screen');
if ($(this).hasClass('active')) {
oNormalScreen.addClass('tinysort').removeClass('normal');
CONF.DOM.BOARD.trigger('tinySortBoard');
CONF.DOM.UIWINDOW.trigger('hideUi');
oNormalScreen.tsort("", {
order: "desc",
attr: "id"
});
showMessage('ORDERED_POSTS_CHRONOLOGICAL');
} else {
oNormalScreen.addClass('normal').removeClass('tinysort');
CONF.DOM.BOARD.trigger('normalBoard');
}
})
// Open screen view
.on(CONF.EVENTS.CLICK, '#screen', function () {
if ($(this).hasClass('active')) {
CONF.DOM.UIWINDOW.trigger('showUi');
CONF.DOM.CMD.trigger('setScreenNav');
CONF.DOM.UIWINDOW.children('.cmd').html(new Template(new Screens().getOverview()).toHtml());
}
})
// open settongs view
.on(CONF.EVENTS.CLICK, '#settings', function () {
if ($(this).hasClass('active')) {
CONF.DOM.UIWINDOW.trigger('showUi');
CONF.DOM.CMD.trigger('setSettingsNav');
CONF.DOM.UIWINDOW.children('.cmd').html(new Template(new Settings(CONF.BOARD.SETTINGS).getTemplate()).toHtml());
}
})
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// New Post view
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Store created post
.on(CONF.EVENTS.CLICK, '#store_post', function () {
if ($(this).hasClass('active')) {
var iTimestamp = parseInt(new Date().getTime(), 10);
var oPostWindow = $('#post-window');
var oTextarea = oPostWindow.children('textarea');
var sActiveScreen = CONF.DOM.BOARDPOSTS.data('activescreen');
var oDiff = JSON.parse('{"PRIVATE":{"SCREENS":{"' + sActiveScreen + '":{"POSTS":{"' + iTimestamp + '":{}}}}}}');
var oBackButton = $('#back');
var oChange;
var oColorchange;
var oContentchange;
if (oTextarea.val().trim().length > 0) {
// Modified post
if (oTextarea.attr('id') !== undefined && oTextarea.attr('id').indexOf('origin') === 0) {
var iTarget = parseInt(oTextarea.attr('id').replace('origin-', ''), 10);
var oSelectedColrVal = $('.color_select').data('beforechange');
var sPostSelectedClass = oPostWindow.find('a.selected').parent().attr('class');
if (typeof(iTarget) === CONF.PROPS.STRING.NUM) {
if (oSelectedColrVal !== undefined && sPostSelectedClass !== oSelectedColrVal) {
oColorchange = {
BY: CONF.PROPS.INT.WHO,
TGT: iTarget,
ACN: "color",
TO: oPostWindow.find('a.selected').parent().attr('class')
};
}
if (oTextarea.val().trim() !== oTextarea.data('beforechange').trim()) {
oContentchange = {
BY: CONF.PROPS.INT.WHO,
TGT: iTarget,
ACN: "content",
TO: oTextarea.val().trim().escapeHtml().nl2br().urlToLink()
};
}
// If only color changed set change color object
if (oColorchange !== undefined) {
oChange = oColorchange;
}
// If only content changed set change content object
if (oContentchange !== undefined) {
oChange = oContentchange;
}
// If both changed create color/content array
if (oColorchange !== undefined && oContentchange !== undefined) {
oChange = [oColorchange, oContentchange];
}
if (oChange === undefined) {
showMessage('NOTHING_CHANGED', 'error');
oBackButton.trigger(CONF.EVENTS.CLICK);
} else {
// Add changes to board
oDiff.PRIVATE.SCREENS[sActiveScreen].POSTS[iTimestamp] = oChange;
CONF.BOARD.PRIVATE.SCREENS[sActiveScreen].POSTS[iTimestamp] = oChange;
}
}
if (oChange !== undefined) {
showMessage('STRORE_MODIFIED_POST');
}
}
// New Post
else {
oChange = [
{
BY: CONF.PROPS.INT.WHO,
TGT: iTimestamp,
ACN: "color",
TO: oPostWindow.find('a.selected').parent().attr('class')
},
{
BY: CONF.PROPS.INT.WHO,
TGT: iTimestamp,
ACN: "content",
TO: oTextarea.val().escapeHtml().urlToLink().nl2br()
},
{
BY: CONF.PROPS.INT.WHO,
TGT: iTimestamp,
ACN: "position",
TO: [oTextarea.data('postposition').left, oTextarea.data('postposition').top]
}
];
oDiff.PRIVATE.SCREENS[sActiveScreen].POSTS[iTimestamp] = oChange;
CONF.BOARD.PRIVATE.SCREENS[sActiveScreen].POSTS[iTimestamp] = oChange;
showMessage('STRORE_NEW_POST');
}
oBackButton.trigger(CONF.EVENTS.CLICK);
CONF.COM.SOCKET.saveChanges(oDiff);
var oBoard = new Board({
NAME: CONF.DOM.BOARDPOSTS.data('activescreen'),
SCREEN: CONF.BOARD.PRIVATE.SCREENS[CONF.DOM.BOARDPOSTS.data('activescreen')],
FROMTIME: false
});
CONF.DOM.BOARDSCREENS.html(new Template(oBoard.getTemplate()).toHtml());
CONF.DOM.BOARD.trigger('uiBoard');
oBoard.enableDroppable($('.post'));
} else {
showMessage('CANT_STORE_EMPTY_POST', 'error');
$(this).removeClass('active');
}
}
})
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Screen views Navigation
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Create new screen
.on(CONF.EVENTS.CLICK, '#new_screen', function () {
var sCurrentBgVal;
if ($(this).hasClass('active')) {
CONF.DOM.UIWINDOW.children('.cmd').prepend(new Template(new Screens().newScreen()).toHtml());
// Attach dropzone support
$("#dropImage").dropzone({
url: "/upload-wp",
paramName: "file", // The name that will be used to transfer the file
maxFilesize: CONF.PROPS.INT.MAX_UPLOAD, // MB,
maxFiles: 1,
accept: function (file, done) {
if (CONF.PROPS.ARRAY.ALLOWED_FILES.indexOf(file.name.substring(file.name.length - 4, file.name.length)) === -1) {
showMessage('FILETYPE_NOT_ALLOWED', 'error');
}
else {
sCurrentBgVal = $('#screen-bg-url').val().trim().split('/').pop();
if (sCurrentBgVal.length > 0) {
$.post('/unlink-wp', {image: sCurrentBgVal});
}
showMessage('UPLOADING_FILE');
$('footer').addClass('disabled');
done();
$('#create-screen, #abort-create-screen').fadeOut(250);
}
},
uploadprogress: function (file, uploaded) {
var oUploadProgress = $('#uploadProgress');
if (!oUploadProgress.hasClass('active')) {
oUploadProgress.addClass('active');
$('#dropImage').hide();
}
oUploadProgress.children('div.bar').css('width', uploaded + '%').text((Math.round(uploaded) + '%'));
if (uploaded >= 100) {
oUploadProgress.removeClass('active');
oUploadProgress.children('div.bar').removeAttr('style');
$('#dropImage').show();
}
},
complete: function (file) {
this.removeFile(file);
$('footer').removeClass('disabled');
},
success: function (response, data) {
showMessage('UPLOADING_FINISH');
$('#screen-bg-url').val(data);
$('#create-screen, #abort-create-screen').fadeIn(250);
},
error: function () {
showMessage('UPLOADING_ERROR');
$('#create-screen, #abort-create-screen').fadeIn(250);
}});
} else {
$('#new_screen-ui').fadeOut(CONF.PROPS.INT.MASTERCLOCK / 4, function () {
$(this).remove();
});
}
})
// Switch in delete screen mode
.on(CONF.EVENTS.CLICK, '#trash_empty', function () {
var oBgUrl = $('#screen-bg-url');
if (oBgUrl.length === 1) {
var sUploadedBgVal = oBgUrl.val().trim().split('/').pop();
if (sUploadedBgVal.length > 0) {
$.post('/unlink-wp', {image: sUploadedBgVal});
}
}
if ($(this).hasClass('active')) {
if (CONF.DOM.UIWINDOW.children('.cmd').find('.screen').length > 1) {
showMessage('SELECT_SCREENS_TO_DELETE');
CONF.DOM.UIWINDOW.children('.cmd').find('.screen').addClass('removable');
} else {
$(this).removeClass('active');
showMessage('CANT_DELETE_ACTIVE_SCREEN', 'warning');
}
} else {
CONF.DOM.UIWINDOW.children('.cmd').find('.screen').removeClass('removable');
}
})
// Remove screens to delete
.on(CONF.EVENTS.CLICK, '#trash_full', function () {
var oTrash = $(this);
if (CONF.DOM.UIWINDOW.children('.cmd').find('.do').length > 0) {
Apprise('REALLY_DELETE_THE_SELECTED_SCREENS'.translate(), {
animation: 250, // Animation speed
buttons: {
confirm: {
action: function () {
var sScreenName;
var bSaveChanges = false;
var oDiff = JSON.parse('{"PRIVATE":{"SCREENS":{}},"TRASH":{}}');
var iTime = new Date().getTime();
// Iterate screens to delete and check if exist
$.each(CONF.DOM.UIWINDOW.children('.cmd').find('.do'), function (i, oRemove) {
sScreenName = $(oRemove).find('.screen-name').text();
if (CONF.BOARD.PRIVATE.SCREENS[sScreenName] !== undefined) {
bSaveChanges = true;
sScreenName = $(oRemove).find('.screen-name').text();
if (CONF.BOARD.TRASH === undefined) {
CONF.BOARD.TRASH = {};
}
// Create a backup if there is any post on screen (including deleted screens)
if (Object.keys(CONF.BOARD.PRIVATE.SCREENS[sScreenName].POSTS).length > 0) {
var oChange = {
BY: CONF.PROPS.INT.WHO,
NAME: sScreenName,
POSTS: CONF.BOARD.PRIVATE.SCREENS[sScreenName]
};
oDiff.TRASH[iTime] = oChange;
CONF.BOARD.TRASH[iTime] = oChange;
// Update time if software is too fast ;-)
iTime += 1;
}
oDiff.PRIVATE.SCREENS[sScreenName] = false;
$.post('/unlink-wp', {image: CONF.BOARD.PRIVATE.SCREENS[sScreenName].META.BG.split('/').pop()});
delete CONF.BOARD.PRIVATE.SCREENS[sScreenName];
}
});
// If changes were made start sync
if (bSaveChanges) {
CONF.COM.SOCKET.saveChanges(oDiff);
}
// Create the visual representation
CONF.DOM.UIWINDOW.children('.cmd').find('.do').remove();
CONF.DOM.UIWINDOW.children('.cmd').find('.removable').removeClass('do removable');
oTrash.attr('id', oTrash.attr('id').replace('full', 'empty'));
$('.counter').remove();
Apprise('close');
}, // Callback function
className: 'red', // Custom class name(s)
id: 'confirm', // Element ID
text: 'OK'.translate() // Button text
},
abort: {
action: function () {
CONF.DOM.UIWINDOW.children('.cmd').find('.removable').removeClass('do removable');
oTrash.attr('id', oTrash.attr('id').replace('full', 'empty'));
$('.counter').remove();
Apprise('close');
},
id: 'abort', // Element ID
className: 'blue',
text: 'ABORT'.translate() // Button text
}
},
input: false, // input dialog
override: true // Override browser navigation while Apprise is visible
});
}
});
})
();