allow Rows to have attributes (#1133)
authorAaron Dummer <aaron@dummer.info>
Sat, 18 Jan 2014 19:44:32 +0000 (11:44 -0800)
committerAaron Dummer <aaron@dummer.info>
Sat, 18 Jan 2014 19:44:32 +0000 (11:44 -0800)
renderRow: display attributes
renderEditRowForm: new function
renderEditAttrMapForm: stop excluding Rows
updateRow: update attributes

ChangeLog
wwwroot/inc/interface.php
wwwroot/inc/navigation.php
wwwroot/inc/ophandlers.php

index f630705d228c462f522f2dec4599b9d79d3aef0c..12a36fe8310c87952d6f73f09dcc7df41064cd19 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,7 @@
        update: include OEM S/N 1 in expirations report (by Matthew Castanien)
        update: display a datetime format hint for date attributes (#1051)
        update: display location tree in object breadcrumbs (#1125)
+       update: allow rows to have properties (#1133)
        update: objects with problems colored red on browse objects page (#1137)
        update: use suggest-menu for tag assignment
        update: show tag trace in tag title
index a3072f0ce28c5230c03621f4a013d3dd904ad5d1..2572d6c4057100a50cfe551752fed657ff160b6c 100644 (file)
@@ -630,24 +630,29 @@ function renderRow ($row_id)
        $rowInfo = getRowInfo ($row_id);
        $cellfilter = getCellFilter();
        $rackList = applyCellFilter ('rack', $cellfilter, $row_id);
+
+       $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['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);
        echo "</td><td class=pcright>";
 
@@ -681,6 +686,72 @@ function renderRow ($row_id)
        echo "</td></tr></table>";
 }
 
+function renderEditRowForm ($row_id)
+{
+       $row = getRowInfo ($row_id);
+
+       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 getOpLink (array('op'=>'clearSticker', 'attr_id'=>$record['id']), '', 'clear', 'Clear value', 'need-confirmation');
+        else
+                       echo '&nbsp;';
+               echo '</td>';
+               echo "<th class=sticker>${record['name']}:</th><td class=tdleft>";
+               switch ($record['type'])
+               {
+                       case 'uint':
+                       case 'float':
+                       case 'string':
+                               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++;
+       }
+       if ($row['count'] == 0)
+       {
+               echo '<tr><td>&nbsp;</td><th class=tdright>Actions:</th><td class=tdleft>';
+               echo getOpLink (array ('op'=>'deleteRow'), '', 'destroy', 'Delete row', 'need-confirmation');
+               echo "&nbsp;</td></tr>\n";
+       }
+       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, $hl_obj_id = 0)
 {
@@ -4283,7 +4354,6 @@ function renderEditAttrMapForm ()
                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)
index 854d5f4dac31e8c634fe67382dab31606f9a45dd..4592a7dfc99c6117a8af40cf64a417aadb09671f 100644 (file)
@@ -100,17 +100,22 @@ $page['row']['bypass'] = 'row_id';
 $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'] = 'renderEditRowForm';
 $tabhandler['row']['editracks'] = 'renderRackSortForm';
 $tabhandler['row']['newrack'] = 'renderNewRackForm';
 $tabhandler['row']['tagroller'] = 'renderTagRollerForRow';
 $tabhandler['row']['files'] = 'renderFilesForEntity';
-$ophandler['row']['tagroller']['rollTags'] = 'rollTags';
+$ophandler['row']['edit']['clearSticker'] = 'clearSticker';
+$ophandler['row']['edit']['deleteRow'] = 'deleteRow';
+$ophandler['row']['edit']['updateRow'] = 'updateRow';
 $ophandler['row']['newrack']['addRack'] = 'addRack';
+$ophandler['row']['tagroller']['rollTags'] = 'rollTags';
 $ophandler['row']['files']['addFile'] = 'addFileToEntity';
 $ophandler['row']['files']['linkFile'] = 'linkFileToEntity';
 $ophandler['row']['files']['unlinkFile'] = 'unlinkFile';
index 705c3c84f29c45cfb1ba01e22e10b7267b687125..375b07bfaaa4db780ef1c3495fcc587bd67b8bfd 100644 (file)
@@ -2198,6 +2198,9 @@ function addRow ()
 }
 
 $msgcode['updateRow']['OK'] = 6;
+// This function is used by two forms:
+//  - renderEditRowForm - all attributes may be modified
+//  - renderRackspaceRowEditor - only the name and location may be modified
 function updateRow ()
 {
        assertUIntArg ('row_id');
@@ -2206,6 +2209,10 @@ function updateRow ()
 
        commitUpdateObject ($_REQUEST['row_id'], $_REQUEST['name'], NULL, NULL, NULL, NULL);
 
+       global $pageno;
+       if ($pageno == 'row')
+               updateObjectAttributes ($_REQUEST['row_id']);
+
        $rowData = spotEntity ('row', $_REQUEST['row_id']);
 
        // location_id was submitted, but no link exists - create it