Index: openacs-4/packages/tasks-portlet/tasks-portlet.info
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/tasks-portlet.info,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/tasks-portlet.info	28 Sep 2005 19:25:45 -0000	1.1
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- Generated by the OpenACS Package Manager -->
+
+<package key="tasks-portlet" url="http://openacs.org/repository/apm/packages/tasks-portlet" type="apm_application">
+    <package-name>Tasks Portlet</package-name>
+    <pretty-plural>Tasks Portlet</pretty-plural>
+    <initial-install-p>f</initial-install-p>
+    <singleton-p>t</singleton-p>
+    
+    <version name="0.1d" url="http://openacs.org/repository/download/apm/tasks-portlet-0.1d.apm">
+        <owner url="mailto:miguel@viaro.net">Miguel Marin</owner>
+        <vendor url="http://www.viaro.net">Viaro Networks</vendor>
+        <maturity>0</maturity>
+
+        <provides url="tasks-portlet" version="0.1d"/>
+        <requires url="dotlrn" version="2.1.2d1"/>
+        <requires url="tasks" version="0.1d"/>
+
+        <callbacks>
+        </callbacks>
+        <parameters>
+            <parameter datatype="number"  min_n_values="1"  max_n_values="1"  name="tasks_portlet_force_region"  default="1" description="the portal region to put this portlet into"/>
+        </parameters>
+
+    </version>
+</package>
Index: openacs-4/packages/tasks-portlet/catalog/tasks-portlet.en_US.ISO-8859-1.xml
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/catalog/tasks-portlet.en_US.ISO-8859-1.xml,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/catalog/tasks-portlet.en_US.ISO-8859-1.xml	28 Sep 2005 19:25:45 -0000	1.1
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<message_catalog package_key="tasks-portlet" package_version="0.1d" locale="en_US" charset="ISO-8859-1">
+
+  <msg key="pretty_name">Tasks Portlet</msg>
+</message_catalog>
+
Index: openacs-4/packages/tasks-portlet/lib/tasks-postgresql.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/lib/tasks-postgresql.xql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/lib/tasks-postgresql.xql	28 Sep 2005 19:25:45 -0000	1.1
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+
+<queryset>
+
+<fullquery name="get_tasks">
+    <querytext>
+	select 
+		t.task_id, 
+		t.title, 
+		t.description, 
+		t.mime_type, 
+		t.priority,
+           	t.party_id, 
+		p.title as process_title, 
+		p.process_id,
+           	tasks__relative_date(t.due_date) as due_date,
+           	tasks__relative_date(t.completed_date) as completed_date,
+           	ao.creation_user, 
+		t.status_id, 
+		t.process_instance_id,
+           	contact__name(ao.creation_user) as creation_name,
+           	CASE WHEN t.due_date < now() THEN 't' ELSE 'f' END as due_date_passed_p,
+           	s.title as status, 
+		t.object_id,
+		ao.package_id
+      from 
+		t_task_status s, 
+		acs_objects ao, 
+		t_tasks t
+      left outer join t_process_instances pi
+      on (pi.process_instance_id = t.process_instance_id)
+      left outer join t_processes p
+      on (p.process_id = pi.process_id)
+      where 
+		s.status_id = t.status_id
+      		and ao.object_id = t.task_id
+      		and t.party_id = :contact_id
+      		and t.start_date < now()
+		$package_where_clause
+     [template::list::orderby_clause -orderby -name tasks]
+    </querytext>
+</fullquery>
+
+</queryset>
\ No newline at end of file
Index: openacs-4/packages/tasks-portlet/lib/tasks.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/lib/tasks.adp,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/lib/tasks.adp	28 Sep 2005 19:25:45 -0000	1.1
@@ -0,0 +1,6 @@
+<p>
+<a href="@add_url@" class="button">#tasks.Add_Task#</a>
+<a href="tasks/processes?assignee_id=@contact_id@" class="button">#tasks.Assign_Process#</a>
+</p>
+
+<listtemplate name="tasks"></listtemplate>
Index: openacs-4/packages/tasks-portlet/lib/tasks.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/lib/tasks.tcl,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/lib/tasks.tcl	28 Sep 2005 19:25:45 -0000	1.1
@@ -0,0 +1,187 @@
+set user_id [ad_conn user_id]
+
+if { ![exists_and_not_null orderby] } {
+    set orderby "priority,desc"
+}
+if { ![exists_and_not_null status_id] } {
+    set status_id "1"
+}
+
+set community_id [dotlrn_community::get_community_id]
+
+set user_space_p 1
+
+if { ![empty_string_p $community_id] } {
+    set package_id [dotlrn_community::get_package_id_from_package_key \
+			-package_key "tasks" \
+			-community_id $community_id]
+    set user_space_p 0
+} 
+
+if { [exists_and_not_null package_id] } {
+    set package_where_clause " and ao.package_id = :package_id"
+} else {
+    set package_where_clause " and ao.creation_user = :user_id"
+}
+
+if { ![contact::exists_p -party_id $contact_id] } {
+    set contact_id $user_id
+}
+
+set party_id $contact_id
+set tasks_url "tasks/"
+
+
+set done_url [export_vars -url -base "${tasks_url}contact" {orderby {status_id 2} party_id}]
+set not_done_url [export_vars -url -base "${tasks_url}contact" {orderby {status_id 1} party_id}]
+set return_url "[ad_conn url]?[ad_conn query]"
+set add_url [export_vars -base "${tasks_url}task" {return_url orderby status_id party_id}]
+
+
+template::list::create \
+    -name tasks \
+    -multirow tasks \
+    -key task_id \
+    -elements {
+        deleted_p {
+	    label {<img src="/resources/acs-subsite/checkboxchecked.gif" alt="[_ tasks.Not_Done]" border="0" height="13" width="13">}
+	    display_template {
+		<if @tasks.done_p@>
+ 	        <img src="/resources/acs-subsite/checkboxchecked.gif" alt="[_ tasks.Done]" border=0 height="13" width="13">
+		</if>
+                <else>
+		<a href="@tasks.complete_url@">
+		<img src="/resources/acs-subsite/checkbox.gif" alt="[_ tasks.Not_Done]" border="0" height="13" width="13">
+		</a>
+		</else>
+	    }
+	}
+        priority {
+	    label "[_ tasks.Priority]"
+	    display_template {
+		<if @tasks.done_p@><span class="done">@tasks.priority@</span></if><else>@tasks.priority@</else>
+	    }
+	}
+	title {
+	    label "[_ tasks.Task]"
+            display_template {
+		<a href="@tasks.task_url@" title="@tasks.title@"<if @tasks.done_p@> class="done"</if>>@tasks.title@</a>
+		<if @tasks.description@ not nil>
+		<if @tasks.done_p@><div class="done"></if>
+                <p style="padding: 0; margin: 0; font-size: 0.85em; padding-left: 2em;">
+		@tasks.description_html;noquote@
+		</p>
+		<if @tasks.done_p@></div></if>
+		</if>
+	    }
+	}
+        process_title {
+	    label "[_ tasks.Process]"
+	    display_template {
+		<if @tasks.done_p@><span class="done">@tasks.process_title@</span></if>
+                <else>
+		  <if @tasks.process_title@ not nil>@tasks.process_title@</if>
+		</else>
+	    }
+	}
+        date {
+	    label "[_ tasks.Date]"
+	    display_template {
+		<if @tasks.done_p@><span class="done">@tasks.completed_date;noquote@</span></if>
+                <else>
+		  <if @tasks.due_date@>
+		  <a href="@tasks.task_minus_url@" style="text-decoration: none; font-weight: bold;">&laquo;</a>&nbsp;
+		  <if @tasks.due_date_passed_p@><span style="color: red;"></if>
+                  @tasks.due_date;noquote@
+                  <if @tasks.due_date_passed_p@></span></if>&nbsp;
+                  <a href="@tasks.task_plus_url@" style="text-decoration: none; font-weight: bold;">&raquo;</a>
+                  </if>
+                </else>
+	    }
+	}
+	creation_user {
+	    label "[_ tasks.Created_By]"
+	    display_template {
+		<a href="@tasks.creation_user_url@"<if @tasks.done_p@> class="done"</if>>@tasks.creation_name@</a>
+	    }
+	}      
+    } \
+    -sub_class {
+        narrow
+    } \
+    -filters {
+	party_id {
+	}
+    } -orderby {
+        default_value "priority,desc"
+        date {
+            label "[_ tasks.Due]"
+            orderby_desc "CASE WHEN t.status_id = 1 THEN t.due_date ELSE t.completed_date END desc, 
+                          t.priority, 
+                          lower(t.title)"
+            orderby_asc "CASE WHEN t.status_id = 1 THEN t.due_date ELSE t.completed_date END asc, 
+                         t.priority, 
+                         lower(t.title)"
+            default_direction desc
+        }
+        priority {
+            label "[_ tasks.Priority]"
+            orderby_desc "t.status_id, 
+                          t.priority desc, 
+                          CASE WHEN t.status_id = 1 THEN t.due_date ELSE t.completed_date END desc, 
+                          lower(t.title)"
+            orderby_asc "t.status_id, 
+                         t.priority asc, 
+                         CASE WHEN t.status_id = 1 THEN t.due_date ELSE t.completed_date END asc, 
+                         lower(t.title)"
+            default_direction desc
+        }
+        title {
+            label "[_ tasks.Task]"
+            orderby_desc "lower(t.title) desc, t.priority desc, t.due_date asc"
+            orderby_asc "lower(t.title) asc, t.priority desc, t.due_date asc"
+            default_direction asc
+        }
+        process_title {
+	    label "[_ tasks.Process]"
+            orderby_desc "lower(p.title) desc, t.priority desc, t.due_date asc"
+            orderby_asc "lower(p.title) asc, t.priority desc, t.due_date asc"
+	    default_direction asc
+	}
+	creation_user {
+	    label "[_ tasks.Created_By]"
+            orderby_desc "lower(contact__name(ao.creation_user)) desc, t.due_date asc, t.priority, lower(t.title)"
+            orderby_asc "lower(contact__name(ao.creation_user)) asc, t.due_date asc, t.priority, lower(t.title)"
+	    default_direction asc
+	}
+    }
+
+
+db_multirow -extend { creation_user_url contact_url complete_url done_p task_plus_url task_minus_url description_html task_url } -unclobber tasks get_tasks " " {
+    set creation_user_url [contact::url -party_id $creation_user]
+    regsub -all "tasks/" $creation_user_url "contacts/" creation_user_url
+    set complete_url [export_vars -base "${tasks_url}mark-completed" -url {task_id orderby {party_id $contact_id} return_url}]
+    if { $status_id == "2" } {
+	set done_p 1
+    } else {
+	set done_p 0
+    }
+    set task_url [export_vars -base "${tasks_url}task" -url {{party_id $contact_id} orderby status_id task_id}]
+    set task_plus_url  [export_vars -base "${tasks_url}task-interval" -url {{action plus}  {days 7} {party_id $contact_id} task_id status_id orderby return_url}]
+    set task_minus_url [export_vars -base "${tasks_url}task-interval" -url {{action minus} {days 7} {party_id $contact_id} task_id status_id orderby return_url}]
+
+    regsub -all "\r|\n" $description {LiNeBrEaK} description
+
+    set description_html [ad_html_text_convert \
+			      -from $mime_type \
+			      -to "text/html" \
+			      -truncate_len "400" \
+			      -more "<a href=\"${task_url}\">[_ tasks.more]</a>" \
+			      -- $description]
+    regsub -all {LiNeBrEaKLiNeBrEaK} $description_html {LiNeBrEaK} description_html
+    regsub -all {LiNeBrEaK} $description_html {\&nbsp;\&nbsp;\&#182;\&nbsp;} description_html
+
+    regsub -all " " $due_date {\&nbsp;} due_date
+    regsub -all " " $completed_date {\&nbsp;} completed_date
+}
+    
\ No newline at end of file
Index: openacs-4/packages/tasks-portlet/sql/postgresql/tasks-portlet-create.sql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/sql/postgresql/tasks-portlet-create.sql,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/sql/postgresql/tasks-portlet-create.sql	28 Sep 2005 19:25:45 -0000	1.1
@@ -0,0 +1,207 @@
+--
+--  Copyright (C) 2001, 2002 MIT
+--
+--  This file is part of dotLRN.
+--
+--  dotLRN is free software; you can redistribute it and/or modify it under the
+--  terms of the GNU General Public License as published by the Free Software
+--  Foundation; either version 2 of the License, or (at your option) any later
+--  version.
+--
+--  dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+--  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+--  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+--  details.
+--
+
+-- Creates Tasks portlet
+
+-- This is free software distributed under the terms of the GNU Public
+-- License version 2 or higher.  Full text of the license is available
+-- from the GNU Project: http://www.fsf.org/copyleft/gpl.html
+
+create function inline_0()
+returns integer as '
+declare
+  ds_id portal_datasources.datasource_id%TYPE;
+begin
+  ds_id := portal_datasource__new(
+         ''tasks_portlet'',
+         ''Displays Tasks''
+  );
+
+  
+  --  the standard 4 params
+
+  -- shadeable_p 
+  perform portal_datasource__set_def_param (
+	ds_id,
+	''t'',
+	''t'',
+	''shadeable_p'',
+	''t''
+);	
+
+
+  -- hideable_p 
+  perform portal_datasource__set_def_param (
+	ds_id,
+	''t'',
+	''t'',
+	''hideable_p'',
+	''t''
+);	
+
+  -- user_editable_p 
+  perform portal_datasource__set_def_param (
+	ds_id,
+	''t'',
+	''t'',
+	''user_editable_p'',
+	''t''
+);	
+
+  -- shaded_p 
+  perform portal_datasource__set_def_param (
+	ds_id,
+	''t'',
+	''t'',
+	''shaded_p'',
+	''f''
+);	
+
+  -- link_hideable_p 
+  perform portal_datasource__set_def_param (
+	ds_id,
+	''t'',
+	''t'',
+	''link_hideable_p'',
+	''t''
+);	
+
+
+    perform portal_datasource__set_def_param(
+        ds_id,
+        ''t'',
+        ''f'',
+        ''scoped_p'',
+        ''t''
+    );
+
+
+   return 0;
+
+end;' language 'plpgsql';
+select inline_0();
+drop function inline_0();
+
+
+create function inline_0()
+returns integer as '
+declare
+	foo integer;
+begin
+	-- create the implementation
+	foo := acs_sc_impl__new (
+		''portal_datasource'',
+		''tasks_portlet'',
+		''tasks_portlet''
+	);
+
+   return 0;
+
+end;' language 'plpgsql';
+select inline_0();
+drop function inline_0();
+
+
+
+create function inline_0()
+returns integer as '
+declare
+	foo integer;
+begin
+
+	-- add all the hooks
+	foo := acs_sc_impl_alias__new (
+	       ''portal_datasource'',
+	       ''tasks_portlet'',
+	       ''GetMyName'',
+	       ''tasks_portlet::get_my_name'',
+	       ''TCL''
+	);
+
+	foo := acs_sc_impl_alias__new (
+	       ''portal_datasource'',
+	       ''tasks_portlet'',
+	       ''GetPrettyName'',
+	       ''tasks_portlet::get_pretty_name'',
+	       ''TCL''
+	);
+
+	foo := acs_sc_impl_alias__new (
+	       ''portal_datasource'',
+	       ''tasks_portlet'',
+	       ''Link'',
+	       ''tasks_portlet::link'',
+	       ''TCL''
+	);
+
+	foo := acs_sc_impl_alias__new (
+	       ''portal_datasource'',
+	       ''tasks_portlet'',
+	       ''AddSelfToPage'',
+	       ''tasks_portlet::add_self_to_page'',
+	       ''TCL''
+	);
+
+	foo := acs_sc_impl_alias__new (
+	       ''portal_datasource'',
+	       ''tasks_portlet'',
+	       ''Show'',
+	       ''tasks_portlet::show'',
+	       ''TCL''
+	);
+
+        foo := acs_sc_impl_alias__new (
+               ''portal_datasource'',
+               ''tasks_portlet'',
+               ''Edit'',
+               ''tasks_portlet::edit'',
+               ''TCL''
+        );
+
+	foo := acs_sc_impl_alias__new (
+	       ''portal_datasource'',
+	       ''tasks_portlet'',
+	       ''RemoveSelfFromPage'',
+	       ''tasks_portlet::remove_self_from_page'',
+	       ''TCL''
+	);
+
+   return 0;
+
+end;' language 'plpgsql';
+select inline_0();
+drop function inline_0();
+
+
+
+create function inline_0()
+returns integer as '
+declare
+	foo integer;
+begin
+
+	-- Add the binding
+	perform acs_sc_binding__new (
+	    ''portal_datasource'',
+	    ''tasks_portlet''
+	);
+
+   return 0;
+
+end;' language 'plpgsql';
+select inline_0();
+drop function inline_0();
+
Index: openacs-4/packages/tasks-portlet/tcl/tasks-portlet-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/tcl/tasks-portlet-procs.tcl,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/tcl/tasks-portlet-procs.tcl	28 Sep 2005 19:25:46 -0000	1.1
@@ -0,0 +1,116 @@
+#  This file is part of dotLRN.
+#
+#  dotLRN is free software; you can redistribute it and/or modify it under the
+#  terms of the GNU General Public License as published by the Free Software
+#  Foundation; either version 2 of the License, or (at your option) any later
+#  version.
+#
+#  dotLRN is distributed in the hope that it will be useful, but WITHOUT ANY
+#  WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+#  FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+#  details.
+#
+
+ad_library {
+
+    Procedures to support the Tasks Package
+    
+    @author Miguel Marin (miguelmarin@viaro.net)
+    @author Viaro Networks www.viaro.net
+
+}
+
+namespace eval tasks_portlet {
+
+    ad_proc -private my_package_key {
+    } {
+        return "tasks-portlet"
+    }
+
+    ad_proc -private get_my_name {
+    } {
+        return "tasks_portlet"
+    }
+
+    ad_proc -public get_pretty_name {
+    } {
+        return "#tasks-portlet.pretty_name#"
+    }
+
+    ad_proc -public link {
+    } {
+	return ""
+    }
+
+    ad_proc -public add_self_to_page {
+	{-portal_id:required}
+	{-package_id:required}
+        {-page_name ""}
+        {-pretty_name ""}
+        {-force_region ""}
+	{-scoped_p ""}
+	{-param_action "overwrite"}
+    } {
+	Adds the Tasks Portlet to the given page.
+
+	@param portal_id The page to add self to
+
+	@return element_id The new element's id
+    } {
+        
+        # allow overrides of pretty_name and force_region
+
+        if {[empty_string_p $pretty_name]} {
+            set pretty_name [get_pretty_name]
+        }
+
+        if {[empty_string_p $force_region]} {
+            set force_region [parameter::get_from_package_key \
+                                  -package_key [my_package_key] \
+                                  -parameter "force_region"
+            ]
+        }
+
+        set extra_params ""
+        
+        return [portal::add_element_parameters \
+                    -portal_id $portal_id \
+                    -page_name $page_name \
+                    -portlet_name [get_my_name] \
+                    -value $package_id \
+                    -pretty_name $pretty_name \
+                    -force_region $force_region \
+		    -param_action $param_action]
+    }
+
+
+
+
+    ad_proc -public remove_self_from_page {
+	{-portal_id:required}
+        {-package_id:required}
+    } {
+        Removes a Task from the given page.
+
+	  @param portal_id The page to remove self from
+	  @param package_id
+    } {
+        portal::remove_element_parameters \
+            -portal_id $portal_id \
+            -portlet_name [get_my_name] \
+            -value $package_id
+    }
+
+    ad_proc -public show {
+	 cf
+    } {
+    } {
+
+	
+        portal::show_proc_helper \
+            -package_key [my_package_key] \
+            -config_list $cf
+	
+    }
+
+}
Index: openacs-4/packages/tasks-portlet/www/tasks-portlet.adp
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/www/tasks-portlet.adp,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/www/tasks-portlet.adp	28 Sep 2005 19:25:46 -0000	1.1
@@ -0,0 +1,3 @@
+<if @config.shaded_p@ false>
+   <include src="../lib/tasks" contact_id=@user_id@>
+</if>
\ No newline at end of file
Index: openacs-4/packages/tasks-portlet/www/tasks-portlet.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/tasks-portlet/www/tasks-portlet.tcl,v
diff -u
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ openacs-4/packages/tasks-portlet/www/tasks-portlet.tcl	28 Sep 2005 19:25:46 -0000	1.1
@@ -0,0 +1,9 @@
+# /pacakges/tasks-portlet/www/tasks-portlet.tcl
+ad_page_contract {
+
+} {
+
+}
+
+array set config $cf
+set user_id [ad_conn user_id]