slice page complete
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Fri, 13 Mar 2009 15:32:48 +0000 (15:32 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Fri, 13 Mar 2009 15:32:48 +0000 (15:32 +0000)
planetlab/common/actions.php
planetlab/css/my_slice.css [new file with mode: 0644]
planetlab/css/plc_style.css
planetlab/includes/plc_peers.php
planetlab/slices/slice.php
planetlab/slices/slices.php
plekit/niftycorner/nifty_init.js
plekit/niftycorner/niftycube.js

index 6105b1b..2683847 100644 (file)
@@ -494,7 +494,7 @@ switch ($action) {
      drupal_set_message ("Deleted $counter person(s)");
    else
      drupal_set_error ("Could not delete all selected persons, only $counter were removed");
-   plc_redirect(l_slice($slice_id) . " &show_users=true");
+   plc_redirect(l_slice($slice_id) . " &show_persons=true");
    break;
  }
 
@@ -514,7 +514,7 @@ switch ($action) {
      drupal_set_message ("Added $counter person(s)");
    else
      drupal_set_error ("Could not add all selected persons, only $counter were added");
-   plc_redirect(l_slice($slice_id) . "&show_users=true" );
+   plc_redirect(l_slice($slice_id) . "&show_persons=true" );
    break;
  }
 
diff --git a/planetlab/css/my_slice.css b/planetlab/css/my_slice.css
new file mode 100644 (file)
index 0000000..b41ee06
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ $Id: toggle.css 12435 2009-03-11 15:07:00Z thierry $
+ */
+
+/* space around various messages */
+div.my-slice-renewal {
+    margin: 30px;
+}
+
+/* internal toggles */
+div#toggle-container-my-slice-persons-current,
+div#toggle-container-my-slice-persons-add,
+div#toggle-container-my-slice-nodes-current,
+div#toggle-container-my-slice-nodes-add {
+/*    background:#fcf7ff; */
+    background: #ccffc7; 
+}
+
index 5fe3782..f0238fc 100644 (file)
@@ -1,3 +1,5 @@
+/* $Id$ */
+
 /* expanding links */
 
 .example {
@@ -37,14 +39,11 @@ body {
 .plc-warning a:visited { text-decoration: none; color:white }
 .plc-warning a:hover { text-decoration: none; color:black }
 
-.addresses { text-align: center; font-weight: bold; }
-
 /* styling the planetlab module area */
 div.block-planetlab a {
     font-weight:normal;
     font-style:italic;
 }
+/* -------------------- sites */
+.addresses { text-align: center; font-weight: bold; }
 
-div.renewal {
-    margin: 30px;
-}
index fc86830..e0e3736 100644 (file)
@@ -80,7 +80,7 @@ class Peers {
     // to set the background to grey on foreign objects
     // return true if the peer is local 
     if ( ! $peer_id ) {
-      print "<div class=\"nifty-medium plc-local\">";
+      print "<div class=\"nifty-large plc-local\">";
     } else {
       $classname=strtolower($this->classname($peer_id));
       // set two classes, one generic to all foreign, and one based on the peer's shortname for finer grain tuning
index 762d7c2..24b12da 100644 (file)
@@ -22,6 +22,11 @@ require_once 'details.php';
 require_once 'toggle.php';
 require_once 'form.php';
 
+// keep css separate for now
+drupal_set_html_head('
+<link href="/planetlab/css/my_slice.css" rel="stylesheet" type="text/css" />
+');
+
 // -------------------- admins potentially need to get full list of users
 ini_set('memory_limit','32M');
 
@@ -72,8 +77,8 @@ if (!empty($person_ids))
 // Constants
 global $DAY;           $DAY = 24*60*60;
 global $WEEK;          $WEEK = 7 * $DAY; 
-global $MAX_WEEKS;     $MAX_WEEKS= 8;                  // weeks from today
-global $GRACE_DAYS;    $GRACE_DAYS=10;                 // days for renewal promoted on top
+global $MAX_WEEKS;     $MAX_WEEKS= 8;          // weeks from today
+global $GRACE_DAYS;    $GRACE_DAYS=10;         // days for renewal promoted on top
 global $NOW;           $NOW=mktime();
 
 
@@ -95,15 +100,17 @@ function renew_area ($slice,$site,$visible) {
 
   // xxx some extra code needed to enable this area only if the slice description is OK:
   // description and url must be non void
-  $toggle=new PlekitToggle('renew',"Renew this slice",
-                          array("trigger-bubble"=>"Enter this zone if you wish to renew your slice",
-                                'start-visible'=>$visible));
+  $toggle=
+    new PlekitToggle('renew',"Renew this slice",
+                    array("trigger-bubble"=>
+                          "Enter this zone if you wish to renew your slice",
+                          'start-visible'=>$visible));
   $toggle->start();
 
   // xxx message could take roles into account
   if ($site['max_slices']<=0) {
      $message= <<< EOF
-<p class='renewal'>Slice creation and renewal have been temporarily disabled for your
+<p class='my-slice-renewal'>Slice creation and renewal have been temporarily disabled for your
 <site. This may have occurred because your site's nodes have been down
 or unreachable for several weeks, and multiple attempts to contact
 your site's PI(s) and Technical Contact(s) have all failed. If so,
@@ -141,7 +148,7 @@ Slice cannot be renewed any further into the future, try again closer to expirat
 EOF;
      } else {
       print <<< EOF
-<div class='renewal'>
+<div class='my-slice-renewal'>
 <p>You must provide a short description as well as a link to a project website before renewing it.
 Do <span class='bold'>not</span> provide bogus information; if a complaint is lodged against your slice 
 and PlanetLab Operations is unable to determine what the normal behavior of your slice is, 
@@ -167,12 +174,11 @@ EOF;
 }
 
 ////////// 
-drupal_set_title("Details for slice " . $name);
-$local_peer= ! $peer_id;
+drupal_set_title("My slice " . $name);
 
 $am_in_slice = in_array(plc_my_person_id(),$person_ids);
 
-$privileges = (plc_is_admin()  || $am_in_slice);
+$privileges = ( $local_peer && (plc_is_admin()  || $am_in_slice));
 
 $tabs=array();
 $tabs [] = tab_nodes_slice($slice_id);
@@ -209,8 +215,13 @@ if ($local_peer ) {
 
 
 //////////////////// details
-$toggle = new PlekitToggle ('slice',"Details",
-                           array('trigger-bubble'=>'Display and modify details for that slice'));
+$show_details=false;
+if (isset ($_GET['show_details'])) $show_details=$_GET['show_details'];
+$toggle = 
+  new PlekitToggle ('my-slice-details',"Details",
+                   array('trigger-bubble'=>
+                         'Display and modify details for that slice',
+                         'start-visible'=>$show_details));
 $toggle->start();
 
 $details=new PlekitDetails($privileges);
@@ -230,39 +241,51 @@ $details->th_td('Description',$slice['description'],'description',
                array('input_type'=>'textarea',
                      'width'=>50,'height'=>5));
 $details->th_td('URL',$slice['url'],'url',array('width'=>50));
+$details->tr_submit("submit","Update Slice");
 $details->th_td('Expires',$expires);
 $details->th_td('Instantiation',$slice['instantiation']);
 $details->th_td('Site',l_site_obj($site));
 // xxx show the PIs here
 //$details->th_td('PIs',...);
-$details->tr_submit("submit","Update Slice");
 $details->end();
 
 $details->form_end();
 $toggle->end();
 
-//////////////////// users
+//////////////////// persons
 $persons=$api->GetPersons(array('person_id'=>$slice['person_ids']));
-// just propose to add evryone else, regular users can see only a fraction of the db anyway
-$potential_persons=$api->GetPersons(array('~person_id'=>$slice['person_ids'],'peer_id'=>NULL),
-                                   array('email','person_id','first_name','last_name','roles'));
-$show_users=false;
-if ( $_GET['show_users']) $show_users=true;
-$toggle=new PlekitToggle ('persons',"Users",array('trigger-bubble'=>'Manage users attached to this slice','start-visible'=>$show_users));
+// just propose to add everyone else, 
+// as regular persons can see only a fraction of the db anyway
+$potential_persons=
+  $api->GetPersons(array('~person_id'=>$slice['person_ids'],'peer_id'=>NULL),
+                  array('email','person_id','first_name','last_name','roles'));
+$show_persons=false;
+if (isset ($_GET['show_persons'])) $show_persons=$_GET['show_persons'];
+$toggle=
+  new PlekitToggle ('my-slice-persons',"Users",
+                   array('trigger-bubble'=>
+                         'Manage accounts attached to this slice',
+                         'start-visible'=>$show_persons));
 $toggle->start();
 
 ////////// people currently in
+// visible:
+// hide if both current+add are included
+// so user can chose which section is of interest
+// show otherwise
+$toggle_persons = new PlekitToggle ('my-slice-persons-current',
+                                   "People currently in $name",
+                                   array('start-visible'=>!$privileges));
+$toggle_persons->start();
+
 $headers=array();
 $headers['email']='string';
 $headers['first']='string';
 $headers['last']='string';
 $headers['R']='string';
 if ($privileges) $headers[plc_delete_icon()]="none";
-// xxx caption currently broken, messes pagination
-$table=new PlekitTable('persons',$headers,'1',array(//'caption'=>'Current users',
-                                                   'search_area'=>false,
-                                                   'notes_area'=>false,
-                                                   'pagesize_area'=>false));
+$table=new PlekitTable('persons',$headers,'0',
+                      array('notes_area'=>false));
 $form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
 $form->start();
 $table->start();
@@ -278,7 +301,7 @@ if ($persons) foreach ($persons as $person) {
 // actions area
 if ($privileges) {
 
-  // remove users
+  // remove persons
   $table->tfoot_start();
 
   $table->row_start();
@@ -287,64 +310,159 @@ if ($privileges) {
   $table->row_end();
  }
 $table->end();
+$toggle_persons->end();
 
 ////////// people to add
 if ($privileges) {
-  $headers=array();
-  $headers['email']='string';
-  $headers['first']='string';
-  $headers['last']='string';
-  $headers['R']='string';
-  $headers['Add']="none";
-  // xxx caption currently broken, messes pagination
-  $options = array(//'caption'=>'Users to add',
-                  'notes_area'=>false,
-                  'search_width'=>15,
-                  'pagesize'=>8);
-  // show search for admins only as other people won't get that many names to add
-  if ( ! plc_is_admin() ) $options['search_area']=false;
-  
-  $table=new PlekitTable('add_persons',$headers,'1',$options);
-  $form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
-  $form->start();
-  $table->start();
-  if ($potential_persons) foreach ($potential_persons as $person) {
-      $table->row_start();
-      $table->cell(l_person_obj($person));
-      $table->cell($person['first_name']);
-      $table->cell($person['last_name']);
-      $table->cell(plc_vertical_table ($person['roles']));
-      $table->cell ($form->checkbox_html('person_ids[]',$person['person_id']));
-      $table->row_end();
-    }
-  // add users
+  $toggle_persons = new PlekitToggle ('my-slice-persons-add',
+                                     "People to add to $name",
+                                     array('start-visible'=>false));
+  $toggle_persons->start();
+  if ( ! $potential_persons ) {
+    // xxx improve style
+    echo "<p class='not-relevant'>No person to add</p>";
+  } else {
+    $headers=array();
+    $headers['email']='string';
+    $headers['first']='string';
+    $headers['last']='string';
+    $headers['R']='string';
+    $headers['Add']="none";
+    $options = array('notes_area'=>false,
+                    'search_width'=>15,
+                    'pagesize'=>8);
+    // show search for admins only as other people won't get that many names to add
+    if ( ! plc_is_admin() ) $options['search_area']=false;
+    
+    $table=new PlekitTable('add_persons',$headers,'0',$options);
+    $form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
+    $form->start();
+    $table->start();
+    if ($potential_persons) foreach ($potential_persons as $person) {
+       $table->row_start();
+       $table->cell(l_person_obj($person));
+       $table->cell($person['first_name']);
+       $table->cell($person['last_name']);
+       $table->cell(plc_vertical_table ($person['roles']));
+       $table->cell ($form->checkbox_html('person_ids[]',$person['person_id']));
+       $table->row_end();
+      }
+    // add users
+    $table->tfoot_start();
+    $table->row_start();
+    $table->cell($form->submit_html ("add-persons-in-slice","Add selected"),
+                $table->columns(),"right");
+    $table->row_end();
+    $table->end();
+    $form->end();
+  }
+  $toggle_persons->end();
+}
+$toggle->end();
+
+//////////////////// nodes
+// minimal list as a start
+$node_columns = array('hostname','node_id','arch');
+$nodes=$api->GetNodes(array('node_id'=>$slice['node_ids']),$node_columns);
+$potential_nodes=$api->GetNodes(array('~node_id'=>$slice['node_ids']),$node_columns);
+
+$show_nodes=true;
+if (isset ($_GET['show_nodes'])) $show_nodes=$_GET['show_nodes'];
+$toggle=new PlekitToggle ('my-slice-nodes',"Nodes",
+                         array('trigger-bubble'=>
+                               'Manage nodes attached to this slice',
+                               'start-visible'=>$show_nodes));
+$toggle->start();
+
+////////// nodes currently in
+$toggle_nodes=new PlekitToggle('my-slice-nodes-current',
+                              "Nodes currently in $name",
+                              array('start-visible'=>!$privileges));
+$toggle_nodes->start();
+
+$headers=array();
+$headers['hostname']='string';
+$headers['arch']='string';
+if ($privileges) $headers[plc_delete_icon()]="none";
+$table=new PlekitTable('nodes',$headers,'0',
+                      array('notes_area'=>false));
+$form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
+$form->start();
+$table->start();
+if ($nodes) foreach ($nodes as $node) {
+  $table->row_start();
+  $table->cell(l_node_obj($node));
+  $table->cell($node['arch']);
+  if ($privileges) $table->cell ($form->checkbox_html('node_ids[]',$node['node_id']));
+  $table->row_end();
+}
+// actions area
+if ($privileges) {
+
+  // remove nodes
   $table->tfoot_start();
-  
+
   $table->row_start();
-  $table->cell($form->submit_html ("add-persons-in-slice","Add selected"),
+  $table->cell($form->submit_html ("remove-nodes-from-slice","Remove selected"),
               $table->columns(),"right");
   $table->row_end();
  }
 $table->end();
+$toggle_nodes->end();
 
+////////// nodes to add
+if ($privileges) {
+  $toggle_nodes=new PlekitToggle('my-slice-nodes-add',
+                                "Nodes to add to $name",
+                                array('start-visible'=>false));
+  $toggle_nodes->start();
+
+  if ( ! $potential_nodes ) {
+    // xxx improve style
+    echo "<p class='not-relevant'>No node to add</p>";
+  } else {
+    $headers=array();
+    $headers['hostname']='string';
+    $headers['arch']='string';
+    $headers['Add']="none";
+    $options = array('notes_area'=>false,
+                    'search_width'=>15,
+                    'pagesize'=>20);
+    
+    $table=new PlekitTable('add_nodes',$headers,'1',$options);
+    $form=new PlekitForm(l_actions(),
+                        array('slice_id'=>$slice['slice_id']));
+    $form->start();
+    $table->start();
+    if ($potential_nodes) foreach ($potential_nodes as $node) {
+       $table->row_start();
+       $table->cell(l_node_obj($node));
+       $table->cell($node['arch']);
+       $table->cell ($form->checkbox_html('node_ids[]',$node['node_id']));
+       $table->row_end();
+      }
+    // add nodes
+    $table->tfoot_start();
+    $table->row_start();
+    $table->cell($form->submit_html ("add-nodes-in-slice","Add selected"),
+                $table->columns(),"right");
+    $table->row_end();
+    $table->end();
+    $form->end();
+  }
+  $toggle_nodes->end();
+}
 $toggle->end();
 
-//////////////////// nodes
-
 //////////////////// tags
 
 if ($local_peer ) {
   if ( ! $renew_visible) renew_area ($slice,$site,false);
  }
 
-if ($renew_visible) renew_area ($slice,$site,true);
-
 $peers->block_end($peer_id);
 
 // Print footer
 include 'plc_footer.php';
 
-return;
-
 ?>
-
index f4ebb5c..4889323 100644 (file)
@@ -104,6 +104,7 @@ if ( ! $slices ) {
 $headers = array ("Peer"=>"string",
                  "Name"=>"string",
                  "Users"=>"string",
+                 "U"=>"int",
                  "N"=>"int",
                  "Exp. d/m/y"=>"date-dmy");
 
@@ -124,6 +125,7 @@ foreach ($slices as $slice) {
   $table->cell ($peers->link($peer_id,$shortname));
   $table->cell (l_slice_obj($slice));
   $table->cell ($users);
+  $table->cell(count($slice['person_ids']));
   $table->cell (href(l_nodes_slice($slice['slice_id']),count($slice['node_ids'])));
   $table->cell ($expires);
   $table->row_end();
index 114bbb9..cdca3f6 100644 (file)
@@ -12,12 +12,18 @@ var nifty_inited = false;
 
 function nifty_init () {
   if ( nifty_inited ) return;
-  var elements=document.getElementsByClassName('nifty-medium');
-  for (var i=0; i<elements.length; i++) {
-    // somehow we catch something with an empty id
-    id = elements[i].id;
-    if (id) 
-      Nifty('div#'+id,'medium');
+  var sizes=new Array();
+  sizes[0]='small'; sizes[1]='medium'; sizes[2]='large';
+  for (x in sizes) {
+    size=sizes[x];
+    
+    var elements=document.getElementsByClassName('nifty-'+size);
+    for (var i=0; i<elements.length; i++) {
+      // use Rounded rather than Nifty
+      // the latter needs an id that some elements don't have
+      // plus, it's more efficient anyway
+      pleRounded(elements[i],size);
+    }
   }
   nifty_inited = true;
 }
index ef1e53f..14406a7 100755 (executable)
@@ -29,6 +29,7 @@ if(typeof(oldonload)=='function')
     window.onload=function(){oldonload();AddCss('/plekit/niftycorner');NiftyLoad()};\r
 else window.onload=function(){AddCss('/plekit/niftycorner');NiftyLoad()};\r
 \r
+/* xxx local change : pass a path as parameter */\r
 function AddCss(path){\r
 niftyCss=true;\r
 var l=CreateEl("link");\r
@@ -79,6 +80,34 @@ for(i=0;i<v.length;i++){
     }\r
 }\r
 \r
+/* local addition\r
+ * accept element rather than selectors */\r
+function pleRounded(element,options){\r
+var i,top="",bottom="",v=new Array();\r
+if(options!=""){\r
+    options=options.replace("left","tl bl");\r
+    options=options.replace("right","tr br");\r
+    options=options.replace("top","tr tl");\r
+    options=options.replace("bottom","br bl");\r
+    options=options.replace("transparent","alias");\r
+    if(options.find("tl")){\r
+        top="both";\r
+        if(!options.find("tr")) top="left";\r
+        }\r
+    else if(options.find("tr")) top="right";\r
+    if(options.find("bl")){\r
+        bottom="both";\r
+        if(!options.find("br")) bottom="left";\r
+        }\r
+    else if(options.find("br")) bottom="right";\r
+    }\r
+if(top=="" && bottom=="" && !options.find("none")){top="both";bottom="both";}\r
+    FixIE(element);\r
+    if(top!="") AddTop(element,top,options);\r
+    if(bottom!="") AddBottom(element,bottom,options);\r
+}\r
+\r
+\r
 function AddTop(el,side,options){\r
 var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;\r
 d.style.marginLeft="-"+getPadding(el,"Left")+"px";\r