Index: resources/sprite/manifest/apps-large.json =================================================================== --- resources/sprite/manifest/apps-large.json +++ resources/sprite/manifest/apps-large.json @@ -581,6 +581,26 @@ "rule" : ".apps-new-white-large", "hash" : "be597ce11c4d1630f67282cd7b81cc85" }, + "apps-nuance-blue-large" : { + "name" : "apps-nuance-blue-large", + "rule" : ".apps-nuance-blue-large, .phabricator-crumb-view:hover .apps-nuance-dark-large", + "hash" : "a6c11b6c091b15c93bb75e40f5014c46" + }, + "apps-nuance-dark-large" : { + "name" : "apps-nuance-dark-large", + "rule" : ".apps-nuance-dark-large", + "hash" : "a179a6802048440f0c4dfd99784ad740" + }, + "apps-nuance-light-large" : { + "name" : "apps-nuance-light-large", + "rule" : ".apps-nuance-light-large", + "hash" : "f6f36066f33b015e0e44e125182db158" + }, + "apps-nuance-white-large" : { + "name" : "apps-nuance-white-large", + "rule" : ".apps-nuance-white-large", + "hash" : "8510afe6941a33000ca02a054a3f78e0" + }, "apps-owners-blue-large" : { "name" : "apps-owners-blue-large", "rule" : ".apps-owners-blue-large, .phabricator-crumb-view:hover .apps-owners-dark-large", @@ -621,26 +641,6 @@ "rule" : ".apps-paste-white-large", "hash" : "94cf3ee0f2b15b82ad8f62cb9399ecad" }, - "apps-pebkac-blue-large" : { - "name" : "apps-pebkac-blue-large", - "rule" : ".apps-pebkac-blue-large, .phabricator-crumb-view:hover .apps-pebkac-dark-large", - "hash" : "7a1010119d4589609f364c603cd03d1b" - }, - "apps-pebkac-dark-large" : { - "name" : "apps-pebkac-dark-large", - "rule" : ".apps-pebkac-dark-large", - "hash" : "617142b451eec10fe60246eec52a99d0" - }, - "apps-pebkac-light-large" : { - "name" : "apps-pebkac-light-large", - "rule" : ".apps-pebkac-light-large", - "hash" : "2319b657d0fe3df60b234e8961c4869e" - }, - "apps-pebkac-white-large" : { - "name" : "apps-pebkac-white-large", - "rule" : ".apps-pebkac-white-large", - "hash" : "25eb13ac78cf507b6ec66016cd477cfe" - }, "apps-people-blue-large" : { "name" : "apps-people-blue-large", "rule" : ".apps-people-blue-large, .phabricator-crumb-view:hover .apps-people-dark-large", Index: resources/sprite/manifest/apps.json =================================================================== --- resources/sprite/manifest/apps.json +++ resources/sprite/manifest/apps.json @@ -291,6 +291,16 @@ "rule" : ".apps-new-white", "hash" : "dc5ce42c7d60e6ba37b07631b3c3280a" }, + "apps-nuance-dark" : { + "name" : "apps-nuance-dark", + "rule" : ".apps-nuance-dark", + "hash" : "e20c19670e1c9b9d1f9267bf7f017aba" + }, + "apps-nuance-white" : { + "name" : "apps-nuance-white", + "rule" : ".apps-nuance-white", + "hash" : "368f1241b438492642520a037a1ac294" + }, "apps-owners-dark" : { "name" : "apps-owners-dark", "rule" : ".apps-owners-dark", @@ -311,16 +321,6 @@ "rule" : ".apps-paste-white", "hash" : "ed5ec1ee39cc2a01f568f91c72141bfb" }, - "apps-pebkac-dark" : { - "name" : "apps-pebkac-dark", - "rule" : ".apps-pebkac-dark", - "hash" : "4adb4a8f0a8c5bc5462bb806ceafc63f" - }, - "apps-pebkac-white" : { - "name" : "apps-pebkac-white", - "rule" : ".apps-pebkac-white", - "hash" : "35438c7a295df21aa2fa4771a5c3c986" - }, "apps-people-dark" : { "name" : "apps-people-dark", "rule" : ".apps-people-dark", Index: resources/sql/patches/20131106.nuance-v0.sql =================================================================== --- /dev/null +++ resources/sql/patches/20131106.nuance-v0.sql @@ -0,0 +1,259 @@ +CREATE TABLE {$NAMESPACE}_nuance.nuance_item ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + ownerPHID VARCHAR(64) COLLATE utf8_bin, + requestorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourcePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourceLabel VARCHAR(255), + status INT UNSIGNED NOT NULL, + data longtext NOT NULL COLLATE utf8_bin, + mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + dateNuanced INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_source` (sourcePHID, status, dateNuanced, id), + KEY `key_owner` (ownerPHID, status, dateNuanced, id), + KEY `key_contacter` (requestorPHID, status, dateNuanced, id) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_itemtransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_itemtransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_source ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255), + type INT UNSIGNED NOT NULL, + data longtext NOT NULL COLLATE utf8_bin, + mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL, + editPolicy VARCHAR(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid), + KEY `key_type` (type, dateModified) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_sourcetransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_sourcetransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queue ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + name VARCHAR(255), + mailKey VARCHAR(20) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL, + editPolicy VARCHAR(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queuetransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queuetransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_queueitem ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + queuePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + itemPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + itemStatus INT UNSIGNED NOT NULL, + itemDateNuanced INT UNSIGNED NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_one_per_queue` (itemPHID, queuePHID), + KEY `key_queue` (queuePHID, itemStatus, itemDateNuanced, id) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestor ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + data longtext NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + UNIQUE KEY `key_phid` (phid) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestortransaction ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + objectPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentPHID VARCHAR(64) COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + transactionType VARCHAR(32) NOT NULL COLLATE utf8_bin, + oldValue LONGTEXT NOT NULL COLLATE utf8_bin, + newValue LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + metadata LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + KEY `key_object` (objectPHID) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestortransaction_comment ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + phid VARCHAR(64) NOT NULL COLLATE utf8_bin, + transactionPHID VARCHAR(64) COLLATE utf8_bin, + authorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + viewPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + editPolicy VARCHAR(64) NOT NULL COLLATE utf8_bin, + commentVersion INT UNSIGNED NOT NULL, + content LONGTEXT NOT NULL COLLATE utf8_bin, + contentSource LONGTEXT NOT NULL COLLATE utf8_bin, + isDeleted BOOL NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + + UNIQUE KEY `key_phid` (phid), + UNIQUE KEY `key_version` (transactionPHID, commentVersion) + +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.nuance_requestorsource ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + requestorPHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourcePHID VARCHAR(64) NOT NULL COLLATE utf8_bin, + sourceKey VARCHAR(128) NOT NULL COLLATE utf8_bin, + data LONGTEXT NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + dateModified INT UNSIGNED NOT NULL, + KEY `key_requestor` (requestorPHID, id), + KEY `key_source` (sourcePHID, id), + UNIQUE KEY `key_source_key` (sourcePHID, sourceKey) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.edge ( + src VARCHAR(64) NOT NULL COLLATE utf8_bin, + type VARCHAR(64) NOT NULL COLLATE utf8_bin, + dst VARCHAR(64) NOT NULL COLLATE utf8_bin, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY (src, type, dateCreated, seq) +) ENGINE=InnoDB, COLLATE utf8_general_ci; + +CREATE TABLE {$NAMESPACE}_nuance.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE utf8_bin +) ENGINE=InnoDB, COLLATE utf8_general_ci; Index: src/__phutil_library_map__.php =================================================================== --- src/__phutil_library_map__.php +++ src/__phutil_library_map__.php @@ -830,6 +830,48 @@ 'MetaMTAConstants' => 'applications/metamta/constants/MetaMTAConstants.php', 'MetaMTANotificationType' => 'applications/metamta/constants/MetaMTANotificationType.php', 'MetaMTAReceivedMailStatus' => 'applications/metamta/constants/MetaMTAReceivedMailStatus.php', + 'NuanceController' => 'applications/nuance/controller/NuanceController.php', + 'NuanceDAO' => 'applications/nuance/storage/NuanceDAO.php', + 'NuanceItem' => 'applications/nuance/storage/NuanceItem.php', + 'NuanceItemEditController' => 'applications/nuance/controller/NuanceItemEditController.php', + 'NuanceItemEditor' => 'applications/nuance/editor/NuanceItemEditor.php', + 'NuanceItemQuery' => 'applications/nuance/query/NuanceItemQuery.php', + 'NuanceItemTransaction' => 'applications/nuance/storage/NuanceItemTransaction.php', + 'NuanceItemTransactionComment' => 'applications/nuance/storage/NuanceItemTransactionComment.php', + 'NuanceItemTransactionQuery' => 'applications/nuance/query/NuanceItemTransactionQuery.php', + 'NuanceItemViewController' => 'applications/nuance/controller/NuanceItemViewController.php', + 'NuancePHIDTypeItem' => 'applications/nuance/phid/NuancePHIDTypeItem.php', + 'NuancePHIDTypeQueue' => 'applications/nuance/phid/NuancePHIDTypeQueue.php', + 'NuancePHIDTypeRequestor' => 'applications/nuance/phid/NuancePHIDTypeRequestor.php', + 'NuancePHIDTypeSource' => 'applications/nuance/phid/NuancePHIDTypeSource.php', + 'NuanceQuery' => 'applications/nuance/query/NuanceQuery.php', + 'NuanceQueue' => 'applications/nuance/storage/NuanceQueue.php', + 'NuanceQueueEditController' => 'applications/nuance/controller/NuanceQueueEditController.php', + 'NuanceQueueEditor' => 'applications/nuance/editor/NuanceQueueEditor.php', + 'NuanceQueueItem' => 'applications/nuance/storage/NuanceQueueItem.php', + 'NuanceQueueQuery' => 'applications/nuance/query/NuanceQueueQuery.php', + 'NuanceQueueTransaction' => 'applications/nuance/storage/NuanceQueueTransaction.php', + 'NuanceQueueTransactionComment' => 'applications/nuance/storage/NuanceQueueTransactionComment.php', + 'NuanceQueueTransactionQuery' => 'applications/nuance/query/NuanceQueueTransactionQuery.php', + 'NuanceQueueViewController' => 'applications/nuance/controller/NuanceQueueViewController.php', + 'NuanceRequestor' => 'applications/nuance/storage/NuanceRequestor.php', + 'NuanceRequestorEditController' => 'applications/nuance/controller/NuanceRequestorEditController.php', + 'NuanceRequestorEditor' => 'applications/nuance/editor/NuanceRequestorEditor.php', + 'NuanceRequestorQuery' => 'applications/nuance/query/NuanceRequestorQuery.php', + 'NuanceRequestorSource' => 'applications/nuance/storage/NuanceRequestorSource.php', + 'NuanceRequestorTransaction' => 'applications/nuance/storage/NuanceRequestorTransaction.php', + 'NuanceRequestorTransactionComment' => 'applications/nuance/storage/NuanceRequestorTransactionComment.php', + 'NuanceRequestorTransactionQuery' => 'applications/nuance/query/NuanceRequestorTransactionQuery.php', + 'NuanceRequestorViewController' => 'applications/nuance/controller/NuanceRequestorViewController.php', + 'NuanceSource' => 'applications/nuance/storage/NuanceSource.php', + 'NuanceSourceEditController' => 'applications/nuance/controller/NuanceSourceEditController.php', + 'NuanceSourceEditor' => 'applications/nuance/editor/NuanceSourceEditor.php', + 'NuanceSourceQuery' => 'applications/nuance/query/NuanceSourceQuery.php', + 'NuanceSourceTransaction' => 'applications/nuance/storage/NuanceSourceTransaction.php', + 'NuanceSourceTransactionComment' => 'applications/nuance/storage/NuanceSourceTransactionComment.php', + 'NuanceSourceTransactionQuery' => 'applications/nuance/query/NuanceSourceTransactionQuery.php', + 'NuanceSourceViewController' => 'applications/nuance/controller/NuanceSourceViewController.php', + 'NuanceTransaction' => 'applications/nuance/storage/NuanceTransaction.php', 'OwnersPackageReplyHandler' => 'applications/owners/mail/OwnersPackageReplyHandler.php', 'PHUI' => 'view/phui/PHUI.php', 'PHUIBoxExample' => 'applications/uiexample/examples/PHUIBoxExample.php', @@ -928,6 +970,7 @@ 'PhabricatorApplicationMailingLists' => 'applications/mailinglists/application/PhabricatorApplicationMailingLists.php', 'PhabricatorApplicationManiphest' => 'applications/maniphest/application/PhabricatorApplicationManiphest.php', 'PhabricatorApplicationMetaMTA' => 'applications/metamta/application/PhabricatorApplicationMetaMTA.php', + 'PhabricatorApplicationNuance' => 'applications/nuance/application/PhabricatorApplicationNuance.php', 'PhabricatorApplicationOwners' => 'applications/owners/application/PhabricatorApplicationOwners.php', 'PhabricatorApplicationPHIDTypeApplication' => 'applications/meta/phid/PhabricatorApplicationPHIDTypeApplication.php', 'PhabricatorApplicationPHPAST' => 'applications/phpast/application/PhabricatorApplicationPHPAST.php', @@ -3097,6 +3140,60 @@ 'ManiphestView' => 'AphrontView', 'MetaMTANotificationType' => 'MetaMTAConstants', 'MetaMTAReceivedMailStatus' => 'MetaMTAConstants', + 'NuanceController' => 'PhabricatorController', + 'NuanceDAO' => 'PhabricatorLiskDAO', + 'NuanceItem' => + array( + 0 => 'NuanceDAO', + 1 => 'PhabricatorPolicyInterface', + ), + 'NuanceItemEditController' => 'NuanceController', + 'NuanceItemEditor' => 'PhabricatorApplicationTransactionEditor', + 'NuanceItemQuery' => 'NuanceQuery', + 'NuanceItemTransaction' => 'NuanceTransaction', + 'NuanceItemTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'NuanceItemTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceItemViewController' => 'NuanceController', + 'NuancePHIDTypeItem' => 'PhabricatorPHIDType', + 'NuancePHIDTypeQueue' => 'PhabricatorPHIDType', + 'NuancePHIDTypeRequestor' => 'PhabricatorPHIDType', + 'NuancePHIDTypeSource' => 'PhabricatorPHIDType', + 'NuanceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'NuanceQueue' => + array( + 0 => 'NuanceDAO', + 1 => 'PhabricatorPolicyInterface', + ), + 'NuanceQueueEditController' => 'NuanceController', + 'NuanceQueueEditor' => 'PhabricatorApplicationTransactionEditor', + 'NuanceQueueItem' => 'NuanceDAO', + 'NuanceQueueQuery' => 'NuanceQuery', + 'NuanceQueueTransaction' => 'NuanceTransaction', + 'NuanceQueueTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'NuanceQueueTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceQueueViewController' => 'NuanceController', + 'NuanceRequestor' => 'NuanceDAO', + 'NuanceRequestorEditController' => 'NuanceController', + 'NuanceRequestorEditor' => 'PhabricatorApplicationTransactionEditor', + 'NuanceRequestorQuery' => 'NuanceQuery', + 'NuanceRequestorSource' => 'NuanceDAO', + 'NuanceRequestorTransaction' => 'NuanceTransaction', + 'NuanceRequestorTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'NuanceRequestorTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceRequestorViewController' => 'NuanceController', + 'NuanceSource' => + array( + 0 => 'NuanceDAO', + 1 => 'PhabricatorPolicyInterface', + ), + 'NuanceSourceEditController' => 'NuanceController', + 'NuanceSourceEditor' => 'PhabricatorApplicationTransactionEditor', + 'NuanceSourceQuery' => 'NuanceQuery', + 'NuanceSourceTransaction' => 'NuanceTransaction', + 'NuanceSourceTransactionComment' => 'PhabricatorApplicationTransactionComment', + 'NuanceSourceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', + 'NuanceSourceViewController' => 'NuanceController', + 'NuanceTransaction' => 'PhabricatorApplicationTransaction', 'OwnersPackageReplyHandler' => 'PhabricatorMailReplyHandler', 'PHUIBoxExample' => 'PhabricatorUIExample', 'PHUIBoxView' => 'AphrontTagView', @@ -3193,6 +3290,7 @@ 'PhabricatorApplicationMailingLists' => 'PhabricatorApplication', 'PhabricatorApplicationManiphest' => 'PhabricatorApplication', 'PhabricatorApplicationMetaMTA' => 'PhabricatorApplication', + 'PhabricatorApplicationNuance' => 'PhabricatorApplication', 'PhabricatorApplicationOwners' => 'PhabricatorApplication', 'PhabricatorApplicationPHIDTypeApplication' => 'PhabricatorPHIDType', 'PhabricatorApplicationPHPAST' => 'PhabricatorApplication', Index: src/applications/conpherence/application/PhabricatorApplicationConpherence.php =================================================================== --- src/applications/conpherence/application/PhabricatorApplicationConpherence.php +++ src/applications/conpherence/application/PhabricatorApplicationConpherence.php @@ -22,7 +22,7 @@ } public function getTitleGlyph() { - return "\xE2\x98\x8E"; + return "\xE2\x9C\x86"; } public function getApplicationGroup() { Index: src/applications/nuance/application/PhabricatorApplicationNuance.php =================================================================== --- /dev/null +++ src/applications/nuance/application/PhabricatorApplicationNuance.php @@ -0,0 +1,54 @@ +<?php + +final class PhabricatorApplicationNuance extends PhabricatorApplication { + + public function getIconName() { + return 'nuance'; + } + + public function getTitleGlyph() { + return "\xE2\x98\x8E"; + } + + public function isBeta() { + return true; + } + + public function shouldAppearInLaunchView() { + // try to hide this even more for now + return false; + } + + public function canUninstall() { + return true; + } + + public function getRoutes() { + return array( + '/nuance/' => array( + 'item/' => array( + 'view/(?P<id>[1-9]\d*)/' => 'NuanceItemViewController', + 'edit/(?P<id>[1-9]\d*)/' => 'NuanceItemEditController', + 'new/' => 'NuanceItemEditController', + ), + 'source/' => array( + 'view/(?P<id>[1-9]\d*)/' => 'NuanceSourceViewController', + 'edit/(?P<id>[1-9]\d*)/' => 'NuanceSourceEditController', + 'new/' => 'NuanceSourceEditController', + ), + 'queue/' => array( + 'view/(?P<id>[1-9]\d*)/' => 'NuanceQueueViewController', + 'edit/(?P<id>[1-9]\d*)/' => 'NuanceQueueEditController', + 'new/' => 'NuanceQueueEditController', + ), + 'requestor/' => array( + 'view/(?P<id>[1-9]\d*)/' => 'NuanceRequestorViewController', + 'edit/(?P<id>[1-9]\d*)/' => 'NuanceRequestorEditController', + 'new/' => 'NuanceRequestorEditController', + ), + ), + ); + } + +} + Index: src/applications/nuance/controller/NuanceController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceController.php @@ -0,0 +1,5 @@ +<?php + +abstract class NuanceController extends PhabricatorController { + +} Index: src/applications/nuance/controller/NuanceItemEditController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceItemEditController.php @@ -0,0 +1,50 @@ +<?php + +final class NuanceItemEditController extends NuanceController { + + private $itemID; + + public function setItemID($item_id) { + $this->itemID = $item_id; + return $this; + } + public function getItemID() { + return $this->itemID; + } + + public function willProcessRequest(array $data) { + $this->setItemID(idx($data, 'id')); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $item_id = $this->getItemID(); + $is_new = !$item_id; + + if ($is_new) { + $item = new NuanceItem(); + + } else { + $item = id(new NuanceItemQuery()) + ->setViewer($user) + ->withIDs(array($item_id)) + ->executeOne(); + } + + if (!$item) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } + +} Index: src/applications/nuance/controller/NuanceItemViewController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceItemViewController.php @@ -0,0 +1,42 @@ +<?php + +final class NuanceItemViewController extends NuanceController { + + private $itemID; + + public function setItemID($item_id) { + $this->itemID = $item_id; + return $this; + } + public function getItemID() { + return $this->itemID; + } + + public function willProcessRequest(array $data) { + $this->setItemID($data['id']); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $item_id = $this->getItemID(); + $item = id(new NuanceItemQuery()) + ->setViewer($user) + ->withIDs(array($item_id)) + ->executeOne(); + + if (!$item) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } +} Index: src/applications/nuance/controller/NuanceQueueEditController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceQueueEditController.php @@ -0,0 +1,50 @@ +<?php + +final class NuanceQueueEditController extends NuanceController { + + private $queueID; + + public function setQueueID($queue_id) { + $this->queueID = $queue_id; + return $this; + } + public function getQueueID() { + return $this->queueID; + } + + public function willProcessRequest(array $data) { + $this->setQueueID(idx($data, 'id')); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $queue_id = $this->getQueueID(); + $is_new = !$queue_id; + + if ($is_new) { + $queue = new NuanceQueue(); + + } else { + $queue = id(new NuanceQueueQuery()) + ->setViewer($user) + ->withIDs(array($queue_id)) + ->executeOne(); + } + + if (!$queue) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } + +} Index: src/applications/nuance/controller/NuanceQueueViewController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceQueueViewController.php @@ -0,0 +1,42 @@ +<?php + +final class NuanceQueueViewController extends NuanceController { + + private $queueID; + + public function setQueueID($queue_id) { + $this->queueID = $queue_id; + return $this; + } + public function getQueueID() { + return $this->queueID; + } + + public function willProcessRequest(array $data) { + $this->setQueueID($data['id']); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $queue_id = $this->getQueueID(); + $queue = id(new NuanceQueueQuery()) + ->setViewer($user) + ->withIDs(array($queue_id)) + ->executeOne(); + + if (!$queue) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } +} Index: src/applications/nuance/controller/NuanceRequestorEditController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceRequestorEditController.php @@ -0,0 +1,50 @@ +<?php + +final class NuanceRequestorEditController extends NuanceController { + + private $requestorID; + + public function setRequestorID($requestor_id) { + $this->requestorID = $requestor_id; + return $this; + } + public function getRequestorID() { + return $this->requestorID; + } + + public function willProcessRequest(array $data) { + $this->setRequestorID(idx($data, 'id')); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $requestor_id = $this->getRequestorID(); + $is_new = !$requestor_id; + + if ($is_new) { + $requestor = new NuanceRequestor(); + + } else { + $requestor = id(new NuanceRequestorQuery()) + ->setViewer($user) + ->withIDs(array($requestor_id)) + ->executeOne(); + } + + if (!$requestor) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } + +} Index: src/applications/nuance/controller/NuanceRequestorViewController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceRequestorViewController.php @@ -0,0 +1,42 @@ +<?php + +final class NuanceRequestorViewController extends NuanceController { + + private $requestorID; + + public function setRequestorID($requestor_id) { + $this->requestorID = $requestor_id; + return $this; + } + public function getRequestorID() { + return $this->requestorID; + } + + public function willProcessRequest(array $data) { + $this->setRequestorID($data['id']); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $requestor_id = $this->getRequestorID(); + $requestor = id(new NuanceRequestorQuery()) + ->setViewer($user) + ->withIDs(array($requestor_id)) + ->executeOne(); + + if (!$requestor) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } +} Index: src/applications/nuance/controller/NuanceSourceEditController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceSourceEditController.php @@ -0,0 +1,49 @@ +<?php + +final class NuanceSourceEditController extends NuanceController { + + private $sourceID; + + public function setSourceID($source_id) { + $this->sourceID = $source_id; + return $this; + } + public function getSourceID() { + return $this->sourceID; + } + + public function willProcessRequest(array $data) { + $this->setSourceID(idx($data, 'id')); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $source_id = $this->getSourceID(); + $is_new = !$source_id; + + if ($is_new) { + $source = new NuanceSource(); + + } else { + $source = id(new NuanceSourceQuery()) + ->setViewer($user) + ->withIDs(array($source_id)) + ->executeOne(); + } + + if (!$source) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } +} Index: src/applications/nuance/controller/NuanceSourceViewController.php =================================================================== --- /dev/null +++ src/applications/nuance/controller/NuanceSourceViewController.php @@ -0,0 +1,42 @@ +<?php + +final class NuanceSourceViewController extends NuanceController { + + private $sourceID; + + public function setSourceID($source_id) { + $this->sourceID = $source_id; + return $this; + } + public function getSourceID() { + return $this->sourceID; + } + + public function willProcessRequest(array $data) { + $this->setSourceID($data['id']); + } + + public function processRequest() { + $request = $this->getRequest(); + $user = $request->getUser(); + + $source_id = $this->getSourceID(); + $source = id(new NuanceSourceQuery()) + ->setViewer($user) + ->withIDs(array($source_id)) + ->executeOne(); + + if (!$source) { + return new Aphront404Response(); + } + + $crumbs = $this->buildApplicationCrumbs(); + $title = 'TODO'; + + return $this->buildApplicationPage( + $crumbs, + array( + 'title' => $title, + 'device' => true)); + } +} Index: src/applications/nuance/editor/NuanceItemEditor.php =================================================================== --- /dev/null +++ src/applications/nuance/editor/NuanceItemEditor.php @@ -0,0 +1,17 @@ +<?php + +final class NuanceItemEditor + extends PhabricatorApplicationTransactionEditor { + + public function getTransactionTypes() { + $types = parent::getTransactionTypes(); + + $types[] = PhabricatorTransactions::TYPE_EDGE; + $types[] = PhabricatorTransactions::TYPE_COMMENT; + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; + $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; + + return $types; + } + +} Index: src/applications/nuance/editor/NuanceQueueEditor.php =================================================================== --- /dev/null +++ src/applications/nuance/editor/NuanceQueueEditor.php @@ -0,0 +1,17 @@ +<?php + +final class NuanceQueueEditor + extends PhabricatorApplicationTransactionEditor { + + public function getTransactionTypes() { + $types = parent::getTransactionTypes(); + + $types[] = PhabricatorTransactions::TYPE_EDGE; + $types[] = PhabricatorTransactions::TYPE_COMMENT; + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; + $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; + + return $types; + } + +} Index: src/applications/nuance/editor/NuanceRequestorEditor.php =================================================================== --- /dev/null +++ src/applications/nuance/editor/NuanceRequestorEditor.php @@ -0,0 +1,17 @@ +<?php + +final class NuanceRequestorEditor + extends PhabricatorApplicationTransactionEditor { + + public function getTransactionTypes() { + $types = parent::getTransactionTypes(); + + $types[] = PhabricatorTransactions::TYPE_EDGE; + $types[] = PhabricatorTransactions::TYPE_COMMENT; + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; + $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; + + return $types; + } + +} Index: src/applications/nuance/editor/NuanceSourceEditor.php =================================================================== --- /dev/null +++ src/applications/nuance/editor/NuanceSourceEditor.php @@ -0,0 +1,17 @@ +<?php + +final class NuanceSourceEditor + extends PhabricatorApplicationTransactionEditor { + + public function getTransactionTypes() { + $types = parent::getTransactionTypes(); + + $types[] = PhabricatorTransactions::TYPE_EDGE; + $types[] = PhabricatorTransactions::TYPE_COMMENT; + $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; + $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; + + return $types; + } + +} Index: src/applications/nuance/phid/NuancePHIDTypeItem.php =================================================================== --- /dev/null +++ src/applications/nuance/phid/NuancePHIDTypeItem.php @@ -0,0 +1,46 @@ +<?php + +final class NuancePHIDTypeItem + extends PhabricatorPHIDType { + + const TYPECONST = 'NUAI'; + + public function getTypeConstant() { + return self::TYPECONST; + } + + public function getTypeName() { + return pht('Item'); + } + + public function newObject() { + return new NuanceItem(); + } + + protected function buildQueryForObjects( + PhabricatorObjectQuery $query, + array $phids) { + + return id(new NuanceItemQuery()) + ->withPHIDs($phids); + } + + public function loadHandles( + PhabricatorHandleQuery $query, + array $handles, + array $objects) { + + $viewer = $query->getViewer(); + foreach ($handles as $phid => $handle) { + $item = $objects[$phid]; + + $handle->setName($item->getLabel($viewer)); + $handle->setURI($item->getURI()); + } + } + + public function canLoadNamedObject($name) { + return false; + } + +} Index: src/applications/nuance/phid/NuancePHIDTypeQueue.php =================================================================== --- /dev/null +++ src/applications/nuance/phid/NuancePHIDTypeQueue.php @@ -0,0 +1,46 @@ +<?php + +final class NuancePHIDTypeQueue + extends PhabricatorPHIDType { + + const TYPECONST = 'NUAQ'; + + public function getTypeConstant() { + return self::TYPECONST; + } + + public function getTypeName() { + return pht('Queue'); + } + + public function newObject() { + return new NuanceQueue(); + } + + protected function buildQueryForObjects( + PhabricatorObjectQuery $query, + array $phids) { + + return id(new NuanceQueueQuery()) + ->withPHIDs($phids); + } + + public function loadHandles( + PhabricatorHandleQuery $query, + array $handles, + array $objects) { + + $viewer = $query->getViewer(); + foreach ($handles as $phid => $handle) { + $queue = $objects[$phid]; + + $handle->setName($queue->getName()); + $handle->setURI($queue->getURI()); + } + } + + public function canLoadNamedObject($name) { + return false; + } + +} Index: src/applications/nuance/phid/NuancePHIDTypeRequestor.php =================================================================== --- /dev/null +++ src/applications/nuance/phid/NuancePHIDTypeRequestor.php @@ -0,0 +1,46 @@ +<?php + +final class NuancePHIDTypeRequestor + extends PhabricatorPHIDType { + + const TYPECONST = 'NUAR'; + + public function getTypeConstant() { + return self::TYPECONST; + } + + public function getTypeName() { + return pht('Requestor'); + } + + public function newObject() { + return new NuanceRequestor(); + } + + protected function buildQueryForObjects( + PhabricatorObjectQuery $query, + array $phids) { + + return id(new NuanceRequestorQuery()) + ->withPHIDs($phids); + } + + public function loadHandles( + PhabricatorHandleQuery $query, + array $handles, + array $objects) { + + $viewer = $query->getViewer(); + foreach ($handles as $phid => $handle) { + $requestor = $objects[$phid]; + + $handle->setName($requestor->getBestName()); + $handle->setURI($requestor->getURI()); + } + } + + public function canLoadNamedObject($name) { + return false; + } + +} Index: src/applications/nuance/phid/NuancePHIDTypeSource.php =================================================================== --- /dev/null +++ src/applications/nuance/phid/NuancePHIDTypeSource.php @@ -0,0 +1,46 @@ +<?php + +final class NuancePHIDTypeSource + extends PhabricatorPHIDType { + + const TYPECONST = 'NUAS'; + + public function getTypeConstant() { + return self::TYPECONST; + } + + public function getTypeName() { + return pht('Source'); + } + + public function newObject() { + return new NuanceSource(); + } + + protected function buildQueryForObjects( + PhabricatorObjectQuery $query, + array $phids) { + + return id(new NuanceSourceQuery()) + ->withPHIDs($phids); + } + + public function loadHandles( + PhabricatorHandleQuery $query, + array $handles, + array $objects) { + + $viewer = $query->getViewer(); + foreach ($handles as $phid => $handle) { + $source = $objects[$phid]; + + $handle->setName($source->getName()); + $handle->setURI($source->getURI()); + } + } + + public function canLoadNamedObject($name) { + return false; + } + +} Index: src/applications/nuance/query/NuanceItemQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceItemQuery.php @@ -0,0 +1,71 @@ +<?php + +final class NuanceItemQuery + extends NuanceQuery { + + private $ids; + private $phids; + private $sourceIDs; + + public function withIDs(array $ids) { + $this->ids = $ids; + return $this; + } + + public function withPHIDs(array $phids) { + $this->phids = $phids; + return $this; + } + + public function withSourceIDs($source_ids) { + $this->sourceIDs = $source_ids; + return $this; + } + + + public function loadPage() { + $table = new NuanceItem(); + $conn_r = $table->establishConnection('r'); + + $data = 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($data); + } + + protected function buildWhereClause($conn_r) { + $where = array(); + + $where[] = $this->buildPagingClause($conn_r); + + if ($this->sourceID) { + $where[] = qsprintf( + $conn_r, + 'sourceID IN (%Ld)', + $this->sourceIDs); + } + + if ($this->ids) { + $where[] = qsprintf( + $conn_r, + 'id IN (%Ld)', + $this->ids); + } + + if ($this->phids) { + $where[] = qsprintf( + $conn_r, + 'phid IN (%Ls)', + $this->phids); + } + + return $this->formatWhereClause($where); + } + +} + Index: src/applications/nuance/query/NuanceItemTransactionQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceItemTransactionQuery.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceItemTransactionQuery + extends PhabricatorApplicationTransactionQuery { + + public function getTemplateApplicationTransaction() { + return new NuanceItemTransaction(); + } + +} Index: src/applications/nuance/query/NuanceQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceQuery.php @@ -0,0 +1,11 @@ +<?php + +abstract class NuanceQuery + extends PhabricatorCursorPagedPolicyAwareQuery { + + public function getQueryApplicationClass() { + return 'PhabricatorApplicationNuance'; + } + +} + Index: src/applications/nuance/query/NuanceQueueQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceQueueQuery.php @@ -0,0 +1,57 @@ +<?php + +final class NuanceQueueQuery + extends NuanceQuery { + + private $ids; + private $phids; + + public function withIDs(array $ids) { + $this->ids = $ids; + return $this; + } + + public function withPHIDs(array $phids) { + $this->phids = $phids; + return $this; + } + + public function loadPage() { + $table = new NuanceQueue(); + $conn_r = $table->establishConnection('r'); + + $data = 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($data); + } + + protected function buildWhereClause($conn_r) { + $where = array(); + + $where[] = $this->buildPagingClause($conn_r); + + if ($this->ids) { + $where[] = qsprintf( + $conn_r, + 'id IN (%Ld)', + $this->ids); + } + + if ($this->phids) { + $where[] = qsprintf( + $conn_r, + 'phid IN (%Ls)', + $this->phids); + } + + return $this->formatWhereClause($where); + } + +} + Index: src/applications/nuance/query/NuanceQueueTransactionQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceQueueTransactionQuery.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceQueueTransactionQuery + extends PhabricatorApplicationTransactionQuery { + + public function getTemplateApplicationTransaction() { + return new NuanceQueueTransaction(); + } + +} Index: src/applications/nuance/query/NuanceRequestorQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceRequestorQuery.php @@ -0,0 +1,57 @@ +<?php + +final class NuanceRequestorQuery + extends NuanceQuery { + + private $ids; + private $phids; + + public function withIDs(array $ids) { + $this->ids = $ids; + return $this; + } + + public function withPHIDs(array $phids) { + $this->phids = $phids; + return $this; + } + + public function loadPage() { + $table = new NuanceRequestor(); + $conn_r = $table->establishConnection('r'); + + $data = 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($data); + } + + protected function buildWhereClause($conn_r) { + $where = array(); + + $where[] = $this->buildPagingClause($conn_r); + + if ($this->ids) { + $where[] = qsprintf( + $conn_r, + 'id IN (%Ld)', + $this->ids); + } + + if ($this->phids) { + $where[] = qsprintf( + $conn_r, + 'phid IN (%Ls)', + $this->phids); + } + + return $this->formatWhereClause($where); + } + +} + Index: src/applications/nuance/query/NuanceRequestorTransactionQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceRequestorTransactionQuery.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceRequestorTransactionQuery + extends PhabricatorApplicationTransactionQuery { + + public function getTemplateApplicationTransaction() { + return new NuanceRequestorTransaction(); + } + +} Index: src/applications/nuance/query/NuanceSourceQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceSourceQuery.php @@ -0,0 +1,83 @@ +<?php + +final class NuanceSourceQuery + extends NuanceQuery { + + private $ids; + private $phids; + private $creatorPHIDs; + private $types; + + public function withIDs(array $ids) { + $this->ids = $ids; + return $this; + } + + public function withPHIDs(array $phids) { + $this->phids = $phids; + return $this; + } + + public function withCreatorPHIDs(array $phids) { + $this->CreatorPHIDs = $phids; + return $this; + } + + public function withTypes($types) { + $this->types = $types; + return $this; + } + + + public function loadPage() { + $table = new NuanceSource(); + $conn_r = $table->establishConnection('r'); + + $data = 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($data); + } + + protected function buildWhereClause($conn_r) { + $where = array(); + + $where[] = $this->buildPagingClause($conn_r); + + if ($this->creatorPHIDs) { + $where[] = qsprintf( + $conn_r, + 'creatorPHID IN (%Ls)', + $this->creatorPHIDs); + } + + if ($this->types) { + $where[] = qsprintf( + $conn_r, + 'type IN (%Ld)', + $this->types); + } + + if ($this->ids) { + $where[] = qsprintf( + $conn_r, + 'id IN (%Ld)', + $this->ids); + } + + if ($this->phids) { + $where[] = qsprintf( + $conn_r, + 'phid IN (%Ls)', + $this->phids); + } + + return $this->formatWhereClause($where); + } + +} Index: src/applications/nuance/query/NuanceSourceTransactionQuery.php =================================================================== --- /dev/null +++ src/applications/nuance/query/NuanceSourceTransactionQuery.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceSourceTransactionQuery + extends PhabricatorApplicationTransactionQuery { + + public function getTemplateApplicationTransaction() { + return new NuanceSourceTransaction(); + } + +} Index: src/applications/nuance/storage/NuanceDAO.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceDAO.php @@ -0,0 +1,9 @@ +<?php + +abstract class NuanceDAO extends PhabricatorLiskDAO { + + public function getApplicationName() { + return 'nuance'; + } + +} Index: src/applications/nuance/storage/NuanceItem.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceItem.php @@ -0,0 +1,95 @@ +<?php + +final class NuanceItem + extends NuanceDAO + implements PhabricatorPolicyInterface { + + protected $ownerPHID; + protected $requestorPHID; + protected $sourcePHID; + protected $sourceLabel; + protected $data; + protected $mailKey; + protected $dateNuanced; + + public function getConfiguration() { + return array( + self::CONFIG_AUX_PHID => true, + self::CONFIG_SERIALIZATION => array( + 'data' => self::SERIALIZATION_JSON, + ), + ) + parent::getConfiguration(); + } + + public function generatePHID() { + return PhabricatorPHID::generateNewPHID( + NuancePHIDTypeItem::TYPECONST); + } + + public function save() { + if (!$this->getMailKey()) { + $this->setMailKey(Filesystem::readRandomCharacters(20)); + } + return parent::save(); + } + + public function getURI() { + return '/nuance/item/view/'.$this->getID().'/'; + } + + public function getLabel(PhabricatorUser $viewer) { + // this is generated at the time the item is created based on + // the configuration from the item source. It is typically + // something like 'Twitter'. + $source_label = $this->getSourceLabel(); + + return pht( + 'Item via %s @ %s.', + $source_label, + phabricator_datetime($this->getDateCreated(), $viewer)); + } + + public function getRequestor() { + return $this->assertAttached($this->requestor); + } + + public function attachRequestor(NuanceRequestor $requestor) { + return $this->requestor = $requestor; + } + + public function getSource() { + return $this->assertAttached($this->source); + } + + public function attachSource(NuanceSource $source) { + $this->source = $source; + } + + public function getCapabilities() { + return array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + ); + } + + public function getPolicy($capability) { + // TODO - this should be based on the queues the item currently resides in + return PhabricatorPolicies::POLICY_NOONE; + } + + public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { + // TODO - requestors should get auto access too! + return $viewer->getPHID() == $this->ownerPHID; + } + + public function describeAutomaticCapability($capability) { + switch ($capability) { + case PhabricatorPolicyCapability::CAN_VIEW: + return pht('Owners of an item can always view it.'); + case PhabricatorPolicyCapability::CAN_EDIT: + return pht('Owners of an item can always edit it.'); + } + return null; + } + +} Index: src/applications/nuance/storage/NuanceItemTransaction.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceItemTransaction.php @@ -0,0 +1,14 @@ +<?php + +final class NuanceItemTransaction + extends NuanceTransaction { + + public function getApplicationTransactionType() { + return NuancePHIDTypeItem::TYPECONST; + } + + public function getApplicationTransactionCommentObject() { + return new NuanceItemTransactionComment(); + } + +} Index: src/applications/nuance/storage/NuanceItemTransactionComment.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceItemTransactionComment.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceItemTransactionComment + extends PhabricatorApplicationTransactionComment { + + public function getApplicationTransactionObject() { + return new NuanceItemTransaction(); + } + +} Index: src/applications/nuance/storage/NuanceQueue.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceQueue.php @@ -0,0 +1,58 @@ +<?php + +final class NuanceQueue + extends NuanceDAO + implements PhabricatorPolicyInterface { + + protected $name; + protected $mailKey; + protected $viewPolicy; + protected $editPolicy; + + public function getConfiguration() { + return array( + self::CONFIG_AUX_PHID => true, + ) + parent::getConfiguration(); + } + + public function generatePHID() { + return PhabricatorPHID::generateNewPHID( + NuancePHIDTypeQueue::TYPECONST); + } + + public function save() { + if (!$this->getMailKey()) { + $this->setMailKey(Filesystem::readRandomCharacters(20)); + } + return parent::save(); + } + + public function getURI() { + return '/nuance/queue/view/'.$this->getID().'/'; + } + + public function getCapabilities() { + return array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + ); + } + + public function getPolicy($capability) { + switch ($capability) { + case PhabricatorPolicyCapability::CAN_VIEW: + return $this->getViewPolicy(); + case PhabricatorPolicyCapability::CAN_EDIT: + return $this->getEditPolicy(); + } + } + + public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { + return false; + } + + public function describeAutomaticCapability($capability) { + return null; + } + +} Index: src/applications/nuance/storage/NuanceQueueItem.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceQueueItem.php @@ -0,0 +1,12 @@ +<?php + +final class NuanceQueueItem + extends NuanceDAO { + + protected $queuePHID; + protected $itemPHID; + protected $itemStatus; + protected $itemDateNuanced; + + +} Index: src/applications/nuance/storage/NuanceQueueTransaction.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceQueueTransaction.php @@ -0,0 +1,14 @@ +<?php + +final class NuanceQueueTransaction + extends NuanceTransaction { + + public function getApplicationTransactionType() { + return NuancePHIDTypeQueue::TYPECONST; + } + + public function getApplicationTransactionCommentObject() { + return new NuanceQueueTransactionComment(); + } + +} Index: src/applications/nuance/storage/NuanceQueueTransactionComment.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceQueueTransactionComment.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceQueueTransactionComment + extends PhabricatorApplicationTransactionComment { + + public function getApplicationTransactionObject() { + return new NuanceQueueTransaction(); + } + +} Index: src/applications/nuance/storage/NuanceRequestor.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceRequestor.php @@ -0,0 +1,37 @@ +<?php + +final class NuanceRequestor + extends NuanceDAO { + + protected $data; + + public function getConfiguration() { + return array( + self::CONFIG_AUX_PHID => true, + self::CONFIG_SERIALIZATION => array( + 'data' => self::SERIALIZATION_JSON, + ), + ) + parent::getConfiguration(); + } + + public function generatePHID() { + return PhabricatorPHID::generateNewPHID( + NuancePHIDTypeRequestor::TYPECONST); + } + + public function save() { + if (!$this->getMailKey()) { + $this->setMailKey(Filesystem::readRandomCharacters(20)); + } + return parent::save(); + } + + public function getURI() { + return '/nuance/requestor/view/'.$this->getID().'/'; + } + + public function getPhabricatorUserPHID() { + return idx($this->getData(), 'phabricatorUserPHID'); + } + +} Index: src/applications/nuance/storage/NuanceRequestorSource.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceRequestorSource.php @@ -0,0 +1,18 @@ +<?php + +final class NuanceRequestorSource + extends NuanceDAO { + + protected $requestorPHID; + protected $sourcePHID; + protected $data; + + public function getConfiguration() { + return array( + self::CONFIG_SERIALIZATION => array( + 'data' => self::SERIALIZATION_JSON, + ), + ) + parent::getConfiguration(); + } + +} Index: src/applications/nuance/storage/NuanceRequestorTransaction.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceRequestorTransaction.php @@ -0,0 +1,13 @@ +<?php + +final class NuanceRequestorTransaction + extends NuanceTransaction { + + public function getApplicationTransactionType() { + return NuancePHIDTypeRequestor::TYPECONST; + } + + public function getApplicationTransactionCommentObject() { + return new NuanceRequestorTransactionComment(); + } +} Index: src/applications/nuance/storage/NuanceRequestorTransactionComment.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceRequestorTransactionComment.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceRequestorTransactionComment + extends PhabricatorApplicationTransactionComment { + + public function getApplicationTransactionObject() { + return new NuanceRequestorTransaction(); + } + +} Index: src/applications/nuance/storage/NuanceSource.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceSource.php @@ -0,0 +1,64 @@ +<?php + +final class NuanceSource + extends NuanceDAO + implements PhabricatorPolicyInterface { + + protected $name; + protected $type; + protected $data; + protected $mailKey; + protected $viewPolicy; + protected $editPolicy; + + public function getConfiguration() { + return array( + self::CONFIG_AUX_PHID => true, + self::CONFIG_SERIALIZATION => array( + 'data' => self::SERIALIZATION_JSON, + ), + ) + parent::getConfiguration(); + } + + public function generatePHID() { + return PhabricatorPHID::generateNewPHID( + NuancePHIDTypeSource::TYPECONST); + } + + public function save() { + if (!$this->getMailKey()) { + $this->setMailKey(Filesystem::readRandomCharacters(20)); + } + return parent::save(); + } + + public function getURI() { + return '/nuance/source/view/'.$this->getID().'/'; + } + + public function getCapabilities() { + return array( + PhabricatorPolicyCapability::CAN_VIEW, + PhabricatorPolicyCapability::CAN_EDIT, + ); + } + + public function getPolicy($capability) { + switch ($capability) { + case PhabricatorPolicyCapability::CAN_VIEW: + return $this->getViewPolicy(); + case PhabricatorPolicyCapability::CAN_EDIT: + return $this->getEditPolicy(); + } + } + + public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { + return false; + } + + public function describeAutomaticCapability($capability) { + return null; + } + + +} Index: src/applications/nuance/storage/NuanceSourceTransaction.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceSourceTransaction.php @@ -0,0 +1,14 @@ +<?php + +final class NuanceSourceTransaction + extends NuanceTransaction { + + public function getApplicationTransactionType() { + return NuancePHIDTypeSource::TYPECONST; + } + + public function getApplicationTransactionCommentObject() { + return new NuanceSourceTransactionComment(); + } + +} Index: src/applications/nuance/storage/NuanceSourceTransactionComment.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceSourceTransactionComment.php @@ -0,0 +1,10 @@ +<?php + +final class NuanceSourceTransactionComment + extends PhabricatorApplicationTransactionComment { + + public function getApplicationTransactionObject() { + return new NuanceSourceTransaction(); + } + +} Index: src/applications/nuance/storage/NuanceTransaction.php =================================================================== --- /dev/null +++ src/applications/nuance/storage/NuanceTransaction.php @@ -0,0 +1,10 @@ +<?php + +abstract class NuanceTransaction + extends PhabricatorApplicationTransaction { + + public function getApplicationName() { + return 'nuance'; + } + +} Index: src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php =================================================================== --- src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php +++ src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php @@ -208,6 +208,10 @@ 'type' => 'db', 'name' => 'policy', ), + 'db.nuance' => array( + 'type' => 'db', + 'name' => 'nuance', + ), '0000.legacy.sql' => array( 'type' => 'sql', 'name' => $this->getPatchPath('0000.legacy.sql'), @@ -1736,6 +1740,10 @@ 'type' => 'sql', 'name' => $this->getPatchPath('20131106.diffphid.3.key.sql'), ), + '20131106.nuance-v0.sql' => array( + 'type' => 'sql', + 'name' => $this->getPatchPath('20131106.nuance-v0.sql'), + ), ); } } Index: webroot/rsrc/css/sprite-apps-large.css =================================================================== --- webroot/rsrc/css/sprite-apps-large.css +++ webroot/rsrc/css/sprite-apps-large.css @@ -482,51 +482,51 @@ background-position: -290px -203px; } -.apps-owners-light-large { +.apps-nuance-light-large { background-position: -319px -203px; } -.apps-owners-dark-large { +.apps-nuance-dark-large { background-position: -348px -203px; } -.apps-owners-blue-large, .phabricator-crumb-view:hover .apps-owners-dark-large { +.apps-nuance-blue-large, .phabricator-crumb-view:hover .apps-nuance-dark-large { background-position: -377px -203px; } -.apps-owners-white-large { +.apps-nuance-white-large { background-position: -406px -203px; } -.apps-paste-light-large { +.apps-owners-light-large { background-position: 0px -232px; } -.apps-paste-dark-large { +.apps-owners-dark-large { background-position: -29px -232px; } -.apps-paste-blue-large, .phabricator-crumb-view:hover .apps-paste-dark-large { +.apps-owners-blue-large, .phabricator-crumb-view:hover .apps-owners-dark-large { background-position: -58px -232px; } -.apps-paste-white-large { +.apps-owners-white-large { background-position: -87px -232px; } -.apps-pebkac-light-large { +.apps-paste-light-large { background-position: -116px -232px; } -.apps-pebkac-dark-large { +.apps-paste-dark-large { background-position: -145px -232px; } -.apps-pebkac-blue-large, .phabricator-crumb-view:hover .apps-pebkac-dark-large { +.apps-paste-blue-large, .phabricator-crumb-view:hover .apps-paste-dark-large { background-position: -174px -232px; } -.apps-pebkac-white-large { +.apps-paste-white-large { background-position: -203px -232px; } Index: webroot/rsrc/css/sprite-apps.css =================================================================== --- webroot/rsrc/css/sprite-apps.css +++ webroot/rsrc/css/sprite-apps.css @@ -250,27 +250,27 @@ background-position: -75px -75px; } -.apps-owners-dark { +.apps-nuance-dark { background-position: -90px -75px; } -.apps-owners-white { +.apps-nuance-white { background-position: -105px -75px; } -.apps-paste-dark { +.apps-owners-dark { background-position: -120px -75px; } -.apps-paste-white { +.apps-owners-white { background-position: -135px -75px; } -.apps-pebkac-dark { +.apps-paste-dark { background-position: 0px -90px; } -.apps-pebkac-white { +.apps-paste-white { background-position: -15px -90px; }