diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 5831134655..0f8d52f77d 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -1,2206 +1,2227 @@ array( - 'core.pkg.css' => 'afe6e16d', - 'core.pkg.js' => 'c415c382', + 'core.pkg.css' => '4279f4bd', + 'core.pkg.js' => 'f6616bcf', 'darkconsole.pkg.js' => 'ca8671ce', 'differential.pkg.css' => '4b8686e3', - 'differential.pkg.js' => '11a5b750', + 'differential.pkg.js' => 'a2f45b5f', 'diffusion.pkg.css' => '3783278d', 'diffusion.pkg.js' => '5b4010f4', - 'javelin.pkg.js' => '9f6d38c7', + 'javelin.pkg.js' => 'c57fd32c', 'maniphest.pkg.css' => 'f1887d71', 'maniphest.pkg.js' => '2fe8af22', 'rsrc/css/aphront/aphront-bars.css' => '231ac33c', 'rsrc/css/aphront/context-bar.css' => '1c3b0529', 'rsrc/css/aphront/dark-console.css' => '6378ef3d', 'rsrc/css/aphront/dialog-view.css' => 'c01d24b4', 'rsrc/css/aphront/error-view.css' => '9f1d5518', 'rsrc/css/aphront/lightbox-attachment.css' => '7acac05d', 'rsrc/css/aphront/list-filter-view.css' => '2ae43867', 'rsrc/css/aphront/multi-column.css' => '12f65921', 'rsrc/css/aphront/notification.css' => 'ef2c9b34', 'rsrc/css/aphront/pager-view.css' => '2e3539af', 'rsrc/css/aphront/panel-view.css' => '5846dfa2', 'rsrc/css/aphront/phabricator-nav-view.css' => '80e60fc1', 'rsrc/css/aphront/request-failure-view.css' => 'da14df31', 'rsrc/css/aphront/table-view.css' => 'de599000', 'rsrc/css/aphront/tokenizer.css' => '36903077', 'rsrc/css/aphront/tooltip.css' => '9c90229d', 'rsrc/css/aphront/transaction.css' => 'ce491938', 'rsrc/css/aphront/two-column.css' => '16ab3ad2', 'rsrc/css/aphront/typeahead.css' => '271456a1', 'rsrc/css/application/auth/auth.css' => '1e655982', 'rsrc/css/application/base/main-menu-view.css' => '0a599177', 'rsrc/css/application/base/notification-menu.css' => '99ffef72', 'rsrc/css/application/base/phabricator-application-launch-view.css' => 'd290ba21', 'rsrc/css/application/base/standard-page-view.css' => '517cdfb1', 'rsrc/css/application/chatlog/chatlog.css' => '852140ff', 'rsrc/css/application/config/config-options.css' => '7fedf08b', 'rsrc/css/application/config/config-template.css' => '25d446d6', 'rsrc/css/application/config/setup-issue.css' => '69e640e7', 'rsrc/css/application/conpherence/menu.css' => '561348ac', 'rsrc/css/application/conpherence/message-pane.css' => 'e46b612c', 'rsrc/css/application/conpherence/notification.css' => '403cf598', 'rsrc/css/application/conpherence/update.css' => '1099a660', - 'rsrc/css/application/conpherence/widget-pane.css' => '87b12e0c', + 'rsrc/css/application/conpherence/widget-pane.css' => 'bf275a6c', 'rsrc/css/application/contentsource/content-source-view.css' => '4b8b05d4', 'rsrc/css/application/countdown/timer.css' => '86b7b0a0', 'rsrc/css/application/diff/inline-comment-summary.css' => '8cfd34e8', 'rsrc/css/application/differential/add-comment.css' => 'c478bcaa', 'rsrc/css/application/differential/changeset-view.css' => '1570a1ff', 'rsrc/css/application/differential/core.css' => '7ac3cabc', 'rsrc/css/application/differential/results-table.css' => '239924f9', 'rsrc/css/application/differential/revision-comment.css' => '48186045', 'rsrc/css/application/differential/revision-history.css' => '0e8eb855', 'rsrc/css/application/differential/revision-list.css' => 'f3c47d33', 'rsrc/css/application/differential/table-of-contents.css' => '6bf8e1d2', 'rsrc/css/application/diffusion/commit-view.css' => '92d1e8f9', 'rsrc/css/application/diffusion/diffusion-icons.css' => '384a0f7d', 'rsrc/css/application/diffusion/diffusion-source.css' => '66fdf661', 'rsrc/css/application/directory/phabricator-jump-nav.css' => 'f0c5e726', 'rsrc/css/application/feed/feed.css' => '0d17c209', 'rsrc/css/application/files/global-drag-and-drop.css' => '697324ad', 'rsrc/css/application/flag/flag.css' => '5337623f', 'rsrc/css/application/harbormaster/harbormaster.css' => 'cec833b7', 'rsrc/css/application/herald/herald-test.css' => '778b008e', 'rsrc/css/application/herald/herald.css' => 'c544dd1c', 'rsrc/css/application/maniphest/batch-editor.css' => '8f380ebc', 'rsrc/css/application/maniphest/report.css' => '6fc16517', 'rsrc/css/application/maniphest/task-edit.css' => '8e23031b', 'rsrc/css/application/maniphest/task-summary.css' => '6df1a768', 'rsrc/css/application/objectselector/object-selector.css' => '029a133d', 'rsrc/css/application/owners/owners-path-editor.css' => '2f00933b', 'rsrc/css/application/paste/paste.css' => 'aa1767d1', 'rsrc/css/application/people/people-profile.css' => 'ba7b2762', 'rsrc/css/application/phame/phame.css' => '19ecc703', 'rsrc/css/application/pholio/pholio-edit.css' => 'b9e59b6d', 'rsrc/css/application/pholio/pholio-inline-comments.css' => '52be33f0', 'rsrc/css/application/pholio/pholio.css' => '2fa97dbe', 'rsrc/css/application/phortune/phortune-credit-card-form.css' => 'b25b4beb', 'rsrc/css/application/phrequent/phrequent.css' => 'ffc185ad', 'rsrc/css/application/phriction/phriction-document-css.css' => '7d7f0071', 'rsrc/css/application/policy/policy-edit.css' => '05cca26a', 'rsrc/css/application/policy/policy-transaction-detail.css' => '82100a43', 'rsrc/css/application/policy/policy.css' => '957ea14c', 'rsrc/css/application/ponder/comments.css' => '6cdccea7', 'rsrc/css/application/ponder/feed.css' => 'e62615b6', 'rsrc/css/application/ponder/post.css' => 'ebab8a70', 'rsrc/css/application/ponder/vote.css' => '8ed6ed8b', 'rsrc/css/application/profile/profile-view.css' => '33e6f703', 'rsrc/css/application/projects/project-tag.css' => '095c9404', 'rsrc/css/application/releeph/releeph-core.css' => '9b3c5733', 'rsrc/css/application/releeph/releeph-preview-branch.css' => 'b7a6f4a5', 'rsrc/css/application/releeph/releeph-request-differential-create-dialog.css' => '8d8b92cd', 'rsrc/css/application/releeph/releeph-request-typeahead.css' => '667a48ae', 'rsrc/css/application/search/search-results.css' => 'f240504c', 'rsrc/css/application/settings/settings.css' => 'ea8f5915', 'rsrc/css/application/slowvote/slowvote.css' => '266df6a1', 'rsrc/css/application/subscriptions/subscribers-list.css' => '5bb30c78', 'rsrc/css/application/tokens/tokens.css' => '3d0f239e', 'rsrc/css/application/uiexample/example.css' => '528b19de', - 'rsrc/css/core/core.css' => '7dff07c3', - 'rsrc/css/core/remarkup.css' => '0ec9ea61', + 'rsrc/css/core/core.css' => 'ef1b7892', + 'rsrc/css/core/remarkup.css' => '80c3a48c', 'rsrc/css/core/syntax.css' => '3c18c1cb', - 'rsrc/css/core/z-index.css' => '7e4989ed', + 'rsrc/css/core/z-index.css' => 'efb673ac', 'rsrc/css/diviner/diviner-shared.css' => '38813222', 'rsrc/css/font/font-awesome.css' => '62bc244d', 'rsrc/css/font/font-glyphicons-halflings.css' => 'c4c1c6b6', 'rsrc/css/font/font-source-sans-pro.css' => '91d53463', 'rsrc/css/font/phui-font-icon-base.css' => 'cd92ff25', 'rsrc/css/layout/phabricator-action-header-view.css' => 'c14dfc57', - 'rsrc/css/layout/phabricator-action-list-view.css' => '81383e25', + 'rsrc/css/layout/phabricator-action-list-view.css' => '6f7ef696', 'rsrc/css/layout/phabricator-crumbs-view.css' => '0222cbe0', 'rsrc/css/layout/phabricator-filetree-view.css' => 'a8c86ace', 'rsrc/css/layout/phabricator-hovercard-view.css' => '46a13cf0', 'rsrc/css/layout/phabricator-side-menu-view.css' => '503699d0', 'rsrc/css/layout/phabricator-source-code-view.css' => '62a99814', 'rsrc/css/phui/calendar/phui-calendar-day.css' => 'de035c8a', 'rsrc/css/phui/calendar/phui-calendar-list.css' => 'c1d0ca59', 'rsrc/css/phui/calendar/phui-calendar-month.css' => 'a92e47d2', 'rsrc/css/phui/calendar/phui-calendar.css' => '5e1ad989', 'rsrc/css/phui/phui-box.css' => '7b3a2eed', - 'rsrc/css/phui/phui-button.css' => '653ac588', + 'rsrc/css/phui/phui-button.css' => '3dbdbf0d', 'rsrc/css/phui/phui-document.css' => '3b078dc0', 'rsrc/css/phui/phui-feed-story.css' => '3a59c2cf', 'rsrc/css/phui/phui-fontkit.css' => 'de84aa4a', 'rsrc/css/phui/phui-form-view.css' => '867463b4', 'rsrc/css/phui/phui-form.css' => 'b78ec020', 'rsrc/css/phui/phui-header-view.css' => '5b79f0ef', 'rsrc/css/phui/phui-icon.css' => '215fa314', 'rsrc/css/phui/phui-info-panel.css' => '27ea50a1', 'rsrc/css/phui/phui-list.css' => 'ef8035b6', 'rsrc/css/phui/phui-object-box.css' => 'ce92d8ec', 'rsrc/css/phui/phui-object-item-list-view.css' => '24444832', 'rsrc/css/phui/phui-pinboard-view.css' => '4b346c2a', 'rsrc/css/phui/phui-property-list-view.css' => 'af4b381f', 'rsrc/css/phui/phui-remarkup-preview.css' => '19ad512b', 'rsrc/css/phui/phui-spacing.css' => '042804d6', 'rsrc/css/phui/phui-status.css' => '2f562399', 'rsrc/css/phui/phui-tag-view.css' => '295d81c4', 'rsrc/css/phui/phui-text.css' => '23e9b4b7', - 'rsrc/css/phui/phui-timeline-view.css' => '4a39d766', + 'rsrc/css/phui/phui-timeline-view.css' => '15ff2a9f', 'rsrc/css/phui/phui-workboard-view.css' => '84f2c272', 'rsrc/css/phui/phui-workpanel-view.css' => '97b69459', 'rsrc/css/sprite-actions.css' => '969ad0e5', 'rsrc/css/sprite-apps-large.css' => '3e3ec4c3', 'rsrc/css/sprite-apps-xlarge.css' => 'db66c878', 'rsrc/css/sprite-apps.css' => '67d6556a', 'rsrc/css/sprite-buttonbar.css' => 'ba1c5738', 'rsrc/css/sprite-conpherence.css' => '3b4a0487', 'rsrc/css/sprite-docs.css' => '5f65d0da', 'rsrc/css/sprite-gradient.css' => 'a10def53', 'rsrc/css/sprite-icons.css' => 'f19a828c', 'rsrc/css/sprite-login.css' => '9fbaec81', 'rsrc/css/sprite-main-header.css' => '92720ee2', 'rsrc/css/sprite-menu.css' => '8da53882', 'rsrc/css/sprite-minicons.css' => 'df4f76fe', 'rsrc/css/sprite-payments.css' => 'cc085d44', 'rsrc/css/sprite-projects.css' => '7578fa56', - 'rsrc/css/sprite-status.css' => '8bce1c97', + 'rsrc/css/sprite-status.css' => '25d7f92f', 'rsrc/css/sprite-tokens.css' => '1706b943', 'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => 'b676fe4f', 'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => 'af66fc5c', 'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => 'c713570f', 'rsrc/externals/font/sourcesans/SourceSansPro.woff' => '3614608c', 'rsrc/externals/font/sourcesans/SourceSansProBold.woff' => 'cbf46566', 'rsrc/externals/javelin/core/Event.js' => '79473b62', 'rsrc/externals/javelin/core/Stratcom.js' => 'c293f7b9', 'rsrc/externals/javelin/core/__tests__/event-stop-and-kill.js' => '717554e4', 'rsrc/externals/javelin/core/__tests__/install.js' => 'c432ee85', 'rsrc/externals/javelin/core/__tests__/stratcom.js' => 'da194d4b', 'rsrc/externals/javelin/core/__tests__/util.js' => 'd3b157a9', 'rsrc/externals/javelin/core/init.js' => 'b88ab49e', 'rsrc/externals/javelin/core/init_node.js' => 'd7dde471', 'rsrc/externals/javelin/core/install.js' => '52a92793', 'rsrc/externals/javelin/core/util.js' => '65b0b249', 'rsrc/externals/javelin/docs/Base.js' => '897bb199', 'rsrc/externals/javelin/docs/onload.js' => '81fb4862', 'rsrc/externals/javelin/ext/fx/Color.js' => '7e41274a', 'rsrc/externals/javelin/ext/fx/FX.js' => '54b612ba', 'rsrc/externals/javelin/ext/reactor/core/DynVal.js' => 'f6555212', 'rsrc/externals/javelin/ext/reactor/core/Reactor.js' => '77b1cf6f', 'rsrc/externals/javelin/ext/reactor/core/ReactorNode.js' => 'b4c30592', 'rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js' => '76f4ebed', 'rsrc/externals/javelin/ext/reactor/dom/RDOM.js' => 'b6d401d6', 'rsrc/externals/javelin/ext/view/HTMLView.js' => 'e5b406f9', 'rsrc/externals/javelin/ext/view/View.js' => '0f764c35', 'rsrc/externals/javelin/ext/view/ViewInterpreter.js' => '0c33c1a0', 'rsrc/externals/javelin/ext/view/ViewPlaceholder.js' => '2fa810fc', 'rsrc/externals/javelin/ext/view/ViewRenderer.js' => '6c2b09a2', 'rsrc/externals/javelin/ext/view/ViewVisitor.js' => 'efe49472', 'rsrc/externals/javelin/ext/view/__tests__/HTMLView.js' => 'f92d7bcb', 'rsrc/externals/javelin/ext/view/__tests__/View.js' => 'bda69c40', 'rsrc/externals/javelin/ext/view/__tests__/ViewInterpreter.js' => '7a94d6a5', 'rsrc/externals/javelin/ext/view/__tests__/ViewRenderer.js' => '5426001c', 'rsrc/externals/javelin/lib/Cookie.js' => '6b3dcf44', - 'rsrc/externals/javelin/lib/DOM.js' => '32a4d380', + 'rsrc/externals/javelin/lib/DOM.js' => '07d99a3d', 'rsrc/externals/javelin/lib/History.js' => 'c60f4327', 'rsrc/externals/javelin/lib/JSON.js' => '08e56a4e', 'rsrc/externals/javelin/lib/Mask.js' => 'b9f26029', 'rsrc/externals/javelin/lib/Request.js' => '23f9bb8d', 'rsrc/externals/javelin/lib/Resource.js' => '356de121', 'rsrc/externals/javelin/lib/URI.js' => 'd9a9b862', 'rsrc/externals/javelin/lib/Vector.js' => '039fb90d', 'rsrc/externals/javelin/lib/Workflow.js' => 'ff8091f7', 'rsrc/externals/javelin/lib/__tests__/Cookie.js' => '5ed109e8', 'rsrc/externals/javelin/lib/__tests__/DOM.js' => 'c984504b', 'rsrc/externals/javelin/lib/__tests__/JSON.js' => '2295d074', 'rsrc/externals/javelin/lib/__tests__/URI.js' => '003ed329', 'rsrc/externals/javelin/lib/__tests__/behavior.js' => '1ea62783', 'rsrc/externals/javelin/lib/behavior.js' => '8a3ed18b', 'rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js' => 'e7c21fb3', 'rsrc/externals/javelin/lib/control/typeahead/Typeahead.js' => 'c54eeefb', 'rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js' => '5f850b5c', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js' => '84f34ab1', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js' => 'a79b75a4', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js' => 'f778a573', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js' => '62e18640', 'rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js' => 'cdde23f1', 'rsrc/externals/raphael/g.raphael.js' => '40dde778', 'rsrc/externals/raphael/g.raphael.line.js' => '40da039e', 'rsrc/externals/raphael/raphael.js' => '51ee6b43', 'rsrc/image/BFCFDA.png' => 'd5ec91f4', 'rsrc/image/actions/edit.png' => '2fc41442', 'rsrc/image/apple-touch-icon.png' => '8458dda7', 'rsrc/image/avatar.png' => '3eb28cd9', 'rsrc/image/checker_dark.png' => 'd8e65881', 'rsrc/image/checker_light.png' => 'a0155918', 'rsrc/image/credit_cards.png' => '72b8ede8', 'rsrc/image/darkload.gif' => '1ffd3ec6', 'rsrc/image/divot.png' => '94dded62', 'rsrc/image/grippy_texture.png' => 'aca81e2f', 'rsrc/image/icon/fatcow/arrow_branch.png' => '2537c01c', 'rsrc/image/icon/fatcow/arrow_merge.png' => '21b660e0', 'rsrc/image/icon/fatcow/bullet_black.png' => 'ff190031', 'rsrc/image/icon/fatcow/bullet_orange.png' => 'e273e5bb', 'rsrc/image/icon/fatcow/bullet_red.png' => 'c0b75434', 'rsrc/image/icon/fatcow/calendar_edit.png' => '24632275', 'rsrc/image/icon/fatcow/document_black.png' => '45fe1c60', 'rsrc/image/icon/fatcow/flag_blue.png' => 'a01abb1d', 'rsrc/image/icon/fatcow/flag_finish.png' => '67825cee', 'rsrc/image/icon/fatcow/flag_ghost.png' => '20ca8783', 'rsrc/image/icon/fatcow/flag_green.png' => '7e0eaa7a', 'rsrc/image/icon/fatcow/flag_orange.png' => '9e73df66', 'rsrc/image/icon/fatcow/flag_pink.png' => '7e92f3b2', 'rsrc/image/icon/fatcow/flag_purple.png' => 'cc517522', 'rsrc/image/icon/fatcow/flag_red.png' => '04ec726f', 'rsrc/image/icon/fatcow/flag_yellow.png' => '73946fd4', 'rsrc/image/icon/fatcow/folder.png' => '95a435af', 'rsrc/image/icon/fatcow/folder_go.png' => '001cbc94', 'rsrc/image/icon/fatcow/key_question.png' => '52a0c26a', 'rsrc/image/icon/fatcow/link.png' => '7afd4d5e', 'rsrc/image/icon/fatcow/page_white_edit.png' => '39a2eed8', 'rsrc/image/icon/fatcow/page_white_link.png' => 'a90023c7', 'rsrc/image/icon/fatcow/page_white_put.png' => '08c95a0c', 'rsrc/image/icon/fatcow/page_white_text.png' => '1e1f79c3', 'rsrc/image/icon/fatcow/source/conduit.png' => '4ea01d2f', 'rsrc/image/icon/fatcow/source/email.png' => '9bab3239', 'rsrc/image/icon/fatcow/source/fax.png' => '04195e68', 'rsrc/image/icon/fatcow/source/mobile.png' => 'f1321264', 'rsrc/image/icon/fatcow/source/tablet.png' => '49396799', 'rsrc/image/icon/fatcow/source/web.png' => '136ccb5d', 'rsrc/image/icon/fatcow/thumbnails/default160x120.png' => 'f2e8a2eb', 'rsrc/image/icon/fatcow/thumbnails/default60x45.png' => '0118abed', 'rsrc/image/icon/fatcow/thumbnails/image160x120.png' => '79bb556a', 'rsrc/image/icon/fatcow/thumbnails/image60x45.png' => 'c5e1685e', 'rsrc/image/icon/fatcow/thumbnails/pdf160x120.png' => 'ac9edbf5', 'rsrc/image/icon/fatcow/thumbnails/pdf60x45.png' => 'c0db4143', 'rsrc/image/icon/fatcow/thumbnails/zip160x120.png' => '75f9cd0f', 'rsrc/image/icon/fatcow/thumbnails/zip60x45.png' => 'af11bf3e', 'rsrc/image/icon/lightbox/close-2.png' => 'cc40e7c8', 'rsrc/image/icon/lightbox/close-hover-2.png' => 'fb5d6d9e', 'rsrc/image/icon/lightbox/left-arrow-2.png' => '8426133b', 'rsrc/image/icon/lightbox/left-arrow-hover-2.png' => '701e5ee3', 'rsrc/image/icon/lightbox/right-arrow-2.png' => '6d5519a0', 'rsrc/image/icon/lightbox/right-arrow-hover-2.png' => '3a04aa21', 'rsrc/image/icon/subscribe.png' => 'd03ed5a5', 'rsrc/image/icon/tango/attachment.png' => 'ecc8022e', 'rsrc/image/icon/tango/edit.png' => '929a1363', 'rsrc/image/icon/tango/go-down.png' => '96d95e43', 'rsrc/image/icon/tango/log.png' => 'b08cc63a', 'rsrc/image/icon/tango/upload.png' => '7bbb7984', 'rsrc/image/icon/unsubscribe.png' => '25725013', 'rsrc/image/lightblue-header.png' => '5c168b6d', 'rsrc/image/loading.gif' => '75d384cc', 'rsrc/image/loading/boating_24.gif' => '5c90f086', 'rsrc/image/loading/compass_24.gif' => 'b36b4f46', 'rsrc/image/loading/loading_24.gif' => '26bc9adc', 'rsrc/image/loading/loading_48.gif' => '6a4994c7', 'rsrc/image/loading/loading_d48.gif' => 'cdcbe900', 'rsrc/image/loading/loading_w24.gif' => '7662fa2b', 'rsrc/image/main_texture.png' => '29a2c5ad', 'rsrc/image/menu_texture.png' => '5a17580d', 'rsrc/image/people/harding.png' => '45aa614e', 'rsrc/image/people/jefferson.png' => 'afca0e53', 'rsrc/image/people/lincoln.png' => '9369126d', 'rsrc/image/people/mckinley.png' => 'fb8f16ce', 'rsrc/image/people/taft.png' => 'd7bc402c', 'rsrc/image/people/washington.png' => '40dd301c', 'rsrc/image/phrequent_active.png' => 'a466a8ed', 'rsrc/image/phrequent_inactive.png' => 'bfc15a69', 'rsrc/image/search-white.png' => '64cc0d45', 'rsrc/image/search.png' => '82625a7e', 'rsrc/image/sprite-actions-X2.png' => '7dfd5652', 'rsrc/image/sprite-actions.png' => '2ddd18c3', 'rsrc/image/sprite-apps-X2.png' => '428183b6', 'rsrc/image/sprite-apps-large-X2.png' => 'a93fe738', 'rsrc/image/sprite-apps-large.png' => '6e815f3f', 'rsrc/image/sprite-apps-xlarge.png' => 'a751a580', 'rsrc/image/sprite-apps.png' => '7ccd9f0f', 'rsrc/image/sprite-buttonbar-X2.png' => '2c09a184', 'rsrc/image/sprite-buttonbar.png' => 'e98e96af', 'rsrc/image/sprite-conpherence-X2.png' => 'cd2d08d7', 'rsrc/image/sprite-conpherence.png' => 'a5ab2eb7', 'rsrc/image/sprite-docs-X2.png' => '6dc1adad', 'rsrc/image/sprite-docs.png' => '4636297f', 'rsrc/image/sprite-gradient.png' => '4ece0b62', 'rsrc/image/sprite-icons-X2.png' => '0d5867c0', 'rsrc/image/sprite-icons.png' => '3f754bda', 'rsrc/image/sprite-login-X2.png' => '81c1344f', 'rsrc/image/sprite-login.png' => '7c729508', 'rsrc/image/sprite-main-header.png' => '83521873', 'rsrc/image/sprite-menu-X2.png' => '949974c6', 'rsrc/image/sprite-menu.png' => '307d5da0', 'rsrc/image/sprite-minicons-X2.png' => '55377e4e', 'rsrc/image/sprite-minicons.png' => '272644ea', 'rsrc/image/sprite-payments.png' => 'd8576309', 'rsrc/image/sprite-projects-X2.png' => '218fdc8b', 'rsrc/image/sprite-projects.png' => '631ff9a7', - 'rsrc/image/sprite-status-X2.png' => '82445ee0', - 'rsrc/image/sprite-status.png' => '926a896a', + 'rsrc/image/sprite-status-X2.png' => '6cb4b401', + 'rsrc/image/sprite-status.png' => '97eb1562', 'rsrc/image/sprite-tokens-X2.png' => 'b4776580', 'rsrc/image/sprite-tokens.png' => '25b75533', 'rsrc/image/texture/card-gradient.png' => '815f26e8', 'rsrc/image/texture/dark-menu-hover.png' => '5fa7ece8', 'rsrc/image/texture/dark-menu.png' => '7e22296e', 'rsrc/image/texture/grip.png' => '719404f3', 'rsrc/image/texture/panel-header-gradient.png' => 'e3b8dcfe', 'rsrc/image/texture/phlnx-bg.png' => '8d819209', 'rsrc/image/texture/pholio-background.gif' => 'ba29239c', 'rsrc/image/texture/table_header.png' => '5c433037', 'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', 'rsrc/js/application/aphlict/Aphlict.js' => '493665ee', 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '2a2dba85', 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '845731b8', 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 'rsrc/js/application/config/behavior-reorder-fields.js' => '938aed89', 'rsrc/js/application/conpherence/behavior-menu.js' => '7ee23816', 'rsrc/js/application/conpherence/behavior-pontificate.js' => '53f6f2dd', - 'rsrc/js/application/conpherence/behavior-widget-pane.js' => 'd8ef8659', + 'rsrc/js/application/conpherence/behavior-widget-pane.js' => '40b1ff90', 'rsrc/js/application/countdown/timer.js' => '889c96f3', 'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => '4398eabb', 'rsrc/js/application/differential/DifferentialInlineCommentEditor.js' => 'f2441746', 'rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js' => '533a187b', 'rsrc/js/application/differential/behavior-comment-jump.js' => '71755c79', 'rsrc/js/application/differential/behavior-comment-preview.js' => '127f2018', 'rsrc/js/application/differential/behavior-diff-radios.js' => 'e1ff79b1', - 'rsrc/js/application/differential/behavior-dropdown-menus.js' => '5f004630', + 'rsrc/js/application/differential/behavior-dropdown-menus.js' => '7f93ef26', 'rsrc/js/application/differential/behavior-edit-inline-comments.js' => '00861799', 'rsrc/js/application/differential/behavior-keyboard-nav.js' => '173ce7e7', 'rsrc/js/application/differential/behavior-populate.js' => 'ce0c217a', 'rsrc/js/application/differential/behavior-show-all-comments.js' => '7c273581', 'rsrc/js/application/differential/behavior-show-field-details.js' => '441f2137', 'rsrc/js/application/differential/behavior-show-more.js' => 'dd7e8ef5', 'rsrc/js/application/differential/behavior-toggle-files.js' => 'ca3f91eb', 'rsrc/js/application/differential/behavior-user-select.js' => 'a8d8459d', 'rsrc/js/application/diffusion/behavior-audit-preview.js' => 'be81801d', 'rsrc/js/application/diffusion/behavior-commit-branches.js' => 'bdaf4d04', 'rsrc/js/application/diffusion/behavior-commit-graph.js' => 'f7f1289f', 'rsrc/js/application/diffusion/behavior-jump-to.js' => '9db3d160', 'rsrc/js/application/diffusion/behavior-load-blame.js' => '42126667', 'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => '75903ee1', 'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => 'e5822781', 'rsrc/js/application/files/behavior-icon-composer.js' => '8ef9ab58', 'rsrc/js/application/files/behavior-launch-icon-composer.js' => '48086888', 'rsrc/js/application/harbormaster/behavior-reorder-steps.js' => '957a7fde', 'rsrc/js/application/herald/HeraldRuleEditor.js' => '22d2966a', 'rsrc/js/application/herald/PathTypeahead.js' => 'f7fc67ec', 'rsrc/js/application/herald/herald-rule-editor.js' => '7ebaeed3', 'rsrc/js/application/maniphest/behavior-batch-editor.js' => 'fe80fb6d', 'rsrc/js/application/maniphest/behavior-batch-selector.js' => 'ead554ec', 'rsrc/js/application/maniphest/behavior-line-chart.js' => '64ef2fd2', 'rsrc/js/application/maniphest/behavior-list-edit.js' => 'cf76cfd5', 'rsrc/js/application/maniphest/behavior-subpriorityeditor.js' => '84845b5b', 'rsrc/js/application/maniphest/behavior-transaction-controls.js' => 'dddd43ac', 'rsrc/js/application/maniphest/behavior-transaction-expand.js' => '2f2e18aa', 'rsrc/js/application/maniphest/behavior-transaction-preview.js' => 'f8248bc5', 'rsrc/js/application/owners/OwnersPathEditor.js' => '46efd18e', 'rsrc/js/application/owners/owners-path-editor.js' => '7a68dda3', 'rsrc/js/application/passphrase/phame-credential-control.js' => '1e1c8a59', 'rsrc/js/application/phame/phame-post-preview.js' => '61d927ec', 'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '1e1e8bb0', 'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => '28497740', 'rsrc/js/application/phortune/behavior-balanced-payment-form.js' => '3b3e1664', 'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '1693a296', 'rsrc/js/application/phortune/behavior-test-payment-form.js' => 'b3e5ee60', 'rsrc/js/application/phortune/phortune-credit-card-form.js' => '2290aeef', - 'rsrc/js/application/policy/behavior-policy-control.js' => 'c01153ea', + 'rsrc/js/application/policy/behavior-policy-control.js' => 'bc99b0f2', 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '263aeb8c', 'rsrc/js/application/ponder/behavior-votebox.js' => '327dbe61', 'rsrc/js/application/projects/behavior-project-boards.js' => 'd8e135db', 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 'rsrc/js/application/releeph/releeph-preview-branch.js' => '9eb2cedb', 'rsrc/js/application/releeph/releeph-request-state-change.js' => 'd259e7c9', 'rsrc/js/application/releeph/releeph-request-typeahead.js' => 'cd9e7094', 'rsrc/js/application/repository/repository-crossreference.js' => '8ab282be', 'rsrc/js/application/search/behavior-reorder-queries.js' => '37871df4', 'rsrc/js/application/slowvote/behavior-slowvote-embed.js' => 'a51fdb2e', 'rsrc/js/application/transactions/behavior-transaction-comment-form.js' => '9084a36f', - 'rsrc/js/application/transactions/behavior-transaction-list.js' => '925c9bab', + 'rsrc/js/application/transactions/behavior-transaction-list.js' => 'cf656c84', 'rsrc/js/application/uiexample/JavelinViewExample.js' => 'd4a14807', 'rsrc/js/application/uiexample/ReactorButtonExample.js' => '44524435', 'rsrc/js/application/uiexample/ReactorCheckboxExample.js' => '7ba325ee', 'rsrc/js/application/uiexample/ReactorFocusExample.js' => '82f568cd', 'rsrc/js/application/uiexample/ReactorInputExample.js' => 'd6ca6b1c', 'rsrc/js/application/uiexample/ReactorMouseoverExample.js' => '4e37e4de', 'rsrc/js/application/uiexample/ReactorRadioExample.js' => '858f9728', 'rsrc/js/application/uiexample/ReactorSelectExample.js' => '189e4fe3', 'rsrc/js/application/uiexample/ReactorSendClassExample.js' => 'bf97561d', 'rsrc/js/application/uiexample/ReactorSendPropertiesExample.js' => '551add57', 'rsrc/js/application/uiexample/busy-example.js' => 'fbbce3bf', 'rsrc/js/application/uiexample/gesture-example.js' => 'f42bb8c6', 'rsrc/js/application/uiexample/notification-example.js' => 'c51a6616', 'rsrc/js/core/Busy.js' => '6453c869', 'rsrc/js/core/DragAndDropFileUpload.js' => 'ae6abfba', 'rsrc/js/core/DraggableList.js' => '1681c4d4', - 'rsrc/js/core/DropdownMenu.js' => 'fb342e18', - 'rsrc/js/core/DropdownMenuItem.js' => '0f386ef4', 'rsrc/js/core/FileUpload.js' => 'a4ae61bf', 'rsrc/js/core/Hovercard.js' => '4f344388', 'rsrc/js/core/KeyboardShortcut.js' => '1ae869f2', 'rsrc/js/core/KeyboardShortcutManager.js' => 'ad7a69ca', 'rsrc/js/core/MultirowRowManager.js' => '50395a1b', 'rsrc/js/core/Notification.js' => '0c6946e7', 'rsrc/js/core/Prefab.js' => '0326e5d0', 'rsrc/js/core/ShapedRequest.js' => 'dfa181a4', 'rsrc/js/core/TextAreaUtils.js' => 'b3ec3cfc', 'rsrc/js/core/ToolTip.js' => '3915d490', 'rsrc/js/core/behavior-active-nav.js' => 'c81bc98f', 'rsrc/js/core/behavior-audio-source.js' => '59b251eb', 'rsrc/js/core/behavior-autofocus.js' => '7319e029', 'rsrc/js/core/behavior-crop.js' => 'b98fc918', 'rsrc/js/core/behavior-dark-console.js' => 'e9fdb5e5', 'rsrc/js/core/behavior-device.js' => '03d6ed07', 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '4a11ea9c', 'rsrc/js/core/behavior-error-log.js' => 'a5d7cf86', 'rsrc/js/core/behavior-fancy-datepicker.js' => '5d584426', 'rsrc/js/core/behavior-file-tree.js' => 'c8728c70', 'rsrc/js/core/behavior-form.js' => 'a9aaba0c', 'rsrc/js/core/behavior-gesture.js' => 'fe2e0ba4', 'rsrc/js/core/behavior-global-drag-and-drop.js' => '8fd76bab', 'rsrc/js/core/behavior-high-security-warning.js' => '8fc1c918', 'rsrc/js/core/behavior-history-install.js' => '7ee2b591', 'rsrc/js/core/behavior-hovercard.js' => '9c808199', 'rsrc/js/core/behavior-keyboard-pager.js' => 'b657bdf8', 'rsrc/js/core/behavior-keyboard-shortcuts.js' => 'd75709e6', 'rsrc/js/core/behavior-konami.js' => '5bc2cb21', 'rsrc/js/core/behavior-lightbox-attachments.js' => '3aa45ad9', 'rsrc/js/core/behavior-line-linker.js' => 'bc778103', 'rsrc/js/core/behavior-more.js' => '9b9197be', 'rsrc/js/core/behavior-object-selector.js' => 'b4eef37b', 'rsrc/js/core/behavior-oncopy.js' => 'c3e218fe', 'rsrc/js/core/behavior-phabricator-nav.js' => 'b5842a5e', 'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => 'c021950a', 'rsrc/js/core/behavior-refresh-csrf.js' => 'c4b31646', 'rsrc/js/core/behavior-remarkup-preview.js' => 'f7379f45', 'rsrc/js/core/behavior-reveal-content.js' => '8f24abfc', 'rsrc/js/core/behavior-search-typeahead.js' => 'd8469741', 'rsrc/js/core/behavior-select-on-click.js' => '0e34ca02', 'rsrc/js/core/behavior-toggle-class.js' => 'a82a7769', 'rsrc/js/core/behavior-tokenizer.js' => 'b3a4b884', 'rsrc/js/core/behavior-tooltip.js' => '48db4145', 'rsrc/js/core/behavior-watch-anchor.js' => '06e05112', 'rsrc/js/core/behavior-workflow.js' => 'fee00761', 'rsrc/js/core/phtize.js' => 'd254d646', 'rsrc/js/phui/behavior-phui-object-box-tabs.js' => 'a3e2244e', + 'rsrc/js/phui/behavior-phui-timeline-dropdown-menu.js' => '4d94d9c3', + 'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8', + 'rsrc/js/phuix/PHUIXActionView.js' => '19a0b148', + 'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bd4c8dca', 'rsrc/swf/aphlict.swf' => 'abac967d', ), 'symbols' => array( 'aphront-bars' => '231ac33c', 'aphront-contextbar-view-css' => '1c3b0529', 'aphront-dark-console-css' => '6378ef3d', 'aphront-dialog-view-css' => 'c01d24b4', 'aphront-error-view-css' => '9f1d5518', 'aphront-list-filter-view-css' => '2ae43867', 'aphront-multi-column-view-css' => '12f65921', 'aphront-pager-view-css' => '2e3539af', 'aphront-panel-view-css' => '5846dfa2', 'aphront-request-failure-view-css' => 'da14df31', 'aphront-table-view-css' => 'de599000', 'aphront-tokenizer-control-css' => '36903077', 'aphront-tooltip-css' => '9c90229d', 'aphront-two-column-view-css' => '16ab3ad2', 'aphront-typeahead-control-css' => '271456a1', 'auth-css' => '1e655982', 'config-options-css' => '7fedf08b', 'conpherence-menu-css' => '561348ac', 'conpherence-message-pane-css' => 'e46b612c', 'conpherence-notification-css' => '403cf598', 'conpherence-update-css' => '1099a660', - 'conpherence-widget-pane-css' => '87b12e0c', + 'conpherence-widget-pane-css' => 'bf275a6c', 'differential-changeset-view-css' => '1570a1ff', 'differential-core-view-css' => '7ac3cabc', 'differential-inline-comment-editor' => 'f2441746', 'differential-results-table-css' => '239924f9', 'differential-revision-add-comment-css' => 'c478bcaa', 'differential-revision-comment-css' => '48186045', 'differential-revision-history-css' => '0e8eb855', 'differential-revision-list-css' => 'f3c47d33', 'differential-table-of-contents-css' => '6bf8e1d2', 'diffusion-commit-view-css' => '92d1e8f9', 'diffusion-icons-css' => '384a0f7d', 'diffusion-source-css' => '66fdf661', 'diviner-shared-css' => '38813222', 'font-fontawesome' => '62bc244d', 'font-glyphicons-halflings' => 'c4c1c6b6', 'font-source-sans-pro' => '91d53463', 'global-drag-and-drop-css' => '697324ad', 'harbormaster-css' => 'cec833b7', 'herald-css' => 'c544dd1c', 'herald-rule-editor' => '22d2966a', 'herald-test-css' => '778b008e', 'inline-comment-summary-css' => '8cfd34e8', 'javelin-aphlict' => '493665ee', 'javelin-behavior' => '8a3ed18b', 'javelin-behavior-aphlict-dropdown' => '2a2dba85', 'javelin-behavior-aphlict-listen' => '845731b8', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', 'javelin-behavior-aphront-crop' => 'b98fc918', 'javelin-behavior-aphront-drag-and-drop-textarea' => '4a11ea9c', 'javelin-behavior-aphront-form-disable-on-submit' => 'a9aaba0c', 'javelin-behavior-aphront-more' => '9b9197be', 'javelin-behavior-audio-source' => '59b251eb', 'javelin-behavior-audit-preview' => 'be81801d', 'javelin-behavior-balanced-payment-form' => '3b3e1664', 'javelin-behavior-config-reorder-fields' => '938aed89', 'javelin-behavior-conpherence-menu' => '7ee23816', 'javelin-behavior-conpherence-pontificate' => '53f6f2dd', - 'javelin-behavior-conpherence-widget-pane' => 'd8ef8659', + 'javelin-behavior-conpherence-widget-pane' => '40b1ff90', 'javelin-behavior-countdown-timer' => '889c96f3', 'javelin-behavior-dark-console' => 'e9fdb5e5', 'javelin-behavior-dashboard-async-panel' => '4398eabb', 'javelin-behavior-device' => '03d6ed07', 'javelin-behavior-differential-add-reviewers-and-ccs' => '533a187b', 'javelin-behavior-differential-comment-jump' => '71755c79', 'javelin-behavior-differential-diff-radios' => 'e1ff79b1', - 'javelin-behavior-differential-dropdown-menus' => '5f004630', + 'javelin-behavior-differential-dropdown-menus' => '7f93ef26', 'javelin-behavior-differential-edit-inline-comments' => '00861799', 'javelin-behavior-differential-feedback-preview' => '127f2018', 'javelin-behavior-differential-keyboard-navigation' => '173ce7e7', 'javelin-behavior-differential-populate' => 'ce0c217a', 'javelin-behavior-differential-show-field-details' => '441f2137', 'javelin-behavior-differential-show-more' => 'dd7e8ef5', 'javelin-behavior-differential-toggle-files' => 'ca3f91eb', 'javelin-behavior-differential-user-select' => 'a8d8459d', 'javelin-behavior-diffusion-commit-branches' => 'bdaf4d04', 'javelin-behavior-diffusion-commit-graph' => 'f7f1289f', 'javelin-behavior-diffusion-jump-to' => '9db3d160', 'javelin-behavior-diffusion-pull-lastmodified' => '75903ee1', 'javelin-behavior-doorkeeper-tag' => 'e5822781', 'javelin-behavior-error-log' => 'a5d7cf86', 'javelin-behavior-fancy-datepicker' => '5d584426', 'javelin-behavior-global-drag-and-drop' => '8fd76bab', 'javelin-behavior-harbormaster-reorder-steps' => '957a7fde', 'javelin-behavior-herald-rule-editor' => '7ebaeed3', 'javelin-behavior-high-security-warning' => '8fc1c918', 'javelin-behavior-history-install' => '7ee2b591', 'javelin-behavior-icon-composer' => '8ef9ab58', 'javelin-behavior-konami' => '5bc2cb21', 'javelin-behavior-launch-icon-composer' => '48086888', 'javelin-behavior-lightbox-attachments' => '3aa45ad9', 'javelin-behavior-line-chart' => '64ef2fd2', 'javelin-behavior-load-blame' => '42126667', 'javelin-behavior-maniphest-batch-editor' => 'fe80fb6d', 'javelin-behavior-maniphest-batch-selector' => 'ead554ec', 'javelin-behavior-maniphest-list-editor' => 'cf76cfd5', 'javelin-behavior-maniphest-subpriority-editor' => '84845b5b', 'javelin-behavior-maniphest-transaction-controls' => 'dddd43ac', 'javelin-behavior-maniphest-transaction-expand' => '2f2e18aa', 'javelin-behavior-maniphest-transaction-preview' => 'f8248bc5', 'javelin-behavior-owners-path-editor' => '7a68dda3', 'javelin-behavior-passphrase-credential-control' => '1e1c8a59', 'javelin-behavior-persona-login' => '9414ff18', 'javelin-behavior-phabricator-active-nav' => 'c81bc98f', 'javelin-behavior-phabricator-autofocus' => '7319e029', 'javelin-behavior-phabricator-busy-example' => 'fbbce3bf', 'javelin-behavior-phabricator-file-tree' => 'c8728c70', 'javelin-behavior-phabricator-gesture' => 'fe2e0ba4', 'javelin-behavior-phabricator-gesture-example' => 'f42bb8c6', 'javelin-behavior-phabricator-hovercards' => '9c808199', 'javelin-behavior-phabricator-keyboard-pager' => 'b657bdf8', 'javelin-behavior-phabricator-keyboard-shortcuts' => 'd75709e6', 'javelin-behavior-phabricator-line-linker' => 'bc778103', 'javelin-behavior-phabricator-nav' => 'b5842a5e', 'javelin-behavior-phabricator-notification-example' => 'c51a6616', 'javelin-behavior-phabricator-object-selector' => 'b4eef37b', 'javelin-behavior-phabricator-oncopy' => 'c3e218fe', 'javelin-behavior-phabricator-remarkup-assist' => 'c021950a', 'javelin-behavior-phabricator-reveal-content' => '8f24abfc', 'javelin-behavior-phabricator-search-typeahead' => 'd8469741', 'javelin-behavior-phabricator-show-all-transactions' => '7c273581', 'javelin-behavior-phabricator-tooltips' => '48db4145', 'javelin-behavior-phabricator-transaction-comment-form' => '9084a36f', - 'javelin-behavior-phabricator-transaction-list' => '925c9bab', + 'javelin-behavior-phabricator-transaction-list' => 'cf656c84', 'javelin-behavior-phabricator-watch-anchor' => '06e05112', 'javelin-behavior-phame-post-preview' => '61d927ec', 'javelin-behavior-pholio-mock-edit' => '1e1e8bb0', 'javelin-behavior-pholio-mock-view' => '28497740', 'javelin-behavior-phui-object-box-tabs' => 'a3e2244e', - 'javelin-behavior-policy-control' => 'c01153ea', + 'javelin-behavior-phui-timeline-dropdown-menu' => '4d94d9c3', + 'javelin-behavior-policy-control' => 'bc99b0f2', 'javelin-behavior-policy-rule-editor' => '263aeb8c', 'javelin-behavior-ponder-votebox' => '327dbe61', 'javelin-behavior-project-boards' => 'd8e135db', 'javelin-behavior-project-create' => '065227cc', 'javelin-behavior-refresh-csrf' => 'c4b31646', 'javelin-behavior-releeph-preview-branch' => '9eb2cedb', 'javelin-behavior-releeph-request-state-change' => 'd259e7c9', 'javelin-behavior-releeph-request-typeahead' => 'cd9e7094', 'javelin-behavior-remarkup-preview' => 'f7379f45', 'javelin-behavior-repository-crossreference' => '8ab282be', 'javelin-behavior-search-reorder-queries' => '37871df4', 'javelin-behavior-select-on-click' => '0e34ca02', 'javelin-behavior-slowvote-embed' => 'a51fdb2e', 'javelin-behavior-stripe-payment-form' => '1693a296', 'javelin-behavior-test-payment-form' => 'b3e5ee60', 'javelin-behavior-toggle-class' => 'a82a7769', 'javelin-behavior-view-placeholder' => '2fa810fc', 'javelin-behavior-workflow' => 'fee00761', 'javelin-color' => '7e41274a', 'javelin-cookie' => '6b3dcf44', - 'javelin-dom' => '32a4d380', + 'javelin-dom' => '07d99a3d', 'javelin-dynval' => 'f6555212', 'javelin-event' => '79473b62', 'javelin-fx' => '54b612ba', 'javelin-history' => 'c60f4327', 'javelin-install' => '52a92793', 'javelin-json' => '08e56a4e', 'javelin-magical-init' => 'b88ab49e', 'javelin-mask' => 'b9f26029', 'javelin-reactor' => '77b1cf6f', 'javelin-reactor-dom' => 'b6d401d6', 'javelin-reactor-node-calmer' => '76f4ebed', 'javelin-reactornode' => 'b4c30592', 'javelin-request' => '23f9bb8d', 'javelin-resource' => '356de121', 'javelin-stratcom' => 'c293f7b9', 'javelin-tokenizer' => 'e7c21fb3', 'javelin-typeahead' => 'c54eeefb', 'javelin-typeahead-composite-source' => '84f34ab1', 'javelin-typeahead-normalizer' => '5f850b5c', 'javelin-typeahead-ondemand-source' => 'a79b75a4', 'javelin-typeahead-preloaded-source' => 'f778a573', 'javelin-typeahead-source' => '62e18640', 'javelin-typeahead-static-source' => 'cdde23f1', 'javelin-uri' => 'd9a9b862', 'javelin-util' => '65b0b249', 'javelin-vector' => '039fb90d', 'javelin-view' => '0f764c35', 'javelin-view-html' => 'e5b406f9', 'javelin-view-interpreter' => '0c33c1a0', 'javelin-view-renderer' => '6c2b09a2', 'javelin-view-visitor' => 'efe49472', 'javelin-workflow' => 'ff8091f7', 'lightbox-attachment-css' => '7acac05d', 'maniphest-batch-editor' => '8f380ebc', 'maniphest-report-css' => '6fc16517', 'maniphest-task-edit-css' => '8e23031b', 'maniphest-task-summary-css' => '6df1a768', 'multirow-row-manager' => '50395a1b', 'owners-path-editor' => '46efd18e', 'owners-path-editor-css' => '2f00933b', 'paste-css' => 'aa1767d1', 'path-typeahead' => 'f7fc67ec', 'people-profile-css' => 'ba7b2762', 'phabricator-action-header-view-css' => 'c14dfc57', - 'phabricator-action-list-view-css' => '81383e25', + 'phabricator-action-list-view-css' => '6f7ef696', 'phabricator-application-launch-view-css' => 'd290ba21', 'phabricator-busy' => '6453c869', 'phabricator-chatlog-css' => '852140ff', 'phabricator-content-source-view-css' => '4b8b05d4', - 'phabricator-core-css' => '7dff07c3', + 'phabricator-core-css' => 'ef1b7892', 'phabricator-countdown-css' => '86b7b0a0', 'phabricator-crumbs-view-css' => '0222cbe0', 'phabricator-drag-and-drop-file-upload' => 'ae6abfba', 'phabricator-draggable-list' => '1681c4d4', - 'phabricator-dropdown-menu' => 'fb342e18', 'phabricator-fatal-config-template-css' => '25d446d6', 'phabricator-feed-css' => '0d17c209', 'phabricator-file-upload' => 'a4ae61bf', 'phabricator-filetree-view-css' => 'a8c86ace', 'phabricator-flag-css' => '5337623f', 'phabricator-hovercard' => '4f344388', 'phabricator-hovercard-view-css' => '46a13cf0', 'phabricator-jump-nav' => 'f0c5e726', 'phabricator-keyboard-shortcut' => '1ae869f2', 'phabricator-keyboard-shortcut-manager' => 'ad7a69ca', 'phabricator-main-menu-view' => '0a599177', - 'phabricator-menu-item' => '0f386ef4', 'phabricator-nav-view-css' => '80e60fc1', 'phabricator-notification' => '0c6946e7', 'phabricator-notification-css' => 'ef2c9b34', 'phabricator-notification-menu-css' => '99ffef72', 'phabricator-object-selector-css' => '029a133d', 'phabricator-phtize' => 'd254d646', 'phabricator-prefab' => '0326e5d0', 'phabricator-profile-css' => '33e6f703', 'phabricator-project-tag-css' => '095c9404', - 'phabricator-remarkup-css' => '0ec9ea61', + 'phabricator-remarkup-css' => '80c3a48c', 'phabricator-search-results-css' => 'f240504c', 'phabricator-settings-css' => 'ea8f5915', 'phabricator-shaped-request' => 'dfa181a4', 'phabricator-side-menu-view-css' => '503699d0', 'phabricator-slowvote-css' => '266df6a1', 'phabricator-source-code-view-css' => '62a99814', 'phabricator-standard-page-view' => '517cdfb1', 'phabricator-textareautils' => 'b3ec3cfc', 'phabricator-tooltip' => '3915d490', 'phabricator-transaction-view-css' => 'ce491938', 'phabricator-ui-example-css' => '528b19de', 'phabricator-uiexample-javelin-view' => 'd4a14807', 'phabricator-uiexample-reactor-button' => '44524435', 'phabricator-uiexample-reactor-checkbox' => '7ba325ee', 'phabricator-uiexample-reactor-focus' => '82f568cd', 'phabricator-uiexample-reactor-input' => 'd6ca6b1c', 'phabricator-uiexample-reactor-mouseover' => '4e37e4de', 'phabricator-uiexample-reactor-radio' => '858f9728', 'phabricator-uiexample-reactor-select' => '189e4fe3', 'phabricator-uiexample-reactor-sendclass' => 'bf97561d', 'phabricator-uiexample-reactor-sendproperties' => '551add57', - 'phabricator-zindex-css' => '7e4989ed', + 'phabricator-zindex-css' => 'efb673ac', 'phame-css' => '19ecc703', 'pholio-css' => '2fa97dbe', 'pholio-edit-css' => 'b9e59b6d', 'pholio-inline-comments-css' => '52be33f0', 'phortune-credit-card-form' => '2290aeef', 'phortune-credit-card-form-css' => 'b25b4beb', 'phrequent-css' => 'ffc185ad', 'phriction-document-css' => '7d7f0071', 'phui-box-css' => '7b3a2eed', - 'phui-button-css' => '653ac588', + 'phui-button-css' => '3dbdbf0d', 'phui-calendar-css' => '5e1ad989', 'phui-calendar-day-css' => 'de035c8a', 'phui-calendar-list-css' => 'c1d0ca59', 'phui-calendar-month-css' => 'a92e47d2', 'phui-document-view-css' => '3b078dc0', 'phui-feed-story-css' => '3a59c2cf', 'phui-font-icon-base-css' => 'cd92ff25', 'phui-fontkit-css' => 'de84aa4a', 'phui-form-css' => 'b78ec020', 'phui-form-view-css' => '867463b4', 'phui-header-view-css' => '5b79f0ef', 'phui-icon-view-css' => '215fa314', 'phui-info-panel-css' => '27ea50a1', 'phui-list-view-css' => 'ef8035b6', 'phui-object-box-css' => 'ce92d8ec', 'phui-object-item-list-view-css' => '24444832', 'phui-pinboard-view-css' => '4b346c2a', 'phui-property-list-view-css' => 'af4b381f', 'phui-remarkup-preview-css' => '19ad512b', 'phui-spacing-css' => '042804d6', 'phui-status-list-view-css' => '2f562399', 'phui-tag-view-css' => '295d81c4', 'phui-text-css' => '23e9b4b7', - 'phui-timeline-view-css' => '4a39d766', + 'phui-timeline-view-css' => '15ff2a9f', 'phui-workboard-view-css' => '84f2c272', 'phui-workpanel-view-css' => '97b69459', + 'phuix-action-list-view' => 'b5c256b8', + 'phuix-action-view' => '19a0b148', + 'phuix-dropdown-menu' => 'bd4c8dca', 'policy-css' => '957ea14c', 'policy-edit-css' => '05cca26a', 'policy-transaction-detail-css' => '82100a43', 'ponder-comment-table-css' => '6cdccea7', 'ponder-feed-view-css' => 'e62615b6', 'ponder-post-css' => 'ebab8a70', 'ponder-vote-css' => '8ed6ed8b', 'raphael-core' => '51ee6b43', 'raphael-g' => '40dde778', 'raphael-g-line' => '40da039e', 'releeph-core' => '9b3c5733', 'releeph-preview-branch' => 'b7a6f4a5', 'releeph-request-differential-create-dialog' => '8d8b92cd', 'releeph-request-typeahead-css' => '667a48ae', 'setup-issue-css' => '69e640e7', 'sprite-actions-css' => '969ad0e5', 'sprite-apps-css' => '67d6556a', 'sprite-apps-large-css' => '3e3ec4c3', 'sprite-apps-xlarge-css' => 'db66c878', 'sprite-buttonbar-css' => 'ba1c5738', 'sprite-conpherence-css' => '3b4a0487', 'sprite-docs-css' => '5f65d0da', 'sprite-gradient-css' => 'a10def53', 'sprite-icons-css' => 'f19a828c', 'sprite-login-css' => '9fbaec81', 'sprite-main-header-css' => '92720ee2', 'sprite-menu-css' => '8da53882', 'sprite-minicons-css' => 'df4f76fe', 'sprite-payments-css' => 'cc085d44', 'sprite-projects-css' => '7578fa56', - 'sprite-status-css' => '8bce1c97', + 'sprite-status-css' => '25d7f92f', 'sprite-tokens-css' => '1706b943', 'subscribers-list-css' => '5bb30c78', 'syntax-highlighting-css' => '3c18c1cb', 'tokens-css' => '3d0f239e', ), 'requires' => array( '00861799' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-util', 4 => 'javelin-vector', 5 => 'differential-inline-comment-editor', ), '029a133d' => array( 0 => 'aphront-dialog-view-css', ), '0326e5d0' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-typeahead', 4 => 'javelin-tokenizer', 5 => 'javelin-typeahead-preloaded-source', 6 => 'javelin-typeahead-ondemand-source', 7 => 'javelin-dom', 8 => 'javelin-stratcom', 9 => 'javelin-util', ), '039fb90d' => array( 0 => 'javelin-install', 1 => 'javelin-event', ), '03d6ed07' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-vector', 4 => 'javelin-install', ), '065227cc' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', ), '06e05112' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-vector', ), + '07d99a3d' => + array( + 0 => 'javelin-magical-init', + 1 => 'javelin-install', + 2 => 'javelin-util', + 3 => 'javelin-vector', + 4 => 'javelin-stratcom', + ), '08e56a4e' => array( 0 => 'javelin-install', ), '0c33c1a0' => array( 0 => 'javelin-view', 1 => 'javelin-install', 2 => 'javelin-dom', ), '0c6946e7' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-util', 4 => 'phabricator-notification-css', ), '0e34ca02' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), - '0f386ef4' => - array( - 0 => 'javelin-install', - 1 => 'javelin-dom', - ), '0f764c35' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), '127f2018' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-request', 4 => 'javelin-util', 5 => 'phabricator-shaped-request', ), '1681c4d4' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-util', 4 => 'javelin-vector', 5 => 'javelin-magical-init', ), '1693a296' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phortune-credit-card-form', ), '173ce7e7' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'phabricator-keyboard-shortcut', ), '189e4fe3' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), + '19a0b148' => + array( + 0 => 'javelin-install', + 1 => 'javelin-dom', + 2 => 'javelin-util', + ), '1ae869f2' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'phabricator-keyboard-shortcut-manager', ), '1e1c8a59' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', 4 => 'javelin-util', 5 => 'javelin-uri', ), '1e1e8bb0' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-workflow', 4 => 'phabricator-phtize', 5 => 'phabricator-drag-and-drop-file-upload', 6 => 'phabricator-draggable-list', ), '2290aeef' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-json', 3 => 'javelin-workflow', 4 => 'javelin-util', ), '22d2966a' => array( 0 => 'multirow-row-manager', 1 => 'javelin-install', 2 => 'javelin-util', 3 => 'javelin-dom', 4 => 'javelin-stratcom', 5 => 'javelin-json', 6 => 'phabricator-prefab', ), '23f9bb8d' => array( 0 => 'javelin-install', 1 => 'javelin-stratcom', 2 => 'javelin-util', 3 => 'javelin-behavior', 4 => 'javelin-json', 5 => 'javelin-dom', 6 => 'javelin-resource', ), '263aeb8c' => array( 0 => 'javelin-behavior', 1 => 'multirow-row-manager', 2 => 'javelin-dom', 3 => 'javelin-util', 4 => 'phabricator-prefab', 5 => 'javelin-tokenizer', 6 => 'javelin-typeahead', 7 => 'javelin-typeahead-preloaded-source', 8 => 'javelin-json', ), '2a2dba85' => array( 0 => 'javelin-behavior', 1 => 'javelin-request', 2 => 'javelin-stratcom', 3 => 'javelin-vector', 4 => 'javelin-dom', 5 => 'javelin-uri', 6 => 'javelin-behavior-device', ), '2f2e18aa' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-workflow', 3 => 'javelin-stratcom', ), '2fa810fc' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-view-renderer', 3 => 'javelin-install', ), '327dbe61' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-stratcom', 4 => 'javelin-request', ), - '32a4d380' => - array( - 0 => 'javelin-magical-init', - 1 => 'javelin-install', - 2 => 'javelin-util', - 3 => 'javelin-vector', - 4 => 'javelin-stratcom', - ), '356de121' => array( 0 => 'javelin-util', 1 => 'javelin-uri', 2 => 'javelin-install', ), '37871df4' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-workflow', 3 => 'javelin-dom', 4 => 'phabricator-draggable-list', ), '3915d490' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-vector', ), '3aa45ad9' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-mask', 4 => 'javelin-util', 5 => 'phabricator-busy', ), '3b3e1664' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phortune-credit-card-form', ), + '40b1ff90' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-dom', + 2 => 'javelin-stratcom', + 3 => 'javelin-workflow', + 4 => 'javelin-util', + 5 => 'phabricator-notification', + 6 => 'javelin-behavior-device', + 7 => 'phuix-dropdown-menu', + 8 => 'phuix-action-list-view', + 9 => 'phuix-action-view', + ), '4398eabb' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-workflow', ), '441f2137' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), '46efd18e' => array( 0 => 'multirow-row-manager', 1 => 'javelin-install', 2 => 'path-typeahead', 3 => 'javelin-dom', 4 => 'javelin-util', 5 => 'phabricator-prefab', ), '48db4145' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'phabricator-tooltip', ), '493665ee' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), '4a11ea9c' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-drag-and-drop-file-upload', 3 => 'phabricator-textareautils', ), + '4d94d9c3' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-stratcom', + 2 => 'javelin-dom', + 3 => 'phuix-dropdown-menu', + ), '4e37e4de' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), '4f344388' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-vector', 3 => 'javelin-request', 4 => 'javelin-uri', ), '50395a1b' => array( 0 => 'javelin-install', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-util', ), '52a92793' => array( 0 => 'javelin-util', 1 => 'javelin-magical-init', ), '533a187b' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-prefab', ), '53f6f2dd' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-workflow', 4 => 'javelin-stratcom', ), '54b612ba' => array( 0 => 'javelin-color', 1 => 'javelin-install', 2 => 'javelin-util', ), '551add57' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), '59b251eb' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-vector', 3 => 'javelin-dom', ), '5bc2cb21' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', ), '5d584426' => array( 0 => 'javelin-behavior', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-stratcom', 4 => 'javelin-vector', ), - '5f004630' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'javelin-stratcom', - 4 => 'phabricator-dropdown-menu', - 5 => 'phabricator-menu-item', - 6 => 'phabricator-phtize', - ), '5f850b5c' => array( 0 => 'javelin-install', ), '61d927ec' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), + '62e18640' => + array( + 0 => 'javelin-install', + 1 => 'javelin-util', + 2 => 'javelin-dom', + 3 => 'javelin-typeahead-normalizer', + ), '6453c869' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-fx', ), '64ef2fd2' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-vector', ), '6b3dcf44' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), '6c2b09a2' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), '71755c79' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), '7319e029' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', ), - '62e18640' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-typeahead-normalizer', - ), '75903ee1' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-request', ), '76f4ebed' => array( 0 => 'javelin-install', 1 => 'javelin-reactor', 2 => 'javelin-util', ), '77b1cf6f' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), '79473b62' => array( 0 => 'javelin-install', ), '7a68dda3' => array( 0 => 'owners-path-editor', 1 => 'javelin-behavior', ), '7ba325ee' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), '7c273581' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), '7e41274a' => array( 0 => 'javelin-install', ), '7ebaeed3' => array( 0 => 'herald-rule-editor', 1 => 'javelin-behavior', ), '7ee23816' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-stratcom', 4 => 'javelin-workflow', 5 => 'javelin-behavior-device', 6 => 'javelin-history', 7 => 'javelin-vector', 8 => 'phabricator-shaped-request', ), '7ee2b591' => array( 0 => 'javelin-behavior', 1 => 'javelin-history', ), + '7f93ef26' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-dom', + 2 => 'javelin-util', + 3 => 'javelin-stratcom', + 4 => 'phuix-dropdown-menu', + 5 => 'phuix-action-list-view', + 6 => 'phuix-action-view', + 7 => 'phabricator-phtize', + ), '82f568cd' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), '845731b8' => array( 0 => 'javelin-behavior', 1 => 'javelin-aphlict', 2 => 'javelin-stratcom', 3 => 'javelin-request', 4 => 'javelin-uri', 5 => 'javelin-dom', 6 => 'javelin-json', 7 => 'phabricator-notification', ), '84845b5b' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', 4 => 'phabricator-draggable-list', ), '84f34ab1' => array( 0 => 'javelin-install', 1 => 'javelin-typeahead-source', 2 => 'javelin-util', ), '858f9728' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), '889c96f3' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', ), '8a3ed18b' => array( 0 => 'javelin-magical-init', 1 => 'javelin-util', ), '8ab282be' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-uri', ), '8ef9ab58' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), '8f24abfc' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), '8fc1c918' => array( 0 => 'javelin-behavior', 1 => 'javelin-uri', 2 => 'phabricator-notification', ), '8fd76bab' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-uri', 3 => 'javelin-mask', 4 => 'phabricator-drag-and-drop-file-upload', ), '9084a36f' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-fx', 4 => 'javelin-request', 5 => 'phabricator-shaped-request', ), - '925c9bab' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-stratcom', - 2 => 'javelin-workflow', - 3 => 'javelin-dom', - 4 => 'javelin-fx', - 5 => 'javelin-util', - ), '938aed89' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-json', 4 => 'phabricator-draggable-list', ), '9414ff18' => array( 0 => 'javelin-behavior', 1 => 'javelin-resource', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', 4 => 'javelin-util', ), '957a7fde' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-workflow', 3 => 'javelin-dom', 4 => 'phabricator-draggable-list', ), '9b9197be' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), '9c808199' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'javelin-vector', 4 => 'phabricator-hovercard', ), '9db3d160' => array( 0 => 'javelin-behavior', 1 => 'javelin-vector', 2 => 'javelin-dom', ), '9eb2cedb' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-uri', 3 => 'javelin-request', ), 'a3e2244e' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'a4ae61bf' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'phabricator-notification', ), 'a51fdb2e' => array( 0 => 'javelin-behavior', 1 => 'javelin-request', 2 => 'javelin-stratcom', 3 => 'javelin-dom', ), 'a5d7cf86' => array( 0 => 'javelin-dom', ), 'a79b75a4' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', 3 => 'javelin-typeahead-source', ), 'a82a7769' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'a8d8459d' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), 'a9aaba0c' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'ad7a69ca' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-dom', 4 => 'javelin-vector', ), 'ae6abfba' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', 3 => 'javelin-dom', 4 => 'javelin-uri', 5 => 'phabricator-file-upload', ), 'b3a4b884' => array( 0 => 'javelin-behavior', 1 => 'phabricator-prefab', ), 'b3e5ee60' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phortune-credit-card-form', ), 'b3ec3cfc' => array( 0 => 'javelin-install', ), 'b4c30592' => array( 0 => 'javelin-install', 1 => 'javelin-reactor', 2 => 'javelin-util', 3 => 'javelin-reactor-node-calmer', ), 'b4eef37b' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-request', 3 => 'javelin-util', ), 'b5842a5e' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'javelin-dom', 4 => 'javelin-magical-init', 5 => 'javelin-vector', 6 => 'javelin-request', 7 => 'javelin-util', ), + 'b5c256b8' => + array( + 0 => 'javelin-install', + 1 => 'javelin-dom', + ), 'b657bdf8' => array( 0 => 'javelin-behavior', 1 => 'javelin-uri', 2 => 'phabricator-keyboard-shortcut', ), 'b6d401d6' => array( 0 => 'javelin-dom', 1 => 'javelin-dynval', 2 => 'javelin-reactor', 3 => 'javelin-reactornode', 4 => 'javelin-install', 5 => 'javelin-util', ), 'b98fc918' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-vector', 3 => 'javelin-magical-init', ), 'b9f26029' => array( 0 => 'javelin-install', 1 => 'javelin-dom', ), 'bc778103' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-history', ), + 'bc99b0f2' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-dom', + 2 => 'javelin-util', + 3 => 'phuix-dropdown-menu', + 4 => 'phuix-action-list-view', + 5 => 'phuix-action-view', + 6 => 'javelin-workflow', + ), + 'bd4c8dca' => + array( + 0 => 'javelin-install', + 1 => 'javelin-util', + 2 => 'javelin-dom', + 3 => 'javelin-vector', + 4 => 'javelin-stratcom', + ), 'bdaf4d04' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-request', ), 'be81801d' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'bf97561d' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), - 'c01153ea' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-util', - 3 => 'phabricator-dropdown-menu', - 4 => 'phabricator-menu-item', - 5 => 'javelin-workflow', - ), 'c021950a' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'phabricator-phtize', 4 => 'phabricator-textareautils', 5 => 'javelin-workflow', 6 => 'javelin-vector', ), 'c293f7b9' => array( 0 => 'javelin-install', 1 => 'javelin-event', 2 => 'javelin-util', 3 => 'javelin-magical-init', ), 'c3e218fe' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', ), 'c4b31646' => array( 0 => 'javelin-request', 1 => 'javelin-behavior', 2 => 'javelin-dom', 3 => 'phabricator-busy', ), 'c51a6616' => array( 0 => 'phabricator-notification', 1 => 'javelin-stratcom', 2 => 'javelin-behavior', ), 'c54eeefb' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-vector', 3 => 'javelin-util', ), 'c60f4327' => array( 0 => 'javelin-stratcom', 1 => 'javelin-install', 2 => 'javelin-uri', 3 => 'javelin-util', ), 'c81bc98f' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-vector', 3 => 'javelin-dom', 4 => 'javelin-uri', ), 'c8728c70' => array( 0 => 'javelin-behavior', 1 => 'phabricator-keyboard-shortcut', 2 => 'javelin-stratcom', ), 'ca3f91eb' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'phabricator-phtize', ), 'cd9e7094' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-typeahead', 3 => 'javelin-typeahead-ondemand-source', 4 => 'javelin-dom', ), 'cdde23f1' => array( 0 => 'javelin-install', 1 => 'javelin-typeahead-source', ), 'ce0c217a' => array( 0 => 'javelin-behavior', 1 => 'javelin-workflow', 2 => 'javelin-util', 3 => 'javelin-dom', 4 => 'javelin-stratcom', 5 => 'javelin-behavior-device', 6 => 'javelin-vector', 7 => 'phabricator-tooltip', ), + 'cf656c84' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-stratcom', + 2 => 'javelin-workflow', + 3 => 'javelin-dom', + 4 => 'javelin-fx', + 5 => 'javelin-uri', + 6 => 'phabricator-textareautils', + ), 'cf76cfd5' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', 4 => 'javelin-fx', 5 => 'javelin-util', ), 'd254d646' => array( 0 => 'javelin-util', ), 'd259e7c9' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', 4 => 'javelin-util', 5 => 'phabricator-keyboard-shortcut', ), 'd4a14807' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-view', ), 'd6ca6b1c' => array( 0 => 'javelin-install', 1 => 'javelin-reactor-dom', 2 => 'javelin-view-html', 3 => 'javelin-view-interpreter', 4 => 'javelin-view-renderer', ), 'd75709e6' => array( 0 => 'javelin-behavior', 1 => 'javelin-workflow', 2 => 'javelin-json', 3 => 'javelin-dom', 4 => 'phabricator-keyboard-shortcut', ), 'd8469741' => array( 0 => 'javelin-behavior', 1 => 'javelin-typeahead-ondemand-source', 2 => 'javelin-typeahead', 3 => 'javelin-dom', 4 => 'javelin-uri', 5 => 'javelin-util', 6 => 'javelin-stratcom', ), 'd8e135db' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-stratcom', 4 => 'javelin-workflow', 5 => 'phabricator-draggable-list', ), - 'd8ef8659' => - array( - 0 => 'javelin-behavior', - 1 => 'javelin-dom', - 2 => 'javelin-stratcom', - 3 => 'javelin-workflow', - 4 => 'javelin-util', - 5 => 'phabricator-notification', - 6 => 'javelin-behavior-device', - 7 => 'phabricator-dropdown-menu', - 8 => 'phabricator-menu-item', - ), 'd9a9b862' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-stratcom', ), 'dd7e8ef5' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-workflow', 3 => 'javelin-util', 4 => 'javelin-stratcom', ), 'dddd43ac' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-prefab', ), 'dfa181a4' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', ), 'e1ff79b1' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'e5822781' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-json', 3 => 'javelin-workflow', 4 => 'javelin-magical-init', ), 'e5b406f9' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-view-visitor', 3 => 'javelin-util', ), 'e7c21fb3' => array( 0 => 'javelin-dom', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-install', ), 'e9fdb5e5' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-util', 3 => 'javelin-dom', 4 => 'javelin-request', 5 => 'phabricator-keyboard-shortcut', ), 'ead554ec' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-util', ), 'efe49472' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), 'f2441746' => array( 0 => 'javelin-dom', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-install', 4 => 'javelin-request', 5 => 'javelin-workflow', ), 'f42bb8c6' => array( 0 => 'javelin-stratcom', 1 => 'javelin-behavior', 2 => 'javelin-vector', 3 => 'javelin-dom', ), 'f6555212' => array( 0 => 'javelin-install', 1 => 'javelin-reactornode', 2 => 'javelin-util', 3 => 'javelin-reactor', ), 'f7379f45' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'f778a573' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', 3 => 'javelin-typeahead-source', ), 'f7f1289f' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), 'f7fc67ec' => array( 0 => 'javelin-install', 1 => 'javelin-typeahead', 2 => 'javelin-dom', 3 => 'javelin-request', 4 => 'javelin-typeahead-ondemand-source', 5 => 'javelin-util', ), 'f8248bc5' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-json', 4 => 'javelin-stratcom', 5 => 'phabricator-shaped-request', ), - 'fb342e18' => - array( - 0 => 'javelin-install', - 1 => 'javelin-util', - 2 => 'javelin-dom', - 3 => 'javelin-vector', - 4 => 'javelin-stratcom', - 5 => 'phabricator-menu-item', - ), 'fbbce3bf' => array( 0 => 'phabricator-busy', 1 => 'javelin-behavior', ), 'fe2e0ba4' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'javelin-vector', 4 => 'javelin-dom', 5 => 'javelin-magical-init', ), 'fe80fb6d' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-prefab', 4 => 'multirow-row-manager', 5 => 'javelin-json', ), 'fee00761' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-workflow', 3 => 'javelin-dom', ), 'ff8091f7' => array( 0 => 'javelin-stratcom', 1 => 'javelin-request', 2 => 'javelin-dom', 3 => 'javelin-vector', 4 => 'javelin-install', 5 => 'javelin-util', 6 => 'javelin-mask', 7 => 'javelin-uri', ), 28497740 => array( 0 => 'javelin-behavior', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-dom', 4 => 'javelin-vector', 5 => 'javelin-magical-init', 6 => 'javelin-request', 7 => 'javelin-history', 8 => 'javelin-workflow', 9 => 'javelin-mask', 10 => 'javelin-behavior-device', 11 => 'phabricator-keyboard-shortcut', ), 36903077 => array( 0 => 'aphront-typeahead-control-css', ), 42126667 => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-request', ), 44524435 => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-dynval', 4 => 'javelin-reactor-dom', ), 48086888 => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-workflow', ), ), 'packages' => array( 'core.pkg.css' => array( 0 => 'phabricator-core-css', 1 => 'phabricator-zindex-css', 2 => 'phui-button-css', 3 => 'phabricator-standard-page-view', 4 => 'aphront-dialog-view-css', 5 => 'phui-form-view-css', 6 => 'aphront-panel-view-css', 7 => 'aphront-table-view-css', 8 => 'aphront-tokenizer-control-css', 9 => 'aphront-typeahead-control-css', 10 => 'aphront-list-filter-view-css', 11 => 'phabricator-jump-nav', 12 => 'phabricator-remarkup-css', 13 => 'syntax-highlighting-css', 14 => 'aphront-pager-view-css', 15 => 'phabricator-transaction-view-css', 16 => 'aphront-tooltip-css', 17 => 'phabricator-flag-css', 18 => 'aphront-error-view-css', 19 => 'sprite-icons-css', 20 => 'sprite-gradient-css', 21 => 'sprite-menu-css', 22 => 'sprite-apps-large-css', 23 => 'sprite-status-css', 24 => 'phabricator-main-menu-view', 25 => 'phabricator-notification-css', 26 => 'phabricator-notification-menu-css', 27 => 'lightbox-attachment-css', 28 => 'phui-header-view-css', 29 => 'phabricator-filetree-view-css', 30 => 'phabricator-nav-view-css', 31 => 'phabricator-side-menu-view-css', 32 => 'phabricator-crumbs-view-css', 33 => 'phui-object-item-list-view-css', 34 => 'global-drag-and-drop-css', 35 => 'phui-spacing-css', 36 => 'phui-form-css', 37 => 'phui-icon-view-css', 38 => 'phabricator-application-launch-view-css', 39 => 'phabricator-action-list-view-css', 40 => 'phui-property-list-view-css', 41 => 'phui-tag-view-css', 42 => 'phui-list-view-css', ), 'core.pkg.js' => array( 0 => 'javelin-behavior-aphront-basic-tokenizer', 1 => 'javelin-behavior-workflow', 2 => 'javelin-behavior-aphront-form-disable-on-submit', 3 => 'phabricator-keyboard-shortcut-manager', 4 => 'phabricator-keyboard-shortcut', 5 => 'javelin-behavior-phabricator-keyboard-shortcuts', 6 => 'javelin-behavior-refresh-csrf', 7 => 'javelin-behavior-phabricator-watch-anchor', 8 => 'javelin-behavior-phabricator-autofocus', - 9 => 'phabricator-menu-item', - 10 => 'phabricator-dropdown-menu', - 11 => 'phabricator-phtize', - 12 => 'javelin-behavior-phabricator-oncopy', - 13 => 'phabricator-tooltip', - 14 => 'javelin-behavior-phabricator-tooltips', - 15 => 'phabricator-prefab', - 16 => 'javelin-behavior-device', - 17 => 'javelin-behavior-toggle-class', - 18 => 'javelin-behavior-lightbox-attachments', - 19 => 'phabricator-busy', - 20 => 'javelin-aphlict', - 21 => 'phabricator-notification', - 22 => 'javelin-behavior-aphlict-listen', - 23 => 'javelin-behavior-phabricator-search-typeahead', - 24 => 'javelin-behavior-konami', - 25 => 'javelin-behavior-aphlict-dropdown', - 26 => 'javelin-behavior-history-install', - 27 => 'javelin-behavior-phabricator-gesture', - 28 => 'javelin-behavior-phabricator-active-nav', - 29 => 'javelin-behavior-phabricator-nav', - 30 => 'javelin-behavior-phabricator-remarkup-assist', - 31 => 'phabricator-textareautils', - 32 => 'phabricator-file-upload', - 33 => 'javelin-behavior-global-drag-and-drop', - 34 => 'javelin-behavior-phabricator-reveal-content', - 35 => 'phabricator-hovercard', - 36 => 'javelin-behavior-phabricator-hovercards', - 37 => 'javelin-color', - 38 => 'javelin-fx', + 9 => 'phuix-dropdown-menu', + 10 => 'phuix-action-list-view', + 11 => 'phuix-action-view', + 12 => 'phabricator-phtize', + 13 => 'javelin-behavior-phabricator-oncopy', + 14 => 'phabricator-tooltip', + 15 => 'javelin-behavior-phabricator-tooltips', + 16 => 'phabricator-prefab', + 17 => 'javelin-behavior-device', + 18 => 'javelin-behavior-toggle-class', + 19 => 'javelin-behavior-lightbox-attachments', + 20 => 'phabricator-busy', + 21 => 'javelin-aphlict', + 22 => 'phabricator-notification', + 23 => 'javelin-behavior-aphlict-listen', + 24 => 'javelin-behavior-phabricator-search-typeahead', + 25 => 'javelin-behavior-konami', + 26 => 'javelin-behavior-aphlict-dropdown', + 27 => 'javelin-behavior-history-install', + 28 => 'javelin-behavior-phabricator-gesture', + 29 => 'javelin-behavior-phabricator-active-nav', + 30 => 'javelin-behavior-phabricator-nav', + 31 => 'javelin-behavior-phabricator-remarkup-assist', + 32 => 'phabricator-textareautils', + 33 => 'phabricator-file-upload', + 34 => 'javelin-behavior-global-drag-and-drop', + 35 => 'javelin-behavior-phabricator-reveal-content', + 36 => 'phabricator-hovercard', + 37 => 'javelin-behavior-phabricator-hovercards', + 38 => 'javelin-color', + 39 => 'javelin-fx', ), 'darkconsole.pkg.js' => array( 0 => 'javelin-behavior-dark-console', 1 => 'javelin-behavior-error-log', ), 'differential.pkg.css' => array( 0 => 'differential-core-view-css', 1 => 'differential-changeset-view-css', 2 => 'differential-results-table-css', 3 => 'differential-revision-history-css', 4 => 'differential-revision-list-css', 5 => 'differential-table-of-contents-css', 6 => 'differential-revision-comment-css', 7 => 'differential-revision-add-comment-css', 8 => 'phabricator-object-selector-css', 9 => 'phabricator-content-source-view-css', 10 => 'inline-comment-summary-css', ), 'differential.pkg.js' => array( 0 => 'phabricator-drag-and-drop-file-upload', 1 => 'phabricator-shaped-request', 2 => 'javelin-behavior-differential-feedback-preview', 3 => 'javelin-behavior-differential-edit-inline-comments', 4 => 'javelin-behavior-differential-populate', 5 => 'javelin-behavior-differential-show-more', 6 => 'javelin-behavior-differential-diff-radios', 7 => 'javelin-behavior-differential-comment-jump', 8 => 'javelin-behavior-differential-add-reviewers-and-ccs', 9 => 'javelin-behavior-differential-keyboard-navigation', 10 => 'javelin-behavior-aphront-drag-and-drop-textarea', 11 => 'javelin-behavior-phabricator-object-selector', 12 => 'javelin-behavior-repository-crossreference', 13 => 'javelin-behavior-load-blame', 14 => 'differential-inline-comment-editor', 15 => 'javelin-behavior-differential-dropdown-menus', 16 => 'javelin-behavior-differential-toggle-files', 17 => 'javelin-behavior-differential-user-select', ), 'diffusion.pkg.css' => array( 0 => 'diffusion-commit-view-css', 1 => 'diffusion-icons-css', ), 'diffusion.pkg.js' => array( 0 => 'javelin-behavior-diffusion-pull-lastmodified', 1 => 'javelin-behavior-diffusion-commit-graph', 2 => 'javelin-behavior-audit-preview', ), 'javelin.pkg.js' => array( 0 => 'javelin-util', 1 => 'javelin-install', 2 => 'javelin-event', 3 => 'javelin-stratcom', 4 => 'javelin-behavior', 5 => 'javelin-resource', 6 => 'javelin-request', 7 => 'javelin-vector', 8 => 'javelin-dom', 9 => 'javelin-json', 10 => 'javelin-uri', 11 => 'javelin-workflow', 12 => 'javelin-mask', 13 => 'javelin-typeahead', 14 => 'javelin-typeahead-normalizer', 15 => 'javelin-typeahead-source', 16 => 'javelin-typeahead-preloaded-source', 17 => 'javelin-typeahead-ondemand-source', 18 => 'javelin-tokenizer', 19 => 'javelin-history', ), 'maniphest.pkg.css' => array( 0 => 'maniphest-task-summary-css', 1 => 'phabricator-project-tag-css', ), 'maniphest.pkg.js' => array( 0 => 'javelin-behavior-maniphest-batch-selector', 1 => 'javelin-behavior-maniphest-transaction-controls', 2 => 'javelin-behavior-maniphest-transaction-preview', 3 => 'javelin-behavior-maniphest-transaction-expand', 4 => 'javelin-behavior-maniphest-subpriority-editor', ), ), ); diff --git a/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php b/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php index 7ed3685ae4..0b4d0b615e 100644 --- a/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php +++ b/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php @@ -1,89 +1,86 @@ phid = $data['phid']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $xaction = id(new PhabricatorObjectQuery()) ->withPHIDs(array($this->phid)) ->setViewer($user) ->executeOne(); if (!$xaction) { return new Aphront404Response(); } if (!$xaction->getComment()) { // You can't currently edit a transaction which doesn't have a comment. // Some day you may be able to edit the visibility. return new Aphront404Response(); } if ($xaction->getComment()->getIsRemoved()) { // You can't edit history of a transaction with a removed comment. return new Aphront400Response(); } $obj_phid = $xaction->getObjectPHID(); $obj_handle = id(new PhabricatorHandleQuery()) ->setViewer($user) ->withPHIDs(array($obj_phid)) ->executeOne(); if ($request->isDialogFormPost()) { $text = $request->getStr('text'); $comment = $xaction->getApplicationTransactionCommentObject(); $comment->setContent($text); if (!strlen($text)) { $comment->setIsDeleted(true); } $editor = id(new PhabricatorApplicationTransactionCommentEditor()) ->setActor($user) ->setContentSource(PhabricatorContentSource::newFromRequest($request)) ->applyEdit($xaction, $comment); if ($request->isAjax()) { - return id(new PhabricatorApplicationTransactionResponse()) - ->setViewer($user) - ->setTransactions(array($xaction)) - ->setAnchorOffset($request->getStr('anchor')); + return id(new AphrontAjaxResponse())->setContent(array()); } else { return id(new AphrontReloadResponse())->setURI($obj_handle->getURI()); } } $dialog = id(new AphrontDialogView()) ->setUser($user) ->setSubmitURI( $this->getApplicationURI('/transactions/edit/'.$xaction->getPHID().'/')) ->setTitle(pht('Edit Comment')); $dialog ->addHiddenInput('anchor', $request->getStr('anchor')) ->appendChild( id(new PHUIFormLayoutView()) ->setFullWidth(true) ->appendChild( id(new PhabricatorRemarkupControl()) ->setName('text') ->setValue($xaction->getComment()->getContent()))); $dialog ->addSubmitButton(pht('Save Changes')) ->addCancelButton($obj_handle->getURI()); return id(new AphrontDialogResponse())->setDialog($dialog); } } diff --git a/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentRemoveController.php b/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentRemoveController.php index fb9c6f481d..a4feff433d 100644 --- a/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentRemoveController.php +++ b/src/applications/transactions/controller/PhabricatorApplicationTransactionCommentRemoveController.php @@ -1,82 +1,79 @@ phid = $data['phid']; } public function processRequest() { $request = $this->getRequest(); $viewer = $request->getUser(); $xaction = id(new PhabricatorObjectQuery()) ->withPHIDs(array($this->phid)) ->setViewer($viewer) ->executeOne(); if (!$xaction) { return new Aphront404Response(); } if (!$xaction->getComment()) { return new Aphront404Response(); } if ($xaction->getComment()->getIsRemoved()) { // You can't remove an already-removed comment. return new Aphront400Response(); } $obj_phid = $xaction->getObjectPHID(); $obj_handle = id(new PhabricatorHandleQuery()) ->setViewer($viewer) ->withPHIDs(array($obj_phid)) ->executeOne(); if ($request->isDialogFormPost()) { $comment = $xaction->getApplicationTransactionCommentObject() ->setContent('') ->setIsRemoved(true); $editor = id(new PhabricatorApplicationTransactionCommentEditor()) ->setActor($viewer) ->setContentSource(PhabricatorContentSource::newFromRequest($request)) ->applyEdit($xaction, $comment); if ($request->isAjax()) { - return id(new PhabricatorApplicationTransactionResponse()) - ->setViewer($viewer) - ->setTransactions(array($xaction)) - ->setAnchorOffset($request->getStr('anchor')); + return id(new AphrontAjaxResponse())->setContent(array()); } else { return id(new AphrontReloadResponse())->setURI($obj_handle->getURI()); } } $form = id(new AphrontFormView()) ->setUser($viewer); $dialog = $this->newDialog() ->setTitle(pht('Remove Comment')); $dialog ->addHiddenInput('anchor', $request->getStr('anchor')) ->appendParagraph( pht( "Removing a comment prevents anyone (including you) from reading ". "it. Removing a comment also hides the comment's edit history ". "and prevents it from being edited.")) ->appendParagraph( pht('Really remove this comment?')); $dialog ->addSubmitButton(pht('Remove Comment')) ->addCancelButton($obj_handle->getURI()); return $dialog; } } diff --git a/src/applications/transactions/view/PhabricatorApplicationTransactionView.php b/src/applications/transactions/view/PhabricatorApplicationTransactionView.php index 0dd9358b36..64d9cd4c11 100644 --- a/src/applications/transactions/view/PhabricatorApplicationTransactionView.php +++ b/src/applications/transactions/view/PhabricatorApplicationTransactionView.php @@ -1,454 +1,451 @@ quoteRef = $quote_ref; return $this; } public function getQuoteRef() { return $this->quoteRef; } public function setQuoteTargetID($quote_target_id) { $this->quoteTargetID = $quote_target_id; return $this; } public function getQuoteTargetID() { return $this->quoteTargetID; } public function setObjectPHID($object_phid) { $this->objectPHID = $object_phid; return $this; } public function getObjectPHID() { return $this->objectPHID; } public function setIsPreview($is_preview) { $this->isPreview = $is_preview; return $this; } public function setShowEditActions($show_edit_actions) { $this->showEditActions = $show_edit_actions; return $this; } public function getShowEditActions() { return $this->showEditActions; } public function setAnchorOffset($anchor_offset) { $this->anchorOffset = $anchor_offset; return $this; } public function setMarkupEngine(PhabricatorMarkupEngine $engine) { $this->engine = $engine; return $this; } public function setTransactions(array $transactions) { assert_instances_of($transactions, 'PhabricatorApplicationTransaction'); $this->transactions = $transactions; return $this; } public function setShouldTerminate($term) { $this->shouldTerminate = $term; return $this; } public function buildEvents($with_hiding = false) { $user = $this->getUser(); $anchor = $this->anchorOffset; $xactions = $this->transactions; $xactions = $this->filterHiddenTransactions($xactions); $xactions = $this->groupRelatedTransactions($xactions); $groups = $this->groupDisplayTransactions($xactions); // If the viewer has interacted with this object, we hide things from // before their most recent interaction by default. This tends to make // very long threads much more manageable, because you don't have to // scroll through a lot of history and can focus on just new stuff. $show_group = null; if ($with_hiding) { // Find the most recent comment by the viewer. $group_keys = array_keys($groups); $group_keys = array_reverse($group_keys); // If we would only hide a small number of transactions, don't hide // anything. Just don't examine the last few keys. Also, we always // want to show the most recent pieces of activity, so don't examine // the first few keys either. $group_keys = array_slice($group_keys, 2, -2); $type_comment = PhabricatorTransactions::TYPE_COMMENT; foreach ($group_keys as $group_key) { $group = $groups[$group_key]; foreach ($group as $xaction) { if ($xaction->getAuthorPHID() == $user->getPHID() && $xaction->getTransactionType() == $type_comment) { // This is the most recent group where the user commented. $show_group = $group_key; break 2; } } } } $events = array(); $hide_by_default = ($show_group !== null); foreach ($groups as $group_key => $group) { if ($hide_by_default && ($show_group === $group_key)) { $hide_by_default = false; } $group_event = null; foreach ($group as $xaction) { $event = $this->renderEvent($xaction, $group, $anchor); $event->setHideByDefault($hide_by_default); $anchor++; if (!$group_event) { $group_event = $event; } else { $group_event->addEventToGroup($event); } } $events[] = $group_event; } return $events; } public function render() { if (!$this->getObjectPHID()) { throw new Exception("Call setObjectPHID() before render()!"); } $view = new PHUITimelineView(); $view->setShouldTerminate($this->shouldTerminate); $events = $this->buildEvents($with_hiding = true); foreach ($events as $event) { $view->addEvent($event); } if ($this->getShowEditActions()) { $list_id = celerity_generate_unique_node_id(); $view->setID($list_id); Javelin::initBehavior( 'phabricator-transaction-list', array( 'listID' => $list_id, 'objectPHID' => $this->getObjectPHID(), 'nextAnchor' => $this->anchorOffset + count($events), - 'historyLink' => '/transactions/history/', - 'historyLinkText' => pht('Edited'), - 'linkDelimiter' => PHUITimelineEventView::DELIMITER, )); } return $view->render(); } protected function getOrBuildEngine() { if (!$this->engine) { $field = PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT; $engine = id(new PhabricatorMarkupEngine()) ->setViewer($this->getUser()); foreach ($this->transactions as $xaction) { if (!$xaction->hasComment()) { continue; } $engine->addObject($xaction->getComment(), $field); } $engine->process(); $this->engine = $engine; } return $this->engine; } private function buildChangeDetailsLink( PhabricatorApplicationTransaction $xaction) { return javelin_tag( 'a', array( 'href' => '/transactions/detail/'.$xaction->getPHID().'/', 'sigil' => 'workflow', ), pht('(Show Details)')); } private function buildExtraInformationLink( PhabricatorApplicationTransaction $xaction) { $link = $xaction->renderExtraInformationLink(); if (!$link) { return null; } return phutil_tag( 'span', array( 'class' => 'phui-timeline-extra-information', ), array(" \xC2\xB7 ", $link)); } protected function shouldGroupTransactions( PhabricatorApplicationTransaction $u, PhabricatorApplicationTransaction $v) { return false; } protected function renderTransactionContent( PhabricatorApplicationTransaction $xaction) { $field = PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT; $engine = $this->getOrBuildEngine(); $comment = $xaction->getComment(); if ($comment) { if ($comment->getIsRemoved()) { return javelin_tag( 'span', array( 'class' => 'comment-deleted', 'sigil' => 'transaction-comment', 'meta' => array('phid' => $comment->getTransactionPHID()), ), pht( 'This comment was removed by %s.', $xaction->getHandle($comment->getAuthorPHID())->renderLink())); } else if ($comment->getIsDeleted()) { return javelin_tag( 'span', array( 'class' => 'comment-deleted', 'sigil' => 'transaction-comment', 'meta' => array('phid' => $comment->getTransactionPHID()), ), pht('This comment has been deleted.')); } else if ($xaction->hasComment()) { return javelin_tag( 'span', array( 'sigil' => 'transaction-comment', 'meta' => array('phid' => $comment->getTransactionPHID()), ), $engine->getOutput($comment, $field)); } else { // This is an empty, non-deleted comment. Usually this happens when // rendering previews. return null; } } return null; } private function filterHiddenTransactions(array $xactions) { foreach ($xactions as $key => $xaction) { if ($xaction->shouldHide()) { unset($xactions[$key]); } } return $xactions; } private function groupRelatedTransactions(array $xactions) { $last = null; $last_key = null; $groups = array(); foreach ($xactions as $key => $xaction) { if ($last && $this->shouldGroupTransactions($last, $xaction)) { $groups[$last_key][] = $xaction; unset($xactions[$key]); } else { $last = $xaction; $last_key = $key; } } foreach ($xactions as $key => $xaction) { $xaction->attachTransactionGroup(idx($groups, $key, array())); } return $xactions; } private function groupDisplayTransactions(array $xactions) { $groups = array(); $group = array(); foreach ($xactions as $xaction) { if ($xaction->shouldDisplayGroupWith($group)) { $group[] = $xaction; } else { if ($group) { $groups[] = $group; } $group = array($xaction); } } if ($group) { $groups[] = $group; } foreach ($groups as $key => $group) { $group = msort($group, 'getActionStrength'); $group = array_reverse($group); $groups[$key] = $group; } return $groups; } private function renderEvent( PhabricatorApplicationTransaction $xaction, array $group, $anchor) { $viewer = $this->getUser(); $event = id(new PHUITimelineEventView()) ->setUser($viewer) ->setTransactionPHID($xaction->getPHID()) ->setUserHandle($xaction->getHandle($xaction->getAuthorPHID())) ->setIcon($xaction->getIcon()) ->setColor($xaction->getColor()); list($token, $token_removed) = $xaction->getToken(); if ($token) { $event->setToken($token, $token_removed); } if (!$this->shouldSuppressTitle($xaction, $group)) { $title = $xaction->getTitle(); if ($xaction->hasChangeDetails()) { if (!$this->isPreview) { $details = $this->buildChangeDetailsLink($xaction); $title = array( $title, ' ', $details, ); } } if (!$this->isPreview) { $more = $this->buildExtraInformationLink($xaction); if ($more) { $title = array($title, ' ', $more); } } $event->setTitle($title); } if ($this->isPreview) { $event->setIsPreview(true); } else { $event ->setDateCreated($xaction->getDateCreated()) ->setContentSource($xaction->getContentSource()) ->setAnchor($anchor); } $has_deleted_comment = $xaction->getComment() && $xaction->getComment()->getIsDeleted(); $has_removed_comment = $xaction->getComment() && $xaction->getComment()->getIsRemoved(); if ($this->getShowEditActions() && !$this->isPreview) { if ($xaction->getCommentVersion() > 1 && !$has_removed_comment) { $event->setIsEdited(true); } // If we have a place for quoted text to go and this is a quotable // comment, pass the quote target ID to the event view. if ($this->getQuoteTargetID()) { if ($xaction->hasComment()) { if (!$has_removed_comment && !$has_deleted_comment) { $event->setQuoteTargetID($this->getQuoteTargetID()); $event->setQuoteRef($this->getQuoteRef()); } } } $can_edit = PhabricatorPolicyCapability::CAN_EDIT; if ($xaction->hasComment() || $has_deleted_comment) { $has_edit_capability = PhabricatorPolicyFilter::hasCapability( $viewer, $xaction, $can_edit); if ($has_edit_capability && !$has_removed_comment) { $event->setIsEditable(true); } if ($has_edit_capability || $viewer->getIsAdmin()) { if (!$has_removed_comment) { $event->setIsRemovable(true); } } } } $comment = $this->renderTransactionContent($xaction); if ($comment) { $event->appendChild($comment); } return $event; } private function shouldSuppressTitle( PhabricatorApplicationTransaction $xaction, array $group) { // This is a little hard-coded, but we don't have any other reasonable // cases for now. Suppress "commented on" if there are other actions in // the display group. if (count($group) > 1) { $type_comment = PhabricatorTransactions::TYPE_COMMENT; if ($xaction->getTransactionType() == $type_comment) { return true; } } return false; } } diff --git a/src/view/layout/PhabricatorActionView.php b/src/view/layout/PhabricatorActionView.php index 7548ebe183..5f879ba0a0 100644 --- a/src/view/layout/PhabricatorActionView.php +++ b/src/view/layout/PhabricatorActionView.php @@ -1,194 +1,206 @@ metadata = $metadata; + return $this; + } + + public function getMetadata() { + return $this->metadata; + } public function setObjectURI($object_uri) { $this->objectURI = $object_uri; return $this; } public function getObjectURI() { return $this->objectURI; } public function setDownload($download) { $this->download = $download; return $this; } public function getDownload() { return $this->download; } public function setHref($href) { $this->href = $href; return $this; } public function addSigil($sigil) { $this->sigils[] = $sigil; return $this; } /** * If the user is not logged in and the action is relatively complicated, * give them a generic login link that will re-direct to the page they're * viewing. */ public function getHref() { if (($this->workflow || $this->renderAsForm) && !$this->download) { if (!$this->user || !$this->user->isLoggedIn()) { return id(new PhutilURI('/auth/start/')) ->setQueryParam('next', (string)$this->getObjectURI()); } } return $this->href; } public function setIcon($icon) { $this->icon = $icon; return $this; } public function setIconSheet($sheet) { $this->iconSheet = $sheet; return $this; } public function setName($name) { $this->name = $name; return $this; } public function setDisabled($disabled) { $this->disabled = $disabled; return $this; } public function setWorkflow($workflow) { $this->workflow = $workflow; return $this; } public function setRenderAsForm($form) { $this->renderAsForm = $form; return $this; } public function render() { $icon = null; if ($this->icon) { $sheet = nonempty($this->iconSheet, PHUIIconView::SPRITE_ICONS); $suffix = ''; if ($this->disabled) { $suffix = '-grey'; } $icon = id(new PHUIIconView()) ->addClass('phabricator-action-view-icon') ->setSpriteIcon($this->icon.$suffix) ->setSpriteSheet($sheet); } if ($this->href) { $sigils = array(); if ($this->workflow) { $sigils[] = 'workflow'; } if ($this->download) { $sigils[] = 'download'; } if ($this->sigils) { $sigils = array_merge($sigils, $this->sigils); } $sigils = $sigils ? implode(' ', $sigils) : null; if ($this->renderAsForm) { if (!$this->user) { throw new Exception( 'Call setUser() when rendering an action as a form.'); } $item = javelin_tag( 'button', array( 'class' => 'phabricator-action-view-item', ), $this->name); $item = phabricator_form( $this->user, array( 'action' => $this->getHref(), 'method' => 'POST', 'sigil' => $sigils, + 'meta' => $this->metadata, ), $item); } else { $item = javelin_tag( 'a', array( 'href' => $this->getHref(), 'class' => 'phabricator-action-view-item', 'sigil' => $sigils, + 'meta' => $this->metadata, ), $this->name); } } else { $item = phutil_tag( 'span', array( 'class' => 'phabricator-action-view-item', ), $this->name); } $classes = array(); $classes[] = 'phabricator-action-view'; if ($this->disabled) { $classes[] = 'phabricator-action-view-disabled'; } return phutil_tag( 'li', array( 'class' => implode(' ', $classes), ), array($icon, $item)); } public static function getAvailableIcons() { $manifest = PHUIIconView::getSheetManifest(PHUIIconView::SPRITE_ICONS); $results = array(); $prefix = 'icons-'; foreach ($manifest as $sprite) { $name = $sprite['name']; if (preg_match('/-(white|grey)$/', $name)) { continue; } if (!strncmp($name, $prefix, strlen($prefix))) { $results[] = substr($name, strlen($prefix)); } } return $results; } } diff --git a/src/view/phui/PHUITimelineEventView.php b/src/view/phui/PHUITimelineEventView.php index e2c7371592..c1b30fcffa 100644 --- a/src/view/phui/PHUITimelineEventView.php +++ b/src/view/phui/PHUITimelineEventView.php @@ -1,484 +1,560 @@ quoteRef = $quote_ref; return $this; } public function getQuoteRef() { return $this->quoteRef; } public function setQuoteTargetID($quote_target_id) { $this->quoteTargetID = $quote_target_id; return $this; } public function getQuoteTargetID() { return $this->quoteTargetID; } public function setHideByDefault($hide_by_default) { $this->hideByDefault = $hide_by_default; return $this; } public function getHideByDefault() { return $this->hideByDefault; } public function setTransactionPHID($transaction_phid) { $this->transactionPHID = $transaction_phid; return $this; } public function getTransactionPHID() { return $this->transactionPHID; } public function setIsEdited($is_edited) { $this->isEdited = $is_edited; return $this; } public function getIsEdited() { return $this->isEdited; } public function setIsPreview($is_preview) { $this->isPreview = $is_preview; return $this; } public function getIsPreview() { return $this->isPreview; } public function setIsEditable($is_editable) { $this->isEditable = $is_editable; return $this; } public function getIsEditable() { return $this->isEditable; } public function setIsRemovable($is_removable) { $this->isRemovable = $is_removable; return $this; } public function getIsRemovable() { return $this->isRemovable; } public function setDateCreated($date_created) { $this->dateCreated = $date_created; return $this; } public function getDateCreated() { return $this->dateCreated; } public function setContentSource(PhabricatorContentSource $content_source) { $this->contentSource = $content_source; return $this; } public function getContentSource() { return $this->contentSource; } public function setUserHandle(PhabricatorObjectHandle $handle) { $this->userHandle = $handle; return $this; } public function setAnchor($anchor) { $this->anchor = $anchor; return $this; } public function getAnchor() { return $this->anchor; } public function setTitle($title) { $this->title = $title; return $this; } public function addClass($class) { $this->classes[] = $class; return $this; } public function setIcon($icon) { $this->icon = $icon; return $this; } public function setColor($color) { $this->color = $color; return $this; } public function setToken($token, $removed=false) { $this->token = $token; $this->tokenRemoved = $removed; return $this; } public function getEventGroup() { return array_merge(array($this), $this->eventGroup); } public function addEventToGroup(PHUITimelineEventView $event) { $this->eventGroup[] = $event; return $this; } - protected function renderEventTitle($is_first_event, $force_icon) { + protected function renderEventTitle($is_first_event, $force_icon, $has_menu) { $title = $this->title; if (($title === null) && !$this->hasChildren()) { $title = ''; } if ($is_first_event) { $extra = array(); $is_first_extra = true; foreach ($this->getEventGroup() as $event) { $extra[] = $event->renderExtra($is_first_extra); $is_first_extra = false; } $extra = array_reverse($extra); $extra = array_mergev($extra); $extra = javelin_tag( 'span', array( - 'sigil' => 'timeline-extra', 'class' => 'phui-timeline-extra', ), phutil_implode_html( javelin_tag( 'span', array( 'aural' => false, ), self::DELIMITER), $extra)); } else { $extra = null; } if ($title !== null || $extra) { $title_classes = array(); $title_classes[] = 'phui-timeline-title'; $icon = null; if ($this->icon || $force_icon) { $title_classes[] = 'phui-timeline-title-with-icon'; } + if ($has_menu) { + $title_classes[] = 'phui-timeline-title-with-menu'; + } + if ($this->icon) { $fill_classes = array(); $fill_classes[] = 'phui-timeline-icon-fill'; if ($this->color) { $fill_classes[] = 'phui-timeline-icon-fill-'.$this->color; } $icon = id(new PHUIIconView()) ->setIconFont($this->icon.' white') ->addClass('phui-timeline-icon'); $icon = phutil_tag( 'span', array( 'class' => implode(' ', $fill_classes), ), $icon); } $token = null; if ($this->token) { $token = id(new PHUIIconView()) ->addClass('phui-timeline-token') ->setSpriteSheet(PHUIIconView::SPRITE_TOKENS) ->setSpriteIcon($this->token); if ($this->tokenRemoved) { $token->addClass('strikethrough'); } } $title = phutil_tag( 'div', array( 'class' => implode(' ', $title_classes), ), array($icon, $token, $title, $extra)); } return $title; } public function render() { $events = $this->getEventGroup(); // Move events with icons first. $icon_keys = array(); foreach ($this->getEventGroup() as $key => $event) { if ($event->icon) { $icon_keys[] = $key; } } $events = array_select_keys($events, $icon_keys) + $events; $force_icon = (bool)$icon_keys; + $menu = null; + $items = array(); + $has_menu = false; + if (!$this->getIsPreview()) { + foreach ($this->getEventGroup() as $event) { + $items[] = $event->getMenuItems($this->anchor); + if ($event->hasChildren()) { + $has_menu = true; + } + } + $items = array_mergev($items); + } + + if ($items || $has_menu) { + $icon = id(new PHUIIconView()) + ->setIconFont('fa-cog'); + $aural = javelin_tag( + 'span', + array( + 'aural' => true, + ), + pht('Comment Actions')); + + if ($items) { + $sigil = 'phui-timeline-menu'; + Javelin::initBehavior('phui-timeline-dropdown-menu'); + } else { + $sigil = null; + } + + $action_list = id(new PhabricatorActionListView()) + ->setUser($this->getUser()); + foreach ($items as $item) { + $action_list->addAction($item); + } + + $menu = javelin_tag( + $items ? 'a' : 'span', + array( + 'href' => '#', + 'class' => 'phui-timeline-menu', + 'sigil' => $sigil, + 'aria-haspopup' => 'true', + 'aria-expanded' => 'false', + 'meta' => array( + 'items' => hsprintf('%s', $action_list), + ), + ), + array( + $aural, + $icon, + )); + + $has_menu = true; + } + $group_titles = array(); + $group_items = array(); $group_children = array(); $is_first_event = true; foreach ($events as $event) { - $group_titles[] = $event->renderEventTitle($is_first_event, $force_icon); + $group_titles[] = $event->renderEventTitle( + $is_first_event, + $force_icon, + $has_menu); $is_first_event = false; if ($event->hasChildren()) { $group_children[] = $event->renderChildren(); } } $image_uri = $this->userHandle->getImageURI(); $wedge = phutil_tag( 'div', array( 'class' => 'phui-timeline-wedge phui-timeline-border', 'style' => (nonempty($image_uri)) ? '' : 'display: none;', ), ''); $image = phutil_tag( 'div', array( 'style' => 'background-image: url('.$image_uri.')', 'class' => 'phui-timeline-image', ), ''); $content_classes = array(); $content_classes[] = 'phui-timeline-content'; $classes = array(); $classes[] = 'phui-timeline-event-view'; if ($group_children) { $classes[] = 'phui-timeline-major-event'; $content = phutil_tag( 'div', array( 'class' => 'phui-timeline-inner-content', ), array( $group_titles, + $menu, phutil_tag( 'div', array( 'class' => 'phui-timeline-core-content', ), $group_children), )); } else { $classes[] = 'phui-timeline-minor-event'; $content = $group_titles; } $content = phutil_tag( 'div', array( 'class' => 'phui-timeline-group phui-timeline-border', ), $content); $content = phutil_tag( 'div', array( 'class' => implode(' ', $content_classes), ), array($image, $wedge, $content)); $outer_classes = $this->classes; $outer_classes[] = 'phui-timeline-shell'; $color = null; foreach ($this->getEventGroup() as $event) { if ($event->color) { $color = $event->color; break; } } if ($color) { $outer_classes[] = 'phui-timeline-'.$color; } $sigil = null; $meta = null; if ($this->getTransactionPHID()) { $sigil = 'transaction'; $meta = array( 'phid' => $this->getTransactionPHID(), 'anchor' => $this->anchor, ); } return javelin_tag( 'div', array( 'class' => implode(' ', $outer_classes), 'id' => $this->anchor ? 'anchor-'.$this->anchor : null, 'sigil' => $sigil, 'meta' => $meta, ), phutil_tag( 'div', array( 'class' => implode(' ', $classes), ), $content)); } private function renderExtra($is_first_extra) { $extra = array(); if ($this->getIsPreview()) { $extra[] = pht('PREVIEW'); } else { - $xaction_phid = $this->getTransactionPHID(); - - if ($this->getQuoteTargetID()) { - - $ref = null; - if ($this->getQuoteRef()) { - $ref = $this->getQuoteRef(); - if ($this->anchor) { - $ref = $ref.'#'.$this->anchor; - } - } - - $extra[] = javelin_tag( - 'a', - array( - 'href' => '#', - 'sigil' => 'transaction-quote', - 'mustcapture' => true, - 'meta' => array( - 'targetID' => $this->getQuoteTargetID(), - 'uri' => '/transactions/quote/'.$xaction_phid.'/', - 'ref' => $ref, - ), - ), - pht('Quote')); - } if ($this->getIsEdited()) { - $extra[] = javelin_tag( - 'a', - array( - 'href' => '/transactions/history/'.$xaction_phid.'/', - 'sigil' => 'workflow transaction-edit-history', - ), - pht('Edited')); - } - - if ($this->getIsEditable()) { - $extra[] = javelin_tag( - 'a', - array( - 'href' => '/transactions/edit/'.$xaction_phid.'/', - 'sigil' => 'workflow transaction-edit', - ), - pht('Edit')); - } - - if ($this->getIsRemovable()) { - $extra[] = javelin_tag( - 'a', - array( - 'href' => '/transactions/remove/'.$xaction_phid.'/', - 'sigil' => 'workflow transaction-remove', - ), - pht('Remove')); + $extra[] = pht('Edited'); } if ($is_first_extra) { $source = $this->getContentSource(); if ($source) { $extra[] = id(new PhabricatorContentSourceView()) ->setContentSource($source) ->setUser($this->getUser()) ->render(); } $date_created = null; foreach ($this->getEventGroup() as $event) { if ($event->getDateCreated()) { if ($date_created === null) { $date_created = $event->getDateCreated(); } else { $date_created = min($event->getDateCreated(), $date_created); } } } if ($date_created) { $date = phabricator_datetime( $this->getDateCreated(), $this->getUser()); if ($this->anchor) { Javelin::initBehavior('phabricator-watch-anchor'); $anchor = id(new PhabricatorAnchorView()) ->setAnchorName($this->anchor) ->render(); $date = array( $anchor, phutil_tag( 'a', array( 'href' => '#'.$this->anchor, ), $date), ); } $extra[] = $date; } } + } return $extra; } + private function getMenuItems($anchor) { + $xaction_phid = $this->getTransactionPHID(); + + $items = array(); + if ($this->getQuoteTargetID()) { + + $ref = null; + if ($this->getQuoteRef()) { + $ref = $this->getQuoteRef(); + if ($anchor) { + $ref = $ref.'#'.$anchor; + } + } + + $items[] = id(new PhabricatorActionView()) + ->setIcon('comment') + ->setHref('#') + ->setName(pht('Quote')) + ->addSigil('transaction-quote') + ->setMetadata( + array( + 'targetID' => $this->getQuoteTargetID(), + 'uri' => '/transactions/quote/'.$xaction_phid.'/', + 'ref' => $ref, + )); + } + + if ($this->getIsEditable()) { + $items[] = id(new PhabricatorActionView()) + ->setIcon('edit') + ->setHref('/transactions/edit/'.$xaction_phid.'/') + ->setName(pht('Edit Comment')) + ->addSigil('transaction-edit') + ->setMetadata( + array( + 'anchor' => $anchor, + )); + } + + if ($this->getIsRemovable()) { + $items[] = id(new PhabricatorActionView()) + ->setIcon('delete') + ->setHref('/transactions/remove/'.$xaction_phid.'/') + ->setName(pht('Remove Comment')) + ->addSigil('transaction-remove') + ->setMetadata( + array( + 'anchor' => $anchor, + )); + + } + + if ($this->getIsEdited()) { + $items[] = id(new PhabricatorActionView()) + ->setIcon('transcript') + ->setHref('/transactions/history/'.$xaction_phid.'/') + ->setName(pht('View Edit History')) + ->setWorkflow(true); + } + + return $items; + } + } diff --git a/webroot/rsrc/css/core/core.css b/webroot/rsrc/css/core/core.css index 58f75c1486..114752e5f4 100644 --- a/webroot/rsrc/css/core/core.css +++ b/webroot/rsrc/css/core/core.css @@ -1,151 +1,161 @@ /** * @provides phabricator-core-css */ body { /* Always show the vertical scrollbar so that going from a page without a scrollbar to a page with a scrollbar doesn't make content jump a few pixels left when the viewport narrows. */ overflow-y: scroll; /* reset behavior in ie7, as it will add an extra scrollbar regardless selector * targets ie6 and ie7 only */ *overflow-y: auto; } .device-phone { /* By default, the iPhone zooms all text on the page by some percentage when you rotate from portrait mode to landscape mode. Disable this, since it breaks lots of things and prevents you from using landscape to see more columns in source code views. */ -webkit-text-size-adjust: none; } body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, fieldset, p, blockquote, th, td, button { margin: 0; padding: 0; border: 0; } table { border-collapse: collapse; border-spacing: 0; } fieldset, img { border: 0; } address, caption, cite, code, dfn, th, var { font-style: normal; font-weight: normal; } ol, ul { list-style: none; } caption, th { text-align: left; } td, th { vertical-align: top; } h1, h2, h3, h4, h5, h6 { font-size: 100%; font-weight: bold; } body { font: 13px/1.231 'Helvetica Neue', Helvetica, Arial, sans-serif; direction: ltr; text-align: left; unicode-bidi: embed; background: #ebecee; text-rendering: optimizeLegibility; } textarea { font: inherit; } table { font-size: inherit; font: 100%; } h1 { font-size: 16px; } h2 { font-size: 14px; } a { -moz-outline-style: none; text-decoration: none; color: #18559D; cursor: pointer; } a:hover { text-decoration: underline; } img { display: block; } .busy { position: fixed; bottom: 16px; right: 16px; width: 44px; height: 44px; border-radius: 5px; opacity: 0.4; background: #000 url(/rsrc/image/loading/compass_24.gif) center no-repeat; } .grouped:after { content: ""; display: table; clear: both; } hr { height: 1px; background: #bbbbbb; border: none; } .aural-only { position: absolute !important; clip: rect(1px, 1px, 1px, 1px); + + /* NOTE: Without this, Safari sometimes lays these elements out at normal + size. An example is the label on the comment action menu on timelines. */ + + width: 0; + height: 0; + overflow: hidden; } .visual-only { /* These elements are hidden by the 'aria-hidden' attribute. */ } .audible .aural-only { clip: auto; + width: auto; + height: auto; + overflow: auto; background: #006699; color: #ffffff; } .audible .aural-only a { color: #ffffff; font-weight: bold; } .audible .visual-only { position: absolute !important; background: #990066; opacity: 0.25; } diff --git a/webroot/rsrc/css/phui/phui-button.css b/webroot/rsrc/css/phui/phui-button.css index 7a5a048be1..b02875685a 100644 --- a/webroot/rsrc/css/phui/phui-button.css +++ b/webroot/rsrc/css/phui/phui-button.css @@ -1,332 +1,338 @@ /** * @provides phui-button-css */ button, a.button { font: 13px/1.231 'Helvetica Neue', Helvetica, Arial, sans-serif; } button, a.button, a.button:visited, input[type="submit"] { background-color: #3477ad; color: white; text-shadow: 0 -1px rgba(0,0,0,0.75); border: 1px solid #19558D; cursor: pointer; font-weight: bold; font-size: 13px; display: inline-block; padding: 3px 10px 4px; text-align: center; white-space: nowrap; border-radius: 3px; background-image: linear-gradient(to bottom, #3b86c4, #2b628f); background-image: -webkit-linear-gradient(top, #3b86c4, #2b628f); } /* Buttons with images (full size only) */ button.icon, a.icon, a.icon:visited { padding-left: 0; position: relative; text-indent: 29px; } button.black, a.black, a.black:visited { background-color: #383838; background-image: linear-gradient(to bottom, #505d65, #2d373c); background-image: -webkit-linear-gradient(top, #505d65, #2d373c); border: 1px solid {$darkgreytext}; border-bottom-color: #000; } button.green, a.green, a.green:visited { background-color: #348e20; background-image: linear-gradient(to bottom, #4e9b33, #158009); background-image: -webkit-linear-gradient(top, #4e9b33, #158009); border: 1px solid #3b6e22; border-bottom-color: #2c5a15; } button.grey, input[type="submit"].grey, a.grey, a.grey:visited { background-color: {$lightgreybackground}; background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); border-color: {$lightgreyborder}; color: {$darkgreytext}; border-bottom-color: {$greyborder}; text-shadow: none; } button.simple, input[type="submit"].simple, a.simple, a.simple:visited { background-color: transparent; background-image: none; border: 1px solid transparent; color: {$bluetext}; text-shadow: 0 1px #fff; } a.disabled, button.disabled, button[disabled] { filter:alpha(opacity=50); -moz-opacity: 0.5; -khtml-opacity: 0.5; opacity: 0.5; } body button:active, body a.button:active { box-shadow: inset 0 0 8px rgba(0,0,0,.6); } button.grey:active, a.grey:active, button.grey_active, -a.button.dropdown-open { +a.button.phuix-dropdown-open { background-color: #7d7d7d; box-shadow: inset 0 0 4px rgba(0,0,0,.2); } -a.dropdown-open { +a.phuix-dropdown-open { color: {$greytext}; } a.button:hover, button:hover { text-decoration: none; box-shadow: inset 0 0 5px rgba(0,0,0,.4); } a.button.simple:hover, button.simple:hover { background-color: #fff; border: 1px solid {$lightgreyborder}; background-image: none; border-bottom: 1px solid {$greyborder}; text-shadow: none; box-shadow: none; } a.button.grey:hover, button.grey:hover { text-decoration: none; box-shadow: inset 0 0 4px rgba(0,0,0,.2); } body a.button.disabled:hover, body button.disabled:hover, body a.button.disabled:active, body button.disabled:active { box-shadow: none; } button.small, a.small, a.small:visited { padding: 2px 7px; height: auto; font-size: 11px; line-height: 16px; } button.link { display: inline; border: none; background: transparent; font-weight: normal; padding: 0; margin: 0; font-size: inherit; border-bottom: none; text-decoration: none; text-shadow: none; color: #19558D; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } button.link:hover { text-decoration: underline; } .phuix-dropdown-menu { position: absolute; width: 240px; background: #fff; margin-top: -1px; padding: 5px 0; box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.3); border: 1px solid {$lightgreyborder}; border-bottom-color: {$greyborder}; } +.phuix-dropdown-menu a:focus { + /* We automatically focus links in dropdown menus for assistive devices, but + this is distracting for visual user agents. */ + outline: none; +} + a.policy-control { width: 240px; text-align: left; } a.policy-control .caret { float: right; } a.policy-control span.phui-icon-view { /* NOTE: Nudge these icons a little bit. Should this be for all dropdown buttons? */ top: 4px; left: 7px; } a.toggle { display: inline-block; padding: 4px 8px; font-size: 12px; font-weight: bold; color: #555; text-decoration: none; white-space: nowrap; vertical-align: baseline; background-color: {$lightgreybackground}; margin: 0 6px 0 0; border-radius: 3px; box-shadow: inset 0 0 3px rgba(0,0,0,.4); } a.toggle:hover { background-color: #14568e; color: #fff } a.toggle-selected { background-color: #14568e; color: #fff } a.toggle-fixed { cursor: default; } .caret { display: inline-block; width: 0; height: 0; vertical-align: top; border-top: 5px solid #fff; border-right: 5px solid transparent; border-left: 5px solid transparent; content: ""; } .caret-right { display: inline-block; width: 0; height: 0; vertical-align: middle; border-left: 7px solid {$greytext}; border-top: 5px solid transparent; border-bottom: 5px solid transparent; content: ""; margin-bottom: 4px; } .caret-left { display: inline-block; width: 0; height: 0; vertical-align: middle; border-right: 7px solid {$greytext}; border-bottom: 5px solid transparent; border-top: 5px solid transparent; content: ""; margin-bottom: 4px; } .dropdown .caret { margin-top: 7px; margin-left: 4px; } .small.dropdown .caret { margin-top: 6px; } .grey.dropdown .caret { border-top-color: #000; } /* Icons */ .button.has-icon { position: relative; } .button .phui-icon-view { display: inline-block; position: absolute; top: 5px; left: 8px; } .button.has-icon .phui-button-text { margin-left: 16px; } /* Login Buttons */ .button.big.has-icon { padding: 6px 20px 6px 12px; border-radius: 4px; text-align: left; } .button.big.has-icon .phui-button-text { margin-left: 36px; font-size: 14px; display: block; } .button.big.has-icon .phui-button-subtext { color: {$lightgreytext}; font-size: 12px; line-height: 15px; font-weight: normal; } /* PHUI Button Bar */ .phui-button-bar a.button { display: inline-block; height: 16px; width: 12px; } .phui-button-bar .phui-button-bar-first { border-top-right-radius: 0px; border-bottom-right-radius: 0px; } .phui-button-bar .phui-button-bar-middle { border-radius: 0; border-left: none; } .phui-button-bar .phui-button-bar-last { border-left: none; border-top-left-radius: 0px; border-bottom-left-radius: 0px; } diff --git a/webroot/rsrc/css/phui/phui-timeline-view.css b/webroot/rsrc/css/phui/phui-timeline-view.css index 7b27fcf829..d536f978e9 100644 --- a/webroot/rsrc/css/phui/phui-timeline-view.css +++ b/webroot/rsrc/css/phui/phui-timeline-view.css @@ -1,318 +1,367 @@ /** * @provides phui-timeline-view-css */ .phui-timeline-view { padding: 0 16px; background-image: url('/rsrc/image/BFCFDA.png'); background-repeat: repeat-y; background-position: 94px; } .device-tablet .phui-timeline-view { background-position: 31px; } .device-phone .phui-timeline-view { padding: 0; background-position: 24px; } .phui-timeline-major-event .phui-timeline-group { border-left: 1px solid {$lightblueborder}; border-right: 1px solid {$lightblueborder}; } .device-desktop .phui-timeline-event-view { margin-left: 62px; position: relative; } .device-desktop .phui-timeline-event-view.phui-timeline-minor-event { margin-left: 65px; } .device-desktop .phui-timeline-spacer { min-height: 16px; } .device-desktop .phui-timeline-event-view.the-worlds-end { background: {$lightblueborder}; width: 9px; height: 9px; border-radius: 2px; margin-left: 74px; } .device-desktop .phui-timeline-wedge { border-bottom: 1px solid {$lightblueborder}; position: absolute; width: 12px; } .device-phone .phui-timeline-minor-event, .device-tablet .phui-timeline-minor-event { padding-left: 3px; } .phui-timeline-major-event .phui-timeline-content { border-top: 1px solid {$lightblueborder}; border-bottom: 1px solid {$lightblueborder}; } .phui-timeline-title { line-height: 18px; min-height: 18px; position: relative; color: {$bluetext}; } .phui-timeline-minor-event .phui-timeline-title { padding: 4px 8px 4px 33px; } .phui-timeline-title a { font-weight: bold; color: {$darkbluetext}; } .device-desktop .phui-timeline-wedge { left: -12px; } .device-desktop .phui-timeline-major-event .phui-timeline-wedge { top: 24px; } .device-desktop .phui-timeline-minor-event .phui-timeline-wedge { top: 12px; left: -18px; width: 20px; } .phui-timeline-image { background-repeat: no-repeat; position: absolute; border-radius: 3px; } .device-desktop .phui-timeline-major-event .phui-timeline-image { width: 50px; height: 50px; top: 0px; left: -62px; } .device-desktop .phui-timeline-minor-event .phui-timeline-image { width: 26px; height: 26px; background-size: 26px auto; left: -41px; } .phui-timeline-major-event .phui-timeline-title { background: {$lightgreybackground}; min-height: 18px; } .phui-timeline-title { padding: 5px 8px; overflow-x: auto; overflow-y: hidden; } .phui-timeline-title-with-icon { padding-left: 38px; } +.phui-timeline-title-with-menu { + padding-right: 36px; +} + .phui-timeline-view .phui-icon-view.phui-timeline-token { vertical-align: middle; margin-right: 4px; } .phui-timeline-token.strikethrough { position: relative; } .phui-timeline-token.strikethrough:before { position: absolute; content: ""; left: 0; top: 50%; right: 0; border-top: 3px solid; border-color: {$darkbluetext}; -webkit-transform:rotate(-40deg); -moz-transform:rotate(-40deg); -ms-transform:rotate(-40deg); -o-transform:rotate(-40deg); transform:rotate(-40deg); } .phui-timeline-major-event .phui-timeline-content .phui-timeline-core-content { padding: 16px 12px; line-height: 18px; background: #fff; } .phui-timeline-core-content { overflow-x: auto; } .phui-timeline-core-content .comment-deleted { font-style: italic; } .device .phui-timeline-event-view { min-height: 23px; position: relative; } .device-phone .phui-timeline-event-view { margin: 0 8px; } .device .phui-timeline-image { display: none; } .device .phui-timeline-spacer { min-height: 8px; border-width: 0; } .phui-timeline-icon-fill { position: absolute; width: 30px; height: 30px; background-color: {$lightblueborder}; top: 0; left: 0; text-align: center; } .phui-icon-view.phui-timeline-icon:before { font-size: 14px; } .phui-timeline-minor-event .phui-timeline-icon-fill { height: 26px; width: 26px; border-radius: 3px; } .phui-timeline-icon-fill .phui-timeline-icon { margin-top: 7px; } .phui-timeline-minor-event .phui-timeline-icon-fill .phui-timeline-icon { margin-top: 6px; } .phui-timeline-extra, .phui-timeline-extra .phabricator-content-source-view { font-size: 11px; font-weight: normal; color: {$lightbluetext}; } .phui-timeline-title .phui-timeline-extra a { font-weight: normal; color: {$bluetext}; } .device-desktop .phui-timeline-extra { float: right; } .device .phui-timeline-extra { display: inline-block; line-height: 16px; margin-left: 8px; white-space: nowrap; } .device-phone .phui-timeline-extra { display: block; margin: 0; } .phui-timeline-icon-fill-red { background-color: {$red}; } .phui-timeline-icon-fill-orange { background-color: {$orange}; } .phui-timeline-icon-fill-yellow { background-color: {$yellow}; } .phui-timeline-icon-fill-green { background-color: {$green}; } .phui-timeline-icon-fill-sky { background-color: {$sky}; } .phui-timeline-icon-fill-blue { background-color: {$blue}; } .phui-timeline-icon-fill-indigo { background-color: {$indigo}; } .phui-timeline-icon-fill-violet { background-color: {$violet}; } .phui-timeline-icon-fill-grey { background-color: #888; } .phui-timeline-icon-fill-black { background-color: #333; } .phui-timeline-shell.anchor-target { background: {$lightyellow}; padding: 4px; margin: -4px; } .phui-timeline-preview-header { background: #e0e3ec; color: {$darkgreytext}; padding: 4px 1.25%; border: solid {$blueborder} 1px 0; } .phui-timeline-change-details { padding: 10px 0; border-style: solid; border-color: #efefef; border-width: 1px 0; } .phui-timeline-older-transactions-are-hidden { background: {$lightyellow}; border: 1px solid {$yellow}; text-align: center; padding: 12px; color: {$darkgreytext}; } .device-phone .phui-timeline-older-transactions-are-hidden { margin: 0 8px; } .phui-timeline-title .phui-timeline-extra-information a { font-weight: normal; color: {$bluetext}; } + +.phui-timeline-comment-actions .phui-icon-view { + width: 16px; + height: 16px; + font-size: 16px; + text-align: center; + overflow: hidden; +} + +.phui-timeline-menu { + position: absolute; + right: 3px; + top: 4px; + width: 28px; + height: 22px; + text-align: center; + line-height: 22px; + font-size: 15px; + border-left: 1px solid {$lightblueborder}; +} + +.phui-timeline-menu:focus { + outline: none; +} + +.phui-timeline-menu .phui-icon-view { + color: {$lightgreytext}; +} + +a.phui-timeline-menu .phui-icon-view { + color: {$bluetext}; +} + +.device-desktop a.phui-timeline-menu:hover .phui-icon-view { + color: {$darkgreytext}; +} + +.phui-timeline-menu.phuix-dropdown-open { + background: {$blue}; +} + +.phui-timeline-menu.phuix-dropdown-open .phui-icon-view, +.device-desktop a.phuix-dropdown-open:hover .phui-icon-view { + color: #ffffff; +} diff --git a/webroot/rsrc/js/application/transactions/behavior-transaction-list.js b/webroot/rsrc/js/application/transactions/behavior-transaction-list.js index abed702c14..8c56da6a74 100644 --- a/webroot/rsrc/js/application/transactions/behavior-transaction-list.js +++ b/webroot/rsrc/js/application/transactions/behavior-transaction-list.js @@ -1,207 +1,180 @@ /** * @provides javelin-behavior-phabricator-transaction-list * @requires javelin-behavior * javelin-stratcom * javelin-workflow * javelin-dom * javelin-fx - * javelin-util + * javelin-uri * phabricator-textareautils */ JX.behavior('phabricator-transaction-list', function(config) { var list = JX.$(config.listID); var xaction_nodes = null; var next_anchor = config.nextAnchor; function get_xaction_nodes() { if (xaction_nodes === null) { xaction_nodes = {}; var xactions = JX.DOM.scry(list, 'div', 'transaction'); for (var ii = 0; ii < xactions.length; ii++) { xaction_nodes[JX.Stratcom.getData(xactions[ii]).phid] = xactions[ii]; } } return xaction_nodes; } function ontransactions(response) { var fade_in = []; var first_new = null; var nodes = get_xaction_nodes(); for (var phid in response.xactions) { var new_node = JX.$H(response.xactions[phid]).getFragment().firstChild; fade_in.push(new_node); if (nodes[phid]) { JX.DOM.replace(nodes[phid], new_node); } else { if (first_new === null) { first_new = new_node; } list.appendChild(new_node); // Add a spacer after new transactions. var spacer = JX.$H(response.spacer).getFragment().firstChild; list.appendChild(spacer); fade_in.push(spacer); next_anchor++; } nodes[phid] = new_node; } // Scroll to the first new transaction, if transactions were added. if (first_new) { JX.DOM.scrollTo(first_new); } // Make any new or updated transactions fade in. for (var ii = 0; ii < fade_in.length; ii++) { new JX.FX(fade_in[ii]).setDuration(500).start({opacity: [0, 1]}); } } - function edittransaction(transaction, response) { - // NOTE: this is for 1 transaction only - for (var phid in response.xactions) { - var new_node = JX.$H(response.xactions[phid]).getFragment().firstChild; - var new_comment = JX.DOM.find(new_node, 'span', 'transaction-comment'); - var old_comments = JX.DOM.scry( - transaction, - 'span', - 'transaction-comment'); - var old_comment = old_comments[0]; - JX.DOM.replace(old_comment, new_comment); - var edit_history = JX.DOM.scry( - transaction, - 'a', - 'transaction-edit-history'); - if (!edit_history.length) { - var transaction_phid = JX.Stratcom.getData(new_comment).phid; - var history_link = JX.$N( - 'a', - { sigil : 'transaction-edit-history', - href : config.historyLink + transaction_phid + '/' }, - config.historyLinkText); - JX.Stratcom.addSigil(history_link, 'workflow'); - var timeline_extra = JX.DOM.find(transaction, 'span', 'timeline-extra'); - var old_content = JX.$H(timeline_extra.innerHTML); - JX.DOM.setContent( - timeline_extra, - [history_link, config.linkDelimiter, old_content]); - } - new JX.FX(transaction).setDuration(500).start({opacity: [0, 1]}); - } - } - - JX.DOM.listen( - list, + JX.Stratcom.listen( 'click', - ['transaction-edit', 'transaction-remove'], + [['transaction-edit'], ['transaction-remove']], function(e) { if (!e.isNormalClick()) { return; } - var transaction = e.getNode('transaction'); + e.prevent(); - JX.Workflow.newFromLink(e.getTarget()) - .setData({anchor: e.getNodeData('transaction').anchor}) - .setHandler(JX.bind(null, edittransaction, transaction)) - .start(); + var anchor = e.getNodeData('tag:a').anchor; + var uri = JX.$U(window.location).setFragment(anchor); - e.kill(); + JX.Workflow.newFromLink(e.getNode('tag:a')) + .setHandler(function() { + // In most cases, `uri` is on the same page (just at a new anchor), + // so we have to call reload() explicitly to get the browser to + // refresh the page. It would be nice to just issue a server-side + // redirect instead, but there isn't currently an easy way to do + // that without complexity and/or a semi-open redirect. + uri.go(); + window.location.reload(); + }) + .start(); }); - JX.DOM.listen( - list, + JX.Stratcom.listen( 'click', 'transaction-quote', function(e) { - e.kill(); + e.prevent(); var data = e.getNodeData('transaction-quote'); new JX.Workflow(data.uri) .setData({ref: data.ref}) .setHandler(function(r) { var textarea = JX.$(data.targetID); JX.DOM.scrollTo(textarea); var value = textarea.value; if (value.length) { value += "\n\n"; } value += r.quoteText; value += "\n\n"; textarea.value = value; JX.TextAreaUtils.setSelectionRange( textarea, textarea.value.length, textarea.value.length); }) .start(); }); JX.Stratcom.listen( ['submit', 'didSyntheticSubmit'], 'transaction-append', function(e) { var form = e.getTarget(); if (JX.Stratcom.getData(form).objectPHID != config.objectPHID) { // This indicates there are several forms on the page, and the user // submitted a different one than the one we're in control of. return; } e.kill(); JX.DOM.invoke(form, 'willSubmit'); JX.Workflow.newFromForm(form, { anchor : next_anchor }) .setHandler(function(response) { ontransactions(response); var e = JX.DOM.invoke(form, 'willClear'); if (!e.getPrevented()) { var ii; var textareas = JX.DOM.scry(form, 'textarea'); for (ii = 0; ii < textareas.length; ii++) { textareas[ii].value = ''; } var inputs = JX.DOM.scry(form, 'input'); for (ii = 0; ii < inputs.length; ii++) { switch (inputs[ii].type) { case 'password': case 'text': inputs[ii].value = ''; break; case 'checkbox': case 'radio': inputs[ii].checked = false; break; } } var selects = JX.DOM.scry(form, 'select'); var jj; for (ii = 0; ii < selects.length; ii++) { if (selects[ii].type == 'select-one') { selects[ii].selectedIndex = 0; } else { for (jj = 0; jj < selects[ii].options.length; jj++) { selects[ii].options[jj].selected = false; } } } } }) .start(); }); }); diff --git a/webroot/rsrc/js/phui/behavior-phui-timeline-dropdown-menu.js b/webroot/rsrc/js/phui/behavior-phui-timeline-dropdown-menu.js new file mode 100644 index 0000000000..2c3e3ded9b --- /dev/null +++ b/webroot/rsrc/js/phui/behavior-phui-timeline-dropdown-menu.js @@ -0,0 +1,34 @@ +/** + * @provides javelin-behavior-phui-timeline-dropdown-menu + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + * phuix-dropdown-menu + */ + +JX.behavior('phui-timeline-dropdown-menu', function() { + + JX.Stratcom.listen('click', 'phui-timeline-menu', function(e) { + var data = e.getNodeData('phui-timeline-menu'); + if (data.menu) { + return; + } + + e.kill(); + + var list = JX.$H(data.items).getFragment().firstChild; + + var icon = e.getNode('phui-timeline-menu'); + data.menu = new JX.PHUIXDropdownMenu(icon); + data.menu.setContent(list); + data.menu.open(); + + JX.DOM.listen(list, 'click', 'tag:a', function(e) { + if (!e.isNormalClick()) { + return; + } + data.menu.close(); + }); + }); + +}); diff --git a/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js b/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js index aa9fe4b224..3c93af21d2 100644 --- a/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js +++ b/webroot/rsrc/js/phuix/PHUIXDropdownMenu.js @@ -1,181 +1,206 @@ /** * @provides phuix-dropdown-menu * @requires javelin-install * javelin-util * javelin-dom * javelin-vector * javelin-stratcom * @javelin */ /** * Basic interaction for a dropdown menu. * * The menu is unaware of the content inside it, so it can not close itself * when an item is selected. Callers must make a call to @{method:close} after * an item is chosen in order to close the menu. */ JX.install('PHUIXDropdownMenu', { construct : function(node) { this._node = node; JX.DOM.listen( this._node, 'click', null, JX.bind(this, this._onclick)); JX.Stratcom.listen( 'mousedown', null, JX.bind(this, this._onanyclick)); JX.Stratcom.listen( 'resize', null, JX.bind(this, this._adjustposition)); JX.Stratcom.listen('phuix.dropdown.open', null, JX.bind(this, this.close)); + + JX.Stratcom.listen('keydown', null, JX.bind(this, this._onkey)); }, events: ['open'], properties: { width: null, align: 'right', offsetX: 0, offsetY: 0 }, members: { _node: null, _menu: null, _open: false, _content: null, setContent: function(content) { JX.DOM.setContent(this._getMenuNode(), content); return this; }, open: function() { if (this._open) { return; } this.invoke('open'); JX.Stratcom.invoke('phuix.dropdown.open'); this._open = true; this._show(); return this; }, close: function() { if (!this._open) { return; } this._open = false; this._hide(); return this; }, _getMenuNode: function() { if (!this._menu) { var attrs = { className: 'phuix-dropdown-menu', role: 'button' }; var menu = JX.$N('div', attrs); - this._node.setAttribute('aria-haspopup', 'true'); - this._node.setAttribute('aria-expanded', 'false'); - this._menu = menu; } return this._menu; }, _onclick : function(e) { if (this._open) { this.close(); } else { this.open(); } e.prevent(); }, _onanyclick : function(e) { if (!this._open) { return; } if (JX.Stratcom.pass(e)) { return; } var t = e.getTarget(); while (t) { if (t == this._menu || t == this._node) { return; } t = t.parentNode; } this.close(); }, _show : function() { document.body.appendChild(this._menu); if (this.getWidth()) { new JX.Vector(this.getWidth(), null).setDim(this._menu); } this._adjustposition(); JX.DOM.alterClass(this._node, 'phuix-dropdown-open', true); this._node.setAttribute('aria-expanded', 'true'); + + // Try to highlight the first link in the menu for assistive technologies. + var links = JX.DOM.scry(this._menu, 'a'); + if (links[0]) { + JX.DOM.focus(links[0]); + } }, _hide : function() { JX.DOM.remove(this._menu); JX.DOM.alterClass(this._node, 'phuix-dropdown-open', false); this._node.setAttribute('aria-expanded', 'false'); }, _adjustposition : function() { if (!this._open) { return; } var m = JX.Vector.getDim(this._menu); var v = JX.$V(this._node); var d = JX.Vector.getDim(this._node); switch (this.getAlign()) { case 'right': v = v.add(d) .add(JX.$V(-m.x, 0)); break; default: v = v.add(0, d.y); break; } v = v.add(this.getOffsetX(), this.getOffsetY()); v.setPos(this._menu); + }, + + _onkey: function(e) { + // When the user presses escape with a menu open, close the menu and + // refocus the button which activates the menu. In particular, this makes + // popups more usable with assistive technologies. + + if (!this._open) { + return; + } + + if (e.getSpecialKey() != 'esc') { + return; + } + + this.close(); + JX.DOM.focus(this._node); + + e.prevent(); } + } });