[Rt-commit] rt branch, master, updated. rt-4.1.8-144-gb807ad4
Alex Vandiver
alexmv at bestpractical.com
Tue Apr 9 18:41:05 EDT 2013
The branch, master has been updated
via b807ad43d1ec0baac2d5ccb3df84eb07567e1553 (commit)
via 4a6309a72bf9ac2febbb64a396dab73fa68d98d2 (commit)
via 027f4e71c673c7b3dc611691fa5ca8b2c0bf081c (commit)
via fc10251e31f68f1472f7dc4b11ffe8e559bd31e0 (commit)
via b0a88b4f116c5c432d8ef6f6ddecbe4e6bfa3af7 (commit)
via fccf32a72ad826381936d7b2287e29e171c8ef06 (commit)
via 6a4aa17cedc3237cd46ecaf9cfc4444437a1ff7d (commit)
via 3bae54878b55f934add7106fb1fe8ab8bac217f5 (commit)
via 9488f9fa325f8a4efbdcd3fd5725c06744c555c0 (commit)
via b68ef820efd7095a2728cf2520c68d5eea5cc02e (commit)
via d5c44844b269e2e35b0f20d796f5ce876e3b4662 (commit)
via f6885efc1261fa0acaffe4af2f59985ce02801f0 (commit)
via 691c5065623a526aa8af664e10f5aae6778eb019 (commit)
via 3d0fdb333400662f7020afda8025423ea685f88a (commit)
via 867fb5f4fd92ebe9ba49a16b26496c90aaa1c76c (commit)
via 49974ec60b73b99e1f48f9737f58194d2a8c51a0 (commit)
via e4bf8c1dcac178d38c7c85e83e2234a9044fb8c8 (commit)
via e8bb11feff222a23ebc1af1b0860b2c75fd0d16c (commit)
via e26176e622748eada12e32592630723abe425a15 (commit)
via 418c7f4b9a2b4c927a05291b1a948e405dcaf39f (commit)
via 36d49987e2302f5af523a3fddea46bb173681f3b (commit)
via f1df5b606a5de0cd267b3a77fc0f101c9075e408 (commit)
via b9c46a4e23082df558cadfc3c0f469919039a8a0 (commit)
via 1cc214bb34c94b3ededff670e5510cb1630b7e49 (commit)
via 5f2670871d64a78ee2a33596cccf6ae9d7557ecc (commit)
via ca919c1d58ce5ee6d0e3d8f55d07fff72fc59413 (commit)
via 27428ec8e1b3caa12a547895e04ceb249e7221f4 (commit)
via f4069e5637a92de949d02c982117c2f58acfed85 (commit)
via 0e3c5bb3b975046a4332c7d9ece4f7f2bf1aa2b7 (commit)
via 47c9dd1a8c435159dc3fba044982a0b333dfe0fb (commit)
via 34254bb3670459bff30d86ba2bf5a7e8d0e8e662 (commit)
via 75cb3c2e598c4a5fa329913c91294ebf8423b511 (commit)
via d6c77df1bf7732457dcbc838a24f516b9956bb6e (commit)
via 76338412300f42e5d7830b59af2df79c3925a3f4 (commit)
via 4ff29385a4feaa50af9773ab8cd33d8eded4b84e (commit)
via 0f4023d69025a58bb0c02b1f07f6c8e6e91ce1e7 (commit)
via 67cca0664f0c38356e6438fc7aa89a5fa78dbf35 (commit)
via 81c3880f937110d3c4a7d2473758e3bd870f9ffe (commit)
via a35a117b9cb6ee458776d4756d1f3c89ac011574 (commit)
via 2b12fb23b3988df8a0ab10894945cc6f095b5c2c (commit)
via 42a245b93a7b54d611c8c90a6db6371a209b28af (commit)
via af2facd35a13199e3b9db4e50c6db06828223f89 (commit)
via 15692ecf3cb5c4c850b1692ab34746ba8fbfcddb (commit)
via 518d7891b9dda243dcc7ea6a36b915c290bf5fd5 (commit)
via 409a7b20fcd9f7cc8cb4dc9bb719a549ae97beb6 (commit)
via eaad687bb42853756c4fbc0143f97c9f8de15ea1 (commit)
via dfc6123c59921472339b521dda72568c1bc67198 (commit)
via 986b1f235d3509227a883e414f0a71a11a82e0de (commit)
via 40cb640ef8b7cdc544cd50a029f68c39ee037a39 (commit)
via 8c90b68ea5e5bff591a84b5f810622b814aee241 (commit)
via 85c2d24774292e06b51e491b7fa07597ae59f1bb (commit)
via e4f336255c70d1ab48e42bdca9bc5fad2bf2f177 (commit)
via 033dd9655ca319d44cc19e4b9cdaedc93fdb5119 (commit)
via 7115dc41a582ef07c81e3be999e8a3150f34b6d2 (commit)
via 9c51da51ba88b9ce9c586b4f9c11230754c1ca56 (commit)
via 81fc7cb6b5618f60409843a4cf51887bb2b53757 (commit)
via cd76f2bb673e1675f8a94697bc34b617bdad8ae8 (commit)
via 69b8a01c7527e602abb4d5e9bb2e084756956a34 (commit)
via ac11ea55a6ef39627f38ecb58487960b57414190 (commit)
via 313eb19e3cb6a6d96fc2dce6f2f5bd1fa767110e (commit)
via ae3c499aff4985ab1c40c273e8caf879a2c867ae (commit)
via 5a792b98f740434bc422b6f683d36566d0a74bd4 (commit)
via 08aa38d08a87e63f0e67afbc720ef187b8b5123b (commit)
via c5e5ea3958f5313c289c17766109d77ecde90895 (commit)
via baf212e3f802530e448664da573778c5680f931e (commit)
via 85eef0824686bdbdc209d8769162245d87a016c6 (commit)
via d0193ef37c635891a319440460b50a5bd2fe59ff (commit)
via 7c0471747e466c1e745ba4dafd52d1e66d93e32e (commit)
via 8cf12883b9a94c93c08d7e7d938c684bb358a2ca (commit)
via 556f81d7ec161695f53e1773ffa09c99fe64ed3d (commit)
via e53f59716c94540df4fc73dd636cd8a9fb43b44d (commit)
via af4711aa0f814e91392e72942ce44303f8d4c2e6 (commit)
via 856fad17c3b08be0aace12c69247be5371f61102 (commit)
via 8fa4cc9f724ca1c65383cda2f89cbcdd818b5d59 (commit)
via 04387ee2c6b2232df41d8ea0986e26edee74fa0c (commit)
via 2123fcb6936ea4ada5f76aab1a8d60207b3615c7 (commit)
via 6ee684bdb51713895af136c6262a86d3279f8a94 (commit)
via 7e11127f257aa8bbbc6cc43c38d807346c5edf69 (commit)
via 12d29194219ea8dce815a9acdaefb9a98331ed3c (commit)
via 91c6c74f4d0f79703272e75ae79682f39ca5bd4e (commit)
via 99d6b3fd52dd9aee0a37bcc99a03c5c427aeebec (commit)
via 74675e0c3d40eb4a40350aefa226217760f521b1 (commit)
via 86f7b03372df6f30fb8e9aad043b9b4721dc4eb8 (commit)
via 2bfc84570fe4deeea64df704cb59f110fa8fda01 (commit)
via d81619c7d39b10a699528307eb7dca16e8a2a229 (commit)
via c8c468f87da1c365aeb02bc5d6514f4360bc09e6 (commit)
via f06d2b291ce6c7f80eae3d2e0ed14cbfdff8e971 (commit)
via 6fbfcb7fb0a69d474f94d942c581df0239215256 (commit)
via 777fbe9082cfb6e13b6234e60e03ed7b68d8b0a7 (commit)
via 97ee6ca5811e9b68c5c7a3a52b24677a301bf78b (commit)
via 5c0efc3773eaba35d9853fa45691d8c7b506d8b2 (commit)
via 292dd3bf6fb7371593a8a978868308a1f1cc75d1 (commit)
via 1f77b832803c6c55199c468c3e100e3c5ae5e161 (commit)
via 7950ee05566b0ca57312f4f4a3d6f42dc5905f22 (commit)
via a514051c94943245c6dceec10de9c17896869e0b (commit)
via c209e59536f5b26af8d58b51ba835f58cbf16ed9 (commit)
via cea84427f7ef61ccd57bec2d428319a9565c617b (commit)
via 4db0f487033002e5ea6ce2e47af9bae7051ae8da (commit)
via e938bd13697a6f7f473160d393fe622aad8ea067 (commit)
via 1f5e2a240a52ebc56a7686501523603566f4c8a0 (commit)
via 77ba7543ed0f91d20fbc01d0d727273266342158 (commit)
via 282b7eeb15366fb29807ab242262003c33a18742 (commit)
via 365b6ce782fa86828e8e984744a57aaabb7d2eeb (commit)
via 4fbd500cfc7f4ed3bcb54518fa8c2c1d3c9fac49 (commit)
via 0c86c71e84ec6d8e6e9bfe4693634e4ac8914a70 (commit)
via ed77c638e85a2eb2f057208bcfb8e04e8492d6e1 (commit)
via 75da47f1a434ccd6d3d023c39156d0cccf93cc35 (commit)
via 99e4df46ef7ea535f5f4bdd3d424eb61394479f2 (commit)
via 8d38730cd7f399850666569108926acfe73b29bf (commit)
via f0e57eadaac50ebab96cc38bda704f26454c3e34 (commit)
via b68179cd8515cd9485afe7114e75ae0b41929145 (commit)
via d04c6154892429aa47679c6ce40c259baadb5249 (commit)
via d4c8682d31dec03e0d1a542323a50956f17f8cb5 (commit)
via 0758c145aa35796a8d595afeff32da21deca75cf (commit)
via afe1b9fa86f59bda9aded442dbc7ea0cb948b099 (commit)
via 6f2e68c5766e9cab576f68ddb759e10d9c188557 (commit)
via 1c82e3e55e48c38adff2dce58cfe1d76cc0d88c6 (commit)
via 6d954a45e3fd0197028a6824db6b271f9b9c3d0a (commit)
via 4f107820e8d85490d5e140a72fe3cef5f3711469 (commit)
via d9f90ffa9d756112fea5fbbea78a7f40299ff009 (commit)
via 983cafa82186758eb0a3ba56431a9961db019048 (commit)
via 99f47db89d27573d827a6301b8c7e896e502f75a (commit)
via e6cfc69c40da44fa367e1e7dad0deeae909819ac (commit)
via d6aa0e83a1fad0bbb0b47ff6d70e8e1a8941ff27 (commit)
via 1a489946312aefb1c2f116140e7d08d6f5490ea0 (commit)
via 7f832319a46ba7abec96de2722eefa031d16a100 (commit)
via f10490e1eb64c9a2afb0cb40fe74a32f7b06eb2e (commit)
via 644407a8078d9b20bd1ae82d9a37c5412fe28807 (commit)
via da08f6fec529c76b12a6cae9c62cb857cafb6b99 (commit)
from 6c9ba96903cc60b4058b52c4ba46daea04858a89 (commit)
Summary of changes:
README | 2 +-
bin/rt-crontool.in | 2 +-
devel/tools/license_tag | 2 +-
docs/UPGRADING-4.0 | 10 +-
docs/extending/external_custom_fields.pod | 2 +-
docs/web_deployment.pod | 5 +-
etc/RT_Config.pm.in | 14 +-
etc/initialdata | 60 +-
etc/upgrade/time-worked-history.pl | 47 +
lib/RT/Action/ExtractSubjectTag.pm | 38 +
lib/RT/Action/RecordCorrespondence.pm | 2 +-
lib/RT/CustomField.pm | 7 +-
lib/RT/CustomFieldValues/External.pm | 2 +-
lib/RT/Group.pm | 5 +-
lib/RT/Handle.pm | 21 +-
.../{Interface/Web/QueryBuilder.pm => I18N/de.pm} | 9 +-
lib/RT/{Condition/AnyTransaction.pm => I18N/fr.pm} | 23 +-
lib/RT/Interface/Web.pm | 59 +-
lib/RT/Interface/Web/Handler.pm | 40 +
lib/RT/Link.pm | 43 +-
lib/RT/Pod/HTML.pm | 56 +-
lib/RT/Record.pm | 6 +-
lib/RT/SearchBuilder.pm | 2 +-
lib/RT/Shredder.pm | 2 +-
lib/RT/Template.pm | 2 +-
lib/RT/Test.pm | 2 +
lib/RT/Test/GnuPG.pm | 2 +
lib/RT/Tickets.pm | 43 +-
lib/RT/Transaction.pm | 15 +-
sbin/rt-fulltext-indexer.in | 4 +-
sbin/rt-test-dependencies.in | 2 +-
sbin/rt-validator.in | 2 +-
share/html/Admin/CustomFields/Modify.html | 10 +-
share/html/Admin/Global/MyRT.html | 14 +-
share/html/Admin/Users/MyRT.html | 8 +-
share/html/Articles/Elements/GotoArticle | 3 +-
share/html/Dashboards/Queries.html | 15 +-
share/html/Elements/CollectionList | 2 +-
share/html/Elements/EditCustomFieldDate | 4 +-
share/html/Elements/ListActions | 3 +
share/html/Elements/QueueSummaryByLifecycle | 33 +-
share/html/Elements/QueueSummaryByStatus | 34 +-
share/html/Elements/ShowCustomFieldDate | 4 +-
share/html/Elements/ShowMessageStanza | 32 +-
share/html/Elements/Tabs | 20 +-
share/html/Helpers/Autocomplete/Groups | 2 +-
share/html/NoAuth/css/aileron/msie.css | 8 -
share/html/NoAuth/css/ballard/msie.css | 8 -
share/html/NoAuth/css/base/login.css | 4 +
share/html/NoAuth/css/base/ticket.css | 1 -
share/html/NoAuth/css/print.css | 8 +-
share/html/NoAuth/css/web2/msie.css | 8 -
share/html/Prefs/MyRT.html | 9 +-
share/html/Prefs/Quicksearch.html | 11 +-
share/html/Search/Bulk.html | 26 +-
share/html/Search/Elements/SearchesForObject | 6 +-
share/html/SelfService/Create.html | 15 +-
share/html/SelfService/Display.html | 31 +-
share/html/SelfService/Update.html | 28 +-
share/html/Ticket/Create.html | 26 +-
share/html/Ticket/Elements/PreviewScrips | 6 +-
.../html/Ticket/Elements/ShowSimplifiedRecipients | 3 +-
share/html/Ticket/ModifyAll.html | 27 +-
share/html/Ticket/Update.html | 34 +-
share/html/Widgets/SavedSearch | 2 +-
share/html/m/_elements/login | 9 +
share/html/m/ticket/create | 30 +-
share/html/m/ticket/reply | 30 +-
share/po/ar.po | 820 +--
share/po/bg.po | 634 +--
share/po/{lv.po => ca.po} | 5465 +++++++++-----------
share/po/cs.po | 688 ++-
share/po/da.po | 634 +--
share/po/de.po | 634 +--
share/po/el.po | 634 +--
share/po/en.po | 2 +-
share/po/en_GB.po | 510 +-
share/po/es.po | 634 +--
share/po/et.po | 634 +--
share/po/fi.po | 634 +--
share/po/fr.po | 634 +--
share/po/he.po | 636 +--
share/po/hr.po | 634 +--
share/po/hu.po | 636 +--
share/po/id.po | 636 +--
share/po/is.po | 638 +--
share/po/it.po | 634 +--
share/po/ja.po | 638 +--
share/po/lt.po | 634 +--
share/po/lv.po | 634 +--
share/po/mk.po | 638 +--
share/po/nb.po | 634 +--
share/po/nl.po | 636 +--
share/po/nn.po | 634 +--
share/po/oc.po | 644 +--
share/po/pl.po | 634 +--
share/po/pt.po | 636 +--
share/po/pt_BR.po | 634 +--
share/po/pt_PT.po | 638 +--
share/po/rt.pot | 638 +--
share/po/ru.po | 634 +--
share/po/sk.po | 672 ++-
share/po/sl.po | 634 +--
share/po/sv.po | 636 +--
share/po/tr.po | 634 +--
share/po/zh_CN.po | 634 +--
share/po/zh_TW.po | 634 +--
t/99-policy.t | 2 +-
t/api/group.t | 17 +-
t/articles/interface.t | 4 +-
t/articles/queue-specific-class.t | 2 +-
t/articles/search-interface.t | 2 +-
t/customfields/access_via_queue.t | 29 +-
t/customfields/date.t | 86 +
t/customfields/date_search.t | 76 +-
t/customfields/datetime.t | 76 +
t/customfields/datetime_search.t | 107 +-
t/customfields/external.t | 8 +-
t/mail/extractsubjecttag.t | 23 +-
t/web/action-results.t | 48 +
t/web/admin_user.t | 62 +-
t/web/cf_values_class.t | 54 +
122 files changed, 15770 insertions(+), 14992 deletions(-)
copy lib/RT/{Interface/Web/QueryBuilder.pm => I18N/de.pm} (95%)
copy lib/RT/{Condition/AnyTransaction.pm => I18N/fr.pm} (87%)
copy share/po/{lv.po => ca.po} (67%)
create mode 100644 t/customfields/date.t
create mode 100644 t/customfields/datetime.t
create mode 100644 t/web/action-results.t
create mode 100644 t/web/cf_values_class.t
- Log -----------------------------------------------------------------
commit b807ad43d1ec0baac2d5ccb3df84eb07567e1553
Merge: 6c9ba96 4a6309a
Author: Alex Vandiver <alexmv at bestpractical.com>
Date: Tue Apr 9 18:40:17 2013 -0400
Merge branch '4.0-trunk'
Conflicts:
devel/third-party/README
devel/third-party/ckeditor/LICENSE.md
devel/third-party/ckeditor/adapters/jquery.js
devel/third-party/ckeditor/ckeditor_basic_source.js
devel/third-party/ckeditor/ckeditor_source.js
devel/third-party/ckeditor/core/_bootstrap.js
devel/third-party/ckeditor/core/ckeditor.js
devel/third-party/ckeditor/core/ckeditor_base.js
devel/third-party/ckeditor/core/ckeditor_basic.js
devel/third-party/ckeditor/core/command.js
devel/third-party/ckeditor/core/commanddefinition.js
devel/third-party/ckeditor/core/config.js
devel/third-party/ckeditor/core/dataprocessor.js
devel/third-party/ckeditor/core/dom.js
devel/third-party/ckeditor/core/dom/comment.js
devel/third-party/ckeditor/core/dom/document.js
devel/third-party/ckeditor/core/dom/documentfragment.js
devel/third-party/ckeditor/core/dom/domobject.js
devel/third-party/ckeditor/core/dom/element.js
devel/third-party/ckeditor/core/dom/elementpath.js
devel/third-party/ckeditor/core/dom/event.js
devel/third-party/ckeditor/core/dom/iterator.js
devel/third-party/ckeditor/core/dom/node.js
devel/third-party/ckeditor/core/dom/nodelist.js
devel/third-party/ckeditor/core/dom/range.js
devel/third-party/ckeditor/core/dom/rangelist.js
devel/third-party/ckeditor/core/dom/text.js
devel/third-party/ckeditor/core/dom/walker.js
devel/third-party/ckeditor/core/dom/window.js
devel/third-party/ckeditor/core/dtd.js
devel/third-party/ckeditor/core/editor.js
devel/third-party/ckeditor/core/editor_basic.js
devel/third-party/ckeditor/core/env.js
devel/third-party/ckeditor/core/event.js
devel/third-party/ckeditor/core/eventInfo.js
devel/third-party/ckeditor/core/focusmanager.js
devel/third-party/ckeditor/core/htmlparser.js
devel/third-party/ckeditor/core/htmlparser/basicwriter.js
devel/third-party/ckeditor/core/htmlparser/cdata.js
devel/third-party/ckeditor/core/htmlparser/comment.js
devel/third-party/ckeditor/core/htmlparser/element.js
devel/third-party/ckeditor/core/htmlparser/filter.js
devel/third-party/ckeditor/core/htmlparser/fragment.js
devel/third-party/ckeditor/core/htmlparser/text.js
devel/third-party/ckeditor/core/lang.js
devel/third-party/ckeditor/core/loader.js
devel/third-party/ckeditor/core/plugindefinition.js
devel/third-party/ckeditor/core/plugins.js
devel/third-party/ckeditor/core/resourcemanager.js
devel/third-party/ckeditor/core/scriptloader.js
devel/third-party/ckeditor/core/skins.js
devel/third-party/ckeditor/core/themes.js
devel/third-party/ckeditor/core/tools.js
devel/third-party/ckeditor/core/ui.js
devel/third-party/ckeditor/lang/_languages.js
devel/third-party/ckeditor/lang/_translationstatus.txt
devel/third-party/ckeditor/lang/af.js
devel/third-party/ckeditor/lang/ar.js
devel/third-party/ckeditor/lang/bg.js
devel/third-party/ckeditor/lang/bn.js
devel/third-party/ckeditor/lang/bs.js
devel/third-party/ckeditor/lang/ca.js
devel/third-party/ckeditor/lang/cs.js
devel/third-party/ckeditor/lang/cy.js
devel/third-party/ckeditor/lang/da.js
devel/third-party/ckeditor/lang/de.js
devel/third-party/ckeditor/lang/el.js
devel/third-party/ckeditor/lang/en-au.js
devel/third-party/ckeditor/lang/en-ca.js
devel/third-party/ckeditor/lang/en-gb.js
devel/third-party/ckeditor/lang/en.js
devel/third-party/ckeditor/lang/eo.js
devel/third-party/ckeditor/lang/es.js
devel/third-party/ckeditor/lang/et.js
devel/third-party/ckeditor/lang/eu.js
devel/third-party/ckeditor/lang/fa.js
devel/third-party/ckeditor/lang/fi.js
devel/third-party/ckeditor/lang/fo.js
devel/third-party/ckeditor/lang/fr-ca.js
devel/third-party/ckeditor/lang/fr.js
devel/third-party/ckeditor/lang/gl.js
devel/third-party/ckeditor/lang/gu.js
devel/third-party/ckeditor/lang/he.js
devel/third-party/ckeditor/lang/hi.js
devel/third-party/ckeditor/lang/hr.js
devel/third-party/ckeditor/lang/hu.js
devel/third-party/ckeditor/lang/is.js
devel/third-party/ckeditor/lang/it.js
devel/third-party/ckeditor/lang/ja.js
devel/third-party/ckeditor/lang/ka.js
devel/third-party/ckeditor/lang/km.js
devel/third-party/ckeditor/lang/ko.js
devel/third-party/ckeditor/lang/ku.js
devel/third-party/ckeditor/lang/lt.js
devel/third-party/ckeditor/lang/lv.js
devel/third-party/ckeditor/lang/mk.js
devel/third-party/ckeditor/lang/mn.js
devel/third-party/ckeditor/lang/ms.js
devel/third-party/ckeditor/lang/nb.js
devel/third-party/ckeditor/lang/nl.js
devel/third-party/ckeditor/lang/no.js
devel/third-party/ckeditor/lang/pl.js
devel/third-party/ckeditor/lang/pt-br.js
devel/third-party/ckeditor/lang/pt.js
devel/third-party/ckeditor/lang/ro.js
devel/third-party/ckeditor/lang/ru.js
devel/third-party/ckeditor/lang/sk.js
devel/third-party/ckeditor/lang/sl.js
devel/third-party/ckeditor/lang/sr-latn.js
devel/third-party/ckeditor/lang/sr.js
devel/third-party/ckeditor/lang/sv.js
devel/third-party/ckeditor/lang/th.js
devel/third-party/ckeditor/lang/tr.js
devel/third-party/ckeditor/lang/ug.js
devel/third-party/ckeditor/lang/uk.js
devel/third-party/ckeditor/lang/vi.js
devel/third-party/ckeditor/lang/zh-cn.js
devel/third-party/ckeditor/lang/zh.js
devel/third-party/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
devel/third-party/ckeditor/plugins/a11yhelp/lang/en.js
devel/third-party/ckeditor/plugins/a11yhelp/lang/he.js
devel/third-party/ckeditor/plugins/a11yhelp/plugin.js
devel/third-party/ckeditor/plugins/about/dialogs/about.js
devel/third-party/ckeditor/plugins/about/plugin.js
devel/third-party/ckeditor/plugins/autogrow/plugin.js
devel/third-party/ckeditor/plugins/basicstyles/plugin.js
devel/third-party/ckeditor/plugins/bidi/plugin.js
devel/third-party/ckeditor/plugins/blockquote/plugin.js
devel/third-party/ckeditor/plugins/button/plugin.js
devel/third-party/ckeditor/plugins/clipboard/dialogs/paste.js
devel/third-party/ckeditor/plugins/clipboard/plugin.js
devel/third-party/ckeditor/plugins/colorbutton/plugin.js
devel/third-party/ckeditor/plugins/colordialog/dialogs/colordialog.js
devel/third-party/ckeditor/plugins/colordialog/plugin.js
devel/third-party/ckeditor/plugins/contextmenu/plugin.js
devel/third-party/ckeditor/plugins/dialog/dialogDefinition.js
devel/third-party/ckeditor/plugins/dialog/plugin.js
devel/third-party/ckeditor/plugins/dialogadvtab/plugin.js
devel/third-party/ckeditor/plugins/dialogui/plugin.js
devel/third-party/ckeditor/plugins/div/dialogs/div.js
devel/third-party/ckeditor/plugins/div/plugin.js
devel/third-party/ckeditor/plugins/editingblock/plugin.js
devel/third-party/ckeditor/plugins/elementspath/plugin.js
devel/third-party/ckeditor/plugins/enterkey/plugin.js
devel/third-party/ckeditor/plugins/entities/plugin.js
devel/third-party/ckeditor/plugins/fakeobjects/plugin.js
devel/third-party/ckeditor/plugins/filebrowser/plugin.js
devel/third-party/ckeditor/plugins/find/dialogs/find.js
devel/third-party/ckeditor/plugins/find/plugin.js
devel/third-party/ckeditor/plugins/flash/dialogs/flash.js
devel/third-party/ckeditor/plugins/flash/plugin.js
devel/third-party/ckeditor/plugins/floatpanel/plugin.js
devel/third-party/ckeditor/plugins/font/plugin.js
devel/third-party/ckeditor/plugins/format/plugin.js
devel/third-party/ckeditor/plugins/forms/dialogs/button.js
devel/third-party/ckeditor/plugins/forms/dialogs/checkbox.js
devel/third-party/ckeditor/plugins/forms/dialogs/form.js
devel/third-party/ckeditor/plugins/forms/dialogs/hiddenfield.js
devel/third-party/ckeditor/plugins/forms/dialogs/radio.js
devel/third-party/ckeditor/plugins/forms/dialogs/select.js
devel/third-party/ckeditor/plugins/forms/dialogs/textarea.js
devel/third-party/ckeditor/plugins/forms/dialogs/textfield.js
devel/third-party/ckeditor/plugins/forms/plugin.js
devel/third-party/ckeditor/plugins/horizontalrule/plugin.js
devel/third-party/ckeditor/plugins/htmldataprocessor/plugin.js
devel/third-party/ckeditor/plugins/htmlwriter/plugin.js
devel/third-party/ckeditor/plugins/iframe/dialogs/iframe.js
devel/third-party/ckeditor/plugins/iframedialog/plugin.js
devel/third-party/ckeditor/plugins/image/dialogs/image.js
devel/third-party/ckeditor/plugins/image/plugin.js
devel/third-party/ckeditor/plugins/indent/plugin.js
devel/third-party/ckeditor/plugins/justify/plugin.js
devel/third-party/ckeditor/plugins/keystrokes/plugin.js
devel/third-party/ckeditor/plugins/link/dialogs/anchor.js
devel/third-party/ckeditor/plugins/link/dialogs/link.js
devel/third-party/ckeditor/plugins/link/plugin.js
devel/third-party/ckeditor/plugins/list/plugin.js
devel/third-party/ckeditor/plugins/listblock/plugin.js
devel/third-party/ckeditor/plugins/liststyle/dialogs/liststyle.js
devel/third-party/ckeditor/plugins/liststyle/plugin.js
devel/third-party/ckeditor/plugins/maximize/plugin.js
devel/third-party/ckeditor/plugins/menu/plugin.js
devel/third-party/ckeditor/plugins/menubutton/plugin.js
devel/third-party/ckeditor/plugins/newpage/plugin.js
devel/third-party/ckeditor/plugins/pagebreak/plugin.js
devel/third-party/ckeditor/plugins/panel/plugin.js
devel/third-party/ckeditor/plugins/panelbutton/plugin.js
devel/third-party/ckeditor/plugins/pastefromword/filter/default.js
devel/third-party/ckeditor/plugins/pastefromword/plugin.js
devel/third-party/ckeditor/plugins/pastetext/dialogs/pastetext.js
devel/third-party/ckeditor/plugins/pastetext/plugin.js
devel/third-party/ckeditor/plugins/popup/plugin.js
devel/third-party/ckeditor/plugins/preview/plugin.js
devel/third-party/ckeditor/plugins/print/plugin.js
devel/third-party/ckeditor/plugins/removeformat/plugin.js
devel/third-party/ckeditor/plugins/resize/plugin.js
devel/third-party/ckeditor/plugins/richcombo/plugin.js
devel/third-party/ckeditor/plugins/save/plugin.js
devel/third-party/ckeditor/plugins/scayt/dialogs/options.js
devel/third-party/ckeditor/plugins/scayt/plugin.js
devel/third-party/ckeditor/plugins/selection/plugin.js
devel/third-party/ckeditor/plugins/showblocks/plugin.js
devel/third-party/ckeditor/plugins/showborders/plugin.js
devel/third-party/ckeditor/plugins/smiley/dialogs/smiley.js
devel/third-party/ckeditor/plugins/smiley/plugin.js
devel/third-party/ckeditor/plugins/sourcearea/plugin.js
devel/third-party/ckeditor/plugins/specialchar/dialogs/specialchar.js
devel/third-party/ckeditor/plugins/specialchar/lang/_translationstatus.txt
devel/third-party/ckeditor/plugins/specialchar/lang/cs.js
devel/third-party/ckeditor/plugins/specialchar/lang/cy.js
devel/third-party/ckeditor/plugins/specialchar/lang/de.js
devel/third-party/ckeditor/plugins/specialchar/lang/el.js
devel/third-party/ckeditor/plugins/specialchar/lang/en.js
devel/third-party/ckeditor/plugins/specialchar/lang/eo.js
devel/third-party/ckeditor/plugins/specialchar/lang/et.js
devel/third-party/ckeditor/plugins/specialchar/lang/fa.js
devel/third-party/ckeditor/plugins/specialchar/lang/fi.js
devel/third-party/ckeditor/plugins/specialchar/lang/fr.js
devel/third-party/ckeditor/plugins/specialchar/lang/he.js
devel/third-party/ckeditor/plugins/specialchar/lang/hr.js
devel/third-party/ckeditor/plugins/specialchar/lang/it.js
devel/third-party/ckeditor/plugins/specialchar/lang/ku.js
devel/third-party/ckeditor/plugins/specialchar/lang/lv.js
devel/third-party/ckeditor/plugins/specialchar/lang/nb.js
devel/third-party/ckeditor/plugins/specialchar/lang/nl.js
devel/third-party/ckeditor/plugins/specialchar/lang/no.js
devel/third-party/ckeditor/plugins/specialchar/lang/pt-br.js
devel/third-party/ckeditor/plugins/specialchar/lang/sk.js
devel/third-party/ckeditor/plugins/specialchar/lang/tr.js
devel/third-party/ckeditor/plugins/specialchar/lang/ug.js
devel/third-party/ckeditor/plugins/specialchar/lang/zh-cn.js
devel/third-party/ckeditor/plugins/specialchar/plugin.js
devel/third-party/ckeditor/plugins/styles/plugin.js
devel/third-party/ckeditor/plugins/styles/styles/default.js
devel/third-party/ckeditor/plugins/stylescombo/plugin.js
devel/third-party/ckeditor/plugins/tab/plugin.js
devel/third-party/ckeditor/plugins/table/dialogs/table.js
devel/third-party/ckeditor/plugins/table/plugin.js
devel/third-party/ckeditor/plugins/tableresize/plugin.js
devel/third-party/ckeditor/plugins/tabletools/dialogs/tableCell.js
devel/third-party/ckeditor/plugins/tabletools/plugin.js
devel/third-party/ckeditor/plugins/templates/dialogs/templates.js
devel/third-party/ckeditor/plugins/templates/plugin.js
devel/third-party/ckeditor/plugins/templates/templates/default.js
devel/third-party/ckeditor/plugins/toolbar/plugin.js
devel/third-party/ckeditor/plugins/uicolor/dialogs/uicolor.js
devel/third-party/ckeditor/plugins/uicolor/lang/en.js
devel/third-party/ckeditor/plugins/uicolor/plugin.js
devel/third-party/ckeditor/plugins/undo/plugin.js
devel/third-party/ckeditor/plugins/wsc/dialogs/ciframe.html
devel/third-party/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
devel/third-party/ckeditor/plugins/wsc/dialogs/wsc.css
devel/third-party/ckeditor/plugins/wsc/dialogs/wsc.js
devel/third-party/ckeditor/plugins/wsc/plugin.js
devel/third-party/ckeditor/plugins/wysiwygarea/plugin.js
devel/third-party/ckeditor/skins/kama/dialog.css
devel/third-party/ckeditor/skins/kama/elementspath.css
devel/third-party/ckeditor/skins/kama/icons.css
devel/third-party/ckeditor/skins/kama/mainui.css
devel/third-party/ckeditor/skins/kama/menu.css
devel/third-party/ckeditor/skins/kama/panel.css
devel/third-party/ckeditor/skins/kama/presets.css
devel/third-party/ckeditor/skins/kama/reset.css
devel/third-party/ckeditor/skins/kama/richcombo.css
devel/third-party/ckeditor/skins/kama/skin.js
devel/third-party/ckeditor/skins/kama/templates.css
devel/third-party/ckeditor/skins/kama/toolbar.css
devel/third-party/ckeditor/skins/office2003/dialog.css
devel/third-party/ckeditor/skins/office2003/editor.css
devel/third-party/ckeditor/skins/office2003/elementspath.css
devel/third-party/ckeditor/skins/office2003/icons.css
devel/third-party/ckeditor/skins/office2003/mainui.css
devel/third-party/ckeditor/skins/office2003/menu.css
devel/third-party/ckeditor/skins/office2003/panel.css
devel/third-party/ckeditor/skins/office2003/presets.css
devel/third-party/ckeditor/skins/office2003/reset.css
devel/third-party/ckeditor/skins/office2003/richcombo.css
devel/third-party/ckeditor/skins/office2003/skin.js
devel/third-party/ckeditor/skins/office2003/templates.css
devel/third-party/ckeditor/skins/office2003/toolbar.css
devel/third-party/ckeditor/skins/v2/dialog.css
devel/third-party/ckeditor/skins/v2/editor.css
devel/third-party/ckeditor/skins/v2/elementspath.css
devel/third-party/ckeditor/skins/v2/icons.css
devel/third-party/ckeditor/skins/v2/mainui.css
devel/third-party/ckeditor/skins/v2/menu.css
devel/third-party/ckeditor/skins/v2/panel.css
devel/third-party/ckeditor/skins/v2/presets.css
devel/third-party/ckeditor/skins/v2/reset.css
devel/third-party/ckeditor/skins/v2/richcombo.css
devel/third-party/ckeditor/skins/v2/skin.js
devel/third-party/ckeditor/skins/v2/templates.css
devel/third-party/ckeditor/skins/v2/toolbar.css
devel/third-party/ckeditor/themes/default/theme.js
etc/initialdata
lib/RT/Article.pm
lib/RT/Config.pm
lib/RT/Interface/Web.pm
lib/RT/Link.pm
lib/RT/Record.pm
lib/RT/Ticket.pm
lib/RT/Tickets.pm
sbin/rt-test-dependencies.in
share/html/Elements/CollectionList
share/html/Elements/Menu
share/html/Helpers/Autocomplete/Users
share/html/NoAuth/RichText/ckeditor/adapters/jquery.js
share/html/NoAuth/RichText/ckeditor/ckeditor.js
share/html/NoAuth/RichText/ckeditor/contents.css
share/html/NoAuth/RichText/ckeditor/lang/_languages.js
share/html/NoAuth/RichText/ckeditor/lang/_translationstatus.txt
share/html/NoAuth/RichText/ckeditor/lang/af.js
share/html/NoAuth/RichText/ckeditor/lang/ar.js
share/html/NoAuth/RichText/ckeditor/lang/bg.js
share/html/NoAuth/RichText/ckeditor/lang/bn.js
share/html/NoAuth/RichText/ckeditor/lang/bs.js
share/html/NoAuth/RichText/ckeditor/lang/ca.js
share/html/NoAuth/RichText/ckeditor/lang/cs.js
share/html/NoAuth/RichText/ckeditor/lang/cy.js
share/html/NoAuth/RichText/ckeditor/lang/da.js
share/html/NoAuth/RichText/ckeditor/lang/de.js
share/html/NoAuth/RichText/ckeditor/lang/el.js
share/html/NoAuth/RichText/ckeditor/lang/en-au.js
share/html/NoAuth/RichText/ckeditor/lang/en-ca.js
share/html/NoAuth/RichText/ckeditor/lang/en-gb.js
share/html/NoAuth/RichText/ckeditor/lang/en.js
share/html/NoAuth/RichText/ckeditor/lang/eo.js
share/html/NoAuth/RichText/ckeditor/lang/es.js
share/html/NoAuth/RichText/ckeditor/lang/et.js
share/html/NoAuth/RichText/ckeditor/lang/eu.js
share/html/NoAuth/RichText/ckeditor/lang/fa.js
share/html/NoAuth/RichText/ckeditor/lang/fi.js
share/html/NoAuth/RichText/ckeditor/lang/fo.js
share/html/NoAuth/RichText/ckeditor/lang/fr-ca.js
share/html/NoAuth/RichText/ckeditor/lang/fr.js
share/html/NoAuth/RichText/ckeditor/lang/gl.js
share/html/NoAuth/RichText/ckeditor/lang/gu.js
share/html/NoAuth/RichText/ckeditor/lang/he.js
share/html/NoAuth/RichText/ckeditor/lang/hi.js
share/html/NoAuth/RichText/ckeditor/lang/hr.js
share/html/NoAuth/RichText/ckeditor/lang/hu.js
share/html/NoAuth/RichText/ckeditor/lang/is.js
share/html/NoAuth/RichText/ckeditor/lang/it.js
share/html/NoAuth/RichText/ckeditor/lang/ja.js
share/html/NoAuth/RichText/ckeditor/lang/km.js
share/html/NoAuth/RichText/ckeditor/lang/ko.js
share/html/NoAuth/RichText/ckeditor/lang/lt.js
share/html/NoAuth/RichText/ckeditor/lang/lv.js
share/html/NoAuth/RichText/ckeditor/lang/mn.js
share/html/NoAuth/RichText/ckeditor/lang/ms.js
share/html/NoAuth/RichText/ckeditor/lang/nb.js
share/html/NoAuth/RichText/ckeditor/lang/nl.js
share/html/NoAuth/RichText/ckeditor/lang/no.js
share/html/NoAuth/RichText/ckeditor/lang/pl.js
share/html/NoAuth/RichText/ckeditor/lang/pt-br.js
share/html/NoAuth/RichText/ckeditor/lang/pt.js
share/html/NoAuth/RichText/ckeditor/lang/ro.js
share/html/NoAuth/RichText/ckeditor/lang/ru.js
share/html/NoAuth/RichText/ckeditor/lang/sk.js
share/html/NoAuth/RichText/ckeditor/lang/sl.js
share/html/NoAuth/RichText/ckeditor/lang/sr-latn.js
share/html/NoAuth/RichText/ckeditor/lang/sr.js
share/html/NoAuth/RichText/ckeditor/lang/sv.js
share/html/NoAuth/RichText/ckeditor/lang/th.js
share/html/NoAuth/RichText/ckeditor/lang/tr.js
share/html/NoAuth/RichText/ckeditor/lang/uk.js
share/html/NoAuth/RichText/ckeditor/lang/vi.js
share/html/NoAuth/RichText/ckeditor/lang/zh-cn.js
share/html/NoAuth/RichText/ckeditor/lang/zh.js
share/html/NoAuth/RichText/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
share/html/NoAuth/RichText/ckeditor/plugins/a11yhelp/lang/en.js
share/html/NoAuth/RichText/ckeditor/plugins/a11yhelp/lang/he.js
share/html/NoAuth/RichText/ckeditor/plugins/about/dialogs/about.js
share/html/NoAuth/RichText/ckeditor/plugins/autogrow/plugin.js
share/html/NoAuth/RichText/ckeditor/plugins/clipboard/dialogs/paste.js
share/html/NoAuth/RichText/ckeditor/plugins/colordialog/dialogs/colordialog.js
share/html/NoAuth/RichText/ckeditor/plugins/dialog/dialogDefinition.js
share/html/NoAuth/RichText/ckeditor/plugins/div/dialogs/div.js
share/html/NoAuth/RichText/ckeditor/plugins/find/dialogs/find.js
share/html/NoAuth/RichText/ckeditor/plugins/flash/dialogs/flash.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/button.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/checkbox.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/form.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/hiddenfield.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/radio.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/select.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/textarea.js
share/html/NoAuth/RichText/ckeditor/plugins/forms/dialogs/textfield.js
share/html/NoAuth/RichText/ckeditor/plugins/iframedialog/plugin.js
share/html/NoAuth/RichText/ckeditor/plugins/image/dialogs/image.js
share/html/NoAuth/RichText/ckeditor/plugins/link/dialogs/anchor.js
share/html/NoAuth/RichText/ckeditor/plugins/link/dialogs/link.js
share/html/NoAuth/RichText/ckeditor/plugins/liststyle/dialogs/liststyle.js
share/html/NoAuth/RichText/ckeditor/plugins/pastefromword/filter/default.js
share/html/NoAuth/RichText/ckeditor/plugins/pastetext/dialogs/pastetext.js
share/html/NoAuth/RichText/ckeditor/plugins/scayt/dialogs/options.js
share/html/NoAuth/RichText/ckeditor/plugins/scayt/dialogs/toolbar.css
share/html/NoAuth/RichText/ckeditor/plugins/smiley/dialogs/smiley.js
share/html/NoAuth/RichText/ckeditor/plugins/specialchar/dialogs/specialchar.js
share/html/NoAuth/RichText/ckeditor/plugins/styles/styles/default.js
share/html/NoAuth/RichText/ckeditor/plugins/table/dialogs/table.js
share/html/NoAuth/RichText/ckeditor/plugins/tableresize/plugin.js
share/html/NoAuth/RichText/ckeditor/plugins/tabletools/dialogs/tableCell.js
share/html/NoAuth/RichText/ckeditor/plugins/templates/dialogs/templates.js
share/html/NoAuth/RichText/ckeditor/plugins/templates/templates/default.js
share/html/NoAuth/RichText/ckeditor/plugins/uicolor/dialogs/uicolor.js
share/html/NoAuth/RichText/ckeditor/plugins/uicolor/lang/en.js
share/html/NoAuth/RichText/ckeditor/plugins/uicolor/plugin.js
share/html/NoAuth/RichText/ckeditor/plugins/uicolor/yui/assets/yui.css
share/html/NoAuth/RichText/ckeditor/plugins/uicolor/yui/yui.js
share/html/NoAuth/RichText/ckeditor/plugins/wsc/dialogs/wsc.css
share/html/NoAuth/RichText/ckeditor/plugins/wsc/dialogs/wsc.js
share/html/NoAuth/RichText/ckeditor/skins/kama/dialog.css
share/html/NoAuth/RichText/ckeditor/skins/kama/editor.css
share/html/NoAuth/RichText/ckeditor/skins/kama/icons.png
share/html/NoAuth/RichText/ckeditor/skins/kama/icons_rtl.png
share/html/NoAuth/RichText/ckeditor/skins/kama/skin.js
share/html/NoAuth/RichText/ckeditor/skins/kama/templates.css
share/html/NoAuth/RichText/ckeditor/skins/office2003/dialog.css
share/html/NoAuth/RichText/ckeditor/skins/office2003/editor.css
share/html/NoAuth/RichText/ckeditor/skins/office2003/icons.png
share/html/NoAuth/RichText/ckeditor/skins/office2003/icons_rtl.png
share/html/NoAuth/RichText/ckeditor/skins/office2003/skin.js
share/html/NoAuth/RichText/ckeditor/skins/office2003/templates.css
share/html/NoAuth/RichText/ckeditor/skins/v2/dialog.css
share/html/NoAuth/RichText/ckeditor/skins/v2/editor.css
share/html/NoAuth/RichText/ckeditor/skins/v2/icons.png
share/html/NoAuth/RichText/ckeditor/skins/v2/icons_rtl.png
share/html/NoAuth/RichText/ckeditor/skins/v2/skin.js
share/html/NoAuth/RichText/ckeditor/skins/v2/templates.css
share/html/NoAuth/RichText/ckeditor/themes/default/theme.js
share/html/NoAuth/css/print.css
share/html/Search/Elements/SearchesForObject
share/html/SelfService/Create.html
share/html/Ticket/Create.html
share/html/User/Elements/TicketList
share/html/m/ticket/create
share/static/RichText/config.js
share/static/RichText/plugins/wsc/dialogs/ciframe.html
share/static/RichText/plugins/wsc/dialogs/tmpFrameset.html
t/99-policy.t
diff --cc etc/initialdata
index 72c14b9,e688c19..76dc108
--- a/etc/initialdata
+++ b/etc/initialdata
@@@ -604,22 -604,48 +604,48 @@@ Hour: { $SubscriptionObj->SubVa
OrderBy => 'LastUpdated',
Order => 'DESC' },
},
- { Name => 'HomepageSettings',
- Description => 'HomepageSettings',
- Content =>
- { 'body' => # loc
- [ { type => 'system', name => 'My Tickets' },
- { type => 'system', name => 'Unowned Tickets' },
- { type => 'system', name => 'Bookmarked Tickets' },
- { type => 'component', name => 'QuickCreate' },
- ],
- 'sidebar' => # loc
- [
- { type => 'component', name => 'MyReminders' },
- { type => 'component', name => 'Quicksearch' },
- { type => 'component', name => 'Dashboards' },
- { type => 'component', name => 'RefreshHomepage' },
- ],
- },
+ {
+ Name => 'HomepageSettings',
+ Description => 'HomepageSettings',
+ Content => {
+ 'body' => # loc
+ [
+ {
+ type => 'system',
+ name => 'My Tickets', # loc
+ },
+ {
+ type => 'system',
+ name => 'Unowned Tickets' # loc
+ },
+ {
+ type => 'system',
+ name => 'Bookmarked Tickets' # loc
+ },
+ {
+ type => 'component',
+ name => 'QuickCreate' # loc
+ },
+ ],
- 'summary' => # loc
++ 'sidebar' => # loc
+ [
+ {
+ type => 'component',
+ name => 'MyReminders' # loc
+ },
+ {
+ type => 'component',
+ name => 'Quicksearch' # loc
+ },
+ {
+ type => 'component',
+ name => 'Dashboards' # loc
+ },
+ {
+ type => 'component',
+ name => 'RefreshHomepage' # loc
+ },
+ ],
+ },
},
);
diff --cc etc/upgrade/time-worked-history.pl
index 7ed5535,0000000..77b954d
mode 100644,000000..100644
--- a/etc/upgrade/time-worked-history.pl
+++ b/etc/upgrade/time-worked-history.pl
@@@ -1,63 -1,0 +1,110 @@@
+#!/usr/bin/env perl
++# BEGIN BPS TAGGED BLOCK {{{
++#
++# COPYRIGHT:
++#
++# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
++# <sales at bestpractical.com>
++#
++# (Except where explicitly superseded by other copyright notices)
++#
++#
++# LICENSE:
++#
++# This work is made available to you under the terms of Version 2 of
++# the GNU General Public License. A copy of that license should have
++# been provided with this software, but in any event can be snarfed
++# from www.gnu.org.
++#
++# This work is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software
++# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
++# 02110-1301 or visit their web page on the internet at
++# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
++#
++#
++# CONTRIBUTION SUBMISSION POLICY:
++#
++# (The following paragraph is not intended to limit the rights granted
++# to you to modify and distribute this software under the terms of
++# the GNU General Public License and is only of importance to you if
++# you choose to contribute your changes and enhancements to the
++# community by submitting them to Best Practical Solutions, LLC.)
++#
++# By intentionally submitting any modifications, corrections or
++# derivatives to this work, or any other work intended for use with
++# Request Tracker, to Best Practical Solutions, LLC, you confirm that
++# you are the copyright holder for those contributions and you grant
++# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
++# royalty-free, perpetual, license to use, copy, create derivative
++# works based on those contributions, and sublicense and distribute
++# those contributions and any derivatives thereof.
++#
++# END BPS TAGGED BLOCK }}}
+use 5.8.3;
+use strict;
+use warnings;
+
+use RT;
+RT::LoadConfig();
+RT->Config->Set('LogToScreen' => 'info');
+RT::Init();
+
+my $dbh = $RT::Handle->dbh;
+my $ids = $dbh->selectcol_arrayref(
+ "SELECT t1.id FROM Tickets t1, Tickets t2 WHERE t1.id = t2.EffectiveId"
+ ." AND t2.id != t2.EffectiveId AND t2.EffectiveId = t1.id"
+);
+foreach my $id ( @$ids ) {
+ my $t = RT::Ticket->new( RT->SystemUser );
+ $t->Load( $id );
+ unless ( $t->id ) {
+ $RT::Logger->error("Couldn't load ticket #$id");
+ next;
+ }
+
+ fix_time_worked_history($t);
+}
+
+sub fix_time_worked_history {
+ my ($t) = (@_);
+
+ my $history = 0;
+ my $candidate = undef;
+ my @delete = ();
+ my $delete_time = 0;
+
+ my $txns = $t->Transactions;
+ while ( my $txn = $txns->Next ) {
+ if ( $txn->Type =~ /^(Create|Correspond|Comment)$/ ) {
+ $history += $txn->TimeTaken || 0;
+ } elsif ( $txn->Type eq 'Set' && $txn->Field eq 'TimeWorked' ) {
+ $history += $txn->NewValue - $txn->OldValue;
+ $candidate = $txn;
+ } elsif ( $candidate && $txn->Field eq 'MergedInto' ) {
+ if ($candidate->Creator eq $txn->Creator ) {
+ push @delete, $candidate;
+ $delete_time += $candidate->NewValue - $candidate->OldValue;
+ }
+
+ $candidate = undef;
+ }
+ }
+
+ if ( $history == $t->TimeWorked ) {
+ $RT::Logger->info("Ticket #". $t->id . " has TimeWorked matching history. Skipping");
+ } elsif ( $history - $delete_time == $t->TimeWorked ) {
+ $RT::Logger->warn( "Ticket #". $t->id ." has TimeWorked mismatch. Deleting transactions" );
+ foreach my $dtxn ( @delete ) {
+ my ($status, $msg) = $dtxn->Delete;
+ $RT::Logger->error("Couldn't delete transaction: $msg") unless $status;
+ }
+ } else {
+ $RT::Logger->error( "Ticket #". $t->id ." has TimeWorked mismatch, but we couldn't find correct transactions to delete. Skipping" );
+ }
+}
diff --cc lib/RT/I18N/fr.pm
index 72147b4,4839a99..3e5b2d2
--- a/lib/RT/I18N/fr.pm
+++ b/lib/RT/I18N/fr.pm
@@@ -46,51 -46,22 +46,22 @@@
#
# END BPS TAGGED BLOCK }}}
- package RT::Action::ExtractSubjectTag;
- use base 'RT::Action';
use strict;
use warnings;
+ use utf8;
- sub Describe {
- my $self = shift;
- return ( ref $self );
- }
-
- sub Prepare {
- return (1);
- }
-
- sub Commit {
- my $self = shift;
- my $Transaction = $self->TransactionObj;
- my $FirstAttachment = $Transaction->Attachments->First;
- return 1 unless $FirstAttachment;
-
- my $TransactionSubject = $FirstAttachment->Subject;
- return 1 unless $TransactionSubject;
+ package RT::I18N::fr;
+ use base 'RT::I18N';
- my $Ticket = $self->TicketObj;
-
- my $TicketSubject = $self->TicketObj->Subject;
- my $origTicketSubject = $TicketSubject;
-
- my $match = RT->Config->Get('ExtractSubjectTagMatch');
- my $nomatch = RT->Config->Get('ExtractSubjectTagNoMatch');
- TAGLIST: while ( $TransactionSubject =~ /($match)/g ) {
- my $tag = $1;
- next if $tag =~ /$nomatch/;
- foreach my $subject_tag ( RT->System->SubjectTag ) {
- if ($tag =~ /\[\Q$subject_tag\E\s+\#(\d+)\s*\]/) {
- next TAGLIST;
- }
- }
- $TicketSubject .= " $tag" unless ( $TicketSubject =~ /\Q$tag\E/ );
- }
-
- $self->TicketObj->SetSubject($TicketSubject)
- if ( $TicketSubject ne $origTicketSubject );
+ use strict;
+ use warnings;
- return (1);
+ sub numf {
- my ($handle, $num) = @_[0,1];
- my $fr_num = $handle->SUPER::numf($num);
- # French prefer to print 1000 as 1 000 rather than 1,000
- $fr_num =~ tr<.,><, >;
- return $fr_num;
++ my ($handle, $num) = @_[0,1];
++ my $fr_num = $handle->SUPER::numf($num);
++ # French prefer to print 1000 as 1 000 rather than 1,000
++ $fr_num =~ tr<.,><, >;
++ return $fr_num;
}
RT::Base->_ImportOverlays();
diff --cc lib/RT/Interface/Web.pm
index 7056d24,2b8b4c7..c3d228b
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@@ -3256,41 -3060,24 +3285,59 @@@ sub ProcessRecordLinks
return (@results);
}
+=head2 ProcessLinksForCreate
+
+Takes a hash with a single key, C<ARGSRef>, the value of which is a hashref to
+C<%ARGS>.
+
+Converts and returns submitted args in the form of C<new-LINKTYPE> and
+C<LINKTYPE-new> into their appropriate directional link types. For example,
+C<new-DependsOn> becomes C<DependsOn> and C<DependsOn-new> becomes
+C<DependedOnBy>. The incoming arg values are split on whitespace and
+normalized into arrayrefs before being returned.
+
+Primarily used by object creation pages for transforming incoming form inputs
+from F</Elements/EditLinks> into arguments appropriate for individual record
+Create methods.
+
+Returns a hashref in scalar context and a hash in list context.
+
+=cut
+
+sub ProcessLinksForCreate {
+ my %args = @_;
+ my %links;
+
+ foreach my $type ( keys %RT::Link::DIRMAP ) {
+ for ([Base => "new-$type"], [Target => "$type-new"]) {
+ my ($direction, $key) = @$_;
+ next unless $args{ARGSRef}->{$key};
+ $links{ $RT::Link::DIRMAP{$type}->{$direction} } = [
+ grep $_, split ' ', $args{ARGSRef}->{$key}
+ ];
+ }
+ }
+ return wantarray ? %links : \%links;
+}
+
+ =head2 ProcessTransactionSquelching
+
+ Takes a hashref of the submitted form arguments, C<%ARGS>.
+
+ Returns a hash of squelched addresses.
+
+ =cut
+
+ sub ProcessTransactionSquelching {
+ my $args = shift;
+ my %checked = map { $_ => 1 } grep { defined }
+ ( ref $args->{'TxnSendMailTo'} eq "ARRAY" ? @{$args->{'TxnSendMailTo'}} :
+ defined $args->{'TxnSendMailTo'} ? ($args->{'TxnSendMailTo'}) :
+ () );
+ my %squelched = map { $_ => 1 } grep { not $checked{$_} } split /,/, ($args->{'TxnRecipients'}||'');
+ return %squelched;
+ }
+
=head2 _UploadedFile ( $arg );
Takes a CGI parameter name; if a file is uploaded under that name,
@@@ -3522,9 -3303,9 +3569,9 @@@ our @SCRUBBER_ALLOWED_TAGS = qw
);
our %SCRUBBER_ALLOWED_ATTRIBUTES = (
- # Match http, ftp and relative urls
+ # Match http, https, ftp, mailto and relative urls
# XXX: we also scrub format strings with this module then allow simple config options
- href => qr{^(?:http:|ftp:|https:|/|__Web(?:Path|HomePath|BaseURL|URL)__)}i,
- href => qr{^(?:https?:|ftp:|mailto:|/|__Web(?:Path|BaseURL|URL)__)}i,
++ href => qr{^(?:https?:|ftp:|mailto:|/|__Web(?:Path|HomePath|BaseURL|URL)__)}i,
face => 1,
size => 1,
target => 1,
diff --cc lib/RT/Interface/Web/Handler.pm
index b5ffc06,a1784c2..c5aa992
--- a/lib/RT/Interface/Web/Handler.pm
+++ b/lib/RT/Interface/Web/Handler.pm
@@@ -231,8 -263,14 +265,14 @@@ sub PSGIApp
$self->InitSessionDir;
- return sub {
+ my $mason = sub {
my $env = shift;
+
+ {
+ my $res = $self->CheckModPerlHandler($env);
+ return $self->_psgi_response_cb( $res->finalize ) if $res;
+ }
+
RT::ConnectToDatabase() unless RT->InstallMode;
my $req = Plack::Request->new($env);
diff --cc lib/RT/Record.pm
index 4109d7d,6f28120..df89a38
--- a/lib/RT/Record.pm
+++ b/lib/RT/Record.pm
@@@ -895,16 -903,17 +897,16 @@@ sub Update
do {
no warnings "uninitialized";
local $@;
- eval {
+ my $name = eval {
my $object = $attribute . "Obj";
- my $name = $self->$object->Name;
- next if $name eq $value || $name eq ($value || 0);
+ $self->$object->Name;
};
+ unless ($@) {
+ next if $name eq $value || $name eq ($value || 0);
+ }
- next if $value eq $self->$attribute();
- next if ($value || 0) eq $self->$attribute();
- my $current = $self->$attribute();
- # RT::Queue->Lifecycle returns a Lifecycle object instead of name
- $current = eval { $current->Name } if ref $current;
- next if $truncated_value eq $current;
- next if ( $truncated_value || 0 ) eq $current;
++ next if $truncated_value eq $self->$attribute();
++ next if ( $truncated_value || 0 ) eq $self->$attribute();
};
$new_values{$attribute} = $value;
diff --cc lib/RT/Tickets.pm
index 3fb1299,3b834e0..6437d78
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@@ -1404,10 -1677,10 +1412,10 @@@ sub _CustomFieldLimit
%rest,
);
- $self->_SQLLimit(
+ $self->Limit(
ALIAS => $TicketCFs,
FIELD => 'Content',
- OPERATOR => "<=",
+ OPERATOR => "<",
VALUE => $dayend,
%rest,
ENTRYAGGREGATOR => 'AND',
diff --cc sbin/rt-test-dependencies.in
index a2319dc,26593d9..e703355
--- a/sbin/rt-test-dependencies.in
+++ b/sbin/rt-test-dependencies.in
@@@ -346,8 -363,8 +346,8 @@@ Convert::Colo
.
$deps{'HTML-DOC'} = [ text_to_hash( <<'.') ];
-Pod::Simple 3.24
HTML::Entities
- Pod::Simple 3.17
++Pod::Simple 3.24
.
my %AVOID = (
diff --cc share/html/Elements/CollectionList
index 1f6db3e,7e4ba15..822171c
--- a/share/html/Elements/CollectionList
+++ b/share/html/Elements/CollectionList
@@@ -111,25 -111,24 +111,25 @@@ if ($Class =~ /::/) { # older passed i
$Class =~ s/:/_/g;
}
- $m->out('<table class="' .
+ $m->out('<table cellspacing="0" class="' .
- ($Collection->isa('RT::Tickets') ? 'ticket-list' : 'collection') . ' collection-as-table">');
+ ($Collection->isa('RT::Tickets') ? 'ticket-list' : 'collection') . ' collection-as-table">');
if ( $ShowHeader ) {
- $m->comp('/Elements/CollectionAsTable/Header',
- %ARGS,
- Class => $Class,
- Format => \@Format,
- FormatString => $Format,
- Order => \@Order,
- OrderBy => \@OrderBy,
- Rows => $Rows,
- Page => $Page,
- AllowSorting => $AllowSorting,
- BaseURL => $BaseURL,
- GenericQueryArgs => $GenericQueryArgs,
- maxitems => $maxitems,
- );
+ $m->comp('/Elements/CollectionAsTable/Header',
+ %ARGS,
+ Class => $Class,
+ Format => \@Format,
+ FormatString => $Format,
+ Order => \@Order,
+ OrderBy => \@OrderBy,
+ Rows => $Rows,
+ Page => $Page,
+ AllowSorting => $AllowSorting,
+ BaseURL => $BaseURL,
+ GenericQueryArgs => $GenericQueryArgs,
+ maxitems => $maxitems,
+ PassArguments => \@PassArguments,
+ );
}
my ($i, $column_map) = (0, {});
diff --cc share/html/Elements/ShowMessageStanza
index 189b62b,0000000..65ee738
mode 100644,000000..100644
--- a/share/html/Elements/ShowMessageStanza
+++ b/share/html/Elements/ShowMessageStanza
@@@ -1,188 -1,0 +1,188 @@@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+%# <sales at bestpractical.com>
+%#
+%# (Except where explicitly superseded by other copyright notices)
+%#
+%#
+%# LICENSE:
+%#
+%# This work is made available to you under the terms of Version 2 of
+%# the GNU General Public License. A copy of that license should have
+%# been provided with this software, but in any event can be snarfed
+%# from www.gnu.org.
+%#
+%# This work is distributed in the hope that it will be useful, but
+%# WITHOUT ANY WARRANTY; without even the implied warranty of
+%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+%# General Public License for more details.
+%#
+%# You should have received a copy of the GNU General Public License
+%# along with this program; if not, write to the Free Software
+%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+%# 02110-1301 or visit their web page on the internet at
+%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+%#
+%#
+%# CONTRIBUTION SUBMISSION POLICY:
+%#
+%# (The following paragraph is not intended to limit the rights granted
+%# to you to modify and distribute this software under the terms of
+%# the GNU General Public License and is only of importance to you if
+%# you choose to contribute your changes and enhancements to the
+%# community by submitting them to Best Practical Solutions, LLC.)
+%#
+%# By intentionally submitting any modifications, corrections or
+%# derivatives to this work, or any other work intended for use with
+%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+%# you are the copyright holder for those contributions and you grant
+%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
+%# royalty-free, perpetual, license to use, copy, create derivative
+%# works based on those contributions, and sublicense and distribute
+%# those contributions and any derivatives thereof.
+%#
+%# END BPS TAGGED BLOCK }}}
+<%INIT>
+my $plain_text_pre
+ = RT->Config->Get( 'PlainTextPre', $session{'CurrentUser'} );
+my $plain_text_mono
+ = RT->Config->Get( 'PlainTextMono', $session{'CurrentUser'} );
+my $Depth = 0;
+
+my $object = $Transaction ? $Transaction->Object : undef;
+
+my $print_content = sub {
+ my $ref = shift;
+ return unless defined $$ref && length $$ref;
+
+ $m->callback( content => $ref, %ARGS );
+ if ( $ContentType eq 'text/plain' ) {
+ $m->comp( '/Elements/MakeClicky',
+ content => $ref,
+ object => $object,
+ %ARGS
+ );
+
+ if ( defined $$ref && !$plain_text_pre && !$plain_text_mono ) {
+ $$ref =~ s{(\r?\n)}{<br />}g;
+ }
+ } else {
+ if ( defined $$ref ) {
+ $$ref =~ s/^[\r\n]+//g;
+ }
+ }
+ $m->out($$ref);
+};
+
- if ( ref $Message ) {
- $m->out('<pre>')
- if ( $ContentType eq 'text/plain'
- && $plain_text_pre
- && !$Depth
- && !$plain_text_mono );
- $m->out( '<div class="message-stanza'
- . ( ($ContentType eq 'text/plain' && $plain_text_mono) ? ' plain-text-white-space' : '' ) . '"'
- . '>' );
++$m->out('<pre>')
++ if ( $ContentType eq 'text/plain'
++ && $plain_text_pre
++ && !$Depth
++ && !$plain_text_mono );
++$m->out( '<div class="message-stanza'
++ . ( ($ContentType eq 'text/plain' && $plain_text_mono) ? ' plain-text-white-space' : '' ) . '"'
++ . '>' );
+
++if ( ref $Message ) {
+ my @stack;
+ my $para = '';
+ my $i = 0;
+
+AGAIN: foreach ( ; $i < @$Message; $i++ ) {
+ my $stanza = $Message->[$i];
+ if ( ref $stanza eq "HASH" ) {
+ # Fix message stanza nesting for Outlook's quoting styles
+ if ( $stanza->{raw}
+ and not $stanza->{_outlooked}
+ and $stanza->{raw} =~ /^ # start of an internal line
+ \s* # optional whitespace
+ (?:
+ -{3,} # at least three hyphens
+ \s* # whitespace varies between Outlook versions
+ # don't trigger on PGP signed message or signature blocks
+ (?!(?:BEGIN|END)\s+PGP)
+ \w # at least one word character
+ [\w\s]{3,}? # the rest of the word(s), totalling at least 5 characters,
+ # loose to get different languages
+ \w # at least one ending word character
+ \s* # whitespace varies between Outlook versions
+ -{3,} # at least three hyphens again
+ |
+ _{6,} # OR: six or more underscores
+ )
+ \s*$ # optional whitespace until the end of the line
+ /xm )
+ {
+ # There's content before the quoted message, but in the
+ # same stanza. Break it out!
+ if ( my $start = $-[0] ) {
+ my %preceding = %$stanza;
+
+ # We don't process $stanza->{text} because we don't use it
+ # and it isn't given to us by HTML::Quoted. If we ever
+ # need to, we can process it the same way as 'raw'.
+ $preceding{raw} = substr($stanza->{raw}, 0, $start, '');
+
+ # Replace the current stanza with the two we just created
+ splice @$Message, $i, 1, \%preceding, $stanza;
+
+ # Try it again from the top now that we've rejiggered our
+ # stanzas. We'll process the Outlook stanza again, and hit
+ # the else below this time.
+ redo;
+ } else {
+ # Nest the current stanza and everything that follows
+ $stanza->{_outlooked}++;
+ $stanza = $Message->[ $i ] = [ splice @$Message, $i ];
+ }
+ }
+ else {
+ $para .= ( defined $stanza->{raw} ? $stanza->{raw} : '' )."\n";
+ }
+ }
+ next unless ref $stanza eq "ARRAY";
+
+ $print_content->( \$para );
+ $para = '';
+
+ $Depth++;
+ push @stack, [ $Message, $i + 1 ];
+ ( $Message, $i ) = ( $stanza, -1 );
+
+ if ( $Depth == 1 ) {
+ $m->comp('FoldStanzaJS');
+ }
+ my @classes = ('message-stanza');
+ push @classes, $Depth == 1 ? 'closed' : 'open';
+ $m->out( '<div class="' . join(" ", @classes) . '">' );
+ }
+ if ( length $para ) {
+ $print_content->( \$para );
+ $para = '';
+ }
+
+ if (@stack) {
+ ( $Message, $i ) = @{ pop @stack };
+ $Depth--;
+ $m->out('</div>');
+ goto AGAIN;
+ }
-
- $m->out('</div>');
- $m->out('</pre>')
- if ( $ContentType eq 'text/plain'
- && $plain_text_pre
- && !$Depth
- && !$plain_text_mono );
+} else {
+ $print_content->( \$Message );
+}
++
++$m->out('</div>');
++$m->out('</pre>')
++ if ( $ContentType eq 'text/plain'
++ && $plain_text_pre
++ && !$Depth
++ && !$plain_text_mono );
+</%INIT>
+<%ARGS>
+$Message => undef
+$Transaction => undef
+$ContentType => 'text/plain'
+</%ARGS>
diff --cc share/html/Elements/Tabs
index a2f7743,addaeee..713b125
--- a/share/html/Elements/Tabs
+++ b/share/html/Elements/Tabs
@@@ -434,37 -385,24 +434,40 @@@ my $build_admin_menu = sub
}
};
-
my $build_main_nav = sub {
+ PageWidgets()->child( simple_search => raw_html => $m->scomp('SimpleSearch') );
+ PageWidgets()->child( create_ticket => raw_html => $m->scomp('CreateTicket') );
+
my $home = Menu->child( home => title => loc('Homepage'), path => '/' );
- # We explicitly exclude superusers; otherwise the dashboards for
- # groups you're not in (but can see the dashboards of by dint of
- # being a superuser) would push the useful ones from the groups
- # you're actually in off of the stack.
- my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards", IncludeSuperuserGroups => 0);
- my $limit = 7;
-
- my $more = 0;
- if ( @dashboards > $limit ) {
- $more = 1;
- splice @dashboards, $limit;
+ unless ($session{'dashboards_in_menu'}) {
+ my $dashboards_in_menu = $session{CurrentUser}->UserObj->Preferences(
+ 'DashboardsInMenu',
+ {},
+ );
+
+ unless ($dashboards_in_menu->{dashboards}) {
+ my ($default_dashboards) =
+ RT::System->new( $session{'CurrentUser'} )
+ ->Attributes
+ ->Named('DashboardsInMenu');
+ if ($default_dashboards) {
+ $dashboards_in_menu = $default_dashboards->Content;
+ }
+ }
+
+ $session{'dashboards_in_menu'} = $dashboards_in_menu->{dashboards} || [];
+ }
+
+ my @dashboards;
+ for my $id ( @{$session{'dashboards_in_menu'}} ) {
+ my $dash = RT::Dashboard->new( $session{CurrentUser} );
+ my ( $status, $msg ) = $dash->LoadById($id);
+ if ( $status ) {
+ push @dashboards, $dash;
+ } else {
+ $RT::Logger->warning( "Failed to load dashboard $id: $msg" );
+ }
}
my $dashes = Menu()->child('home');
diff --cc share/html/NoAuth/css/base/ticket.css
index 55049c0,6e15a9d..5d3c232
--- a/share/html/NoAuth/css/base/ticket.css
+++ b/share/html/NoAuth/css/base/ticket.css
@@@ -45,9 -45,43 +45,8 @@@
%# those contributions and any derivatives thereof.
%#
%# END BPS TAGGED BLOCK }}}
-
-#requestor-accordion .ui-accordion-content {
- padding: 0 0 0 20px;
- margin: -0.5em 0 0.5em 0;
- border: none;
- background: none;
- color: black !important;
-}
-
-#requestor-accordion {
- margin: 0.5em 0 0 0;
-}
-
-#requestor-accordion h3 .ui-icon {
- background-image: url(<%RT->Config->Get('WebPath')%>/NoAuth/images/jquery_ui/ui-icons_4488cc_256x240.png);
- left: 0;
-}
-
-#requestor-accordion h3 {
- padding: 0;
- background: none !important;
-}
-
-#requestor-accordion h3, #requestor-accordion h3 a {
- color: black !important;
- border: none !important;
- margin: 0;
-}
-
-#requestor-accordion h3 a {
- font-size: 90%;
- padding: 0 0 0.25em 20px;
-}
-
-#requestor-accordion h3 a:hover,
-#requestor-accordion h3.ui-state-active a {
- text-decoration: underline;
-}
+#requestor-accordion h3 { clear: right }
+#requestor-accordion a.user-summary { float: right; }
#requestor-accordion a.modify-user {
font-size: 80%;
diff --cc share/html/NoAuth/css/print.css
index e82e828,ecd7021..a5330cb
--- a/share/html/NoAuth/css/print.css
+++ b/share/html/NoAuth/css/print.css
@@@ -86,15 -86,13 +86,13 @@@ div#header h1
#main-navigation,
#page-navigation,
.titlebox-title .widget,
- .ticket-info-links .titlebox-title .right,
+ .titlebox-title .right,
.ticket-info-links .titlebox-content .create,
- .history .titlebox .titlebox-title .right,
-.ticket-transaction .metadata .actions,
-.ticket-transaction .content .downloadattachment,
+.transaction .metadata .actions,
+.transaction .content .downloadattachment,
#comp-Search-Results #body .refresh,
.search-result-actions,
- #comp-Search-Chart #body div,
- #comp-Search-Chart #body form,
+ #comp-Search-Chart .chart-meta,
#footer,
#topactions,
#logo,
diff --cc share/html/Search/Elements/SearchesForObject
index b357522,db5fc8f..fb490c9
--- a/share/html/Search/Elements/SearchesForObject
+++ b/share/html/Search/Elements/SearchesForObject
@@@ -55,10 -55,10 +55,10 @@@ my @result
while (my $search = $Object->Attributes->Next) {
my $desc;
if ($search->Name eq 'SavedSearch') {
- push @result, [$search->Description, $search];
- push @result, [$search->Description, $search->Description, $search];
++ push @result, [$search->Description, $search->Description, $search];
}
elsif ($search->Name =~ m/^Search - (.*)/) {
- push @result, [$1, $search];
- push @result, [$1, loc($1), $search];
++ push @result, [$1, loc($1), $search];
}
}
return @result;
diff --cc share/html/SelfService/Create.html
index df2c45d,76126ae..7aceec4
--- a/share/html/SelfService/Create.html
+++ b/share/html/SelfService/Create.html
@@@ -88,24 -88,10 +88,15 @@@
</tr>
<tr>
<td colspan="2">
- <& /Ticket/Elements/EditCustomFields, %ARGS, QueueObj => $queue_obj &>
+ <& /Elements/EditCustomFields,
+ %ARGS,
+ Object => RT::Ticket->new($session{CurrentUser}),
+ CustomFields => $queue_obj->TicketCustomFields,
+ AsTable => 0,
+ &>
</td>
</tr>
- <tr>
- <td class="label">
- %# FIXME: if failed customfields validation, attachement needs to be choosen
- %# again by user.
- <&|/l&>Attach file</&>:
- </td>
- <td class="value">
- <input name="Attach" type="file" />
- </td>
- </tr>
+ <& /Ticket/Elements/AddAttachments, %ARGS, QueueObj => $queue_obj &>
</table>
<table width="100%">
<tr>
@@@ -126,25 -112,20 +117,27 @@@ $Queue => unde
my @results;
my $queue_obj = RT::Queue->new($session{'CurrentUser'});
$queue_obj->Load($Queue);
-my $CFs = $queue_obj->TicketCustomFields();
-my $ValidCFs = $m->comp(
- '/Elements/ValidateCustomFields',
- CustomFields => $CFs,
- ARGSRef => \%ARGS
-);
+ ProcessAttachments(ARGSRef => \%ARGS);
+
my $skip_create = 0;
+
+{
+ my ($status, @msg) = $m->comp(
+ '/Elements/ValidateCustomFields',
+ CustomFields => $queue_obj->TicketCustomFields,
+ ARGSRef => \%ARGS
+ );
+ unless ($status) {
+ push @results, @msg;
+ $skip_create = 1;
+ }
+}
+
$m->callback( CallbackName => 'BeforeCreate', ARGSRef => \%ARGS, skip_create => \$skip_create, results => \@results );
- if ( defined($ARGS{'id'}) and $ARGS{'id'} eq 'new' ) { # new ticket?
+ if ( !exists $ARGS{'AddMoreAttach'} and defined($ARGS{'id'}) and $ARGS{'id'} eq 'new' ) { # new ticket?
- if ( $ValidCFs && !$skip_create ) {
+ if ( !$skip_create ) {
$m->comp('Display.html', %ARGS);
$RT::Logger->crit("After display call; error is $@");
$m->abort();
diff --cc share/html/SelfService/Update.html
index 4391114,cc5e496..b7dac5b
--- a/share/html/SelfService/Update.html
+++ b/share/html/SelfService/Update.html
@@@ -76,12 -74,18 +77,18 @@@
</tr>
<& /Ticket/Elements/AddAttachments, %ARGS, TicketObj => $Ticket &>
- <tr><td colspan="2"><& /Ticket/Elements/EditCustomFields, TicketObj => $Ticket &></td></tr>
+ <tr><td colspan="2"><& /Elements/EditCustomFields, Object => $Ticket, AsTable => 0 &></td></tr>
</table>
- <& /Elements/MessageBox,
- Name => "UpdateContent",
- QuoteTransaction => $ARGS{QuoteTransaction}
- &>
+ % if (exists $ARGS{UpdateContent}) {
+ % # preserve QuoteTransaction so we can use it to set up sane references/in/reply to
+ % my $temp = $ARGS{'QuoteTransaction'};
+ % delete $ARGS{'QuoteTransaction'};
+ <& /Elements/MessageBox, Name=>"UpdateContent", Default=>$ARGS{UpdateContent}, IncludeSignature => 0, %ARGS&>
+ % $ARGS{'QuoteTransaction'} = $temp;
+ % } else {
+ % my $IncludeSignature = 1;
+ <& /Elements/MessageBox, Name=>"UpdateContent", IncludeSignature => $IncludeSignature, %ARGS &>
+ % }
<br />
diff --cc share/html/Ticket/Create.html
index e4711c4,9e708a4..9b123bc
--- a/share/html/Ticket/Create.html
+++ b/share/html/Ticket/Create.html
@@@ -368,37 -351,17 +368,13 @@@ $QueueObj->Load($Queue) || Abort(loc("Q
$m->callback( QueueObj => $QueueObj, title => \$title, results => \@results, ARGSRef => \%ARGS );
-$QueueObj->Disabled && Abort(loc("Cannot create tickets in a disabled queue."));
+$m->scomp( '/Articles/Elements/SubjectOverride', ARGSRef => \%ARGS, QueueObj => $QueueObj, results => \@results );
-my $CFs = $QueueObj->TicketCustomFields();
+$QueueObj->Disabled && Abort(loc("Cannot create tickets in a disabled queue."));
-my $ValidCFs = $m->comp(
- '/Elements/ValidateCustomFields',
- CustomFields => $CFs,
- ARGSRef => \%ARGS
-);
+my $ticket = RT::Ticket->new($session{'CurrentUser'}); # empty ticket object
- # deal with deleting uploaded attachments
- foreach my $key (keys %ARGS) {
- if ($key =~ m/^DeleteAttach-(.+)$/) {
- delete $session{'Attachments'}{$1};
- }
- $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
- }
-
- # store the uploaded attachment in session
- if ( defined $ARGS{'Attach'} && length $ARGS{'Attach'} ) { # attachment?
- my $attachment = MakeMIMEEntity(
- AttachmentFieldName => 'Attach'
- );
-
- my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
- $session{'Attachments'} = {
- %{$session{'Attachments'} || {}},
- $file_path => $attachment,
- };
- }
-
- # delete temporary storage entry to make WebUI clean
- unless (keys %{$session{'Attachments'}} and $ARGS{'id'} eq 'new') {
- delete $session{'Attachments'};
- }
+ ProcessAttachments(ARGSRef => \%ARGS);
my $checks_failure = 0;
diff --cc share/html/Ticket/ModifyAll.html
index cb2c063,c5bb6bb..76e030c
--- a/share/html/Ticket/ModifyAll.html
+++ b/share/html/Ticket/ModifyAll.html
@@@ -146,65 -152,27 +146,40 @@@ $CanRespond = 1 if ( $Ticket->CurrentUs
$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or
$Ticket->CurrentUserHasRight('ModifyTicket') );
- # deal with deleting uploaded attachments
- foreach my $key (keys %ARGS) {
- if ($key =~ m/^DeleteAttach-(.+)$/) {
- delete $session{'Attachments'}{$1};
- }
- $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
- }
-
- # store the uploaded attachment in session
- if ( defined $ARGS{'Attach'} && length $ARGS{'Attach'} ) { # attachment?
- my $attachment = MakeMIMEEntity(
- AttachmentFieldName => 'Attach'
- );
-
- my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
- $session{'Attachments'} = {
- %{$session{'Attachments'} || {}},
- $file_path => $attachment,
- };
- }
-
- # delete temporary storage entry to make WebUI clean
- unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) {
- delete $session{'Attachments'};
- }
-
+ ProcessAttachments(ARGSRef => \%ARGS);
-$m->callback( TicketObj => $Ticket, ARGSRef => \%ARGS );
my @results;
+my $skip_update = 0;
+$m->callback( TicketObj => $Ticket, ARGSRef => \%ARGS, skip_update => \$skip_update );
+
+{
+ my ($status, @msg) = $m->comp(
+ '/Elements/ValidateCustomFields',
+ Object => $Ticket,
+ CustomFields => $CustomFields,
+ ARGSRef => \%ARGS,
+ );
+ unless ($status) {
+ push @results, @msg;
+ $skip_update = 1;
+ }
+}
-unless ($OnlySearchForPeople or $OnlySearchForGroup or $ARGS{'AddMoreAttach'} ) {
- # There might be two owners.
- if ( ref ($ARGS{'Owner'} )) {
- my @owners =@{$ARGS{'Owner'}};
- delete $ARGS{'Owner'};
- foreach my $owner(@owners){
- if (defined($owner) && $owner =~ /\D/) {
- $ARGS{'Owner'} = $owner unless ($Ticket->OwnerObj->Name eq $owner);
- }
- elsif (length $owner) {
- $ARGS{'Owner'} = $owner unless ($Ticket->OwnerObj->id == $owner);
- }
+# There might be two owners.
+if ( ref ($ARGS{'Owner'} )) {
+ my @owners =@{$ARGS{'Owner'}};
+ delete $ARGS{'Owner'};
+ foreach my $owner(@owners){
+ if (defined($owner) && $owner =~ /\D/) {
+ $ARGS{'Owner'} = $owner unless ($Ticket->OwnerObj->Name eq $owner);
+ }
+ elsif (length $owner) {
+ $ARGS{'Owner'} = $owner unless ($Ticket->OwnerObj->id == $owner);
}
-
}
+}
+unless ($skip_update or $OnlySearchForPeople or $OnlySearchForGroup or $ARGS{'AddMoreAttach'} ) {
push @results, ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS);
push @results, ProcessObjectCustomFieldUpdates( Object => $Ticket, ARGSRef => \%ARGS);
push @results, ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS);
diff --cc share/html/Ticket/Update.html
index 706a62a,36f325a..3f1274e
--- a/share/html/Ticket/Update.html
+++ b/share/html/Ticket/Update.html
@@@ -275,24 -252,24 +251,20 @@@ $m->comp( '/Elements/GnuPG/SignEncryptW
if ( $ARGS{'SubmitTicket'} ) {
- my %checked = map {$_ => 1} grep {defined}
- (ref $ARGS{'TxnSendMailTo'} eq "ARRAY" ? @{$ARGS{'TxnSendMailTo'}}
- : defined $ARGS{'TxnSendMailTo'} ? ($ARGS{'TxnSendMailTo'}) : ());
-
- my @squelchlist = grep {not $checked{$_}} split /,/, ($ARGS{'TxnRecipients'}||'');
- $ARGS{'SquelchMailTo'} = \@squelchlist if @squelchlist;
+ my %squelched = ProcessTransactionSquelching( \%ARGS );
+ $ARGS{'SquelchMailTo'} = [keys %squelched] if keys %squelched;
- my $CFs = $TicketObj->TransactionCustomFields;
- my $ValidCFs = $m->comp(
+ my ($status, @msg) = $m->comp(
'/Elements/ValidateCustomFields',
- CustomFields => $CFs,
- NamePrefix => "Object-RT::Transaction--CustomField-",
+ CustomFields => $TicketObj->TransactionCustomFields,
+ Object => RT::Transaction->new( $session{'CurrentUser'} ),
ARGSRef => \%ARGS
);
- unless ( $ValidCFs ) {
+ unless ( $status ) {
+ push @results, @msg;
$checks_failure = 1;
- while (my $CF = $CFs->Next) {
- my $msg = $m->notes('InvalidField-' . $CF->Id) or next;
- push @results, loc($CF->Name) . ': ' . $msg;
- }
}
- my $status = $m->comp('/Elements/GnuPG/SignEncryptWidget:Check',
+ $status = $m->comp('/Elements/GnuPG/SignEncryptWidget:Check',
self => $gnupg_widget,
TicketObj => $TicketObj,
);
diff --cc share/html/m/ticket/create
index 4c0fa9e,9fd04e4..dee114e
--- a/share/html/m/ticket/create
+++ b/share/html/m/ticket/create
@@@ -146,31 -147,15 +146,7 @@@ $m->callback( QueueObj => $QueueObj, ti
$QueueObj->Disabled && Abort(loc("Cannot create tickets in a disabled queue."));
- # deal with deleting uploaded attachments
- foreach my $key (keys %ARGS) {
- if ($key =~ m/^DeleteAttach-(.+)$/) {
- delete $session{'Attachments'}{$1};
- }
- $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
- }
-
- # store the uploaded attachment in session
- if ( defined $ARGS{'Attach'} && length $ARGS{'Attach'} ) { # attachment?
- my $attachment = MakeMIMEEntity(
- AttachmentFieldName => 'Attach'
- );
-
- my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
- $session{'Attachments'} = {
- %{$session{'Attachments'} || {}},
- $file_path => $attachment,
- };
- }
-
- # delete temporary storage entry to make WebUI clean
- unless (keys %{$session{'Attachments'}} and $ARGS{'id'} eq 'new') {
- delete $session{'Attachments'};
- }
-my $CFs = $QueueObj->TicketCustomFields();
-
-my $ValidCFs = $m->comp(
- '/Elements/ValidateCustomFields',
- CustomFields => $CFs,
- ARGSRef => \%ARGS
-);
-
+ ProcessAttachments(ARGSRef => \%ARGS);
my $checks_failure = 0;
diff --cc t/99-policy.t
index 34c1558,5b6170b..717af8c
--- a/t/99-policy.t
+++ b/t/99-policy.t
@@@ -53,15 -50,13 +53,15 @@@ sub check
unlike( $content, qr/^#!/, "$file has no shebang" );
}
- $check{bps_tag} = -1 if $check{bps_tag} == 1
+ my $other_copyright = 0;
+ $other_copyright = 1 if $file =~ /\.(css|js)$/
and not $content =~ /Copyright\s+\(c\)\s+\d\d\d\d-\d\d\d\d Best Practical Solutions/i
- and $file =~ /(?:FCKEditor|scriptaculous|superfish|tablesorter|farbtastic)/i;
+ and $file =~ /(?:ckeditor|scriptaculous|superfish|tablesorter|farbtastic)/i;
- $check{bps_tag} = -1 if $check{bps_tag} == 1
+ $other_copyright = 1 if $file =~ /\.(css|js)$/
and not $content =~ /Copyright\s+\(c\)\s+\d\d\d\d-\d\d\d\d Best Practical Solutions/i
and ($content =~ /\b(copyright|GPL|Public Domain)\b/i
- or /\(c\)\s+\d\d\d\d(?:-\d\d\d\d)?/i);
+ or $content =~ /\(c\)\s+\d\d\d\d(?:-\d\d\d\d)?/i);
+ $check{bps_tag} = -1 if $check{bps_tag} and $other_copyright;
if ($check{bps_tag} == 1) {
like( $content, qr/[B]EGIN BPS TAGGED BLOCK {{{/, "$file has BPS license tag");
} elsif ($check{bps_tag} == -1) {
diff --cc t/customfields/date_search.t
index 6d7bfd0,2a8e6ce..724c1c1
--- a/t/customfields/date_search.t
+++ b/t/customfields/date_search.t
@@@ -2,10 -3,22 +3,24 @@@ use Test::MockTime qw(set_fixed_time re
use warnings;
use strict;
- use RT::Test nodata => 1, tests => 13;
+ use RT::Test nodata => 1, tests => 21;
- my $q = RT::Queue->new(RT->SystemUser);
- ok( $q->Create( Name => 'DateCFTest' . $$ ), 'create queue' );
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(
+ SeeQueue ShowTicket CreateTicket SeeCustomField ModifyCustomField
+ )] },
+ );
+
+ my $q = RT::Test->load_or_create_queue( Name => 'General' );
+ ok $q && $q->id, 'loaded or created a queue';
+
+ my $user_m = RT::Test->load_or_create_user( Name => 'moscow', Timezone => 'Europe/Moscow' );
+ ok $user_m && $user_m->id;
++$user_m = RT::CurrentUser->new( $user_m );
+
+ my $user_b = RT::Test->load_or_create_user( Name => 'boston', Timezone => 'America/New_York' );
+ ok $user_b && $user_b->id;
++$user_b = RT::CurrentUser->new( $user_b );
my $cf = RT::CustomField->new(RT->SystemUser);
ok(
diff --cc t/customfields/datetime_search.t
index 707610b,6b37cf1..ff3028f
--- a/t/customfields/datetime_search.t
+++ b/t/customfields/datetime_search.t
@@@ -2,11 -3,23 +3,25 @@@ use Test::MockTime qw(set_fixed_time re
use warnings;
use strict;
- use RT::Test nodata => 1, tests => 14;
+ use RT::Test nodata => 1, tests => 30;
RT->Config->Set( 'Timezone' => 'EST5EDT' ); # -04:00
- my $q = RT::Queue->new(RT->SystemUser);
- ok( $q->Create( Name => 'DateTimeCFTest' . $$ ), 'create queue' );
+ RT::Test->set_rights(
+ { Principal => 'Everyone', Right => [qw(
+ SeeQueue ShowTicket CreateTicket SeeCustomField ModifyCustomField
+ )] },
+ );
+
+ my $q = RT::Test->load_or_create_queue( Name => 'General' );
+ ok $q && $q->id, 'loaded or created a queue';
+
+ my $user_m = RT::Test->load_or_create_user( Name => 'moscow', Timezone => 'Europe/Moscow' );
+ ok $user_m && $user_m->id;
++$user_m = RT::CurrentUser->new( $user_m );
+
+ my $user_b = RT::Test->load_or_create_user( Name => 'boston', Timezone => 'America/New_York' );
+ ok $user_b && $user_b->id;
++$user_b = RT::CurrentUser->new( $user_b );
my $cf = RT::CustomField->new(RT->SystemUser);
ok(
-----------------------------------------------------------------------
More information about the Rt-commit
mailing list