Index: openacs-4/contrib/packages/project-manager/www/one-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/one-postgresql.xql,v diff -u -r1.23.2.5 -r1.23.2.6 --- openacs-4/contrib/packages/project-manager/www/one-postgresql.xql 8 Oct 2004 21:25:05 -0000 1.23.2.5 +++ openacs-4/contrib/packages/project-manager/www/one-postgresql.xql 26 Oct 2004 01:21:11 -0000 1.23.2.6 @@ -21,20 +21,25 @@ to_char(p.latest_finish_date,'YYYY-MM-DD HH24:MI') as latest_finish_date, p.actual_hours_completed, p.estimated_hours_total, - p.parent_id + p.parent_id, + s.status_type FROM - pm_projectsx p, cr_items i + pm_projectsx p, + cr_items i, + pm_project_status s WHERE - p.item_id = :project_item_id and + p.item_id = :project_item_id and p.project_id = :project_id and - p.item_id = i.item_id + p.item_id = i.item_id and + p.status_id = s.status_id SELECT - t.item_id as task_id, + t.item_id as task_item_id, + t.parent_id as project_item_id, t.title, to_char(t.end_date,'YYYY-MM-DD HH24:MI') as end_date, to_char(t.earliest_start,'YYYY-MM-DD HH24:MI') as earliest_start, @@ -48,6 +53,7 @@ to_char(current_date,'J') as today_j, to_char(t.latest_finish,'YYYY-MM-DD HH24:MI') as latest_finish, t.latest_finish - current_date as days_to_latest_finish, + u.person_id, u.first_names, u.last_name, t.percent_complete, @@ -61,9 +67,25 @@ s.description as status_description, r.is_lead_p FROM - (select * from pm_tasks_revisionsx + (select tr.item_id, + ta.party_id, + ta.role_id, + tr.title, + tr.end_date, + tr.earliest_start, + tr.earliest_finish, + tr.latest_start, + tr.latest_finish, + tr.percent_complete, + tr.estimated_hours_work, + tr.estimated_hours_work_min, + tr.estimated_hours_work_max, + tr.actual_hours_worked, + tr.parent_id, + tr.revision_id + from pm_tasks_revisionsx tr LEFT JOIN - pm_task_assignment ON item_id = task_id) t + pm_task_assignment ta ON tr.item_id = ta.task_id) t LEFT JOIN persons u ON @@ -83,6 +105,7 @@ t.revision_id = i.live_revision and t.item_id = ti.task_id and ti.status = s.status_id + [template::list::filter_where_clauses -and -name tasks] [template::list::orderby_clause -name tasks -orderby] @@ -119,7 +142,8 @@ SELECT a.project_id, r.one_line as role_name, - p.first_names || ' ' || p.last_name as user_name + p.first_names || ' ' || p.last_name as user_name, + r.is_lead_p FROM pm_project_assignment a, pm_roles r, Index: openacs-4/contrib/packages/project-manager/www/one.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/one.adp,v diff -u -r1.31.2.5 -r1.31.2.6 --- openacs-4/contrib/packages/project-manager/www/one.adp 8 Oct 2004 21:25:05 -0000 1.31.2.5 +++ openacs-4/contrib/packages/project-manager/www/one.adp 26 Oct 2004 01:21:11 -0000 1.31.2.6 @@ -1,6 +1,11 @@ - - @my_title;noquote@ + + + @my_title;noquote@ -- Closed + + + @my_title;noquote@ + @context;noquote@ @@ -11,9 +16,17 @@ - +
- + + + @@ -61,13 +77,19 @@

-

+ + + + + + + Edit @@ -22,6 +35,9 @@   @project_term@ + +
+
- + + + -
Dates + + Dates + +
+ @@ -106,17 +128,23 @@

-

Start
+
+ + - -
+ + Assignees + +
+
+
  • @assignee_add_self_widget;noquote@
  • Remove myself
  • @@ -130,13 +158,19 @@

    - +
    - + + + -
    Project information + + Project information + +
    + @@ -150,13 +184,19 @@

    -

    Customer
    +
    + + -
    + + Categories + +
    +
    @@ -181,11 +221,17 @@ + + -
    + + Subprojects + +
    Add subproject @@ -198,13 +244,19 @@

    - +
    + + -
    + + Comments + +
    + @comments;noquote@
    • @comments_link;noquote@ @@ -214,13 +266,19 @@

    - +
    + + -
    + + Actions + +
    + @@ -237,32 +295,51 @@ + id="rightcontent" class="list" align="right"> + + - + - + + + + - @@ -272,25 +349,31 @@

    -

    + + @task_term@ + +
    + @instance_html;noquote@
    +
    • Add - - + Tasks
    • + +
    • +
      + + + + +
      +
    +
    + + - - + + + +
    + + Logger + +
    +
    @variable_widget;noquote@ @variable_exports;noquote@ @day_widget;noquote@
    -
    + + [export_vars -form -entire_form -exclude {instance_id}] + + +" +} + +# we do this so that the list builder templates don't add a where +# clause when instance_id is set. +if {[empty_string_p $instance_id]} { + unset instance_id +} + # categories set categories [list] @@ -185,22 +213,25 @@ set context [list [list "one?project_item_id=$project(parent_id)" "Parent"] "$project(project_name)"] } +set processes_html [pm::process::select_html] + # Tasks, using list-builder --------------------------------- set process_link "process-use?project_item_id=$project_item_id" template::list::create \ -name tasks \ -multirow tasks \ - -key task_id \ + -key task_item_id \ + -html {width 100%} \ -elements { - task_id { + task_item_id { label "ID" } status_type { label "Done" display_template { - + } } title { @@ -241,7 +272,18 @@ last_name { label "Who" display_template { - @tasks.first_names@ @tasks.last_name@
    + + + + + + @tasks.first_names@ @tasks.last_name@ + + + + +
    +
    } } @@ -251,8 +293,6 @@ } \ -bulk_action_export_vars { project_item_id - project_id - {my_key 1} {return_url} } \ -sub_class { @@ -262,6 +302,10 @@ project_item_id { hide_p 1 } + instance_id { + hide_p 1 + where_clause {ti.process_instance = :instance_id} + } orderby_subproject { hide_p 1 } @@ -272,37 +316,37 @@ -orderby { default_value latest_start,asc title { - orderby_asc "title asc, task_id asc" - orderby_desc "title desc, task_id desc" + orderby_asc "title asc, task_item_id asc" + orderby_desc "title desc, task_item_id desc" default_direction asc } earliest_start { - orderby_asc "earliest_start, task_id asc, u.first_names, u.last_name" - orderby_desc "earliest_start desc, task_id desc, u.first_names, u.last_name" + orderby_asc "earliest_start, task_item_id asc, u.first_names, u.last_name" + orderby_desc "earliest_start desc, task_item_id desc, u.first_names, u.last_name" default_direction asc } earliest_finish { - orderby_asc "earliest_finish, task_id asc, u.first_names, u.last_name" - orderby_desc "earliest_finish desc, task_id desc, u.first_names, u.last_name" + orderby_asc "earliest_finish, task_item_id asc, u.first_names, u.last_name" + orderby_desc "earliest_finish desc, task_item_id desc, u.first_names, u.last_name" default_direction asc } latest_start { - orderby_asc "latest_start, task_id asc, u.first_names, u.last_name" - orderby_desc "latest_start desc, task_id desc, u.first_names, u.last_name" + orderby_asc "latest_start, task_item_id asc, u.first_names, u.last_name" + orderby_desc "latest_start desc, task_item_id desc, u.first_names, u.last_name" default_direction asc } latest_finish { - orderby_asc "latest_finish, task_id asc, u.first_names, u.last_name" - orderby_desc "latest_finish desc, task_id desc, u.first_names, u.last_name" + orderby_asc "latest_finish, task_item_id asc, u.first_names, u.last_name" + orderby_desc "latest_finish desc, task_item_id desc, u.first_names, u.last_name" default_direction asc } } \ -orderby_name orderby_tasks -db_multirow -extend { item_url earliest_start_pretty earliest_finish_pretty latest_start_pretty latest_finish_pretty slack_time} tasks project_tasks_query { +db_multirow -extend { item_url earliest_start_pretty earliest_finish_pretty latest_start_pretty latest_finish_pretty slack_time my_user_id} tasks project_tasks_query { } { - set item_url [export_vars -base "task-one" { revision_id task_id}] + set item_url [export_vars -base "task-one" { {task_id $task_item_id}}] set earliest_start_pretty [lc_time_fmt $earliest_start "%x"] set earliest_finish_pretty [lc_time_fmt $earliest_finish "%x"] @@ -313,7 +357,8 @@ -earliest_start_j $earliest_start_j \ -today_j $today_j \ -latest_start_j $latest_start_j] - + + set my_user_id $user_id } @@ -373,6 +418,11 @@ -elements { user_name { label "Who" + display_template { + + @people.user_name@ + + } } role_name { label "Role" Index: openacs-4/contrib/packages/project-manager/www/process-one-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/process-one-postgresql.xql,v diff -u -r1.3.2.1 -r1.3.2.2 --- openacs-4/contrib/packages/project-manager/www/process-one-postgresql.xql 2 Jul 2004 23:13:49 -0000 1.3.2.1 +++ openacs-4/contrib/packages/project-manager/www/process-one-postgresql.xql 26 Oct 2004 01:21:11 -0000 1.3.2.2 @@ -11,14 +11,28 @@ t.estimated_hours_work_min, t.estimated_hours_work_max, d.dependency_type, - t.ordering + t.ordering, + p.first_names, + p.last_name, + p.person_id FROM pm_process_task t + LEFT JOIN + pm_process_task_assignment a + ON + t.process_task_id = a.process_task_id + LEFT JOIN + pm_roles r + ON r.role_id = a.role_id LEFT JOIN + persons p + ON p.person_id = a.party_id + LEFT JOIN pm_process_task_dependency d ON t.process_task_id = d.process_task_id WHERE - t.process_id = :process_id + t.process_id = :process_id and + (r.is_lead_p = 't' or r.is_lead_p is null) [template::list::orderby_clause -orderby -name tasks] Index: openacs-4/contrib/packages/project-manager/www/process-one.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/process-one.adp,v diff -u -r1.4 -r1.4.2.1 --- openacs-4/contrib/packages/project-manager/www/process-one.adp 11 Dec 2003 21:39:44 -0000 1.4 +++ openacs-4/contrib/packages/project-manager/www/process-one.adp 26 Oct 2004 01:21:11 -0000 1.4.2.1 @@ -8,13 +8,13 @@ Process tasks:
      -
    • Use this process: @use_link;noquote@

      +

    • Use all tasks in this process: @use_link;noquote@

    • Add - process tasks + new task(s) to this process
    • Index: openacs-4/contrib/packages/project-manager/www/process-one.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/process-one.tcl,v diff -u -r1.9.2.2 -r1.9.2.3 --- openacs-4/contrib/packages/project-manager/www/process-one.tcl 2 Jul 2004 23:13:49 -0000 1.9.2.2 +++ openacs-4/contrib/packages/project-manager/www/process-one.tcl 26 Oct 2004 01:21:11 -0000 1.9.2.3 @@ -13,17 +13,20 @@ } { - process_id:integer + process_id:integer,notnull orderby:optional + {project_item_id ""} } -properties { process_id:onevalue context_bar:onevalue use_link:onevalue } -validate { +} -errors { + process_id:notnull {You must specify a process to use. Please back up and select a process} } -# --------------------------------------------------------------- # +# --------------------------------------------------------------- # the unique identifier for this package set package_id [ad_conn package_id] @@ -41,74 +44,41 @@ set context_bar [ad_context_bar [list "processes?process_id=$process_id" "Processes"] "One"] -set use_link "" +set use_link "" -if {[string is true $use_uncertain_completion_times_p]} { - set elements [list \ - one_line { - label "Subject" - display_template {@tasks.one_line@ - - - - - - - - - - - - - } - } \ - description { - label "Description" - } \ - estimated_hours_work_min { - label "Work estimate min" - } \ - estimated_hours_work_max { - label "Work estimate max" - } \ - ordering { - label "Order" - } ] - -} else { - - set elements [list \ - one_line { - label "Subject" - display_template {@tasks.one_line@ - - - - - - - - - - - - - } - } \ - description { - label "Description" - } \ - estimated_hours_work { - label "Work estimate" - } \ - ordering { - label "Order" - } ] -} +set elements \ + [list \ + one_line { + label "Subject" + display_template {@tasks.one_line@ + + + + + + + + + + + + + } + } \ + description { + label "Description" + } \ + person_id { + label "Lead" + display_template { + + @tasks.first_names@ @tasks.last_name@
      +
      + } + }] - # Process tasks, using list-builder --------------------------------- template::list::create \ @@ -120,27 +90,19 @@ default_value ordering,asc ordering { label "Order" - orderby_asc "t.ordering, t.process_task_id" - orderby_desc "t.ordering desc, t.process_task_id desc" + orderby_asc "t.ordering, t.process_task_id, p.first_names, p.last_name" + orderby_desc "t.ordering desc, t.process_task_id desc, p.first_names, p.last_name" default_direction asc } - one_line { - orderby_asc "t.one_line, t.ordering" - orderby_desc "t.one_line desc, t.ordering desc" - default_direction asc - } - estimated_hours_work {orderby estimated_hours_work} - estimated_hours_work_min {orderby estimated_hours_work_min} - estimated_hours_work_max {orderby estimated_hours_work_max} - } \ -bulk_actions { + "Use" "task-select-project" "Use process" "Edit" "process-task-add-edit" "Edit tasks" "Delete" "process-task-delete" "Delete tasks" } \ -bulk_action_export_vars { process_id - project_id + project_item_id } \ -sub_class { narrow @@ -157,7 +119,3 @@ } { } - -ad_return_template - -# ------------------------- END OF FILE ------------------------- # Index: openacs-4/contrib/packages/project-manager/www/process-task-add-edit.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/process-task-add-edit.adp,v diff -u -r1.7.4.1 -r1.7.4.2 --- openacs-4/contrib/packages/project-manager/www/process-task-add-edit.adp 2 Jul 2004 23:13:49 -0000 1.7.4.1 +++ openacs-4/contrib/packages/project-manager/www/process-task-add-edit.adp 26 Oct 2004 01:21:11 -0000 1.7.4.2 @@ -1,4 +1,4 @@ - + @context_bar;noquote@ @title@ Index: openacs-4/contrib/packages/project-manager/www/process-task-add-edit.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/process-task-add-edit.tcl,v diff -u -r1.8.2.2 -r1.8.2.3 --- openacs-4/contrib/packages/project-manager/www/process-task-add-edit.tcl 2 Jul 2004 23:13:49 -0000 1.8.2.2 +++ openacs-4/contrib/packages/project-manager/www/process-task-add-edit.tcl 26 Oct 2004 01:21:11 -0000 1.8.2.3 @@ -61,20 +61,10 @@ set package_id [ad_conn package_id] set user_id [ad_maybe_redirect_for_registration] -set subsite_id [ad_conn subsite_id] -set user_group_id [application_group::group_id_from_package_id \ - -package_id $subsite_id] - -# ----------- -# permissions -# ----------- -permission::require_permission -party_id $user_id -object_id $package_id -privilege read - # ------------------------------------------------------------ # if process_task_id is set, then we are editing process tasks # ------------------------------------------------------------ - if {[exists_and_not_null process_task_id]} { set edit_p 1 @@ -132,25 +122,9 @@ set roles_list_of_lists [pm::role::select_list_filter] -set assignee_list_of_lists [db_list_of_lists get_assignees { - select - p.first_names || ' ' || p.last_name as name, - p.person_id - FROM - persons p, - acs_rels r, - membership_rels mr - WHERE - r.object_id_one = :user_group_id and - mr.rel_id = r.rel_id and - p.person_id = r.object_id_two and - member_state = 'approved' - ORDER BY - p.first_names, p.last_name -}] +set assignee_list_of_lists [pm::util::subsite_assignees_list_of_lists] - template::multirow create num process_task_id one_line description work work_min work_max ordering checked assignee_html for {set i 1} {$i <= $number} {incr i} { Index: openacs-4/contrib/packages/project-manager/www/processes-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/processes-postgresql.xql,v diff -u -r1.1.4.1 -r1.1.4.2 --- openacs-4/contrib/packages/project-manager/www/processes-postgresql.xql 2 Jul 2004 23:13:49 -0000 1.1.4.1 +++ openacs-4/contrib/packages/project-manager/www/processes-postgresql.xql 26 Oct 2004 01:21:11 -0000 1.1.4.2 @@ -9,9 +9,11 @@ p.one_line, p.description, p.party_id, - to_char(p.creation_date,'YYYY-MM-DD') as creation_date_ansi + to_char(p.creation_date,'YYYY-MM-DD') as creation_date_ansi, + (select count(*) from pm_process_instance i where i.process_id = + p.process_id) as instances FROM - pm_process p + pm_process_active p ORDER BY p.one_line Index: openacs-4/contrib/packages/project-manager/www/processes.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/processes.tcl,v diff -u -r1.7.2.2 -r1.7.2.3 --- openacs-4/contrib/packages/project-manager/www/processes.tcl 2 Jul 2004 23:13:49 -0000 1.7.2.2 +++ openacs-4/contrib/packages/project-manager/www/processes.tcl 26 Oct 2004 01:21:11 -0000 1.7.2.3 @@ -59,11 +59,6 @@ -multirow processes \ -key item_id \ -elements { - process_id { - label "" - display_template { - } - } one_line { label "Subject" display_template { @@ -73,6 +68,9 @@ description { label "Description" } + instances { + label "Times used" + } creation_date { label "Created" } Index: openacs-4/contrib/packages/project-manager/www/style.css =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/style.css,v diff -u -r1.9.2.2 -r1.9.2.3 --- openacs-4/contrib/packages/project-manager/www/style.css 8 Oct 2004 21:25:05 -0000 1.9.2.2 +++ openacs-4/contrib/packages/project-manager/www/style.css 26 Oct 2004 01:21:11 -0000 1.9.2.3 @@ -3,10 +3,174 @@ } th.project { - background-color:#ccffcc; + background-color:#9999cc; } td.project-filter-pane { - background-color: #ddffdd; + background-color: #bbbbee; vertical-align: top; } + +.shaded { + background-color: #dddddd; +} + +.selected { + background-color: #eeccdd; +} + + + + +.no_items_text { + font-style: italic; + font-family: tahoma,verdana,arial,helvetica; +} + +.logger_explanation_text { + font-style: italic; +} + +.logger_emphasized_text { + font-weight: bold; +} + +table.logger_navbar { + background-color: #41329c; + clear: both; +} +a.logger_navbar { + color: white; + text-decoration: none; +} +a.logger_navbar:visited { + color: white; +} +a.logger_navbar:hover { + color: white; + text-decoration: underline; +} +td.logger_navbar { + font-family: tahoma,verdana,arial,helvetica; + font-size: 70%; + font-weight: bold; + color: #ccccff; + text-decoration: none; +} + +.logger_filter_bar_header { + font-weight: bold; + text-align: center; +} +.logger_filter_bar_section_header { + font-weight: bold; + background-color: #bbbbff; +} + +.logger_filter_bar_selected_link { + font-weight: bold; +} + +table.logger_table { + background-color: #999999; + margin: 10px; +} +.logger_table_header { + background-color: #dddddd; +} +.logger_table_rows { + background-color: white; +} + +table.logger_listing { + font-family: tahoma, verdana, helvetica; + font-size: 85%; +} +table.logger_listing_tiny { + font-family: tahoma, verdana, helvetica; + font-size: 75%; +} +tr.logger_listing_header { + background-color: #cccccc; +} +tr.logger_listing_subheader { + background-color: #bbbbbb; + font-weight: bold; +} +tr.logger_listing_even { + background-color: #f0f0f0; +} +tr.logger_listing_spacer { + background-color: #f9f9f9; +} +tr.logger_listing_odd { + background-color: #e0e0e0; +} +td.logger_listing_narrow { + padding-left: 4px; + padding-right: 4px; +} +td.logger_listing { + padding-left: 16px; + padding-right: 16px; +} +th.logger_listing_narrow { + padding-left: 4px; + padding-right: 4px; +} +th.logger_listing { + padding-left: 16px; + padding-right: 16px; +} + +.logger_font { + font-family: tahoma,verdana,arial,helvetica; +} + +h1.logger { + font-family: verdana,arial,helvetica; +} +h2.logger { + font-family: verdana,arial,helvetica; +} +h3.logger { + font-family: verdana,arial,helvetica; +} +h4.logger { + font-family: verdana,arial,helvetica; +} + + +.logger_filter { + font-size: 70%; + font-family: tahoma,verdana,arial,helvetica; +} +tr.logger_filter_selected { + background-color: #eeeeff; +} +span.logger_filter_selected { + color: black; +} +.logger_filter_header { + font-size: 70%; + font-family: tahoma,verdana,arial,helvetica; + font-weight: bold; +} +.logger_filter_section { + font-size: 70%; + font-family: tahoma,verdana,arial,helvetica; + font-weight: bold; + background-color: #bbbbff; + padding-left: 4px; + padding-top: 4px; + padding-bottom: 4px; + margin-top: 0px; + margin-bottom: 8px; +} + +th { + font-size: 9pt; + text-align: left; + background-color:dfdfff; +} Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/contrib/packages/project-manager/www/task-add-edit-2.tcl'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/contrib/packages/project-manager/www/task-add-edit-3.tcl'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/contrib/packages/project-manager/www/task-add-edit.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/task-add-edit.adp,v diff -u -r1.12.2.5 -r1.12.2.6 --- openacs-4/contrib/packages/project-manager/www/task-add-edit.adp 9 Jul 2004 17:38:28 -0000 1.12.2.5 +++ openacs-4/contrib/packages/project-manager/www/task-add-edit.adp 26 Oct 2004 01:21:11 -0000 1.12.2.6 @@ -4,294 +4,289 @@
      - - + + @export_vars;noquote@ - + + Send email to assignees? + - - - + + Process name + + + +
      - Send email to assignees? - - -
      - Error -
      -
      -
      - - - - + + + - - - - + + + - - Description:
      - - -
      - Error -
      -
      -

      +

      + Format: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - -
      - -  #@num.rownum@   + + +
      + + + + @task_term_lower;noquote@  @tasks.task_item_id@ - #@num.task_id@ + @task_term_lower;noquote@  @tasks.rownum@ - - Skip this task? - - - - -
      - Error -
      -
      + +
      +
      - - Subject:*
      - - -
      - Error -
      -
      -

      +

      + + + Subject:*

      - - Comment:
      -
      - - -
      - Error -
      -
      + Description:
      +
      -

      + + + + + + - - - - + + + + + + - - - - - + - - - - + Format: + + - - - - + + - - + + + + + + +
      Total work required: - *

      -

      Min: - hrs + + + + + + + - -
      - Error -
      -
      -
      Max: - hrs +

      + Comment
      +
      - -
      - Error -
      - - -

      - hrs - - -
      - Error -
      -
      -
      - -

      - [i] - You must enter a number here (make your best - guess) -

      -
        + + + - - - + + + - - - - - - - + + - - - - - - - - - - - - - + + + + +
      Work required:*

      Log entry:

      -

      Min: hrs
      Complete: - - - Error - - % -
      - -

      - [i] - Enter 100% to close the @task_term_lower@, or less - to open it. -

      -
      Max: hrs
      Time: - - - Error - - hours -
      Description: - - - Error - - -
      - -

      - [i] - You can optionally log time worked here. -

      -
      hrs
      - - - - - Error - - -
      - +

      + +

      - - - - - +

      -

      - - + + Status: + + %
      + + [i] + Enter 100% to close the @task_term_lower@, or less to open it. + +
      + + Status: + + + + + + - - - -
      - Deadline:
      + Deadline: @tasks.end_date_html;noquote@

      - - - Error - - + -

      - [i] - You may optionally enter a hard deadline -

      -
      -

      Dependency:
      + + @project_term@: + + + + + + - - - Error - - +

      - - - Error - - + Dependency:
      + -

      - [i] - You may enter a @task_term_lower@ that needs to - be completed before this @task_term_lower@ -

      +

      -

      -

      Project:
      - - -
      - Error -
      -
      -

      +

      - - - Error - - + +

      + Log entry: + + + + + - - + + + + + + + + +
      Quantity: + + @tasks.logger_variable_html;noquote@ +
      Description: + +
      + +

      + [i] + You can optionally log time worked here. +

      +
      + + +

      @tasks.assignee_html;noquote@
      + +   + +
      + +   + +
       
      - -
      + +
    - + + Index: openacs-4/contrib/packages/project-manager/www/task-add-edit.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/task-add-edit.tcl,v diff -u -r1.27.2.13 -r1.27.2.14 --- openacs-4/contrib/packages/project-manager/www/task-add-edit.tcl 24 Sep 2004 19:22:03 -0000 1.27.2.13 +++ openacs-4/contrib/packages/project-manager/www/task-add-edit.tcl 26 Oct 2004 01:21:11 -0000 1.27.2.14 @@ -2,1170 +2,333 @@ Add/edit form for tasks -

    + Needs to handle the following cases: +

      +
    • Adding a new task or tasks
    • +
    • Editing a task or tasks
    • +
    • Using a process to add new tasks
    • +
    - I plan to eventually get rid of the task-select-project page, because - the ability to choose the project is now within this page. However, - I'm waiting to do that until after my company updates our projects - with the customer in each field. - -

    - - I'd also like to move the assignments to this page, in the same manner - as the processes. - @author jader@bread.com @creation-date 2003-07-28 @cvs-id $Id$ @return context Context bar @return title Page title. - @return num A multirow datasource to iterate over the ad_form elements - @return edit_p if t then we are editing. Used to show different portions of the form - @param process_task_ids Specifies what process task ids were used if a process were used. We pass this on to future pages to determine things such as assignments - @param project_item_id Specifies which project each task is associated with. If this is a new task, this specifies the project that it will be assigned under. - @param my_key if set, then ad_form knows that this is an edit. - @param process_task_ids - @param project_item_id This is optionally passed in to this page to - indictate the project that the tasks should be associated with. - @param project_item_ids Used internally to keep track of the projects - associated with each task - @param number The number of Tasks to create - @param task_revision_id Specifies the revision this task represents (each revision of a task has a separate id) - @param task_id Specifies the item for the task (every revision of a task shares the same task_id) Also used as the key for the ad_form. For this reason, when editing, we have to pass in task_iid instead - @param task_title - @param process_id The process we're using to create this task - @param description - @param old_description - @param old_description_mime_type - @param comment - @param name - @param end_date - @param percent_complete - @param actual_hours_worked - @param new_hours_logged - @param new_description_logged - @param estimated_hours_work - @param estimated_hours_work_min - @param estimated_hours_work_max - @param dependency_type - @param dependency_task_id - @param skip_task_p Whether or not to skip this particular task. Used by processes, if t, then the task is not created - @param using_process_p Lets the UI know if there is a process being used (t if so) - @param send_email_p Send out emails to assignees of new task(s) + @param task_item_id list of tasks to edit, if there are any + @project_item_id The project these tasks are assigned to. + @param process_id The id for the process used, if any + @param process_task_id The process task IDs if there is a process used. + @param return_url + @param new_tasks if we are creating new tasks, how many to create } { - - my_key:integer,optional - process_task_ids:array,optional - {project_item_id:integer ""} - project_item_ids:array,optional - {number:integer "1"} - task_revision_id:integer,optional - {task_id:multiple ""} - task_item_id:array,optional - task_title:array,optional + {task_item_id:integer,multiple ""} + {project_item_id:integer,notnull} {process_id:integer ""} - description:html,array,optional - {old_description ""} - {old_description_mime_type ""} - comment:html,array,optional - name:array,optional - end_date:array,optional - percent_complete:array,optional - actual_hours_worked:array,optional - new_hours_logged:array,optional - new_description_logged:array,optional - estimated_hours_work:array,optional - estimated_hours_work_min:array,optional - estimated_hours_work_max:array,optional - dependency_type:array,optional - dependency_task_id:array,optional - skip_task_p:array,optional - {using_process_p "f"} + {process_task_id:integer,multiple ""} {return_url ""} - {send_mail_p "t"} + {new_tasks "1"} } -properties { - context:onevalue - title:onevalue - num:multirow - use_uncertain_completion_times_p:onevalue - edit_p:onevalue - using_process_p:onevalue - } -validate { - number_is_in_range -requires {number:integer} { - # todo: make 100 a parameter - if {$number < 1 || $number > 100} { - ad_complain - } - } - percent_is_in_range { - for {set i 1} {$i <= $number} {incr i} { - if {[exists_and_not_null percent_complete($i)]} { - if {$percent_complete($i) < 0 || $percent_complete($i) > 100} { - ad_complain - } - } - } - } } -errors { - project_exists {You must enter a project} - number_is_in_range {Number must be between 1 and 100} - percent_is_in_range {Percent completed must be between 0 and 100} } -# --------------------------------------------------------------- # +# --------------------------------------------------------------- +# Set up +# --------------------------------------------------------------- +set user_id [ad_maybe_redirect_for_registration] +set package_id [ad_conn package_id] -set user_id [ad_maybe_redirect_for_registration] -set package_id [ad_conn package_id] - - -# --------------------------------------------------------------- # +# --------------------------------------------------------------- # terminology -# --------------------------------------------------------------- # +# --------------------------------------------------------------- set project_term [parameter::get -parameter "ProjectName" -default "Project"] set task_term [parameter::get -parameter "TaskName" -default "Task"] set task_term_lower [parameter::get -parameter "taskname" -default "task"] set use_uncertain_completion_times_p [parameter::get -parameter "UseUncertainCompletionTimesP" -default "1"] -# --------------------------------------------------------------- # -# ----------------------------------------- -# if we have a task_id, then we are editing -# ----------------------------------------- +# ------------------------- +# Set up flags to use later +# ------------------------- -if {![exists_and_not_null my_key] && ![empty_string_p $task_id]} { - set my_key 1 -} - -# -------------------------------------------------------------------- -# If we are using a process, then we need to get the information on -# the process now. This is necessary because we need to do things like -# set the number of tasks we're going to be entering. We save this for -# later, so we can get the values -# -------------------------------------------------------------------- - -set process_tasks [list] - -if {[exists_and_not_null process_id]} { - - # we need the ADP page to know we're using processes, so we can - # modify the interface a little bit - set using_process_p t - - # get all the process task info - pm::task::process_task_info \ - -process_id $process_id \ - -one_line_array one_line_v \ - -description_array description_v \ - -estimated_hours_work_array estimated_hours_work_v \ - -estimated_hours_work_min_array estimated_hours_work_min_v \ - -estimated_hours_work_max_array estimated_hours_work_max_v \ - -dependency_array dependency_v \ - -tasks_list process_tasks - - set number [llength $process_tasks] -} - - - -# --------------------------------------------------------------- # - - - -# we use this to get around the lack of a hidden multiple in ad_form -set task_id [string map {"-" " "} $task_id] - -# we sort this because we want to keep the ordering -# consistent. Otherwise, we can run into problems when editing -# multiple tasks. Their values can get crossed, causing bad things -# to happen -set task_id [lsort -integer $task_id] - -# --------------------------------------------------------------- # -# Create a multirow: num -# --------------------------------------------------------------- # - -if {![ad_form_new_p -key task_id]} { - # ----------------------------------------------------- - # Editing! - # ----------------------------------------------------- - # create a multirow we can use to iterate - # we also set the number variable for future use - # ----------------------------------------------------- - template::multirow create num number task_id - - set i 1 - set number 0 - foreach tid $task_id { - template::multirow append num $i [lindex $task_id [expr $i-1]] - incr i - incr number - } - +if {[exists_and_not_null task_item_id]} { set edit_p t - } else { - # create a multirow we can use to iterate - template::multirow create num number task_id - - for {set i 1} {$i <= $number} {incr i} { - template::multirow append num $i [lindex $task_id [expr $i-1]] - } - set edit_p f } - -# ------------------------------------------------------- # -# The evilest hack of all time. -# ------------------------------------------------------- -# This is a workaround the fact that using multiple dates -# with ad_form is extremely difficult. Dates are formatted -# like arrays, with values like end_date.day, end_date.month, -# end_date.year, and end_date.format . The problem is we want -# to have multiple end_dates. Using the multiple method, we -# then get entries like this: end_date.1.year, end_date.2.year, -# end_date.2.day, etc.. -# -# What this loop does is go through the array, and rename the -# values into other variables. We then feed these variables into -# the SQL function that creates the new tasks. This works. I'm -# sure there must be a better way to do it, but my posting on -# the forums didn't result in any other suggestions. -# ------------------------------------------------------- # - -if {[info exists end_date]} { - - set searchToken [array startsearch end_date] - - while {[array anymore end_date $searchToken]} { - - set keyname [array nextelement end_date $searchToken] - set keyvalu $end_date($keyname) - - # ns_log Notice "keyname: $keyname keyvalu: $keyvalu" - - # element_num is 1...n, element_type is year, format, day, month - regexp {(.*)\.(.*)} $keyname match element_num element_type - - # ns_log Notice "element_num: $element_num element_type: $element_type" - - set end_date_[set element_type]($element_num) $keyvalu - - # ns_log notice "set end_date_[set element_type] to $keyvalu" - } - - for {set i 1} {$i <= $number} {incr i} { - # set up date variable names - set end_date_$i [list $end_date_year($i) $end_date_month($i) $end_date_day($i) {} {} {}] - # ns_log Notice "end_date_$i: [set end_date_$i]" - } -} - -# ------------------------------------------------------- # -# The second evilest hack of all time. -# ------------------------------------------------------- -# This is a workaround the fact that using multiple richtext items -# with ad_form is extremely difficult. The description field -# will come in like an array, with values like -# description.1 = 1234 bold -# description.1.format = text/enhanced -# description.1.spellcheck = :nospell: -# The problem is we want -# to have multiple descriptions. -# -# What this loop does is go through the array, and rename the -# values into other variables. We then feed these variables into -# the SQL function that creates the new tasks. This works. I'm -# sure there must be a better way to do it. -# ------------------------------------------------------- # - -if {[info exists description] && ![exists_and_not_null process_id]} { - - set searchToken [array startsearch description] - - while {[array anymore description $searchToken]} { - - # these next two lines are important - set element_num "" - set element_type "" - - set keyname [array nextelement description $searchToken] - set keyvalu $description($keyname) - - # ns_log Notice "keyname: $keyname keyvalu: $keyvalu" - - # element_num is 1...n, element_type is format, spellcheck - regexp {(.*)\.(.*)} $keyname match element_num element_type - - # ns_log Notice "element_num: $element_num element_type: $element_type" - - set description_[set element_type]($element_num) $keyvalu - - # ns_log notice "set description_[set element_type] to $keyvalu" - - } - -} - -# ------------------------------------------------------- # -# The third evilest hack of all time. -# ------------------------------------------------------- -# This is a workaround the fact that using multiple richtext items -# with ad_form is extremely difficult. The comment field -# will come in like an array (if the task is edited), -# with values like -# comment.1 = 1234 bold -# comment.1.format = text/enhanced -# comment.1.spellcheck = :nospell: -# The problem is we want -# to have multiple comments. -# -# What this loop does is go through the array, and rename the -# values into other variables. We then feed these variables into -# the SQL function that creates the new tasks. This works. I'm -# sure there must be a better way to do it. -# ------------------------------------------------------- # -if {[string is true $edit_p] && [info exists comment]} { - - set searchToken [array startsearch comment] - - while {[array anymore comment $searchToken]} { - - # these next two lines are important - set element_num "" - set element_type "" - - set keyname [array nextelement comment $searchToken] - set keyvalu $comment($keyname) - - # ns_log Notice "keyname: $keyname keyvalu: $keyvalu" - - # element_num is 1...n, element_type is format, spellcheck - regexp {(.*)\.(.*)} $keyname match element_num element_type - - # if element_num is null, then this is actually the value for - # the comment - if {[empty_string_p $element_num]} { - set comment_[set keyname] $keyvalu - } - - # ns_log Notice "element_num: $element_num element_type: $element_type" - - set comment_[set element_type]($element_num) $keyvalu - - # ns_log notice "set comment_[set element_type] to $keyvalu" - - } - +if {[exists_and_not_null process_id]} { + set using_process_p t } else { - - for {set i 1} {$i <= $number} {incr i} { - # we explicitly set all the values to plaintext and empty for - # new tasks - set comment_format($i) "text/plain" - set comment_$i "" - } + set using_process_p f } -for {set i 1} {$i <= $number} {incr i} { - - set format $comment_format($i) - set richtext_list [list [set comment_$i] $format] - lappend comment_list [template::util::richtext::get_property html_value $richtext_list] - lappend comment_formats $format -} - - -# ns_log Notice "comment_list $comment_list" - - - - -# --------------------------------------------------------------- # +# --------------------------------------------------------------- # permissions and title setup, etc -# we should update the permissions to not just use package_id, so -# users can have permissions on particular tasks but not others. -# Right now it's an open system. If you have write permissions on -# the package_id, you have permissions to write anywhere -# --------------------------------------------------------------- # +# --------------------------------------------------------------- -if {[exists_and_not_null task_id]} { +if {[string is true $edit_p]} { set title "Edit a $task_term_lower" set context [list [list $return_url "Go back"] "Edit $task_term"] + permission::require_permission \ -party_id $user_id \ -object_id $package_id \ -privilege write } else { - set title "Add a $task_term_lower" + set title "Add $task_term_lower" set context [list [list "one?item_id=$project_item_id" "One $project_term"] "New $task_term"] + permission::require_permission \ -party_id $user_id \ -object_id $package_id \ -privilege create } -# we use this to pass through the task_ids -set task_id_pass [string map {" " "-"} $task_id] +# ------------------------------------------------------------- +# Start creating the multirow we'll use to create the interface +# ------------------------------------------------------------- -# set up options for editing projects -set project_options [pm::project::get_list_of_open] +template::multirow create \ + tasks \ + task_item_id \ + process_task_id \ + one_line \ + description \ + description_mime_type \ + work \ + work_min \ + work_max \ + percent_complete \ + end_date_html \ + depends \ + assignee_html \ + dependency_html \ + logger_variable_html -# --------------------------------------------------------------- # -# Begin our form -# --------------------------------------------------------------- # +if {[string is true $edit_p]} { -ad_form -name add_edit -form { - my_key:key(acs_object_id_seq) + # ------- + # EDITING + # ------- - {task_id:text(hidden) - {value $task_id_pass} - } + set project_options [pm::project::select_list_of_open \ + -selected $project_item_id] - {send_email_p:text(select) - {options {{"Yes" t} {"No" f}}} - {value t} - } + # find out the default logger variable for this project + set logger_project [pm::project::get_logger_project \ + -project_item_id $project_item_id] + set logger_variable_id [logger::project::get_primary_variable \ + -project_id $logger_project] - {edit_p:text(hidden) - {value $edit_p} - } + # get old values + pm::task::get \ + -tasks_item_id $task_item_id \ + -one_line_array task_one_line \ + -description_array task_description \ + -description_mime_type_array task_description_mime_type \ + -estimated_hours_work_array task_estimated_hours_work \ + -estimated_hours_work_min_array task_estimated_hours_work_min \ + -estimated_hours_work_max_array task_estimated_hours_work_max \ + -dependency_array task_dependency \ + -percent_complete_array task_percent_complete \ + -end_date_day_array task_end_date_day \ + -end_date_month_array task_end_date_month \ + -end_date_year_array task_end_date_year \ + -project_item_id_array task_project_item_id - {return_url:text(hidden) - {value $return_url} - } + set number 1 + set total_number [llength $task_item_id] - {number:text(hidden) - {value $number} - } - -} - - -# ---------------------------------- -# we set the values for edited tasks -# ---------------------------------- - - -# we set the initial value to 0, because we need at least one value to -# pass to SQL. Otherwise, when we do the IN (123, 234, 455), there -# won't be any values inside, and it will fail. -set my_dependencies [list 0] - - -if {![ad_form_new_p -key task_id]} { - - # this form is being edited, not new - - # note we are indexing values from 1... - set i 1 - set old_description [list] - set old_description_mime_type [list] - - db_foreach get_old_tasks { *SQL* } { - - set task_title_arr($i) $my_task_title - set description_arr($i) $my_description - lappend old_description $my_description - lappend old_description_mime_type $my_mime_type - set mime_type_arr($i) $my_mime_type - set template_arr($i) [list $my_description $my_mime_type] - set estimated_hours_arr($i) $my_estimated_work - set estimated_hours_min_arr($i) $my_estimated_work_min - set estimated_hours_max_arr($i) $my_estimated_work_max - - # We need the date to be in the right format in order to pass - # through the validate filter. - set end_date_arr($i) [pm::util::reformat_date $my_end_date] - - set percent_complete_arr($i) $my_percent_complete - set actual_hours_worked_arr($i) $my_actual_hours_worked - set project_item_id_arr($i) $my_project_item_id - set task_item_id_arr($i) [lindex $task_id [expr $i - 1]] - set dependency_arr($i) $my_dependency - # we keep track of this to make sure that depedencies that - # are from closed tasks are still shown on the list of - # possible dependencies to select from - if {[exists_and_not_null my_dependency]} { - lappend my_dependencies $my_dependency + set deps [list] + foreach task $task_item_id { + if {[lsearch $deps $task_dependency($task)] == -1 && \ + ![empty_string_p $task_dependency($task)]} { + lappend deps $task_dependency($task) } - - # we are not using a process - set process_task_id_arr($i) "" - - # ----------------------------------------------------- - # if we are editing the tasks, then we want to show the - # percent_complete, and give the users the chance to - # log hours as well. - # ----------------------------------------------------- - - # we also want to pass throught he old description so that - # we can do a word diff on the next page, so people can see - # what has changed - - - ad_form -extend \ - -name add_edit \ - -form \ - [list [list percent_complete.$i:text \ - {label "Percent complete"} \ - {html {size 4}} \ - {value {$percent_complete_arr($i)}} \ - ] \ - [list new_hours_logged.$i:text,optional \ - {label "Hours logged"} \ - {html {size 4}} \ - ] \ - [list new_description_logged.$i:text,optional \ - {label "Description"} \ - {html {size 30}} \ - ] \ - ] - - # -------------------------------------- - # we don't skip tasks when we're editing - # -------------------------------------- - ad_form -extend \ - -name add_edit \ - -form \ - [list [list \ - skip_task_p.$i:text(hidden) \ - {value {f}} \ - ] \ - ] - - # ------------------------------------------------------ - # we allow people to enter general comments when editing - # ------------------------------------------------------ - ad_form -extend \ - -name add_edit \ - -form \ - [list [list \ - comment.$i:richtext,optional,nospell \ - {label "Comment"} \ - {html {rows 7 cols 40}} \ - ] \ - ] - - - incr i } - # we want to add in the old_description values as well - ad_form -extend \ - -name add_edit \ - -form \ - [list [list \ - comment.$i:text(hidden) \ - {value {$old_description}} \ - ] \ - ] - + foreach task $task_item_id { -} else { - - # ---------------------------------------------------------- - # if we are using a process, then we want to fill in all the - # default values for the user. - # ---------------------------------------------------------- + set end_date_html [pm::task::date_html \ + -selected_day $task_end_date_day($task) \ + -selected_month $task_end_date_month($task) \ + -selected_year $task_end_date_year($task)] - # get the values + set assignee_html [pm::task::assignee_html \ + -task_item_id $task \ + -number $number] - for {set i 1} {$i <= $number} {incr i} { - set task_title_arr($i) "" - set description_arr($i) "" - set mime_type_arr($i) "text/plain" - set template_arr($i) [list "" "text/plain"] - set estimated_hours_arr($i) "0" - set estimated_hours_min_arr($i) "0" - set estimated_hours_max_arr($i) "0" - set parent_arr($i) "" - set end_date_arr($i) "" - set percent_complete_arr($i) 0 - set actual_hours_worked_arr($i) 0 - set project_item_id_arr($i) $project_item_id - set task_item_id_arr($i) "" - set process_task_id_arr($i) "" - set dependency_arr($i) "" + set dependency_options_full [pm::task::options_list_html \ + -edit_p $edit_p \ + -task_item_id $task \ + -project_item_id $project_item_id \ + -dependency_task_id $task_dependency($task) \ + -dependency_task_ids "$deps" \ + -number $total_number \ + -current_number $number] - if {[exists_and_not_null process_id]} { + set variable_widget [logger::ui::variable_select_widget \ + -project_id $logger_project \ + -current_variable_id $logger_variable_id \ + -select_name logger_variable.$number] - set ptask_id [lindex $process_tasks [expr $i-1]] - - set task_title_arr($i) $one_line_v($ptask_id) - set description_arr($i) $description_v($ptask_id) - - set mime_type_arr($i) "text/plain" - set template_arr($i) [list "$description_v($ptask_id)" "text/plain"] - - set estimated_hours_arr($i) $estimated_hours_work_v($ptask_id) - set estimated_hours_min_arr($i) $estimated_hours_work_min_v($ptask_id) - set estimated_hours_max_arr($i) $estimated_hours_work_max_v($ptask_id) - - - # keeps track of what process_task_id this was based on - # so we can later get info on what assignments the process - # task had, and what dependencies as well - set process_task_id_arr($i) $ptask_id - - - # We also want to make it optional for the user whether or - # not they use any given task when they are using a - # process. Often, they will want to skips some of the - # tasks, and this gives them that option - - ad_form -extend \ - -name add_edit \ - -form \ - [list [list \ - skip_task_p.$i:text(select) \ - {label \"Skip this task?\"} \ - {options {{No f} {Yes t}}} \ - {value {f}} \ - {help_text {If you skip this task, it will not be created}} \ - ] \ - ] - + template::multirow append tasks \ + $task \ + "" \ + $task_one_line($task) \ + $task_description($task) \ + $task_description_mime_type($task) \ + $task_estimated_hours_work($task) \ + $task_estimated_hours_work_min($task) \ + $task_estimated_hours_work_max($task) \ + $task_percent_complete($task) \ + $end_date_html \ + $task_dependency($task) \ + $assignee_html \ + $dependency_options_full \ + $variable_widget - } else { - # we never skip when there is no process being used - ad_form -extend \ - -name add_edit \ - -form \ - [list [list \ - skip_task_p.$i:text(hidden) \ - {value {f}} \ - ] \ - ] - - } - - # ----------------------------------------------------- - # for new tasks, we hide the percent_complete - # ----------------------------------------------------- - - ad_form -extend \ - -name add_edit \ - -form \ - [list [list percent_complete.$i:text(hidden) \ - {label "Percent complete \#$i"} \ - {html {size 4}} \ - {value {$percent_complete_arr($i)}} \ - ] \ - ] - - # ----------------------------------------------------------- - # we only allow people to enter general comments when editing - # we also want to pass throught he old description so that - # we can do a word diff on the next page, so people can see - # what has changed - # ----------------------------------------------------------- - ad_form -extend \ - -name add_edit \ - -form \ - [list [list \ - comment.$i:text(hidden) \ - {value ""} \ - ] \ - ] - - + incr number } - # we want to add in the old_description values as well - ad_form -extend \ - -name add_edit \ - -form \ - [list [list \ - comment.$i:text(hidden) \ - {value {}} \ - ] \ - ] +} elseif {[string is true $using_process_p]} { -} + # ------------- + # USING PROCESS + # ------------- -# get dependency types + set process_name [pm::process::process_name \ + -process_id $process_id] -#set options [list] -#db_foreach get_dependency_types { } -column_array dependencies { -# lappend options "{\"$dependencies(description)\" $dependencies(short_name)}" -#} + # get all the process task info + pm::process::get \ + -process_id $process_id \ + -process_task_id $process_task_id \ + -one_line_array process_one_line \ + -description_array process_description \ + -description_mime_type_array process_description_mime_type \ + -estimated_hours_work_array process_estimated_hours_work \ + -estimated_hours_work_min_array process_estimated_hours_work_min \ + -estimated_hours_work_max_array process_estimated_hours_work_max \ + -dependency_array process_dependency \ + -tasks_list process_tasks - -# ---------------------------------------------- -# extend the form with all the items that repeat -# ---------------------------------------------- - -for {set i 1} {$i <= $number} {incr i} { - - # ---------------------------------------------------------------- - # reading this code, you may wonder why we put the .$i at the end. - # DaveB showed me this trick. It lets you make a multiple out of - # the items by stuffing them in an array. Long live DaveB. - # ---------------------------------------------------------------- - - # set up the tasks that can be viewed. Take out the current task. - - # --------------------------------------------------- - # set up the tasks that this task can be dependent on - # For new tasks, that includes the other new tasks - # We have to check later that the user doesn't enter - # any loops! - # --------------------------------------------------- - - if {[string is false $edit_p]} { - - # if we have a process, we need to bring in the dependencies - # from the process. - # - # We have the following: - # process_tasks: a list of all the process task ids, which act - # as keys for the other information. - # dependency_v(process_task_id) which process these tasks rely on. - # - - if {[exists_and_not_null process_id]} { - - # what is the task that the process says this task - # depends on? - set process_index [expr $i - 1] - set this_process [lindex $process_tasks $process_index] - - if {[exists_and_not_null dependency_v($this_process)]} { - set process_depend $dependency_v($this_process) - } else { - set process_depend "XXX" - } - - # lsearch gives us the index value inside the - # process_tasks list. That corresponds to the task minus - # one. So we add one to this index, as long as the value - # is not -1 (which indicates that process_depend is not in - # the process_tasks list) - # can have more than one match, so we use -all - - set which_dep_task_list [lsearch -all $process_tasks $process_depend] - - foreach which_dep $which_dep_task_list { - - # indexes are from 0, we want from 1 - incr which_dep - - # num1 is a convention, used to indicate dependencies - # on tasks that haven't been created yet. - set dependency_arr($i) "num$which_dep" - } - + # we now have an array (process_dependency) that contains all the + # templates for where the dependencies should lie. However, the + # user may not have selected all the process tasks to be + # created. We also need to keep track of which new task + # corresponds with which process task, so we can make sure the + # default process + set number 1 + foreach pt $process_tasks { + set task_num($pt) $number + incr number + } + foreach pt $process_tasks { + if {[exists_and_not_null process_dependency($pt)]} { + # keep track of which task the new task should by default + # depend upon + set task_parent_num($pt) $task_num($process_dependency($pt)) + } else { + set task_parent_num($pt) "" } - - } + set new_tasks [llength $process_tasks] - set dependency_options_full [pm::task::options_list \ - -edit_p $edit_p \ - -task_item_id $task_item_id_arr($i) \ - -project_item_id $project_item_id_arr($i) \ - -dependency_task_ids "$my_dependencies" \ - -number $number \ - -current_number $i] + set end_date_html [pm::task::date_html] + set number 1 + set total_number [llength $process_tasks] - # if the current project is closed, we need to append it to the - # list of open projects - if {![pm::project::open_p -project_item_id "$project_item_id_arr($i)"] && [exists_and_not_null project_item_id_arr($i)]} { - set project_options_plus [db_list_of_lists get_closed_project " - SELECT - case when o.name is null then p.title || ' -- Closed' else o.name || ' - ' || p.title || ' -- Closed' end as title, - p.item_id - FROM - pm_projectsx p LEFT JOIN - organizations o ON p.customer_id = o.organization_id - WHERE - p.item_id = $project_item_id_arr($i) - "] + foreach pt $process_tasks { - set project_options_plus [concat $project_options_plus $project_options] - } else { - set project_options_plus $project_options - } + set assignee_html [pm::task::assignee_html \ + -number $number \ + -process_task_id $pt] - ad_form -extend \ - -name add_edit \ - -form \ - [list \ - [list \ - task_title.$i:text \ - {label "Subject \#$i"} \ - {html {size 40}} \ - {value {$task_title_arr($i)}} - ] \ - [list project_item_ids.$i:text(select) \ - {label "Project"} \ - {options $project_options_plus} \ - {value {$project_item_id_arr($i)}} \ - ] \ - [list task_item_id.$i:text(hidden) \ - {label "Task item id"} \ - {value {$task_item_id_arr($i)}} \ - ] \ - [list process_task_ids.$i:text(hidden) \ - {label "Process task id"} \ - {value {$process_task_id_arr($i)}} \ - ] \ - [list \ - description.$i:richtext,optional,nospell \ - {label "Description"} \ - {html {rows 7 cols 40}} \ - {value {$template_arr($i)}} \ - ] \ - [list \ - end_date.$i:date,to_sql(linear_date),optional \ - {label "Deadline"} \ - {format "MONTH DD YYYY"} \ - {value $end_date_arr($i)} \ - {help} \ - ] \ - [list \ - dependency_type.$i:text(hidden),optional \ - {label \"Dependency type\"} \ - {value {finish_before_start}} \ - ] \ - [list \ - dependency_task_id.$i:text(select),optional \ - {label \"Dependency\"} \ - {options {$dependency_options_full}} \ - {value {$dependency_arr($i)}} \ - {help_text {$task_term the dependency is based on}} \ - ] \ - ] - if {$use_uncertain_completion_times_p} { - ad_form -extend \ - -name add_edit \ - -form \ - [list \ - [list \ - estimated_hours_work_min.$i:text \ - {label "Hours estimate - min"} \ - {html {size 5}} \ - {value {$estimated_hours_min_arr($i)}} \ - ] \ - [list \ - estimated_hours_work_max.$i:text \ - {label "Hours estimate - max"} \ - {html {size 5}} \ - {value {$estimated_hours_max_arr($i)}} \ - ] \ - ] - } else { - ad_form -extend -name add_edit \ - -form \ - [list \ - [list \ - estimated_hours_work.$i:text \ - {label "Hours estimate"} \ - {html {size 5}} \ - {value {$estimated_hours_arr($i)}} \ - ] \ - ] - } -} + set dependency_options_full [pm::task::options_list_html \ + -edit_p $edit_p \ + -project_item_id $project_item_id \ + -depends_on_new $task_parent_num($pt) \ + -number $new_tasks \ + -current_number $number] + # make sure deps are working. + template::multirow append tasks \ + "" \ + $process_task_id \ + $process_one_line($pt) \ + $process_description($pt) \ + $process_description_mime_type($pt) \ + $process_estimated_hours_work($pt) \ + $process_estimated_hours_work_min($pt) \ + $process_estimated_hours_work_max($pt) \ + "0" \ + $end_date_html \ + $process_dependency($pt) \ + $assignee_html \ + $dependency_options_full \ + "" - -ad_form -extend -name add_edit -select_query_name task_query -on_submit { - - set user_id [ad_conn user_id] - set peeraddr [ad_conn peeraddr] - -} -new_data { - - # -------------------------------------------------------------- - # each task we add in returns a task_revision_id - # -------------------------------------------------------------- - - set task_id [list] - - for {set i 1} {$i <= $number} {incr i} { - - if {![exists_and_not_null estimated_hours_work($i)]} { - set estimated_hours_work($i) [expr .5 * ($estimated_hours_work_max($i) - $estimated_hours_work_min($i)) + $estimated_hours_work_min($i)] - } - - if {![exists_and_not_null estimated_hours_work_min($i)]} { - set estimated_hours_work_min($i) $estimated_hours_work($i) - } - - if {![exists_and_not_null estimated_hours_work_max($i)]} { - set estimated_hours_work_max($i) $estimated_hours_work($i) - } - - - if {![exists_and_not_null end_date_$i]} { - set end_date_$i "{} {} {} {} {} {}" - } - - # set up variables, pulling from arrays - set p_project_item_id $project_item_ids($i) - - set p_task_title $task_title($i) - - set p_description $description($i) - set p_mime_type $description_format($i) - - set p_work $estimated_hours_work($i) - set p_work_min $estimated_hours_work_min($i) - set p_work_max $estimated_hours_work_max($i) - set p_end_date [set end_date_$i] - set p_dep_type $dependency_type($i) - set p_parent_task_id $dependency_task_id($i) - set p_skip_p $skip_task_p($i) - - # we don't do anything for the comments field, because they - # are not added in for new tasks. - - # add in the new task - - if {[string equal $p_skip_p "f"]} { - set this_revision_id [pm::task::new \ - -project_id $p_project_item_id \ - -title $p_task_title \ - -description $p_description \ - -mime_type $p_mime_type \ - -end_date $p_end_date \ - -percent_complete "0" \ - -estimated_hours_work $p_work \ - -estimated_hours_work_min $p_work_min \ - -estimated_hours_work_max $p_work_max \ - -creation_user $user_id \ - -creation_ip $peeraddr \ - -package_id $package_id] - - set this_task_id [db_string get_task_item_id {}] - - set dependent_task_id($i) $this_task_id - - if {[exists_and_not_null p_parent_task_id]} { - - # if the p_parent_task_id contains num at the beginning, then - # the task is supposed to depend on other tasks that - # are currently being created. We have to wait until - # the tasks have been created - if {[regexp {num.*} $p_parent_task_id]} { - regexp {num(.*)} $p_parent_task_id match d_parent - - # dep_parent tracks who is parent of what - set dep_parent($i) $d_parent - set dep_type($i) $p_dep_type - lappend parent_new_task $i - # we wait until after all the tasks have been created to create these - # dependencies - } else { - - # add in the new dependency - pm::task::dependency_add \ - -task_item_id $this_task_id \ - -parent_id $p_parent_task_id \ - -dependency_type $p_dep_type \ - -project_item_id $p_project_item_id - } - } - - lappend process_task_id $process_task_ids($i) - lappend revisions $this_revision_id - lappend task_id $this_task_id - } + incr number } - if {[exists_and_not_null parent_new_task]} { - # there are tasks that depend on newly created tasks. - # 1. check for loops - # 2. if no loops, create dependencies +} else { - foreach dep_task $parent_new_task { + # --- + # NEW + # --- - set this_task_id $dependent_task_id($dep_task) - if {[info exists dependent_task_id($dep_parent($dep_task))]} { - set parent_task_id $dependent_task_id($dep_parent($dep_task)) - set p_dep_type $dep_type($dep_task) + set end_date_html [pm::task::date_html] - pm::task::dependency_add \ - -task_item_id $this_task_id \ - -parent_id $parent_task_id \ - -dependency_type $p_dep_type \ - -project_item_id $p_project_item_id - } + for {set i 1} {$i <= $new_tasks} {incr i} { - } + set assignee_html [pm::task::assignee_html \ + -number $i] - } + set dependency_options_full [pm::task::options_list_html \ + -edit_p $edit_p \ + -project_item_id $project_item_id \ + -number $new_tasks \ + -current_number $i] -} -edit_data { + # sorry this isn't internationalized. The choice is to cludge + # around dates, or to cludge around ad_forms poor support for + # multiple dates. - set timestamp_ansi [db_string get_today " - SELECT - to_char(current_date, 'YYYY-MM-DD')"] + template::multirow append tasks \ + "" \ + "" \ + "" \ + "" \ + "text/plain" \ + 0 \ + 0 \ + 0 \ + 0 \ + $end_date_html \ + "" \ + $assignee_html \ + $dependency_options_full \ + "" - # -------------------------------------------------------------- - # each task we edit returns a task_revision_id - # -------------------------------------------------------------- - - for {set i 1} {$i <= $number} {incr i} { - - if {![exists_and_not_null end_date_$i]} { - set end_date_$i "{} {} {} {} {} {}" - } - - if {![exists_and_not_null estimated_hours_work($i)]} { - set estimated_hours_work($i) [expr .5 * ($estimated_hours_work_max($i) - $estimated_hours_work_min($i)) + $estimated_hours_work_min($i)] - } - - if {![exists_and_not_null estimated_hours_work_min($i)]} { - set estimated_hours_work_min($i) $estimated_hours_work($i) - } - - if {![exists_and_not_null estimated_hours_work_max($i)]} { - set estimated_hours_work_max($i) $estimated_hours_work($i) - } - - # set up variables, pulling from arrays - set p_project_item_id $project_item_ids($i) - - set p_task_item_id $task_item_id($i) - set p_task_title $task_title($i) - set p_description $description($i) - set p_mime_type $description_format($i) - - set p_comment $comment($i) - set p_comment_type $comment_format($i) - - set p_percent $percent_complete($i) - set p_work $estimated_hours_work($i) - set p_work_min $estimated_hours_work_min($i) - set p_work_max $estimated_hours_work_max($i) - set p_parent_task_id $dependency_task_id($i) - - set p_new_hours $new_hours_logged($i) - set p_new_description $new_description_logged($i) - - if {![empty_string_p $p_new_hours] && \ - $p_new_hours > 0} { - - set logger_project [pm::project::get_logger_project \ - -project_item_id $p_project_item_id] - set variable_id [logger::variable::get_default_variable_id] - - # add in the new log entry - set p_hours [pm::project::log_hours \ - -logger_project_id $logger_project \ - -variable_id $variable_id \ - -value $p_new_hours \ - -description $p_new_description \ - -timestamp_ansi $timestamp_ansi \ - -task_item_id $p_task_item_id \ - -project_item_id $p_project_item_id \ - -update_status_p f] - - if {[string equal p_hours -1]} { - ns_log Error "Error in logging hours in task-add-edit" - set p_hours 0 - } - } else { - set p_hours [pm::task::update_hours \ - -task_item_id $p_task_item_id \ - -update_tasks_p f] - } - - # do the actual edit - set this_revision_id [pm::task::edit \ - -task_item_id $p_task_item_id \ - -project_item_id $p_project_item_id \ - -title $p_task_title \ - -description $p_description \ - -mime_type $p_mime_type \ - -comment $p_comment \ - -comment_type $p_comment_type \ - -end_date "[set end_date_[set i]]" \ - -percent_complete $p_percent \ - -estimated_hours_work $p_work \ - -estimated_hours_work_min $p_work_min \ - -estimated_hours_work_max $p_work_max \ - -actual_hours_worked $p_hours \ - -update_user $user_id \ - -update_ip $peeraddr \ - -package_id $package_id] - - - lappend revisions $this_revision_id - - pm::task::dependency_delete_all \ - -task_item_id $p_task_item_id - - if {![empty_string_p $p_parent_task_id]} { - - pm::task::dependency_add \ - -task_item_id $p_task_item_id \ - -parent_id $p_parent_task_id \ - -dependency_type jfdsafesa\ - -project_item_id $p_project_item_id - } - - # add in general comments for the task - - if {![empty_string_p $p_comment]} { - - pm::util::general_comment_add \ - -object_id $p_task_item_id \ - -title "$p_task_title" \ - -comment "$p_comment" \ - -mime_type "$p_comment_type" \ - -user_id $user_id \ - -peeraddr $peeraddr \ - -send_email_p "f" - - } - } +} -} -after_submit { - ad_returnredirect -message "Task(s) saved. Now choose assignees" "task-assign-add-edit?[export_vars -url {comment_list comment_formats edit_p return_url process_task_id:multiple revisions:multiple task_id:multiple old_description old_description_mime_type send_email_p}]" - # compile a list of which projects the tasks are assigned to - # there is a bug here, because we don't update a project when a - # task is edited and changed to another project. - - set project_item_id_list [list] - for {set i 1} {$i <= $number} {incr i} { - - if {[string equal [lsearch $project_item_id_list $project_item_ids($i)] -1]} { - lappend project_item_id_list $project_item_ids($i) - } - - } - - foreach proj_item $project_item_id_list { - - # to add back in subproject support, should use - # compute_parent_status - pm::project::compute_status $proj_item - - } - - ad_script_abort - -} - +set export_vars [export_vars -form {edit_p using_process_p return_url}] Index: openacs-4/contrib/packages/project-manager/www/task-calendar.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/task-calendar.tcl,v diff -u -r1.1.2.5 -r1.1.2.6 --- openacs-4/contrib/packages/project-manager/www/task-calendar.tcl 15 Sep 2004 23:05:52 -0000 1.1.2.5 +++ openacs-4/contrib/packages/project-manager/www/task-calendar.tcl 26 Oct 2004 01:21:11 -0000 1.1.2.6 @@ -48,10 +48,6 @@ border-top: thin dotted grey; } -.calendar-item strong { - color: \#f99; -} - .calendar-item strike { color: \#bbb; text-decoration: line-through; Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/contrib/packages/project-manager/www/task-link.tcl'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/contrib/packages/project-manager/www/task-one-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/task-one-postgresql.xql,v diff -u -r1.19.2.3 -r1.19.2.4 --- openacs-4/contrib/packages/project-manager/www/task-one-postgresql.xql 8 Oct 2004 21:25:05 -0000 1.19.2.3 +++ openacs-4/contrib/packages/project-manager/www/task-one-postgresql.xql 26 Oct 2004 01:21:11 -0000 1.19.2.4 @@ -23,20 +23,23 @@ t.percent_complete, i.live_revision, p.first_names || ' ' || p.last_name as creation_user, - proj_rev.title as project_name + proj_rev.title as project_name, + a.process_instance FROM pm_tasks_revisionsx t, cr_items i, persons p, cr_items proj, - cr_revisions proj_rev + cr_revisions proj_rev, + pm_tasks_active a WHERE t.item_id = :task_id and t.revision_id = :task_revision_id and t.item_id = i.item_id and t.creation_user = p.person_id and t.parent_id = proj.item_id and - proj.live_revision = proj_rev.revision_id + proj.live_revision = proj_rev.revision_id and + t.item_id = a.task_id Index: openacs-4/contrib/packages/project-manager/www/task-one.adp =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/task-one.adp,v diff -u -r1.23.2.5 -r1.23.2.6 --- openacs-4/contrib/packages/project-manager/www/task-one.adp 15 Jul 2004 20:31:47 -0000 1.23.2.5 +++ openacs-4/contrib/packages/project-manager/www/task-one.adp 26 Oct 2004 01:21:11 -0000 1.23.2.6 @@ -5,17 +5,40 @@ @context;noquote@ -

    (not current, select live version from the task change page)

    +

    (not current, select live version from the task change page)

    - +
    +
    - +
    + + + + + + + + + +
    + + Process status + +
    @process_html;noquote@
    +

    + + + + - - - - + + + + + + - + -
    + + Print @task_term@ #@task_id@: @task_info.task_title@ - + + + @task_term@ #@task_id@: @task_info.task_title@@task_term@ #@task_id@: @task_info.task_title@ + +
    + @@ -98,13 +127,19 @@ Index: openacs-4/contrib/packages/project-manager/www/task-one.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/task-one.tcl,v diff -u -r1.24.2.7 -r1.24.2.8 --- openacs-4/contrib/packages/project-manager/www/task-one.tcl 8 Oct 2004 21:25:05 -0000 1.24.2.7 +++ openacs-4/contrib/packages/project-manager/www/task-one.tcl 26 Oct 2004 01:21:11 -0000 1.24.2.8 @@ -145,6 +145,18 @@ } +# if part of a process, offer link to process +if {![empty_string_p $task_info(process_instance)]} { + set process_url [pm::process::url \ + -process_instance_id $task_info(process_instance) \ + -project_item_id $task_info(project_item_id) \ + -fully_qualified_p "f"] + set process_name [pm::process::name \ + -process_instance_id $task_info(process_instance)] + set process_html "$process_name" +} else { + set process_html "" +} # set link to comments @@ -156,11 +168,10 @@ # how to get back here -set return_url [ad_return_url -qualified] +set return_url [ad_return_url] -set task_edit_url "task-add-edit?my_key=1&task_id=$task_id&return_url=$return_url" +set task_edit_url [export_vars -base task-add-edit {{task_item_id $task_id} return_url project_item_id}] - set logger_project [pm::project::get_logger_project \ -project_item_id $task_info(project_item_id)] @@ -327,7 +338,7 @@ -elements { first_names { label { - Who + Who } display_template { @people.user_info@ Index: openacs-4/contrib/packages/project-manager/www/task-select-project.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/task-select-project.tcl,v diff -u -r1.2.2.2 -r1.2.2.3 --- openacs-4/contrib/packages/project-manager/www/task-select-project.tcl 2 Jul 2004 23:13:49 -0000 1.2.2.2 +++ openacs-4/contrib/packages/project-manager/www/task-select-project.tcl 26 Oct 2004 01:21:11 -0000 1.2.2.3 @@ -14,6 +14,8 @@ } { {process_id:integer ""} + {process_task_id:integer,multiple ""} + {project_item_id ""} {return_url ""} {status_type "o"} {searchterm ""} @@ -41,16 +43,25 @@ unset searchterm } +set hidden_vars [export_vars -form {process_id return_url process_task_id:multiple}] -# terminology -set project_term [parameter::get -parameter "ProjectName" -default "Project"] -set task_term [parameter::get -parameter "TaskName" -default "Task"] -# set task_term_lower [parameter::get -parameter "taskname" -default "task"] -# set use_uncertain_completion_times_p [parameter::get -parameter "UseUncertainCompletionTimesP" -default "1"] +if {[exists_and_not_null project_item_id]} { + ad_returnredirect [export_vars -base task-add-edit {project_item_id process_id return_url process_task_id:multiple}] +} -set title "Select a $project_term to assign this $task_term to" +# terminology +set Project_Term [parameter::get -parameter "ProjectName" -default "Project"] +set project_term [parameter::get -parameter "projectname" -default "project"] +set Task_Term [parameter::get -parameter "TaskName" -default "Task"] +set task_term [parameter::get -parameter "taskname" -default "task"] +if {[empty_string_p $process_id]} { + set title "Select a $project_term to assign this $task_term to" +} else { + set title "Select a $project_term to assign this process to" +} + if {![exists_and_not_null searchterm]} { set searchterm_copy "" set searchterm_where_clause "" @@ -71,8 +82,6 @@ set root_folder [db_string get_root "select pm_project__get_root_folder (:package_id, 'f')"] -set hidden_vars [export_vars -form {process_id return_url}] - template::list::create \ -name projects \ -multirow projects \ @@ -139,7 +148,7 @@ db_multirow -extend { item_url description_html } projects select_a_project { } { - set item_url [export_vars -base "task-add-edit" {project_item_id process_id return_url}] + set item_url [export_vars -base "task-add-edit" {project_item_id process_id process_task_id:multiple return_url}] set richtext_list [list $description $mime_type] set description_html [template::util::richtext::get_property html_value $richtext_list] Index: openacs-4/contrib/packages/project-manager/www/tasks.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/Attic/tasks.tcl,v diff -u -r1.5.2.9 -r1.5.2.10 --- openacs-4/contrib/packages/project-manager/www/tasks.tcl 22 Sep 2004 18:30:52 -0000 1.5.2.9 +++ openacs-4/contrib/packages/project-manager/www/tasks.tcl 26 Oct 2004 01:21:11 -0000 1.5.2.10 @@ -178,7 +178,7 @@ } } \ -orderby { - default_value latest_start_pretty,asc + default_value latest_finish_pretty,asc task_number { label "Task \#" orderby_desc "ts.task_number desc, p.first_names, p.last_name" Index: openacs-4/contrib/packages/project-manager/www/resources/bl-ddffdd.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/bl-ddffdd.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/bl-e6e6fa.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/bl-e6e6fa.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/br-ddffdd.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/br-ddffdd.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/br-e6e6fa.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/br-e6e6fa.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tl-9999cc.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tl-9999cc.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tl-ddffdd.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tl-ddffdd.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tl-dfdfff.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tl-dfdfff.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tl-e6e6fa.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tl-e6e6fa.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tr-9999cc.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tr-9999cc.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tr-ddffdd.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tr-ddffdd.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tr-dfdfff.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tr-dfdfff.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ Index: openacs-4/contrib/packages/project-manager/www/resources/tr-e6e6fa.jpg =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/packages/project-manager/www/resources/Attic/tr-e6e6fa.jpg,v diff -u -r1.1 -r1.1.2.1 Binary files differ
    - + + - + + + + +
    + + Dates + +
    + @@ -128,30 +163,60 @@
    Earliest start
    + +   + +

    - +
    + + - + + + + +
    + + Assignees + +
    +
    + +   + +

    - + + - - - + + + + +
    + + Logger + +
    + Hours remaining: @task_info.hours_remaining@
    @@ -171,7 +236,7 @@
    +
    @variable_widget;noquote@ @variable_exports;noquote@ @@ -184,7 +249,7 @@
    +
    + +   + +

    - +
    + + - + + + + +
    + + @task_term@s this depends on. + +
    +
    + +   + +

    - +
    + + - + + + + +
    + + @task_term@s depending on this @task_term@ + +
    +
    + +   + +

    - +
    + + - + + + + + + + +
    + + Related @task_term@s + +
    +
    + + Link task: + + + +
    + +   + +