Compare commits
No commits in common. "2a3465fff803fcf105405fcb0fbf9770b7072995" and "8d0b903d34e4365755b8ea7b08fc8f7ea81c1d20" have entirely different histories.
2a3465fff8
...
8d0b903d34
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,8 +1,7 @@
|
|||||||
composer.lock
|
composer.lock
|
||||||
lib/
|
lib/
|
||||||
downloads/
|
downloads/
|
||||||
|
app/.env.cfg
|
||||||
public/tmp/
|
public/tmp/
|
||||||
storage/
|
storage/
|
||||||
public/test.php
|
public/test.php
|
||||||
app/config/.env.cfg
|
|
||||||
app/.env.cfg
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
[routes]
|
|
||||||
|
|
||||||
; home
|
|
||||||
GET /=HomeController->display
|
|
||||||
|
|
||||||
; auth
|
|
||||||
GET /login=AuthController->showLoginForm
|
|
||||||
POST /login=AuthController->login
|
|
||||||
GET /logout=AuthController->logout
|
|
||||||
|
|
||||||
; tickets - CRUD (CREATE, READ, UPDATE, DELETE)
|
|
||||||
GET /tickets=TicketController->index
|
|
||||||
GET /ticket/@id=TicketController->view
|
|
||||||
GET /ticket/create=TicketController->createForm
|
|
||||||
POST /ticket/create=TicketController->create
|
|
||||||
GET /ticket/@id/edit=TicketController->editForm
|
|
||||||
POST /ticket/@id/update=TicketController->update
|
|
||||||
GET /ticket/@id/delete=TicketController->delete
|
|
||||||
; additional routes - comments
|
|
||||||
POST /ticket/@id/comment=CommentController->create
|
|
||||||
GET /ticket/@id/comment/@comment_id/delete=CommentController->delete
|
|
||||||
GET /ticket/@id/comments=CommentController->index
|
|
||||||
; route for linking a child to a parent
|
|
||||||
POST /ticket/@id/add-subtask=TicketController->addSubtask
|
|
||||||
|
|
||||||
; attachments
|
|
||||||
GET /ticket/@id/attachments=AttachmentController->index
|
|
||||||
POST /ticket/@id/attachments/upload=AttachmentController->upload
|
|
||||||
GET /attachment/@id/download=AttachmentController->download
|
|
||||||
GET /attachment/@id/delete=AttachmentController->delete
|
|
||||||
|
|
||||||
; knowledgebase
|
|
||||||
GET /kb=KBController->index
|
|
||||||
GET /kb/@id=KBController->view
|
|
||||||
GET /kb/create=KBController->createForm
|
|
||||||
POST /kb/create=KBController->create
|
|
||||||
GET /kb/@id/edit=KBController->editForm
|
|
||||||
POST /kb/@id/update=KBController->update
|
|
||||||
|
|
||||||
; tags
|
|
||||||
GET /tags=TagController->index
|
|
||||||
GET /tag/create=TagController->createForm
|
|
||||||
POST /tag/create=TagController->create
|
|
||||||
|
|
||||||
; parsedown preview
|
|
||||||
POST /parsedown/preview=ParsedownPreview->view
|
|
||||||
|
|
||||||
; dashboard
|
|
||||||
GET /dashboard=DashboardController->index
|
|
||||||
|
|
||||||
; projects
|
|
||||||
GET /projects=ProjectController->index
|
|
||||||
GET /project/@id=ProjectController->view
|
|
||||||
GET /project/create=ProjectController->createForm
|
|
||||||
POST /project/create=ProjectController->create
|
|
||||||
GET /project/@id/edit=ProjectController->editForm
|
|
||||||
POST /project/@id/update=ProjectController->update
|
|
||||||
|
|
||||||
; additional routes - user
|
|
||||||
GET /users=UserController->index
|
|
||||||
GET /user/@id/edit=UserController->editForm
|
|
||||||
POST /user/@id/update=UserController->update
|
|
||||||
@ -149,21 +149,4 @@ class TicketController extends BaseController implements CRUD {
|
|||||||
$this->f3->reroute('/ticket/' . $parent_id);
|
$this->f3->reroute('/ticket/' . $parent_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete(): void
|
|
||||||
{
|
|
||||||
$this->requireLogin();
|
|
||||||
|
|
||||||
$ticket_id = (int)$this->f3->get('PARAMS.id');
|
|
||||||
$ticket_mapper = new Ticket($this->getDB());
|
|
||||||
$ticket = $ticket_mapper->findById($ticket_id);
|
|
||||||
|
|
||||||
if(!$ticket){
|
|
||||||
$this->f3->set('SESSION.error', 'Ticket not found');
|
|
||||||
$this->f3->reroute('/tickets');
|
|
||||||
}
|
|
||||||
|
|
||||||
$ticket->softDelete();
|
|
||||||
$this->f3->reroute('/tickets');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -67,17 +67,6 @@ class BulmaFormHelper extends \Prefab {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static function build_h_field_select($label, $name, $options, $selected){
|
static function build_h_field_select($label, $name, $options, $selected){
|
||||||
$opts = json_decode(str_replace("'", '"', $options));
|
|
||||||
$opts_string = "";
|
|
||||||
foreach($opts as $k => $v){
|
|
||||||
if($v == $selected){
|
|
||||||
$selected_str = " selected";
|
|
||||||
} else {
|
|
||||||
$selected_str = "";
|
|
||||||
}
|
|
||||||
$opts_string .= '<option'.$selected_str.'>'.$v.'</option>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$string =
|
$string =
|
||||||
'<div class="field is-horizontal">
|
'<div class="field is-horizontal">
|
||||||
<div class="field-label is-normal">
|
<div class="field-label is-normal">
|
||||||
@ -86,9 +75,7 @@ class BulmaFormHelper extends \Prefab {
|
|||||||
<div class="field-body">
|
<div class="field-body">
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<div class="select">
|
<div class="select">
|
||||||
<select id="'.$name.'" name="'.$name.'">
|
$options
|
||||||
'.$opts_string.'
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
83
app/model/BulmaForm.php
Normal file
83
app/model/BulmaForm.php
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// this isn't the way to do it, but nevermind!
|
||||||
|
|
||||||
|
class BulmaForm {
|
||||||
|
|
||||||
|
public static function horizontal_field_input($label = "%label%", $name = "%name%", $value=""){
|
||||||
|
$string = '
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label">%label%</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field">
|
||||||
|
<div class="control">
|
||||||
|
<input class="input" type="text" name="%name%" value="%value%">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
';
|
||||||
|
|
||||||
|
$string = str_replace('%label%', $label, $string);
|
||||||
|
$string = str_replace('%name%', $name, $string);
|
||||||
|
$string = str_replace('%value%', $value, $string);
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function horizontal_field_textarea($label = "%label%", $name = "%name%", $value=""){
|
||||||
|
$string = '
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label">%label%</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field">
|
||||||
|
<div class="control">
|
||||||
|
<textarea class="textarea" type="text" name="%name%">%value%</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
';
|
||||||
|
|
||||||
|
$string = str_replace('%label%', $label, $string);
|
||||||
|
$string = str_replace('%name%', $name, $string);
|
||||||
|
$string = str_replace('%value%', $value, $string);
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function horizontal_field_select($label="%label%", $name="%name%", $options=[], $selected=0){
|
||||||
|
$string = '
|
||||||
|
<div class="field is-horizontal">
|
||||||
|
<div class="field-label is-normal">
|
||||||
|
<label class="label">%label%</label>
|
||||||
|
</div>
|
||||||
|
<div class="field-body">
|
||||||
|
<div class="field">
|
||||||
|
<div class="select">
|
||||||
|
<select name="%name%">
|
||||||
|
%options%
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
';
|
||||||
|
|
||||||
|
$string = str_replace('%label%', $label, $string);
|
||||||
|
$string = str_replace('%name%', $name, $string);
|
||||||
|
$opts_str = ''; $i=0;
|
||||||
|
foreach($options as $v){
|
||||||
|
$opts_str .= '<option'.($i==$selected ? ' selected="selected" ' : '').'>'.$v.'</option>';
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
$string = str_replace('%options%', $opts_str, $string);
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -11,10 +11,7 @@ class Ticket extends \DB\SQL\Mapper {
|
|||||||
public function findAll(): array
|
public function findAll(): array
|
||||||
{
|
{
|
||||||
return $this->db->exec(
|
return $this->db->exec(
|
||||||
'SELECT *
|
'SELECT * FROM tickets ORDER BY created_at DESC'
|
||||||
FROM tickets
|
|
||||||
WHERE recycled = 0
|
|
||||||
ORDER BY created_at DESC'
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,11 +48,6 @@ class Ticket extends \DB\SQL\Mapper {
|
|||||||
$this->save();
|
$this->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function softDelete():void {
|
|
||||||
$this->recycled = 1;
|
|
||||||
$this->save();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function attachments(){
|
public function attachments(){
|
||||||
$attachment = new Attachment($this->db);
|
$attachment = new Attachment($this->db);
|
||||||
return $attachment->findWithUserByTicketId($this->id);
|
return $attachment->findWithUserByTicketId($this->id);
|
||||||
|
|||||||
@ -11,7 +11,7 @@ $htmlpurifier = \HTMLPurifier::instance();
|
|||||||
$md = \Parsedown::instance();
|
$md = \Parsedown::instance();
|
||||||
$md->setSafeMode(true);
|
$md->setSafeMode(true);
|
||||||
|
|
||||||
$f3->config('../app/config/.env.cfg');
|
$f3->config('../app/.env.cfg');
|
||||||
$f3->set('DEBUG', 3); // development debug
|
$f3->set('DEBUG', 3); // development debug
|
||||||
$f3->set('CACHE', FALSE);
|
$f3->set('CACHE', FALSE);
|
||||||
|
|
||||||
@ -26,4 +26,76 @@ $f3->set('DB', new \DB\SQL(
|
|||||||
new \DB\SQL\Session($f3->get('DB'));
|
new \DB\SQL\Session($f3->get('DB'));
|
||||||
$f3->set('SESSION.status', 'running');
|
$f3->set('SESSION.status', 'running');
|
||||||
|
|
||||||
|
// Routing and Controller Setup
|
||||||
|
|
||||||
|
// home
|
||||||
|
$f3->route('GET /', 'HomeController->display');
|
||||||
|
|
||||||
|
// auth
|
||||||
|
$f3->route('GET /login', 'AuthController->showLoginForm');
|
||||||
|
$f3->route('POST /login', 'AuthController->login');
|
||||||
|
$f3->route('GET /logout', 'AuthController->logout');
|
||||||
|
|
||||||
|
// Example protected route
|
||||||
|
$f3->route('GET /dashboard', function($f3){
|
||||||
|
if(!$f3->exists('SESSION.user')){
|
||||||
|
$f3->reroute('/login');
|
||||||
|
}
|
||||||
|
echo 'Welcome to the dashboard' . $f3->get('SESSION.username');
|
||||||
|
echo '<a href="/logout">logout</a>';
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// tickets - CRUD (CREATE, READ, UPDATE, DELETE)
|
||||||
|
$f3->route('GET /tickets', 'TicketController->index'); // view all tickets
|
||||||
|
$f3->route('GET /ticket/@id', 'TicketController->view'); // view ticket details
|
||||||
|
$f3->route('GET /ticket/create', 'TicketController->createForm'); // show form to create
|
||||||
|
$f3->route('POST /ticket/create', 'TicketController->create'); // save
|
||||||
|
$f3->route('GET /ticket/@id/edit', 'TicketController->editForm'); // edit ticket
|
||||||
|
$f3->route('POST /ticket/@id/update', 'TicketController->update'); //
|
||||||
|
// additional routes - comments
|
||||||
|
$f3->route('POST /ticket/@id/comment', 'CommentController->create');
|
||||||
|
$f3->route('GET /ticket/@id/comment/@comment_id/delete', 'CommentController->delete');
|
||||||
|
$f3->route('GET /ticket/@id/comments', 'CommentController->index');
|
||||||
|
// route for linking a child to a parent
|
||||||
|
$f3->route('POST /ticket/@id/add-subtask', 'TicketController->addSubtask');
|
||||||
|
|
||||||
|
// attachments
|
||||||
|
$f3->route('GET /ticket/@id/attachments', 'AttachmentController->index');
|
||||||
|
$f3->route('POST /ticket/@id/attachments/upload', 'AttachmentController->upload');
|
||||||
|
$f3->route('GET /attachment/@id/download', 'AttachmentController->download');
|
||||||
|
$f3->route('GET /attachment/@id/delete', 'AttachmentController->delete');
|
||||||
|
|
||||||
|
// knowledgebase
|
||||||
|
$f3->route('GET /kb', 'KBController->index');
|
||||||
|
$f3->route('GET /kb/@id', 'KBController->view');
|
||||||
|
$f3->route('GET /kb/create', 'KBController->createForm');
|
||||||
|
$f3->route('POST /kb/create', 'KBController->create');
|
||||||
|
$f3->route('GET /kb/@id/edit', 'KBController->editForm');
|
||||||
|
$f3->route('POST /kb/@id/update', 'KBController->update'); // should this be update - "crud"?
|
||||||
|
|
||||||
|
// tags
|
||||||
|
$f3->route('GET /tags', 'TagController->index');
|
||||||
|
$f3->route('GET /tag/create', 'TagController->createForm');
|
||||||
|
$f3->route('POST /tag/create', 'TagController->create');
|
||||||
|
|
||||||
|
// parsedown preview
|
||||||
|
$f3->route('POST /parsedown/preview', 'ParsedownPreview->view');
|
||||||
|
|
||||||
|
// dashboard
|
||||||
|
$f3->route('GET /dashboard', 'DashboardController->index');
|
||||||
|
|
||||||
|
// projects
|
||||||
|
$f3->route('GET /projects', 'ProjectController->index');
|
||||||
|
$f3->route('GET /project/@id', 'ProjectController->view');
|
||||||
|
$f3->route('GET /project/create', 'ProjectController->createForm');
|
||||||
|
$f3->route('POST /project/create', 'ProjectController->create');
|
||||||
|
$f3->route('GET /project/@id/edit', 'ProjectController->editForm');
|
||||||
|
$f3->route('POST /project/@id/update', 'ProjectController->update');
|
||||||
|
|
||||||
|
// additional routes - user
|
||||||
|
$f3->route('GET /users', 'UserController->index');
|
||||||
|
$f3->route('GET /user/@id/edit', 'UserController->editForm');
|
||||||
|
$f3->route('POST /user/@id/update', 'UserController->update');
|
||||||
|
|
||||||
$f3->run();
|
$f3->run();
|
||||||
@ -4,7 +4,6 @@ html, body, #sidebar, #page,#base_body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#page { min-height: calc(100vh - 170px - 52px) }
|
#page { min-height: calc(100vh - 170px - 52px) }
|
||||||
i.fa { font-weight: 100 !important ; }
|
|
||||||
|
|
||||||
.table th.th-icon { width: 2rem; }
|
.table th.th-icon { width: 2rem; }
|
||||||
|
|
||||||
|
|||||||
@ -6,9 +6,8 @@
|
|||||||
<bulma type="H_FIELD_INPUT" label="Title:" name="title" value=""></bulma>
|
<bulma type="H_FIELD_INPUT" label="Title:" name="title" value=""></bulma>
|
||||||
<bulma type="H_FIELD_TEXTAREA" label="Description:" name="description" value=""></bulma>
|
<bulma type="H_FIELD_TEXTAREA" label="Description:" name="description" value=""></bulma>
|
||||||
|
|
||||||
|
{{ BulmaForm::horizontal_field_select('Priority:', 'priority', ['Low', 'Medium', 'High'])}}
|
||||||
<bulma type="H_FIELD_SELECT" label="Priority:" name="priority" options="['Low', 'Medium', 'High']" selected="Medium"></bulma>
|
{{ BulmaForm::horizontal_field_select('Status:', 'status', ['New', 'In Progress', 'On Hold', 'Completed'])}}
|
||||||
<bulma type="H_FIELD_SELECT" label="Status:" name="status" options="['New', 'In Progress', 'On Hold', 'Completed']" selected="New"></bulma>
|
|
||||||
|
|
||||||
<!-- custom fields -->
|
<!-- custom fields -->
|
||||||
<hr>
|
<hr>
|
||||||
|
|||||||
@ -5,9 +5,8 @@
|
|||||||
<bulma type="H_FIELD_INPUT" label="Title:" name="title" value="{{@ticket.title}}"></bulma>
|
<bulma type="H_FIELD_INPUT" label="Title:" name="title" value="{{@ticket.title}}"></bulma>
|
||||||
<bulma type="H_FIELD_TEXTAREA" label="Description:" name="description" value="{{@ticket.description}}"></bulma>
|
<bulma type="H_FIELD_TEXTAREA" label="Description:" name="description" value="{{@ticket.description}}"></bulma>
|
||||||
|
|
||||||
|
{{ BulmaForm::horizontal_field_select('Priority:', 'priority', ['Low', 'Medium', 'High'])}}
|
||||||
<bulma type="H_FIELD_SELECT" label="Priority:" name="priority" options="['Low', 'Medium', 'High']" selected="{{@ticket.priority}}"></bulma>
|
{{ BulmaForm::horizontal_field_select('Status:', 'status', ['New', 'In Progress', 'On Hold', 'Completed'])}}
|
||||||
<bulma type="H_FIELD_SELECT" label="Status:" name="status" options="['New', 'In Progress', 'On Hold', 'Completed']" selected="{{@ticket.status}}"></bulma>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="block">
|
<div class="block">
|
||||||
|
|||||||
@ -21,12 +21,7 @@
|
|||||||
<td>{{@ticket.priority}}</td>
|
<td>{{@ticket.priority}}</td>
|
||||||
<td>{{@ticket.created_at}}</td>
|
<td>{{@ticket.created_at}}</td>
|
||||||
<td>
|
<td>
|
||||||
<a class="button is-link is-small" href="/ticket/{{@ticket.id}}/edit">
|
<a href="/ticket/{{@ticket.id}}/edit"><i class="fa fa-edit"></i></a>
|
||||||
<i class="fa fa-edit"></i></a>
|
|
||||||
<a class="button is-danger is-small"
|
|
||||||
href="/ticket/{{@ticket.id}}/delete"
|
|
||||||
onclick="return confirm('Are you sure you want to delete this ticket?');">
|
|
||||||
<i class="fa fa-trash-can"></i></a>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</repeat>
|
</repeat>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user