[Rt-commit] rt branch, menu-redo, updated. fd8c6d433615a86630318b17a43bfc6d697d8f8f

jesse jesse at bestpractical.com
Mon Nov 9 20:55:55 EST 2009


The branch, menu-redo has been updated
       via  fd8c6d433615a86630318b17a43bfc6d697d8f8f (commit)
       via  db86191ec66d3ca6ae99e50806852f76ec0332e5 (commit)
       via  16cd93818ea0b28f345233e9ea091dd8b7a50be7 (commit)
       via  88166e3ac034c1bf395c3c34c8006b7cb1dc5523 (commit)
       via  3929bac863d189217ca0987f3b5165c8a691da85 (commit)
       via  3a06d322d6262a9d3f1e0b0ee2c016610fab8ee4 (commit)
       via  a209cdf0c9c67cc96588132000207847dfe4fa59 (commit)
       via  0f31ca72e6017a39f7a76ad1d1448c2ac3d43a36 (commit)
       via  b1befea01c969a08b6cc8dee572d0ebe6d27e21f (commit)
       via  d4d7d5530b3fce152a9bab37725b85dabbc4394f (commit)
       via  9983649af1cfb9b516d122a4bb453bd31f277e1a (commit)
       via  8d398ddac8b27c12e7cae11588ed2f0c2fc959b0 (commit)
       via  e7a3c2ed6a7e575e86ef8011a14f5ba4c1edf3c7 (commit)
       via  ef6f9eea610a6c8fc063d345865104b35540c5a0 (commit)
       via  d23386b2de2a02a150e2f7e664a4d9b931ee72e7 (commit)
       via  ecc49ef36d2e2f1a6fa726decae3670af8582f26 (commit)
       via  52e00bf2709798bd5eb63fac7adcb9970f5aa840 (commit)
       via  27cfe643ef3a6309ad0877dd928f9d59434b301e (commit)
       via  6afbe47e066099cfe87d2030a5ee7dff263a7465 (commit)
       via  25d69933c91b683cbc913812044c87f5c5c2312d (commit)
       via  b59581df5b8eab0ba7cfc207e0e6a8dbf998b50e (commit)
       via  12204037e3c29765fbbca46eeced23cdf27b8543 (commit)
       via  b0b6def3db958817ff6705ef75de887757b66701 (commit)
       via  297ef780c6f9f7de719ff69a0e02414e38b9d53d (commit)
       via  496e6da26fbfede00e693d54efd08f68ab1f2244 (commit)
       via  30d6694fb8f6608b9e6d04a45317211b34dee17a (commit)
       via  6cfc7fa5331aa26987138913485b0af775bf18ce (commit)
       via  1e1e66f84cb43884f4f5df8a3c50efd4b59d7d99 (commit)
       via  26191cb90b236d4a6cf709eb9aa99bc868bd2901 (commit)
       via  7870e7f02e059a58ad5c56c547896478c406ef31 (commit)
       via  253eb19ea1ecf029cb169602530541238ebaedd6 (commit)
       via  2d829f9e24074edc8540abc682e2a055394041bc (commit)
       via  48a4a71d8ecf727bf39dcf03abcf88146d292682 (commit)
       via  2544419240167e9a8fd4a915520056f425b835ff (commit)
       via  7e36049dd282388af0b4d98bd22e274043774b85 (commit)
       via  5fe2e74c6f5d127fa74132df4620c870212533b8 (commit)
       via  0e1481c9637a9a3c86dbd062f58b18c518c84030 (commit)
       via  3c5392a734b770de304a9aabb245b42bb471ee72 (commit)
       via  eb5083994f781813f051dc19e41c0aad194ba291 (commit)
       via  89cba24be778542f3237d8c4323813f7264737eb (commit)
       via  20fdc5f179a20f0adc1530f2675a216d9afbcf6a (commit)
       via  f39e4e7ae94956e2928553aa0cc36b34164b8e26 (commit)
       via  33ddbccf5e829b20cecbdd2333365c8627a0fe9b (commit)
       via  a16b6af4b3ab91a3ea42757dcc24d479b192e155 (commit)
       via  40c61ed0e4c87ccf57b78dab641c3408e1c97bc2 (commit)
       via  54dcf157b1c57a3b629df808a769ac3784cfa1b8 (commit)
       via  69ef54528958856f7f5727d9f1bf2b86e1e2d38b (commit)
       via  e75caec4ea20db7b5f229bb40c8a6f8d9a5b8f53 (commit)
       via  8c36128ee57e7e9d525a63d1e42a0a8177ec165f (commit)
       via  0ee30e6a7ea5de1d39c2787730942df03ab92c0a (commit)
       via  2df7ebc690749164e85d6b7b8be9dca3f6c0c21a (commit)
       via  306d05b930d472069e5b0b9e848976f91a8985e2 (commit)
       via  ebcaa03b0845f2dd435b97ec642504cd6e225bc1 (commit)
       via  d3229b63b34c22e0561a12606da939a5dd4f7f3e (commit)
       via  e08153afd1ace3939b1cf17b36a2c91b9b10209d (commit)
       via  8da265dd6181ffc9f22a42ee14fcf0fb6adb3df1 (commit)
       via  d85893c906619d110c6f71a2ad70144b89fb120a (commit)
       via  2fad999bd772e8e4cf7a113c7a96e8124486874a (commit)
       via  6b08e74a1c449cf301154e87bd17ce0c0157d0ca (commit)
       via  bdb999258e08f19d6c5f2b61beb47565d7dd3c47 (commit)
       via  5dec3e324f0d46891b4cc0c7a13cfc2a6a879a83 (commit)
       via  af525c71ca4397beabb31762ed5cc4b45089fd71 (commit)
       via  281dd66cc9037be26b96bb62e12ceccc8213f1dc (commit)
       via  cf15d14559267c7f4f4849193a3f9dfae487f442 (commit)
       via  677590506c21a1045a8e4341ff3bb290593b36fb (commit)
       via  048c9f30b546c1856f6163808c45c5357b638e22 (commit)
       via  a76a42f2ab98429c6b4b952249210d96b11c0f2b (commit)
       via  d70f7443202628cac9694cd1c3f790703e1776e5 (commit)
       via  c82f2934a4621d3cde7bb2a591739d437ce77f53 (commit)
       via  7dc91a5149e5743f6ac946bd23593184f0e24d60 (commit)
       via  b2bbf538585fbb95e27693eb7b0f3115e1b294c1 (commit)
       via  1346a0281f28db61a7cd795a4221298431a75730 (commit)
      from  10030915165c6a2d6faee242390922e787240e2e (commit)

Summary of changes:
 .gitignore                                         |    1 +
 etc/initialdata                                    |    2 +-
 lib/RT/DateTime.pm                                 |    3 +
 lib/RT/Dispatcher.pm                               |   57 ++
 lib/RT/I18N.pm                                     |    2 +-
 lib/RT/Interface/Web.pm                            |   76 ++-
 lib/RT/Interface/Web/QueryBuilder.pm               |  691 ++++++++++++++++----
 lib/RT/Interface/Web/QueryBuilder/Tree.pm          |    4 +-
 lib/RT/Report/Tickets.pm                           |    2 +-
 lib/RT/Test.pm                                     |   14 +-
 lib/RT/View.pm                                     |    3 -
 share/html/Admin/Elements/EditCustomFields         |    2 +-
 share/html/Admin/Elements/PickCustomFields         |    4 +-
 share/html/Elements/CollectionAsTable/Header       |    2 +-
 share/html/Elements/CollectionList                 |    4 +-
 share/html/Elements/Error                          |    3 +-
 share/html/Elements/ScrubHTML                      |   77 ---
 share/html/Elements/SelectOwner                    |    6 +-
 share/html/Elements/ShowCustomFieldText            |    2 +-
 share/html/Elements/ShowCustomFieldWikitext        |    2 +-
 share/html/Elements/ShowLinks                      |    2 +-
 share/html/Elements/ShowSearch                     |    2 +-
 share/html/Prefs/Search.html                       |    5 +-
 share/html/Prefs/SearchOptions.html                |    3 +-
 share/html/Search/Build.html                       |  249 +-------
 share/html/Search/Edit.html                        |    2 +-
 share/html/Search/Elements/BuildFormatString       |  230 -------
 share/html/Search/Elements/DisplayOptions          |    2 +-
 share/html/Search/Elements/EditQuery               |    6 +-
 share/html/Search/Elements/EditSearches            |  154 -----
 share/html/Search/Elements/PickCFs                 |    8 +-
 share/html/Search/Elements/PickCriteria            |    4 +-
 share/html/SelfService/Display.html                |    2 +-
 share/html/Ticket/Elements/ShowDates               |    2 +-
 .../Ticket/Elements/ShowTransactionAttachments     |    2 +-
 share/html/Ticket/Graphs/index.html                |   17 +-
 share/html/Ticket/Update.html                      |    2 +-
 share/html/Widgets/SavedSearch                     |    2 +-
 t/00-compile.t                                     |    2 +-
 t/00-mason-syntax.t                                |    2 +-
 t/api/action-createtickets.t                       |    2 +-
 t/api/attachment.t                                 |    2 +-
 t/api/attribute-tests.t                            |    2 +-
 t/api/attribute.t                                  |    2 +-
 t/api/cf.t                                         |    2 +-
 t/api/cf_combo_casacade.t                          |    2 +-
 t/api/cf_external.t                                |    2 +-
 t/api/cf_pattern.t                                 |    2 +-
 t/api/cf_single_values.t                           |    2 +-
 t/api/cf_transaction.t                             |    2 +-
 t/api/config.t                                     |    2 +-
 t/api/customfield.t                                |    2 +-
 t/api/date.t                                       |    2 +-
 t/api/emailparser.t                                |    2 +-
 t/api/group.t                                      |    2 +-
 t/api/groups.t                                     |    2 +-
 t/api/i18n.t                                       |    2 +-
 t/api/paging.t                                     |    2 +-
 t/api/queue.t                                      |    2 +-
 t/api/record.t                                     |    2 +-
 t/api/reminders.t                                  |    2 +-
 t/api/rights.t                                     |    2 +-
 t/api/rules-preview.t                              |    2 +-
 t/api/scrip_order.t                                |    2 +-
 t/api/searchbuilder.t                              |    2 +-
 t/api/system.t                                     |    2 +-
 t/api/template-insert.t                            |    2 +-
 t/api/ticket.t                                     |    2 +-
 t/api/tickets.t                                    |    2 +-
 t/api/tickets_overlay_sql.t                        |    2 +-
 t/api/uri-custom.t                                 |    2 +-
 t/api/user.t                                       |    2 +-
 t/api/users.t                                      |    2 +-
 t/approval/basic.t                                 |    2 +-
 t/clicky.t                                         |    2 +-
 t/cron.t                                           |    2 +-
 t/i18n/default.t                                   |    2 +-
 t/lorzy/accessor.t                                 |    2 +-
 t/lorzy/action.t                                   |    2 +-
 t/lorzy/condition-lambda.t                         |    2 +-
 t/lorzy/error.t                                    |    2 +-
 t/lorzy/update.t                                   |    2 +-
 t/mail/charsets-outgoing.t                         |    2 +-
 t/mail/crypt-gnupg.t                               |    2 +-
 t/mail/gateway.t                                   |   19 +-
 t/mail/gnupg-bad.t                                 |    2 +-
 t/mail/gnupg-incoming.t                            |    2 +-
 t/mail/gnupg-realmail.t                            |   10 +-
 t/mail/gnupg-reverification.t                      |    8 +-
 t/mail/mime_decoding.t                             |    2 +-
 t/mail/sendmail.t                                  |    2 +-
 t/maildigest/attributes.t                          |    2 +-
 t/plugin.t                                         |    2 +-
 t/rtname.t                                         |    2 +-
 t/savedsearch.t                                    |    2 +-
 t/shredder/00skeleton.t                            |    2 +-
 t/shredder/01basics.t                              |    2 +-
 t/shredder/01ticket.t                              |    2 +-
 t/shredder/02group_member.t                        |    2 +-
 t/shredder/02queue.t                               |    2 +-
 t/shredder/02template.t                            |    2 +-
 t/shredder/02user.t                                |    2 +-
 t/shredder/03plugin.t                              |    2 +-
 t/shredder/03plugin_summary.t                      |    2 +-
 t/shredder/03plugin_tickets.t                      |    2 +-
 t/shredder/03plugin_users.t                        |    2 +-
 t/ticket/action_linear_escalate.t                  |    2 +-
 t/ticket/add-watchers.t                            |    2 +-
 t/ticket/badlinks.t                                |    2 +-
 t/ticket/batch-upload-csv.t                        |    2 +-
 t/ticket/cfsort-freeform-multiple.t                |    2 +-
 t/ticket/cfsort-freeform-single.t                  |    2 +-
 t/ticket/deferred_owner.t                          |    2 +-
 t/ticket/link_search.t                             |    2 +-
 t/ticket/merge.t                                   |    2 +-
 t/ticket/pawsort.t                                 |    2 +-
 t/ticket/quicksearch.t                             |    2 +-
 t/ticket/requestor-order.t                         |    2 +-
 t/ticket/search.t                                  |    2 +-
 t/ticket/search_by_links.t                         |    2 +-
 t/ticket/search_by_txn.t                           |    2 +-
 t/ticket/search_by_watcher.t                       |    2 +-
 t/ticket/search_long_cf_values.t                   |    2 +-
 t/ticket/sort-by-queue.t                           |    2 +-
 t/ticket/sort-by-user.t                            |    2 +-
 t/ticket/sort_by_cf.t                              |    2 +-
 t/web/attachments.t                                |    2 +-
 t/web/basic.t                                      |   13 +-
 t/web/cf_access.t                                  |    2 +-
 t/web/cf_onqueue.t                                 |    2 +-
 t/web/cf_select_one.t                              |    2 +-
 t/web/command_line.t                               |    8 +-
 t/web/compilation_errors.t                         |   25 +-
 t/web/crypt-gnupg.t                                |    6 +-
 t/web/custom_frontpage.t                           |    2 +-
 t/web/custom_search.t                              |    2 +-
 t/web/dashboards-groups.t                          |    4 +-
 t/web/dashboards.t                                 |   13 +-
 t/web/gnupg-outgoing.t                             |    2 +-
 t/web/gnupg-select-keys-on-create.t                |    5 +-
 t/web/gnupg-select-keys-on-update.t                |    5 +-
 t/web/query_builder.t                              |    2 +-
 t/web/quicksearch.t                                |    2 +-
 t/web/rest.t                                       |    2 +-
 t/web/rights.t                                     |    2 +-
 t/web/rights1.t                                    |    5 +-
 t/web/ticket-create-utf8.t                         |    8 +-
 t/web/ticket_owner.t                               |    2 +-
 t/web/ticket_seen.t                                |    2 +-
 t/web/unlimited_search.t                           |    2 +-
 150 files changed, 927 insertions(+), 1051 deletions(-)
 delete mode 100644 share/html/Elements/ScrubHTML
 delete mode 100644 share/html/Search/Elements/BuildFormatString

- Log -----------------------------------------------------------------
commit fd8c6d433615a86630318b17a43bfc6d697d8f8f
Merge: 1003091 db86191
Author: Jesse Vincent <jesse at bestpractical.com>
Date:   Mon Nov 9 20:18:53 2009 -0500

    Merge branch '3.999-trunk' into menu-redo
    
    * 3.999-trunk: (69 commits)
      yay! now Search/Build.html has no init block
      unraveling the mysteries of "selected_clauses"
      make it not explode
      15 more loc down.
      go on case fix
      Ignore .prove
      small case fix
      perltidy
      "actions" -> "results"
      Further stabbing of %ARGS
      Search setup moved into lib
      %query -> $query
      switching over to a jifty api from a mason one
      whitespace
      perltidy
      minor tidying
      minor
      move the "should we save a search" check back out to the calling code
      extract out query default setting into lib
      extract some defaults-setting into a sub
      ...
    
    Conflicts:
    	lib/RT/Interface/Web/QueryBuilder.pm
    	share/html/Search/Build.html
    	share/html/Ticket/Elements/Tabs
    	t/web/dashboards.t

diff --cc lib/RT/Dispatcher.pm
index 5af4f89,485d2f4..9d5e3dd
--- a/lib/RT/Dispatcher.pm
+++ b/lib/RT/Dispatcher.pm
@@@ -180,448 -175,66 +180,505 @@@ on qr{^/Dashboards/(\d+)} => run 
  
  on qr{^/Ticket/Graphs/(\d+)} => run {
      Jifty->web->request->argument( id => $1 );
 -    show( '/Ticket/Graphs/Render' );
 +    show('/Ticket/Graphs/Render');
 +};
 +
 +before qr{.*} => run {
 +	page_nav->render_children_inline(1);
 +    main_nav->child( _('Homepage'),      url => '/' );
 +    main_nav->child( _('Simple Search'), url => '/Search/Simple.html' );
 +    main_nav->child( _('Tickets'),       url => '/Search/Build.html' );
 +    my $tools = main_nav->child( _('Tools'), url => '/Tools/index.html' );
 +    $tools->child( _('Dashboards'), url => '/Dashboards/index.html' );
 +
 +    my $reports = $tools->child( _('Reports'), url => '/Tools/Reports/index.html' );
 +    $reports->child( _('Resolved by owner'),       url => '/Tools/Reports/ResolvedByOwner.html', );
 +    $reports->child( _('Resolved in date range'),  url => '/Tools/Reports/ResolvedByDates.html', );
 +    $reports->child( _('Created in a date range'), url => '/Tools/Reports/CreatedByDates.html', );
 +
 +    $tools->child( _('My Day'), url => '/Tools/MyDay.html' );
 +
 +    if (   Jifty->web->current_user->user_object
 +        && Jifty->web->current_user->has_right( right => 'ShowConfigTab', object => RT->system ) )
 +    {
 +        my $admin = main_nav->child( Config => label => _('Configuration'), url => '/Admin/' );
 +        $admin->child( _('Users'),         url => '/Admin/Users/', );
 +        $admin->child( _('Groups'),        url => '/Admin/Groups/', );
 +        $admin->child( _('Queues'),        url => '/Admin/Queues/', );
 +        $admin->child( _('Custom Fields'), url => '/Admin/CustomFields/', );
 +        $admin->child( _('Rules'),         url => '/admin/rules/', );
 +
 +        my $admin_global = $admin->child( _('Global'), url => '/Admin/Global/', );
 +
 +        $admin_global->child( _('Templates'), url => '/Admin/Global/Templates.html', );
 +        my $workflows = $admin_global->child( _('Workflows'), url => '/Admin/Global/Workflows/index.html', );
 +        {
 +            $workflows->child( _('Overview')     => url => "/Admin/Global/Workflows/index.html" );
 +            $workflows->child( _('Localization') => url => "/Admin/Global/Workflows/Localization.html" );
 +            $workflows->child( _('Mappings')     => url => "/Admin/Global/Workflows/Mappings.html" );
 +        }
 +
 +        my $cfadmin = $admin_global->child( _('Custom Fields'), url => '/Admin/Global/CustomFields/index.html', );
 +        {
 +            $cfadmin->child(
 +                _('Users') => text => _('Select custom fields for all users'),
 +                url        => 'Admin/Global/CustomFields/Users.html'
 +            );
 +
 +            $cfadmin->child(
 +                _('Groups') => text => _('Select custom fields for all user groups'),
 +                url         => 'Admin/Global/CustomFields/Groups.html'
 +            );
 +
 +            $cfadmin->child(
 +                _('Queues') => text => _('Select custom fields for all queues'),
 +                url         => 'Admin/Global/CustomFields/Queues.html'
 +            );
 +
 +            $cfadmin->child(
 +                _('Tickets') => text => _('Select custom fields for tickets in all queues'),
 +                url => 'Admin/Global/CustomFields/Queue-Tickets.html'
 +            );
 +
 +            $cfadmin->child(
 +                _('Ticket Transactions') => text => _('Select custom fields for transactions on tickets in all queues'),
 +                url => 'Admin/Global/CustomFields/Queue-Transactions.html'
 +            );
 +
 +        }
 +
 +        $admin_global->child( _('Group rights'),   url => '/Admin/Global/GroupRights.html', );
 +        $admin_global->child( _('User rights'),    url => '/Admin/Global/UserRights.html', );
 +        $admin_global->child( _('RT at a glance'), url => '/Admin/Global/MyRT.html', );
 +        $admin_global->child( _('Jifty'),          url => '/Admin/Global/Jifty.html', );
 +        $admin_global->child( _('System'),         url => '/Admin/Global/System.html', );
 +
 +        my $admin_tools = $admin->child( _('Tools'), url => '/Admin/Tools/', );
 +        $admin_tools->child( _('System Configuration'), url => '/Admin/Tools/Configuration.html', );
 +        $admin_tools->child( _('Shredder'),             url => '/Admin/Tools/Shredder', );
 +    }
 +    if (Jifty->web->current_user->user_object
 +        && Jifty->web->current_user->has_right(
 +            right  => 'ModifySelf',
 +            object => RT->system
 +        )
 +        )
 +    {
 +        my $prefs = main_nav->child( _('Preferences'), url => '/Prefs/Other.html' );
 +
 +        $prefs->child( _('Settings'),       url => '/Prefs/Other.html', );
 +        $prefs->child( _('About me'),       url => '/User/Prefs.html', );
 +        $prefs->child( _('Search options'), url => '/Prefs/SearchOptions.html', );
 +        $prefs->child( _('RT at a glance'), url => '/Prefs/MyRT.html', );
 +    }
 +
 +    if (   Jifty->web->current_user->user_object
 +        && Jifty->web->current_user->has_right( right => 'ShowApprovalsTab', object => RT->system ) )
 +    {
 +        main_nav->child( _('Approval'), url => '/Approvals/' );
 +    }
 +};
 +
 +before qr'Dashboards/(\d*)?' => run {
 +	page_nav->child( _('Select'), url => "/Dashboards/index.html" );
 +	require RT::Dashboard; # not a record class, so not autoloaded :/
 +    if ( RT::Dashboard->new->_privacy_objects( create => 1 ) ) {
 +        page_nav->child( _('Create') => url => "/Dashboards/Modify.html?create=1" );
 +    }
 +
 +    if ( my $id = ($1 || Jifty->web->request->argument('id') )) {
 +        my $obj = RT::Dashboard->new();
 +        $obj->load_by_id($id);
 +        if ( $obj and $obj->id ) {
 +            my $tabs = page_nav->child( "this" => label => $obj->name, url    => "/Dashboards/Modify.html?id=" . $obj->id);
 +            $tabs->child( _('Basics'),       url => "/Dashboards/Modify.html?id=" . $obj->id );
 +            $tabs->child( _('Queries'),      url => "/Dashboards/Queries.html?id=" . $obj->id );
 +            $tabs->child( _('Subscription'), url => "/Dashboards/Subscription.html?dashboard_id=" . $obj->id ) if $obj->current_user_can_subscribe;
 +            $tabs->child( _('Show'), url => "/Dashboards/" . $obj->id . "/" . $obj->name )
 +
 +        }
 +    }
 +};
 +
 +
 +before '/SelfService' => run {
 +
 +    my $queues = RT::Model::QueueCollection->new();
 +    $queues->find_all_rows;
 +
 +    my $queue_count = 0;
 +    my $queue_id    = 1;
 +
 +    while ( my $queue = $queues->next ) {
 +        next unless $queue->current_user_has_right('CreateTicket');
 +        $queue_id = $queue->id;
 +        $queue_count++;
 +        last if ( $queue_count > 1 );
 +    }
 +
 +	my $TOP = main_nav();
 +
 +	$TOP->child( _('Open tickets'),   url => '/SelfService/', );
 +    $TOP->child( _('Closed tickets'), url => '/SelfService/Closed.html', );
 +    if ( $queue_count > 1 ) {
 +        $TOP->child( _('New ticket'), url => '/SelfService/CreateTicketInQueue.html' );
 +    } else {
 +        $TOP->child( _('New ticket'), url => '/SelfService/Create.html?queue=' . $queue_id );
 +    }
 +
 +    if (Jifty->web->current_user->has_right( right  => 'ModifySelf', object => RT->system)) {
 +        $TOP->child( _('Preferences'), url => '/SelfService/Prefs.html' );
 +    }
 +
 +	# XXX TODO RENDER GOTO TICKET WIDGET
 +	#main_nav->child( B =>  html => $m->scomp('GotoTicket'))
 +};
 +
 +before 'Admin/Queues' => run {
 +        if ( Jifty->web->current_user->has_right( object => RT->system, right => 'AdminQueue' ) ) {
 +            page_nav->child( _('Select'), url => "/Admin/Queues/" );
 +            page_nav->child( _('Create'), url       => "/Admin/Queues/Modify.html?create=1");
 +        }
 +    if ( my $id = Jifty->web->request->argument('id') ) {
 +        my $queue_obj = RT::Model::Queue->new();
 +        $queue_obj->load($id);
 +
 +        my $queue = page_nav->child( $queue_obj->name => url => "/Admin/Queues/Modify.html?id=" . $id );
 +        $queue->child( _('Basics'),    url => "/Admin/Queues/Modify.html?id=" . $id );
 +        $queue->child( _('Watchers'),  url => "/Admin/Queues/People.html?id=" . $id );
 +        $queue->child( _('Templates'), url => "/Admin/Queues/Templates.html?id=" . $id );
 +
 +        $queue->child( _('Ticket Custom Fields'), url => '/Admin/Queues/CustomFields.html?sub_type=RT::Model::Ticket&id=' . $id );
 +
 +        $queue->child( _('Transaction Custom Fields'),
 +            url => '/Admin/Queues/CustomFields.html?sub_type=RT::Model::Ticket-RT::Model::Transaction&id=' . $id );
 +
 +        $queue->child( _('Group rights'), url => "/Admin/Queues/GroupRights.html?id=" . $id );
 +        $queue->child( _('User rights'),  url => "/Admin/Queues/UserRights.html?id=" . $id );
 +    }
 +};
 +
 +before '/Admin/Users' => run {
 +if (Jifty->web->current_user->has_right( object => RT->system, right => 'AdminUsers')) {
 +page_nav->child(_('Select'), url => "/Admin/Users/");
 +page_nav->child(_('Create'), url => "/Admin/Users/Modify.html?create=1", separator => 1);
 +}
 +    if ( my $id = Jifty->web->request->argument('id') ) {
 +	warn "loading user $id";
 +        my $obj = RT::Model::User->new();
 +        $obj->load($id);
 +		my $tabs = page_nav->child('current' => label => $obj->name, url => "/Admin/Users/Modify.html?id=".$id,);
 +	       $tabs->child(_('Basics'), url => "/Admin/Users/Modify.html?id=".$id);
 +	       $tabs->child(_('Memberships'), url => "/Admin/Users/Memberships.html?id=".$id);
 +	       $tabs->child(_('History'), url => "/Admin/Users/History.html?id=".$id);
 +	       $tabs->child(_('RT at a glance'), url => "/Admin/Users/MyRT.html?id=".$id);
 +    if ( RT->config->get('gnupg')->{'enable'} ) {
 +			$tabs->child(_('GnuPG'), url  => "/Admin/Users/GnuPG.html?id=".$id);
 +        }
 +    }
 +
 +};
 +
 +before 'Admin/Groups' => run {
 +
 +page_nav->child( _('Select') => url  => "/Admin/Groups/");
 +page_nav->child( _('Create') => url      => "/Admin/Groups/Modify.html?create=1", separator => 1);
 +    if ( my $id = Jifty->web->request->argument('id') ) {
 +        my $obj = RT::Model::User->new();
 +        $obj->load($id);
 +        my $tabs = page_nav->child( $obj->name, url => "/Admin/CustomFields/Modify.html?id=" . $id );
 +        $tabs->child( _('Basics') => url  => "/Admin/Groups/Modify.html?id=" . $obj->id );
 +        $tabs->child( _('Members') => url  => "/Admin/Groups/Members.html?id=" . $obj->id );
 +        $tabs->child( _('Group rights') => url  => "/Admin/Groups/GroupRights.html?id=" . $obj->id );
 +        $tabs->child( _('User rights') => url  => "/Admin/Groups/UserRights.html?id=" . $obj->id );
 +        $tabs->child( _('History') => url  => "/Admin/Groups/History.html?id=" . $obj->id );
 +    }
 +};
 +
 +
 +before 'Admin/CustomFields/' => run {
 +    if ( Jifty->web->current_user->has_right( object => RT->system, right => 'AdminCustomField' ) ) {
 +        page_nav->child( _('Select'), url => "/Admin/CustomFields/" );
 +        page_nav->child(
 +            _('Create') =>
 +            url       => "/Admin/CustomFields/Modify.html?create=1",
 +        );
 +
 +    }
 +    if ( my $id = Jifty->web->request->argument('id') ) {
 +        my $obj = RT::Model::CustomField->new();
 +        $obj->load($id);
 +        my $tabs = page_nav->child( $obj->name, url => "/Admin/CustomFields/Modify.html?id=" . $id );
 +
 +        $tabs->child( _('Basics')       => url => "/Admin/CustomFields/Modify.html?id=" . $id );
 +        $tabs->child( _('Group rights') => url => "/Admin/CustomFields/GroupRights.html?id=" . $id );
 +        $tabs->child( _('User rights')  => url => "/Admin/CustomFields/UserRights.html?id=" . $id );
 +
 +        if ( $obj->lookup_type =~ /^RT::Model::Queue-/io ) {
 +            $tabs->child( _('Applies to'), url => "/Admin/CustomFields/Objects.html?id=" . $id );
 +        }
 +
 +    }
 +
 +};
 +
 +before 'Admin/Global/Workflows' => run {
 +    if ( my $id = Jifty->web->request->argument('name') ) {
 +
 +		my $base = '/Admin/Global/Workflows';
 +
 +        my $schema = RT::Workflow->new->load($id);
 +
 +        if ($schema) {
 +            my $qs_name = query_string( name => $schema->name );
 +            my $workflow = page_nav->child( $schema->name, url => "$base/Summary.html?$qs_name" );
 +            $workflow->child( _("Summary")     => url => "$base/Summary.html?$qs_name" );
 +            $workflow->child( _("Statuses")    => url => "$base/Statuses.html?$qs_name" );
 +            $workflow->child( _("Transitions") => url => "$base/Transitions.html?$qs_name" );
 +            $workflow->child( _("Interface")   => url => "$base/Interface.html?$qs_name" );
 +        }
 +    }
 +    };
 +
 +before 'Admin/Rules' => run {
 +        page_nav->child(_('Select'), url  => "/Admin/Rules/");
 +        page_nav->child(_('Create'), url  => "/Admin/Rules/Modify.html?create=1");
 +};
 +
 +before qr'(?:Ticket|Search)/' => run {
 +    if ( (Jifty->web->request->argument('id')||'') =~ /^(\d+)$/) {
 +		my $id = $1;
 +        my $obj = RT::Model::Ticket->new();
 +        $obj->load($id);
 +
 +        my $tabs = page_nav->child(
 +            "#" . $id => class => "currentnav",
 +            url       => "/Ticket/Display.html?id=" . $id
 +        );
 +
 +        $tabs->child( _('Display') => url => "/Ticket/Display.html?id=" . $id );
 +
 +        $tabs->child( _('History') => url => "/Ticket/History.html?id=" . $id );
 +        $tabs->child( _('Basics')  => url => "/Ticket/Modify.html?id=" . $id );
 +
 +        $tabs->child( _('Dates') => url => "/Ticket/ModifyDates.html?id=" . $id );
 +        $tabs->child( _('People'), url => "/Ticket/ModifyPeople.html?id=" . $id );
 +        $tabs->child( _('Links'),  url => "/Ticket/ModifyLinks.html?id=" . $id );
 +        $tabs->child( _('Jumbo'),  url => "/Ticket/ModifyAll.html?id=" . $id );
 +
 +        my %can = ( ModifyTicket => $obj->current_user_has_right('ModifyTicket') );
 +
 +        if ( $can{'ModifyTicket'} or $obj->current_user_has_right('ReplyToTicket') ) {
 +            $tabs->child( _('Reply'), url => "/Ticket/Update.html?action=respond&id=" . $id );
 +        }
 +
 +        if ( $can{'ModifyTicket'} ) {
 +            my $current = $obj->status;
 +            my $schema  = $obj->queue->status_schema;
 +            my $i       = 1;
 +            foreach my $next ( $schema->transitions($current) ) {
 +                my $action = $schema->transition_action( $current => $next );
 +                next if $action eq 'hide';
 +
 +                my $url = 'Ticket/';
 +                if ($action) {
 +
 +                #XXX TODO
 +                #$url .= "Update.html?" . query_string( action => $action, default_status => $next, id => $id );
 +                } else {
 +
 +                    #XXX TODO
 +                    # $url .= "Display.html?" .query_string(Status => $next, id => $id );
 +                }
 +                $tabs->child( _( $schema->transition_label( $current => $next ) ) => url => $url );
 +            }
 +
 +        }
 +        if ( $obj->current_user_has_right('OwnTicket') ) {
 +            if ( $obj->owner_obj->id == RT->nobody->id ) {
 +                $tabs->child( _('Take') => url => "/Ticket/Display.html?action=take&id=" . $id )
 +                    if ( $can{'ModifyTicket'} or $obj->current_user_has_right('TakeTicket') );
 +            } elsif ( $obj->owner_obj->id != Jifty->web->current_user->id ) {
 +                $tabs->child( _('Steal') => url => "/Ticket/Display.html?action=steal&id=" . $id )
 +                    if ( $can{'ModifyTicket'}
 +                    or $obj->current_user_has_right('StealTicket') );
 +            }
 +        }
 +
 +        if ( $can{'ModifyTicket'} or $obj->current_user_has_right('CommentOnTicket') ) {
 +            $tabs->child( _('Comment') => url => "/Ticket/Update.html?action=comment&id=" . $id );
 +        }
 +
 +        # $actions->{'_ZZ'} = { html => $m->scomp( '/Ticket/Elements/Bookmark', id => $obj->id ), };
 +
 +
 +        if ( defined Jifty->web->session->get('tickets') ) {
 +
 +            # we have to update session data if we get new ItemMap
 +            my $updatesession = 1 unless ( Jifty->web->session->get('tickets')->{'item_map'} );
 +
 +            my $item_map = Jifty->web->session->get('tickets')->item_map;
 +
 +            if ($updatesession) {
 +                Jifty->web->session->get('tickets')->prep_for_serialization();
 +            }
 +
 +            # Don't display prev links if we're on the first ticket
 +            if ( $item_map->{$id}->{prev} ) {
 +                page_nav->child(
 +                    '<< ' . _('First') => class => "nav",
 +                    url                => "/Ticket/Display.html?id=" . $item_map->{first}
 +                );
 +                page_nav->child(
 +                    '< ' . _('Prev') => class => "nav",
 +                    url              => "/Ticket/Display.html?id=" . $item_map->{$id}->{prev}
 +                );
 +
 +                # Don't display next links if we're on the last ticket
 +                if ( $item_map->{$id}->{next} ) {
 +                    page_nav->child(
 +                        _('next') . ' >' => class => "nav",
 +                        url              => "/Ticket/Display.html?id=" . $item_map->{$id}->{next}
 +                    );
 +                    page_nav->child(
 +                        _('Last') . ' >>' => class => "nav",
 +                        url               => "/Ticket/Display.html?id=" . $item_map->{last}
 +                    );
 +                }
 +            }
 +		}
 +        }
 +            my $args      = '';
 +            my $has_query = '';
 +
 +            my $search = Jifty->web->session->get('CurrentSearchHash') || {};
 +            my $search_id = Jifty->web->request->argument('saved_search_id') || $search->{'searchid'} || '';
 +
 +            $has_query = 1 if ( Jifty->web->request->argument('query') or $search->{'query'} );
 +
 +            my %query_args = (
 +
 +                saved_search_id => ( $search_id eq 'new' ) ? undef : $search_id,
 +                query         => Jifty->web->request->argument('query')         || $search->{'query'},
 +                format        => Jifty->web->request->argument('format')        || $search->{'format'},
 +                order_by      => Jifty->web->request->argument('order_by')      || $search->{'order_by'},
 +                order         => Jifty->web->request->argument('order')         || $search->{'order'},
 +                page          => Jifty->web->request->argument('page')          || $search->{'page'},
 +                rows_per_page => Jifty->web->request->argument('rows_per_page') || $search->{'rows_per_page'}
 +            );
 +
 +            $args = "?" . query_string(%query_args);
 +
 +            page_nav->child( _('New Search')  => url => "/Search/Build.html?NewQuery=1" );
 +            page_nav->child( _('Edit Search') => url => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
 +            page_nav->child( _('Advanced')    => url => "/Search/Edit.html$args" );
 +
 +            if ($has_query) {
 +                if (Jifty->web->request->path =~ qr|^Search/Results.html| &&    #XXX TODO better abstraction
 +                    Jifty->web->current_user->has_right( right => 'SuperUser', object => RT->system )
 +                    )
 +                {
 +                    my $shred_args = URI->new->query_param(
 +                        search          => 1,
 +                        plugin          => 'Tickets',
 +                        'Tickets:query' => $query_args{'query'},
 +                        'Tickets:limit' => $query_args{'rows'}
 +                    );
 +
 +                    page_nav->child( 'shredder' =>  label => _('Shredder'), url => 'Admin/Tools/Shredder/?' . $shred_args );
 +                }
 +
 +                page_nav->child( _('Show Results') => url => "/Search/Results.html$args" );
 +
 +                page_nav->child( _('Bulk Update') => url => "/Search/Bulk.html$args" );
 +
 +            }
 +};
 +
 +before 'User/Group' => run {
 +    if ( my $id = Jifty->web->request->argument('id') ) {
 +        my $obj = RT::Model::User->new();
 +        $obj->load($id);
 +        my $group = page_nav->child( url => "/User/Groups/Modify.html?id=" . $obj->id );
 +        $group->child( _('Basics'),  url => "/User/Groups/Modify.html?id=" . $obj->id );
 +        $group->child( _('Members'), url => "/User/Groups/Members.html?id=" . $obj->id );
 +
 +    }
 +    page_nav( _('Select group') => url => "/User/Groups/index.html" );
 +    page_nav( _('New group') => url => "/User/Groups/Modify.html?create=1", separator => 1 );
 +
 +};
 +
 +before 'Prefs' => run {
 +	my $tabs;
 +	my @searches = RT::System->new->saved_searches();
 +
 +	page_nav->child(  'Quick search' => label => _('Quick search'), url => '/Prefs/Quicksearch.html');
 +
 +	for my $search (@searches) {
 +	page_nav->child(
 +        $search->[0],
 +        url  => "/Prefs/Search.html?" .query_string( name => ref($search->[1]).'-'.$search->[1]->id));
 +    }
  };
  
+ before qr{^/Search/Build.html} => run {
+     my $querystring      = '';
+     my $selected_clauses = Jifty->web->request->argument('clauses');
+     my ( $saved_search, $current_search, $results ) = RT::Interface::Web::QueryBuilder->setup_query();
+ 
+     my $tree = RT::Interface::Web::QueryBuilder::Tree->new('AND');
+     push @$results, $tree->parse_sql( query => $current_search->{query} );
+ 
+     my $current_values
+         = [ ( $tree->get_displayed_nodes() )[ ref $selected_clauses ? @$selected_clauses : $selected_clauses ] ];
+ 
+     push @$results, RT::Interface::Web::QueryBuilder->process_query( $tree, $current_values );
+ 
+     my $queues       = $tree->get_referenced_queues;
+     my $parsed_query = $tree->get_query_option_list($current_values);
+ 
+     $current_search->{'query'} = join ' ', map $_->{'TEXT'}, @$parsed_query;
+ 
+     #  Deal with format changes
+     my ( $available_columns, $current_format );
+     ( $current_search->{'format'}, $available_columns, $current_format )
+         = RT::Interface::Web::QueryBuilder->build_format_string(
+         %{ Jifty->web->request->arguments },
+         queues => $queues,
+         format => $current_search->{'format'}
+         );
+ 
+     # if we're asked to save the current search, save it
+     push @$results, RT::Interface::Web::QueryBuilder->save_search( $current_search, $saved_search )
+         if ( Jifty->web->request->argument('saved_search_save') || Jifty->web->request->argument('saved_search_copy') );
+ 
+     #  Push the updates into the session so we don't lose 'em
+     Jifty->web->session->set( 'CurrentSearchHash', { %$saved_search, %$current_search, } );
+ 
+     #  Build a query_string for the tabs
+     if ( Jifty->web->request->argument('new_query') ) {
+         $querystring = 'new_query=1';
+     } elsif ( $current_search->{'query'} ) {
+         $querystring = RT::Interface::Web->format_query_params(%$current_search);
+     }
+ 
+     Jifty->web->redirect( Jifty->web->url . "Search/Results.html?" . $querystring )
+         if ( Jifty->web->request->argument('do_search') );
+ 
+     set current_search    => $current_search;
+     set current_format    => $current_format;
+     set available_columns => $available_columns;
+     set saved_search      => $saved_search;
+     set results           => $results;
+     set parsed_query      => $parsed_query;
+     set querystring       => $querystring;
+     set queues            => $queues;
+ 
+ };
+ 
+ 
+ 
  # Backward compatibility with old RT URLs
  
  before '/NoAuth/Logout.html' => run { redirect '/logout' };
diff --cc share/html/Search/Build.html
index 523cc01,116efc4..9472111
--- a/share/html/Search/Build.html
+++ b/share/html/Search/Build.html
@@@ -66,17 -66,19 +66,13 @@@
  %#   action does quote it (this breaks SQLite).
  %#
  <&| /_elements/wrapper, title => _("Query Builder") &>
 -<& /Ticket/Elements/Tabs, 
 -    current_tab => "Search/Build.html?".$querystring,
 -    title => _("Query Builder"),
 -    %$current_search,
 -	saved_search_id => $saved_search->{'id'},
 -&>
  
  <form method="post" action="Build.html" name="build_query">
- <input type="hidden" class="hidden" name="saved_search_id" value="<% $saved_search{'id'} %>" />
- <input type="hidden" class="hidden" name="query" value="<% $query{'query'} %>" />
- <input type="hidden" class="hidden" name="format" value="<% $query{'format'} %>" />
- 
- 
- 
- 
+ <input type="hidden" class="hidden" name="saved_search_id" value="<% $saved_search->{'id'} || '' %>" />
+ <input type="hidden" class="hidden" name="query" value="<% $current_search->{'query'} || '' %>" />
+ <input type="hidden" class="hidden" name="format" value="<% $current_search->{'format'} || '' %>" />
  <div id="pick-criteria">
-     <& Elements/PickCriteria, query => $query{'query'}, cfqueues => $queues &>
+ 	<& Elements/PickCriteria, query => $current_search->{'query'}, queues => $queues &>
  </div>
  <& /Elements/Submit,  label => _('Add these terms'), name => 'add_clause'&>
  <& /Elements/Submit, label => _('Add these terms and Search'), name => 'do_search'&>

-----------------------------------------------------------------------


More information about the Rt-commit mailing list