shell bypass 403
$(function () {
'use strict';
var boards,
openSidebar = true,
kanbanWrapper = $('.kanban-wrapper'),
sidebar = $('.update-item-sidebar'),
datePicker = $('#due-date'),
select2 = $('.select2'),
commentEditor = $('.comment-editor'),
addNewForm = $('.add-new-board'),
updateItemSidebar = $('.update-item-sidebar'),
addNewInput = $('.add-new-board-input');
var assetPath = '../../../app-assets/';
if ($('body').attr('data-framework') === 'laravel') {
assetPath = $('body').attr('data-asset-path');
}
// Get Data
$.ajax({
type: 'GET',
dataType: 'json',
async: false,
url: assetPath + 'data/kanban.json',
success: function (data) {
boards = data;
}
});
// Toggle add new input and actions
addNewInput.toggle();
// datepicker init
if (datePicker.length) {
datePicker.flatpickr({
monthSelectorType: 'static',
altInput: true,
altFormat: 'j F, Y',
dateFormat: 'Y-m-d'
});
}
// select2
if (select2.length) {
function renderLabels(option) {
if (!option.id) {
return option.text;
}
var $badge = "<div class='badge " + $(option.element).data('color') + " rounded-pill'> " + option.text + '</div>';
return $badge;
}
select2.each(function () {
var $this = $(this);
$this.wrap("<div class='position-relative'></div>").select2({
placeholder: 'Select Label',
dropdownParent: $this.parent(),
templateResult: renderLabels,
templateSelection: renderLabels,
escapeMarkup: function (es) {
return es;
}
});
});
}
// Comment editor
if (commentEditor.length) {
new Quill('.comment-editor', {
modules: {
toolbar: '.comment-toolbar'
},
placeholder: 'Write a Comment... ',
theme: 'snow'
});
}
// Render board dropdown
function renderBoardDropdown() {
return (
"<div class='dropdown'>" +
feather.icons['more-vertical'].toSvg({
class: 'dropdown-toggle cursor-pointer font-medium-3 me-0',
id: 'board-dropdown',
'data-bs-toggle': 'dropdown',
'aria-haspopup': 'true',
'aria-expanded': 'false'
}) +
"<div class='dropdown-menu dropdown-menu-end' aria-labelledby='board-dropdown'>" +
"<a class='dropdown-item delete-board' href='#'> " +
feather.icons['trash'].toSvg({ class: 'font-medium-1 align-middle' }) +
"<span class='align-middle ms-25'>Delete</span></a>" +
"<a class='dropdown-item' href='#'>" +
feather.icons['edit'].toSvg({ class: 'font-medium-1 align-middle' }) +
"<span class='align-middle ms-25'>Rename</span></a>" +
"<a class='dropdown-item' href='#'>" +
feather.icons['archive'].toSvg({ class: 'font-medium-1 align-middle' }) +
"<span class='align-middle ms-25'>Archive</span></a>" +
'</div>' +
'</div>'
);
}
// Render item dropdown
function renderDropdown() {
return (
"<div class='dropdown item-dropdown px-1'>" +
feather.icons['more-vertical'].toSvg({
class: 'dropdown-toggle cursor-pointer me-0 font-medium-1',
id: 'item-dropdown',
' data-bs-toggle': 'dropdown',
'aria-haspopup': 'true',
'aria-expanded': 'false'
}) +
"<div class='dropdown-menu dropdown-menu-end' aria-labelledby='item-dropdown'>" +
"<a class='dropdown-item' href='#'>Copy task link</a>" +
"<a class='dropdown-item' href='#'>Duplicate task</a>" +
"<a class='dropdown-item delete-task' href='#'>Delete</a>" +
'</div>' +
'</div>'
);
}
// Render header
function renderHeader(color, text) {
return (
"<div class='d-flex justify-content-between flex-wrap align-items-center mb-1'>" +
"<div class='item-badges'> " +
"<div class='badge rounded-pill badge-light-" +
color +
"'> " +
text +
'</div>' +
'</div>' +
renderDropdown() +
'</div>'
);
}
// Render avatar
function renderAvatar(images, pullUp, margin, members, size) {
var $transition = pullUp ? ' pull-up' : '',
member = members !== undefined ? members.split(',') : '';
return images !== undefined
? images
.split(',')
.map(function (img, index, arr) {
var $margin = margin !== undefined && index !== arr.length - 1 ? ' me-' + margin + '' : '';
return (
"<li class='avatar kanban-item-avatar" +
' ' +
$transition +
' ' +
$margin +
"'" +
"data-bs-toggle='tooltip' data-bs-placement='top'" +
"title='" +
member[index] +
"'" +
'>' +
"<img src='" +
assetPath +
'images/portrait/small/' +
img +
"' alt='Avatar' height='" +
size +
"'>" +
'</li>'
);
})
.join(' ')
: '';
}
// Render footer
function renderFooter(attachments, comments, assigned, members) {
return (
"<div class='d-flex justify-content-between align-items-center flex-wrap mt-1'>" +
"<div> <span class='align-middle me-50'>" +
feather.icons['paperclip'].toSvg({ class: 'font-medium-1 align-middle me-25' }) +
"<span class='attachments align-middle'>" +
attachments +
'</span>' +
"</span> <span class='align-middle'>" +
feather.icons['message-square'].toSvg({ class: 'font-medium-1 align-middle me-25' }) +
'<span>' +
comments +
'</span>' +
'</span></div>' +
"<ul class='avatar-group mb-0'>" +
renderAvatar(assigned, true, 0, members, 28) +
'</ul>' +
'</div>'
);
}
// Init kanban
var kanban = new jKanban({
element: '.kanban-wrapper',
gutter: '15px',
widthBoard: '250px',
dragItems: true,
boards: boards,
dragBoards: true,
addItemButton: true,
itemAddOptions: {
enabled: true, // add a button to board for easy item creation
content: '+ Add New Item', // text or html content of the board button
class: 'kanban-title-button btn btn-default btn-xs', // default class of the button
footer: false // position the button on footer
},
click: function (el) {
var el = $(el);
var flag = false;
var title = el.attr('data-eid') ? el.find('.kanban-text').text() : el.text(),
date = el.attr('data-due-date'),
dateObj = new Date(),
year = dateObj.getFullYear(),
dateToUse = date
? date + ', ' + year
: dateObj.getDate() +
' ' +
dateObj.toLocaleString('en', {
month: 'long'
}) +
', ' +
year,
label = el.attr('data-badge-text'),
avatars = el.attr('data-assigned');
if (el.find('.kanban-item-avatar').length) {
el.find('.kanban-item-avatar').on('click', function (e) {
e.stopPropagation();
});
}
$(document).on('click','.item-dropdown', function(e) {
flag = true
})
setTimeout(function(){
if(flag === false) {
sidebar.modal('show');
}
}, 50)
sidebar.find('.update-item-form').on('submit', function (e) {
e.preventDefault();
});
sidebar.find('#title').val(title);
sidebar.find(datePicker).next('.form-control').val(dateToUse);
sidebar.find(select2).val(label).trigger('change');
sidebar.find('.assigned').empty();
sidebar
.find('.assigned')
.append(
renderAvatar(avatars, false, '50', el.attr('data-members'), 32) +
"<li class='avatar avatar-add-member ms-50'>" +
"<span class='avatar-content'>" +
feather.icons['plus'].toSvg({ class: 'avatar-icon' }) +
'</li>'
);
},
buttonClick: function (el, boardId) {
var addNew = document.createElement('form');
addNew.setAttribute('class', 'new-item-form');
addNew.innerHTML =
'<div class="mb-1">' +
'<textarea class="form-control add-new-item" rows="2" placeholder="Add Content" required></textarea>' +
'</div>' +
'<div class="mb-2">' +
'<button type="submit" class="btn btn-primary btn-sm me-1">Add</button>' +
'<button type="button" class="btn btn-outline-secondary btn-sm cancel-add-item">Cancel</button>' +
'</div>';
kanban.addForm(boardId, addNew);
addNew.querySelector('textarea').focus();
addNew.addEventListener('submit', function (e) {
e.preventDefault();
var currentBoard = $(".kanban-board[data-id='" + boardId + "']");
kanban.addElement(boardId, {
title: "<span class='kanban-text'>" + e.target[0].value + '</span>',
id: boardId + '-' + currentBoard.find('.kanban-item').length + 1
});
currentBoard.find('.kanban-item:last-child .kanban-text').before(renderDropdown());
addNew.remove();
});
$(document).on('click', '.cancel-add-item', function () {
$(this).closest(addNew).toggle();
});
},
dragEl: function (el, source) {
$(el).find('.item-dropdown, .item-dropdown .dropdown-menu.show').removeClass('show');
}
});
if (kanbanWrapper.length) {
new PerfectScrollbar(kanbanWrapper[0]);
}
// Render add new inline with boards
$('.kanban-container').append(addNewForm);
// Change add item button to flat button
$.each($('.kanban-title-button'), function () {
$(this).removeClass().addClass('kanban-title-button btn btn-flat-secondary btn-sm ms-50');
Waves.init();
Waves.attach("[class*='btn-flat-']");
});
// Makes kanban title editable
$(document).on('mouseenter', '.kanban-title-board', function () {
$(this).attr('contenteditable', 'true');
});
// Appends delete icon with title
$.each($('.kanban-board-header'), function () {
$(this).append(renderBoardDropdown());
});
// Deletes Board
$(document).on('click', '.delete-board', function () {
var id = $(this).closest('.kanban-board').data('id');
kanban.removeBoard(id);
});
// Delete task
$(document).on('click', '.dropdown-item.delete-task', function () {
openSidebar = true;
var id = $(this).closest('.kanban-item').data('eid');
kanban.removeElement(id);
});
// Open/Cancel add new input
$('.add-new-btn, .cancel-add-new').on('click', function () {
addNewInput.toggle();
});
// Add new board
addNewForm.on('submit', function (e) {
e.preventDefault();
var $this = $(this),
value = $this.find('.form-control').val(),
id = value.replace(/\s+/g, '-').toLowerCase();
kanban.addBoards([
{
id: id,
title: value
}
]);
// Adds delete board option to new board & updates data-order
$('.kanban-board:last-child').find('.kanban-board-header').append(renderBoardDropdown());
// Remove current append new add new form
addNewInput.val('').css('display', 'none');
$('.kanban-container').append(addNewForm);
// Update class & init waves
$.each($('.kanban-title-button'), function () {
$(this).removeClass().addClass('kanban-title-button btn btn-flat-secondary btn-sm ms-50');
Waves.init();
Waves.attach("[class*='btn-flat-']");
});
});
// Clear comment editor on close
sidebar.on('hidden.bs.modal', function () {
sidebar.find('.ql-editor')[0].innerHTML = '';
sidebar.find('.nav-link-activity').removeClass('active');
sidebar.find('.tab-pane-activity').removeClass('show active');
sidebar.find('.nav-link-update').addClass('active');
sidebar.find('.tab-pane-update').addClass('show active');
});
// Re-init tooltip when modal opens(Bootstrap bug)
sidebar.on('shown.bs.modal', function () {
$('[data-bs-toggle="tooltip"]').tooltip();
});
$('.update-item-form').on('submit', function (e) {
e.preventDefault();
sidebar.modal('hide');
});
// Render custom items
$.each($('.kanban-item'), function () {
var $this = $(this),
$text = "<span class='kanban-text'>" + $this.text() + '</span>';
if ($this.attr('data-badge') !== undefined && $this.attr('data-badge-text') !== undefined) {
$this.html(renderHeader($this.attr('data-badge'), $this.attr('data-badge-text')) + $text);
}
if (
$this.attr('data-comments') !== undefined ||
$this.attr('data-due-date') !== undefined ||
$this.attr('data-assigned') !== undefined
) {
$this.append(
renderFooter(
$this.attr('data-attachments'),
$this.attr('data-comments'),
$this.attr('data-assigned'),
$this.attr('data-members')
)
);
}
if ($this.attr('data-image') !== undefined) {
$this.html(
renderHeader($this.attr('data-badge'), $this.attr('data-badge-text')) +
"<img class='img-fluid rounded mb-50' src='" +
assetPath +
'images/slider/' +
$this.attr('data-image') +
"' height='32'/>" +
$text +
renderFooter(
$this.attr('data-due-date'),
$this.attr('data-comments'),
$this.attr('data-assigned'),
$this.attr('data-members')
)
);
}
$this.on('mouseenter', function () {
$this.find('.item-dropdown, .item-dropdown .dropdown-menu.show').removeClass('show');
});
});
if (updateItemSidebar.length) {
updateItemSidebar.on('hidden.bs.modal', function () {
updateItemSidebar.find('.file-attachments').val('');
});
}
});