mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-02 03:32:42 +01:00
(stable) Promote 2015 Week 48
This commit is contained in:
commit
c7613043f5
85 changed files with 1733 additions and 382 deletions
|
@ -7,7 +7,7 @@
|
||||||
*/
|
*/
|
||||||
return array(
|
return array(
|
||||||
'names' => array(
|
'names' => array(
|
||||||
'core.pkg.css' => 'e4f1ea81',
|
'core.pkg.css' => '91bbffc2',
|
||||||
'core.pkg.js' => '47dc9ebb',
|
'core.pkg.js' => '47dc9ebb',
|
||||||
'darkconsole.pkg.js' => 'e7393ebb',
|
'darkconsole.pkg.js' => 'e7393ebb',
|
||||||
'differential.pkg.css' => '2de124c9',
|
'differential.pkg.css' => '2de124c9',
|
||||||
|
@ -104,13 +104,13 @@ return array(
|
||||||
'rsrc/css/application/tokens/tokens.css' => '3d0f239e',
|
'rsrc/css/application/tokens/tokens.css' => '3d0f239e',
|
||||||
'rsrc/css/application/uiexample/example.css' => '528b19de',
|
'rsrc/css/application/uiexample/example.css' => '528b19de',
|
||||||
'rsrc/css/core/core.css' => '78e8d7ea',
|
'rsrc/css/core/core.css' => '78e8d7ea',
|
||||||
'rsrc/css/core/remarkup.css' => '2193fc05',
|
'rsrc/css/core/remarkup.css' => '88e1ebb6',
|
||||||
'rsrc/css/core/syntax.css' => '9fd11da8',
|
'rsrc/css/core/syntax.css' => '9fd11da8',
|
||||||
'rsrc/css/core/z-index.css' => '57ddcaa2',
|
'rsrc/css/core/z-index.css' => '57ddcaa2',
|
||||||
'rsrc/css/diviner/diviner-shared.css' => 'aa3656aa',
|
'rsrc/css/diviner/diviner-shared.css' => 'aa3656aa',
|
||||||
'rsrc/css/font/font-aleo.css' => 'b61d3062',
|
'rsrc/css/font/font-aleo.css' => '8bdb2835',
|
||||||
'rsrc/css/font/font-awesome.css' => 'd2fc4e8d',
|
'rsrc/css/font/font-awesome.css' => 'c43323c5',
|
||||||
'rsrc/css/font/font-lato.css' => '5ab1a46a',
|
'rsrc/css/font/font-lato.css' => 'c7ccd872',
|
||||||
'rsrc/css/font/phui-font-icon-base.css' => 'ecbbb4c2',
|
'rsrc/css/font/phui-font-icon-base.css' => 'ecbbb4c2',
|
||||||
'rsrc/css/layout/phabricator-filetree-view.css' => 'fccf9f82',
|
'rsrc/css/layout/phabricator-filetree-view.css' => 'fccf9f82',
|
||||||
'rsrc/css/layout/phabricator-hovercard-view.css' => '1239cd52',
|
'rsrc/css/layout/phabricator-hovercard-view.css' => '1239cd52',
|
||||||
|
@ -126,11 +126,11 @@ return array(
|
||||||
'rsrc/css/phui/phui-box.css' => 'a5bb366d',
|
'rsrc/css/phui/phui-box.css' => 'a5bb366d',
|
||||||
'rsrc/css/phui/phui-button.css' => '16020a60',
|
'rsrc/css/phui/phui-button.css' => '16020a60',
|
||||||
'rsrc/css/phui/phui-crumbs-view.css' => '414406b5',
|
'rsrc/css/phui/phui-crumbs-view.css' => '414406b5',
|
||||||
'rsrc/css/phui/phui-document-pro.css' => '7f3009ce',
|
'rsrc/css/phui/phui-document-pro.css' => '5f75ed99',
|
||||||
'rsrc/css/phui/phui-document.css' => 'f841ad0a',
|
'rsrc/css/phui/phui-document.css' => 'a4a1c3b9',
|
||||||
'rsrc/css/phui/phui-feed-story.css' => 'b7b26d23',
|
'rsrc/css/phui/phui-feed-story.css' => 'b7b26d23',
|
||||||
'rsrc/css/phui/phui-fontkit.css' => 'c9d63950',
|
'rsrc/css/phui/phui-fontkit.css' => '9cda225e',
|
||||||
'rsrc/css/phui/phui-form-view.css' => '621b21c5',
|
'rsrc/css/phui/phui-form-view.css' => 'c1d2ef29',
|
||||||
'rsrc/css/phui/phui-form.css' => 'afdb2c6e',
|
'rsrc/css/phui/phui-form.css' => 'afdb2c6e',
|
||||||
'rsrc/css/phui/phui-header-view.css' => '55bb32dd',
|
'rsrc/css/phui/phui-header-view.css' => '55bb32dd',
|
||||||
'rsrc/css/phui/phui-icon.css' => 'b0a6b1b6',
|
'rsrc/css/phui/phui-icon.css' => 'b0a6b1b6',
|
||||||
|
@ -143,7 +143,7 @@ return array(
|
||||||
'rsrc/css/phui/phui-pager.css' => 'bea33d23',
|
'rsrc/css/phui/phui-pager.css' => 'bea33d23',
|
||||||
'rsrc/css/phui/phui-pinboard-view.css' => '2495140e',
|
'rsrc/css/phui/phui-pinboard-view.css' => '2495140e',
|
||||||
'rsrc/css/phui/phui-property-list-view.css' => '27b2849e',
|
'rsrc/css/phui/phui-property-list-view.css' => '27b2849e',
|
||||||
'rsrc/css/phui/phui-remarkup-preview.css' => '867f85b3',
|
'rsrc/css/phui/phui-remarkup-preview.css' => '1a8f2591',
|
||||||
'rsrc/css/phui/phui-spacing.css' => '042804d6',
|
'rsrc/css/phui/phui-spacing.css' => '042804d6',
|
||||||
'rsrc/css/phui/phui-status.css' => '888cedb8',
|
'rsrc/css/phui/phui-status.css' => '888cedb8',
|
||||||
'rsrc/css/phui/phui-tag-view.css' => 'e60e227b',
|
'rsrc/css/phui/phui-tag-view.css' => 'e60e227b',
|
||||||
|
@ -158,30 +158,36 @@ return array(
|
||||||
'rsrc/css/sprite-projects.css' => 'e5ad842a',
|
'rsrc/css/sprite-projects.css' => 'e5ad842a',
|
||||||
'rsrc/css/sprite-tokens.css' => '4f399012',
|
'rsrc/css/sprite-tokens.css' => '4f399012',
|
||||||
'rsrc/externals/font/aleo/aleo-bold.eot' => 'd3d3bed7',
|
'rsrc/externals/font/aleo/aleo-bold.eot' => 'd3d3bed7',
|
||||||
|
'rsrc/externals/font/aleo/aleo-bold.svg' => '45899c8e',
|
||||||
'rsrc/externals/font/aleo/aleo-bold.ttf' => '4b08bef0',
|
'rsrc/externals/font/aleo/aleo-bold.ttf' => '4b08bef0',
|
||||||
'rsrc/externals/font/aleo/aleo-bold.woff' => '93b513a1',
|
'rsrc/externals/font/aleo/aleo-bold.woff' => '93b513a1',
|
||||||
'rsrc/externals/font/aleo/aleo-bold.woff2' => '75fbf322',
|
'rsrc/externals/font/aleo/aleo-bold.woff2' => '75fbf322',
|
||||||
'rsrc/externals/font/aleo/aleo-regular.eot' => 'a4e29e2f',
|
'rsrc/externals/font/aleo/aleo-regular.eot' => 'a4e29e2f',
|
||||||
|
'rsrc/externals/font/aleo/aleo-regular.svg' => '42a86f7a',
|
||||||
'rsrc/externals/font/aleo/aleo-regular.ttf' => '751e7479',
|
'rsrc/externals/font/aleo/aleo-regular.ttf' => '751e7479',
|
||||||
'rsrc/externals/font/aleo/aleo-regular.woff' => 'c3744be9',
|
'rsrc/externals/font/aleo/aleo-regular.woff' => 'c3744be9',
|
||||||
'rsrc/externals/font/aleo/aleo-regular.woff2' => '851aa0ee',
|
'rsrc/externals/font/aleo/aleo-regular.woff2' => '851aa0ee',
|
||||||
'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => '7d5a4653',
|
'rsrc/externals/font/fontawesome/fontawesome-webfont.eot' => '346fbcc5',
|
||||||
'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => '531835e8',
|
'rsrc/externals/font/fontawesome/fontawesome-webfont.ttf' => '510fccb2',
|
||||||
'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => '427fe363',
|
'rsrc/externals/font/fontawesome/fontawesome-webfont.woff' => '0334f580',
|
||||||
'rsrc/externals/font/fontawesome/fontawesome-webfont.woff2' => 'a9897054',
|
'rsrc/externals/font/fontawesome/fontawesome-webfont.woff2' => '45dca585',
|
||||||
'rsrc/externals/font/lato/lato-bold.eot' => '99fbcf8c',
|
'rsrc/externals/font/lato/lato-bold.eot' => '99fbcf8c',
|
||||||
|
'rsrc/externals/font/lato/lato-bold.svg' => '2aa83045',
|
||||||
'rsrc/externals/font/lato/lato-bold.ttf' => '0a7141f7',
|
'rsrc/externals/font/lato/lato-bold.ttf' => '0a7141f7',
|
||||||
'rsrc/externals/font/lato/lato-bold.woff' => 'f5db2061',
|
'rsrc/externals/font/lato/lato-bold.woff' => 'f5db2061',
|
||||||
'rsrc/externals/font/lato/lato-bold.woff2' => '37a94ecd',
|
'rsrc/externals/font/lato/lato-bold.woff2' => '37a94ecd',
|
||||||
'rsrc/externals/font/lato/lato-bolditalic.eot' => 'b93389d0',
|
'rsrc/externals/font/lato/lato-bolditalic.eot' => 'b93389d0',
|
||||||
|
'rsrc/externals/font/lato/lato-bolditalic.svg' => '5442e1ef',
|
||||||
'rsrc/externals/font/lato/lato-bolditalic.ttf' => 'dad31252',
|
'rsrc/externals/font/lato/lato-bolditalic.ttf' => 'dad31252',
|
||||||
'rsrc/externals/font/lato/lato-bolditalic.woff' => 'e53bcf47',
|
'rsrc/externals/font/lato/lato-bolditalic.woff' => 'e53bcf47',
|
||||||
'rsrc/externals/font/lato/lato-bolditalic.woff2' => 'd035007f',
|
'rsrc/externals/font/lato/lato-bolditalic.woff2' => 'd035007f',
|
||||||
'rsrc/externals/font/lato/lato-italic.eot' => '6a903f5d',
|
'rsrc/externals/font/lato/lato-italic.eot' => '6a903f5d',
|
||||||
|
'rsrc/externals/font/lato/lato-italic.svg' => '0dc7cf2f',
|
||||||
'rsrc/externals/font/lato/lato-italic.ttf' => '629f64f0',
|
'rsrc/externals/font/lato/lato-italic.ttf' => '629f64f0',
|
||||||
'rsrc/externals/font/lato/lato-italic.woff' => '678dc4bb',
|
'rsrc/externals/font/lato/lato-italic.woff' => '678dc4bb',
|
||||||
'rsrc/externals/font/lato/lato-italic.woff2' => '7c8dd650',
|
'rsrc/externals/font/lato/lato-italic.woff2' => '7c8dd650',
|
||||||
'rsrc/externals/font/lato/lato-regular.eot' => '848dfb1e',
|
'rsrc/externals/font/lato/lato-regular.eot' => '848dfb1e',
|
||||||
|
'rsrc/externals/font/lato/lato-regular.svg' => 'cbd5fd6b',
|
||||||
'rsrc/externals/font/lato/lato-regular.ttf' => 'e270165b',
|
'rsrc/externals/font/lato/lato-regular.ttf' => 'e270165b',
|
||||||
'rsrc/externals/font/lato/lato-regular.woff' => '13d39fe2',
|
'rsrc/externals/font/lato/lato-regular.woff' => '13d39fe2',
|
||||||
'rsrc/externals/font/lato/lato-regular.woff2' => '57a9f742',
|
'rsrc/externals/font/lato/lato-regular.woff2' => '57a9f742',
|
||||||
|
@ -255,6 +261,7 @@ return array(
|
||||||
'rsrc/favicons/favicon-16x16.png' => 'ee2523ac',
|
'rsrc/favicons/favicon-16x16.png' => 'ee2523ac',
|
||||||
'rsrc/favicons/favicon-32x32.png' => 'b6a8150e',
|
'rsrc/favicons/favicon-32x32.png' => 'b6a8150e',
|
||||||
'rsrc/favicons/favicon-96x96.png' => '8f7ea177',
|
'rsrc/favicons/favicon-96x96.png' => '8f7ea177',
|
||||||
|
'rsrc/favicons/mask-icon.svg' => '0460cb1f',
|
||||||
'rsrc/image/BFCFDA.png' => 'd5ec91f4',
|
'rsrc/image/BFCFDA.png' => 'd5ec91f4',
|
||||||
'rsrc/image/actions/edit.png' => '2fc41442',
|
'rsrc/image/actions/edit.png' => '2fc41442',
|
||||||
'rsrc/image/avatar.png' => '3eb28cd9',
|
'rsrc/image/avatar.png' => '3eb28cd9',
|
||||||
|
@ -395,7 +402,7 @@ return array(
|
||||||
'rsrc/js/application/owners/OwnersPathEditor.js' => 'aa1733d0',
|
'rsrc/js/application/owners/OwnersPathEditor.js' => 'aa1733d0',
|
||||||
'rsrc/js/application/owners/owners-path-editor.js' => '7a68dda3',
|
'rsrc/js/application/owners/owners-path-editor.js' => '7a68dda3',
|
||||||
'rsrc/js/application/passphrase/passphrase-credential-control.js' => '3cb0b2fc',
|
'rsrc/js/application/passphrase/passphrase-credential-control.js' => '3cb0b2fc',
|
||||||
'rsrc/js/application/phame/phame-post-preview.js' => 'be807912',
|
'rsrc/js/application/phame/phame-post-preview.js' => 'd6bba572',
|
||||||
'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '246dc085',
|
'rsrc/js/application/pholio/behavior-pholio-mock-edit.js' => '246dc085',
|
||||||
'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => 'fbe497e7',
|
'rsrc/js/application/pholio/behavior-pholio-mock-view.js' => 'fbe497e7',
|
||||||
'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '3f5d6dbf',
|
'rsrc/js/application/phortune/behavior-stripe-payment-form.js' => '3f5d6dbf',
|
||||||
|
@ -412,6 +419,7 @@ return array(
|
||||||
'rsrc/js/application/repository/repository-crossreference.js' => 'e5339c43',
|
'rsrc/js/application/repository/repository-crossreference.js' => 'e5339c43',
|
||||||
'rsrc/js/application/search/behavior-reorder-queries.js' => 'e9581f08',
|
'rsrc/js/application/search/behavior-reorder-queries.js' => 'e9581f08',
|
||||||
'rsrc/js/application/slowvote/behavior-slowvote-embed.js' => '887ad43f',
|
'rsrc/js/application/slowvote/behavior-slowvote-embed.js' => '887ad43f',
|
||||||
|
'rsrc/js/application/transactions/behavior-reorder-fields.js' => 'b59e1e96',
|
||||||
'rsrc/js/application/transactions/behavior-show-older-transactions.js' => 'dbbf48b6',
|
'rsrc/js/application/transactions/behavior-show-older-transactions.js' => 'dbbf48b6',
|
||||||
'rsrc/js/application/transactions/behavior-transaction-comment-form.js' => 'b23b49e6',
|
'rsrc/js/application/transactions/behavior-transaction-comment-form.js' => 'b23b49e6',
|
||||||
'rsrc/js/application/transactions/behavior-transaction-list.js' => '13c739ea',
|
'rsrc/js/application/transactions/behavior-transaction-list.js' => '13c739ea',
|
||||||
|
@ -529,9 +537,9 @@ return array(
|
||||||
'diffusion-readme-css' => '2106ea08',
|
'diffusion-readme-css' => '2106ea08',
|
||||||
'diffusion-source-css' => '075ba788',
|
'diffusion-source-css' => '075ba788',
|
||||||
'diviner-shared-css' => 'aa3656aa',
|
'diviner-shared-css' => 'aa3656aa',
|
||||||
'font-aleo' => 'b61d3062',
|
'font-aleo' => '8bdb2835',
|
||||||
'font-fontawesome' => 'd2fc4e8d',
|
'font-fontawesome' => 'c43323c5',
|
||||||
'font-lato' => '5ab1a46a',
|
'font-lato' => 'c7ccd872',
|
||||||
'global-drag-and-drop-css' => '697324ad',
|
'global-drag-and-drop-css' => '697324ad',
|
||||||
'harbormaster-css' => 'b0758ca5',
|
'harbormaster-css' => 'b0758ca5',
|
||||||
'herald-css' => '826075fa',
|
'herald-css' => '826075fa',
|
||||||
|
@ -584,6 +592,7 @@ return array(
|
||||||
'javelin-behavior-doorkeeper-tag' => 'e5822781',
|
'javelin-behavior-doorkeeper-tag' => 'e5822781',
|
||||||
'javelin-behavior-drydock-live-operation-status' => '901935ef',
|
'javelin-behavior-drydock-live-operation-status' => '901935ef',
|
||||||
'javelin-behavior-durable-column' => 'c72aa091',
|
'javelin-behavior-durable-column' => 'c72aa091',
|
||||||
|
'javelin-behavior-editengine-reorder-fields' => 'b59e1e96',
|
||||||
'javelin-behavior-error-log' => '6882e80a',
|
'javelin-behavior-error-log' => '6882e80a',
|
||||||
'javelin-behavior-event-all-day' => '38dcf3c8',
|
'javelin-behavior-event-all-day' => '38dcf3c8',
|
||||||
'javelin-behavior-fancy-datepicker' => '8ae55229',
|
'javelin-behavior-fancy-datepicker' => '8ae55229',
|
||||||
|
@ -628,7 +637,7 @@ return array(
|
||||||
'javelin-behavior-phabricator-transaction-comment-form' => 'b23b49e6',
|
'javelin-behavior-phabricator-transaction-comment-form' => 'b23b49e6',
|
||||||
'javelin-behavior-phabricator-transaction-list' => '13c739ea',
|
'javelin-behavior-phabricator-transaction-list' => '13c739ea',
|
||||||
'javelin-behavior-phabricator-watch-anchor' => '9f36c42d',
|
'javelin-behavior-phabricator-watch-anchor' => '9f36c42d',
|
||||||
'javelin-behavior-phame-post-preview' => 'be807912',
|
'javelin-behavior-phame-post-preview' => 'd6bba572',
|
||||||
'javelin-behavior-pholio-mock-edit' => '246dc085',
|
'javelin-behavior-pholio-mock-edit' => '246dc085',
|
||||||
'javelin-behavior-pholio-mock-view' => 'fbe497e7',
|
'javelin-behavior-pholio-mock-view' => 'fbe497e7',
|
||||||
'javelin-behavior-phui-dropdown-menu' => '54733475',
|
'javelin-behavior-phui-dropdown-menu' => '54733475',
|
||||||
|
@ -740,7 +749,7 @@ return array(
|
||||||
'phabricator-object-selector-css' => '85ee8ce6',
|
'phabricator-object-selector-css' => '85ee8ce6',
|
||||||
'phabricator-phtize' => 'd254d646',
|
'phabricator-phtize' => 'd254d646',
|
||||||
'phabricator-prefab' => '6920d200',
|
'phabricator-prefab' => '6920d200',
|
||||||
'phabricator-remarkup-css' => '2193fc05',
|
'phabricator-remarkup-css' => '88e1ebb6',
|
||||||
'phabricator-search-results-css' => '7dea472c',
|
'phabricator-search-results-css' => '7dea472c',
|
||||||
'phabricator-shaped-request' => '7cbe244b',
|
'phabricator-shaped-request' => '7cbe244b',
|
||||||
'phabricator-side-menu-view-css' => 'bec2458e',
|
'phabricator-side-menu-view-css' => 'bec2458e',
|
||||||
|
@ -780,13 +789,13 @@ return array(
|
||||||
'phui-calendar-list-css' => 'c1c7f338',
|
'phui-calendar-list-css' => 'c1c7f338',
|
||||||
'phui-calendar-month-css' => '476be7e0',
|
'phui-calendar-month-css' => '476be7e0',
|
||||||
'phui-crumbs-view-css' => '414406b5',
|
'phui-crumbs-view-css' => '414406b5',
|
||||||
'phui-document-view-css' => 'f841ad0a',
|
'phui-document-view-css' => 'a4a1c3b9',
|
||||||
'phui-document-view-pro-css' => '7f3009ce',
|
'phui-document-view-pro-css' => '5f75ed99',
|
||||||
'phui-feed-story-css' => 'b7b26d23',
|
'phui-feed-story-css' => 'b7b26d23',
|
||||||
'phui-font-icon-base-css' => 'ecbbb4c2',
|
'phui-font-icon-base-css' => 'ecbbb4c2',
|
||||||
'phui-fontkit-css' => 'c9d63950',
|
'phui-fontkit-css' => '9cda225e',
|
||||||
'phui-form-css' => 'afdb2c6e',
|
'phui-form-css' => 'afdb2c6e',
|
||||||
'phui-form-view-css' => '621b21c5',
|
'phui-form-view-css' => 'c1d2ef29',
|
||||||
'phui-header-view-css' => '55bb32dd',
|
'phui-header-view-css' => '55bb32dd',
|
||||||
'phui-icon-view-css' => 'b0a6b1b6',
|
'phui-icon-view-css' => 'b0a6b1b6',
|
||||||
'phui-image-mask-css' => '5a8b09c8',
|
'phui-image-mask-css' => '5a8b09c8',
|
||||||
|
@ -799,7 +808,7 @@ return array(
|
||||||
'phui-pager-css' => 'bea33d23',
|
'phui-pager-css' => 'bea33d23',
|
||||||
'phui-pinboard-view-css' => '2495140e',
|
'phui-pinboard-view-css' => '2495140e',
|
||||||
'phui-property-list-view-css' => '27b2849e',
|
'phui-property-list-view-css' => '27b2849e',
|
||||||
'phui-remarkup-preview-css' => '867f85b3',
|
'phui-remarkup-preview-css' => '1a8f2591',
|
||||||
'phui-spacing-css' => '042804d6',
|
'phui-spacing-css' => '042804d6',
|
||||||
'phui-status-list-view-css' => '888cedb8',
|
'phui-status-list-view-css' => '888cedb8',
|
||||||
'phui-tag-view-css' => 'e60e227b',
|
'phui-tag-view-css' => 'e60e227b',
|
||||||
|
@ -1206,9 +1215,6 @@ return array(
|
||||||
'javelin-vector',
|
'javelin-vector',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
),
|
),
|
||||||
'5ab1a46a' => array(
|
|
||||||
'phui-fontkit-css',
|
|
||||||
),
|
|
||||||
'5b2e3e2b' => array(
|
'5b2e3e2b' => array(
|
||||||
'javelin-stratcom',
|
'javelin-stratcom',
|
||||||
'javelin-request',
|
'javelin-request',
|
||||||
|
@ -1506,6 +1512,9 @@ return array(
|
||||||
'javelin-request',
|
'javelin-request',
|
||||||
'javelin-typeahead-source',
|
'javelin-typeahead-source',
|
||||||
),
|
),
|
||||||
|
'8bdb2835' => array(
|
||||||
|
'phui-fontkit-css',
|
||||||
|
),
|
||||||
'8ce821c5' => array(
|
'8ce821c5' => array(
|
||||||
'phabricator-notification',
|
'phabricator-notification',
|
||||||
'javelin-stratcom',
|
'javelin-stratcom',
|
||||||
|
@ -1707,6 +1716,13 @@ return array(
|
||||||
'javelin-typeahead-preloaded-source',
|
'javelin-typeahead-preloaded-source',
|
||||||
'javelin-util',
|
'javelin-util',
|
||||||
),
|
),
|
||||||
|
'b59e1e96' => array(
|
||||||
|
'javelin-behavior',
|
||||||
|
'javelin-stratcom',
|
||||||
|
'javelin-workflow',
|
||||||
|
'javelin-dom',
|
||||||
|
'phabricator-draggable-list',
|
||||||
|
),
|
||||||
'b5c256b8' => array(
|
'b5c256b8' => array(
|
||||||
'javelin-install',
|
'javelin-install',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
|
@ -1717,9 +1733,6 @@ return array(
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
'javelin-util',
|
'javelin-util',
|
||||||
),
|
),
|
||||||
'b61d3062' => array(
|
|
||||||
'phui-fontkit-css',
|
|
||||||
),
|
|
||||||
'b6993408' => array(
|
'b6993408' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-stratcom',
|
'javelin-stratcom',
|
||||||
|
@ -1752,12 +1765,6 @@ return array(
|
||||||
'javelin-util',
|
'javelin-util',
|
||||||
'javelin-request',
|
'javelin-request',
|
||||||
),
|
),
|
||||||
'be807912' => array(
|
|
||||||
'javelin-behavior',
|
|
||||||
'javelin-dom',
|
|
||||||
'javelin-util',
|
|
||||||
'phabricator-shaped-request',
|
|
||||||
),
|
|
||||||
'c1700f6f' => array(
|
'c1700f6f' => array(
|
||||||
'javelin-install',
|
'javelin-install',
|
||||||
'javelin-util',
|
'javelin-util',
|
||||||
|
@ -1775,6 +1782,9 @@ return array(
|
||||||
'phabricator-keyboard-shortcut',
|
'phabricator-keyboard-shortcut',
|
||||||
'conpherence-thread-manager',
|
'conpherence-thread-manager',
|
||||||
),
|
),
|
||||||
|
'c7ccd872' => array(
|
||||||
|
'phui-fontkit-css',
|
||||||
|
),
|
||||||
'c8e57404' => array(
|
'c8e57404' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
|
@ -1835,6 +1845,12 @@ return array(
|
||||||
'javelin-dom',
|
'javelin-dom',
|
||||||
'javelin-stratcom',
|
'javelin-stratcom',
|
||||||
),
|
),
|
||||||
|
'd6bba572' => array(
|
||||||
|
'javelin-behavior',
|
||||||
|
'javelin-dom',
|
||||||
|
'javelin-util',
|
||||||
|
'phabricator-shaped-request',
|
||||||
|
),
|
||||||
'd75709e6' => array(
|
'd75709e6' => array(
|
||||||
'javelin-behavior',
|
'javelin-behavior',
|
||||||
'javelin-workflow',
|
'javelin-workflow',
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
ALTER TABLE {$NAMESPACE}_phame.phame_blog
|
||||||
|
ADD status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT};
|
|
@ -0,0 +1,2 @@
|
||||||
|
UPDATE {$NAMESPACE}_phame.phame_blog
|
||||||
|
SET status = 'active' WHERE status = '';
|
|
@ -1843,6 +1843,8 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorChatLogQuery' => 'applications/chatlog/query/PhabricatorChatLogQuery.php',
|
'PhabricatorChatLogQuery' => 'applications/chatlog/query/PhabricatorChatLogQuery.php',
|
||||||
'PhabricatorChunkedFileStorageEngine' => 'applications/files/engine/PhabricatorChunkedFileStorageEngine.php',
|
'PhabricatorChunkedFileStorageEngine' => 'applications/files/engine/PhabricatorChunkedFileStorageEngine.php',
|
||||||
'PhabricatorClusterConfigOptions' => 'applications/config/option/PhabricatorClusterConfigOptions.php',
|
'PhabricatorClusterConfigOptions' => 'applications/config/option/PhabricatorClusterConfigOptions.php',
|
||||||
|
'PhabricatorCommentEditField' => 'applications/transactions/editfield/PhabricatorCommentEditField.php',
|
||||||
|
'PhabricatorCommentEditType' => 'applications/transactions/edittype/PhabricatorCommentEditType.php',
|
||||||
'PhabricatorCommitBranchesField' => 'applications/repository/customfield/PhabricatorCommitBranchesField.php',
|
'PhabricatorCommitBranchesField' => 'applications/repository/customfield/PhabricatorCommitBranchesField.php',
|
||||||
'PhabricatorCommitCustomField' => 'applications/repository/customfield/PhabricatorCommitCustomField.php',
|
'PhabricatorCommitCustomField' => 'applications/repository/customfield/PhabricatorCommitCustomField.php',
|
||||||
'PhabricatorCommitMergedCommitsField' => 'applications/repository/customfield/PhabricatorCommitMergedCommitsField.php',
|
'PhabricatorCommitMergedCommitsField' => 'applications/repository/customfield/PhabricatorCommitMergedCommitsField.php',
|
||||||
|
@ -2112,12 +2114,15 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorEditEngine' => 'applications/transactions/editengine/PhabricatorEditEngine.php',
|
'PhabricatorEditEngine' => 'applications/transactions/editengine/PhabricatorEditEngine.php',
|
||||||
'PhabricatorEditEngineAPIMethod' => 'applications/transactions/editengine/PhabricatorEditEngineAPIMethod.php',
|
'PhabricatorEditEngineAPIMethod' => 'applications/transactions/editengine/PhabricatorEditEngineAPIMethod.php',
|
||||||
'PhabricatorEditEngineConfiguration' => 'applications/transactions/storage/PhabricatorEditEngineConfiguration.php',
|
'PhabricatorEditEngineConfiguration' => 'applications/transactions/storage/PhabricatorEditEngineConfiguration.php',
|
||||||
|
'PhabricatorEditEngineConfigurationDefaultsController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultsController.php',
|
||||||
'PhabricatorEditEngineConfigurationEditController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationEditController.php',
|
'PhabricatorEditEngineConfigurationEditController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationEditController.php',
|
||||||
'PhabricatorEditEngineConfigurationEditEngine' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditEngine.php',
|
'PhabricatorEditEngineConfigurationEditEngine' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditEngine.php',
|
||||||
'PhabricatorEditEngineConfigurationEditor' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php',
|
'PhabricatorEditEngineConfigurationEditor' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php',
|
||||||
'PhabricatorEditEngineConfigurationListController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationListController.php',
|
'PhabricatorEditEngineConfigurationListController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationListController.php',
|
||||||
|
'PhabricatorEditEngineConfigurationLockController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationLockController.php',
|
||||||
'PhabricatorEditEngineConfigurationPHIDType' => 'applications/transactions/phid/PhabricatorEditEngineConfigurationPHIDType.php',
|
'PhabricatorEditEngineConfigurationPHIDType' => 'applications/transactions/phid/PhabricatorEditEngineConfigurationPHIDType.php',
|
||||||
'PhabricatorEditEngineConfigurationQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationQuery.php',
|
'PhabricatorEditEngineConfigurationQuery' => 'applications/transactions/query/PhabricatorEditEngineConfigurationQuery.php',
|
||||||
|
'PhabricatorEditEngineConfigurationReorderController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationReorderController.php',
|
||||||
'PhabricatorEditEngineConfigurationSaveController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSaveController.php',
|
'PhabricatorEditEngineConfigurationSaveController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationSaveController.php',
|
||||||
'PhabricatorEditEngineConfigurationSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineConfigurationSearchEngine.php',
|
'PhabricatorEditEngineConfigurationSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineConfigurationSearchEngine.php',
|
||||||
'PhabricatorEditEngineConfigurationTransaction' => 'applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php',
|
'PhabricatorEditEngineConfigurationTransaction' => 'applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php',
|
||||||
|
@ -2810,6 +2815,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorRemarkupCowsayBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php',
|
'PhabricatorRemarkupCowsayBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupCowsayBlockInterpreter.php',
|
||||||
'PhabricatorRemarkupCustomBlockRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomBlockRule.php',
|
'PhabricatorRemarkupCustomBlockRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomBlockRule.php',
|
||||||
'PhabricatorRemarkupCustomInlineRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomInlineRule.php',
|
'PhabricatorRemarkupCustomInlineRule' => 'infrastructure/markup/rule/PhabricatorRemarkupCustomInlineRule.php',
|
||||||
|
'PhabricatorRemarkupEditField' => 'applications/transactions/editfield/PhabricatorRemarkupEditField.php',
|
||||||
'PhabricatorRemarkupFigletBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupFigletBlockInterpreter.php',
|
'PhabricatorRemarkupFigletBlockInterpreter' => 'infrastructure/markup/interpreter/PhabricatorRemarkupFigletBlockInterpreter.php',
|
||||||
'PhabricatorRemarkupUIExample' => 'applications/uiexample/examples/PhabricatorRemarkupUIExample.php',
|
'PhabricatorRemarkupUIExample' => 'applications/uiexample/examples/PhabricatorRemarkupUIExample.php',
|
||||||
'PhabricatorRepositoriesSetupCheck' => 'applications/config/check/PhabricatorRepositoriesSetupCheck.php',
|
'PhabricatorRepositoriesSetupCheck' => 'applications/config/check/PhabricatorRepositoriesSetupCheck.php',
|
||||||
|
@ -3271,9 +3277,9 @@ phutil_register_library_map(array(
|
||||||
'PhameBasicBlogSkin' => 'applications/phame/skins/PhameBasicBlogSkin.php',
|
'PhameBasicBlogSkin' => 'applications/phame/skins/PhameBasicBlogSkin.php',
|
||||||
'PhameBasicTemplateBlogSkin' => 'applications/phame/skins/PhameBasicTemplateBlogSkin.php',
|
'PhameBasicTemplateBlogSkin' => 'applications/phame/skins/PhameBasicTemplateBlogSkin.php',
|
||||||
'PhameBlog' => 'applications/phame/storage/PhameBlog.php',
|
'PhameBlog' => 'applications/phame/storage/PhameBlog.php',
|
||||||
|
'PhameBlogArchiveController' => 'applications/phame/controller/blog/PhameBlogArchiveController.php',
|
||||||
'PhameBlogController' => 'applications/phame/controller/blog/PhameBlogController.php',
|
'PhameBlogController' => 'applications/phame/controller/blog/PhameBlogController.php',
|
||||||
'PhameBlogCreateCapability' => 'applications/phame/capability/PhameBlogCreateCapability.php',
|
'PhameBlogCreateCapability' => 'applications/phame/capability/PhameBlogCreateCapability.php',
|
||||||
'PhameBlogDeleteController' => 'applications/phame/controller/blog/PhameBlogDeleteController.php',
|
|
||||||
'PhameBlogEditController' => 'applications/phame/controller/blog/PhameBlogEditController.php',
|
'PhameBlogEditController' => 'applications/phame/controller/blog/PhameBlogEditController.php',
|
||||||
'PhameBlogEditor' => 'applications/phame/editor/PhameBlogEditor.php',
|
'PhameBlogEditor' => 'applications/phame/editor/PhameBlogEditor.php',
|
||||||
'PhameBlogFeedController' => 'applications/phame/controller/blog/PhameBlogFeedController.php',
|
'PhameBlogFeedController' => 'applications/phame/controller/blog/PhameBlogFeedController.php',
|
||||||
|
@ -3296,7 +3302,6 @@ phutil_register_library_map(array(
|
||||||
'PhamePost' => 'applications/phame/storage/PhamePost.php',
|
'PhamePost' => 'applications/phame/storage/PhamePost.php',
|
||||||
'PhamePostCommentController' => 'applications/phame/controller/post/PhamePostCommentController.php',
|
'PhamePostCommentController' => 'applications/phame/controller/post/PhamePostCommentController.php',
|
||||||
'PhamePostController' => 'applications/phame/controller/post/PhamePostController.php',
|
'PhamePostController' => 'applications/phame/controller/post/PhamePostController.php',
|
||||||
'PhamePostDeleteController' => 'applications/phame/controller/post/PhamePostDeleteController.php',
|
|
||||||
'PhamePostEditController' => 'applications/phame/controller/post/PhamePostEditController.php',
|
'PhamePostEditController' => 'applications/phame/controller/post/PhamePostEditController.php',
|
||||||
'PhamePostEditor' => 'applications/phame/editor/PhamePostEditor.php',
|
'PhamePostEditor' => 'applications/phame/editor/PhamePostEditor.php',
|
||||||
'PhamePostFramedController' => 'applications/phame/controller/post/PhamePostFramedController.php',
|
'PhamePostFramedController' => 'applications/phame/controller/post/PhamePostFramedController.php',
|
||||||
|
@ -3304,7 +3309,6 @@ phutil_register_library_map(array(
|
||||||
'PhamePostMailReceiver' => 'applications/phame/mail/PhamePostMailReceiver.php',
|
'PhamePostMailReceiver' => 'applications/phame/mail/PhamePostMailReceiver.php',
|
||||||
'PhamePostNewController' => 'applications/phame/controller/post/PhamePostNewController.php',
|
'PhamePostNewController' => 'applications/phame/controller/post/PhamePostNewController.php',
|
||||||
'PhamePostNotLiveController' => 'applications/phame/controller/post/PhamePostNotLiveController.php',
|
'PhamePostNotLiveController' => 'applications/phame/controller/post/PhamePostNotLiveController.php',
|
||||||
'PhamePostPreviewController' => 'applications/phame/controller/post/PhamePostPreviewController.php',
|
|
||||||
'PhamePostPublishController' => 'applications/phame/controller/post/PhamePostPublishController.php',
|
'PhamePostPublishController' => 'applications/phame/controller/post/PhamePostPublishController.php',
|
||||||
'PhamePostQuery' => 'applications/phame/query/PhamePostQuery.php',
|
'PhamePostQuery' => 'applications/phame/query/PhamePostQuery.php',
|
||||||
'PhamePostReplyHandler' => 'applications/phame/mail/PhamePostReplyHandler.php',
|
'PhamePostReplyHandler' => 'applications/phame/mail/PhamePostReplyHandler.php',
|
||||||
|
@ -5886,6 +5890,8 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorChatLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
'PhabricatorChatLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||||
'PhabricatorChunkedFileStorageEngine' => 'PhabricatorFileStorageEngine',
|
'PhabricatorChunkedFileStorageEngine' => 'PhabricatorFileStorageEngine',
|
||||||
'PhabricatorClusterConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
'PhabricatorClusterConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||||
|
'PhabricatorCommentEditField' => 'PhabricatorEditField',
|
||||||
|
'PhabricatorCommentEditType' => 'PhabricatorEditType',
|
||||||
'PhabricatorCommitBranchesField' => 'PhabricatorCommitCustomField',
|
'PhabricatorCommitBranchesField' => 'PhabricatorCommitCustomField',
|
||||||
'PhabricatorCommitCustomField' => 'PhabricatorCustomField',
|
'PhabricatorCommitCustomField' => 'PhabricatorCustomField',
|
||||||
'PhabricatorCommitMergedCommitsField' => 'PhabricatorCommitCustomField',
|
'PhabricatorCommitMergedCommitsField' => 'PhabricatorCommitCustomField',
|
||||||
|
@ -6203,12 +6209,15 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorApplicationTransactionInterface',
|
'PhabricatorApplicationTransactionInterface',
|
||||||
'PhabricatorPolicyInterface',
|
'PhabricatorPolicyInterface',
|
||||||
),
|
),
|
||||||
|
'PhabricatorEditEngineConfigurationDefaultsController' => 'PhabricatorEditEngineController',
|
||||||
'PhabricatorEditEngineConfigurationEditController' => 'PhabricatorEditEngineController',
|
'PhabricatorEditEngineConfigurationEditController' => 'PhabricatorEditEngineController',
|
||||||
'PhabricatorEditEngineConfigurationEditEngine' => 'PhabricatorEditEngine',
|
'PhabricatorEditEngineConfigurationEditEngine' => 'PhabricatorEditEngine',
|
||||||
'PhabricatorEditEngineConfigurationEditor' => 'PhabricatorApplicationTransactionEditor',
|
'PhabricatorEditEngineConfigurationEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||||
'PhabricatorEditEngineConfigurationListController' => 'PhabricatorEditEngineController',
|
'PhabricatorEditEngineConfigurationListController' => 'PhabricatorEditEngineController',
|
||||||
|
'PhabricatorEditEngineConfigurationLockController' => 'PhabricatorEditEngineController',
|
||||||
'PhabricatorEditEngineConfigurationPHIDType' => 'PhabricatorPHIDType',
|
'PhabricatorEditEngineConfigurationPHIDType' => 'PhabricatorPHIDType',
|
||||||
'PhabricatorEditEngineConfigurationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
'PhabricatorEditEngineConfigurationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||||
|
'PhabricatorEditEngineConfigurationReorderController' => 'PhabricatorEditEngineController',
|
||||||
'PhabricatorEditEngineConfigurationSaveController' => 'PhabricatorEditEngineController',
|
'PhabricatorEditEngineConfigurationSaveController' => 'PhabricatorEditEngineController',
|
||||||
'PhabricatorEditEngineConfigurationSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
'PhabricatorEditEngineConfigurationSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||||
'PhabricatorEditEngineConfigurationTransaction' => 'PhabricatorApplicationTransaction',
|
'PhabricatorEditEngineConfigurationTransaction' => 'PhabricatorApplicationTransaction',
|
||||||
|
@ -7021,6 +7030,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorRemarkupCowsayBlockInterpreter' => 'PhutilRemarkupBlockInterpreter',
|
'PhabricatorRemarkupCowsayBlockInterpreter' => 'PhutilRemarkupBlockInterpreter',
|
||||||
'PhabricatorRemarkupCustomBlockRule' => 'PhutilRemarkupBlockRule',
|
'PhabricatorRemarkupCustomBlockRule' => 'PhutilRemarkupBlockRule',
|
||||||
'PhabricatorRemarkupCustomInlineRule' => 'PhutilRemarkupRule',
|
'PhabricatorRemarkupCustomInlineRule' => 'PhutilRemarkupRule',
|
||||||
|
'PhabricatorRemarkupEditField' => 'PhabricatorEditField',
|
||||||
'PhabricatorRemarkupFigletBlockInterpreter' => 'PhutilRemarkupBlockInterpreter',
|
'PhabricatorRemarkupFigletBlockInterpreter' => 'PhutilRemarkupBlockInterpreter',
|
||||||
'PhabricatorRemarkupUIExample' => 'PhabricatorUIExample',
|
'PhabricatorRemarkupUIExample' => 'PhabricatorUIExample',
|
||||||
'PhabricatorRepositoriesSetupCheck' => 'PhabricatorSetupCheck',
|
'PhabricatorRepositoriesSetupCheck' => 'PhabricatorSetupCheck',
|
||||||
|
@ -7573,9 +7583,9 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorProjectInterface',
|
'PhabricatorProjectInterface',
|
||||||
'PhabricatorApplicationTransactionInterface',
|
'PhabricatorApplicationTransactionInterface',
|
||||||
),
|
),
|
||||||
|
'PhameBlogArchiveController' => 'PhameBlogController',
|
||||||
'PhameBlogController' => 'PhameController',
|
'PhameBlogController' => 'PhameController',
|
||||||
'PhameBlogCreateCapability' => 'PhabricatorPolicyCapability',
|
'PhameBlogCreateCapability' => 'PhabricatorPolicyCapability',
|
||||||
'PhameBlogDeleteController' => 'PhameBlogController',
|
|
||||||
'PhameBlogEditController' => 'PhameBlogController',
|
'PhameBlogEditController' => 'PhameBlogController',
|
||||||
'PhameBlogEditor' => 'PhabricatorApplicationTransactionEditor',
|
'PhameBlogEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||||
'PhameBlogFeedController' => 'PhameBlogController',
|
'PhameBlogFeedController' => 'PhameBlogController',
|
||||||
|
@ -7607,7 +7617,6 @@ phutil_register_library_map(array(
|
||||||
),
|
),
|
||||||
'PhamePostCommentController' => 'PhamePostController',
|
'PhamePostCommentController' => 'PhamePostController',
|
||||||
'PhamePostController' => 'PhameController',
|
'PhamePostController' => 'PhameController',
|
||||||
'PhamePostDeleteController' => 'PhamePostController',
|
|
||||||
'PhamePostEditController' => 'PhamePostController',
|
'PhamePostEditController' => 'PhamePostController',
|
||||||
'PhamePostEditor' => 'PhabricatorApplicationTransactionEditor',
|
'PhamePostEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||||
'PhamePostFramedController' => 'PhamePostController',
|
'PhamePostFramedController' => 'PhamePostController',
|
||||||
|
@ -7615,7 +7624,6 @@ phutil_register_library_map(array(
|
||||||
'PhamePostMailReceiver' => 'PhabricatorObjectMailReceiver',
|
'PhamePostMailReceiver' => 'PhabricatorObjectMailReceiver',
|
||||||
'PhamePostNewController' => 'PhamePostController',
|
'PhamePostNewController' => 'PhamePostController',
|
||||||
'PhamePostNotLiveController' => 'PhamePostController',
|
'PhamePostNotLiveController' => 'PhamePostController',
|
||||||
'PhamePostPreviewController' => 'PhamePostController',
|
|
||||||
'PhamePostPublishController' => 'PhamePostController',
|
'PhamePostPublishController' => 'PhamePostController',
|
||||||
'PhamePostQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
'PhamePostQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||||
'PhamePostReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
'PhamePostReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
||||||
|
|
|
@ -660,7 +660,7 @@ final class PhabricatorAuditEditor
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($inlines) {
|
if ($inlines) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('INLINE COMMENTS'),
|
pht('INLINE COMMENTS'),
|
||||||
$this->renderInlineCommentsForMail($object, $inlines));
|
$this->renderInlineCommentsForMail($object, $inlines));
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,7 +194,7 @@ final class PhabricatorBadgesEditor
|
||||||
$body = parent::buildMailBody($object, $xactions);
|
$body = parent::buildMailBody($object, $xactions);
|
||||||
|
|
||||||
if (strlen($description)) {
|
if (strlen($description)) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSeciton(
|
||||||
pht('BADGE DESCRIPTION'),
|
pht('BADGE DESCRIPTION'),
|
||||||
$object->getDescription());
|
$object->getDescription());
|
||||||
}
|
}
|
||||||
|
|
|
@ -636,7 +636,15 @@ abstract class PhabricatorApplication
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getEditRoutePattern($base = null) {
|
protected function getEditRoutePattern($base = null) {
|
||||||
return $base.'(?:(?P<id>[0-9]\d*)/)?(?:(?P<editAction>parameters)/)?';
|
return $base.'(?:'.
|
||||||
|
'(?P<id>[0-9]\d*)/)?'.
|
||||||
|
'(?:'.
|
||||||
|
'(?:'.
|
||||||
|
'(?P<editAction>parameters)'.
|
||||||
|
'|'.
|
||||||
|
'(?:form/(?P<formKey>[^/]+))'.
|
||||||
|
')'.
|
||||||
|
'/)?';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getQueryRoutePattern($base = null) {
|
protected function getQueryRoutePattern($base = null) {
|
||||||
|
|
|
@ -125,6 +125,7 @@ abstract class CelerityResourceController extends PhabricatorController {
|
||||||
'css' => 'text/css; charset=utf-8',
|
'css' => 'text/css; charset=utf-8',
|
||||||
'js' => 'text/javascript; charset=utf-8',
|
'js' => 'text/javascript; charset=utf-8',
|
||||||
'png' => 'image/png',
|
'png' => 'image/png',
|
||||||
|
'svg' => 'image/svg+xml',
|
||||||
'gif' => 'image/gif',
|
'gif' => 'image/gif',
|
||||||
'jpg' => 'image/jpeg',
|
'jpg' => 'image/jpeg',
|
||||||
'swf' => 'application/x-shockwave-flash',
|
'swf' => 'application/x-shockwave-flash',
|
||||||
|
|
|
@ -33,6 +33,7 @@ abstract class CelerityResourcesOnDisk extends CelerityPhysicalResources {
|
||||||
'jpg',
|
'jpg',
|
||||||
'gif',
|
'gif',
|
||||||
'swf',
|
'swf',
|
||||||
|
'svg',
|
||||||
'woff',
|
'woff',
|
||||||
'woff2',
|
'woff2',
|
||||||
'ttf',
|
'ttf',
|
||||||
|
|
|
@ -173,7 +173,7 @@ final class PhabricatorCountdownEditor
|
||||||
$description = $object->getDescription();
|
$description = $object->getDescription();
|
||||||
|
|
||||||
if (strlen($description)) {
|
if (strlen($description)) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('COUNTDOWN DESCRIPTION'),
|
pht('COUNTDOWN DESCRIPTION'),
|
||||||
$object->getDescription());
|
$object->getDescription());
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ final class DifferentialSummaryField
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$body->addTextSection(pht('REVISION SUMMARY'), $summary);
|
$body->addRemarkupSection(pht('REVISION SUMMARY'), $summary);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ final class DifferentialTestPlanField
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$body->addTextSection(pht('TEST PLAN'), $test_plan);
|
$body->addRemarkupSection(pht('TEST PLAN'), $test_plan);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1212,7 +1212,7 @@ final class DifferentialTransactionEditor
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($inlines) {
|
if ($inlines) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('INLINE COMMENTS'),
|
pht('INLINE COMMENTS'),
|
||||||
$this->renderInlineCommentsForMail($object, $inlines));
|
$this->renderInlineCommentsForMail($object, $inlines));
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,9 +119,9 @@ abstract class PhabricatorFileImageTransform extends PhabricatorFileTransform {
|
||||||
$out = new TempFile();
|
$out = new TempFile();
|
||||||
|
|
||||||
$future = new ExecFuture('convert %s %Ls %s', $tmp, $argv, $out);
|
$future = new ExecFuture('convert %s %Ls %s', $tmp, $argv, $out);
|
||||||
// Don't spend more than 10 seconds resizing; just fail if it takes longer
|
// Don't spend more than 60 seconds resizing; just fail if it takes longer
|
||||||
// than that.
|
// than that.
|
||||||
$future->setTimeout(10)->resolvex();
|
$future->setTimeout(60)->resolvex();
|
||||||
|
|
||||||
$data = Filesystem::readFile($out);
|
$data = Filesystem::readFile($out);
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ abstract class PhabricatorFileImageTransform extends PhabricatorFileTransform {
|
||||||
|
|
||||||
$file = $this->file;
|
$file = $this->file;
|
||||||
|
|
||||||
$max_size = (1024 * 1024 * 4);
|
$max_size = (1024 * 1024 * 16);
|
||||||
$img_size = $file->getByteSize();
|
$img_size = $file->getByteSize();
|
||||||
if ($img_size > $max_size) {
|
if ($img_size > $max_size) {
|
||||||
throw new Exception(
|
throw new Exception(
|
||||||
|
|
|
@ -256,10 +256,15 @@ final class HarbormasterSendMessageConduitAPIMethod
|
||||||
|
|
||||||
// If the build has completely paused because all steps are blocked on
|
// If the build has completely paused because all steps are blocked on
|
||||||
// waiting targets, this will resume it.
|
// waiting targets, this will resume it.
|
||||||
|
$build = $build_target->getBuild();
|
||||||
|
|
||||||
PhabricatorWorker::scheduleTask(
|
PhabricatorWorker::scheduleTask(
|
||||||
'HarbormasterBuildWorker',
|
'HarbormasterBuildWorker',
|
||||||
array(
|
array(
|
||||||
'buildID' => $build_target->getBuild()->getID(),
|
'buildID' => $build->getID(),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'objectPHID' => $build->getPHID(),
|
||||||
));
|
));
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -98,6 +98,9 @@ final class HarbormasterBuildTransactionEditor
|
||||||
'HarbormasterBuildWorker',
|
'HarbormasterBuildWorker',
|
||||||
array(
|
array(
|
||||||
'buildID' => $build->getID(),
|
'buildID' => $build->getID(),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'objectPHID' => $build->getPHID(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,9 @@ final class HarbormasterBuildEngine extends Phobject {
|
||||||
'HarbormasterTargetWorker',
|
'HarbormasterTargetWorker',
|
||||||
array(
|
array(
|
||||||
'targetID' => $target->getID(),
|
'targetID' => $target->getID(),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'objectPHID' => $target->getPHID(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -184,6 +184,9 @@ final class HarbormasterBuildable extends HarbormasterDAO
|
||||||
'HarbormasterBuildWorker',
|
'HarbormasterBuildWorker',
|
||||||
array(
|
array(
|
||||||
'buildID' => $build->getID(),
|
'buildID' => $build->getID(),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'objectPHID' => $build->getPHID(),
|
||||||
));
|
));
|
||||||
|
|
||||||
return $build;
|
return $build;
|
||||||
|
|
|
@ -29,6 +29,7 @@ abstract class HeraldAdapter extends Phobject {
|
||||||
private $contentSource;
|
private $contentSource;
|
||||||
private $isNewObject;
|
private $isNewObject;
|
||||||
private $applicationEmail;
|
private $applicationEmail;
|
||||||
|
private $appliedTransactions = array();
|
||||||
private $queuedTransactions = array();
|
private $queuedTransactions = array();
|
||||||
private $emailPHIDs = array();
|
private $emailPHIDs = array();
|
||||||
private $forcedEmailPHIDs = array();
|
private $forcedEmailPHIDs = array();
|
||||||
|
@ -121,6 +122,36 @@ abstract class HeraldAdapter extends Phobject {
|
||||||
return !empty($applications);
|
return !empty($applications);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the list of transactions which just took effect.
|
||||||
|
*
|
||||||
|
* These transactions are set by @{class:PhabricatorApplicationEditor}
|
||||||
|
* automatically, before it invokes Herald.
|
||||||
|
*
|
||||||
|
* @param list<PhabricatorApplicationTransaction> List of transactions.
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
final public function setAppliedTransactions(array $xactions) {
|
||||||
|
assert_instances_of($xactions, 'PhabricatorApplicationTransaction');
|
||||||
|
$this->appliedTransactions = $xactions;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of transactions which just took effect.
|
||||||
|
*
|
||||||
|
* When an object is edited normally, transactions are applied and then
|
||||||
|
* Herald executes. You can call this method to examine the transactions
|
||||||
|
* if you want to react to them.
|
||||||
|
*
|
||||||
|
* @return list<PhabricatorApplicationTransaction> List of transactions.
|
||||||
|
*/
|
||||||
|
final public function getAppliedTransactions() {
|
||||||
|
return $this->appliedTransactions;
|
||||||
|
}
|
||||||
|
|
||||||
public function queueTransaction($transaction) {
|
public function queueTransaction($transaction) {
|
||||||
$this->queuedTransactions[] = $transaction;
|
$this->queuedTransactions[] = $transaction;
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,10 +243,10 @@ final class LegalpadDocumentEditController extends LegalpadController {
|
||||||
$crumbs->addTextCrumb($short);
|
$crumbs->addTextCrumb($short);
|
||||||
|
|
||||||
$preview = id(new PHUIRemarkupPreviewPanel())
|
$preview = id(new PHUIRemarkupPreviewPanel())
|
||||||
->setHeader(pht('Document Preview'))
|
->setHeader($document->getTitle())
|
||||||
->setPreviewURI($this->getApplicationURI('document/preview/'))
|
->setPreviewURI($this->getApplicationURI('document/preview/'))
|
||||||
->setControlID('document-text')
|
->setControlID('document-text')
|
||||||
->addClass('phui-document-view');
|
->setPreviewType(PHUIRemarkupPreviewPanel::DOCUMENT);
|
||||||
|
|
||||||
return $this->buildApplicationPage(
|
return $this->buildApplicationPage(
|
||||||
array(
|
array(
|
||||||
|
|
|
@ -442,7 +442,7 @@ final class ManiphestTransactionEditor
|
||||||
$body = parent::buildMailBody($object, $xactions);
|
$body = parent::buildMailBody($object, $xactions);
|
||||||
|
|
||||||
if ($this->getIsNewObject()) {
|
if ($this->getIsNewObject()) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('TASK DESCRIPTION'),
|
pht('TASK DESCRIPTION'),
|
||||||
$object->getDescription());
|
$object->getDescription());
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,13 +44,12 @@ final class PhabricatorPhameApplication extends PhabricatorApplication {
|
||||||
'(?:(?P<filter>draft|all)/)?' => 'PhamePostListController',
|
'(?:(?P<filter>draft|all)/)?' => 'PhamePostListController',
|
||||||
'(?:query/(?P<queryKey>[^/]+)/)?' => 'PhamePostListController',
|
'(?:query/(?P<queryKey>[^/]+)/)?' => 'PhamePostListController',
|
||||||
'blogger/(?P<bloggername>[\w\.-_]+)/' => 'PhamePostListController',
|
'blogger/(?P<bloggername>[\w\.-_]+)/' => 'PhamePostListController',
|
||||||
'delete/(?P<id>[^/]+)/' => 'PhamePostDeleteController',
|
|
||||||
'edit/(?:(?P<id>[^/]+)/)?' => 'PhamePostEditController',
|
'edit/(?:(?P<id>[^/]+)/)?' => 'PhamePostEditController',
|
||||||
'view/(?P<id>\d+)/' => 'PhamePostViewController',
|
'view/(?P<id>\d+)/' => 'PhamePostViewController',
|
||||||
'publish/(?P<id>\d+)/' => 'PhamePostPublishController',
|
'publish/(?P<id>\d+)/' => 'PhamePostPublishController',
|
||||||
'unpublish/(?P<id>\d+)/' => 'PhamePostUnpublishController',
|
'unpublish/(?P<id>\d+)/' => 'PhamePostUnpublishController',
|
||||||
'notlive/(?P<id>\d+)/' => 'PhamePostNotLiveController',
|
'notlive/(?P<id>\d+)/' => 'PhamePostNotLiveController',
|
||||||
'preview/' => 'PhamePostPreviewController',
|
'preview/' => 'PhabricatorMarkupPreviewController',
|
||||||
'framed/(?P<id>\d+)/' => 'PhamePostFramedController',
|
'framed/(?P<id>\d+)/' => 'PhamePostFramedController',
|
||||||
'new/' => 'PhamePostNewController',
|
'new/' => 'PhamePostNewController',
|
||||||
'move/(?P<id>\d+)/' => 'PhamePostNewController',
|
'move/(?P<id>\d+)/' => 'PhamePostNewController',
|
||||||
|
@ -59,7 +58,7 @@ final class PhabricatorPhameApplication extends PhabricatorApplication {
|
||||||
'blog/' => array(
|
'blog/' => array(
|
||||||
'(?:(?P<filter>user|all)/)?' => 'PhameBlogListController',
|
'(?:(?P<filter>user|all)/)?' => 'PhameBlogListController',
|
||||||
'(?:query/(?P<queryKey>[^/]+)/)?' => 'PhameBlogListController',
|
'(?:query/(?P<queryKey>[^/]+)/)?' => 'PhameBlogListController',
|
||||||
'delete/(?P<id>[^/]+)/' => 'PhameBlogDeleteController',
|
'archive/(?P<id>[^/]+)/' => 'PhameBlogArchiveController',
|
||||||
'edit/(?P<id>[^/]+)/' => 'PhameBlogEditController',
|
'edit/(?P<id>[^/]+)/' => 'PhameBlogEditController',
|
||||||
'view/(?P<id>[^/]+)/' => 'PhameBlogViewController',
|
'view/(?P<id>[^/]+)/' => 'PhameBlogViewController',
|
||||||
'feed/(?P<id>[^/]+)/' => 'PhameBlogFeedController',
|
'feed/(?P<id>[^/]+)/' => 'PhameBlogFeedController',
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhameBlogArchiveController
|
||||||
|
extends PhameBlogController {
|
||||||
|
|
||||||
|
public function handleRequest(AphrontRequest $request) {
|
||||||
|
$viewer = $request->getViewer();
|
||||||
|
$id = $request->getURIData('id');
|
||||||
|
|
||||||
|
$blog = id(new PhameBlogQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withIDs(array($id))
|
||||||
|
->requireCapabilities(
|
||||||
|
array(
|
||||||
|
PhabricatorPolicyCapability::CAN_VIEW,
|
||||||
|
PhabricatorPolicyCapability::CAN_EDIT,
|
||||||
|
))
|
||||||
|
->executeOne();
|
||||||
|
if (!$blog) {
|
||||||
|
return new Aphront404Response();
|
||||||
|
}
|
||||||
|
|
||||||
|
$view_uri = $this->getApplicationURI('blog/view/'.$blog->getID().'/');
|
||||||
|
|
||||||
|
if ($request->isFormPost()) {
|
||||||
|
if ($blog->isArchived()) {
|
||||||
|
$new_status = PhameBlog::STATUS_ACTIVE;
|
||||||
|
} else {
|
||||||
|
$new_status = PhameBlog::STATUS_ARCHIVED;
|
||||||
|
}
|
||||||
|
|
||||||
|
$xactions = array();
|
||||||
|
|
||||||
|
$xactions[] = id(new PhameBlogTransaction())
|
||||||
|
->setTransactionType(PhameBlogTransaction::TYPE_STATUS)
|
||||||
|
->setNewValue($new_status);
|
||||||
|
|
||||||
|
id(new PhameBlogEditor())
|
||||||
|
->setActor($viewer)
|
||||||
|
->setContentSourceFromRequest($request)
|
||||||
|
->setContinueOnNoEffect(true)
|
||||||
|
->setContinueOnMissingFields(true)
|
||||||
|
->applyTransactions($blog, $xactions);
|
||||||
|
|
||||||
|
return id(new AphrontRedirectResponse())->setURI($view_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($blog->isArchived()) {
|
||||||
|
$title = pht('Activate Blog');
|
||||||
|
$body = pht('This blog will become active again.');
|
||||||
|
$button = pht('Activate Blog');
|
||||||
|
} else {
|
||||||
|
$title = pht('Archive Blog');
|
||||||
|
$body = pht('This blog will be marked as archived.');
|
||||||
|
$button = pht('Archive Blog');
|
||||||
|
}
|
||||||
|
|
||||||
|
$dialog = id(new AphrontDialogView())
|
||||||
|
->setUser($viewer)
|
||||||
|
->setTitle($title)
|
||||||
|
->appendChild($body)
|
||||||
|
->addCancelButton($view_uri)
|
||||||
|
->addSubmitButton($button);
|
||||||
|
|
||||||
|
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,42 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhameBlogDeleteController extends PhameBlogController {
|
|
||||||
|
|
||||||
public function handleRequest(AphrontRequest $request) {
|
|
||||||
$viewer = $request->getViewer();
|
|
||||||
$id = $request->getURIData('id');
|
|
||||||
|
|
||||||
$blog = id(new PhameBlogQuery())
|
|
||||||
->setViewer($viewer)
|
|
||||||
->withIDs(array($id))
|
|
||||||
->requireCapabilities(
|
|
||||||
array(
|
|
||||||
PhabricatorPolicyCapability::CAN_EDIT,
|
|
||||||
))
|
|
||||||
->executeOne();
|
|
||||||
if (!$blog) {
|
|
||||||
return new Aphront404Response();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($request->isFormPost()) {
|
|
||||||
$blog->delete();
|
|
||||||
return id(new AphrontRedirectResponse())
|
|
||||||
->setURI($this->getApplicationURI());
|
|
||||||
}
|
|
||||||
|
|
||||||
$cancel_uri = $this->getApplicationURI('/blog/view/'.$blog->getID().'/');
|
|
||||||
|
|
||||||
$dialog = id(new AphrontDialogView())
|
|
||||||
->setUser($viewer)
|
|
||||||
->setTitle(pht('Delete Blog?'))
|
|
||||||
->appendChild(
|
|
||||||
pht(
|
|
||||||
'Really delete the blog "%s"? It will be gone forever.',
|
|
||||||
$blog->getName()))
|
|
||||||
->addSubmitButton(pht('Delete'))
|
|
||||||
->addCancelButton($cancel_uri);
|
|
||||||
|
|
||||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -22,10 +22,21 @@ final class PhameBlogViewController extends PhameBlogController {
|
||||||
->withBlogPHIDs(array($blog->getPHID()))
|
->withBlogPHIDs(array($blog->getPHID()))
|
||||||
->executeWithCursorPager($pager);
|
->executeWithCursorPager($pager);
|
||||||
|
|
||||||
|
if ($blog->isArchived()) {
|
||||||
|
$header_icon = 'fa-ban';
|
||||||
|
$header_name = pht('Archived');
|
||||||
|
$header_color = 'dark';
|
||||||
|
} else {
|
||||||
|
$header_icon = 'fa-check';
|
||||||
|
$header_name = pht('Active');
|
||||||
|
$header_color = 'bluegrey';
|
||||||
|
}
|
||||||
|
|
||||||
$header = id(new PHUIHeaderView())
|
$header = id(new PHUIHeaderView())
|
||||||
->setHeader($blog->getName())
|
->setHeader($blog->getName())
|
||||||
->setUser($viewer)
|
->setUser($viewer)
|
||||||
->setPolicyObject($blog);
|
->setPolicyObject($blog)
|
||||||
|
->setStatus($header_icon, $header_color, $header_name);
|
||||||
|
|
||||||
$actions = $this->renderActions($blog, $viewer);
|
$actions = $this->renderActions($blog, $viewer);
|
||||||
$properties = $this->renderProperties($blog, $viewer, $actions);
|
$properties = $this->renderProperties($blog, $viewer, $actions);
|
||||||
|
@ -158,13 +169,25 @@ final class PhameBlogViewController extends PhameBlogController {
|
||||||
->setDisabled(!$can_edit)
|
->setDisabled(!$can_edit)
|
||||||
->setWorkflow(!$can_edit));
|
->setWorkflow(!$can_edit));
|
||||||
|
|
||||||
$actions->addAction(
|
if ($blog->isArchived()) {
|
||||||
id(new PhabricatorActionView())
|
$actions->addAction(
|
||||||
->setIcon('fa-times')
|
id(new PhabricatorActionView())
|
||||||
->setHref($this->getApplicationURI('blog/delete/'.$blog->getID().'/'))
|
->setName(pht('Activate Blog'))
|
||||||
->setName(pht('Delete Blog'))
|
->setIcon('fa-check')
|
||||||
->setDisabled(!$can_edit)
|
->setHref(
|
||||||
->setWorkflow(true));
|
$this->getApplicationURI('blog/archive/'.$blog->getID().'/'))
|
||||||
|
->setDisabled(!$can_edit)
|
||||||
|
->setWorkflow(true));
|
||||||
|
} else {
|
||||||
|
$actions->addAction(
|
||||||
|
id(new PhabricatorActionView())
|
||||||
|
->setName(pht('Archive Blog'))
|
||||||
|
->setIcon('fa-ban')
|
||||||
|
->setHref(
|
||||||
|
$this->getApplicationURI('blog/archive/'.$blog->getID().'/'))
|
||||||
|
->setDisabled(!$can_edit)
|
||||||
|
->setWorkflow(true));
|
||||||
|
}
|
||||||
|
|
||||||
return $actions;
|
return $actions;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhamePostDeleteController extends PhamePostController {
|
|
||||||
|
|
||||||
public function handleRequest(AphrontRequest $request) {
|
|
||||||
$viewer = $request->getViewer();
|
|
||||||
|
|
||||||
$post = id(new PhamePostQuery())
|
|
||||||
->setViewer($viewer)
|
|
||||||
->withIDs(array($request->getURIData('id')))
|
|
||||||
->requireCapabilities(
|
|
||||||
array(
|
|
||||||
PhabricatorPolicyCapability::CAN_EDIT,
|
|
||||||
))
|
|
||||||
->executeOne();
|
|
||||||
if (!$post) {
|
|
||||||
return new Aphront404Response();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($request->isFormPost()) {
|
|
||||||
$post->delete();
|
|
||||||
return id(new AphrontRedirectResponse())
|
|
||||||
->setURI('/phame/post/');
|
|
||||||
}
|
|
||||||
|
|
||||||
$cancel_uri = $this->getApplicationURI('/post/view/'.$post->getID().'/');
|
|
||||||
|
|
||||||
$dialog = id(new AphrontDialogView())
|
|
||||||
->setUser($viewer)
|
|
||||||
->setTitle(pht('Delete Post?'))
|
|
||||||
->appendChild(
|
|
||||||
pht(
|
|
||||||
'Really delete the post "%s"? It will be gone forever.',
|
|
||||||
$post->getTitle()))
|
|
||||||
->addSubmitButton(pht('Delete'))
|
|
||||||
->addCancelButton($cancel_uri);
|
|
||||||
|
|
||||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -175,27 +175,17 @@ final class PhamePostEditController extends PhamePostController {
|
||||||
->addCancelButton($cancel_uri)
|
->addCancelButton($cancel_uri)
|
||||||
->setValue($submit_button));
|
->setValue($submit_button));
|
||||||
|
|
||||||
$header = id(new PHUIHeaderView())
|
$preview = id(new PHUIRemarkupPreviewPanel())
|
||||||
->setHeader(pht('%s (Post Preview)', $title));
|
->setHeader($post->getTitle())
|
||||||
|
->setPreviewURI($this->getApplicationURI('post/preview/'))
|
||||||
$container = id(new PHUIBoxView())
|
->setControlID('post-body')
|
||||||
->setID('post-preview');
|
->setPreviewType(PHUIRemarkupPreviewPanel::DOCUMENT);
|
||||||
|
|
||||||
$document = id(new PHUIDocumentViewPro())
|
|
||||||
->setHeader($header)
|
|
||||||
->appendChild($container);
|
|
||||||
|
|
||||||
$preview_panel = id(new PHUIObjectBoxView())
|
|
||||||
->appendChild($document);
|
|
||||||
|
|
||||||
Javelin::initBehavior(
|
Javelin::initBehavior(
|
||||||
'phame-post-preview',
|
'phame-post-preview',
|
||||||
array(
|
array(
|
||||||
'preview' => 'post-preview',
|
|
||||||
'body' => 'post-body',
|
|
||||||
'title' => 'post-title',
|
'title' => 'post-title',
|
||||||
'phame_title' => 'post-phame-title',
|
'phame_title' => 'post-phame-title',
|
||||||
'uri' => '/phame/post/preview/',
|
|
||||||
));
|
));
|
||||||
|
|
||||||
$form_box = id(new PHUIObjectBoxView())
|
$form_box = id(new PHUIObjectBoxView())
|
||||||
|
@ -214,7 +204,7 @@ final class PhamePostEditController extends PhamePostController {
|
||||||
->appendChild(
|
->appendChild(
|
||||||
array(
|
array(
|
||||||
$form_box,
|
$form_box,
|
||||||
$preview_panel,
|
$preview,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhamePostPreviewController extends PhamePostController {
|
|
||||||
|
|
||||||
protected function getSideNavFilter() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function handleRequest(AphrontRequest $request) {
|
|
||||||
$viewer = $request->getViewer();
|
|
||||||
$body = $request->getStr('body');
|
|
||||||
|
|
||||||
$post = id(new PhamePost())
|
|
||||||
->setBody($body);
|
|
||||||
|
|
||||||
$content = PhabricatorMarkupEngine::renderOneObject(
|
|
||||||
$post,
|
|
||||||
PhamePost::MARKUP_FIELD_BODY,
|
|
||||||
$viewer);
|
|
||||||
|
|
||||||
$content = phutil_tag_div('phabricator-remarkup', $content);
|
|
||||||
|
|
||||||
return id(new AphrontAjaxResponse())->setContent($content);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -157,14 +157,6 @@ final class PhamePostViewController extends PhamePostController {
|
||||||
->setWorkflow(true));
|
->setWorkflow(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
$actions->addAction(
|
|
||||||
id(new PhabricatorActionView())
|
|
||||||
->setIcon('fa-times')
|
|
||||||
->setHref($this->getApplicationURI('post/delete/'.$id.'/'))
|
|
||||||
->setName(pht('Delete Post'))
|
|
||||||
->setDisabled(!$can_edit)
|
|
||||||
->setWorkflow(true));
|
|
||||||
|
|
||||||
$blog = $post->getBlog();
|
$blog = $post->getBlog();
|
||||||
$can_view_live = $blog && !$post->isDraft();
|
$can_view_live = $blog && !$post->isDraft();
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ final class PhameBlogEditor
|
||||||
$types[] = PhameBlogTransaction::TYPE_DESCRIPTION;
|
$types[] = PhameBlogTransaction::TYPE_DESCRIPTION;
|
||||||
$types[] = PhameBlogTransaction::TYPE_DOMAIN;
|
$types[] = PhameBlogTransaction::TYPE_DOMAIN;
|
||||||
$types[] = PhameBlogTransaction::TYPE_SKIN;
|
$types[] = PhameBlogTransaction::TYPE_SKIN;
|
||||||
|
$types[] = PhameBlogTransaction::TYPE_STATUS;
|
||||||
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
|
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
|
||||||
$types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
|
$types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
|
||||||
|
|
||||||
|
@ -37,6 +38,8 @@ final class PhameBlogEditor
|
||||||
return $object->getDomain();
|
return $object->getDomain();
|
||||||
case PhameBlogTransaction::TYPE_SKIN:
|
case PhameBlogTransaction::TYPE_SKIN:
|
||||||
return $object->getSkin();
|
return $object->getSkin();
|
||||||
|
case PhameBlogTransaction::TYPE_STATUS:
|
||||||
|
return $object->getStatus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +52,7 @@ final class PhameBlogEditor
|
||||||
case PhameBlogTransaction::TYPE_DESCRIPTION:
|
case PhameBlogTransaction::TYPE_DESCRIPTION:
|
||||||
case PhameBlogTransaction::TYPE_DOMAIN:
|
case PhameBlogTransaction::TYPE_DOMAIN:
|
||||||
case PhameBlogTransaction::TYPE_SKIN:
|
case PhameBlogTransaction::TYPE_SKIN:
|
||||||
|
case PhameBlogTransaction::TYPE_STATUS:
|
||||||
return $xaction->getNewValue();
|
return $xaction->getNewValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,6 +70,8 @@ final class PhameBlogEditor
|
||||||
return $object->setDomain($xaction->getNewValue());
|
return $object->setDomain($xaction->getNewValue());
|
||||||
case PhameBlogTransaction::TYPE_SKIN:
|
case PhameBlogTransaction::TYPE_SKIN:
|
||||||
return $object->setSkin($xaction->getNewValue());
|
return $object->setSkin($xaction->getNewValue());
|
||||||
|
case PhameBlogTransaction::TYPE_STATUS:
|
||||||
|
return $object->setStatus($xaction->getNewValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::applyCustomInternalTransaction($object, $xaction);
|
return parent::applyCustomInternalTransaction($object, $xaction);
|
||||||
|
@ -80,6 +86,7 @@ final class PhameBlogEditor
|
||||||
case PhameBlogTransaction::TYPE_DESCRIPTION:
|
case PhameBlogTransaction::TYPE_DESCRIPTION:
|
||||||
case PhameBlogTransaction::TYPE_DOMAIN:
|
case PhameBlogTransaction::TYPE_DOMAIN:
|
||||||
case PhameBlogTransaction::TYPE_SKIN:
|
case PhameBlogTransaction::TYPE_SKIN:
|
||||||
|
case PhameBlogTransaction::TYPE_STATUS:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ final class PhameBlogQuery extends PhabricatorCursorPagedPolicyAwareQuery {
|
||||||
private $ids;
|
private $ids;
|
||||||
private $phids;
|
private $phids;
|
||||||
private $domain;
|
private $domain;
|
||||||
|
private $statuses;
|
||||||
private $needBloggers;
|
private $needBloggers;
|
||||||
|
|
||||||
public function withIDs(array $ids) {
|
public function withIDs(array $ids) {
|
||||||
|
@ -22,6 +23,11 @@ final class PhameBlogQuery extends PhabricatorCursorPagedPolicyAwareQuery {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function withStatuses(array $status) {
|
||||||
|
$this->statuses = $status;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function newResultObject() {
|
public function newResultObject() {
|
||||||
return new PhameBlog();
|
return new PhameBlog();
|
||||||
}
|
}
|
||||||
|
@ -33,6 +39,13 @@ final class PhameBlogQuery extends PhabricatorCursorPagedPolicyAwareQuery {
|
||||||
protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
|
protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
|
||||||
$where = parent::buildWhereClauseParts($conn);
|
$where = parent::buildWhereClauseParts($conn);
|
||||||
|
|
||||||
|
if ($this->statuses !== null) {
|
||||||
|
$where[] = qsprintf(
|
||||||
|
$conn,
|
||||||
|
'status IN (%Ls)',
|
||||||
|
$this->statuses);
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->ids !== null) {
|
if ($this->ids !== null) {
|
||||||
$where[] = qsprintf(
|
$where[] = qsprintf(
|
||||||
$conn,
|
$conn,
|
||||||
|
|
|
@ -17,11 +17,23 @@ final class PhameBlogSearchEngine
|
||||||
|
|
||||||
protected function buildQueryFromParameters(array $map) {
|
protected function buildQueryFromParameters(array $map) {
|
||||||
$query = $this->newQuery();
|
$query = $this->newQuery();
|
||||||
|
if ($map['statuses']) {
|
||||||
|
$query->withStatuses(array($map['statuses']));
|
||||||
|
}
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function buildCustomSearchFields() {
|
protected function buildCustomSearchFields() {
|
||||||
return array();
|
return array(
|
||||||
|
id(new PhabricatorSearchSelectField())
|
||||||
|
->setKey('statuses')
|
||||||
|
->setLabel(pht('Status'))
|
||||||
|
->setOptions(array(
|
||||||
|
'' => pht('All'),
|
||||||
|
PhameBlog::STATUS_ACTIVE => pht('Active'),
|
||||||
|
PhameBlog::STATUS_ARCHIVED => pht('Archived'),
|
||||||
|
)),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getURI($path) {
|
protected function getURI($path) {
|
||||||
|
@ -30,6 +42,8 @@ final class PhameBlogSearchEngine
|
||||||
|
|
||||||
protected function getBuiltinQueryNames() {
|
protected function getBuiltinQueryNames() {
|
||||||
$names = array(
|
$names = array(
|
||||||
|
'active' => pht('Active Blogs'),
|
||||||
|
'archived' => pht('Archived Blogs'),
|
||||||
'all' => pht('All Blogs'),
|
'all' => pht('All Blogs'),
|
||||||
);
|
);
|
||||||
return $names;
|
return $names;
|
||||||
|
@ -42,6 +56,12 @@ final class PhameBlogSearchEngine
|
||||||
switch ($query_key) {
|
switch ($query_key) {
|
||||||
case 'all':
|
case 'all':
|
||||||
return $query;
|
return $query;
|
||||||
|
case 'active':
|
||||||
|
return $query->setParameter(
|
||||||
|
'statuses', PhameBlog::STATUS_ACTIVE);
|
||||||
|
case 'archived':
|
||||||
|
return $query->setParameter(
|
||||||
|
'statuses', PhameBlog::STATUS_ARCHIVED);
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::buildSavedQueryFromBuiltin($query_key);
|
return parent::buildSavedQueryFromBuiltin($query_key);
|
||||||
|
@ -58,12 +78,19 @@ final class PhameBlogSearchEngine
|
||||||
$list->setUser($viewer);
|
$list->setUser($viewer);
|
||||||
|
|
||||||
foreach ($blogs as $blog) {
|
foreach ($blogs as $blog) {
|
||||||
|
$archived = false;
|
||||||
|
$icon = 'fa-star';
|
||||||
|
if ($blog->isArchived()) {
|
||||||
|
$archived = true;
|
||||||
|
$icon = 'fa-ban';
|
||||||
|
}
|
||||||
$id = $blog->getID();
|
$id = $blog->getID();
|
||||||
$item = id(new PHUIObjectItemView())
|
$item = id(new PHUIObjectItemView())
|
||||||
->setUser($viewer)
|
->setUser($viewer)
|
||||||
->setObject($blog)
|
->setObject($blog)
|
||||||
->setHeader($blog->getName())
|
->setHeader($blog->getName())
|
||||||
->setStatusIcon('fa-star')
|
->setStatusIcon($icon)
|
||||||
|
->setDisabled($archived)
|
||||||
->setHref($this->getApplicationURI("/blog/view/{$id}/"))
|
->setHref($this->getApplicationURI("/blog/view/{$id}/"))
|
||||||
->addAttribute($blog->getSkin())
|
->addAttribute($blog->getSkin())
|
||||||
->addAttribute($blog->getDomain());
|
->addAttribute($blog->getDomain());
|
||||||
|
|
|
@ -20,10 +20,14 @@ final class PhameBlog extends PhameDAO
|
||||||
protected $creatorPHID;
|
protected $creatorPHID;
|
||||||
protected $viewPolicy;
|
protected $viewPolicy;
|
||||||
protected $editPolicy;
|
protected $editPolicy;
|
||||||
|
protected $status;
|
||||||
protected $mailKey;
|
protected $mailKey;
|
||||||
|
|
||||||
private static $requestBlog;
|
private static $requestBlog;
|
||||||
|
|
||||||
|
const STATUS_ACTIVE = 'active';
|
||||||
|
const STATUS_ARCHIVED = 'archived';
|
||||||
|
|
||||||
protected function getConfiguration() {
|
protected function getConfiguration() {
|
||||||
return array(
|
return array(
|
||||||
self::CONFIG_AUX_PHID => true,
|
self::CONFIG_AUX_PHID => true,
|
||||||
|
@ -34,6 +38,7 @@ final class PhameBlog extends PhameDAO
|
||||||
'name' => 'text64',
|
'name' => 'text64',
|
||||||
'description' => 'text',
|
'description' => 'text',
|
||||||
'domain' => 'text128?',
|
'domain' => 'text128?',
|
||||||
|
'status' => 'text32',
|
||||||
'mailKey' => 'bytes20',
|
'mailKey' => 'bytes20',
|
||||||
|
|
||||||
// T6203/NULLABILITY
|
// T6203/NULLABILITY
|
||||||
|
@ -70,6 +75,7 @@ final class PhameBlog extends PhameDAO
|
||||||
public static function initializeNewBlog(PhabricatorUser $actor) {
|
public static function initializeNewBlog(PhabricatorUser $actor) {
|
||||||
$blog = id(new PhameBlog())
|
$blog = id(new PhameBlog())
|
||||||
->setCreatorPHID($actor->getPHID())
|
->setCreatorPHID($actor->getPHID())
|
||||||
|
->setStatus(self::STATUS_ACTIVE)
|
||||||
->setViewPolicy(PhabricatorPolicies::getMostOpenPolicy())
|
->setViewPolicy(PhabricatorPolicies::getMostOpenPolicy())
|
||||||
->setEditPolicy(PhabricatorPolicies::POLICY_USER);
|
->setEditPolicy(PhabricatorPolicies::POLICY_USER);
|
||||||
return $blog;
|
return $blog;
|
||||||
|
@ -98,6 +104,17 @@ final class PhameBlog extends PhameDAO
|
||||||
return $skin;
|
return $skin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isArchived() {
|
||||||
|
return ($this->getStatus() == self::STATUS_ARCHIVED);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getStatusNameMap() {
|
||||||
|
return array(
|
||||||
|
self::STATUS_ACTIVE => pht('Active'),
|
||||||
|
self::STATUS_ARCHIVED => pht('Archived'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Makes sure a given custom blog uri is properly configured in DNS
|
* Makes sure a given custom blog uri is properly configured in DNS
|
||||||
* to point at this Phabricator instance. If there is an error in
|
* to point at this Phabricator instance. If there is an error in
|
||||||
|
|
|
@ -7,6 +7,7 @@ final class PhameBlogTransaction
|
||||||
const TYPE_DESCRIPTION = 'phame.blog.description';
|
const TYPE_DESCRIPTION = 'phame.blog.description';
|
||||||
const TYPE_DOMAIN = 'phame.blog.domain';
|
const TYPE_DOMAIN = 'phame.blog.domain';
|
||||||
const TYPE_SKIN = 'phame.blog.skin';
|
const TYPE_SKIN = 'phame.blog.skin';
|
||||||
|
const TYPE_STATUS = 'phame.blog.status';
|
||||||
|
|
||||||
const MAILTAG_DETAILS = 'phame-blog-details';
|
const MAILTAG_DETAILS = 'phame-blog-details';
|
||||||
const MAILTAG_SUBSCRIBERS = 'phame-blog-subscribers';
|
const MAILTAG_SUBSCRIBERS = 'phame-blog-subscribers';
|
||||||
|
@ -106,6 +107,18 @@ final class PhameBlogTransaction
|
||||||
$this->renderHandleLink($author_phid),
|
$this->renderHandleLink($author_phid),
|
||||||
$new);
|
$new);
|
||||||
break;
|
break;
|
||||||
|
case self::TYPE_STATUS:
|
||||||
|
switch ($new) {
|
||||||
|
case PhameBlog::STATUS_ACTIVE:
|
||||||
|
return pht(
|
||||||
|
'%s published this blog.',
|
||||||
|
$this->renderHandleLink($author_phid));
|
||||||
|
case PhameBlog::STATUS_ARCHIVED:
|
||||||
|
return pht(
|
||||||
|
'%s archived this blog.',
|
||||||
|
$this->renderHandleLink($author_phid));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::getTitle();
|
return parent::getTitle();
|
||||||
|
@ -151,6 +164,21 @@ final class PhameBlogTransaction
|
||||||
$this->renderHandleLink($author_phid),
|
$this->renderHandleLink($author_phid),
|
||||||
$this->renderHandleLink($object_phid));
|
$this->renderHandleLink($object_phid));
|
||||||
break;
|
break;
|
||||||
|
case self::TYPE_STATUS:
|
||||||
|
switch ($new) {
|
||||||
|
case PhameBlog::STATUS_ACTIVE:
|
||||||
|
return pht(
|
||||||
|
'%s published the blog %s.',
|
||||||
|
$this->renderHandleLink($author_phid),
|
||||||
|
$this->renderHandleLink($object_phid));
|
||||||
|
case PhameBlog::STATUS_ARCHIVED:
|
||||||
|
return pht(
|
||||||
|
'%s archived the blog %s.',
|
||||||
|
$this->renderHandleLink($author_phid),
|
||||||
|
$this->renderHandleLink($object_phid));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::getTitleForFeed();
|
return parent::getTitleForFeed();
|
||||||
|
|
|
@ -32,6 +32,7 @@ final class PhrictionDocumentController
|
||||||
$move_notice = '';
|
$move_notice = '';
|
||||||
$properties = null;
|
$properties = null;
|
||||||
$content = null;
|
$content = null;
|
||||||
|
$toc = null;
|
||||||
|
|
||||||
if (!$document) {
|
if (!$document) {
|
||||||
|
|
||||||
|
@ -53,6 +54,7 @@ final class PhrictionDocumentController
|
||||||
$page_title = pht('Page Not Found');
|
$page_title = pht('Page Not Found');
|
||||||
} else {
|
} else {
|
||||||
$version = $request->getInt('v');
|
$version = $request->getInt('v');
|
||||||
|
|
||||||
if ($version) {
|
if ($version) {
|
||||||
$content = id(new PhrictionContent())->loadOneWhere(
|
$content = id(new PhrictionContent())->loadOneWhere(
|
||||||
'documentID = %d AND version = %d',
|
'documentID = %d AND version = %d',
|
||||||
|
@ -74,7 +76,6 @@ final class PhrictionDocumentController
|
||||||
$content = id(new PhrictionContent())->load($document->getContentID());
|
$content = id(new PhrictionContent())->load($document->getContentID());
|
||||||
}
|
}
|
||||||
$page_title = $content->getTitle();
|
$page_title = $content->getTitle();
|
||||||
|
|
||||||
$properties = $this
|
$properties = $this
|
||||||
->buildPropertyListView($document, $content, $slug);
|
->buildPropertyListView($document, $content, $slug);
|
||||||
|
|
||||||
|
@ -84,6 +85,8 @@ final class PhrictionDocumentController
|
||||||
$current_status == PhrictionChangeType::CHANGE_MOVE_HERE) {
|
$current_status == PhrictionChangeType::CHANGE_MOVE_HERE) {
|
||||||
|
|
||||||
$core_content = $content->renderContent($viewer);
|
$core_content = $content->renderContent($viewer);
|
||||||
|
$toc = $this->getToc($content);
|
||||||
|
|
||||||
} else if ($current_status == PhrictionChangeType::CHANGE_DELETE) {
|
} else if ($current_status == PhrictionChangeType::CHANGE_DELETE) {
|
||||||
$notice = new PHUIInfoView();
|
$notice = new PHUIInfoView();
|
||||||
$notice->setSeverity(PHUIInfoView::SEVERITY_NOTICE);
|
$notice->setSeverity(PHUIInfoView::SEVERITY_NOTICE);
|
||||||
|
@ -102,7 +105,6 @@ final class PhrictionDocumentController
|
||||||
$core_content = $notice->render();
|
$core_content = $notice->render();
|
||||||
} else if ($current_status == PhrictionChangeType::CHANGE_MOVE_AWAY) {
|
} else if ($current_status == PhrictionChangeType::CHANGE_MOVE_AWAY) {
|
||||||
$new_doc_id = $content->getChangeRef();
|
$new_doc_id = $content->getChangeRef();
|
||||||
|
|
||||||
$slug_uri = null;
|
$slug_uri = null;
|
||||||
|
|
||||||
// If the new document exists and the viewer can see it, provide a link
|
// If the new document exists and the viewer can see it, provide a link
|
||||||
|
@ -212,11 +214,12 @@ final class PhrictionDocumentController
|
||||||
$prop_list->addPropertyList($properties);
|
$prop_list->addPropertyList($properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
$page_content = id(new PHUIDocumentView())
|
$page_content = id(new PHUIDocumentViewPro())
|
||||||
->setHeader($header)
|
->setHeader($header)
|
||||||
|
->setPropertyList($prop_list)
|
||||||
|
->setToc($toc)
|
||||||
->appendChild(
|
->appendChild(
|
||||||
array(
|
array(
|
||||||
$prop_list,
|
|
||||||
$version_note,
|
$version_note,
|
||||||
$move_notice,
|
$move_notice,
|
||||||
$core_content,
|
$core_content,
|
||||||
|
@ -230,7 +233,8 @@ final class PhrictionDocumentController
|
||||||
),
|
),
|
||||||
array(
|
array(
|
||||||
'pageObjects' => array($document->getPHID()),
|
'pageObjects' => array($document->getPHID()),
|
||||||
'title' => $page_title,
|
'title' => $page_title,
|
||||||
|
'class' => 'pro-white-background',
|
||||||
));
|
));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -278,6 +282,7 @@ final class PhrictionDocumentController
|
||||||
$action_view->addAction(
|
$action_view->addAction(
|
||||||
id(new PhabricatorActionView())
|
id(new PhabricatorActionView())
|
||||||
->setName(pht('Edit Document'))
|
->setName(pht('Edit Document'))
|
||||||
|
->setDisabled(!$can_edit)
|
||||||
->setIcon('fa-pencil')
|
->setIcon('fa-pencil')
|
||||||
->setHref('/phriction/edit/'.$document->getID().'/'));
|
->setHref('/phriction/edit/'.$document->getID().'/'));
|
||||||
|
|
||||||
|
@ -285,6 +290,7 @@ final class PhrictionDocumentController
|
||||||
$action_view->addAction(
|
$action_view->addAction(
|
||||||
id(new PhabricatorActionView())
|
id(new PhabricatorActionView())
|
||||||
->setName(pht('Move Document'))
|
->setName(pht('Move Document'))
|
||||||
|
->setDisabled(!$can_edit)
|
||||||
->setIcon('fa-arrows')
|
->setIcon('fa-arrows')
|
||||||
->setHref('/phriction/move/'.$document->getID().'/')
|
->setHref('/phriction/move/'.$document->getID().'/')
|
||||||
->setWorkflow(true));
|
->setWorkflow(true));
|
||||||
|
@ -292,6 +298,7 @@ final class PhrictionDocumentController
|
||||||
$action_view->addAction(
|
$action_view->addAction(
|
||||||
id(new PhabricatorActionView())
|
id(new PhabricatorActionView())
|
||||||
->setName(pht('Delete Document'))
|
->setName(pht('Delete Document'))
|
||||||
|
->setDisabled(!$can_edit)
|
||||||
->setIcon('fa-times')
|
->setIcon('fa-times')
|
||||||
->setHref('/phriction/delete/'.$document->getID().'/')
|
->setHref('/phriction/delete/'.$document->getID().'/')
|
||||||
->setWorkflow(true));
|
->setWorkflow(true));
|
||||||
|
@ -431,7 +438,7 @@ final class PhrictionDocumentController
|
||||||
),
|
),
|
||||||
$list)));
|
$list)));
|
||||||
|
|
||||||
return phutil_tag_div('phui-document-box', $box);
|
return phutil_tag_div('phui-document-view-pro-box', $box);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function renderChildDocumentLink(array $info) {
|
private function renderChildDocumentLink(array $info) {
|
||||||
|
@ -454,4 +461,17 @@ final class PhrictionDocumentController
|
||||||
return $this->slug;
|
return $this->slug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getToc(PhrictionContent $content) {
|
||||||
|
$toc = $content->getRenderedTableOfContents();
|
||||||
|
if ($toc) {
|
||||||
|
$toc = phutil_tag_div('phui-document-toc-content', array(
|
||||||
|
phutil_tag_div(
|
||||||
|
'phui-document-toc-header',
|
||||||
|
pht('Contents')),
|
||||||
|
$toc,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return $toc;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -268,10 +268,10 @@ final class PhrictionEditController
|
||||||
->setForm($form);
|
->setForm($form);
|
||||||
|
|
||||||
$preview = id(new PHUIRemarkupPreviewPanel())
|
$preview = id(new PHUIRemarkupPreviewPanel())
|
||||||
->setHeader(pht('Document Preview'))
|
->setHeader($content->getTitle())
|
||||||
->setPreviewURI('/phriction/preview/')
|
->setPreviewURI('/phriction/preview/')
|
||||||
->setControlID('document-textarea')
|
->setControlID('document-textarea')
|
||||||
->addClass('phui-document-view');
|
->setPreviewType(PHUIRemarkupPreviewPanel::DOCUMENT);
|
||||||
|
|
||||||
$crumbs = $this->buildApplicationCrumbs();
|
$crumbs = $this->buildApplicationCrumbs();
|
||||||
if ($document->getID()) {
|
if ($document->getID()) {
|
||||||
|
|
|
@ -419,7 +419,7 @@ final class PhrictionTransactionEditor
|
||||||
$body = parent::buildMailBody($object, $xactions);
|
$body = parent::buildMailBody($object, $xactions);
|
||||||
|
|
||||||
if ($this->getIsNewObject()) {
|
if ($this->getIsNewObject()) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('DOCUMENT CONTENT'),
|
pht('DOCUMENT CONTENT'),
|
||||||
$object->getContent()->getContent());
|
$object->getContent()->getContent());
|
||||||
} else if ($this->contentDiffURI) {
|
} else if ($this->contentDiffURI) {
|
||||||
|
|
|
@ -21,6 +21,8 @@ final class PhrictionContent extends PhrictionDAO
|
||||||
protected $changeType;
|
protected $changeType;
|
||||||
protected $changeRef;
|
protected $changeRef;
|
||||||
|
|
||||||
|
private $renderedTableOfContents;
|
||||||
|
|
||||||
public function renderContent(PhabricatorUser $viewer) {
|
public function renderContent(PhabricatorUser $viewer) {
|
||||||
return PhabricatorMarkupEngine::renderOneObject(
|
return PhabricatorMarkupEngine::renderOneObject(
|
||||||
$this,
|
$this,
|
||||||
|
@ -98,27 +100,22 @@ final class PhrictionContent extends PhrictionDAO
|
||||||
$output,
|
$output,
|
||||||
PhutilMarkupEngine $engine) {
|
PhutilMarkupEngine $engine) {
|
||||||
|
|
||||||
$classes = array();
|
$this->renderedTableOfContents =
|
||||||
$classes[] = 'phabricator-remarkup';
|
PhutilRemarkupHeaderBlockRule::renderTableOfContents($engine);
|
||||||
$toc = PhutilRemarkupHeaderBlockRule::renderTableOfContents(
|
|
||||||
$engine);
|
|
||||||
|
|
||||||
if ($toc) {
|
|
||||||
$classes[] = 'remarkup-has-toc';
|
|
||||||
$toc = phutil_tag_div('phabricator-remarkup-toc', array(
|
|
||||||
phutil_tag_div(
|
|
||||||
'phabricator-remarkup-toc-header',
|
|
||||||
pht('Table of Contents')),
|
|
||||||
$toc,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
return phutil_tag(
|
return phutil_tag(
|
||||||
'div',
|
'div',
|
||||||
array(
|
array(
|
||||||
'class' => implode(' ', $classes),
|
'class' => 'phabricator-remarkup',
|
||||||
),
|
),
|
||||||
array($toc, $output));
|
$output);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @task markup
|
||||||
|
*/
|
||||||
|
public function getRenderedTableOfContents() {
|
||||||
|
return $this->renderedTableOfContents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -236,7 +236,7 @@ final class PhabricatorPhurlURLEditor
|
||||||
$body = parent::buildMailBody($object, $xactions);
|
$body = parent::buildMailBody($object, $xactions);
|
||||||
|
|
||||||
if (strlen($description)) {
|
if (strlen($description)) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('URL DESCRIPTION'),
|
pht('URL DESCRIPTION'),
|
||||||
$object->getDescription());
|
$object->getDescription());
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ final class PonderAnswerEditor extends PonderEditor {
|
||||||
$types = parent::getTransactionTypes();
|
$types = parent::getTransactionTypes();
|
||||||
|
|
||||||
$types[] = PhabricatorTransactions::TYPE_COMMENT;
|
$types[] = PhabricatorTransactions::TYPE_COMMENT;
|
||||||
|
$types[] = PhabricatorTransactions::TYPE_EDGE;
|
||||||
|
|
||||||
$types[] = PonderAnswerTransaction::TYPE_CONTENT;
|
$types[] = PonderAnswerTransaction::TYPE_CONTENT;
|
||||||
$types[] = PonderAnswerTransaction::TYPE_STATUS;
|
$types[] = PonderAnswerTransaction::TYPE_STATUS;
|
||||||
|
|
|
@ -20,17 +20,13 @@ final class ProjectRemarkupRule extends PhabricatorObjectRemarkupRule {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getObjectIDPattern() {
|
protected function getObjectIDPattern() {
|
||||||
// NOTE: This explicitly does not match strings which contain only
|
// NOTE: The latter half of this rule matches monograms with internal
|
||||||
// digits, because digit strings like "#123" are used to reference tasks at
|
// periods, like `#domain.com`, but does not match monograms with terminal
|
||||||
// Facebook and are somewhat conventional in general.
|
// periods, because they're probably just puncutation.
|
||||||
|
|
||||||
// The latter half of this rule matches monograms with internal periods,
|
|
||||||
// like `#domain.com`, but does not match monograms with terminal periods,
|
|
||||||
// because they're probably just puncutation.
|
|
||||||
|
|
||||||
// Broadly, this will not match every possible project monogram, and we
|
// Broadly, this will not match every possible project monogram, and we
|
||||||
// accept some false negatives -- like `#1` or `#dot.` -- in order to avoid
|
// accept some false negatives -- like `#dot.` -- in order to avoid a bunch
|
||||||
// a bunch of false positives on general use of the `#` character.
|
// of false positives on general use of the `#` character.
|
||||||
|
|
||||||
// In other contexts, the PhabricatorProjectProjectPHIDType pattern is
|
// In other contexts, the PhabricatorProjectProjectPHIDType pattern is
|
||||||
// controlling and these names should parse correctly.
|
// controlling and these names should parse correctly.
|
||||||
|
@ -38,17 +34,14 @@ final class ProjectRemarkupRule extends PhabricatorObjectRemarkupRule {
|
||||||
// These characters may never appear anywhere in a hashtag.
|
// These characters may never appear anywhere in a hashtag.
|
||||||
$never = '\s?!,:;{}#\\(\\)"\'';
|
$never = '\s?!,:;{}#\\(\\)"\'';
|
||||||
|
|
||||||
// These characters may not appear at the beginning.
|
// These characters may not appear at the edge of the string.
|
||||||
$never_first = '.\d';
|
$never_edge = '.';
|
||||||
|
|
||||||
// These characters may not appear at the end.
|
|
||||||
$never_last = '.';
|
|
||||||
|
|
||||||
return
|
return
|
||||||
'[^'.$never_first.$never.']+'.
|
'[^'.$never_edge.$never.']+'.
|
||||||
'(?:'.
|
'(?:'.
|
||||||
'[^'.$never.']*'.
|
'[^'.$never.']*'.
|
||||||
'[^'.$never_last.$never.']+'.
|
'[^'.$never_edge.$never.']+'.
|
||||||
')*';
|
')*';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,21 @@ final class ProjectRemarkupRuleTestCase extends PhabricatorTestCase {
|
||||||
),
|
),
|
||||||
'#123' => array(
|
'#123' => array(
|
||||||
'embed' => array(),
|
'embed' => array(),
|
||||||
'ref' => array(),
|
'ref' => array(
|
||||||
|
array(
|
||||||
|
'offset' => 1,
|
||||||
|
'id' => '123',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'#2x4' => array(
|
||||||
|
'embed' => array(),
|
||||||
|
'ref' => array(
|
||||||
|
array(
|
||||||
|
'offset' => 1,
|
||||||
|
'id' => '2x4',
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
'#security#123' => array(
|
'#security#123' => array(
|
||||||
'embed' => array(),
|
'embed' => array(),
|
||||||
|
|
|
@ -249,7 +249,7 @@ final class ReleephRequestTransactionalEditor
|
||||||
if ($has_pick_failure) {
|
if ($has_pick_failure) {
|
||||||
$instructions = $releeph_project->getDetail('pick_failure_instructions');
|
$instructions = $releeph_project->getDetail('pick_failure_instructions');
|
||||||
if ($instructions) {
|
if ($instructions) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('PICK FAILURE INSTRUCTIONS'),
|
pht('PICK FAILURE INSTRUCTIONS'),
|
||||||
$instructions);
|
$instructions);
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,7 @@ final class PhabricatorSlowvoteEditor
|
||||||
$description = $object->getDescription();
|
$description = $object->getDescription();
|
||||||
|
|
||||||
if (strlen($description)) {
|
if (strlen($description)) {
|
||||||
$body->addTextSection(
|
$body->addRemarkupSection(
|
||||||
pht('SLOWVOTE DESCRIPTION'),
|
pht('SLOWVOTE DESCRIPTION'),
|
||||||
$object->getDescription());
|
$object->getDescription());
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,12 @@ final class PhabricatorTransactionsApplication extends PhabricatorApplication {
|
||||||
'PhabricatorEditEngineConfigurationViewController',
|
'PhabricatorEditEngineConfigurationViewController',
|
||||||
'save/(?P<key>[^/]+)/' =>
|
'save/(?P<key>[^/]+)/' =>
|
||||||
'PhabricatorEditEngineConfigurationSaveController',
|
'PhabricatorEditEngineConfigurationSaveController',
|
||||||
|
'reorder/(?P<key>[^/]+)/' =>
|
||||||
|
'PhabricatorEditEngineConfigurationReorderController',
|
||||||
|
'defaults/(?P<key>[^/]+)/' =>
|
||||||
|
'PhabricatorEditEngineConfigurationDefaultsController',
|
||||||
|
'lock/(?P<key>[^/]+)/' =>
|
||||||
|
'PhabricatorEditEngineConfigurationLockController',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorEditEngineConfigurationDefaultsController
|
||||||
|
extends PhabricatorEditEngineController {
|
||||||
|
|
||||||
|
public function handleRequest(AphrontRequest $request) {
|
||||||
|
$engine_key = $request->getURIData('engineKey');
|
||||||
|
$this->setEngineKey($engine_key);
|
||||||
|
|
||||||
|
$key = $request->getURIData('key');
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
|
||||||
|
$config = id(new PhabricatorEditEngineConfigurationQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withEngineKeys(array($engine_key))
|
||||||
|
->withIdentifiers(array($key))
|
||||||
|
->requireCapabilities(
|
||||||
|
array(
|
||||||
|
PhabricatorPolicyCapability::CAN_VIEW,
|
||||||
|
PhabricatorPolicyCapability::CAN_EDIT,
|
||||||
|
))
|
||||||
|
->executeOne();
|
||||||
|
if (!$config) {
|
||||||
|
return id(new Aphront404Response());
|
||||||
|
}
|
||||||
|
|
||||||
|
$cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/";
|
||||||
|
|
||||||
|
$engine = $config->getEngine();
|
||||||
|
$fields = $engine->getFieldsForConfig($config);
|
||||||
|
|
||||||
|
foreach ($fields as $key => $field) {
|
||||||
|
if (!$field->getIsDefaultable()) {
|
||||||
|
unset($fields[$key]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$field->setIsEditDefaults(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($request->isFormPost()) {
|
||||||
|
$xactions = array();
|
||||||
|
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$field->readValueFromSubmit($request);
|
||||||
|
}
|
||||||
|
|
||||||
|
$type = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT;
|
||||||
|
|
||||||
|
$xactions = array();
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$new_value = $field->getValueForDefaults();
|
||||||
|
$xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())
|
||||||
|
->setTransactionType($type)
|
||||||
|
->setMetadataValue('field.key', $field->getKey())
|
||||||
|
->setNewValue($new_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
$editor = id(new PhabricatorEditEngineConfigurationEditor())
|
||||||
|
->setActor($viewer)
|
||||||
|
->setContentSourceFromRequest($request)
|
||||||
|
->setContinueOnMissingFields(true)
|
||||||
|
->setContinueOnNoEffect(true);
|
||||||
|
|
||||||
|
$editor->applyTransactions($config, $xactions);
|
||||||
|
|
||||||
|
return id(new AphrontRedirectResponse())
|
||||||
|
->setURI($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
$title = pht('Edit Form Defaults');
|
||||||
|
|
||||||
|
$form = id(new AphrontFormView())
|
||||||
|
->setUser($viewer);
|
||||||
|
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$field->appendToForm($form);
|
||||||
|
}
|
||||||
|
|
||||||
|
$form
|
||||||
|
->appendControl(
|
||||||
|
id(new AphrontFormSubmitControl())
|
||||||
|
->setValue(pht('Save Defaults'))
|
||||||
|
->addCancelButton($cancel_uri));
|
||||||
|
|
||||||
|
$info = id(new PHUIInfoView())
|
||||||
|
->setSeverity(PHUIInfoView::SEVERITY_NOTICE)
|
||||||
|
->setErrors(
|
||||||
|
array(
|
||||||
|
pht('You are editing the default values for this form.'),
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
$box = id(new PHUIObjectBoxView())
|
||||||
|
->setHeaderText($title)
|
||||||
|
->setInfoView($info)
|
||||||
|
->setForm($form);
|
||||||
|
|
||||||
|
$crumbs = $this->buildApplicationCrumbs();
|
||||||
|
$crumbs->addTextCrumb(pht('Form %d', $config->getID()), $cancel_uri);
|
||||||
|
$crumbs->addTextCrumb(pht('Edit Defaults'));
|
||||||
|
|
||||||
|
return $this->newPage()
|
||||||
|
->setTitle($title)
|
||||||
|
->setCrumbs($crumbs)
|
||||||
|
->appendChild($box);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorEditEngineConfigurationLockController
|
||||||
|
extends PhabricatorEditEngineController {
|
||||||
|
|
||||||
|
public function handleRequest(AphrontRequest $request) {
|
||||||
|
$engine_key = $request->getURIData('engineKey');
|
||||||
|
$this->setEngineKey($engine_key);
|
||||||
|
|
||||||
|
$key = $request->getURIData('key');
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
|
||||||
|
$config = id(new PhabricatorEditEngineConfigurationQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withEngineKeys(array($engine_key))
|
||||||
|
->withIdentifiers(array($key))
|
||||||
|
->requireCapabilities(
|
||||||
|
array(
|
||||||
|
PhabricatorPolicyCapability::CAN_VIEW,
|
||||||
|
PhabricatorPolicyCapability::CAN_EDIT,
|
||||||
|
))
|
||||||
|
->executeOne();
|
||||||
|
if (!$config) {
|
||||||
|
return id(new Aphront404Response());
|
||||||
|
}
|
||||||
|
|
||||||
|
$cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/";
|
||||||
|
|
||||||
|
if ($request->isFormPost()) {
|
||||||
|
$xactions = array();
|
||||||
|
|
||||||
|
$locks = $request->getArr('locks');
|
||||||
|
$type_locks = PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS;
|
||||||
|
|
||||||
|
$xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())
|
||||||
|
->setTransactionType($type_locks)
|
||||||
|
->setNewValue($locks);
|
||||||
|
|
||||||
|
$editor = id(new PhabricatorEditEngineConfigurationEditor())
|
||||||
|
->setActor($viewer)
|
||||||
|
->setContentSourceFromRequest($request)
|
||||||
|
->setContinueOnMissingFields(true)
|
||||||
|
->setContinueOnNoEffect(true);
|
||||||
|
|
||||||
|
$editor->applyTransactions($config, $xactions);
|
||||||
|
|
||||||
|
return id(new AphrontRedirectResponse())
|
||||||
|
->setURI($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
$engine = $config->getEngine();
|
||||||
|
$fields = $engine->getFieldsForConfig($config);
|
||||||
|
|
||||||
|
$help = pht(<<<EOTEXT
|
||||||
|
**Locked** fields are visible in the form, but their values can not be changed
|
||||||
|
by the user.
|
||||||
|
|
||||||
|
**Hidden** fields are not visible in the form.
|
||||||
|
|
||||||
|
Any assigned default values are still respected, even if the field is locked
|
||||||
|
or hidden.
|
||||||
|
EOTEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
$form = id(new AphrontFormView())
|
||||||
|
->setUser($viewer)
|
||||||
|
->appendRemarkupInstructions($help);
|
||||||
|
|
||||||
|
$locks = $config->getFieldLocks();
|
||||||
|
|
||||||
|
$lock_visible = PhabricatorEditEngineConfiguration::LOCK_VISIBLE;
|
||||||
|
$lock_locked = PhabricatorEditEngineConfiguration::LOCK_LOCKED;
|
||||||
|
$lock_hidden = PhabricatorEditEngineConfiguration::LOCK_HIDDEN;
|
||||||
|
|
||||||
|
$map = array(
|
||||||
|
$lock_visible => pht('Visible'),
|
||||||
|
$lock_locked => pht("\xF0\x9F\x94\x92 Locked"),
|
||||||
|
$lock_hidden => pht("\xE2\x9C\x98 Hidden"),
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
if (!$field->getIsLockable()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $field->getKey();
|
||||||
|
|
||||||
|
$label = $field->getLabel();
|
||||||
|
if (!strlen($label)) {
|
||||||
|
$label = $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($field->getIsHidden()) {
|
||||||
|
$value = $lock_hidden;
|
||||||
|
} else if ($field->getIsLocked()) {
|
||||||
|
$value = $lock_locked;
|
||||||
|
} else {
|
||||||
|
$value = $lock_visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
$form->appendControl(
|
||||||
|
id(new AphrontFormSelectControl())
|
||||||
|
->setName('locks['.$key.']')
|
||||||
|
->setLabel($label)
|
||||||
|
->setValue($value)
|
||||||
|
->setOptions($map));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->newDialog()
|
||||||
|
->setTitle(pht('Lock / Hide Fields'))
|
||||||
|
->setWidth(AphrontDialogView::WIDTH_FORM)
|
||||||
|
->appendForm($form)
|
||||||
|
->addSubmitButton(pht('Save Changes'))
|
||||||
|
->addCancelButton($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,123 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorEditEngineConfigurationReorderController
|
||||||
|
extends PhabricatorEditEngineController {
|
||||||
|
|
||||||
|
public function handleRequest(AphrontRequest $request) {
|
||||||
|
$engine_key = $request->getURIData('engineKey');
|
||||||
|
$this->setEngineKey($engine_key);
|
||||||
|
|
||||||
|
$key = $request->getURIData('key');
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
|
||||||
|
$config = id(new PhabricatorEditEngineConfigurationQuery())
|
||||||
|
->setViewer($viewer)
|
||||||
|
->withEngineKeys(array($engine_key))
|
||||||
|
->withIdentifiers(array($key))
|
||||||
|
->requireCapabilities(
|
||||||
|
array(
|
||||||
|
PhabricatorPolicyCapability::CAN_VIEW,
|
||||||
|
PhabricatorPolicyCapability::CAN_EDIT,
|
||||||
|
))
|
||||||
|
->executeOne();
|
||||||
|
if (!$config) {
|
||||||
|
return id(new Aphront404Response());
|
||||||
|
}
|
||||||
|
|
||||||
|
$cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/";
|
||||||
|
$reorder_uri = "/transactions/editengine/{$engine_key}/reorder/{$key}/";
|
||||||
|
|
||||||
|
if ($request->isFormPost()) {
|
||||||
|
$xactions = array();
|
||||||
|
$key_order = $request->getStrList('keyOrder');
|
||||||
|
|
||||||
|
$type_order = PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER;
|
||||||
|
|
||||||
|
$xactions[] = id(new PhabricatorEditEngineConfigurationTransaction())
|
||||||
|
->setTransactionType($type_order)
|
||||||
|
->setNewValue($key_order);
|
||||||
|
|
||||||
|
$editor = id(new PhabricatorEditEngineConfigurationEditor())
|
||||||
|
->setActor($viewer)
|
||||||
|
->setContentSourceFromRequest($request)
|
||||||
|
->setContinueOnMissingFields(true)
|
||||||
|
->setContinueOnNoEffect(true);
|
||||||
|
|
||||||
|
$editor->applyTransactions($config, $xactions);
|
||||||
|
|
||||||
|
return id(new AphrontRedirectResponse())
|
||||||
|
->setURI($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
$engine = $config->getEngine();
|
||||||
|
$fields = $engine->getFieldsForConfig($config);
|
||||||
|
|
||||||
|
$list_id = celerity_generate_unique_node_id();
|
||||||
|
$input_id = celerity_generate_unique_node_id();
|
||||||
|
|
||||||
|
$list = id(new PHUIObjectItemListView())
|
||||||
|
->setUser($viewer)
|
||||||
|
->setID($list_id)
|
||||||
|
->setFlush(true);
|
||||||
|
|
||||||
|
$key_order = array();
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
if (!$field->getIsReorderable()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$label = $field->getLabel();
|
||||||
|
$key = $field->getKey();
|
||||||
|
|
||||||
|
if ($label !== null) {
|
||||||
|
$header = $label;
|
||||||
|
} else {
|
||||||
|
$header = $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
$item = id(new PHUIObjectItemView())
|
||||||
|
->setHeader($header)
|
||||||
|
->setGrippable(true)
|
||||||
|
->addSigil('editengine-form-field')
|
||||||
|
->setMetadata(
|
||||||
|
array(
|
||||||
|
'fieldKey' => $key,
|
||||||
|
));
|
||||||
|
|
||||||
|
$list->addItem($item);
|
||||||
|
|
||||||
|
$key_order[] = $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
Javelin::initBehavior(
|
||||||
|
'editengine-reorder-fields',
|
||||||
|
array(
|
||||||
|
'listID' => $list_id,
|
||||||
|
'inputID' => $input_id,
|
||||||
|
'reorderURI' => $reorder_uri,
|
||||||
|
));
|
||||||
|
|
||||||
|
$note = id(new PHUIInfoView())
|
||||||
|
->appendChild(pht('Drag and drop fields to reorder them.'))
|
||||||
|
->setSeverity(PHUIInfoView::SEVERITY_NOTICE);
|
||||||
|
|
||||||
|
$input = phutil_tag(
|
||||||
|
'input',
|
||||||
|
array(
|
||||||
|
'type' => 'hidden',
|
||||||
|
'name' => 'keyOrder',
|
||||||
|
'value' => implode(', ', $key_order),
|
||||||
|
'id' => $input_id,
|
||||||
|
));
|
||||||
|
|
||||||
|
return $this->newDialog()
|
||||||
|
->setTitle(pht('Reorder Fields'))
|
||||||
|
->setWidth(AphrontDialogView::WIDTH_FORM)
|
||||||
|
->appendChild($note)
|
||||||
|
->appendChild($list)
|
||||||
|
->appendChild($input)
|
||||||
|
->addSubmitButton(pht('Save Changes'))
|
||||||
|
->addCancelButton($cancel_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -39,6 +39,8 @@ final class PhabricatorEditEngineConfigurationViewController
|
||||||
->setHeader($header)
|
->setHeader($header)
|
||||||
->addPropertyList($properties);
|
->addPropertyList($properties);
|
||||||
|
|
||||||
|
$field_list = $this->buildFieldList($config);
|
||||||
|
|
||||||
$crumbs = $this->buildApplicationCrumbs();
|
$crumbs = $this->buildApplicationCrumbs();
|
||||||
|
|
||||||
if ($is_concrete) {
|
if ($is_concrete) {
|
||||||
|
@ -62,6 +64,7 @@ final class PhabricatorEditEngineConfigurationViewController
|
||||||
->appendChild(
|
->appendChild(
|
||||||
array(
|
array(
|
||||||
$box,
|
$box,
|
||||||
|
$field_list,
|
||||||
$timeline,
|
$timeline,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -69,7 +72,8 @@ final class PhabricatorEditEngineConfigurationViewController
|
||||||
private function buildActionView(
|
private function buildActionView(
|
||||||
PhabricatorEditEngineConfiguration $config) {
|
PhabricatorEditEngineConfiguration $config) {
|
||||||
$viewer = $this->getViewer();
|
$viewer = $this->getViewer();
|
||||||
$engine_key = $this->getEngineKey();
|
$engine = $config->getEngine();
|
||||||
|
$engine_key = $engine->getEngineKey();
|
||||||
|
|
||||||
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
||||||
$viewer,
|
$viewer,
|
||||||
|
@ -79,13 +83,13 @@ final class PhabricatorEditEngineConfigurationViewController
|
||||||
$view = id(new PhabricatorActionListView())
|
$view = id(new PhabricatorActionListView())
|
||||||
->setUser($viewer);
|
->setUser($viewer);
|
||||||
|
|
||||||
$key = $config->getIdentifier();
|
$form_key = $config->getIdentifier();
|
||||||
|
|
||||||
$base_uri = "/transactions/editengine/{$engine_key}";
|
$base_uri = "/transactions/editengine/{$engine_key}";
|
||||||
|
|
||||||
$is_concrete = (bool)$config->getID();
|
$is_concrete = (bool)$config->getID();
|
||||||
if (!$is_concrete) {
|
if (!$is_concrete) {
|
||||||
$save_uri = "{$base_uri}/save/{$key}/";
|
$save_uri = "{$base_uri}/save/{$form_key}/";
|
||||||
|
|
||||||
$view->addAction(
|
$view->addAction(
|
||||||
id(new PhabricatorActionView())
|
id(new PhabricatorActionView())
|
||||||
|
@ -97,7 +101,7 @@ final class PhabricatorEditEngineConfigurationViewController
|
||||||
|
|
||||||
$can_edit = false;
|
$can_edit = false;
|
||||||
} else {
|
} else {
|
||||||
$edit_uri = "{$base_uri}/edit/{$key}/";
|
$edit_uri = "{$base_uri}/edit/{$form_key}/";
|
||||||
$view->addAction(
|
$view->addAction(
|
||||||
id(new PhabricatorActionView())
|
id(new PhabricatorActionView())
|
||||||
->setName(pht('Edit Form Configuration'))
|
->setName(pht('Edit Form Configuration'))
|
||||||
|
@ -107,6 +111,44 @@ final class PhabricatorEditEngineConfigurationViewController
|
||||||
->setHref($edit_uri));
|
->setHref($edit_uri));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$use_uri = $engine->getEditURI(null, "form/{$form_key}/");
|
||||||
|
|
||||||
|
$view->addAction(
|
||||||
|
id(new PhabricatorActionView())
|
||||||
|
->setName(pht('Use Form'))
|
||||||
|
->setIcon('fa-th-list')
|
||||||
|
->setHref($use_uri));
|
||||||
|
|
||||||
|
$defaults_uri = "{$base_uri}/defaults/{$form_key}/";
|
||||||
|
|
||||||
|
$view->addAction(
|
||||||
|
id(new PhabricatorActionView())
|
||||||
|
->setName(pht('Change Default Values'))
|
||||||
|
->setIcon('fa-paint-brush')
|
||||||
|
->setHref($defaults_uri)
|
||||||
|
->setWorkflow(!$can_edit)
|
||||||
|
->setDisabled(!$can_edit));
|
||||||
|
|
||||||
|
$reorder_uri = "{$base_uri}/reorder/{$form_key}/";
|
||||||
|
|
||||||
|
$view->addAction(
|
||||||
|
id(new PhabricatorActionView())
|
||||||
|
->setName(pht('Change Field Order'))
|
||||||
|
->setIcon('fa-sort-alpha-asc')
|
||||||
|
->setHref($reorder_uri)
|
||||||
|
->setWorkflow(true)
|
||||||
|
->setDisabled(!$can_edit));
|
||||||
|
|
||||||
|
$lock_uri = "{$base_uri}/lock/{$form_key}/";
|
||||||
|
|
||||||
|
$view->addAction(
|
||||||
|
id(new PhabricatorActionView())
|
||||||
|
->setName(pht('Lock / Hide Fields'))
|
||||||
|
->setIcon('fa-lock')
|
||||||
|
->setHref($lock_uri)
|
||||||
|
->setWorkflow(true)
|
||||||
|
->setDisabled(!$can_edit));
|
||||||
|
|
||||||
return $view;
|
return $view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,5 +163,35 @@ final class PhabricatorEditEngineConfigurationViewController
|
||||||
return $properties;
|
return $properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function buildFieldList(PhabricatorEditEngineConfiguration $config) {
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
$engine = $config->getEngine();
|
||||||
|
|
||||||
|
$fields = $engine->getFieldsForConfig($config);
|
||||||
|
|
||||||
|
$form = id(new AphrontFormView())
|
||||||
|
->setUser($viewer)
|
||||||
|
->setAction(null);
|
||||||
|
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$field->setIsPreview(true);
|
||||||
|
|
||||||
|
$field->appendToForm($form);
|
||||||
|
}
|
||||||
|
|
||||||
|
$info = id(new PHUIInfoView())
|
||||||
|
->setSeverity(PHUIInfoView::SEVERITY_NOTICE)
|
||||||
|
->setErrors(
|
||||||
|
array(
|
||||||
|
pht('This is a preview of the current form configuration.'),
|
||||||
|
));
|
||||||
|
|
||||||
|
$box = id(new PHUIObjectBoxView())
|
||||||
|
->setHeaderText(pht('Form Preview'))
|
||||||
|
->setInfoView($info)
|
||||||
|
->setForm($form);
|
||||||
|
|
||||||
|
return $box;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,11 @@ abstract class PhabricatorEditEngine
|
||||||
return $this->getPhobjectClassConstant('ENGINECONST', 64);
|
return $this->getPhobjectClassConstant('ENGINECONST', 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final public function getApplication() {
|
||||||
|
$app_class = $this->getEngineApplicationClass();
|
||||||
|
return PhabricatorApplication::getByClass($app_class);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( Managing Fields )---------------------------------------------------- */
|
/* -( Managing Fields )---------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -53,6 +58,19 @@ abstract class PhabricatorEditEngine
|
||||||
abstract public function getEngineApplicationClass();
|
abstract public function getEngineApplicationClass();
|
||||||
abstract protected function buildCustomEditFields($object);
|
abstract protected function buildCustomEditFields($object);
|
||||||
|
|
||||||
|
public function getFieldsForConfig(
|
||||||
|
PhabricatorEditEngineConfiguration $config) {
|
||||||
|
|
||||||
|
$object = $this->newEditableObject();
|
||||||
|
|
||||||
|
$this->editEngineConfiguration = $config;
|
||||||
|
|
||||||
|
// This is mostly making sure that we fill in default values.
|
||||||
|
$this->setIsCreate(true);
|
||||||
|
|
||||||
|
return $this->buildEditFields($object);
|
||||||
|
}
|
||||||
|
|
||||||
final protected function buildEditFields($object) {
|
final protected function buildEditFields($object) {
|
||||||
$viewer = $this->getViewer();
|
$viewer = $this->getViewer();
|
||||||
$editor = $object->getApplicationTransactionEditor();
|
$editor = $object->getApplicationTransactionEditor();
|
||||||
|
@ -129,6 +147,7 @@ abstract class PhabricatorEditEngine
|
||||||
->setEditTypeKey('space')
|
->setEditTypeKey('space')
|
||||||
->setDescription(
|
->setDescription(
|
||||||
pht('Shifts the object in the Spaces application.'))
|
pht('Shifts the object in the Spaces application.'))
|
||||||
|
->setIsReorderable(false)
|
||||||
->setAliases(array('space', 'policy.space'))
|
->setAliases(array('space', 'policy.space'))
|
||||||
->setTransactionType($type_space)
|
->setTransactionType($type_space)
|
||||||
->setValue($object->getSpacePHID());
|
->setValue($object->getSpacePHID());
|
||||||
|
@ -195,6 +214,22 @@ abstract class PhabricatorEditEngine
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$xaction = $object->getApplicationTransactionTemplate();
|
||||||
|
$comment = $xaction->getApplicationTransactionCommentObject();
|
||||||
|
if ($comment) {
|
||||||
|
$comment_type = PhabricatorTransactions::TYPE_COMMENT;
|
||||||
|
|
||||||
|
$comment_field = id(new PhabricatorCommentEditField())
|
||||||
|
->setKey('comment')
|
||||||
|
->setLabel(pht('Comments'))
|
||||||
|
->setDescription(pht('Add comments.'))
|
||||||
|
->setAliases(array('comments'))
|
||||||
|
->setIsHidden(true)
|
||||||
|
->setTransactionType($comment_type)
|
||||||
|
->setValue(null);
|
||||||
|
$fields[] = $comment_field;
|
||||||
|
}
|
||||||
|
|
||||||
$config = $this->getEditEngineConfiguration();
|
$config = $this->getEditEngineConfiguration();
|
||||||
$fields = $config->applyConfigurationToFields($this, $fields);
|
$fields = $config->applyConfigurationToFields($this, $fields);
|
||||||
|
|
||||||
|
@ -222,6 +257,13 @@ abstract class PhabricatorEditEngine
|
||||||
*/
|
*/
|
||||||
abstract protected function getObjectCreateTitleText($object);
|
abstract protected function getObjectCreateTitleText($object);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @task text
|
||||||
|
*/
|
||||||
|
protected function getFormHeaderText($object) {
|
||||||
|
$config = $this->getEditEngineConfiguration();
|
||||||
|
return $config->getName();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @task text
|
* @task text
|
||||||
|
@ -384,16 +426,16 @@ abstract class PhabricatorEditEngine
|
||||||
/**
|
/**
|
||||||
* @task uri
|
* @task uri
|
||||||
*/
|
*/
|
||||||
protected function getObjectEditURI($object) {
|
protected function getObjectCreateCancelURI($object) {
|
||||||
return $this->getController()->getApplicationURI('edit/');
|
return $this->getApplication()->getApplicationURI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @task uri
|
* @task uri
|
||||||
*/
|
*/
|
||||||
protected function getObjectCreateCancelURI($object) {
|
protected function getEditorURI() {
|
||||||
return $this->getController()->getApplicationURI();
|
return $this->getApplication()->getApplicationURI('edit/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -408,12 +450,12 @@ abstract class PhabricatorEditEngine
|
||||||
/**
|
/**
|
||||||
* @task uri
|
* @task uri
|
||||||
*/
|
*/
|
||||||
protected function getEditURI($object, $path = null) {
|
public function getEditURI($object = null, $path = null) {
|
||||||
$parts = array(
|
$parts = array();
|
||||||
$this->getObjectEditURI($object),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!$this->getIsCreate()) {
|
$parts[] = $this->getEditorURI();
|
||||||
|
|
||||||
|
if ($object && $object->getID()) {
|
||||||
$parts[] = $object->getID().'/';
|
$parts[] = $object->getID().'/';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,7 +605,8 @@ abstract class PhabricatorEditEngine
|
||||||
$controller = $this->getController();
|
$controller = $this->getController();
|
||||||
$request = $controller->getRequest();
|
$request = $controller->getRequest();
|
||||||
|
|
||||||
$config = $this->loadEditEngineConfiguration($request->getURIData('form'));
|
$form_key = $request->getURIData('formKey');
|
||||||
|
$config = $this->loadEditEngineConfiguration($form_key);
|
||||||
if (!$config) {
|
if (!$config) {
|
||||||
return new Aphront404Response();
|
return new Aphront404Response();
|
||||||
}
|
}
|
||||||
|
@ -631,12 +674,22 @@ abstract class PhabricatorEditEngine
|
||||||
$validation_exception = null;
|
$validation_exception = null;
|
||||||
if ($request->isFormPost()) {
|
if ($request->isFormPost()) {
|
||||||
foreach ($fields as $field) {
|
foreach ($fields as $field) {
|
||||||
|
if ($field->getIsLocked() || $field->getIsHidden()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$field->readValueFromSubmit($request);
|
$field->readValueFromSubmit($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
$xactions = array();
|
$xactions = array();
|
||||||
foreach ($fields as $field) {
|
foreach ($fields as $field) {
|
||||||
$xactions[] = $field->generateTransaction(clone $template);
|
$xaction = $field->generateTransaction(clone $template);
|
||||||
|
|
||||||
|
if (!$xaction) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$xactions[] = $xaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
$editor = $object->getApplicationTransactionEditor()
|
$editor = $object->getApplicationTransactionEditor()
|
||||||
|
@ -656,6 +709,10 @@ abstract class PhabricatorEditEngine
|
||||||
} else {
|
} else {
|
||||||
if ($this->getIsCreate()) {
|
if ($this->getIsCreate()) {
|
||||||
foreach ($fields as $field) {
|
foreach ($fields as $field) {
|
||||||
|
if ($field->getIsLocked() || $field->getIsHidden()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$field->readValueFromRequest($request);
|
$field->readValueFromRequest($request);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -668,7 +725,7 @@ abstract class PhabricatorEditEngine
|
||||||
$action_button = $this->buildEditFormActionButton($object);
|
$action_button = $this->buildEditFormActionButton($object);
|
||||||
|
|
||||||
if ($this->getIsCreate()) {
|
if ($this->getIsCreate()) {
|
||||||
$header_text = $this->getObjectCreateTitleText($object);
|
$header_text = $this->getFormHeaderText($object);
|
||||||
} else {
|
} else {
|
||||||
$header_text = $this->getObjectEditTitleText($object);
|
$header_text = $this->getObjectEditTitleText($object);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@ abstract class PhabricatorEditEngineAPIMethod
|
||||||
|
|
||||||
final public function getMethodDescription() {
|
final public function getMethodDescription() {
|
||||||
// TODO: We don't currently have a real viewer in this method.
|
// TODO: We don't currently have a real viewer in this method.
|
||||||
$viewer = new PhabricatorUser();
|
$viewer = PhabricatorUser::getOmnipotentUser();
|
||||||
|
|
||||||
$engine = $this->newEditEngine()
|
$engine = $this->newEditEngine()
|
||||||
->setViewer($viewer);
|
->setViewer($viewer);
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorCommentEditField
|
||||||
|
extends PhabricatorEditField {
|
||||||
|
|
||||||
|
protected function newControl() {
|
||||||
|
return new PhabricatorRemarkupControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function newEditType() {
|
||||||
|
return new PhabricatorCommentEditType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateTransaction(
|
||||||
|
PhabricatorApplicationTransaction $xaction) {
|
||||||
|
|
||||||
|
$spec = array(
|
||||||
|
'value' => $this->getValueForTransaction(),
|
||||||
|
);
|
||||||
|
|
||||||
|
return head($this->getEditTransactionTypes())
|
||||||
|
->generateTransaction($xaction, $spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -13,7 +13,16 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
private $metadata = array();
|
private $metadata = array();
|
||||||
private $description;
|
private $description;
|
||||||
private $editTypeKey;
|
private $editTypeKey;
|
||||||
|
|
||||||
private $isLocked;
|
private $isLocked;
|
||||||
|
private $isHidden;
|
||||||
|
|
||||||
|
private $isPreview;
|
||||||
|
private $isEditDefaults;
|
||||||
|
|
||||||
|
private $isReorderable = true;
|
||||||
|
private $isDefaultable = true;
|
||||||
|
private $isLockable = true;
|
||||||
|
|
||||||
public function setKey($key) {
|
public function setKey($key) {
|
||||||
$this->key = $key;
|
$this->key = $key;
|
||||||
|
@ -78,6 +87,60 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
return $this->isLocked;
|
return $this->isLocked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setIsPreview($preview) {
|
||||||
|
$this->isPreview = $preview;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIsPreview() {
|
||||||
|
return $this->isPreview;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setIsReorderable($is_reorderable) {
|
||||||
|
$this->isReorderable = $is_reorderable;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIsReorderable() {
|
||||||
|
return $this->isReorderable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setIsEditDefaults($is_edit_defaults) {
|
||||||
|
$this->isEditDefaults = $is_edit_defaults;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIsEditDefaults() {
|
||||||
|
return $this->isEditDefaults;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setIsDefaultable($is_defaultable) {
|
||||||
|
$this->isDefaultable = $is_defaultable;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIsDefaultable() {
|
||||||
|
return $this->isDefaultable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setIsLockable($is_lockable) {
|
||||||
|
$this->isLockable = $is_lockable;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIsLockable() {
|
||||||
|
return $this->isLockable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setIsHidden($is_hidden) {
|
||||||
|
$this->isHidden = $is_hidden;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getIsHidden() {
|
||||||
|
return $this->isHidden;
|
||||||
|
}
|
||||||
|
|
||||||
protected function newControl() {
|
protected function newControl() {
|
||||||
throw new PhutilMethodNotImplementedException();
|
throw new PhutilMethodNotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -96,16 +159,41 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
$control->setLabel($this->getLabel());
|
$control->setLabel($this->getLabel());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->getIsLocked()) {
|
if ($this->getIsPreview()) {
|
||||||
$control->setDisabled(true);
|
$disabled = true;
|
||||||
|
$hidden = false;
|
||||||
|
} else if ($this->getIsEditDefaults()) {
|
||||||
|
$disabled = false;
|
||||||
|
$hidden = false;
|
||||||
|
} else {
|
||||||
|
$disabled = $this->getIsLocked();
|
||||||
|
$hidden = $this->getIsHidden();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($hidden) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$control->setDisabled($disabled);
|
||||||
|
|
||||||
return $control;
|
return $control;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function appendToForm(AphrontFormView $form) {
|
public function appendToForm(AphrontFormView $form) {
|
||||||
$control = $this->renderControl();
|
$control = $this->renderControl();
|
||||||
if ($control !== null) {
|
if ($control !== null) {
|
||||||
|
|
||||||
|
if ($this->getIsPreview()) {
|
||||||
|
if ($this->getIsHidden()) {
|
||||||
|
$control
|
||||||
|
->addClass('aphront-form-preview-hidden')
|
||||||
|
->setError(pht('Hidden'));
|
||||||
|
} else if ($this->getIsLocked()) {
|
||||||
|
$control
|
||||||
|
->setError(pht('Locked'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$form->appendControl($control);
|
$form->appendControl($control);
|
||||||
}
|
}
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -115,6 +203,19 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
return $this->getValue();
|
return $this->getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getValueForDefaults() {
|
||||||
|
$value = $this->getValue();
|
||||||
|
|
||||||
|
// By default, just treat the empty string like `null` since they're
|
||||||
|
// equivalent for almost all fields and this reduces the number of
|
||||||
|
// meaningless transactions we generate when adjusting defaults.
|
||||||
|
if ($value === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
protected function getValue() {
|
protected function getValue() {
|
||||||
return $this->value;
|
return $this->value;
|
||||||
}
|
}
|
||||||
|
@ -128,6 +229,10 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
public function generateTransaction(
|
public function generateTransaction(
|
||||||
PhabricatorApplicationTransaction $xaction) {
|
PhabricatorApplicationTransaction $xaction) {
|
||||||
|
|
||||||
|
if (!$this->getTransactionType()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
$xaction
|
$xaction
|
||||||
->setTransactionType($this->getTransactionType())
|
->setTransactionType($this->getTransactionType())
|
||||||
->setNewValue($this->getValueForTransaction());
|
->setNewValue($this->getValueForTransaction());
|
||||||
|
@ -149,9 +254,6 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTransactionType() {
|
public function getTransactionType() {
|
||||||
if (!$this->transactionType) {
|
|
||||||
throw new PhutilInvalidStateException('setTransactionType');
|
|
||||||
}
|
|
||||||
return $this->transactionType;
|
return $this->transactionType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,7 +320,13 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getValueExistsInSubmit(AphrontRequest $request, $key) {
|
protected function getValueExistsInSubmit(AphrontRequest $request, $key) {
|
||||||
return $this->getHTTPParameterType()->getExists($request, $key);
|
$type = $this->getHTTPParameterType();
|
||||||
|
|
||||||
|
if ($type) {
|
||||||
|
return $type->getExists($request, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getValueFromSubmit(AphrontRequest $request, $key) {
|
protected function getValueFromSubmit(AphrontRequest $request, $key) {
|
||||||
|
@ -226,7 +334,13 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getDefaultValue() {
|
protected function getDefaultValue() {
|
||||||
return $this->getHTTPParameterType()->getDefaultValue();
|
$type = $this->getHTTPParameterType();
|
||||||
|
|
||||||
|
if ($type) {
|
||||||
|
return $type->getDefaultValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
final public function getHTTPParameterType() {
|
final public function getHTTPParameterType() {
|
||||||
|
@ -255,8 +369,17 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
return $this->editTypeKey;
|
return $this->editTypeKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function newEditType() {
|
||||||
|
return id(new PhabricatorSimpleEditType())
|
||||||
|
->setValueType($this->getHTTPParameterType()->getTypeName());
|
||||||
|
}
|
||||||
|
|
||||||
public function getEditTransactionTypes() {
|
public function getEditTransactionTypes() {
|
||||||
$transaction_type = $this->getTransactionType();
|
$transaction_type = $this->getTransactionType();
|
||||||
|
if ($transaction_type === null) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
$type_key = $this->getEditTypeKey();
|
$type_key = $this->getEditTypeKey();
|
||||||
|
|
||||||
// TODO: This is a pretty big pile of hard-coded hacks for now.
|
// TODO: This is a pretty big pile of hard-coded hacks for now.
|
||||||
|
@ -305,10 +428,9 @@ abstract class PhabricatorEditField extends Phobject {
|
||||||
}
|
}
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
id(new PhabricatorSimpleEditType())
|
$this->newEditType()
|
||||||
->setEditType($type_key)
|
->setEditType($type_key)
|
||||||
->setTransactionType($transaction_type)
|
->setTransactionType($transaction_type)
|
||||||
->setValueType($this->getHTTPParameterType()->getTypeName())
|
|
||||||
->setDescription($this->getDescription())
|
->setDescription($this->getDescription())
|
||||||
->setMetadata($this->metadata),
|
->setMetadata($this->metadata),
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,4 +7,8 @@ final class PhabricatorInstructionsEditField
|
||||||
return $form->appendRemarkupInstructions($this->getValue());
|
return $form->appendRemarkupInstructions($this->getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function newHTTPParameterType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorRemarkupEditField
|
||||||
|
extends PhabricatorEditField {
|
||||||
|
|
||||||
|
protected function newControl() {
|
||||||
|
return new PhabricatorRemarkupControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1888,7 +1888,7 @@ abstract class PhabricatorApplicationTransactionEditor
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($no_effect as $key => $xaction) {
|
foreach ($no_effect as $key => $xaction) {
|
||||||
if ($xaction->getComment()) {
|
if ($xaction->hasComment()) {
|
||||||
$xaction->setTransactionType($type_comment);
|
$xaction->setTransactionType($type_comment);
|
||||||
$xaction->setOldValue(null);
|
$xaction->setOldValue(null);
|
||||||
$xaction->setNewValue(null);
|
$xaction->setNewValue(null);
|
||||||
|
@ -2867,12 +2867,15 @@ abstract class PhabricatorApplicationTransactionEditor
|
||||||
PhabricatorLiskDAO $object,
|
PhabricatorLiskDAO $object,
|
||||||
array $xactions) {
|
array $xactions) {
|
||||||
|
|
||||||
$adapter = $this->buildHeraldAdapter($object, $xactions);
|
$adapter = $this->buildHeraldAdapter($object, $xactions)
|
||||||
$adapter->setContentSource($this->getContentSource());
|
->setContentSource($this->getContentSource())
|
||||||
$adapter->setIsNewObject($this->getIsNewObject());
|
->setIsNewObject($this->getIsNewObject())
|
||||||
|
->setAppliedTransactions($xactions);
|
||||||
|
|
||||||
if ($this->getApplicationEmail()) {
|
if ($this->getApplicationEmail()) {
|
||||||
$adapter->setApplicationEmail($this->getApplicationEmail());
|
$adapter->setApplicationEmail($this->getApplicationEmail());
|
||||||
}
|
}
|
||||||
|
|
||||||
$xscript = HeraldEngine::loadAndApplyRules($adapter);
|
$xscript = HeraldEngine::loadAndApplyRules($adapter);
|
||||||
|
|
||||||
$this->setHeraldAdapter($adapter);
|
$this->setHeraldAdapter($adapter);
|
||||||
|
|
|
@ -51,20 +51,21 @@ final class PhabricatorEditEngineConfigurationEditEngine
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getObjectViewURI($object) {
|
protected function getObjectViewURI($object) {
|
||||||
$engine_key = $this->getTargetEngine()->getEngineKey();
|
|
||||||
$id = $object->getID();
|
$id = $object->getID();
|
||||||
return "/transactions/editengine/{$engine_key}/view/{$id}/";
|
return $this->getURI("view/{$id}/");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getObjectEditURI($object) {
|
protected function getEditorURI() {
|
||||||
$engine_key = $this->getTargetEngine()->getEngineKey();
|
return $this->getURI('edit/');
|
||||||
$id = $object->getID();
|
|
||||||
return "/transactions/editengine/{$engine_key}/edit/{$id}/";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getObjectCreateCancelURI($object) {
|
protected function getObjectCreateCancelURI($object) {
|
||||||
|
return $this->getURI();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getURI($path = null) {
|
||||||
$engine_key = $this->getTargetEngine()->getEngineKey();
|
$engine_key = $this->getTargetEngine()->getEngineKey();
|
||||||
return "/transactions/editengine/{$engine_key}/";
|
return "/transactions/editengine/{$engine_key}/{$path}";
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function buildCustomEditFields($object) {
|
protected function buildCustomEditFields($object) {
|
||||||
|
@ -76,6 +77,13 @@ final class PhabricatorEditEngineConfigurationEditEngine
|
||||||
->setTransactionType(
|
->setTransactionType(
|
||||||
PhabricatorEditEngineConfigurationTransaction::TYPE_NAME)
|
PhabricatorEditEngineConfigurationTransaction::TYPE_NAME)
|
||||||
->setValue($object->getName()),
|
->setValue($object->getName()),
|
||||||
|
id(new PhabricatorRemarkupEditField())
|
||||||
|
->setKey('preamble')
|
||||||
|
->setLabel(pht('Preamble'))
|
||||||
|
->setDescription(pht('Optional instructions, shown above the form.'))
|
||||||
|
->setTransactionType(
|
||||||
|
PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE)
|
||||||
|
->setValue($object->getPreamble()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,10 @@ final class PhabricatorEditEngineConfigurationEditor
|
||||||
$types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
|
$types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
|
||||||
|
|
||||||
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_NAME;
|
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_NAME;
|
||||||
|
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE;
|
||||||
|
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER;
|
||||||
|
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT;
|
||||||
|
$types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS;
|
||||||
|
|
||||||
return $types;
|
return $types;
|
||||||
}
|
}
|
||||||
|
@ -57,6 +61,15 @@ final class PhabricatorEditEngineConfigurationEditor
|
||||||
switch ($xaction->getTransactionType()) {
|
switch ($xaction->getTransactionType()) {
|
||||||
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
||||||
return $object->getName();
|
return $object->getName();
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE;
|
||||||
|
return $object->getPreamble();
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER:
|
||||||
|
return $object->getFieldOrder();
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT:
|
||||||
|
$field_key = $xaction->getMetadataValue('field.key');
|
||||||
|
return $object->getFieldDefault($field_key);
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
|
||||||
|
return $object->getFieldLocks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,6 +79,10 @@ final class PhabricatorEditEngineConfigurationEditor
|
||||||
|
|
||||||
switch ($xaction->getTransactionType()) {
|
switch ($xaction->getTransactionType()) {
|
||||||
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE;
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER:
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT:
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
|
||||||
return $xaction->getNewValue();
|
return $xaction->getNewValue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,6 +95,19 @@ final class PhabricatorEditEngineConfigurationEditor
|
||||||
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
||||||
$object->setName($xaction->getNewValue());
|
$object->setName($xaction->getNewValue());
|
||||||
return;
|
return;
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE;
|
||||||
|
$object->setPreamble($xaction->getNewValue());
|
||||||
|
return;
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER:
|
||||||
|
$object->setFieldOrder($xaction->getNewValue());
|
||||||
|
return;
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT:
|
||||||
|
$field_key = $xaction->getMetadataValue('field.key');
|
||||||
|
$object->setFieldDefault($field_key, $xaction->getNewValue());
|
||||||
|
return;
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
|
||||||
|
$object->setFieldLocks($xaction->getNewValue());
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return parent::applyCustomInternalTransaction($object, $xaction);
|
return parent::applyCustomInternalTransaction($object, $xaction);
|
||||||
|
@ -89,6 +119,10 @@ final class PhabricatorEditEngineConfigurationEditor
|
||||||
|
|
||||||
switch ($xaction->getTransactionType()) {
|
switch ($xaction->getTransactionType()) {
|
||||||
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_NAME:
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_PREAMBLE;
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER;
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT:
|
||||||
|
case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class PhabricatorCommentEditType extends PhabricatorEditType {
|
||||||
|
|
||||||
|
public function getValueType() {
|
||||||
|
return id(new AphrontStringHTTPParameterType())->getTypeName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateTransaction(
|
||||||
|
PhabricatorApplicationTransaction $template,
|
||||||
|
array $spec) {
|
||||||
|
|
||||||
|
$comment = $template->getApplicationTransactionCommentObject()
|
||||||
|
->setContent(idx($spec, 'value'));
|
||||||
|
|
||||||
|
$template
|
||||||
|
->setTransactionType($this->getTransactionType())
|
||||||
|
->attachComment($comment);
|
||||||
|
|
||||||
|
foreach ($this->getMetadata() as $key => $value) {
|
||||||
|
$template->setMetadataValue($key, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $template;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getValueDescription() {
|
||||||
|
return pht('Comment to add, formated as remarkup.');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -134,6 +134,31 @@ final class PhabricatorEditEngineConfigurationQuery
|
||||||
return $page;
|
return $page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function willFilterPage(array $configs) {
|
||||||
|
$engine_keys = mpull($configs, 'getEngineKey');
|
||||||
|
|
||||||
|
$engines = id(new PhabricatorEditEngineQuery())
|
||||||
|
->setParentQuery($this)
|
||||||
|
->setViewer($this->getViewer())
|
||||||
|
->withEngineKeys($engine_keys)
|
||||||
|
->execute();
|
||||||
|
$engines = mpull($engines, null, 'getEngineKey');
|
||||||
|
|
||||||
|
foreach ($configs as $key => $config) {
|
||||||
|
$engine = idx($engines, $config->getEngineKey());
|
||||||
|
|
||||||
|
if (!$engine) {
|
||||||
|
$this->didRejectResult($config);
|
||||||
|
unset($configs[$key]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$config->attachEngine($engine);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $configs;
|
||||||
|
}
|
||||||
|
|
||||||
protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
|
protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
|
||||||
$where = parent::buildWhereClauseParts($conn);
|
$where = parent::buildWhereClauseParts($conn);
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,28 @@ final class PhabricatorEditEngineQuery
|
||||||
return $engines;
|
return $engines;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function willFilterPage(array $engines) {
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
|
||||||
|
foreach ($engines as $key => $engine) {
|
||||||
|
$app_class = $engine->getEngineApplicationClass();
|
||||||
|
if ($app_class === null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$can_see = PhabricatorApplication::isClassInstalledForViewer(
|
||||||
|
$app_class,
|
||||||
|
$viewer);
|
||||||
|
if (!$can_see) {
|
||||||
|
$this->didRejectResult($engine);
|
||||||
|
unset($engines[$key]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $engines;
|
||||||
|
}
|
||||||
|
|
||||||
public function getQueryApplicationClass() {
|
public function getQueryApplicationClass() {
|
||||||
return 'PhabricatorTransactionsApplication';
|
return 'PhabricatorTransactionsApplication';
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,10 @@ final class PhabricatorEditEngineConfiguration
|
||||||
|
|
||||||
private $engine = self::ATTACHABLE;
|
private $engine = self::ATTACHABLE;
|
||||||
|
|
||||||
|
const LOCK_VISIBLE = 'visible';
|
||||||
|
const LOCK_LOCKED = 'locked';
|
||||||
|
const LOCK_HIDDEN = 'hidden';
|
||||||
|
|
||||||
public function getTableName() {
|
public function getTableName() {
|
||||||
return 'search_editengineconfiguration';
|
return 'search_editengineconfiguration';
|
||||||
}
|
}
|
||||||
|
@ -97,14 +101,39 @@ final class PhabricatorEditEngineConfiguration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$locks = $this->getFieldLocks();
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$key = $field->getKey();
|
||||||
|
switch (idx($locks, $key)) {
|
||||||
|
case self::LOCK_LOCKED:
|
||||||
|
$field->setIsHidden(false);
|
||||||
|
$field->setIsLocked(true);
|
||||||
|
break;
|
||||||
|
case self::LOCK_HIDDEN:
|
||||||
|
$field->setIsHidden(true);
|
||||||
|
$field->setIsLocked(false);
|
||||||
|
break;
|
||||||
|
case self::LOCK_VISIBLE:
|
||||||
|
$field->setIsHidden(false);
|
||||||
|
$field->setIsLocked(false);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// If we don't have an explicit value, don't make any adjustments.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$fields = $this->reorderFields($fields);
|
$fields = $this->reorderFields($fields);
|
||||||
|
|
||||||
$head_instructions = $this->getProperty('instructions.head');
|
$preamble = $this->getPreamble();
|
||||||
if (strlen($head_instructions)) {
|
if (strlen($preamble)) {
|
||||||
$fields = array(
|
$fields = array(
|
||||||
'config.instructions.head' => id(new PhabricatorInstructionsEditField())
|
'config.preamble' => id(new PhabricatorInstructionsEditField())
|
||||||
->setKey('config.instructions.head')
|
->setKey('config.preamble')
|
||||||
->setValue($head_instructions),
|
->setIsReorderable(false)
|
||||||
|
->setIsDefaultable(false)
|
||||||
|
->setIsLockable(false)
|
||||||
|
->setValue($preamble),
|
||||||
) + $fields;
|
) + $fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,21 +141,9 @@ final class PhabricatorEditEngineConfiguration
|
||||||
}
|
}
|
||||||
|
|
||||||
private function reorderFields(array $fields) {
|
private function reorderFields(array $fields) {
|
||||||
$keys = array();
|
$keys = $this->getFieldOrder();
|
||||||
$fields = array_select_keys($fields, $keys) + $fields;
|
$fields = array_select_keys($fields, $keys) + $fields;
|
||||||
|
return $fields;
|
||||||
// Now, move locked fields to the bottom.
|
|
||||||
$head = array();
|
|
||||||
$tail = array();
|
|
||||||
foreach ($fields as $key => $field) {
|
|
||||||
if (!$field->getIsLocked()) {
|
|
||||||
$head[$key] = $field;
|
|
||||||
} else {
|
|
||||||
$tail[$key] = $field;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $head + $tail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getURI() {
|
public function getURI() {
|
||||||
|
@ -158,6 +175,41 @@ final class PhabricatorEditEngineConfiguration
|
||||||
return pht('Untitled Form');
|
return pht('Untitled Form');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPreamble() {
|
||||||
|
return $this->getProperty('preamble');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPreamble($preamble) {
|
||||||
|
return $this->setProperty('preamble', $preamble);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFieldOrder(array $field_order) {
|
||||||
|
return $this->setProperty('order', $field_order);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFieldOrder() {
|
||||||
|
return $this->getProperty('order', array());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFieldLocks(array $field_locks) {
|
||||||
|
return $this->setProperty('locks', $field_locks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFieldLocks() {
|
||||||
|
return $this->getProperty('locks', array());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFieldDefault($key) {
|
||||||
|
$defaults = $this->getProperty('defaults', array());
|
||||||
|
return idx($defaults, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setFieldDefault($key, $value) {
|
||||||
|
$defaults = $this->getProperty('defaults', array());
|
||||||
|
$defaults[$key] = $value;
|
||||||
|
return $this->setProperty('defaults', $defaults);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,10 @@ final class PhabricatorEditEngineConfigurationTransaction
|
||||||
extends PhabricatorApplicationTransaction {
|
extends PhabricatorApplicationTransaction {
|
||||||
|
|
||||||
const TYPE_NAME = 'editengine.config.name';
|
const TYPE_NAME = 'editengine.config.name';
|
||||||
|
const TYPE_PREAMBLE = 'editengine.config.preamble';
|
||||||
|
const TYPE_ORDER = 'editengine.config.order';
|
||||||
|
const TYPE_DEFAULT = 'editengine.config.default';
|
||||||
|
const TYPE_LOCKS = 'editengine.config.locks';
|
||||||
|
|
||||||
public function getApplicationName() {
|
public function getApplicationName() {
|
||||||
return 'search';
|
return 'search';
|
||||||
|
@ -17,4 +21,48 @@ final class PhabricatorEditEngineConfigurationTransaction
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle() {
|
||||||
|
$author_phid = $this->getAuthorPHID();
|
||||||
|
|
||||||
|
$old = $this->getOldValue();
|
||||||
|
$new = $this->getNewValue();
|
||||||
|
|
||||||
|
$type = $this->getTransactionType();
|
||||||
|
switch ($type) {
|
||||||
|
case self::TYPE_NAME:
|
||||||
|
if (strlen($old)) {
|
||||||
|
return pht(
|
||||||
|
'%s renamed this form from "%s" to "%s".',
|
||||||
|
$this->renderHandleLink($author_phid),
|
||||||
|
$old,
|
||||||
|
$new);
|
||||||
|
} else {
|
||||||
|
return pht(
|
||||||
|
'%s named this form "%s".',
|
||||||
|
$this->renderHandleLink($author_phid),
|
||||||
|
$new);
|
||||||
|
}
|
||||||
|
case self::TYPE_PREAMBLE:
|
||||||
|
return pht(
|
||||||
|
'%s updated the preamble for this form.',
|
||||||
|
$this->renderHandleLink($author_phid));
|
||||||
|
case self::TYPE_ORDER:
|
||||||
|
return pht(
|
||||||
|
'%s reordered the fields in this form.',
|
||||||
|
$this->renderHandleLink($author_phid));
|
||||||
|
case self::TYPE_DEFAULT:
|
||||||
|
$key = $this->getMetadataValue('field.key');
|
||||||
|
return pht(
|
||||||
|
'%s changed the default value for field "%s".',
|
||||||
|
$this->renderHandleLink($author_phid),
|
||||||
|
$key);
|
||||||
|
case self::TYPE_LOCKS:
|
||||||
|
return pht(
|
||||||
|
'%s changed locked and hidden fields.',
|
||||||
|
$this->renderHandleLink($author_phid));
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getTitle();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ final class PhabricatorApplicationEditHTTPParameterHelpView
|
||||||
$type = $field->getHTTPParameterType();
|
$type = $field->getHTTPParameterType();
|
||||||
if ($type === null) {
|
if ($type === null) {
|
||||||
unset($fields[$key]);
|
unset($fields[$key]);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
$types[$type->getTypeName()] = $type;
|
$types[$type->getTypeName()] = $type;
|
||||||
}
|
}
|
||||||
|
|
169
src/docs/contributor/cla.diviner
Normal file
169
src/docs/contributor/cla.diviner
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
@title Understanding the Phacility CLA
|
||||||
|
@group detail
|
||||||
|
|
||||||
|
Describes the Contributor License Agreement (CLA).
|
||||||
|
|
||||||
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
|
IMPORTANT: This document is not legal advice.
|
||||||
|
|
||||||
|
Phacility requires contributors to sign a Contributor License Agreement
|
||||||
|
(often abbreviated "CLA") before we can accept contributions into the upstream.
|
||||||
|
This document explains what this document means and why we require it.
|
||||||
|
|
||||||
|
This requirement is not unusual, and many large open source projects require a
|
||||||
|
similar CLA, including Python, Go, jQuery, and Apache Software Foundation
|
||||||
|
projects.
|
||||||
|
|
||||||
|
You can read more about CLAs and find more examples of companies and projects
|
||||||
|
which require them on Wikipedia's
|
||||||
|
[[ https://en.wikipedia.org/wiki/Contributor_License_Agreement | CLA ]] page.
|
||||||
|
|
||||||
|
Our CLA is substantially similar to the CLA required by Apache, the
|
||||||
|
"Apache Individual Contributor License Agreement V2.0". Many projects which
|
||||||
|
require a CLA use this CLA or a similar one.
|
||||||
|
|
||||||
|
|
||||||
|
Why We Require a CLA
|
||||||
|
====================
|
||||||
|
|
||||||
|
While many projects require a CLA, others do not. This project requires a CLA
|
||||||
|
primarily because:
|
||||||
|
|
||||||
|
- it gives us certain rights, particularly the ability to relicense the work
|
||||||
|
later;
|
||||||
|
- it makes the terms of your contribution clear, protecting us from liability
|
||||||
|
related to copyright and patent disputes.
|
||||||
|
|
||||||
|
**More Rights**: We consider the cost of maintaining changes to greatly
|
||||||
|
outweigh the cost of writing them in the first place. When we accept work
|
||||||
|
into the upstream, we are agreeing to bear that maintenance cost.
|
||||||
|
|
||||||
|
This cost is not worthwhile to us unless the changes come with no strings
|
||||||
|
attached. Among other concerns, we would be unable to redistribute Phabricator
|
||||||
|
under a different license in the future without the additional rights the CLA
|
||||||
|
gives us.
|
||||||
|
|
||||||
|
For a concrete example of the problems this causes, Bootstrap switched from
|
||||||
|
GPLv2 to MIT in 2012-2013. You can see the issue tracking the process and read
|
||||||
|
about what they had to go through to do this here:
|
||||||
|
|
||||||
|
https://github.com/twbs/bootstrap/issues/2054
|
||||||
|
|
||||||
|
This took almost 18 months and required a huge amount of effort. We are not
|
||||||
|
willing to encumber the project with that kind of potential cost in order to
|
||||||
|
accept contributions.
|
||||||
|
|
||||||
|
The rights you give us by signing the CLA allow us to release the software
|
||||||
|
under a different license later without asking you for permission, including a
|
||||||
|
license you may not agree with.
|
||||||
|
|
||||||
|
They do not allow us to //undo// the existing release under the Apache license,
|
||||||
|
but allow us to make an //additional// release under a different license, or
|
||||||
|
release under multiple licenses (if we do, users may choose which license or
|
||||||
|
licenses they wish to use the software under). It would also allow us to
|
||||||
|
discontinue updating the release under the Apache license.
|
||||||
|
|
||||||
|
While we do not currently plan to relicense Phabricator, we do not want to
|
||||||
|
give up the ability to do so: we may want or need to in the future.
|
||||||
|
|
||||||
|
The most likely scenario which would lead to us changing the license is if a
|
||||||
|
new version of the Apache license is released. Open source software licenses
|
||||||
|
are still largely untested in the US legal system, and they may face challenges
|
||||||
|
in the future which could require adapting them to a changing legal
|
||||||
|
environment. If this occurs, we would want to be able to update to a newer
|
||||||
|
version of the license which accounted for these changes.
|
||||||
|
|
||||||
|
It is also possible that we may want to change open source licenses (for
|
||||||
|
example, to MIT) or adopt dual-licensing (for example, both Apache and MIT). We
|
||||||
|
might want to do this so that our license is compatible with the licenses used
|
||||||
|
by other software we want to be distributed alongside.
|
||||||
|
|
||||||
|
Although we currently believe it is unlikely, it is also possible we may want
|
||||||
|
to relicense Phabricator under a closed, proprietary, or literally evil license.
|
||||||
|
By signing the CLA, you are giving us the power to do this without requiring
|
||||||
|
you to consent. If you are not comfortable with this, do not sign the CLA and
|
||||||
|
do not contribute to Phabricator.
|
||||||
|
|
||||||
|
**Limitation of Liability**: The second benefit the CLA provides is that it
|
||||||
|
makes the terms of your contribition explicitly clear upfront, and it puts us
|
||||||
|
in a much stronger legal position if a contributor later claims there is
|
||||||
|
ambiguity about ownership of their work. We can point at the document they
|
||||||
|
signed as proof that they consented to our use and understood the terms of
|
||||||
|
their contribution.
|
||||||
|
|
||||||
|
//SCO v. IBM// was a lawsuit filed in 2003 alleging (roughly) that IBM had
|
||||||
|
improperly contributed code owned by SCO to Linux. The details of this and the
|
||||||
|
subsequent cases are very complex and the situation is not a direct parallel to
|
||||||
|
anything we are likely to face, but SCO claimed billions of dollars in damages
|
||||||
|
and the litigation has now been ongoing for more than a decade.
|
||||||
|
|
||||||
|
We want to avoid situations like this in the future by making the terms of
|
||||||
|
contibution explicit upfront.
|
||||||
|
|
||||||
|
Generally, we believe the terms of the CLA are fair and reasonable for
|
||||||
|
contributors, and that the primary way contributors benefit from contributing
|
||||||
|
to Phabricator is that we publish and maintain their changes so they do not
|
||||||
|
have to fork the software.
|
||||||
|
|
||||||
|
If you have strong ideological reasons for contributing to open source, you may
|
||||||
|
not be comfortable with the terms of the CLA (for example, it may be important
|
||||||
|
to you that your changes are never available under a license which you haven't
|
||||||
|
explicitly approved). This is fine and we can understand why contributors may
|
||||||
|
hold this viewpoint, but we can not accept your changes into the upstream.
|
||||||
|
|
||||||
|
|
||||||
|
Corporate vs Individual CLAs
|
||||||
|
============================
|
||||||
|
|
||||||
|
We offer two CLAs:
|
||||||
|
|
||||||
|
- {L28}
|
||||||
|
- {L30}
|
||||||
|
|
||||||
|
These are both substantially similar to the corresponding Apache CLAs.
|
||||||
|
|
||||||
|
If you own the work you are contributing, sign the individual CLA. If your
|
||||||
|
employer owns the work you are contributing, have them sign the corporate CLA.
|
||||||
|
|
||||||
|
**If you are employed, there is a substantial possibility that your employer
|
||||||
|
owns your work.** If they do, you do not have the right to contribute it to us
|
||||||
|
or assign the rights that we require, and can not contribute under the
|
||||||
|
individual CLA. Work with your employer to contribute under the corporate CLA
|
||||||
|
instead.
|
||||||
|
|
||||||
|
Particularly, this clause in the individual CLA is the important one:
|
||||||
|
|
||||||
|
> 4. You represent that you are legally entitled to grant the above license. If
|
||||||
|
> your employer(s) has rights to intellectual property that you create that
|
||||||
|
> includes your Contributions, you represent that you have received permission
|
||||||
|
> to make Contributions on behalf of that employer, that your employer has
|
||||||
|
> waived such rights for your Contributions to Phacility, or that your employer
|
||||||
|
> has executed a separate Corporate CLA with Phacility.
|
||||||
|
|
||||||
|
Ownership of your work varies based on where you live, how you are employed,
|
||||||
|
and your agreements with your employer. However, at least in the US, it is
|
||||||
|
likely that your employer owns your work unless you have anticipated conflicts
|
||||||
|
and specifically avoided them. This generally makes sense: if you are paid by
|
||||||
|
your employer for your work, they own the product of your work and you receive
|
||||||
|
salary and benefits in fair exchange for that work.
|
||||||
|
|
||||||
|
Your employer may have an ownership claim on your work even if you perform it
|
||||||
|
on your own time, if you use their equipment (like a company laptop or phone),
|
||||||
|
resources, facilities, or trade secrets, or signed something like an "Invention
|
||||||
|
Assignment Agreement" when you were hired. Such agreements are common. The
|
||||||
|
details of the strength of their claim will vary based on your situation and
|
||||||
|
local law.
|
||||||
|
|
||||||
|
If you are unsure, you should speak with your employer or a lawyer. If you
|
||||||
|
contribute code you do not own under the individual CLA, you are exposing
|
||||||
|
yourself to liability. You may also be exposing us to liablity, but we'll have
|
||||||
|
the CLA on our side to show that we were unwilling pawns in your malicious
|
||||||
|
scheme to defraud your employer.
|
||||||
|
|
||||||
|
The good news is that most employers are happy to contribute to open source
|
||||||
|
projects. Incentives are generally well aligned: they get features they want,
|
||||||
|
and it reflects well on them. In the past, potential contributors who have
|
||||||
|
approached their employers about a corporate CLA have generally had little
|
||||||
|
difficulty getting approval.
|
|
@ -29,16 +29,13 @@ configure.
|
||||||
== Script... ==
|
== Script... ==
|
||||||
|
|
||||||
The script will be invoked once for each file that is to be linted, with
|
The script will be invoked once for each file that is to be linted, with
|
||||||
the file passed as the first argument. The file may begin with a "-"; ensure
|
the file passed as the first argument. The file may begin with a `-`; ensure
|
||||||
your script will not interpret such files as flags (perhaps by ending your
|
your script will not interpret such files as flags (perhaps by ending your
|
||||||
script configuration with "--", if its argument parser supports that).
|
script configuration with `--`, if its argument parser supports that).
|
||||||
|
|
||||||
Note that when run via `arc diff`, the list of files to be linted includes
|
Note that when run via `arc diff`, the list of files to be linted does not
|
||||||
deleted files and files that were moved away by the change. The linter should
|
include binary files, symlinks, deleted files, or directories. These special
|
||||||
not assume the path it is given exists, and it is not an error for the
|
file types are not supported by this linter.
|
||||||
linter to be invoked with paths which are no longer there. (Every affected
|
|
||||||
path is subject to lint because some linters may raise errors in other files
|
|
||||||
when a file is removed, or raise an error about its removal.)
|
|
||||||
|
|
||||||
The script should emit lint messages to stdout, which will be parsed with
|
The script should emit lint messages to stdout, which will be parsed with
|
||||||
the provided regex.
|
the provided regex.
|
||||||
|
|
|
@ -17,7 +17,11 @@ final class PhabricatorDaemonOverseerModule
|
||||||
}
|
}
|
||||||
|
|
||||||
public function shouldReloadDaemons() {
|
public function shouldReloadDaemons() {
|
||||||
if ($this->timestamp < PhabricatorTime::getNow() - 10) {
|
$now = PhabricatorTime::getNow();
|
||||||
|
$ago = ($now - $this->timestamp);
|
||||||
|
|
||||||
|
// Don't check more than once every 10 seconds.
|
||||||
|
if ($ago < 10) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,16 @@ class PhabricatorBarePageView extends AphrontPageView {
|
||||||
'maximum-scale=1',
|
'maximum-scale=1',
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$mask_icon = phutil_tag(
|
||||||
|
'link',
|
||||||
|
array(
|
||||||
|
'rel' => 'mask-icon',
|
||||||
|
'color' => '#3D4B67',
|
||||||
|
'href' => celerity_get_resource_uri(
|
||||||
|
'/rsrc/favicons/mask-icon.svg'),
|
||||||
|
));
|
||||||
|
|
||||||
$icon_tag_76 = phutil_tag(
|
$icon_tag_76 = phutil_tag(
|
||||||
'link',
|
'link',
|
||||||
array(
|
array(
|
||||||
|
@ -130,8 +140,9 @@ class PhabricatorBarePageView extends AphrontPageView {
|
||||||
|
|
||||||
$developer = PhabricatorEnv::getEnvConfig('phabricator.developer-mode');
|
$developer = PhabricatorEnv::getEnvConfig('phabricator.developer-mode');
|
||||||
return hsprintf(
|
return hsprintf(
|
||||||
'%s%s%s%s%s%s%s%s',
|
'%s%s%s%s%s%s%s%s%s',
|
||||||
$viewport_tag,
|
$viewport_tag,
|
||||||
|
$mask_icon,
|
||||||
$icon_tag_76,
|
$icon_tag_76,
|
||||||
$icon_tag_120,
|
$icon_tag_120,
|
||||||
$icon_tag_152,
|
$icon_tag_152,
|
||||||
|
|
|
@ -31,7 +31,7 @@ final class PHUIDocumentViewPro extends AphrontTagView {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setToc(PHUIListView $toc) {
|
public function setToc($toc) {
|
||||||
$this->toc = $toc;
|
$this->toc = $toc;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -725,7 +725,26 @@ final class PHUIIconView extends AphrontTagView {
|
||||||
'fa-vimeo',
|
'fa-vimeo',
|
||||||
'fa-black-tie',
|
'fa-black-tie',
|
||||||
'fa-fonticons',
|
'fa-fonticons',
|
||||||
|
'fa-reddit-alien',
|
||||||
|
'fa-edge',
|
||||||
|
'fa-credit-card-alt',
|
||||||
|
'fa-codiepie:before',
|
||||||
|
'fa-modx',
|
||||||
|
'fa-fort-awesome',
|
||||||
|
'fa-usb',
|
||||||
|
'fa-product-hunt',
|
||||||
|
'fa-mixcloud',
|
||||||
|
'fa-scribd',
|
||||||
|
'fa-pause-circle',
|
||||||
|
'fa-pause-circle-o',
|
||||||
|
'fa-stop-circle',
|
||||||
|
'fa-stop-circle-o',
|
||||||
|
'fa-shopping-bag',
|
||||||
|
'fa-shopping-basket',
|
||||||
|
'fa-hashtag',
|
||||||
|
'fa-bluetooth',
|
||||||
|
'fa-bluetooth-b',
|
||||||
|
'fa-percent',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,9 @@ final class PHUIRemarkupPreviewPanel extends AphrontTagView {
|
||||||
private $loadingText;
|
private $loadingText;
|
||||||
private $controlID;
|
private $controlID;
|
||||||
private $previewURI;
|
private $previewURI;
|
||||||
|
private $previewType;
|
||||||
|
|
||||||
|
const DOCUMENT = 'document';
|
||||||
|
|
||||||
protected function canAppendChild() {
|
protected function canAppendChild() {
|
||||||
return false;
|
return false;
|
||||||
|
@ -34,6 +37,11 @@ final class PHUIRemarkupPreviewPanel extends AphrontTagView {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setPreviewType($type) {
|
||||||
|
$this->previewType = $type;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
protected function getTagName() {
|
protected function getTagName() {
|
||||||
return 'div';
|
return 'div';
|
||||||
}
|
}
|
||||||
|
@ -73,16 +81,6 @@ final class PHUIRemarkupPreviewPanel extends AphrontTagView {
|
||||||
),
|
),
|
||||||
nonempty($this->loadingText, pht('Loading preview...')));
|
nonempty($this->loadingText, pht('Loading preview...')));
|
||||||
|
|
||||||
$header = null;
|
|
||||||
if ($this->header) {
|
|
||||||
$header = phutil_tag(
|
|
||||||
'div',
|
|
||||||
array(
|
|
||||||
'class' => 'phui-preview-header',
|
|
||||||
),
|
|
||||||
$this->header);
|
|
||||||
}
|
|
||||||
|
|
||||||
$preview = phutil_tag(
|
$preview = phutil_tag(
|
||||||
'div',
|
'div',
|
||||||
array(
|
array(
|
||||||
|
@ -91,7 +89,26 @@ final class PHUIRemarkupPreviewPanel extends AphrontTagView {
|
||||||
),
|
),
|
||||||
$loading);
|
$loading);
|
||||||
|
|
||||||
$content = array($header, $preview);
|
if (!$this->previewType) {
|
||||||
|
$header = null;
|
||||||
|
if ($this->header) {
|
||||||
|
$header = phutil_tag(
|
||||||
|
'div',
|
||||||
|
array(
|
||||||
|
'class' => 'phui-preview-header',
|
||||||
|
),
|
||||||
|
$this->header);
|
||||||
|
}
|
||||||
|
$content = array($header, $preview);
|
||||||
|
|
||||||
|
} else if ($this->previewType == self::DOCUMENT) {
|
||||||
|
$header = id(new PHUIHeaderView())
|
||||||
|
->setHeader(pht('%s (Preview)', $this->header));
|
||||||
|
|
||||||
|
$content = id(new PHUIDocumentViewPro())
|
||||||
|
->setHeader($header)
|
||||||
|
->appendChild($preview);
|
||||||
|
}
|
||||||
|
|
||||||
return id(new PHUIObjectBoxView())
|
return id(new PHUIObjectBoxView())
|
||||||
->appendChild($content)
|
->appendChild($content)
|
||||||
|
|
|
@ -155,8 +155,11 @@
|
||||||
margin: 4px 0;
|
margin: 4px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phabricator-remarkup .remarkup-header + .remarkup-header {
|
.phabricator-remarkup h3.remarkup-header + h4.remarkup-header {
|
||||||
margin-top: 0px;
|
color: {$bluetext};
|
||||||
|
font-weight: normal;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
margin-top: -4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phabricator-remarkup blockquote {
|
.phabricator-remarkup blockquote {
|
||||||
|
@ -168,6 +171,10 @@
|
||||||
background-color: {$lightbluebackground};
|
background-color: {$lightbluebackground};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.phabricator-remarkup blockquote p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.phabricator-remarkup blockquote blockquote {
|
.phabricator-remarkup blockquote blockquote {
|
||||||
background-color: rgba(175,175,175, .1);
|
background-color: rgba(175,175,175, .1);
|
||||||
}
|
}
|
||||||
|
@ -363,12 +370,12 @@ body div.phabricator-remarkup.remarkup-has-toc
|
||||||
padding-top: 0;
|
padding-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
body .phabricator-remarkup > *:first-child,
|
body .phabricator-standard-page div.phabricator-remarkup *:first-child,
|
||||||
body .phabricator-remarkup .remarkup-header + * {
|
body .phabricator-standard-page div.phabricator-remarkup .remarkup-header + * {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
body .phabricator-remarkup *:last-child {
|
body div.phabricator-remarkup > *:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
66
webroot/rsrc/css/font/font-awesome.css
vendored
66
webroot/rsrc/css/font/font-awesome.css
vendored
|
@ -3,15 +3,15 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome
|
* Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
|
||||||
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
||||||
*/
|
*/
|
||||||
/* FONT PATH
|
/* FONT PATH
|
||||||
* -------------------------- */
|
* -------------------------- */
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'FontAwesome';
|
font-family: 'FontAwesome';
|
||||||
src: url('/rsrc/externals/font/fontawesome/fontawesome-webfont.eot?v=4.4.0');
|
src: url('/rsrc/externals/font/fontawesome/fontawesome-webfont.eot?v=4.5.0');
|
||||||
src: url('/rsrc/externals/font/fontawesome/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('/rsrc/externals/font/fontawesome/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('/rsrc/externals/font/fontawesome/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('/rsrc/externals/font/fontawesome/fontawesome-webfont.ttf?v=4.4.0') format('truetype');
|
src: url('/rsrc/externals/font/fontawesome/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('/rsrc/externals/font/fontawesome/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('/rsrc/externals/font/fontawesome/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('/rsrc/externals/font/fontawesome/fontawesome-webfont.ttf?v=4.5.0') format('truetype');
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
@ -1887,3 +1887,63 @@
|
||||||
.fa-fonticons:before {
|
.fa-fonticons:before {
|
||||||
content: "\f280";
|
content: "\f280";
|
||||||
}
|
}
|
||||||
|
.fa-reddit-alien:before {
|
||||||
|
content: "\f281";
|
||||||
|
}
|
||||||
|
.fa-edge:before {
|
||||||
|
content: "\f282";
|
||||||
|
}
|
||||||
|
.fa-credit-card-alt:before {
|
||||||
|
content: "\f283";
|
||||||
|
}
|
||||||
|
.fa-codiepie:before {
|
||||||
|
content: "\f284";
|
||||||
|
}
|
||||||
|
.fa-modx:before {
|
||||||
|
content: "\f285";
|
||||||
|
}
|
||||||
|
.fa-fort-awesome:before {
|
||||||
|
content: "\f286";
|
||||||
|
}
|
||||||
|
.fa-usb:before {
|
||||||
|
content: "\f287";
|
||||||
|
}
|
||||||
|
.fa-product-hunt:before {
|
||||||
|
content: "\f288";
|
||||||
|
}
|
||||||
|
.fa-mixcloud:before {
|
||||||
|
content: "\f289";
|
||||||
|
}
|
||||||
|
.fa-scribd:before {
|
||||||
|
content: "\f28a";
|
||||||
|
}
|
||||||
|
.fa-pause-circle:before {
|
||||||
|
content: "\f28b";
|
||||||
|
}
|
||||||
|
.fa-pause-circle-o:before {
|
||||||
|
content: "\f28c";
|
||||||
|
}
|
||||||
|
.fa-stop-circle:before {
|
||||||
|
content: "\f28d";
|
||||||
|
}
|
||||||
|
.fa-stop-circle-o:before {
|
||||||
|
content: "\f28e";
|
||||||
|
}
|
||||||
|
.fa-shopping-bag:before {
|
||||||
|
content: "\f290";
|
||||||
|
}
|
||||||
|
.fa-shopping-basket:before {
|
||||||
|
content: "\f291";
|
||||||
|
}
|
||||||
|
.fa-hashtag:before {
|
||||||
|
content: "\f292";
|
||||||
|
}
|
||||||
|
.fa-bluetooth:before {
|
||||||
|
content: "\f293";
|
||||||
|
}
|
||||||
|
.fa-bluetooth-b:before {
|
||||||
|
content: "\f294";
|
||||||
|
}
|
||||||
|
.fa-percent:before {
|
||||||
|
content: "\f295";
|
||||||
|
}
|
||||||
|
|
|
@ -73,6 +73,20 @@ a.button.phui-document-toc {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.phui-document-view-pro .phui-document-toc-content {
|
||||||
|
margin: 4px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phui-document-view-pro .phui-document-toc-header {
|
||||||
|
font-weight: bold;
|
||||||
|
color: {$bluetext};
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.phui-document-view-pro .phui-document-toc-content li {
|
||||||
|
margin: 4px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
.phui-document-view-pro .phui-document-content .phabricator-remarkup {
|
.phui-document-view-pro .phui-document-content .phabricator-remarkup {
|
||||||
padding: 16px 0;
|
padding: 16px 0;
|
||||||
line-height: 1.7em;
|
line-height: 1.7em;
|
||||||
|
|
|
@ -96,8 +96,9 @@
|
||||||
.legalpad .phui-document-content .phui-property-list-view {
|
.legalpad .phui-document-content .phui-property-list-view {
|
||||||
border: none;
|
border: none;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
border-radius: 3px;
|
||||||
margin: 16px 0 0 0;
|
margin: 16px 0 0 0;
|
||||||
background-color: {$lightbluebackground};
|
background-color: {$bluebackground};
|
||||||
}
|
}
|
||||||
|
|
||||||
.phui-document-content {
|
.phui-document-content {
|
||||||
|
@ -122,10 +123,6 @@
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.device-phone .phui-document-content .phabricator-remarkup-toc {
|
|
||||||
width: 120px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phui-document-content .phabricator-remarkup .remarkup-code-block {
|
.phui-document-content .phabricator-remarkup .remarkup-code-block {
|
||||||
clear: both;
|
clear: both;
|
||||||
margin: 16px 0;
|
margin: 16px 0;
|
||||||
|
@ -139,41 +136,17 @@
|
||||||
background-color: {$lightgreybackground};
|
background-color: {$lightgreybackground};
|
||||||
}
|
}
|
||||||
|
|
||||||
.phui-document-view .phabricator-remarkup.remarkup-has-toc {
|
|
||||||
position: relative;
|
|
||||||
margin-right: 192px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.phui-document-view .remarkup-has-toc .phabricator-remarkup-toc {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: -186px;
|
|
||||||
bottom: 0;
|
|
||||||
border-left: 1px solid {$thinblueborder};
|
|
||||||
padding: 16px 12px;
|
|
||||||
margin: 0;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-phone .phui-document-view .phabricator-remarkup.remarkup-has-toc {
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.device-phone .phui-document-view .remarkup-has-toc .phabricator-remarkup-toc {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body .phui-document-view .phui-header-shell.phui-bleed-header {
|
body .phui-document-view .phui-header-shell.phui-bleed-header {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phui-document-view .phui-property-list-section-header {
|
.phui-document-view .phui-property-list-section-header {
|
||||||
padding: 12px 16px 0px;
|
padding: 20px 24px 0px;
|
||||||
border-top: none;
|
border-top: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phui-document-view .phui-property-list-text-content {
|
.phui-document-view .phui-property-list-text-content {
|
||||||
padding: 0 16px;
|
padding: 0 24px 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phui-document-view .PhabricatorMonospaced,
|
.phui-document-view .PhabricatorMonospaced,
|
||||||
|
|
|
@ -26,8 +26,11 @@
|
||||||
font-family: 'Aleo', {$fontfamily};
|
font-family: 'Aleo', {$fontfamily};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.phui-document-view .phabricator-remarkup .remarkup-header {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
.phui-document-view .phabricator-remarkup h2.remarkup-header {
|
.phui-document-view .phabricator-remarkup h2.remarkup-header {
|
||||||
padding: 0 24px 8px 0;
|
padding: 0 24px 8px 0;
|
||||||
border-bottom: 1px solid {$thinblueborder};
|
margin: 32px 0 4px;
|
||||||
margin: 32px 0 16px;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -527,3 +527,7 @@ properly, and submit values. */
|
||||||
.aphront-form-choose-table .aphront-form-choose-button-cell {
|
.aphront-form-choose-table .aphront-form-choose-button-cell {
|
||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.aphront-form-preview-hidden {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
* <div /> or not. It should probably move to the Engine in all cases, but
|
* <div /> or not. It should probably move to the Engine in all cases, but
|
||||||
* until we do that get rid of the extra spacing generated by the inner div.
|
* until we do that get rid of the extra spacing generated by the inner div.
|
||||||
*/
|
*/
|
||||||
.phui-remarkup-preview .phabricator-remarkup .phabricator-remarkup {
|
body .phui-remarkup-preview .phabricator-remarkup .phabricator-remarkup {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
20
webroot/rsrc/favicons/mask-icon.svg
Normal file
20
webroot/rsrc/favicons/mask-icon.svg
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 152 152" style="enable-background:new 0 0 152 152;"
|
||||||
|
xml:space="preserve">
|
||||||
|
<g>
|
||||||
|
<path d="M152,152c-50.7,0-101.3,0-152,0C0,101.3,0,50.7,0,0c50.7,0,101.3,0,152,
|
||||||
|
0C152,50.7,152,101.3,152,152z M36.3,109.2
|
||||||
|
c3,5.7,5.8,11.3,9,17.5c7.1-3,13.7-5.8,20.6-8.7c-2.2-6.8-4.1-12.8-6-18.7c4.3
|
||||||
|
-2.8,8.1-5.4,12.1-8c5,4.3,9.7,8.3,14.1,12.1
|
||||||
|
c5.7-5.6,10.8-10.6,16.1-15.8C98,82.6,94,77.8,90,73.2c3-4.4,5.6-8.2,8.2-11.9
|
||||||
|
c6.3,2,12.1,3.8,18.6,5.9c2.9-7,5.7-13.6,8.5-20.6
|
||||||
|
c-6.3-3.3-11.8-6.2-17.4-9.1c1-5,1.9-9.5,2.9-14.1c6.6-0.6,12.8-1.2,19.2-1.8
|
||||||
|
c0-4.4,0-8.1,0-12c-17.5,0-34.7,0-51.9,0
|
||||||
|
C77.5,43.6,52.7,77.3,9.6,79.4c0,17.2,0,34.4,0,52.3c3.8-0.2,7.2-0.4,10.9-0.6
|
||||||
|
c0.6-6.6,1.2-12.8,1.7-19.2
|
||||||
|
C27.1,111,31.6,110.1,36.3,109.2z M9.6,50.6c20.4,3.3,44.3-21.2,40.2-41c-13.3,
|
||||||
|
0-26.6,0-40.2,0C9.6,23.6,9.6,37.1,9.6,50.6z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1 KiB |
|
@ -8,7 +8,6 @@
|
||||||
|
|
||||||
JX.behavior('phame-post-preview', function(config) {
|
JX.behavior('phame-post-preview', function(config) {
|
||||||
|
|
||||||
var body = JX.$(config.body);
|
|
||||||
var title = JX.$(config.title);
|
var title = JX.$(config.title);
|
||||||
var phame_title = JX.$(config.phame_title);
|
var phame_title = JX.$(config.phame_title);
|
||||||
var sync_titles = true;
|
var sync_titles = true;
|
||||||
|
@ -54,27 +53,15 @@ JX.behavior('phame-post-preview', function(config) {
|
||||||
return s;
|
return s;
|
||||||
};
|
};
|
||||||
|
|
||||||
var callback = function(r) {
|
|
||||||
JX.DOM.setContent(JX.$(config.preview), JX.$H(r));
|
|
||||||
};
|
|
||||||
|
|
||||||
var getdata = function() {
|
var getdata = function() {
|
||||||
return {
|
return {
|
||||||
body : body.value,
|
|
||||||
title : title.value,
|
title : title.value,
|
||||||
phame_title : phame_title.value
|
phame_title : phame_title.value
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
var request = new JX.PhabricatorShapedRequest(config.uri, callback, getdata);
|
|
||||||
var trigger = JX.bind(request, request.trigger);
|
|
||||||
|
|
||||||
JX.DOM.listen(body, 'keydown', null, trigger);
|
|
||||||
JX.DOM.listen(title, 'keydown', null, trigger);
|
|
||||||
JX.DOM.listen(title, 'keyup', null, titleCallback);
|
JX.DOM.listen(title, 'keyup', null, titleCallback);
|
||||||
JX.DOM.listen(phame_title, 'keydown', null, trigger);
|
|
||||||
JX.DOM.listen(phame_title, 'keyup', null, phameTitleKeyupCallback);
|
JX.DOM.listen(phame_title, 'keyup', null, phameTitleKeyupCallback);
|
||||||
JX.DOM.listen(phame_title, 'blur', null, phameTitleBlurCallback);
|
JX.DOM.listen(phame_title, 'blur', null, phameTitleBlurCallback);
|
||||||
request.start();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
/**
|
||||||
|
* @provides javelin-behavior-editengine-reorder-fields
|
||||||
|
* @requires javelin-behavior
|
||||||
|
* javelin-stratcom
|
||||||
|
* javelin-workflow
|
||||||
|
* javelin-dom
|
||||||
|
* phabricator-draggable-list
|
||||||
|
*/
|
||||||
|
|
||||||
|
JX.behavior('editengine-reorder-fields', function(config) {
|
||||||
|
|
||||||
|
var root = JX.$(config.listID);
|
||||||
|
|
||||||
|
var list = new JX.DraggableList('editengine-form-field', root)
|
||||||
|
.setFindItemsHandler(function() {
|
||||||
|
return JX.DOM.scry(root, 'li', 'editengine-form-field');
|
||||||
|
});
|
||||||
|
|
||||||
|
list.listen('didDrop', function() {
|
||||||
|
var nodes = list.findItems();
|
||||||
|
|
||||||
|
var data;
|
||||||
|
var keys = [];
|
||||||
|
for (var ii = 0; ii < nodes.length; ii++) {
|
||||||
|
data = JX.Stratcom.getData(nodes[ii]);
|
||||||
|
keys.push(data.fieldKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
JX.$(config.inputID).value = keys.join(',');
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in a new issue