Skip to content
Browse files

Merge branch 'master' of https://github.com/phpfreak/Project-Pier

  • Loading branch information...
2 parents b30a4d2 + d52a871 commit fbd062f4204c97442cf5ed6436cf86b16a49bd1e @MarkMaldaba MarkMaldaba committed Nov 13, 2012
View
22 .gitattributes
@@ -0,0 +1,22 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs diff=csharp
+*.sln merge=union
+*.csproj merge=union
+*.vbproj merge=union
+*.fsproj merge=union
+*.dbproj merge=union
+
+# Standard to msysgit
+*.doc diff=astextplain
+*.DOC diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot diff=astextplain
+*.DOT diff=astextplain
+*.pdf diff=astextplain
+*.PDF diff=astextplain
+*.rtf diff=astextplain
+*.RTF diff=astextplain
View
165 .gitignore
@@ -0,0 +1,165 @@
+
+#################
+## Eclipse
+#################
+
+*.pydevproject
+.project
+.metadata
+bin/**
+tmp/**
+tmp/**/*
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+
+#################
+## Visual Studio
+#################
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+
+# Build results
+**/[Dd]ebug/
+**/[Rr]elease/
+*_i.c
+*_p.c
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.vspscc
+.builds
+**/*.dotCover
+
+## TODO: If you have NuGet Package Restore enabled, uncomment this
+#**/packages/
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+
+# Visual Studio profiler
+*.psess
+*.vsp
+
+# ReSharper is a .NET coding add-in
+_ReSharper*
+
+# Installshield output folder
+[Ee]xpress
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish
+
+# Others
+[Bb]in
+[Oo]bj
+sql
+TestResults
+*.Cache
+ClientBin
+stylecop.*
+~$*
+*.dbmdl
+Generated_Code #added for RIA/Silverlight projects
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+
+
+
+############
+## Windows
+############
+
+# Windows image file caches
+Thumbs.db
+
+# Folder config file
+Desktop.ini
+
+
+#############
+## Python
+#############
+
+*.py[co]
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+
+#Translations
+*.mo
+
+#Mr Developer
+.mr.developer.cfg
+
+# Mac crap
+.DS_Store
View
67 application/controllers/TaskController.class.php
@@ -68,6 +68,10 @@ function download_list() {
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetTitle($task_list_name);
+ $pdf->SetCompression(true);
+ $pdf->SetCreator('ProjectPier');
+ $pdf->SetDisplayMode(fullpage, single);
+ $pdf->SetSubject(active_project()->getObjectName());
$pdf->SetFont('Arial','B',16);
$task_lists = active_project()->getOpenTaskLists();
$pdf->Cell(0,10, lang('project') . ': ' . active_project()->getObjectName(), 'C');
@@ -89,12 +93,14 @@ function download_list() {
$line++;
if ($task->isCompleted()) {
$task_status = lang('completed');
- $task_completion_info = format_date($task->getCompletedOn());
+ $pdf->SetTextColor(100, 200, 100);
+ $task_completion_info = lang('completed task') . ' : ' . format_date($task->getCompletedOn());
} else {
$task_status = lang('open');
- $task_completion_info = ' ';
+ $pdf->SetTextColor(255, 0, 0);
+ $task_completion_info = lang('due date') . ' : ' . lang('not assigned');
if ($task->getDueDate()) {
- $task_completion_info = format_date($task->getDueDate());
+ $task_completion_info = lang('due date') . ' : ' . format_date($task->getDueDate());
}
}
if ($task->getAssignedTo()) {
@@ -103,10 +109,19 @@ function download_list() {
$task_assignee = lang('not assigned');
}
$pdf->Cell($w[0],6,$line);
- $pdf->Cell($w[1],6,$task_status . " / " . $task_completion_info . " / " . $task_assignee , "TLRB");
+ $pdf->Cell($w[2],6,$task_status, "TLRB");
$pdf->Ln();
$pdf->Cell($w[0],6,'');
- $pdf->MultiCell($w[2],6,$task->getText());
+ $pdf->SetTextColor(0, 0, 0);
+ $pdf->Cell($w[2],6,$task_completion_info, "TLRB");
+ $pdf->Ln();
+ $pdf->Cell($w[0],6,'');
+ $pdf->SetTextColor(0, 0, 0);
+ $pdf->Cell($w[2],6,$task_assignee, "TLRB");
+ $pdf->Ln();
+ $pdf->Cell($w[0],6,'');
+ $pdf->SetTextColor(0, 0, 0);
+ $pdf->MultiCell($w[2],6,$task->getText(), "TLRB");
$pdf->Ln();
}
}
@@ -243,9 +258,24 @@ function add_list() {
// notify user
if (array_var($task_data, 'send_notification') == 'checked') {
try {
- if (Notifier::notifyNeeded($task->getAssignedTo(), null)) {
- Notifier::taskAssigned($task);
- }
+ $notify_people = array();
+ $project_companies = array();
+
+ if($task->getAssignedTo() == null)
+ $project_companies = active_project()->getCompanies();
+ if($task->getAssignedTo() instanceof Company)
+ $project_companies = array($task->getAssignedTo());
+ if($task->getAssignedTo() instanceof User)
+ $notify_people = array($task->getAssignedTo());
+
+ foreach($project_companies as $project_company) {
+ $company_users = $project_company->getUsersOnProject(active_project());
+ if(is_array($company_users))
+ foreach($company_users as $company_user)
+ $notify_people[] = $company_user;
+ } // if
+
+ Notifier::newTask($task, $notify_people);
} catch(Exception $e) {
Logger::log("Error: Notification failed, " . $e->getMessage(), Logger::ERROR);
} // try
@@ -634,9 +664,24 @@ function add_task() {
// notify user
if (array_var($task_data, 'send_notification') == 'checked') {
try {
- if (Notifier::notifyNeeded($task->getAssignedTo(), $old_owner)) {
- Notifier::taskAssigned($task);
- }
+ $notify_people = array();
+ $project_companies = array();
+
+ if($task->getAssignedTo() == null)
+ $project_companies = active_project()->getCompanies();
+ if($task->getAssignedTo() instanceof Company)
+ $project_companies = array($task->getAssignedTo());
+ if($task->getAssignedTo() instanceof User)
+ $notify_people = array($task->getAssignedTo());
+
+ foreach($project_companies as $project_company) {
+ $company_users = $project_company->getUsersOnProject(active_project());
+ if(is_array($company_users))
+ foreach($company_users as $company_user)
+ $notify_people[] = $company_user;
+ } // if
+
+ Notifier::newTask($task, $notify_people);
} catch(Exception $e) {
Logger::log("Error: Notification failed, " . $e->getMessage(), Logger::ERROR);
} // try
View
8 application/layouts/inlinejs.php
@@ -13,7 +13,7 @@
$(function() {
$('input.datetimepicker').datetimepicker({
- dateFormat: '<?php echo lang('input date format') ?>',
+ dateFormat: '<?php echo str_replace("'","\'",lang('input date format')) ?>',
constrainInput: false
});
});
@@ -147,7 +147,7 @@ function asyncParForEach(array, fn, callback) {
}
});
gg.each(function () { $(this).show() });
- $("#filter-count").text(count + ' <?php echo lang('shown/lc'); ?>' );
+ $("#filter-count").text(count + ' <?php echo str_replace("'","\'",lang('shown/lc')); ?>' );
}).keydown(function(event) {
if (event.which == 13) { // disable enter key on search filter to prevent leaving page
event.preventDefault();
@@ -157,8 +157,8 @@ function asyncParForEach(array, fn, callback) {
$(function(){
$("#i18n_values .edit").editable('<?php echo get_url('i18n', 'edit_value', null, null, false, '&'); ?>', {
- indicator : '<?php echo lang('saving'); ?>',
- tooltip : '<?php echo lang('click to edit'); ?>',
+ indicator : '<?php echo str_replace("'","\'",lang('saving')); ?>',
+ tooltip : '<?php echo str_replace("'","\'",lang('click to edit')); ?>',
style : 'inherit'
});
});
View
27 application/models/notifier/Notifier.class.php
@@ -118,6 +118,33 @@ static function newTask(ProjectTask $task, $people) {
tpl_fetch(get_template_path('new_task', 'notifier'))
); // send
} // newTask
+
+ /**
+ * Send closed task notification to the list of users ($people)
+ *
+ * @param ProjectTask $task closed task
+ * @param array $people
+ * @return boolean
+ * @throws NotifierConnectionError
+ */
+ static function completeTask(ProjectTask $task, $people) {
+ if(!is_array($people) || !count($people)) {
+ return; // nothing here...
+ } // if
+
+ tpl_assign('task', $task);
+
+ $recipients = array();
+ foreach($people as $user) {
+ $recipients[] = self::prepareEmailAddress($user->getEmail(), $user->getDisplayName());
+ } // foreach
+ return self::sendEmail(
+ $recipients,
+ self::prepareEmailAddress($task->getCreatedBy()->getEmail(), $task->getCreatedByDisplayName()),
+ $task->getProject()->getName() . ' - ' . lang('complete task') . ' - ' . $task->getObjectName(),
+ tpl_fetch(get_template_path('complete_task', 'notifier'))
+ ); // send
+ } // newTask
/**
* Send new message notification to the list of users ($people)
View
19 application/models/project_tasks/ProjectTask.class.php
@@ -287,6 +287,25 @@ function completeTask() {
$this->setCompletedById(logged_user()->getId());
$this->save();
+ $notify_people = array();
+ $project_companies = array();
+
+ if($this->getAssignedTo() == null)
+ $project_companies = active_project()->getCompanies();
+ if($this->getAssignedTo() instanceof Company)
+ $project_companies = array($this->getAssignedTo());
+ if($this->getAssignedTo() instanceof User)
+ $notify_people = array($this->getAssignedTo());
+
+ foreach($project_companies as $project_company) {
+ $company_users = $project_company->getUsersOnProject(active_project());
+ if(is_array($company_users))
+ foreach($company_users as $company_user)
+ $notify_people[] = $company_user;
+ } // foreach
+
+ Notifier::completeTask($this, $notify_people);
+
$task_list = $this->getTaskList();
if (($task_list instanceof ProjectTaskList) && $task_list->isOpen()) {
$open_tasks = $task_list->getOpenTasks();
View
801 application/plugins/reports/models/Reports.class.php
@@ -1,401 +1,402 @@
-<?php
-/**
- * @author ALBATROS INFORMATIQUE SARL - CARQUEFOU FRANCE - Damien HENRY
- * @licence Honest Public License
- * @package ProjectPier Gantt
- * @version $Id$
- * @access public
- */
-class Reports {
-
- public function __construct(){
- }
- /**
- *Make Gantt
- *@return image png & die
- */
- function MakeGanttChart(){
- // is logged ?
- if (!logged_user()->isProjectUser(active_project())) {
- die;
- } // if
- // is user can view this project ??
- if (!ProjectFile::canView(logged_user(), active_project())) {
- die;
- } //if
-
- /*
- * Init gantt graph
- */
- $width = 850;
- $graph = new GanttGraph($width);
- /*
- * here header must be set at end and during process catch all date to determine the difference max between start and end
- * to present HDAY or not depend on information volume
- */
- //graph header
- $graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HWEEK | GANTT_HDAY);
- // Instead of week number show the date for the first day in the week
- // on the week scale
- $graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
- $graph->SetMarginColor('blue:1.7');
- $graph->SetColor('white');
- $graph->SetBackgroundGradient('#60A2BA','white',GRAD_HOR,BGRAD_MARGIN);
- //$graph->SetBackgroundGradient('#A01010','white',GRAD_HOR,BGRAD_MARGIN);
- $graph->title->SetColor('white');
- $graph->title->SetFont(FF_FONT2,FS_BOLD,18);
- //$graph->scale->actinfo->SetColTitles(array('Act','Duration','Start','Finish','Resp'));
- $graph->scale->actinfo->SetStyle(ACTINFO_3D);
- $graph->scale->actinfo->SetFont(FF_ARIAL,FS_NORMAL,10);
- $graph->scale->actinfo->vgrid->SetColor('gray');
- $graph->scale->actinfo->SetColor('darkgray');
- $locale_char_set = 'utf-8';
- //For french support
- //Localization::instance()->getLocale();
- //if (preg_match('/' . Localization::instance()->getLocale() . '/i', 'fr_fr')) $graph->scale->SetDateLocale("fr_FR.utf8");
-
- /*
- * data jpgraph construction gantt type for project
- */
- $project = active_project();
- //Project title
- $project_name = $project->getName();
- $graph->title->Set(lang('project') . ': ' . substr(utf8_decode($project_name),0,40) );
-
- $rows = $this->displayProjectGantt($project, $graph, 0);
- $subprojects = $project->getSubprojects();
- if (is_array($subprojects)) {
- foreach($subprojects as $subproject) {
- $rows = $this->displayProjectGantt($subproject, $graph, $rows++);
- }
- }
-
- //send data
- $type = "image/png";
- $name = "projectpiergantt.png";
- header("Content-Type: $type");
- header("pragma: no-cache");
- header("Content-Disposition: attachment; filename=\"$name\"");
- $graph->Stroke();
- die(); //end process do not send other informations
- } //MakeGantt
-
-
- function displayProjectGantt(&$project, &$graph, $start_row) {
- /*
- * There is no start date in project i take the created date project
- * fields "created_on"
- */
- //start date project
- $start_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
-
- //line number jpgraph
- $rows = $start_row;
-
- $project_name = $project->getName();
- $label = lang('project') . ': ' . substr(utf8_decode($project_name),0,40);
- $mydate = date('Y-m-d');
- $data = array(
- array($rows++,ACTYPE_GROUP,$label,$start_date,$mydate,'')
- );
- $graph->SetSimpleFont(FF_FONT1,FS_BOLD,18);
- $graph->CreateSimple($data);
-
- /*
- * Milestone
- */
- $milestonehidden = array();
- $milestones = $project->getMilestones();
- $mymilestone = array();
- if (is_array($milestones)) {
- foreach($milestones as $milestone){
- if (!in_array($milestone->getId(),$milestonehidden)){
- $ms_date = $milestone->getDueDate();
- if (is_null($ms_date)) {
- $ms_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
- } else {
- $ms_date = Localization::instance()->formatDate($ms_date,0,'Y-m-d');
- }
- $mymilestone[] = array($rows++, ACTYPE_MILESTONE, " " . utf8_decode($milestone->getName()), $ms_date, $ms_date);
- } //if
- } //foreach
- } //if
-
- // add many diamond on graph
- if (count($mymilestone)>0) $graph->CreateSimple($mymilestone);
- $task_lists = $project->getTaskLists();
- /*
- * We took only task because we can just compute execution % on task_list, there is no notion in task
- */
- //milestone which dont appear => link to task_list
- $milestonehidden = array();
- if (is_array($task_lists)) {
- // Tasks lists
- foreach ($task_lists as $task_list) {
- //security access User can view this task_list ?
- if (!ProjectTaskList::canView(logged_user(), $task_list->getId())) continue;
-
- // task list name
- $task_list_name=$task_list->getName();
- //due to migration to 0.8.6 it s possible task_list due_date isnull
- $start_date = $task_list->getStartDate();
- if (is_null($start_date)) {
- $start_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
- //$start_date = date('Y-m-d');
- } else {
- $start_date = Localization::instance()->formatDate($start_date,0,'Y-m-d');
- }
- $mydate = $task_list->getDueDate();
- if ($mydate == ''){
- $mydate = date('Y-m-d');
- }else{
- $mydate = Localization::instance()->formatDate($mydate,0,'Y-m-d');
- }
- $progress = $this->progress($task_list);
- $progressgantt = array(
- array($rows,$progress[0]/100)
- );
- /*
- * detect if task_list is linked to milestone ?
- */
- $istasklistlinktomilestone = $task_list->getMilestone();
- //This task list have a milestone it due_date is milestone now
- $typebar = ACTYPE_GROUP;
- $milestonename = '';
- if ($istasklistlinktomilestone != '' && $istasklistlinktomilestone != null){
- $mydatemilestone = $istasklistlinktomilestone->getDueDate();
- if ($mydatemilestone != ''){
- $mydate = Localization::instance()->formatDate($mydatemilestone,0,'Y-m-d');
- }
- $milestonehidden[] = $istasklistlinktomilestone->getId();
- $typebar = ACTYPE_MILESTONE;
- $milestonename = "\n " . lang('milestone') . ": " . substr(utf8_decode($istasklistlinktomilestone->getName()),0,20);
- }//if
-
- $datasgantt = array(
- array($rows++,$typebar," " . substr(utf8_decode($task_list_name),0,35) . " [" . $progress[1] . '/' . $progress[2] . "]" . $this->epure($milestonename),$start_date,$mydate,'[' . $progress[0] ."%]",'','')
- );
-
- //task for this task_list
- $tasks = $task_list->getTasks();
- if (is_array($tasks)) {
- foreach($tasks as $task) {
- /*
- * security access
- */
- //security access User can view this task ?
- if (!ProjectTask::canView(logged_user(), $task->getId())) continue;
-
- // icon freeming ok | cancel
- if ($task->isCompleted()) {
- //complete
- $progressgantt[] = array($rows,1);
- } else {
- $progressgantt[] = array($rows,0);
- }//if
- //task name
- $task_text = '[' . $task->getId() . '] ' . $task->getText();
- $this->epure($task_text);
- $task_text = " $task_text";
- if (strlen($task_text) > 35) $task_text = substr($task_text,0,35) . "...";
- $start_date = $task->getStartDate();
- if (is_null($start_date)) {
- $start_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
- //$start_date = date('Y-m-d');
- } else {
- $start_date = Localization::instance()->formatDate($start_date,0,'Y-m-d');
- }
- $mydate = $task->getDueDate();
- if ($mydate == ''){
- $mydate = date('Y-m-d');
- } else {
- $mydate = Localization::instance()->formatDate($mydate,0,'Y-m-d');
- }
- $datasgantt[] = array($rows++,ACTYPE_NORMAL,utf8_decode($task_text),$start_date,$mydate,$mydate,'','');
- }
- }
- if (count($datasgantt)> 0) $graph->CreateSimple($datasgantt,null,$progressgantt);
- } // foreach
- } // if
-
- return $rows;
- } // displayProjectGantt
-
- /**
- *Make Mn
- *@return string
- */
- function MakeMindMap(){
- // header xml data freemind
- $content = "<map version=\"0.9.0\">\n";
- $content .= "<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n";
- $mytime = time();
-
- // is logged ?
- if (!logged_user()->isProjectUser(active_project())) {
- echo $content;
- echo "<node CREATED=\"$mytime\" ID=\"Freemind_Link_558888646\" MODIFIED=\"$mytime\" STYLE=\"bubble\" TEXT=\"Disconnected\">\n";
- echo "</node>\n";
- echo "</map>\n";
- die;
- } // if
- // is user can view this project ??
- if (!ProjectFile::canView(logged_user(), active_project())) {
- echo $content;
- echo "<node CREATED=\"$mytime\" ID=\"Freemind_Link_558888646\" MODIFIED=\"$mytime\" STYLE=\"bubble\" TEXT=\"Not Allowed\">\n";
- echo "</node>\n";
- echo "</map>\n";
- die;
- } //if
-
- /*
- * xml data construction freemind for project
- */
- $project = active_project();
- $project_name = $project->getName();
- $this->epure($project_name);
- //Project title
- $url = externalUrl(get_url('task','index'));
- $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" MODIFIED=\"$mytime\" STYLE=\"bubble\" TEXT=\"$project_name\">\n";
-
- //milestones
- $milestones = $project->getMilestones();
- $mymilestone = array();
- if (is_array($milestones)) {
- foreach($milestones as $milestone){
- $url = externalUrl(get_url('milestone','view',array('id' => $milestone->getId())));
- $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" POSITION=\"right\" MODIFIED=\"$mytime\" TEXT=\" [" . $milestone->getName() . ' ' . Localization::instance()->formatDate($milestone->getDueDate()) . "]\">\n";
- $content .= "<font NAME=\"SansSerif\" BOLD=\"true\" SIZE=\"12\"/>";
- $content .= "<icon BUILTIN=\"messagebox_warning\"/>\n";
- $content .= "<icon BUILTIN=\"messagebox_warning\"/>\n";
- $content .= "</node>\n";
- }
- }
-
- $task_lists = $project->getTaskLists();
- if (is_array($task_lists)) {
- //Tasks lists
- $positions = array('right','left');
- $actualpos = 0;
- foreach ($task_lists as $task_list) {
- /*
- * security access
- */
- //security access User can view this task_list ?
- if (!ProjectTaskList::canView(logged_user(), $task_list->getId())) continue;
-
- // task list name
- $task_list_name=$task_list->getName();
- //Complete or not complete
- $progress = $this->progress($task_list);
- $icon = null;
- $tasklistComplete = false;
- if ($progress[0] == '100'){
- $icon .= "<icon BUILTIN=\"button_ok\"/>\n";
- $tasklistComplete = true;
- }
- $this->epure('tl:'.$task_list_name);
- if (strlen($task_list_name) > 40) $task_list_name = substr($task_list_name,0,40) . "...";
- $position = $positions[$actualpos];
- $url = externalUrl(get_url('task','view_list',array('id' => $task_list->getId())));
- $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" MODIFIED=\"$mytime\" POSITION=\"$position\" TEXT=\"$task_list_name\">\n";
- $content .= "$icon";
- if ($actualpos == 0){
- $actualpos =1;
- }else{
- $actualpos =0;
- } //if
- //tasks
- $tasks = $task_list->getTasks();
- if (is_array($tasks)) {
- foreach($tasks as $task) {
- /*
- * security access
- */
- //security access User can view this task ?
- if (!ProjectTask::canView(logged_user(), $task->getId())) continue;
-
- // icon freeming ok | cancel
- $icon = null;
- if (!$tasklistComplete){
- if ($task->isCompleted()) {
- //complete : icon ok
- $icon .= "<icon BUILTIN=\"button_ok\"/>\n";
- $dateclose = " []";
- }else{
- //incomplete : icon cancel
- $icon .= "<icon BUILTIN=\"button_cancel\"/>\n";
- $dateclose = " []";
- } //if
- } //if
- //task name
- $task_text = $task->getText();
- $this->epure($task_text);
- if (strlen($task_text) > 40) $task_text = substr($task_text,0,40) . "...";
- $url = externalUrl(get_url('task','view_task',array('id' => $task->getId())));
- $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" MODIFIED=\"$mytime\" TEXT=\"" . $task_text . "\">\n";
- $content .= $icon;
- $content .= "</node>\n";
- }
- }
- $content .= "</node>\n";
- } // if
- } // if
-
- //footer xml data freemind
- $content .= "</node>\n";
- $content .= "</map>";
-
- //send data
- $type = "x-freemind/mm";
- $name = "projectpier.mm";
- $size = strlen($content);
- header("Content-Type: $type");
- header("Content-Disposition: attachment; filename=\"$name\"");
- header("Content-Length: " . (string) $size);
- echo $content;
- die; //end process do not send other informations
- } //MakeMm
-
-
- /*
- * Necessary call by line : if (!ProjectTaskList::canView(logged_user(), $task_list->getId())) continue;
- */
-
- public function isPrivate(){
- return false;
- } //isPrivate
-
- /*
- * Necessary : call by line : if (!ProjectTask::canView(logged_user(), $task->getId())) continue;
- */
- public function getProject(){
- return active_project();
- } //getProject
-
- private function progress($task_list){
- /*
- * return string[]
- */
- $totalTasks = $task_list->countAllTasks();
- $openTasks = $task_list->countOpenTasks();
- $completedTasks = $task_list->countCompletedTasks();
- $percentTasks = 0;
- if ($totalTasks>0) {
- $percentTasks = round($completedTasks / $totalTasks * 100);
- }
- return array($percentTasks,$completedTasks,$totalTasks);
- }
-
- private function epure(&$value){
- /*
- * for epure char include <> not compatible with xml datas
- */
- $value = preg_replace('/\>|\</','',$value);
- $value = preg_replace('/\"/','\'',$value);
- $value = preg_replace('/\n|\r/','',$value);
- }
-
-}
-
+<?php
+/**
+ * @author ALBATROS INFORMATIQUE SARL - CARQUEFOU FRANCE - Damien HENRY
+ * @licence Honest Public License
+ * @package ProjectPier Gantt
+ * @version $Id$
+ * @access public
+ */
+class Reports {
+
+ public function __construct(){
+ }
+ /**
+ *Make Gantt
+ *@return image png & die
+ */
+ function MakeGanttChart(){
+ // is logged ?
+ if (!logged_user()->isProjectUser(active_project())) {
+ die;
+ } // if
+ // is user can view this project ??
+ if (!ProjectFile::canView(logged_user(), active_project())) {
+ die;
+ } //if
+
+ /*
+ * Init gantt graph
+ */
+ $width = 850;
+ $graph = new GanttGraph($width);
+ /*
+ * here header must be set at end and during process catch all date to determine the difference max between start and end
+ * to present HDAY or not depend on information volume
+ */
+ //graph header
+ $graph->ShowHeaders(GANTT_HYEAR | GANTT_HMONTH | GANTT_HWEEK | GANTT_HDAY);
+ // Instead of week number show the date for the first day in the week
+ // on the week scale
+ $graph->scale->week->SetStyle(WEEKSTYLE_FIRSTDAY);
+ $graph->SetMarginColor('blue:1.7');
+ $graph->SetColor('white');
+ $graph->SetBackgroundGradient('#60A2BA','white',GRAD_HOR,BGRAD_MARGIN);
+ //$graph->SetBackgroundGradient('#A01010','white',GRAD_HOR,BGRAD_MARGIN);
+ $graph->title->SetColor('white');
+ $graph->title->SetFont(FF_FONT2,FS_BOLD,18);
+ //$graph->scale->actinfo->SetColTitles(array('Act','Duration','Start','Finish','Resp'));
+ $graph->scale->actinfo->SetStyle(ACTINFO_3D);
+ $graph->scale->actinfo->SetFont(FF_ARIAL,FS_NORMAL,10);
+ $graph->scale->actinfo->vgrid->SetColor('gray');
+ $graph->scale->actinfo->SetColor('darkgray');
+ $locale_char_set = 'utf-8';
+ //For french support
+ //Localization::instance()->getLocale();
+ //if (preg_match('/' . Localization::instance()->getLocale() . '/i', 'fr_fr')) $graph->scale->SetDateLocale("fr_FR.utf8");
+
+ /*
+ * data jpgraph construction gantt type for project
+ */
+ $project = active_project();
+ //Project title
+ $project_name = $project->getName();
+ $graph->title->Set(lang('project') . ': ' . substr(utf8_decode($project_name),0,40) );
+
+ $rows = $this->displayProjectGantt($project, $graph, 0);
+ $subprojects = $project->getSubprojects();
+ if (is_array($subprojects)) {
+ foreach($subprojects as $subproject) {
+ $rows = $this->displayProjectGantt($subproject, $graph, $rows++);
+ }
+ }
+
+ //send data
+ $type = "image/png";
+ $name = "projectpiergantt.png";
+ header("Content-Type: $type");
+ header("pragma: no-cache");
+ header("Content-Disposition: attachment; filename=\"$name\"");
+ $graph->Stroke();
+ die(); //end process do not send other informations
+ } //MakeGantt
+
+
+ function displayProjectGantt(&$project, &$graph, $start_row) {
+ /*
+ * There is no start date in project i take the created date project
+ * fields "created_on"
+ */
+ //start date project
+ $start_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
+
+ //line number jpgraph
+ $rows = $start_row;
+
+ $project_name = $project->getName();
+ $label = lang('project') . ': ' . substr(utf8_decode($project_name),0,40);
+ $mydate = date('Y-m-d');
+ $data = array(
+ array($rows++,ACTYPE_GROUP,$label,$start_date,$mydate,'')
+ );
+ $graph->SetSimpleFont(FF_FONT1,FS_BOLD,18);
+ $graph->CreateSimple($data);
+
+ /*
+ * Milestone
+ */
+ $milestonehidden = array();
+ $milestones = $project->getMilestones();
+ $mymilestone = array();
+ if (is_array($milestones)) {
+ foreach($milestones as $milestone){
+ if (!in_array($milestone->getId(),$milestonehidden)){
+ $ms_date = $milestone->getDueDate();
+ if (is_null($ms_date)) {
+ $ms_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
+ } else {
+ $ms_date = Localization::instance()->formatDate($ms_date,0,'Y-m-d');
+ }
+ $mymilestone[] = array($rows++, ACTYPE_MILESTONE, " " . utf8_decode($milestone->getName()), $ms_date, $ms_date);
+ } //if
+ } //foreach
+ } //if
+
+ // add many diamond on graph
+ if (count($mymilestone)>0) $graph->CreateSimple($mymilestone);
+ $task_lists = $project->getTaskLists();
+ /*
+ * We took only task because we can just compute execution % on task_list, there is no notion in task
+ */
+ //milestone which dont appear => link to task_list
+ $milestonehidden = array();
+ if (is_array($task_lists)) {
+ // Tasks lists
+ foreach ($task_lists as $task_list) {
+ //security access User can view this task_list ?
+ if (!ProjectTaskList::canView(logged_user(), $task_list->getId())) continue;
+
+ // task list name
+ $task_list_name=$task_list->getName();
+ //due to migration to 0.8.6 it s possible task_list due_date isnull
+ $start_date = $task_list->getStartDate();
+ if (is_null($start_date)) {
+ $start_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
+ //$start_date = date('Y-m-d');
+ } else {
+ $start_date = Localization::instance()->formatDate($start_date,0,'Y-m-d');
+ }
+ $mydate = $task_list->getDueDate();
+ if ($mydate == ''){
+ $mydate = date('Y-m-d');
+ }else{
+ $mydate = Localization::instance()->formatDate($mydate,0,'Y-m-d');
+ }
+ $progress = $this->progress($task_list);
+ $progressgantt = array(
+ array($rows,$progress[0]/100)
+ );
+ /*
+ * detect if task_list is linked to milestone ?
+ */
+ $istasklistlinktomilestone = $task_list->getMilestone();
+ //This task list have a milestone it due_date is milestone now
+ $typebar = ACTYPE_GROUP;
+ $milestonename = '';
+ if ($istasklistlinktomilestone != '' && $istasklistlinktomilestone != null){
+ $mydatemilestone = $istasklistlinktomilestone->getDueDate();
+ if ($mydatemilestone != ''){
+ $mydate = Localization::instance()->formatDate($mydatemilestone,0,'Y-m-d');
+ }
+ $milestonehidden[] = $istasklistlinktomilestone->getId();
+ $typebar = ACTYPE_MILESTONE;
+ $milestonename = "\n " . lang('milestone') . ": " . substr(utf8_decode($istasklistlinktomilestone->getName()),0,20);
+ }//if
+
+ $datasgantt = array(
+ array($rows++,$typebar," " . substr(utf8_decode($task_list_name),0,35) . " [" . $progress[1] . '/' . $progress[2] . "]" . $this->epure($milestonename),$start_date,$mydate,'[' . $progress[0] ."%]",'','')
+ );
+
+ //task for this task_list
+ $tasks = $task_list->getTasks();
+ if (is_array($tasks)) {
+ foreach($tasks as $task) {
+ /*
+ * security access
+ */
+ //security access User can view this task ?
+ if (!ProjectTask::canView(logged_user(), $task->getId())) continue;
+
+ // icon freeming ok | cancel
+ if ($task->isCompleted()) {
+ //complete
+ $progressgantt[] = array($rows,1);
+ } else {
+ $progressgantt[] = array($rows,0);
+ }//if
+ //task name
+ $task_text = '[' . $task->getId() . '] ' . $task->getText();
+ $this->epure($task_text);
+ $task_text = " $task_text";
+ if (strlen($task_text) > 35) $task_text = substr($task_text,0,35) . "...";
+ $start_date = $task->getStartDate();
+ if (is_null($start_date)) {
+ $start_date = Localization::instance()->formatDate($project->getCreatedOn(),0,"Y-m-d");
+ //$start_date = date('Y-m-d');
+ } else {
+ $start_date = Localization::instance()->formatDate($start_date,0,'Y-m-d');
+ }
+ $mydate = $task->getDueDate();
+ if ($mydate == ''){
+ $mydate = date('Y-m-d');
+ } else {
+ $mydate = Localization::instance()->formatDate($mydate,0,'Y-m-d');
+ }
+ $datasgantt[] = array($rows++,ACTYPE_NORMAL,utf8_decode($task_text),$start_date,$mydate,$mydate,'','');
+ }
+ }
+ if (count($datasgantt)> 0) $graph->CreateSimple($datasgantt,null,$progressgantt);
+ } // foreach
+ } // if
+
+ return $rows;
+ } // displayProjectGantt
+
+ /**
+ *Make Mn
+ *@return string
+ */
+ function MakeMindMap(){
+ // header xml data freemind
+ $content = "<map version=\"0.9.0\">\n";
+ $content .= "<!-- To view this file, download free mind mapping software FreeMind from http://freemind.sourceforge.net -->\n";
+ $mytime = time();
+
+ // is logged ?
+ if (!logged_user()->isProjectUser(active_project())) {
+ echo $content;
+ echo "<node CREATED=\"$mytime\" ID=\"Freemind_Link_558888646\" MODIFIED=\"$mytime\" STYLE=\"bubble\" TEXT=\"Disconnected\">\n";
+ echo "</node>\n";
+ echo "</map>\n";
+ die;
+ } // if
+ // is user can view this project ??
+ if (!ProjectFile::canView(logged_user(), active_project())) {
+ echo $content;
+ echo "<node CREATED=\"$mytime\" ID=\"Freemind_Link_558888646\" MODIFIED=\"$mytime\" STYLE=\"bubble\" TEXT=\"Not Allowed\">\n";
+ echo "</node>\n";
+ echo "</map>\n";
+ die;
+ } //if
+
+ /*
+ * xml data construction freemind for project
+ */
+ $project = active_project();
+ $project_name = $project->getName();
+ $this->epure($project_name);
+ //Project title
+ $url = externalUrl(get_url('task','index'));
+ $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" MODIFIED=\"$mytime\" STYLE=\"bubble\" TEXT=\"$project_name\">\n";
+
+ //milestones
+ $milestones = $project->getMilestones();
+ $mymilestone = array();
+ if (is_array($milestones)) {
+ foreach($milestones as $milestone){
+ $url = externalUrl(get_url('milestone','view',array('id' => $milestone->getId())));
+ $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" POSITION=\"right\" MODIFIED=\"$mytime\" TEXT=\" [" . $milestone->getName() . ' ' . Localization::instance()->formatDate($milestone->getDueDate()) . "]\">\n";
+ $content .= "<font NAME=\"SansSerif\" BOLD=\"true\" SIZE=\"12\"/>";
+ $content .= "<icon BUILTIN=\"messagebox_warning\"/>\n";
+ $content .= "<icon BUILTIN=\"messagebox_warning\"/>\n";
+ $content .= "</node>\n";
+ }
+ }
+
+ $task_lists = $project->getTaskLists();
+ if (is_array($task_lists)) {
+ //Tasks lists
+ $positions = array('right','left');
+ $actualpos = 0;
+ foreach ($task_lists as $task_list) {
+ /*
+ * security access
+ */
+ //security access User can view this task_list ?
+ if (!ProjectTaskList::canView(logged_user(), $task_list->getId())) continue;
+
+ // task list name
+ $task_list_name=$task_list->getName();
+ //Complete or not complete
+ $progress = $this->progress($task_list);
+ $icon = null;
+ $tasklistComplete = false;
+ if ($progress[0] == '100'){
+ $icon .= "<icon BUILTIN=\"button_ok\"/>\n";
+ $tasklistComplete = true;
+ }
+ $kt_tl_var = 'tl:' . $task_list_name;
+ $this->epure($kt_tl_var);
+ if (strlen($task_list_name) > 40) $task_list_name = substr($task_list_name,0,40) . "...";
+ $position = $positions[$actualpos];
+ $url = externalUrl(get_url('task','view_list',array('id' => $task_list->getId())));
+ $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" MODIFIED=\"$mytime\" POSITION=\"$position\" TEXT=\"$task_list_name\">\n";
+ $content .= "$icon";
+ if ($actualpos == 0){
+ $actualpos =1;
+ }else{
+ $actualpos =0;
+ } //if
+ //tasks
+ $tasks = $task_list->getTasks();
+ if (is_array($tasks)) {
+ foreach($tasks as $task) {
+ /*
+ * security access
+ */
+ //security access User can view this task ?
+ if (!ProjectTask::canView(logged_user(), $task->getId())) continue;
+
+ // icon freeming ok | cancel
+ $icon = null;
+ if (!$tasklistComplete){
+ if ($task->isCompleted()) {
+ //complete : icon ok
+ $icon .= "<icon BUILTIN=\"button_ok\"/>\n";
+ $dateclose = " []";
+ }else{
+ //incomplete : icon cancel
+ $icon .= "<icon BUILTIN=\"button_cancel\"/>\n";
+ $dateclose = " []";
+ } //if
+ } //if
+ //task name
+ $task_text = $task->getText();
+ $this->epure($task_text);
+ if (strlen($task_text) > 40) $task_text = substr($task_text,0,40) . "...";
+ $url = externalUrl(get_url('task','view_task',array('id' => $task->getId())));
+ $content .= "<node CREATED=\"$mytime\" LINK=\"$url\" MODIFIED=\"$mytime\" TEXT=\"" . $task_text . "\">\n";
+ $content .= $icon;
+ $content .= "</node>\n";
+ }
+ }
+ $content .= "</node>\n";
+ } // if
+ } // if
+
+ //footer xml data freemind
+ $content .= "</node>\n";
+ $content .= "</map>";
+
+ //send data
+ $type = "x-freemind/mm";
+ $name = "projectpier.mm";
+ $size = strlen($content);
+ header("Content-Type: $type");
+ header("Content-Disposition: attachment; filename=\"$name\"");
+ header("Content-Length: " . (string) $size);
+ echo $content;
+ die; //end process do not send other informations
+ } //MakeMm
+
+
+ /*
+ * Necessary call by line : if (!ProjectTaskList::canView(logged_user(), $task_list->getId())) continue;
+ */
+
+ public function isPrivate(){
+ return false;
+ } //isPrivate
+
+ /*
+ * Necessary : call by line : if (!ProjectTask::canView(logged_user(), $task->getId())) continue;
+ */
+ public function getProject(){
+ return active_project();
+ } //getProject
+
+ private function progress($task_list){
+ /*
+ * return string[]
+ */
+ $totalTasks = $task_list->countAllTasks();
+ $openTasks = $task_list->countOpenTasks();
+ $completedTasks = $task_list->countCompletedTasks();
+ $percentTasks = 0;
+ if ($totalTasks>0) {
+ $percentTasks = round($completedTasks / $totalTasks * 100);
+ }
+ return array($percentTasks,$completedTasks,$totalTasks);
+ }
+
+ private function epure(&$value){
+ /*
+ * for epure char include <> not compatible with xml datas
+ */
+ $value = preg_replace('/\>|\</','',$value);
+ $value = preg_replace('/\"/','\'',$value);
+ $value = preg_replace('/\n|\r/','',$value);
+ }
+
+}
+
?>
View
27 application/views/notifier/complete_task.php
@@ -0,0 +1,27 @@
+------------------------------------------------------------
+ <?php echo lang('do not reply warning') ?>
+------------------------------------------------------------
+
+<?php echo lang('task completed', $task->getObjectName(), $task->getProject()->getName()) ?>.
+
+<?php
+/* Send the message body unless the configuration file specifically says not to:
+** to prevent sending the body of email messages add the following to config.php
+** For config.php: define('SHOW_MESSAGE_BODY', false);
+*/
+if ((!defined('SHOW_MESSAGE_BODY')) or (SHOW_MESSAGE_BODY == true)) {
+ echo "\n----------------\n";
+ echo $task->getText();
+ echo "\n----------------\n\n";
+}
+?>
+
+<?php echo lang('view completed task') ?>:
+
+- <?php echo str_replace('&amp;', '&', externalUrl($task->getViewUrl())) ?>
+
+Company: <?php echo owner_company()->getName() ?>
+Project: <?php echo $task->getProject()->getName() ?>
+
+--
+<?php echo externalUrl(ROOT_URL) ?>
View
15 application/views/notifier/new_account.php
@@ -1,7 +1,10 @@
-<?php echo lang('hi john doe', $new_account->getContact()->getDisplayName()) ?>,
-<?php echo lang('user created your account', $new_account->getCreatedBy()->getContact()->getDisplayName()) ?>.
-<?php echo lang('visit and login', externalUrl(ROOT_URL)) ?>:
-<?php echo lang('username') ?>: <?php echo $new_account->getUsername() ?>
-<?php echo lang('password') ?>: <?php echo $raw_password ?>
---
+<?php echo lang('hi john doe', $new_account->getContact()->getDisplayName()) ?>,
+<?php echo "\n"?>
+<?php echo lang('user created your account', $new_account->getCreatedBy()->getContact()->getDisplayName()) ?>.
+<?php echo lang('visit and login', externalUrl(ROOT_URL)) ?>:
+<?php echo "\n"?>
+<?php echo lang('username') ?>: <?php echo $new_account->getUsername() ?>
+<?php echo "\n"?>
+<?php echo lang('password') ?>: <?php echo $raw_password ?>
+<?php echo "\n--\n"?>
<?php echo externalUrl(ROOT_URL) ?>
View
28 application/views/notifier/updated_account.php
@@ -1,12 +1,18 @@
-<?php echo lang('hi john doe', $updated_account->getContact()->getDisplayName()) ?>,
-
-<?php echo lang('user updated your account', $updated_account->getUpdatedBy()->getContact()->getDisplayName()) ?>. <?php echo lang('visit and login', externalUrl(ROOT_URL)) ?>:
-<?php echo lang('username') ?>: <?php echo $updated_account->getUsername() ?>
-<?php if (trim($raw_password) != '') { ?>
-<?php echo lang('password') ?>: <?php echo $raw_password ?>
-<?php } else { ?>
-<?php echo lang('password unchanged') ?>
-<?php } // if?>
-
---
+<?php echo lang('hi john doe', $updated_account->getContact()->getDisplayName()) ?>,
+
+
+<?php echo lang('user updated your account', $updated_account->getUpdatedBy()->getContact()->getDisplayName()) ?>.
+<?php echo lang('visit and login', externalUrl(ROOT_URL)) ?>:
+
+
+<?php echo lang('username') ?>: <?php echo $updated_account->getUsername() ?>
+
+<?php if (trim($raw_password) != '') { ?>
+<?php echo lang('password') ?>: <?php echo $raw_password ?>
+<?php } else { ?>
+<?php echo lang('password unchanged') ?>
+<?php } // if?>
+
+
+--
<?php echo externalUrl(ROOT_URL) ?>
View
2 language/en_us/administration.php
@@ -129,7 +129,7 @@
'config option name authdb server' => 'Database server',
'config option desc authdb server' => 'The ip address or DNS name of the database server for authentication. Port number can be included.',
'config option name authdb username' => 'Database user name',
- 'config option desc authdb username' => 'The user name to access the database',
+ 'config option desc authdb username' => 'The password to access the database',
'config option name authdb password' => 'Database user name',
'config option desc authdb password' => 'The password corresponding to the user',
'config option name authdb database' => 'Database name',
View
1 language/en_us/general.php
@@ -256,6 +256,7 @@
'minutes' => 'minutes',
'seconds' => 'seconds',
+ 'radio' => 'radio',
); // array
?>
View
4 language/en_us/messages.php
@@ -266,9 +266,9 @@
'log delete projectforms' => 'Form \'%s\' deleted',
'log add projects' => 'Project \'%s\' added',
- 'log edit projects' => 'Project \'%s\' added',
+ 'log edit projects' => 'Project \'%s\' updated',
'log open projects' => 'Project \'%s\' opened',
- 'log close projects' => 'Project \'%s\' opened',
+ 'log close projects' => 'Project \'%s\' closed',
'log delete projects' => 'Project \'%s\' deleted',
'log add users' => 'User \'%s\' added',
View
1 language/en_us/textile_help.php
@@ -28,7 +28,6 @@
'header paren' => 'Plain (parentheses) inserted between block syntax and the closing dot-space indicate classes and ids:',
'header curly' => 'Curly {brackets} insert arbitrary css style',
'header square' => 'Square [brackets] insert language attributes',
- 'header square' => 'Square [brackets] insert language attributes',
'output is/lc' => '<b><i>output will be</i></b>',
'some text/lc' => 'some text',
); // array
View
1 language/es_es/general.php
@@ -37,6 +37,7 @@
'additional text' => 'Texto adicional',
'due date' => 'Fecha de vencimiento',
'done date' => 'Fecha',
+ 'weekly schedule' => 'Mi Semana',
'assign to' => 'Asignar a',
'not assigned' => 'Sin asignar',
'late' => 'Atrasado',
View
22 language/fr_fr/actions.php
@@ -106,6 +106,28 @@
'nothing to download' => "Pas de données disponibles dans '%s' à télécharger",
'download task lists' => 'Télécharger toutes les tâches',
+ // Internationalization
+ 'select language' => 'Choisissez la langue',
+
+ 'edit logo' => 'Modifier le logo',
+ 'delete logo' => 'Supprimer le logo',
+ 'add user account' => 'Ajouter un utilisateur',
+ 'add contact' => 'Ajouter un contact',
+ 'edit contact' => 'Modifier contact',
+ 'delete contact' => 'Supprimer contact',
+ 'edit user account' => 'Modifier le compte utilisateur',
+ 'delete user account' => 'Supprimer le compte utilisateur',
+ 'toggle favorite' => 'Modifier favori',
+ 'done adding contacts' => 'Fin de l\'ajout de contacts',
+ 'list view' => 'Liste',
+ 'detail view' => 'Détails',
+ 'add text snippet' => 'Ajouter une bribe de texte',
+ 'add text snippets' => 'Ajouter des bribes de texte',
+ 'move message' => 'Déplacer le message',
+ 'add status update' => 'Mise à jour du statut',
+ 'pdf' => 'PDF',
+ 'view assigned tasks' => 'Voir la tache assignée',
+ 'view milestone' => 'Voir le jalon',
); // array
?>
View
49 language/fr_fr/administration.php
@@ -87,15 +87,60 @@
'config option name per_project_activity_logs' => 'Journalisation de l\'activité par project',
'config option name categories_per_page' => 'Nombre de catégories par page',
- 'config option name character_set' => 'Character set to use',
- 'config option name collation' => 'Character sort order',
+ 'config option name character_set' => 'Jeu de caractères à utiliser',
+ 'config option name collation' => 'Ordre des caractères',
'config option name session_lifetime' => 'Durée de la session',
'config option name default_controller' => 'Page principale par défaut',
'config option name default_action' => 'Default subpage',
'config option name logs_show_icons' => 'Montrer les icônes dansShow icons in the application log',
'config option name default_private' => 'Paramétrage par défaut pour l\'option privé',
+
+ 'administration tool name system_info' => 'Informations Système',
+ 'administration tool desc system_info' => 'Un outil simple montrant les détails du système',
+ 'administration tool name browse_log' => 'Parcourir le rapport système',
+ 'administration tool desc browse_log' => 'Utilisez cet outil pour voir le rapport système afin de détecter des erreurs',
+ 'config category name authentication' => 'Authentification',
+ 'config category desc authentication' => 'Accès à tous les réglages d\'authentification',
+ 'config option name installation_welcome_logo' => 'Logo de la page d\'authentification',
+ 'config option name installation_welcome_text' => 'Texte de la page d\'authentification',
+ 'config option name installation_base_language' => 'Langage de base (aussi pour la page d\'authentification)',
+ 'config option name dashboard action index' => 'Vue d\'ensemble',
+ 'config option name dashboard action my_projects' => 'Mes Projets',
+ 'config option name dashboard action my_tasks' => 'Mes tâches',
+ 'config option name dashboard action my_projects_by_name' => 'Mes Projets - ordonnés par nom',
+ 'config option name dashboard action my_projects_by_priority' => 'Mes Projets - ordonnés par priorité',
+ 'config option name dashboard action my_projects_by_milestone' => 'Mes Projets - ordonnés par jalon',
+ 'config option name dashboard action my_tasks_by_name' => 'My tâches - ordonnés par nom',
+ 'config option name dashboard action my_tasks_by_priority' => 'My tâches - ordonnés par priorité',
+ 'config option name dashboard action my_tasks_by_milestone' => 'My tâches - ordonnés par jalon',
+ 'config option name dashboard action contacts' => 'Contacts',
+ 'config option name dashboard action search_contacts' => 'Recherche contacts',
+ 'config option name send_notification_default' => 'Réglages par défaut pour l\'envoi de notifications',
+ 'config option name enable_efqm' => 'Activer les options EFQM',
+ 'config option name login_show_options' => 'Montrer les options sur la page d\'authentification',
+ 'config option desc login_show_options' => 'Si oui, les options de langage et de thèmes sont visibles.',
+ 'config option name display_application_logs' => 'Voir le rapports d\'application',
+ 'config option desc display_application_logs' => 'Si non, le rapport se fait toujours mais n\'est plus affiché.',
+ 'config option name dashboard_logs_count' => 'Nombre de lignes max. à afficher du rapport d\'application',
+ 'config option desc dashboard_logs_count' => 'Limite le nombre de lignes du rapport d\'application à montrer sur le tableau de bord',
+ 'config option name authdb server' => 'Serveur de base de données',
+ 'config option desc authdb server' => 'L\'adresse IP ou le DNS du serveur de base de données pour l\'authentification. Le numéro de port peut etre inclus.',
+ 'config option name authdb username' => 'Nom d\'utilisateur de la base de données',
+ 'config option desc authdb username' => 'Le nom d\'utilisateur ayant accès à la base de données',
+ 'config option name authdb password' => 'Mot de passe de la base de données',
+ 'config option desc authdb password' => 'Le mot de passe correspondant à l\'utilisateur',
+ 'config option name authdb database' => 'Nom de la base de données',
+ 'config option desc authdb database' => 'Nom de la base de données sur le serveur',
+ 'config option name authdb sql' => 'SQL de Select',
+ 'config option desc authdb sql' => 'Le code SQL pour retrouver une seule ligne de la table contenant les détails de l\'utilisateur. Au moins 1 champ doit etre retourné et nommé email. $username/$password sont les emplacement du nom d\'utilisateur et du mot de passe lors de l\'authentification.',
+ 'config option name parking space reservation url' => 'URL de la place de parking',
+ 'config option desc parking space reservation url' => 'Entrez l\'URL complète pour lancer l\'aplication de réservation de places de parking',
+ 'config option name map url' => 'Voir l\'URL de carte',
+ 'config option desc map url' => 'L\'URL vers une carte montrant l\'emplacement d\'un contact ou d\'une société. $location est l\'emplacement pour l\'adresse.',
+ 'config option name route url' => 'Afficher l\'URL de la route',
+ 'config option desc route url' => 'L\'URL vers l\'itinéraire entre l\'utilisateur en cours (contact) et l\'emplacement de l\'autre contact ou société. $from/$to sont les emplacements pour l\'adresse de départ et celle d\'arrivée.',
); // array
?>
View
2,648 language/fr_fr/all.php
1,324 additions, 1,324 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
26 language/fr_fr/efqm.php
@@ -0,0 +1,26 @@
+<?php
+
+ return array(
+ 'efqm project' => 'Ceci est-il un projet EFQM?',
+ 'efqm leadership' => 'Direction',
+ 'efqm strategy' => 'Stratégie',
+ 'efqm people' => 'Acteurs',
+ 'efqm partnership and resources' => 'Partenariats et Resources',
+ 'efqm processes products services' => 'Processes, Produits and Services',
+ 'efqm customer results' => 'Résultats client',
+ 'efqm people results' => 'Résultats acteur',
+ 'efqm society results' => 'Résultats société',
+ 'efqm key results' => 'Résultats clefs',
+ 'goal' => 'Objectif (0-100%)',
+ 'score' => 'Score (0-100%)',
+ 'config option name initial goal' => 'Valeur initiale de l\'objectif',
+ 'config option name initial score' => 'Valeur initiale du score',
+ 'config option name due date offset' => 'Décalage de l\'échéance en jours',
+ 'config category name efqm' => 'Options EFQM',
+ 'can edit milestones goal' => 'Peut éditer l\'objectif du jalon',
+ 'can edit tasks score' => 'Peut éditer le score de la liste de tâches',
+ 'view score card' => 'Voir la carte de score',
+ 'score card' => 'Carte de score',
+ 'edit score' => 'Modifier le score',
+ );
+?>
View
6 language/fr_fr/emails.php
@@ -30,6 +30,12 @@
'task assigned' => 'La tâche "%s" vous a été assignée',
+ 'your account updated' => 'Votre compte a été mis à jour',
+ 'password unchanged' => 'Votre mot de passe reste inchangé.',
+ 'new file posted' => 'Nouveau fichier "%s" ajouté dans le projet "%s"',
+ 'view new file' => 'Voir nouveau fichier',
+ 'user updated your account' => '%s a modifié votre compte',
+
); // array
?>
View
6 language/fr_fr/errors.php
@@ -81,6 +81,12 @@
'massmailer message required' => 'Le corps du message est obligatoire',
'massmailer select recipients' => 'Sélectionnez les utilisateurs qui recevront ce message électronique',
+
+ 'name value required' => 'Le nom est obligatoire',
+ 'existing contact required' => 'Vous devez sélectionner un contact existant',
+ 'contact already has user' => 'Ce contact a déjà un compte utilisateur lié à lui.',
+ 'invalid password' => 'Mot de passe incorrect. Vérifiez votre mot de passe et essayez à nouveau',
+
); // array
?>
View
49 language/fr_fr/general.php
@@ -37,6 +37,7 @@
'additional text' => 'Texte supplémentaire',
'due date' => 'Echéance',
'done date' => 'Date effective',
+ 'weekly schedule' => 'Ma Semaine',
'assign to' => 'Assigné à',
'not assigned' => 'Not assigné',
'late' => 'Retard',
@@ -209,6 +210,54 @@
'minutes' => 'minutes',
'seconds' => 'secondes',
+ 'show route' => 'Voir la route',
+ 'reserve parking space' => 'Reserver une place de parking',
+ 'first name' => 'Prénom',
+ 'middle name' => 'Deuxième nom',
+ 'last name' => 'Nom',
+ 'additional' => 'Additionel',
+ 'license plate' => 'Numéro d\'immatriculation',
+ 'language preferences' => 'Préférences de langue',
+ 'food preferences' => 'Préférences d\'alimentation',
+ 'location details' => 'Détails de l\'emplacement',
+ 'department details' => 'Détails du département',
+ 'i18n' => 'Internationalisation',
+ 'i18n locale value' => 'Valeur locale',
+ 'country code' => 'Code pays',
+ 'language code' => 'Code langue',
+ 'click to edit' => 'Cliquez pour éditer, Echap pour annuler, Entrée pour sauvegarder',
+ 'editor' => 'Editeur',
+ 'edit values' => 'Editer les valeurs',
+ 'load values' => 'Charger les valeurs',
+ 'add locale' => 'Ajouter une locale',
+ 'edit locale' => 'Editer la locale',
+ 'locale' => 'Locale',
+ 'id' => 'Id.',
+ 'updated by' => 'Mis à jour par',
+ 'success edit locale' => 'Locale sauvegardée',
+ 'invalid reference' => 'référence invalide %s',
+ 'company name' => 'Nom de la société',
+ 'refresh' => 'Rafraichir',
+ 'search hint' => '4 caractères ou plus',
+ 'search results for' => 'Résultats de la recherche pour \'%s\'',
+ 'shown/lc' => 'à l\'affichage',
+ 'contact title' => 'Titre',
+ 'no due date' => 'Pas d\'échéance',
+ 'start date' => 'Date de début',
+ 'end date' => 'Date de fin',
+ 'true' => 'Vrai',
+ 'false' => 'Faux',
+ 'public' => 'Public',
+ 'avatar from gravatar' => 'Avatar de gravatar.com',
+ 'unassigned' => 'Pas d\'assignation',
+ 'you' => 'vous',
+ 'snapshot' => 'Snapshot',
+ 'favorite' => 'Favori',
+ 'not favorite' => 'Non favori',
+ 'input date format' => 'd M yy',
+ 'hours/lc' => 'heures',
+
+ 'radio' => 'radio',
); // array
?>
View
46 language/fr_fr/messages.php
@@ -244,6 +244,52 @@
'log edit projectforms' => '\'%s\' modifié',
'log delete projectforms' => '\'%s\' supprimé',
+ 'no status updates associated with object' => 'Aucune mise à jour de statut postée pour cet objet',
+ 'no contacts in company' => 'Il n\' y a pas de contact pour cette société',
+ 'contact dnx' => 'Le contact selectionné n\'existe pas',
+ 'no image functions' => 'Pas de fonctions images (installez la librairie GD)',
+ 'no ldap functions' => 'Pas de fonctions LDAP (installez l\'extension ldap)',
+ 'success edit logo' => 'Le logo a été mis à jour',
+ 'success delete logo' => 'Le logo a été supprimé',
+ 'success move message' => 'Le message \'%s\' a été déplacé du projet \'%s\' vers le projet \'%s\'',
+ 'success add contact' => 'Le contact %s a été ajouté avec succès',
+ 'success edit contact' => 'Le contact %s a été modifé avec succès',
+ 'success delete contact' => 'Contact %s a été supprimé avec succès',
+ 'error complete project' => 'Impossible de rentre ce projet complété',
+ 'error open project' => 'Impossible de réouvrir le projet sélectionné',
+ 'error edit logo' => 'Impossible de modifier le logo %s',
+ 'error delete logo' => 'Impossible de supprimer le logo %s',
+ 'error delete contact' => 'Impossible de supprimer le contact selectionné',
+ 'error move message' => 'Impossible de déplacer le message sélectionné %s',
+ 'error move task list' => 'Impossible de déplacer la liste de tâches sélectionnée',
+ 'confirm delete logo' => 'Etes-vous certain de vouloir supprimer ce logo?',
+ 'confirm delete contact' => 'Etes-vous certain de vouloir supprimer ce contact?',
+
+ 'log add projects' => 'Projet \'%s\' ajouté',
+ 'log edit projects' => 'Projet \'%s\' modifié',
+ 'log open projects' => 'Projet \'%s\' ouvert',
+ 'log close projects' => 'Projet \'%s\' fermé',
+ 'log delete projects' => 'Projet \'%s\' supprimé',
+
+ 'log add users' => 'Utilisateur \'%s\' ajouté',
+ 'log edit users' => 'Utilisateur \'%s\' modifié',
+ 'log delete users' => 'Utilisateur \'%s\' supprimé',
+
+ 'log add companies' => 'Société \'%s\' ajoutée',
+ 'log edit companies' => 'Société \'%s\' modifiée',
+ 'log delete companies' => 'Société \'%s\' supprimée',
+
+ 'log add contacts' => 'Contact \'%s\' ajouté',
+ 'log edit contacts' => 'Contact \'%s\' modifié',
+ 'log delete contacts' => 'Contact \'%s\' supprimé',
+
+ 'log add i18nlocales' => 'Locale \'%s\' ajoutée',
+ 'log edit i18nlocales' => 'Locale \'%s\' modifiée',
+ 'log delete i18nlocales' => 'Locale \'%s\' supprimée',
+
+ 'log add i18localevalues' => 'Valeur locale \'%s\' ajoutée',
+ 'log edit i18nlocalevalues' => 'Valeur locale \'%s\' modifiée',
+ 'log delete i18nlocalevalues' => 'Valeur locale \'%s\' supprimée',
); // array
?>
View
18 language/fr_fr/objects.php
@@ -55,6 +55,24 @@
'private time' => 'Temps passé privé',
'private task list' => 'Liste de tâches privée',
'private comment' => 'Commentaire privé',
+
+
+ 'contact' => 'Contact',
+ 'contacts' => 'Contacts',
+ 'status update' => 'Mise à jour du statut',
+ 'status updates' => 'Mises à jour du statut',
+ 'user account' => 'Compte',
+ 'text snippet' => 'Bribe de texte',
+ 'text snippets' => 'Bribes de texte',
+ 'new company' => 'Nouvelle société',
+ 'existing company' => 'Société existante',
+ 'memo' => 'Mes notes de projet',
+ 'no folders' => 'Pas de dossier',
+ 'favorite company' => 'Société favorite',
+ 'favorite companies' => 'Société favorites',
+ 'deleted or unknown' => '***Supprimé ou inconnu***',
+ 'actions' => 'Actions',
+
); // array
?>
View
29 language/fr_fr/project_interface.php
@@ -114,6 +114,35 @@
'order by milestone' => 'Trier par Jalon',
'group by project' => 'Grouper par Projet',
+
+ 'edit project to select task list' => 'Editer les détails du projet pour sélectionner une liste de tâches',
+ 'edit project to select task' => 'Editer les détails du projet pour sélectionner une tâche',
+ 'parent project' => 'Projet parent',
+ 'subprojects' => 'Sous-projets',
+ 'can manage times' => 'Peut administrer le calendrier',
+ 'can access messages' => 'Peut accéder aux messages',
+ 'can access tasks' => 'Peut accéder aux tâches',
+ 'can access files' => 'Peut accéder aux fichiers',
+ 'can access forms' => 'Peut accéder aux formulaires',
+ 'can access contacts' => 'Peut accéder aux contacts',
+ 'can access wiki' => 'Peut accéder au wiki',
+ 'can access reports' => 'Peut accéder aux rapports',
+ 'can manage contacts' => 'Peut administrer les contacts',
+ 'can manage wiki' => 'Peut administrer le wiki',
+ 'can access search' => 'Peut accéder à la recherche',
+ 'can access tags' => 'Peut accéder aux tags',
+ 'can access comments' => 'Peut accéder aux commentaires',
+ 'project to move to' => 'Projet à déplacer %s vers',
+ 'edit project to select milestone' => 'Editer les détails du projet pour sélectionner un jalon',
+ 'users involved in project' => 'Utilkisateurs impliqués',
+ 'edit project to select message' => 'Editer les détails du projet pour sélectionner un message',
+ 'attach existing contact' => 'Attacher un contact existant (du carnet d\'adtresses)',
+ 'new contact' => 'Nouveau contact',
+ 'select contact' => 'Selectionner contact',
+ 'edit project to select contact' => 'Editer les détails du projet pour sélectionner un contact',
+ 'created on' => 'Créé',
+
+
); // array
?>
View
6 language/fr_fr/site_interface.php
@@ -126,6 +126,12 @@
'footer copy with homepage' => '&copy; %s <a href="%s">%s</a>. Tous droits réservés.',
'footer copy without homepage' => '&copy; %s %s. Tous droits réservés',
'footer powered' => 'Propulsé par <a href="%s">%s</a>',
+
+
+ 'my files' => 'Mes fichiers',
+ 'test mail recipient' => 'Destinataire de test',
+ 'application log events my projects' => 'Evènements de mes projets',
+
); // array
View
35 language/fr_fr/textile_help.php
@@ -0,0 +1,35 @@
+<?php
+
+ /**
+ * Textile help langs
+ *
+ * @version 1.0
+ * @http://www.projectpier.org/
+ */
+
+ // Return langs
+ return array(
+ 'textile help' => 'Aide sur le format Textile',
+ 'bold' => 'gras',
+ 'italic' => 'italique',
+ 'emphasis' => 'emphase',
+ 'code' => 'code',
+ 'unordered list' => 'liste désordonnée',
+ 'ordered list' => 'liste ordonnée',
+ 'link name' => 'nom du lien',
+ 'image url' => 'URL de l\'image',
+ 'header1to6' => 'Titres (h1. to h6.)',
+ 'table' => 'Table:',
+ 'deleted text' => 'texte supprimé',
+ 'inserted text' => 'texte inséré',
+ 'superscript' => 'superscript',
+ 'subscript' => 'subscript',
+ 'no textile' => '*ignore* le format Textile',
+ 'header paren' => 'Les (parentheses) inserées entre les syntaxes de bloc et les fermetures point-espace inques classes et ids:',
+ 'header curly' => 'Les {accolades} insèrent des styles CSS arbitraires',
+ 'header square' => 'Les [crochets] insèrent les attributs de language',
+ 'output is/lc' => '<b><i>La sortie sera</i></b>',
+ 'some text/lc' => 'du texte',
+ ); // array
+
+?>
View
2 language/locales.php
@@ -11,7 +11,7 @@
'es_es' => 'Spanish',
'es_mx' => 'Spanish (Mexico)',
'fi_fi' => 'Finnish (Finland)',
- 'fr_fr' => 'Finnish (Finland)',
+ 'fr_fr' => 'French (France)',
'hu_hu' => 'Hungarian (Hungary)',
'hu_if' => 'Hungarian (informal)',
'is_is' => 'Islenska (Iceland)',
View
6 language/nl_nl/general.php
@@ -2,9 +2,9 @@
// Return array of langs
return array(
- 'pdf' => 'Exporteer naar pdf' //new
- 'shown/lc' => 'zoekresultaten gevonden' //new
- 'assigned to' => 'Toegewezen aan'
+ 'pdf' => 'Exporteer naar pdf', //new
+ 'shown/lc' => 'zoekresultaten gevonden', //new
+ 'assigned to' => 'Toegewezen aan',
'show route' => 'Toon wegbeschrijving',
'reserve parking space' => 'Reserveer parkeerplaats',
'display name' => 'Schermnaam',
View
953 library/textile/Textile.class.php
@@ -9,8 +9,8 @@
*/
/*
-$HeadURL: http://svn.textpattern.com/releases/4.0.6/source/textpattern/lib/classTextile.php $
-$LastChangedRevision: 2779 $
+$HeadURL: https://textpattern.googlecode.com/svn/releases/4.4.1/source/textpattern/lib/classTextile.php $
+$LastChangedRevision: 3566 $
*/
/*
@@ -20,7 +20,7 @@
A Humane Web Text Generator
-Version 2.0
+Version 2.2
Copyright (c) 2003-2004, Dean Allen <dean@textism.com>
All rights reserved.
@@ -89,6 +89,12 @@
Consecutive paragraphs beginning with * are wrapped in unordered list tags.
Example: <ul><li>unordered list</li></ul>
+ Definition list:
+ Terms ;, ;;
+ Definitions :, ::
+ Consecutive paragraphs beginning with ; or : are wrapped in definition list tags.
+ Example: <dl><dt>term</dt><dd>definition</dd></dl>
+
Phrase modifier syntax:
_emphasis_ -> <em>emphasis</em>
@@ -107,29 +113,144 @@
"linktext":url -> <a href="url">linktext</a>
"linktext(title)":url -> <a href="url" title="title">linktext</a>
+ "$":url -> <a href="url">url</a>
+ "$(title)":url -> <a href="url" title="title">url</a>
!imageurl! -> <img src="imageurl" />
- !imageurl(alt text)! -> <img src="imageurl" alt="alt text" />
+ !imageurl(alt text)! -> <img src="imageurl" alt="alt text" />
!imageurl!:linkurl -> <a href="linkurl"><img src="imageurl" /></a>
ABC(Always Be Closing) -> <acronym title="Always Be Closing">ABC</acronym>
+Linked Notes:
+============
+
+ Allows the generation of an automated list of notes with links.
+
+ Linked notes are composed of three parts, a set of named _definitions_, a set of
+ _references_ to those definitions and one or more _placeholders_ indicating where
+ the consolidated list of notes is to be placed in your document.
+
+ Definitions.
+ -----------
+
+ Each note definition must occur in its own paragraph and should look like this...
+
+ note#mynotelabel. Your definition text here.
+
+ You are free to use whatever label you wish after the # as long as it is made up
+ of letters, numbers, colon(:) or dash(-).
+
+ References.
+ ----------
+
+ Each note reference is marked in your text like this[#mynotelabel] and
+ it will be replaced with a superscript reference that links into the list of
+ note definitions.
+
+ List Placeholder(s).
+ -------------------
+
+ The note list can go anywhere in your document. You have to indicate where
+ like this...
+
+ notelist.
+