2022-01-29 00:00:11 +03:00
import $ from 'jquery' ;
2024-04-07 19:19:25 +03:00
import { contrastColor } from '../utils/color.js' ;
2023-07-17 21:06:37 +03:00
import { createSortable } from '../modules/sortable.js' ;
2024-03-16 00:23:56 +03:00
import { POST , DELETE , PUT } from '../modules/fetch.js' ;
2024-04-07 19:19:25 +03:00
import tinycolor from 'tinycolor2' ;
2020-08-17 06:07:38 +03:00
2022-03-08 19:42:28 +03:00
function updateIssueCount ( cards ) {
const parent = cards . parentElement ;
2023-08-12 13:30:28 +03:00
const cnt = parent . getElementsByClassName ( 'issue-card' ) . length ;
parent . getElementsByClassName ( 'project-column-issue-count' ) [ 0 ] . textContent = cnt ;
2022-03-08 19:42:28 +03:00
}
2024-03-16 00:23:56 +03:00
async function createNewColumn ( url , columnTitle , projectColorInput ) {
try {
await POST ( url , {
data : {
title : columnTitle . val ( ) ,
color : projectColorInput . val ( ) ,
} ,
} ) ;
} catch ( error ) {
console . error ( error ) ;
} finally {
2023-08-12 13:30:28 +03:00
columnTitle . closest ( 'form' ) . removeClass ( 'dirty' ) ;
2023-06-13 12:57:03 +03:00
window . location . reload ( ) ;
2024-03-16 00:23:56 +03:00
}
2023-06-13 12:57:03 +03:00
}
2024-03-16 00:23:56 +03:00
async function moveIssue ( { item , from , to , oldIndex } ) {
2023-08-12 13:30:28 +03:00
const columnCards = to . getElementsByClassName ( 'issue-card' ) ;
2022-03-08 19:42:28 +03:00
updateIssueCount ( from ) ;
updateIssueCount ( to ) ;
2021-12-08 09:57:18 +03:00
const columnSorting = {
2023-05-18 04:14:31 +03:00
issues : Array . from ( columnCards , ( card , i ) => ( {
2024-03-22 22:56:38 +03:00
issueID : parseInt ( card . getAttribute ( 'data-issue' ) ) ,
2023-06-13 12:57:03 +03:00
sorting : i ,
} ) ) ,
2021-12-08 09:57:18 +03:00
} ;
2024-03-16 00:23:56 +03:00
try {
await POST ( ` ${ to . getAttribute ( 'data-url' ) } /move ` , {
data : columnSorting ,
} ) ;
} catch ( error ) {
console . error ( error ) ;
from . insertBefore ( item , from . children [ oldIndex ] ) ;
}
2021-12-08 09:57:18 +03:00
}
2021-11-09 12:27:25 +03:00
async function initRepoProjectSortable ( ) {
2023-05-09 07:50:16 +03:00
const els = document . querySelectorAll ( '#project-board > .board.sortable' ) ;
2021-11-18 19:45:00 +03:00
if ( ! els . length ) return ;
2023-08-12 13:30:28 +03:00
// the HTML layout is: #project-board > .board > .project-column .cards > .issue-card
2021-11-22 14:40:17 +03:00
const mainBoard = els [ 0 ] ;
2023-08-12 13:30:28 +03:00
let boardColumns = mainBoard . getElementsByClassName ( 'project-column' ) ;
2023-07-17 21:06:37 +03:00
createSortable ( mainBoard , {
2023-08-12 13:30:28 +03:00
group : 'project-column' ,
draggable : '.project-column' ,
2024-03-28 02:20:38 +03:00
handle : '.project-column-header' ,
2022-12-21 07:56:58 +03:00
delayOnTouchOnly : true ,
delay : 500 ,
2024-03-16 00:23:56 +03:00
onSort : async ( ) => {
2023-08-12 13:30:28 +03:00
boardColumns = mainBoard . getElementsByClassName ( 'project-column' ) ;
2021-11-22 14:40:17 +03:00
for ( let i = 0 ; i < boardColumns . length ; i ++ ) {
const column = boardColumns [ i ] ;
2024-04-07 19:19:25 +03:00
if ( parseInt ( column . getAttribute ( 'data-sorting' ) ) !== i ) {
2024-03-16 00:23:56 +03:00
try {
2024-04-07 19:19:25 +03:00
const bgColor = column . style . backgroundColor ; // will be rgb() string
const color = bgColor ? tinycolor ( bgColor ) . toHexString ( ) : '' ;
await PUT ( column . getAttribute ( 'data-url' ) , { data : { sorting : i , color } } ) ;
2024-03-16 00:23:56 +03:00
} catch ( error ) {
console . error ( error ) ;
}
2021-11-22 11:19:01 +03:00
}
}
} ,
} ) ;
2021-11-22 14:40:17 +03:00
for ( const boardColumn of boardColumns ) {
2023-08-12 13:30:28 +03:00
const boardCardList = boardColumn . getElementsByClassName ( 'cards' ) [ 0 ] ;
2023-07-17 21:06:37 +03:00
createSortable ( boardCardList , {
2021-11-22 11:19:01 +03:00
group : 'shared' ,
2021-12-08 09:57:18 +03:00
onAdd : moveIssue ,
onUpdate : moveIssue ,
2022-12-21 07:56:58 +03:00
delayOnTouchOnly : true ,
delay : 500 ,
2021-11-22 11:19:01 +03:00
} ) ;
2020-08-17 06:07:38 +03:00
}
2021-11-09 12:27:25 +03:00
}
2022-12-23 19:03:11 +03:00
export function initRepoProject ( ) {
2024-03-30 20:36:28 +03:00
if ( ! document . querySelector ( '.repository.projects' ) ) {
2021-11-09 12:27:25 +03:00
return ;
}
2021-11-12 15:37:45 +03:00
const _promise = initRepoProjectSortable ( ) ;
2020-08-17 06:07:38 +03:00
2024-03-30 20:36:28 +03:00
for ( const modal of document . getElementsByClassName ( 'edit-project-column-modal' ) ) {
const projectHeader = modal . closest ( '.project-column-header' ) ;
2024-04-07 19:19:25 +03:00
const projectTitleLabel = projectHeader ? . querySelector ( '.project-column-title-label' ) ;
2024-03-30 20:36:28 +03:00
const projectTitleInput = modal . querySelector ( '.project-column-title-input' ) ;
const projectColorInput = modal . querySelector ( '#new_project_column_color' ) ;
const boardColumn = modal . closest ( '.project-column' ) ;
modal . querySelector ( '.edit-project-column-button' ) ? . addEventListener ( 'click' , async function ( e ) {
2023-03-12 14:09:20 +03:00
e . preventDefault ( ) ;
2024-03-16 00:23:56 +03:00
try {
2024-03-30 20:36:28 +03:00
await PUT ( this . getAttribute ( 'data-url' ) , {
2024-03-16 00:23:56 +03:00
data : {
2024-03-30 20:36:28 +03:00
title : projectTitleInput ? . value ,
color : projectColorInput ? . value ,
2024-03-16 00:23:56 +03:00
} ,
} ) ;
} catch ( error ) {
console . error ( error ) ;
} finally {
2024-03-30 20:36:28 +03:00
projectTitleLabel . textContent = projectTitleInput ? . value ;
projectTitleInput . closest ( 'form' ) ? . classList . remove ( 'dirty' ) ;
2024-04-07 19:19:25 +03:00
const dividers = boardColumn . querySelectorAll ( ':scope > .divider' ) ;
if ( projectColorInput . value ) {
const color = contrastColor ( projectColorInput . value ) ;
boardColumn . style . setProperty ( 'background' , projectColorInput . value , 'important' ) ;
boardColumn . style . setProperty ( 'color' , color , 'important' ) ;
for ( const divider of dividers ) {
divider . style . setProperty ( 'color' , color ) ;
}
} else {
boardColumn . style . removeProperty ( 'background' ) ;
boardColumn . style . removeProperty ( 'color' ) ;
for ( const divider of dividers ) {
divider . style . removeProperty ( 'color' ) ;
}
2023-03-12 14:09:20 +03:00
}
$ ( '.ui.modal' ) . modal ( 'hide' ) ;
2024-03-16 00:23:56 +03:00
}
2023-03-12 14:09:20 +03:00
} ) ;
2024-03-30 20:36:28 +03:00
}
2020-08-17 06:07:38 +03:00
2023-08-12 13:30:28 +03:00
$ ( '.default-project-column-modal' ) . each ( function ( ) {
2024-03-16 15:22:16 +03:00
const $boardColumn = $ ( this ) . closest ( '.project-column' ) ;
const $showButton = $ ( $boardColumn ) . find ( '.default-project-column-show' ) ;
const $commitButton = $ ( this ) . find ( '.actions > .ok.button' ) ;
2021-01-15 23:29:32 +03:00
2024-03-16 15:22:16 +03:00
$ ( $commitButton ) . on ( 'click' , async ( e ) => {
2023-04-19 17:28:28 +03:00
e . preventDefault ( ) ;
2024-03-16 00:23:56 +03:00
try {
2024-03-16 15:22:16 +03:00
await POST ( $ ( $showButton ) . data ( 'url' ) ) ;
2024-03-16 00:23:56 +03:00
} catch ( error ) {
console . error ( error ) ;
} finally {
2023-04-19 17:28:28 +03:00
window . location . reload ( ) ;
2024-03-16 00:23:56 +03:00
}
2023-04-19 17:28:28 +03:00
} ) ;
2021-01-15 23:29:32 +03:00
} ) ;
2021-02-11 19:32:27 +03:00
2023-08-12 13:30:28 +03:00
$ ( '.show-delete-project-column-modal' ) . each ( function ( ) {
2024-03-22 22:56:38 +03:00
const $deleteColumnModal = $ ( ` ${ this . getAttribute ( 'data-modal' ) } ` ) ;
2024-03-16 15:22:16 +03:00
const $deleteColumnButton = $deleteColumnModal . find ( '.actions > .ok.button' ) ;
2024-03-22 22:56:38 +03:00
const deleteUrl = this . getAttribute ( 'data-url' ) ;
2023-04-23 12:24:19 +03:00
2024-03-16 15:22:16 +03:00
$deleteColumnButton . on ( 'click' , async ( e ) => {
2020-08-17 06:07:38 +03:00
e . preventDefault ( ) ;
2024-03-16 00:23:56 +03:00
try {
await DELETE ( deleteUrl ) ;
} catch ( error ) {
console . error ( error ) ;
} finally {
2021-01-15 23:29:32 +03:00
window . location . reload ( ) ;
2024-03-16 00:23:56 +03:00
}
2020-08-17 06:07:38 +03:00
} ) ;
} ) ;
2023-08-12 13:30:28 +03:00
$ ( '#new_project_column_submit' ) . on ( 'click' , ( e ) => {
2020-08-17 06:07:38 +03:00
e . preventDefault ( ) ;
2024-03-16 15:22:16 +03:00
const $columnTitle = $ ( '#new_project_column' ) ;
const $projectColorInput = $ ( '#new_project_column_color_picker' ) ;
if ( ! $columnTitle . val ( ) ) {
2023-06-13 12:57:03 +03:00
return ;
}
2024-03-16 00:23:56 +03:00
const url = e . target . getAttribute ( 'data-url' ) ;
2024-03-16 15:22:16 +03:00
createNewColumn ( url , $columnTitle , $projectColorInput ) ;
2023-06-13 12:57:03 +03:00
} ) ;
2020-08-17 06:07:38 +03:00
}