Page Menu
Home
styx hydra
Search
Configure Global Search
Log In
Files
F1434491
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Advanced/Developer...
View Handle
View Hovercard
Size
427 KB
Referenced Files
None
Subscribers
None
View Options
This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
index c8cf00b60f..2e692ac95c 100644
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -1,2279 +1,2274 @@
<?php
/**
* This file is automatically generated. Use 'bin/celerity map' to rebuild it.
* @generated
*/
return array(
'names' =>
array(
- 'core.pkg.css' => '59ea1706',
- 'core.pkg.js' => 'b2ed04a2',
+ 'core.pkg.css' => 'e62084f9',
+ 'core.pkg.js' => 'ab0d6d3d',
'darkconsole.pkg.js' => 'ca8671ce',
'differential.pkg.css' => '382ca868',
- 'differential.pkg.js' => '36bec171',
+ 'differential.pkg.js' => '68d225fb',
'diffusion.pkg.css' => '3783278d',
'diffusion.pkg.js' => '077e3ad0',
'javelin.pkg.js' => 'b4831ebf',
'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' => '1b95ab2e',
'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' => '88e80148',
'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' => '466ac215',
+ 'rsrc/css/aphront/typeahead.css' => '1f4c9e23',
'rsrc/css/application/auth/auth.css' => '1e655982',
'rsrc/css/application/base/main-menu-view.css' => '0207239c',
'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' => 'bf275a6c',
'rsrc/css/application/contentsource/content-source-view.css' => '4b8b05d4',
'rsrc/css/application/countdown/timer.css' => '86b7b0a0',
'rsrc/css/application/dashboard/dashboard.css' => '2b41640b',
'rsrc/css/application/diff/inline-comment-summary.css' => '8cfd34e8',
'rsrc/css/application/differential/add-comment.css' => 'c478bcaa',
'rsrc/css/application/differential/changeset-view.css' => 'c45747f0',
'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' => 'e059f955',
'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' => '40151074',
'rsrc/css/core/remarkup.css' => '80c3a48c',
'rsrc/css/core/syntax.css' => '3c18c1cb',
'rsrc/css/core/z-index.css' => 'efb673ac',
'rsrc/css/diviner/diviner-shared.css' => '38813222',
'rsrc/css/font/font-awesome.css' => '73d075c3',
'rsrc/css/font/font-source-sans-pro.css' => '91d53463',
'rsrc/css/font/phui-font-icon-base.css' => '74cfb6a9',
'rsrc/css/layout/phabricator-action-header-view.css' => 'c14dfc57',
'rsrc/css/layout/phabricator-action-list-view.css' => 'dcd9875f',
'rsrc/css/layout/phabricator-crumbs-view.css' => '6a23399c',
'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' => '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' => '5d245c9c',
- 'rsrc/css/phui/phui-icon.css' => '00abbd26',
+ 'rsrc/css/phui/phui-header-view.css' => '689dbc38',
+ 'rsrc/css/phui/phui-icon.css' => 'ef701b9b',
'rsrc/css/phui/phui-info-panel.css' => '27ea50a1',
'rsrc/css/phui/phui-list.css' => '65eab261',
'rsrc/css/phui/phui-object-box.css' => 'ce92d8ec',
'rsrc/css/phui/phui-object-item-list-view.css' => '64b6b266',
'rsrc/css/phui/phui-pinboard-view.css' => '874c22f9',
- 'rsrc/css/phui/phui-property-list-view.css' => 'af4b381f',
+ 'rsrc/css/phui/phui-property-list-view.css' => 'c7cbe471',
'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' => '5d09d99e',
'rsrc/css/phui/phui-text.css' => '23e9b4b7',
'rsrc/css/phui/phui-timeline-view.css' => '15ff2a9f',
'rsrc/css/phui/phui-workboard-view.css' => '2bf82d00',
'rsrc/css/phui/phui-workpanel-view.css' => 'fddd97bf',
'rsrc/css/sprite-actions.css' => '969ad0e5',
'rsrc/css/sprite-apps-large.css' => 'd7ef733e',
'rsrc/css/sprite-apps-xlarge.css' => 'db66c878',
'rsrc/css/sprite-apps.css' => 'a0f5d4af',
'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-login.css' => '8d10fb28',
'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-remarkup.css' => '5c396a57',
- 'rsrc/css/sprite-status.css' => '25d7f92f',
'rsrc/css/sprite-tokens.css' => '1706b943',
'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => '1cab0752',
'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => '2ff84fd2',
'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => 'a119ee5e',
'rsrc/externals/font/sourcesans/SourceSansPro.woff' => '3614608c',
'rsrc/externals/font/sourcesans/SourceSansProBold.woff' => 'cbf46566',
'rsrc/externals/javelin/core/Event.js' => '69815cac',
'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' => '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' => '7bad574b',
'rsrc/externals/javelin/lib/Resource.js' => '356de121',
'rsrc/externals/javelin/lib/Routable.js' => 'b3e7d692',
'rsrc/externals/javelin/lib/Router.js' => '29274e2b',
'rsrc/externals/javelin/lib/URI.js' => 'd9a9b862',
'rsrc/externals/javelin/lib/Vector.js' => 'bd0aedcd',
'rsrc/externals/javelin/lib/Workflow.js' => '09b15cf1',
'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' => '66815d9c',
'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' => 'db9e0970',
'rsrc/image/sprite-apps-large-X2.png' => '0e4fa89b',
'rsrc/image/sprite-apps-large.png' => 'f31388f8',
'rsrc/image/sprite-apps-xlarge.png' => 'a751a580',
'rsrc/image/sprite-apps.png' => 'b46a87ae',
'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-login-X2.png' => 'bf5ceccc',
'rsrc/image/sprite-login.png' => 'c1e200b3',
'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-remarkup-X2.png' => '7ee1dc28',
'rsrc/image/sprite-remarkup.png' => 'b4421f07',
- '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' => '0a6c2de6',
'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' => '40b1ff90',
'rsrc/js/application/countdown/timer.js' => '889c96f3',
'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => 'f1375ea5',
'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => 'fa187a68',
'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' => '7f93ef26',
+ 'rsrc/js/application/differential/behavior-dropdown-menus.js' => 'dfd45180',
'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' => 'dfdf9f34',
'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/DiffusionLocateFileSource.js' => '5afdb2f8',
'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-locate-file.js' => '6d3e1947',
'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => '2b228192',
'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' => 'bc99b0f2',
+ 'rsrc/js/application/policy/behavior-policy-control.js' => '71b4cbcc',
'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' => '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/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/Prefab.js' => '41ed7994',
'rsrc/js/core/ShapedRequest.js' => '7cbe244b',
'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' => 'e6f67523',
'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' => '7814b593',
'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' => '0a3f3021',
'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/PHUIXActionView.js' => '6e8cefa4',
'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' => '1b95ab2e',
'aphront-pager-view-css' => '2e3539af',
'aphront-panel-view-css' => '5846dfa2',
'aphront-request-failure-view-css' => 'da14df31',
'aphront-table-view-css' => '88e80148',
'aphront-tokenizer-control-css' => '36903077',
'aphront-tooltip-css' => '9c90229d',
'aphront-two-column-view-css' => '16ab3ad2',
- 'aphront-typeahead-control-css' => '466ac215',
+ 'aphront-typeahead-control-css' => '1f4c9e23',
'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' => 'bf275a6c',
'differential-changeset-view-css' => 'c45747f0',
'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' => '73d075c3',
'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' => '0a6c2de6',
'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' => '40b1ff90',
'javelin-behavior-countdown-timer' => '889c96f3',
'javelin-behavior-dark-console' => 'e9fdb5e5',
'javelin-behavior-dashboard-async-panel' => 'f1375ea5',
'javelin-behavior-dashboard-move-panels' => 'fa187a68',
'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' => '7f93ef26',
+ 'javelin-behavior-differential-dropdown-menus' => 'dfd45180',
'javelin-behavior-differential-edit-inline-comments' => '00861799',
'javelin-behavior-differential-feedback-preview' => '127f2018',
'javelin-behavior-differential-keyboard-navigation' => '173ce7e7',
'javelin-behavior-differential-populate' => 'dfdf9f34',
'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-locate-file' => '6d3e1947',
'javelin-behavior-diffusion-pull-lastmodified' => '2b228192',
'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' => 'e6f67523',
'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' => '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-phui-timeline-dropdown-menu' => '4d94d9c3',
- 'javelin-behavior-policy-control' => 'bc99b0f2',
+ 'javelin-behavior-policy-control' => '71b4cbcc',
'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' => '7814b593',
'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' => '0a3f3021',
'javelin-color' => '7e41274a',
'javelin-cookie' => '6b3dcf44',
'javelin-diffusion-locate-file-source' => '5afdb2f8',
'javelin-dom' => '07d99a3d',
'javelin-dynval' => 'f6555212',
'javelin-event' => '69815cac',
'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' => '7bad574b',
'javelin-resource' => '356de121',
'javelin-routable' => 'b3e7d692',
'javelin-router' => '29274e2b',
'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' => '66815d9c',
'javelin-typeahead-source' => '62e18640',
'javelin-typeahead-static-source' => 'cdde23f1',
'javelin-uri' => 'd9a9b862',
'javelin-util' => '65b0b249',
'javelin-vector' => 'bd0aedcd',
'javelin-view' => '0f764c35',
'javelin-view-html' => 'e5b406f9',
'javelin-view-interpreter' => '0c33c1a0',
'javelin-view-renderer' => '6c2b09a2',
'javelin-view-visitor' => 'efe49472',
'javelin-workflow' => '09b15cf1',
'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' => 'dcd9875f',
'phabricator-application-launch-view-css' => 'd290ba21',
'phabricator-busy' => '6453c869',
'phabricator-chatlog-css' => '852140ff',
'phabricator-content-source-view-css' => '4b8b05d4',
'phabricator-core-css' => '40151074',
'phabricator-countdown-css' => '86b7b0a0',
'phabricator-crumbs-view-css' => '6a23399c',
'phabricator-dashboard-css' => '2b41640b',
'phabricator-drag-and-drop-file-upload' => 'ae6abfba',
'phabricator-draggable-list' => '1681c4d4',
'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' => '0207239c',
'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-prefab' => '41ed7994',
'phabricator-profile-css' => '33e6f703',
'phabricator-project-tag-css' => '095c9404',
'phabricator-remarkup-css' => '80c3a48c',
'phabricator-search-results-css' => 'f240504c',
'phabricator-settings-css' => 'ea8f5915',
'phabricator-shaped-request' => '7cbe244b',
'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' => 'efb673ac',
'phame-css' => '19ecc703',
'pholio-css' => 'e059f955',
'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' => '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' => '74cfb6a9',
'phui-fontkit-css' => 'de84aa4a',
'phui-form-css' => 'b78ec020',
'phui-form-view-css' => '867463b4',
- 'phui-header-view-css' => '5d245c9c',
- 'phui-icon-view-css' => '00abbd26',
+ 'phui-header-view-css' => '689dbc38',
+ 'phui-icon-view-css' => 'ef701b9b',
'phui-info-panel-css' => '27ea50a1',
'phui-list-view-css' => '65eab261',
'phui-object-box-css' => 'ce92d8ec',
'phui-object-item-list-view-css' => '64b6b266',
'phui-pinboard-view-css' => '874c22f9',
- 'phui-property-list-view-css' => 'af4b381f',
+ 'phui-property-list-view-css' => 'c7cbe471',
'phui-remarkup-preview-css' => '19ad512b',
'phui-spacing-css' => '042804d6',
'phui-status-list-view-css' => '2f562399',
'phui-tag-view-css' => '5d09d99e',
'phui-text-css' => '23e9b4b7',
'phui-timeline-view-css' => '15ff2a9f',
'phui-workboard-view-css' => '2bf82d00',
'phui-workpanel-view-css' => 'fddd97bf',
'phuix-action-list-view' => 'b5c256b8',
- 'phuix-action-view' => '19a0b148',
+ 'phuix-action-view' => '6e8cefa4',
'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' => 'a0f5d4af',
'sprite-apps-large-css' => 'd7ef733e',
'sprite-apps-xlarge-css' => 'db66c878',
'sprite-buttonbar-css' => 'ba1c5738',
'sprite-conpherence-css' => '3b4a0487',
'sprite-docs-css' => '5f65d0da',
'sprite-gradient-css' => 'a10def53',
'sprite-login-css' => '8d10fb28',
'sprite-main-header-css' => '92720ee2',
'sprite-menu-css' => '8da53882',
'sprite-minicons-css' => 'df4f76fe',
'sprite-payments-css' => 'cc085d44',
'sprite-projects-css' => '7578fa56',
'sprite-remarkup-css' => '5c396a57',
- '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',
- ),
'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',
),
'09b15cf1' =>
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',
8 => 'javelin-routable',
),
'0a3f3021' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-stratcom',
2 => 'javelin-workflow',
3 => 'javelin-dom',
4 => 'javelin-router',
),
'0a6c2de6' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-aphlict',
2 => 'javelin-stratcom',
3 => 'javelin-request',
4 => 'javelin-uri',
5 => 'javelin-dom',
6 => 'javelin-json',
7 => 'javelin-router',
8 => 'phabricator-notification',
),
'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',
),
'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',
),
'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',
),
'29274e2b' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
),
'2a2dba85' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-request',
2 => 'javelin-stratcom',
3 => 'javelin-vector',
4 => 'javelin-dom',
5 => 'javelin-uri',
6 => 'javelin-behavior-device',
),
'2b228192' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-dom',
2 => 'javelin-util',
3 => 'javelin-workflow',
4 => 'javelin-json',
),
'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',
),
'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',
),
+ '41ed7994' =>
+ 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',
+ ),
'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',
),
'5afdb2f8' =>
array(
0 => 'javelin-install',
1 => 'javelin-dom',
2 => 'javelin-typeahead-preloaded-source',
3 => 'javelin-util',
),
'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',
),
'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',
),
'66815d9c' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
2 => 'javelin-request',
3 => 'javelin-typeahead-source',
),
'69815cac' =>
array(
0 => 'javelin-install',
),
'6b3dcf44' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
),
'6c2b09a2' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
),
'6d3e1947' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-diffusion-locate-file-source',
2 => 'javelin-dom',
3 => 'javelin-typeahead',
4 => 'javelin-uri',
),
+ '6e8cefa4' =>
+ array(
+ 0 => 'javelin-install',
+ 1 => 'javelin-dom',
+ 2 => 'javelin-util',
+ ),
'71755c79' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-stratcom',
2 => 'javelin-dom',
),
+ '71b4cbcc' =>
+ 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',
+ ),
'7319e029' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-dom',
),
+ '62e18640' =>
+ array(
+ 0 => 'javelin-install',
+ 1 => 'javelin-util',
+ 2 => 'javelin-dom',
+ 3 => 'javelin-typeahead-normalizer',
+ ),
'76f4ebed' =>
array(
0 => 'javelin-install',
1 => 'javelin-reactor',
2 => 'javelin-util',
),
'77b1cf6f' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
),
'7814b593' =>
array(
0 => 'javelin-request',
1 => 'javelin-behavior',
2 => 'javelin-dom',
3 => 'javelin-router',
4 => 'javelin-util',
5 => 'phabricator-busy',
),
'7a68dda3' =>
array(
0 => 'owners-path-editor',
1 => 'javelin-behavior',
),
'7ba325ee' =>
array(
0 => 'javelin-install',
1 => 'javelin-dom',
2 => 'javelin-reactor-dom',
),
'7bad574b' =>
array(
0 => 'javelin-install',
1 => 'javelin-stratcom',
2 => 'javelin-util',
3 => 'javelin-behavior',
4 => 'javelin-json',
5 => 'javelin-dom',
6 => 'javelin-resource',
7 => 'javelin-routable',
),
'7c273581' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-stratcom',
2 => 'javelin-dom',
),
'7cbe244b' =>
array(
0 => 'javelin-install',
1 => 'javelin-util',
2 => 'javelin-request',
3 => 'javelin-router',
),
'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',
),
'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',
),
'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',
),
'b3e7d692' =>
array(
0 => 'javelin-install',
),
'b3ec3cfc' =>
array(
0 => 'javelin-install',
),
'b4c30592' =>
array(
0 => 'javelin-install',
1 => 'javelin-reactor',
2 => 'javelin-util',
3 => 'javelin-reactor-node-calmer',
),
'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',
- ),
'bd0aedcd' =>
array(
0 => 'javelin-install',
1 => 'javelin-event',
),
'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',
),
'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',
),
'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',
),
'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',
),
'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',
),
+ 'dfd45180' =>
+ 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',
+ ),
'dfdf9f34' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-workflow',
2 => 'javelin-util',
3 => 'javelin-dom',
4 => 'javelin-stratcom',
5 => 'javelin-behavior-device',
6 => 'javelin-vector',
7 => 'javelin-router',
8 => 'phabricator-tooltip',
),
'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',
),
'e6f67523' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-dom',
2 => 'javelin-request',
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',
),
'f1375ea5' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-dom',
2 => 'javelin-workflow',
),
'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',
),
'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',
),
'fa187a68' =>
array(
0 => 'javelin-behavior',
1 => 'javelin-dom',
2 => 'javelin-util',
3 => 'javelin-stratcom',
4 => 'javelin-workflow',
5 => 'phabricator-draggable-list',
),
'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',
),
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-remarkup-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',
+ 23 => 'phabricator-main-menu-view',
+ 24 => 'phabricator-notification-css',
+ 25 => 'phabricator-notification-menu-css',
+ 26 => 'lightbox-attachment-css',
+ 27 => 'phui-header-view-css',
+ 28 => 'phabricator-filetree-view-css',
+ 29 => 'phabricator-nav-view-css',
+ 30 => 'phabricator-side-menu-view-css',
+ 31 => 'phabricator-crumbs-view-css',
+ 32 => 'phui-object-item-list-view-css',
+ 33 => 'global-drag-and-drop-css',
+ 34 => 'phui-spacing-css',
+ 35 => 'phui-form-css',
+ 36 => 'phui-icon-view-css',
+ 37 => 'phabricator-application-launch-view-css',
+ 38 => 'phabricator-action-list-view-css',
+ 39 => 'phui-property-list-view-css',
+ 40 => 'phui-tag-view-css',
+ 41 => '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 => '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/resources/celerity/packages.php b/resources/celerity/packages.php
index 54872d07e3..bead57c355 100644
--- a/resources/celerity/packages.php
+++ b/resources/celerity/packages.php
@@ -1,178 +1,177 @@
<?php
return array(
'javelin.pkg.js' => array(
'javelin-util',
'javelin-install',
'javelin-event',
'javelin-stratcom',
'javelin-behavior',
'javelin-resource',
'javelin-request',
'javelin-vector',
'javelin-dom',
'javelin-json',
'javelin-uri',
'javelin-workflow',
'javelin-mask',
'javelin-typeahead',
'javelin-typeahead-normalizer',
'javelin-typeahead-source',
'javelin-typeahead-preloaded-source',
'javelin-typeahead-ondemand-source',
'javelin-tokenizer',
'javelin-history',
),
'core.pkg.js' => array(
'javelin-behavior-aphront-basic-tokenizer',
'javelin-behavior-workflow',
'javelin-behavior-aphront-form-disable-on-submit',
'phabricator-keyboard-shortcut-manager',
'phabricator-keyboard-shortcut',
'javelin-behavior-phabricator-keyboard-shortcuts',
'javelin-behavior-refresh-csrf',
'javelin-behavior-phabricator-watch-anchor',
'javelin-behavior-phabricator-autofocus',
'phuix-dropdown-menu',
'phuix-action-list-view',
'phuix-action-view',
'phabricator-phtize',
'javelin-behavior-phabricator-oncopy',
'phabricator-tooltip',
'javelin-behavior-phabricator-tooltips',
'phabricator-prefab',
'javelin-behavior-device',
'javelin-behavior-toggle-class',
'javelin-behavior-lightbox-attachments',
'phabricator-busy',
'javelin-aphlict',
'phabricator-notification',
'javelin-behavior-aphlict-listen',
'javelin-behavior-phabricator-search-typeahead',
'javelin-behavior-konami',
'javelin-behavior-aphlict-dropdown',
'javelin-behavior-history-install',
'javelin-behavior-phabricator-gesture',
'javelin-behavior-phabricator-active-nav',
'javelin-behavior-phabricator-nav',
'javelin-behavior-phabricator-remarkup-assist',
'phabricator-textareautils',
'phabricator-file-upload',
'javelin-behavior-global-drag-and-drop',
'javelin-behavior-phabricator-reveal-content',
'phabricator-hovercard',
'javelin-behavior-phabricator-hovercards',
'javelin-color',
'javelin-fx',
),
'core.pkg.css' => array(
'phabricator-core-css',
'phabricator-zindex-css',
'phui-button-css',
'phabricator-standard-page-view',
'aphront-dialog-view-css',
'phui-form-view-css',
'aphront-panel-view-css',
'aphront-table-view-css',
'aphront-tokenizer-control-css',
'aphront-typeahead-control-css',
'aphront-list-filter-view-css',
'phabricator-jump-nav',
'phabricator-remarkup-css',
'syntax-highlighting-css',
'aphront-pager-view-css',
'phabricator-transaction-view-css',
'aphront-tooltip-css',
'phabricator-flag-css',
'aphront-error-view-css',
'sprite-remarkup-css',
'sprite-gradient-css',
'sprite-menu-css',
'sprite-apps-large-css',
- 'sprite-status-css',
'phabricator-main-menu-view',
'phabricator-notification-css',
'phabricator-notification-menu-css',
'lightbox-attachment-css',
'phui-header-view-css',
'phabricator-filetree-view-css',
'phabricator-nav-view-css',
'phabricator-side-menu-view-css',
'phabricator-crumbs-view-css',
'phui-object-item-list-view-css',
'global-drag-and-drop-css',
'phui-spacing-css',
'phui-form-css',
'phui-icon-view-css',
'phabricator-application-launch-view-css',
'phabricator-action-list-view-css',
'phui-property-list-view-css',
'phui-tag-view-css',
'phui-list-view-css',
),
'differential.pkg.css' => array(
'differential-core-view-css',
'differential-changeset-view-css',
'differential-results-table-css',
'differential-revision-history-css',
'differential-revision-list-css',
'differential-table-of-contents-css',
'differential-revision-comment-css',
'differential-revision-add-comment-css',
'phabricator-object-selector-css',
'phabricator-content-source-view-css',
'inline-comment-summary-css',
),
'differential.pkg.js' => array(
'phabricator-drag-and-drop-file-upload',
'phabricator-shaped-request',
'javelin-behavior-differential-feedback-preview',
'javelin-behavior-differential-edit-inline-comments',
'javelin-behavior-differential-populate',
'javelin-behavior-differential-show-more',
'javelin-behavior-differential-diff-radios',
'javelin-behavior-differential-comment-jump',
'javelin-behavior-differential-add-reviewers-and-ccs',
'javelin-behavior-differential-keyboard-navigation',
'javelin-behavior-aphront-drag-and-drop-textarea',
'javelin-behavior-phabricator-object-selector',
'javelin-behavior-repository-crossreference',
'javelin-behavior-load-blame',
'differential-inline-comment-editor',
'javelin-behavior-differential-dropdown-menus',
'javelin-behavior-differential-toggle-files',
'javelin-behavior-differential-user-select',
),
'diffusion.pkg.css' => array(
'diffusion-commit-view-css',
'diffusion-icons-css',
),
'diffusion.pkg.js' => array(
'javelin-behavior-diffusion-pull-lastmodified',
'javelin-behavior-diffusion-commit-graph',
'javelin-behavior-audit-preview',
),
'maniphest.pkg.css' => array(
'maniphest-task-summary-css',
'phabricator-project-tag-css',
),
'maniphest.pkg.js' => array(
'javelin-behavior-maniphest-batch-selector',
'javelin-behavior-maniphest-transaction-controls',
'javelin-behavior-maniphest-transaction-preview',
'javelin-behavior-maniphest-transaction-expand',
'javelin-behavior-maniphest-subpriority-editor',
),
'darkconsole.pkg.js' => array(
'javelin-behavior-dark-console',
'javelin-behavior-error-log',
),
);
diff --git a/resources/sprite/manifest/status.json b/resources/sprite/manifest/status.json
deleted file mode 100644
index 9cfbf11bc3..0000000000
--- a/resources/sprite/manifest/status.json
+++ /dev/null
@@ -1,526 +0,0 @@
-{
- "version" : 1,
- "sprites" : {
- "status-accept" : {
- "name" : "status-accept",
- "rule" : ".status-accept",
- "hash" : "6493498ca9beb344cffa6211fb80cbfd"
- },
- "status-accept-blue" : {
- "name" : "status-accept-blue",
- "rule" : ".status-accept-blue",
- "hash" : "c3bde2e1361bcd7259825ecaf2d4b2ff"
- },
- "status-accept-dark" : {
- "name" : "status-accept-dark",
- "rule" : ".status-accept-dark",
- "hash" : "a2ec73e144ea598be15b8acb63f3c096"
- },
- "status-accept-green" : {
- "name" : "status-accept-green",
- "rule" : ".status-accept-green",
- "hash" : "cf0c2339a111f54adfdcc0de5c18be22"
- },
- "status-accept-red" : {
- "name" : "status-accept-red",
- "rule" : ".status-accept-red",
- "hash" : "1466a3ed72f63971e38e669715cf5b98"
- },
- "status-accept-white" : {
- "name" : "status-accept-white",
- "rule" : ".status-accept-white",
- "hash" : "8ecccf5e2ce6658d8a1e963e4be6f6e9"
- },
- "status-add" : {
- "name" : "status-add",
- "rule" : ".status-add",
- "hash" : "165d43c1451fb9ffd69c36ede87c7875"
- },
- "status-add-blue" : {
- "name" : "status-add-blue",
- "rule" : ".status-add-blue",
- "hash" : "8860efdd8f90eed700ae48595ace6b38"
- },
- "status-add-dark" : {
- "name" : "status-add-dark",
- "rule" : ".status-add-dark",
- "hash" : "38dc8634ccfe6fa30f467e97436e1a30"
- },
- "status-add-green" : {
- "name" : "status-add-green",
- "rule" : ".status-add-green",
- "hash" : "5610cd9924ad6b3461a20dd050ef4866"
- },
- "status-add-red" : {
- "name" : "status-add-red",
- "rule" : ".status-add-red",
- "hash" : "9e0abe2b6e37ef5a1a2522ad01002704"
- },
- "status-add-white" : {
- "name" : "status-add-white",
- "rule" : ".status-add-white",
- "hash" : "1a8ab412f40c569acdc709fb281fefde"
- },
- "status-down" : {
- "name" : "status-down",
- "rule" : ".status-down",
- "hash" : "85d3b2376bbed1b48cb777f07a4e244e"
- },
- "status-down-blue" : {
- "name" : "status-down-blue",
- "rule" : ".status-down-blue",
- "hash" : "25baf216cd311f321656a5f3a327c38c"
- },
- "status-down-dark" : {
- "name" : "status-down-dark",
- "rule" : ".status-down-dark",
- "hash" : "bb82d18b729ac30956200b655eafeeb8"
- },
- "status-down-green" : {
- "name" : "status-down-green",
- "rule" : ".status-down-green",
- "hash" : "c29ad19910664ecc94e0d1fa99a0a6c0"
- },
- "status-down-red" : {
- "name" : "status-down-red",
- "rule" : ".status-down-red",
- "hash" : "644f0d38cad5cc6797fe81ed30b9bc6a"
- },
- "status-down-white" : {
- "name" : "status-down-white",
- "rule" : ".status-down-white",
- "hash" : "5bc0af6641ef545218ecced2d25e9a10"
- },
- "status-info" : {
- "name" : "status-info",
- "rule" : ".status-info",
- "hash" : "3b9d6abe2fb44b0959208632a77d3582"
- },
- "status-info-blue" : {
- "name" : "status-info-blue",
- "rule" : ".status-info-blue",
- "hash" : "2acc8c62d8963bec9ce632de60a4da41"
- },
- "status-info-dark" : {
- "name" : "status-info-dark",
- "rule" : ".status-info-dark",
- "hash" : "d96f44c17e67d7c0c10a400e6ff294f1"
- },
- "status-info-green" : {
- "name" : "status-info-green",
- "rule" : ".status-info-green",
- "hash" : "28fc83a1f5bee4ac39a0dcd52e180818"
- },
- "status-info-red" : {
- "name" : "status-info-red",
- "rule" : ".status-info-red",
- "hash" : "fc26e5509140d8e9a3305a39c44773f0"
- },
- "status-info-white" : {
- "name" : "status-info-white",
- "rule" : ".status-info-white",
- "hash" : "b70025f459685371f8397b61944bef7d"
- },
- "status-left" : {
- "name" : "status-left",
- "rule" : ".status-left",
- "hash" : "4649139ffc7e668b67d6978bbd5cbf15"
- },
- "status-left-blue" : {
- "name" : "status-left-blue",
- "rule" : ".status-left-blue",
- "hash" : "cdec5d2617cb7fcfbfea336881d267f0"
- },
- "status-left-dark" : {
- "name" : "status-left-dark",
- "rule" : ".status-left-dark",
- "hash" : "83b58d1cde130deb01971888ad0bcfc1"
- },
- "status-left-green" : {
- "name" : "status-left-green",
- "rule" : ".status-left-green",
- "hash" : "6b34445f1a034e71432a5823bed1c4d7"
- },
- "status-left-red" : {
- "name" : "status-left-red",
- "rule" : ".status-left-red",
- "hash" : "38ebb75c0fbcf6fe96def6c2ab70b343"
- },
- "status-left-white" : {
- "name" : "status-left-white",
- "rule" : ".status-left-white",
- "hash" : "9e89400271b55590e610188d93671934"
- },
- "status-minus" : {
- "name" : "status-minus",
- "rule" : ".status-minus",
- "hash" : "a232bd27513a71ce8f4cd163d8aa05cf"
- },
- "status-minus-blue" : {
- "name" : "status-minus-blue",
- "rule" : ".status-minus-blue",
- "hash" : "61ef81a9b78b4de4bf6303f8d51c86ef"
- },
- "status-minus-dark" : {
- "name" : "status-minus-dark",
- "rule" : ".status-minus-dark",
- "hash" : "db4ddb69a22c7f6f09669fe3c488c4f0"
- },
- "status-minus-green" : {
- "name" : "status-minus-green",
- "rule" : ".status-minus-green",
- "hash" : "9e5402f65601ced38a967d4e17b80f1c"
- },
- "status-minus-red" : {
- "name" : "status-minus-red",
- "rule" : ".status-minus-red",
- "hash" : "bcaf148bc842e398f08d8c01506bd5b6"
- },
- "status-minus-white" : {
- "name" : "status-minus-white",
- "rule" : ".status-minus-white",
- "hash" : "c5a3771452dda603fbaee87371044f5a"
- },
- "status-oh-closed" : {
- "name" : "status-oh-closed",
- "rule" : ".status-oh-closed",
- "hash" : "fa5f2ef65de3e55c9251aebbed662f7a"
- },
- "status-oh-closed-dark" : {
- "name" : "status-oh-closed-dark",
- "rule" : ".status-oh-closed-dark",
- "hash" : "926d6a4e9530a20cd9cd655b334e4f89"
- },
- "status-oh-ok" : {
- "name" : "status-oh-ok",
- "rule" : ".status-oh-ok",
- "hash" : "0d1a2962da8fa12dd41a11316ba7f2eb"
- },
- "status-oh-ok-dark" : {
- "name" : "status-oh-ok-dark",
- "rule" : ".status-oh-ok-dark",
- "hash" : "2daa23d9b1b6c66daac93625dbd26dbc"
- },
- "status-oh-open" : {
- "name" : "status-oh-open",
- "rule" : ".status-oh-open",
- "hash" : "8d759391597ad3925abf2b4b4aaed537"
- },
- "status-oh-open-green" : {
- "name" : "status-oh-open-green",
- "rule" : ".status-oh-open-green",
- "hash" : "18fbeb777a9c5a7d46e0ba0760d3a557"
- },
- "status-oh-open-red" : {
- "name" : "status-oh-open-red",
- "rule" : ".status-oh-open-red",
- "hash" : "982610ba3d0bad1aaa11dcd3b593adbf"
- },
- "status-open" : {
- "name" : "status-open",
- "rule" : ".status-open",
- "hash" : "5b6b67382052982358d0047f07dd0424"
- },
- "status-open-blue" : {
- "name" : "status-open-blue",
- "rule" : ".status-open-blue",
- "hash" : "9632bb52d5f24941202848c2e3d4488a"
- },
- "status-open-dark" : {
- "name" : "status-open-dark",
- "rule" : ".status-open-dark",
- "hash" : "ca38ff5fc8a327d96cd1bbc23043fbb4"
- },
- "status-open-green" : {
- "name" : "status-open-green",
- "rule" : ".status-open-green",
- "hash" : "b4a2c17594a5301e2bd52a9df71819d3"
- },
- "status-open-red" : {
- "name" : "status-open-red",
- "rule" : ".status-open-red",
- "hash" : "f92b1544978d691da6912f937df54273"
- },
- "status-open-white" : {
- "name" : "status-open-white",
- "rule" : ".status-open-white",
- "hash" : "169dc0e8f36444ea30163181f9c88dc2"
- },
- "status-pl-summary" : {
- "name" : "status-pl-summary",
- "rule" : ".status-pl-summary",
- "hash" : "0abd0eab8617fb88f9b8f4d2f00e17b8"
- },
- "status-pl-testplan" : {
- "name" : "status-pl-testplan",
- "rule" : ".status-pl-testplan",
- "hash" : "03dbb3c53bfddfb553d49c6f27a76765"
- },
- "status-policy-admin" : {
- "name" : "status-policy-admin",
- "rule" : ".status-policy-admin",
- "hash" : "16c86a605a15a7a87f4d706c2122834c"
- },
- "status-policy-admin-white" : {
- "name" : "status-policy-admin-white",
- "rule" : ".status-policy-admin-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-admin",
- "hash" : "4b16ec5170bc30fb688f7e086e61a7f1"
- },
- "status-policy-all" : {
- "name" : "status-policy-all",
- "rule" : ".status-policy-all",
- "hash" : "7e8f9e8019ad7f668e51a097f0554ace"
- },
- "status-policy-all-white" : {
- "name" : "status-policy-all-white",
- "rule" : ".status-policy-all-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-all",
- "hash" : "24ed12bf6f58c21a82be125ace2ff0d0"
- },
- "status-policy-custom" : {
- "name" : "status-policy-custom",
- "rule" : ".status-policy-custom",
- "hash" : "3cf516b1e50412ec95594b9866ab1c39"
- },
- "status-policy-custom-white" : {
- "name" : "status-policy-custom-white",
- "rule" : ".status-policy-custom-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-custom",
- "hash" : "ff8b4cbe21f3b4254f343fffc170ef4b"
- },
- "status-policy-elist" : {
- "name" : "status-policy-elist",
- "rule" : ".status-policy-elist",
- "hash" : "da03d710291f394933260dbf43dbc654"
- },
- "status-policy-elist-white" : {
- "name" : "status-policy-elist-white",
- "rule" : ".status-policy-elist-white",
- "hash" : "57e90e9c91fd640e6a778ddc9a2fa015"
- },
- "status-policy-noone" : {
- "name" : "status-policy-noone",
- "rule" : ".status-policy-noone",
- "hash" : "e3403fb78718660105d86029518cf43c"
- },
- "status-policy-noone-white" : {
- "name" : "status-policy-noone-white",
- "rule" : ".status-policy-noone-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-noone",
- "hash" : "80fb9b153fec4d8136242c5ddc2d8e77"
- },
- "status-policy-project" : {
- "name" : "status-policy-project",
- "rule" : ".status-policy-project",
- "hash" : "2b77235f7057f3b29075d153345eacc6"
- },
- "status-policy-project-white" : {
- "name" : "status-policy-project-white",
- "rule" : ".status-policy-project-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-project",
- "hash" : "ac2b6f19edb8d6c40f0bcb3fd477a067"
- },
- "status-policy-public" : {
- "name" : "status-policy-public",
- "rule" : ".status-policy-public",
- "hash" : "e7959890117091fb185816dbc888dfd2"
- },
- "status-policy-public-white" : {
- "name" : "status-policy-public-white",
- "rule" : ".status-policy-public-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-public",
- "hash" : "cf809ca49eefed5375c2ea081e721971"
- },
- "status-policy-unknown" : {
- "name" : "status-policy-unknown",
- "rule" : ".status-policy-unknown",
- "hash" : "0235fd879547c98ad658fa0375c386b6"
- },
- "status-policy-unknown-white" : {
- "name" : "status-policy-unknown-white",
- "rule" : ".status-policy-unknown-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-unknown",
- "hash" : "98985bfa005672c4b88feaf88cfa72bc"
- },
- "status-policy-user" : {
- "name" : "status-policy-user",
- "rule" : ".status-policy-user",
- "hash" : "6c21aa20866d5b86f074bdcf4f487d40"
- },
- "status-policy-user-white" : {
- "name" : "status-policy-user-white",
- "rule" : ".status-policy-user-white",
- "hash" : "97a569e973df3f1e4fe012adf216ca40"
- },
- "status-question" : {
- "name" : "status-question",
- "rule" : ".status-question",
- "hash" : "f7290c6ba78eb37a6641eecfdc128f08"
- },
- "status-question-blue" : {
- "name" : "status-question-blue",
- "rule" : ".status-question-blue",
- "hash" : "44ebbdbe059ca77ae4dc6a6b98de1ccf"
- },
- "status-question-dark" : {
- "name" : "status-question-dark",
- "rule" : ".status-question-dark",
- "hash" : "5fdd5f2b089f4481a39760a50224d8b2"
- },
- "status-question-green" : {
- "name" : "status-question-green",
- "rule" : ".status-question-green",
- "hash" : "326dfc6c1841410ce0f22d702c872c01"
- },
- "status-question-red" : {
- "name" : "status-question-red",
- "rule" : ".status-question-red",
- "hash" : "18dbec41627f8c047c4e736f84dacb33"
- },
- "status-question-white" : {
- "name" : "status-question-white",
- "rule" : ".status-question-white",
- "hash" : "5e7f546f978d1d0545cad127ea3bcf80"
- },
- "status-reject" : {
- "name" : "status-reject",
- "rule" : ".status-reject",
- "hash" : "288489e716b390c5404969f9979b9ded"
- },
- "status-reject-blue" : {
- "name" : "status-reject-blue",
- "rule" : ".status-reject-blue",
- "hash" : "b0f51db6aa6ee85a24a1f4c13812d7ef"
- },
- "status-reject-dark" : {
- "name" : "status-reject-dark",
- "rule" : ".status-reject-dark",
- "hash" : "9b28c36f6cbd6d5d5731b971193a151e"
- },
- "status-reject-green" : {
- "name" : "status-reject-green",
- "rule" : ".status-reject-green",
- "hash" : "fc171843df97bcdc6e4679682b3b31e4"
- },
- "status-reject-red" : {
- "name" : "status-reject-red",
- "rule" : ".status-reject-red",
- "hash" : "6de0dd95a92d33bda228aaa9ba6deee5"
- },
- "status-reject-white" : {
- "name" : "status-reject-white",
- "rule" : ".status-reject-white",
- "hash" : "e709a3fb3081a395900deaef0591066c"
- },
- "status-right" : {
- "name" : "status-right",
- "rule" : ".status-right",
- "hash" : "cd61a821b88b7c76a43d7f405d54b6cc"
- },
- "status-right-blue" : {
- "name" : "status-right-blue",
- "rule" : ".status-right-blue",
- "hash" : "ca1cae1d93486785ec50458ba3b19082"
- },
- "status-right-dark" : {
- "name" : "status-right-dark",
- "rule" : ".status-right-dark",
- "hash" : "fb6600fd1775a8a4fb85709dc4f6c28c"
- },
- "status-right-green" : {
- "name" : "status-right-green",
- "rule" : ".status-right-green",
- "hash" : "9a52218e6c6d3968a05eb51865ed3cba"
- },
- "status-right-red" : {
- "name" : "status-right-red",
- "rule" : ".status-right-red",
- "hash" : "06bd9747ce4cc87282b2fb207c525f0c"
- },
- "status-right-white" : {
- "name" : "status-right-white",
- "rule" : ".status-right-white",
- "hash" : "be2ffb65a7799cd9a5e00c2334e378b2"
- },
- "status-time-green" : {
- "name" : "status-time-green",
- "rule" : ".status-time-green",
- "hash" : "5cb4771e10aaf79ac490bc93bd029d8f"
- },
- "status-time-orange" : {
- "name" : "status-time-orange",
- "rule" : ".status-time-orange",
- "hash" : "aa48043beff2c8576402dbccbe4ad3e2"
- },
- "status-time-red" : {
- "name" : "status-time-red",
- "rule" : ".status-time-red",
- "hash" : "e4dbf14f1ac16338b5e01aa04f2e267e"
- },
- "status-time-yellow" : {
- "name" : "status-time-yellow",
- "rule" : ".status-time-yellow",
- "hash" : "79756bcf7f2401d7e3a97ff03b981dcb"
- },
- "status-up" : {
- "name" : "status-up",
- "rule" : ".status-up",
- "hash" : "d42ac0a3f7bbae3bf57478f533ae88f4"
- },
- "status-up-blue" : {
- "name" : "status-up-blue",
- "rule" : ".status-up-blue",
- "hash" : "44fc24b3646e29c949b639157c315140"
- },
- "status-up-dark" : {
- "name" : "status-up-dark",
- "rule" : ".status-up-dark",
- "hash" : "459ed916291bfa905676ae0818bb2e1b"
- },
- "status-up-green" : {
- "name" : "status-up-green",
- "rule" : ".status-up-green",
- "hash" : "6a682e48fc2f240b19bd175be52c9256"
- },
- "status-up-red" : {
- "name" : "status-up-red",
- "rule" : ".status-up-red",
- "hash" : "0e38f6282e542470ecb68e55fad7eb76"
- },
- "status-up-white" : {
- "name" : "status-up-white",
- "rule" : ".status-up-white",
- "hash" : "ce80e291bc905b2692ad9f3ece7cf206"
- },
- "status-warning" : {
- "name" : "status-warning",
- "rule" : ".status-warning",
- "hash" : "425a02c06f9590e9f7c078badf832d0c"
- },
- "status-warning-blue" : {
- "name" : "status-warning-blue",
- "rule" : ".status-warning-blue",
- "hash" : "93f5e066a01a874adc2c120cca4bd1fc"
- },
- "status-warning-dark" : {
- "name" : "status-warning-dark",
- "rule" : ".status-warning-dark",
- "hash" : "273a519299d7063710452d21c0bc6406"
- },
- "status-warning-green" : {
- "name" : "status-warning-green",
- "rule" : ".status-warning-green",
- "hash" : "991514e5b75509b27fd68d21755b9fa6"
- },
- "status-warning-red" : {
- "name" : "status-warning-red",
- "rule" : ".status-warning-red",
- "hash" : "b15f61f314cbda5486d3aa21990153ae"
- },
- "status-warning-white" : {
- "name" : "status-warning-white",
- "rule" : ".status-warning-white",
- "hash" : "62ff8f6bf696e58f71eb4e1c6fe9b2e1"
- }
- },
- "scales" : [
- 1,
- 2
- ],
- "header" : "\/**\n * @provides sprite-status-css\n * @generated\n *\/\n\n.sprite-status {\n background-image: url(\/rsrc\/image\/sprite-status.png);\n background-repeat: no-repeat;\n}\n\n@media\nonly screen and (min-device-pixel-ratio: 1.5),\nonly screen and (-webkit-min-device-pixel-ratio: 1.5) {\n .sprite-status {\n background-image: url(\/rsrc\/image\/sprite-status-X2.png);\n background-size: {X}px {Y}px;\n }\n}\n",
- "type" : "standard"
-}
diff --git a/resources/sprite/status_1x/accept-blue.png b/resources/sprite/status_1x/accept-blue.png
deleted file mode 100644
index c5aaaee5e7..0000000000
Binary files a/resources/sprite/status_1x/accept-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-dark.png b/resources/sprite/status_1x/accept-dark.png
deleted file mode 100644
index d9da80853e..0000000000
Binary files a/resources/sprite/status_1x/accept-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-green.png b/resources/sprite/status_1x/accept-green.png
deleted file mode 100644
index bc77971ab0..0000000000
Binary files a/resources/sprite/status_1x/accept-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-red.png b/resources/sprite/status_1x/accept-red.png
deleted file mode 100644
index c9ffd1fbf9..0000000000
Binary files a/resources/sprite/status_1x/accept-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept-white.png b/resources/sprite/status_1x/accept-white.png
deleted file mode 100644
index baf7373e55..0000000000
Binary files a/resources/sprite/status_1x/accept-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/accept.png b/resources/sprite/status_1x/accept.png
deleted file mode 100644
index d6b555762c..0000000000
Binary files a/resources/sprite/status_1x/accept.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-blue.png b/resources/sprite/status_1x/add-blue.png
deleted file mode 100644
index f71e265f56..0000000000
Binary files a/resources/sprite/status_1x/add-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-dark.png b/resources/sprite/status_1x/add-dark.png
deleted file mode 100644
index 8a1d1125b0..0000000000
Binary files a/resources/sprite/status_1x/add-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-green.png b/resources/sprite/status_1x/add-green.png
deleted file mode 100644
index 423d9914a0..0000000000
Binary files a/resources/sprite/status_1x/add-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-red.png b/resources/sprite/status_1x/add-red.png
deleted file mode 100644
index 6ba9509074..0000000000
Binary files a/resources/sprite/status_1x/add-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add-white.png b/resources/sprite/status_1x/add-white.png
deleted file mode 100644
index 00907c2434..0000000000
Binary files a/resources/sprite/status_1x/add-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/add.png b/resources/sprite/status_1x/add.png
deleted file mode 100644
index 1aabe0fdc7..0000000000
Binary files a/resources/sprite/status_1x/add.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-blue.png b/resources/sprite/status_1x/down-blue.png
deleted file mode 100644
index 7694510ab2..0000000000
Binary files a/resources/sprite/status_1x/down-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-dark.png b/resources/sprite/status_1x/down-dark.png
deleted file mode 100644
index 0266a88261..0000000000
Binary files a/resources/sprite/status_1x/down-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-green.png b/resources/sprite/status_1x/down-green.png
deleted file mode 100644
index 44eee1688b..0000000000
Binary files a/resources/sprite/status_1x/down-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-red.png b/resources/sprite/status_1x/down-red.png
deleted file mode 100644
index 019699cc9e..0000000000
Binary files a/resources/sprite/status_1x/down-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down-white.png b/resources/sprite/status_1x/down-white.png
deleted file mode 100644
index 8aa0498bfc..0000000000
Binary files a/resources/sprite/status_1x/down-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/down.png b/resources/sprite/status_1x/down.png
deleted file mode 100644
index 468758b917..0000000000
Binary files a/resources/sprite/status_1x/down.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-blue.png b/resources/sprite/status_1x/info-blue.png
deleted file mode 100644
index c8d614ffde..0000000000
Binary files a/resources/sprite/status_1x/info-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-dark.png b/resources/sprite/status_1x/info-dark.png
deleted file mode 100644
index d4a73ec2d4..0000000000
Binary files a/resources/sprite/status_1x/info-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-green.png b/resources/sprite/status_1x/info-green.png
deleted file mode 100644
index 8ae658a401..0000000000
Binary files a/resources/sprite/status_1x/info-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-red.png b/resources/sprite/status_1x/info-red.png
deleted file mode 100644
index 61125d0eab..0000000000
Binary files a/resources/sprite/status_1x/info-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info-white.png b/resources/sprite/status_1x/info-white.png
deleted file mode 100644
index e3e3a05b76..0000000000
Binary files a/resources/sprite/status_1x/info-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/info.png b/resources/sprite/status_1x/info.png
deleted file mode 100644
index 74f979b30b..0000000000
Binary files a/resources/sprite/status_1x/info.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-blue.png b/resources/sprite/status_1x/left-blue.png
deleted file mode 100644
index c3c3fe15d3..0000000000
Binary files a/resources/sprite/status_1x/left-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-dark.png b/resources/sprite/status_1x/left-dark.png
deleted file mode 100644
index 445d678c7d..0000000000
Binary files a/resources/sprite/status_1x/left-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-green.png b/resources/sprite/status_1x/left-green.png
deleted file mode 100644
index 389f94a260..0000000000
Binary files a/resources/sprite/status_1x/left-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-red.png b/resources/sprite/status_1x/left-red.png
deleted file mode 100644
index d9556fed8d..0000000000
Binary files a/resources/sprite/status_1x/left-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left-white.png b/resources/sprite/status_1x/left-white.png
deleted file mode 100644
index c02ae7a57b..0000000000
Binary files a/resources/sprite/status_1x/left-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/left.png b/resources/sprite/status_1x/left.png
deleted file mode 100644
index 70d914dc2c..0000000000
Binary files a/resources/sprite/status_1x/left.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-blue.png b/resources/sprite/status_1x/minus-blue.png
deleted file mode 100644
index 7c45c6a42c..0000000000
Binary files a/resources/sprite/status_1x/minus-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-dark.png b/resources/sprite/status_1x/minus-dark.png
deleted file mode 100644
index e23ec95946..0000000000
Binary files a/resources/sprite/status_1x/minus-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-green.png b/resources/sprite/status_1x/minus-green.png
deleted file mode 100644
index 9245c2c0b9..0000000000
Binary files a/resources/sprite/status_1x/minus-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-red.png b/resources/sprite/status_1x/minus-red.png
deleted file mode 100644
index 0b2838ae98..0000000000
Binary files a/resources/sprite/status_1x/minus-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus-white.png b/resources/sprite/status_1x/minus-white.png
deleted file mode 100644
index f806c33e7a..0000000000
Binary files a/resources/sprite/status_1x/minus-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/minus.png b/resources/sprite/status_1x/minus.png
deleted file mode 100644
index 7494e59e41..0000000000
Binary files a/resources/sprite/status_1x/minus.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-closed-dark.png b/resources/sprite/status_1x/oh-closed-dark.png
deleted file mode 100644
index a0c94e1ccc..0000000000
Binary files a/resources/sprite/status_1x/oh-closed-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-closed.png b/resources/sprite/status_1x/oh-closed.png
deleted file mode 100644
index 830c8c354b..0000000000
Binary files a/resources/sprite/status_1x/oh-closed.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-ok-dark.png b/resources/sprite/status_1x/oh-ok-dark.png
deleted file mode 100644
index ec25388c21..0000000000
Binary files a/resources/sprite/status_1x/oh-ok-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-ok.png b/resources/sprite/status_1x/oh-ok.png
deleted file mode 100644
index d2ff96e2b6..0000000000
Binary files a/resources/sprite/status_1x/oh-ok.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-open-green.png b/resources/sprite/status_1x/oh-open-green.png
deleted file mode 100644
index 7b7c57a9fb..0000000000
Binary files a/resources/sprite/status_1x/oh-open-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-open-red.png b/resources/sprite/status_1x/oh-open-red.png
deleted file mode 100644
index 7bfa8ea0bb..0000000000
Binary files a/resources/sprite/status_1x/oh-open-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/oh-open.png b/resources/sprite/status_1x/oh-open.png
deleted file mode 100644
index 8422beb768..0000000000
Binary files a/resources/sprite/status_1x/oh-open.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-blue.png b/resources/sprite/status_1x/open-blue.png
deleted file mode 100644
index 0dc1658f0c..0000000000
Binary files a/resources/sprite/status_1x/open-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-dark.png b/resources/sprite/status_1x/open-dark.png
deleted file mode 100644
index 6a03b21ecc..0000000000
Binary files a/resources/sprite/status_1x/open-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-green.png b/resources/sprite/status_1x/open-green.png
deleted file mode 100644
index a9e09e71cc..0000000000
Binary files a/resources/sprite/status_1x/open-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-red.png b/resources/sprite/status_1x/open-red.png
deleted file mode 100644
index c45f11f247..0000000000
Binary files a/resources/sprite/status_1x/open-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open-white.png b/resources/sprite/status_1x/open-white.png
deleted file mode 100644
index 8bd1d357b0..0000000000
Binary files a/resources/sprite/status_1x/open-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/open.png b/resources/sprite/status_1x/open.png
deleted file mode 100644
index 1dfc7e1515..0000000000
Binary files a/resources/sprite/status_1x/open.png and /dev/null differ
diff --git a/resources/sprite/status_1x/pl-summary.png b/resources/sprite/status_1x/pl-summary.png
deleted file mode 100644
index b2274ae85e..0000000000
Binary files a/resources/sprite/status_1x/pl-summary.png and /dev/null differ
diff --git a/resources/sprite/status_1x/pl-testplan.png b/resources/sprite/status_1x/pl-testplan.png
deleted file mode 100644
index 22ad223bef..0000000000
Binary files a/resources/sprite/status_1x/pl-testplan.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-admin-white.png b/resources/sprite/status_1x/policy-admin-white.png
deleted file mode 100644
index 48b9624c0d..0000000000
Binary files a/resources/sprite/status_1x/policy-admin-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-admin.png b/resources/sprite/status_1x/policy-admin.png
deleted file mode 100644
index fed46ed926..0000000000
Binary files a/resources/sprite/status_1x/policy-admin.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-all-white.png b/resources/sprite/status_1x/policy-all-white.png
deleted file mode 100644
index e84b9efebc..0000000000
Binary files a/resources/sprite/status_1x/policy-all-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-all.png b/resources/sprite/status_1x/policy-all.png
deleted file mode 100644
index 6a569525b7..0000000000
Binary files a/resources/sprite/status_1x/policy-all.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-custom-white.png b/resources/sprite/status_1x/policy-custom-white.png
deleted file mode 100644
index 909c69ce86..0000000000
Binary files a/resources/sprite/status_1x/policy-custom-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-custom.png b/resources/sprite/status_1x/policy-custom.png
deleted file mode 100644
index bc707edafe..0000000000
Binary files a/resources/sprite/status_1x/policy-custom.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-elist-white.png b/resources/sprite/status_1x/policy-elist-white.png
deleted file mode 100644
index 1d28e6c28f..0000000000
Binary files a/resources/sprite/status_1x/policy-elist-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-elist.png b/resources/sprite/status_1x/policy-elist.png
deleted file mode 100644
index 384482fc79..0000000000
Binary files a/resources/sprite/status_1x/policy-elist.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-noone-white.png b/resources/sprite/status_1x/policy-noone-white.png
deleted file mode 100644
index 8e89ad3c46..0000000000
Binary files a/resources/sprite/status_1x/policy-noone-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-noone.png b/resources/sprite/status_1x/policy-noone.png
deleted file mode 100644
index e018714976..0000000000
Binary files a/resources/sprite/status_1x/policy-noone.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-project-white.png b/resources/sprite/status_1x/policy-project-white.png
deleted file mode 100644
index 4e39cc3ab5..0000000000
Binary files a/resources/sprite/status_1x/policy-project-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-project.png b/resources/sprite/status_1x/policy-project.png
deleted file mode 100644
index 8d9582d3d0..0000000000
Binary files a/resources/sprite/status_1x/policy-project.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-public-white.png b/resources/sprite/status_1x/policy-public-white.png
deleted file mode 100644
index 5bc2f31947..0000000000
Binary files a/resources/sprite/status_1x/policy-public-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-public.png b/resources/sprite/status_1x/policy-public.png
deleted file mode 100644
index c54f47a7cd..0000000000
Binary files a/resources/sprite/status_1x/policy-public.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-unknown-white.png b/resources/sprite/status_1x/policy-unknown-white.png
deleted file mode 100644
index 28398a7b47..0000000000
Binary files a/resources/sprite/status_1x/policy-unknown-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-unknown.png b/resources/sprite/status_1x/policy-unknown.png
deleted file mode 100644
index b415a2466f..0000000000
Binary files a/resources/sprite/status_1x/policy-unknown.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-user-white.png b/resources/sprite/status_1x/policy-user-white.png
deleted file mode 100644
index 2b4ae43457..0000000000
Binary files a/resources/sprite/status_1x/policy-user-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/policy-user.png b/resources/sprite/status_1x/policy-user.png
deleted file mode 100644
index 1a33858470..0000000000
Binary files a/resources/sprite/status_1x/policy-user.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-blue.png b/resources/sprite/status_1x/question-blue.png
deleted file mode 100644
index bc2fe4a772..0000000000
Binary files a/resources/sprite/status_1x/question-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-dark.png b/resources/sprite/status_1x/question-dark.png
deleted file mode 100644
index 5a77cebe3f..0000000000
Binary files a/resources/sprite/status_1x/question-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-green.png b/resources/sprite/status_1x/question-green.png
deleted file mode 100644
index 9f34c1841c..0000000000
Binary files a/resources/sprite/status_1x/question-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-red.png b/resources/sprite/status_1x/question-red.png
deleted file mode 100644
index ff11aae3cc..0000000000
Binary files a/resources/sprite/status_1x/question-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question-white.png b/resources/sprite/status_1x/question-white.png
deleted file mode 100644
index 216e3a5886..0000000000
Binary files a/resources/sprite/status_1x/question-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/question.png b/resources/sprite/status_1x/question.png
deleted file mode 100644
index f0f9af275f..0000000000
Binary files a/resources/sprite/status_1x/question.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-blue.png b/resources/sprite/status_1x/reject-blue.png
deleted file mode 100644
index f897017977..0000000000
Binary files a/resources/sprite/status_1x/reject-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-dark.png b/resources/sprite/status_1x/reject-dark.png
deleted file mode 100644
index ad504aa387..0000000000
Binary files a/resources/sprite/status_1x/reject-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-green.png b/resources/sprite/status_1x/reject-green.png
deleted file mode 100644
index ad76e62db2..0000000000
Binary files a/resources/sprite/status_1x/reject-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-red.png b/resources/sprite/status_1x/reject-red.png
deleted file mode 100644
index 9105004062..0000000000
Binary files a/resources/sprite/status_1x/reject-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject-white.png b/resources/sprite/status_1x/reject-white.png
deleted file mode 100644
index 0caf704258..0000000000
Binary files a/resources/sprite/status_1x/reject-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/reject.png b/resources/sprite/status_1x/reject.png
deleted file mode 100644
index 6c534a58dc..0000000000
Binary files a/resources/sprite/status_1x/reject.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-blue.png b/resources/sprite/status_1x/right-blue.png
deleted file mode 100644
index 71529b7504..0000000000
Binary files a/resources/sprite/status_1x/right-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-dark.png b/resources/sprite/status_1x/right-dark.png
deleted file mode 100644
index bb13cf6512..0000000000
Binary files a/resources/sprite/status_1x/right-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-green.png b/resources/sprite/status_1x/right-green.png
deleted file mode 100644
index fe6112d53f..0000000000
Binary files a/resources/sprite/status_1x/right-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-red.png b/resources/sprite/status_1x/right-red.png
deleted file mode 100644
index 7deab4df2d..0000000000
Binary files a/resources/sprite/status_1x/right-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right-white.png b/resources/sprite/status_1x/right-white.png
deleted file mode 100644
index 78e1037014..0000000000
Binary files a/resources/sprite/status_1x/right-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/right.png b/resources/sprite/status_1x/right.png
deleted file mode 100644
index d1ad9f2a4f..0000000000
Binary files a/resources/sprite/status_1x/right.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-green.png b/resources/sprite/status_1x/time-green.png
deleted file mode 100644
index d514ed6853..0000000000
Binary files a/resources/sprite/status_1x/time-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-orange.png b/resources/sprite/status_1x/time-orange.png
deleted file mode 100644
index 1acad2715c..0000000000
Binary files a/resources/sprite/status_1x/time-orange.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-red.png b/resources/sprite/status_1x/time-red.png
deleted file mode 100644
index 5271c9a2af..0000000000
Binary files a/resources/sprite/status_1x/time-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/time-yellow.png b/resources/sprite/status_1x/time-yellow.png
deleted file mode 100644
index 0ed680ede4..0000000000
Binary files a/resources/sprite/status_1x/time-yellow.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-blue.png b/resources/sprite/status_1x/up-blue.png
deleted file mode 100644
index 5b9ad0bc76..0000000000
Binary files a/resources/sprite/status_1x/up-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-dark.png b/resources/sprite/status_1x/up-dark.png
deleted file mode 100644
index 05e7fd15c5..0000000000
Binary files a/resources/sprite/status_1x/up-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-green.png b/resources/sprite/status_1x/up-green.png
deleted file mode 100644
index c66ba2fd12..0000000000
Binary files a/resources/sprite/status_1x/up-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-red.png b/resources/sprite/status_1x/up-red.png
deleted file mode 100644
index ed73bffcd8..0000000000
Binary files a/resources/sprite/status_1x/up-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up-white.png b/resources/sprite/status_1x/up-white.png
deleted file mode 100644
index d19bbf90f5..0000000000
Binary files a/resources/sprite/status_1x/up-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/up.png b/resources/sprite/status_1x/up.png
deleted file mode 100644
index 33d69869c4..0000000000
Binary files a/resources/sprite/status_1x/up.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-blue.png b/resources/sprite/status_1x/warning-blue.png
deleted file mode 100644
index c3cc0625d3..0000000000
Binary files a/resources/sprite/status_1x/warning-blue.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-dark.png b/resources/sprite/status_1x/warning-dark.png
deleted file mode 100644
index 33de2b39ff..0000000000
Binary files a/resources/sprite/status_1x/warning-dark.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-green.png b/resources/sprite/status_1x/warning-green.png
deleted file mode 100644
index df2d007d07..0000000000
Binary files a/resources/sprite/status_1x/warning-green.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-red.png b/resources/sprite/status_1x/warning-red.png
deleted file mode 100644
index eefd44cc42..0000000000
Binary files a/resources/sprite/status_1x/warning-red.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning-white.png b/resources/sprite/status_1x/warning-white.png
deleted file mode 100644
index ce515d61e4..0000000000
Binary files a/resources/sprite/status_1x/warning-white.png and /dev/null differ
diff --git a/resources/sprite/status_1x/warning.png b/resources/sprite/status_1x/warning.png
deleted file mode 100644
index 755960355d..0000000000
Binary files a/resources/sprite/status_1x/warning.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-blue.png b/resources/sprite/status_2x/accept-blue.png
deleted file mode 100644
index 6b1586deb4..0000000000
Binary files a/resources/sprite/status_2x/accept-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-dark.png b/resources/sprite/status_2x/accept-dark.png
deleted file mode 100644
index 587d9af04d..0000000000
Binary files a/resources/sprite/status_2x/accept-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-green.png b/resources/sprite/status_2x/accept-green.png
deleted file mode 100644
index 9f681f26bc..0000000000
Binary files a/resources/sprite/status_2x/accept-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-red.png b/resources/sprite/status_2x/accept-red.png
deleted file mode 100644
index 509273d5bb..0000000000
Binary files a/resources/sprite/status_2x/accept-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept-white.png b/resources/sprite/status_2x/accept-white.png
deleted file mode 100644
index 39efb34925..0000000000
Binary files a/resources/sprite/status_2x/accept-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/accept.png b/resources/sprite/status_2x/accept.png
deleted file mode 100644
index 3afd5e68da..0000000000
Binary files a/resources/sprite/status_2x/accept.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-blue.png b/resources/sprite/status_2x/add-blue.png
deleted file mode 100644
index 0edbb5db84..0000000000
Binary files a/resources/sprite/status_2x/add-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-dark.png b/resources/sprite/status_2x/add-dark.png
deleted file mode 100644
index e3533fa0f7..0000000000
Binary files a/resources/sprite/status_2x/add-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-green.png b/resources/sprite/status_2x/add-green.png
deleted file mode 100644
index 8eb93e897e..0000000000
Binary files a/resources/sprite/status_2x/add-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-red.png b/resources/sprite/status_2x/add-red.png
deleted file mode 100644
index e2ee8ba48d..0000000000
Binary files a/resources/sprite/status_2x/add-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add-white.png b/resources/sprite/status_2x/add-white.png
deleted file mode 100644
index 71ad766187..0000000000
Binary files a/resources/sprite/status_2x/add-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/add.png b/resources/sprite/status_2x/add.png
deleted file mode 100644
index 75504bbb7d..0000000000
Binary files a/resources/sprite/status_2x/add.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-blue.png b/resources/sprite/status_2x/down-blue.png
deleted file mode 100644
index 185512d5cb..0000000000
Binary files a/resources/sprite/status_2x/down-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-dark.png b/resources/sprite/status_2x/down-dark.png
deleted file mode 100644
index 5e6d2f48fd..0000000000
Binary files a/resources/sprite/status_2x/down-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-green.png b/resources/sprite/status_2x/down-green.png
deleted file mode 100644
index 99a5ad61b3..0000000000
Binary files a/resources/sprite/status_2x/down-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-red.png b/resources/sprite/status_2x/down-red.png
deleted file mode 100644
index fc36c023dd..0000000000
Binary files a/resources/sprite/status_2x/down-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down-white.png b/resources/sprite/status_2x/down-white.png
deleted file mode 100644
index 9a419a3a21..0000000000
Binary files a/resources/sprite/status_2x/down-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/down.png b/resources/sprite/status_2x/down.png
deleted file mode 100644
index b0b6bcfd55..0000000000
Binary files a/resources/sprite/status_2x/down.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-blue.png b/resources/sprite/status_2x/info-blue.png
deleted file mode 100644
index 92933a4eb7..0000000000
Binary files a/resources/sprite/status_2x/info-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-dark.png b/resources/sprite/status_2x/info-dark.png
deleted file mode 100644
index ab82a1951a..0000000000
Binary files a/resources/sprite/status_2x/info-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-green.png b/resources/sprite/status_2x/info-green.png
deleted file mode 100644
index 5913448a32..0000000000
Binary files a/resources/sprite/status_2x/info-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-red.png b/resources/sprite/status_2x/info-red.png
deleted file mode 100644
index 3571889bbe..0000000000
Binary files a/resources/sprite/status_2x/info-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info-white.png b/resources/sprite/status_2x/info-white.png
deleted file mode 100644
index 8ef1aa7c09..0000000000
Binary files a/resources/sprite/status_2x/info-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/info.png b/resources/sprite/status_2x/info.png
deleted file mode 100644
index fc5f921a6a..0000000000
Binary files a/resources/sprite/status_2x/info.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-blue.png b/resources/sprite/status_2x/left-blue.png
deleted file mode 100644
index 297f594d89..0000000000
Binary files a/resources/sprite/status_2x/left-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-dark.png b/resources/sprite/status_2x/left-dark.png
deleted file mode 100644
index 34aef33b96..0000000000
Binary files a/resources/sprite/status_2x/left-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-green.png b/resources/sprite/status_2x/left-green.png
deleted file mode 100644
index 54c91f81b5..0000000000
Binary files a/resources/sprite/status_2x/left-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-red.png b/resources/sprite/status_2x/left-red.png
deleted file mode 100644
index ba9aa0e110..0000000000
Binary files a/resources/sprite/status_2x/left-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left-white.png b/resources/sprite/status_2x/left-white.png
deleted file mode 100644
index a102b2f88d..0000000000
Binary files a/resources/sprite/status_2x/left-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/left.png b/resources/sprite/status_2x/left.png
deleted file mode 100644
index 871efb2c64..0000000000
Binary files a/resources/sprite/status_2x/left.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-blue.png b/resources/sprite/status_2x/minus-blue.png
deleted file mode 100644
index 317ffed54f..0000000000
Binary files a/resources/sprite/status_2x/minus-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-dark.png b/resources/sprite/status_2x/minus-dark.png
deleted file mode 100644
index f72b136956..0000000000
Binary files a/resources/sprite/status_2x/minus-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-green.png b/resources/sprite/status_2x/minus-green.png
deleted file mode 100644
index ccb0efbb4a..0000000000
Binary files a/resources/sprite/status_2x/minus-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-red.png b/resources/sprite/status_2x/minus-red.png
deleted file mode 100644
index f5e10318c6..0000000000
Binary files a/resources/sprite/status_2x/minus-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus-white.png b/resources/sprite/status_2x/minus-white.png
deleted file mode 100644
index ebcf13044e..0000000000
Binary files a/resources/sprite/status_2x/minus-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/minus.png b/resources/sprite/status_2x/minus.png
deleted file mode 100644
index 907cf18277..0000000000
Binary files a/resources/sprite/status_2x/minus.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-closed-dark.png b/resources/sprite/status_2x/oh-closed-dark.png
deleted file mode 100644
index a88885ccff..0000000000
Binary files a/resources/sprite/status_2x/oh-closed-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-closed.png b/resources/sprite/status_2x/oh-closed.png
deleted file mode 100644
index 7c57c4d1e8..0000000000
Binary files a/resources/sprite/status_2x/oh-closed.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-ok-dark.png b/resources/sprite/status_2x/oh-ok-dark.png
deleted file mode 100644
index f7437a7e53..0000000000
Binary files a/resources/sprite/status_2x/oh-ok-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-ok.png b/resources/sprite/status_2x/oh-ok.png
deleted file mode 100644
index 01d3a24747..0000000000
Binary files a/resources/sprite/status_2x/oh-ok.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-open-green.png b/resources/sprite/status_2x/oh-open-green.png
deleted file mode 100644
index 2eb2b250a2..0000000000
Binary files a/resources/sprite/status_2x/oh-open-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-open-red.png b/resources/sprite/status_2x/oh-open-red.png
deleted file mode 100644
index 198a3ff18a..0000000000
Binary files a/resources/sprite/status_2x/oh-open-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/oh-open.png b/resources/sprite/status_2x/oh-open.png
deleted file mode 100644
index 50786bcd21..0000000000
Binary files a/resources/sprite/status_2x/oh-open.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-blue.png b/resources/sprite/status_2x/open-blue.png
deleted file mode 100644
index 5a68c026f4..0000000000
Binary files a/resources/sprite/status_2x/open-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-dark.png b/resources/sprite/status_2x/open-dark.png
deleted file mode 100644
index 2f06ccf4e9..0000000000
Binary files a/resources/sprite/status_2x/open-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-green.png b/resources/sprite/status_2x/open-green.png
deleted file mode 100644
index 4e90c62d35..0000000000
Binary files a/resources/sprite/status_2x/open-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-red.png b/resources/sprite/status_2x/open-red.png
deleted file mode 100644
index 8c7fe4b8a0..0000000000
Binary files a/resources/sprite/status_2x/open-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open-white.png b/resources/sprite/status_2x/open-white.png
deleted file mode 100644
index de5b7d226c..0000000000
Binary files a/resources/sprite/status_2x/open-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/open.png b/resources/sprite/status_2x/open.png
deleted file mode 100644
index cc2cd21d7f..0000000000
Binary files a/resources/sprite/status_2x/open.png and /dev/null differ
diff --git a/resources/sprite/status_2x/pl-summary.png b/resources/sprite/status_2x/pl-summary.png
deleted file mode 100644
index 0a8e863c88..0000000000
Binary files a/resources/sprite/status_2x/pl-summary.png and /dev/null differ
diff --git a/resources/sprite/status_2x/pl-testplan.png b/resources/sprite/status_2x/pl-testplan.png
deleted file mode 100644
index 3f9613fe5b..0000000000
Binary files a/resources/sprite/status_2x/pl-testplan.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-admin-white.png b/resources/sprite/status_2x/policy-admin-white.png
deleted file mode 100644
index c09d9c305f..0000000000
Binary files a/resources/sprite/status_2x/policy-admin-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-admin.png b/resources/sprite/status_2x/policy-admin.png
deleted file mode 100644
index 8421b277dc..0000000000
Binary files a/resources/sprite/status_2x/policy-admin.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-all-white.png b/resources/sprite/status_2x/policy-all-white.png
deleted file mode 100644
index fe00c57c2a..0000000000
Binary files a/resources/sprite/status_2x/policy-all-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-all.png b/resources/sprite/status_2x/policy-all.png
deleted file mode 100644
index 42053e8528..0000000000
Binary files a/resources/sprite/status_2x/policy-all.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-custom-white.png b/resources/sprite/status_2x/policy-custom-white.png
deleted file mode 100644
index 450137cb61..0000000000
Binary files a/resources/sprite/status_2x/policy-custom-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-custom.png b/resources/sprite/status_2x/policy-custom.png
deleted file mode 100644
index 64a67fe0a8..0000000000
Binary files a/resources/sprite/status_2x/policy-custom.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-elist-white.png b/resources/sprite/status_2x/policy-elist-white.png
deleted file mode 100644
index 852310a56c..0000000000
Binary files a/resources/sprite/status_2x/policy-elist-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-elist.png b/resources/sprite/status_2x/policy-elist.png
deleted file mode 100644
index a1ce7c050f..0000000000
Binary files a/resources/sprite/status_2x/policy-elist.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-noone-white.png b/resources/sprite/status_2x/policy-noone-white.png
deleted file mode 100644
index 219a67bbd3..0000000000
Binary files a/resources/sprite/status_2x/policy-noone-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-noone.png b/resources/sprite/status_2x/policy-noone.png
deleted file mode 100644
index 4b11d3f01f..0000000000
Binary files a/resources/sprite/status_2x/policy-noone.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-project-white.png b/resources/sprite/status_2x/policy-project-white.png
deleted file mode 100644
index 8289755fdb..0000000000
Binary files a/resources/sprite/status_2x/policy-project-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-project.png b/resources/sprite/status_2x/policy-project.png
deleted file mode 100644
index 4d777ca0b0..0000000000
Binary files a/resources/sprite/status_2x/policy-project.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-public-white.png b/resources/sprite/status_2x/policy-public-white.png
deleted file mode 100644
index 719c0fd44f..0000000000
Binary files a/resources/sprite/status_2x/policy-public-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-public.png b/resources/sprite/status_2x/policy-public.png
deleted file mode 100644
index 339c8dbc2a..0000000000
Binary files a/resources/sprite/status_2x/policy-public.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-unknown-white.png b/resources/sprite/status_2x/policy-unknown-white.png
deleted file mode 100644
index a3f73a38d1..0000000000
Binary files a/resources/sprite/status_2x/policy-unknown-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-unknown.png b/resources/sprite/status_2x/policy-unknown.png
deleted file mode 100644
index d6df5f1a1a..0000000000
Binary files a/resources/sprite/status_2x/policy-unknown.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-user-white.png b/resources/sprite/status_2x/policy-user-white.png
deleted file mode 100644
index 913c892356..0000000000
Binary files a/resources/sprite/status_2x/policy-user-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/policy-user.png b/resources/sprite/status_2x/policy-user.png
deleted file mode 100644
index 3d6fcf050b..0000000000
Binary files a/resources/sprite/status_2x/policy-user.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-blue.png b/resources/sprite/status_2x/question-blue.png
deleted file mode 100644
index d9fdd76b7a..0000000000
Binary files a/resources/sprite/status_2x/question-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-dark.png b/resources/sprite/status_2x/question-dark.png
deleted file mode 100644
index c53f443d91..0000000000
Binary files a/resources/sprite/status_2x/question-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-green.png b/resources/sprite/status_2x/question-green.png
deleted file mode 100644
index 5107b89154..0000000000
Binary files a/resources/sprite/status_2x/question-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-red.png b/resources/sprite/status_2x/question-red.png
deleted file mode 100644
index 068a369390..0000000000
Binary files a/resources/sprite/status_2x/question-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question-white.png b/resources/sprite/status_2x/question-white.png
deleted file mode 100644
index c1caf7419f..0000000000
Binary files a/resources/sprite/status_2x/question-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/question.png b/resources/sprite/status_2x/question.png
deleted file mode 100644
index 7e187f357d..0000000000
Binary files a/resources/sprite/status_2x/question.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-blue.png b/resources/sprite/status_2x/reject-blue.png
deleted file mode 100644
index 8789cd9be2..0000000000
Binary files a/resources/sprite/status_2x/reject-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-dark.png b/resources/sprite/status_2x/reject-dark.png
deleted file mode 100644
index c1991c6eb9..0000000000
Binary files a/resources/sprite/status_2x/reject-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-green.png b/resources/sprite/status_2x/reject-green.png
deleted file mode 100644
index 7f49eebad0..0000000000
Binary files a/resources/sprite/status_2x/reject-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-red.png b/resources/sprite/status_2x/reject-red.png
deleted file mode 100644
index e0f29d1bf3..0000000000
Binary files a/resources/sprite/status_2x/reject-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject-white.png b/resources/sprite/status_2x/reject-white.png
deleted file mode 100644
index ff7a314ae5..0000000000
Binary files a/resources/sprite/status_2x/reject-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/reject.png b/resources/sprite/status_2x/reject.png
deleted file mode 100644
index 06a90b023d..0000000000
Binary files a/resources/sprite/status_2x/reject.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-blue.png b/resources/sprite/status_2x/right-blue.png
deleted file mode 100644
index 81be3ae7e9..0000000000
Binary files a/resources/sprite/status_2x/right-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-dark.png b/resources/sprite/status_2x/right-dark.png
deleted file mode 100644
index ae92e97193..0000000000
Binary files a/resources/sprite/status_2x/right-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-green.png b/resources/sprite/status_2x/right-green.png
deleted file mode 100644
index d7290b18d5..0000000000
Binary files a/resources/sprite/status_2x/right-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-red.png b/resources/sprite/status_2x/right-red.png
deleted file mode 100644
index 3f1d48e223..0000000000
Binary files a/resources/sprite/status_2x/right-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right-white.png b/resources/sprite/status_2x/right-white.png
deleted file mode 100644
index 0261cc0784..0000000000
Binary files a/resources/sprite/status_2x/right-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/right.png b/resources/sprite/status_2x/right.png
deleted file mode 100644
index 06190d0d1b..0000000000
Binary files a/resources/sprite/status_2x/right.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-green.png b/resources/sprite/status_2x/time-green.png
deleted file mode 100644
index 65ea095bd3..0000000000
Binary files a/resources/sprite/status_2x/time-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-orange.png b/resources/sprite/status_2x/time-orange.png
deleted file mode 100644
index 14ddd5f45f..0000000000
Binary files a/resources/sprite/status_2x/time-orange.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-red.png b/resources/sprite/status_2x/time-red.png
deleted file mode 100644
index 118dc561f2..0000000000
Binary files a/resources/sprite/status_2x/time-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/time-yellow.png b/resources/sprite/status_2x/time-yellow.png
deleted file mode 100644
index 7735d549bd..0000000000
Binary files a/resources/sprite/status_2x/time-yellow.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-blue.png b/resources/sprite/status_2x/up-blue.png
deleted file mode 100644
index ed96bd604a..0000000000
Binary files a/resources/sprite/status_2x/up-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-dark.png b/resources/sprite/status_2x/up-dark.png
deleted file mode 100644
index 1f43a5a127..0000000000
Binary files a/resources/sprite/status_2x/up-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-green.png b/resources/sprite/status_2x/up-green.png
deleted file mode 100644
index 4406e3496b..0000000000
Binary files a/resources/sprite/status_2x/up-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-red.png b/resources/sprite/status_2x/up-red.png
deleted file mode 100644
index 262c6730ec..0000000000
Binary files a/resources/sprite/status_2x/up-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up-white.png b/resources/sprite/status_2x/up-white.png
deleted file mode 100644
index f59b378c14..0000000000
Binary files a/resources/sprite/status_2x/up-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/up.png b/resources/sprite/status_2x/up.png
deleted file mode 100644
index 24dea011c9..0000000000
Binary files a/resources/sprite/status_2x/up.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-blue.png b/resources/sprite/status_2x/warning-blue.png
deleted file mode 100644
index 5a88becb1e..0000000000
Binary files a/resources/sprite/status_2x/warning-blue.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-dark.png b/resources/sprite/status_2x/warning-dark.png
deleted file mode 100644
index 4b1eb3dee8..0000000000
Binary files a/resources/sprite/status_2x/warning-dark.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-green.png b/resources/sprite/status_2x/warning-green.png
deleted file mode 100644
index 3ec7ec00f6..0000000000
Binary files a/resources/sprite/status_2x/warning-green.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-red.png b/resources/sprite/status_2x/warning-red.png
deleted file mode 100644
index ad3c2d036c..0000000000
Binary files a/resources/sprite/status_2x/warning-red.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning-white.png b/resources/sprite/status_2x/warning-white.png
deleted file mode 100644
index 52814bc4af..0000000000
Binary files a/resources/sprite/status_2x/warning-white.png and /dev/null differ
diff --git a/resources/sprite/status_2x/warning.png b/resources/sprite/status_2x/warning.png
deleted file mode 100644
index baa2144ba6..0000000000
Binary files a/resources/sprite/status_2x/warning.png and /dev/null differ
diff --git a/scripts/celerity/generate_sprites.php b/scripts/celerity/generate_sprites.php
index 55574cfa54..4d75c97bda 100755
--- a/scripts/celerity/generate_sprites.php
+++ b/scripts/celerity/generate_sprites.php
@@ -1,94 +1,93 @@
#!/usr/bin/env php
<?php
require_once dirname(dirname(__FILE__)).'/__init_script__.php';
$args = new PhutilArgumentParser($argv);
$args->setTagline('regenerate CSS sprite sheets');
$args->setSynopsis(<<<EOHELP
**sprites**
Rebuild CSS sprite sheets.
EOHELP
);
$args->parseStandardArguments();
$args->parse(
array(
array(
'name' => 'force',
'help' => 'Force regeneration even if sources have not changed.',
),
));
$root = dirname(phutil_get_library_root('phabricator'));
$webroot = $root.'/webroot/rsrc';
$webroot = Filesystem::readablePath($webroot);
$generator = new CeleritySpriteGenerator();
$sheets = array(
'remarkup' => $generator->buildRemarkupSheet(),
'menu' => $generator->buildMenuSheet(),
'apps' => $generator->buildAppsSheet(),
'actions' => $generator->buildActionsSheet(),
'minicons' => $generator->buildMiniconsSheet(),
'conpherence' => $generator->buildConpherenceSheet(),
'apps-large' => $generator->buildAppsLargeSheet(),
'payments' => $generator->buildPaymentsSheet(),
'tokens' => $generator->buildTokenSheet(),
'buttonbar' => $generator->buildButtonBarSheet(),
'docs' => $generator->buildDocsSheet(),
'gradient' => $generator->buildGradientSheet(),
'main-header' => $generator->buildMainHeaderSheet(),
'login' => $generator->buildLoginSheet(),
- 'status' => $generator->buildStatusSheet(),
'projects' => $generator->buildProjectsSheet(),
);
list($err) = exec_manual('optipng');
if ($err) {
$have_optipng = false;
echo phutil_console_format(
"<bg:red> WARNING </bg> `optipng` not found in PATH.\n".
"Sprites will not be optimized! Install `optipng`!\n");
} else {
$have_optipng = true;
}
foreach ($sheets as $name => $sheet) {
$sheet->setBasePath($root);
$manifest_path = $root.'/resources/sprite/manifest/'.$name.'.json';
if (!$args->getArg('force')) {
if (Filesystem::pathExists($manifest_path)) {
$data = Filesystem::readFile($manifest_path);
$data = json_decode($data, true);
if (!$sheet->needsRegeneration($data)) {
continue;
}
}
}
$sheet
->generateCSS($webroot."/css/sprite-{$name}.css")
->generateManifest($root."/resources/sprite/manifest/{$name}.json");
foreach ($sheet->getScales() as $scale) {
if ($scale == 1) {
$sheet_name = "sprite-{$name}.png";
} else {
$sheet_name = "sprite-{$name}-X{$scale}.png";
}
$full_path = "{$webroot}/image/{$sheet_name}";
$sheet->generateImage($full_path, $scale);
if ($have_optipng) {
echo "Optimizing...\n";
phutil_passthru('optipng -o7 -clobber %s', $full_path);
}
}
}
echo "Done.\n";
diff --git a/src/applications/conpherence/view/ConpherenceLayoutView.php b/src/applications/conpherence/view/ConpherenceLayoutView.php
index 877559f3a1..3bd75347d8 100644
--- a/src/applications/conpherence/view/ConpherenceLayoutView.php
+++ b/src/applications/conpherence/view/ConpherenceLayoutView.php
@@ -1,239 +1,239 @@
<?php
final class ConpherenceLayoutView extends AphrontView {
private $thread;
private $baseURI;
private $threadView;
private $role;
private $header;
private $messages;
private $replyForm;
public function setMessages($messages) {
$this->messages = $messages;
return $this;
}
public function setReplyForm($reply_form) {
$this->replyForm = $reply_form;
return $this;
}
public function setHeader($header) {
$this->header = $header;
return $this;
}
public function setRole($role) {
$this->role = $role;
return $this;
}
public function getThreadView() {
return $this->threadView;
}
public function setBaseURI($base_uri) {
$this->baseURI = $base_uri;
return $this;
}
public function setThread(ConpherenceThread $thread) {
$this->thread = $thread;
return $this;
}
public function setThreadView(ConpherenceThreadListView $thead_view) {
$this->threadView = $thead_view;
return $this;
}
public function render() {
require_celerity_resource('conpherence-menu-css');
require_celerity_resource('conpherence-message-pane-css');
require_celerity_resource('conpherence-widget-pane-css');
$layout_id = celerity_generate_unique_node_id();
$selected_id = null;
$selected_thread_id = null;
if ($this->thread) {
$selected_id = $this->thread->getPHID() . '-nav-item';
$selected_thread_id = $this->thread->getID();
}
$this->initBehavior('conpherence-menu',
array(
'baseURI' => $this->baseURI,
'layoutID' => $layout_id,
'selectedID' => $selected_id,
'selectedThreadID' => $selected_thread_id,
'role' => $this->role,
'hasThreadList' => (bool)$this->threadView,
'hasThread' => (bool)$this->messages,
'hasWidgets' => false,
));
$this->initBehavior(
'conpherence-widget-pane',
array(
'widgetBaseUpdateURI' => $this->baseURI . 'update/',
'widgetRegistry' => array(
'conpherence-message-pane' => array(
'name' => pht('Thread'),
- 'icon' => 'comment',
+ 'icon' => 'fa-comment',
'deviceOnly' => true,
'hasCreate' => false
),
'widgets-people' => array(
'name' => pht('Participants'),
- 'icon' => 'user',
+ 'icon' => 'fa-users',
'deviceOnly' => false,
'hasCreate' => true,
'createData' => array(
'refreshFromResponse' => true,
'action' => ConpherenceUpdateActions::ADD_PERSON,
'customHref' => null
)
),
'widgets-files' => array(
'name' => pht('Files'),
- 'icon' => 'file',
+ 'icon' => 'fa-files-o',
'deviceOnly' => false,
'hasCreate' => false
),
'widgets-calendar' => array(
'name' => pht('Calendar'),
- 'icon' => 'calendar',
+ 'icon' => 'fa-calendar',
'deviceOnly' => false,
'hasCreate' => true,
'createData' => array(
'refreshFromResponse' => false,
'action' => ConpherenceUpdateActions::ADD_STATUS,
'customHref' => '/calendar/event/create/'
)
),
'widgets-settings' => array(
'name' => pht('Settings'),
- 'icon' => 'wrench',
+ 'icon' => 'fa-wrench',
'deviceOnly' => false,
'hasCreate' => false
),
)));
return javelin_tag(
'div',
array(
'id' => $layout_id,
'sigil' => 'conpherence-layout',
'class' => 'conpherence-layout conpherence-role-'.$this->role,
),
array(
javelin_tag(
'div',
array(
'class' => 'phabricator-nav-column-background',
'sigil' => 'phabricator-nav-column-background',
),
''),
javelin_tag(
'div',
array(
'id' => 'conpherence-menu-pane',
'class' => 'conpherence-menu-pane phabricator-side-menu',
'sigil' => 'conpherence-menu-pane',
),
$this->threadView),
javelin_tag(
'div',
array(
'class' => 'conpherence-content-pane',
),
array(
javelin_tag(
'div',
array(
'class' => 'conpherence-header-pane',
'id' => 'conpherence-header-pane',
'sigil' => 'conpherence-header-pane',
),
nonempty($this->header, '')),
javelin_tag(
'div',
array(
'class' => 'conpherence-no-threads',
'sigil' => 'conpherence-no-threads',
'style' => 'display: none;',
),
array(
phutil_tag(
'div',
array(
'class' => 'text'
),
pht('You do not have any messages yet.')),
javelin_tag(
'a',
array(
'href' => '/conpherence/new/',
'class' => 'button grey',
'sigil' => 'workflow',
),
pht('Send a Message'))
)),
javelin_tag(
'div',
array(
'class' => 'conpherence-widget-pane',
'id' => 'conpherence-widget-pane',
'sigil' => 'conpherence-widget-pane',
),
array(
phutil_tag(
'div',
array(
'class' => 'widgets-loading-mask'
),
''),
javelin_tag(
'div',
array(
'sigil' => 'conpherence-widgets-holder'
),
''))),
javelin_tag(
'div',
array(
'class' => 'conpherence-message-pane',
'id' => 'conpherence-message-pane',
'sigil' => 'conpherence-message-pane'
),
array(
javelin_tag(
'div',
array(
'class' => 'conpherence-messages',
'id' => 'conpherence-messages',
'sigil' => 'conpherence-messages',
),
nonempty($this->messages, '')),
phutil_tag(
'div',
array(
'class' => 'messages-loading-mask',
),
''),
javelin_tag(
'div',
array(
'id' => 'conpherence-form',
'sigil' => 'conpherence-form'
),
nonempty($this->replyForm, ''))
)),
)),
));
}
}
diff --git a/src/applications/differential/constants/DifferentialRevisionStatus.php b/src/applications/differential/constants/DifferentialRevisionStatus.php
index 64a330dc7e..61340d0111 100644
--- a/src/applications/differential/constants/DifferentialRevisionStatus.php
+++ b/src/applications/differential/constants/DifferentialRevisionStatus.php
@@ -1,115 +1,114 @@
<?php
/**
* NOTE: you probably want {@class:ArcanistDifferentialRevisionStatus}.
* This class just contains a mapping for color within the Differential
* application.
*/
final class DifferentialRevisionStatus {
const COLOR_STATUS_DEFAULT = 'status';
const COLOR_STATUS_DARK = 'status-dark';
const COLOR_STATUS_GREEN = 'status-green';
const COLOR_STATUS_RED = 'status-red';
public static function getRevisionStatusColor($status) {
$default = self::COLOR_STATUS_DEFAULT;
$map = array(
ArcanistDifferentialRevisionStatus::NEEDS_REVIEW =>
self::COLOR_STATUS_DEFAULT,
ArcanistDifferentialRevisionStatus::NEEDS_REVISION =>
self::COLOR_STATUS_RED,
ArcanistDifferentialRevisionStatus::CHANGES_PLANNED =>
self::COLOR_STATUS_RED,
ArcanistDifferentialRevisionStatus::ACCEPTED =>
self::COLOR_STATUS_GREEN,
ArcanistDifferentialRevisionStatus::CLOSED =>
self::COLOR_STATUS_DARK,
ArcanistDifferentialRevisionStatus::ABANDONED =>
self::COLOR_STATUS_DARK,
ArcanistDifferentialRevisionStatus::IN_PREPARATION =>
self::COLOR_STATUS_DARK,
);
return idx($map, $status, $default);
}
public static function getRevisionStatusIcon($status) {
- $default = 'oh-open';
+ $default = 'fa-square-o bluegrey';
$map = array(
ArcanistDifferentialRevisionStatus::NEEDS_REVIEW =>
- 'oh-open',
+ 'fa-square-o bluegrey',
ArcanistDifferentialRevisionStatus::NEEDS_REVISION =>
- 'oh-open-red',
+ 'fa-square-o red',
ArcanistDifferentialRevisionStatus::CHANGES_PLANNED =>
- 'oh-open-red',
+ 'fa-square-o red',
ArcanistDifferentialRevisionStatus::ACCEPTED =>
- 'oh-open-green',
+ 'fa-square-o green',
ArcanistDifferentialRevisionStatus::CLOSED =>
- 'oh-closed-dark',
+ 'fa-check-square-o',
ArcanistDifferentialRevisionStatus::ABANDONED =>
- 'oh-closed-dark',
+ 'fa-check-square-o',
ArcanistDifferentialRevisionStatus::IN_PREPARATION =>
- 'question-blue',
+ 'fa-question-circle blue',
);
return idx($map, $status, $default);
}
public static function renderFullDescription($status) {
$color = self::getRevisionStatusColor($status);
$status_name =
ArcanistDifferentialRevisionStatus::getNameForRevisionStatus($status);
$img = id(new PHUIIconView())
- ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
- ->setSpriteIcon(self::getRevisionStatusIcon($status));
+ ->setIconFont(self::getRevisionStatusIcon($status));
$tag = phutil_tag(
'span',
array(
'class' => 'phui-header-'.$color.' plr',
),
array(
$img,
$status_name,
));
return $tag;
}
public static function getClosedStatuses() {
$statuses = array(
ArcanistDifferentialRevisionStatus::CLOSED,
ArcanistDifferentialRevisionStatus::ABANDONED,
);
if (PhabricatorEnv::getEnvConfig('differential.close-on-accept')) {
$statuses[] = ArcanistDifferentialRevisionStatus::ACCEPTED;
}
return $statuses;
}
public static function getOpenStatuses() {
return array_diff(self::getAllStatuses(), self::getClosedStatuses());
}
public static function getAllStatuses() {
return array(
ArcanistDifferentialRevisionStatus::NEEDS_REVIEW,
ArcanistDifferentialRevisionStatus::NEEDS_REVISION,
ArcanistDifferentialRevisionStatus::CHANGES_PLANNED,
ArcanistDifferentialRevisionStatus::ACCEPTED,
ArcanistDifferentialRevisionStatus::CLOSED,
ArcanistDifferentialRevisionStatus::ABANDONED,
ArcanistDifferentialRevisionStatus::IN_PREPARATION,
);
}
public static function isClosedStatus($status) {
return in_array($status, self::getClosedStatuses());
}
}
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php
index 2149b8ef49..f58e9d3c8e 100644
--- a/src/applications/diffusion/controller/DiffusionRepositoryController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php
@@ -1,640 +1,640 @@
<?php
final class DiffusionRepositoryController extends DiffusionController {
public function shouldAllowPublic() {
return true;
}
public function processRequest() {
$drequest = $this->getDiffusionRequest();
$repository = $drequest->getRepository();
$content = array();
$crumbs = $this->buildCrumbs();
$content[] = $crumbs;
$content[] = $this->buildPropertiesTable($drequest->getRepository());
$phids = array();
try {
$history_results = $this->callConduitWithDiffusionRequest(
'diffusion.historyquery',
array(
'commit' => $drequest->getCommit(),
'path' => $drequest->getPath(),
'offset' => 0,
'limit' => 15));
$history = DiffusionPathChange::newFromConduit(
$history_results['pathChanges']);
foreach ($history as $item) {
$data = $item->getCommitData();
if ($data) {
if ($data->getCommitDetail('authorPHID')) {
$phids[$data->getCommitDetail('authorPHID')] = true;
}
if ($data->getCommitDetail('committerPHID')) {
$phids[$data->getCommitDetail('committerPHID')] = true;
}
}
}
$history_exception = null;
} catch (Exception $ex) {
$history_results = null;
$history = null;
$history_exception = $ex;
}
try {
$browse_results = DiffusionBrowseResultSet::newFromConduit(
$this->callConduitWithDiffusionRequest(
'diffusion.browsequery',
array(
'path' => $drequest->getPath(),
'commit' => $drequest->getCommit(),
)));
$browse_paths = $browse_results->getPaths();
foreach ($browse_paths as $item) {
$data = $item->getLastCommitData();
if ($data) {
if ($data->getCommitDetail('authorPHID')) {
$phids[$data->getCommitDetail('authorPHID')] = true;
}
if ($data->getCommitDetail('committerPHID')) {
$phids[$data->getCommitDetail('committerPHID')] = true;
}
}
}
$browse_exception = null;
} catch (Exception $ex) {
$browse_results = null;
$browse_paths = null;
$browse_exception = $ex;
}
$phids = array_keys($phids);
$handles = $this->loadViewerHandles($phids);
if ($browse_results) {
$readme = $this->callConduitWithDiffusionRequest(
'diffusion.readmequery',
array(
'paths' => $browse_results->getPathDicts(),
'commit' => $drequest->getStableCommit(),
));
} else {
$readme = null;
}
$content[] = $this->buildBrowseTable(
$browse_results,
$browse_paths,
$browse_exception,
$handles);
$content[] = $this->buildHistoryTable(
$history_results,
$history,
$history_exception,
$handles);
try {
$content[] = $this->buildTagListTable($drequest);
} catch (Exception $ex) {
if (!$repository->isImporting()) {
$content[] = $this->renderStatusMessage(
pht('Unable to Load Tags'),
$ex->getMessage());
}
}
try {
$content[] = $this->buildBranchListTable($drequest);
} catch (Exception $ex) {
if (!$repository->isImporting()) {
$content[] = $this->renderStatusMessage(
pht('Unable to Load Branches'),
$ex->getMessage());
}
}
if ($readme) {
$box = new PHUIBoxView();
$box->appendChild($readme);
$box->addPadding(PHUI::PADDING_LARGE);
$panel = new PHUIObjectBoxView();
$panel->setHeaderText(pht('README'));
$panel->appendChild($box);
$content[] = $panel;
}
return $this->buildApplicationPage(
$content,
array(
'title' => $drequest->getRepository()->getName(),
'device' => true,
));
}
private function buildPropertiesTable(PhabricatorRepository $repository) {
$user = $this->getRequest()->getUser();
$header = id(new PHUIHeaderView())
->setHeader($repository->getName())
->setUser($user)
->setPolicyObject($repository);
if (!$repository->isTracked()) {
- $header->setStatus('policy-noone', '', pht('Inactive'));
+ $header->setStatus('fa-ban', 'dark', pht('Inactive'));
} else if ($repository->isImporting()) {
- $header->setStatus('time', 'red', pht('Importing...'));
+ $header->setStatus('fa-clock-o', 'indigo', pht('Importing...'));
} else {
- $header->setStatus('oh-ok', '', pht('Active'));
+ $header->setStatus('fa-check', 'bluegrey', pht('Active'));
}
$actions = $this->buildActionList($repository);
$view = id(new PHUIPropertyListView())
->setUser($user);
$project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
$repository->getPHID(),
PhabricatorEdgeConfig::TYPE_OBJECT_HAS_PROJECT);
if ($project_phids) {
$this->loadHandles($project_phids);
$view->addProperty(
pht('Projects'),
$this->renderHandlesForPHIDs($project_phids));
}
if ($repository->isHosted()) {
$ssh_uri = $repository->getSSHCloneURIObject();
if ($ssh_uri) {
$clone_uri = $this->renderCloneCommand(
$repository,
$ssh_uri,
$repository->getServeOverSSH(),
'/settings/panel/ssh/');
$view->addProperty(
$repository->isSVN()
? pht('Checkout (SSH)')
: pht('Clone (SSH)'),
$clone_uri);
}
$http_uri = $repository->getHTTPCloneURIObject();
if ($http_uri) {
$clone_uri = $this->renderCloneCommand(
$repository,
$http_uri,
$repository->getServeOverHTTP(),
PhabricatorEnv::getEnvConfig('diffusion.allow-http-auth')
? '/settings/panel/vcspassword/'
: null);
$view->addProperty(
$repository->isSVN()
? pht('Checkout (HTTP)')
: pht('Clone (HTTP)'),
$clone_uri);
}
} else {
switch ($repository->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$view->addProperty(
pht('Clone'),
$this->renderCloneCommand(
$repository,
$repository->getPublicCloneURI()));
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$view->addProperty(
pht('Checkout'),
$this->renderCloneCommand(
$repository,
$repository->getPublicCloneURI()));
break;
}
}
$description = $repository->getDetail('description');
if (strlen($description)) {
$description = PhabricatorMarkupEngine::renderOneObject(
$repository,
'description',
$user);
$view->addSectionHeader(pht('Description'));
$view->addTextContent($description);
}
$view->setActionList($actions);
return id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($view);
}
private function buildBranchListTable(DiffusionRequest $drequest) {
$viewer = $this->getRequest()->getUser();
if ($drequest->getBranch() === null) {
return null;
}
$limit = 15;
$branches = $this->callConduitWithDiffusionRequest(
'diffusion.branchquery',
array(
'limit' => $limit + 1,
));
if (!$branches) {
return null;
}
$more_branches = (count($branches) > $limit);
$branches = array_slice($branches, 0, $limit);
$branches = DiffusionRepositoryRef::loadAllFromDictionaries($branches);
$commits = id(new DiffusionCommitQuery())
->setViewer($viewer)
->withIdentifiers(mpull($branches, 'getCommitIdentifier'))
->withRepository($drequest->getRepository())
->execute();
$table = id(new DiffusionBranchTableView())
->setUser($viewer)
->setDiffusionRequest($drequest)
->setBranches($branches)
->setCommits($commits);
$panel = new PHUIObjectBoxView();
$header = new PHUIHeaderView();
$header->setHeader(pht('Branches'));
if ($more_branches) {
$header->setSubHeader(pht('Showing %d branches.', $limit));
}
$icon = id(new PHUIIconView())
->setIconFont('fa-fork');
$button = new PHUIButtonView();
$button->setText(pht("Show All Branches"));
$button->setTag('a');
$button->setIcon($icon);
$button->setHref($drequest->generateURI(
array(
'action' => 'branches',
)));
$header->addActionLink($button);
$panel->setHeader($header);
$panel->appendChild($table);
return $panel;
}
private function buildTagListTable(DiffusionRequest $drequest) {
$viewer = $this->getRequest()->getUser();
$tag_limit = 15;
$tags = array();
try {
$tags = DiffusionRepositoryTag::newFromConduit(
$this->callConduitWithDiffusionRequest(
'diffusion.tagsquery',
array(
// On the home page, we want to find tags on any branch.
'commit' => null,
'limit' => $tag_limit + 1,
)));
} catch (ConduitException $e) {
if ($e->getMessage() != 'ERR-UNSUPPORTED-VCS') {
throw $e;
}
}
if (!$tags) {
return null;
}
$more_tags = (count($tags) > $tag_limit);
$tags = array_slice($tags, 0, $tag_limit);
$commits = id(new DiffusionCommitQuery())
->setViewer($viewer)
->withIdentifiers(mpull($tags, 'getCommitIdentifier'))
->withRepository($drequest->getRepository())
->needCommitData(true)
->execute();
$view = id(new DiffusionTagListView())
->setUser($viewer)
->setDiffusionRequest($drequest)
->setTags($tags)
->setCommits($commits);
$phids = $view->getRequiredHandlePHIDs();
$handles = $this->loadViewerHandles($phids);
$view->setHandles($handles);
$panel = new PHUIObjectBoxView();
$header = new PHUIHeaderView();
$header->setHeader(pht('Tags'));
if ($more_tags) {
$header->setSubHeader(
pht('Showing the %d most recent tags.', $tag_limit));
}
$icon = id(new PHUIIconView())
->setIconFont('fa-tag');
$button = new PHUIButtonView();
$button->setText(pht("Show All Tags"));
$button->setTag('a');
$button->setIcon($icon);
$button->setHref($drequest->generateURI(
array(
'action' => 'tags',
)));
$header->addActionLink($button);
$panel->setHeader($header);
$panel->appendChild($view);
return $panel;
}
private function buildActionList(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view_uri = $this->getApplicationURI($repository->getCallsign().'/');
$edit_uri = $this->getApplicationURI($repository->getCallsign().'/edit/');
$view = id(new PhabricatorActionListView())
->setUser($viewer)
->setObject($repository)
->setObjectURI($view_uri);
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$repository,
PhabricatorPolicyCapability::CAN_EDIT);
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Repository'))
->setIcon('fa-pencil')
->setHref($edit_uri)
->setWorkflow(!$can_edit)
->setDisabled(!$can_edit));
if ($repository->isHosted()) {
$callsign = $repository->getCallsign();
$push_uri = $this->getApplicationURI(
'pushlog/?repositories=r'.$callsign);
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('View Push Logs'))
->setIcon('fa-list-alt')
->setHref($push_uri));
}
return $view;
}
private function buildHistoryTable(
$history_results,
$history,
$history_exception,
array $handles) {
$request = $this->getRequest();
$viewer = $request->getUser();
$drequest = $this->getDiffusionRequest();
$repository = $drequest->getRepository();
if ($history_exception) {
if ($repository->isImporting()) {
return $this->renderStatusMessage(
pht('Still Importing...'),
pht(
'This repository is still importing. History is not yet '.
'available.'));
} else {
return $this->renderStatusMessage(
pht('Unable to Retrieve History'),
$history_exception->getMessage());
}
}
$history_table = id(new DiffusionHistoryTableView())
->setUser($viewer)
->setDiffusionRequest($drequest)
->setHandles($handles)
->setHistory($history);
// TODO: Super sketchy.
$history_table->loadRevisions();
if ($history_results) {
$history_table->setParents($history_results['parents']);
}
$history_table->setIsHead(true);
$callsign = $drequest->getRepository()->getCallsign();
$icon = id(new PHUIIconView())
->setIconFont('fa-list-alt');
$button = id(new PHUIButtonView())
->setText(pht('View Full History'))
->setHref($drequest->generateURI(
array(
'action' => 'history',
)))
->setTag('a')
->setIcon($icon);
$panel = new PHUIObjectBoxView();
$header = id(new PHUIHeaderView())
->setHeader(pht('Recent Commits'))
->addActionLink($button);
$panel->setHeader($header);
$panel->appendChild($history_table);
return $panel;
}
private function buildBrowseTable(
$browse_results,
$browse_paths,
$browse_exception,
array $handles) {
$request = $this->getRequest();
$viewer = $request->getUser();
$drequest = $this->getDiffusionRequest();
$repository = $drequest->getRepository();
if ($browse_exception) {
if ($repository->isImporting()) {
// The history table renders a useful message.
return null;
} else {
return $this->renderStatusMessage(
pht('Unable to Retrieve Paths'),
$browse_exception->getMessage());
}
}
$browse_table = id(new DiffusionBrowseTableView())
->setUser($viewer)
->setDiffusionRequest($drequest)
->setHandles($handles);
if ($browse_paths) {
$browse_table->setPaths($browse_paths);
} else {
$browse_table->setPaths(array());
}
$browse_uri = $drequest->generateURI(array('action' => 'browse'));
$browse_panel = new PHUIObjectBoxView();
$header = id(new PHUIHeaderView())
->setHeader(pht('Repository'));
$icon = id(new PHUIIconView())
->setIconFont('fa-folder-open');
$button = new PHUIButtonView();
$button->setText(pht('Browse Repository'));
$button->setTag('a');
$button->setIcon($icon);
$button->setHref($browse_uri);
$header->addActionLink($button);
$browse_panel->setHeader($header);
if ($repository->canUsePathTree()) {
Javelin::initBehavior(
'diffusion-locate-file',
array(
'controlID' => 'locate-control',
'inputID' => 'locate-input',
'browseBaseURI' => (string)$drequest->generateURI(
array(
'action' => 'browse',
)),
'uri' => (string)$drequest->generateURI(
array(
'action' => 'pathtree',
)),
));
$form = id(new AphrontFormView())
->setUser($viewer)
->appendChild(
id(new AphrontFormTypeaheadControl())
->setHardpointID('locate-control')
->setID('locate-input')
->setLabel(pht('Locate File')));
$browse_panel->appendChild($form->buildLayoutView());
}
$browse_panel->appendChild($browse_table);
return $browse_panel;
}
private function renderCloneCommand(
PhabricatorRepository $repository,
$uri,
$serve_mode = null,
$manage_uri = null) {
require_celerity_resource('diffusion-icons-css');
Javelin::initBehavior('select-on-click');
switch ($repository->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$command = csprintf(
'git clone %R',
$uri);
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$command = csprintf(
'hg clone %R',
$uri);
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
if ($repository->isHosted()) {
$command = csprintf(
'svn checkout %R %R',
$uri,
$repository->getCloneName());
} else {
$command = csprintf(
'svn checkout %R',
$uri);
}
break;
}
$input = javelin_tag(
'input',
array(
'type' => 'text',
'value' => (string)$command,
'class' => 'diffusion-clone-uri',
'sigil' => 'select-on-click',
'readonly' => 'true',
));
$extras = array();
if ($serve_mode) {
if ($serve_mode === PhabricatorRepository::SERVE_READONLY) {
$extras[] = pht('(Read Only)');
}
}
if ($manage_uri) {
if ($this->getRequest()->getUser()->isLoggedIn()) {
$extras[] = phutil_tag(
'a',
array(
'href' => $manage_uri,
),
pht('Manage Credentials'));
}
}
if ($extras) {
$extras = phutil_implode_html(' ', $extras);
$extras = phutil_tag(
'div',
array(
'class' => 'diffusion-clone-extras',
),
$extras);
}
return array($input, $extras);
}
}
diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
index 50a74dd376..c70ce57e5a 100644
--- a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
+++ b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php
@@ -1,1121 +1,1121 @@
<?php
final class DiffusionRepositoryEditMainController
extends DiffusionRepositoryEditController {
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$drequest = $this->diffusionRequest;
$repository = $drequest->getRepository();
PhabricatorPolicyFilter::requireCapability(
$viewer,
$repository,
PhabricatorPolicyCapability::CAN_EDIT);
$is_svn = false;
$is_git = false;
$is_hg = false;
switch ($repository->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$is_git = true;
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$is_svn = true;
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$is_hg = true;
break;
}
$has_branches = ($is_git || $is_hg);
$has_local = $repository->usesLocalWorkingCopy();
$crumbs = $this->buildApplicationCrumbs($is_main = true);
$title = pht('Edit %s', $repository->getName());
$header = id(new PHUIHeaderView())
->setHeader($title);
if ($repository->isTracked()) {
- $header->setStatus('oh-ok', '', pht('Active'));
+ $header->setStatus('fa-check', 'bluegrey', pht('Active'));
} else {
- $header->setStatus('policy-noone', '', pht('Inactive'));
+ $header->setStatus('fa-ban', 'dark', pht('Inactive'));
}
$basic_actions = $this->buildBasicActions($repository);
$basic_properties =
$this->buildBasicProperties($repository, $basic_actions);
$policy_actions = $this->buildPolicyActions($repository);
$policy_properties =
$this->buildPolicyProperties($repository, $policy_actions);
$remote_properties = null;
if (!$repository->isHosted()) {
$remote_properties = $this->buildRemoteProperties(
$repository,
$this->buildRemoteActions($repository));
}
$encoding_actions = $this->buildEncodingActions($repository);
$encoding_properties =
$this->buildEncodingProperties($repository, $encoding_actions);
$hosting_properties = $this->buildHostingProperties(
$repository,
$this->buildHostingActions($repository));
$branches_properties = null;
if ($has_branches) {
$branches_properties = $this->buildBranchesProperties(
$repository,
$this->buildBranchesActions($repository));
}
$subversion_properties = null;
if ($is_svn) {
$subversion_properties = $this->buildSubversionProperties(
$repository,
$this->buildSubversionActions($repository));
}
$local_properties = null;
if ($has_local) {
$local_properties = $this->buildLocalProperties(
$repository,
$this->buildLocalActions($repository));
}
$actions_properties = $this->buildActionsProperties(
$repository,
$this->buildActionsActions($repository));
$xactions = id(new PhabricatorRepositoryTransactionQuery())
->setViewer($viewer)
->withObjectPHIDs(array($repository->getPHID()))
->execute();
$engine = id(new PhabricatorMarkupEngine())
->setViewer($viewer);
foreach ($xactions as $xaction) {
if ($xaction->getComment()) {
$engine->addObject(
$xaction->getComment(),
PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
}
}
$engine->process();
$xaction_view = id(new PhabricatorApplicationTransactionView())
->setUser($viewer)
->setObjectPHID($repository->getPHID())
->setTransactions($xactions)
->setMarkupEngine($engine);
$boxes = array();
$boxes[] = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($basic_properties);
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Policies'))
->addPropertyList($policy_properties);
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Hosting'))
->addPropertyList($hosting_properties);
if ($repository->canMirror()) {
$mirror_actions = $this->buildMirrorActions($repository);
$mirror_properties = $this->buildMirrorProperties(
$repository,
$mirror_actions);
$mirrors = id(new PhabricatorRepositoryMirrorQuery())
->setViewer($viewer)
->withRepositoryPHIDs(array($repository->getPHID()))
->execute();
$mirror_list = $this->buildMirrorList($repository, $mirrors);
$boxes[] = id(new PhabricatorAnchorView())->setAnchorName('mirrors');
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Mirrors'))
->addPropertyList($mirror_properties);
$boxes[] = $mirror_list;
}
if ($remote_properties) {
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Remote'))
->addPropertyList($remote_properties);
}
if ($local_properties) {
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Local'))
->addPropertyList($local_properties);
}
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Text Encoding'))
->addPropertyList($encoding_properties);
if ($branches_properties) {
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Branches'))
->addPropertyList($branches_properties);
}
if ($subversion_properties) {
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Subversion'))
->addPropertyList($subversion_properties);
}
$boxes[] = id(new PHUIObjectBoxView())
->setHeaderText(pht('Actions'))
->addPropertyList($actions_properties);
return $this->buildApplicationPage(
array(
$crumbs,
$boxes,
$xaction_view,
),
array(
'title' => $title,
'device' => true,
));
}
private function buildBasicActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Basic Information'))
->setHref($this->getRepositoryControllerURI($repository, 'edit/basic/'));
$view->addAction($edit);
$activate = id(new PhabricatorActionView())
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/activate/'))
->setWorkflow(true);
if ($repository->isTracked()) {
$activate
->setIcon('fa-pause')
->setName(pht('Deactivate Repository'));
} else {
$activate
->setIcon('fa-play')
->setName(pht('Activate Repository'));
}
$view->addAction($activate);
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Delete Repository'))
->setIcon('fa-times')
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/delete/'))
->setDisabled(true)
->setWorkflow(true));
return $view;
}
private function buildBasicProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$type = PhabricatorRepositoryType::getNameForRepositoryType(
$repository->getVersionControlSystem());
$view->addProperty(pht('Type'), $type);
$view->addProperty(pht('Callsign'), $repository->getCallsign());
$clone_name = $repository->getDetail('clone-name');
if ($repository->isHosted()) {
$view->addProperty(
pht('Clone/Checkout As'),
$clone_name
? $clone_name.'/'
: phutil_tag('em', array(), $repository->getCloneName().'/'));
}
$project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
$repository->getPHID(),
PhabricatorEdgeConfig::TYPE_OBJECT_HAS_PROJECT);
if ($project_phids) {
$this->loadHandles($project_phids);
$project_text = $this->renderHandlesForPHIDs($project_phids);
} else {
$project_text = phutil_tag('em', array(), pht('None'));
}
$view->addProperty(
pht('Projects'),
$project_text);
$view->addProperty(
pht('Status'),
$this->buildRepositoryStatus($repository));
$description = $repository->getDetail('description');
$view->addSectionHeader(pht('Description'));
if (!strlen($description)) {
$description = phutil_tag('em', array(), pht('No description provided.'));
} else {
$description = PhabricatorMarkupEngine::renderOneObject(
$repository,
'description',
$viewer);
}
$view->addTextContent($description);
return $view;
}
private function buildEncodingActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Text Encoding'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/encoding/'));
$view->addAction($edit);
return $view;
}
private function buildEncodingProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$encoding = $repository->getDetail('encoding');
if (!$encoding) {
$encoding = phutil_tag('em', array(), pht('Use Default (UTF-8)'));
}
$view->addProperty(pht('Encoding'), $encoding);
return $view;
}
private function buildPolicyActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Policies'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/policy/'));
$view->addAction($edit);
return $view;
}
private function buildPolicyProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
$viewer,
$repository);
$view->addProperty(
pht('Visible To'),
$descriptions[PhabricatorPolicyCapability::CAN_VIEW]);
$view->addProperty(
pht('Editable By'),
$descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
$pushable = $repository->isHosted()
? $descriptions[DiffusionCapabilityPush::CAPABILITY]
: phutil_tag('em', array(), pht('Not a Hosted Repository'));
$view->addProperty(pht('Pushable By'), $pushable);
return $view;
}
private function buildBranchesActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Branches'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/branches/'));
$view->addAction($edit);
return $view;
}
private function buildBranchesProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$default_branch = nonempty(
$repository->getHumanReadableDetail('default-branch'),
phutil_tag('em', array(), $repository->getDefaultBranch()));
$view->addProperty(pht('Default Branch'), $default_branch);
$track_only = nonempty(
$repository->getHumanReadableDetail('branch-filter', array()),
phutil_tag('em', array(), pht('Track All Branches')));
$view->addProperty(pht('Track Only'), $track_only);
$autoclose_only = nonempty(
$repository->getHumanReadableDetail('close-commits-filter', array()),
phutil_tag('em', array(), pht('Autoclose On All Branches')));
if ($repository->getDetail('disable-autoclose')) {
$autoclose_only = phutil_tag('em', array(), pht('Disabled'));
}
$view->addProperty(pht('Autoclose Only'), $autoclose_only);
return $view;
}
private function buildSubversionActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Subversion Info'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/subversion/'));
$view->addAction($edit);
return $view;
}
private function buildSubversionProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$svn_uuid = nonempty(
$repository->getUUID(),
phutil_tag('em', array(), pht('Not Configured')));
$view->addProperty(pht('Subversion UUID'), $svn_uuid);
$svn_subpath = nonempty(
$repository->getHumanReadableDetail('svn-subpath'),
phutil_tag('em', array(), pht('Import Entire Repository')));
$view->addProperty(pht('Import Only'), $svn_subpath);
return $view;
}
private function buildActionsActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Actions'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/actions/'));
$view->addAction($edit);
return $view;
}
private function buildActionsProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$notify = $repository->getDetail('herald-disabled')
? pht('Off')
: pht('On');
$notify = phutil_tag('em', array(), $notify);
$view->addProperty(pht('Publish/Notify'), $notify);
$autoclose = $repository->getDetail('disable-autoclose')
? pht('Off')
: pht('On');
$autoclose = phutil_tag('em', array(), $autoclose);
$view->addProperty(pht('Autoclose'), $autoclose);
return $view;
}
private function buildRemoteActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Remote'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/remote/'));
$view->addAction($edit);
return $view;
}
private function buildRemoteProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$view->addProperty(
pht('Remote URI'),
$repository->getHumanReadableDetail('remote-uri'));
$credential_phid = $repository->getCredentialPHID();
if ($credential_phid) {
$this->loadHandles(array($credential_phid));
$view->addProperty(
pht('Credential'),
$this->getHandle($credential_phid)->renderLink());
}
return $view;
}
private function buildLocalActions(PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Local'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/local/'));
$view->addAction($edit);
return $view;
}
private function buildLocalProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$view->addProperty(
pht('Local Path'),
$repository->getHumanReadableDetail('local-path'));
return $view;
}
private function buildHostingActions(PhabricatorRepository $repository) {
$user = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($user);
$edit = id(new PhabricatorActionView())
->setIcon('fa-pencil')
->setName(pht('Edit Hosting'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/hosting/'));
$view->addAction($edit);
if ($repository->canAllowDangerousChanges()) {
if ($repository->shouldAllowDangerousChanges()) {
$changes = id(new PhabricatorActionView())
->setIcon('fa-shield')
->setName(pht('Prevent Dangerous Changes'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/dangerous/'))
->setWorkflow(true);
} else {
$changes = id(new PhabricatorActionView())
->setIcon('fa-bullseye')
->setName(pht('Allow Dangerous Changes'))
->setHref(
$this->getRepositoryControllerURI($repository, 'edit/dangerous/'))
->setWorkflow(true);
}
$view->addAction($changes);
}
return $view;
}
private function buildHostingProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$user = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($user)
->setActionList($actions);
$hosting = $repository->isHosted()
? pht('Hosted on Phabricator')
: pht('Hosted Elsewhere');
$view->addProperty(pht('Hosting'), phutil_tag('em', array(), $hosting));
$view->addProperty(
pht('Serve over HTTP'),
phutil_tag(
'em',
array(),
PhabricatorRepository::getProtocolAvailabilityName(
$repository->getServeOverHTTP())));
$view->addProperty(
pht('Serve over SSH'),
phutil_tag(
'em',
array(),
PhabricatorRepository::getProtocolAvailabilityName(
$repository->getServeOverSSH())));
if ($repository->canAllowDangerousChanges()) {
if ($repository->shouldAllowDangerousChanges()) {
$description = pht('Allowed');
} else {
$description = pht('Not Allowed');
}
$view->addProperty(
pht('Dangerous Changes'),
$description);
}
return $view;
}
private function buildRepositoryStatus(
PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$view = new PHUIStatusListView();
$messages = id(new PhabricatorRepositoryStatusMessage())
->loadAllWhere('repositoryID = %d', $repository->getID());
$messages = mpull($messages, null, 'getStatusType');
if ($repository->isTracked()) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(pht('Repository Active')));
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'bluegrey')
->setTarget(pht('Repository Inactive'))
->setNote(
pht('Activate this repository to begin or resume import.')));
return $view;
}
$binaries = array();
$svnlook_check = false;
switch ($repository->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$binaries[] = 'git';
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$binaries[] = 'svn';
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$binaries[] = 'hg';
break;
}
if ($repository->isHosted()) {
if ($repository->getServeOverHTTP() != PhabricatorRepository::SERVE_OFF) {
switch ($repository->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$binaries[] = 'git-http-backend';
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$binaries[] = 'svnserve';
$binaries[] = 'svnadmin';
$binaries[] = 'svnlook';
$svnlook_check = true;
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$binaries[] = 'hg';
break;
}
}
if ($repository->getServeOverSSH() != PhabricatorRepository::SERVE_OFF) {
switch ($repository->getVersionControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$binaries[] = 'git-receive-pack';
$binaries[] = 'git-upload-pack';
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$binaries[] = 'svnserve';
$binaries[] = 'svnadmin';
$binaries[] = 'svnlook';
$svnlook_check = true;
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
$binaries[] = 'hg';
break;
}
}
}
$binaries = array_unique($binaries);
foreach ($binaries as $binary) {
$where = Filesystem::resolveBinary($binary);
if (!$where) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(
pht('Missing Binary %s', phutil_tag('tt', array(), $binary)))
->setNote(pht(
"Unable to find this binary in the webserver's PATH. You may ".
"need to configure %s.",
$this->getEnvConfigLink())));
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(
pht('Found Binary %s', phutil_tag('tt', array(), $binary)))
->setNote(phutil_tag('tt', array(), $where)));
}
}
// This gets checked generically above. However, for svn commit hooks, we
// need this to be in environment.append-paths because subversion strips
// PATH.
if ($svnlook_check) {
$where = Filesystem::resolveBinary('svnlook');
if ($where) {
$path = substr($where, 0, strlen($where) - strlen('svnlook'));
$dirs = PhabricatorEnv::getEnvConfig('environment.append-paths');
$in_path = false;
foreach ($dirs as $dir) {
if (Filesystem::isDescendant($path, $dir)) {
$in_path = true;
break;
}
}
if (!$in_path) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(
pht('Missing Binary %s', phutil_tag('tt', array(), $binary)))
->setNote(pht(
'Unable to find this binary in `environment.append-paths`. '.
'You need to configure %s and include %s.',
$this->getEnvConfigLink(),
$path)));
}
}
}
$doc_href = PhabricatorEnv::getDocLink('Managing Daemons with phd');
$daemon_instructions = pht(
'Use %s to start daemons. See %s.',
phutil_tag('tt', array(), 'bin/phd start'),
phutil_tag(
'a',
array(
'href' => $doc_href,
),
pht('Managing Daemons with phd')));
$pull_daemon = id(new PhabricatorDaemonLogQuery())
->setViewer(PhabricatorUser::getOmnipotentUser())
->withStatus(PhabricatorDaemonLogQuery::STATUS_ALIVE)
->withDaemonClasses(array('PhabricatorRepositoryPullLocalDaemon'))
->setLimit(1)
->execute();
if ($pull_daemon) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(pht('Pull Daemon Running')));
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(pht('Pull Daemon Not Running'))
->setNote($daemon_instructions));
}
$task_daemon = id(new PhabricatorDaemonLogQuery())
->setViewer(PhabricatorUser::getOmnipotentUser())
->withStatus(PhabricatorDaemonLogQuery::STATUS_ALIVE)
->withDaemonClasses(array('PhabricatorTaskmasterDaemon'))
->setLimit(1)
->execute();
if ($task_daemon) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(pht('Task Daemon Running')));
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(pht('Task Daemon Not Running'))
->setNote($daemon_instructions));
}
if ($repository->usesLocalWorkingCopy()) {
$local_parent = dirname($repository->getLocalPath());
if (Filesystem::pathExists($local_parent)) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(pht('Storage Directory OK'))
->setNote(phutil_tag('tt', array(), $local_parent)));
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(pht('No Storage Directory'))
->setNote(
pht(
'Storage directory %s does not exist, or is not readable by '.
'the webserver. Create this directory or make it readable.',
phutil_tag('tt', array(), $local_parent))));
return $view;
}
$local_path = $repository->getLocalPath();
$message = idx($messages, PhabricatorRepositoryStatusMessage::TYPE_INIT);
if ($message) {
switch ($message->getStatusCode()) {
case PhabricatorRepositoryStatusMessage::CODE_ERROR:
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(pht('Initialization Error'))
->setNote($message->getParameter('message')));
return $view;
case PhabricatorRepositoryStatusMessage::CODE_OKAY:
if (Filesystem::pathExists($local_path)) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(pht('Working Copy OK'))
->setNote(phutil_tag('tt', array(), $local_path)));
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(pht('Working Copy Error'))
->setNote(
pht(
'Working copy %s has been deleted, or is not '.
'readable by the webserver. Make this directory '.
'readable. If it has been deleted, the daemons should '.
'restore it automatically.',
phutil_tag('tt', array(), $local_path))));
return $view;
}
break;
case PhabricatorRepositoryStatusMessage::CODE_WORKING:
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green')
->setTarget(pht('Initializing Working Copy'))
->setNote(pht('Daemons are initializing the working copy.')));
return $view;
default:
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(pht('Unknown Init Status'))
->setNote($message->getStatusCode()));
return $view;
}
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_CLOCK, 'orange')
->setTarget(pht('No Working Copy Yet'))
->setNote(
pht('Waiting for daemons to build a working copy.')));
return $view;
}
}
$message = idx($messages, PhabricatorRepositoryStatusMessage::TYPE_FETCH);
if ($message) {
switch ($message->getStatusCode()) {
case PhabricatorRepositoryStatusMessage::CODE_ERROR:
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_WARNING, 'red')
->setTarget(pht('Update Error'))
->setNote($message->getParameter('message')));
return $view;
case PhabricatorRepositoryStatusMessage::CODE_OKAY:
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(pht('Updates OK'))
->setNote(
pht(
'Last updated %s.',
phabricator_datetime($message->getEpoch(), $viewer))));
break;
}
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_CLOCK, 'orange')
->setTarget(pht('Waiting For Update'))
->setNote(
pht('Waiting for daemons to read updates.')));
}
if ($repository->isImporting()) {
$progress = queryfx_all(
$repository->establishConnection('r'),
'SELECT importStatus, count(*) N FROM %T WHERE repositoryID = %d
GROUP BY importStatus',
id(new PhabricatorRepositoryCommit())->getTableName(),
$repository->getID());
$done = 0;
$total = 0;
foreach ($progress as $row) {
$total += $row['N'] * 4;
$status = $row['importStatus'];
if ($status & PhabricatorRepositoryCommit::IMPORTED_MESSAGE) {
$done += $row['N'];
}
if ($status & PhabricatorRepositoryCommit::IMPORTED_CHANGE) {
$done += $row['N'];
}
if ($status & PhabricatorRepositoryCommit::IMPORTED_OWNERS) {
$done += $row['N'];
}
if ($status & PhabricatorRepositoryCommit::IMPORTED_HERALD) {
$done += $row['N'];
}
}
if ($total) {
$percentage = 100 * ($done / $total);
} else {
$percentage = 0;
}
// Cap this at "99.99%", because it's confusing to users when the actual
// fraction is "99.996%" and it rounds up to "100.00%".
if ($percentage > 99.99) {
$percentage = 99.99;
}
$percentage = sprintf('%.2f%%', $percentage);
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_CLOCK, 'green')
->setTarget(pht('Importing'))
->setNote(
pht('%s Complete', $percentage)));
} else {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_ACCEPT, 'green')
->setTarget(pht('Fully Imported')));
}
if (idx($messages, PhabricatorRepositoryStatusMessage::TYPE_NEEDS_UPDATE)) {
$view->addItem(
id(new PHUIStatusItemView())
->setIcon(PHUIStatusItemView::ICON_UP, 'indigo')
->setTarget(pht('Prioritized'))
->setNote(pht('This repository will be updated soon.')));
}
return $view;
}
private function buildMirrorActions(
PhabricatorRepository $repository) {
$viewer = $this->getRequest()->getUser();
$mirror_actions = id(new PhabricatorActionListView())
->setObjectURI($this->getRequest()->getRequestURI())
->setUser($viewer);
$new_mirror_uri = $this->getRepositoryControllerURI(
$repository,
'mirror/edit/');
$mirror_actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Add Mirror'))
->setIcon('fa-plus')
->setHref($new_mirror_uri)
->setWorkflow(true));
return $mirror_actions;
}
private function buildMirrorProperties(
PhabricatorRepository $repository,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$mirror_properties = id(new PHUIPropertyListView())
->setUser($viewer)
->setActionList($actions);
$mirror_properties->addProperty(
'',
phutil_tag(
'em',
array(),
pht('Automatically push changes into other remotes.')));
return $mirror_properties;
}
private function buildMirrorList(
PhabricatorRepository $repository,
array $mirrors) {
assert_instances_of($mirrors, 'PhabricatorRepositoryMirror');
$mirror_list = id(new PHUIObjectItemListView())
->setNoDataString(pht('This repository has no configured mirrors.'));
foreach ($mirrors as $mirror) {
$item = id(new PHUIObjectItemView())
->setHeader($mirror->getRemoteURI());
$edit_uri = $this->getRepositoryControllerURI(
$repository,
'mirror/edit/'.$mirror->getID().'/');
$delete_uri = $this->getRepositoryControllerURI(
$repository,
'mirror/delete/'.$mirror->getID().'/');
$item->addAction(
id(new PHUIListItemView())
->setIcon('fa-pencil')
->setHref($edit_uri)
->setWorkflow(true));
$item->addAction(
id(new PHUIListItemView())
->setIcon('fa-times')
->setHref($delete_uri)
->setWorkflow(true));
$mirror_list->addItem($item);
}
return $mirror_list;
}
private function getEnvConfigLink() {
$config_href = '/config/edit/environment.append-paths/';
return phutil_tag(
'a',
array(
'href' => $config_href,
),
'environment.append-paths');
}
}
diff --git a/src/applications/harbormaster/controller/HarbormasterBuildViewController.php b/src/applications/harbormaster/controller/HarbormasterBuildViewController.php
index d3aadcec13..a459240234 100644
--- a/src/applications/harbormaster/controller/HarbormasterBuildViewController.php
+++ b/src/applications/harbormaster/controller/HarbormasterBuildViewController.php
@@ -1,376 +1,376 @@
<?php
final class HarbormasterBuildViewController
extends HarbormasterController {
private $id;
public function willProcessRequest(array $data) {
$this->id = $data['id'];
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$id = $this->id;
$build = id(new HarbormasterBuildQuery())
->setViewer($viewer)
->withIDs(array($id))
->executeOne();
if (!$build) {
return new Aphront404Response();
}
$title = pht("Build %d", $id);
$header = id(new PHUIHeaderView())
->setHeader($title)
->setUser($viewer)
->setPolicyObject($build);
if ($build->isRestarting()) {
- $header->setStatus('warning', 'red', pht('Restarting'));
+ $header->setStatus('fa-exclamation-triangle', 'red', pht('Restarting'));
} else if ($build->isStopping()) {
- $header->setStatus('warning', 'red', pht('Stopping'));
+ $header->setStatus('fa-exclamation-triangle', 'red', pht('Stopping'));
} else if ($build->isResuming()) {
- $header->setStatus('warning', 'red', pht('Resuming'));
+ $header->setStatus('fa-exclamation-triangle', 'red', pht('Resuming'));
}
$box = id(new PHUIObjectBoxView())
->setHeader($header);
$actions = $this->buildActionList($build);
$this->buildPropertyLists($box, $build, $actions);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(
$build->getBuildable()->getMonogram(),
'/'.$build->getBuildable()->getMonogram());
$crumbs->addTextCrumb($title);
$build_targets = id(new HarbormasterBuildTargetQuery())
->setViewer($viewer)
->withBuildPHIDs(array($build->getPHID()))
->execute();
if ($build_targets) {
$messages = id(new HarbormasterBuildMessageQuery())
->setViewer($viewer)
->withBuildTargetPHIDs(mpull($build_targets, 'getPHID'))
->execute();
$messages = mgroup($messages, 'getBuildTargetPHID');
} else {
$messages = array();
}
$targets = array();
foreach ($build_targets as $build_target) {
$header = id(new PHUIHeaderView())
->setHeader(pht(
'Build Target %d (%s)',
$build_target->getID(),
$build_target->getImplementation()->getName()))
->setUser($viewer);
$properties = new PHUIPropertyListView();
$details = $build_target->getDetails();
if ($details) {
$properties->addSectionHeader(pht('Configuration Details'));
foreach ($details as $key => $value) {
$properties->addProperty($key, $value);
}
}
$variables = $build_target->getVariables();
if ($variables) {
$properties->addSectionHeader(pht('Variables'));
foreach ($variables as $key => $value) {
$properties->addProperty($key, $value);
}
}
$targets[] = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
$build_messages = idx($messages, $build_target->getPHID(), array());
$targets[] = $this->buildMessages($build_messages);
$targets[] = $this->buildArtifacts($build_target);
$targets[] = $this->buildLog($build, $build_target);
}
$xactions = id(new HarbormasterBuildTransactionQuery())
->setViewer($viewer)
->withObjectPHIDs(array($build->getPHID()))
->execute();
$timeline = id(new PhabricatorApplicationTransactionView())
->setUser($viewer)
->setObjectPHID($build->getPHID())
->setTransactions($xactions);
return $this->buildApplicationPage(
array(
$crumbs,
$box,
$targets,
$timeline,
),
array(
'title' => $title,
'device' => true,
));
}
private function buildArtifacts(HarbormasterBuildTarget $build_target) {
$request = $this->getRequest();
$viewer = $request->getUser();
$artifacts = id(new HarbormasterBuildArtifactQuery())
->setViewer($viewer)
->withBuildTargetPHIDs(array($build_target->getPHID()))
->execute();
if (count($artifacts) === 0) {
return null;
}
$list = new PHUIObjectItemListView();
foreach ($artifacts as $artifact) {
$list->addItem($artifact->getObjectItemView($viewer));
}
$header = id(new PHUIHeaderView())
->setHeader(pht('Build Artifacts'))
->setUser($viewer);
$box = id(new PHUIObjectBoxView())
->setHeader($header);
return array($box, $list);
}
private function buildLog(
HarbormasterBuild $build,
HarbormasterBuildTarget $build_target) {
$request = $this->getRequest();
$viewer = $request->getUser();
$limit = $request->getInt('l', 25);
$logs = id(new HarbormasterBuildLogQuery())
->setViewer($viewer)
->withBuildTargetPHIDs(array($build_target->getPHID()))
->execute();
$log_boxes = array();
foreach ($logs as $log) {
$start = 1;
$lines = preg_split("/\r\n|\r|\n/", $log->getLogText());
if ($limit !== 0) {
$start = count($lines) - $limit;
if ($start >= 1) {
$lines = array_slice($lines, -$limit, $limit);
} else {
$start = 1;
}
}
$log_view = new ShellLogView();
$log_view->setLines($lines);
$log_view->setStart($start);
$header = id(new PHUIHeaderView())
->setHeader(pht(
'Build Log %d (%s - %s)',
$log->getID(),
$log->getLogSource(),
$log->getLogType()))
->setSubheader($this->createLogHeader($build, $log))
->setUser($viewer);
$log_boxes[] = id(new PHUIObjectBoxView())
->setHeader($header)
->setForm($log_view);
}
return $log_boxes;
}
private function createLogHeader($build, $log) {
$request = $this->getRequest();
$limit = $request->getInt('l', 25);
$lines_25 = $this->getApplicationURI('/build/'.$build->getID().'/?l=25');
$lines_50 = $this->getApplicationURI('/build/'.$build->getID().'/?l=50');
$lines_100 =
$this->getApplicationURI('/build/'.$build->getID().'/?l=100');
$lines_0 = $this->getApplicationURI('/build/'.$build->getID().'/?l=0');
$link_25 = phutil_tag('a', array('href' => $lines_25), pht('25'));
$link_50 = phutil_tag('a', array('href' => $lines_50), pht('50'));
$link_100 = phutil_tag('a', array('href' => $lines_100), pht('100'));
$link_0 = phutil_tag('a', array('href' => $lines_0), pht('Unlimited'));
if ($limit === 25) {
$link_25 = phutil_tag('strong', array(), $link_25);
} else if ($limit === 50) {
$link_50 = phutil_tag('strong', array(), $link_50);
} else if ($limit === 100) {
$link_100 = phutil_tag('strong', array(), $link_100);
} else if ($limit === 0) {
$link_0 = phutil_tag('strong', array(), $link_0);
}
return phutil_tag(
'span',
array(),
array(
$link_25,
' - ',
$link_50,
' - ',
$link_100,
' - ',
$link_0,
' Lines'));
}
private function buildActionList(HarbormasterBuild $build) {
$request = $this->getRequest();
$viewer = $request->getUser();
$id = $build->getID();
$list = id(new PhabricatorActionListView())
->setUser($viewer)
->setObject($build)
->setObjectURI("/build/{$id}");
$can_restart = $build->canRestartBuild();
$can_stop = $build->canStopBuild();
$can_resume = $build->canResumeBuild();
$list->addAction(
id(new PhabricatorActionView())
->setName(pht('Restart Build'))
->setIcon('fa-backward')
->setHref($this->getApplicationURI('/build/restart/'.$id.'/'))
->setDisabled(!$can_restart)
->setWorkflow(true));
$list->addAction(
id(new PhabricatorActionView())
->setName(pht('Stop Build'))
->setIcon('fa-stop')
->setHref($this->getApplicationURI('/build/stop/'.$id.'/'))
->setDisabled(!$can_stop)
->setWorkflow(true));
$list->addAction(
id(new PhabricatorActionView())
->setName(pht('Resume Build'))
->setIcon('fa-play')
->setHref($this->getApplicationURI('/build/resume/'.$id.'/'))
->setDisabled(!$can_resume)
->setWorkflow(true));
return $list;
}
private function buildPropertyLists(
PHUIObjectBoxView $box,
HarbormasterBuild $build,
PhabricatorActionListView $actions) {
$request = $this->getRequest();
$viewer = $request->getUser();
$properties = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($build)
->setActionList($actions);
$box->addPropertyList($properties);
$properties->addProperty(
pht('Status'),
$this->getStatus($build));
$handles = id(new PhabricatorHandleQuery())
->setViewer($viewer)
->withPHIDs(array(
$build->getBuildablePHID(),
$build->getBuildPlanPHID()))
->execute();
$properties->addProperty(
pht('Buildable'),
$handles[$build->getBuildablePHID()]->renderLink());
$properties->addProperty(
pht('Build Plan'),
$handles[$build->getBuildPlanPHID()]->renderLink());
}
private function getStatus(HarbormasterBuild $build) {
if ($build->isStopping()) {
return pht('Stopping');
}
return HarbormasterBuild::getBuildStatusName($build->getBuildStatus());
}
private function buildMessages(array $messages) {
$viewer = $this->getRequest()->getUser();
if ($messages) {
$handles = id(new PhabricatorHandleQuery())
->setViewer($viewer)
->withPHIDs(mpull($messages, 'getAuthorPHID'))
->execute();
} else {
$handles = array();
}
$rows = array();
foreach ($messages as $message) {
$rows[] = array(
$message->getID(),
$handles[$message->getAuthorPHID()]->renderLink(),
$message->getType(),
$message->getIsConsumed() ? pht('Consumed') : null,
phabricator_datetime($message->getDateCreated(), $viewer),
);
}
$table = new AphrontTableView($rows);
$table->setNoDataString(pht('No messages for this build target.'));
$table->setHeaders(
array(
pht('ID'),
pht('From'),
pht('Type'),
pht('Consumed'),
pht('Received'),
));
$table->setColumnClasses(
array(
'',
'',
'wide',
'',
'date',
));
$box = id(new PHUIObjectBoxView())
->setHeaderText(pht('Build Target Messages'))
->appendChild($table);
return $box;
}
}
diff --git a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
index 4bb38230c6..4486da3a1e 100644
--- a/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
+++ b/src/applications/harbormaster/query/HarbormasterBuildableSearchEngine.php
@@ -1,231 +1,231 @@
<?php
final class HarbormasterBuildableSearchEngine
extends PhabricatorApplicationSearchEngine {
public function getApplicationClassName() {
return 'PhabricatorApplicationHarbormaster';
}
public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery();
$revisions = $this->readPHIDsFromRequest(
$request,
'revisions',
array(
DifferentialPHIDTypeRevision::TYPECONST,
));
$repositories = $this->readPHIDsFromRequest(
$request,
'repositories',
array(
PhabricatorRepositoryPHIDTypeRepository::TYPECONST,
));
$container_phids = array_merge($revisions, $repositories);
$saved->setParameter('containerPHIDs', $container_phids);
$commits = $this->readPHIDsFromRequest(
$request,
'commits',
array(
PhabricatorRepositoryPHIDTypeCommit::TYPECONST,
));
$diffs = $this->readListFromRequest($request, 'diffs');
if ($diffs) {
$diffs = id(new DifferentialDiffQuery())
->setViewer($this->requireViewer())
->withIDs($diffs)
->execute();
$diffs = mpull($diffs, 'getPHID', 'getPHID');
}
$buildable_phids = array_merge($commits, $diffs);
$saved->setParameter('buildablePHIDs', $buildable_phids);
$saved->setParameter(
'manual',
$this->readBoolFromRequest($request, 'manual'));
return $saved;
}
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
$query = id(new HarbormasterBuildableQuery())
->needContainerHandles(true)
->needBuildableHandles(true);
$container_phids = $saved->getParameter('containerPHIDs', array());
if ($container_phids) {
$query->withContainerPHIDs($container_phids);
}
$buildable_phids = $saved->getParameter('buildablePHIDs', array());
if ($buildable_phids) {
$query->withBuildablePHIDs($buildable_phids);
}
$manual = $saved->getParameter('manual');
if ($manual !== null) {
$query->withManualBuildables($manual);
}
return $query;
}
public function buildSearchForm(
AphrontFormView $form,
PhabricatorSavedQuery $saved_query) {
$container_phids = $saved_query->getParameter('containerPHIDs', array());
$buildable_phids = $saved_query->getParameter('buildablePHIDs', array());
$all_phids = array_merge($container_phids, $buildable_phids);
$revision_names = array();
$diff_names = array();
$repository_names = array();
$commit_names = array();
if ($all_phids) {
$objects = id(new PhabricatorObjectQuery())
->setViewer($this->requireViewer())
->withPHIDs($all_phids)
->execute();
foreach ($all_phids as $phid) {
$object = idx($objects, $phid);
if (!$object) {
continue;
}
if ($object instanceof DifferentialRevision) {
$revision_names[] = 'D'.$object->getID();
} else if ($object instanceof DifferentialDiff) {
$diff_names[] = $object->getID();
} else if ($object instanceof PhabricatorRepository) {
$repository_names[] = 'r'.$object->getCallsign();
} else if ($object instanceof PhabricatorRepositoryCommit) {
$repository = $object->getRepository();
$commit_names[] = $repository->formatCommitName(
$object->getCommitIdentifier());
}
}
}
$form
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Differential Revisions'))
->setName('revisions')
->setValue(implode(', ', $revision_names)))
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Differential Diffs'))
->setName('diffs')
->setValue(implode(', ', $diff_names)))
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Repositories'))
->setName('repositories')
->setValue(implode(', ', $repository_names)))
->appendChild(
id(new AphrontFormTextControl())
->setLabel(pht('Commits'))
->setName('commits')
->setValue(implode(', ', $commit_names)))
->appendChild(
id(new AphrontFormSelectControl())
->setLabel(pht('Origin'))
->setName('manual')
->setValue($this->getBoolFromQuery($saved_query, 'manual'))
->setOptions(
array(
'' => pht('(All Origins)'),
'true' => pht('Manual Buildables'),
'false' => pht('Automatic Buildables'),
)));
}
protected function getURI($path) {
return '/harbormaster/'.$path;
}
public function getBuiltinQueryNames() {
$names = array(
'all' => pht('All Buildables'),
);
return $names;
}
public function buildSavedQueryFromBuiltin($query_key) {
$query = $this->newSavedQuery();
$query->setQueryKey($query_key);
switch ($query_key) {
case 'all':
return $query;
}
return parent::buildSavedQueryFromBuiltin($query_key);
}
protected function renderResultList(
array $buildables,
PhabricatorSavedQuery $query,
array $handles) {
assert_instances_of($buildables, 'HarbormasterBuildable');
$viewer = $this->requireViewer();
$list = new PHUIObjectItemListView();
$list->setCards(true);
foreach ($buildables as $buildable) {
$id = $buildable->getID();
$item = id(new PHUIObjectItemView())
->setHeader(pht('Buildable %d', $buildable->getID()));
if ($buildable->getContainerHandle() !== null) {
$item->addAttribute($buildable->getContainerHandle()->getName());
}
if ($buildable->getBuildableHandle() !== null) {
$item->addAttribute($buildable->getBuildableHandle()->getFullName());
}
if ($id) {
$item->setHref("/B{$id}");
}
if ($buildable->getIsManualBuildable()) {
- $item->addIcon('wrench-grey', pht('Manual'));
+ $item->addIcon('fa-wrench grey', pht('Manual'));
}
switch ($buildable->getBuildableStatus()) {
case HarbormasterBuildable::STATUS_PASSED:
$item->setBarColor('green');
$item->addByline(pht('Build Passed'));
break;
case HarbormasterBuildable::STATUS_FAILED:
$item->setBarColor('red');
$item->addByline(pht('Build Failed'));
break;
case HarbormasterBuildable::STATUS_BUILDING:
$item->setBarColor('red');
$item->addByline(pht('Building'));
break;
}
$list->addItem($item);
}
return $list;
}
}
diff --git a/src/applications/herald/controller/HeraldRuleViewController.php b/src/applications/herald/controller/HeraldRuleViewController.php
index cea388ad3e..78c61194d1 100644
--- a/src/applications/herald/controller/HeraldRuleViewController.php
+++ b/src/applications/herald/controller/HeraldRuleViewController.php
@@ -1,189 +1,189 @@
<?php
final class HeraldRuleViewController extends HeraldController {
private $id;
public function willProcessRequest(array $data) {
$this->id = $data['id'];
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$rule = id(new HeraldRuleQuery())
->setViewer($viewer)
->withIDs(array($this->id))
->needConditionsAndActions(true)
->executeOne();
if (!$rule) {
return new Aphront404Response();
}
$header = id(new PHUIHeaderView())
->setUser($viewer)
->setHeader($rule->getName())
->setPolicyObject($rule);
if ($rule->getIsDisabled()) {
$header->setStatus(
- 'oh-open',
- 'red',
+ 'fa-ban',
+ 'dark',
pht('Disabled'));
} else {
$header->setStatus(
- 'oh-open',
- null,
+ 'fa-check',
+ 'bluegrey',
pht('Active'));
}
$actions = $this->buildActionView($rule);
$properties = $this->buildPropertyView($rule, $actions);
$id = $rule->getID();
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb("H{$id}");
$crumbs->setActionList($actions);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
$timeline = $this->buildTimeline($rule);
return $this->buildApplicationPage(
array(
$crumbs,
$object_box,
$timeline,
),
array(
'title' => $rule->getName(),
'device' => true,
));
}
private function buildActionView(HeraldRule $rule) {
$viewer = $this->getRequest()->getUser();
$id = $rule->getID();
$view = id(new PhabricatorActionListView())
->setUser($viewer)
->setObject($rule)
->setObjectURI($this->getApplicationURI("rule/{$id}/"));
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$rule,
PhabricatorPolicyCapability::CAN_EDIT);
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Rule'))
->setHref($this->getApplicationURI("edit/{$id}/"))
->setIcon('fa-pencil')
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
if ($rule->getIsDisabled()) {
$disable_uri = "disable/{$id}/enable/";
$disable_icon = 'fa-check-circle-o';
$disable_name = pht('Enable Rule');
} else {
$disable_uri = "disable/{$id}/disable/";
$disable_icon = 'fa-ban';
$disable_name = pht('Disable Rule');
}
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Disable Rule'))
->setHref($this->getApplicationURI($disable_uri))
->setIcon($disable_icon)
->setName($disable_name)
->setDisabled(!$can_edit)
->setWorkflow(true));
return $view;
}
private function buildPropertyView(
HeraldRule $rule,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$this->loadHandles(HeraldAdapter::getHandlePHIDs($rule));
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($rule)
->setActionList($actions);
$view->addProperty(
pht('Rule Type'),
idx(HeraldRuleTypeConfig::getRuleTypeMap(), $rule->getRuleType()));
if ($rule->isPersonalRule()) {
$view->addProperty(
pht('Author'),
$this->getHandle($rule->getAuthorPHID())->renderLink());
}
$adapter = HeraldAdapter::getAdapterForContentType($rule->getContentType());
if ($adapter) {
$view->addProperty(
pht('Applies To'),
idx(
HeraldAdapter::getEnabledAdapterMap($viewer),
$rule->getContentType()));
if ($rule->isObjectRule()) {
$view->addProperty(
pht('Trigger Object'),
$this->getHandle($rule->getTriggerObjectPHID())->renderLink());
}
$view->invokeWillRenderEvent();
$view->addSectionHeader(
pht('Rule Description'),
PHUIPropertyListView::ICON_SUMMARY);
$view->addTextContent(
$adapter->renderRuleAsText($rule, $this->getLoadedHandles()));
}
return $view;
}
private function buildTimeline(HeraldRule $rule) {
$viewer = $this->getRequest()->getUser();
$xactions = id(new HeraldTransactionQuery())
->setViewer($viewer)
->withObjectPHIDs(array($rule->getPHID()))
->needComments(true)
->execute();
$engine = id(new PhabricatorMarkupEngine())
->setViewer($viewer);
foreach ($xactions as $xaction) {
if ($xaction->getComment()) {
$engine->addObject(
$xaction->getComment(),
PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
}
}
$engine->process();
return id(new PhabricatorApplicationTransactionView())
->setUser($viewer)
->setObjectPHID($rule->getPHID())
->setTransactions($xactions)
->setMarkupEngine($engine);
}
}
diff --git a/src/applications/maniphest/constants/ManiphestTaskStatus.php b/src/applications/maniphest/constants/ManiphestTaskStatus.php
index f7b552cdfc..d3a75050ac 100644
--- a/src/applications/maniphest/constants/ManiphestTaskStatus.php
+++ b/src/applications/maniphest/constants/ManiphestTaskStatus.php
@@ -1,313 +1,312 @@
<?php
/**
* @task validate Configuration Validation
*/
final class ManiphestTaskStatus extends ManiphestConstants {
const STATUS_OPEN = 'open';
const STATUS_CLOSED_RESOLVED = 'resolved';
const STATUS_CLOSED_WONTFIX = 'wontfix';
const STATUS_CLOSED_INVALID = 'invalid';
const STATUS_CLOSED_DUPLICATE = 'duplicate';
const STATUS_CLOSED_SPITE = 'spite';
const SPECIAL_DEFAULT = 'default';
const SPECIAL_CLOSED = 'closed';
const SPECIAL_DUPLICATE = 'duplicate';
private static function getStatusConfig() {
return PhabricatorEnv::getEnvConfig('maniphest.statuses');
}
private static function getEnabledStatusMap() {
$spec = self::getStatusConfig();
$is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
foreach ($spec as $const => $status) {
if ($is_serious && !empty($status['silly'])) {
unset($spec[$const]);
continue;
}
}
return $spec;
}
public static function getTaskStatusMap() {
return ipull(self::getEnabledStatusMap(), 'name');
}
public static function getTaskStatusName($status) {
return self::getStatusAttribute($status, 'name', pht('Unknown Status'));
}
public static function getTaskStatusFullName($status) {
$name = self::getStatusAttribute($status, 'name.full');
if ($name !== null) {
return $name;
}
return self::getStatusAttribute($status, 'name', pht('Unknown Status'));
}
public static function renderFullDescription($status) {
if (self::isOpenStatus($status)) {
$color = 'status';
- $icon = 'oh-open';
+ $icon = 'fa-square-o bluegrey';
} else {
$color = 'status-dark';
- $icon = 'oh-closed-dark';
+ $icon = 'fa-check-square-o';
}
$img = id(new PHUIIconView())
- ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
- ->setSpriteIcon($icon);
+ ->setIconFont($icon);
$tag = phutil_tag(
'span',
array(
'class' => 'phui-header-'.$color.' plr',
),
array(
$img,
self::getTaskStatusFullName($status),
));
return $tag;
}
private static function getSpecialStatus($special) {
foreach (self::getStatusConfig() as $const => $status) {
if (idx($status, 'special') == $special) {
return $const;
}
}
return null;
}
public static function getDefaultStatus() {
return self::getSpecialStatus(self::SPECIAL_DEFAULT);
}
public static function getDefaultClosedStatus() {
return self::getSpecialStatus(self::SPECIAL_CLOSED);
}
public static function getDuplicateStatus() {
return self::getSpecialStatus(self::SPECIAL_DUPLICATE);
}
public static function getOpenStatusConstants() {
$result = array();
foreach (self::getEnabledStatusMap() as $const => $status) {
if (empty($status['closed'])) {
$result[] = $const;
}
}
return $result;
}
public static function getClosedStatusConstants() {
$all = array_keys(self::getTaskStatusMap());
$open = self::getOpenStatusConstants();
return array_diff($all, $open);
}
public static function isOpenStatus($status) {
foreach (self::getOpenStatusConstants() as $constant) {
if ($status == $constant) {
return true;
}
}
return false;
}
public static function isClosedStatus($status) {
return !self::isOpenStatus($status);
}
public static function getStatusActionName($status) {
return self::getStatusAttribute($status, 'name.action');
}
public static function getStatusColor($status) {
return self::getStatusAttribute($status, 'transaction.color');
}
public static function getStatusIcon($status) {
return self::getStatusAttribute($status, 'transaction.icon');
}
public static function getStatusPrefixMap() {
$map = array();
foreach (self::getEnabledStatusMap() as $const => $status) {
foreach (idx($status, 'prefixes', array()) as $prefix) {
$map[$prefix] = $const;
}
}
$map += array(
'ref' => null,
'refs' => null,
'references' => null,
'cf.' => null,
);
return $map;
}
public static function getStatusSuffixMap() {
$map = array();
foreach (self::getEnabledStatusMap() as $const => $status) {
foreach (idx($status, 'suffixes', array()) as $prefix) {
$map[$prefix] = $const;
}
}
return $map;
}
private static function getStatusAttribute($status, $key, $default = null) {
$config = self::getStatusConfig();
$spec = idx($config, $status);
if ($spec) {
return idx($spec, $key, $default);
}
return $default;
}
/* -( Configuration Validation )------------------------------------------- */
/**
* @task validate
*/
public static function isValidStatusConstant($constant) {
if (strlen($constant) > 12) {
return false;
}
if (!preg_match('/^[a-z0-9]+\z/', $constant)) {
return false;
}
return true;
}
/**
* @task validate
*/
public static function validateConfiguration(array $config) {
foreach ($config as $key => $value) {
if (!self::isValidStatusConstant($key)) {
throw new Exception(
pht(
'Key "%s" is not a valid status constant. Status constants must '.
'be 1-12 characters long and contain only lowercase letters (a-z) '.
'and digits (0-9). For example, "%s" or "%s" are reasonable '.
'choices.',
$key,
'open',
'closed'));
}
if (!is_array($value)) {
throw new Exception(
pht(
'Value for key "%s" should be a dictionary.',
$key));
}
PhutilTypeSpec::checkMap(
$value,
array(
'name' => 'string',
'name.full' => 'optional string',
'name.action' => 'optional string',
'closed' => 'optional bool',
'special' => 'optional string',
'transaction.icon' => 'optional string',
'transaction.color' => 'optional string',
'silly' => 'optional bool',
'prefixes' => 'optional list<string>',
'suffixes' => 'optional list<string>',
));
}
$special_map = array();
foreach ($config as $key => $value) {
$special = idx($value, 'special');
if (!$special) {
continue;
}
if (isset($special_map[$special])) {
throw new Exception(
pht(
'Configuration has two statuses both marked with the special '.
'attribute "%s" ("%s" and "%s"). There should be only one.',
$special,
$special_map[$special],
$key));
}
switch ($special) {
case self::SPECIAL_DEFAULT:
if (!empty($value['closed'])) {
throw new Exception(
pht(
'Status "%s" is marked as default, but it is a closed '.
'status. The default status should be an open status.',
$key));
}
break;
case self::SPECIAL_CLOSED:
if (empty($value['closed'])) {
throw new Exception(
pht(
'Status "%s" is marked as the default status for closing '.
'tasks, but is not a closed status. It should be a closed '.
'status.',
$key));
}
break;
case self::SPECIAL_DUPLICATE:
if (empty($value['closed'])) {
throw new Exception(
pht(
'Status "%s" is marked as the status for closing tasks as '.
'duplicates, but it is not a closed status. It should '.
'be a closed status.',
$key));
}
break;
}
$special_map[$special] = $key;
}
// NOTE: We're not explicitly validating that we have at least one open
// and one closed status, because the DEFAULT and CLOSED specials imply
// that to be true. If those change in the future, that might become a
// reasonable thing to validate.
$required = array(
self::SPECIAL_DEFAULT,
self::SPECIAL_CLOSED,
self::SPECIAL_DUPLICATE,
);
foreach ($required as $required_special) {
if (!isset($special_map[$required_special])) {
throw new Exception(
pht(
'Configuration defines no task status with special attribute '.
'"%s", but you must specify a status which fills this special '.
'role.',
$required_special));
}
}
}
}
diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
index a932a839af..b2cc713181 100644
--- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
+++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php
@@ -1,153 +1,153 @@
<?php
final class PhabricatorApplicationDetailViewController
extends PhabricatorApplicationsController{
private $application;
public function willProcessRequest(array $data) {
$this->application = $data['application'];
}
public function processRequest() {
$request = $this->getRequest();
$user = $request->getUser();
$selected = id(new PhabricatorApplicationQuery())
->setViewer($user)
->withClasses(array($this->application))
->executeOne();
if (!$selected) {
return new Aphront404Response();
}
$title = $selected->getName();
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb($selected->getName());
$header = id(new PHUIHeaderView())
->setHeader($title)
->setUser($user)
->setPolicyObject($selected);
if ($selected->isInstalled()) {
- $header->setStatus('oh-ok', null, pht('Installed'));
+ $header->setStatus('fa-check', 'bluegrey', pht('Installed'));
} else {
- $header->setStatus('policy-noone', null, pht('Uninstalled'));
+ $header->setStatus('fa-ban', 'dark', pht('Uninstalled'));
}
$actions = $this->buildActionView($user, $selected);
$properties = $this->buildPropertyView($selected, $actions);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
return $this->buildApplicationPage(
array(
$crumbs,
$object_box,
),
array(
'title' => $title,
'device' => true,
));
}
private function buildPropertyView(
PhabricatorApplication $application,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$properties = id(new PHUIPropertyListView())
->addProperty(pht('Description'), $application->getShortDescription());
$properties->setActionList($actions);
if ($application->isBeta()) {
$properties->addProperty(
pht('Release'),
pht('Beta'));
}
$descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
$viewer,
$application);
$properties->addSectionHeader(pht('Policies'));
foreach ($application->getCapabilities() as $capability) {
$properties->addProperty(
$application->getCapabilityLabel($capability),
idx($descriptions, $capability));
}
return $properties;
}
private function buildActionView(
PhabricatorUser $user,
PhabricatorApplication $selected) {
$view = id(new PhabricatorActionListView())
->setUser($user)
->setObjectURI($this->getRequest()->getRequestURI());
$can_edit = PhabricatorPolicyFilter::hasCapability(
$user,
$selected,
PhabricatorPolicyCapability::CAN_EDIT);
$edit_uri = $this->getApplicationURI('edit/'.get_class($selected).'/');
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Policies'))
->setIcon('fa-pencil')
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit)
->setHref($edit_uri));
if ($selected->canUninstall()) {
if ($selected->isInstalled()) {
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Uninstall'))
->setIcon('fa-times')
->setDisabled(!$can_edit)
->setWorkflow(true)
->setHref(
$this->getApplicationURI(get_class($selected).'/uninstall/')));
} else {
$action = id(new PhabricatorActionView())
->setName(pht('Install'))
->setIcon('fa-plus')
->setDisabled(!$can_edit)
->setWorkflow(true)
->setHref(
$this->getApplicationURI(get_class($selected).'/install/'));
$beta_enabled = PhabricatorEnv::getEnvConfig(
'phabricator.show-beta-applications');
if ($selected->isBeta() && !$beta_enabled) {
$action->setDisabled(true);
}
$view->addAction($action);
}
} else {
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Uninstall'))
->setIcon('fa-times')
->setWorkflow(true)
->setDisabled(true)
->setHref(
$this->getApplicationURI(get_class($selected).'/uninstall/')));
}
return $view;
}
}
diff --git a/src/applications/passphrase/controller/PassphraseCredentialViewController.php b/src/applications/passphrase/controller/PassphraseCredentialViewController.php
index bab9e17629..3c5a836761 100644
--- a/src/applications/passphrase/controller/PassphraseCredentialViewController.php
+++ b/src/applications/passphrase/controller/PassphraseCredentialViewController.php
@@ -1,208 +1,208 @@
<?php
final class PassphraseCredentialViewController extends PassphraseController {
private $id;
public function willProcessRequest(array $data) {
$this->id = $data['id'];
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$credential = id(new PassphraseCredentialQuery())
->setViewer($viewer)
->withIDs(array($this->id))
->executeOne();
if (!$credential) {
return new Aphront404Response();
}
$type = PassphraseCredentialType::getTypeByConstant(
$credential->getCredentialType());
if (!$type) {
throw new Exception(pht('Credential has invalid type "%s"!', $type));
}
$xactions = id(new PassphraseCredentialTransactionQuery())
->setViewer($viewer)
->withObjectPHIDs(array($credential->getPHID()))
->execute();
$engine = id(new PhabricatorMarkupEngine())
->setViewer($viewer);
$timeline = id(new PhabricatorApplicationTransactionView())
->setUser($viewer)
->setObjectPHID($credential->getPHID())
->setTransactions($xactions);
$title = pht('%s %s', 'K'.$credential->getID(), $credential->getName());
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb('K'.$credential->getID());
$header = $this->buildHeaderView($credential);
$actions = $this->buildActionView($credential, $type);
$properties = $this->buildPropertyView($credential, $type, $actions);
$box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
return $this->buildApplicationPage(
array(
$crumbs,
$box,
$timeline,
),
array(
'title' => $title,
'device' => true,
));
}
private function buildHeaderView(PassphraseCredential $credential) {
$viewer = $this->getRequest()->getUser();
$header = id(new PHUIHeaderView())
->setUser($viewer)
->setHeader($credential->getName())
->setPolicyObject($credential);
if ($credential->getIsDestroyed()) {
- $header->setStatus('reject', 'red', pht('Destroyed'));
+ $header->setStatus('fa-ban', 'red', pht('Destroyed'));
}
return $header;
}
private function buildActionView(
PassphraseCredential $credential,
PassphraseCredentialType $type) {
$viewer = $this->getRequest()->getUser();
$id = $credential->getID();
$is_locked = $credential->getIsLocked();
if ($is_locked) {
$credential_lock_text = pht('Locked Permanently');
$credential_lock_icon = 'fa-lock';
} else {
$credential_lock_text = pht('Lock Permanently');
$credential_lock_icon = 'fa-unlock';
}
$actions = id(new PhabricatorActionListView())
->setObjectURI('/K'.$id)
->setUser($viewer);
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$credential,
PhabricatorPolicyCapability::CAN_EDIT);
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Credential'))
->setIcon('fa-pencil')
->setHref($this->getApplicationURI("edit/{$id}/"))
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
if (!$credential->getIsDestroyed()) {
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Destroy Credential'))
->setIcon('fa-times')
->setHref($this->getApplicationURI("destroy/{$id}/"))
->setDisabled(!$can_edit)
->setWorkflow(true));
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Show Secret'))
->setIcon('fa-eye')
->setHref($this->getApplicationURI("reveal/{$id}/"))
->setDisabled(!$can_edit || $is_locked)
->setWorkflow(true));
if ($type->hasPublicKey()) {
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Show Public Key'))
->setIcon('fa-download')
->setHref($this->getApplicationURI("public/{$id}/"))
->setWorkflow(true)
->setDisabled($is_locked));
}
$actions->addAction(
id(new PhabricatorActionView())
->setName($credential_lock_text)
->setIcon($credential_lock_icon)
->setHref($this->getApplicationURI("lock/{$id}/"))
->setDisabled($is_locked)
->setWorkflow(true));
}
return $actions;
}
private function buildPropertyView(
PassphraseCredential $credential,
PassphraseCredentialType $type,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$properties = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($credential)
->setActionList($actions);
$properties->addProperty(
pht('Credential Type'),
$type->getCredentialTypeName());
$descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
$viewer,
$credential);
$properties->addProperty(
pht('Editable By'),
$descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
$properties->addProperty(
pht('Username'),
$credential->getUsername());
$used_by_phids = PhabricatorEdgeQuery::loadDestinationPHIDs(
$credential->getPHID(),
PhabricatorEdgeConfig::TYPE_CREDENTIAL_USED_BY_OBJECT);
if ($used_by_phids) {
$this->loadHandles($used_by_phids);
$properties->addProperty(
pht('Used By'),
$this->renderHandlesForPHIDs($used_by_phids));
}
$description = $credential->getDescription();
if (strlen($description)) {
$properties->addSectionHeader(
pht('Description'),
PHUIPropertyListView::ICON_SUMMARY);
$properties->addTextContent(
PhabricatorMarkupEngine::renderOneObject(
id(new PhabricatorMarkupOneOff())
->setContent($description),
'default',
$viewer));
}
return $properties;
}
}
diff --git a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
index e4e99790ca..6028547b50 100644
--- a/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
+++ b/src/applications/passphrase/query/PassphraseCredentialSearchEngine.php
@@ -1,116 +1,116 @@
<?php
final class PassphraseCredentialSearchEngine
extends PhabricatorApplicationSearchEngine {
public function getApplicationClassName() {
return 'PhabricatorApplicationPassphrase';
}
public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery();
$saved->setParameter(
'isDestroyed',
$this->readBoolFromRequest($request, 'isDestroyed'));
return $saved;
}
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
$query = id(new PassphraseCredentialQuery());
$destroyed = $saved->getParameter('isDestroyed');
if ($destroyed !== null) {
$query->withIsDestroyed($destroyed);
}
return $query;
}
public function buildSearchForm(
AphrontFormView $form,
PhabricatorSavedQuery $saved_query) {
$form->appendChild(
id(new AphrontFormSelectControl())
->setName('isDestroyed')
->setLabel(pht('Status'))
->setValue($this->getBoolFromQuery($saved_query, 'isDestroyed'))
->setOptions(
array(
'' => pht('Show All Credentials'),
'false' => pht('Show Only Active Credentials'),
'true' => pht('Show Only Destroyed Credentials'),
)));
}
protected function getURI($path) {
return '/passphrase/'.$path;
}
public function getBuiltinQueryNames() {
$names = array(
'active' => pht('Active Credentials'),
'all' => pht('All Credentials'),
);
return $names;
}
public function buildSavedQueryFromBuiltin($query_key) {
$query = $this->newSavedQuery();
$query->setQueryKey($query_key);
switch ($query_key) {
case 'all':
return $query;
case 'active':
return $query->setParameter('isDestroyed', false);
}
return parent::buildSavedQueryFromBuiltin($query_key);
}
protected function renderResultList(
array $credentials,
PhabricatorSavedQuery $query,
array $handles) {
assert_instances_of($credentials, 'PassphraseCredential');
$viewer = $this->requireViewer();
$list = new PHUIObjectItemListView();
$list->setUser($viewer);
foreach ($credentials as $credential) {
$item = id(new PHUIObjectItemView())
->setObjectName('K'.$credential->getID())
->setHeader($credential->getName())
->setHref('/K'.$credential->getID())
->setObject($credential);
$item->addAttribute(
pht('Login: %s', $credential->getUsername()));
if ($credential->getIsDestroyed()) {
- $item->addIcon('disable', pht('Destroyed'));
+ $item->addIcon('fa-ban', pht('Destroyed'));
$item->setDisabled(true);
}
$type = PassphraseCredentialType::getTypeByConstant(
$credential->getCredentialType());
if ($type) {
- $item->addIcon('wrench', $type->getCredentialTypeName());
+ $item->addIcon('fa-wrench', $type->getCredentialTypeName());
}
$list->addItem($item);
}
return $list;
}
}
diff --git a/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php b/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php
index db6295006f..a4c344c326 100644
--- a/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php
+++ b/src/applications/people/phid/PhabricatorPeoplePHIDTypeUser.php
@@ -1,90 +1,90 @@
<?php
final class PhabricatorPeoplePHIDTypeUser extends PhabricatorPHIDType {
const TYPECONST = 'USER';
public function getTypeConstant() {
return self::TYPECONST;
}
public function getTypeName() {
return pht('User');
}
public function getPHIDTypeApplicationClass() {
return 'PhabricatorApplicationPeople';
}
public function getTypeIcon() {
- return 'policy-all';
+ return 'fa-user bluegrey';
}
public function newObject() {
return new PhabricatorUser();
}
protected function buildQueryForObjects(
PhabricatorObjectQuery $query,
array $phids) {
return id(new PhabricatorPeopleQuery())
->withPHIDs($phids)
->needProfileImage(true)
->needStatus(true);
}
public function loadHandles(
PhabricatorHandleQuery $query,
array $handles,
array $objects) {
foreach ($handles as $phid => $handle) {
$user = $objects[$phid];
$realname = $user->getRealName();
$handle->setName($user->getUsername());
$handle->setURI('/p/'.$user->getUsername().'/');
$handle->setFullName($user->getFullName());
$handle->setImageURI($user->loadProfileImageURI());
$handle->setDisabled(!$user->isUserActivated());
if ($user->hasStatus()) {
$status = $user->getStatus();
$handle->setStatus($status->getTextStatus());
$handle->setTitle($status->getTerseSummary($query->getViewer()));
}
}
}
public function canLoadNamedObject($name) {
return preg_match('/^@.+/', $name);
}
public function loadNamedObjects(
PhabricatorObjectQuery $query,
array $names) {
$id_map = array();
foreach ($names as $name) {
$id = substr($name, 1);
$id_map[$id][] = $name;
}
$objects = id(new PhabricatorPeopleQuery())
->setViewer($query->getViewer())
->withUsernames(array_keys($id_map))
->execute();
$results = array();
foreach ($objects as $id => $object) {
$username = $object->getUsername();
foreach (idx($id_map, $username, array()) as $name) {
$results[$name] = $object;
}
}
return $results;
}
}
diff --git a/src/applications/policy/storage/PhabricatorPolicy.php b/src/applications/policy/storage/PhabricatorPolicy.php
index c32bb450a5..5240a64c80 100644
--- a/src/applications/policy/storage/PhabricatorPolicy.php
+++ b/src/applications/policy/storage/PhabricatorPolicy.php
@@ -1,355 +1,354 @@
<?php
final class PhabricatorPolicy
extends PhabricatorPolicyDAO
implements PhabricatorPolicyInterface {
const ACTION_ALLOW = 'allow';
const ACTION_DENY = 'deny';
private $name;
private $shortName;
private $type;
private $href;
private $workflow;
private $icon;
protected $rules = array();
protected $defaultAction = self::ACTION_DENY;
private $ruleObjects = self::ATTACHABLE;
public function getConfiguration() {
return array(
self::CONFIG_AUX_PHID => true,
self::CONFIG_SERIALIZATION => array(
'rules' => self::SERIALIZATION_JSON,
),
) + parent::getConfiguration();
}
public function generatePHID() {
return PhabricatorPHID::generateNewPHID(
PhabricatorPolicyPHIDTypePolicy::TYPECONST);
}
public static function newFromPolicyAndHandle(
$policy_identifier,
PhabricatorObjectHandle $handle = null) {
$is_global = PhabricatorPolicyQuery::isGlobalPolicy($policy_identifier);
if ($is_global) {
return PhabricatorPolicyQuery::getGlobalPolicy($policy_identifier);
}
if (!$handle) {
throw new Exception(
"Policy identifier is an object PHID ('{$policy_identifier}'), but no ".
"object handle was provided. A handle must be provided for object ".
"policies.");
}
$handle_phid = $handle->getPHID();
if ($policy_identifier != $handle_phid) {
throw new Exception(
"Policy identifier is an object PHID ('{$policy_identifier}'), but ".
"the provided handle has a different PHID ('{$handle_phid}'). The ".
"handle must correspond to the policy identifier.");
}
$policy = id(new PhabricatorPolicy())
->setPHID($policy_identifier)
->setHref($handle->getURI());
$phid_type = phid_get_type($policy_identifier);
switch ($phid_type) {
case PhabricatorProjectPHIDTypeProject::TYPECONST:
$policy->setType(PhabricatorPolicyType::TYPE_PROJECT);
$policy->setName($handle->getName());
break;
case PhabricatorPeoplePHIDTypeUser::TYPECONST:
$policy->setType(PhabricatorPolicyType::TYPE_USER);
$policy->setName($handle->getFullName());
break;
case PhabricatorPolicyPHIDTypePolicy::TYPECONST:
// TODO: This creates a weird handle-based version of a rule policy.
// It behaves correctly, but can't be applied since it doesn't have
// any rules. It is used to render transactions, and might need some
// cleanup.
break;
default:
$policy->setType(PhabricatorPolicyType::TYPE_MASKED);
$policy->setName($handle->getFullName());
break;
}
$policy->makeEphemeral();
return $policy;
}
public function setType($type) {
$this->type = $type;
return $this;
}
public function getType() {
if (!$this->type) {
return PhabricatorPolicyType::TYPE_CUSTOM;
}
return $this->type;
}
public function setName($name) {
$this->name = $name;
return $this;
}
public function getName() {
if (!$this->name) {
return pht('Custom Policy');
}
return $this->name;
}
public function setShortName($short_name) {
$this->shortName = $short_name;
return $this;
}
public function getShortName() {
if ($this->shortName) {
return $this->shortName;
}
return $this->getName();
}
public function setHref($href) {
$this->href = $href;
return $this;
}
public function getHref() {
return $this->href;
}
public function setWorkflow($workflow) {
$this->workflow = $workflow;
return $this;
}
public function getWorkflow() {
return $this->workflow;
}
public function getIcon() {
switch ($this->getType()) {
case PhabricatorPolicyType::TYPE_GLOBAL:
static $map = array(
- PhabricatorPolicies::POLICY_PUBLIC => 'policy-public',
- PhabricatorPolicies::POLICY_USER => 'policy-all',
- PhabricatorPolicies::POLICY_ADMIN => 'policy-admin',
- PhabricatorPolicies::POLICY_NOONE => 'policy-noone',
+ PhabricatorPolicies::POLICY_PUBLIC => 'fa-globe',
+ PhabricatorPolicies::POLICY_USER => 'fa-users',
+ PhabricatorPolicies::POLICY_ADMIN => 'fa-eye',
+ PhabricatorPolicies::POLICY_NOONE => 'fa-ban',
);
- return idx($map, $this->getPHID(), 'policy-unknown');
+ return idx($map, $this->getPHID(), 'fa-question-circle');
case PhabricatorPolicyType::TYPE_USER:
- return 'policy-user';
+ return 'fa-user';
case PhabricatorPolicyType::TYPE_PROJECT:
- return 'policy-project';
+ return 'fa-briefcase';
case PhabricatorPolicyType::TYPE_CUSTOM:
case PhabricatorPolicyType::TYPE_MASKED:
- return 'policy-custom';
+ return 'fa-certificate';
default:
- return 'policy-unknown';
+ return 'fa-question-circle';
}
}
public function getSortKey() {
return sprintf(
'%02d%s',
PhabricatorPolicyType::getPolicyTypeOrder($this->getType()),
$this->getSortName());
}
private function getSortName() {
if ($this->getType() == PhabricatorPolicyType::TYPE_GLOBAL) {
static $map = array(
PhabricatorPolicies::POLICY_PUBLIC => 0,
PhabricatorPolicies::POLICY_USER => 1,
PhabricatorPolicies::POLICY_ADMIN => 2,
PhabricatorPolicies::POLICY_NOONE => 3,
);
return idx($map, $this->getPHID());
}
return $this->getName();
}
public static function getPolicyExplanation(
PhabricatorUser $viewer,
$policy) {
switch ($policy) {
case PhabricatorPolicies::POLICY_PUBLIC:
return pht('This object is public.');
case PhabricatorPolicies::POLICY_USER:
return pht('Logged in users can take this action.');
case PhabricatorPolicies::POLICY_ADMIN:
return pht('Administrators can take this action.');
case PhabricatorPolicies::POLICY_NOONE:
return pht('By default, no one can take this action.');
default:
$handle = id(new PhabricatorHandleQuery())
->setViewer($viewer)
->withPHIDs(array($policy))
->executeOne();
$type = phid_get_type($policy);
if ($type == PhabricatorProjectPHIDTypeProject::TYPECONST) {
return pht(
'Members of the project "%s" can take this action.',
$handle->getFullName());
} else if ($type == PhabricatorPeoplePHIDTypeUser::TYPECONST) {
return pht(
'%s can take this action.',
$handle->getFullName());
} else if ($type == PhabricatorPolicyPHIDTypePolicy::TYPECONST) {
return pht(
'This object has a custom policy controlling who can take this '.
'action.');
} else {
return pht(
'This object has an unknown or invalid policy setting ("%s").',
$policy);
}
}
}
public function getFullName() {
switch ($this->getType()) {
case PhabricatorPolicyType::TYPE_PROJECT:
return pht('Project: %s', $this->getName());
case PhabricatorPolicyType::TYPE_MASKED:
return pht('Other: %s', $this->getName());
default:
return $this->getName();
}
}
public function renderDescription($icon=false) {
$img = null;
if ($icon) {
$img = id(new PHUIIconView())
- ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
- ->setSpriteIcon($this->getIcon());
+ ->setIconFont($this->getIcon());
}
if ($this->getHref()) {
$desc = javelin_tag(
'a',
array(
'href' => $this->getHref(),
'class' => 'policy-link',
'sigil' => $this->getWorkflow() ? 'workflow' : null,
),
array(
$img,
$this->getName(),
));
} else {
if ($img) {
$desc = array($img, $this->getName());
} else {
$desc = $this->getName();
}
}
switch ($this->getType()) {
case PhabricatorPolicyType::TYPE_PROJECT:
return pht('%s (Project)', $desc);
case PhabricatorPolicyType::TYPE_CUSTOM:
return $desc;
case PhabricatorPolicyType::TYPE_MASKED:
return pht(
'%s (You do not have permission to view policy details.)',
$desc);
default:
return $desc;
}
}
/**
* Return a list of custom rule classes (concrete subclasses of
* @{class:PhabricatorPolicyRule}) this policy uses.
*
* @return list<string> List of class names.
*/
public function getCustomRuleClasses() {
$classes = array();
foreach ($this->getRules() as $rule) {
$class = idx($rule, 'rule');
try {
if (class_exists($class)) {
$classes[$class] = $class;
}
} catch (Exception $ex) {
continue;
}
}
return array_keys($classes);
}
/**
* Return a list of all values used by a given rule class to implement this
* policy. This is used to bulk load data (like project memberships) in order
* to apply policy filters efficiently.
*
* @param string Policy rule classname.
* @return list<wild> List of values used in this policy.
*/
public function getCustomRuleValues($rule_class) {
$values = array();
foreach ($this->getRules() as $rule) {
if ($rule['rule'] == $rule_class) {
$values[] = $rule['value'];
}
}
return $values;
}
public function attachRuleObjects(array $objects) {
$this->ruleObjects = $objects;
return $this;
}
public function getRuleObjects() {
return $this->assertAttached($this->ruleObjects);
}
/* -( PhabricatorPolicyInterface )----------------------------------------- */
public function getCapabilities() {
return array(
PhabricatorPolicyCapability::CAN_VIEW,
);
}
public function getPolicy($capability) {
// NOTE: We implement policies only so we can comply with the interface.
// The actual query skips them, as enforcing policies on policies seems
// perilous and isn't currently required by the application.
return PhabricatorPolicies::POLICY_PUBLIC;
}
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
return false;
}
public function describeAutomaticCapability($capability) {
return null;
}
}
diff --git a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php
index 36b15e130e..7277f114d8 100644
--- a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php
+++ b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php
@@ -1,165 +1,165 @@
<?php
final class PhabricatorProjectColumnDetailController
extends PhabricatorProjectBoardController {
private $id;
private $projectID;
public function willProcessRequest(array $data) {
$this->projectID = $data['projectID'];
$this->id = idx($data, 'id');
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$project = id(new PhabricatorProjectQuery())
->setViewer($viewer)
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
))
->withIDs(array($this->projectID))
->executeOne();
if (!$project) {
return new Aphront404Response();
}
$this->setProject($project);
$column = id(new PhabricatorProjectColumnQuery())
->setViewer($viewer)
->withIDs(array($this->id))
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
))
->executeOne();
if (!$column) {
return new Aphront404Response();
}
$xactions = id(new PhabricatorProjectColumnTransactionQuery())
->setViewer($viewer)
->withObjectPHIDs(array($column->getPHID()))
->execute();
$engine = id(new PhabricatorMarkupEngine())
->setViewer($viewer);
$timeline = id(new PhabricatorApplicationTransactionView())
->setUser($viewer)
->setObjectPHID($column->getPHID())
->setTransactions($xactions);
$title = pht('%s', $column->getName());
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(
pht('Board'),
$this->getApplicationURI('board/'.$project->getID().'/'));
$crumbs->addTextCrumb($title);
$header = $this->buildHeaderView($column);
$actions = $this->buildActionView($column);
$properties = $this->buildPropertyView($column, $actions);
$box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
return $this->buildApplicationPage(
array(
$crumbs,
$box,
$timeline,
),
array(
'title' => $title,
'device' => true,
));
}
private function buildHeaderView(PhabricatorProjectColumn $column) {
$viewer = $this->getRequest()->getUser();
$header = id(new PHUIHeaderView())
->setUser($viewer)
->setHeader($column->getName())
->setPolicyObject($column);
if ($column->isDeleted()) {
- $header->setStatus('reject', 'red', pht('Deleted'));
+ $header->setStatus('fa-ban', 'dark', pht('Deleted'));
}
return $header;
}
private function buildActionView(PhabricatorProjectColumn $column) {
$viewer = $this->getRequest()->getUser();
$id = $column->getID();
$project_id = $this->getProject()->getID();
$base_uri = '/board/'.$project_id.'/';
$actions = id(new PhabricatorActionListView())
->setObjectURI($this->getApplicationURI($base_uri.'column/'.$id.'/'))
->setUser($viewer);
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$column,
PhabricatorPolicyCapability::CAN_EDIT);
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit column'))
->setIcon('fa-pencil')
->setHref($this->getApplicationURI($base_uri.'edit/'.$id.'/'))
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
if (!$column->isDeleted()) {
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Delete column'))
->setIcon('fa-times')
->setHref($this->getApplicationURI($base_uri.'delete/'.$id.'/'))
->setDisabled(!$can_edit)
->setWorkflow(true));
} else {
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Activate column'))
->setIcon('fa-play-circle-o')
->setHref($this->getApplicationURI($base_uri.'delete/'.$id.'/'))
->setDisabled(!$can_edit)
->setWorkflow(true));
}
return $actions;
}
private function buildPropertyView(
PhabricatorProjectColumn $column,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$properties = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($column)
->setActionList($actions);
$descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
$viewer,
$column);
$properties->addProperty(
pht('Editable By'),
$descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
return $properties;
}
}
diff --git a/src/applications/project/controller/PhabricatorProjectEditMainController.php b/src/applications/project/controller/PhabricatorProjectEditMainController.php
index e0d6848f5c..948bb1bc2f 100644
--- a/src/applications/project/controller/PhabricatorProjectEditMainController.php
+++ b/src/applications/project/controller/PhabricatorProjectEditMainController.php
@@ -1,157 +1,157 @@
<?php
final class PhabricatorProjectEditMainController
extends PhabricatorProjectController {
private $id;
public function willProcessRequest(array $data) {
$this->id = idx($data, 'id');
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$project = id(new PhabricatorProjectQuery())
->setViewer($viewer)
->withIDs(array($this->id))
->needImages(true)
->executeOne();
if (!$project) {
return new Aphront404Response();
}
$header = id(new PHUIHeaderView())
->setHeader(pht('Edit %s', $project->getName()))
->setUser($viewer)
->setPolicyObject($project)
->setImage($project->getProfileImageURI());
if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) {
- $header->setStatus('oh-ok', '', pht('Active'));
+ $header->setStatus('fa-check', 'bluegrey', pht('Active'));
} else {
- $header->setStatus('policy-noone', '', pht('Archived'));
+ $header->setStatus('fa-ban', 'dark', pht('Archived'));
}
$actions = $this->buildActionListView($project);
$properties = $this->buildPropertyListView($project, $actions);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(
$project->getName(),
$this->getApplicationURI('view/'.$project->getID().'/'));
$crumbs->addTextCrumb(pht('Edit'));
$crumbs->setActionList($actions);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
$xactions = id(new PhabricatorProjectTransactionQuery())
->setViewer($viewer)
->withObjectPHIDs(array($project->getPHID()))
->execute();
$timeline = id(new PhabricatorApplicationTransactionView())
->setUser($viewer)
->setObjectPHID($project->getPHID())
->setShouldTerminate(true)
->setTransactions($xactions);
return $this->buildApplicationPage(
array(
$crumbs,
$object_box,
$timeline,
),
array(
'title' => $project->getName(),
'device' => true,
));
}
private function buildActionListView(PhabricatorProject $project) {
$request = $this->getRequest();
$viewer = $request->getUser();
$id = $project->getID();
$view = id(new PhabricatorActionListView())
->setUser($viewer)
->setObjectURI($request->getRequestURI());
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$project,
PhabricatorPolicyCapability::CAN_EDIT);
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Details'))
->setIcon('fa-pencil')
->setHref($this->getApplicationURI("details/{$id}/"))
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Picture'))
->setIcon('fa-picture-o')
->setHref($this->getApplicationURI("picture/{$id}/"))
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
if ($project->isArchived()) {
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Unarchive Project'))
- ->setIcon('fa-circle-check')
+ ->setIcon('fa-check')
->setHref($this->getApplicationURI("archive/{$id}/"))
->setDisabled(!$can_edit)
->setWorkflow(true));
} else {
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Archive Project'))
->setIcon('fa-ban')
->setHref($this->getApplicationURI("archive/{$id}/"))
->setDisabled(!$can_edit)
->setWorkflow(true));
}
return $view;
}
private function buildPropertyListView(
PhabricatorProject $project,
PhabricatorActionListView $actions) {
$request = $this->getRequest();
$viewer = $request->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($project)
->setActionList($actions);
$descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions(
$viewer,
$project);
$view->addProperty(
pht('Visible To'),
$descriptions[PhabricatorPolicyCapability::CAN_VIEW]);
$view->addProperty(
pht('Editable By'),
$descriptions[PhabricatorPolicyCapability::CAN_EDIT]);
$view->addProperty(
pht('Joinable By'),
$descriptions[PhabricatorPolicyCapability::CAN_JOIN]);
return $view;
}
}
diff --git a/src/applications/project/controller/PhabricatorProjectProfileController.php b/src/applications/project/controller/PhabricatorProjectProfileController.php
index 78f775a964..3586db683f 100644
--- a/src/applications/project/controller/PhabricatorProjectProfileController.php
+++ b/src/applications/project/controller/PhabricatorProjectProfileController.php
@@ -1,265 +1,265 @@
<?php
final class PhabricatorProjectProfileController
extends PhabricatorProjectController {
private $id;
public function shouldAllowPublic() {
return true;
}
public function willProcessRequest(array $data) {
$this->id = idx($data, 'id');
}
public function processRequest() {
$request = $this->getRequest();
$user = $request->getUser();
$project = id(new PhabricatorProjectQuery())
->setViewer($user)
->withIDs(array($this->id))
->needMembers(true)
->needImages(true)
->executeOne();
if (!$project) {
return new Aphront404Response();
}
$picture = $project->getProfileImageURI();
require_celerity_resource('phabricator-profile-css');
$tasks = $this->renderTasksPage($project);
$query = new PhabricatorFeedQuery();
$query->setFilterPHIDs(
array(
$project->getPHID(),
));
$query->setLimit(50);
$query->setViewer($this->getRequest()->getUser());
$stories = $query->execute();
$feed = $this->renderStories($stories);
$content = phutil_tag_div(
'phabricator-project-layout',
array($tasks, $feed));
$id = $this->id;
$icon = id(new PHUIIconView())
->setIconFont('fa-columns');
$board_btn = id(new PHUIButtonView())
->setTag('a')
->setText(pht('Workboards'))
->setHref($this->getApplicationURI("board/{$id}/"))
->setIcon($icon);
$header = id(new PHUIHeaderView())
->setHeader($project->getName())
->setUser($user)
->setPolicyObject($project)
->setImage($picture)
->addActionLink($board_btn);
if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) {
- $header->setStatus('oh-ok', '', pht('Active'));
+ $header->setStatus('fa-check', 'bluegrey', pht('Active'));
} else {
- $header->setStatus('policy-noone', '', pht('Archived'));
+ $header->setStatus('fa-ban', 'dark', pht('Archived'));
}
$actions = $this->buildActionListView($project);
$properties = $this->buildPropertyListView($project, $actions);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb($project->getName())
->setActionList($actions);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
return $this->buildApplicationPage(
array(
$crumbs,
$object_box,
$content,
),
array(
'title' => $project->getName(),
'device' => true,
));
}
private function renderFeedPage(PhabricatorProject $project) {
$query = new PhabricatorFeedQuery();
$query->setFilterPHIDs(array($project->getPHID()));
$query->setViewer($this->getRequest()->getUser());
$query->setLimit(100);
$stories = $query->execute();
if (!$stories) {
return pht('There are no stories about this project.');
}
return $this->renderStories($stories);
}
private function renderStories(array $stories) {
assert_instances_of($stories, 'PhabricatorFeedStory');
$builder = new PhabricatorFeedBuilder($stories);
$builder->setUser($this->getRequest()->getUser());
$builder->setShowHovercards(true);
$view = $builder->buildView();
return phutil_tag_div(
'profile-feed',
$view->render());
}
private function renderTasksPage(PhabricatorProject $project) {
$user = $this->getRequest()->getUser();
$query = id(new ManiphestTaskQuery())
->setViewer($user)
->withAnyProjects(array($project->getPHID()))
->withStatuses(ManiphestTaskStatus::getOpenStatusConstants())
->setOrderBy(ManiphestTaskQuery::ORDER_PRIORITY)
->setLimit(10);
$tasks = $query->execute();
$phids = mpull($tasks, 'getOwnerPHID');
$phids = array_merge(
$phids,
array_mergev(mpull($tasks, 'getProjectPHIDs')));
$phids = array_filter($phids);
$handles = $this->loadViewerHandles($phids);
$task_list = new ManiphestTaskListView();
$task_list->setUser($user);
$task_list->setTasks($tasks);
$task_list->setHandles($handles);
$phid = $project->getPHID();
$view_uri = urisprintf(
'/maniphest/?statuses=%s&allProjects=%s#R',
implode(',', ManiphestTaskStatus::getOpenStatusConstants()),
$phid);
$create_uri = '/maniphest/task/create/?projects='.$phid;
$icon = id(new PHUIIconView())
->setIconFont('fa-list');
$button_view = id(new PHUIButtonView())
->setTag('a')
->setText(pht('View All'))
->setHref($view_uri)
->setIcon($icon);
$icon_new = id(new PHUIIconView())
->setIconFont('fa-plus');
$button_add = id(new PHUIButtonView())
->setTag('a')
->setText(pht('New Task'))
->setHref($create_uri)
->setIcon($icon_new);
$header = id(new PHUIHeaderView())
->setHeader(pht('Open Tasks'))
->addActionLink($button_add)
->addActionLink($button_view);
$content = id(new PHUIObjectBoxView())
->setHeader($header)
->appendChild($task_list);
return $content;
}
private function buildActionListView(PhabricatorProject $project) {
$request = $this->getRequest();
$viewer = $request->getUser();
$id = $project->getID();
$view = id(new PhabricatorActionListView())
->setUser($viewer)
->setObject($project)
->setObjectURI($request->getRequestURI());
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$project,
PhabricatorPolicyCapability::CAN_EDIT);
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Project'))
->setIcon('fa-pencil')
->setHref($this->getApplicationURI("edit/{$id}/")));
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Members'))
->setIcon('fa-users')
->setHref($this->getApplicationURI("members/{$id}/"))
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
$action = null;
if (!$project->isUserMember($viewer->getPHID())) {
$can_join = PhabricatorPolicyFilter::hasCapability(
$viewer,
$project,
PhabricatorPolicyCapability::CAN_JOIN);
$action = id(new PhabricatorActionView())
->setUser($viewer)
->setRenderAsForm(true)
->setHref('/project/update/'.$project->getID().'/join/')
->setIcon('fa-plus')
->setDisabled(!$can_join)
->setName(pht('Join Project'));
} else {
$action = id(new PhabricatorActionView())
->setWorkflow(true)
->setHref('/project/update/'.$project->getID().'/leave/')
->setIcon('fa-times')
->setName(pht('Leave Project...'));
}
$view->addAction($action);
return $view;
}
private function buildPropertyListView(
PhabricatorProject $project,
PhabricatorActionListView $actions) {
$request = $this->getRequest();
$viewer = $request->getUser();
$this->loadHandles($project->getMemberPHIDs());
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($project)
->setActionList($actions);
$view->addProperty(
pht('Members'),
$project->getMemberPHIDs()
? $this->renderHandlesForPHIDs($project->getMemberPHIDs(), ',')
: phutil_tag('em', array(), pht('None')));
$field_list = PhabricatorCustomField::getObjectFields(
$project,
PhabricatorCustomField::ROLE_VIEW);
$field_list->appendFieldsToPropertyList($project, $viewer, $view);
return $view;
}
}
diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php
index 63f2db084c..410800ea25 100644
--- a/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php
+++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeColumn.php
@@ -1,42 +1,46 @@
<?php
final class PhabricatorProjectPHIDTypeColumn extends PhabricatorPHIDType {
const TYPECONST = 'PCOL';
public function getTypeConstant() {
return self::TYPECONST;
}
public function getTypeName() {
return pht('Project Column');
}
public function newObject() {
return new PhabricatorProjectColumn();
}
+ public function getTypeIcon() {
+ return 'fa-columns bluegrey';
+ }
+
protected function buildQueryForObjects(
PhabricatorObjectQuery $query,
array $phids) {
return id(new PhabricatorProjectColumnQuery())
->withPHIDs($phids);
}
public function loadHandles(
PhabricatorHandleQuery $query,
array $handles,
array $objects) {
foreach ($handles as $phid => $handle) {
$column = $objects[$phid];
$handle->setName($column->getDisplayName());
$handle->setURI('/project/board/'.$column->getProject()->getID().'/');
$handle->setDisabled(
$column->getStatus() == PhabricatorProjectColumn::STATUS_DELETED);
}
}
}
diff --git a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php
index 41a86f1d9b..0699ca74f4 100644
--- a/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php
+++ b/src/applications/project/phid/PhabricatorProjectPHIDTypeProject.php
@@ -1,109 +1,109 @@
<?php
final class PhabricatorProjectPHIDTypeProject extends PhabricatorPHIDType {
const TYPECONST = 'PROJ';
public function getTypeConstant() {
return self::TYPECONST;
}
public function getTypeName() {
return pht('Project');
}
public function getPHIDTypeApplicationClass() {
return 'PhabricatorApplicationProject';
}
public function getTypeIcon() {
- return 'policy-project';
+ return 'fa-briefcase bluegrey';
}
public function newObject() {
return new PhabricatorProject();
}
protected function buildQueryForObjects(
PhabricatorObjectQuery $query,
array $phids) {
return id(new PhabricatorProjectQuery())
->withPHIDs($phids)
->needImages(true);
}
public function loadHandles(
PhabricatorHandleQuery $query,
array $handles,
array $objects) {
foreach ($handles as $phid => $handle) {
$project = $objects[$phid];
$name = $project->getName();
$id = $project->getID();
$handle->setName($name);
$handle->setObjectName('#'.rtrim($project->getPhrictionSlug(), '/'));
$handle->setURI("/project/view/{$id}/");
$handle->setImageURI($project->getProfileImageURI());
if ($project->isArchived()) {
$handle->setStatus(PhabricatorObjectHandleStatus::STATUS_CLOSED);
}
}
}
public static function getProjectMonogramPatternFragment() {
// NOTE: See some discussion in ProjectRemarkupRule.
return '[^\s,#]+';
}
public function canLoadNamedObject($name) {
$fragment = self::getProjectMonogramPatternFragment();
return preg_match('/^#'.$fragment.'$/i', $name);
}
public function loadNamedObjects(
PhabricatorObjectQuery $query,
array $names) {
// If the user types "#YoloSwag", we still want to match "#yoloswag", so
// we normalize, query, and then map back to the original inputs.
$map = array();
foreach ($names as $key => $slug) {
$map[$this->normalizeSlug(substr($slug, 1))][] = $slug;
}
$projects = id(new PhabricatorProjectQuery())
->setViewer($query->getViewer())
->withPhrictionSlugs(array_keys($map))
->execute();
$result = array();
foreach ($projects as $project) {
$slugs = array($project->getPhrictionSlug());
foreach ($slugs as $slug) {
foreach ($map[$slug] as $original) {
$result[$original] = $project;
}
}
}
return $result;
}
private function normalizeSlug($slug) {
// NOTE: We're using phutil_utf8_strtolower() (and not PhabricatorSlug's
// normalize() method) because this normalization should be only somewhat
// liberal. We want "#YOLO" to match against "#yolo", but "#\\yo!!lo"
// should not. normalize() strips out most punctuation and leads to
// excessively aggressive matches.
return phutil_utf8_strtolower($slug).'/';
}
}
diff --git a/src/applications/releeph/controller/branch/ReleephBranchViewController.php b/src/applications/releeph/controller/branch/ReleephBranchViewController.php
index 09f1534f26..f282bc9883 100644
--- a/src/applications/releeph/controller/branch/ReleephBranchViewController.php
+++ b/src/applications/releeph/controller/branch/ReleephBranchViewController.php
@@ -1,202 +1,202 @@
<?php
final class ReleephBranchViewController extends ReleephBranchController
implements PhabricatorApplicationSearchResultsControllerInterface {
private $queryKey;
private $branchID;
public function shouldAllowPublic() {
return true;
}
public function willProcessRequest(array $data) {
$this->branchID = $data['branchID'];
$this->queryKey = idx($data, 'queryKey');
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$branch = id(new ReleephBranchQuery())
->setViewer($viewer)
->withIDs(array($this->branchID))
->executeOne();
if (!$branch) {
return new Aphront404Response();
}
$this->setBranch($branch);
$controller = id(new PhabricatorApplicationSearchController($request))
->setPreface($this->renderPreface())
->setQueryKey($this->queryKey)
->setSearchEngine($this->getSearchEngine())
->setNavigation($this->buildSideNavView());
return $this->delegateToController($controller);
}
public function renderResultsList(
array $requests,
PhabricatorSavedQuery $query) {
assert_instances_of($requests, 'ReleephRequest');
$viewer = $this->getRequest()->getUser();
// TODO: This is generally a bit sketchy, but we don't do this kind of
// thing elsewhere at the moment. For the moment it shouldn't be hugely
// costly, and we can batch things later. Generally, this commits fewer
// sins than the old code did.
$engine = id(new PhabricatorMarkupEngine())
->setViewer($viewer);
$list = array();
foreach ($requests as $pull) {
$field_list = PhabricatorCustomField::getObjectFields(
$pull,
PhabricatorCustomField::ROLE_VIEW);
$field_list
->setViewer($viewer)
->readFieldsFromStorage($pull);
foreach ($field_list->getFields() as $field) {
if ($field->shouldMarkup()) {
$field->setMarkupEngine($engine);
}
}
$list[] = id(new ReleephRequestView())
->setUser($viewer)
->setCustomFields($field_list)
->setPullRequest($pull)
->setIsListView(true);
}
// This is quite sketchy, but the list has not actually rendered yet, so
// this still allows us to batch the markup rendering.
$engine->process();
return $list;
}
public function buildSideNavView($for_app = false) {
$user = $this->getRequest()->getUser();
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
$this->getSearchEngine()->addNavigationItems($nav->getMenu());
$nav->selectFilter(null);
return $nav;
}
private function getSearchEngine() {
$branch = $this->getBranch();
return id(new ReleephRequestSearchEngine())
->setBranch($branch)
->setBaseURI($this->getApplicationURI('branch/'.$branch->getID().'/'))
->setViewer($this->getRequest()->getUser());
}
public function buildApplicationCrumbs() {
$crumbs = parent::buildApplicationCrumbs();
$branch = $this->getBranch();
if ($branch) {
$pull_uri = $this->getApplicationURI('branch/pull/'.$branch->getID().'/');
$crumbs->addAction(
id(new PHUIListItemView())
->setHref($pull_uri)
->setName(pht('New Pull Request'))
->setIcon('fa-plus-square')
->setDisabled(!$branch->isActive()));
}
return $crumbs;
}
private function renderPreface() {
$viewer = $this->getRequest()->getUser();
$branch = $this->getBranch();
$id = $branch->getID();
$header = id(new PHUIHeaderView())
->setHeader($branch->getDisplayName())
->setUser($viewer)
->setPolicyObject($branch);
if ($branch->getIsActive()) {
- $header->setStatus('oh-ok', '', pht('Active'));
+ $header->setStatus('fa-check', 'bluegrey', pht('Active'));
} else {
- $header->setStatus('policy-noone', '', pht('Closed'));
+ $header->setStatus('fa-ban', 'dark', pht('Closed'));
}
$actions = id(new PhabricatorActionListView())
->setUser($viewer)
->setObject($branch)
->setObjectURI($this->getRequest()->getRequestURI());
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$branch,
PhabricatorPolicyCapability::CAN_EDIT);
$edit_uri = $this->getApplicationURI("branch/edit/{$id}/");
$close_uri = $this->getApplicationURI("branch/close/{$id}/");
$reopen_uri = $this->getApplicationURI("branch/re-open/{$id}/");
$history_uri = $this->getApplicationURI("branch/{$id}/history/");
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Branch'))
->setHref($edit_uri)
->setIcon('fa-pencil')
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
if ($branch->getIsActive()) {
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Close Branch'))
->setHref($close_uri)
->setIcon('fa-times')
->setDisabled(!$can_edit)
->setWorkflow(true));
} else {
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Reopen Branch'))
->setHref($reopen_uri)
->setIcon('fa-plus')
->setUser($viewer)
->setDisabled(!$can_edit)
->setWorkflow(true));
}
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('View History'))
->setHref($history_uri)
->setIcon('fa-list'));
$properties = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($branch)
->setActionList($actions);
$properties->addProperty(
pht('Branch'),
$branch->getName());
return id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
}
}
diff --git a/src/applications/releeph/controller/product/ReleephProductViewController.php b/src/applications/releeph/controller/product/ReleephProductViewController.php
index 22b852d72a..2d72268a71 100644
--- a/src/applications/releeph/controller/product/ReleephProductViewController.php
+++ b/src/applications/releeph/controller/product/ReleephProductViewController.php
@@ -1,251 +1,251 @@
<?php
final class ReleephProductViewController extends ReleephProductController
implements PhabricatorApplicationSearchResultsControllerInterface {
private $productID;
private $queryKey;
public function shouldAllowPublic() {
return true;
}
public function willProcessRequest(array $data) {
$this->productID = idx($data, 'projectID');
$this->queryKey = idx($data, 'queryKey');
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$product = id(new ReleephProductQuery())
->setViewer($viewer)
->withIDs(array($this->productID))
->executeOne();
if (!$product) {
return new Aphront404Response();
}
$this->setProduct($product);
$controller = id(new PhabricatorApplicationSearchController($request))
->setQueryKey($this->queryKey)
->setPreface($this->renderPreface())
->setSearchEngine(
id(new ReleephBranchSearchEngine())
->setProduct($product))
->setNavigation($this->buildSideNavView());
return $this->delegateToController($controller);
}
public function renderResultsList(
array $branches,
PhabricatorSavedQuery $saved) {
assert_instances_of($branches, 'ReleephBranch');
$viewer = $this->getRequest()->getUser();
$products = mpull($branches, 'getProduct');
$repo_phids = mpull($products, 'getRepositoryPHID');
$repos = id(new PhabricatorRepositoryQuery())
->setViewer($viewer)
->withPHIDs($repo_phids)
->execute();
$repos = mpull($repos, null, 'getPHID');
$phids = mpull($branches, 'getCreatedByUserPHID');
$this->loadHandles($phids);
$requests = array();
if ($branches) {
$requests = id(new ReleephRequestQuery())
->setViewer($viewer)
->withBranchIDs(mpull($branches, 'getID'))
->withStatus(ReleephRequestQuery::STATUS_OPEN)
->execute();
$requests = mgroup($requests, 'getBranchID');
}
$list = id(new PHUIObjectItemListView())
->setUser($viewer);
foreach ($branches as $branch) {
$diffusion_href = null;
$repo = idx($repos, $branch->getProduct()->getRepositoryPHID());
if ($repo) {
$drequest = DiffusionRequest::newFromDictionary(
array(
'user' => $viewer,
'repository' => $repo,
));
$diffusion_href = $drequest->generateURI(
array(
'action' => 'branch',
'branch' => $branch->getName(),
));
}
$branch_link = $branch->getName();
if ($diffusion_href) {
$branch_link = phutil_tag(
'a',
array(
'href' => $diffusion_href,
),
$branch_link);
}
$item = id(new PHUIObjectItemView())
->setHeader($branch->getDisplayName())
->setHref($this->getApplicationURI('branch/'.$branch->getID().'/'))
->addAttribute($branch_link);
if (!$branch->getIsActive()) {
$item->setDisabled(true);
}
$commit = $branch->getCutPointCommit();
if ($commit) {
$item->addIcon(
'none',
phabricator_datetime($commit->getEpoch(), $viewer));
}
$open_count = count(idx($requests, $branch->getID(), array()));
if ($open_count) {
$item->setBarColor('orange');
$item->addIcon(
'fa-code-fork',
pht('%d Open Pull Request(s)', new PhutilNumber($open_count)));
}
$list->addItem($item);
}
return $list;
}
public function buildSideNavView($for_app = false) {
$viewer = $this->getRequest()->getUser();
$product = $this->getProduct();
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
if ($for_app) {
$nav->addFilter('product/create/', pht('Create Product'));
}
id(new ReleephBranchSearchEngine())
->setProduct($product)
->setViewer($viewer)
->addNavigationItems($nav->getMenu());
$nav->selectFilter(null);
return $nav;
}
public function buildApplicationCrumbs() {
$crumbs = parent::buildApplicationCrumbs();
$product = $this->getProduct();
if ($product) {
$crumbs->addAction(
id(new PHUIListItemView())
->setHref($product->getURI('cutbranch/'))
->setName(pht('Cut New Branch'))
->setIcon('fa-plus'));
}
return $crumbs;
}
private function renderPreface() {
$viewer = $this->getRequest()->getUser();
$product = $this->getProduct();
$id = $product->getID();
$header = id(new PHUIHeaderView())
->setHeader($product->getName())
->setUser($viewer)
->setPolicyObject($product);
if ($product->getIsActive()) {
- $header->setStatus('oh-ok', '', pht('Active'));
+ $header->setStatus('fa-check', 'bluegrey', pht('Active'));
} else {
- $header->setStatus('policy-noone', '', pht('Inactive'));
+ $header->setStatus('fa-ban', 'dark', pht('Inactive'));
}
$actions = id(new PhabricatorActionListView())
->setUser($viewer)
->setObject($product)
->setObjectURI($this->getRequest()->getRequestURI());
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$product,
PhabricatorPolicyCapability::CAN_EDIT);
$edit_uri = $this->getApplicationURI("product/{$id}/edit/");
$history_uri = $this->getApplicationURI("product/{$id}/history/");
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Product'))
->setHref($edit_uri)
->setIcon('fa-pencil')
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
if ($product->getIsActive()) {
$status_name = pht('Deactivate Product');
$status_href = "product/{$id}/action/deactivate/";
$status_icon = 'fa-times';
} else {
$status_name = pht('Reactivate Product');
$status_href = "product/{$id}/action/activate/";
$status_icon = 'fa-plus-circle-o';
}
$actions->addAction(
id(new PhabricatorActionView())
->setName($status_name)
->setHref($this->getApplicationURI($status_href))
->setIcon($status_icon)
->setDisabled(!$can_edit)
->setWorkflow(true));
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('View History'))
->setHref($history_uri)
->setIcon('fa-list'));
$properties = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($product);
$properties->addProperty(
pht('Repository'),
$product->getRepository()->getName());
$properties->setActionList($actions);
$pushers = $product->getPushers();
if ($pushers) {
$this->loadHandles($pushers);
$properties->addProperty(
pht('Pushers'),
$this->renderHandlesForPHIDs($pushers));
}
return id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
}
}
diff --git a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
index 884cdec99d..0c72687d1a 100644
--- a/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
+++ b/src/applications/slowvote/controller/PhabricatorSlowvotePollController.php
@@ -1,195 +1,196 @@
<?php
/**
* @group slowvote
*/
final class PhabricatorSlowvotePollController
extends PhabricatorSlowvoteController {
private $id;
public function willProcessRequest(array $data) {
$this->id = $data['id'];
}
public function processRequest() {
$request = $this->getRequest();
$user = $request->getUser();
$poll = id(new PhabricatorSlowvoteQuery())
->setViewer($user)
->withIDs(array($this->id))
->needOptions(true)
->needChoices(true)
->needViewerChoices(true)
->executeOne();
if (!$poll) {
return new Aphront404Response();
}
$poll_view = id(new SlowvoteEmbedView())
->setHeadless(true)
->setUser($user)
->setPoll($poll);
if ($request->isAjax()) {
return id(new AphrontAjaxResponse())
->setContent(
array(
'pollID' => $poll->getID(),
'contentHTML' => $poll_view->render(),
));
}
- $header_icon = $poll->getIsClosed() ? 'oh-closed' : 'open';
+ $header_icon = $poll->getIsClosed() ? 'fa-ban' : 'fa-circle-o';
$header_name = $poll->getIsClosed() ? pht('Closed') : pht('Open');
+ $header_color = $poll->getIsClosed() ? 'dark' : 'bluegrey';
$header = id(new PHUIHeaderView())
->setHeader($poll->getQuestion())
->setUser($user)
- ->setStatus($header_icon, '', $header_name)
+ ->setStatus($header_icon, $header_color, $header_name)
->setPolicyObject($poll);
$actions = $this->buildActionView($poll);
$properties = $this->buildPropertyView($poll, $actions);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb('V'.$poll->getID());
$xactions = $this->buildTransactions($poll);
$add_comment = $this->buildCommentForm($poll);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
return $this->buildApplicationPage(
array(
$crumbs,
$object_box,
phutil_tag(
'div',
array(
'class' => 'mlt mml mmr',
),
$poll_view),
$xactions,
$add_comment,
),
array(
'title' => 'V'.$poll->getID().' '.$poll->getQuestion(),
'device' => true,
'pageObjects' => array($poll->getPHID()),
));
}
private function buildActionView(PhabricatorSlowvotePoll $poll) {
$viewer = $this->getRequest()->getUser();
$view = id(new PhabricatorActionListView())
->setUser($viewer)
->setObject($poll);
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$poll,
PhabricatorPolicyCapability::CAN_EDIT);
$is_closed = $poll->getIsClosed();
$close_poll_text = $is_closed ? pht('Reopen Poll') : pht('Close Poll');
$close_poll_icon = $is_closed ? 'fa-play-circle-o' : 'fa-ban';
$view->addAction(
id(new PhabricatorActionView())
->setName(pht('Edit Poll'))
->setIcon('fa-pencil')
->setHref($this->getApplicationURI('edit/'.$poll->getID().'/'))
->setDisabled(!$can_edit)
->setWorkflow(!$can_edit));
$view->addAction(
id(new PhabricatorActionView())
->setName($close_poll_text)
->setIcon($close_poll_icon)
->setHref($this->getApplicationURI('close/'.$poll->getID().'/'))
->setDisabled(!$can_edit)
->setWorkflow(true));
return $view;
}
private function buildPropertyView(
PhabricatorSlowvotePoll $poll,
PhabricatorActionListView $actions) {
$viewer = $this->getRequest()->getUser();
$view = id(new PHUIPropertyListView())
->setUser($viewer)
->setObject($poll)
->setActionList($actions);
$view->invokeWillRenderEvent();
if (strlen($poll->getDescription())) {
$view->addTextContent(
$output = PhabricatorMarkupEngine::renderOneObject(
id(new PhabricatorMarkupOneOff())->setContent(
$poll->getDescription()),
'default',
$viewer));
}
return $view;
}
private function buildTransactions(PhabricatorSlowvotePoll $poll) {
$viewer = $this->getRequest()->getUser();
$xactions = id(new PhabricatorSlowvoteTransactionQuery())
->setViewer($viewer)
->withObjectPHIDs(array($poll->getPHID()))
->execute();
$engine = id(new PhabricatorMarkupEngine())
->setViewer($viewer);
foreach ($xactions as $xaction) {
if ($xaction->getComment()) {
$engine->addObject(
$xaction->getComment(),
PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT);
}
}
$engine->process();
$timeline = id(new PhabricatorApplicationTransactionView())
->setUser($viewer)
->setObjectPHID($poll->getPHID())
->setTransactions($xactions)
->setMarkupEngine($engine);
return $timeline;
}
private function buildCommentForm(PhabricatorSlowvotePoll $poll) {
$viewer = $this->getRequest()->getUser();
$is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
$add_comment_header = $is_serious
? pht('Add Comment')
: pht('Enter Deliberations');
$draft = PhabricatorDraft::newFromUserAndKey($viewer, $poll->getPHID());
return id(new PhabricatorApplicationTransactionCommentView())
->setUser($viewer)
->setObjectPHID($poll->getPHID())
->setDraft($draft)
->setHeaderText($add_comment_header)
->setAction($this->getApplicationURI('/comment/'.$poll->getID().'/'))
->setSubmitButtonName(pht('Add Comment'));
}
}
diff --git a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
index ad3e45ffb9..8ed9e92fbf 100644
--- a/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
+++ b/src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
@@ -1,439 +1,439 @@
<?php
final class PhabricatorTypeaheadCommonDatasourceController
extends PhabricatorTypeaheadDatasourceController {
private $type;
public function shouldAllowPublic() {
return true;
}
public function willProcessRequest(array $data) {
$this->type = $data['type'];
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
$query = $request->getStr('q');
$raw_query = $request->getStr('raw');
$need_rich_data = false;
$need_users = false;
$need_agents = false;
$need_applications = false;
$need_lists = false;
$need_projs = false;
$need_repos = false;
$need_packages = false;
$need_upforgrabs = false;
$need_arcanist_projects = false;
$need_noproject = false;
$need_symbols = false;
$need_jump_objects = false;
$need_build_plans = false;
$need_task_priority = false;
$need_macros = false;
$need_legalpad_documents = false;
switch ($this->type) {
case 'mainsearch':
$need_users = true;
$need_applications = true;
$need_rich_data = true;
$need_symbols = true;
$need_projs = true;
$need_jump_objects = true;
break;
case 'searchowner':
$need_users = true;
$need_upforgrabs = true;
break;
case 'searchproject':
$need_projs = true;
$need_noproject = true;
break;
case 'users':
case 'accounts':
case 'authors':
$need_users = true;
break;
case 'mailable':
case 'allmailable':
$need_users = true;
$need_lists = true;
$need_projs = true;
break;
case 'projects':
$need_projs = true;
break;
case 'usersorprojects':
case 'accountsorprojects':
$need_users = true;
$need_projs = true;
break;
case 'usersprojectsorpackages':
$need_users = true;
$need_projs = true;
$need_packages = true;
break;
case 'repositories':
$need_repos = true;
break;
case 'packages':
$need_packages = true;
break;
case 'arcanistprojects':
$need_arcanist_projects = true;
break;
case 'buildplans':
$need_build_plans = true;
break;
case 'taskpriority':
$need_task_priority = true;
break;
case 'macros':
$need_macros = true;
break;
case 'legalpaddocuments':
$need_legalpad_documents = true;
break;
}
$results = array();
if ($need_upforgrabs) {
$results[] = id(new PhabricatorTypeaheadResult())
->setName('upforgrabs (Up For Grabs)')
->setPHID(ManiphestTaskOwner::OWNER_UP_FOR_GRABS);
}
if ($need_noproject) {
$results[] = id(new PhabricatorTypeaheadResult())
->setName('noproject (No Project)')
->setPHID(ManiphestTaskOwner::PROJECT_NO_PROJECT);
}
if ($need_users) {
$columns = array(
'isSystemAgent',
'isAdmin',
'isDisabled',
'userName',
'realName',
'phid');
if ($query) {
// This is an arbitrary limit which is just larger than any limit we
// actually use in the application.
// TODO: The datasource should pass this in the query.
$limit = 15;
$user_table = new PhabricatorUser();
$conn_r = $user_table->establishConnection('r');
$ids = queryfx_all(
$conn_r,
'SELECT id FROM %T WHERE username LIKE %>
ORDER BY username ASC LIMIT %d',
$user_table->getTableName(),
$query,
$limit);
$ids = ipull($ids, 'id');
if (count($ids) < $limit) {
// If we didn't find enough username hits, look for real name hits.
// We need to pull the entire pagesize so that we end up with the
// right number of items if this query returns many duplicate IDs
// that we've already selected.
$realname_ids = queryfx_all(
$conn_r,
'SELECT DISTINCT userID FROM %T WHERE token LIKE %>
ORDER BY token ASC LIMIT %d',
PhabricatorUser::NAMETOKEN_TABLE,
$query,
$limit);
$realname_ids = ipull($realname_ids, 'userID');
$ids = array_merge($ids, $realname_ids);
$ids = array_unique($ids);
$ids = array_slice($ids, 0, $limit);
}
// Always add the logged-in user because some tokenizers autosort them
// first. They'll be filtered out on the client side if they don't
// match the query.
$ids[] = $request->getUser()->getID();
if ($ids) {
$users = id(new PhabricatorUser())->loadColumnsWhere(
$columns,
'id IN (%Ld)',
$ids);
} else {
$users = array();
}
} else {
$users = id(new PhabricatorUser())->loadColumns($columns);
}
if ($need_rich_data) {
$phids = mpull($users, 'getPHID');
$handles = $this->loadViewerHandles($phids);
}
foreach ($users as $user) {
$closed = null;
if ($user->getIsDisabled()) {
$closed = pht('Disabled');
} else if ($user->getIsSystemAgent()) {
$closed = pht('Bot/Script');
}
$result = id(new PhabricatorTypeaheadResult())
->setName($user->getFullName())
->setURI('/p/'.$user->getUsername())
->setPHID($user->getPHID())
->setPriorityString($user->getUsername())
- ->setIcon('policy-all')
+ ->setIcon('fa-user bluegrey')
->setPriorityType('user')
->setClosed($closed);
if ($need_rich_data) {
$display_type = 'User';
if ($user->getIsAdmin()) {
$display_type = 'Administrator';
}
$result->setDisplayType($display_type);
$result->setImageURI($handles[$user->getPHID()]->getImageURI());
}
$results[] = $result;
}
}
if ($need_lists) {
$lists = id(new PhabricatorMailingListQuery())
->setViewer($viewer)
->execute();
foreach ($lists as $list) {
$results[] = id(new PhabricatorTypeaheadResult())
->setName($list->getName())
->setURI($list->getURI())
->setPHID($list->getPHID());
}
}
if ($need_build_plans) {
$plans = id(new HarbormasterBuildPlanQuery())
->setViewer($viewer)
->execute();
foreach ($plans as $plan) {
$results[] = id(new PhabricatorTypeaheadResult())
->setName($plan->getName())
->setPHID($plan->getPHID());
}
}
if ($need_task_priority) {
$priority_map = ManiphestTaskPriority::getTaskPriorityMap();
foreach ($priority_map as $value => $name) {
// NOTE: $value is not a phid but is unique. This'll work.
$results[] = id(new PhabricatorTypeaheadResult())
->setPHID($value)
->setName($name);
}
}
if ($need_macros) {
$macros = id(new PhabricatorMacroQuery())
->setViewer($viewer)
->withStatus(PhabricatorMacroQuery::STATUS_ACTIVE)
->execute();
$macros = mpull($macros, 'getName', 'getPHID');
foreach ($macros as $phid => $name) {
$results[] = id(new PhabricatorTypeaheadResult())
->setPHID($phid)
->setName($name);
}
}
if ($need_legalpad_documents) {
$documents = id(new LegalpadDocumentQuery())
->setViewer($viewer)
->execute();
$documents = mpull($documents, 'getTitle', 'getPHID');
foreach ($documents as $phid => $title) {
$results[] = id(new PhabricatorTypeaheadResult())
->setPHID($phid)
->setName($title);
}
}
if ($need_projs) {
$projs = id(new PhabricatorProjectQuery())
->setViewer($viewer)
->needImages(true)
->execute();
foreach ($projs as $proj) {
$closed = null;
if ($proj->isArchived()) {
$closed = pht('Archived');
}
$proj_result = id(new PhabricatorTypeaheadResult())
->setName($proj->getName())
->setDisplayType("Project")
->setURI('/project/view/'.$proj->getID().'/')
->setPHID($proj->getPHID())
- ->setIcon('policy-project')
+ ->setIcon('fa-briefcase bluegrey')
->setClosed($closed);
$proj_result->setImageURI($proj->getProfileImageURI());
$results[] = $proj_result;
}
}
if ($need_repos) {
$repos = id(new PhabricatorRepositoryQuery())
->setViewer($viewer)
->execute();
foreach ($repos as $repo) {
$results[] = id(new PhabricatorTypeaheadResult())
->setName('r'.$repo->getCallsign().' ('.$repo->getName().')')
->setURI('/diffusion/'.$repo->getCallsign().'/')
->setPHID($repo->getPHID())
->setPriorityString('r'.$repo->getCallsign());
}
}
if ($need_packages) {
$packages = id(new PhabricatorOwnersPackage())->loadAll();
foreach ($packages as $package) {
$results[] = id(new PhabricatorTypeaheadResult())
->setIcon('pl-testplan')
->setName($package->getName())
->setURI('/owners/package/'.$package->getID().'/')
->setPHID($package->getPHID());
}
}
if ($need_arcanist_projects) {
$arcprojs = id(new PhabricatorRepositoryArcanistProject())->loadAll();
foreach ($arcprojs as $proj) {
$results[] = id(new PhabricatorTypeaheadResult())
->setName($proj->getName())
->setPHID($proj->getPHID());
}
}
if ($need_applications) {
$applications = PhabricatorApplication::getAllInstalledApplications();
foreach ($applications as $application) {
$uri = $application->getTypeaheadURI();
if (!$uri) {
continue;
}
$name = $application->getName().' '.$application->getShortDescription();
$results[] = id(new PhabricatorTypeaheadResult())
->setName($name)
->setURI($uri)
->setPHID($application->getPHID())
->setPriorityString($application->getName())
->setDisplayName($application->getName())
->setDisplayType($application->getShortDescription())
->setImageuRI($application->getIconURI())
->setPriorityType('apps');
}
}
if ($need_symbols) {
$symbols = id(new DiffusionSymbolQuery())
->setNamePrefix($query)
->setLimit(15)
->needArcanistProjects(true)
->needRepositories(true)
->needPaths(true)
->execute();
foreach ($symbols as $symbol) {
$lang = $symbol->getSymbolLanguage();
$name = $symbol->getSymbolName();
$type = $symbol->getSymbolType();
$proj = $symbol->getArcanistProject()->getName();
$results[] = id(new PhabricatorTypeaheadResult())
->setName($name)
->setURI($symbol->getURI())
->setPHID(md5($symbol->getURI())) // Just needs to be unique.
->setDisplayName($name)
->setDisplayType(strtoupper($lang).' '.ucwords($type).' ('.$proj.')')
->setPriorityType('symb');
}
}
if ($need_jump_objects) {
$objects = id(new PhabricatorObjectQuery())
->setViewer($viewer)
->withNames(array($raw_query))
->execute();
if ($objects) {
$handles = id(new PhabricatorHandleQuery())
->setViewer($viewer)
->withPHIDs(mpull($objects, 'getPHID'))
->execute();
$handle = head($handles);
if ($handle) {
$results[] = id(new PhabricatorTypeaheadResult())
->setName($handle->getFullName())
->setDisplayType($handle->getTypeName())
->setURI($handle->getURI())
->setPHID($handle->getPHID())
->setPriorityType('jump');
}
}
}
$content = mpull($results, 'getWireFormat');
if ($request->isAjax()) {
return id(new AphrontAjaxResponse())->setContent($content);
}
// If there's a non-Ajax request to this endpoint, show results in a tabular
// format to make it easier to debug typeahead output.
$rows = array();
foreach ($results as $result) {
$wire = $result->getWireFormat();
$rows[] = $wire;
}
$table = new AphrontTableView($rows);
$table->setHeaders(
array(
'Name',
'URI',
'PHID',
'Priority',
'Display Name',
'Display Type',
'Image URI',
'Priority Type',
));
$panel = new AphrontPanelView();
$panel->setHeader('Typeahead Results');
$panel->appendChild($table);
return $this->buildStandardPageResponse(
$panel,
array(
'title' => 'Typeahead Results',
));
}
}
diff --git a/src/infrastructure/celerity/CeleritySpriteGenerator.php b/src/infrastructure/celerity/CeleritySpriteGenerator.php
index 92e8060888..6e0c995413 100644
--- a/src/infrastructure/celerity/CeleritySpriteGenerator.php
+++ b/src/infrastructure/celerity/CeleritySpriteGenerator.php
@@ -1,806 +1,762 @@
<?php
final class CeleritySpriteGenerator {
public function buildRemarkupSheet() {
$scales = array(
'1x' => 1,
'2x' => 2,
);
$sprites = array();
$template = id(new PhutilSprite())
->setSourceSize(14, 14);
$remarkup_icons = $this->getDirectoryList('remarkup_1x');
foreach ($remarkup_icons as $icon) {
$prefix = 'remarkup_';
// Strip 'text_' from these file names.
$class_name = substr($icon, 5);
if ($class_name == 'fullscreen_off') {
$tcss = '.remarkup-control-fullscreen-mode .remarkup-assist-fullscreen';
} else {
$tcss = '.remarkup-assist-'.$class_name;
}
$sprite = id(clone $template)
->setName('remarkup-assist-'.$icon)
->setTargetCSS($tcss);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('remarkup', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildActionsSheet() {
$icons = $this->getDirectoryList('actions_white_1x');
$colors = array(
'dark',
'grey',
'white',
);
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(24, 24);
$sprites = array();
foreach ($colors as $color) {
foreach ($icons as $icon) {
$prefix = 'actions_';
if (strlen($color)) {
$prefix .= $color.'_';
}
$suffix = '';
if (strlen($color)) {
$suffix = '-'.$color;
}
$sprite = id(clone $template)
->setName('actions-'.$icon.$suffix);
$tcss = array();
$tcss[] = '.actions-'.$icon.$suffix;
if ($color == 'dark') {
$tcss[] = '.device-desktop '.
'.actions-'.$icon.'-grey.phui-icon-view:hover';
}
$sprite->setTargetCSS(implode(', ', $tcss));
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
}
$sheet = $this->buildSheet('actions', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildMiniconsSheet() {
$icons = $this->getDirectoryList('minicons_white_1x');
$colors = array(
'white',
'dark',
);
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(16, 16);
$sprites = array();
foreach ($colors as $color) {
foreach ($icons as $icon) {
$prefix = 'minicons_';
if (strlen($color)) {
$prefix .= $color.'_';
}
$suffix = '';
if (strlen($color)) {
$suffix = '-'.$color;
}
$sprite = id(clone $template)
->setName('minicons-'.$icon.$suffix);
$sprite->setTargetCSS('.minicons-'.$icon.$suffix);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
}
$sheet = $this->buildSheet('minicons', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildMenuSheet() {
$sprites = array();
$sources = array(
'seen_read_all' => array(
'x' => 18,
'y' => 18,
'css' =>
'.alert-notifications .phabricator-main-menu-alert-icon',
),
'seen_have_unread' => array(
'x' => 18,
'y' => 18,
'css' =>
'.alert-notifications:hover .phabricator-main-menu-alert-icon',
),
'unseen_any' => array(
'x' => 18,
'y' => 18,
'css' =>
'.alert-notifications.alert-unread .phabricator-main-menu-alert-icon',
),
'arrow-right' => array(
'x' => 9,
'y' => 31,
'css' => '.phabricator-crumb-divider',
),
'search' => array(
'x' => 24,
'y' => 24,
'css' => '.menu-icon-search',
),
'search_blue' => array(
'x' => 24,
'y' => 24,
'css' => '.menu-icon-search-blue',
),
'new' => array(
'x' => 24,
'y' => 24,
'css' => '.menu-icon-new',
),
'new_blue' => array(
'x' => 24,
'y' => 24,
'css' => '.menu-icon-new-blue',
),
'app' => array(
'x' => 24,
'y' => 24,
'css' => '.menu-icon-app',
),
'app_blue' => array(
'x' => 24,
'y' => 24,
'css' => '.menu-icon-app-blue',
),
'logo' => array(
'x' => 149,
'y' => 26,
'css' => '.phabricator-main-menu-logo-image',
),
'conf-off' => array(
'x' => 18,
'y' => 18,
'css' =>
'.alert-notifications .phabricator-main-menu-message-icon',
),
'conf-hover' => array(
'x' => 18,
'y' => 18,
'css' =>
'.alert-notifications:hover .phabricator-main-menu-message-icon',
),
'conf-unseen' => array(
'x' => 18,
'y' => 18,
'css' =>
'.alert-notifications.message-unread '.
'.phabricator-main-menu-message-icon',
),
);
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = new PhutilSprite();
foreach ($sources as $name => $spec) {
$sprite = id(clone $template)
->setName($name)
->setSourceSize($spec['x'], $spec['y'])
->setTargetCSS($spec['css']);
foreach ($scales as $scale_name => $scale) {
$path = 'menu_'.$scale_name.'/'.$name.'.png';
$path = $this->getPath($path);
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('menu', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildTokenSheet() {
$icons = $this->getDirectoryList('tokens_1x');
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(16, 16);
$sprites = array();
$prefix = 'tokens_';
foreach ($icons as $icon) {
$sprite = id(clone $template)
->setName('tokens-'.$icon)
->setTargetCSS('.tokens-'.$icon);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('tokens', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildButtonBarSheet() {
$icons = $this->getDirectoryList('button_bar_1x');
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(14, 14);
$sprites = array();
$prefix = 'button_bar_';
foreach ($icons as $icon) {
$sprite = id(clone $template)
->setName('buttonbar-'.$icon)
->setTargetCSS('.buttonbar-'.$icon);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('buttonbar', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildProjectsSheet() {
$icons = $this->getDirectoryList('projects_1x');
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(50, 50);
$sprites = array();
$prefix = 'projects-';
foreach ($icons as $icon) {
$sprite = id(clone $template)
->setName($prefix.$icon)
->setTargetCSS('.'.$prefix.$icon);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath('projects_'.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('projects', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildPaymentsSheet() {
$icons = $this->getDirectoryList('payments_2x');
$scales = array(
'2x' => 1,
);
$template = id(new PhutilSprite())
->setSourceSize(60, 32);
$sprites = array();
$prefix = 'payments_';
foreach ($icons as $icon) {
$sprite = id(clone $template)
->setName('payments-'.$icon)
->setTargetCSS('.payments-'.$icon);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('payments', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildConpherenceSheet() {
$name = 'conpherence';
$icons = $this->getDirectoryList($name.'_1x');
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(32, 32);
$sprites = array();
foreach ($icons as $icon) {
$color = preg_match('/_on/', $icon) ? 'on' : 'off';
$prefix = $name.'_';
$sprite = id(clone $template)
->setName($prefix.$icon);
$tcss = array();
$tcss[] = '.'.$prefix.$icon;
if ($color == 'on') {
$class = str_replace('_on', '_off', $prefix.$icon);
$tcss[] = '.device-desktop .'.$class.':hover ';
}
$sprite->setTargetCSS(implode(', ', $tcss));
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet($name, true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildDocsSheet() {
$icons = $this->getDirectoryList('docs_1x');
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(32, 32);
$sprites = array();
$prefix = 'docs_';
foreach ($icons as $icon) {
$sprite = id(clone $template)
->setName($prefix.$icon)
->setTargetCSS('.'.$prefix.$icon);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('docs', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildLoginSheet() {
$icons = $this->getDirectoryList('login_1x');
$scales = array(
'1x' => 1,
'2x' => 2,
);
$template = id(new PhutilSprite())
->setSourceSize(34, 34);
$sprites = array();
$prefix = 'login_';
foreach ($icons as $icon) {
$sprite = id(clone $template)
->setName('login-'.$icon)
->setTargetCSS('.login-'.$icon);
foreach ($scales as $scale_key => $scale) {
$path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('login', true);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
- public function buildStatusSheet() {
- $icons = $this->getDirectoryList('status_1x');
- $scales = array(
- '1x' => 1,
- '2x' => 2,
- );
- $template = id(new PhutilSprite())
- ->setSourceSize(14, 14);
-
- $sprites = array();
- $prefix = 'status_';
-
- $pre_rule = ', .phuix-dropdown-menu .phabricator-action-view:hover ';
- $extra_css = array(
- 'policy-custom-white' => $pre_rule.'.status-policy-custom',
- 'policy-all-white' => $pre_rule.'.status-policy-all',
- 'policy-unknown-white' => $pre_rule.'.status-policy-unknown',
- 'policy-admin-white' => $pre_rule.'.status-policy-admin',
- 'policy-public-white' => $pre_rule.'.status-policy-public',
- 'policy-project-white' => $pre_rule.'.status-policy-project',
- 'policy-noone-white' => $pre_rule.'.status-policy-noone',
- );
-
- foreach ($icons as $icon) {
- $sprite = id(clone $template)
- ->setName('status-'.$icon)
- ->setTargetCSS('.status-'.$icon.idx($extra_css, $icon));
-
- foreach ($scales as $scale_key => $scale) {
- $path = $this->getPath($prefix.$scale_key.'/'.$icon.'.png');
- $sprite->setSourceFile($path, $scale);
- }
- $sprites[] = $sprite;
- }
-
- $sheet = $this->buildSheet('status', true);
- $sheet->setScales($scales);
- foreach ($sprites as $sprite) {
- $sheet->addSprite($sprite);
- }
-
- return $sheet;
- }
-
public function buildGradientSheet() {
$gradients = $this->getDirectoryList('gradients');
$template = new PhutilSprite();
$unusual_heights = array(
'dark-menu-label' => 25,
'breadcrumbs' => 31,
'menu-label' => 24,
'red-header' => 70,
'blue-header' => 70,
'green-header' => 70,
'yellow-header' => 70,
'grey-header' => 70,
'dark-grey-header' => 70,
'lightblue-header' => 240,
);
$extra_css = array(
'dark-menu-label' =>
', .phabricator-dark-menu .phui-list-item-type-label',
'menu-label' =>
', .phabricator-side-menu .phui-list-item-type-label',
);
$sprites = array();
foreach ($gradients as $gradient) {
$path = $this->getPath('gradients/'.$gradient.'.png');
$sprite = id(clone $template)
->setName('gradient-'.$gradient)
->setSourceFile($path)
->setTargetCSS('.gradient-'.$gradient.idx($extra_css, $gradient));
$sprite->setSourceSize(4, idx($unusual_heights, $gradient, 26));
$sprites[] = $sprite;
}
$sheet = $this->buildSheet(
'gradient',
false,
PhutilSpriteSheet::TYPE_REPEAT_X,
', .phabricator-dark-menu .phui-list-item-type-label, '.
'.phabricator-side-menu .phui-list-item-type-label');
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildMainHeaderSheet() {
$gradients = $this->getDirectoryList('main_header');
$template = new PhutilSprite();
$sprites = array();
foreach ($gradients as $gradient) {
$path = $this->getPath('main_header/'.$gradient.'.png');
$sprite = id(clone $template)
->setName('main-header-'.$gradient)
->setSourceFile($path)
->setTargetCSS('.main-header-'.$gradient);
$sprite->setSourceSize(6, 44);
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('main-header',
false,
PhutilSpriteSheet::TYPE_REPEAT_X);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildAppsSheet() {
return $this->buildAppsSheetVariant(1);
}
public function buildAppsLargeSheet() {
return $this->buildAppsSheetVariant(2);
}
public function buildAppsXLargeSheet() {
return $this->buildAppsSheetVariant(3);
}
private function buildAppsSheetVariant($variant) {
if ($variant == 1) {
$scales = array(
'1x' => 1,
'2x' => 2,
);
$variant_name = 'apps';
$variant_short = '';
$size_x = 14;
$size_y = 14;
$colors = array(
'dark' => 'dark',
);
} else if ($variant == 2) {
$scales = array(
'2x' => 1,
'4x' => 2,
);
$variant_name = 'apps-large';
$variant_short = '-large';
$size_x = 28;
$size_y = 28;
$colors = array(
'light' => 'lb',
'dark' => 'dark',
'blue' => 'blue',
);
} else {
$scales = array(
'4x' => 1,
);
$variant_name = 'apps-xlarge';
$variant_short = '-xlarge';
$size_x = 56;
$size_y = 56;
$colors = array(
'dark' => 'dark',
);
}
$apps = $this->getDirectoryList('apps_dark_1x');
$template = id(new PhutilSprite())
->setSourceSize($size_x, $size_y);
$sprites = array();
foreach ($apps as $app) {
foreach ($colors as $color => $color_path) {
$css = '.apps-'.$app.'-'.$color.$variant_short;
if ($color == 'blue' && $variant_name == 'apps-large') {
$css .= ', .phabricator-crumb-view:hover .apps-'.$app.'-dark-large';
}
$sprite = id(clone $template)
->setName('apps-'.$app.'-'.$color.$variant_short)
->setTargetCSS($css);
foreach ($scales as $scale_name => $scale) {
$path = $this->getPath(
'apps_'.$color_path.'_'.$scale_name.'/'.$app.'.png');
$sprite->setSourceFile($path, $scale);
}
$sprites[] = $sprite;
}
}
$sheet = $this->buildSheet($variant_name, count($scales) > 1);
$sheet->setScales($scales);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
private function getPath($to_path = null) {
$root = dirname(phutil_get_library_root('phabricator'));
return $root.'/resources/sprite/'.$to_path;
}
private function getDirectoryList($dir) {
$path = $this->getPath($dir);
$result = array();
$images = Filesystem::listDirectory($path, $include_hidden = false);
foreach ($images as $image) {
if (!preg_match('/\.png$/', $image)) {
throw new Exception(
"Expected file '{$image}' in '{$path}' to be a sprite source ".
"ending in '.png'.");
}
$result[] = substr($image, 0, -4);
}
return $result;
}
private function buildSheet(
$name,
$has_retina,
$type = null,
$extra_css = '') {
$sheet = new PhutilSpriteSheet();
$at = '@';
switch ($type) {
case PhutilSpriteSheet::TYPE_STANDARD:
default:
$type = PhutilSpriteSheet::TYPE_STANDARD;
$repeat_rule = 'no-repeat';
break;
case PhutilSpriteSheet::TYPE_REPEAT_X:
$repeat_rule = 'repeat-x';
break;
case PhutilSpriteSheet::TYPE_REPEAT_Y:
$repeat_rule = 'repeat-y';
break;
}
$retina_rules = null;
if ($has_retina) {
$retina_rules = <<<EOCSS
@media
only screen and (min-device-pixel-ratio: 1.5),
only screen and (-webkit-min-device-pixel-ratio: 1.5) {
.sprite-{$name}{$extra_css} {
background-image: url(/rsrc/image/sprite-{$name}-X2.png);
background-size: {X}px {Y}px;
}
}
EOCSS;
}
$sheet->setSheetType($type);
$sheet->setCSSHeader(<<<EOCSS
/**
* @provides sprite-{$name}-css
* {$at}generated
*/
.sprite-{$name}{$extra_css} {
background-image: url(/rsrc/image/sprite-{$name}.png);
background-repeat: {$repeat_rule};
}
{$retina_rules}
EOCSS
);
return $sheet;
}
}
diff --git a/src/view/control/AphrontTokenizerTemplateView.php b/src/view/control/AphrontTokenizerTemplateView.php
index 345f827d2e..678299df12 100644
--- a/src/view/control/AphrontTokenizerTemplateView.php
+++ b/src/view/control/AphrontTokenizerTemplateView.php
@@ -1,107 +1,107 @@
<?php
final class AphrontTokenizerTemplateView extends AphrontView {
private $value;
private $name;
private $id;
public function setID($id) {
$this->id = $id;
return $this;
}
public function setValue(array $value) {
assert_instances_of($value, 'PhabricatorObjectHandle');
$this->value = $value;
return $this;
}
public function getValue() {
return $this->value;
}
public function setName($name) {
$this->name = $name;
return $this;
}
public function getName() {
return $this->name;
}
public function render() {
require_celerity_resource('aphront-tokenizer-control-css');
$id = $this->id;
$name = $this->getName();
$values = nonempty($this->getValue(), array());
$tokens = array();
foreach ($values as $key => $value) {
$tokens[] = $this->renderToken(
$value->getPHID(),
$value->getFullName(),
- $value->getTypeIcon());
+ $value->getType());
}
$input = javelin_tag(
'input',
array(
'mustcapture' => true,
'name' => $name,
'class' => 'jx-tokenizer-input',
'sigil' => 'tokenizer-input',
'style' => 'width: 0px;',
'disabled' => 'disabled',
'type' => 'text',
));
$content = $tokens;
$content[] = $input;
$content[] = phutil_tag('div', array('style' => 'clear: both;'), '');
return phutil_tag(
'div',
array(
'id' => $id,
'class' => 'jx-tokenizer-container',
),
$content);
}
private function renderToken($key, $value, $icon) {
$input_name = $this->getName();
if ($input_name) {
$input_name .= '[]';
}
if ($icon) {
$value = array(
phutil_tag(
'span',
array(
- 'class' => 'phui-icon-view sprite-status status-'.$icon,
+ 'class' => 'phui-icon-view phui-font-fa bluegrey '.$icon,
)),
$value);
}
return phutil_tag(
'a',
array(
'class' => 'jx-tokenizer-token',
),
array(
$value,
phutil_tag(
'input',
array(
'type' => 'hidden',
'name' => $input_name,
'value' => $key,
)),
phutil_tag('span', array('class' => 'jx-tokenizer-x-placeholder'), ''),
));
}
}
diff --git a/src/view/form/control/AphrontFormPolicyControl.php b/src/view/form/control/AphrontFormPolicyControl.php
index 31b0798f8b..ee7d8edf1d 100644
--- a/src/view/form/control/AphrontFormPolicyControl.php
+++ b/src/view/form/control/AphrontFormPolicyControl.php
@@ -1,231 +1,230 @@
<?php
final class AphrontFormPolicyControl extends AphrontFormControl {
private $object;
private $capability;
private $policies;
public function setPolicyObject(PhabricatorPolicyInterface $object) {
$this->object = $object;
return $this;
}
public function setPolicies(array $policies) {
assert_instances_of($policies, 'PhabricatorPolicy');
$this->policies = $policies;
return $this;
}
public function setCapability($capability) {
$this->capability = $capability;
$labels = array(
PhabricatorPolicyCapability::CAN_VIEW => pht('Visible To'),
PhabricatorPolicyCapability::CAN_EDIT => pht('Editable By'),
PhabricatorPolicyCapability::CAN_JOIN => pht('Joinable By'),
);
if (isset($labels[$capability])) {
$label = $labels[$capability];
} else {
$capobj = PhabricatorPolicyCapability::getCapabilityByKey($capability);
if ($capobj) {
$label = $capobj->getCapabilityName();
} else {
$label = pht('Capability "%s"', $capability);
}
}
$this->setLabel($label);
return $this;
}
protected function getCustomControlClass() {
return 'aphront-form-control-policy';
}
protected function getOptions() {
$capability = $this->capability;
$options = array();
foreach ($this->policies as $policy) {
if ($policy->getPHID() == PhabricatorPolicies::POLICY_PUBLIC) {
// Never expose "Public" for capabilities which don't support it.
$capobj = PhabricatorPolicyCapability::getCapabilityByKey($capability);
if (!$capobj || !$capobj->shouldAllowPublicPolicySetting()) {
continue;
}
}
$options[$policy->getType()][$policy->getPHID()] = array(
'name' => phutil_utf8_shorten($policy->getName(), 28),
'full' => $policy->getName(),
'icon' => $policy->getIcon(),
);
}
// If we were passed several custom policy options, throw away the ones
// which aren't the value for this capability. For example, an object might
// have a custom view pollicy and a custom edit policy. When we render
// the selector for "Can View", we don't want to show the "Can Edit"
// custom policy -- if we did, the menu would look like this:
//
// Custom
// Custom Policy
// Custom Policy
//
// ...where one is the "view" custom policy, and one is the "edit" custom
// policy.
$type_custom = PhabricatorPolicyType::TYPE_CUSTOM;
if (!empty($options[$type_custom])) {
$options[$type_custom] = array_select_keys(
$options[$type_custom],
array($this->getValue()));
}
// If there aren't any custom policies, add a placeholder policy so we
// render a menu item. This allows the user to switch to a custom policy.
if (empty($options[$type_custom])) {
$placeholder = new PhabricatorPolicy();
$placeholder->setName(pht('Custom Policy...'));
$options[$type_custom][$this->getCustomPolicyPlaceholder()] = array(
'name' => $placeholder->getName(),
'full' => $placeholder->getName(),
'icon' => $placeholder->getIcon(),
);
}
$options = array_select_keys(
$options,
array(
PhabricatorPolicyType::TYPE_GLOBAL,
PhabricatorPolicyType::TYPE_USER,
PhabricatorPolicyType::TYPE_CUSTOM,
PhabricatorPolicyType::TYPE_PROJECT,
));
return $options;
}
protected function renderInput() {
if (!$this->object) {
throw new Exception(pht("Call setPolicyObject() before rendering!"));
}
if (!$this->capability) {
throw new Exception(pht("Call setCapability() before rendering!"));
}
$policy = $this->object->getPolicy($this->capability);
if (!$policy) {
// TODO: Make this configurable.
$policy = PhabricatorPolicies::POLICY_USER;
}
if (!$this->getValue()) {
$this->setValue($policy);
}
$control_id = celerity_generate_unique_node_id();
$input_id = celerity_generate_unique_node_id();
$caret = phutil_tag(
'span',
array(
'class' => 'caret',
));
$input = phutil_tag(
'input',
array(
'type' => 'hidden',
'id' => $input_id,
'name' => $this->getName(),
'value' => $this->getValue(),
));
$options = $this->getOptions();
$order = array();
$labels = array();
foreach ($options as $key => $values) {
$order[$key] = array_keys($values);
$labels[$key] = PhabricatorPolicyType::getPolicyTypeName($key);
}
$flat_options = array_mergev($options);
$icons = array();
foreach (igroup($flat_options, 'icon') as $icon => $ignored) {
$icons[$icon] = id(new PHUIIconView())
- ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
- ->setSpriteIcon($icon);
+ ->setIconFont($icon);
}
Javelin::initBehavior(
'policy-control',
array(
'controlID' => $control_id,
'inputID' => $input_id,
'options' => $flat_options,
'groups' => array_keys($options),
'order' => $order,
'icons' => $icons,
'labels' => $labels,
'value' => $this->getValue(),
'customPlaceholder' => $this->getCustomPolicyPlaceholder(),
));
$selected = idx($flat_options, $this->getValue(), array());
$selected_icon = idx($selected, 'icon');
$selected_name = idx($selected, 'name');
return phutil_tag(
'div',
array(
),
array(
javelin_tag(
'a',
array(
'class' => 'grey button dropdown has-icon policy-control',
'href' => '#',
'mustcapture' => true,
'sigil' => 'policy-control',
'id' => $control_id,
),
array(
$caret,
javelin_tag(
'span',
array(
'sigil' => 'policy-label',
'class' => 'phui-button-text',
),
array(
idx($icons, $selected_icon),
$selected_name,
)),
)),
$input,
));
return AphrontFormSelectControl::renderSelectTag(
$this->getValue(),
$this->getOptions(),
array(
'name' => $this->getName(),
'disabled' => $this->getDisabled() ? 'disabled' : null,
'id' => $this->getID(),
));
}
private function getCustomPolicyPlaceholder() {
return 'custom:placeholder';
}
}
diff --git a/src/view/phui/PHUIHeaderView.php b/src/view/phui/PHUIHeaderView.php
index 7d69fde223..6844314ea5 100644
--- a/src/view/phui/PHUIHeaderView.php
+++ b/src/view/phui/PHUIHeaderView.php
@@ -1,275 +1,273 @@
<?php
final class PHUIHeaderView extends AphrontView {
const PROPERTY_STATUS = 1;
private $objectName;
private $header;
private $tags = array();
private $image;
private $imageURL = null;
private $subheader;
private $gradient;
private $noBackground;
private $bleedHeader;
private $properties = array();
private $actionLinks = array();
private $buttonBar = null;
private $policyObject;
public function setHeader($header) {
$this->header = $header;
return $this;
}
public function setObjectName($object_name) {
$this->objectName = $object_name;
return $this;
}
public function setNoBackground($nada) {
$this->noBackground = $nada;
return $this;
}
public function addTag(PHUITagView $tag) {
$this->tags[] = $tag;
return $this;
}
public function setImage($uri) {
$this->image = $uri;
return $this;
}
public function setImageURL($url) {
$this->imageURL = $url;
return $this;
}
public function setSubheader($subheader) {
$this->subheader = $subheader;
return $this;
}
public function setBleedHeader($bleed) {
$this->bleedHeader = $bleed;
return $this;
}
public function setGradient($gradient) {
$this->gradient = $gradient;
return $this;
}
public function setPolicyObject(PhabricatorPolicyInterface $object) {
$this->policyObject = $object;
return $this;
}
public function addProperty($property, $value) {
$this->properties[$property] = $value;
return $this;
}
public function addActionLink(PHUIButtonView $button) {
$this->actionLinks[] = $button;
return $this;
}
public function setButtonBar(PHUIButtonBarView $bb) {
$this->buttonBar = $bb;
return $this;
}
public function setStatus($icon, $color, $name) {
$header_class = 'phui-header-status';
if ($color) {
- $icon = $icon.'-'.$color;
+ $icon = $icon.' '.$color;
$header_class = $header_class.'-'.$color;
}
$img = id(new PHUIIconView())
- ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
- ->setSpriteIcon($icon);
+ ->setIconFont($icon);
$tag = phutil_tag(
'span',
array(
'class' => "{$header_class} plr",
),
array(
$img,
$name,
));
return $this->addProperty(self::PROPERTY_STATUS, $tag);
}
public function render() {
require_celerity_resource('phui-header-view-css');
$classes = array();
$classes[] = 'phui-header-shell';
if ($this->noBackground) {
$classes[] = 'phui-header-no-backgound';
}
if ($this->bleedHeader) {
$classes[] = 'phui-bleed-header';
}
if ($this->gradient) {
$classes[] = 'sprite-gradient';
$classes[] = 'gradient-'.$this->gradient.'-header';
}
if ($this->properties || $this->policyObject || $this->subheader) {
$classes[] = 'phui-header-tall';
}
$image = null;
if ($this->image) {
$image = phutil_tag(
($this->imageURL ? 'a' : 'span'),
array(
'href' => $this->imageURL,
'class' => 'phui-header-image',
'style' => 'background-image: url('.$this->image.')',
),
' ');
$classes[] = 'phui-header-has-image';
}
$header = array();
$header[] = $this->header;
if ($this->objectName) {
array_unshift(
$header,
phutil_tag(
'a',
array(
'href' => '/'.$this->objectName,
),
$this->objectName),
' ');
}
if ($this->tags) {
$header[] = ' ';
$header[] = phutil_tag(
'span',
array(
'class' => 'phui-header-tags',
),
array_interleave(' ', $this->tags));
}
if ($this->subheader) {
$header[] = phutil_tag(
'div',
array(
'class' => 'phui-header-subheader',
),
$this->subheader);
}
if ($this->properties || $this->policyObject) {
$property_list = array();
foreach ($this->properties as $type => $property) {
switch ($type) {
case self::PROPERTY_STATUS:
$property_list[] = $property;
break;
default:
throw new Exception('Incorrect Property Passed');
break;
}
}
if ($this->policyObject) {
$property_list[] = $this->renderPolicyProperty($this->policyObject);
}
$header[] = phutil_tag(
'div',
array(
'class' => 'phui-header-subheader',
),
$property_list);
}
if ($this->actionLinks) {
$actions = array();
foreach ($this->actionLinks as $button) {
$button->setColor(PHUIButtonView::SIMPLE);
$button->addClass(PHUI::MARGIN_SMALL_LEFT);
$button->addClass('phui-header-action-link');
$actions[] = $button;
}
$header[] = phutil_tag(
'div',
array(
'class' => 'phui-header-action-links',
),
$actions);
}
if ($this->buttonBar) {
$header[] = phutil_tag(
'div',
array(
'class' => 'phui-header-action-links',
),
$this->buttonBar);
}
return phutil_tag(
'div',
array(
'class' => implode(' ', $classes),
),
array(
$image,
phutil_tag(
'h1',
array(
'class' => 'phui-header-view',
),
$header),
));
}
private function renderPolicyProperty(PhabricatorPolicyInterface $object) {
$policies = PhabricatorPolicyQuery::loadPolicies(
$this->getUser(),
$object);
$view_capability = PhabricatorPolicyCapability::CAN_VIEW;
$policy = idx($policies, $view_capability);
if (!$policy) {
return null;
}
$phid = $object->getPHID();
$icon = id(new PHUIIconView())
- ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
- ->setSpriteIcon($policy->getIcon());
+ ->setIconFont($policy->getIcon().' bluegrey');
$link = javelin_tag(
'a',
array(
'class' => 'policy-link',
'href' => '/policy/explain/'.$phid.'/'.$view_capability.'/',
'sigil' => 'workflow',
),
$policy->getShortName());
return array($icon, $link);
}
}
diff --git a/src/view/phui/PHUIIconView.php b/src/view/phui/PHUIIconView.php
index 72c9bb4f13..bac9a363ed 100644
--- a/src/view/phui/PHUIIconView.php
+++ b/src/view/phui/PHUIIconView.php
@@ -1,117 +1,116 @@
<?php
final class PHUIIconView extends AphrontTagView {
const SPRITE_MINICONS = 'minicons';
const SPRITE_ACTIONS = 'actions';
const SPRITE_APPS = 'apps';
const SPRITE_TOKENS = 'tokens';
const SPRITE_PAYMENTS = 'payments';
const SPRITE_ICONS = 'icons';
const SPRITE_LOGIN = 'login';
- const SPRITE_STATUS = 'status';
const SPRITE_PROJECTS = 'projects';
const SPRITE_BUTTONBAR = 'buttonbar';
const HEAD_SMALL = 'phuihead-small';
const HEAD_MEDIUM = 'phuihead-medium';
private $href = null;
private $image;
private $text;
private $headSize = null;
private $spriteIcon;
private $spriteSheet;
private $iconFont;
public function setHref($href) {
$this->href = $href;
return $this;
}
public function setImage($image) {
$this->image = $image;
return $this;
}
public function setText($text) {
$this->text = $text;
return $this;
}
public function setHeadSize($size) {
$this->headSize = $size;
return $this;
}
public function setSpriteIcon($sprite) {
$this->spriteIcon = $sprite;
return $this;
}
public function setSpriteSheet($sheet) {
$this->spriteSheet = $sheet;
return $this;
}
public function setIconFont($icon) {
$this->iconFont = $icon;
return $this;
}
public function getTagName() {
$tag = 'span';
if ($this->href) {
$tag = 'a';
}
return $tag;
}
public function getTagAttributes() {
require_celerity_resource('phui-icon-view-css');
$style = null;
$classes = array();
$classes[] = 'phui-icon-view';
if ($this->spriteIcon) {
require_celerity_resource('sprite-'.$this->spriteSheet.'-css');
$classes[] = 'sprite-'.$this->spriteSheet;
$classes[] = $this->spriteSheet.'-'.$this->spriteIcon;
} elseif ($this->iconFont) {
require_celerity_resource('phui-font-icon-base-css');
require_celerity_resource('font-fontawesome');
$classes[] = 'phui-font-fa';
$classes[] = $this->iconFont;
} else {
if ($this->headSize) {
$classes[] = $this->headSize;
}
$style = 'background-image: url('.$this->image.');';
}
if ($this->text) {
$classes[] = 'phui-icon-has-text';
$this->appendChild($this->text);
}
return array(
'href' => $this->href,
'style' => $style,
'aural' => false,
'class' => $classes,
);
}
public static function getSheetManifest($sheet) {
$root = dirname(phutil_get_library_root('phabricator'));
$path = $root.'/resources/sprite/manifest/'.$sheet.'.json';
$data = Filesystem::readFile($path);
return idx(json_decode($data, true), 'sprites');
}
}
diff --git a/src/view/phui/PHUIPropertyListView.php b/src/view/phui/PHUIPropertyListView.php
index 9109173a77..2c5f02dd86 100644
--- a/src/view/phui/PHUIPropertyListView.php
+++ b/src/view/phui/PHUIPropertyListView.php
@@ -1,246 +1,245 @@
<?php
final class PHUIPropertyListView extends AphrontView {
private $parts = array();
private $hasKeyboardShortcuts;
private $object;
private $invokedWillRenderEvent;
private $actionList;
private $classes = array();
private $stacked;
- const ICON_SUMMARY = 'pl-summary';
- const ICON_TESTPLAN = 'pl-testplan';
+ const ICON_SUMMARY = 'fa-align-left bluegrey';
+ const ICON_TESTPLAN = 'fa-file-text-o bluegrey';
protected function canAppendChild() {
return false;
}
public function setObject($object) {
$this->object = $object;
return $this;
}
public function setActionList(PhabricatorActionListView $list) {
$this->actionList = $list;
return $this;
}
public function setStacked($stacked) {
$this->stacked = $stacked;
return $this;
}
public function addClass($class) {
$this->classes[] = $class;
return $this;
}
public function setHasKeyboardShortcuts($has_keyboard_shortcuts) {
$this->hasKeyboardShortcuts = $has_keyboard_shortcuts;
return $this;
}
public function addProperty($key, $value) {
$current = array_pop($this->parts);
if (!$current || $current['type'] != 'property') {
if ($current) {
$this->parts[] = $current;
}
$current = array(
'type' => 'property',
'list' => array(),
);
}
$current['list'][] = array(
'key' => $key,
'value' => $value,
);
$this->parts[] = $current;
return $this;
}
public function addSectionHeader($name, $icon=null) {
$this->parts[] = array(
'type' => 'section',
'name' => $name,
'icon' => $icon,
);
return $this;
}
public function addTextContent($content) {
$this->parts[] = array(
'type' => 'text',
'content' => $content,
);
return $this;
}
public function addImageContent($content) {
$this->parts[] = array(
'type' => 'image',
'content' => $content,
);
return $this;
}
public function invokeWillRenderEvent() {
if ($this->object && $this->getUser() && !$this->invokedWillRenderEvent) {
$event = new PhabricatorEvent(
PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES,
array(
'object' => $this->object,
'view' => $this,
));
$event->setUser($this->getUser());
PhutilEventEngine::dispatchEvent($event);
}
$this->invokedWillRenderEvent = true;
}
public function render() {
$this->invokeWillRenderEvent();
require_celerity_resource('phui-property-list-view-css');
$items = array();
foreach ($this->parts as $part) {
$type = $part['type'];
switch ($type) {
case 'property':
$items[] = $this->renderPropertyPart($part);
break;
case 'section':
$items[] = $this->renderSectionPart($part);
break;
case 'text':
case 'image':
$items[] = $this->renderTextPart($part);
break;
default:
throw new Exception(pht("Unknown part type '%s'!", $type));
}
}
$this->classes[] = 'phui-property-list-section';
$classes = implode(' ', $this->classes);
return phutil_tag(
'div',
array(
'class' => $classes,
),
array(
$items,
));
}
private function renderPropertyPart(array $part) {
$items = array();
foreach ($part['list'] as $spec) {
$key = $spec['key'];
$value = $spec['value'];
// NOTE: We append a space to each value to improve the behavior when the
// user double-clicks a property value (like a URI) to select it. Without
// the space, the label is also selected.
$items[] = phutil_tag(
'dt',
array(
'class' => 'phui-property-list-key',
),
array($key, ' '));
$items[] = phutil_tag(
'dd',
array(
'class' => 'phui-property-list-value',
),
array($value, ' '));
}
$stacked = '';
if ($this->stacked) {
$stacked = 'phui-property-list-stacked';
}
$list = phutil_tag(
'dl',
array(
'class' => 'phui-property-list-properties '.$stacked,
),
$items);
$shortcuts = null;
if ($this->hasKeyboardShortcuts) {
$shortcuts = new AphrontKeyboardShortcutsAvailableView();
}
$list = phutil_tag(
'div',
array(
'class' => 'phui-property-list-properties-wrap',
),
array($shortcuts, $list));
$action_list = null;
if ($this->actionList) {
$action_list = phutil_tag(
'div',
array(
'class' => 'phui-property-list-actions',
),
$this->actionList);
$this->actionList = null;
}
return phutil_tag(
'div',
array(
'class' => 'phui-property-list-container grouped',
),
array($action_list, $list));
}
private function renderSectionPart(array $part) {
$name = $part['name'];
if ($part['icon']) {
$icon = id(new PHUIIconView())
- ->setSpriteSheet(PHUIIconView::SPRITE_STATUS)
- ->setSpriteIcon($part['icon']);
+ ->setIconFont($part['icon']);
$name = phutil_tag(
'span',
array(
'class' => 'phui-property-list-section-header-icon',
),
array($icon, $name));
}
return phutil_tag(
'div',
array(
'class' => 'phui-property-list-section-header',
),
$name);
}
private function renderTextPart(array $part) {
$classes = array();
$classes[] = 'phui-property-list-text-content';
if ($part['type'] == 'image') {
$classes[] = 'phui-property-list-image-content';
}
return phutil_tag(
'div',
array(
'class' => implode($classes, ' '),
),
$part['content']);
}
}
diff --git a/webroot/rsrc/css/aphront/typeahead.css b/webroot/rsrc/css/aphront/typeahead.css
index 923e2b3fa5..bd889bb571 100644
--- a/webroot/rsrc/css/aphront/typeahead.css
+++ b/webroot/rsrc/css/aphront/typeahead.css
@@ -1,72 +1,76 @@
/**
* @provides aphront-typeahead-control-css
*/
div.jx-typeahead-hardpoint {
position: relative;
- _zoom: 1; /* Some kind of IE6 fix? */ /* yes */
+ _zoom: 1; /* Some kind of IE6 fix? */ /* yes */ /* why? */
}
div.jx-typeahead-results {
position: absolute;
border: 1px solid #96a6c7;
border-top: 0px;
padding: 0;
background: #fefefe;
width: 98%;
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);
margin: -1px 1% 0;
}
.aphront-form-control-typeahead div.jx-typeahead-results {
width: 100%;
margin: 0;
box-sizing: border-box;
}
div.jx-typeahead-results a.jx-result {
color: #333;
display: block;
font-size: 13px;
border-bottom: 1px solid #e7e7e7;
border-top: 1px solid #fff;
}
div.jx-typeahead-results a.jx-result:hover,
div.jx-typeahead-results a.focused {
display: block;
- background: #dde6f9;
- border-top: 1px solid #dde6f9;
- border-bottom: 1px solid #d0dbf3;
+ background: {$lightblue};
+ border-top: 1px solid {$thinblueborder};
+ border-bottom: 1px solid {$thinblueborder};
text-decoration: none;
}
+div.jx-typeahead-results .phui-icon-view {
+ margin-top: 2px;
+}
+
table.jx-typeahead button {
margin-left: 3px;
}
table.jx-typeahead input {
font-size: 13px;
padding: 2px;
}
input.jx-typeahead-placeholder {
color: {$lightgreytext};
}
div.jx-tokenizer-container-focused.jx-typeahead-waiting {
border-color: {$lightblueborder};
}
div.jx-typeahead-results a.diffusion-locate-file {
padding: 4px 8px;
color: {$darkgreytext}
}
.diffusion-locate-file strong {
color: {$blue};
}
.diffusion-locate-file .phui-icon-view {
padding-right: 8px;
}
diff --git a/webroot/rsrc/css/phui/phui-header-view.css b/webroot/rsrc/css/phui/phui-header-view.css
index 57d213a569..0c08aa9a96 100644
--- a/webroot/rsrc/css/phui/phui-header-view.css
+++ b/webroot/rsrc/css/phui/phui-header-view.css
@@ -1,133 +1,133 @@
/**
* @provides phui-header-view-css
*/
.phui-header-shell {
background-color: #e0e3ec;
border-width: 1px 0;
border-style: solid;
border-color: #c0c5d1;
overflow: hidden;
}
body .phui-header-shell.phui-header-no-backgound {
background-color: transparent;
border: none;
}
body .phui-header-shell.phui-bleed-header {
background-color: #fff;
border-bottom: 1px solid {$thinblueborder};
width: auto;
margin: 16px;
}
body .phui-header-shell.phui-bleed-header
.phui-header-view {
padding: 8px 24px 8px 0;
color: {$bluetext};
}
.phui-header-shell + .phabricator-form-view {
border-top-width: 0;
}
.phui-property-list-view + .diviner-document-section {
margin-top: -1px;
}
.phui-header-view {
padding: 16px;
font-size: 15px;
color: {$darkbluetext};
position: relative;
}
.phui-header-view a,
.phui-header-view a.simple {
color: {$darkbluetext};
}
.phui-header-view .phui-header-action-links {
position: absolute;
top: 24px;
right: 12px;
}
.phui-object-box .phui-header-view .phui-header-action-links {
top: 5px;
right: 0;
}
.phui-document-view .phui-header-view .phui-header-action-links {
right: 8px;
top: 12px;
}
.device-phone .phui-header-action-link .phui-button-text {
visibility: hidden;
width: 0;
margin-left: 12px;
}
.phui-header-divider {
margin: 0 4px;
font-weight: normal;
color: {$lightbluetext};
}
body.device-phone .phui-header-view {
padding: 12px 8px;
}
.phui-header-tags {
margin-left: 12px;
font-size: 13px;
}
.phui-header-tags .phui-tag-view {
margin-left: 4px;
}
.phui-header-image {
display: inline-block;
background-repeat: no-repeat;
border: 1px solid white;
width: 50px;
height: 50px;
margin: 12px;
float: left;
}
.phui-header-subheader {
color: {$lightbluetext};
font-weight: normal;
font-size: 13px;
margin-top: 4px;
}
-.phui-header-subheader .sprite-status {
+.phui-header-subheader .phui-icon-view {
display: inline-block;
margin: -2px 4px -2px 0;
}
.phui-header-subheader {
color: {$bluetext};
}
.phui-header-subheader .policy-link {
color: {$bluetext};
}
.phui-header-subheader .phui-header-status-dark {
color: #111;
text-shadow: 0 1px #fff;
}
.phui-header-subheader .phui-header-status-red {
color: {$red};
}
.phui-header-subheader .phui-header-status-green {
color: {$green};
}
diff --git a/webroot/rsrc/css/phui/phui-icon.css b/webroot/rsrc/css/phui/phui-icon.css
index a8c19b5fa5..a18768ce6b 100644
--- a/webroot/rsrc/css/phui/phui-icon.css
+++ b/webroot/rsrc/css/phui/phui-icon.css
@@ -1,57 +1,56 @@
/**
* @provides phui-icon-view-css
*/
.phui-icon-example .phui-icon-view {
display: inline-block;
vertical-align: top;
}
.phui-icon-view.sprite-minicons {
height: 16px;
width: 16px;
}
.phui-icon-view.sprite-actions {
height: 24px;
width: 24px;
}
.phui-icon-view.sprite-apps,
-.phui-icon-view.sprite-status,
.phui-icon-view.sprite-buttonbar {
height: 14px;
width: 14px;
}
.phui-icon-view.sprite-tokens {
height: 16px;
width: 16px;
display: inline-block;
vertical-align: top;
}
.phui-icon-view.sprite-payments {
height: 32px;
width: 60px;
}
.phui-icon-view.sprite-login {
height: 34px;
width: 34px;
}
.phui-icon-view.phuihead-medium {
height: 50px;
width: 50px;
}
.phui-icon-view.phuihead-small {
height: 35px;
width: 35px;
background-size: 35px;
}
.phui-icon-has-text:before {
margin-right: 8px;
}
diff --git a/webroot/rsrc/css/phui/phui-property-list-view.css b/webroot/rsrc/css/phui/phui-property-list-view.css
index 63dd032a6a..6efcb2f3fb 100644
--- a/webroot/rsrc/css/phui/phui-property-list-view.css
+++ b/webroot/rsrc/css/phui/phui-property-list-view.css
@@ -1,184 +1,184 @@
/**
* @provides phui-property-list-view-css
*/
.phui-property-list-view {
background-color: #fff;
}
.phui-property-list-view .keyboard-shortcuts-available {
float: right;
height: 16px;
margin: 12px 10px -28px 0px;
padding: 0px 20px 0px 0px;
vertical-align: middle;
color: {$greytext};
text-align: right;
font-size: 11px;
background:
url('/rsrc/image/icon/fatcow/key_question.png') right center no-repeat;
}
.device .keyboard-shortcuts-available {
display: none;
}
.phui-property-group-noninitial,
.phui-property-list-section-noninitial {
border-color: {$thinblueborder};
border-style: solid;
border-width: 1px 0 0;
}
.device-desktop .phui-property-list-container {
padding: 12px 0 12px 0;
width: 100%;
}
.device .phui-property-list-container {
padding: 12px 0 4px 0;
}
.phui-property-list-key {
color: {$bluetext};
font-weight: bold;
overflow: hidden;
white-space: nowrap;
}
.device-desktop .phui-property-list-key {
width: 18%;
margin-left: 1%;
text-align: right;
float: left;
clear: left;
margin-bottom: 4px;
}
.device .phui-property-list-key,
.phui-property-list-properties.phui-property-list-stacked
.phui-property-list-key {
padding-left: 12px;
text-align: left;
margin-left: 0;
width: auto;
}
.phui-property-list-value {
color: {$darkgreytext};
line-height: 17px;
}
.device-desktop .phui-property-list-value {
width: 78%;
margin-left: 1%;
float: left;
margin-bottom: 4px;
}
.device .phui-property-list-value,
.phui-property-list-properties.phui-property-list-stacked
.phui-property-list-value {
padding: 0 16px;
margin-bottom: 8px;
width: auto;
word-break: break-word;
}
.phui-property-list-section-header {
color: {$bluetext};
padding: 12px 16px 0px;
text-transform: uppercase;
font-weight: 700;
border-color: {$thinblueborder};
border-style: solid;
border-width: 1px 0 0;
}
.phui-property-list-section-noninitial .phui-property-list-section-header {
border-top: none;
}
.device .phui-property-list-section-header {
padding-left: 8px;
}
-.phui-property-list-section-header-icon .sprite-status {
+.phui-property-list-section-header-icon .phui-icon-view {
display: inline-block;
margin: -2px 4px -2px 0;
}
.phui-property-list-text-content {
padding: 12px 16px;
background: #fff;
overflow: hidden;
}
.device .phui-property-list-text-content {
padding: 8px;
}
/* In the common case where we immediately follow a header, move back up 30px
so we snuggle next to the header. */
.device-desktop .phui-header-view
+ .phabricator-action-list-view {
margin-top: -30px;
}
.device-desktop .phui-header-view
+ .phabricator-action-list-view
+ .phui-property-list-view {
margin-top: 0px;
}
.phui-property-list-image {
margin: auto;
max-width: 95%;
}
.phui-property-list-audio {
display: block;
margin: 16px auto;
width: 50%;
min-width: 240px;
}
/* When tags appear in property lists, give them a little more vertical
spacing. */
.phui-property-list-view .phui-tag-view {
margin: 2px 0;
}
.phui-property-list-properties-wrap {
float: left;
width: 78%;
}
.device .phui-property-list-properties-wrap {
width: auto;
border: none;
}
.phui-property-list-actions {
width: 20%;
float: right;
margin-right: 12px;
border-left: 1px solid {$thinblueborder};
}
.device .phui-property-list-actions {
float: none;
width: auto;
margin: -12px 0 12px 0;
}
.phui-property-list-image-content img {
margin: 20px auto;
background: url('/rsrc/image/checker_light.png');
border: 1px solid {$lightblueborder};
}
.device-desktop .phui-property-list-image-content img:hover {
background: url('/rsrc/image/checker_dark.png');
}
diff --git a/webroot/rsrc/css/sprite-status.css b/webroot/rsrc/css/sprite-status.css
deleted file mode 100644
index cde9a513f9..0000000000
--- a/webroot/rsrc/css/sprite-status.css
+++ /dev/null
@@ -1,431 +0,0 @@
-/**
- * @provides sprite-status-css
- * @generated
- */
-
-.sprite-status {
- background-image: url(/rsrc/image/sprite-status.png);
- background-repeat: no-repeat;
-}
-
-@media
-only screen and (min-device-pixel-ratio: 1.5),
-only screen and (-webkit-min-device-pixel-ratio: 1.5) {
- .sprite-status {
- background-image: url(/rsrc/image/sprite-status-X2.png);
- background-size: 150px 165px;
- }
-}
-
-
-.status-accept-blue {
- background-position: 0px 0px;
-}
-
-.status-accept-dark {
- background-position: -15px 0px;
-}
-
-.status-accept-green {
- background-position: -30px 0px;
-}
-
-.status-accept-red {
- background-position: -45px 0px;
-}
-
-.status-accept-white {
- background-position: -60px 0px;
-}
-
-.status-accept {
- background-position: -75px 0px;
-}
-
-.status-add-blue {
- background-position: -90px 0px;
-}
-
-.status-add-dark {
- background-position: -105px 0px;
-}
-
-.status-add-green {
- background-position: -120px 0px;
-}
-
-.status-add-red {
- background-position: -135px 0px;
-}
-
-.status-add-white {
- background-position: 0px -15px;
-}
-
-.status-add {
- background-position: -15px -15px;
-}
-
-.status-down-blue {
- background-position: -30px -15px;
-}
-
-.status-down-dark {
- background-position: -45px -15px;
-}
-
-.status-down-green {
- background-position: -60px -15px;
-}
-
-.status-down-red {
- background-position: -75px -15px;
-}
-
-.status-down-white {
- background-position: -90px -15px;
-}
-
-.status-down {
- background-position: -105px -15px;
-}
-
-.status-info-blue {
- background-position: -120px -15px;
-}
-
-.status-info-dark {
- background-position: -135px -15px;
-}
-
-.status-info-green {
- background-position: 0px -30px;
-}
-
-.status-info-red {
- background-position: -15px -30px;
-}
-
-.status-info-white {
- background-position: -30px -30px;
-}
-
-.status-info {
- background-position: -45px -30px;
-}
-
-.status-left-blue {
- background-position: -60px -30px;
-}
-
-.status-left-dark {
- background-position: -75px -30px;
-}
-
-.status-left-green {
- background-position: -90px -30px;
-}
-
-.status-left-red {
- background-position: -105px -30px;
-}
-
-.status-left-white {
- background-position: -120px -30px;
-}
-
-.status-left {
- background-position: -135px -30px;
-}
-
-.status-minus-blue {
- background-position: 0px -45px;
-}
-
-.status-minus-dark {
- background-position: -15px -45px;
-}
-
-.status-minus-green {
- background-position: -30px -45px;
-}
-
-.status-minus-red {
- background-position: -45px -45px;
-}
-
-.status-minus-white {
- background-position: -60px -45px;
-}
-
-.status-minus {
- background-position: -75px -45px;
-}
-
-.status-oh-closed-dark {
- background-position: -90px -45px;
-}
-
-.status-oh-closed {
- background-position: -105px -45px;
-}
-
-.status-oh-ok-dark {
- background-position: -120px -45px;
-}
-
-.status-oh-ok {
- background-position: -135px -45px;
-}
-
-.status-oh-open-green {
- background-position: 0px -60px;
-}
-
-.status-oh-open-red {
- background-position: -15px -60px;
-}
-
-.status-oh-open {
- background-position: -30px -60px;
-}
-
-.status-open-blue {
- background-position: -45px -60px;
-}
-
-.status-open-dark {
- background-position: -60px -60px;
-}
-
-.status-open-green {
- background-position: -75px -60px;
-}
-
-.status-open-red {
- background-position: -90px -60px;
-}
-
-.status-open-white {
- background-position: -105px -60px;
-}
-
-.status-open {
- background-position: -120px -60px;
-}
-
-.status-pl-summary {
- background-position: -135px -60px;
-}
-
-.status-pl-testplan {
- background-position: 0px -75px;
-}
-
-.status-policy-admin-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-admin {
- background-position: -15px -75px;
-}
-
-.status-policy-admin {
- background-position: -30px -75px;
-}
-
-.status-policy-all-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-all {
- background-position: -45px -75px;
-}
-
-.status-policy-all {
- background-position: -60px -75px;
-}
-
-.status-policy-custom-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-custom {
- background-position: -75px -75px;
-}
-
-.status-policy-custom {
- background-position: -90px -75px;
-}
-
-.status-policy-elist-white {
- background-position: -105px -75px;
-}
-
-.status-policy-elist {
- background-position: -120px -75px;
-}
-
-.status-policy-noone-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-noone {
- background-position: -135px -75px;
-}
-
-.status-policy-noone {
- background-position: 0px -90px;
-}
-
-.status-policy-project-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-project {
- background-position: -15px -90px;
-}
-
-.status-policy-project {
- background-position: -30px -90px;
-}
-
-.status-policy-public-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-public {
- background-position: -45px -90px;
-}
-
-.status-policy-public {
- background-position: -60px -90px;
-}
-
-.status-policy-unknown-white, .phuix-dropdown-menu .phabricator-action-view:hover .status-policy-unknown {
- background-position: -75px -90px;
-}
-
-.status-policy-unknown {
- background-position: -90px -90px;
-}
-
-.status-policy-user-white {
- background-position: -105px -90px;
-}
-
-.status-policy-user {
- background-position: -120px -90px;
-}
-
-.status-question-blue {
- background-position: -135px -90px;
-}
-
-.status-question-dark {
- background-position: 0px -105px;
-}
-
-.status-question-green {
- background-position: -15px -105px;
-}
-
-.status-question-red {
- background-position: -30px -105px;
-}
-
-.status-question-white {
- background-position: -45px -105px;
-}
-
-.status-question {
- background-position: -60px -105px;
-}
-
-.status-reject-blue {
- background-position: -75px -105px;
-}
-
-.status-reject-dark {
- background-position: -90px -105px;
-}
-
-.status-reject-green {
- background-position: -105px -105px;
-}
-
-.status-reject-red {
- background-position: -120px -105px;
-}
-
-.status-reject-white {
- background-position: -135px -105px;
-}
-
-.status-reject {
- background-position: 0px -120px;
-}
-
-.status-right-blue {
- background-position: -15px -120px;
-}
-
-.status-right-dark {
- background-position: -30px -120px;
-}
-
-.status-right-green {
- background-position: -45px -120px;
-}
-
-.status-right-red {
- background-position: -60px -120px;
-}
-
-.status-right-white {
- background-position: -75px -120px;
-}
-
-.status-right {
- background-position: -90px -120px;
-}
-
-.status-time-green {
- background-position: -105px -120px;
-}
-
-.status-time-orange {
- background-position: -120px -120px;
-}
-
-.status-time-red {
- background-position: -135px -120px;
-}
-
-.status-time-yellow {
- background-position: 0px -135px;
-}
-
-.status-up-blue {
- background-position: -15px -135px;
-}
-
-.status-up-dark {
- background-position: -30px -135px;
-}
-
-.status-up-green {
- background-position: -45px -135px;
-}
-
-.status-up-red {
- background-position: -60px -135px;
-}
-
-.status-up-white {
- background-position: -75px -135px;
-}
-
-.status-up {
- background-position: -90px -135px;
-}
-
-.status-warning-blue {
- background-position: -105px -135px;
-}
-
-.status-warning-dark {
- background-position: -120px -135px;
-}
-
-.status-warning-green {
- background-position: -135px -135px;
-}
-
-.status-warning-red {
- background-position: 0px -150px;
-}
-
-.status-warning-white {
- background-position: -15px -150px;
-}
-
-.status-warning {
- background-position: -30px -150px;
-}
diff --git a/webroot/rsrc/image/sprite-status-X2.png b/webroot/rsrc/image/sprite-status-X2.png
deleted file mode 100644
index c57de2ef41..0000000000
Binary files a/webroot/rsrc/image/sprite-status-X2.png and /dev/null differ
diff --git a/webroot/rsrc/image/sprite-status.png b/webroot/rsrc/image/sprite-status.png
deleted file mode 100644
index 5c96fd0c51..0000000000
Binary files a/webroot/rsrc/image/sprite-status.png and /dev/null differ
diff --git a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js b/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js
index d8fe6ee0bb..12bd0191a2 100644
--- a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js
+++ b/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js
@@ -1,167 +1,169 @@
/**
* @provides javelin-behavior-differential-dropdown-menus
* @requires javelin-behavior
* javelin-dom
* javelin-util
* javelin-stratcom
* phuix-dropdown-menu
* phuix-action-list-view
* phuix-action-view
* phabricator-phtize
*/
JX.behavior('differential-dropdown-menus', function(config) {
var pht = JX.phtize(config.pht);
function show_more(container) {
var nodes = JX.DOM.scry(container, 'tr', 'context-target');
for (var ii = 0; ii < nodes.length; ii++) {
var show = JX.DOM.scry(nodes[ii], 'a', 'show-more');
for (var jj = 0; jj < show.length; jj++) {
if (JX.Stratcom.getData(show[jj]).type != 'all') {
continue;
}
var event_data = {
context : nodes[ii],
show : show[jj]
};
JX.Stratcom.invoke('differential-reveal-context', null, event_data);
}
}
}
JX.Stratcom.listen(
'click',
'differential-reveal-all',
function(e) {
var containers = JX.DOM.scry(
JX.$('differential-review-stage'),
'div',
'differential-changeset');
for (var i=0; i < containers.length; i++) {
show_more(containers[i]);
}
e.kill();
});
var buildmenu = function(e) {
var button = e.getNode('differential-view-options');
var data = JX.Stratcom.getData(button);
if (data.menu) {
return;
}
e.prevent();
var menu = new JX.PHUIXDropdownMenu(button);
var list = new JX.PHUIXActionListView();
var add_link = function(icon, name, href, local) {
if (!href) {
return;
}
var link = new JX.PHUIXActionView()
.setIcon(icon)
.setName(name)
.setHref(href)
.setHandler(function(e) {
if (local) {
window.location.assign(href);
} else {
window.open(href);
}
menu.close();
e.prevent();
});
list.addItem(link);
return link;
};
var reveal_item = new JX.PHUIXActionView()
- .setIcon('preview');
+ .setIcon('fa-eye');
list.addItem(reveal_item);
var visible_item = new JX.PHUIXActionView()
.setHandler(function(e) {
var diff = JX.DOM.scry(
JX.$(data.containerID),
'table',
'differential-diff');
JX.Stratcom.invoke('differential-toggle-file', null, {diff: diff});
e.prevent();
menu.close();
});
list.addItem(visible_item);
- add_link('file', pht('Browse in Diffusion'), data.diffusionURI);
- add_link('transcript', pht('View Standalone'), data.standaloneURI);
- add_link('arrow_left', pht('Show Raw File (Left)'), data.leftURI);
- add_link('arrow_right', pht('Show Raw File (Right)'), data.rightURI);
- add_link('edit', pht('Open in Editor'), data.editor, true);
- add_link('wrench', pht('Configure Editor'), data.editorConfigure);
+ add_link('fa-files', pht('Browse in Diffusion'), data.diffusionURI);
+ add_link('fa-file-o', pht('View Standalone'), data.standaloneURI);
+ add_link('fa-arrow-left', pht('Show Raw File (Left)'), data.leftURI);
+ add_link('fa-arrow-right', pht('Show Raw File (Right)'), data.rightURI);
+ add_link('fa-pencil', pht('Open in Editor'), data.editor, true);
+ add_link('fa-wrench', pht('Configure Editor'), data.editorConfigure);
menu.setContent(list.getNode());
menu.listen('open', function() {
// When the user opens the menu, check if there are any "Show More"
// links in the changeset body. If there aren't, disable the "Show
// Entire File" menu item since it won't change anything.
var nodes = JX.DOM.scry(JX.$(data.containerID), 'a', 'show-more');
if (nodes.length) {
reveal_item
.setDisabled(false)
.setName(pht('Show Entire File'))
+ .setIcon('fa-file-o')
.setHandler(function(e) {
show_more(JX.$(data.containerID));
e.prevent();
menu.close();
});
} else {
reveal_item
.setDisabled(true)
+ .setIcon('fa-file')
.setName(pht('Entire File Shown'))
.setHandler(function(e) { e.prevent(); });
}
visible_item.setDisabled(true);
visible_item.setName(pht("Can't Toggle Unloaded File"));
var diffs = JX.DOM.scry(
JX.$(data.containerID),
'table',
'differential-diff');
if (diffs.length > 1) {
JX.$E(
'More than one node with sigil "differential-diff" was found in "'+
data.containerID+'."');
} else if (diffs.length == 1) {
diff = diffs[0];
visible_item.setDisabled(false);
if (JX.Stratcom.getData(diff).hidden) {
visible_item
.setName(pht('Expand File'))
- .setIcon('unmerge');
+ .setIcon('fa-expand');
} else {
visible_item
.setName(pht('Collapse File'))
- .setIcon('merge');
+ .setIcon('fa-compress');
}
} else {
// Do nothing when there is no diff shown in the table. For example,
// the file is binary.
}
});
data.menu = menu;
menu.open();
};
JX.Stratcom.listen('click', 'differential-view-options', buildmenu);
});
diff --git a/webroot/rsrc/js/application/policy/behavior-policy-control.js b/webroot/rsrc/js/application/policy/behavior-policy-control.js
index a1c0409df8..e5e0fa4b60 100644
--- a/webroot/rsrc/js/application/policy/behavior-policy-control.js
+++ b/webroot/rsrc/js/application/policy/behavior-policy-control.js
@@ -1,129 +1,129 @@
/**
* @provides javelin-behavior-policy-control
* @requires javelin-behavior
* javelin-dom
* javelin-util
* phuix-dropdown-menu
* phuix-action-list-view
* phuix-action-view
* javelin-workflow
* @javelin
*/
JX.behavior('policy-control', function(config) {
var control = JX.$(config.controlID);
var input = JX.$(config.inputID);
var value = config.value;
var menu = new JX.PHUIXDropdownMenu(control)
.setWidth(260)
.setAlign('left');
menu.listen('open', function() {
var list = new JX.PHUIXActionListView();
for (var ii = 0; ii < config.groups.length; ii++) {
var group = config.groups[ii];
list.addItem(
new JX.PHUIXActionView()
.setName(config.labels[group])
.setDisabled(true));
for (var jj = 0; jj < config.order[group].length; jj++) {
var phid = config.order[group][jj];
var onselect;
if (group == 'custom') {
onselect = JX.bind(null, function(phid) {
var uri = get_custom_uri(phid);
new JX.Workflow(uri)
.setHandler(function(response) {
if (!response.phid) {
return;
}
replace_policy(phid, response.phid, response.info);
select_policy(response.phid);
})
.start();
}, phid);
} else {
onselect = JX.bind(null, select_policy, phid);
}
var option = config.options[phid];
var item = new JX.PHUIXActionView()
.setName(option.name)
- .setIcon(option.icon, 'status')
+ .setIcon(option.icon + ' bluegrey')
.setHandler(JX.bind(null, function(fn, e) {
e.prevent();
menu.close();
fn();
}, onselect));
if (phid == value) {
item.setSelected(true);
}
list.addItem(item);
}
}
menu.setContent(list.getNode());
});
var select_policy = function(phid) {
JX.DOM.setContent(
JX.DOM.find(control, 'span', 'policy-label'),
render_option(phid));
input.value = phid;
value = phid;
};
var render_option = function(phid, with_title) {
var option = config.options[phid];
var name = option.name;
if (with_title && (option.full != option.name)) {
name = JX.$N('span', {title: option.full}, name);
}
return [JX.$H(config.icons[option.icon]), name];
};
/**
* Get the workflow URI to create or edit a policy with a given PHID.
*/
var get_custom_uri = function(phid) {
var uri = '/policy/edit/';
if (phid != config.customPlaceholder) {
uri += phid + '/';
}
return uri;
};
/**
* Replace an existing policy option with a new one. Used to swap out custom
* policies after the user edits them.
*/
var replace_policy = function(old_phid, new_phid, info) {
config.options[new_phid] = info;
for (var k in config.order) {
for (var ii = 0; ii < config.order[k].length; ii++) {
if (config.order[k][ii] == old_phid) {
config.order[k][ii] = new_phid;
return;
}
}
}
};
});
diff --git a/webroot/rsrc/js/core/Prefab.js b/webroot/rsrc/js/core/Prefab.js
index 5f8142ce45..f4e0bead01 100644
--- a/webroot/rsrc/js/core/Prefab.js
+++ b/webroot/rsrc/js/core/Prefab.js
@@ -1,269 +1,269 @@
/**
* @provides phabricator-prefab
* @requires javelin-install
* javelin-util
* javelin-dom
* javelin-typeahead
* javelin-tokenizer
* javelin-typeahead-preloaded-source
* javelin-typeahead-ondemand-source
* javelin-dom
* javelin-stratcom
* javelin-util
* @javelin
*/
/**
* Utilities for client-side rendering (the greatest thing in the world).
*/
JX.install('Prefab', {
statics : {
renderSelect : function(map, selected, attrs) {
var select = JX.$N('select', attrs || {});
for (var k in map) {
select.options[select.options.length] = new Option(map[k], k);
if (k == selected) {
select.value = k;
}
}
select.value = select.value || JX.keys(map)[0];
return select;
},
/**
* Build a Phabricator tokenizer out of a configuration with application
* sorting, datasource and placeholder rules.
*
* - `id` Root tokenizer ID (alternatively, pass `root`).
* - `root` Root tokenizer node (replaces `id`).
* - `src` Datasource URI.
* - `ondemand` Optional, use an ondemand source.
* - `value` Optional, initial value.
* - `limit` Optional, token limit.
* - `placeholder` Optional, placeholder text.
* - `username` Optional, username to sort first (i.e., viewer).
* - `icons` Optional, map of icons.
*
*/
buildTokenizer : function(config) {
config.icons = config.icons || {};
var root;
try {
root = config.root || JX.$(config.id);
} catch (ex) {
// If the root element does not exist, just return without building
// anything. This happens in some cases -- like Conpherence -- where we
// may load a tokenizer but not put it in the document.
return;
}
var datasource;
// Default to an ondemand source if no alternate configuration is
// provided.
var ondemand = true;
if ('ondemand' in config) {
ondemand = config.ondemand;
}
if (ondemand) {
datasource = new JX.TypeaheadOnDemandSource(config.src);
} else {
datasource = new JX.TypeaheadPreloadedSource(config.src);
}
// Sort results so that the viewing user always comes up first; after
// that, prefer unixname matches to realname matches.
var sort_handler = function(value, list, cmp) {
var priority_hits = {};
var self_hits = {};
var tokens = this.tokenize(value);
for (var ii = 0; ii < list.length; ii++) {
var item = list[ii];
if (!item.priority) {
continue;
}
if (config.username && item.priority == config.username) {
self_hits[item.id] = true;
}
for (var jj = 0; jj < tokens.length; jj++) {
if (item.priority.substr(0, tokens[jj].length) == tokens[jj]) {
priority_hits[item.id] = true;
}
}
}
list.sort(function(u, v) {
if (self_hits[u.id] != self_hits[v.id]) {
return self_hits[v.id] ? 1 : -1;
}
// If one result is open and one is closed, show the open result
// first. The "!" tricks here are becaused closed values are display
// strings, so the value is either `null` or some truthy string. If
// we compare the values directly, we'll apply this rule to two
// objects which are both closed but for different reasons, like
// "Archived" and "Disabled".
var u_open = !u.closed;
var v_open = !v.closed;
if (u_open != v_open) {
if (u_open) {
return -1;
} else {
return 1;
}
}
if (priority_hits[u.id] != priority_hits[v.id]) {
return priority_hits[v.id] ? 1 : -1;
}
// Sort users ahead of other result types.
if (u.priorityType != v.priorityType) {
if (u.priorityType == 'user') {
return -1;
}
if (v.priorityType == 'user') {
return 1;
}
}
return cmp(u, v);
});
};
var render_icon = function(icon) {
return JX.$N(
'span',
- {className: 'phui-icon-view sprite-status status-' + icon});
+ {className: 'phui-icon-view phui-font-fa ' + icon});
};
datasource.setSortHandler(JX.bind(datasource, sort_handler));
// Don't show any closed objects until the query is specific enough that
// it only selects closed objects. Specifically, if the result list had
// any open objects, remove all the closed objects from the list.
var filter_handler = function(value, list) {
// Look for any open result.
var has_open = false;
var ii;
for (ii = 0; ii < list.length; ii++) {
if (!list[ii].closed) {
has_open = true;
break;
}
}
if (!has_open) {
// Everything is closed, so just use it as-is.
return list;
}
// Otherwise, only display the open results.
var results = [];
for (ii = 0; ii < list.length; ii++) {
if (!list[ii].closed) {
results.push(list[ii]);
}
}
return results;
};
datasource.setFilterHandler(filter_handler);
datasource.setTransformer(
function(object) {
var closed = object[9];
var closed_ui;
if (closed) {
closed_ui = JX.$N(
'div',
{className: 'tokenizer-closed'},
closed);
}
var icon = object[8];
var icon_ui;
if (icon) {
icon_ui = render_icon(icon);
}
var display = JX.$N(
'div',
{className: 'tokenizer-result'},
[icon_ui, object[0], closed_ui]);
if (closed) {
JX.DOM.alterClass(display, 'tokenizer-result-closed', true);
}
return {
name: object[0],
display: display,
uri: object[1],
id: object[2],
priority: object[3],
priorityType: object[7],
icon: icon,
closed: closed
};
});
var typeahead = new JX.Typeahead(
root,
JX.DOM.find(root, 'input', 'tokenizer-input'));
typeahead.setDatasource(datasource);
var tokenizer = new JX.Tokenizer(root);
tokenizer.setTypeahead(typeahead);
tokenizer.setRenderTokenCallback(function(value, key) {
var icon = datasource.getResult(key);
if (icon) {
icon = icon.icon;
} else {
icon = config.icons[key];
}
if (!icon) {
return value;
}
icon = render_icon(icon);
// TODO: Maybe we should render these closed tags in grey? Figure out
// how we're going to use color.
return [icon, value];
});
if (config.placeholder) {
tokenizer.setPlaceholder(config.placeholder);
}
if (config.limit) {
tokenizer.setLimit(config.limit);
}
if (config.value) {
tokenizer.setInitialValue(config.value);
}
JX.Stratcom.addData(root, {'tokenizer' : tokenizer});
return {
tokenizer: tokenizer
};
}
}
});
diff --git a/webroot/rsrc/js/phuix/PHUIXActionView.js b/webroot/rsrc/js/phuix/PHUIXActionView.js
index 08ca975404..6fe82c059c 100644
--- a/webroot/rsrc/js/phuix/PHUIXActionView.js
+++ b/webroot/rsrc/js/phuix/PHUIXActionView.js
@@ -1,151 +1,149 @@
/**
* @provides phuix-action-view
* @requires javelin-install
* javelin-dom
* javelin-util
* @javelin
*/
JX.install('PHUIXActionView', {
members: {
_node: null,
_name: null,
_icon: 'none',
- _iconSheet: 'icons',
_disabled: false,
_handler: null,
_selected: false,
_iconNode: null,
_nameNode: null,
setDisabled: function(disabled) {
this._disabled = disabled;
JX.DOM.alterClass(
this.getNode(),
'phabricator-action-view-disabled',
disabled);
this._buildIconNode(true);
return this;
},
setSelected: function(selected) {
this._selected = selected;
JX.DOM.alterClass(
this.getNode(),
'phabricator-action-view-selected',
selected);
return this;
},
setName: function(name) {
this._name = name;
this._buildNameNode(true);
return this;
},
setHandler: function(handler) {
this._handler = handler;
this._buildNameNode(true);
return this;
},
- setIcon: function(icon, sheet) {
+ setIcon: function(icon) {
this._icon = icon;
- this._iconSheet = sheet || this._iconSheet;
this._buildIconNode(true);
return this;
},
setHref: function(href) {
this._href = href;
this._buildNameNode(true);
return this;
},
getNode: function() {
if (!this._node) {
var attr = {
className: 'phabricator-action-view'
};
var content = [
this._buildIconNode(),
this._buildNameNode()
];
this._node = JX.$N('li', attr, content);
}
return this._node;
},
_buildIconNode: function(dirty) {
if (!this._iconNode || dirty) {
var attr = {
className: [
'phui-icon-view',
'phabricator-action-view-icon',
- 'sprite-' + this._iconSheet
+ 'phui-font-fa'
].join(' ')
};
var node = JX.$N('span', attr);
- var icon_class = this._iconSheet + '-' + this._icon;
+ var icon_class = this._icon;
if (this._disabled) {
- icon_class = icon_class + '-grey';
+ icon_class = icon_class + ' grey';
}
JX.DOM.alterClass(node, icon_class, true);
if (this._iconNode && this._iconNode.parentNode) {
JX.DOM.replace(this._iconNode, node);
}
this._iconNode = node;
}
return this._iconNode;
},
_buildNameNode: function(dirty) {
if (!this._nameNode || dirty) {
var attr = {
className: 'phabricator-action-view-item'
};
var href = this._href;
if (!href && this._handler) {
href = '#';
}
if (href) {
attr.href = href;
}
var tag = href ? 'a' : 'span';
var node = JX.$N(tag, attr, this._name);
JX.DOM.listen(node, 'click', null, JX.bind(this, this._onclick));
if (this._nameNode && this._nameNode.parentNode) {
JX.DOM.replace(this._nameNode, node);
}
this._nameNode = node;
}
return this._nameNode;
},
_onclick: function(e) {
if (this._handler) {
this._handler(e);
}
}
}
});
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Wed, Nov 5, 7:41 PM (1 d, 7 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
321229
Default Alt Text
(427 KB)
Attached To
Mode
R1 hydra
Attached
Detach File
Event Timeline
Log In to Comment