xref: /plugin/kanban/syntax.php (revision f4b18c92ed322afef4847ac5c154503a8bb2d449)
1<?php
2if(!defined('DOKU_INC')) die();
3
4class syntax_plugin_kanban extends DokuWiki_Syntax_Plugin {
5    public function getType() { return 'substition'; }
6    public function getSort() { return 150; }
7    public function connectTo($mode) {
8        $this->Lexer->addSpecialPattern('\{\{kanban>.*?\}\}', $mode, 'plugin_kanban');
9    }
10
11    public function handle($match, $state, $pos, Doku_Handler $handler) {
12		return [substr($match, 9, -2)];
13
14    }
15
16    public function render($mode, Doku_Renderer $renderer, $data) {
17        if ($mode != 'xhtml') return false;
18        global $conf;
19		//$mydata = str_split("||",$data);
20		list($boardName) = $data;
21		//echo $boardName;//debugging line
22        //list($boardName) = $mydata[0];
23		//list($boardList) = $mydata[1];
24		list($var1, $var2) = explode("+", $boardName); //added - 5-8-2026
25		//Change the variable back to boardName
26		$boardName = $var1;//added - 5-8-2026
27        // Path to individual card files: data/kanban/[boardName]/*.json
28        // $kanbanDir = $conf['savedir'] . '/kanban/' . $boardName . '/'; //WORKS!!
29		$kanbanDir = $conf['savedir'] . '/kanban/' . $boardName . '/'; //added - 5-8-2026
30
31        // Dynamically create the directory if it doesn't exist
32        if (!is_dir($kanbanDir)) io_makeFileDir($kanbanDir . 'placeholder.txt');
33
34        $renderer->doc .= '<div class="kanban-board" data-board="' . hsc($boardName) . '">';
35        // $columns = ['Projects', 'WIP', 'On Hold', 'Done']; // WORKS!!
36		// echo $var2;
37		$headers = explode(",",$var2); //added - 5-8-2026
38		$outpea = [];//added - 5-8-2026
39		$thankee = count($headers);//added - 5-8-2026
40		for($x=0;$x<$thankee;$x++){//added - 5-8-2026
41			if($headers[$x] && $headers[$x] != "" && !is_null($headers[$x])){//added - 5-8-2026
42					$outpea[$x] = $headers[$x];//added - 5-8-2026
43			}else{//added - 5-8-2026
44				continue;//added - 5-8-2026
45			}//added - 5-8-2026
46		}//added - 5-8-2026
47		$columns = $outpea;//added - 5-8-2026
48        $colVal=0;//added - 5-8-2026
49
50        // Load all .json files in the board directory
51        $savedCards = [];
52        foreach (glob($kanbanDir . "*.json") as $file) {
53            $card = json_decode(io_readFile($file), true);
54            if ($card) $savedCards[] = $card;
55        }
56
57        foreach ($columns as $col) {
58
59            $id = strtolower(str_replace(' ', '-', $col));
60            $renderer->doc .= '<div class="kanban-col" data-id="' . $id . '">';
61            $renderer->doc .= '  <h3>' . hsc($col) . '</h3>';
62            $renderer->doc .= '  <div class="cards-container"><div class="kanban-card-locked" data-id=0"><div class="triple-lines"></div></div>';
63
64            foreach ($savedCards as $card) {
65                if ($card['column'] === $id) {
66                    $renderer->doc .= $this->_renderCardHtml($card);
67                }
68            }
69			if($colVal!==0){//added - 5-8-2026
70				$renderer->doc .= '  </div></div>';//added - 5-8-2026
71			}else{//added - 5-8-2026
72				$renderer->doc .= '  </div><button class="add-card-btn">+ Add Card</button></div>';
73				//$renderer->doc .= '  </div><button class="add-col-btn">+ Add Column</button> <button class="add-card-btn">+ Add Card</button></div>';//added - 5-8-2026
74			}//added - 5-8-2026
75			$colVal = ($colVal + 1);//added - 5-8-2026
76        }
77        $renderer->doc .= '<div>My name goes here</div></div>';
78
79        return true;
80    }
81
82    private function _renderCardHtml($card) {
83		$currNote = hsc($card['note']);
84        $imp = hsc($card['importance'] ?? 'medium');
85		if(hsc($card['checked']) !== "true"){
86			$dat = "";
87		}else{
88			$dat = "checked";
89		}
90		$fullNotes = '';
91		$notes=hsc($card['note']);
92		$notif = explode("+",$notes);
93		array_map('trim', $notif);
94		foreach($notif as $note){
95			if($note == ""){
96				continue;
97			}else{
98			$fullNotes = $fullNotes . "+ " . $note . "<br>";
99			}
100		}
101
102		//return the card data only if the card has not been checked complete
103		if($dat != "checked"){
104        return '<div class="kanban-card '.$imp.'" data-id="'.hsc($card['id']).'">'
105		     . '<input type="checkbox" ' . $dat . '>'
106             . '<strong class="card-title">'.hsc($card['name']).'</strong><div id="noteDiv" class="noteDiv">Content</div>'
107             . '<div class="card-desc">'.hsc($card['desc'] ?? '').'</div>'
108             . '<input class="btn-notes" value="+Add Note">'
109			 . '<div class="card-note">' . $fullNotes . '</div></div>';
110		}
111    }
112}
113