diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index d2f4de11c..ed720acaf 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -1,4369 +1,4368 @@ <?php /** * This file is automatically generated. Use 'celerity_mapper.php' to rebuild * it. * @generated */ celerity_register_resource_map(array( '/rsrc/image/actions/edit.png' => array( 'hash' => 'ae90914d120ac3838ddc633b480343f3', 'uri' => '/res/ae90914d/rsrc/image/actions/edit.png', 'disk' => '/rsrc/image/actions/edit.png', 'type' => 'png', ), '/rsrc/image/apple-touch-icon.png' => array( 'hash' => '3380adf2dd4a5efa0885618bc5943640', 'uri' => '/res/3380adf2/rsrc/image/apple-touch-icon.png', 'disk' => '/rsrc/image/apple-touch-icon.png', 'type' => 'png', ), '/rsrc/image/avatar.png' => array( 'hash' => '1c5f255071537f05406adee86717ff27', 'uri' => '/res/1c5f2550/rsrc/image/avatar.png', 'disk' => '/rsrc/image/avatar.png', 'type' => 'png', ), '/rsrc/image/checker_dark.png' => array( 'hash' => '640f795343df76ebe5409aae6187e57f', 'uri' => '/res/640f7953/rsrc/image/checker_dark.png', 'disk' => '/rsrc/image/checker_dark.png', 'type' => 'png', ), '/rsrc/image/checker_light.png' => array( 'hash' => '7f8f3ef8beb0f2cc4cc69efb9e1c3308', 'uri' => '/res/7f8f3ef8/rsrc/image/checker_light.png', 'disk' => '/rsrc/image/checker_light.png', 'type' => 'png', ), '/rsrc/image/credit_cards.png' => array( 'hash' => '681448de424ea159b6ea68af04c046ae', 'uri' => '/res/681448de/rsrc/image/credit_cards.png', 'disk' => '/rsrc/image/credit_cards.png', 'type' => 'png', ), '/rsrc/image/darkload.gif' => array( 'hash' => '3a52cb7145d6e70f461fed21273117f2', 'uri' => '/res/3a52cb71/rsrc/image/darkload.gif', 'disk' => '/rsrc/image/darkload.gif', 'type' => 'gif', ), '/rsrc/image/divot.png' => array( 'hash' => '3be267bd11ea375bf68e808893718e0e', 'uri' => '/res/3be267bd/rsrc/image/divot.png', 'disk' => '/rsrc/image/divot.png', 'type' => 'png', ), '/rsrc/image/grippy_texture.png' => array( 'hash' => 'a8945e12ceeaddd5b491a8d81cfa19c1', 'uri' => '/res/a8945e12/rsrc/image/grippy_texture.png', 'disk' => '/rsrc/image/grippy_texture.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/arrow_branch.png' => array( 'hash' => 'f27b67520766e3d971722bcff703f3a8', 'uri' => '/res/f27b6752/rsrc/image/icon/fatcow/arrow_branch.png', 'disk' => '/rsrc/image/icon/fatcow/arrow_branch.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/arrow_merge.png' => array( 'hash' => 'c4bd97f3b1257439e2123ef69d2194d0', 'uri' => '/res/c4bd97f3/rsrc/image/icon/fatcow/arrow_merge.png', 'disk' => '/rsrc/image/icon/fatcow/arrow_merge.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/bullet_black.png' => array( 'hash' => '718f9c560a13766796f1be7dfaadeeab', 'uri' => '/res/718f9c56/rsrc/image/icon/fatcow/bullet_black.png', 'disk' => '/rsrc/image/icon/fatcow/bullet_black.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/bullet_orange.png' => array( 'hash' => 'c3bf91b65baacb27f2af143ab9180119', 'uri' => '/res/c3bf91b6/rsrc/image/icon/fatcow/bullet_orange.png', 'disk' => '/rsrc/image/icon/fatcow/bullet_orange.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/bullet_red.png' => array( 'hash' => '00273e4aa6ea3de630295610d6c9560c', 'uri' => '/res/00273e4a/rsrc/image/icon/fatcow/bullet_red.png', 'disk' => '/rsrc/image/icon/fatcow/bullet_red.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/calendar_edit.png' => array( 'hash' => 'de249c0f4f37bf5b2c69ff39ec5573fb', 'uri' => '/res/de249c0f/rsrc/image/icon/fatcow/calendar_edit.png', 'disk' => '/rsrc/image/icon/fatcow/calendar_edit.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/document_black.png' => array( 'hash' => '44d65a7f05a9c921719deedc160d68f7', 'uri' => '/res/44d65a7f/rsrc/image/icon/fatcow/document_black.png', 'disk' => '/rsrc/image/icon/fatcow/document_black.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_blue.png' => array( 'hash' => '75a080492f900fbe489e4b27e403962b', 'uri' => '/res/75a08049/rsrc/image/icon/fatcow/flag_blue.png', 'disk' => '/rsrc/image/icon/fatcow/flag_blue.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_finish.png' => array( 'hash' => '4af11fc7fab8e4610cbc3c88a02d4f78', 'uri' => '/res/4af11fc7/rsrc/image/icon/fatcow/flag_finish.png', 'disk' => '/rsrc/image/icon/fatcow/flag_finish.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_ghost.png' => array( 'hash' => '14c9f30a37b43f276f27a27a924bf02d', 'uri' => '/res/14c9f30a/rsrc/image/icon/fatcow/flag_ghost.png', 'disk' => '/rsrc/image/icon/fatcow/flag_ghost.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_green.png' => array( 'hash' => 'fed01374cd396cb774872762dcc447e1', 'uri' => '/res/fed01374/rsrc/image/icon/fatcow/flag_green.png', 'disk' => '/rsrc/image/icon/fatcow/flag_green.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_orange.png' => array( 'hash' => '88008cb8bb99761a37e5a743e2455aeb', 'uri' => '/res/88008cb8/rsrc/image/icon/fatcow/flag_orange.png', 'disk' => '/rsrc/image/icon/fatcow/flag_orange.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_pink.png' => array( 'hash' => '2f199f06ffc3dfc81b7561a057e0bc33', 'uri' => '/res/2f199f06/rsrc/image/icon/fatcow/flag_pink.png', 'disk' => '/rsrc/image/icon/fatcow/flag_pink.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_purple.png' => array( 'hash' => '16358629dc86c39550b575586eb5df80', 'uri' => '/res/16358629/rsrc/image/icon/fatcow/flag_purple.png', 'disk' => '/rsrc/image/icon/fatcow/flag_purple.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_red.png' => array( 'hash' => '210c28b4d93c439a499f5814f5e05772', 'uri' => '/res/210c28b4/rsrc/image/icon/fatcow/flag_red.png', 'disk' => '/rsrc/image/icon/fatcow/flag_red.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/flag_yellow.png' => array( 'hash' => 'bdfd73744a80bb80329ae50bc8a5f962', 'uri' => '/res/bdfd7374/rsrc/image/icon/fatcow/flag_yellow.png', 'disk' => '/rsrc/image/icon/fatcow/flag_yellow.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/folder.png' => array( 'hash' => '25e46cf9d210dde2242332296f79938c', 'uri' => '/res/25e46cf9/rsrc/image/icon/fatcow/folder.png', 'disk' => '/rsrc/image/icon/fatcow/folder.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/folder_go.png' => array( 'hash' => 'ba922ff7959309f51a14cb7ed5124d8b', 'uri' => '/res/ba922ff7/rsrc/image/icon/fatcow/folder_go.png', 'disk' => '/rsrc/image/icon/fatcow/folder_go.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/key_question.png' => array( 'hash' => '530a6448a4b91edec091a9292ccfd3d9', 'uri' => '/res/530a6448/rsrc/image/icon/fatcow/key_question.png', 'disk' => '/rsrc/image/icon/fatcow/key_question.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/link.png' => array( 'hash' => 'be1bea49b216548433014f3324902928', 'uri' => '/res/be1bea49/rsrc/image/icon/fatcow/link.png', 'disk' => '/rsrc/image/icon/fatcow/link.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/page_white_edit.png' => array( 'hash' => 'e7b7e7f2d9730bc80bc5c9eac1f3e36d', 'uri' => '/res/e7b7e7f2/rsrc/image/icon/fatcow/page_white_edit.png', 'disk' => '/rsrc/image/icon/fatcow/page_white_edit.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/page_white_link.png' => array( 'hash' => '1cfbad14412bda6c6f132dcc7c8725fd', 'uri' => '/res/1cfbad14/rsrc/image/icon/fatcow/page_white_link.png', 'disk' => '/rsrc/image/icon/fatcow/page_white_link.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/page_white_put.png' => array( 'hash' => 'bb7308aa5ac40137a8262da395a267fd', 'uri' => '/res/bb7308aa/rsrc/image/icon/fatcow/page_white_put.png', 'disk' => '/rsrc/image/icon/fatcow/page_white_put.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/page_white_text.png' => array( 'hash' => 'e47d590b626f617fb7d1d44e96e8fd11', 'uri' => '/res/e47d590b/rsrc/image/icon/fatcow/page_white_text.png', 'disk' => '/rsrc/image/icon/fatcow/page_white_text.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/source/conduit.png' => array( 'hash' => '1cae0656580aa3cd0b54b9d98306b1b9', 'uri' => '/res/1cae0656/rsrc/image/icon/fatcow/source/conduit.png', 'disk' => '/rsrc/image/icon/fatcow/source/conduit.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/source/email.png' => array( 'hash' => '93bdb3e168da1ed68f50c42125729d4e', 'uri' => '/res/93bdb3e1/rsrc/image/icon/fatcow/source/email.png', 'disk' => '/rsrc/image/icon/fatcow/source/email.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/source/fax.png' => array( 'hash' => 'd7dedf229841f2d041b347afd881596f', 'uri' => '/res/d7dedf22/rsrc/image/icon/fatcow/source/fax.png', 'disk' => '/rsrc/image/icon/fatcow/source/fax.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/source/mobile.png' => array( 'hash' => '786e7146d1e7d7318baf76c9d2baad97', 'uri' => '/res/786e7146/rsrc/image/icon/fatcow/source/mobile.png', 'disk' => '/rsrc/image/icon/fatcow/source/mobile.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/source/tablet.png' => array( 'hash' => '374cd40e4965be6b2fbdef4059d0ca05', 'uri' => '/res/374cd40e/rsrc/image/icon/fatcow/source/tablet.png', 'disk' => '/rsrc/image/icon/fatcow/source/tablet.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/source/web.png' => array( 'hash' => 'f4882a8f5619ba505ca033f72a340635', 'uri' => '/res/f4882a8f/rsrc/image/icon/fatcow/source/web.png', 'disk' => '/rsrc/image/icon/fatcow/source/web.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/default160x120.png' => array( 'hash' => '1b52ebd1fe0eee3ed0abfc382991b265', 'uri' => '/res/1b52ebd1/rsrc/image/icon/fatcow/thumbnails/default160x120.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/default160x120.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/default60x45.png' => array( 'hash' => '048d851d8d1daad4754e891e734c1899', 'uri' => '/res/048d851d/rsrc/image/icon/fatcow/thumbnails/default60x45.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/default60x45.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/image160x120.png' => array( 'hash' => '434acbd8dbbc2da9f09f6205a396eba1', 'uri' => '/res/434acbd8/rsrc/image/icon/fatcow/thumbnails/image160x120.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/image160x120.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/image60x45.png' => array( 'hash' => '29f7872dc53588fe0b8f0b330c7ee23a', 'uri' => '/res/29f7872d/rsrc/image/icon/fatcow/thumbnails/image60x45.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/image60x45.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png' => array( 'hash' => '39d2e22541658a3472ba41ae2fa548e5', 'uri' => '/res/39d2e225/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/pdf160x120.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png' => array( 'hash' => 'b3572e9317cbed5184d12bdfabed2727', 'uri' => '/res/b3572e93/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/pdf60x45.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/zip160x120.png' => array( 'hash' => 'e505108688a903b5cfb674707a289bcc', 'uri' => '/res/e5051086/rsrc/image/icon/fatcow/thumbnails/zip160x120.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/zip160x120.png', 'type' => 'png', ), '/rsrc/image/icon/fatcow/thumbnails/zip60x45.png' => array( 'hash' => 'f00716f4e8f7a95e70d43504f06be0a6', 'uri' => '/res/f00716f4/rsrc/image/icon/fatcow/thumbnails/zip60x45.png', 'disk' => '/rsrc/image/icon/fatcow/thumbnails/zip60x45.png', 'type' => 'png', ), '/rsrc/image/icon/lightbox/close-2.png' => array( 'hash' => '72ff3ddcc1ed5d19a715ed6242114b53', 'uri' => '/res/72ff3ddc/rsrc/image/icon/lightbox/close-2.png', 'disk' => '/rsrc/image/icon/lightbox/close-2.png', 'type' => 'png', ), '/rsrc/image/icon/lightbox/close-hover-2.png' => array( 'hash' => '6ad4bd4a7820547a1d9041752546ba16', 'uri' => '/res/6ad4bd4a/rsrc/image/icon/lightbox/close-hover-2.png', 'disk' => '/rsrc/image/icon/lightbox/close-hover-2.png', 'type' => 'png', ), '/rsrc/image/icon/lightbox/left-arrow-2.png' => array( 'hash' => 'd84cbb0d42739f87b8f25b2f1d2f1153', 'uri' => '/res/d84cbb0d/rsrc/image/icon/lightbox/left-arrow-2.png', 'disk' => '/rsrc/image/icon/lightbox/left-arrow-2.png', 'type' => 'png', ), '/rsrc/image/icon/lightbox/left-arrow-hover-2.png' => array( 'hash' => 'cdf05f98fff3f390cd8df0c89894a3e1', 'uri' => '/res/cdf05f98/rsrc/image/icon/lightbox/left-arrow-hover-2.png', 'disk' => '/rsrc/image/icon/lightbox/left-arrow-hover-2.png', 'type' => 'png', ), '/rsrc/image/icon/lightbox/right-arrow-2.png' => array( 'hash' => '52021038cb6995c71f62a804bc2d420d', 'uri' => '/res/52021038/rsrc/image/icon/lightbox/right-arrow-2.png', 'disk' => '/rsrc/image/icon/lightbox/right-arrow-2.png', 'type' => 'png', ), '/rsrc/image/icon/lightbox/right-arrow-hover-2.png' => array( 'hash' => '65d5756b7b9cfcdeb2eb197a9aa6bbd2', 'uri' => '/res/65d5756b/rsrc/image/icon/lightbox/right-arrow-hover-2.png', 'disk' => '/rsrc/image/icon/lightbox/right-arrow-hover-2.png', 'type' => 'png', ), '/rsrc/image/icon/subscribe.png' => array( 'hash' => '5f47a4b17de245af39a4e7a097e40623', 'uri' => '/res/5f47a4b1/rsrc/image/icon/subscribe.png', 'disk' => '/rsrc/image/icon/subscribe.png', 'type' => 'png', ), '/rsrc/image/icon/tango/attachment.png' => array( 'hash' => '776fed2de89803fd8a0ba4b9deede230', 'uri' => '/res/776fed2d/rsrc/image/icon/tango/attachment.png', 'disk' => '/rsrc/image/icon/tango/attachment.png', 'type' => 'png', ), '/rsrc/image/icon/tango/edit.png' => array( 'hash' => 'c0028d99dcf4e9559bbf3c88ce2d8a8d', 'uri' => '/res/c0028d99/rsrc/image/icon/tango/edit.png', 'disk' => '/rsrc/image/icon/tango/edit.png', 'type' => 'png', ), '/rsrc/image/icon/tango/go-down.png' => array( 'hash' => '96862812cbb0445573c264dc057b8300', 'uri' => '/res/96862812/rsrc/image/icon/tango/go-down.png', 'disk' => '/rsrc/image/icon/tango/go-down.png', 'type' => 'png', ), '/rsrc/image/icon/tango/log.png' => array( 'hash' => 'a6f72499bef279ff6807a7dbc5148f1e', 'uri' => '/res/a6f72499/rsrc/image/icon/tango/log.png', 'disk' => '/rsrc/image/icon/tango/log.png', 'type' => 'png', ), '/rsrc/image/icon/tango/upload.png' => array( 'hash' => '8c11b63d6d99db3d7159c5d9a94e3062', 'uri' => '/res/8c11b63d/rsrc/image/icon/tango/upload.png', 'disk' => '/rsrc/image/icon/tango/upload.png', 'type' => 'png', ), '/rsrc/image/icon/unsubscribe.png' => array( 'hash' => '29429ad65aa3af50b072b32087057361', 'uri' => '/res/29429ad6/rsrc/image/icon/unsubscribe.png', 'disk' => '/rsrc/image/icon/unsubscribe.png', 'type' => 'png', ), '/rsrc/image/loading.gif' => array( 'hash' => '664297671941142f37d8c89e717ff2ce', 'uri' => '/res/66429767/rsrc/image/loading.gif', 'disk' => '/rsrc/image/loading.gif', 'type' => 'gif', ), '/rsrc/image/loading/loading_24.gif' => array( 'hash' => 'd6dcc5e6111a44fb9a160fc27b19d85c', 'uri' => '/res/d6dcc5e6/rsrc/image/loading/loading_24.gif', 'disk' => '/rsrc/image/loading/loading_24.gif', 'type' => 'gif', ), '/rsrc/image/loading/loading_48.gif' => array( 'hash' => 'cb6fc6eb9c0a0efaf589978029080c58', 'uri' => '/res/cb6fc6eb/rsrc/image/loading/loading_48.gif', 'disk' => '/rsrc/image/loading/loading_48.gif', 'type' => 'gif', ), '/rsrc/image/main_texture.png' => array( 'hash' => 'e34d8143384721be73ec9b7532a977ab', 'uri' => '/res/e34d8143/rsrc/image/main_texture.png', 'disk' => '/rsrc/image/main_texture.png', 'type' => 'png', ), '/rsrc/image/menu_texture.png' => array( 'hash' => 'ad020b1529b3a3b3480ca9de1d5f1e40', 'uri' => '/res/ad020b15/rsrc/image/menu_texture.png', 'disk' => '/rsrc/image/menu_texture.png', 'type' => 'png', ), '/rsrc/image/people/harding.png' => array( 'hash' => '818b035ace2c480aa8df7b7f11cef58b', 'uri' => '/res/818b035a/rsrc/image/people/harding.png', 'disk' => '/rsrc/image/people/harding.png', 'type' => 'png', ), '/rsrc/image/people/jefferson.png' => array( 'hash' => '55fe807ff02f9320e595fb59442e2038', 'uri' => '/res/55fe807f/rsrc/image/people/jefferson.png', 'disk' => '/rsrc/image/people/jefferson.png', 'type' => 'png', ), '/rsrc/image/people/lincoln.png' => array( 'hash' => '2363337947ab52fd5fda79e4a004e930', 'uri' => '/res/23633379/rsrc/image/people/lincoln.png', 'disk' => '/rsrc/image/people/lincoln.png', 'type' => 'png', ), '/rsrc/image/people/mckinley.png' => array( 'hash' => '0b7b05dd47c49a0874670e5e8200bba8', 'uri' => '/res/0b7b05dd/rsrc/image/people/mckinley.png', 'disk' => '/rsrc/image/people/mckinley.png', 'type' => 'png', ), '/rsrc/image/people/taft.png' => array( 'hash' => 'f3e47d45b59b0b009fd536dabae9a151', 'uri' => '/res/f3e47d45/rsrc/image/people/taft.png', 'disk' => '/rsrc/image/people/taft.png', 'type' => 'png', ), '/rsrc/image/people/washington.png' => array( 'hash' => '01412761cab769f7993d69eba986d949', 'uri' => '/res/01412761/rsrc/image/people/washington.png', 'disk' => '/rsrc/image/people/washington.png', 'type' => 'png', ), '/rsrc/image/phrequent_active.png' => array( 'hash' => '716cddc08630eaa33934b2008723cac0', 'uri' => '/res/716cddc0/rsrc/image/phrequent_active.png', 'disk' => '/rsrc/image/phrequent_active.png', 'type' => 'png', ), '/rsrc/image/phrequent_inactive.png' => array( 'hash' => 'f9099683873c01c5de1dc6650bd668fe', 'uri' => '/res/f9099683/rsrc/image/phrequent_inactive.png', 'disk' => '/rsrc/image/phrequent_inactive.png', 'type' => 'png', ), '/rsrc/image/search.png' => array( 'hash' => 'ff7da044e6f923b8f569dec11f97e5e5', 'uri' => '/res/ff7da044/rsrc/image/search.png', 'disk' => '/rsrc/image/search.png', 'type' => 'png', ), '/rsrc/image/sprite-actions-X2.png' => array( 'hash' => '06962a5e8bea98ba7418d1d6cabcd7dc', 'uri' => '/res/06962a5e/rsrc/image/sprite-actions-X2.png', 'disk' => '/rsrc/image/sprite-actions-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-actions.png' => array( 'hash' => 'd5dda5fab1e61b00538c9a4fa1ee94c8', 'uri' => '/res/d5dda5fa/rsrc/image/sprite-actions.png', 'disk' => '/rsrc/image/sprite-actions.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-X2.png' => array( 'hash' => '35a4b5c92f0b05a6a06c8a8e2f409d9e', 'uri' => '/res/35a4b5c9/rsrc/image/sprite-apps-X2.png', 'disk' => '/rsrc/image/sprite-apps-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-large-X2.png' => array( 'hash' => '6295f60df446103f0de702f25bc502e1', 'uri' => '/res/6295f60d/rsrc/image/sprite-apps-large-X2.png', 'disk' => '/rsrc/image/sprite-apps-large-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-large.png' => array( 'hash' => '734d9268dd3a69102b194a7461c68631', 'uri' => '/res/734d9268/rsrc/image/sprite-apps-large.png', 'disk' => '/rsrc/image/sprite-apps-large.png', 'type' => 'png', ), '/rsrc/image/sprite-apps-xlarge.png' => array( 'hash' => '992d2c278b6a22c0fa874d457a252fbd', 'uri' => '/res/992d2c27/rsrc/image/sprite-apps-xlarge.png', 'disk' => '/rsrc/image/sprite-apps-xlarge.png', 'type' => 'png', ), '/rsrc/image/sprite-apps.png' => array( 'hash' => 'eed2e0e322821e1c0836fc62639c1af1', 'uri' => '/res/eed2e0e3/rsrc/image/sprite-apps.png', 'disk' => '/rsrc/image/sprite-apps.png', 'type' => 'png', ), '/rsrc/image/sprite-conpherence-X2.png' => array( 'hash' => '5e47868b00933a9afb6c844e464e6b23', 'uri' => '/res/5e47868b/rsrc/image/sprite-conpherence-X2.png', 'disk' => '/rsrc/image/sprite-conpherence-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-conpherence.png' => array( 'hash' => 'ca51f1be25213262d68e626e4cab7f0f', 'uri' => '/res/ca51f1be/rsrc/image/sprite-conpherence.png', 'disk' => '/rsrc/image/sprite-conpherence.png', 'type' => 'png', ), '/rsrc/image/sprite-docs-X2.png' => array( 'hash' => '57d3286ce88133f3ec9240e35f6bb897', 'uri' => '/res/57d3286c/rsrc/image/sprite-docs-X2.png', 'disk' => '/rsrc/image/sprite-docs-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-docs.png' => array( 'hash' => 'b2b089072d6eddd831402a77c02b5736', 'uri' => '/res/b2b08907/rsrc/image/sprite-docs.png', 'disk' => '/rsrc/image/sprite-docs.png', 'type' => 'png', ), '/rsrc/image/sprite-gradient.png' => array( 'hash' => 'a49d2e493dba4bea85bb202af528106a', 'uri' => '/res/a49d2e49/rsrc/image/sprite-gradient.png', 'disk' => '/rsrc/image/sprite-gradient.png', 'type' => 'png', ), '/rsrc/image/sprite-icons-X2.png' => array( 'hash' => '74551ad4423b882608a7325febe96a87', 'uri' => '/res/74551ad4/rsrc/image/sprite-icons-X2.png', 'disk' => '/rsrc/image/sprite-icons-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-icons.png' => array( 'hash' => '04e38e15232e1e0dee5acb9ae9b5ac72', 'uri' => '/res/04e38e15/rsrc/image/sprite-icons.png', 'disk' => '/rsrc/image/sprite-icons.png', 'type' => 'png', ), '/rsrc/image/sprite-menu-X2.png' => array( 'hash' => '867092041ce0a62b7e50136213ca7be1', 'uri' => '/res/86709204/rsrc/image/sprite-menu-X2.png', 'disk' => '/rsrc/image/sprite-menu-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-menu.png' => array( 'hash' => '21508eebdf582d7251d62bb2cd09f66d', 'uri' => '/res/21508eeb/rsrc/image/sprite-menu.png', 'disk' => '/rsrc/image/sprite-menu.png', 'type' => 'png', ), '/rsrc/image/sprite-minicons-X2.png' => array( 'hash' => 'c420c6462f7e50ca9941ccc5dd9e3dec', 'uri' => '/res/c420c646/rsrc/image/sprite-minicons-X2.png', 'disk' => '/rsrc/image/sprite-minicons-X2.png', 'type' => 'png', ), '/rsrc/image/sprite-minicons.png' => array( 'hash' => '168bb875933624b3080a1cc134e5b4ed', 'uri' => '/res/168bb875/rsrc/image/sprite-minicons.png', 'disk' => '/rsrc/image/sprite-minicons.png', 'type' => 'png', ), '/rsrc/image/sprite-payments.png' => array( 'hash' => '5ce73fb580609e7cda16832e3577b147', 'uri' => '/res/5ce73fb5/rsrc/image/sprite-payments.png', 'disk' => '/rsrc/image/sprite-payments.png', 'type' => 'png', ), '/rsrc/image/sprite-tokens.png' => array( 'hash' => '67c46fd75c885b76ecbfe46e71a476cc', 'uri' => '/res/67c46fd7/rsrc/image/sprite-tokens.png', 'disk' => '/rsrc/image/sprite-tokens.png', 'type' => 'png', ), '/rsrc/image/texture/card-gradient.png' => array( 'hash' => '268b7fdd758d4bf99db8de6770aae8af', 'uri' => '/res/268b7fdd/rsrc/image/texture/card-gradient.png', 'disk' => '/rsrc/image/texture/card-gradient.png', 'type' => 'png', ), '/rsrc/image/texture/dark-menu-hover.png' => array( 'hash' => 'a214a732644be34872e895b338b5d639', 'uri' => '/res/a214a732/rsrc/image/texture/dark-menu-hover.png', 'disk' => '/rsrc/image/texture/dark-menu-hover.png', 'type' => 'png', ), '/rsrc/image/texture/dark-menu.png' => array( 'hash' => '41ee673a762cec48a154b456ad5ac204', 'uri' => '/res/41ee673a/rsrc/image/texture/dark-menu.png', 'disk' => '/rsrc/image/texture/dark-menu.png', 'type' => 'png', ), '/rsrc/image/texture/grip.png' => array( 'hash' => 'f11bc231d241f1335cfca2933ad234e0', 'uri' => '/res/f11bc231/rsrc/image/texture/grip.png', 'disk' => '/rsrc/image/texture/grip.png', 'type' => 'png', ), '/rsrc/image/texture/panel-header-gradient.png' => array( 'hash' => 'ad9204dd3ef5b12b645d80677d8ccead', 'uri' => '/res/ad9204dd/rsrc/image/texture/panel-header-gradient.png', 'disk' => '/rsrc/image/texture/panel-header-gradient.png', 'type' => 'png', ), '/rsrc/image/texture/pholio-background.gif' => array( 'hash' => 'cf4561af116edf393dc583e5119fb412', 'uri' => '/res/cf4561af/rsrc/image/texture/pholio-background.gif', 'disk' => '/rsrc/image/texture/pholio-background.gif', 'type' => 'gif', ), '/rsrc/image/texture/table_header.png' => array( 'hash' => '4ed3f56a30d3749e8f62052b9735a316', 'uri' => '/res/4ed3f56a/rsrc/image/texture/table_header.png', 'disk' => '/rsrc/image/texture/table_header.png', 'type' => 'png', ), '/rsrc/image/texture/table_header_hover.png' => array( 'hash' => 'ea1f71a604e9b4859de1e25751540437', 'uri' => '/res/ea1f71a6/rsrc/image/texture/table_header_hover.png', 'disk' => '/rsrc/image/texture/table_header_hover.png', 'type' => 'png', ), '/rsrc/image/texture/table_header_tall.png' => array( 'hash' => 'b05525601f78d759f1c5e47fd9c1a8aa', 'uri' => '/res/b0552560/rsrc/image/texture/table_header_tall.png', 'disk' => '/rsrc/image/texture/table_header_tall.png', 'type' => 'png', ), '/rsrc/swf/aphlict.swf' => array( 'hash' => '4b9a9d83bebaf254f3790e87b45c1f92', 'uri' => '/res/4b9a9d83/rsrc/swf/aphlict.swf', 'disk' => '/rsrc/swf/aphlict.swf', 'type' => 'swf', ), 'aphront-attached-file-view-css' => array( 'uri' => '/res/a6ca5487/rsrc/css/aphront/attached-file-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/attached-file-view.css', ), 'aphront-bars' => array( 'uri' => '/res/95a907d6/rsrc/css/aphront/aphront-bars.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/aphront-bars.css', ), 'aphront-calendar-view-css' => array( 'uri' => '/res/ae6f5b54/rsrc/css/aphront/calendar-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/calendar-view.css', ), 'aphront-contextbar-view-css' => array( 'uri' => '/res/ecfd5ba9/rsrc/css/aphront/context-bar.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/context-bar.css', ), 'aphront-dark-console-css' => array( 'uri' => '/res/0d316573/rsrc/css/aphront/dark-console.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dark-console.css', ), 'aphront-dialog-view-css' => array( 'uri' => '/res/7060a2fe/rsrc/css/aphront/dialog-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/dialog-view.css', ), 'aphront-error-view-css' => array( 'uri' => '/res/5f43a7c5/rsrc/css/aphront/error-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/error-view.css', ), 'aphront-form-view-css' => array( 'uri' => '/res/656ca1a3/rsrc/css/aphront/form-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/form-view.css', ), 'aphront-list-filter-view-css' => array( 'uri' => '/res/639ea9e9/rsrc/css/aphront/list-filter-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/list-filter-view.css', ), 'aphront-multi-column-view-css' => array( 'uri' => '/res/e01f5f0e/rsrc/css/aphront/multi-column.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/multi-column.css', ), 'aphront-notes' => array( 'uri' => '/res/5b8ebfa0/rsrc/css/aphront/aphront-notes.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/aphront-notes.css', ), 'aphront-pager-view-css' => array( 'uri' => '/res/43fb79f0/rsrc/css/aphront/pager-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/pager-view.css', ), 'aphront-panel-view-css' => array( 'uri' => '/res/4031ea99/rsrc/css/aphront/panel-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/panel-view.css', ), 'aphront-request-failure-view-css' => array( 'uri' => '/res/c9a43002/rsrc/css/aphront/request-failure-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/request-failure-view.css', ), 'aphront-table-view-css' => array( 'uri' => '/res/d3c44c69/rsrc/css/aphront/table-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/table-view.css', ), 'aphront-tokenizer-control-css' => array( 'uri' => '/res/793c5f36/rsrc/css/aphront/tokenizer.css', 'type' => 'css', 'requires' => array( 0 => 'aphront-typeahead-control-css', ), 'disk' => '/rsrc/css/aphront/tokenizer.css', ), 'aphront-tooltip-css' => array( 'uri' => '/res/3a7d8e07/rsrc/css/aphront/tooltip.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/tooltip.css', ), 'aphront-two-column-view-css' => array( 'uri' => '/res/4263aa98/rsrc/css/aphront/two-column.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/two-column.css', ), 'aphront-typeahead-control-css' => array( 'uri' => '/res/e4a4cd4b/rsrc/css/aphront/typeahead.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/typeahead.css', ), 'config-options-css' => array( 'uri' => '/res/be77d5a6/rsrc/css/application/config/config-options.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/config/config-options.css', ), 'conpherence-menu-css' => array( - 'uri' => '/res/c955650e/rsrc/css/application/conpherence/menu.css', + 'uri' => '/res/60f38fbd/rsrc/css/application/conpherence/menu.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/menu.css', ), 'conpherence-message-pane-css' => array( - 'uri' => '/res/383af93e/rsrc/css/application/conpherence/message-pane.css', + 'uri' => '/res/d9e90066/rsrc/css/application/conpherence/message-pane.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/message-pane.css', ), 'conpherence-update-css' => array( 'uri' => '/res/92094ed7/rsrc/css/application/conpherence/update.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/update.css', ), 'conpherence-widget-pane-css' => array( - 'uri' => '/res/6f836b19/rsrc/css/application/conpherence/widget-pane.css', + 'uri' => '/res/b218398a/rsrc/css/application/conpherence/widget-pane.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/conpherence/widget-pane.css', ), 'differential-changeset-view-css' => array( 'uri' => '/res/8ee213f4/rsrc/css/application/differential/changeset-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/changeset-view.css', ), 'differential-core-view-css' => array( 'uri' => '/res/85fe5117/rsrc/css/application/differential/core.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/core.css', ), 'differential-inline-comment-editor' => array( 'uri' => '/res/37e0564f/rsrc/js/application/differential/DifferentialInlineCommentEditor.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-dom', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-install', 4 => 'javelin-request', 5 => 'javelin-workflow', ), 'disk' => '/rsrc/js/application/differential/DifferentialInlineCommentEditor.js', ), 'differential-local-commits-view-css' => array( 'uri' => '/res/224f3703/rsrc/css/application/differential/local-commits-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/local-commits-view.css', ), 'differential-results-table-css' => array( 'uri' => '/res/aab3123c/rsrc/css/application/differential/results-table.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/results-table.css', ), 'differential-revision-add-comment-css' => array( 'uri' => '/res/849748d3/rsrc/css/application/differential/add-comment.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/add-comment.css', ), 'differential-revision-comment-css' => array( 'uri' => '/res/42c222f4/rsrc/css/application/differential/revision-comment.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-comment.css', ), 'differential-revision-comment-list-css' => array( 'uri' => '/res/3b31faa3/rsrc/css/application/differential/revision-comment-list.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-comment-list.css', ), 'differential-revision-history-css' => array( 'uri' => '/res/d41bc64c/rsrc/css/application/differential/revision-history.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-history.css', ), 'differential-revision-list-css' => array( 'uri' => '/res/fe6c4721/rsrc/css/application/differential/revision-list.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/revision-list.css', ), 'differential-table-of-contents-css' => array( 'uri' => '/res/4fde8bfc/rsrc/css/application/differential/table-of-contents.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/differential/table-of-contents.css', ), 'diffusion-commit-view-css' => array( 'uri' => '/res/b445944e/rsrc/css/application/diffusion/commit-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/diffusion/commit-view.css', ), 'diffusion-icons-css' => array( 'uri' => '/res/b93e32c9/rsrc/css/application/diffusion/diffusion-icons.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/diffusion/diffusion-icons.css', ), 'diffusion-source-css' => array( 'uri' => '/res/e76bcd50/rsrc/css/application/diffusion/diffusion-source.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/diffusion/diffusion-source.css', ), 'global-drag-and-drop-css' => array( 'uri' => '/res/4e24cb65/rsrc/css/application/files/global-drag-and-drop.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/files/global-drag-and-drop.css', ), 'herald-css' => array( 'uri' => '/res/2150a55d/rsrc/css/application/herald/herald.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/herald/herald.css', ), 'herald-rule-editor' => array( 'uri' => '/res/f8ee0e9c/rsrc/js/application/herald/HeraldRuleEditor.js', 'type' => 'js', 'requires' => array( 0 => 'multirow-row-manager', 1 => 'javelin-install', 2 => 'javelin-typeahead', 3 => 'javelin-util', 4 => 'javelin-dom', 5 => 'javelin-tokenizer', 6 => 'javelin-typeahead-preloaded-source', 7 => 'javelin-stratcom', 8 => 'javelin-json', 9 => 'phabricator-prefab', ), 'disk' => '/rsrc/js/application/herald/HeraldRuleEditor.js', ), 'herald-test-css' => array( 'uri' => '/res/c0cd6bdb/rsrc/css/application/herald/herald-test.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/herald/herald-test.css', ), 'inline-comment-summary-css' => array( 'uri' => '/res/338704f7/rsrc/css/application/diff/inline-comment-summary.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/diff/inline-comment-summary.css', ), 'javelin-aphlict' => array( 'uri' => '/res/c0b9e53f/rsrc/js/application/aphlict/Aphlict.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), 'disk' => '/rsrc/js/application/aphlict/Aphlict.js', ), 'javelin-behavior' => array( 'uri' => '/res/15482715/rsrc/externals/javelin/lib/behavior.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-magical-init', 1 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/lib/behavior.js', ), 'javelin-behavior-aphlict-dropdown' => array( 'uri' => '/res/b3be58e8/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-request', 2 => 'javelin-stratcom', 3 => 'javelin-vector', 4 => 'javelin-dom', 5 => 'javelin-uri', ), 'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js', ), 'javelin-behavior-aphlict-listen' => array( 'uri' => '/res/7487f207/rsrc/js/application/aphlict/behavior-aphlict-listen.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-aphlict', 2 => 'javelin-stratcom', 3 => 'javelin-request', 4 => 'javelin-uri', 5 => 'javelin-dom', 6 => 'javelin-json', 7 => 'phabricator-notification', ), 'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-listen.js', ), 'javelin-behavior-aphront-basic-tokenizer' => array( 'uri' => '/res/c7fd9a7b/rsrc/js/core/behavior-tokenizer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'phabricator-prefab', ), 'disk' => '/rsrc/js/core/behavior-tokenizer.js', ), 'javelin-behavior-aphront-crop' => array( 'uri' => '/res/8c800f36/rsrc/js/core/behavior-crop.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-vector', 3 => 'javelin-magical-init', ), 'disk' => '/rsrc/js/core/behavior-crop.js', ), 'javelin-behavior-aphront-drag-and-drop' => array( 'uri' => '/res/36335362/rsrc/js/core/behavior-drag-and-drop.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-file-upload', 3 => 'phabricator-drag-and-drop-file-upload', ), 'disk' => '/rsrc/js/core/behavior-drag-and-drop.js', ), 'javelin-behavior-aphront-drag-and-drop-textarea' => array( 'uri' => '/res/a261f6e6/rsrc/js/core/behavior-drag-and-drop-textarea.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-drag-and-drop-file-upload', 3 => 'phabricator-textareautils', ), 'disk' => '/rsrc/js/core/behavior-drag-and-drop-textarea.js', ), 'javelin-behavior-aphront-form-disable-on-submit' => array( 'uri' => '/res/a4a4ff07/rsrc/js/core/behavior-form.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-form.js', ), 'javelin-behavior-aphront-more' => array( 'uri' => '/res/fae13324/rsrc/js/core/behavior-more.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-more.js', ), 'javelin-behavior-audit-preview' => array( 'uri' => '/res/d8f31e46/rsrc/js/application/diffusion/behavior-audit-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/diffusion/behavior-audit-preview.js', ), 'javelin-behavior-balanced-payment-form' => array( 'uri' => '/res/6876492d/rsrc/js/application/phortune/behavior-balanced-payment-form.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phortune-credit-card-form', ), 'disk' => '/rsrc/js/application/phortune/behavior-balanced-payment-form.js', ), 'javelin-behavior-conpherence-menu' => array( - 'uri' => '/res/7181099a/rsrc/js/application/conpherence/behavior-menu.js', + 'uri' => '/res/478fc4f3/rsrc/js/application/conpherence/behavior-menu.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', - 3 => 'javelin-request', - 4 => 'javelin-stratcom', - 5 => 'javelin-workflow', - 6 => 'javelin-behavior-device', - 7 => 'javelin-history', - 8 => 'javelin-vector', + 3 => 'javelin-stratcom', + 4 => 'javelin-workflow', + 5 => 'javelin-behavior-device', + 6 => 'javelin-history', + 7 => 'javelin-vector', ), 'disk' => '/rsrc/js/application/conpherence/behavior-menu.js', ), 'javelin-behavior-conpherence-pontificate' => array( - 'uri' => '/res/88ac3361/rsrc/js/application/conpherence/behavior-pontificate.js', + 'uri' => '/res/d6c5860f/rsrc/js/application/conpherence/behavior-pontificate.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-workflow', 4 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/conpherence/behavior-pontificate.js', ), 'javelin-behavior-conpherence-widget-pane' => array( - 'uri' => '/res/3d426c01/rsrc/js/application/conpherence/behavior-widget-pane.js', + 'uri' => '/res/232893cf/rsrc/js/application/conpherence/behavior-widget-pane.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', 4 => 'javelin-util', 5 => 'phabricator-notification', 6 => 'javelin-behavior-device', 7 => 'phabricator-dropdown-menu', 8 => 'phabricator-menu-item', ), 'disk' => '/rsrc/js/application/conpherence/behavior-widget-pane.js', ), 'javelin-behavior-countdown-timer' => array( 'uri' => '/res/3c52aac2/rsrc/js/application/countdown/timer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/countdown/timer.js', ), 'javelin-behavior-dark-console' => array( 'uri' => '/res/1e2c7a5e/rsrc/js/core/behavior-dark-console.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-util', 3 => 'javelin-dom', 4 => 'javelin-request', 5 => 'phabricator-keyboard-shortcut', ), 'disk' => '/rsrc/js/core/behavior-dark-console.js', ), 'javelin-behavior-device' => array( 'uri' => '/res/12e43f5a/rsrc/js/core/behavior-device.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-vector', 4 => 'javelin-install', ), 'disk' => '/rsrc/js/core/behavior-device.js', ), 'javelin-behavior-differential-accept-with-errors' => array( 'uri' => '/res/8fea67b3/rsrc/js/application/differential/behavior-accept-with-errors.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/differential/behavior-accept-with-errors.js', ), 'javelin-behavior-differential-add-reviewers-and-ccs' => array( 'uri' => '/res/27be3f81/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-prefab', ), 'disk' => '/rsrc/js/application/differential/behavior-add-reviewers-and-ccs.js', ), 'javelin-behavior-differential-comment-jump' => array( 'uri' => '/res/8ffb4222/rsrc/js/application/differential/behavior-comment-jump.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/differential/behavior-comment-jump.js', ), 'javelin-behavior-differential-diff-radios' => array( 'uri' => '/res/004cb66f/rsrc/js/application/differential/behavior-diff-radios.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/differential/behavior-diff-radios.js', ), 'javelin-behavior-differential-dropdown-menus' => array( 'uri' => '/res/f04cf682/rsrc/js/application/differential/behavior-dropdown-menus.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-stratcom', 4 => 'phabricator-dropdown-menu', 5 => 'phabricator-menu-item', 6 => 'phabricator-phtize', ), 'disk' => '/rsrc/js/application/differential/behavior-dropdown-menus.js', ), 'javelin-behavior-differential-edit-inline-comments' => array( 'uri' => '/res/86f459a4/rsrc/js/application/differential/behavior-edit-inline-comments.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-util', 4 => 'javelin-vector', 5 => 'differential-inline-comment-editor', ), 'disk' => '/rsrc/js/application/differential/behavior-edit-inline-comments.js', ), 'javelin-behavior-differential-feedback-preview' => array( 'uri' => '/res/4421fac6/rsrc/js/application/differential/behavior-comment-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-request', 4 => 'javelin-util', 5 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/differential/behavior-comment-preview.js', ), 'javelin-behavior-differential-keyboard-navigation' => array( 'uri' => '/res/22ed93ba/rsrc/js/application/differential/behavior-keyboard-nav.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'phabricator-keyboard-shortcut', ), 'disk' => '/rsrc/js/application/differential/behavior-keyboard-nav.js', ), 'javelin-behavior-differential-populate' => array( 'uri' => '/res/bb9a29f4/rsrc/js/application/differential/behavior-populate.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-workflow', 2 => 'javelin-util', 3 => 'javelin-dom', 4 => 'javelin-stratcom', 5 => 'javelin-behavior-device', 6 => 'javelin-vector', 7 => 'phabricator-tooltip', ), 'disk' => '/rsrc/js/application/differential/behavior-populate.js', ), 'javelin-behavior-differential-show-all-comments' => array( 'uri' => '/res/8801848d/rsrc/js/application/differential/behavior-show-all-comments.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/differential/behavior-show-all-comments.js', ), 'javelin-behavior-differential-show-field-details' => array( 'uri' => '/res/8d57f459/rsrc/js/application/differential/behavior-show-field-details.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/differential/behavior-show-field-details.js', ), 'javelin-behavior-differential-show-more' => array( 'uri' => '/res/b9f93090/rsrc/js/application/differential/behavior-show-more.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-workflow', 3 => 'javelin-util', 4 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/differential/behavior-show-more.js', ), 'javelin-behavior-differential-toggle-files' => array( 'uri' => '/res/ae937207/rsrc/js/application/differential/behavior-toggle-files.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/differential/behavior-toggle-files.js', ), 'javelin-behavior-differential-user-select' => array( 'uri' => '/res/23c51a5d/rsrc/js/application/differential/behavior-user-select.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/differential/behavior-user-select.js', ), 'javelin-behavior-diffusion-commit-branches' => array( 'uri' => '/res/1ede335a/rsrc/js/application/diffusion/behavior-commit-branches.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-request', ), 'disk' => '/rsrc/js/application/diffusion/behavior-commit-branches.js', ), 'javelin-behavior-diffusion-commit-graph' => array( 'uri' => '/res/536b8483/rsrc/js/application/diffusion/behavior-commit-graph.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/diffusion/behavior-commit-graph.js', ), 'javelin-behavior-diffusion-jump-to' => array( 'uri' => '/res/bade44bd/rsrc/js/application/diffusion/behavior-jump-to.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-vector', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/diffusion/behavior-jump-to.js', ), 'javelin-behavior-diffusion-line-linker' => array( 'uri' => '/res/12866f13/rsrc/js/application/diffusion/behavior-line-linker.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-history', ), 'disk' => '/rsrc/js/application/diffusion/behavior-line-linker.js', ), 'javelin-behavior-diffusion-pull-lastmodified' => array( 'uri' => '/res/29fe2790/rsrc/js/application/diffusion/behavior-pull-lastmodified.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-request', ), 'disk' => '/rsrc/js/application/diffusion/behavior-pull-lastmodified.js', ), 'javelin-behavior-error-log' => array( 'uri' => '/res/acefdea7/rsrc/js/core/behavior-error-log.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-error-log.js', ), 'javelin-behavior-fancy-datepicker' => array( 'uri' => '/res/f5c13e07/rsrc/js/core/behavior-fancy-datepicker.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-stratcom', 4 => 'javelin-vector', ), 'disk' => '/rsrc/js/core/behavior-fancy-datepicker.js', ), 'javelin-behavior-global-drag-and-drop' => array( 'uri' => '/res/ee8e9c39/rsrc/js/core/behavior-global-drag-and-drop.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-uri', 3 => 'javelin-mask', 4 => 'phabricator-drag-and-drop-file-upload', ), 'disk' => '/rsrc/js/core/behavior-global-drag-and-drop.js', ), 'javelin-behavior-herald-rule-editor' => array( 'uri' => '/res/77a0c945/rsrc/js/application/herald/herald-rule-editor.js', 'type' => 'js', 'requires' => array( 0 => 'herald-rule-editor', 1 => 'javelin-behavior', ), 'disk' => '/rsrc/js/application/herald/herald-rule-editor.js', ), 'javelin-behavior-history-install' => array( 'uri' => '/res/9099a161/rsrc/js/core/behavior-history-install.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-history', ), 'disk' => '/rsrc/js/core/behavior-history-install.js', ), 'javelin-behavior-konami' => array( 'uri' => '/res/b7bb7c24/rsrc/js/core/behavior-konami.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/core/behavior-konami.js', ), 'javelin-behavior-lightbox-attachments' => array( 'uri' => '/res/72b4d3a8/rsrc/js/core/behavior-lightbox-attachments.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-mask', 4 => 'javelin-util', 5 => 'phabricator-busy', ), 'disk' => '/rsrc/js/core/behavior-lightbox-attachments.js', ), 'javelin-behavior-line-chart' => array( 'uri' => '/res/1aa5ac88/rsrc/js/application/maniphest/behavior-line-chart.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-vector', ), 'disk' => '/rsrc/js/application/maniphest/behavior-line-chart.js', ), 'javelin-behavior-load-blame' => array( 'uri' => '/res/138e2961/rsrc/js/application/diffusion/behavior-load-blame.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-request', ), 'disk' => '/rsrc/js/application/diffusion/behavior-load-blame.js', ), 'javelin-behavior-maniphest-batch-editor' => array( 'uri' => '/res/81b2b86f/rsrc/js/application/maniphest/behavior-batch-editor.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-prefab', 4 => 'multirow-row-manager', 5 => 'javelin-json', ), 'disk' => '/rsrc/js/application/maniphest/behavior-batch-editor.js', ), 'javelin-behavior-maniphest-batch-selector' => array( 'uri' => '/res/c33cb5e3/rsrc/js/application/maniphest/behavior-batch-selector.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-util', ), 'disk' => '/rsrc/js/application/maniphest/behavior-batch-selector.js', ), 'javelin-behavior-maniphest-description-preview' => array( 'uri' => '/res/58ba0ec2/rsrc/js/application/maniphest/behavior-task-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/maniphest/behavior-task-preview.js', ), 'javelin-behavior-maniphest-subpriority-editor' => array( 'uri' => '/res/21b73c2a/rsrc/js/application/maniphest/behavior-subpriorityeditor.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-magical-init', 2 => 'javelin-dom', 3 => 'javelin-vector', 4 => 'javelin-stratcom', 5 => 'javelin-workflow', ), 'disk' => '/rsrc/js/application/maniphest/behavior-subpriorityeditor.js', ), 'javelin-behavior-maniphest-transaction-controls' => array( 'uri' => '/res/e8498688/rsrc/js/application/maniphest/behavior-transaction-controls.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phabricator-prefab', ), 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-controls.js', ), 'javelin-behavior-maniphest-transaction-expand' => array( 'uri' => '/res/966410de/rsrc/js/application/maniphest/behavior-transaction-expand.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-workflow', 3 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-expand.js', ), 'javelin-behavior-maniphest-transaction-preview' => array( 'uri' => '/res/9447a3f9/rsrc/js/application/maniphest/behavior-transaction-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-json', 4 => 'javelin-stratcom', 5 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/maniphest/behavior-transaction-preview.js', ), 'javelin-behavior-owners-path-editor' => array( 'uri' => '/res/9cf78ffc/rsrc/js/application/owners/owners-path-editor.js', 'type' => 'js', 'requires' => array( 0 => 'owners-path-editor', 1 => 'javelin-behavior', ), 'disk' => '/rsrc/js/application/owners/owners-path-editor.js', ), 'javelin-behavior-phabricator-active-nav' => array( 'uri' => '/res/9c8d3df8/rsrc/js/core/behavior-active-nav.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-vector', 3 => 'javelin-dom', 4 => 'javelin-uri', ), 'disk' => '/rsrc/js/core/behavior-active-nav.js', ), 'javelin-behavior-phabricator-autofocus' => array( 'uri' => '/res/bf92b8d6/rsrc/js/core/behavior-autofocus.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-autofocus.js', ), 'javelin-behavior-phabricator-file-tree' => array( 'uri' => '/res/e5bf93df/rsrc/js/core/behavior-file-tree.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'phabricator-keyboard-shortcut', 2 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/core/behavior-file-tree.js', ), 'javelin-behavior-phabricator-gesture' => array( 'uri' => '/res/16e1e77c/rsrc/js/core/behavior-gesture.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'javelin-vector', 4 => 'javelin-dom', 5 => 'javelin-magical-init', ), 'disk' => '/rsrc/js/core/behavior-gesture.js', ), 'javelin-behavior-phabricator-gesture-example' => array( 'uri' => '/res/91d1e7f2/rsrc/js/application/uiexample/gesture-example.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-stratcom', 1 => 'javelin-behavior', 2 => 'javelin-vector', 3 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/uiexample/gesture-example.js', ), 'javelin-behavior-phabricator-hovercards' => array( 'uri' => '/res/4fe6b436/rsrc/js/core/behavior-hovercard.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'javelin-vector', 4 => 'phabricator-hovercard', ), 'disk' => '/rsrc/js/core/behavior-hovercard.js', ), 'javelin-behavior-phabricator-keyboard-pager' => array( 'uri' => '/res/6a5445b8/rsrc/js/core/behavior-keyboard-pager.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-uri', 2 => 'phabricator-keyboard-shortcut', ), 'disk' => '/rsrc/js/core/behavior-keyboard-pager.js', ), 'javelin-behavior-phabricator-keyboard-shortcuts' => array( 'uri' => '/res/b971e713/rsrc/js/core/behavior-keyboard-shortcuts.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-workflow', 2 => 'javelin-json', 3 => 'javelin-dom', 4 => 'phabricator-keyboard-shortcut', ), 'disk' => '/rsrc/js/core/behavior-keyboard-shortcuts.js', ), 'javelin-behavior-phabricator-nav' => array( 'uri' => '/res/afabcf16/rsrc/js/core/behavior-phabricator-nav.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'javelin-dom', 4 => 'javelin-magical-init', 5 => 'javelin-vector', 6 => 'javelin-request', 7 => 'javelin-util', ), 'disk' => '/rsrc/js/core/behavior-phabricator-nav.js', ), 'javelin-behavior-phabricator-notification-example' => array( 'uri' => '/res/7c50cefd/rsrc/js/application/uiexample/notification-example.js', 'type' => 'js', 'requires' => array( 0 => 'phabricator-notification', 1 => 'javelin-stratcom', 2 => 'javelin-behavior', ), 'disk' => '/rsrc/js/application/uiexample/notification-example.js', ), 'javelin-behavior-phabricator-object-selector' => array( 'uri' => '/res/461f95f7/rsrc/js/core/behavior-object-selector.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-request', 3 => 'javelin-util', ), 'disk' => '/rsrc/js/core/behavior-object-selector.js', ), 'javelin-behavior-phabricator-oncopy' => array( 'uri' => '/res/cd3a9345/rsrc/js/core/behavior-oncopy.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-oncopy.js', ), 'javelin-behavior-phabricator-remarkup-assist' => array( 'uri' => '/res/6d254602/rsrc/js/core/behavior-phabricator-remarkup-assist.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'phabricator-textareautils', 4 => 'javelin-workflow', 5 => 'phabricator-notification', 6 => 'javelin-vector', ), 'disk' => '/rsrc/js/core/behavior-phabricator-remarkup-assist.js', ), 'javelin-behavior-phabricator-reveal-content' => array( 'uri' => '/res/fef525ef/rsrc/js/core/behavior-reveal-content.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-reveal-content.js', ), 'javelin-behavior-phabricator-search-typeahead' => array( 'uri' => '/res/b39896d5/rsrc/js/core/behavior-search-typeahead.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-typeahead-ondemand-source', 2 => 'javelin-typeahead', 3 => 'javelin-dom', 4 => 'javelin-uri', 5 => 'javelin-util', 6 => 'javelin-stratcom', ), 'disk' => '/rsrc/js/core/behavior-search-typeahead.js', ), 'javelin-behavior-phabricator-tooltips' => array( 'uri' => '/res/a0ac5320/rsrc/js/core/behavior-tooltip.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-behavior-device', 2 => 'javelin-stratcom', 3 => 'phabricator-tooltip', ), 'disk' => '/rsrc/js/core/behavior-tooltip.js', ), 'javelin-behavior-phabricator-transaction-comment-form' => array( 'uri' => '/res/7591a57f/rsrc/js/application/transactions/behavior-transaction-comment-form.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/transactions/behavior-transaction-comment-form.js', ), 'javelin-behavior-phabricator-transaction-list' => array( 'uri' => '/res/f1fbb474/rsrc/js/application/transactions/behavior-transaction-list.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-workflow', 3 => 'javelin-dom', 4 => 'javelin-fx', ), 'disk' => '/rsrc/js/application/transactions/behavior-transaction-list.js', ), 'javelin-behavior-phabricator-watch-anchor' => array( 'uri' => '/res/69a90817/rsrc/js/core/behavior-watch-anchor.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-vector', ), 'disk' => '/rsrc/js/core/behavior-watch-anchor.js', ), 'javelin-behavior-phame-post-preview' => array( 'uri' => '/res/181d1cbe/rsrc/js/application/phame/phame-post-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/phame/phame-post-preview.js', ), 'javelin-behavior-pholio-mock-view' => array( 'uri' => '/res/0632e7d9/rsrc/js/application/pholio/behavior-pholio-mock-view.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-dom', 4 => 'javelin-vector', 5 => 'javelin-magical-init', 6 => 'javelin-request', 7 => 'javelin-history', 8 => 'javelin-workflow', 9 => 'javelin-mask', 10 => 'javelin-behavior-device', 11 => 'phabricator-keyboard-shortcut', ), 'disk' => '/rsrc/js/application/pholio/behavior-pholio-mock-view.js', ), 'javelin-behavior-phriction-document-preview' => array( 'uri' => '/res/e2fe02de/rsrc/js/application/phriction/phriction-document-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/phriction/phriction-document-preview.js', ), 'javelin-behavior-ponder-feedback-preview' => array( 'uri' => '/res/2e802dd9/rsrc/js/application/ponder/behavior-comment-preview.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'phabricator-shaped-request', ), 'disk' => '/rsrc/js/application/ponder/behavior-comment-preview.js', ), 'javelin-behavior-ponder-votebox' => array( 'uri' => '/res/d8c973a2/rsrc/js/application/ponder/behavior-votebox.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-stratcom', 4 => 'javelin-request', ), 'disk' => '/rsrc/js/application/ponder/behavior-votebox.js', ), 'javelin-behavior-project-create' => array( 'uri' => '/res/e91f3f8f/rsrc/js/application/projects/behavior-project-create.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-workflow', ), 'disk' => '/rsrc/js/application/projects/behavior-project-create.js', ), 'javelin-behavior-refresh-csrf' => array( 'uri' => '/res/6c54100f/rsrc/js/core/behavior-refresh-csrf.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-request', 1 => 'javelin-behavior', 2 => 'javelin-dom', 3 => 'phabricator-busy', ), 'disk' => '/rsrc/js/core/behavior-refresh-csrf.js', ), 'javelin-behavior-releeph-preview-branch' => array( 'uri' => '/res/f694854d/rsrc/js/application/releeph/releeph-preview-branch.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-uri', 3 => 'javelin-request', ), 'disk' => '/rsrc/js/application/releeph/releeph-preview-branch.js', ), 'javelin-behavior-releeph-request-state-change' => array( 'uri' => '/res/07ecde0c/rsrc/js/application/releeph/releeph-request-state-change.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-request', 4 => 'phabricator-keyboard-shortcut', 5 => 'phabricator-notification', ), 'disk' => '/rsrc/js/application/releeph/releeph-request-state-change.js', ), 'javelin-behavior-releeph-request-typeahead' => array( 'uri' => '/res/2c2350a0/rsrc/js/application/releeph/releeph-request-typeahead.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-typeahead', 3 => 'javelin-typeahead-ondemand-source', 4 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/releeph/releeph-request-typeahead.js', ), 'javelin-behavior-repository-crossreference' => array( 'uri' => '/res/d3f9d50b/rsrc/js/application/repository/repository-crossreference.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-uri', ), 'disk' => '/rsrc/js/application/repository/repository-crossreference.js', ), 'javelin-behavior-slowvote-embed' => array( 'uri' => '/res/8e85e20d/rsrc/js/application/slowvote/behavior-slowvote-embed.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-request', 2 => 'javelin-stratcom', 3 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/slowvote/behavior-slowvote-embed.js', ), 'javelin-behavior-stripe-payment-form' => array( 'uri' => '/res/c1a12d77/rsrc/js/application/phortune/behavior-stripe-payment-form.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phortune-credit-card-form', ), 'disk' => '/rsrc/js/application/phortune/behavior-stripe-payment-form.js', ), 'javelin-behavior-test-payment-form' => array( 'uri' => '/res/a8fe8616/rsrc/js/application/phortune/behavior-test-payment-form.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'phortune-credit-card-form', ), 'disk' => '/rsrc/js/application/phortune/behavior-test-payment-form.js', ), 'javelin-behavior-toggle-class' => array( 'uri' => '/res/79921b7f/rsrc/js/core/behavior-toggle-class.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-toggle-class.js', ), 'javelin-behavior-view-placeholder' => array( 'uri' => '/res/6abdb85b/rsrc/externals/javelin/ext/view/ViewPlaceholder.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-dom', 2 => 'javelin-view-renderer', 3 => 'javelin-install', ), 'disk' => '/rsrc/externals/javelin/ext/view/ViewPlaceholder.js', ), 'javelin-behavior-workflow' => array( 'uri' => '/res/425777cc/rsrc/js/core/behavior-workflow.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-behavior', 1 => 'javelin-stratcom', 2 => 'javelin-workflow', 3 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/behavior-workflow.js', ), 'javelin-color' => array( 'uri' => '/res/f17034de/rsrc/externals/javelin/ext/fx/Color.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', ), 'disk' => '/rsrc/externals/javelin/ext/fx/Color.js', ), 'javelin-cookie' => array( 'uri' => '/res/ee0d399f/rsrc/externals/javelin/lib/Cookie.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/lib/Cookie.js', ), 'javelin-dom' => array( 'uri' => '/res/175211d6/rsrc/externals/javelin/lib/DOM.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-magical-init', 1 => 'javelin-install', 2 => 'javelin-util', 3 => 'javelin-vector', 4 => 'javelin-stratcom', ), 'disk' => '/rsrc/externals/javelin/lib/DOM.js', ), 'javelin-dynval' => array( 'uri' => '/res/ea6f2a9d/rsrc/externals/javelin/ext/reactor/core/DynVal.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-reactornode', 2 => 'javelin-util', 3 => 'javelin-reactor', ), 'disk' => '/rsrc/externals/javelin/ext/reactor/core/DynVal.js', ), 'javelin-event' => array( 'uri' => '/res/5f70f4d0/rsrc/externals/javelin/core/Event.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', ), 'disk' => '/rsrc/externals/javelin/core/Event.js', ), 'javelin-fx' => array( 'uri' => '/res/c7cefec3/rsrc/externals/javelin/ext/fx/FX.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-color', 1 => 'javelin-install', 2 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/fx/FX.js', ), 'javelin-history' => array( 'uri' => '/res/6c084b09/rsrc/externals/javelin/lib/History.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-stratcom', 1 => 'javelin-install', 2 => 'javelin-uri', 3 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/lib/History.js', ), 'javelin-install' => array( 'uri' => '/res/904356c0/rsrc/externals/javelin/core/install.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-util', 1 => 'javelin-magical-init', ), 'disk' => '/rsrc/externals/javelin/core/install.js', ), 'javelin-json' => array( 'uri' => '/res/cf83e72c/rsrc/externals/javelin/lib/JSON.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', ), 'disk' => '/rsrc/externals/javelin/lib/JSON.js', ), 'javelin-magical-init' => array( 'uri' => '/res/7c6c8d5a/rsrc/externals/javelin/core/init.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/externals/javelin/core/init.js', ), 'javelin-mask' => array( 'uri' => '/res/465cf513/rsrc/externals/javelin/lib/Mask.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', ), 'disk' => '/rsrc/externals/javelin/lib/Mask.js', ), 'javelin-reactor' => array( 'uri' => '/res/c05f2658/rsrc/externals/javelin/ext/reactor/core/Reactor.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/reactor/core/Reactor.js', ), 'javelin-reactor-dom' => array( 'uri' => '/res/5e03117e/rsrc/externals/javelin/ext/reactor/dom/RDOM.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-dom', 1 => 'javelin-dynval', 2 => 'javelin-reactor', 3 => 'javelin-reactornode', 4 => 'javelin-install', 5 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/reactor/dom/RDOM.js', ), 'javelin-reactor-node-calmer' => array( 'uri' => '/res/a93dd6b6/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-reactor', 2 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/reactor/core/ReactorNodeCalmer.js', ), 'javelin-reactornode' => array( 'uri' => '/res/4eac475b/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-reactor', 2 => 'javelin-util', 3 => 'javelin-reactor-node-calmer', ), 'disk' => '/rsrc/externals/javelin/ext/reactor/core/ReactorNode.js', ), 'javelin-request' => array( 'uri' => '/res/687bdcfc/rsrc/externals/javelin/lib/Request.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-stratcom', 2 => 'javelin-util', 3 => 'javelin-behavior', 4 => 'javelin-json', 5 => 'javelin-dom', 6 => 'javelin-resource', ), 'disk' => '/rsrc/externals/javelin/lib/Request.js', ), 'javelin-resource' => array( 'uri' => '/res/33a3bb57/rsrc/externals/javelin/lib/Resource.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-util', 1 => 'javelin-uri', 2 => 'javelin-install', ), 'disk' => '/rsrc/externals/javelin/lib/Resource.js', ), 'javelin-stratcom' => array( 'uri' => '/res/714946e7/rsrc/externals/javelin/core/Stratcom.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-event', 2 => 'javelin-util', 3 => 'javelin-magical-init', ), 'disk' => '/rsrc/externals/javelin/core/Stratcom.js', ), 'javelin-tokenizer' => array( 'uri' => '/res/7c117141/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-dom', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-install', ), 'disk' => '/rsrc/externals/javelin/lib/control/tokenizer/Tokenizer.js', ), 'javelin-typeahead' => array( 'uri' => '/res/fd79f758/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-vector', 3 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/Typeahead.js', ), 'javelin-typeahead-composite-source' => array( 'uri' => '/res/487b3da2/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-typeahead-source', 2 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadCompositeSource.js', ), 'javelin-typeahead-normalizer' => array( 'uri' => '/res/5a4bd979/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', ), 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/normalizer/TypeaheadNormalizer.js', ), 'javelin-typeahead-ondemand-source' => array( 'uri' => '/res/4e5add88/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', 3 => 'javelin-typeahead-source', ), 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadOnDemandSource.js', ), 'javelin-typeahead-preloaded-source' => array( 'uri' => '/res/147900c7/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', 3 => 'javelin-typeahead-source', ), 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadPreloadedSource.js', ), 'javelin-typeahead-source' => array( 'uri' => '/res/13289259/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-typeahead-normalizer', ), 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadSource.js', ), 'javelin-typeahead-static-source' => array( 'uri' => '/res/bb0a5173/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-typeahead-source', ), 'disk' => '/rsrc/externals/javelin/lib/control/typeahead/source/TypeaheadStaticSource.js', ), 'javelin-uri' => array( 'uri' => '/res/75aa4597/rsrc/externals/javelin/lib/URI.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-stratcom', ), 'disk' => '/rsrc/externals/javelin/lib/URI.js', ), 'javelin-util' => array( 'uri' => '/res/90222113/rsrc/externals/javelin/core/util.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/externals/javelin/core/util.js', ), 'javelin-vector' => array( 'uri' => '/res/58ea3dd7/rsrc/externals/javelin/lib/Vector.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-event', ), 'disk' => '/rsrc/externals/javelin/lib/Vector.js', ), 'javelin-view' => array( 'uri' => '/res/38daaec0/rsrc/externals/javelin/ext/view/View.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/view/View.js', ), 'javelin-view-html' => array( 'uri' => '/res/0d225e8c/rsrc/externals/javelin/ext/view/HTMLView.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-view-visitor', 3 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/view/HTMLView.js', ), 'javelin-view-interpreter' => array( 'uri' => '/res/b0c07f96/rsrc/externals/javelin/ext/view/ViewInterpreter.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-view', 1 => 'javelin-install', 2 => 'javelin-dom', ), 'disk' => '/rsrc/externals/javelin/ext/view/ViewInterpreter.js', ), 'javelin-view-renderer' => array( 'uri' => '/res/fe0d2f60/rsrc/externals/javelin/ext/view/ViewRenderer.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/view/ViewRenderer.js', ), 'javelin-view-visitor' => array( 'uri' => '/res/b1606cec/rsrc/externals/javelin/ext/view/ViewVisitor.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', ), 'disk' => '/rsrc/externals/javelin/ext/view/ViewVisitor.js', ), 'javelin-workflow' => array( 'uri' => '/res/8274d65f/rsrc/externals/javelin/lib/Workflow.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-stratcom', 1 => 'javelin-request', 2 => 'javelin-dom', 3 => 'javelin-vector', 4 => 'javelin-install', 5 => 'javelin-util', 6 => 'javelin-mask', 7 => 'javelin-uri', ), 'disk' => '/rsrc/externals/javelin/lib/Workflow.js', ), 'lightbox-attachment-css' => array( 'uri' => '/res/4657e15d/rsrc/css/aphront/lightbox-attachment.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/lightbox-attachment.css', ), 'maniphest-batch-editor' => array( 'uri' => '/res/fb15d744/rsrc/css/application/maniphest/batch-editor.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/batch-editor.css', ), 'maniphest-report-css' => array( 'uri' => '/res/2e633fcf/rsrc/css/application/maniphest/report.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/report.css', ), 'maniphest-task-edit-css' => array( 'uri' => '/res/0760f768/rsrc/css/application/maniphest/task-edit.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/task-edit.css', ), 'maniphest-task-summary-css' => array( 'uri' => '/res/7aa9e2eb/rsrc/css/application/maniphest/task-summary.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/task-summary.css', ), 'maniphest-transaction-detail-css' => array( 'uri' => '/res/fb430d3e/rsrc/css/application/maniphest/transaction-detail.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/maniphest/transaction-detail.css', ), 'multirow-row-manager' => array( 'uri' => '/res/408fae4f/rsrc/js/core/MultirowRowManager.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-stratcom', 2 => 'javelin-dom', 3 => 'javelin-util', ), 'disk' => '/rsrc/js/core/MultirowRowManager.js', ), 'owners-path-editor' => array( 'uri' => '/res/29b68354/rsrc/js/application/owners/OwnersPathEditor.js', 'type' => 'js', 'requires' => array( 0 => 'multirow-row-manager', 1 => 'javelin-install', 2 => 'path-typeahead', 3 => 'javelin-dom', 4 => 'javelin-util', 5 => 'phabricator-prefab', ), 'disk' => '/rsrc/js/application/owners/OwnersPathEditor.js', ), 'owners-path-editor-css' => array( 'uri' => '/res/1b9b5456/rsrc/css/application/owners/owners-path-editor.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/owners/owners-path-editor.css', ), 'paste-css' => array( 'uri' => '/res/216fbfe9/rsrc/css/application/paste/paste.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/paste/paste.css', ), 'path-typeahead' => array( 'uri' => '/res/50246fb6/rsrc/js/application/herald/PathTypeahead.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-typeahead', 2 => 'javelin-dom', 3 => 'javelin-request', 4 => 'javelin-typeahead-ondemand-source', 5 => 'javelin-util', ), 'disk' => '/rsrc/js/application/herald/PathTypeahead.js', ), 'phabricator-action-header-view-css' => array( 'uri' => '/res/3b701648/rsrc/css/layout/phabricator-action-header-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-action-header-view.css', ), 'phabricator-action-list-view-css' => array( 'uri' => '/res/f63afae7/rsrc/css/layout/phabricator-action-list-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-action-list-view.css', ), 'phabricator-application-launch-view-css' => array( 'uri' => '/res/dffb18f3/rsrc/css/application/base/phabricator-application-launch-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/base/phabricator-application-launch-view.css', ), 'phabricator-busy' => array( 'uri' => '/res/8e3f036d/rsrc/js/core/Busy.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/Busy.js', ), 'phabricator-chatlog-css' => array( 'uri' => '/res/5542e247/rsrc/css/application/chatlog/chatlog.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/chatlog/chatlog.css', ), 'phabricator-content-source-view-css' => array( 'uri' => '/res/8c738a93/rsrc/css/application/contentsource/content-source-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/contentsource/content-source-view.css', ), 'phabricator-core-buttons-css' => array( 'uri' => '/res/073fc5eb/rsrc/css/core/buttons.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/buttons.css', ), 'phabricator-core-css' => array( 'uri' => '/res/dc204369/rsrc/css/core/core.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/core.css', ), 'phabricator-countdown-css' => array( 'uri' => '/res/0f646281/rsrc/css/application/countdown/timer.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/countdown/timer.css', ), 'phabricator-crumbs-view-css' => array( 'uri' => '/res/feeb02f0/rsrc/css/layout/phabricator-crumbs-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-crumbs-view.css', ), 'phabricator-directory-css' => array( 'uri' => '/res/61afca2b/rsrc/css/application/directory/phabricator-directory.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/directory/phabricator-directory.css', ), 'phabricator-drag-and-drop-file-upload' => array( 'uri' => '/res/396d3b3b/rsrc/js/core/DragAndDropFileUpload.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', 3 => 'javelin-dom', 4 => 'javelin-uri', 5 => 'phabricator-file-upload', ), 'disk' => '/rsrc/js/core/DragAndDropFileUpload.js', ), 'phabricator-dropdown-menu' => array( 'uri' => '/res/a248b7f4/rsrc/js/core/DropdownMenu.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-vector', 4 => 'javelin-stratcom', 5 => 'phabricator-menu-item', ), 'disk' => '/rsrc/js/core/DropdownMenu.js', ), 'phabricator-fatal-config-template-css' => array( 'uri' => '/res/6e1a8d22/rsrc/css/application/config/config-template.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/config/config-template.css', ), 'phabricator-feed-css' => array( 'uri' => '/res/e19633ed/rsrc/css/application/feed/feed.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/feed/feed.css', ), 'phabricator-file-upload' => array( 'uri' => '/res/c9605008/rsrc/js/core/FileUpload.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'phabricator-notification', ), 'disk' => '/rsrc/js/core/FileUpload.js', ), 'phabricator-filetree-view-css' => array( 'uri' => '/res/c912ed91/rsrc/css/layout/phabricator-filetree-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-filetree-view.css', ), 'phabricator-flag-css' => array( 'uri' => '/res/237234d7/rsrc/css/application/flag/flag.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/flag/flag.css', ), 'phabricator-form-view-css' => array( 'uri' => '/res/ba05f8ba/rsrc/css/layout/phabricator-form-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-form-view.css', ), 'phabricator-header-view-css' => array( 'uri' => '/res/585b771c/rsrc/css/layout/phabricator-header-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-header-view.css', ), 'phabricator-hovercard' => array( 'uri' => '/res/7fb94260/rsrc/js/core/Hovercard.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-vector', 3 => 'javelin-request', 4 => 'javelin-uri', ), 'disk' => '/rsrc/js/core/Hovercard.js', ), 'phabricator-hovercard-view-css' => array( 'uri' => '/res/80683f88/rsrc/css/layout/phabricator-hovercard-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-hovercard-view.css', ), 'phabricator-jump-nav' => array( 'uri' => '/res/37ab43b8/rsrc/css/application/directory/phabricator-jump-nav.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/directory/phabricator-jump-nav.css', ), 'phabricator-keyboard-shortcut' => array( 'uri' => '/res/44747afd/rsrc/js/core/KeyboardShortcut.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'phabricator-keyboard-shortcut-manager', ), 'disk' => '/rsrc/js/core/KeyboardShortcut.js', ), 'phabricator-keyboard-shortcut-manager' => array( 'uri' => '/res/bf9bc02a/rsrc/js/core/KeyboardShortcutManager.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-stratcom', 3 => 'javelin-dom', 4 => 'javelin-vector', ), 'disk' => '/rsrc/js/core/KeyboardShortcutManager.js', ), 'phabricator-main-menu-view' => array( 'uri' => '/res/50479234/rsrc/css/application/base/main-menu-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/base/main-menu-view.css', ), 'phabricator-menu-item' => array( 'uri' => '/res/2add4594/rsrc/js/core/DropdownMenuItem.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', ), 'disk' => '/rsrc/js/core/DropdownMenuItem.js', ), 'phabricator-nav-view-css' => array( 'uri' => '/res/37955b6a/rsrc/css/aphront/phabricator-nav-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/phabricator-nav-view.css', ), 'phabricator-notification' => array( 'uri' => '/res/0764da14/rsrc/js/core/Notification.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-stratcom', 3 => 'javelin-util', 4 => 'phabricator-notification-css', ), 'disk' => '/rsrc/js/core/Notification.js', ), 'phabricator-notification-css' => array( 'uri' => '/res/664b9bec/rsrc/css/aphront/notification.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/notification.css', ), 'phabricator-notification-menu-css' => array( 'uri' => '/res/bc245b67/rsrc/css/application/base/notification-menu.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/base/notification-menu.css', ), 'phabricator-object-item-list-view-css' => array( 'uri' => '/res/96dce9f3/rsrc/css/layout/phabricator-object-item-list-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-object-item-list-view.css', ), 'phabricator-object-list-view-css' => array( 'uri' => '/res/4f183668/rsrc/css/application/projects/phabricator-object-list-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/projects/phabricator-object-list-view.css', ), 'phabricator-object-selector-css' => array( 'uri' => '/res/502f1bb9/rsrc/css/application/objectselector/object-selector.css', 'type' => 'css', 'requires' => array( 0 => 'aphront-dialog-view-css', ), 'disk' => '/rsrc/css/application/objectselector/object-selector.css', ), 'phabricator-phtize' => array( 'uri' => '/res/dc655a81/rsrc/js/core/phtize.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-util', ), 'disk' => '/rsrc/js/core/phtize.js', ), 'phabricator-pinboard-view-css' => array( 'uri' => '/res/61ecd7cf/rsrc/css/layout/phabricator-pinboard-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-pinboard-view.css', ), 'phabricator-prefab' => array( 'uri' => '/res/511859ca/rsrc/js/core/Prefab.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-typeahead', 4 => 'javelin-tokenizer', 5 => 'javelin-typeahead-preloaded-source', 6 => 'javelin-typeahead-ondemand-source', 7 => 'javelin-dom', 8 => 'javelin-stratcom', 9 => 'javelin-util', ), 'disk' => '/rsrc/js/core/Prefab.js', ), 'phabricator-profile-css' => array( 'uri' => '/res/87229261/rsrc/css/application/profile/profile-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/profile/profile-view.css', ), 'phabricator-profile-header-css' => array( 'uri' => '/res/a03c1e20/rsrc/css/application/profile/profile-header-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/profile/profile-header-view.css', ), 'phabricator-project-tag-css' => array( 'uri' => '/res/1b5efcb2/rsrc/css/application/projects/project-tag.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/projects/project-tag.css', ), 'phabricator-property-list-view-css' => array( 'uri' => '/res/a04cc81d/rsrc/css/layout/phabricator-property-list-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-property-list-view.css', ), 'phabricator-remarkup-css' => array( 'uri' => '/res/07cab525/rsrc/css/core/remarkup.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/remarkup.css', ), 'phabricator-search-results-css' => array( 'uri' => '/res/9b749d7d/rsrc/css/application/search/search-results.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/search/search-results.css', ), 'phabricator-settings-css' => array( 'uri' => '/res/fb9d017f/rsrc/css/application/settings/settings.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/settings/settings.css', ), 'phabricator-shaped-request' => array( 'uri' => '/res/d173af85/rsrc/js/core/ShapedRequest.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-request', ), 'disk' => '/rsrc/js/core/ShapedRequest.js', ), 'phabricator-side-menu-view-css' => array( 'uri' => '/res/2a1ac469/rsrc/css/layout/phabricator-side-menu-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-side-menu-view.css', ), 'phabricator-slowvote-css' => array( 'uri' => '/res/d1c2e05a/rsrc/css/application/slowvote/slowvote.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/slowvote/slowvote.css', ), 'phabricator-source-code-view-css' => array( 'uri' => '/res/979d5280/rsrc/css/layout/phabricator-source-code-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-source-code-view.css', ), 'phabricator-standard-page-view' => array( 'uri' => '/res/70fa2da4/rsrc/css/application/base/standard-page-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/base/standard-page-view.css', ), 'phabricator-tag-view-css' => array( 'uri' => '/res/e10bf844/rsrc/css/layout/phabricator-tag-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-tag-view.css', ), 'phabricator-textareautils' => array( 'uri' => '/res/03c03e8b/rsrc/js/core/TextAreaUtils.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', ), 'disk' => '/rsrc/js/core/TextAreaUtils.js', ), 'phabricator-timeline-view-css' => array( 'uri' => '/res/5517bf1a/rsrc/css/layout/phabricator-timeline-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-timeline-view.css', ), 'phabricator-tooltip' => array( 'uri' => '/res/a23bc887/rsrc/js/core/ToolTip.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-util', 2 => 'javelin-dom', 3 => 'javelin-vector', ), 'disk' => '/rsrc/js/core/ToolTip.js', ), 'phabricator-transaction-view-css' => array( 'uri' => '/res/00be4b1a/rsrc/css/aphront/transaction.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/aphront/transaction.css', ), 'phabricator-ui-example-css' => array( 'uri' => '/res/376ab671/rsrc/css/application/uiexample/example.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/uiexample/example.css', ), 'phabricator-uiexample-javelin-view' => array( 'uri' => '/res/2da87384/rsrc/js/application/uiexample/JavelinViewExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', ), 'disk' => '/rsrc/js/application/uiexample/JavelinViewExample.js', ), 'phabricator-uiexample-reactor-button' => array( 'uri' => '/res/6bfe4f05/rsrc/js/application/uiexample/ReactorButtonExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-util', 3 => 'javelin-dynval', 4 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorButtonExample.js', ), 'phabricator-uiexample-reactor-checkbox' => array( 'uri' => '/res/3e8b30ac/rsrc/js/application/uiexample/ReactorCheckboxExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorCheckboxExample.js', ), 'phabricator-uiexample-reactor-focus' => array( 'uri' => '/res/d8f3b56e/rsrc/js/application/uiexample/ReactorFocusExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorFocusExample.js', ), 'phabricator-uiexample-reactor-input' => array( 'uri' => '/res/936352d9/rsrc/js/application/uiexample/ReactorInputExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-reactor-dom', 2 => 'javelin-view-html', 3 => 'javelin-view-interpreter', 4 => 'javelin-view-renderer', ), 'disk' => '/rsrc/js/application/uiexample/ReactorInputExample.js', ), 'phabricator-uiexample-reactor-mouseover' => array( 'uri' => '/res/031a9f4f/rsrc/js/application/uiexample/ReactorMouseoverExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorMouseoverExample.js', ), 'phabricator-uiexample-reactor-radio' => array( 'uri' => '/res/208c58e3/rsrc/js/application/uiexample/ReactorRadioExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorRadioExample.js', ), 'phabricator-uiexample-reactor-select' => array( 'uri' => '/res/1b68a6db/rsrc/js/application/uiexample/ReactorSelectExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorSelectExample.js', ), 'phabricator-uiexample-reactor-sendclass' => array( 'uri' => '/res/00cb3131/rsrc/js/application/uiexample/ReactorSendClassExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorSendClassExample.js', ), 'phabricator-uiexample-reactor-sendproperties' => array( 'uri' => '/res/392f1e02/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-reactor-dom', ), 'disk' => '/rsrc/js/application/uiexample/ReactorSendPropertiesExample.js', ), 'phabricator-workboard-view-css' => array( 'uri' => '/res/f598d215/rsrc/css/layout/phabricator-workboard-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-workboard-view.css', ), 'phabricator-workpanel-view-css' => array( 'uri' => '/res/ff5d5b26/rsrc/css/layout/phabricator-workpanel-view.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/layout/phabricator-workpanel-view.css', ), 'phabricator-zindex-css' => array( 'uri' => '/res/d4048e34/rsrc/css/core/z-index.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/z-index.css', ), 'phame-css' => array( 'uri' => '/res/ba5a8cd8/rsrc/css/application/phame/phame.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/phame/phame.css', ), 'pholio-css' => array( 'uri' => '/res/73796b1e/rsrc/css/application/pholio/pholio.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/pholio/pholio.css', ), 'pholio-inline-comments-css' => array( 'uri' => '/res/006fc575/rsrc/css/application/pholio/pholio-inline-comments.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/pholio/pholio-inline-comments.css', ), 'phortune-credit-card-form' => array( 'uri' => '/res/bc948778/rsrc/js/application/phortune/phortune-credit-card-form.js', 'type' => 'js', 'requires' => array( 0 => 'javelin-install', 1 => 'javelin-dom', 2 => 'javelin-json', 3 => 'javelin-workflow', 4 => 'javelin-util', ), 'disk' => '/rsrc/js/application/phortune/phortune-credit-card-form.js', ), 'phortune-credit-card-form-css' => array( 'uri' => '/res/563c8c6d/rsrc/css/application/phortune/phortune-credit-card-form.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/phortune/phortune-credit-card-form.css', ), 'phrequent-css' => array( 'uri' => '/res/9d6f3eb7/rsrc/css/application/phrequent/phrequent.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/phrequent/phrequent.css', ), 'phriction-document-css' => array( 'uri' => '/res/14e08350/rsrc/css/application/phriction/phriction-document-css.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/phriction/phriction-document-css.css', ), 'phui-box-css' => array( 'uri' => '/res/1b741073/rsrc/css/phui/phui-box.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/phui/phui-box.css', ), 'phui-feed-story-css' => array( 'uri' => '/res/253ac568/rsrc/css/phui/phui-feed-story.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/phui/phui-feed-story.css', ), 'phui-form-css' => array( 'uri' => '/res/ba4d7995/rsrc/css/phui/phui-form.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/phui/phui-form.css', ), 'phui-icon-view-css' => array( 'uri' => '/res/1b1a37b5/rsrc/css/phui/phui-icon.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/phui/phui-icon.css', ), 'phui-text-css' => array( 'uri' => '/res/ca884ca6/rsrc/css/phui/phui-text.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/phui/phui-text.css', ), 'ponder-comment-table-css' => array( 'uri' => '/res/15cb54fb/rsrc/css/application/ponder/comments.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/ponder/comments.css', ), 'ponder-feed-view-css' => array( 'uri' => '/res/cab09075/rsrc/css/application/ponder/feed.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/ponder/feed.css', ), 'ponder-post-css' => array( 'uri' => '/res/013b9e2c/rsrc/css/application/ponder/post.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/ponder/post.css', ), 'ponder-vote-css' => array( 'uri' => '/res/26945177/rsrc/css/application/ponder/vote.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/ponder/vote.css', ), 'raphael-core' => array( 'uri' => '/res/5dc5e17c/rsrc/externals/raphael/raphael.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/externals/raphael/raphael.js', ), 'raphael-g' => array( 'uri' => '/res/229b89a1/rsrc/externals/raphael/g.raphael.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/externals/raphael/g.raphael.js', ), 'raphael-g-line' => array( 'uri' => '/res/96da30f7/rsrc/externals/raphael/g.raphael.line.js', 'type' => 'js', 'requires' => array( ), 'disk' => '/rsrc/externals/raphael/g.raphael.line.js', ), 'releeph-branch' => array( 'uri' => '/res/6ad6420d/rsrc/css/application/releeph/releeph-branch.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-branch.css', ), 'releeph-colors' => array( 'uri' => '/res/dff4b26a/rsrc/css/application/releeph/releeph-colors.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-colors.css', ), 'releeph-core' => array( 'uri' => '/res/853f4a73/rsrc/css/application/releeph/releeph-core.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-core.css', ), 'releeph-intents' => array( 'uri' => '/res/4e73e9dd/rsrc/css/application/releeph/releeph-intents.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-intents.css', ), 'releeph-preview-branch' => array( 'uri' => '/res/65e5dece/rsrc/css/application/releeph/releeph-preview-branch.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-preview-branch.css', ), 'releeph-project' => array( 'uri' => '/res/b9376e59/rsrc/css/application/releeph/releeph-project.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-project.css', ), 'releeph-request-differential-create-dialog' => array( 'uri' => '/res/4df30ce1/rsrc/css/application/releeph/releeph-request-differential-create-dialog.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-request-differential-create-dialog.css', ), 'releeph-request-typeahead-css' => array( 'uri' => '/res/9c9a1acf/rsrc/css/application/releeph/releeph-request-typeahead.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-request-typeahead.css', ), 'releeph-status' => array( 'uri' => '/res/588529df/rsrc/css/application/releeph/releeph-status.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/releeph/releeph-status.css', ), 'setup-issue-css' => array( 'uri' => '/res/efbb3673/rsrc/css/application/config/setup-issue.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/config/setup-issue.css', ), 'spacing-css' => array( 'uri' => '/res/59e4c9b1/rsrc/css/core/spacing.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/spacing.css', ), 'sprite-actions-css' => array( 'uri' => '/res/bd43efa8/rsrc/css/sprite-actions.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-actions.css', ), 'sprite-apps-css' => array( 'uri' => '/res/edc99ce1/rsrc/css/sprite-apps.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-apps.css', ), 'sprite-apps-large-css' => array( 'uri' => '/res/40397d93/rsrc/css/sprite-apps-large.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-apps-large.css', ), 'sprite-apps-xlarge-css' => array( 'uri' => '/res/33a8e644/rsrc/css/sprite-apps-xlarge.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-apps-xlarge.css', ), 'sprite-conpherence-css' => array( 'uri' => '/res/f6793453/rsrc/css/sprite-conpherence.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-conpherence.css', ), 'sprite-docs-css' => array( 'uri' => '/res/b32f93bc/rsrc/css/sprite-docs.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-docs.css', ), 'sprite-gradient-css' => array( 'uri' => '/res/ca88b981/rsrc/css/sprite-gradient.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-gradient.css', ), 'sprite-icons-css' => array( 'uri' => '/res/cc45e87c/rsrc/css/sprite-icons.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-icons.css', ), 'sprite-menu-css' => array( 'uri' => '/res/e4e428f9/rsrc/css/sprite-menu.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-menu.css', ), 'sprite-minicons-css' => array( 'uri' => '/res/2dba70cd/rsrc/css/sprite-minicons.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-minicons.css', ), 'sprite-payments-css' => array( 'uri' => '/res/876697b6/rsrc/css/sprite-payments.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-payments.css', ), 'sprite-tokens-css' => array( 'uri' => '/res/edb4e341/rsrc/css/sprite-tokens.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/sprite-tokens.css', ), 'syntax-highlighting-css' => array( 'uri' => '/res/cb3b9dc0/rsrc/css/core/syntax.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/core/syntax.css', ), 'tokens-css' => array( 'uri' => '/res/dae13a94/rsrc/css/application/tokens/tokens.css', 'type' => 'css', 'requires' => array( ), 'disk' => '/rsrc/css/application/tokens/tokens.css', ), ), array( 'packages' => array( 'c3ade478' => array( 'name' => 'core.pkg.css', 'symbols' => array( 0 => 'phabricator-core-css', 1 => 'phabricator-zindex-css', 2 => 'phabricator-core-buttons-css', 3 => 'phabricator-standard-page-view', 4 => 'aphront-dialog-view-css', 5 => 'aphront-form-view-css', 6 => 'aphront-panel-view-css', 7 => 'aphront-table-view-css', 8 => 'aphront-tokenizer-control-css', 9 => 'aphront-typeahead-control-css', 10 => 'aphront-list-filter-view-css', 11 => 'phabricator-directory-css', 12 => 'phabricator-jump-nav', 13 => 'phabricator-remarkup-css', 14 => 'syntax-highlighting-css', 15 => 'aphront-pager-view-css', 16 => 'phabricator-transaction-view-css', 17 => 'aphront-tooltip-css', 18 => 'phabricator-flag-css', 19 => 'aphront-error-view-css', 20 => 'sprite-icons-css', 21 => 'sprite-gradient-css', 22 => 'sprite-menu-css', 23 => 'sprite-apps-large-css', 24 => 'phabricator-main-menu-view', 25 => 'phabricator-notification-css', 26 => 'phabricator-notification-menu-css', 27 => 'lightbox-attachment-css', 28 => 'phabricator-header-view-css', 29 => 'phabricator-form-view-css', 30 => 'phabricator-filetree-view-css', 31 => 'phabricator-nav-view-css', 32 => 'phabricator-side-menu-view-css', 33 => 'phabricator-crumbs-view-css', 34 => 'phabricator-object-item-list-view-css', 35 => 'global-drag-and-drop-css', 36 => 'spacing-css', 37 => 'phui-form-css', 38 => 'phui-icon-view-css', 39 => 'phabricator-application-launch-view-css', 40 => 'phabricator-action-list-view-css', 41 => 'phabricator-property-list-view-css', 42 => 'phabricator-tag-view-css', ), 'uri' => '/res/pkg/c3ade478/core.pkg.css', 'type' => 'css', ), '98f60e3f' => array( 'name' => 'core.pkg.js', 'symbols' => array( 0 => 'javelin-behavior-aphront-basic-tokenizer', 1 => 'javelin-behavior-workflow', 2 => 'javelin-behavior-aphront-form-disable-on-submit', 3 => 'phabricator-keyboard-shortcut-manager', 4 => 'phabricator-keyboard-shortcut', 5 => 'javelin-behavior-phabricator-keyboard-shortcuts', 6 => 'javelin-behavior-refresh-csrf', 7 => 'javelin-behavior-phabricator-watch-anchor', 8 => 'javelin-behavior-phabricator-autofocus', 9 => 'phabricator-menu-item', 10 => 'phabricator-dropdown-menu', 11 => 'phabricator-phtize', 12 => 'javelin-behavior-phabricator-oncopy', 13 => 'phabricator-tooltip', 14 => 'javelin-behavior-phabricator-tooltips', 15 => 'phabricator-prefab', 16 => 'javelin-behavior-device', 17 => 'javelin-behavior-toggle-class', 18 => 'javelin-behavior-lightbox-attachments', 19 => 'phabricator-busy', 20 => 'javelin-aphlict', 21 => 'phabricator-notification', 22 => 'javelin-behavior-aphlict-listen', 23 => 'javelin-behavior-phabricator-search-typeahead', 24 => 'javelin-behavior-konami', 25 => 'javelin-behavior-aphlict-dropdown', 26 => 'javelin-behavior-history-install', 27 => 'javelin-behavior-phabricator-gesture', 28 => 'javelin-behavior-phabricator-active-nav', 29 => 'javelin-behavior-phabricator-nav', 30 => 'javelin-behavior-phabricator-remarkup-assist', 31 => 'phabricator-textareautils', 32 => 'phabricator-file-upload', 33 => 'javelin-behavior-global-drag-and-drop', 34 => 'javelin-behavior-phabricator-reveal-content', 35 => 'phabricator-hovercard', 36 => 'javelin-behavior-phabricator-hovercards', ), 'uri' => '/res/pkg/98f60e3f/core.pkg.js', 'type' => 'js', ), '4ccfeb47' => array( 'name' => 'darkconsole.pkg.js', 'symbols' => array( 0 => 'javelin-behavior-dark-console', 1 => 'javelin-behavior-error-log', ), 'uri' => '/res/pkg/4ccfeb47/darkconsole.pkg.js', 'type' => 'js', ), 'dd27a69b' => array( 'name' => 'differential.pkg.css', 'symbols' => array( 0 => 'differential-core-view-css', 1 => 'differential-changeset-view-css', 2 => 'differential-results-table-css', 3 => 'differential-revision-history-css', 4 => 'differential-revision-list-css', 5 => 'differential-table-of-contents-css', 6 => 'differential-revision-comment-css', 7 => 'differential-revision-add-comment-css', 8 => 'differential-revision-comment-list-css', 9 => 'phabricator-object-selector-css', 10 => 'phabricator-content-source-view-css', 11 => 'differential-local-commits-view-css', 12 => 'inline-comment-summary-css', ), 'uri' => '/res/pkg/dd27a69b/differential.pkg.css', 'type' => 'css', ), '9488bb69' => array( 'name' => 'differential.pkg.js', 'symbols' => array( 0 => 'phabricator-drag-and-drop-file-upload', 1 => 'phabricator-shaped-request', 2 => 'javelin-behavior-differential-feedback-preview', 3 => 'javelin-behavior-differential-edit-inline-comments', 4 => 'javelin-behavior-differential-populate', 5 => 'javelin-behavior-differential-show-more', 6 => 'javelin-behavior-differential-diff-radios', 7 => 'javelin-behavior-differential-accept-with-errors', 8 => 'javelin-behavior-differential-comment-jump', 9 => 'javelin-behavior-differential-add-reviewers-and-ccs', 10 => 'javelin-behavior-differential-keyboard-navigation', 11 => 'javelin-behavior-aphront-drag-and-drop', 12 => 'javelin-behavior-aphront-drag-and-drop-textarea', 13 => 'javelin-behavior-phabricator-object-selector', 14 => 'javelin-behavior-repository-crossreference', 15 => 'javelin-behavior-load-blame', 16 => 'differential-inline-comment-editor', 17 => 'javelin-behavior-differential-dropdown-menus', 18 => 'javelin-behavior-differential-toggle-files', 19 => 'javelin-behavior-differential-user-select', ), 'uri' => '/res/pkg/9488bb69/differential.pkg.js', 'type' => 'js', ), 'c8ce2d88' => array( 'name' => 'diffusion.pkg.css', 'symbols' => array( 0 => 'diffusion-commit-view-css', 1 => 'diffusion-icons-css', ), 'uri' => '/res/pkg/c8ce2d88/diffusion.pkg.css', 'type' => 'css', ), 96909266 => array( 'name' => 'diffusion.pkg.js', 'symbols' => array( 0 => 'javelin-behavior-diffusion-pull-lastmodified', 1 => 'javelin-behavior-diffusion-commit-graph', 2 => 'javelin-behavior-audit-preview', ), 'uri' => '/res/pkg/96909266/diffusion.pkg.js', 'type' => 'js', ), 'c1359b5d' => array( 'name' => 'javelin.pkg.js', 'symbols' => array( 0 => 'javelin-util', 1 => 'javelin-install', 2 => 'javelin-event', 3 => 'javelin-stratcom', 4 => 'javelin-behavior', 5 => 'javelin-resource', 6 => 'javelin-request', 7 => 'javelin-vector', 8 => 'javelin-dom', 9 => 'javelin-json', 10 => 'javelin-uri', 11 => 'javelin-workflow', 12 => 'javelin-mask', 13 => 'javelin-typeahead', 14 => 'javelin-typeahead-normalizer', 15 => 'javelin-typeahead-source', 16 => 'javelin-typeahead-preloaded-source', 17 => 'javelin-typeahead-ondemand-source', 18 => 'javelin-tokenizer', 19 => 'javelin-history', ), 'uri' => '/res/pkg/c1359b5d/javelin.pkg.js', 'type' => 'js', ), '6b1fccc6' => array( 'name' => 'maniphest.pkg.css', 'symbols' => array( 0 => 'maniphest-task-summary-css', 1 => 'maniphest-transaction-detail-css', 2 => 'aphront-attached-file-view-css', 3 => 'phabricator-project-tag-css', ), 'uri' => '/res/pkg/6b1fccc6/maniphest.pkg.css', 'type' => 'css', ), '1621e522' => array( 'name' => 'maniphest.pkg.js', 'symbols' => array( 0 => 'javelin-behavior-maniphest-batch-selector', 1 => 'javelin-behavior-maniphest-transaction-controls', 2 => 'javelin-behavior-maniphest-transaction-preview', 3 => 'javelin-behavior-maniphest-transaction-expand', 4 => 'javelin-behavior-maniphest-subpriority-editor', ), 'uri' => '/res/pkg/1621e522/maniphest.pkg.js', 'type' => 'js', ), ), 'reverse' => array( 'aphront-attached-file-view-css' => '6b1fccc6', 'aphront-dialog-view-css' => 'c3ade478', 'aphront-error-view-css' => 'c3ade478', 'aphront-form-view-css' => 'c3ade478', 'aphront-list-filter-view-css' => 'c3ade478', 'aphront-pager-view-css' => 'c3ade478', 'aphront-panel-view-css' => 'c3ade478', 'aphront-table-view-css' => 'c3ade478', 'aphront-tokenizer-control-css' => 'c3ade478', 'aphront-tooltip-css' => 'c3ade478', 'aphront-typeahead-control-css' => 'c3ade478', 'differential-changeset-view-css' => 'dd27a69b', 'differential-core-view-css' => 'dd27a69b', 'differential-inline-comment-editor' => '9488bb69', 'differential-local-commits-view-css' => 'dd27a69b', 'differential-results-table-css' => 'dd27a69b', 'differential-revision-add-comment-css' => 'dd27a69b', 'differential-revision-comment-css' => 'dd27a69b', 'differential-revision-comment-list-css' => 'dd27a69b', 'differential-revision-history-css' => 'dd27a69b', 'differential-revision-list-css' => 'dd27a69b', 'differential-table-of-contents-css' => 'dd27a69b', 'diffusion-commit-view-css' => 'c8ce2d88', 'diffusion-icons-css' => 'c8ce2d88', 'global-drag-and-drop-css' => 'c3ade478', 'inline-comment-summary-css' => 'dd27a69b', 'javelin-aphlict' => '98f60e3f', 'javelin-behavior' => 'c1359b5d', 'javelin-behavior-aphlict-dropdown' => '98f60e3f', 'javelin-behavior-aphlict-listen' => '98f60e3f', 'javelin-behavior-aphront-basic-tokenizer' => '98f60e3f', 'javelin-behavior-aphront-drag-and-drop' => '9488bb69', 'javelin-behavior-aphront-drag-and-drop-textarea' => '9488bb69', 'javelin-behavior-aphront-form-disable-on-submit' => '98f60e3f', 'javelin-behavior-audit-preview' => '96909266', 'javelin-behavior-dark-console' => '4ccfeb47', 'javelin-behavior-device' => '98f60e3f', 'javelin-behavior-differential-accept-with-errors' => '9488bb69', 'javelin-behavior-differential-add-reviewers-and-ccs' => '9488bb69', 'javelin-behavior-differential-comment-jump' => '9488bb69', 'javelin-behavior-differential-diff-radios' => '9488bb69', 'javelin-behavior-differential-dropdown-menus' => '9488bb69', 'javelin-behavior-differential-edit-inline-comments' => '9488bb69', 'javelin-behavior-differential-feedback-preview' => '9488bb69', 'javelin-behavior-differential-keyboard-navigation' => '9488bb69', 'javelin-behavior-differential-populate' => '9488bb69', 'javelin-behavior-differential-show-more' => '9488bb69', 'javelin-behavior-differential-toggle-files' => '9488bb69', 'javelin-behavior-differential-user-select' => '9488bb69', 'javelin-behavior-diffusion-commit-graph' => '96909266', 'javelin-behavior-diffusion-pull-lastmodified' => '96909266', 'javelin-behavior-error-log' => '4ccfeb47', 'javelin-behavior-global-drag-and-drop' => '98f60e3f', 'javelin-behavior-history-install' => '98f60e3f', 'javelin-behavior-konami' => '98f60e3f', 'javelin-behavior-lightbox-attachments' => '98f60e3f', 'javelin-behavior-load-blame' => '9488bb69', 'javelin-behavior-maniphest-batch-selector' => '1621e522', 'javelin-behavior-maniphest-subpriority-editor' => '1621e522', 'javelin-behavior-maniphest-transaction-controls' => '1621e522', 'javelin-behavior-maniphest-transaction-expand' => '1621e522', 'javelin-behavior-maniphest-transaction-preview' => '1621e522', 'javelin-behavior-phabricator-active-nav' => '98f60e3f', 'javelin-behavior-phabricator-autofocus' => '98f60e3f', 'javelin-behavior-phabricator-gesture' => '98f60e3f', 'javelin-behavior-phabricator-hovercards' => '98f60e3f', 'javelin-behavior-phabricator-keyboard-shortcuts' => '98f60e3f', 'javelin-behavior-phabricator-nav' => '98f60e3f', 'javelin-behavior-phabricator-object-selector' => '9488bb69', 'javelin-behavior-phabricator-oncopy' => '98f60e3f', 'javelin-behavior-phabricator-remarkup-assist' => '98f60e3f', 'javelin-behavior-phabricator-reveal-content' => '98f60e3f', 'javelin-behavior-phabricator-search-typeahead' => '98f60e3f', 'javelin-behavior-phabricator-tooltips' => '98f60e3f', 'javelin-behavior-phabricator-watch-anchor' => '98f60e3f', 'javelin-behavior-refresh-csrf' => '98f60e3f', 'javelin-behavior-repository-crossreference' => '9488bb69', 'javelin-behavior-toggle-class' => '98f60e3f', 'javelin-behavior-workflow' => '98f60e3f', 'javelin-dom' => 'c1359b5d', 'javelin-event' => 'c1359b5d', 'javelin-history' => 'c1359b5d', 'javelin-install' => 'c1359b5d', 'javelin-json' => 'c1359b5d', 'javelin-mask' => 'c1359b5d', 'javelin-request' => 'c1359b5d', 'javelin-resource' => 'c1359b5d', 'javelin-stratcom' => 'c1359b5d', 'javelin-tokenizer' => 'c1359b5d', 'javelin-typeahead' => 'c1359b5d', 'javelin-typeahead-normalizer' => 'c1359b5d', 'javelin-typeahead-ondemand-source' => 'c1359b5d', 'javelin-typeahead-preloaded-source' => 'c1359b5d', 'javelin-typeahead-source' => 'c1359b5d', 'javelin-uri' => 'c1359b5d', 'javelin-util' => 'c1359b5d', 'javelin-vector' => 'c1359b5d', 'javelin-workflow' => 'c1359b5d', 'lightbox-attachment-css' => 'c3ade478', 'maniphest-task-summary-css' => '6b1fccc6', 'maniphest-transaction-detail-css' => '6b1fccc6', 'phabricator-action-list-view-css' => 'c3ade478', 'phabricator-application-launch-view-css' => 'c3ade478', 'phabricator-busy' => '98f60e3f', 'phabricator-content-source-view-css' => 'dd27a69b', 'phabricator-core-buttons-css' => 'c3ade478', 'phabricator-core-css' => 'c3ade478', 'phabricator-crumbs-view-css' => 'c3ade478', 'phabricator-directory-css' => 'c3ade478', 'phabricator-drag-and-drop-file-upload' => '9488bb69', 'phabricator-dropdown-menu' => '98f60e3f', 'phabricator-file-upload' => '98f60e3f', 'phabricator-filetree-view-css' => 'c3ade478', 'phabricator-flag-css' => 'c3ade478', 'phabricator-form-view-css' => 'c3ade478', 'phabricator-header-view-css' => 'c3ade478', 'phabricator-hovercard' => '98f60e3f', 'phabricator-jump-nav' => 'c3ade478', 'phabricator-keyboard-shortcut' => '98f60e3f', 'phabricator-keyboard-shortcut-manager' => '98f60e3f', 'phabricator-main-menu-view' => 'c3ade478', 'phabricator-menu-item' => '98f60e3f', 'phabricator-nav-view-css' => 'c3ade478', 'phabricator-notification' => '98f60e3f', 'phabricator-notification-css' => 'c3ade478', 'phabricator-notification-menu-css' => 'c3ade478', 'phabricator-object-item-list-view-css' => 'c3ade478', 'phabricator-object-selector-css' => 'dd27a69b', 'phabricator-phtize' => '98f60e3f', 'phabricator-prefab' => '98f60e3f', 'phabricator-project-tag-css' => '6b1fccc6', 'phabricator-property-list-view-css' => 'c3ade478', 'phabricator-remarkup-css' => 'c3ade478', 'phabricator-shaped-request' => '9488bb69', 'phabricator-side-menu-view-css' => 'c3ade478', 'phabricator-standard-page-view' => 'c3ade478', 'phabricator-tag-view-css' => 'c3ade478', 'phabricator-textareautils' => '98f60e3f', 'phabricator-tooltip' => '98f60e3f', 'phabricator-transaction-view-css' => 'c3ade478', 'phabricator-zindex-css' => 'c3ade478', 'phui-form-css' => 'c3ade478', 'phui-icon-view-css' => 'c3ade478', 'spacing-css' => 'c3ade478', 'sprite-apps-large-css' => 'c3ade478', 'sprite-gradient-css' => 'c3ade478', 'sprite-icons-css' => 'c3ade478', 'sprite-menu-css' => 'c3ade478', 'syntax-highlighting-css' => 'c3ade478', ), )); diff --git a/src/applications/conpherence/controller/ConpherenceController.php b/src/applications/conpherence/controller/ConpherenceController.php index 95bf05f61..348507011 100644 --- a/src/applications/conpherence/controller/ConpherenceController.php +++ b/src/applications/conpherence/controller/ConpherenceController.php @@ -1,103 +1,112 @@ <?php /** * @group conpherence */ abstract class ConpherenceController extends PhabricatorController { private $conpherences; public function buildApplicationMenu() { $nav = new PhabricatorMenuView(); $nav->newLink( pht('New Message'), $this->getApplicationURI('new/')); return $nav; } public function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); $crumbs ->addAction( id(new PhabricatorMenuItemView()) ->setName(pht('New Message')) ->setHref($this->getApplicationURI('new/')) ->setIcon('create') ->setWorkflow(true)) ->addAction( id(new PhabricatorMenuItemView()) ->setName(pht('Thread')) ->setHref('#') ->setIcon('action-menu') ->setStyle('display: none;') ->addClass('device-widgets-selector') ->addSigil('device-widgets-selector')); return $crumbs; } protected function buildHeaderPaneContent(ConpherenceThread $conpherence) { $crumbs = $this->buildApplicationCrumbs(); if ($conpherence->getTitle()) { $title = $conpherence->getTitle(); } else { $title = pht('Conpherence'); } $crumbs->addCrumb( id(new PhabricatorCrumbView()) ->setName($title) ->setHref($this->getApplicationURI('update/'.$conpherence->getID().'/')) ->setWorkflow(true)); - return $crumbs; + return hsprintf( + '%s', + array( + phutil_tag( + 'div', + array( + 'class' => 'header-loading-mask' + ), + ''), + $crumbs)); } protected function renderConpherenceTransactions( ConpherenceThread $conpherence) { $user = $this->getRequest()->getUser(); $transactions = $conpherence->getTransactions(); $oldest_transaction_id = 0; $too_many = ConpherenceThreadQuery::TRANSACTION_LIMIT + 1; if (count($transactions) == $too_many) { $last_transaction = end($transactions); unset($transactions[$last_transaction->getID()]); $oldest_transaction = end($transactions); $oldest_transaction_id = $oldest_transaction->getID(); } $transactions = array_reverse($transactions); $handles = $conpherence->getHandles(); $rendered_transactions = array(); $engine = id(new PhabricatorMarkupEngine()) ->setViewer($user); foreach ($transactions as $key => $transaction) { if ($transaction->shouldHide()) { unset($transactions[$key]); continue; } if ($transaction->getComment()) { $engine->addObject( $transaction->getComment(), PhabricatorApplicationTransactionComment::MARKUP_FIELD_COMMENT); } } $engine->process(); foreach ($transactions as $transaction) { $rendered_transactions[] = id(new ConpherenceTransactionView()) ->setUser($user) ->setConpherenceTransaction($transaction) ->setHandles($handles) ->setMarkupEngine($engine) ->render(); } $latest_transaction_id = $transaction->getID(); return array( 'transactions' => $rendered_transactions, 'latest_transaction_id' => $latest_transaction_id, 'oldest_transaction_id' => $oldest_transaction_id ); } } diff --git a/src/applications/conpherence/controller/ConpherenceListController.php b/src/applications/conpherence/controller/ConpherenceListController.php index 9ff71e83f..1116ac332 100644 --- a/src/applications/conpherence/controller/ConpherenceListController.php +++ b/src/applications/conpherence/controller/ConpherenceListController.php @@ -1,251 +1,257 @@ <?php /** * @group conpherence */ final class ConpherenceListController extends ConpherenceController { const SELECTED_MODE = 'selected'; const UNSELECTED_MODE = 'unselected'; const PAGING_MODE = 'paging'; private $conpherenceID; public function setConpherenceID($conpherence_id) { $this->conpherenceID = $conpherence_id; return $this; } public function getConpherenceID() { return $this->conpherenceID; } public function willProcessRequest(array $data) { $this->setConpherenceID(idx($data, 'id')); } /** * Three main modes of operation... * * 1 - /conpherence/ - UNSELECTED_MODE * 2 - /conpherence/<id>/ - SELECTED_MODE * 3 - /conpherence/?direction='up'&... - PAGING_MODE * * UNSELECTED_MODE is not an Ajax request while the other two are Ajax * requests. */ private function determineMode() { $request = $this->getRequest(); $mode = self::UNSELECTED_MODE; if ($request->isAjax()) { if ($request->getStr('direction')) { $mode = self::PAGING_MODE; } else { $mode = self::SELECTED_MODE; } } return $mode; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $title = pht('Conpherence'); $conpherence = null; $scroll_up_participant = $this->getEmptyParticipant(); $scroll_down_participant = $this->getEmptyParticipant(); $too_many = ConpherenceParticipantQuery::LIMIT + 1; $all_participation = array(); $mode = $this->determineMode(); switch ($mode) { case self::SELECTED_MODE: $conpherence_id = $this->getConpherenceID(); $conpherence = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withIDs(array($conpherence_id)) ->executeOne(); if (!$conpherence) { return new Aphront404Response(); } if ($conpherence->getTitle()) { $title = $conpherence->getTitle(); } $cursor = $conpherence->getParticipant($user->getPHID()); $data = $this->loadParticipationWithMidCursor($cursor); $all_participation = $data['participation']; $scroll_up_participant = $data['scroll_up_participant']; $scroll_down_participant = $data['scroll_down_participant']; break; case self::PAGING_MODE: $direction = $request->getStr('direction'); $id = $request->getInt('participant_id'); $date_touched = $request->getInt('date_touched'); $conpherence_phid = $request->getStr('conpherence_phid'); if ($direction == 'up') { $order = ConpherenceParticipantQuery::ORDER_NEWER; } else { $order = ConpherenceParticipantQuery::ORDER_OLDER; } $scroller_participant = id(new ConpherenceParticipant()) ->makeEphemeral() ->setID($id) ->setDateTouched($date_touched) ->setConpherencePHID($conpherence_phid); $participation = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())) ->withParticipantCursor($scroller_participant) ->setOrder($order) ->setLimit($too_many) ->execute(); if (count($participation) == $too_many) { if ($direction == 'up') { $node = $scroll_up_participant = reset($participation); } else { $node = $scroll_down_participant = end($participation); } unset($participation[$node->getConpherencePHID()]); } $all_participation = $participation; break; case self::UNSELECTED_MODE: default: $too_many = ConpherenceParticipantQuery::LIMIT + 1; $all_participation = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())) ->setLimit($too_many) ->execute(); if (count($all_participation) == $too_many) { $node = end($participation); unset($all_participation[$node->getConpherencePHID()]); $scroll_down_participant = $node; } break; } $threads = $this->loadConpherenceThreadData( $all_participation); $thread_view = id(new ConpherenceThreadListView()) ->setUser($user) ->setBaseURI($this->getApplicationURI()) ->setThreads($threads) ->setScrollUpParticipant($scroll_up_participant) ->setScrollDownParticipant($scroll_down_participant); switch ($mode) { case self::SELECTED_MODE: $response = id(new AphrontAjaxResponse())->setContent($thread_view); break; case self::PAGING_MODE: $thread_html = $thread_view->renderThreadsHTML(); $phids = array_keys($participation); $content = array( 'html' => $thread_html, 'phids' => $phids); $response = id(new AphrontAjaxResponse())->setContent($content); break; case self::UNSELECTED_MODE: default: $layout = id(new ConpherenceLayoutView()) ->setBaseURI($this->getApplicationURI()) ->setThreadView($thread_view) ->setRole('list'); if ($conpherence) { + $layout->setHeader($this->buildHeaderPaneContent($conpherence)); $layout->setThread($conpherence); + } else { + $layout->setHeader( + $this->buildHeaderPaneContent( + id(new ConpherenceThread()) + ->makeEphemeral())); } $response = $this->buildApplicationPage( $layout, array( 'title' => $title, 'device' => true, )); break; } return $response; } /** * Handles the curious case when we are visiting a conpherence directly * by issuing two separate queries. Otherwise, additional conpherences * are fetched asynchronously. Note these can be earlier or later * (up or down), depending on what conpherence was selected on initial * load. */ private function loadParticipationWithMidCursor( ConpherenceParticipant $cursor) { $user = $this->getRequest()->getUser(); $scroll_up_participant = $this->getEmptyParticipant(); $scroll_down_participant = $this->getEmptyParticipant(); // Note this is a bit dodgy since there may be less than this // amount in either the up or down direction, thus having us fail // to fetch LIMIT in total. Whatevs for now and re-visit if we're // fine-tuning this loading process. $too_many = ceil(ConpherenceParticipantQuery::LIMIT / 2) + 1; $participant_query = id(new ConpherenceParticipantQuery()) ->withParticipantPHIDs(array($user->getPHID())) ->setLimit($too_many); $current_selection_epoch = $cursor->getDateTouched(); $set_one = $participant_query ->withParticipantCursor($cursor) ->setOrder(ConpherenceParticipantQuery::ORDER_NEWER) ->execute(); if (count($set_one) == $too_many) { $node = reset($set_one); unset($set_one[$node->getConpherencePHID()]); $scroll_up_participant = $node; } $set_two = $participant_query ->withParticipantCursor($cursor) ->setOrder(ConpherenceParticipantQuery::ORDER_OLDER) ->execute(); if (count($set_two) == $too_many) { $node = end($set_two); unset($set_two[$node->getConpherencePHID()]); $scroll_down_participant = $node; } $participation = array_merge( $set_one, $set_two); return array( 'scroll_up_participant' => $scroll_up_participant, 'scroll_down_participant' => $scroll_down_participant, 'participation' => $participation); } private function loadConpherenceThreadData($participation) { $user = $this->getRequest()->getUser(); $conpherence_phids = array_keys($participation); $conpherences = array(); if ($conpherence_phids) { $conpherences = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withPHIDs($conpherence_phids) ->needParticipantCache(true) ->execute(); // this will re-sort by participation data $conpherences = array_select_keys($conpherences, $conpherence_phids); } return $conpherences; } private function getEmptyParticipant() { return id(new ConpherenceParticipant()) ->makeEphemeral(); } } diff --git a/src/applications/conpherence/controller/ConpherenceViewController.php b/src/applications/conpherence/controller/ConpherenceViewController.php index 347445d4b..3d5d9b2f5 100644 --- a/src/applications/conpherence/controller/ConpherenceViewController.php +++ b/src/applications/conpherence/controller/ConpherenceViewController.php @@ -1,179 +1,170 @@ <?php /** * @group conpherence */ final class ConpherenceViewController extends ConpherenceController { private $conpherenceID; private $conpherence; public function setConpherence(ConpherenceThread $conpherence) { $this->conpherence = $conpherence; return $this; } public function getConpherence() { return $this->conpherence; } public function setConpherenceID($conpherence_id) { $this->conpherenceID = $conpherence_id; return $this; } public function getConpherenceID() { return $this->conpherenceID; } public function willProcessRequest(array $data) { $this->setConpherenceID(idx($data, 'id')); } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $conpherence_id = $this->getConpherenceID(); if (!$conpherence_id) { return new Aphront404Response(); } $query = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withIDs(array($conpherence_id)) ->needParticipantCache(true) ->needTransactions(true) ->setTransactionLimit(ConpherenceThreadQuery::TRANSACTION_LIMIT); $before_transaction_id = $request->getInt('oldest_transaction_id'); if ($before_transaction_id) { $query ->setBeforeTransactionID($before_transaction_id); } $conpherence = $query->executeOne(); if (!$conpherence) { return new Aphront404Response(); } $this->setConpherence($conpherence); $participant = $conpherence->getParticipant($user->getPHID()); $transactions = $conpherence->getTransactions(); $latest_transaction = end($transactions); $write_guard = AphrontWriteGuard::beginScopedUnguardedWrites(); $participant->markUpToDate($conpherence, $latest_transaction); unset($write_guard); $data = $this->renderConpherenceTransactions($conpherence); $messages = $this->renderMessagePaneContent( $data['transactions'], $data['oldest_transaction_id']); if ($before_transaction_id) { $header = null; $form = null; $content = array('messages' => $messages); } else { - $header = $this->renderHeaderPaneContent(); + $header = $this->buildHeaderPaneContent($conpherence); $form = $this->renderFormContent($data['latest_transaction_id']); $content = array( 'header' => $header, 'messages' => $messages, 'form' => $form ); } if ($request->isAjax()) { return id(new AphrontAjaxResponse())->setContent($content); } $layout = id(new ConpherenceLayoutView()) ->setBaseURI($this->getApplicationURI()) ->setThread($conpherence) ->setHeader($header) ->setMessages($messages) ->setReplyForm($form) ->setRole('thread'); $title = $conpherence->getTitle(); if (!$title) { $title = pht('Conpherence'); } return $this->buildApplicationPage( $layout, array( 'title' => $title, 'device' => true, )); } - private function renderHeaderPaneContent() { - $conpherence = $this->getConpherence(); - $header = $this->buildHeaderPaneContent($conpherence); - return hsprintf('%s', $header); - } - - private function renderMessagePaneContent( array $transactions, $oldest_transaction_id) { - require_celerity_resource('conpherence-message-pane-css'); - $scrollbutton = ''; if ($oldest_transaction_id) { $scrollbutton = javelin_tag( 'a', array( 'href' => '#', 'mustcapture' => true, 'sigil' => 'show-older-messages', 'class' => 'conpherence-show-older-messages', 'meta' => array( 'oldest_transaction_id' => $oldest_transaction_id ) ), pht('Show Older Messages')); } return hsprintf('%s%s', $scrollbutton, $transactions); } private function renderFormContent($latest_transaction_id) { $conpherence = $this->getConpherence(); $user = $this->getRequest()->getUser(); $update_uri = $this->getApplicationURI('update/'.$conpherence->getID().'/'); Javelin::initBehavior('conpherence-pontificate'); $form = id(new AphrontFormView()) ->setAction($update_uri) ->setFlexible(true) ->addSigil('conpherence-pontificate') ->setWorkflow(true) ->setUser($user) ->addHiddenInput('action', 'message') ->appendChild( id(new PhabricatorRemarkupControl()) ->setUser($user) ->setName('text')) ->appendChild( id(new AphrontFormSubmitControl()) ->setValue(pht('Pontificate'))) ->appendChild( javelin_tag( 'input', array( 'type' => 'hidden', 'name' => 'latest_transaction_id', 'value' => $latest_transaction_id, 'sigil' => 'latest-transaction-id', 'meta' => array( 'id' => $latest_transaction_id ) ), '')) ->render(); return $form; } } diff --git a/src/applications/conpherence/controller/ConpherenceWidgetController.php b/src/applications/conpherence/controller/ConpherenceWidgetController.php index 7415cb840..764088bac 100644 --- a/src/applications/conpherence/controller/ConpherenceWidgetController.php +++ b/src/applications/conpherence/controller/ConpherenceWidgetController.php @@ -1,401 +1,400 @@ <?php /** * @group conpherence */ final class ConpherenceWidgetController extends ConpherenceController { private $conpherenceID; private $conpherence; private $userPreferences; public function setUserPreferences(PhabricatorUserPreferences $pref) { $this->userPreferences = $pref; return $this; } public function getUserPreferences() { return $this->userPreferences; } public function setConpherence(ConpherenceThread $conpherence) { $this->conpherence = $conpherence; return $this; } public function getConpherence() { return $this->conpherence; } public function setConpherenceID($conpherence_id) { $this->conpherenceID = $conpherence_id; return $this; } public function getConpherenceID() { return $this->conpherenceID; } public function willProcessRequest(array $data) { $this->setConpherenceID(idx($data, 'id')); } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $conpherence_id = $this->getConpherenceID(); if (!$conpherence_id) { return new Aphront404Response(); } $conpherence = id(new ConpherenceThreadQuery()) ->setViewer($user) ->withIDs(array($conpherence_id)) ->needWidgetData(true) ->executeOne(); $this->setConpherence($conpherence); $this->setUserPreferences($user->loadPreferences()); $widgets = $this->renderWidgetPaneContent(); $content = $widgets; return id(new AphrontAjaxResponse())->setContent($content); } private function renderWidgetPaneContent() { - require_celerity_resource('conpherence-widget-pane-css'); require_celerity_resource('sprite-conpherence-css'); $conpherence = $this->getConpherence(); $widgets = array(); $widgets[] = phutil_tag( 'div', array( 'class' => 'widgets-header', ), id(new PhabricatorActionHeaderView()) ->setHeaderColor(PhabricatorActionHeaderView::HEADER_GREY) - ->setHeaderTitle('') + ->setHeaderTitle(pht('Participants')) ->setHeaderHref('#') ->setDropdown(true) ->addHeaderSigil('widgets-selector')); $user = $this->getRequest()->getUser(); // now the widget bodies $widgets[] = javelin_tag( 'div', array( 'class' => 'widgets-body', 'id' => 'widgets-people', 'sigil' => 'widgets-people', ), id(new ConpherencePeopleWidgetView()) ->setUser($user) ->setConpherence($conpherence) ->setUpdateURI($this->getWidgetURI())); $widgets[] = javelin_tag( 'div', array( 'class' => 'widgets-body', 'id' => 'widgets-files', 'sigil' => 'widgets-files', 'style' => 'display: none;' ), id(new ConpherenceFileWidgetView()) ->setUser($user) ->setConpherence($conpherence) ->setUpdateURI($this->getWidgetURI())); $widgets[] = phutil_tag( 'div', array( 'class' => 'widgets-body', 'id' => 'widgets-calendar', 'style' => 'display: none;' ), $this->renderCalendarWidgetPaneContent()); $widgets[] = phutil_tag( 'div', array( 'class' => 'widgets-body', 'id' => 'widgets-settings', 'style' => 'display: none' ), $this->renderSettingsWidgetPaneContent()); // without this implosion we get "," between each element in our widgets // array return array('widgets' => phutil_implode_html('', $widgets)); } private function renderSettingsWidgetPaneContent() { $user = $this->getRequest()->getUser(); $conpherence = $this->getConpherence(); $participants = $conpherence->getParticipants(); $participant = $participants[$user->getPHID()]; $default = ConpherenceSettings::EMAIL_ALWAYS; $preference = $this->getUserPreferences(); if ($preference) { $default = $preference->getPreference( PhabricatorUserPreferences::PREFERENCE_CONPH_NOTIFICATIONS, ConpherenceSettings::EMAIL_ALWAYS); } $settings = $participant->getSettings(); $notifications = idx( $settings, 'notifications', $default); $options = id(new AphrontFormRadioButtonControl()) ->addButton( ConpherenceSettings::EMAIL_ALWAYS, ConpherenceSettings::getHumanString( ConpherenceSettings::EMAIL_ALWAYS), '') ->addButton( ConpherenceSettings::NOTIFICATIONS_ONLY, ConpherenceSettings::getHumanString( ConpherenceSettings::NOTIFICATIONS_ONLY), '') ->setName('notifications') ->setValue($notifications); $layout = array( $options, phutil_tag( 'input', array( 'type' => 'hidden', 'name' => 'action', 'value' => 'notifications' )), phutil_tag( 'button', array( 'type' => 'submit', 'class' => 'notifications-update', ), pht('Save')) ); return phabricator_form( $user, array( 'method' => 'POST', 'action' => $this->getWidgetURI(), 'sigil' => 'notifications-update', ), $layout); } private function renderCalendarWidgetPaneContent() { $user = $this->getRequest()->getUser(); $conpherence = $this->getConpherence(); $participants = $conpherence->getParticipants(); $widget_data = $conpherence->getWidgetData(); $statuses = $widget_data['statuses']; $handles = $conpherence->getHandles(); $content = array(); $layout = id(new AphrontMultiColumnView()) ->setFluidLayout(true); $timestamps = $this->getCalendarWidgetWeekTimestamps(); $today = $timestamps['today']; $weekstamps = $timestamps['weekstamps']; $one_day = 24 * 60 * 60; foreach ($weekstamps as $time => $day) { // build a header for the new day if ($day->format('w') == $today->format('w')) { $active_class = 'today'; } else { $active_class = ''; } $content[] = phutil_tag( 'div', array( 'class' => 'day-header '.$active_class ), array( phutil_tag( 'div', array( 'class' => 'day-name' ), $day->format('l')), phutil_tag( 'div', array( 'class' => 'day-date' ), $day->format('m/d/y')) )); $week_day_number = $day->format('w'); $day->setTime(0, 0, 0); $epoch_start = $day->format('U'); $next_day = clone $day; $next_day->modify('+1 day'); $epoch_end = $next_day->format('U'); $first_status_of_the_day = true; $statuses_of_the_day = array(); // keep looking through statuses where we last left off foreach ($statuses as $status) { if ($status->getDateFrom() >= $epoch_end) { // This list is sorted, so we can stop looking. break; } if ($status->getDateFrom() < $epoch_end && $status->getDateTo() > $epoch_start) { if (!$first_status_of_the_day) { $content[] = phutil_tag( 'div', array( 'class' => 'divider' ), ''); } $statuses_of_the_day[$status->getUserPHID()] = $status; $timespan = $status->getDateTo() - $status->getDateFrom(); if ($timespan > $one_day) { $time_str = 'm/d'; } else { $time_str = 'h:i A'; } $epoch_range = phabricator_format_local_time( $status->getDateFrom(), $user, $time_str) . ' - ' . phabricator_format_local_time( $status->getDateTo(), $user, $time_str); $secondary_info = pht('%s, %s', $handles[$status->getUserPHID()]->getName(), $epoch_range); $content[] = phutil_tag( 'div', array( 'class' => 'pm user-status '.$status->getTextStatus(), ), array( phutil_tag( 'div', array( 'class' => 'icon', ), ''), phutil_tag( 'div', array( 'class' => 'description' ), array( $status->getTerseSummary($user), phutil_tag( 'div', array( 'class' => 'participant' ), $secondary_info))) )); $first_status_of_the_day = false; } else { $content[] = phutil_tag( 'div', array('class' => 'no-events pmt pml'), pht('No Events Scheduled.')); } } // we didn't get a status on this day so add a spacer if ($first_status_of_the_day) { $content[] = phutil_tag( 'div', array( 'class' => 'spacer' ), ''); } if ($week_day_number > 0 && $week_day_number < 6) { if ($week_day_number == $today->format('w')) { $active_class = '-active'; } else { $active_class = ''; } $inner_layout = array(); foreach ($participants as $phid => $participant) { $status = idx($statuses_of_the_day, $phid, false); if ($status) { $inner_layout[] = phutil_tag( 'div', array( 'class' => $status->getTextStatus() ), ''); } else { $inner_layout[] = phutil_tag( 'div', array( 'class' => 'present' ), ''); } } $layout->addColumn( phutil_tag( 'div', array( 'class' => 'day-column'.$active_class ), array( phutil_tag( 'div', array( 'class' => 'day-name' ), $day->format('D')), phutil_tag( 'div', array( 'class' => 'day-number', ), $day->format('j')), $inner_layout ))); } } return array( $layout, $content ); } private function getCalendarWidgetWeekTimestamps() { $user = $this->getRequest()->getUser(); $timezone = new DateTimeZone($user->getTimezoneIdentifier()); $today = id(new DateTime('now', $timezone)); $monday = clone $today; $monday ->modify('+1 day') ->modify('last monday'); $timestamps = array(); for ($day = 0; $day < 7; $day++) { $timestamp = clone $monday; $timestamps[] = $timestamp->modify(sprintf('+%d days', $day)); } return array( 'today' => $today, 'weekstamps' => $timestamps ); } private function getWidgetURI() { $conpherence = $this->getConpherence(); return $this->getApplicationURI('update/'.$conpherence->getID().'/'); } } diff --git a/src/applications/conpherence/view/ConpherenceLayoutView.php b/src/applications/conpherence/view/ConpherenceLayoutView.php index d6d31bf82..750929540 100644 --- a/src/applications/conpherence/view/ConpherenceLayoutView.php +++ b/src/applications/conpherence/view/ConpherenceLayoutView.php @@ -1,190 +1,241 @@ <?php final class ConpherenceLayoutView extends AphrontView { private $thread; private $baseURI; private $threadView; private $role; private $header; private $messages; private $replyForm; public function setMessages($messages) { $this->messages = $messages; return $this; } public function setReplyForm($reply_form) { $this->replyForm = $reply_form; return $this; } public function setHeader($header) { $this->header = $header; return $this; } public function setRole($role) { $this->role = $role; return $this; } public function getThreadView() { return $this->threadView; } public function setBaseURI($base_uri) { $this->baseURI = $base_uri; return $this; } public function setThread(ConpherenceThread $thread) { $this->thread = $thread; return $this; } public function setThreadView(ConpherenceThreadListView $thead_view) { $this->threadView = $thead_view; return $this; } public function render() { require_celerity_resource('conpherence-menu-css'); + require_celerity_resource('conpherence-message-pane-css'); + require_celerity_resource('conpherence-widget-pane-css'); $layout_id = celerity_generate_unique_node_id(); + $selected_id = null; + $selected_thread_id = null; + if ($this->thread) { + $selected_id = $this->thread->getPHID() . '-nav-item'; + $selected_thread_id = $this->thread->getID(); + } Javelin::initBehavior('conpherence-menu', array( - 'base_uri' => $this->baseURI, + 'baseURI' => $this->baseURI, 'layoutID' => $layout_id, - 'selectedID' => ($this->thread ? $this->thread->getID() : null), + 'selectedID' => $selected_id, + 'selectedThreadID' => $selected_thread_id, 'role' => $this->role, 'hasThreadList' => (bool)$this->threadView, 'hasThread' => (bool)$this->messages, 'hasWidgets' => false, )); Javelin::initBehavior( 'conpherence-widget-pane', array( 'selectChar' => "\xE2\x96\xBC", 'widgetRegistry' => array( 'conpherence-message-pane' => array( 'name' => pht('Thread'), 'deviceOnly' => true, ), 'widgets-people' => array( 'name' => pht('Participants'), 'deviceOnly' => false, ), 'widgets-files' => array( 'name' => pht('Files'), 'deviceOnly' => false, ), 'widgets-calendar' => array( 'name' => pht('Calendar'), 'deviceOnly' => false, ), 'widgets-settings' => array( 'name' => pht('Settings'), 'deviceOnly' => false, ), ))); + + $icon_48 = celerity_get_resource_uri('/rsrc/image/loading/loading_48.gif'); + $loading_style = 'background-image: url('.$icon_48.');'; return javelin_tag( 'div', array( 'id' => $layout_id, 'sigil' => 'conpherence-layout', 'class' => 'conpherence-layout conpherence-role-'.$this->role, ), array( javelin_tag( 'div', array( 'class' => 'phabricator-nav-column-background', 'sigil' => 'phabricator-nav-column-background', ), ''), javelin_tag( 'div', array( 'id' => 'conpherence-menu-pane', 'class' => 'conpherence-menu-pane phabricator-side-menu', 'sigil' => 'conpherence-menu-pane', ), - nonempty($this->threadView, '')), + nonempty( + $this->threadView, + phutil_tag( + 'div', + array( + 'class' => 'menu-loading-icon', + 'style' => $loading_style), + ''))), javelin_tag( 'div', array( 'class' => 'conpherence-content-pane', ), array( javelin_tag( 'div', array( 'class' => 'conpherence-no-threads', 'sigil' => 'conpherence-no-threads', 'style' => 'display: none;', ), array( phutil_tag( 'div', array( 'class' => 'text' ), pht('You do not have any messages yet.')), javelin_tag( 'a', array( 'href' => '/conpherence/new/', 'class' => 'button', 'sigil' => 'workflow', ), pht('Send a Message')) )), javelin_tag( 'div', array( 'class' => 'conpherence-header-pane', 'id' => 'conpherence-header-pane', 'sigil' => 'conpherence-header-pane', ), nonempty($this->header, '')), javelin_tag( 'div', array( 'class' => 'conpherence-widget-pane', 'id' => 'conpherence-widget-pane', 'sigil' => 'conpherence-widget-pane', ), - ''), + array( + phutil_tag( + 'div', + array( + 'class' => 'widgets-loading-mask' + ), + ''), + phutil_tag( + 'div', + array( + 'class' => 'widgets-loading-icon', + 'style' => $loading_style, + ), + ''), + javelin_tag( + 'div', + array( + 'sigil' => 'conpherence-widgets-holder' + ), + ''))), javelin_tag( 'div', array( 'class' => 'conpherence-message-pane', - 'id' => 'conpherence-message-pane' + 'id' => 'conpherence-message-pane', + 'sigil' => 'conpherence-message-pane' ), array( javelin_tag( 'div', array( 'class' => 'conpherence-messages', 'id' => 'conpherence-messages', 'sigil' => 'conpherence-messages', ), nonempty($this->messages, '')), + phutil_tag( + 'div', + array( + 'class' => 'messages-loading-mask', + ), + ''), + phutil_tag( + 'div', + array( + 'class' => 'messages-loading-icon', + 'style' => $loading_style, + )), javelin_tag( 'div', array( 'id' => 'conpherence-form', 'sigil' => 'conpherence-form' ), nonempty($this->replyForm, '')) )), )), )); } } diff --git a/src/applications/conpherence/view/ConpherenceThreadListView.php b/src/applications/conpherence/view/ConpherenceThreadListView.php index abe66876d..37bc55124 100644 --- a/src/applications/conpherence/view/ConpherenceThreadListView.php +++ b/src/applications/conpherence/view/ConpherenceThreadListView.php @@ -1,166 +1,168 @@ <?php final class ConpherenceThreadListView extends AphrontView { private $baseURI; private $threads; private $scrollUpParticipant; private $scrollDownParticipant; public function setThreads(array $threads) { assert_instances_of($threads, 'ConpherenceThread'); $this->threads = $threads; return $this; } public function setScrollUpParticipant( ConpherenceParticipant $participant) { $this->scrollUpParticipant = $participant; return $this; } public function setScrollDownParticipant( ConpherenceParticipant $participant) { $this->scrollDownParticipant = $participant; return $this; } public function setBaseURI($base_uri) { $this->baseURI = $base_uri; return $this; } public function render() { require_celerity_resource('conpherence-menu-css'); $menu = id(new PhabricatorMenuView()) ->addClass('conpherence-menu') ->setID('conpherence-menu'); $this->addThreadsToMenu($menu, $this->threads); return $menu; } public function renderSingleThread(ConpherenceThread $thread) { return $this->renderThread($thread); } public function renderThreadsHTML() { $thread_html = array(); if ($this->scrollUpParticipant->getID()) { $thread_html[] = $this->getScrollMenuItem( $this->scrollUpParticipant, 'up'); } foreach ($this->threads as $thread) { $thread_html[] = $this->renderSingleThread($thread); } if ($this->scrollDownParticipant->getID()) { $thread_html[] = $this->getScrollMenuItem( $this->scrollDownParticipant, 'down'); } return phutil_implode_html('', $thread_html); } private function renderThreadItem(ConpherenceThread $thread) { return id(new PhabricatorMenuItemView()) ->setType(PhabricatorMenuItemView::TYPE_CUSTOM) ->setName($this->renderThread($thread)); } private function renderThread(ConpherenceThread $thread) { $user = $this->getUser(); $uri = $this->baseURI.$thread->getID().'/'; $data = $thread->getDisplayData($user, null); $title = $data['title']; $subtitle = $data['subtitle']; $unread_count = $data['unread_count']; $epoch = $data['epoch']; $image = $data['image']; + $dom_id = $thread->getPHID().'-nav-item'; return id(new ConpherenceMenuItemView()) ->setUser($user) ->setTitle($title) ->setSubtitle($subtitle) ->setHref($uri) ->setEpoch($epoch) ->setImageURI($image) ->setUnreadCount($unread_count) ->setID($thread->getPHID().'-nav-item') ->addSigil('conpherence-menu-click') ->setMetadata( array( 'title' => $data['js_title'], - 'id' => $thread->getID(), + 'id' => $dom_id, + 'threadID' => $thread->getID(), )); } private function addThreadsToMenu( PhabricatorMenuView $menu, array $conpherences) { if ($this->scrollUpParticipant->getID()) { $item = $this->getScrollMenuItem($this->scrollUpParticipant, 'up'); $menu->addMenuItem($item); } foreach ($conpherences as $conpherence) { $item = $this->renderThreadItem($conpherence); $menu->addMenuItem($item); } if (empty($conpherences)) { $menu->addMenuItem($this->getNoConpherencesMenuItem()); } if ($this->scrollDownParticipant->getID()) { $item = $this->getScrollMenuItem($this->scrollDownParticipant, 'down'); $menu->addMenuItem($item); } return $menu; } public function getScrollMenuItem( ConpherenceParticipant $participant, $direction) { if ($direction == 'up') { $name = pht('Load Newer Threads'); } else { $name = pht('Load Older Threads'); } $item = id(new PhabricatorMenuItemView()) ->addSigil('conpherence-menu-scroller') ->setName($name) ->setHref($this->baseURI) ->setType(PhabricatorMenuItemView::TYPE_BUTTON) ->setMetadata(array( 'participant_id' => $participant->getID(), 'conpherence_phid' => $participant->getConpherencePHID(), 'date_touched' => $participant->getDateTouched(), 'direction' => $direction)); return $item; } private function getNoConpherencesMenuItem() { $message = phutil_tag( 'div', array( 'class' => 'no-conpherences-menu-item' ), pht('No conpherences.')); return id(new PhabricatorMenuItemView()) ->setType(PhabricatorMenuItemView::TYPE_CUSTOM) ->setName($message); } } diff --git a/webroot/rsrc/css/application/conpherence/menu.css b/webroot/rsrc/css/application/conpherence/menu.css index 4501e5672..96841a14b 100644 --- a/webroot/rsrc/css/application/conpherence/menu.css +++ b/webroot/rsrc/css/application/conpherence/menu.css @@ -1,161 +1,178 @@ /** * @provides conpherence-menu-css */ .conpherence-layout { position: fixed; bottom: 0; left: 0; right: 0; top: 44px; } .conpherence-layout .conpherence-no-threads { height 80%; width: 80%; padding: 10%; text-align: center; } .conpherence-layout .conpherence-no-threads .text { margin: 0px 0px 16px 0px; } -.conpherence-menu-pane { +.conpherence-menu-pane .menu-loading-icon { + background-repeat: no-repeat; + background-position: center center; +} + +.conpherence-menu-pane, +.loading .menu-loading-icon { width: 100%; position: absolute; overflow-x: hidden; overflow-y: auto; top: 0; bottom: 0; } .device-desktop .conpherence-layout .conpherence-menu-pane, -.device-desktop .conpherence-layout .phabricator-nav-column-background { +.device-desktop .conpherence-layout .phabricator-nav-column-background, +.device-desktop .loading .menu-loading-icon { width: 280px; } .device .conpherence-menu-pane { top: 41px; } .device .conpherence-role-list .conpherence-menu-pane { top: 0px; } .device-phone .conpherence-menu-pane { -webkit-overflow-scrolling: touch; } .conpherence-layout .phabricator-nav-column-background { display: block; width: 100%; } .device .phabricator-nav-column-background { top: 44px; } .device .conpherence-role-thread .conpherence-menu-pane, .device .conpherence-role-thread .phabricator-nav-column-background { display: none; } .device-desktop .conpherence-content-pane { margin-left: 280px; } .conpherence-content-pane { + display: none; margin-left: 0px; position: relative; } +.device-desktop .conpherence-content-pane, +.device .conpherence-role-thread .conpherence-content-pane { + display: block; +} + .conpherence-menu .conpherence-menu-item-view { display: block; height: 55px; width: 100%; overflow: hidden; position: relative; text-decoration: none; border-top: solid 1px #3B3D3E; border-bottom: solid 1px #1C1F21; border-right: 0; border-left: 2px solid transparent; } .conpherence-menu .conpherence-selected { background: rgba(0, 0, 0, .6); border-left: 2px solid #66CCFF; } +.conpherence-menu .loading { + font-style: italic; +} + .device-desktop .conpherence-menu .conpherence-menu-item-view:hover { background-image: url('/rsrc/image/texture/dark-menu-hover.png'); } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-image { top: 6px; left: 6px; display: block; position: absolute; width: 35px; height: 35px; background-size: 35px; border: 4px solid rgb(29, 32, 34); border-radius: 3px; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-title { display: block; margin-top: 12px; margin-left: 58px; text-align: left; font-weight: bold; font-size: 13px; color: #ffffff; text-shadow: 0px 1px 1px #000000; overflow: hidden; width: 140px; text-overflow: ellipsis; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-subtitle { display: block; color: #a1a5a9; font-size: 11px; margin-top: 2px; margin-left: 58px; font-style: italic; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-unread-count { position: absolute; left: 35px; top: 3px; background: #f00; border-radius: 10px; color: white; font-weight: bold; padding: 1px 6px 2px; border: 1px solid #a00; font-size: 12px; } .conpherence-menu .hide-unread-count .conpherence-menu-item-unread-count, .conpherence-menu .conpherence-selected .conpherence-menu-item-unread-count { display: none; } .conpherence-menu .conpherence-menu-item-view .conpherence-menu-item-date { position: absolute; top: 15px; right: 16px; color: #a1a5a9; font-size: 11px; } .no-conpherences-menu-item { color: #a1a5a9; border-top: solid 1px #3B3D3E; padding: 20px 0; margin: 0px auto; width: 280px; text-align: center; } diff --git a/webroot/rsrc/css/application/conpherence/message-pane.css b/webroot/rsrc/css/application/conpherence/message-pane.css index 821151c51..ff39a8cb0 100644 --- a/webroot/rsrc/css/application/conpherence/message-pane.css +++ b/webroot/rsrc/css/application/conpherence/message-pane.css @@ -1,183 +1,215 @@ /** * @provides conpherence-message-pane-css */ -.conpherence-message-pane { +.conpherence-message-pane, +.loading .messages-loading-mask, +.loading .messages-loading-icon { position: fixed; left: 280px; right: 241px; top: 76px; + bottom: 0px; min-width: 300px; width: auto; - height: 100%; } -.device .conpherence-message-pane { +.device .conpherence-message-pane, +.device .loading .messages-loading-mask, +.device .loading .messages-loading-icon { left: 0; right: 0; width: 100%; } - .conpherence-show-older-messages { display: block; background: #e0e3ec; margin: 10px; text-align: center; padding: 10px; color: #18559D; } +.conpherence-show-older-messages-loading { + font-style: italic; +} + .conpherence-message-pane .conpherence-messages { position: fixed; left: 280px; right: 241px; top: 76px; bottom: 190px; overflow-y: auto; box-shadow: inset 1px 4px 5px rgba(0,0,0,0.1); -webkit-overflow-scrolling: touch; } .device .conpherence-message-pane .conpherence-messages { left: 0; right: 0; bottom: 3em; width: 100%; box-shadow: none; } +.conpherence-message-pane .messages-loading-mask { + opacity: .22; + background: #222; + display: none; +} +.conpherence-message-pane .messages-loading-icon { + background-repeat: no-repeat; + background-position: center center; +} + +.loading .messages-loading-mask, +.loading .messages-loading-icon { + display: block; + z-index: 500; +} + +.loading .header-loading-mask { + height: 31px; + position: absolute; + width: 100%; + z-index: 5; + background: #222; + opacity: .22; +} + .conpherence-message-pane .phabricator-form-view { border-width: 0; background: none; height: 190px; padding: 0; position: fixed; bottom: 0; left: 280px; right: 241px; } .device .conpherence-message-pane .remarkup-assist-bar { height: 0px; } .device .conpherence-message-pane .phabricator-form-view { left: 0; right: 0; background-color: #d8dce2; height: 3em; width: 100%; } .conpherence-layout .conpherence-message-pane .phabricator-form-view div.aphront-form-input { margin: 0; width: 100%; } .conpherence-message-pane .phabricator-transaction-view { margin: 5px 15px; background-size: 35px; min-height: auto; } .device-phone .conpherence-message-pane .phabricator-transaction-view { margin: 0 10px 0 0; } .conpherence-message-pane .phabricator-transaction-detail { border-width: 0; margin-left: 45px; } .device-phone .conpherence-message-pane .phabricator-transaction-detail { min-height: auto; } .conpherence-message-pane .conpherence-edited { color: #888; margin: 0; } .device-phone .conpherence-message-pane .conpherence-edited { color: #888; margin: 0 10px; } .conpherence-message-pane .conpherence-edited .phabricator-transaction-content { padding: 0 0 5px 45px; font-style: italic; } .device-phone .conpherence-message-pane .conpherence-edited .phabricator-transaction-content { padding: 0 0 5px 35px; } .conpherence-message-pane .phabricator-transaction-info, .conpherence-message-pane .phabricator-content-source-view { color: #b7b7b7; line-height: 16px; } .conpherence-message-pane .phabricator-transaction-header, .conpherence-message-pane .phabricator-transaction-info, .conpherence-message-pane .phabricator-transaction-content { background: none; padding: 0; } .conpherence-message-pane .phabricator-transaction-content { padding: 2px 0 8px 0; } .conpherence-message-pane .aphront-form-control { padding: 0; } .conpherence-message-pane .aphront-form-control-submit { margin-right: 8px; } .conpherence-message-pane .remarkup-assist-bar { border-width: 1px 0 0; border-color: #CCC; border-bottom: transparent; } .conpherence-message-pane .remarkup-assist-textarea { height: 124px; padding: 6px; border-width: 0 0 1px 0; border-color: #e7e7e7; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; resize: none; } .device .conpherence-message-pane .remarkup-assist-textarea { margin: 0.5em 0em 0em 2%; padding: 6px 1%; width: 98%; height: 2em; resize: none; } .conpherence-message-pane .remarkup-assist-textarea:focus { outline: none; } .device .conpherence-message-pane .aphront-form-control-textarea { float: left; height: 2em; } .device-tablet .conpherence-message-pane .aphront-form-control-textarea { width: 76%; } .device-phone .conpherence-message-pane .aphront-form-control-textarea { width: 63%; } .device .conpherence-message-pane .aphront-form-control-submit button { margin: 0.6em 0 0 2%; } diff --git a/webroot/rsrc/css/application/conpherence/widget-pane.css b/webroot/rsrc/css/application/conpherence/widget-pane.css index 2862828a3..4f755efab 100644 --- a/webroot/rsrc/css/application/conpherence/widget-pane.css +++ b/webroot/rsrc/css/application/conpherence/widget-pane.css @@ -1,373 +1,397 @@ /** * @provides conpherence-widget-pane-css */ -.conpherence-widget-pane { +.conpherence-widget-pane, +.loading .widgets-loading-mask, +.loading .widgets-loading-icon { position: fixed; right: 0px; top: 74px; + bottom: 0px; width: 240px; - height: 100%; border-width: 0 0 0 1px; border-color: #CCC; border-style: solid; overflow-y: auto; -webkit-overflow-scrolling: touch; } -.device .conpherence-widget-pane { +.device .conpherence-widget-pane, +.device .loading .widgets-loading-mask, +.device .loading .widgets-loading-icon { top: 44px; width: 100%; } +.conpherence-widget-pane .widgets-loading-mask { + opacity: .22; + background: #222; + display: none; +} +.conpherence-widget-pane .widgets-loading-icon { + background-repeat: no-repeat; + background-position: center center; +} + +.loading .widgets-loading-mask, +.loading .widgets-loading-icon { + display: block; + z-index: 500; +} + .conpherence-widget-pane .aphront-form-input { margin: 0; width: 100%; } .conpherence-widget-pane .aphront-form-inset { border: 0; } .conpherence-widget-pane .widgets-header { background: #F5F5F5; border-bottom: 1px solid #ccc; } .device .conpherence-widget-pane .widgets-header { display: none; } .conpherence-widget-pane .widgets-header .caret { float: none; height: 0px; width: 0px; margin-right: 0px; border-top-color: #000; } .device-desktop .conpherence-layout .device-widgets-selector { display: none; } .dropdown-menu-frame { width: 200px !important; margin-top: 4px; } .conpherence-widget-pane .widgets-body { position: fixed; overflow-y: auto; bottom: 0px; width: 100%; top: 74px; } #widgets-settings { padding: 3px 6px; } .device-desktop .conpherence-widget-pane .widgets-body { top: 106px; width: 240px; } /* files widget */ .conpherence-widget-pane #widgets-files .no-files { width: 200px; padding: 20px; text-align: center; color: #555; } +.device .conpherence-widget-pane #widgets-files .no-files { + width: 60px; + margin: 0px auto 0px auto; +} .conpherence-widget-pane #widgets-files .file-entry { padding: 10px 0; margin: 0 5px 0 10px; border-bottom: 1px solid #e7e7e7; } .conpherence-widget-pane #widgets-files .file-icon { width: 32px; height: 32px; float: left; } .conpherence-widget-pane #widgets-files .file-title { display: block; position: relative; top: -4px; left: 10px; overflow-x: hidden; width: 165px; font-weight: bold; text-overflow: ellipsis; } .conpherence-widget-pane #widgets-files .file-uploaded-by { color: #a1a5a9; position: relative; top: 0px; left: 10px; width: 170px; font-size: 11px; } .device .conpherence-widget-pane #widgets-files .file-title, .device .conpherence-widget-pane #widgets-files .file-uploaded-by { width: 82%; } .device .conpherence-widget-pane #widgets-files .divider { width: 80%; margin: 8px 0px 0px 10%; } /* calendar widget */ .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view { margin: 2px 0px 0px 0px; width: 240px; } .device .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view { width: 100%; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column { background: white; border-right: 1px solid #bfbfbf; text-align: center; } .device-phone .conpherence-widget-pane #widgets-calendar .aphront-multi-column-fluid .aphront-multi-column-5-up .aphront-multi-column-column-outer { width: 20%; margin-bottom: 0px; float: left; clear: none; } .conpherence-widget-pane .no-events { color: #999; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column-last { border-right: 0; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .day-column, .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .day-column-active { color: #bfbfbf; background-color: white; font-weight: bold; padding: 0px 0px 10px 0px; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .day-column-active { color: black; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .present , .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .sporadic , .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .away { height: 10px; margin: 5px 0px 5px 0px; width: 100%; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .present { background-color: white; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .sporadic { background-color: rgb(222, 226, 232); } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .aphront-multi-column-column .away { background-color: rgb(102, 204, 255); } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .day-name { padding: 5px 0px 0px 0px; font-size: 12px; } .conpherence-widget-pane #widgets-calendar .aphront-multi-column-view .day-number { font-size: 16px; padding: 0 0 5px 0; } .conpherence-widget-pane #widgets-calendar .day-header { overflow: hidden; background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); border-top: 1px solid #e7e7e7; border-bottom: 1px solid #d7d7d7; padding: 5px 10px 5px 10px; } .conpherence-widget-pane #widgets-calendar .day-header.today { background-image: linear-gradient(to bottom, #3b86c4, #2b628f); background-image: -webkit-linear-gradient(top, #3b86c4, #2b628f); border-top: none; border-bottom: none; } .conpherence-widget-pane #widgets-calendar .day-header.today .day-name, .conpherence-widget-pane #widgets-calendar .day-header.today .day-date { color: #fff; } .conpherence-widget-pane #widgets-calendar .day-header .day-name { float: left; color: #555759; font-weight: bold; text-transform: uppercase; font-size: 11px; } .conpherence-widget-pane #widgets-calendar .day-header .day-date { float: right; color: #555759; font-size: 11px; } .conpherence-widget-pane #widgets-calendar .divider { float: left; clear: both; width: 220px; margin: 0px 0px 0px 10px; border: 1px dashed #bfbfbf; } .conpherence-widget-pane #widgets-calendar .divider { width: 96%; margin: 0px 0px 0px 2%; } .conpherence-widget-pane #widgets-calendar .spacer { float: left; clear: both; height: 10px; width: 100%; } .conpherence-widget-pane #widgets-calendar .user-status .icon { border-radius: 8px; height: 14px; width: 14px; margin-top: 7px; float: left; } .conpherence-widget-pane #widgets-calendar .sporadic .icon { background-color: rgb(222, 226, 232); } .conpherence-widget-pane #widgets-calendar .away .icon { background-color: rgb(102, 204, 255); } .conpherence-widget-pane #widgets-calendar .user-status .description { width: 195px; float: left; text-overflow: ellipsis; margin: 0 0 10px 10px; } .conpherence-widget-pane #widgets-calendar .user-status .participant { font-size: 11px; color: #888; padding-top: 2px; } .device .conpherence-widget-pane #widgets-calendar .user-status .description, .device .conpherence-widget-pane #widgets-calendar .user-status .participant { /* we keep these short so no need to change the width */ } .conpherence-widget-pane .widget-icon { display: block; height: 14px; width: 14px; } .conpherence-widget-pane .phabricator-remarkup-embed-layout-link { padding-bottom: 1px; } /* people widget */ .conpherence-widget-pane .people-widget-header .add-people-widget { padding: 10px 0 5px 0; overflow: hidden; } .conpherence-widget-pane .people-widget-header .add-people-widget .aphront-form-control-tokenizer { float: left; width: 150px; padding: 0px 0px 0px 10px } .device .conpherence-widget-pane .people-widget-header .add-people-widget .aphront-form-control-tokenizer { width: 70%; } .conpherence-widget-pane .people-widget-header .add-people-widget .people-add-button { float: right; margin: 2px 8px 0px 0px; padding: 3px 16px 4px 16px; } .conpherence-widget-pane .person-entry { clear: both; padding: 5px 0 0 10px; } .conpherence-widget-pane .person-entry a { float: left; font-weight: bold; line-height: 20px; } .conpherence-widget-pane .person-entry a img { height: 35px; width: 35px; } .conpherence-widget-pane .person-entry .pic { float: left; clear: left; margin: 0 8px 0 0; width: 35px; padding: 0; } .conpherence-widget-pane .person-entry .remove { float: right; clear: right; margin: 0; width: 20px; height: 20px; text-align: center; font-size: 22px; font-weight: bold; padding: 8px 0 8px 0p } .conpherence-widget-pane .person-entry .remove:hover { text-decoration: none; } .conpherence-widget-pane .person-entry .remove .icon { color: #bfbfbf; } .conpherence-widget-pane .person-entry .remove:hover .icon { color: #18559d; } /* settings widget */ .conpherence-widget-pane .title-update, .conpherence-widget-pane .notifications-update { margin: 3px 0px 0px 4px; } diff --git a/webroot/rsrc/js/application/conpherence/behavior-menu.js b/webroot/rsrc/js/application/conpherence/behavior-menu.js index 3bbdc2b2b..b24dd683c 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-menu.js +++ b/webroot/rsrc/js/application/conpherence/behavior-menu.js @@ -1,405 +1,510 @@ /** * @provides javelin-behavior-conpherence-menu * @requires javelin-behavior * javelin-dom * javelin-util - * javelin-request * javelin-stratcom * javelin-workflow * javelin-behavior-device * javelin-history * javelin-vector */ JX.behavior('conpherence-menu', function(config) { - var thread = { + /** + * State for displayed thread. + */ + var _thread = { selected: null, - node: null, - visible: null + visible: null, + node: null }; - function selectthreadid(id, updatePageData) { - var threads = JX.DOM.scry(document.body, 'a', 'conpherence-menu-click'); - for (var ii = 0; ii < threads.length; ii++) { - var data = JX.Stratcom.getData(threads[ii]); - if (data.id == id) { - selectthread(threads[ii], updatePageData); - return; - } + /** + * Current role of this behavior. The two possible roles are to show a 'list' + * of threads or a specific 'thread'. On devices, this behavior stays in the + * 'list' role indefinitely, treating clicks normally and the next page + * loads the behavior with role = 'thread'. On desktop, this behavior + * auto-loads a thread as part of the 'list' role. As the thread loads the + * role is changed to 'thread'. + */ + var _currentRole = null; + + /** + * When _oldDevice is null the code is executing for the first time. + */ + var _oldDevice = null; + + /** + * Initializes this behavior based on all the configuraton jonx and the + * result of JX.Device.getDevice(); + */ + function init() { + _currentRole = config.role; + + if (_currentRole == 'thread') { + markThreadsLoading(true); + } else { + markThreadLoading(true); } + markWidgetLoading(true); + onDeviceChange(); } + init(); - function selectthread(node, updatePageData) { + /** + * Selecting threads + */ + JX.Stratcom.listen( + 'conpherence-selectthread', + null, + function (e) { + selectThreadByID(e.getData().id); + } + ); + + function selectThreadByID(id, update_page_data) { + var thread = JX.$(id); + selectThread(thread, update_page_data); + } - if (thread.node) { - JX.DOM.alterClass(thread.node, 'conpherence-selected', false); + function selectThread(node, update_page_data) { + if (_thread.node) { + JX.DOM.alterClass(_thread.node, 'conpherence-selected', false); // keep the unread-count hidden still. big TODO once we ajax in updates // to threads to make this work right and move threads between read / // unread } JX.DOM.alterClass(node, 'conpherence-selected', true); JX.DOM.alterClass(node, 'hide-unread-count', true); - thread.node = node; + _thread.node = node; var data = JX.Stratcom.getData(node); - thread.selected = data.id; + _thread.selected = data.threadID; - if (updatePageData) { - updatepagedata(data); + if (update_page_data) { + updatePageData(data); } - redrawthread(); + redrawThread(); } - JX.Stratcom.listen( - 'conpherence-selectthread', - null, - function (e) { - var node = JX.$(e.getData().id); - selectthread(node); - } - ); - - function updatepagedata(data) { - var uri_suffix = thread.selected + '/'; + function updatePageData(data) { + var uri_suffix = _thread.selected + '/'; if (data.use_base_uri) { uri_suffix = ''; } - JX.History.replace(config.base_uri + uri_suffix); + JX.History.replace(config.baseURI + uri_suffix); if (data.title) { document.title = data.title; - } else if (thread.node) { - var threadData = JX.Stratcom.getData(thread.node); + } else if (_thread.node) { + var threadData = JX.Stratcom.getData(_thread.node); document.title = threadData.title; } } JX.Stratcom.listen( 'conpherence-update-page-data', null, function (e) { - updatepagedata(e.getData()); + updatePageData(e.getData()); } ); - function redrawthread() { - if (!thread.node) { + function redrawThread() { + if (!_thread.node) { return; } - if (thread.visible == thread.selected) { + if (_thread.visible == _thread.selected) { return; } - var data = JX.Stratcom.getData(thread.node); + var data = JX.Stratcom.getData(_thread.node); - if (thread.visible !== null || !config.hasThread) { - var uri = config.base_uri + data.id + '/'; + if (_thread.visible !== null || !config.hasThread) { + markThreadLoading(true); + var uri = config.baseURI + data.threadID + '/'; new JX.Workflow(uri, {}) - .setHandler(onloadthreadresponse) + .setHandler(JX.bind(null, onLoadThreadResponse, data.threadID)) .start(); + } else if (config.hasThread) { + _scrollMessageWindow(); } else { - didredrawthread(); + didRedrawThread(); } - if (thread.visible !== null || !config.hasWidgets) { - var widget_uri = config.base_uri + 'widget/' + data.id + '/'; + if (_thread.visible !== null || !config.hasWidgets) { + markWidgetLoading(true); + var widget_uri = config.baseURI + 'widget/' + data.threadID + '/'; new JX.Workflow(widget_uri, {}) - .setHandler(onwidgetresponse) + .setHandler(JX.bind(null, onWidgetResponse, data.threadID)) .start(); } else { - updatetoggledwidget(); + JX.Stratcom.invoke( + 'conpherence-update-widgets', + null, + { + widget : getDefaultWidget(), + buildSelectors : false, + toggleWidget : true, + threadID : _thread.selected + }); } - thread.visible = thread.selected; + _thread.visible = _thread.selected; } - function onwidgetresponse(response) { + function markThreadsLoading(loading) { var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var widgetsRoot = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); - JX.DOM.setContent(widgetsRoot, JX.$H(response.widgets)); - updatetoggledwidget(); + var menu = JX.DOM.find(root, 'div', 'conpherence-menu-pane'); + JX.DOM.alterClass(menu, 'loading', loading); } - function updatetoggledwidget(no_toggle) { + function markThreadLoading(loading) { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var header_root = JX.DOM.find(root, 'div', 'conpherence-header-pane'); + var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane'); + var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); + + JX.DOM.alterClass(header_root, 'loading', loading); + JX.DOM.alterClass(messages_root, 'loading', loading); + JX.DOM.alterClass(form_root, 'loading', loading); + + try { + var textarea = JX.DOM.find(form, 'textarea'); + textarea.disabled = loading; + var button = JX.DOM.find(form, 'button'); + button.disabled = loading; + } catch (ex) { + // haven't loaded it yet! + } + } + + function markWidgetLoading(loading) { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var widgets_root = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); + + JX.DOM.alterClass(widgets_root, 'loading', loading); + } + + function onWidgetResponse(thread_id, response) { + // we got impatient and this is no longer the right answer :/ + if (_thread.selected != thread_id) { + return; + } + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var widgets_root = JX.DOM.find(root, 'div', 'conpherence-widgets-holder'); + JX.DOM.setContent(widgets_root, JX.$H(response.widgets)); + JX.Stratcom.invoke( - 'conpherence-toggle-widget', + 'conpherence-update-widgets', null, { - widget : getdefaultwidget(), - no_toggle : no_toggle + widget : getDefaultWidget(), + buildSelectors : true, + toggleWidget : true, + threadID : _thread.selected }); + + markWidgetLoading(false); } - function getdefaultwidget() { + function getDefaultWidget() { var device = JX.Device.getDevice(); var widget = 'conpherence-message-pane'; if (device == 'desktop') { widget = 'widgets-people'; } return widget; } - function onloadthreadresponse(response) { + function onLoadThreadResponse(thread_id, response) { + // we got impatient and this is no longer the right answer :/ + if (_thread.selected != thread_id) { + return; + } var header = JX.$H(response.header); var messages = JX.$H(response.messages); var form = JX.$H(response.form); var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var headerRoot = JX.DOM.find(root, 'div', 'conpherence-header-pane'); - var messagesRoot = JX.DOM.find(root, 'div', 'conpherence-messages'); - var formRoot = JX.DOM.find(root, 'div', 'conpherence-form'); - JX.DOM.setContent(headerRoot, header); - JX.DOM.setContent(messagesRoot, messages); - JX.DOM.setContent(formRoot, form); - - didredrawthread(); - } + var header_root = JX.DOM.find(root, 'div', 'conpherence-header-pane'); + var messages_root = JX.DOM.find(root, 'div', 'conpherence-messages'); + var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); + JX.DOM.setContent(header_root, header); + JX.DOM.setContent(messages_root, messages); + JX.DOM.setContent(form_root, form); - function didredrawthread() { - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var messagesRoot = JX.DOM.find(root, 'div', 'conpherence-messages'); - messagesRoot.scrollTop = messagesRoot.scrollHeight; + markThreadLoading(false); - try { - var device = JX.Device.getDevice(); - var deviceWidgetSelector = JX.DOM.find( - root, - 'a', - 'device-widgets-selector'); - if (device != 'desktop') { - JX.DOM.show(deviceWidgetSelector); - updatetoggledwidget(true); - } else { - JX.DOM.hide(deviceWidgetSelector); - } - } catch (ex) { - // not here yet - } + didRedrawThread(true); } + /** + * This function is a wee bit tricky. Internally, we want to scroll the + * message window and let other stuff - notably widgets - redraw / build if + * necessary. Externally, we want a hook to scroll the message window + * - notably when the widget selector is used to invoke the message pane. + * The following three functions get 'er done. + */ + function didRedrawThread(build_device_widget_selector) { + _scrollMessageWindow(); + JX.Stratcom.invoke( + 'conpherence-did-redraw-thread', + null, + { + widget : getDefaultWidget(), + threadID : _thread.selected, + buildDeviceWidgetSelector : build_device_widget_selector + }); + } + function _scrollMessageWindow() { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var messages_root = JX.DOM.find(root, 'div', 'conpherence-messages'); + messages_root.scrollTop = messages_root.scrollHeight; + } JX.Stratcom.listen( 'conpherence-redraw-thread', null, function (e) { - didredrawthread(); + _scrollMessageWindow(); } ); JX.Stratcom.listen( 'click', 'conpherence-menu-click', function(e) { if (!e.isNormalClick()) { return; } // On devices, just follow the link normally. if (JX.Device.getDevice() != 'desktop') { return; } e.kill(); - selectthread(e.getNode('conpherence-menu-click'), true); + selectThread(e.getNode('conpherence-menu-click'), true); }); JX.Stratcom.listen('click', 'conpherence-edit-metadata', function (e) { e.kill(); var root = e.getNode('conpherence-layout'); var form = JX.DOM.find(root, 'form', 'conpherence-pontificate'); var data = e.getNodeData('conpherence-edit-metadata'); var header = JX.DOM.find(root, 'div', 'conpherence-header-pane'); var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); new JX.Workflow.newFromForm(form, data) .setHandler(JX.bind(this, function(r) { JX.DOM.appendContent(messages, JX.$H(r.transactions)); messages.scrollTop = messages.scrollHeight; JX.DOM.setContent( header, JX.$H(r.header) ); try { // update the menu entry JX.DOM.replace( JX.$(r.conpherence_phid + '-nav-item'), JX.$H(r.nav_item) ); JX.Stratcom.invoke( 'conpherence-selectthread', null, { id : r.conpherence_phid + '-nav-item' } ); } catch (ex) { // Ignore; this view may not have a menu. } })) .start(); }); + var _loadingTransactionID = null; JX.Stratcom.listen('click', 'show-older-messages', function(e) { e.kill(); var data = e.getNodeData('show-older-messages'); - var oldest_transaction_id = data.oldest_transaction_id; - var conf_id = thread.selected; - JX.DOM.remove(e.getNode('show-older-messages')); + if (data.oldest_transaction_id == _loadingTransactionID) { + return; + } + _loadingTransactionID = data.oldest_transaction_id; + var node = e.getNode('show-older-messages'); + JX.DOM.setContent(node, 'Loading...'); + JX.DOM.alterClass(node, 'conpherence-show-older-messages-loading', true); + + var conf_id = _thread.selected; var root = JX.DOM.find(document, 'div', 'conpherence-layout'); var messages_root = JX.DOM.find(root, 'div', 'conpherence-messages'); - new JX.Request(config.base_uri + conf_id + '/', function(r) { + new JX.Workflow(config.baseURI + conf_id + '/', data) + .setHandler(function(r) { + JX.DOM.remove(node); var messages = JX.$H(r.messages); JX.DOM.prependContent( messages_root, JX.$H(messages)); - }).setData({ oldest_transaction_id : oldest_transaction_id }).send(); + }).start(); }); - // On mobile, we just show a thread list, so we don't want to automatically - // select or load any threads. On Desktop, we automatically select the first - // thread. - var old_device = null; - function ondevicechange() { + /** + * On devices, we just show a thread list, so we don't want to automatically + * select or load any threads. On desktop, we automatically select the first + * thread, changing the _currentRole from list to thread. + */ + function onDeviceChange() { var new_device = JX.Device.getDevice(); - if (new_device === old_device) { + if (new_device === _oldDevice) { return; } - if (old_device === null) { - old_device = new_device; - if (config.role == 'list') { + if (_oldDevice === null) { + _oldDevice = new_device; + if (_currentRole == 'list') { if (new_device != 'desktop') { return; } } else { - loadthreads(); + loadThreads(); return; } } var update_toggled_widget = - new_device == 'desktop' || old_device == 'desktop'; - old_device = new_device; + new_device == 'desktop' || _oldDevice == 'desktop'; + _oldDevice = new_device; - if (thread.visible !== null && update_toggled_widget) { - updatetoggledwidget(); + if (_thread.visible !== null && update_toggled_widget) { + JX.Stratcom.invoke( + 'conpherence-did-redraw-thread', + null, + { + widget : getDefaultWidget(), + threadID : _thread.selected + }); } - if (config.role == 'list') { - didloadthreads(); - config.role = 'thread'; + if (_currentRole == 'list' && new_device == 'desktop') { + // this selects a thread and loads it + didLoadThreads(); + _currentRole = 'thread'; var root = JX.DOM.find(document, 'div', 'conpherence-layout'); JX.DOM.alterClass(root, 'conpherence-role-list', false); JX.DOM.alterClass(root, 'conpherence-role-thread', true); } } + JX.Stratcom.listen('phabricator-device-change', null, onDeviceChange); - JX.Stratcom.listen('phabricator-device-change', null, ondevicechange); - ondevicechange(); - - function loadthreads() { - var uri = config.base_uri + 'thread/' + config.selectedID + '/'; + function loadThreads() { + markThreadsLoading(true); + var uri = config.baseURI + 'thread/' + config.selectedThreadID + '/'; new JX.Workflow(uri) - .setHandler(onloadthreadsresponse) + .setHandler(onLoadThreadsResponse) .start(); } - function onloadthreadsresponse(r) { + function onLoadThreadsResponse(r) { var layout = JX.$(config.layoutID); var menu = JX.DOM.find(layout, 'div', 'conpherence-menu-pane'); JX.DOM.setContent(menu, JX.$H(r)); - config.selectedID && selectthreadid(config.selectedID); + config.selectedID && selectThreadByID(config.selectedID); + + _thread.node.scrollIntoView(); - thread.node.scrollIntoView(); + markThreadsLoading(false); } - function didloadthreads() { + function didLoadThreads() { // If there's no thread selected yet, select the current thread or the // first thread. - if (!thread.selected) { + if (!_thread.selected) { if (config.selectedID) { - selectthreadid(config.selectedID, true); + selectThreadByID(config.selectedID, true); } else { var layout = JX.$(config.layoutID); var threads = JX.DOM.scry(layout, 'a', 'conpherence-menu-click'); if (threads.length) { - selectthread(threads[0]); + selectThread(threads[0]); } else { var nothreads = JX.DOM.find(layout, 'div', 'conpherence-no-threads'); nothreads.style.display = 'block'; } } } - redrawthread(); } - var handlethreadscrollers = function (e) { + var handleThreadScrollers = function (e) { e.kill(); var data = e.getNodeData('conpherence-menu-scroller'); var scroller = e.getNode('conpherence-menu-scroller'); + JX.DOM.alterClass(scroller, 'loading', true); + JX.DOM.setContent(scroller.firstChild, 'Loading...'); new JX.Workflow(scroller.href, data) .setHandler( - JX.bind(null, threadscrollerresponse, scroller, data.direction)) + JX.bind(null, threadScrollerResponse, scroller, data.direction)) .start(); }; - var threadscrollerresponse = function (scroller, direction, r) { + var threadScrollerResponse = function (scroller, direction, r) { var html = JX.$H(r.html); - var threadPhids = r.phids; - var reselectId = null; + var thread_phids = r.phids; + var reselect_id = null; // remove any threads that are in the list that we just got back // in the result set; things have changed and they'll be in the // right place soon - for (var ii = 0; ii < threadPhids.length; ii++) { + for (var ii = 0; ii < thread_phids.length; ii++) { try { - var nodeId = threadPhids[ii] + '-nav-item'; - var node = JX.$(nodeId); - var nodeData = JX.Stratcom.getData(node); - if (nodeData.id == thread.selected) { - reselectId = nodeId; + var node_id = thread_phids[ii] + '-nav-item'; + var node = JX.$(node_id); + var node_data = JX.Stratcom.getData(node); + if (node_data.id == _thread.selected) { + reselect_id = node_id; } JX.DOM.remove(node); } catch (ex) { // ignore , just haven't seen this thread yet } } var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var menuRoot = JX.DOM.find(root, 'div', 'conpherence-menu-pane'); - var scrollY = 0; + var menu_root = JX.DOM.find(root, 'div', 'conpherence-menu-pane'); + var scroll_y = 0; // we have to do some hyjinx in the up case to make the menu scroll to // where it should if (direction == 'up') { var style = { position: 'absolute', left: '-10000px' }; var test_size = JX.$N('div', {style: style}, html); document.body.appendChild(test_size); var html_size = JX.Vector.getDim(test_size); JX.DOM.remove(test_size); - scrollY = html_size.y; + scroll_y = html_size.y; } JX.DOM.replace(scroller, html); - menuRoot.scrollTop += scrollY; + menu_root.scrollTop += scroll_y; - if (reselectId) { + if (reselect_id) { JX.Stratcom.invoke( 'conpherence-selectthread', null, - { id : reselectId } + { id : reselect_id } ); } }; JX.Stratcom.listen( ['click'], 'conpherence-menu-scroller', - handlethreadscrollers + handleThreadScrollers ); }); diff --git a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js index e39251f40..f8068679e 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js +++ b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js @@ -1,62 +1,72 @@ /** * @provides javelin-behavior-conpherence-pontificate * @requires javelin-behavior * javelin-dom * javelin-util * javelin-workflow * javelin-stratcom */ JX.behavior('conpherence-pontificate', function(config) { var onsubmit = function(e) { e.kill(); var form = e.getNode('tag:form'); var root = e.getNode('conpherence-layout'); - var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); + var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane'); + var header_root = JX.DOM.find(root, 'div', 'conpherence-header-pane'); + var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); + var messages = JX.DOM.find(messages_root, 'div', 'conpherence-messages'); var fileWidget = null; try { fileWidget = JX.DOM.find(root, 'div', 'widgets-files'); } catch (ex) { // Ignore; maybe no files widget } + JX.DOM.alterClass(header_root, 'loading', true); + JX.DOM.alterClass(messages_root, 'loading', true); + JX.DOM.alterClass(form_root, 'loading', true); JX.Workflow.newFromForm(form) .setHandler(JX.bind(this, function(r) { JX.DOM.appendContent(messages, JX.$H(r.transactions)); messages.scrollTop = messages.scrollHeight; if (fileWidget) { JX.DOM.setContent( fileWidget, JX.$H(r.file_widget) ); } var inputs = JX.DOM.scry(form, 'input'); for (var ii = 0; ii < inputs.length; ii++) { if (inputs[ii].name == 'latest_transaction_id') { inputs[ii].value = r.latest_transaction_id; break; } } var textarea = JX.DOM.find(form, 'textarea'); textarea.value = ''; JX.Stratcom.invoke( 'conpherence-selectthread', null, { id : r.conpherence_phid + '-nav-item' } - ); + ); + + JX.DOM.alterClass(header_root, 'loading', false); + JX.DOM.alterClass(messages_root, 'loading', false); + JX.DOM.alterClass(form_root, 'loading', false); })) .start(); }; JX.Stratcom.listen( ['submit', 'didSyntheticSubmit'], 'conpherence-pontificate', onsubmit); }); diff --git a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js index a273dc2fa..d9ea8afa3 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js +++ b/webroot/rsrc/js/application/conpherence/behavior-widget-pane.js @@ -1,195 +1,293 @@ /** * @requires javelin-behavior * javelin-dom * javelin-stratcom * javelin-workflow * javelin-util * phabricator-notification * javelin-behavior-device * phabricator-dropdown-menu * phabricator-menu-item * @provides javelin-behavior-conpherence-widget-pane */ JX.behavior('conpherence-widget-pane', function(config) { - var build_widget_selector = function (data) { - var widgets = config.widgetRegistry; - var root = JX.DOM.find(document, 'div', 'conpherence-layout'); - var widgetPane = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); - var widgetHeader = JX.DOM.find(widgetPane, 'a', 'widgets-selector'); - var mobileWidgetHeader = null; - try { - mobileWidgetHeader = JX.DOM.find( - root, - 'a', - 'device-widgets-selector'); - } catch (ex) { - // is okay - no mobileWidgetHeader yet... - } - var widgetData = widgets[data.widget]; - JX.DOM.setContent( - widgetHeader, - widgetData.name); - JX.DOM.appendContent( - widgetHeader, - JX.$N('span', { className : 'caret' })); - if (mobileWidgetHeader) { - // this is fragile but adding a sigil to this element is awkward - var mobileWidgetHeaderSpans = JX.DOM.scry(mobileWidgetHeader, 'span'); - var mobileWidgetHeaderSpan = mobileWidgetHeaderSpans[1]; - JX.DOM.setContent( - mobileWidgetHeaderSpan, - widgetData.name); + /** + * There can be race conditions around loading the messages or the widgets + * first. Keep track of what widgets we've loaded with this variable. + */ + var _loadedWidgetsID = null; + + /** + * At any given time there can be only one selected widget. Keep track of + * which one it is by the user-facing name for ease of use with + * PhabricatorDropdownMenuItems. + */ + var _selectedWidgetName = null; + + /** + * This is potentially built each time the user switches conpherence threads + * or when the result JX.Device.getDevice() changes from desktop to some + * other value. + */ + var buildDeviceWidgetSelector = function (data) { + var device_header = _getDeviceWidgetHeader(); + if (!device_header) { + return; } + JX.DOM.show(device_header); + var device_menu = new JX.PhabricatorDropdownMenu(device_header); + data.deviceMenu = true; + _buildWidgetSelector(device_menu, data); + }; - var menu = new JX.PhabricatorDropdownMenu(widgetHeader); + /** + * This is potentially built each time the user switches conpherence threads + * or when the result JX.Device.getDevice() changes from mobile or tablet to + * desktop. + */ + var buildDesktopWidgetSelector = function (data) { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var widget_pane = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); + var widget_header = JX.DOM.find(widget_pane, 'a', 'widgets-selector'); + var menu = new JX.PhabricatorDropdownMenu(widget_header); menu.toggleAlignDropdownRight(false); - var deviceMenu = null; - if (mobileWidgetHeader) { - deviceMenu = new JX.PhabricatorDropdownMenu(mobileWidgetHeader); - } + data.deviceMenu = false; + _buildWidgetSelector(menu, data); + }; + /** + * Workhorse that actually builds the widget selector. Note some fancy bits + * where we listen for the "open" event and enable / disable widgets as + * appropos. + */ + var _buildWidgetSelector = function (menu, data) { + _loadedWidgetsID = data.threadID; + var widgets = config.widgetRegistry; for (var widget in widgets) { - widgetData = widgets[widget]; - if (mobileWidgetHeader) { - deviceMenu.addItem(new JX.PhabricatorMenuItem( - widgetData.name, - JX.bind(null, build_widget_selector, { widget : widget }), - '#' - ).setDisabled(widget == data.widget)); - } - if (widgetData.deviceOnly) { + var widget_data = widgets[widget]; + if (widget_data.deviceOnly && data.deviceMenu === false) { continue; } menu.addItem(new JX.PhabricatorMenuItem( - widgetData.name, - JX.bind(null, build_widget_selector, { widget : widget }), + widget_data.name, + JX.bind(null, toggleWidget, { widget : widget }), '#' ).setDisabled(widget == data.widget)); } - if (data.no_toggle) { + + menu.listen( + 'open', + JX.bind(menu, function () { + for (var ii = 0; ii < this._items.length; ii++) { + var item = this._items[ii]; + var name = item.getName(); + if (name == _selectedWidgetName) { + item.setDisabled(true); + } else { + item.setDisabled(false); + } + } + })); + }; + + /** + * Since this is not always on the page, avoid having a repeat + * try / catch block and consolidate into this helper function. + */ + var _getDeviceWidgetHeader = function () { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var device_header = null; + try { + device_header = JX.DOM.find( + root, + 'a', + 'device-widgets-selector'); + } catch (ex) { + // is okay - no deviceWidgetHeader yet... but bail time + } + return device_header; + }; + + /** + * Responder to the 'conpherence-did-redraw-thread' event, this bad boy + * hides or shows the device widget selector as appropros. + */ + var _didRedrawThread = function (data) { + if (_loadedWidgetsID === null || _loadedWidgetsID != data.threadID) { return; } - toggle_widget(data); + var device = JX.Device.getDevice(); + var device_selector = _getDeviceWidgetHeader(); + if (device == 'desktop') { + JX.DOM.hide(device_selector); + } else { + JX.DOM.show(device_selector); + } + if (data.buildDeviceWidgetSelector) { + buildDeviceWidgetSelector(data); + } + toggleWidget(data); }; + JX.Stratcom.listen( + 'conpherence-did-redraw-thread', + null, + function (e) { + _didRedrawThread(e.getData()); + } + ); - var toggle_widget = function (data) { + /** + * Toggling a widget involves showing / hiding the appropriate widget + * bodies as well as updating the selectors to have the label on the + * newly selected widget. + */ + var toggleWidget = function (data) { var widgets = config.widgetRegistry; - var widgetData = widgets[data.widget]; + var widget_data = widgets[data.widget]; var device = JX.Device.getDevice(); var is_desktop = device == 'desktop'; - if (widgetData.deviceOnly && is_desktop) { + if (widget_data.deviceOnly && is_desktop) { return; } + _selectedWidgetName = widget_data.name; + + var device_header = _getDeviceWidgetHeader(); + if (device_header) { + // this is fragile but adding a sigil to this element is awkward + var device_header_spans = JX.DOM.scry(device_header, 'span'); + var device_header_span = device_header_spans[1]; + JX.DOM.setContent( + device_header_span, + widget_data.name); + } + + // don't update the non-device selector with device only widget stuff + if (!widget_data.deviceOnly) { + var root = JX.DOM.find(document, 'div', 'conpherence-layout'); + var widget_pane = JX.DOM.find(root, 'div', 'conpherence-widget-pane'); + var widget_header = JX.DOM.find(widget_pane, 'a', 'widgets-selector'); + JX.DOM.setContent( + widget_header, + widget_data.name); + JX.DOM.appendContent( + widget_header, + JX.$N('span', { className : 'caret' })); + } for (var widget in config.widgetRegistry) { - widgetData = widgets[widget]; - if (widgetData.deviceOnly && is_desktop) { + widget_data = widgets[widget]; + if (widget_data.deviceOnly && is_desktop) { // some one off code for conpherence messages which are device-only // as a widget, but shown always on the desktop if (widget == 'conpherence-message-pane') { JX.$(widget).style.display = 'block'; JX.Stratcom.invoke('conpherence-redraw-thread', null, {}); } continue; } if (widget == data.widget) { JX.$(widget).style.display = 'block'; // some one off code for conpherence messages - fancier refresh tech if (widget == 'conpherence-message-pane') { JX.Stratcom.invoke('conpherence-redraw-thread', null, {}); JX.Stratcom.invoke('conpherence-update-page-data', null, {}); } } else { JX.$(widget).style.display = 'none'; } } }; JX.Stratcom.listen( - 'conpherence-toggle-widget', + 'conpherence-update-widgets', null, function (e) { - build_widget_selector(e.getData()); - } - ); - + var data = e.getData(); + if (data.buildSelectors) { + buildDesktopWidgetSelector(data); + buildDeviceWidgetSelector(data); + } + if (data.toggleWidget) { + toggleWidget(data); + } + }); /* people widget */ JX.Stratcom.listen( ['submit', 'didSyntheticSubmit'], 'add-person', function (e) { e.kill(); var root = e.getNode('conpherence-layout'); var form = e.getNode('tag:form'); var data = e.getNodeData('add-person'); - var peopleRoot = e.getNode('widgets-people'); + var people_root = e.getNode('widgets-people'); var messages = null; try { messages = JX.DOM.find(root, 'div', 'conpherence-messages'); } catch (ex) { } - var latestTransactionData = JX.Stratcom.getData( + var latest_transaction_data = JX.Stratcom.getData( JX.DOM.find( root, 'input', 'latest-transaction-id' )); - data.latest_transaction_id = latestTransactionData.id; + data.latest_transaction_id = latest_transaction_data.id; JX.Workflow.newFromForm(form, data) .setHandler(JX.bind(this, function (r) { if (messages) { JX.DOM.appendContent(messages, JX.$H(r.transactions)); messages.scrollTop = messages.scrollHeight; } // update the people widget JX.DOM.setContent( - peopleRoot, + people_root, JX.$H(r.people_widget) ); })) .start(); } ); JX.Stratcom.listen( ['touchstart', 'mousedown'], 'remove-person', function (e) { - var peopleRoot = e.getNode('widgets-people'); + var people_root = e.getNode('widgets-people'); var form = JX.DOM.find(peopleRoot, 'form'); var data = e.getNodeData('remove-person'); // we end up re-directing to conpherence home JX.Workflow.newFromForm(form, data) .start(); } ); /* settings widget */ var onsubmitSettings = function (e) { e.kill(); var form = e.getNode('tag:form'); var button = JX.DOM.find(form, 'button'); JX.Workflow.newFromForm(form) .setHandler(JX.bind(this, function (r) { new JX.Notification() .setDuration(6000) .setContent(r) .show(); button.disabled = ''; JX.DOM.alterClass(button, 'disabled', false); })) .start(); }; JX.Stratcom.listen( ['submit', 'didSyntheticSubmit'], 'notifications-update', onsubmitSettings ); });