Compare commits
20 Commits
Author | SHA1 | Date |
---|---|---|
Sven Slootweg | 6f9e4ccc8d | 10 years ago |
Sven Slootweg | 8854947866 | 10 years ago |
Sven Slootweg | 9456a01c34 | 11 years ago |
Sven Slootweg | 724dec5a61 | 11 years ago |
Sven Slootweg | 21da4e580f | 11 years ago |
Sven Slootweg | 3f0728b945 | 11 years ago |
Sven Slootweg | 08b7a7d825 | 11 years ago |
Sven Slootweg | d6588b6f1a | 11 years ago |
Sven Slootweg | 853bb50ab6 | 11 years ago |
Sven Slootweg | 30de910e73 | 11 years ago |
Sven Slootweg | 5bf96a8d02 | 11 years ago |
Sven Slootweg | 73310dbbdc | 11 years ago |
Sven Slootweg | 0fe01a0336 | 11 years ago |
Sven Slootweg | 1bdc620153 | 11 years ago |
Sven Slootweg | 3ac9274b1f | 11 years ago |
Sven Slootweg | a597290a01 | 11 years ago |
Sven Slootweg | c28cecd570 | 11 years ago |
Sven Slootweg | c2e374964a | 11 years ago |
Sven Slootweg | 3dc8c8b08a | 11 years ago |
Sven Slootweg | 48b4b80447 | 11 years ago |
@ -0,0 +1 @@
|
|||||||
|
config.json
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(!isset($_APP)) { die("Unauthorized."); }
|
||||||
|
|
||||||
|
$uSlug = $router->uParameters[1];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$sProject = Project::CreateFromQuery("SELECT * FROM projects WHERE `Slug` = :Slug", array(":Slug" => $uSlug), 0, true);
|
||||||
|
NewTemplater::SetGlobalVariable("project-name", $sProject->sName);
|
||||||
|
NewTemplater::SetGlobalVariable("project-url", "/project/{$sProject->sSlug}");
|
||||||
|
$sRouterAuthenticated = true;
|
||||||
|
}
|
||||||
|
catch (NotFoundException $e)
|
||||||
|
{
|
||||||
|
throw new RouterException("Project does not exist");
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
require("include/base.php");
|
||||||
|
|
||||||
|
$sUser = new User(0);
|
||||||
|
$sUser->uUsername = "test";
|
||||||
|
$sUser->uPassword = "test";
|
||||||
|
$sUser->uDisplayName = "Test user";
|
||||||
|
$sUser->uEmailAddress = "test@test.com";
|
||||||
|
$sUser->uIsActivated = true;
|
||||||
|
$sUser->uIsAdmin = true;
|
||||||
|
$sUser->GenerateSalt();
|
||||||
|
$sUser->GenerateHash();
|
||||||
|
$sUser->InsertIntoDatabase();
|
@ -1,14 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
require("include/base.php");
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
echo(Templater::AdvancedParse("layout", $locale->strings, array(
|
require("rewrite.php");
|
||||||
"project-name" => "Demo project",
|
|
||||||
"long-description" => "A large, multi-paragraph description of the project would go here.",
|
|
||||||
"no-downloads" => false,
|
|
||||||
"stable-version" => "1.5.3",
|
|
||||||
"experimental-version" => "1.6.1",
|
|
||||||
"line-count" => "62,671",
|
|
||||||
"ticket-count" => 12,
|
|
||||||
"tickets" => array(),
|
|
||||||
"more-tickets" => false
|
|
||||||
)));
|
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(!isset($_APP)) { die("Unauthorized."); }
|
||||||
|
|
||||||
|
http_status_code(404);
|
||||||
|
$sPageContents = NewTemplater::Render("error/404", $locale->strings, array());
|
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(!isset($_APP)) { die("Unauthorized."); }
|
||||||
|
|
||||||
|
$sPageContents = "hi";
|
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(!isset($_APP)) { die("Unauthorized."); }
|
||||||
|
|
||||||
|
$sPageTitle = "Overview";
|
||||||
|
$sCurrentPage = "overview";
|
||||||
|
$sPageContents = Templater::AdvancedParse("project/index", $locale->strings, array(
|
||||||
|
"long-description" => $sProject->sLongDescription,
|
||||||
|
"no-downloads" => false,
|
||||||
|
"stable-version" => "1.5.3",
|
||||||
|
"experimental-version" => "1.6.1",
|
||||||
|
"line-count" => "62,671",
|
||||||
|
"ticket-count" => 12,
|
||||||
|
"tickets" => array(),
|
||||||
|
"more-tickets" => false
|
||||||
|
));
|
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(!isset($_APP)) { die("Unauthorized."); }
|
||||||
|
|
||||||
|
$sPageTitle = "Tickets";
|
||||||
|
$sCurrentPage = "tickets";
|
||||||
|
|
||||||
|
$sTickets = array();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$result = Ticket::CreateFromQuery("SELECT * FROM tickets WHERE `ProjectId` = :ProjectId", array(":ProjectId" => $sProject->sId));
|
||||||
|
}
|
||||||
|
catch (NotFoundException $e)
|
||||||
|
{
|
||||||
|
$result = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($result as $sTicket)
|
||||||
|
{
|
||||||
|
$sTickets[] = array(
|
||||||
|
"id" => $sTicket->sId,
|
||||||
|
"title" => $sTicket->sSubject,
|
||||||
|
"priority" => $sTicket->sPriorityName,
|
||||||
|
"priority-lowercase" => strtolower($sTicket->sPriorityName),
|
||||||
|
"status" => $sTicket->sStatusName,
|
||||||
|
"status-lowercase" => strtolower($sTicket->sStatusName)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$sPageContents = NewTemplater::Render("project/tickets/index", $locale->strings, array(
|
||||||
|
"tickets" => $sTickets
|
||||||
|
));
|
@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(!isset($_APP)) { die("Unauthorized."); }
|
||||||
|
|
||||||
|
$sCurrentPage = "tickets";
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$sTicket = new Ticket($router->uParameters[2]);
|
||||||
|
|
||||||
|
$sInitialMessage = TicketMessage::CreateFromQuery("SELECT * FROM ticket_messages WHERE `TicketId` = :TicketId AND `FirstMessage` = 1",
|
||||||
|
array(":TicketId" => $sTicket->sId), 0, true);
|
||||||
|
|
||||||
|
$sUpdates = array();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$result = TicketMessage::CreateFromQuery("SELECT * FROM ticket_messages WHERE `TicketId` = :TicketId AND `FirstMessage` = 0 ORDER BY `Date` ASC",
|
||||||
|
array(":TicketId" => $sTicket->sId), 0);
|
||||||
|
}
|
||||||
|
catch (NotFoundException $e)
|
||||||
|
{
|
||||||
|
$result = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach($result as $sMessage)
|
||||||
|
{
|
||||||
|
if($sMessage->sIsEvent)
|
||||||
|
{
|
||||||
|
$uEventData = json_decode($sMessage->uBody);
|
||||||
|
|
||||||
|
$sUpdates[] = array(
|
||||||
|
"event" => true,
|
||||||
|
"user" => $sMessage->sAuthor->sDisplayName,
|
||||||
|
"component" => $sMessage->sComponent,
|
||||||
|
"operation" => $sMessage->sOperation,
|
||||||
|
"date" => time_ago($sMessage->sDate, $locale)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$sUpdates[] = array(
|
||||||
|
"event" => false,
|
||||||
|
"author" => $sMessage->sAuthor->sDisplayName,
|
||||||
|
"body" => $sMessage->sBody,
|
||||||
|
"date" => time_ago($sMessage->sDate, $locale)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sPageContents = NewTemplater::Render("project/tickets/view", $locale->strings, array(
|
||||||
|
"title" => $sTicket->sSubject,
|
||||||
|
"priority" => $sTicket->sPriorityName,
|
||||||
|
"status" => $sTicket->sStatusName,
|
||||||
|
"owner" => $sTicket->sOwner->sDisplayName,
|
||||||
|
"creator" => $sTicket->sCreator->sDisplayName,
|
||||||
|
"date" => local_from_unix($sTicket->sCreationDate, $locale->datetime_long),
|
||||||
|
"body" => $sInitialMessage->sBody,
|
||||||
|
"updates" => $sUpdates
|
||||||
|
));
|
||||||
|
}
|
||||||
|
catch (NotFoundException $e)
|
||||||
|
{
|
||||||
|
pretty_dump($e);
|
||||||
|
require("modules/error/404.php");
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require("include/base.php");
|
||||||
|
|
||||||
|
$sPageTitle = "";
|
||||||
|
$sPageContents = "";
|
||||||
|
$sCurrentPage = "";
|
||||||
|
|
||||||
|
/* Define the different routes for the application */
|
||||||
|
|
||||||
|
$routes = array(
|
||||||
|
"home" => array(
|
||||||
|
"^/$" => "modules/home/index.php"
|
||||||
|
),
|
||||||
|
"project" => array(
|
||||||
|
"^/project/([a-zA-Z0-9_-]+)$" => "modules/project/index.php",
|
||||||
|
"^/project/([a-zA-Z0-9_-]+)/tickets$" => "modules/project/tickets/index.php",
|
||||||
|
"^/project/([a-zA-Z0-9_-]+)/ticket/([0-9]+)$" => "modules/project/tickets/view.php"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Define the preset values for the route "categories" */
|
||||||
|
|
||||||
|
$presets = array(
|
||||||
|
"home" => array(
|
||||||
|
"_page_type" => "home"
|
||||||
|
),
|
||||||
|
"project" => array(
|
||||||
|
"_page_type" => "project",
|
||||||
|
"authenticator" => "authenticators/project.php",
|
||||||
|
"auth_error" => ""
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Generate a routing table */
|
||||||
|
|
||||||
|
$router = new CPHPRouter();
|
||||||
|
$router->allow_slash = true;
|
||||||
|
$router->ignore_query = true;
|
||||||
|
$router->routes = array(0 => array());
|
||||||
|
|
||||||
|
foreach($routes as $category => $items)
|
||||||
|
{
|
||||||
|
foreach($items as $route => $target)
|
||||||
|
{
|
||||||
|
$router->routes[0][$route] = $presets[$category];
|
||||||
|
$router->routes[0][$route]['target'] = $target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Route the actual request */
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$router->RouteRequest();
|
||||||
|
}
|
||||||
|
catch (RouterException $e)
|
||||||
|
{
|
||||||
|
require("modules/error/404.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Render the resulting page */
|
||||||
|
|
||||||
|
if(empty($router->uVariables['page_type']) || $router->uVariables['page_type'] == "home")
|
||||||
|
{
|
||||||
|
$sContents = NewTemplater::Render("home/layout", $locale->strings, array(
|
||||||
|
"contents" => $sPageContents
|
||||||
|
));
|
||||||
|
}
|
||||||
|
elseif($router->uVariables['page_type'] == "project")
|
||||||
|
{
|
||||||
|
$sContents = NewTemplater::Render("project/layout", $locale->strings, array(
|
||||||
|
"contents" => $sPageContents,
|
||||||
|
"current-page" => $sCurrentPage
|
||||||
|
));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
echo(NewTemplater::Render("layout", $locale->strings, array(
|
||||||
|
"contents" => $sContents
|
||||||
|
)));
|
||||||
|
|
@ -0,0 +1,156 @@
|
|||||||
|
var engine;
|
||||||
|
|
||||||
|
$(function(){
|
||||||
|
engine = new Engine({
|
||||||
|
"enable_sound": false
|
||||||
|
});
|
||||||
|
|
||||||
|
loader = new engine.Preloader();
|
||||||
|
loader.Run({
|
||||||
|
onfinish: InitializeEffect
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function InitializeEffect()
|
||||||
|
{
|
||||||
|
engine.AddItems({
|
||||||
|
objects: {
|
||||||
|
controller: {
|
||||||
|
grid_w: 60,
|
||||||
|
grid_h: 18,
|
||||||
|
tile_w: 16,
|
||||||
|
tile_h: 16,
|
||||||
|
numbers: [],
|
||||||
|
colored: [],
|
||||||
|
OnCreate: function(event){
|
||||||
|
for(var x = 0; x < this.grid_w; x++)
|
||||||
|
{
|
||||||
|
this.numbers[x] = [];
|
||||||
|
this.colored[x] = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.RegenerateNumbers();
|
||||||
|
},
|
||||||
|
OnMouseMove: function(event){
|
||||||
|
this.SetMouse(event.x, event.y);
|
||||||
|
},
|
||||||
|
OnStep: function(event){
|
||||||
|
if(this.scene.step_counter % 15 == 0)
|
||||||
|
{
|
||||||
|
this.RegenerateNumbers();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
OnDraw: function(event){
|
||||||
|
for(var x = 0; x < this.grid_w; x++)
|
||||||
|
{
|
||||||
|
for(var y = 0; y < this.grid_h; y++)
|
||||||
|
{
|
||||||
|
if(this.colored[x][y])
|
||||||
|
{
|
||||||
|
//var text = (this.colored[x][y]) ? "0" : this.numbers[x][y];
|
||||||
|
var text = this.numbers[x][y];
|
||||||
|
|
||||||
|
this.scene.DrawText(text, {
|
||||||
|
x: x * this.tile_w,
|
||||||
|
y: y * this.tile_h,
|
||||||
|
color: (this.colored[x][y]) ? "blue" : "silver"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
RegenerateNumbers: function(){
|
||||||
|
for(var x = 0; x < this.grid_w; x++)
|
||||||
|
{
|
||||||
|
for(var y = 0; y < this.grid_h; y++)
|
||||||
|
{
|
||||||
|
this.numbers[x][y] = engine.Random.Choose(0, 1);
|
||||||
|
this.colored[x][y] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ApplyMouse();
|
||||||
|
},
|
||||||
|
SetMouse: function(x, y){
|
||||||
|
this.mouse_x = x;
|
||||||
|
this.mouse_y = y;
|
||||||
|
this.ApplyMouse();
|
||||||
|
},
|
||||||
|
ApplyMouse: function(){
|
||||||
|
this.ClearColored();
|
||||||
|
|
||||||
|
var matrix_w = 9;
|
||||||
|
var matrix_h = 14;
|
||||||
|
var matrix = [
|
||||||
|
[0, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||||
|
[0, 0, 1, 1, 1, 1, 1, 1, 1],
|
||||||
|
[0, 0, 0, 1, 1, 1, 1, 1, 1],
|
||||||
|
[0, 0, 0, 0, 1, 1, 1, 1, 1],
|
||||||
|
[0, 0, 0, 0, 0, 1, 1, 1, 1],
|
||||||
|
[0, 0, 0, 0, 0, 0, 1, 1, 1],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 1, 1],
|
||||||
|
[0, 0, 0, 0, 0, 0, 0, 0, 1],
|
||||||
|
[0, 0, 0, 0, 0, 1, 1, 1, 1],
|
||||||
|
[0, 0, 1, 0, 0, 1, 1, 1, 1],
|
||||||
|
[0, 1, 1, 1, 0, 0, 1, 1, 1],
|
||||||
|
[1, 1, 1, 1, 0, 0, 1, 1, 1],
|
||||||
|
[1, 1, 1, 1, 1, 0, 0, 1, 1],
|
||||||
|
[1, 1, 1, 1, 1, 0, 0, 1, 1]
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var my = 0; my < matrix_h; my++)
|
||||||
|
{
|
||||||
|
for(var mx = 0; mx < matrix_w; mx++)
|
||||||
|
{
|
||||||
|
if(matrix[my][mx] == 0)
|
||||||
|
{
|
||||||
|
var target_x = Math.round(this.mouse_x / this.tile_w + mx);
|
||||||
|
var target_y = Math.round(this.mouse_y / this.tile_h + my) + 1;
|
||||||
|
|
||||||
|
//console.log(target_x, target_y);
|
||||||
|
|
||||||
|
if(target_x >= 0 && target_x < this.grid_w && target_y >= 0 && target_y < this.grid_h)
|
||||||
|
{
|
||||||
|
this.colored[target_x][target_y] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this.scene)
|
||||||
|
{
|
||||||
|
this.scene.Redraw();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ClearColored: function(){
|
||||||
|
for(var x = 0; x < this.grid_w; x++)
|
||||||
|
{
|
||||||
|
for(var y = 0; y < this.grid_h; y++)
|
||||||
|
{
|
||||||
|
this.colored[x][y] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
scenes: {
|
||||||
|
main: {
|
||||||
|
width: 960,
|
||||||
|
height: 288,
|
||||||
|
fps: 30,
|
||||||
|
OnLoad: function(event){
|
||||||
|
this.Add("controller");
|
||||||
|
},
|
||||||
|
OnMouseMove: function(event){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var canvas = $("#404canvas")[0];
|
||||||
|
engine.GetScene("main").Attach(canvas);
|
||||||
|
|
||||||
|
$("#404canvas").show();
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Cryto Team is more free software. It is licensed under the WTFPL, which
|
||||||
|
* allows you to do pretty much anything with it, without having to
|
||||||
|
* ask permission. Commercial use is allowed, and no attribution is
|
||||||
|
* required. We do politely request that you share your modifications
|
||||||
|
* to benefit other developers, but you are under no enforced
|
||||||
|
* obligation to do so :)
|
||||||
|
*
|
||||||
|
* Please read the accompanying LICENSE document for the full WTFPL
|
||||||
|
* licensing text.
|
||||||
|
*/
|
||||||
|
|
||||||
|
$(function(){
|
||||||
|
$('.clickable').click(function(event)
|
||||||
|
{
|
||||||
|
if($(this).data('url'))
|
||||||
|
{
|
||||||
|
url = $(this).data('url');
|
||||||
|
|
||||||
|
if(event.which == 1)
|
||||||
|
{
|
||||||
|
if($(this).hasClass('external'))
|
||||||
|
{
|
||||||
|
window.open(url);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
window.location = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.stopPropagation();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if(event.which == 2)
|
||||||
|
{
|
||||||
|
window.open(url);
|
||||||
|
event.stopPropagation();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,10 @@
|
|||||||
|
<script src="/static/engine.js"></script>
|
||||||
|
<script src="/static/404.js"></script>
|
||||||
|
|
||||||
|
<div class="section" style="position: relative; height: 288px;">
|
||||||
|
<canvas id="404canvas" style="z-index: 2; position: absolute; top: 0px; left: 0px;"></canvas>
|
||||||
|
<div style="z-index: 1; position: absolute; top: 0px; left: 12px;">
|
||||||
|
<h2>404 Page not found</h2>
|
||||||
|
The requested page could not be found.
|
||||||
|
</div>
|
||||||
|
</div>
|
@ -0,0 +1,13 @@
|
|||||||
|
<div class="header">
|
||||||
|
<h1>Team</h1>
|
||||||
|
<div class="clear"></div>
|
||||||
|
</div>
|
||||||
|
<ul class="menu">
|
||||||
|
<!-- <li class="active"><a href="#">Overview</a></li>
|
||||||
|
<li><a href="#">Account</a></li>
|
||||||
|
<li class="clear"></li> -->
|
||||||
|
</ul>
|
||||||
|
<div class="main">
|
||||||
|
{%?contents}
|
||||||
|
<div class="clear"></div>
|
||||||
|
</div>
|
@ -0,0 +1,51 @@
|
|||||||
|
<aside>
|
||||||
|
<section class="download">
|
||||||
|
<h3>Downloads</h3>
|
||||||
|
{%if isempty|stable-version == false}
|
||||||
|
<a href="{%?project-url}/download/stable" class="download">
|
||||||
|
<b class="stable"></b>
|
||||||
|
<strong>Latest stable</strong>
|
||||||
|
{%?stable-version}
|
||||||
|
</a>
|
||||||
|
{%/if}
|
||||||
|
{%if isempty|experimental-version == false}
|
||||||
|
<a href="{%?project-url}/download/experimental" class="download">
|
||||||
|
<b class="experimental"></b>
|
||||||
|
<strong>Latest testing</strong>
|
||||||
|
{%?experimental-version}
|
||||||
|
</a>
|
||||||
|
{%/if}
|
||||||
|
|
||||||
|
{%if no-downloads == true}
|
||||||
|
There are no downloads for this project yet.
|
||||||
|
{%/if}
|
||||||
|
</section>
|
||||||
|
<section class="statistics">
|
||||||
|
<h3>Statistics</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>{%?line-count}</strong> lines of code</li>
|
||||||
|
<!-- <li><strong>0</strong> commits</li>
|
||||||
|
<li><strong>0</strong> contributors</li> -->
|
||||||
|
<li><strong>{%?ticket-count}</strong> open tickets</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section class="tickets">
|
||||||
|
<h3>Latest tickets</h3>
|
||||||
|
<ul>
|
||||||
|
{%if isempty|tickets == false}
|
||||||
|
{%foreach ticket in tickets}
|
||||||
|
<li><strong>{%?ticket[title]}</strong> {%?ticket[date]}</li>
|
||||||
|
{%/foreach}
|
||||||
|
{%if more-tickets == true}
|
||||||
|
<li class="more"><a href="{%?project-url}/tickets">more...</a></li>
|
||||||
|
{%/if}
|
||||||
|
{%else}
|
||||||
|
No tickets.
|
||||||
|
{%/if}
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</aside>
|
||||||
|
<section class="intro">
|
||||||
|
<h3>Introduction</h3>
|
||||||
|
{%?long-description}
|
||||||
|
</section>
|
@ -0,0 +1,19 @@
|
|||||||
|
<div class="header">
|
||||||
|
<h1>Team</h1>
|
||||||
|
<h2>{%?project-name}</h2>
|
||||||
|
<div class="clear"></div>
|
||||||
|
</div>
|
||||||
|
<ul class="menu">
|
||||||
|
<li {%if current-page == "overview"}class="active"{%/if}><a href="{%?project-url}">Overview</a></li>
|
||||||
|
<li {%if current-page == "downloads"}class="active"{%/if}><a href="{%?project-url}/downloads">Downloads</a></li>
|
||||||
|
<li {%if current-page == "code"}class="active"{%/if}><a href="{%?project-url}/code">Code</a></li>
|
||||||
|
<li {%if current-page == "tickets"}class="active"{%/if}><a href="{%?project-url}/tickets">Tickets</a></li>
|
||||||
|
<li {%if current-page == "forum"}class="active"{%/if}><a href="{%?project-url}/forum">Forum</a></li>
|
||||||
|
<li {%if current-page == "contributors"}class="active"{%/if}><a href="{%?project-url}/contributors">Contributors</a></li>
|
||||||
|
<li {%if current-page == "invitations"}class="active"{%/if}><a href="{%?project-url}/invitations">Invitations</a></li>
|
||||||
|
<li class="clear"></li>
|
||||||
|
</ul>
|
||||||
|
<div class="main">
|
||||||
|
{%?contents}
|
||||||
|
<div class="clear"></div>
|
||||||
|
</div>
|
@ -0,0 +1,18 @@
|
|||||||
|
<section class="tickets">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th class="empty"></th>
|
||||||
|
<th>Title</th>
|
||||||
|
<th>Priority</th>
|
||||||
|
<th>Status</th>
|
||||||
|
</tr>
|
||||||
|
{%foreach ticket in tickets}
|
||||||
|
<tr class="clickable priority-{%?ticket[priority-lowercase]} status-{%?ticket[status-lowercase]}" data-url="{%?project-url}/ticket/{%?ticket[id]}">
|
||||||
|
<td class="id">#{%?ticket[id]}</td>
|
||||||
|
<td class="title"><a href="{%?project-url}/ticket/{%?ticket[id]}">{%?ticket[title]}</a></td>
|
||||||
|
<td class="priority">{%?ticket[priority]}</td>
|
||||||
|
<td class="status">{%?ticket[status]}</td>
|
||||||
|
</tr>
|
||||||
|
{%/foreach}
|
||||||
|
</table>
|
||||||
|
</section>
|
@ -0,0 +1,58 @@
|
|||||||
|
<div class="section ticket-original">
|
||||||
|
<h2>{%?title}</h2>
|
||||||
|
<div class="metadata">
|
||||||
|
<div class="currentdata">
|
||||||
|
<div class="priority">
|
||||||
|
<span class="key">Priority:</span>
|
||||||
|
<span class="value">{%?priority}</span>
|
||||||
|
</div>
|
||||||
|
<div class="status">
|
||||||
|
<span class="key">Status:</span>
|
||||||
|
<span class="value">{%?status}</span>
|
||||||
|
</div>
|
||||||
|
<div class="owner">
|
||||||
|
<span class="key">Owner:</span>
|
||||||
|
<span class="value">{%?owner}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="originaldata">
|
||||||
|
<div class="creator">
|
||||||
|
<span class="key">Creator:</span>
|
||||||
|
<span class="value">{%?creator}</span>
|
||||||
|
</div>
|
||||||
|
<div class="date">
|
||||||
|
<span class="key">Date:</span>
|
||||||
|
<span class="value">{%?date}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="clear"></div>
|
||||||
|
</div>
|
||||||
|
<div class="body">
|
||||||
|
{%?body}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="section ticket-updates">
|
||||||
|
{%foreach update in updates}
|
||||||
|
{%if update[event] == true}
|
||||||
|
<div class="event">
|
||||||
|
{%if update[component] == "owner"}
|
||||||
|
<span class="author">{%?update[user]}</span> changed the owner to <span class="value">{%?update[operation]}</span>.
|
||||||
|
{%elseif update[component] == "status"}
|
||||||
|
<span class="author">{%?update[user]}</span> changed the ticket status to <span class="value">{%?update[operation]}</span>.
|
||||||
|
{%elseif update[component] == "priority"}
|
||||||
|
<span class="author">{%?update[user]}</span> changed the priority to <span class="value">{%?update[operation]}</span>.
|
||||||
|
{%/if}
|
||||||
|
<div class="date">{%?update[date]}</div>
|
||||||
|
</div>
|
||||||
|
{%else}
|
||||||
|
<div class="message">
|
||||||
|
<div class="metadata">
|
||||||
|
<span class="author">{%?update[author]}</span>
|
||||||
|
<span class="date">{%?update[date]}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>{%?update[body]}</p>
|
||||||
|
</div>
|
||||||
|
{%/if}
|
||||||
|
{%/foreach}
|
||||||
|
</div>
|
Loading…
Reference in New Issue