1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-09 16:32:39 +01:00

Tokens v1

Summary:
Features!

  - Giving tokens.
  - Taking tokens back.
  - Not giving tokens.

Test Plan: See screenshots.

Reviewers: chad, vrana

Reviewed By: chad

CC: aran, btrahan

Maniphest Tasks: T2541

Differential Revision: https://secure.phabricator.com/D4964
This commit is contained in:
epriestley 2013-02-15 07:47:14 -08:00
parent f9f29253e4
commit 49c40d209d
60 changed files with 1758 additions and 452 deletions

View file

@ -88,14 +88,19 @@ JX.install('Workflow', {
return;
}
var t = event.getTarget();
// Get the button (which is sometimes actually another tag, like an <a />)
// which triggered the event. In particular, this makes sure we get the
// right node if there is a <button> with an <img /> inside it or
// or something similar.
var t = event.getNode('jx-workflow-button') ||
event.getNode('tag:button');
if (t.name == '__cancel__' || t.name == '__close__') {
JX.Workflow._pop();
} else {
var form = event.getNode('jx-dialog');
var data = JX.DOM.convertFormToListOfPairs(form);
data.push([t.name, true]);
data.push([t.name, t.value || true]);
var active = JX.Workflow._getActiveWorkflow();
var e = active.invoke('submit', {form: form, data: data});

View file

@ -4,782 +4,782 @@
"app-application-blue-large" : {
"name" : "app-application-blue-large",
"rule" : ".app-application-blue-large, .phabricator-crumb-view:hover .app-application-dark-large",
"hash" : "80f42a283979cef89577721ca6d9cdef"
"hash" : "c8e0319f0c8a3c19bb74391785149424"
},
"app-application-dark-large" : {
"name" : "app-application-dark-large",
"rule" : ".app-application-dark-large",
"hash" : "8ab1619bcb768cc1b85106b077d29522"
"hash" : "a5a904b67bdd26c15b8df07b0b0cee1a"
},
"app-application-glow-large" : {
"name" : "app-application-glow-large",
"rule" : ".app-application-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-application-light-large",
"hash" : "26aedaf7940300f18eb0ef59566a0988"
"hash" : "04cd8ab1f4785d33d6c9c829dce35cb6"
},
"app-application-light-large" : {
"name" : "app-application-light-large",
"rule" : ".app-application-light-large",
"hash" : "09d4ef0cb36255291693971754ec55ee"
"hash" : "8b071cf0efedda7c8c772829d31453ea"
},
"app-audit-blue-large" : {
"name" : "app-audit-blue-large",
"rule" : ".app-audit-blue-large, .phabricator-crumb-view:hover .app-audit-dark-large",
"hash" : "05941dc7d5ff156c0e899c6345f6833a"
"hash" : "cfb6e6c27d6bf4bbf2e07c8d284948d7"
},
"app-audit-dark-large" : {
"name" : "app-audit-dark-large",
"rule" : ".app-audit-dark-large",
"hash" : "cbf8e6c5a580bd3b5169f30d3cd0ec6a"
"hash" : "0880246fc6aa5d0cec823166af5b388f"
},
"app-audit-glow-large" : {
"name" : "app-audit-glow-large",
"rule" : ".app-audit-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-audit-light-large",
"hash" : "5ab43e357c123c05a9db85a964b20252"
"hash" : "2f3896e45a05d55c3a95440dbeac9187"
},
"app-audit-light-large" : {
"name" : "app-audit-light-large",
"rule" : ".app-audit-light-large",
"hash" : "aa853bebb7a315b994f1527247e3b362"
"hash" : "8dd753f716233d2f6edf553df4fde942"
},
"app-calendar-blue-large" : {
"name" : "app-calendar-blue-large",
"rule" : ".app-calendar-blue-large, .phabricator-crumb-view:hover .app-calendar-dark-large",
"hash" : "9e530feec2926878ee7eaa8a04a8607b"
"hash" : "a05add9fa18df8a98cf2735cf27ec6e1"
},
"app-calendar-dark-large" : {
"name" : "app-calendar-dark-large",
"rule" : ".app-calendar-dark-large",
"hash" : "65de91c173d169bbf407c9e7cefa9715"
"hash" : "5c98faf324152ec55bad6ac76f77ec00"
},
"app-calendar-glow-large" : {
"name" : "app-calendar-glow-large",
"rule" : ".app-calendar-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-calendar-light-large",
"hash" : "1dc738045b09476feebe5e705a61b7a9"
"hash" : "d1a7c623c5b3d902a389fc2ea8941858"
},
"app-calendar-light-large" : {
"name" : "app-calendar-light-large",
"rule" : ".app-calendar-light-large",
"hash" : "043dab56a011f84f5affc2c7c13e3a39"
"hash" : "466b97737778eff91ebd9afabac6e5a6"
},
"app-conduit-blue-large" : {
"name" : "app-conduit-blue-large",
"rule" : ".app-conduit-blue-large, .phabricator-crumb-view:hover .app-conduit-dark-large",
"hash" : "4ab937882a119bacc0206029cbd7919d"
"hash" : "ed8208ab196da7da6160edbdb0be118a"
},
"app-conduit-dark-large" : {
"name" : "app-conduit-dark-large",
"rule" : ".app-conduit-dark-large",
"hash" : "34de5192c69af7a9cf3941f7b5cb088e"
"hash" : "bad7559ed9928596c0241d8490e67422"
},
"app-conduit-glow-large" : {
"name" : "app-conduit-glow-large",
"rule" : ".app-conduit-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-conduit-light-large",
"hash" : "b89b969a7fba76d39c768ac8de19c964"
"hash" : "072c3ca188a60e9ee08c6eb36b8628c9"
},
"app-conduit-light-large" : {
"name" : "app-conduit-light-large",
"rule" : ".app-conduit-light-large",
"hash" : "a2fd3cfe6e4e46d589e0e99f52e7f6f0"
"hash" : "92047e758fac063dfb0608863ee66b7e"
},
"app-conpherence-blue-large" : {
"name" : "app-conpherence-blue-large",
"rule" : ".app-conpherence-blue-large, .phabricator-crumb-view:hover .app-conpherence-dark-large",
"hash" : "efcf3788ac60484d5920b37c1560e565"
"hash" : "6b84241639e4755b450085f7eeb30cb1"
},
"app-conpherence-dark-large" : {
"name" : "app-conpherence-dark-large",
"rule" : ".app-conpherence-dark-large",
"hash" : "2722117e3da8c2dbc478d957fb21ca53"
"hash" : "d9ced45f6ce7ffec0a0edb17c5e63834"
},
"app-conpherence-glow-large" : {
"name" : "app-conpherence-glow-large",
"rule" : ".app-conpherence-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-conpherence-light-large",
"hash" : "efa3c29ad40680fca2d62e0b180e709f"
"hash" : "aa5d889f5d46f3b7cefc766ae5c7b904"
},
"app-conpherence-light-large" : {
"name" : "app-conpherence-light-large",
"rule" : ".app-conpherence-light-large",
"hash" : "a79e5f0094caf9f012f3e9d7a10f2bac"
"hash" : "d85a049c1742fec1f95a8ebb6ca5c944"
},
"app-countdown-blue-large" : {
"name" : "app-countdown-blue-large",
"rule" : ".app-countdown-blue-large, .phabricator-crumb-view:hover .app-countdown-dark-large",
"hash" : "a4079b8e55924b7590011b35ba9bfdb0"
"hash" : "d44b7acae6b6b052ac869f0176b66b89"
},
"app-countdown-dark-large" : {
"name" : "app-countdown-dark-large",
"rule" : ".app-countdown-dark-large",
"hash" : "25547923eb9927ed0c30804fafd471d3"
"hash" : "dc7df8202a5fa7baf17fd446a9b5c4c5"
},
"app-countdown-glow-large" : {
"name" : "app-countdown-glow-large",
"rule" : ".app-countdown-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-countdown-light-large",
"hash" : "472fcd5cf9f292b0d2f9f275541fed18"
"hash" : "3b972002d629a49a4eca9049a9b2c6ae"
},
"app-countdown-light-large" : {
"name" : "app-countdown-light-large",
"rule" : ".app-countdown-light-large",
"hash" : "24bac143e049862bed161d819990cee0"
"hash" : "8f3814f70c1cb0475dd4678cc8937d91"
},
"app-daemon-blue-large" : {
"name" : "app-daemon-blue-large",
"rule" : ".app-daemon-blue-large, .phabricator-crumb-view:hover .app-daemon-dark-large",
"hash" : "beb6586864ef67a7bd7a9a159b8c2a56"
"hash" : "c922a7e7ec9467ca48b2a2573904b7ce"
},
"app-daemon-dark-large" : {
"name" : "app-daemon-dark-large",
"rule" : ".app-daemon-dark-large",
"hash" : "cf2e12b2967d155c437862bbb9ce2d86"
"hash" : "b2e566baac0c579563bd5bd700deb41b"
},
"app-daemon-glow-large" : {
"name" : "app-daemon-glow-large",
"rule" : ".app-daemon-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-daemon-light-large",
"hash" : "1728089df503ec805b42e262b196b616"
"hash" : "1c8e2776b9b984b804f6dca073f101eb"
},
"app-daemon-light-large" : {
"name" : "app-daemon-light-large",
"rule" : ".app-daemon-light-large",
"hash" : "44328612154fbf1a2f0f6ff28cd23521"
"hash" : "9c778b43f9f7380fc9bd862c097bbaa8"
},
"app-differential-blue-large" : {
"name" : "app-differential-blue-large",
"rule" : ".app-differential-blue-large, .phabricator-crumb-view:hover .app-differential-dark-large",
"hash" : "9491284c8cbf77df0795bdf9cd16651e"
"hash" : "59049df6a30c816ea68d3025da79a091"
},
"app-differential-dark-large" : {
"name" : "app-differential-dark-large",
"rule" : ".app-differential-dark-large",
"hash" : "a4b2ac4d4f697896e3abe9e58501fea5"
"hash" : "fd1e0f1fa97b00c7409ebfdc56cf4865"
},
"app-differential-glow-large" : {
"name" : "app-differential-glow-large",
"rule" : ".app-differential-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-differential-light-large",
"hash" : "d7e777585cc826becb64042f8bb31fc5"
"hash" : "3997a58a26389e8ede8022fd05cf8b43"
},
"app-differential-light-large" : {
"name" : "app-differential-light-large",
"rule" : ".app-differential-light-large",
"hash" : "a763d63d22cac8226d8bd5656221a91b"
"hash" : "b5c750e09f57a787e89f32820f791c4a"
},
"app-diffusion-blue-large" : {
"name" : "app-diffusion-blue-large",
"rule" : ".app-diffusion-blue-large, .phabricator-crumb-view:hover .app-diffusion-dark-large",
"hash" : "35e35c07ca1a151c810bb38a90496a2d"
"hash" : "b982cfacfde43d3267082bca236bc72c"
},
"app-diffusion-dark-large" : {
"name" : "app-diffusion-dark-large",
"rule" : ".app-diffusion-dark-large",
"hash" : "5b3752babd557f2c9bbc0120bd9a0747"
"hash" : "2eb71cde4af83347efdee542f4cadd8e"
},
"app-diffusion-glow-large" : {
"name" : "app-diffusion-glow-large",
"rule" : ".app-diffusion-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diffusion-light-large",
"hash" : "a5a682fffa03d4cdae9a86b8c79d1a81"
"hash" : "55873c2e30e693e7bde0f4a90045064d"
},
"app-diffusion-light-large" : {
"name" : "app-diffusion-light-large",
"rule" : ".app-diffusion-light-large",
"hash" : "1f04606fe4f0650982327bf09bf5adc0"
"hash" : "6eeb6f6df3ecd1ee923081b2d82f0505"
},
"app-diviner-blue-large" : {
"name" : "app-diviner-blue-large",
"rule" : ".app-diviner-blue-large, .phabricator-crumb-view:hover .app-diviner-dark-large",
"hash" : "97f1242c914315cf773c27bbec964335"
"hash" : "bda64f504c0c2c34125758bd01c80e05"
},
"app-diviner-dark-large" : {
"name" : "app-diviner-dark-large",
"rule" : ".app-diviner-dark-large",
"hash" : "c4f0550826f60fcd48d6ebcd340184b4"
"hash" : "786a865464564d66d458557c909a77ea"
},
"app-diviner-glow-large" : {
"name" : "app-diviner-glow-large",
"rule" : ".app-diviner-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-diviner-light-large",
"hash" : "7f7f0e1886036d894a5b22b72872ad06"
"hash" : "d173b3a659a2a4b5af5890ba70e827d1"
},
"app-diviner-light-large" : {
"name" : "app-diviner-light-large",
"rule" : ".app-diviner-light-large",
"hash" : "b13413ada716fa7d3449c38b11decd5d"
"hash" : "c515bc52cb560adebce1e84bb5d917ce"
},
"app-drydock-blue-large" : {
"name" : "app-drydock-blue-large",
"rule" : ".app-drydock-blue-large, .phabricator-crumb-view:hover .app-drydock-dark-large",
"hash" : "a63aaba405583e356f00af6bc1dedfad"
"hash" : "ba82e330a78dd60df033560e083601cf"
},
"app-drydock-dark-large" : {
"name" : "app-drydock-dark-large",
"rule" : ".app-drydock-dark-large",
"hash" : "a97be15640a38db803cc03215968e856"
"hash" : "7a41b9668c77b85b8acf048d9e61c50a"
},
"app-drydock-glow-large" : {
"name" : "app-drydock-glow-large",
"rule" : ".app-drydock-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-drydock-light-large",
"hash" : "d7beac10376044ffda0adbe6ed01e645"
"hash" : "f5866c62ecbc94ecacd1563d2780677d"
},
"app-drydock-light-large" : {
"name" : "app-drydock-light-large",
"rule" : ".app-drydock-light-large",
"hash" : "712c8fa45f964e0c4cbb69321fd1fded"
"hash" : "2c1ce32d5d5291e7d3d3d6e9323a2a65"
},
"app-fact-blue-large" : {
"name" : "app-fact-blue-large",
"rule" : ".app-fact-blue-large, .phabricator-crumb-view:hover .app-fact-dark-large",
"hash" : "4b07b51e2178f12533c04c55d522d9e5"
"hash" : "1e2b911cb36b0d44384487e348892ccc"
},
"app-fact-dark-large" : {
"name" : "app-fact-dark-large",
"rule" : ".app-fact-dark-large",
"hash" : "6040fe830d8f0868cdb38ee2b8ee16ac"
"hash" : "5fb4a988baad433e9900f1a814b89caa"
},
"app-fact-glow-large" : {
"name" : "app-fact-glow-large",
"rule" : ".app-fact-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-fact-light-large",
"hash" : "691ab101af38d4f06421ca0b22e463d9"
"hash" : "5bd7e5f2adfa0935ae97270139ec4912"
},
"app-fact-light-large" : {
"name" : "app-fact-light-large",
"rule" : ".app-fact-light-large",
"hash" : "8253f813361ba065866ee6e6e2077320"
"hash" : "3bc45d399dad8ec8d55873714c42c1d7"
},
"app-feed-blue-large" : {
"name" : "app-feed-blue-large",
"rule" : ".app-feed-blue-large, .phabricator-crumb-view:hover .app-feed-dark-large",
"hash" : "462246f99422c86301b7d4faa67d9488"
"hash" : "3bcdec795b38002644a8009c927a0acc"
},
"app-feed-dark-large" : {
"name" : "app-feed-dark-large",
"rule" : ".app-feed-dark-large",
"hash" : "0eecff752dc5dde55e7feaa52b7ee7d0"
"hash" : "e83834eccc699399b604069b95465cff"
},
"app-feed-glow-large" : {
"name" : "app-feed-glow-large",
"rule" : ".app-feed-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-feed-light-large",
"hash" : "45fe559a997e540933c184ae570a6ddc"
"hash" : "ca2fb9a2cd437b465f5d912a4d26f3e5"
},
"app-feed-light-large" : {
"name" : "app-feed-light-large",
"rule" : ".app-feed-light-large",
"hash" : "2ec6e12956fe1e1b746261bb3d0a0d36"
"hash" : "e3a8add13539550ddaab62f84b30dd66"
},
"app-files-blue-large" : {
"name" : "app-files-blue-large",
"rule" : ".app-files-blue-large, .phabricator-crumb-view:hover .app-files-dark-large",
"hash" : "f9217c49be154a830303285ae64790c8"
"hash" : "4505af3a9261a1ee4e00bf1d046286dd"
},
"app-files-dark-large" : {
"name" : "app-files-dark-large",
"rule" : ".app-files-dark-large",
"hash" : "78fb66b9edc99c3694325548582f0506"
"hash" : "1d229c79f3b8301ca1ee38ccd9c7c142"
},
"app-files-glow-large" : {
"name" : "app-files-glow-large",
"rule" : ".app-files-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-files-light-large",
"hash" : "cabf071ace59043fc877f1e962109c83"
"hash" : "4bd7617617d0af975282bdd9a399d0ab"
},
"app-files-light-large" : {
"name" : "app-files-light-large",
"rule" : ".app-files-light-large",
"hash" : "ee5503d0684ea20be40023a29589d322"
"hash" : "0d8bf609759312d89e2a4b148f0701d8"
},
"app-flags-blue-large" : {
"name" : "app-flags-blue-large",
"rule" : ".app-flags-blue-large, .phabricator-crumb-view:hover .app-flags-dark-large",
"hash" : "8bbdefdaba30bf6a020f8515ee33d452"
"hash" : "a6f52b520f88e4ef60b7a76fb3c2c597"
},
"app-flags-dark-large" : {
"name" : "app-flags-dark-large",
"rule" : ".app-flags-dark-large",
"hash" : "c6824e1362ec59ccf9ad8f451da466c1"
"hash" : "51307234bb3c309b3ea69381e0b72b16"
},
"app-flags-glow-large" : {
"name" : "app-flags-glow-large",
"rule" : ".app-flags-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-flags-light-large",
"hash" : "e728b1018c62d24efa5d416d138cb671"
"hash" : "75c1c107f4e750ef27bf50b4b51b0e00"
},
"app-flags-light-large" : {
"name" : "app-flags-light-large",
"rule" : ".app-flags-light-large",
"hash" : "4a40dc3e18011a8283840e5dfbe14dc9"
"hash" : "8c198ba5bcd146595870bab777d4992e"
},
"app-help-blue-large" : {
"name" : "app-help-blue-large",
"rule" : ".app-help-blue-large, .phabricator-crumb-view:hover .app-help-dark-large",
"hash" : "703f8c674cdd22f1314ffe8977acf35b"
"hash" : "a74c4f436b2e70c0e06f4224953d064a"
},
"app-help-dark-large" : {
"name" : "app-help-dark-large",
"rule" : ".app-help-dark-large",
"hash" : "601aaf7047f9db41baf7e3393b0d7aeb"
"hash" : "3cbd366c4b5758e45ef07507c70f68c0"
},
"app-help-glow-large" : {
"name" : "app-help-glow-large",
"rule" : ".app-help-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-help-light-large",
"hash" : "1a2928f28cbfdcc31f411e7d2dc26447"
"hash" : "c795358a116961342b206821a1b8038b"
},
"app-help-light-large" : {
"name" : "app-help-light-large",
"rule" : ".app-help-light-large",
"hash" : "c17b8e6228f844777177c5070e17dd91"
"hash" : "722eceffe63605b00a5b957b5f40db98"
},
"app-herald-blue-large" : {
"name" : "app-herald-blue-large",
"rule" : ".app-herald-blue-large, .phabricator-crumb-view:hover .app-herald-dark-large",
"hash" : "4bf9b4b872e7207d66c6e80dcad47b0e"
"hash" : "9edfe47e8f1f2c4f1071f4d8b6ed346d"
},
"app-herald-dark-large" : {
"name" : "app-herald-dark-large",
"rule" : ".app-herald-dark-large",
"hash" : "e19fd614bf5f904603517df957165b22"
"hash" : "4b7a3ab5e0b6a04224ccb6e520e73d6e"
},
"app-herald-glow-large" : {
"name" : "app-herald-glow-large",
"rule" : ".app-herald-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-herald-light-large",
"hash" : "13ef725e4f2da68211cf9ab17740c723"
"hash" : "22beef0629ee517ba1a2b822ed440d0c"
},
"app-herald-light-large" : {
"name" : "app-herald-light-large",
"rule" : ".app-herald-light-large",
"hash" : "81af2b9899db0b5c877d96016ddfa1a1"
"hash" : "65bbeb68fd051b77f4871aafe2994f56"
},
"app-home-blue-large" : {
"name" : "app-home-blue-large",
"rule" : ".app-home-blue-large, .phabricator-crumb-view:hover .app-home-dark-large",
"hash" : "7011cb276b9d7d1f042d2f0393a74312"
"hash" : "7df64082c33dcc3d2263772c0393be70"
},
"app-home-dark-large" : {
"name" : "app-home-dark-large",
"rule" : ".app-home-dark-large",
"hash" : "6b7f677ad630593900132f6271c41cb4"
"hash" : "79acb839094adcb3ad94567c054801eb"
},
"app-home-glow-large" : {
"name" : "app-home-glow-large",
"rule" : ".app-home-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-home-light-large",
"hash" : "8b61be58e6a4f0e9e73434c40844260b"
"hash" : "5af620ae48ba98ee4ee594c32ba761cb"
},
"app-home-light-large" : {
"name" : "app-home-light-large",
"rule" : ".app-home-light-large",
"hash" : "f0740b16cd3746a1234070f1785c03eb"
"hash" : "181a71639319f3beda59809963384250"
},
"app-logo-blue-large" : {
"name" : "app-logo-blue-large",
"rule" : ".app-logo-blue-large, .phabricator-crumb-view:hover .app-logo-dark-large",
"hash" : "64a8124698f9441f50230f3a63364dd7"
"hash" : "025f46665b079f5899ec53be09165d09"
},
"app-logo-dark-large" : {
"name" : "app-logo-dark-large",
"rule" : ".app-logo-dark-large",
"hash" : "8023a60fcba24c3f200214152a62a2c3"
"hash" : "20524d2868b7b57423aa8dc27b284cac"
},
"app-logo-glow-large" : {
"name" : "app-logo-glow-large",
"rule" : ".app-logo-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-logo-light-large",
"hash" : "c742c782b92cc5fecdc1a9747568ad70"
"hash" : "3969545781a17ec856bacec4ed110506"
},
"app-logo-light-large" : {
"name" : "app-logo-light-large",
"rule" : ".app-logo-light-large",
"hash" : "52fc06fb90f7ec1c29498069b1a059b2"
"hash" : "bd1b66ffad9ee26019738fc00a7eb343"
},
"app-macro-blue-large" : {
"name" : "app-macro-blue-large",
"rule" : ".app-macro-blue-large, .phabricator-crumb-view:hover .app-macro-dark-large",
"hash" : "50c14fec9a7f913c8aa4a2793bf2867c"
"hash" : "a6116a196718bf6cd5337b4c49de710e"
},
"app-macro-dark-large" : {
"name" : "app-macro-dark-large",
"rule" : ".app-macro-dark-large",
"hash" : "890cde6b9407d00c6394d446974674ff"
"hash" : "583a495f319fb63f99400b0197832dce"
},
"app-macro-glow-large" : {
"name" : "app-macro-glow-large",
"rule" : ".app-macro-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-macro-light-large",
"hash" : "a3aaa9ebca64e5659e8c3c4eebdedd7a"
"hash" : "16d2c3aeabb43a51bb5742c67c4b92a1"
},
"app-macro-light-large" : {
"name" : "app-macro-light-large",
"rule" : ".app-macro-light-large",
"hash" : "7dcba4f0560b9e197849f5540b7ec66d"
"hash" : "b073066348826c93f57ba76f746e5c7e"
},
"app-mail-blue-large" : {
"name" : "app-mail-blue-large",
"rule" : ".app-mail-blue-large, .phabricator-crumb-view:hover .app-mail-dark-large",
"hash" : "a0a94c194794bb435ea3152ecb2cd42d"
"hash" : "192f85bd7a5be296de7acff9bbc9bd1d"
},
"app-mail-dark-large" : {
"name" : "app-mail-dark-large",
"rule" : ".app-mail-dark-large",
"hash" : "1a1437047fd24b9bb2643435185b6f13"
"hash" : "4709516a74216e0ba886a30180ad93d4"
},
"app-mail-glow-large" : {
"name" : "app-mail-glow-large",
"rule" : ".app-mail-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-mail-light-large",
"hash" : "141548cae4bf8265be9452e583be3504"
"hash" : "1f0d2be98c3771791db7a9ad20784872"
},
"app-mail-light-large" : {
"name" : "app-mail-light-large",
"rule" : ".app-mail-light-large",
"hash" : "27aec2b8d5bd1fb7eba00ffbaacf1930"
"hash" : "740ea3d3104365ab7bad981b13d23693"
},
"app-maniphest-blue-large" : {
"name" : "app-maniphest-blue-large",
"rule" : ".app-maniphest-blue-large, .phabricator-crumb-view:hover .app-maniphest-dark-large",
"hash" : "619ff6fea2c90a8d70b000ed0ece6e4b"
"hash" : "d667667cc5216ff510cb58c359ffc2a4"
},
"app-maniphest-dark-large" : {
"name" : "app-maniphest-dark-large",
"rule" : ".app-maniphest-dark-large",
"hash" : "7a204fc2f4779eff27847bf799652140"
"hash" : "acadb7737b24ecc23e892cdaab7c1fe2"
},
"app-maniphest-glow-large" : {
"name" : "app-maniphest-glow-large",
"rule" : ".app-maniphest-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-maniphest-light-large",
"hash" : "2b67eff9fb01bdf0972749532301e038"
"hash" : "8dccd7ba95ddffc4e071e42b69773f5c"
},
"app-maniphest-light-large" : {
"name" : "app-maniphest-light-large",
"rule" : ".app-maniphest-light-large",
"hash" : "90ea395741410840b1b4a974f802b06c"
"hash" : "0d2c71a1279686c3884c267d98bc36ba"
},
"app-metamta-blue-large" : {
"name" : "app-metamta-blue-large",
"rule" : ".app-metamta-blue-large, .phabricator-crumb-view:hover .app-metamta-dark-large",
"hash" : "48af88efc2887cc985f09d5202922df0"
"hash" : "1757d281dcdbdf221ca2b2e90993dba8"
},
"app-metamta-dark-large" : {
"name" : "app-metamta-dark-large",
"rule" : ".app-metamta-dark-large",
"hash" : "bf18a2c7ef31e72dc9ce6695035baf60"
"hash" : "c5f3a7468d98ebb977bfb0cc81abd5ee"
},
"app-metamta-glow-large" : {
"name" : "app-metamta-glow-large",
"rule" : ".app-metamta-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-metamta-light-large",
"hash" : "74c00295bf0d394e6427593665a271f1"
"hash" : "5f7b115d45e5d3a5a5a730173366f2e4"
},
"app-metamta-light-large" : {
"name" : "app-metamta-light-large",
"rule" : ".app-metamta-light-large",
"hash" : "720cc7f66ab36770998aa4fe9ad22785"
"hash" : "13ce4ca0f223cda37e3af39da8c6e564"
},
"app-owners-blue-large" : {
"name" : "app-owners-blue-large",
"rule" : ".app-owners-blue-large, .phabricator-crumb-view:hover .app-owners-dark-large",
"hash" : "ee909b2d51a3c52b38c0cca3da8d861d"
"hash" : "585c128af418f94b8fbf18206605ec84"
},
"app-owners-dark-large" : {
"name" : "app-owners-dark-large",
"rule" : ".app-owners-dark-large",
"hash" : "05a6fcc603b5ee346d25b1fb25e7e695"
"hash" : "b09a80f307491acbe56fb16e01956173"
},
"app-owners-glow-large" : {
"name" : "app-owners-glow-large",
"rule" : ".app-owners-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-owners-light-large",
"hash" : "4bcba14ffcdf7ac3c1968ebcc34f7e37"
"hash" : "a63816e6979ec6c222a086b5d72a0b86"
},
"app-owners-light-large" : {
"name" : "app-owners-light-large",
"rule" : ".app-owners-light-large",
"hash" : "2d6b3f02f210c73242d91bdb9ef8456c"
"hash" : "6b06493f46a91584e746e5034be15366"
},
"app-paste-blue-large" : {
"name" : "app-paste-blue-large",
"rule" : ".app-paste-blue-large, .phabricator-crumb-view:hover .app-paste-dark-large",
"hash" : "2ce99237cc2f064f0aa48fb1d147c781"
"hash" : "4a14c100c5b78282712dd2cc619d72b4"
},
"app-paste-dark-large" : {
"name" : "app-paste-dark-large",
"rule" : ".app-paste-dark-large",
"hash" : "f566e3e0c8e6a17b7c2fc4168b079ede"
"hash" : "03d3dded4964e60771c8a45549e13973"
},
"app-paste-glow-large" : {
"name" : "app-paste-glow-large",
"rule" : ".app-paste-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-paste-light-large",
"hash" : "34333bbb31fb3909461cc064ea2f72e9"
"hash" : "507192b6a41abdc1a886a144cc315326"
},
"app-paste-light-large" : {
"name" : "app-paste-light-large",
"rule" : ".app-paste-light-large",
"hash" : "e77a206e1cbaf1417b4a0b9f3d67380a"
"hash" : "66f1f8fe7acafaab5f608598589aaa5c"
},
"app-people-blue-large" : {
"name" : "app-people-blue-large",
"rule" : ".app-people-blue-large, .phabricator-crumb-view:hover .app-people-dark-large",
"hash" : "37fcac5bc4ad63c37d68da2c77717301"
"hash" : "ed242e94b2b5698fd90261ca63aef8a6"
},
"app-people-dark-large" : {
"name" : "app-people-dark-large",
"rule" : ".app-people-dark-large",
"hash" : "01fb27eba95c01d1aadde04ea4513caa"
"hash" : "b1748b3a5afacd4f8afcd5ea37352dc7"
},
"app-people-glow-large" : {
"name" : "app-people-glow-large",
"rule" : ".app-people-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-people-light-large",
"hash" : "6d859c1505f5877b86faf34385bbcd59"
"hash" : "ed1b2d2d27ae8fd07d0e5e1d4002625e"
},
"app-people-light-large" : {
"name" : "app-people-light-large",
"rule" : ".app-people-light-large",
"hash" : "d1d80fddc9e6295494d12b72b4700dc5"
"hash" : "f6efcbdbcee02f9f37f92774b4b0e4cf"
},
"app-phame-blue-large" : {
"name" : "app-phame-blue-large",
"rule" : ".app-phame-blue-large, .phabricator-crumb-view:hover .app-phame-dark-large",
"hash" : "f72bd35227e9ba2157852377e2d87ec4"
"hash" : "d448b392b7bc927b9b5522d525fa8c49"
},
"app-phame-dark-large" : {
"name" : "app-phame-dark-large",
"rule" : ".app-phame-dark-large",
"hash" : "7bfe54cf7d885985fb7e06ad0abaf4e9"
"hash" : "a7cf2f8ec22cdb675a3bc792c7c1edf6"
},
"app-phame-glow-large" : {
"name" : "app-phame-glow-large",
"rule" : ".app-phame-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phame-light-large",
"hash" : "60013586092f2c5eb5ed1f58c7f02a74"
"hash" : "4587c25ff8a94fd48a1a0ca2e9fd9f42"
},
"app-phame-light-large" : {
"name" : "app-phame-light-large",
"rule" : ".app-phame-light-large",
"hash" : "5266f8774d0470adc65f610c9175a251"
"hash" : "265471ec8d3c7ddeb3c269384d22243d"
},
"app-phid-blue-large" : {
"name" : "app-phid-blue-large",
"rule" : ".app-phid-blue-large, .phabricator-crumb-view:hover .app-phid-dark-large",
"hash" : "d726ca94608547ff3974a1d49e6b1012"
"hash" : "b94bc233e1bcf520c65351b71794c228"
},
"app-phid-dark-large" : {
"name" : "app-phid-dark-large",
"rule" : ".app-phid-dark-large",
"hash" : "04af0c932bea8b7c36f6dc954994ea11"
"hash" : "f4dfdcc8e1fde50cfcb7e07376696964"
},
"app-phid-glow-large" : {
"name" : "app-phid-glow-large",
"rule" : ".app-phid-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phid-light-large",
"hash" : "b1e8a6e4ac9ad64d34fbc7560d507e5b"
"hash" : "10ec316b409b385e19800048fcb1a79e"
},
"app-phid-light-large" : {
"name" : "app-phid-light-large",
"rule" : ".app-phid-light-large",
"hash" : "0ba23a08c29e8064fdddee9112c638e3"
"hash" : "0087c573b07d8badaeadcb8ad560ae9b"
},
"app-pholio-blue-large" : {
"name" : "app-pholio-blue-large",
"rule" : ".app-pholio-blue-large, .phabricator-crumb-view:hover .app-pholio-dark-large",
"hash" : "08bfdf63411a09e6be88d99128c1e9f8"
"hash" : "5b8e3f47a49a0dee84c1b7c228884f0c"
},
"app-pholio-dark-large" : {
"name" : "app-pholio-dark-large",
"rule" : ".app-pholio-dark-large",
"hash" : "2a8bfa3870726691766fe3f6cb73df38"
"hash" : "4a73276e5bcd9cfbb08435ed36051dff"
},
"app-pholio-glow-large" : {
"name" : "app-pholio-glow-large",
"rule" : ".app-pholio-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-pholio-light-large",
"hash" : "499b68a80e78ab5f6ebe5ba7470fbb4a"
"hash" : "aca383c3c4fcec4742a11702e3427221"
},
"app-pholio-light-large" : {
"name" : "app-pholio-light-large",
"rule" : ".app-pholio-light-large",
"hash" : "9a4d4223e6e1d7a77c4545504ea0908c"
"hash" : "1a3ace478c2b0f9b444005112e17c695"
},
"app-phpast-blue-large" : {
"name" : "app-phpast-blue-large",
"rule" : ".app-phpast-blue-large, .phabricator-crumb-view:hover .app-phpast-dark-large",
"hash" : "a9f4f0a62e5841b2ed669dc02694419d"
"hash" : "22ba8a058d6b920a909c5f6731f301a0"
},
"app-phpast-dark-large" : {
"name" : "app-phpast-dark-large",
"rule" : ".app-phpast-dark-large",
"hash" : "1dbc83cc09d722253b634f3308608627"
"hash" : "bdbfd96cb50a8b7450daf82576fcfe95"
},
"app-phpast-glow-large" : {
"name" : "app-phpast-glow-large",
"rule" : ".app-phpast-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phpast-light-large",
"hash" : "e98e4cdc93e51b0d7c1df25c01c75fac"
"hash" : "ce7433350eeaee95ecf358905ad38029"
},
"app-phpast-light-large" : {
"name" : "app-phpast-light-large",
"rule" : ".app-phpast-light-large",
"hash" : "c63fb0fe3cc326f1a19e4e59c42a73f7"
"hash" : "5ebd26eb5e0bc0229db5696020dd9b4a"
},
"app-phriction-blue-large" : {
"name" : "app-phriction-blue-large",
"rule" : ".app-phriction-blue-large, .phabricator-crumb-view:hover .app-phriction-dark-large",
"hash" : "55bbded073e078117369f42e05b5b5c4"
"hash" : "0134e9d694ce72a6d9c554e639a6ed50"
},
"app-phriction-dark-large" : {
"name" : "app-phriction-dark-large",
"rule" : ".app-phriction-dark-large",
"hash" : "944c3a520a484580895b287eaaa103b1"
"hash" : "e4f3121261bc96e00bb6b94b467582f4"
},
"app-phriction-glow-large" : {
"name" : "app-phriction-glow-large",
"rule" : ".app-phriction-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-phriction-light-large",
"hash" : "84639b5ccba94daf1850a9449131a078"
"hash" : "27612f55aaa40c4178a3a5a46d225947"
},
"app-phriction-light-large" : {
"name" : "app-phriction-light-large",
"rule" : ".app-phriction-light-large",
"hash" : "2ca79fdfd141b0fe00ff8b2e13df73bf"
"hash" : "a56dcfca00861938d337cc2f217b33f6"
},
"app-ponder-blue-large" : {
"name" : "app-ponder-blue-large",
"rule" : ".app-ponder-blue-large, .phabricator-crumb-view:hover .app-ponder-dark-large",
"hash" : "8018fe4ebc1e9af91a8a737e0505aa5d"
"hash" : "1bfc2f6150bd67cc25cbe1fbc9283f9c"
},
"app-ponder-dark-large" : {
"name" : "app-ponder-dark-large",
"rule" : ".app-ponder-dark-large",
"hash" : "1da67495789c69621f91800939ea9684"
"hash" : "6efc0b3a74d2cc9eb5de96205613b640"
},
"app-ponder-glow-large" : {
"name" : "app-ponder-glow-large",
"rule" : ".app-ponder-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-ponder-light-large",
"hash" : "f73a1b5a6b688c6d3feba14193357147"
"hash" : "9c2a2506e53e6a902976d504dfe94b46"
},
"app-ponder-light-large" : {
"name" : "app-ponder-light-large",
"rule" : ".app-ponder-light-large",
"hash" : "eb8b13c3bc35f36b14f33ef1158b71ab"
"hash" : "595895068b10c68b0e05234570a6a268"
},
"app-power-blue-large" : {
"name" : "app-power-blue-large",
"rule" : ".app-power-blue-large, .phabricator-crumb-view:hover .app-power-dark-large",
"hash" : "743499c84546b7b35139eec60bf74c34"
"hash" : "c3e03022f162f986f784b2a43c8784c7"
},
"app-power-dark-large" : {
"name" : "app-power-dark-large",
"rule" : ".app-power-dark-large",
"hash" : "1a3520a2ec255f5b7f1779ea66153ade"
"hash" : "52d04564ca2cc7f3a96809e827162f3e"
},
"app-power-glow-large" : {
"name" : "app-power-glow-large",
"rule" : ".app-power-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-power-light-large",
"hash" : "3951e012561a0d5d5d2b00711b13fa9c"
"hash" : "3f7719f0299abef8ba900e79fb6b5015"
},
"app-power-light-large" : {
"name" : "app-power-light-large",
"rule" : ".app-power-light-large",
"hash" : "52d04bd829dfe7477a9dc2ef916990ab"
"hash" : "ffe9f181e6103eab9fc688ab84b07ad1"
},
"app-projects-blue-large" : {
"name" : "app-projects-blue-large",
"rule" : ".app-projects-blue-large, .phabricator-crumb-view:hover .app-projects-dark-large",
"hash" : "278113829ca3543b9377030555e04edc"
"hash" : "494ca64479f68588823e00609496414a"
},
"app-projects-dark-large" : {
"name" : "app-projects-dark-large",
"rule" : ".app-projects-dark-large",
"hash" : "b6f043db039d4960397f76904a84e9fc"
"hash" : "fa85ad644a2e289cb6bea2a67ab534f8"
},
"app-projects-glow-large" : {
"name" : "app-projects-glow-large",
"rule" : ".app-projects-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-projects-light-large",
"hash" : "3d1bf3efdbd9ccdbb73fc3a11d5d1265"
"hash" : "b28bf212416595b3ba4bfb528dfaf791"
},
"app-projects-light-large" : {
"name" : "app-projects-light-large",
"rule" : ".app-projects-light-large",
"hash" : "88c73c7cb50ce7cf9cd8d33ec20c8245"
"hash" : "228db63ac0e80b3cef46903a003a44df"
},
"app-repositories-blue-large" : {
"name" : "app-repositories-blue-large",
"rule" : ".app-repositories-blue-large, .phabricator-crumb-view:hover .app-repositories-dark-large",
"hash" : "0642bf1118210cef9105cc463ec3d36f"
"hash" : "a83dd2186f9d92949f19a97f8f777a9c"
},
"app-repositories-dark-large" : {
"name" : "app-repositories-dark-large",
"rule" : ".app-repositories-dark-large",
"hash" : "c92eb4e857d74f1ef206ba5b184ad88c"
"hash" : "30ead88c9f018797a8d5ef2f4e4221fe"
},
"app-repositories-glow-large" : {
"name" : "app-repositories-glow-large",
"rule" : ".app-repositories-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-repositories-light-large",
"hash" : "7fe40fbb4150dfbc6133c79578fc1494"
"hash" : "44b04cbf1652211fbc2046c7773b4cf2"
},
"app-repositories-light-large" : {
"name" : "app-repositories-light-large",
"rule" : ".app-repositories-light-large",
"hash" : "446a7eab7b7fc07329bc21a77c438033"
"hash" : "bcba180d121f9269787509ba7cdd3e48"
},
"app-settings-blue-large" : {
"name" : "app-settings-blue-large",
"rule" : ".app-settings-blue-large, .phabricator-crumb-view:hover .app-settings-dark-large",
"hash" : "4d22a7f016509777bb5b55f39198d9d7"
"hash" : "c615df792c7e81b35cfbb78ece39e796"
},
"app-settings-dark-large" : {
"name" : "app-settings-dark-large",
"rule" : ".app-settings-dark-large",
"hash" : "55e0869a51f70cacdd72f2baad4b28ce"
"hash" : "6c174857e23a9d169d0cb4079aa14637"
},
"app-settings-glow-large" : {
"name" : "app-settings-glow-large",
"rule" : ".app-settings-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-settings-light-large",
"hash" : "314ab0f607baa65ff6a684b1ddd4861d"
"hash" : "4d8c68dc709d99141a19aad5bc483971"
},
"app-settings-light-large" : {
"name" : "app-settings-light-large",
"rule" : ".app-settings-light-large",
"hash" : "41da4708f38fae918af46505e566bd6a"
"hash" : "e901b672f2a51ef286369bfea70a7e8d"
},
"app-setup-blue-large" : {
"name" : "app-setup-blue-large",
"rule" : ".app-setup-blue-large, .phabricator-crumb-view:hover .app-setup-dark-large",
"hash" : "74d2ba681cdad54b31d53f7c174f5826"
"hash" : "a2f8f470c3cd928e8c1a6959ff745789"
},
"app-setup-dark-large" : {
"name" : "app-setup-dark-large",
"rule" : ".app-setup-dark-large",
"hash" : "89a94fe1ce36351d3ea81f1776fb061a"
"hash" : "3183fafc1dc05b851ba902ace2dfa34d"
},
"app-setup-glow-large" : {
"name" : "app-setup-glow-large",
"rule" : ".app-setup-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-setup-light-large",
"hash" : "53942c73b14210f5bf0bfad68bcb4431"
"hash" : "d91b7e5480cb4296871b9f1c4c634256"
},
"app-setup-light-large" : {
"name" : "app-setup-light-large",
"rule" : ".app-setup-light-large",
"hash" : "890dd2d7cb1e51992b202dd462d56ba6"
"hash" : "419829d244a85f97d67fb45c6febd4e5"
},
"app-slowvote-blue-large" : {
"name" : "app-slowvote-blue-large",
"rule" : ".app-slowvote-blue-large, .phabricator-crumb-view:hover .app-slowvote-dark-large",
"hash" : "12299956375e7f382217ebf8c1cb8203"
"hash" : "941028e7abbe491e2911fb24c4a8edca"
},
"app-slowvote-dark-large" : {
"name" : "app-slowvote-dark-large",
"rule" : ".app-slowvote-dark-large",
"hash" : "ce57e4a318e4e8d556f713b459e6d798"
"hash" : "6197df3550b652011bc1a8da00005059"
},
"app-slowvote-glow-large" : {
"name" : "app-slowvote-glow-large",
"rule" : ".app-slowvote-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-slowvote-light-large",
"hash" : "dcd5be64ded69e0fdfee5364367c9b55"
"hash" : "43783af8df4f99e94f0989ca149264f2"
},
"app-slowvote-light-large" : {
"name" : "app-slowvote-light-large",
"rule" : ".app-slowvote-light-large",
"hash" : "7ac2515f26b194a9fafaa6a27997be2a"
"hash" : "23eb39153b5ac9b5bd91c8b800023d93"
},
"app-uiexamples-blue-large" : {
"name" : "app-uiexamples-blue-large",
"rule" : ".app-uiexamples-blue-large, .phabricator-crumb-view:hover .app-uiexamples-dark-large",
"hash" : "7add7df6b621c4af5322160bc1cd31b2"
"hash" : "eabac7f7b83c47618a5f72b6f30b6410"
},
"app-uiexamples-dark-large" : {
"name" : "app-uiexamples-dark-large",
"rule" : ".app-uiexamples-dark-large",
"hash" : "d8563a5f06692a313a2eff11235d5d0d"
"hash" : "31c9fb99289cc73aae73f3acad66b449"
},
"app-uiexamples-glow-large" : {
"name" : "app-uiexamples-glow-large",
"rule" : ".app-uiexamples-glow-large, .device-desktop .phabricator-dark-menu a:hover .app-uiexamples-light-large",
"hash" : "0532cdd91b6de17ab194bd29cacfc24f"
"hash" : "069e59208dad509a6c3d74d102f08ae8"
},
"app-uiexamples-light-large" : {
"name" : "app-uiexamples-light-large",
"rule" : ".app-uiexamples-light-large",
"hash" : "ee40dd0e3168f8e7fb520665a1d50f95"
"hash" : "b384102bcee1b312b2e06abc5f4b27de"
}
},
"scales" : [

View file

@ -4,197 +4,197 @@
"app-application-dark" : {
"name" : "app-application-dark",
"rule" : ".app-application-dark",
"hash" : "60e228106718bf6f3ee5024400d31f24"
"hash" : "89f861c28e97878311885623cff3d314"
},
"app-audit-dark" : {
"name" : "app-audit-dark",
"rule" : ".app-audit-dark",
"hash" : "38339b9cc4e39cbbbea36dcf039873bb"
"hash" : "2c141bc445c4fe62986cd6cff0c29b36"
},
"app-calendar-dark" : {
"name" : "app-calendar-dark",
"rule" : ".app-calendar-dark",
"hash" : "756d60566639ad1424444436a95c6a3f"
"hash" : "04c61a081986f0d38cf27fc4e18bce40"
},
"app-conduit-dark" : {
"name" : "app-conduit-dark",
"rule" : ".app-conduit-dark",
"hash" : "01fba8ca32f1cfefb3516b45c9d28b40"
"hash" : "7b410e96c87e7818fb93bdfa2ed9368f"
},
"app-conpherence-dark" : {
"name" : "app-conpherence-dark",
"rule" : ".app-conpherence-dark",
"hash" : "dbb6fdd5f082a604b4ef10b7eeedbfa2"
"hash" : "6d65bc8da41c3a59822b31f68b9b883c"
},
"app-countdown-dark" : {
"name" : "app-countdown-dark",
"rule" : ".app-countdown-dark",
"hash" : "625f2589ee491aead58aaa5b965a7451"
"hash" : "8891502317896beea6a5f9ec87eb5e2e"
},
"app-daemon-dark" : {
"name" : "app-daemon-dark",
"rule" : ".app-daemon-dark",
"hash" : "4472be3242150f06ea5bf7b45333c4c5"
"hash" : "23a9a2927b368e2328dd70f95c5b1a07"
},
"app-differential-dark" : {
"name" : "app-differential-dark",
"rule" : ".app-differential-dark",
"hash" : "508401fe36d9636bdcbdcbcae253c152"
"hash" : "bb7032f3c17901f242f9bbbcdc9a721c"
},
"app-diffusion-dark" : {
"name" : "app-diffusion-dark",
"rule" : ".app-diffusion-dark",
"hash" : "0a6f8c85079c4a325430197adb05967c"
"hash" : "46ab6648a6ae04e4fd1a28a9afcc4996"
},
"app-diviner-dark" : {
"name" : "app-diviner-dark",
"rule" : ".app-diviner-dark",
"hash" : "08872eb1c6bb51b9727290f6fa802633"
"hash" : "e21a74e866a6fc22a991b8df6efc3ca7"
},
"app-drydock-dark" : {
"name" : "app-drydock-dark",
"rule" : ".app-drydock-dark",
"hash" : "d50309da57021c676774f9bdc68c5fe7"
"hash" : "ed44013d98257a23306bad9c6b24760d"
},
"app-fact-dark" : {
"name" : "app-fact-dark",
"rule" : ".app-fact-dark",
"hash" : "0c1be568e1ac05fca814718600190369"
"hash" : "f373f38e784289b866ab914471c342ec"
},
"app-feed-dark" : {
"name" : "app-feed-dark",
"rule" : ".app-feed-dark",
"hash" : "830232709eedbe6ce7cdbcebf182c86c"
"hash" : "c4f1765e70615c6ee4cae6e8135fb969"
},
"app-files-dark" : {
"name" : "app-files-dark",
"rule" : ".app-files-dark",
"hash" : "00f5ab7ea3e9367e378cf9f395400ed4"
"hash" : "7faf45efa5b9b97e571bc66636ca1a15"
},
"app-flags-dark" : {
"name" : "app-flags-dark",
"rule" : ".app-flags-dark",
"hash" : "6382f373f7b0e70522d80ce06ef62813"
"hash" : "10298f695592714e27f72ef746ffd8a9"
},
"app-help-dark" : {
"name" : "app-help-dark",
"rule" : ".app-help-dark",
"hash" : "2299a14e27d76fdf66209ef0042cc84f"
"hash" : "5cf715cc566b98c87958793eebea5f35"
},
"app-herald-dark" : {
"name" : "app-herald-dark",
"rule" : ".app-herald-dark",
"hash" : "b2193b62df3bd4cf5c8de514a07fb6c3"
"hash" : "e3bc39a3dd1d66a0abf4594c608a3846"
},
"app-home-dark" : {
"name" : "app-home-dark",
"rule" : ".app-home-dark",
"hash" : "88f020497fcbcf43729aa817695b174f"
"hash" : "7e01fbdfa526919a2d90d2c29a6c9fa0"
},
"app-logo-dark" : {
"name" : "app-logo-dark",
"rule" : ".app-logo-dark",
"hash" : "02e71ae2421f1949f2ef075c27e052c9"
"hash" : "39701e1282fd120e77b09ed9fcddc686"
},
"app-macro-dark" : {
"name" : "app-macro-dark",
"rule" : ".app-macro-dark",
"hash" : "8e0e72847a8f70eb3f8e60e7fb681c06"
"hash" : "ef89457bcee666ad265de1659b9b8a62"
},
"app-mail-dark" : {
"name" : "app-mail-dark",
"rule" : ".app-mail-dark",
"hash" : "a2a792fddc44be4ae0f1a601380c8449"
"hash" : "4d05a5cd4360052183e91f61967a6c57"
},
"app-maniphest-dark" : {
"name" : "app-maniphest-dark",
"rule" : ".app-maniphest-dark",
"hash" : "ea94fc7dbb2267adc33513f78916fe90"
"hash" : "320da127d7f887e09965a0416d5e44d3"
},
"app-metamta-dark" : {
"name" : "app-metamta-dark",
"rule" : ".app-metamta-dark",
"hash" : "8abbb6e74d1697f950a01dcd6c8077be"
"hash" : "51f100c2a7a80149404dbc8b27f595a9"
},
"app-owners-dark" : {
"name" : "app-owners-dark",
"rule" : ".app-owners-dark",
"hash" : "23b948cc1d32a0968785fbfca749dcdf"
"hash" : "33c064dd3b7fc3f9eb934d0cf84f3af5"
},
"app-paste-dark" : {
"name" : "app-paste-dark",
"rule" : ".app-paste-dark",
"hash" : "9e0c1d1fe03aebcb55a4d19be051e255"
"hash" : "9482649caa8e5a46d277271092517b12"
},
"app-people-dark" : {
"name" : "app-people-dark",
"rule" : ".app-people-dark",
"hash" : "0b3995fcd043b506a408de6e25ad5292"
"hash" : "67245eafa79367e4e07289549cf34deb"
},
"app-phame-dark" : {
"name" : "app-phame-dark",
"rule" : ".app-phame-dark",
"hash" : "24ff4d322bce13f1c156ce5361a03a07"
"hash" : "029d7d48523cc43b0404bf40ccf56f8b"
},
"app-phid-dark" : {
"name" : "app-phid-dark",
"rule" : ".app-phid-dark",
"hash" : "5a0ac05bbf36a7aeb36753d093c3c9f8"
"hash" : "2099c2987fe3929ce1d9dec470c7699d"
},
"app-pholio-dark" : {
"name" : "app-pholio-dark",
"rule" : ".app-pholio-dark",
"hash" : "7d3befd1c12dd464a5f5edbef4574a5c"
"hash" : "aab47c79d2e03fdcaffb6f41dc1e0f06"
},
"app-phpast-dark" : {
"name" : "app-phpast-dark",
"rule" : ".app-phpast-dark",
"hash" : "de1ad812c7a177c844fcff626b1abebf"
"hash" : "e6db72b398f57d03a400c9c18bd3c412"
},
"app-phriction-dark" : {
"name" : "app-phriction-dark",
"rule" : ".app-phriction-dark",
"hash" : "8596da3f375087db6a163c98f0c968ae"
"hash" : "8064272206874a324d20d956c8fb10da"
},
"app-ponder-dark" : {
"name" : "app-ponder-dark",
"rule" : ".app-ponder-dark",
"hash" : "232577eb875f383f45cb9dbd9a4e3976"
"hash" : "abdb353635bed5cfd48a176b4340022f"
},
"app-power-dark" : {
"name" : "app-power-dark",
"rule" : ".app-power-dark",
"hash" : "e3708b1b4bfdfc614d9cf630943e5bef"
"hash" : "d3e943d1267206963d8f9419629c5581"
},
"app-projects-dark" : {
"name" : "app-projects-dark",
"rule" : ".app-projects-dark",
"hash" : "5e799f1e95ecfd33cb67b6e4ac992043"
"hash" : "6bd7c598e2f2cf0b77918a7b0fa8bd19"
},
"app-repositories-dark" : {
"name" : "app-repositories-dark",
"rule" : ".app-repositories-dark",
"hash" : "736066962e96df88eacc04d734613a0e"
"hash" : "db2823a16dae198145f53e8021170740"
},
"app-settings-dark" : {
"name" : "app-settings-dark",
"rule" : ".app-settings-dark",
"hash" : "2fadcf918fb084bd3452712f700ae1a0"
"hash" : "1c84d22b769730d9e8b6fcd3414de72c"
},
"app-setup-dark" : {
"name" : "app-setup-dark",
"rule" : ".app-setup-dark",
"hash" : "061b80f3555ade1c36934474b61fe76b"
"hash" : "27db76695d99be0c25368dc9e0932b17"
},
"app-slowvote-dark" : {
"name" : "app-slowvote-dark",
"rule" : ".app-slowvote-dark",
"hash" : "e51cc1e6887f2deaff02d9c60aae36e0"
"hash" : "0d5861fab4562ad21242e34f9a29a33e"
},
"app-uiexamples-dark" : {
"name" : "app-uiexamples-dark",
"rule" : ".app-uiexamples-dark",
"hash" : "dd919fd2c10e7d1e0915f523ac3922ce"
"hash" : "6416a3d9d9007673ee558433b80692a1"
}
},
"scales" : [

View file

@ -4,72 +4,72 @@
"conpher_calendar_off" : {
"name" : "conpher_calendar_off",
"rule" : ".conpher_calendar_off",
"hash" : "a8228ab90fd90f4c2500d9285179bf26"
"hash" : "9ead08702b8028d28aedfa1a0dfbe43a"
},
"conpher_calendar_on" : {
"name" : "conpher_calendar_on",
"rule" : ".conpher_calendar_on, .device-desktop .conpher_calendar_off:hover ",
"hash" : "931243bc3c414782ddb2d1d9607908ba"
"hash" : "f00d0854260ab1bc1a9b4f7f21a64f56"
},
"conpher_conversation_off" : {
"name" : "conpher_conversation_off",
"rule" : ".conpher_conversation_off",
"hash" : "931abb0377898297a9a603a6d280b977"
"hash" : "97f9e8131c741dbba8091a92776036dd"
},
"conpher_conversation_on" : {
"name" : "conpher_conversation_on",
"rule" : ".conpher_conversation_on, .device-desktop .conpher_conversation_off:hover ",
"hash" : "0b8a39dc5019dac1975b7be2ca0ccbfa"
"hash" : "01d5bae305a37debbc44f4131f0863dc"
},
"conpher_files_off" : {
"name" : "conpher_files_off",
"rule" : ".conpher_files_off",
"hash" : "de1aee01b9b47b354e6ac280ae68bae1"
"hash" : "b6a89827978cf06618d4ba572953049a"
},
"conpher_files_on" : {
"name" : "conpher_files_on",
"rule" : ".conpher_files_on, .device-desktop .conpher_files_off:hover ",
"hash" : "9ccbbd5e86fd4ec87a11aee0c9ec8c60"
"hash" : "05f38d8b45077a8a9b5bd21ecc15f958"
},
"conpher_list_off" : {
"name" : "conpher_list_off",
"rule" : ".conpher_list_off",
"hash" : "2611311d0c2aec04416433be74d3a30e"
"hash" : "6f9b685a553e58aa67668494a88f864c"
},
"conpher_list_on" : {
"name" : "conpher_list_on",
"rule" : ".conpher_list_on, .device-desktop .conpher_list_off:hover ",
"hash" : "cee6de0301c84b0d195282642642afa0"
"hash" : "7d495ee16be1162affd3a480ee4b86d4"
},
"conpher_more_off" : {
"name" : "conpher_more_off",
"rule" : ".conpher_more_off",
"hash" : "3b7099bdde20a13864b48552b11e92c3"
"hash" : "c65da03207be1e69ceaa09f15a95d8f4"
},
"conpher_more_on" : {
"name" : "conpher_more_on",
"rule" : ".conpher_more_on, .device-desktop .conpher_more_off:hover ",
"hash" : "b146f0cff9c2e5f0b57f7ebcfe0704d3"
"hash" : "70464cdbd30a77cad597c593ca40ab1f"
},
"conpher_people_off" : {
"name" : "conpher_people_off",
"rule" : ".conpher_people_off",
"hash" : "641a6a21aa32a12416e85caf8a22e340"
"hash" : "a40f1f129d2e3c33134a4103161c0792"
},
"conpher_people_on" : {
"name" : "conpher_people_on",
"rule" : ".conpher_people_on, .device-desktop .conpher_people_off:hover ",
"hash" : "f13745fd7036564eefb1c0ebc3502a92"
"hash" : "fd99a5b329ebe0144acc8fe669f0d936"
},
"conpher_settings_off" : {
"name" : "conpher_settings_off",
"rule" : ".conpher_settings_off",
"hash" : "aa9ab000d9e33e3c50c2fe70367f30b4"
"hash" : "e4b389edbeb7825e4304faf7d20f7469"
},
"conpher_settings_on" : {
"name" : "conpher_settings_on",
"rule" : ".conpher_settings_on, .device-desktop .conpher_settings_off:hover ",
"hash" : "a5fe22965997f9559800ca7db5ea32c8"
"hash" : "8ad76234fffb3f4cc59238ec3b4a6999"
}
},
"scales" : [

View file

@ -4,67 +4,67 @@
"gradient-black-dark" : {
"name" : "gradient-black-dark",
"rule" : ".gradient-black-dark, button.black, a.black, a.black:visited",
"hash" : "17425d8c9c53672ab2edbd236e6efd7a"
"hash" : "b9faf8505427bb14a8c51324e13e2f81"
},
"gradient-black-light" : {
"name" : "gradient-black-light",
"rule" : ".gradient-black-light, button.black:active, a.black:active",
"hash" : "c4fb2231553d2894fd2c97beaa8bfe39"
"hash" : "812c3375d00ccc93c36c6df2eb565df4"
},
"gradient-blue-dark" : {
"name" : "gradient-blue-dark",
"rule" : ".gradient-blue-dark, button, a.button, a.button:visited, input.inputsubmit",
"hash" : "f467612edcdbf984672287c6086492c4"
"hash" : "adc2d0f7397374936384014c5d78550d"
},
"gradient-blue-light" : {
"name" : "gradient-blue-light",
"rule" : ".gradient-blue-light, button:active, a.button:active",
"hash" : "471d47c102def6db46b345310aac5a03"
"hash" : "91b841067a63e543a4dcd9d41e0a2e5c"
},
"gradient-breadcrumbs" : {
"name" : "gradient-breadcrumbs",
"rule" : ".gradient-breadcrumbs",
"hash" : "3d0f8634df5bc29eaf2a5a01bae79cf1"
"hash" : "688ab77f50cfbc17ec30d798efb1b39e"
},
"gradient-dark-menu-label" : {
"name" : "gradient-dark-menu-label",
"rule" : ".gradient-dark-menu-label, .phabricator-dark-menu .phabricator-menu-item-type-label",
"hash" : "e0d4a455142f9c4745d36ad8b7dd3f78"
"hash" : "89a908596142d38fbe61a706694cd321"
},
"gradient-green-dark" : {
"name" : "gradient-green-dark",
"rule" : ".gradient-green-dark, button.green, a.green, a.green:visited",
"hash" : "a6719fe55b2b0e527ed32985691eab34"
"hash" : "0d19ab593772b6b406c0db309b3a14fb"
},
"gradient-green-light" : {
"name" : "gradient-green-light",
"rule" : ".gradient-green-light, button.green:active, a.green:active",
"hash" : "124969cc7805bbd754005bc702e24c54"
"hash" : "71c67916327ec7fc65149ab72c3a2924"
},
"gradient-grey-dark" : {
"name" : "gradient-grey-dark",
"rule" : ".gradient-grey-dark, button.grey, input.inputaux, a.grey, a.grey:visited, a.button.disabled, button[disabled], button.disabled",
"hash" : "fac28a773098fc62bf571e12b843f71a"
"hash" : "32651902d28d37dca01cf067072c39c0"
},
"gradient-grey-light" : {
"name" : "gradient-grey-light",
"rule" : ".gradient-grey-light, button.grey:active, a.grey:active, button.grey_active, a.dropdown-open",
"hash" : "83c6128f59fc2e426c912c2f73f5b92b"
"hash" : "c3c9ee1ed6f800a4ac86910b94687877"
},
"gradient-menu-hover" : {
"name" : "gradient-menu-hover",
"rule" : ".gradient-menu-hover, .device-desktop .phabricator-side-menu a.phabricator-menu-item-type-link:hover, .phabricator-filetree a.phabricator-filetree-item:hover",
"hash" : "e6e064156d66952180e99b00996ffc38"
"hash" : "856380207ac8c5cb6770d44dceb245a8"
},
"gradient-menu-label" : {
"name" : "gradient-menu-label",
"rule" : ".gradient-menu-label, .phabricator-side-menu .phabricator-menu-item-type-label",
"hash" : "04b9943f5b06c8cb21fe6b96714e6662"
"hash" : "8ad8352b077ae02820ebbbae26dc669b"
},
"gradient-menu-selected" : {
"name" : "gradient-menu-selected",
"rule" : ".gradient-menu-selected, .phabricator-side-menu .phabricator-menu-item-selected, .device-desktop .phabricator-side-menu a.phabricator-menu-item-selected:hover, .phabricator-nav-local a.phabricator-active-nav-focus",
"hash" : "9b4b039fba177b90bc26f0e6eece339d"
"hash" : "815bafb94e11c23e1a419ea85dcae113"
}
},
"scales" : [

File diff suppressed because it is too large Load diff

View file

@ -4,52 +4,52 @@
"app" : {
"name" : "app",
"rule" : ".menu-icon-app",
"hash" : "fc525b5b3e3ecaeda3baccc18ace5a0a"
"hash" : "a389f99d9c00f688e625da71579ee90a"
},
"arrow-right" : {
"name" : "arrow-right",
"rule" : ".phabricator-crumb-divider",
"hash" : "50180da0aed206c9db2bc1547c1a158c"
"hash" : "a994209450dc73a80841cdd66bb59925"
},
"conf-hover" : {
"name" : "conf-hover",
"rule" : ".alert-notifications:hover .phabricator-main-menu-message-icon",
"hash" : "febc4135b2821ae2d3f0b06aa295ca0d"
"hash" : "93d734a7e87293c4fcb24f7096ed79f9"
},
"conf-off" : {
"name" : "conf-off",
"rule" : ".alert-notifications .phabricator-main-menu-message-icon",
"hash" : "dc1b05cb611eaef76a09e8cff698c99d"
"hash" : "967b7aeaccc0ed5ffe9193f7c6c6f94d"
},
"conf-unseen" : {
"name" : "conf-unseen",
"rule" : ".alert-notifications.message-unread .phabricator-main-menu-message-icon",
"hash" : "1f7d54b2b9781099f867b100ebdd6c6a"
"hash" : "034860de0f2e4ed924384a019077a094"
},
"eye" : {
"name" : "eye",
"rule" : ".menu-icon-eye",
"hash" : "553eb617c19b74b428558e606ff9b066"
"hash" : "d598b1acb1933a86eaed3dea3347f7b0"
},
"logo" : {
"name" : "logo",
"rule" : ".phabricator-main-menu-logo-image",
"hash" : "6eadea2c3dd2ada989eba22b6769b3eb"
"hash" : "c6c7ab165dce13a51ef329928c7c4aba"
},
"seen_have_unread" : {
"name" : "seen_have_unread",
"rule" : ".alert-notifications:hover .phabricator-main-menu-alert-icon",
"hash" : "03a02951857811c722732dcfff9d458e"
"hash" : "a8a7f07caa726d7e61ef3d41f959d94d"
},
"seen_read_all" : {
"name" : "seen_read_all",
"rule" : ".alert-notifications .phabricator-main-menu-alert-icon",
"hash" : "f166fc60ed7a7a8ec2f41ab1af2cb3ec"
"hash" : "4fdd4807d0c41bd4179dd43150c7fc44"
},
"unseen_any" : {
"name" : "unseen_any",
"rule" : ".alert-notifications.alert-unread .phabricator-main-menu-alert-icon",
"hash" : "a8643b150166a076e81a42e5893a899f"
"hash" : "50d946952c73028b34e0c3378ca36b17"
}
},
"scales" : [

View file

@ -0,0 +1,90 @@
{
"version" : 1,
"sprites" : {
"token-coin-1" : {
"name" : "token-coin-1",
"rule" : ".token-coin-1",
"hash" : "124174168031b47dfd98273d2d6f369a"
},
"token-coin-2" : {
"name" : "token-coin-2",
"rule" : ".token-coin-2",
"hash" : "a4811c8387caec31e4a313b32abe7026"
},
"token-coin-3" : {
"name" : "token-coin-3",
"rule" : ".token-coin-3",
"hash" : "0ecd0e9e5cce27e059a68ceb80e57e3b"
},
"token-coin-4" : {
"name" : "token-coin-4",
"rule" : ".token-coin-4",
"hash" : "d88e727312274f4bd534ee5314fba833"
},
"token-heart-1" : {
"name" : "token-heart-1",
"rule" : ".token-heart-1",
"hash" : "433df7ae11d6651a1f5d6f1c94a85c98"
},
"token-heart-2" : {
"name" : "token-heart-2",
"rule" : ".token-heart-2",
"hash" : "d582a288d9da8685f61a392aa2e288e5"
},
"token-like-1" : {
"name" : "token-like-1",
"rule" : ".token-like-1",
"hash" : "1b1fd7b15d0ee5eb95371f7ff673025b"
},
"token-like-2" : {
"name" : "token-like-2",
"rule" : ".token-like-2",
"hash" : "2ea96cf3f0f43c9efda61a3430a49d90"
},
"token-medal-1" : {
"name" : "token-medal-1",
"rule" : ".token-medal-1",
"hash" : "081e1d0e2092b8035e6d1ba1181d000e"
},
"token-medal-2" : {
"name" : "token-medal-2",
"rule" : ".token-medal-2",
"hash" : "958e386989d555a9a8b86bf16ce89cb6"
},
"token-medal-3" : {
"name" : "token-medal-3",
"rule" : ".token-medal-3",
"hash" : "da3459e708a19b4ee8bc1464fb2b4423"
},
"token-medal-4" : {
"name" : "token-medal-4",
"rule" : ".token-medal-4",
"hash" : "84ac1a2000629dd0399f8083c4fa882b"
},
"token-misc-1" : {
"name" : "token-misc-1",
"rule" : ".token-misc-1",
"hash" : "fc021cdb987939a90c101691c9270736"
},
"token-misc-2" : {
"name" : "token-misc-2",
"rule" : ".token-misc-2",
"hash" : "cdb68aa37c891238c083dab250ea40b7"
},
"token-misc-3" : {
"name" : "token-misc-3",
"rule" : ".token-misc-3",
"hash" : "0596b11b19dcdf20e7fb2a38e9f6c704"
},
"token-misc-4" : {
"name" : "token-misc-4",
"rule" : ".token-misc-4",
"hash" : "45f756d650ee729d3593b5afb3351611"
}
},
"scales" : [
1
],
"header" : "\/**\n * @provides sprite-tokens-css\n * @generated\n *\/\n\n.sprite-tokens {\n background-image: url(\/rsrc\/image\/sprite-tokens.png);\n background-repeat: no-repeat;\n}\n\n\n",
"type" : "standard"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 716 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 692 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 826 B

View file

@ -0,0 +1,18 @@
CREATE TABLE {$NAMESPACE}_token.token_given (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
tokenPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
dateCreated INT UNSIGNED NOT NULL,
dateModified INT UNSIGNED NOT NULL,
UNIQUE KEY `key_all` (objectPHID, authorPHID),
KEY `key_author` (authorPHID),
KEY `key_token` (tokenPHID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE {$NAMESPACE}_token.token_count (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin,
tokenCount INT NOT NULL,
UNIQUE KEY `key_objectPHID` (objectPHID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View file

@ -32,6 +32,7 @@ $sheets = array(
'apps' => $generator->buildAppsSheet(),
'conph' => $generator->buildConpherenceSheet(),
'apps-large' => $generator->buildAppsLargeSheet(),
'tokens' => $generator->buildTokenSheet(),
// TODO: @chad: should we actually remove this?
// 'apps-xlarge' => $generator->buildAppsXLargeSheet(),
'gradient' => $generator->buildGradientSheet(),

View file

@ -532,6 +532,13 @@ celerity_register_resource_map(array(
'disk' => '/rsrc/image/sprite-menu.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/dark-menu-hover.png' =>
array(
'hash' => 'a214a732644be34872e895b338b5d639',
@ -2861,7 +2868,7 @@ celerity_register_resource_map(array(
),
'phabricator-pinboard-view-css' =>
array(
'uri' => '/res/fdb2470f/rsrc/css/layout/phabricator-pinboard-view.css',
'uri' => '/res/b954ccbf/rsrc/css/layout/phabricator-pinboard-view.css',
'type' => 'css',
'requires' =>
array(
@ -3336,7 +3343,7 @@ celerity_register_resource_map(array(
),
'sprite-conpher-css' =>
array(
'uri' => '/res/89821322/rsrc/css/sprite-conph.css',
'uri' => '/res/f640f0c5/rsrc/css/sprite-conph.css',
'type' => 'css',
'requires' =>
array(
@ -3370,6 +3377,15 @@ celerity_register_resource_map(array(
),
'disk' => '/rsrc/css/sprite-menu.css',
),
'sprite-tokens-css' =>
array(
'uri' => '/res/9ae0de5b/rsrc/css/sprite-tokens.css',
'type' => 'css',
'requires' =>
array(
),
'disk' => '/rsrc/css/sprite-tokens.css',
),
'stripe-core' =>
array(
'uri' => '/res/3b0f0ad4/rsrc/js/stripe/stripe_core.js',
@ -3397,6 +3413,15 @@ celerity_register_resource_map(array(
),
'disk' => '/rsrc/css/core/syntax.css',
),
'tokens-css' =>
array(
'uri' => '/res/c1f6113c/rsrc/css/application/tokens/tokens.css',
'type' => 'css',
'requires' =>
array(
),
'disk' => '/rsrc/css/application/tokens/tokens.css',
),
), array(
'packages' =>
array(

View file

@ -182,6 +182,10 @@ phutil_register_library_map(array(
'ConduitAPI_repository_create_Method' => 'applications/repository/conduit/ConduitAPI_repository_create_Method.php',
'ConduitAPI_repository_query_Method' => 'applications/repository/conduit/ConduitAPI_repository_query_Method.php',
'ConduitAPI_slowvote_info_Method' => 'applications/slowvote/conduit/ConduitAPI_slowvote_info_Method.php',
'ConduitAPI_token_Method' => 'applications/tokens/conduit/ConduitAPI_token_Method.php',
'ConduitAPI_token_give_Method' => 'applications/tokens/conduit/ConduitAPI_token_give_Method.php',
'ConduitAPI_token_given_Method' => 'applications/tokens/conduit/ConduitAPI_token_given_Method.php',
'ConduitAPI_token_query_Method' => 'applications/tokens/conduit/ConduitAPI_token_query_Method.php',
'ConduitAPI_user_Method' => 'applications/people/conduit/ConduitAPI_user_Method.php',
'ConduitAPI_user_addstatus_Method' => 'applications/people/conduit/ConduitAPI_user_addstatus_Method.php',
'ConduitAPI_user_disable_Method' => 'applications/people/conduit/ConduitAPI_user_disable_Method.php',
@ -664,6 +668,7 @@ phutil_register_library_map(array(
'PhabricatorApplicationSlowvote' => 'applications/slowvote/application/PhabricatorApplicationSlowvote.php',
'PhabricatorApplicationStatusView' => 'applications/meta/view/PhabricatorApplicationStatusView.php',
'PhabricatorApplicationSubscriptions' => 'applications/subscriptions/application/PhabricatorApplicationSubscriptions.php',
'PhabricatorApplicationTokens' => 'applications/tokens/application/PhabricatorApplicationTokens.php',
'PhabricatorApplicationTransaction' => 'applications/transactions/storage/PhabricatorApplicationTransaction.php',
'PhabricatorApplicationTransactionComment' => 'applications/transactions/storage/PhabricatorApplicationTransactionComment.php',
'PhabricatorApplicationTransactionCommentEditController' => 'applications/transactions/controller/PhabricatorApplicationTransactionCommentEditController.php',
@ -1323,6 +1328,18 @@ phutil_register_library_map(array(
'PhabricatorTimelineIterator' => 'infrastructure/daemon/timeline/cursor/PhabricatorTimelineIterator.php',
'PhabricatorTimelineView' => 'view/layout/PhabricatorTimelineView.php',
'PhabricatorTimer' => 'applications/countdown/storage/PhabricatorTimer.php',
'PhabricatorToken' => 'applications/tokens/storage/PhabricatorToken.php',
'PhabricatorTokenController' => 'applications/tokens/controller/PhabricatorTokenController.php',
'PhabricatorTokenCount' => 'applications/tokens/storage/PhabricatorTokenCount.php',
'PhabricatorTokenDAO' => 'applications/tokens/storage/PhabricatorTokenDAO.php',
'PhabricatorTokenGiveController' => 'applications/tokens/controller/PhabricatorTokenGiveController.php',
'PhabricatorTokenGiven' => 'applications/tokens/storage/PhabricatorTokenGiven.php',
'PhabricatorTokenGivenController' => 'applications/tokens/controller/PhabricatorTokenGivenController.php',
'PhabricatorTokenGivenEditor' => 'applications/tokens/editor/PhabricatorTokenGivenEditor.php',
'PhabricatorTokenGivenQuery' => 'applications/tokens/query/PhabricatorTokenGivenQuery.php',
'PhabricatorTokenQuery' => 'applications/tokens/query/PhabricatorTokenQuery.php',
'PhabricatorTokenReceiverInterface' => 'applications/tokens/interface/PhabricatorTokenReceiverInterface.php',
'PhabricatorTokenUIEventListener' => 'applications/tokens/event/PhabricatorTokenUIEventListener.php',
'PhabricatorTransactionView' => 'view/layout/PhabricatorTransactionView.php',
'PhabricatorTransactions' => 'applications/transactions/constants/PhabricatorTransactions.php',
'PhabricatorTransformedFile' => 'applications/files/storage/PhabricatorTransformedFile.php',
@ -1683,6 +1700,10 @@ phutil_register_library_map(array(
'ConduitAPI_repository_create_Method' => 'ConduitAPI_repository_Method',
'ConduitAPI_repository_query_Method' => 'ConduitAPI_repository_Method',
'ConduitAPI_slowvote_info_Method' => 'ConduitAPIMethod',
'ConduitAPI_token_Method' => 'ConduitAPIMethod',
'ConduitAPI_token_give_Method' => 'ConduitAPI_token_Method',
'ConduitAPI_token_given_Method' => 'ConduitAPI_token_Method',
'ConduitAPI_token_query_Method' => 'ConduitAPI_token_Method',
'ConduitAPI_user_Method' => 'ConduitAPIMethod',
'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method',
'ConduitAPI_user_disable_Method' => 'ConduitAPI_user_Method',
@ -1817,7 +1838,12 @@ phutil_register_library_map(array(
'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialReviewerStatsTestCase' => 'PhabricatorTestCase',
'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialRevision' => 'DifferentialDAO',
'DifferentialRevision' =>
array(
0 => 'DifferentialDAO',
1 => 'PhabricatorTokenReceiverInterface',
2 => 'PhabricatorPolicyInterface',
),
'DifferentialRevisionCommentListView' => 'AphrontView',
'DifferentialRevisionCommentView' => 'AphrontView',
'DifferentialRevisionDetailView' => 'AphrontView',
@ -2112,6 +2138,7 @@ phutil_register_library_map(array(
'PhabricatorApplicationSlowvote' => 'PhabricatorApplication',
'PhabricatorApplicationStatusView' => 'AphrontView',
'PhabricatorApplicationSubscriptions' => 'PhabricatorApplication',
'PhabricatorApplicationTokens' => 'PhabricatorApplication',
'PhabricatorApplicationTransaction' =>
array(
0 => 'PhabricatorLiskDAO',
@ -2741,6 +2768,25 @@ phutil_register_library_map(array(
'PhabricatorTimelineIterator' => 'Iterator',
'PhabricatorTimelineView' => 'AphrontView',
'PhabricatorTimer' => 'PhabricatorCountdownDAO',
'PhabricatorToken' =>
array(
0 => 'PhabricatorTokenDAO',
1 => 'PhabricatorPolicyInterface',
),
'PhabricatorTokenController' => 'PhabricatorController',
'PhabricatorTokenCount' => 'PhabricatorTokenDAO',
'PhabricatorTokenDAO' => 'PhabricatorLiskDAO',
'PhabricatorTokenGiveController' => 'PhabricatorTokenController',
'PhabricatorTokenGiven' =>
array(
0 => 'PhabricatorTokenDAO',
1 => 'PhabricatorPolicyInterface',
),
'PhabricatorTokenGivenController' => 'PhabricatorTokenController',
'PhabricatorTokenGivenEditor' => 'PhabricatorEditor',
'PhabricatorTokenGivenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorTokenQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorTokenUIEventListener' => 'PhutilEventListener',
'PhabricatorTransactionView' => 'AphrontView',
'PhabricatorTransformedFile' => 'PhabricatorFileDAO',
'PhabricatorTranslationsConfigOptions' => 'PhabricatorApplicationConfigOptions',
@ -2853,6 +2899,7 @@ phutil_register_library_map(array(
1 => 'PhabricatorMarkupInterface',
2 => 'PhabricatorPolicyInterface',
3 => 'PhabricatorSubscribableInterface',
4 => 'PhabricatorTokenReceiverInterface',
),
'PholioMockCommentController' => 'PholioController',
'PholioMockEditController' => 'PholioController',

View file

@ -1,6 +1,7 @@
<?php
final class DifferentialRevision extends DifferentialDAO {
final class DifferentialRevision extends DifferentialDAO
implements PhabricatorTokenReceiverInterface, PhabricatorPolicyInterface {
protected $title;
protected $originalTitle;
@ -311,4 +312,19 @@ final class DifferentialRevision extends DifferentialDAO {
return $this;
}
public function getCapabilities() {
return array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
);
}
public function getPolicy($capability) {
return PhabricatorPolicies::POLICY_USER;
}
public function hasAutomaticCapability($capability, PhabricatorUser $user) {
return false;
}
}

View file

@ -58,7 +58,10 @@ final class DifferentialRevisionDetailView extends AphrontView {
$actions->addAction($obj);
}
$properties = new PhabricatorPropertyListView();
$properties = id(new PhabricatorPropertyListView())
->setUser($user)
->setObject($revision);
$status = $revision->getStatus();
$local_vcs = $this->getDiff()->getSourceControlSystem();

View file

@ -424,7 +424,9 @@ final class ManiphestTaskDetailController extends ManiphestController {
$viewer = $this->getRequest()->getUser();
$view = new PhabricatorPropertyListView();
$view = id(new PhabricatorPropertyListView())
->setUser($viewer)
->setObject($task);
$view->addProperty(
pht('Assigned To'),
@ -511,6 +513,8 @@ final class ManiphestTaskDetailController extends ManiphestController {
$file_view->render());
}
$view->invokeWillRenderEvent();
if (strlen($task->getDescription())) {
$view->addSectionHeader(pht('Description'));
$view->addTextContent(

View file

@ -4,7 +4,10 @@
* @group maniphest
*/
final class ManiphestTask extends ManiphestDAO
implements PhabricatorMarkupInterface {
implements
PhabricatorMarkupInterface,
PhabricatorPolicyInterface,
PhabricatorTokenReceiverInterface {
const MARKUP_FIELD_DESCRIPTION = 'markup:desc';
@ -261,4 +264,23 @@ final class ManiphestTask extends ManiphestDAO
return (bool)$this->getID();
}
/* -( Policy Interface )--------------------------------------------------- */
public function getCapabilities() {
return array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
);
}
public function getPolicy($capability) {
return PhabricatorPolicies::POLICY_USER;
}
public function hasAutomaticCapability($capability, PhabricatorUser $user) {
return false;
}
}

View file

@ -122,7 +122,9 @@ final class PholioMockViewController extends PholioController {
$user = $this->getRequest()->getUser();
$properties = new PhabricatorPropertyListView();
$properties = id(new PhabricatorPropertyListView())
->setUser($user)
->setObject($mock);
$properties->addProperty(
pht('Author'),
@ -154,6 +156,8 @@ final class PholioMockViewController extends PholioController {
pht('Subscribers'),
$sub_view);
$properties->invokeWillRenderEvent();
$properties->addTextContent(
$engine->getOutput($mock, PholioMock::MARKUP_FIELD_DESCRIPTION));

View file

@ -7,7 +7,8 @@ final class PholioMock extends PholioDAO
implements
PhabricatorMarkupInterface,
PhabricatorPolicyInterface,
PhabricatorSubscribableInterface {
PhabricatorSubscribableInterface,
PhabricatorTokenReceiverInterface {
const MARKUP_FIELD_DESCRIPTION = 'markup:description';

View file

@ -0,0 +1,45 @@
<?php
final class PhabricatorApplicationTokens extends PhabricatorApplication {
public function getName() {
return pht('Tokens');
}
public function isBeta() {
return true;
}
public function getBaseURI() {
return '/token/';
}
public function getTitleGlyph() {
return "\xE2\x99\xA6";
}
public function getShortDescription() {
return pht('Acquire Trinkets');
}
public function getApplicationGroup() {
return self::GROUP_UTILITIES;
}
public function getRoutes() {
return array(
'/token/' => array(
'' => 'PhabricatorTokenGivenController',
'given/' => 'PhabricatorTokenGivenController',
'give/(?<phid>[^/]+)/' => 'PhabricatorTokenGiveController',
),
);
}
public function getEventListeners() {
return array(
new PhabricatorTokenUIEventListener(),
);
}
}

View file

@ -0,0 +1,41 @@
<?php
abstract class ConduitAPI_token_Method extends ConduitAPIMethod {
public function getMethodStatus() {
return self::METHOD_STATUS_UNSTABLE;
}
public function buildTokenDicts(array $tokens) {
assert_instances_of($tokens, 'PhabricatorToken');
$list = array();
foreach ($tokens as $token) {
$list[] = array(
'id' => $token->getID(),
'name' => $token->getName(),
'phid' => $token->getPHID(),
);
}
return $list;
}
public function buildTokenGivenDicts(array $tokens_given) {
assert_instances_of($tokens_given, 'PhabricatorTokenGiven');
$list = array();
foreach ($tokens_given as $given) {
$list[] = array(
'authorPHID' => $given->getAuthorPHID(),
'objectPHID' => $given->getObjectPHID(),
'tokenPHID' => $given->getTokenPHID(),
'dateCreated' => $given->getDateCreated(),
);
}
return $list;
}
}

View file

@ -0,0 +1,37 @@
<?php
final class ConduitAPI_token_give_Method extends ConduitAPI_token_Method {
public function getMethodDescription() {
return pht('Give or change a token.');
}
public function defineParamTypes() {
return array(
'tokenPHID' => 'phid|null',
'objectPHID' => 'phid',
);
}
public function defineErrorTypes() {
return array();
}
public function defineReturnType() {
return 'void';
}
public function execute(ConduitAPIRequest $request) {
$editor = id(new PhabricatorTokenGivenEditor())
->setActor($request->getUser());
if ($request->getValue('tokenPHID')) {
$editor->addToken(
$request->getValue('objectPHID'),
$request->getValue('tokenPHID'));
} else {
$editor->deleteToken($request->getValue('objectPHID'));
}
}
}

View file

@ -0,0 +1,49 @@
<?php
final class ConduitAPI_token_given_Method extends ConduitAPI_token_Method {
public function getMethodDescription() {
return pht('Query tokens given to objects.');
}
public function defineParamTypes() {
return array(
'authorPHIDs' => 'list<phid>',
'objectPHIDs' => 'list<phid>',
'tokenPHIDs' => 'list<phid>',
);
}
public function defineErrorTypes() {
return array();
}
public function defineReturnType() {
return 'list<dict>';
}
public function execute(ConduitAPIRequest $request) {
$query = id(new PhabricatorTokenGivenQuery())
->setViewer($request->getUser());
$author_phids = $request->getValue('authorPHIDs');
if ($author_phids) {
$query->withAuthorPHIDs($author_phids);
}
$object_phids = $request->getValue('objectPHIDs');
if ($object_phids) {
$query->withObjectPHIDs($object_phids);
}
$token_phids = $request->getValue('tokenPHIDs');
if ($token_phids) {
$query->withTokenPHIDs($token_phids);
}
$given = $query->execute();
return $this->buildTokenGivenDicts($given);
}
}

View file

@ -0,0 +1,30 @@
<?php
final class ConduitAPI_token_query_Method extends ConduitAPI_token_Method {
public function getMethodDescription() {
return pht('Query tokens.');
}
public function defineParamTypes() {
return array();
}
public function defineReturnType() {
return 'list<dict>';
}
public function defineErrorTypes() {
return array();
}
public function execute(ConduitAPIRequest $request) {
$query = id(new PhabricatorTokenQuery())
->setViewer($request->getUser());
$tokens = $query->execute();
return $this->buildTokenDicts($tokens);
}
}

View file

@ -0,0 +1,16 @@
<?php
abstract class PhabricatorTokenController extends PhabricatorController {
protected function buildSideNav() {
$nav = new AphrontSideNavFilterView();
$nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
$nav->addFilter('given/', pht('Tokens Given'));
return $nav;
}
}

View file

@ -0,0 +1,116 @@
<?php
final class PhabricatorTokenGiveController extends PhabricatorTokenController {
private $phid;
public function willProcessRequest(array $data) {
$this->phid = $data['phid'];
}
public function processRequest() {
$request = $this->getRequest();
$user = $request->getUser();
$handle = PhabricatorObjectHandleData::loadOneHandle($this->phid, $user);
if (!$handle->isComplete()) {
return new Aphront404Response();
}
$current = id(new PhabricatorTokenGivenQuery())
->setViewer($user)
->withAuthorPHIDs(array($user->getPHID()))
->withObjectPHIDs(array($handle->getPHID()))
->execute();
if ($current) {
$is_give = false;
$title = pht('Rescind Token');
} else {
$is_give = true;
$title = pht('Give Token');
}
$done_uri = $handle->getURI();
if ($request->isDialogFormPost()) {
if ($is_give) {
$token_phid = $request->getStr('tokenPHID');
$editor = id(new PhabricatorTokenGivenEditor())
->setActor($user)
->addToken($handle->getPHID(), $token_phid);
} else {
$editor = id(new PhabricatorTokenGivenEditor())
->setActor($user)
->deleteToken($handle->getPHID());
}
return id(new AphrontReloadResponse())->setURI($done_uri);
}
if ($is_give) {
$dialog = $this->buildGiveTokenDialog();
} else {
$dialog = $this->buildRescindTokenDialog(head($current));
}
$dialog->setUser($user);
$dialog->addCancelButton($done_uri);
return id(new AphrontDialogResponse())->setDialog($dialog);
}
private function buildGiveTokenDialog() {
$user = $this->getRequest()->getUser();
$tokens = id(new PhabricatorTokenQuery())
->setViewer($user)
->execute();
$buttons = array();
$ii = 0;
foreach ($tokens as $token) {
$buttons[] = javelin_tag(
'button',
array(
'class' => 'token-button',
'name' => 'tokenPHID',
'value' => $token->getPHID(),
'type' => 'submit',
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $token->getName(),
)
),
$token->renderIcon());
if ((++$ii % 4) == 0) {
$buttons[] = phutil_tag('br');
}
}
$buttons = phutil_tag(
'div',
array(
'class' => 'token-grid',
),
$buttons);
$dialog = new AphrontDialogView();
$dialog->setTitle(pht('Give Token'));
$dialog->appendChild($buttons);
return $dialog;
}
private function buildRescindTokenDialog(PhabricatorTokenGiven $token_given) {
$dialog = new AphrontDialogView();
$dialog->setTitle(pht('Rescind Token'));
$dialog->appendChild(
pht('Really rescind this lovely token?'));
$dialog->addSubmitButton(pht('Rescind Token'));
return $dialog;
}
}

View file

@ -0,0 +1,79 @@
<?php
final class PhabricatorTokenGivenController extends PhabricatorTokenController {
public function processRequest() {
$request = $this->getRequest();
$user = $request->getUser();
$pager = id(new AphrontCursorPagerView())
->setURI(new PhutilURI($this->getApplicationURI('/given/')));
$tokens_given = id(new PhabricatorTokenGivenQuery())
->setViewer($user)
->setLimit(100)
->executeWithCursorPager($pager);
$handles = array();
if ($tokens_given) {
$object_phids = mpull($tokens_given, 'getObjectPHID');
$user_phids = mpull($tokens_given, 'getAuthorPHID');
$handle_phids = array_merge($object_phids, $user_phids);
$handles = id(new PhabricatorObjectHandleData($handle_phids))
->setViewer($user)
->loadHandles();
}
$tokens = array();
if ($tokens_given) {
$token_phids = mpull($tokens_given, 'getTokenPHID');
$tokens = id(new PhabricatorTokenQuery())
->setViewer($user)
->withPHIDs($token_phids)
->execute();
$tokens = mpull($tokens, null, 'getPHID');
}
$list = new PhabricatorObjectItemListView();
foreach ($tokens_given as $token_given) {
$handle = $handles[$token_given->getObjectPHID()];
$token = idx($tokens, $token_given->getTokenPHID());
$item = id(new PhabricatorObjectItemView());
$item->setHeader($handle->getFullName());
$item->setHref($handle->getURI());
$item->addAttribute($token->renderIcon());
$item->addAttribute(
pht(
'Given by %s on %s',
$handles[$token_given->getAuthorPHID()]->renderLink(),
phabricator_date($token_given->getDateCreated(), $user)));
$list->addItem($item);
}
$title = pht('Tokens Given');
$nav = $this->buildSideNav();
$nav->setCrumbs(
$this->buildApplicationCrumbs()
->addCrumb(
id(new PhabricatorCrumbView())
->setName($title)));
$nav->selectFilter('given/');
$nav->appendChild($list);
$nav->appendChild($pager);
return $this->buildApplicationPage(
$nav,
array(
'title' => $title,
'device' => true,
));
}
}

View file

@ -0,0 +1,91 @@
<?php
final class PhabricatorTokenGivenEditor
extends PhabricatorEditor {
public function addToken($object_phid, $token_phid) {
$token = $this->validateToken($token_phid);
$handle = $this->validateObject($object_phid);
$actor = $this->requireActor();
$token_given = id(new PhabricatorTokenGiven())
->setAuthorPHID($actor->getPHID())
->setObjectPHID($handle->getPHID())
->setTokenPHID($token->getPHID());
$token_given->openTransaction();
$this->executeDeleteToken($handle);
$token_given->save();
queryfx(
$token_given->establishConnection('w'),
'INSERT INTO %T (objectPHID, tokenCount) VALUES (%s, 1)
ON DUPLICATE KEY UPDATE tokenCount = tokenCount + 1',
id(new PhabricatorTokenCount())->getTableName(),
$handle->getPHID());
$token_given->saveTransaction();
return $token_given;
}
public function deleteToken($object_phid) {
$handle = $this->validateObject($object_phid);
return $this->executeDeleteToken($handle);
}
private function executeDeleteToken(PhabricatorObjectHandle $handle) {
$actor = $this->requireActor();
$token_given = id(new PhabricatorTokenGiven())->loadOneWhere(
'authorPHID = %s AND objectPHID = %s',
$actor->getPHID(),
$handle->getPHID());
if (!$token_given) {
return;
}
$token_given->openTransaction();
$token_given->delete();
queryfx(
$token_given->establishConnection('w'),
'INSERT INTO %T (objectPHID, tokenCount) VALUES (%s, 0)
ON DUPLICATE KEY UPDATE tokenCount = tokenCount - 1',
id(new PhabricatorTokenCount())->getTableName(),
$handle->getPHID());
$token_given->saveTransaction();
}
private function validateToken($token_phid) {
$tokens = id(new PhabricatorTokenQuery())
->setViewer($this->requireActor())
->withPHIDs(array($token_phid))
->execute();
if (empty($tokens)) {
throw new Exception("No such token!");
}
return head($tokens);
}
private function validateObject($object_phid) {
$handle = PhabricatorObjectHandleData::loadOneHandle(
$object_phid,
$this->requireActor());
if (!$handle->isComplete()) {
throw new Exception("No such object!");
}
return $handle;
}
}

View file

@ -0,0 +1,121 @@
<?php
final class PhabricatorTokenUIEventListener
extends PhutilEventListener {
public function register() {
$this->listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS);
$this->listen(PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES);
}
public function handleEvent(PhutilEvent $event) {
switch ($event->getType()) {
case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS:
$this->handleActionEvent($event);
break;
case PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES:
$this->handlePropertyEvent($event);
break;
}
}
private function handleActionEvent($event) {
$user = $event->getUser();
$object = $event->getValue('object');
if (!$object || !$object->getPHID()) {
// No object, or the object has no PHID yet..
return;
}
if (!($object instanceof PhabricatorTokenReceiverInterface)) {
// This object isn't a token receiver.
return;
}
$current = id(new PhabricatorTokenGivenQuery())
->setViewer($user)
->withAuthorPHIDs(array($user->getPHID()))
->withObjectPHIDs(array($object->getPHID()))
->execute();
if (!$current) {
$token_action = id(new PhabricatorActionView())
->setUser($user)
->setWorkflow(true)
->setHref('/token/give/'.$object->getPHID().'/')
->setName(pht('Give Token'))
->setIcon('like');
} else {
$token_action = id(new PhabricatorActionView())
->setUser($user)
->setWorkflow(true)
->setHref('/token/give/'.$object->getPHID().'/')
->setName(pht('Rescind Token'))
->setIcon('dislike');
}
$actions = $event->getValue('actions');
$actions[] = $token_action;
$event->setValue('actions', $actions);
}
private function handlePropertyEvent($event) {
$user = $event->getUser();
$object = $event->getValue('object');
if (!$object || !$object->getPHID()) {
// No object, or the object has no PHID yet..
return;
}
if (!($object instanceof PhabricatorTokenReceiverInterface)) {
// This object isn't a token receiver.
return;
}
$limit = 1;
$tokens_given = id(new PhabricatorTokenGivenQuery())
->setViewer($user)
->withObjectPHIDs(array($object->getPHID()))
->execute();
if (!$tokens_given) {
return;
}
$tokens = id(new PhabricatorTokenQuery())
->setViewer($user)
->withPHIDs(mpull($tokens_given, 'getTokenPHID'))
->execute();
$tokens = mpull($tokens, null, 'getPHID');
$author_phids = mpull($tokens_given, 'getAuthorPHID');
$handles = id(new PhabricatorObjectHandleData($author_phids))
->loadHandles();
$list = array();
foreach ($tokens_given as $token_given) {
if (!idx($tokens, $token_given->getTokenPHID())) {
continue;
}
$token = $tokens[$token_given->getTokenPHID()];
$list[] = javelin_tag(
'span',
array(
'sigil' => 'has-tooltip',
'meta' => array(
'tip' => $handles[$token_given->getAuthorPHID()]->getName(),
),
),
$token->renderIcon());
}
$view = $event->getValue('view');
$view->addProperty(pht('Tokens'), $list);
}
}

View file

@ -0,0 +1,5 @@
<?php
interface PhabricatorTokenReceiverInterface {
}

View file

@ -0,0 +1,89 @@
<?php
final class PhabricatorTokenGivenQuery
extends PhabricatorCursorPagedPolicyAwareQuery {
private $authorPHIDs;
private $objectPHIDs;
private $tokenPHIDs;
public function withTokenPHIDs(array $token_phids) {
$this->tokenPHIDs = $token_phids;
return $this;
}
public function withObjectPHIDs(array $object_phids) {
$this->objectPHIDs = $object_phids;
return $this;
}
public function withAuthorPHIDs(array $author_phids) {
$this->authorPHIDs = $author_phids;
return $this;
}
public function loadPage() {
$table = new PhabricatorTokenGiven();
$conn_r = $table->establishConnection('r');
$rows = queryfx_all(
$conn_r,
'SELECT * FROM %T %Q %Q %Q',
$table->getTableName(),
$this->buildWhereClause($conn_r),
$this->buildOrderClause($conn_r),
$this->buildLimitClause($conn_r));
return $table->loadAllFromArray($rows);
}
private function buildWhereClause(AphrontDatabaseConnection $conn_r) {
$where = array();
if ($this->authorPHIDs) {
$where[] = qsprintf(
$conn_r,
'authorPHID IN (%Ls)',
$this->authorPHIDs);
}
if ($this->objectPHIDs) {
$where[] = qsprintf(
$conn_r,
'objectPHID IN (%Ls)',
$this->objectPHIDs);
}
if ($this->tokenPHIDs) {
$where[] = qsprintf(
$conn_r,
'tokenPHID IN (%Ls)',
$this->tokenPHIDs);
}
return $this->formatWhereClause($where);
}
public function willFilterPage(array $results) {
$object_phids = array_filter(mpull($results, 'getObjectPHID'));
if (!$object_phids) {
return array();
}
$objects = id(new PhabricatorObjectHandleData($object_phids))
->setViewer($this->getViewer())
->loadObjects();
foreach ($results as $key => $result) {
$phid = $result->getObjectPHID();
if (empty($objects[$phid])) {
unset($results[$key]);
} else {
$result->attachObject($objects[$phid]);
}
}
return $results;
}
}

View file

@ -0,0 +1,62 @@
<?php
final class PhabricatorTokenQuery
extends PhabricatorCursorPagedPolicyAwareQuery {
private $phids;
public function withPHIDs(array $phids) {
$this->phids = $phids;
return $this;
}
public function loadPage() {
$tokens = $this->getBuiltinTokens();
if ($this->phids) {
$map = array_fill_keys($this->phids, true);
foreach ($tokens as $key => $token) {
if (empty($map[$token->getPHID()])) {
unset($tokens[$key]);
}
}
}
return $tokens;
}
private function getBuiltinTokens() {
$specs = array(
array('like-1', pht('Like')),
array('like-2', pht('Dislike')),
array('heart-1', pht('Love')),
array('heart-2', pht('Heartbreak')),
array('medal-1', pht('Orange Medal')),
array('medal-2', pht('Grey Medal')),
array('medal-3', pht('Yellow Medal')),
array('medal-4', pht('Manufacturing Defect?')),
array('coin-1', pht('Haypence')),
array('coin-2', pht('Piece of Eight')),
array('coin-3', pht('Doubloon')),
array('coin-4', pht('Mountain of Wealth')),
array('misc-1', pht('Pterodactyl')),
array('misc-2', pht('Evil Spooky Haunted Tree')),
array('misc-3', pht('Baby Tequila')),
array('misc-4', pht('The World Burns')),
);
$tokens = array();
foreach ($specs as $id => $spec) {
list($image, $name) = $spec;
$token = id(new PhabricatorToken())
->setID($id)
->setName($name)
->setPHID('PHID-TOKN-'.$image);
$tokens[] = $token;
}
return $tokens;
}
}

View file

@ -0,0 +1,46 @@
<?php
final class PhabricatorToken extends PhabricatorTokenDAO
implements PhabricatorPolicyInterface {
protected $phid;
protected $name;
protected $filePHID;
public function getConfiguration() {
return array(
self::CONFIG_AUX_PHID => true,
) + parent::getConfiguration();
}
public function getCapabilities() {
return array(
PhabricatorPolicyCapability::CAN_VIEW,
);
}
public function getPolicy($capability) {
return PhabricatorPolicies::POLICY_USER;
}
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
return false;
}
public function renderIcon() {
// TODO: Maybe move to a View class?
require_celerity_resource('sprite-tokens-css');
require_celerity_resource('tokens-css');
$sprite = substr($this->getPHID(), 10);
return phutil_tag(
'div',
array(
'class' => 'sprite-tokens token-icon token-'.$sprite,
),
'');
}
}

View file

@ -0,0 +1,15 @@
<?php
final class PhabricatorTokenCount extends PhabricatorTokenDAO {
protected $objectPHID;
protected $tokenCount;
public function getConfiguration() {
return array(
self::CONFIG_IDS => self::IDS_MANUAL,
self::CONFIG_TIMESTAMPS => false,
) + parent::getConfiguration();
}
}

View file

@ -0,0 +1,9 @@
<?php
abstract class PhabricatorTokenDAO extends PhabricatorLiskDAO {
public function getApplicationName() {
return 'token';
}
}

View file

@ -0,0 +1,54 @@
<?php
final class PhabricatorTokenGiven extends PhabricatorTokenDAO
implements PhabricatorPolicyInterface {
protected $authorPHID;
protected $objectPHID;
protected $tokenPHID;
private $object;
public function attachObject(PhabricatorTokenReceiverInterface $object) {
$this->object = $object;
return $this;
}
public function getObject() {
if ($this->object === null) {
throw new Exception("Call attachObject() before getObject()!");
}
return $this->object;
}
public function getCapabilities() {
return array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
);
}
public function getPolicy($capability) {
switch ($capability) {
case PhabricatorPolicyCapability::CAN_VIEW:
return $this->getObject()->getPolicy($capability);
default:
return PhabricatorPolicies::POLICY_NOONE;
}
}
public function hasAutomaticCapability($capability, PhabricatorUser $user) {
switch ($capability) {
case PhabricatorPolicyCapability::CAN_VIEW:
return $this->getObject()->hasAutomaticCapability(
$capability,
$user);
default:
if ($user->getPHID() == $this->authorPHID) {
return true;
}
return false;
}
}
}

View file

@ -176,6 +176,33 @@ final class CeleritySpriteGenerator {
return $sheet;
}
public function buildTokenSheet() {
$tokens = $this->getDirectoryList('tokens_1x');
$template = id(new PhutilSprite())
->setSourceSize(16, 16);
$sprites = array();
foreach ($tokens as $token) {
$path = $this->getPath('tokens_1x/'.$token.'.png');
$sprite = id(clone $template)
->setName('token-'.$token)
->setTargetCSS('.token-'.$token)
->setSourceFile($path, 1);
$sprites[] = $sprite;
}
$sheet = $this->buildSheet('tokens', false);
foreach ($sprites as $sprite) {
$sheet->addSprite($sprite);
}
return $sheet;
}
public function buildConpherenceSheet() {
$icons = $this->getDirectoryList('conpher_1x');
$scales = array(
@ -186,7 +213,7 @@ final class CeleritySpriteGenerator {
->setSourceSize(32, 32);
$sprites = array();
foreach ($icons as $icon) {
foreach ($icons as $icon) {
$color = preg_match('/_on/', $icon) ? 'on' : 'off';
$prefix = 'conpher_';

View file

@ -29,6 +29,7 @@ final class PhabricatorEventType extends PhutilEventType {
const TYPE_UI_WILLRENDEROBJECTS = 'ui.willRenderObjects';
const TYPE_UI_DDIDRENDEROBJECT = 'ui.didRenderObject';
const TYPE_UI_DIDRENDEROBJECTS = 'ui.didRenderObjects';
const TYPE_UI_WILLRENDERPROPERTIES = 'ui.willRenderProperties';
const TYPE_PEOPLE_DIDRENDERMENU = 'people.didRenderMenu';
}

View file

@ -163,6 +163,14 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList {
'type' => 'db',
'name' => 'conpherence',
),
'db.config' => array(
'type' => 'db',
'name' => 'config',
),
'db.token' => array(
'type' => 'db',
'name' => 'token',
),
'0000.legacy.sql' => array(
'type' => 'sql',
'name' => $this->getPatchPath('0000.legacy.sql'),
@ -1068,10 +1076,6 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList {
'type' => 'sql',
'name' => $this->getPatchPath('20121220.generalcache.sql'),
),
'db.config' => array(
'type' => 'db',
'name' => 'config',
),
'20121226.config.sql' => array(
'type' => 'sql',
'name' => $this->getPatchPath('20121226.config.sql'),
@ -1117,6 +1121,10 @@ final class PhabricatorBuiltinPatchList extends PhabricatorSQLPatchList {
'type' => 'sql',
'name' => $this->getPatchPath('20130214.chatlogchannelid.sql'),
),
'20130214.token.sql' => array(
'type' => 'sql',
'name' => $this->getPatchPath('20130214.token.sql'),
),
);
}

View file

@ -4,11 +4,18 @@ final class PhabricatorPropertyListView extends AphrontView {
private $parts = array();
private $hasKeyboardShortcuts;
private $object;
private $invokedWillRenderEvent;
protected function canAppendChild() {
return false;
}
public function setObject($object) {
$this->object = $object;
return $this;
}
public function setHasKeyboardShortcuts($has_keyboard_shortcuts) {
$this->hasKeyboardShortcuts = $has_keyboard_shortcuts;
return $this;
@ -52,7 +59,25 @@ final class PhabricatorPropertyListView extends AphrontView {
return $this;
}
public function invokeWillRenderEvent() {
if ($this->object && $this->getUser() && !$this->invokedWillRenderEvent) {
$event = new PhabricatorEvent(
PhabricatorEventType::TYPE_UI_WILLRENDERPROPERTIES,
array(
'object' => $this->object,
'view' => $this,
));
$event->setUser($this->getUser());
PhutilEventEngine::dispatchEvent($event);
}
$this->invokedWillRenderEvent = true;
}
public function render() {
$this->invokeWillRenderEvent();
require_celerity_resource('phabricator-property-list-view-css');
$items = array();

View file

@ -0,0 +1,27 @@
/**
* @provides tokens-css
*/
.token-icon {
position: relative;
display: inline-block;
width: 16px;
height: 16px;
}
button.token-button {
background: #f6f6f6;
border: 1px solid #333333;
position: relative;
width: 16px;
height: 16px;
padding: 16px;
margin: 8px;
text-shadow: none;
box-shadow: none;
box-sizing: content-box;
}
.token-grid {
text-align: center;
}

View file

@ -5,6 +5,7 @@
.phabricator-pinboard-view {
padding: 20px;
overflow: hidden;
margin: 1em 0;
}
.phabricator-pinboard-item-view {

View file

@ -4,7 +4,7 @@
*/
.sprite-conpher {
background-image: url(/rsrc/image/sprite-conph.png);
background-image: url(/rsrc/image/sprite-conpher.png);
background-repeat: no-repeat;
}
@ -12,7 +12,7 @@
only screen and (min-device-pixel-ratio: 1.5),
only screen and (-webkit-min-device-pixel-ratio: 1.5) {
.sprite-conpher {
background-image: url(/rsrc/image/sprite-conph-X2.png);
background-image: url(/rsrc/image/sprite-conpher-X2.png);
background-size: 132px 132px;
}
}

View file

@ -0,0 +1,76 @@
/**
* @provides sprite-tokens-css
* @generated
*/
.sprite-tokens {
background-image: url(/rsrc/image/sprite-tokens.png);
background-repeat: no-repeat;
}
.token-coin-1 {
background-position: 0px 0px;
}
.token-coin-2 {
background-position: -17px 0px;
}
.token-coin-3 {
background-position: -34px 0px;
}
.token-coin-4 {
background-position: -51px 0px;
}
.token-heart-1 {
background-position: 0px -17px;
}
.token-heart-2 {
background-position: -17px -17px;
}
.token-like-1 {
background-position: -34px -17px;
}
.token-like-2 {
background-position: -51px -17px;
}
.token-medal-1 {
background-position: 0px -34px;
}
.token-medal-2 {
background-position: -17px -34px;
}
.token-medal-3 {
background-position: -34px -34px;
}
.token-medal-4 {
background-position: -51px -34px;
}
.token-misc-1 {
background-position: 0px -51px;
}
.token-misc-2 {
background-position: -17px -51px;
}
.token-misc-3 {
background-position: -34px -51px;
}
.token-misc-4 {
background-position: -51px -51px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB