View Issue Details

IDProjectCategoryView StatusLast Update
1133RackTablesdefaultpublic2014-01-18 20:47
Reporterblaza-pl Assigned Toadoom42  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version0.20.6 
Target Version0.20.7Fixed in Version0.20.7 
Summary1133: Add Propoerties tab to Row to allow Row to have attributes
DescriptionRow as other objects should also have attributes and allow users to modify them.
TagsNo tags attached.
Attached Files
row-attributes_interface.php.patch (6,645 bytes)   
--- inc/interface.php	2013-06-06 12:25:49.249182131 +0200
+++ inc/interface.php	2013-06-12 12:34:27.565135511 +0200
@@ -614,22 +614,34 @@
 	$rowInfo = getRowInfo ($row_id);
 	$cellfilter = getCellFilter();
 	$rackList = filterCellList (listCells ('rack', $row_id), $cellfilter['expression']);
+
+	$summary = array();
+       $summary['Name'] = $rowInfo['name'];
+       if ($rowInfo['location_id'])
+                $summary['Location'] = mkA ($rowInfo['location'], 'location', $rowInfo['location_id']);
+       $summary['Racks'] = $rowInfo['count'];
+       $summary['Units'] = $rowInfo['sum'];
+       $summary['% used'] = getProgressBar(getRSUforRow($rackList));
+	foreach (getAttrValues ($row_id) as $record)
+	{
+		if($record['type'] == "hyperlink" )
+	        {
+			preg_match('@^(?:http[s]*://)?([^/]+)@i',$record['value'], $matches);
+			$record['href'] = $record['value'];
+			$record['a_value'] = $matches[1];
+	        }
+	
+		if(strlen ($record['value']) and permitted (NULL, NULL, NULL, array (array ('tag' => '$attr_' . $record['id']))))
+			$summary['{sticker}' . $record['name']] = formatAttributeValue ($record);
+	}
+
 	// Main layout starts.
 	echo "<table border=0 class=objectview cellspacing=0 cellpadding=0>";
-
 	// Left portlet with row information.
 	echo "<tr><td class=pcleft>";
-	startPortlet ($rowInfo['name']);
-	echo "<table border=0 cellspacing=0 cellpadding=3 width='100%'>\n";
-	if ($rowInfo['location_id'])
-		echo "<tr><th width='50%' class=tdright>Location:</th><td class=tdleft>".mkA ($rowInfo['location'], 'location', $rowInfo['location_id'])."</td></tr>\n";
-	echo "<tr><th width='50%' class=tdright>Racks:</th><td class=tdleft>${rowInfo['count']}</td></tr>\n";
-	echo "<tr><th width='50%' class=tdright>Units:</th><td class=tdleft>${rowInfo['sum']}</td></tr>\n";
-	echo "<tr><th width='50%' class=tdright>% used:</th><td class=tdleft>";
-	renderProgressBar (getRSUforRow ($rackList));
-	echo "</td></tr>\n";
-	echo "</table><br>\n";
-	finishPortlet();
+
+	renderEntitySummary($rowInfo,'Summary',$summary);
+	
 	renderCellFilterPortlet ($cellfilter, 'rack', $rackList, array ('row_id' => $row_id));
 
 	renderFilesPortlet ('row',$row_id);
@@ -665,6 +677,96 @@
 	echo "</td></tr></table>";
 }
 
+//Row Properties edit form
+function renderRowEditForm($row_id)
+{
+	global $pageno;
+        $row = getRowInfo ($row_id);
+        amplifyCell ($row);
+
+        startPortlet ('Attributes');
+        printOpFormIntro ('updateRow');
+        echo '<table border=0 align=center>';
+        echo "<tr><td>&nbsp;</td><th class=tdright>Location:</th><td class=tdleft>";
+        $locations = array ();
+        $locations[0] = '-- NOT SET --';
+        foreach (listCells ('location') as $id => $locationInfo)
+                $locations[$id] = $locationInfo['name'];
+        natcasesort($locations);
+        printSelect ($locations, array ('name' => 'location_id'), $row['location_id']);
+        echo "</td></tr>\n";
+        echo "<tr><td>&nbsp;</td><th class=tdright>Name (required):</th><td class=tdleft><input type=text name=name value='${row['name']}'></td></tr>
+\n";
+        // optional attributes
+        $values = getAttrValues ($row_id);
+        $num_attrs = count($values);
+        echo "<input type=hidden name=num_attrs value=${num_attrs}>\n";
+        $i = 0;
+        foreach ($values as $record)
+        {
+                echo "<input type=hidden name=${i}_attr_id value=${record['id']}>";
+                echo '<tr><td>';
+                if (strlen ($record['value']))
+                {
+                        echo "<a href='".makeHrefProcess(array('op'=>'clearSticker', 'attr_id'=>$record['id']))."'" .
+                                " onclick=\"javascript:return confirm('Are you sure you want to clear attribute value?')\">";
+                        printImageHREF ('clear', 'Clear value');
+                        echo '</a>';
+                }
+                else
+                        echo '&nbsp;';
+                echo '</td>';
+                echo "<th class=sticker>${record['name']}:</th><td class=tdleft>";
+                switch ($record['type'])
+                {
+                        case 'uint':
+                        case 'float':
+                        case 'string':
+                        case 'hyperlink':
+                                echo "<input type=text name=${i}_value value='${record['value']}'>";
+                                break;
+                        case 'dict':
+                                $chapter = readChapter ($record['chapter_id'], 'o');
+                                $chapter[0] = '-- NOT SET --';
+                                $chapter = cookOptgroups ($chapter, 1562, $record['key']);
+                                printNiftySelect ($chapter, array ('name' => "${i}_value"), $record['key']);
+                                break;
+                }
+                echo "</td></tr>\n";
+                $i++;
+        }
+        
+        /*
+        echo "<tr><td>&nbsp;</td><th class=tdright>Has problems:</th><td class=tdleft><input type=checkbox name=has_problems";
+        if ($row['has_problems'] == 'yes')
+                echo ' checked';
+        echo "></td></tr>\n";
+        */
+
+        echo "<tr><td>&nbsp;</td><th class=tdright>Actions:</th><td class=tdleft>";
+        if ($row['count'])
+		printImageHREF ('nodestroy', "${row['count']} rack(s) here");
+	else
+	{
+		echo "<a href=\"" . makeHrefProcess(array('op'=>'deleteRow', 'row_id'=>$row_id)) . "\">";
+        	printImageHREF ('destroy', 'Delete row');
+                echo "</a>";
+        }
+        echo "&nbsp;</td></tr>\n";
+
+	
+        //echo "<tr><td colspan=3><b>Comment:</b><br><textarea name=comment rows=10 cols=80>${row['comment']}</textarea></td></tr>";
+        echo "<tr><td class=submit colspan=3>";
+        printImageHREF ('SAVE', 'Save changes', TRUE);
+        echo "</td></tr>\n";
+        echo '</form></table><br>';
+        finishPortlet();
+
+        startPortlet ('History');
+        renderObjectHistory ($row_id);
+        finishPortlet();
+}
+
 // Used by renderRack()
 function printObjectDetailsForRenderRack ($object_id)
 {
@@ -4260,7 +4362,6 @@
 		printImageHREF ('add', '', TRUE);
 		echo ' ';
 		$objtypes = readChapter (CHAP_OBJTYPE, 'o');
-		unset ($objtypes[1561]); // attributes may not be assigned to rows yet
 		printNiftySelect (cookOptgroups ($objtypes), array ('name' => 'objtype_id', 'tabindex' => 101));
 		echo ' <select name=chapter_no tabindex=102><option value=0>-- dictionary chapter for [D] attributes --</option>';
 		foreach (getChapterList() as $chapter)
row-attributes_navigation.php.patch (1,127 bytes)   
--- ../racktables-prod/inc/navigation.php	2013-04-30 11:43:31.985196298 +0200
+++ inc/navigation.php	2013-06-12 12:06:13.061232457 +0200
@@ -100,11 +100,13 @@
 $page['row']['bypass_type'] = 'uint';
 $page['row']['parent'] = 'rackspace';
 $tab['row']['default'] = 'View';
+$tab['row']['edit'] = 'Properties';
 $tab['row']['editracks'] = 'Manage racks';
 $tab['row']['newrack'] = 'Add new rack';
 $tab['row']['tagroller'] = 'Tag roller';
 $tab['row']['files'] = 'Files';
 $tabhandler['row']['default'] = 'renderRow';
+$tabhandler['row']['edit'] = 'renderRowEditForm';
 $tabhandler['row']['editracks'] = 'renderRackSortForm';
 $tabhandler['row']['newrack'] = 'renderNewRackForm';
 $tabhandler['row']['tagroller'] = 'renderTagRollerForRow';
@@ -114,6 +116,8 @@
 $ophandler['row']['files']['addFile'] = 'addFileToEntity';
 $ophandler['row']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['row']['files']['unlinkFile'] = 'unlinkFile';
+$ophandler['row']['edit']['deleteRow'] = 'deleteRow';
+$ophandler['row']['edit']['updateRow'] = 'updateRow';
 
 $page['rack']['bypass'] = 'rack_id';
 $page['rack']['bypass_type'] = 'uint';
row-attributes_ophandlers.php.patch (678 bytes)   
--- ../racktables-prod/inc/ophandlers.php	2013-06-11 15:01:30.997198478 +0200
+++ inc/ophandlers.php	2013-06-12 12:05:39.305303818 +0200
@@ -1921,10 +1921,18 @@
 $msgcode['updateRow']['OK'] = 6;
 function updateRow ()
 {
+	global $pageno;
+	
 	assertUIntArg ('row_id');
 	assertUIntArg ('location_id', TRUE);
 	assertStringArg ('name');
 
+	if ($pageno = 'row')
+        {
+	        commitUpdateObject ($_REQUEST['row_id'], $_REQUEST['name'], NULL, NULL, NULL, NULL);
+	        updateObjectAttributes ($_REQUEST['row_id']);
+	}
+	else
 	commitUpdateObject ($_REQUEST['row_id'], $_REQUEST['name'], NULL, NULL, NULL, NULL);
 
 	$rowData = spotEntity ('row', $_REQUEST['row_id']);

Activities

adoom42

adoom42

2014-01-18 20:47

administrator   ~0002083

Thanks for the patch. I excluded code related to 'hyperlink' attributes as those don't exist in the mainstream distro.

Issue History

Date Modified Username Field Change
2014-01-10 11:48 blaza-pl New Issue
2014-01-10 11:48 blaza-pl File Added: row-attributes_interface.php.patch
2014-01-10 11:49 blaza-pl File Added: row-attributes_navigation.php.patch
2014-01-10 11:49 blaza-pl File Added: row-attributes_ophandlers.php.patch
2014-01-18 20:47 adoom42 Note Added: 0002083
2014-01-18 20:47 adoom42 Assigned To => adoom42
2014-01-18 20:47 adoom42 Status new => closed
2014-01-18 20:47 adoom42 Resolution open => fixed
2014-01-18 20:47 adoom42 Fixed in Version => 0.20.7
2014-01-18 20:47 adoom42 Target Version => 0.20.7