Add support for application-wide notes & how-tos

This commit is contained in:
Alexander Nicolaysen Sørnes
2009-07-21 03:09:48 +02:00
committed by Alexander Nicolaysen Sørnes
parent 9ed113f6dc
commit e546738913
7 changed files with 139 additions and 30 deletions

View File

@@ -835,6 +835,9 @@ class Application {
if($_SESSION['current']->isSuperMaintainer($this->iAppId) || $_SESSION['current']->hasPriv("admin")) if($_SESSION['current']->isSuperMaintainer($this->iAppId) || $_SESSION['current']->hasPriv("admin"))
{ {
echo ' <form method="post" name="sEdit" action="admin/editAppFamily.php"><input type="hidden" name="iAppId" value="'.$this->iAppId.'"><input type="submit" value="Edit Application" class="button"></form>'; echo ' <form method="post" name="sEdit" action="admin/editAppFamily.php"><input type="hidden" name="iAppId" value="'.$this->iAppId.'"><input type="submit" value="Edit Application" class="button"></form>';
echo '<form method="post" action="objectManager.php?sClass=note&sAction=add&sTitle=Add+note&iAppId='.$this->iAppId.'&sNoteTitle=HOWTO&sReturnTo='.urlencode($this->objectMakeUrl()).'">';
echo '<input type="submit" value="Add note / how-to" />';
echo '</form>';
} }
if($_SESSION['current']->isLoggedIn()) if($_SESSION['current']->isLoggedIn())
{ {
@@ -877,6 +880,8 @@ class Application {
// display bundle // display bundle
$this->displayBundle(); $this->displayBundle();
note::displayNotesForEntry(null, $this->iAppId);
} }
public static function lookup_name($appId) public static function lookup_name($appId)

View File

@@ -288,4 +288,21 @@ function html_note($shTitle, $shBody)
return $shRet; return $shRet;
} }
function html_radiobuttons($aIds, $aOptions, $sName, $sDefault = '')
{
$shRet = '';
for($i = 0; $i < sizeof($aIds); $i++)
{
if($aIds[$i] == $sDefault)
$shChecked = ' checked="checked"';
else
$shChecked = '';
$shRet .= '<input type="radio" name="'.$sName.'" value="'.$aIds[$i]."\"$shChecked> " . $aOptions[$i].'<br />';
}
return $shRet;
}
?> ?>

View File

@@ -7,12 +7,17 @@ require_once(BASE."include/version.php");
/************************************/ /************************************/
define('APPNOTE_SHOW_FOR_ALL', -1);
define('APPNOTE_SHOW_FOR_VERSIONS', -2);
define('APPNOTE_SHOW_FOR_APP', -3);
/** /**
* Note class for handling notes * Note class for handling notes
*/ */
class Note { class Note {
var $iNoteId; var $iNoteId;
var $iVersionId; var $iVersionId;
var $iAppId;
var $sTitle; var $sTitle;
var $shDescription; var $shDescription;
var $iSubmitterId; var $iSubmitterId;
@@ -38,6 +43,7 @@ class Note {
{ {
$this->iNoteId = $oRow->noteId; $this->iNoteId = $oRow->noteId;
$this->iVersionId = $oRow->versionId; $this->iVersionId = $oRow->versionId;
$this->iAppId = $oRow->appId;
$this->sTitle = $oRow->noteTitle; $this->sTitle = $oRow->noteTitle;
$this->shDescription = $oRow->noteDesc; $this->shDescription = $oRow->noteDesc;
$this->sSubmitTime = $oRow->submitTime; $this->sSubmitTime = $oRow->submitTime;
@@ -54,11 +60,11 @@ class Note {
function create() function create()
{ {
$hResult = query_parameters("INSERT INTO appNotes (versionId, ". $hResult = query_parameters("INSERT INTO appNotes (versionId, ".
"noteTitle, noteDesc, submitterId, ". "appId, noteTitle, noteDesc, submitterId, ".
"submitTime) ". "submitTime) ".
"VALUES('?', '?', '?', '?', ?)", "VALUES('?', '?', '?', '?', '?', ?)",
$this->iVersionId, $this->sTitle, $this->iVersionId, $this->iAppId,
$this->shDescription, $this->sTitle, $this->shDescription,
$_SESSION['current']->iUserId, $_SESSION['current']->iUserId,
"NOW()"); "NOW()");
@@ -152,9 +158,18 @@ class Note {
function SendNotificationMail($sAction="add",$sMsg=null) function SendNotificationMail($sAction="add",$sMsg=null)
{ {
$oVersion = new version($this->iVersionId); if(!$this->iAppId)
$sAppName = version::fullName($this->iVersionId); {
$sMsg .= $oVersion->objectMakeUrl()."\n"; $oVersion = new version($this->iVersionId);
$sAppName = version::fullName($this->iVersionId);
$sMsg .= $oVersion->objectMakeUrl()."\n";
} else
{
$oApp = new application($this->iAppId);
$sAppName = $oApp->sName;
$sMsg .= $oApp->objectMakeUrl()."\n";
}
switch($sAction) switch($sAction)
{ {
case "add": case "add":
@@ -219,7 +234,14 @@ class Note {
$sClass = 'defaultnote'; $sClass = 'defaultnote';
} }
$oVersion = new version($this->iVersionId); if(!$aVars || !getInput('shReturnTo', $aVars))
{
$oVersion = new version($this->iVersionId);
$shReturnTo = $oVersion->objectMakeUrl();
} else
{
$shReturnTo = $aVars['shReturnTo'];
}
$shOutput = html_frame_start("","98%",'',0); $shOutput = html_frame_start("","98%",'',0);
@@ -232,7 +254,7 @@ class Note {
if((!$aVars || $aVars['bEditing'] != "true") && $this->canEdit()) if((!$aVars || $aVars['bEditing'] != "true") && $this->canEdit())
{ {
$shOutput .= "<tr class=\"color1\" align=\"center\" valign=\"top\"><td>"; $shOutput .= "<tr class=\"color1\" align=\"center\" valign=\"top\"><td>";
$shOutput .= "<form method=\"post\" name=\"message\" action=\"objectManager.php?sClass=note&amp;sAction=edit&amp;iId=".$this->iNoteId."&amp;sReturnTo=".urlencode($oVersion->objectMakeUrl())."\">"; $shOutput .= "<form method=\"post\" name=\"message\" action=\"objectManager.php?sClass=note&amp;sAction=edit&amp;iId=".$this->iNoteId."&amp;sReturnTo=".urlencode($shReturnTo)."\">";
$shOutput .= '<input type="submit" value="Edit Note" class="button">'; $shOutput .= '<input type="submit" value="Edit Note" class="button">';
$shOutput .= '</form></td></tr>'; $shOutput .= '</form></td></tr>';
} }
@@ -243,6 +265,37 @@ class Note {
echo $shOutput; echo $shOutput;
} }
function displayNotesForEntry($iVersionId, $iAppId = null)
{
if($iVersionId)
{
$oVersion = new version($iVersionId);
$oApp = $oVersion->objectGetParent();
$hResult = query_parameters("SELECT noteId FROM appNotes WHERE versionId = '?' OR (appId = '?' AND (versionId = '?' OR versionId = '?'))", $iVersionId, $oApp->objectGetId(), APPNOTE_SHOW_FOR_ALL, APPNOTE_SHOW_FOR_VERSIONS);
} else if($iAppId)
{
$hResult = query_parameters("SELECT noteId FROM appNotes WHERE appId = '?' AND versionId = '?' OR versionId = '?'", $iAppId, APPNOTE_SHOW_FOR_ALL, APPNOTE_SHOW_FOR_APP);
}
if(!$hResult)
return;
if($iVersionId)
$oVersion = new version($iVersionId);
else
$oApp = new application($iAppId);
while($oRow = mysql_fetch_object($hResult))
{
$oNote = new note($oRow->noteId);
$shReturnTo = $iVersionId ? $oVersion->objectMakeUrl() : $oApp->objectMakeUrl();
$aVars = array('shReturnTo' => $shReturnTo, 'bEditing' => 'false');
$oNote->display($aVars);
}
}
function objectGetCustomVars($sAction) function objectGetCustomVars($sAction)
{ {
switch($sAction) switch($sAction)
@@ -251,7 +304,7 @@ class Note {
return array("bEditing"); return array("bEditing");
case "add": case "add":
return array("iVersionId","sNoteTitle"); return array('iVersionId','iAppId','sNoteTitle');
default: default:
return null; return null;
@@ -265,6 +318,12 @@ class Note {
if(!$this->iVersionId) if(!$this->iVersionId)
$this->iVersionId = $aValues['iVersionId']; $this->iVersionId = $aValues['iVersionId'];
if(!$this->iAppId)
$this->iAppId = getInput('iAppId', $aValues);
if($this->iAppId && !$this->iVersionId)
$this->iVersionId = APPNOTE_SHOW_FOR_ALL;
if(!$this->sTitle) if(!$this->sTitle)
$this->sTitle = $aValues['sNoteTitle']; $this->sTitle = $aValues['sNoteTitle'];
} }
@@ -276,7 +335,9 @@ class Note {
echo '<input type="hidden" name="bEditing" value="true">'; echo '<input type="hidden" name="bEditing" value="true">';
echo '<input type="hidden" name="iNoteId" value="'.$this->iNoteId.'">'; echo '<input type="hidden" name="iNoteId" value="'.$this->iNoteId.'">';
echo '<input type="hidden" name="iVersionId" value="'.$this->iVersionId.'">'; if(!$this->iAppId)
echo '<input type="hidden" name="iVersionId" value="'.$this->iVersionId.'">';
echo '<input type="hidden" name="iAppId" value="'.$this->iAppId.'">';
echo '<tr><td class=color1>Title</td>'."\n"; echo '<tr><td class=color1>Title</td>'."\n";
echo ' <td class=color0><input size=80% type="text" name="sNoteTitle" type="text" value="'.$this->sTitle.'"></td></tr>',"\n"; echo ' <td class=color0><input size=80% type="text" name="sNoteTitle" type="text" value="'.$this->sTitle.'"></td></tr>',"\n";
@@ -285,6 +346,14 @@ class Note {
echo '<textarea cols="80" rows="20" id="editor" name="shNoteDesc">'.$this->shDescription.'</textarea>',"\n"; echo '<textarea cols="80" rows="20" id="editor" name="shNoteDesc">'.$this->shDescription.'</textarea>',"\n";
echo '</p>'; echo '</p>';
echo '</td></tr>'."\n"; echo '</td></tr>'."\n";
if($this->iAppId)
{
$aIds = array(APPNOTE_SHOW_FOR_ALL, APPNOTE_SHOW_FOR_VERSIONS, APPNOTE_SHOW_FOR_APP);
$aOptions = array('Show on both application and version pages', 'Show on version pages only', 'Show on application page only');
echo '<tr><td class="color1">Display mode</td>'."\n";
echo '<td class="color0">'.html_radiobuttons($aIds, $aOptions, 'iVersionId', $this->iVersionId);
echo '</td></tr>';
}
echo '<tr><td colspan="2" align="center" class="color3">',"\n"; echo '<tr><td colspan="2" align="center" class="color3">',"\n";
echo html_table_end(); echo html_table_end();
@@ -295,7 +364,8 @@ class Note {
/* $aValues can be $_REQUEST or any array with the values from outputEditor() */ /* $aValues can be $_REQUEST or any array with the values from outputEditor() */
function GetOutputEditorValues($aValues) function GetOutputEditorValues($aValues)
{ {
$this->iVersionId = $aValues['iVersionId']; $this->iVersionId = getInput('iVersionId', $aValues);
$this->iAppId = getInput('iAppId', $aValues);
$this->sTitle = $aValues['sNoteTitle']; $this->sTitle = $aValues['sNoteTitle'];
$this->shDescription = $aValues['shNoteDesc']; $this->shDescription = $aValues['shNoteDesc'];
} }
@@ -403,16 +473,11 @@ class Note {
function canEdit() function canEdit()
{ {
if($_SESSION['current']->hasPriv("admin")) if($_SESSION['current']->hasPriv("admin"))
{
return true;
} else if($this->iVersionId)
{
if(maintainer::isUserMaintainer($_SESSION['current'],
$this->iVersionId))
{
return true; return true;
} else if($this->iVersionId && !$this->iAppId)
} return maintainer::isUserMaintainer($_SESSION['current'], $this->iVersionId);
else if($this->iAppId)
return maintainer::isUserSuperMaintainer($_SESSION['current'], $this->iAppId);
return false; return false;
} }

View File

@@ -1171,15 +1171,7 @@ class version {
view_version_bugs($this->iVersionId, $this->get_buglink_ids()); view_version_bugs($this->iVersionId, $this->get_buglink_ids());
/* display the notes for the application */ echo note::displayNotesForEntry($this->iVersionId);
$hNotes = query_parameters("SELECT noteId FROM appNotes WHERE versionId = '?'",
$this->iVersionId);
while( $oRow = query_fetch_object($hNotes) )
{
$oNote = new Note($oRow->noteId);
$oNote->display();
}
// Comments Section // Comments Section
if($this->iVersionId) if($this->iVersionId)

1
runonce Executable file
View File

@@ -0,0 +1 @@
1

28
runonce.php Normal file
View File

@@ -0,0 +1,28 @@
<?php
require_once('path.php');
require_once(BASE.'include/incl.php');
$hFile = fopen('runonce', 'r');
if(filesize('runonce') && fread($hFile, filesize('runonce')) == '1')
{
fclose($hFile);
echo "The command has already been run";
exit;
}
fclose($hFile);
$hResult = mysql_query("ALTER TABLE appNotes ADD appId int not null AFTER versionId");
if($hResult)
echo "The command was executed successfully";
else
echo "The command failed, error was: " . mysql_error();
$hFile = fopen('runonce', 'w');
fwrite($hFile, '1');
fclose($hFile);
?>

View File

@@ -167,6 +167,7 @@ create table appNotes (
noteTitle varchar(255), noteTitle varchar(255),
noteDesc text, noteDesc text,
versionId int not null, versionId int not null,
appId int not null,
submitterId int not null, submitterId int not null,
submitTime datetime not null, submitTime datetime not null,
key(noteId) key(noteId)