2021-03-22 05:04:19 +01:00
const { csrf , PageIsProjects } = window . config ;
2020-08-17 04:07:38 +01:00
export default async function initProject ( ) {
2021-03-22 05:04:19 +01:00
if ( ! PageIsProjects ) {
2020-08-17 04:07:38 +01:00
return ;
}
const { Sortable } = await import ( /* webpackChunkName: "sortable" */ 'sortablejs' ) ;
const boardColumns = document . getElementsByClassName ( 'board-column' ) ;
2021-02-11 17:32:27 +01:00
new Sortable (
document . getElementsByClassName ( 'board' ) [ 0 ] ,
{
group : 'board-column' ,
draggable : '.board-column' ,
animation : 150 ,
2021-04-20 06:13:03 +02:00
ghostClass : 'card-ghost' ,
2021-02-11 17:32:27 +01:00
onSort : ( ) => {
const board = document . getElementsByClassName ( 'board' ) [ 0 ] ;
const boardColumns = board . getElementsByClassName ( 'board-column' ) ;
boardColumns . forEach ( ( column , i ) => {
if ( parseInt ( $ ( column ) . data ( 'sorting' ) ) !== i ) {
$ . ajax ( {
url : $ ( column ) . data ( 'url' ) ,
2021-09-29 22:53:12 +02:00
data : JSON . stringify ( { sorting : i , color : rgbToHex ( $ ( column ) . css ( 'backgroundColor' ) ) } ) ,
2021-02-11 17:32:27 +01:00
headers : {
'X-Csrf-Token' : csrf ,
'X-Remote' : true ,
} ,
contentType : 'application/json' ,
method : 'PUT' ,
} ) ;
}
} ) ;
} ,
} ,
) ;
2020-08-17 04:07:38 +01:00
for ( const column of boardColumns ) {
new Sortable (
column . getElementsByClassName ( 'board' ) [ 0 ] ,
{
group : 'shared' ,
animation : 150 ,
2021-04-20 06:13:03 +02:00
ghostClass : 'card-ghost' ,
2020-08-17 04:07:38 +01:00
onAdd : ( e ) => {
$ . ajax ( ` ${ e . to . dataset . url } / ${ e . item . dataset . issue } ` , {
headers : {
'X-Csrf-Token' : csrf ,
'X-Remote' : true ,
} ,
contentType : 'application/json' ,
type : 'POST' ,
error : ( ) => {
e . from . insertBefore ( e . item , e . from . children [ e . oldIndex ] ) ;
} ,
} ) ;
} ,
2021-01-15 21:29:32 +01:00
} ,
2020-08-17 04:07:38 +01:00
) ;
}
$ ( '.edit-project-board' ) . each ( function ( ) {
2021-09-29 22:53:12 +02:00
const projectHeader = $ ( this ) . closest ( '.board-column-header' ) ;
const projectTitleLabel = projectHeader . find ( '.board-label' ) ;
2020-08-17 04:07:38 +01:00
const projectTitleInput = $ ( this ) . find (
2021-01-15 21:29:32 +01:00
'.content > .form > .field > .project-board-title' ,
2020-08-17 04:07:38 +01:00
) ;
2021-09-29 22:53:12 +02:00
const projectColorInput = $ ( this ) . find ( '.content > .form > .field #new_board_color' ) ;
const boardColumn = $ ( this ) . closest ( '.board-column' ) ;
if ( boardColumn . css ( 'backgroundColor' ) ) {
setLabelColor ( projectHeader , rgbToHex ( boardColumn . css ( 'backgroundColor' ) ) ) ;
}
2020-08-17 04:07:38 +01:00
$ ( this )
. find ( '.content > .form > .actions > .red' )
. on ( 'click' , function ( e ) {
e . preventDefault ( ) ;
$ . ajax ( {
url : $ ( this ) . data ( 'url' ) ,
2021-09-29 22:53:12 +02:00
data : JSON . stringify ( { title : projectTitleInput . val ( ) , color : projectColorInput . val ( ) } ) ,
2020-08-17 04:07:38 +01:00
headers : {
'X-Csrf-Token' : csrf ,
'X-Remote' : true ,
} ,
contentType : 'application/json' ,
method : 'PUT' ,
} ) . done ( ( ) => {
projectTitleLabel . text ( projectTitleInput . val ( ) ) ;
projectTitleInput . closest ( 'form' ) . removeClass ( 'dirty' ) ;
2021-09-29 22:53:12 +02:00
if ( projectColorInput . val ( ) ) {
setLabelColor ( projectHeader , projectColorInput . val ( ) ) ;
}
boardColumn . attr ( 'style' , ` background: ${ projectColorInput . val ( ) } !important ` ) ;
2020-08-17 04:07:38 +01:00
$ ( '.ui.modal' ) . modal ( 'hide' ) ;
} ) ;
} ) ;
} ) ;
2021-01-15 21:29:32 +01:00
$ ( document ) . on ( 'click' , '.set-default-project-board' , async function ( e ) {
e . preventDefault ( ) ;
await $ . ajax ( {
method : 'POST' ,
url : $ ( this ) . data ( 'url' ) ,
headers : {
'X-Csrf-Token' : csrf ,
'X-Remote' : true ,
} ,
contentType : 'application/json' ,
} ) ;
window . location . reload ( ) ;
} ) ;
2021-02-11 17:32:27 +01:00
2020-08-17 04:07:38 +01:00
$ ( '.delete-project-board' ) . each ( function ( ) {
$ ( this ) . click ( function ( e ) {
e . preventDefault ( ) ;
$ . ajax ( {
url : $ ( this ) . data ( 'url' ) ,
headers : {
'X-Csrf-Token' : csrf ,
'X-Remote' : true ,
} ,
contentType : 'application/json' ,
method : 'DELETE' ,
} ) . done ( ( ) => {
2021-01-15 21:29:32 +01:00
window . location . reload ( ) ;
2020-08-17 04:07:38 +01:00
} ) ;
} ) ;
} ) ;
$ ( '#new_board_submit' ) . click ( function ( e ) {
e . preventDefault ( ) ;
const boardTitle = $ ( '#new_board' ) ;
2021-09-29 22:53:12 +02:00
const projectColorInput = $ ( '#new_board_color_picker' ) ;
2020-08-17 04:07:38 +01:00
$ . ajax ( {
url : $ ( this ) . data ( 'url' ) ,
2021-09-29 22:53:12 +02:00
data : JSON . stringify ( { title : boardTitle . val ( ) , color : projectColorInput . val ( ) } ) ,
2020-08-17 04:07:38 +01:00
headers : {
'X-Csrf-Token' : csrf ,
'X-Remote' : true ,
} ,
contentType : 'application/json' ,
method : 'POST' ,
} ) . done ( ( ) => {
boardTitle . closest ( 'form' ) . removeClass ( 'dirty' ) ;
2021-01-15 21:29:32 +01:00
window . location . reload ( ) ;
2020-08-17 04:07:38 +01:00
} ) ;
} ) ;
}
2021-09-29 22:53:12 +02:00
function setLabelColor ( label , color ) {
const red = getRelativeColor ( parseInt ( color . substr ( 1 , 2 ) , 16 ) ) ;
const green = getRelativeColor ( parseInt ( color . substr ( 3 , 2 ) , 16 ) ) ;
const blue = getRelativeColor ( parseInt ( color . substr ( 5 , 2 ) , 16 ) ) ;
const luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue ;
if ( luminance > 0.179 ) {
label . removeClass ( 'light-label' ) . addClass ( 'dark-label' ) ;
} else {
label . removeClass ( 'dark-label' ) . addClass ( 'light-label' ) ;
}
}
/ * *
* Inspired by W3C recommandation https : //www.w3.org/TR/WCAG20/#relativeluminancedef
* /
function getRelativeColor ( color ) {
color /= 255 ;
return color <= 0.03928 ? color / 12.92 : ( ( color + 0.055 ) / 1.055 ) * * 2.4 ;
}
function rgbToHex ( rgb ) {
rgb = rgb . match ( /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/ ) ;
return ` # ${ hex ( rgb [ 1 ] ) } ${ hex ( rgb [ 2 ] ) } ${ hex ( rgb [ 3 ] ) } ` ;
}
function hex ( x ) {
const hexDigits = [ '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' ] ;
return Number . isNaN ( x ) ? '00' : hexDigits [ ( x - x % 16 ) / 16 ] + hexDigits [ x % 16 ] ;
}