<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>view/admin/one_group.xhtml</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -59,6 +59,7 @@ CREATE TABLE ticket_groups (
     id SERIAL,
     name VARCHAR( 256 ) NOT NULL,
     description VARCHAR( 4096 ) NOT NULL,
+    parent_id INTEGER REFERENCES ticket_groups( id ),
     PRIMARY KEY( id )
 );
 </diff>
      <filename>sql/schema.sql</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,14 @@
 class AdminController &lt; Ramaze::Controller
   map '/admin'
-  layout '/page'
+  layout '/page' =&gt; [
+    :index,
+    :ticket,
+    :comment,
+    :comment_view,
+    :blacklist,
+    :group,
+    :backup,
+  ]
   
   include AuthAC
   helper :sendfile
@@ -284,7 +292,7 @@ class AdminController &lt; Ramaze::Controller
   def group
     requires_flag 'admin'
     
-    @groups = TicketGroup.all
+    @groups = TicketGroup.root_groups
     @user = session[ :user ]
   end
   
@@ -294,9 +302,11 @@ class AdminController &lt; Ramaze::Controller
       begin
         name = request[ 'name' ]
         description = request[ 'description' ]
+        parent_id = request[ 'parent_id' ].to_i if request[ 'parent_id' ]
         TicketGroup.create(
           :name =&gt; name,
-          :description =&gt; description
+          :description =&gt; description,
+          :parent_id =&gt; parent_id
         )
         flash[ :success ] = &quot;'#{name}' group added.&quot;
       rescue DBI::Error =&gt; e
@@ -310,6 +320,11 @@ class AdminController &lt; Ramaze::Controller
     redirect Rs( :group )
   end
   
+  def one_group
+    @group = TicketGroup[ request[ 'group_id' ].to_i ]
+    @depth = request[ 'depth' ].to_i
+  end
+  
   # -----------------
   
   def backup</diff>
      <filename>src/admin.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,29 @@ class TicketGroup &lt; DBI::Model( :ticket_groups )
   def self.default
     self[ :name =&gt; 'Uncategorized' ]
   end
+  
+  def self.root_groups
+    TicketGroup.where( :parent_id =&gt; nil )
+  end
+  
   def to_s
     name
   end
+  
+  def parent
+    TicketGroup[ parent_id ]
+  end
+  
+  # Provides ancestry in order from parent to furthest ancestor.
+  def ancestors
+    if parent_id.nil?
+      []
+    else
+      [ parent ] + parent.ancestors
+    end
+  end
+
+  def children
+    TicketGroup.where( :parent_id =&gt; id )
+  end
 end
\ No newline at end of file</diff>
      <filename>src/models/ticket-group.rb</filename>
    </modified>
    <modified>
      <diff>@@ -5,7 +5,7 @@ Use ticket groups to organize your tickets.  Ticket groups can represent
 projects, project components, categories, or whatever else your needs require.
 &lt;/p&gt;
 
-&lt;table class=&quot;list&quot;&gt;
+&lt;table class=&quot;list sortable&quot;&gt;
 
 &lt;tr&gt;
 &lt;th&gt;Name&lt;/th&gt;
@@ -13,12 +13,7 @@ projects, project components, categories, or whatever else your needs require.
 &lt;/tr&gt;
 
 &lt;?r @groups.each do |group| ?&gt;
-
-&lt;tr&gt;
-&lt;td&gt;#{group.name}&lt;/td&gt;
-&lt;td&gt;#{group.description}&lt;/td&gt;
-&lt;/tr&gt;
-
+  #{ render_action( :one_group, 'group_id' =&gt; group.id ) }
 &lt;?r end ?&gt;
 
 &lt;/table&gt;
@@ -33,8 +28,19 @@ projects, project components, categories, or whatever else your needs require.
       &lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;name&quot;/&gt;&lt;/td&gt;
     &lt;/tr&gt;
     &lt;tr&gt;
+      &lt;td&gt;Subgroup of:&lt;/td&gt;
+      &lt;td&gt;
+        &lt;select name=&quot;parent_id&quot;&gt;
+          &lt;option value=&quot;&quot;&gt;(none)&lt;/option&gt;
+          &lt;?r @groups.each do |group| ?&gt;
+            &lt;option value=&quot;#{group.id}&quot;&gt;#{group.name}&lt;/option&gt;
+          &lt;?r end ?&gt;
+        &lt;/select&gt;
+      &lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr&gt;
       &lt;td&gt;Description:&lt;/td&gt;
-      &lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;description&quot;/&gt;&lt;/td&gt;
+      &lt;td&gt;&lt;input type=&quot;text&quot; name=&quot;description&quot; size=&quot;60&quot;/&gt;&lt;/td&gt;
     &lt;/tr&gt;
   &lt;/table&gt;
   </diff>
      <filename>view/admin/group.xhtml</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>f6926c366bae90730a21ccf767b390530b988d60</id>
    </parent>
  </parents>
  <author>
    <name>Pistos</name>
    <email>gitsomegrace.5.pistos@geoshell.com</email>
  </author>
  <url>http://github.com/Pistos/linistrac/commit/891553f5da22301c15d6af79a8365314121fe6fe</url>
  <id>891553f5da22301c15d6af79a8365314121fe6fe</id>
  <committed-date>2008-05-01T22:05:26-07:00</committed-date>
  <authored-date>2008-05-01T22:05:26-07:00</authored-date>
  <message>Added ticket groups hierarchy.
Adjusted ticket group admin interface to support the hierarchy.</message>
  <tree>77360efaf34a2db0e2de609afe4ee150d6eaf394</tree>
  <committer>
    <name>Pistos</name>
    <email>gitsomegrace.5.pistos@geoshell.com</email>
  </committer>
</commit>
