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