memo/client/script.js

1231 lines
29 KiB
JavaScript
Raw Normal View History

2019-07-19 22:35:33 +03:00
function toggleFullScreen() {
if (!document.fullscreenElement) {
2025-06-08 18:27:17 +03:00
document.documentElement.requestFullscreen();
2025-06-03 12:12:48 +02:00
} else if (document.exitFullscreen) {
2025-06-08 18:27:17 +03:00
document.exitFullscreen();
2019-07-19 22:35:33 +03:00
}
}
2019-07-19 22:35:33 +03:00
2025-06-08 18:27:17 +03:00
let cards = {};
let totalcolumns = 0;
let columns = [];
let currentTheme = 'bigcards';
let boardInitialized = false;
let keyTrap = null;
2011-03-10 08:20:27 -05:00
2025-06-08 18:27:17 +03:00
const baseurl = location.pathname.substring(
0,
location.pathname.lastIndexOf('/'),
);
const socket = io.connect({ path: `${baseurl}/socket.io` });
console.log(socket);
moment.locale(navigator.language || navigator.languages[0]);
2011-03-10 08:20:27 -05:00
2025-06-08 18:27:17 +03:00
marked.setOptions({ sanitize: true });
2017-07-05 19:42:34 -04:00
2025-06-03 12:12:48 +02:00
// an action has happened, send it to the
// server
2014-09-13 02:04:27 -04:00
function sendAction(a, d) {
2025-06-03 12:12:48 +02:00
// console.log('--> ' + a);
2025-06-03 12:12:48 +02:00
const message = {
action: a,
2025-06-08 18:27:17 +03:00
data: d,
};
2025-06-08 18:27:17 +03:00
socket.emit(a, message);
2011-03-10 08:20:27 -05:00
}
2025-06-03 12:12:48 +02:00
socket.on('connect', () => {
// console.log('successful socket.io connect');
2025-06-03 12:12:48 +02:00
// let the final part of the path be the room name
2025-06-08 18:27:17 +03:00
const room = location.pathname.substring(location.pathname.lastIndexOf('/'));
2025-06-03 12:12:48 +02:00
// imediately join the room which will trigger the initializations
2025-06-08 18:27:17 +03:00
sendAction('joinRoom', room);
});
2011-03-10 08:20:27 -05:00
2025-06-03 12:12:48 +02:00
socket.on('disconnect', () => {
2025-06-08 18:27:17 +03:00
blockUI(
'Serveur déconnecté. Veuillez rafraîchir la page pour essayer de vous reconnecter…',
);
2025-06-03 12:12:48 +02:00
// $('.blockOverlay').on('click', $.unblockUI);
2025-06-08 18:27:17 +03:00
});
2011-03-10 08:20:27 -05:00
2025-06-03 12:12:48 +02:00
socket.on('message', (data) => {
2025-06-08 18:27:17 +03:00
getMessage(data);
});
2011-03-10 08:20:27 -05:00
2014-09-13 02:04:27 -04:00
function unblockUI() {
2025-06-08 18:27:17 +03:00
$.unblockUI({ fadeOut: 50 });
2011-05-29 15:36:30 -04:00
}
2014-09-13 02:04:27 -04:00
function blockUI(message) {
2025-06-08 18:27:17 +03:00
message = message || 'En attente…';
$.blockUI({
2025-06-03 12:12:48 +02:00
message,
css: {
2025-06-03 12:12:48 +02:00
border: 'none',
padding: '15px',
backgroundColor: '#000',
'-webkit-border-radius': '10px',
'-moz-border-radius': '10px',
opacity: 0.5,
2025-06-03 12:12:48 +02:00
color: '#fff',
2025-06-08 18:27:17 +03:00
fontSize: '20px',
},
fadeOut: 0,
2025-06-08 18:27:17 +03:00
fadeIn: 10,
});
2011-05-29 15:36:30 -04:00
}
2025-06-03 12:12:48 +02:00
// respond to an action event
2014-09-13 02:04:27 -04:00
function getMessage(m) {
2025-06-08 18:27:17 +03:00
const message = m; // JSON.parse(m);
const { action } = message;
const { data } = message;
2025-06-03 12:12:48 +02:00
// console.log('<-- ' + action);
switch (action) {
2025-06-03 12:12:48 +02:00
case 'roomAccept':
// okay we're accepted, then request initialization
// (this is a bit of unnessary back and forth but that's okay for now)
2025-06-08 18:27:17 +03:00
sendAction('initializeMe', null);
break;
2025-06-03 12:12:48 +02:00
case 'roomDeny':
// this doesn't happen yet
2025-06-08 18:27:17 +03:00
break;
2025-06-04 12:35:04 +03:00
case 'editBoardMetas':
2025-06-08 18:27:17 +03:00
sendAction('editBoardMetas', { prop: 'opacity', value: 0.5 });
break;
2025-06-03 12:12:48 +02:00
case 'moveCard':
2025-06-08 18:27:17 +03:00
moveCard($(`#${data.id}`), data.position);
break;
2025-06-03 12:12:48 +02:00
case 'initCards':
2025-06-08 18:27:17 +03:00
initCards(data);
break;
2025-06-03 12:12:48 +02:00
case 'createCard':
// console.log(data);
2025-06-08 18:27:17 +03:00
drawNewCard(
data.id,
data.text,
data.x,
data.y,
data.rot,
data.colour,
null,
);
break;
2025-06-03 12:12:48 +02:00
case 'deleteCard':
2025-06-08 18:27:17 +03:00
$(`#${data.id}`).fadeOut(500, function () {
$(this).remove();
});
break;
2025-06-03 12:12:48 +02:00
case 'editCard':
2025-06-08 18:27:17 +03:00
$(`#${data.id}`).children('.content:first').attr('data-text', data.value);
$(`#${data.id}`).children('.content:first').html(marked(data.value));
break;
2025-06-03 12:12:48 +02:00
case 'initColumns':
2025-06-08 18:27:17 +03:00
initColumns(data);
break;
2025-06-03 12:12:48 +02:00
case 'updateColumns':
2025-06-08 18:27:17 +03:00
initColumns(data);
break;
2025-06-03 12:12:48 +02:00
case 'changeTheme':
2025-06-08 18:27:17 +03:00
changeThemeTo(data);
break;
2025-06-03 12:12:48 +02:00
case 'join-announce':
2025-06-08 18:27:17 +03:00
displayUserJoined(data.sid, data.user_name);
break;
2025-06-03 12:12:48 +02:00
case 'leave-announce':
2025-06-08 18:27:17 +03:00
displayUserLeft(data.sid);
break;
2025-06-03 12:12:48 +02:00
case 'initialUsers':
2025-06-08 18:27:17 +03:00
displayInitialUsers(data);
break;
2025-06-03 12:12:48 +02:00
case 'nameChangeAnnounce':
2025-06-08 18:27:17 +03:00
updateName(message.data.sid, message.data.user_name);
break;
2025-06-03 12:12:48 +02:00
case 'addSticker':
2025-06-08 18:27:17 +03:00
addSticker(message.data.cardId, message.data.stickerId);
break;
2025-06-03 12:12:48 +02:00
case 'setBoardSize':
2025-06-08 18:27:17 +03:00
resizeBoard(message.data);
break;
2025-06-03 12:12:48 +02:00
case 'export':
2025-06-08 18:27:17 +03:00
download(message.data.filename, message.data.text);
break;
2025-06-03 12:12:48 +02:00
case 'addRevision':
2025-06-08 18:27:17 +03:00
addRevision(message.data);
break;
2025-06-03 12:12:48 +02:00
case 'deleteRevision':
2025-06-08 18:27:17 +03:00
$(`#revision-${message.data}`).remove();
break;
2025-06-03 12:12:48 +02:00
case 'initRevisions':
2025-06-08 18:27:17 +03:00
$('#revisions-list').empty();
2025-06-03 12:12:48 +02:00
for (let i = 0; i < message.data.length; i++) {
2025-06-08 18:27:17 +03:00
addRevision(message.data[i]);
}
2025-06-08 18:27:17 +03:00
break;
2011-03-10 08:20:27 -05:00
default:
2025-06-03 12:12:48 +02:00
// unknown message
2025-06-08 18:27:17 +03:00
alert(`action inconnue : ${JSON.stringify(message)}`);
break;
}
2011-03-10 08:20:27 -05:00
}
2025-06-03 12:12:48 +02:00
$(document).on('keyup', (event) => {
2025-06-08 18:27:17 +03:00
keyTrap = event.which;
});
function drawNewCard(
id,
text,
x,
y,
rot,
colour,
sticker,
animationspeed,
mx = 0,
my = 0,
) {
2025-06-03 12:12:48 +02:00
// cards[id] = {id: id, text: text, x: x, y: y, rot: rot, colour: colour};
2025-06-08 18:27:17 +03:00
const h = `<div id="${id}" class="card ${
2025-06-03 12:12:48 +02:00
colour
2025-06-08 18:27:17 +03:00
} draggable" style="-webkit-transform:rotate(${rot}deg);\
">\
2023-03-05 10:19:34 +03:00
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16" class="card-icon delete-card-icon bi bi-x-lg"><path d="M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z"></path></svg>\
2025-06-03 12:12:48 +02:00
<div id="content:${
2025-06-08 18:27:17 +03:00
id
}" class="content stickertarget droppable" data-text="">${marked(
text,
)}</div><span class="filler"></span>\
</div>`;
const card = $(h);
card.appendTo('#board');
$(`#${id}`).children('.content:first').attr('data-text', text);
2025-06-03 12:12:48 +02:00
// @TODO
// Draggable has a bug which prevents blur event
// http://bugs.jqueryui.com/ticket/4261
// So we have to blur all the cards and editable areas when
// we click on a card
// The following doesn't work so we will do the bug
// fix recommended in the above bug report
2022-04-14 09:21:17 +03:00
// card.on('click', function() {
// $(this).focus();
// } );
card.draggable({
snap: false,
snapTolerance: 5,
containment: [0, 0, 2000, 2000],
2025-06-03 12:12:48 +02:00
stack: '.card',
start(event, ui) {
2025-06-08 18:27:17 +03:00
keyTrap = null;
},
2025-06-03 12:12:48 +02:00
drag(event, ui) {
if (keyTrap == 27) {
2025-06-08 18:27:17 +03:00
ui.helper.css(ui.originalPosition);
return false;
}
},
2025-06-08 18:27:17 +03:00
handle: 'div.content',
});
2025-06-03 12:12:48 +02:00
// After a drag:
2025-06-08 18:27:17 +03:00
card.on('dragstop', function (event, ui) {
if (keyTrap == 27) {
2025-06-08 18:27:17 +03:00
keyTrap = null;
return;
}
2014-09-13 02:04:27 -04:00
2025-06-03 12:12:48 +02:00
const data = {
id: this.id,
position: ui.position,
2025-06-08 18:27:17 +03:00
oldposition: ui.originalPosition,
};
2014-09-13 02:04:27 -04:00
2025-06-08 18:27:17 +03:00
sendAction('moveCard', data);
});
2014-09-13 02:04:27 -04:00
2025-06-03 12:12:48 +02:00
card.children('.droppable').droppable({
accept: '.sticker',
drop(event, ui) {
2025-06-08 18:27:17 +03:00
const stickerId = ui.draggable.attr('id');
const cardId = $(this).parent().attr('id');
2014-09-13 02:04:27 -04:00
2025-06-08 18:27:17 +03:00
addSticker(cardId, stickerId);
2014-09-13 02:04:27 -04:00
2025-06-03 12:12:48 +02:00
const data = {
cardId,
2025-06-08 18:27:17 +03:00
stickerId,
};
sendAction('addSticker', data);
2025-06-03 12:12:48 +02:00
// remove hover state to everything on the board to prevent
// a jquery bug where it gets left around
2025-06-08 18:27:17 +03:00
$('.card-hover-draggable').removeClass('card-hover-draggable');
},
2025-06-08 18:27:17 +03:00
hoverClass: 'card-hover-draggable',
});
2025-06-08 18:27:17 +03:00
let speed = Math.floor(Math.random() * 1000);
if (typeof animationspeed !== 'undefined') speed = animationspeed;
2023-03-05 10:19:34 +03:00
if (mx == 0 && my == 0) {
2025-06-08 18:27:17 +03:00
const startPosition = $('#create-card').position();
mx = startPosition.left;
my = startPosition.top;
2023-03-05 10:19:34 +03:00
}
2025-06-08 18:27:17 +03:00
card.css('top', my);
card.css('left', mx);
card.animate(
{
2025-06-03 12:12:48 +02:00
left: `${x}px`,
2025-06-08 18:27:17 +03:00
top: `${y}px`,
},
2025-06-08 18:27:17 +03:00
speed,
);
2025-06-03 12:12:48 +02:00
card.children('.delete-card-icon').on('click', () => {
2025-06-08 18:27:17 +03:00
$(`#${id}`).remove();
2025-06-03 12:12:48 +02:00
// notify server of delete
2025-06-08 18:27:17 +03:00
sendAction('deleteCard', { id });
});
2025-06-03 12:12:48 +02:00
card.children('.content').editable(
(value, settings) => {
2025-06-08 18:27:17 +03:00
$(`#${id}`).children('.content:first').attr('data-text', value);
onCardChange(id, value);
return marked(value);
},
{
2025-06-03 12:12:48 +02:00
type: 'textarea',
data() {
2025-06-08 18:27:17 +03:00
return $(`#${id}`).children('.content:first').attr('data-text');
},
2025-06-03 12:12:48 +02:00
submit: 'OK',
style: 'inherit',
cssclass: 'card-edit-form',
placeholder: 'Double cliquez pour méditer',
onblur: 'submit',
2025-06-08 18:27:17 +03:00
event: 'dblclick', // event: 'mouseover'
},
);
2014-09-13 02:04:27 -04:00
2025-06-03 12:12:48 +02:00
// add applicable sticker
2025-06-08 18:27:17 +03:00
if (sticker !== null) addSticker(id, sticker);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function onCardChange(id, text) {
2025-06-03 12:12:48 +02:00
sendAction('editCard', {
id,
2025-06-08 18:27:17 +03:00
value: text,
});
2011-03-10 08:20:27 -05:00
}
2011-06-14 07:42:04 +08:00
function moveCard(card, position) {
card.animate(
{
2025-06-03 12:12:48 +02:00
left: `${position.left}px`,
2025-06-08 18:27:17 +03:00
top: `${position.top}px`,
},
2025-06-08 18:27:17 +03:00
500,
);
2011-06-14 07:42:04 +08:00
}
2014-09-13 02:04:27 -04:00
function addSticker(cardId, stickerId) {
2025-06-08 18:27:17 +03:00
stickerContainer = $(`#${cardId} .filler`);
2025-06-03 12:12:48 +02:00
if (stickerId === 'nosticker') {
2025-06-08 18:27:17 +03:00
stickerContainer.html('');
return;
}
if (Array.isArray(stickerId)) {
2025-06-03 12:12:48 +02:00
for (const i in stickerId) {
2025-06-08 18:27:17 +03:00
stickerContainer.prepend(
`<img src="images/stickers/${stickerId[i]}.png">`,
);
2014-09-13 02:04:27 -04:00
}
2025-06-08 18:27:17 +03:00
} else if (stickerContainer.html().indexOf(stickerId) < 0) {
stickerContainer.prepend(`<img src="images/stickers/${stickerId}.png">`);
}
2011-03-10 08:20:27 -05:00
}
//----------------------------------
// cards
//----------------------------------
2025-06-03 12:12:48 +02:00
function createCard(id, text, x, y, rot, colour, mx = 0, my = 0) {
2025-06-08 18:27:17 +03:00
drawNewCard(id, text, x, y, rot, colour, null, null, mx, my);
2025-06-08 18:27:17 +03:00
const action = 'createCard';
2025-06-03 12:12:48 +02:00
const data = {
id,
text,
x,
y,
rot,
2025-06-08 18:27:17 +03:00
colour,
};
2025-06-08 18:27:17 +03:00
sendAction(action, data);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function randomCardColour() {
2025-06-08 18:27:17 +03:00
const colours = ['yellow', 'green', 'blue', 'white'];
2025-06-08 18:27:17 +03:00
const i = Math.floor(Math.random() * colours.length);
2025-06-08 18:27:17 +03:00
return colours[i];
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function initCards(cardArray) {
2025-06-03 12:12:48 +02:00
// first delete any cards that exist
2025-06-08 18:27:17 +03:00
$('.card').remove();
2011-05-29 15:36:30 -04:00
2025-06-08 18:27:17 +03:00
cards = cardArray;
2025-06-03 12:12:48 +02:00
for (const i in cardArray) {
2025-06-08 18:27:17 +03:00
card = cardArray[i];
drawNewCard(
card.id,
card.text,
card.x,
card.y,
card.rot,
card.colour,
card.sticker,
0,
);
}
2011-03-10 08:20:27 -05:00
2025-06-08 18:27:17 +03:00
boardInitialized = true;
unblockUI();
}
2011-03-10 08:20:27 -05:00
//----------------------------------
// cols
//----------------------------------
2014-09-13 02:04:27 -04:00
function drawNewColumn(columnName) {
2025-06-08 18:27:17 +03:00
let cls = 'col';
if (totalcolumns === 0) {
2025-06-08 18:27:17 +03:00
cls = 'col first';
}
2025-06-03 12:12:48 +02:00
$('#icon-col').before(
2025-06-08 18:27:17 +03:00
`<td class="${cls}" width="10%" style="display:none"><h2 id="col-${
2025-06-03 12:12:48 +02:00
totalcolumns + 1
2025-06-08 18:27:17 +03:00
}" class="editable">${columnName}</h2></td>`,
);
2025-06-03 12:12:48 +02:00
$('.editable').editable(
2025-06-08 18:27:17 +03:00
function (value, settings) {
onColumnChange(this.id, value);
return value;
},
{
2025-06-03 12:12:48 +02:00
style: 'inherit',
cssclass: 'card-edit-form',
type: 'textarea',
placeholder: 'Nouveau',
onblur: 'submit',
width: '',
height: '',
2025-06-08 18:27:17 +03:00
xindicator: '<span class="ajax-loader"></span>',
event: 'dblclick', // event: 'mouseover'
},
);
2025-06-08 18:27:17 +03:00
$('.col:last').fadeIn(500);
2014-09-13 02:04:27 -04:00
2025-06-08 18:27:17 +03:00
totalcolumns++;
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function onColumnChange(id, text) {
2025-06-08 18:27:17 +03:00
const names = [];
2025-06-03 12:12:48 +02:00
// console.log(id + " " + text );
2025-06-03 12:12:48 +02:00
// Get the names of all the columns right from the DOM
2025-06-08 18:27:17 +03:00
$('.col').each(function () {
2025-06-03 12:12:48 +02:00
// get ID of current column we are traversing over
2025-06-08 18:27:17 +03:00
const thisID = $(this).children('h2').attr('id');
if (id == thisID) {
2025-06-08 18:27:17 +03:00
names.push(text);
} else {
2025-06-08 18:27:17 +03:00
names.push($(this).text());
}
2025-06-08 18:27:17 +03:00
});
2025-06-08 18:27:17 +03:00
updateColumns(names);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function displayRemoveColumn() {
2025-06-08 18:27:17 +03:00
if (totalcolumns <= 0) return false;
2025-06-08 18:27:17 +03:00
$('.col:last').fadeOut(150, function () {
$(this).remove();
});
2025-06-08 18:27:17 +03:00
totalcolumns--;
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function createColumn(name) {
2025-06-08 18:27:17 +03:00
if (totalcolumns >= 8) return false;
2025-06-08 18:27:17 +03:00
drawNewColumn(name);
columns.push(name);
2025-06-08 18:27:17 +03:00
const action = 'updateColumns';
2025-06-08 18:27:17 +03:00
const data = columns;
2025-06-08 18:27:17 +03:00
sendAction(action, data);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function deleteColumn() {
2025-06-08 18:27:17 +03:00
if (totalcolumns <= 0) return false;
2025-06-08 18:27:17 +03:00
displayRemoveColumn();
columns.pop();
2025-06-08 18:27:17 +03:00
const action = 'updateColumns';
2025-06-08 18:27:17 +03:00
const data = columns;
2025-06-08 18:27:17 +03:00
sendAction(action, data);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function updateColumns(c) {
2025-06-08 18:27:17 +03:00
columns = c;
2025-06-08 18:27:17 +03:00
const action = 'updateColumns';
2025-06-08 18:27:17 +03:00
const data = columns;
2025-06-08 18:27:17 +03:00
sendAction(action, data);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function deleteColumns(next) {
2025-06-03 12:12:48 +02:00
// delete all existing columns:
2025-06-08 18:27:17 +03:00
$('.col').fadeOut('slow', next());
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function initColumns(columnArray) {
2025-06-08 18:27:17 +03:00
totalcolumns = 0;
columns = columnArray;
2025-06-08 18:27:17 +03:00
$('.col').remove();
2025-06-03 12:12:48 +02:00
for (const i in columnArray) {
2025-06-08 18:27:17 +03:00
column = columnArray[i];
2011-03-10 08:20:27 -05:00
2025-06-08 18:27:17 +03:00
drawNewColumn(column);
}
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function changeThemeTo(theme) {
2025-06-08 18:27:17 +03:00
currentTheme = theme;
2023-03-05 10:19:34 +03:00
if (theme == 'bigcards') {
2025-06-08 18:27:17 +03:00
$('#board').removeClass('smallcards');
2023-03-05 10:19:34 +03:00
} else {
2025-06-08 18:27:17 +03:00
$('#board').removeClass('bigcards');
2023-03-05 10:19:34 +03:00
}
2025-06-08 18:27:17 +03:00
$('#board').addClass(theme);
2011-03-10 08:20:27 -05:00
}
2025-06-03 12:12:48 +02:00
/// ///////////////////////////////////////////////////////
/// /////// NAMES STUFF ///////////////////////////////////
/// ///////////////////////////////////////////////////////
2011-03-10 08:20:27 -05:00
2014-09-13 02:04:27 -04:00
function setCookie(c_name, value, exdays) {
2025-06-08 18:27:17 +03:00
const exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
const c_value = `${escape(value) + (exdays === null ? '' : `; expires=${exdate.toUTCString()}`)};SameSite=Strict`;
document.cookie = `${c_name}=${c_value}`;
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function getCookie(c_name) {
2025-06-08 18:27:17 +03:00
let i;
let x;
let y;
const ARRcookies = document.cookie.split(';');
for (i = 0; i < ARRcookies.length; i++) {
2025-06-08 18:27:17 +03:00
x = ARRcookies[i].substr(0, ARRcookies[i].indexOf('='));
y = ARRcookies[i].substr(ARRcookies[i].indexOf('=') + 1);
x = x.replace(/^\s+|\s+$/g, '');
if (x == c_name) {
2025-06-08 18:27:17 +03:00
return unescape(y);
2014-09-13 02:04:27 -04:00
}
}
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function setName(name) {
2025-06-08 18:27:17 +03:00
sendAction('setUserName', name);
2025-06-08 18:27:17 +03:00
setCookie('scrumscrum-username', name, 365);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function displayInitialUsers(users) {
2025-06-03 12:12:48 +02:00
for (const i in users) {
// console.log(users);
2025-06-08 18:27:17 +03:00
displayUserJoined(users[i].sid, users[i].user_name);
}
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function displayUserJoined(sid, user_name) {
2025-06-08 18:27:17 +03:00
name = '';
if (user_name) name = user_name;
else name = sid.substring(0, 5);
2025-06-08 18:27:17 +03:00
$('#names-ul').append(`<li id="user-${sid}">${name}</li>`);
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function displayUserLeft(sid) {
2025-06-08 18:27:17 +03:00
name = '';
if (name) name = user_name;
else name = sid;
2025-06-08 18:27:17 +03:00
const id = `#user-${sid.toString()}`;
2025-06-03 12:12:48 +02:00
$('#names-ul')
.children(id)
2025-06-08 18:27:17 +03:00
.fadeOut(1000, function () {
$(this).remove();
});
2011-03-10 08:20:27 -05:00
}
2014-09-13 02:04:27 -04:00
function updateName(sid, name) {
2025-06-08 18:27:17 +03:00
const id = `#user-${sid.toString()}`;
2025-06-08 18:27:17 +03:00
$('#names-ul').children(id).text(name);
2011-03-10 08:20:27 -05:00
}
2011-05-27 01:08:25 -04:00
2025-06-03 12:12:48 +02:00
/// ///////////////////////////////////////////////////////
/// ///////////////////////////////////////////////////////
2011-05-27 01:08:25 -04:00
2014-09-13 02:04:27 -04:00
function boardResizeHappened(event, ui) {
2025-06-08 18:27:17 +03:00
const newsize = ui.size;
2011-06-14 07:42:04 +08:00
2025-06-08 18:27:17 +03:00
sendAction('setBoardSize', newsize);
2011-05-27 01:08:25 -04:00
}
2014-09-13 02:04:27 -04:00
function resizeBoard(size) {
2025-06-03 12:12:48 +02:00
$('.board-outline').animate({
height: size.height,
2025-06-08 18:27:17 +03:00
width: size.width,
});
2011-05-27 01:08:25 -04:00
}
2025-06-03 12:12:48 +02:00
/// ///////////////////////////////////////////////////////
/// ///////////////////////////////////////////////////////
2011-03-10 08:20:27 -05:00
2011-06-14 07:42:04 +08:00
function calcCardOffset() {
2025-06-08 18:27:17 +03:00
const offsets = {};
$('.card').each(function () {
const card = $(this);
$('.col').each(function (i) {
const col = $(this);
if (
col.offset().left + col.outerWidth() >
card.offset().left + card.outerWidth() ||
i === $('.col').length - 1
) {
2025-06-03 12:12:48 +02:00
offsets[card.attr('id')] = {
col,
2025-06-08 18:27:17 +03:00
x: (card.offset().left - col.offset().left) / col.outerWidth(),
};
return false;
}
2025-06-08 18:27:17 +03:00
});
});
return offsets;
2011-06-14 07:42:04 +08:00
}
2025-06-03 12:12:48 +02:00
// moves cards with a resize of the Board
// doSync is false if you don't want to synchronize
// with all the other users who are in this room
2011-06-23 19:12:53 -04:00
function adjustCard(offsets, doSync) {
2025-06-08 18:27:17 +03:00
$('.card').each(function () {
const card = $(this);
const offset = offsets[this.id];
if (offset) {
2025-06-03 12:12:48 +02:00
const data = {
id: this.id,
position: {
left: offset.col.position().left + offset.x * offset.col.outerWidth(),
2025-06-08 18:27:17 +03:00
top: parseInt(card.css('top').slice(0, -2)),
},
oldposition: {
2025-06-03 12:12:48 +02:00
left: parseInt(card.css('left').slice(0, -2)),
2025-06-08 18:27:17 +03:00
top: parseInt(card.css('top').slice(0, -2)),
},
}; // use .css() instead of .position() because css' rotate
2025-06-03 12:12:48 +02:00
// console.log(data);
if (!doSync) {
2025-06-08 18:27:17 +03:00
card.css('left', data.position.left);
card.css('top', data.position.top);
} else {
2025-06-03 12:12:48 +02:00
// note that in this case, data.oldposition isn't accurate since
// many moves have happened since the last sync
// but that's okay becuase oldPosition isn't used right now
2025-06-08 18:27:17 +03:00
moveCard(card, data.position);
sendAction('moveCard', data);
}
}
2025-06-08 18:27:17 +03:00
});
2011-06-14 07:42:04 +08:00
}
2025-06-03 12:12:48 +02:00
/// ///////////////////////////////////////////////////////
/// ///////////////////////////////////////////////////////
2011-06-14 07:42:04 +08:00
2016-09-13 09:06:15 +02:00
function download(filename, text) {
2025-06-08 18:27:17 +03:00
const element = document.createElement('a');
let mime = 'text/plain';
if (filename.match(/.csv$/)) {
2025-06-08 18:27:17 +03:00
mime = 'text/csv';
}
2025-06-08 18:27:17 +03:00
element.setAttribute(
'href',
`data:${mime};charset=utf-8,${encodeURIComponent(text)}`,
);
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
2016-09-13 09:06:15 +02:00
}
function addRevision(timestamp) {
2025-06-08 18:27:17 +03:00
const li = $(`<li id="revision-${timestamp}"></li>`);
const s1 = $('<span></span>');
const s2 = $(
'<img src="/images/stickers/sticker-deletestar.png" alt="delete revision">',
);
2025-06-03 12:12:48 +02:00
if (typeof timestamp === 'string') {
2025-06-08 18:27:17 +03:00
timestamp = parseInt(timestamp);
}
2025-06-08 18:27:17 +03:00
s1.text(moment(timestamp).format('LLLL'));
2025-06-08 18:27:17 +03:00
li.append(s1);
li.append(s2);
$('#revisions-list').append(li);
2023-03-05 10:19:34 +03:00
// $('body').on("click", s1, function () {
// socket.json.send({
// action: "exportRevision",
// data: timestamp,
// })
// })
// $('body').on("click", s2, function () {
// socket.json.send({
// action: "deleteRevision",
// data: timestamp,
// })
// })
}
2025-06-03 12:12:48 +02:00
/// ///////////////////////////////////////////////////////
/// ///////////////////////////////////////////////////////
2016-09-13 09:06:15 +02:00
2025-06-03 12:12:48 +02:00
$(() => {
// disable image dragging
// window.ondragstart = function() { return false; };
2025-06-08 18:27:17 +03:00
if (boardInitialized === false) blockUI('<span class="ajax-loader"></span>');
2025-06-03 12:12:48 +02:00
// setTimeout($.unblockUI, 2000);
2025-06-08 18:27:17 +03:00
$('.add-post-it').on('click', function (e) {
const rotation = Math.random() * 10 - 5; // add a bit of random rotation (+/- 10deg)
const cardLeft = 150 + Math.random() * 400;
const cardTop = 20 + Math.random() * 50;
const uniqueID = Math.round(Math.random() * 99999999); // is this big enough to assure uniqueness?
console.log(e.clientX, e.clientY);
createCard(
`card${uniqueID}`,
'',
cardLeft,
cardTop,
rotation,
$(this).data('color'),
e.clientX,
e.clientY,
);
});
// Style changer
2025-06-03 12:12:48 +02:00
$('#smallify').on('click', () => {
if (currentTheme == 'bigcards') {
2025-06-08 18:27:17 +03:00
changeThemeTo('smallcards');
2025-06-03 12:12:48 +02:00
} else if (currentTheme == 'smallcards') {
2025-06-08 18:27:17 +03:00
changeThemeTo('bigcards');
}
2025-06-08 18:27:17 +03:00
sendAction('changeTheme', currentTheme);
2025-06-08 18:27:17 +03:00
return false;
});
2025-06-03 12:12:48 +02:00
$('#icon-col').on(
'hover',
() => {
2025-06-08 18:27:17 +03:00
$('.col-icon').fadeIn(10);
},
2025-06-03 12:12:48 +02:00
() => {
2025-06-08 18:27:17 +03:00
$('.col-icon').fadeOut(150);
},
);
2025-06-03 12:12:48 +02:00
$('#add-col').on('click', () => {
2025-06-08 18:27:17 +03:00
createColumn('Nouvelle colonne');
return false;
});
2025-06-03 12:12:48 +02:00
$('#delete-col').on('click', () => {
2025-06-08 18:27:17 +03:00
deleteColumn();
return false;
});
2025-06-08 18:27:17 +03:00
const user_name = getCookie('scrumscrum-username');
2025-06-08 18:27:17 +03:00
$('#yourname-input').on('focus', function () {
2025-06-03 12:12:48 +02:00
if ($(this).val() == 'anonyme') {
2025-06-08 18:27:17 +03:00
$(this).val('');
}
2025-06-08 18:27:17 +03:00
$(this).addClass('focused');
});
2011-03-10 08:20:27 -05:00
2025-06-08 18:27:17 +03:00
$('#yourname-input').on('blur', function () {
2025-06-03 12:12:48 +02:00
if ($(this).val() === '') {
2025-06-08 18:27:17 +03:00
$(this).val('anonyme');
}
2025-06-08 18:27:17 +03:00
$(this).removeClass('focused');
2025-06-08 18:27:17 +03:00
setName($(this).val());
});
2025-06-08 18:27:17 +03:00
$('#yourname-input').val(user_name);
$('#yourname-input').trigger('blur');
2025-06-08 18:27:17 +03:00
$('#yourname-li').hide();
2011-03-10 08:20:27 -05:00
2025-06-08 18:27:17 +03:00
$('#yourname-input').on('keypress', function (e) {
code = e.keyCode ? e.keyCode : e.which;
if (code == 10 || code == 13) {
2025-06-08 18:27:17 +03:00
$(this).trigger('blur');
}
2025-06-08 18:27:17 +03:00
});
2025-06-03 12:12:48 +02:00
$('.sticker').draggable({
revert: true,
2025-06-08 18:27:17 +03:00
zIndex: 1000,
});
2025-06-03 12:12:48 +02:00
$('.board-outline').resizable({
ghost: false,
2023-03-05 10:19:34 +03:00
minWidth: 640,
minHeight: 480,
maxWidth: 1140,
2025-06-08 18:27:17 +03:00
maxHeight: 855,
});
2025-06-03 12:12:48 +02:00
// A new scope for precalculating
2025-06-08 18:27:17 +03:00
(function () {
let offsets;
2025-06-03 12:12:48 +02:00
$('.board-outline').on('resizestart', () => {
2025-06-08 18:27:17 +03:00
offsets = calcCardOffset();
});
2025-06-03 12:12:48 +02:00
$('.board-outline').on('resize', (event, ui) => {
2025-06-08 18:27:17 +03:00
adjustCard(offsets, false);
});
2025-06-03 12:12:48 +02:00
$('.board-outline').on('resizestop', (event, ui) => {
2025-06-08 18:27:17 +03:00
boardResizeHappened(event, ui);
adjustCard(offsets, true);
});
})();
2025-06-03 12:12:48 +02:00
$('#marker').draggable({
axis: 'x',
2025-06-08 18:27:17 +03:00
containment: 'parent',
});
2025-06-03 12:12:48 +02:00
$('#eraser').draggable({
axis: 'x',
2025-06-08 18:27:17 +03:00
containment: 'parent',
});
2025-06-03 12:12:48 +02:00
$('#export-txt').on('click', () => {
socket.json.send({
2025-06-03 12:12:48 +02:00
action: 'exportTxt',
2025-06-08 18:27:17 +03:00
data:
$('.col').length !== 0
? $('.col').css('width').replace('px', '')
: null,
});
});
2025-06-03 12:12:48 +02:00
$('#export-csv').on('click', () => {
socket.json.send({
2025-06-03 12:12:48 +02:00
action: 'exportCsv',
2025-06-08 18:27:17 +03:00
data:
$('.col').length !== 0
? $('.col').css('width').replace('px', '')
: null,
});
});
2025-06-03 12:12:48 +02:00
$('#export-json').on('click', () => {
socket.json.send({
2025-06-03 12:12:48 +02:00
action: 'exportJson',
data: {
2025-06-03 12:12:48 +02:00
width: $('.board-outline').css('width').replace('px', ''),
2025-06-08 18:27:17 +03:00
height: $('.board-outline').css('height').replace('px', ''),
},
});
});
2025-06-03 12:12:48 +02:00
$('#import-file').on('click', (evt) => {
2025-06-08 18:27:17 +03:00
evt.stopPropagation();
evt.preventDefault();
2025-06-08 18:27:17 +03:00
const f = $('#import-input').get(0).files[0];
const fr = new FileReader();
fr.onloadend = function () {
const text = fr.result;
socket.json.send({
2025-06-03 12:12:48 +02:00
action: 'importJson',
2025-06-08 18:27:17 +03:00
data: JSON.parse(text),
});
};
fr.readAsText(f);
});
2025-06-03 12:12:48 +02:00
$('#create-revision').on('click', () => {
socket.json.send({
2025-06-03 12:12:48 +02:00
action: 'createRevision',
data: {
2025-06-03 12:12:48 +02:00
width: $('.board-outline').css('width').replace('px', ''),
2025-06-08 18:27:17 +03:00
height: $('.board-outline').css('height').replace('px', ''),
},
});
});
});
2017-07-12 08:57:22 +02:00
2025-06-03 12:12:48 +02:00
/** Doubleclick on mobile + Layout Framemo with tabs * */
$(document).ready(() => {
2025-06-08 18:27:17 +03:00
if (
window.location.href !=
`${window.location.protocol}//${window.location.host}/`
) {
// Not on homepage
2017-07-12 08:57:22 +02:00
2025-06-03 12:12:48 +02:00
/** Double click on mobile interface * */
2017-07-12 08:57:22 +02:00
2025-06-08 18:27:17 +03:00
let clickTimer = null;
let clickTarget = null;
let editTarget = null;
2017-07-12 08:57:22 +02:00
function doubletapCards(selector) {
2025-06-08 18:27:17 +03:00
$(`${selector} .stickertarget`).addClass('doubletap'); // Escape multi bound
2017-07-12 08:57:22 +02:00
2025-06-03 12:12:48 +02:00
$(`${selector} .doubletap`).on('click', () => {
2025-06-08 18:27:17 +03:00
clickTarget = selector.replace('#', '');
2017-07-12 08:57:22 +02:00
if (clickTimer == null) {
2025-06-03 12:12:48 +02:00
clickTimer = setTimeout(() => {
2025-06-08 18:27:17 +03:00
clickTimer = null;
}, 1000);
} else {
2025-06-03 12:12:48 +02:00
// console.log('doubleclick : '+clickTimer+':'+editTarget);
2025-06-08 18:27:17 +03:00
clearTimeout(clickTimer);
clickTimer = null;
if (
editTarget == clickTarget &&
clickTarget !== undefined &&
clickTarget !== null
) {
$(`#${clickTarget.replace('content:', '')} .doubletap`).trigger(
'dblclick',
);
}
2017-07-12 08:57:22 +02:00
}
2025-06-08 18:27:17 +03:00
editTarget = clickTarget;
});
}
2017-07-12 08:57:22 +02:00
function doubletapTitle(selector) {
2025-06-08 18:27:17 +03:00
$(selector).addClass('doubletap'); // Escape multi bound
2017-07-12 08:57:22 +02:00
2025-06-03 12:12:48 +02:00
$(`${selector}.doubletap`).on('click', () => {
2025-06-08 18:27:17 +03:00
clickTarget = selector.replace('#', '');
2017-07-12 08:57:22 +02:00
if (clickTimer == null) {
2025-06-03 12:12:48 +02:00
clickTimer = setTimeout(() => {
2025-06-08 18:27:17 +03:00
clickTimer = null;
}, 1000);
} else {
2025-06-03 12:12:48 +02:00
// console.log('doubleclick : '+clickTimer+':'+editTarget);
2025-06-08 18:27:17 +03:00
clearTimeout(clickTimer);
clickTimer = null;
if (
editTarget == clickTarget &&
clickTarget !== undefined &&
clickTarget !== null
) {
$(`#${clickTarget}.doubletap`).trigger('dblclick');
}
}
2017-07-12 08:57:22 +02:00
2025-06-08 18:27:17 +03:00
editTarget = clickTarget;
});
}
2017-07-12 08:57:22 +02:00
2025-06-03 12:12:48 +02:00
setInterval(() => {
// Add periodically the doubletap event on new cards
2025-06-08 18:27:17 +03:00
$('.stickertarget:not(.doubletap)').each(function () {
doubletapCards(`#${$(this).attr('id').replace('content:', '')}`);
});
$('#board-table .col h2:not(.doubletap)').each(function () {
doubletapTitle(`#${$(this).attr('id')}`);
});
}, 500);
2025-06-03 12:12:48 +02:00
/** Layout Framemo - Tabs * */
// Defaut board real size (not 'auto' or 'inherit') saved in database
// in order to be able to center it
2025-06-03 12:12:48 +02:00
var boardReady = setInterval(() => {
if (boardInitialized) {
// when board is ready
2025-06-03 12:12:48 +02:00
if ($('.board-outline').attr('style') === undefined) {
// check if size is imported from db
2025-06-03 12:12:48 +02:00
$('.board-outline').css({
width: `${$('.board-outline.ui-resizable').width() + 16}px`,
2025-06-08 18:27:17 +03:00
height: '466px',
});
const data = {};
data.size = {
height: 466,
2025-06-08 18:27:17 +03:00
width: $('.board-outline.ui-resizable').width() + 16,
};
boardResizeHappened('resizestop', data); // using scrumblr function that keep size in db after a resize
2017-07-12 08:57:22 +02:00
}
2025-06-08 18:27:17 +03:00
clearInterval(boardReady);
}
2025-06-08 18:27:17 +03:00
}, 500);
2023-03-05 10:19:34 +03:00
// $("#scrumblr")
// .append($(".names, .stickers, .buttons"))
// .after(
// '<div role="tabpanel" class="tab-pane" id="export-import"></div>' +
// '<div role="tabpanel" class="tab-pane" id="share"></div>' +
// '<div role="tabpanel" class="tab-pane" id="revisions"></div>' +
// '<div role="tabpanel" class="tab-pane" id="about"></div>'
// )
2023-03-05 10:19:34 +03:00
// $("#export-import").append($(".export, .import"))
// $("#share").append($(".share"))
// $("#revisions").append($(".revisions"))
// $("#about").append($("#tuto-faq, #le-logiciel, #jardin"))
// Style
2025-06-08 18:27:17 +03:00
$('#smallify').on('click', function () {
2025-06-03 12:12:48 +02:00
if (currentTheme == 'bigcards') {
2025-06-08 18:27:17 +03:00
$(this)
.children('i')
.removeClass('fa-search-plus')
.addClass('fa-search-minus');
} else {
2025-06-08 18:27:17 +03:00
$(this)
.children('i')
.removeClass('fa-search-minus')
.addClass('fa-search-plus');
}
2025-06-08 18:27:17 +03:00
});
2017-07-12 08:57:22 +02:00
2025-06-08 18:27:17 +03:00
$('#full-page').on('click', function () {
2025-06-03 12:12:48 +02:00
if ($(this).children('i').hasClass('fa-expand')) {
2025-06-08 18:27:17 +03:00
$(this).children('i').removeClass('fa-expand').addClass('fa-compress');
$('#header-bar').hide();
} else {
2025-06-08 18:27:17 +03:00
$(this).children('i').removeClass('fa-compress').addClass('fa-expand');
$('#header-bar').show();
}
2025-06-08 18:27:17 +03:00
toggleFullScreen();
});
2017-07-12 08:57:22 +02:00
2025-06-03 12:12:48 +02:00
/** Mode iframe * */
if (top.location != self.document.location) {
2025-06-08 18:27:17 +03:00
$('#header-bar').hide();
2017-07-12 08:57:22 +02:00
}
// put URL in share input
2025-06-08 18:27:17 +03:00
const mainurl = location.toString().split('#')[0];
$('.replace-url').val(mainurl);
$('.share-iframe').text(
$('.share-iframe').text().replace('{{replace-url}}', mainurl),
);
// copy URL to clipboard
2025-06-03 12:12:48 +02:00
$('#copyurl').on('click', (e) => {
2025-06-08 18:27:17 +03:00
e.preventDefault();
const node = document.getElementById('taburl');
node.disabled = null;
node.select();
const success = document.execCommand('copy');
if (success) {
2025-06-08 18:27:17 +03:00
getSelection().removeAllRanges();
node.disabled = 'disabled';
alert('URL du tableau copiée dans votre presse-papier !');
} else {
alert(
2025-06-08 18:27:17 +03:00
"Impossible de copier l'URL du tableau dans votre presse-papier. Veuillez copier son adresse manuellement (Ctrl+C).",
);
}
2025-06-08 18:27:17 +03:00
});
}
2025-06-08 18:27:17 +03:00
});
2019-07-19 17:35:20 +03:00
function go() {
2025-06-08 18:27:17 +03:00
let { value } = document.forms[0].elements.name;
value = value.replace(/[\/\?&#]/g, '');
window.location.href = value;
return false;
}
2025-06-03 12:12:48 +02:00
$(() => {
2025-06-08 18:27:17 +03:00
const headerBarUrl = $('#header-bar').data('url');
if (headerBarUrl) {
2025-06-08 18:27:17 +03:00
const getJSON = function (url, callback) {
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'json';
xhr.onload = function () {
const { status } = xhr;
2019-07-19 17:35:20 +03:00
if (status === 200) {
2025-06-08 18:27:17 +03:00
callback(null, xhr.response);
2019-07-19 17:35:20 +03:00
} else {
2025-06-08 18:27:17 +03:00
callback(status, xhr.response);
2019-07-19 17:35:20 +03:00
}
2025-06-08 18:27:17 +03:00
};
xhr.send();
};
2025-06-03 12:12:48 +02:00
getJSON(headerBarUrl, (err, data) => {
if (err !== null) {
2025-06-08 18:27:17 +03:00
console.log(`Something went wrong: ${err}`);
} else {
2025-06-08 18:27:17 +03:00
document.getElementById('header-bar').innerHTML = data.markup;
const styleElement = document.createElement('style');
styleElement.innerHTML = data.style;
document.getElementById('header-bar').appendChild(styleElement);
}
2025-06-08 18:27:17 +03:00
});
}
2025-06-08 18:27:17 +03:00
});
2022-04-14 09:21:17 +03:00
2025-06-03 12:12:48 +02:00
$(() => {
2023-03-05 10:19:34 +03:00
// check if hash used to show informations
if (window.location.hash == '#settings' || window.location.hash == '#share') {
2025-06-08 18:27:17 +03:00
toggleNav(window.location.hash);
2023-03-05 10:19:34 +03:00
}
2022-04-14 09:21:17 +03:00
// Toggle Nav on Click
2025-06-08 18:27:17 +03:00
$('.toggle-nav').on('click', function () {
let target = $(this).attr('href');
if (
target === '#' ||
($('#site-wrapper').hasClass('show-nav') &&
target == window.location.hash)
) {
target = false;
history.replaceState('', '', '#');
2022-04-14 09:21:17 +03:00
} else {
2025-06-08 18:27:17 +03:00
history.replaceState('', '', target);
2022-04-14 09:21:17 +03:00
}
2025-06-08 18:27:17 +03:00
toggleNav(target);
return false;
});
2022-04-14 09:21:17 +03:00
// When nav opened, a click on the canvas hides the menu
2025-06-08 18:27:17 +03:00
$('body').on(
'click',
'.show-nav #site-canvas main, .show-nav .main-header',
(e) => {
history.replaceState('', '', '#');
toggleNav(false);
return false;
},
);
$('.backgrounds .bg').on('click', function () {
2025-06-03 12:12:48 +02:00
if ($(this).hasClass('selected')) {
2025-06-08 18:27:17 +03:00
$('body').css('background-image', 'none');
$(this).removeClass('selected');
2022-04-14 09:21:17 +03:00
} else {
2025-06-08 18:27:17 +03:00
$('.selected').removeClass('selected');
$('.bgurl').val('');
$('body').css('background-image', `url("/${$(this).attr('src')}")`);
$(this).addClass('selected');
2022-04-14 09:21:17 +03:00
}
2025-06-08 18:27:17 +03:00
});
$('.bgurl').on('change', function () {
const url = $(this).val();
2022-04-14 09:21:17 +03:00
if (url) {
2025-06-08 18:27:17 +03:00
$('.selected').removeClass('selected');
$('body').css('background-image', `url("${url}")`);
2022-04-14 09:21:17 +03:00
}
2025-06-08 18:27:17 +03:00
});
});
2022-04-14 09:21:17 +03:00
function toggleNav(target) {
2025-06-03 12:12:48 +02:00
if ($('#site-wrapper').hasClass('show-nav') && target === false) {
2025-06-08 18:27:17 +03:00
$('#site-wrapper').removeClass('show-nav');
2022-04-14 09:21:17 +03:00
} else {
2025-06-08 18:27:17 +03:00
$('#share, #settings').hide();
2022-04-14 09:21:17 +03:00
if (target !== false) {
2025-06-08 18:27:17 +03:00
$(target).show();
2022-04-14 09:21:17 +03:00
}
2025-06-08 18:27:17 +03:00
$('#site-wrapper').addClass('show-nav');
2022-04-14 09:21:17 +03:00
}
2025-06-08 18:27:17 +03:00
return false;
2022-04-14 09:21:17 +03:00
}