Add support for application-wide notes
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -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()");
|
||||||
|
|
||||||
@@ -150,10 +156,19 @@ class Note {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function SendNotificationMail($sAction="add",$sMsg=null)
|
function SendNotificationMail($sAction="add",$sMsg=null)
|
||||||
|
{
|
||||||
|
if(!$this->iAppId)
|
||||||
{
|
{
|
||||||
$oVersion = new version($this->iVersionId);
|
$oVersion = new version($this->iVersionId);
|
||||||
$sAppName = version::fullName($this->iVersionId);
|
$sAppName = version::fullName($this->iVersionId);
|
||||||
$sMsg .= $oVersion->objectMakeUrl()."\n";
|
$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":
|
||||||
@@ -218,7 +233,14 @@ class Note {
|
|||||||
$sClass = 'defaultnote';
|
$sClass = 'defaultnote';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!$aVars || !getInput('shReturnTo', $aVars))
|
||||||
|
{
|
||||||
$oVersion = new version($this->iVersionId);
|
$oVersion = new version($this->iVersionId);
|
||||||
|
$shReturnTo = $oVersion->objectMakeUrl();
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
$shReturnTo = $aVars['shReturnTo'];
|
||||||
|
}
|
||||||
|
|
||||||
$shOutput = html_frame_start("","98%",'',0);
|
$shOutput = html_frame_start("","98%",'',0);
|
||||||
|
|
||||||
@@ -231,7 +253,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&sAction=edit&iId=".$this->iNoteId."&sReturnTo=".urlencode($oVersion->objectMakeUrl())."\">";
|
$shOutput .= "<form method=\"post\" name=\"message\" action=\"objectManager.php?sClass=note&sAction=edit&iId=".$this->iNoteId."&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>';
|
||||||
}
|
}
|
||||||
@@ -242,6 +264,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)
|
||||||
@@ -250,7 +303,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;
|
||||||
@@ -264,6 +317,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'];
|
||||||
}
|
}
|
||||||
@@ -275,7 +334,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.'">';
|
||||||
|
if(!$this->iAppId)
|
||||||
echo '<input type="hidden" name="iVersionId" value="'.$this->iVersionId.'">';
|
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";
|
||||||
@@ -284,6 +345,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();
|
||||||
@@ -294,7 +363,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'];
|
||||||
}
|
}
|
||||||
@@ -418,16 +488,11 @@ class Note {
|
|||||||
function canEdit()
|
function canEdit()
|
||||||
{
|
{
|
||||||
if($_SESSION['current']->hasPriv("admin"))
|
if($_SESSION['current']->hasPriv("admin"))
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
} else if($this->iVersionId)
|
else if($this->iVersionId && !$this->iAppId)
|
||||||
{
|
return maintainer::isUserMaintainer($_SESSION['current'], $this->iVersionId);
|
||||||
if(maintainer::isUserMaintainer($_SESSION['current'],
|
else if($this->iAppId)
|
||||||
$this->iVersionId))
|
return maintainer::isUserSuperMaintainer($_SESSION['current'], $this->iAppId);
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1179,15 +1179,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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user