Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15378294
D10996.id26423.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
23 KB
Referenced Files
None
Subscribers
None
D10996.id26423.diff
View Options
diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -34,6 +34,7 @@
'rsrc/css/aphront/transaction.css' => '5d0cae25',
'rsrc/css/aphront/two-column.css' => '16ab3ad2',
'rsrc/css/aphront/typeahead.css' => 'a989b5b3',
+ 'rsrc/css/application/almanac/almanac.css' => 'dbb9b3af',
'rsrc/css/application/auth/auth.css' => '1e655982',
'rsrc/css/application/base/main-menu-view.css' => '33e5f2f6',
'rsrc/css/application/base/notification-menu.css' => '6aa0a74b',
@@ -497,6 +498,7 @@
'rsrc/swf/aphlict.swf' => 'f19daffb',
),
'symbols' => array(
+ 'almanac-css' => 'dbb9b3af',
'aphront-bars' => '231ac33c',
'aphront-contextbar-view-css' => '1c3b0529',
'aphront-dark-console-css' => '6378ef3d',
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -67,6 +67,7 @@
'AlmanacNetworkViewController' => 'applications/almanac/controller/AlmanacNetworkViewController.php',
'AlmanacProperty' => 'applications/almanac/storage/AlmanacProperty.php',
'AlmanacPropertyController' => 'applications/almanac/controller/AlmanacPropertyController.php',
+ 'AlmanacPropertyDeleteController' => 'applications/almanac/controller/AlmanacPropertyDeleteController.php',
'AlmanacPropertyEditController' => 'applications/almanac/controller/AlmanacPropertyEditController.php',
'AlmanacPropertyInterface' => 'applications/almanac/property/AlmanacPropertyInterface.php',
'AlmanacPropertyQuery' => 'applications/almanac/query/AlmanacPropertyQuery.php',
@@ -3092,6 +3093,7 @@
'PhabricatorPolicyInterface',
),
'AlmanacPropertyController' => 'AlmanacController',
+ 'AlmanacPropertyDeleteController' => 'AlmanacDeviceController',
'AlmanacPropertyEditController' => 'AlmanacDeviceController',
'AlmanacPropertyQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'AlmanacQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
diff --git a/src/applications/almanac/application/PhabricatorAlmanacApplication.php b/src/applications/almanac/application/PhabricatorAlmanacApplication.php
--- a/src/applications/almanac/application/PhabricatorAlmanacApplication.php
+++ b/src/applications/almanac/application/PhabricatorAlmanacApplication.php
@@ -57,7 +57,8 @@
'(?P<id>\d+)/' => 'AlmanacNetworkViewController',
),
'property/' => array(
- 'edit/(?:(?P<id>\d+)/)?' => 'AlmanacPropertyEditController',
+ 'edit/' => 'AlmanacPropertyEditController',
+ 'delete/' => 'AlmanacPropertyDeleteController',
),
),
);
diff --git a/src/applications/almanac/controller/AlmanacController.php b/src/applications/almanac/controller/AlmanacController.php
--- a/src/applications/almanac/controller/AlmanacController.php
+++ b/src/applications/almanac/controller/AlmanacController.php
@@ -9,13 +9,129 @@
$viewer = $this->getViewer();
$properties = $object->getAlmanacProperties();
+ $this->requireResource('almanac-css');
+
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $object,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
+ $field_list = PhabricatorCustomField::getObjectFields(
+ $object,
+ PhabricatorCustomField::ROLE_DEFAULT);
+
+ // Before reading values from the object, read defaults.
+ $defaults = mpull(
+ $field_list->getFields(),
+ 'getValueForStorage',
+ 'getFieldKey');
+
+ $field_list
+ ->setViewer($viewer)
+ ->readFieldsFromStorage($object);
+
+ Javelin::initBehavior('phabricator-tooltips', array());
+
+ $icon_builtin = id(new PHUIIconView())
+ ->setIconFont('fa-circle')
+ ->addSigil('has-tooltip')
+ ->setMetadata(
+ array(
+ 'tip' => pht('Builtin Property'),
+ 'align' => 'E',
+ ));
+
+ $icon_custom = id(new PHUIIconView())
+ ->setIconFont('fa-circle-o grey')
+ ->addSigil('has-tooltip')
+ ->setMetadata(
+ array(
+ 'tip' => pht('Custom Property'),
+ 'align' => 'E',
+ ));
+
+ $builtins = $object->getAlmanacPropertyFieldSpecifications();
+
+ // Sort fields so builtin fields appear first, then fields are ordered
+ // alphabetically.
+ $fields = $field_list->getFields();
+ $fields = msort($fields, 'getFieldKey');
+
+ $head = array();
+ $tail = array();
+ foreach ($fields as $field) {
+ $key = $field->getFieldKey();
+ if (isset($builtins[$key])) {
+ $head[$key] = $field;
+ } else {
+ $tail[$key] = $field;
+ }
+ }
+
+ $fields = $head + $tail;
+
$rows = array();
- foreach ($properties as $property) {
- $value = $property->getFieldValue();
+ foreach ($fields as $key => $field) {
+ $value = $field->getValueForStorage();
+
+ $is_builtin = isset($builtins[$key]);
+
+ $delete_uri = $this->getApplicationURI('property/delete/');
+ $delete_uri = id(new PhutilURI($delete_uri))
+ ->setQueryParams(
+ array(
+ 'objectPHID' => $object->getPHID(),
+ 'key' => $key,
+ ));
+
+ $edit_uri = $this->getApplicationURI('property/edit/');
+ $edit_uri = id(new PhutilURI($edit_uri))
+ ->setQueryParams(
+ array(
+ 'objectPHID' => $object->getPHID(),
+ 'key' => $key,
+ ));
+
+ $delete = javelin_tag(
+ 'a',
+ array(
+ 'class' => ($can_edit
+ ? 'button grey small'
+ : 'button grey small disabled'),
+ 'sigil' => 'workflow',
+ 'href' => $delete_uri,
+ ),
+ $is_builtin ? pht('Reset') : pht('Delete'));
+
+ $default = idx($defaults, $key);
+ $is_default = ($default !== null && $default === $value);
+
+ $display_value = PhabricatorConfigJSON::prettyPrintJSON($value);
+ if ($is_default) {
+ $display_value = phutil_tag(
+ 'span',
+ array(
+ 'class' => 'almanac-default-property-value',
+ ),
+ $display_value);
+ }
+
+ $display_key = $key;
+ if ($can_edit) {
+ $display_key = javelin_tag(
+ 'a',
+ array(
+ 'href' => $edit_uri,
+ 'sigil' => 'workflow',
+ ),
+ $display_key);
+ }
$rows[] = array(
- $property->getFieldName(),
- PhabricatorConfigJSON::prettyPrintJSON($value),
+ ($is_builtin ? $icon_builtin : $icon_custom),
+ $display_key,
+ $display_value,
+ $delete,
);
}
@@ -23,13 +139,17 @@
->setNoDataString(pht('No properties.'))
->setHeaders(
array(
+ null,
pht('Name'),
pht('Value'),
+ null,
))
->setColumnClasses(
array(
null,
+ null,
'wide',
+ 'action',
));
$phid = $object->getPHID();
diff --git a/src/applications/almanac/controller/AlmanacNetworkViewController.php b/src/applications/almanac/controller/AlmanacNetworkViewController.php
--- a/src/applications/almanac/controller/AlmanacNetworkViewController.php
+++ b/src/applications/almanac/controller/AlmanacNetworkViewController.php
@@ -11,7 +11,6 @@
$viewer = $request->getViewer();
$id = $request->getURIData('id');
-
$network = id(new AlmanacNetworkQuery())
->setViewer($viewer)
->withIDs(array($id))
diff --git a/src/applications/almanac/controller/AlmanacPropertyDeleteController.php b/src/applications/almanac/controller/AlmanacPropertyDeleteController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/almanac/controller/AlmanacPropertyDeleteController.php
@@ -0,0 +1,109 @@
+<?php
+
+final class AlmanacPropertyDeleteController
+ extends AlmanacDeviceController {
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $request->getViewer();
+
+ $object = id(new PhabricatorObjectQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($request->getStr('objectPHID')))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+ if (!$object) {
+ return new Aphront404Response();
+ }
+
+ if (!($object instanceof AlmanacPropertyInterface)) {
+ return new Aphront404Response();
+ }
+
+ $key = $request->getStr('key');
+ if (!strlen($key)) {
+ return new Aphront404Response();
+ }
+
+ $cancel_uri = $object->getURI();
+
+ $builtins = $object->getAlmanacPropertyFieldSpecifications();
+ $is_builtin = isset($builtins[$key]);
+
+ if ($is_builtin) {
+ // This is a builtin property, so we're going to reset it to the
+ // default value.
+ $field_list = PhabricatorCustomField::getObjectFields(
+ $object,
+ PhabricatorCustomField::ROLE_DEFAULT);
+
+ // Note that we're NOT loading field values from the object: we just want
+ // to get the field's default value so we can reset it.
+
+ $fields = $field_list->getFields();
+ $field = $fields[$key];
+
+ $is_delete = false;
+ $new_value = $field->getValueForStorage();
+
+ // Now, load the field to get the old value.
+
+ $field_list
+ ->setViewer($viewer)
+ ->readFieldsFromStorage($object);
+
+ $old_value = $field->getValueForStorage();
+
+ $title = pht('Reset Property');
+ $body = pht('Reset this property to its default value?');
+ $submit_text = pht('Reset');
+ } else {
+ // This is a custom property, so we're going to delete it outright.
+ $is_delete = true;
+ $old_value = $object->getAlmanacPropertyValue($key);
+ $new_value = null;
+
+ $title = pht('Delete Property');
+ $body = pht('Delete this property? TODO: DOES NOT WORK YET');
+ $submit_text = pht('Delete');
+ }
+
+ $validation_exception = null;
+ if ($request->isFormPost()) {
+ $xaction = $object->getApplicationTransactionTemplate()
+ ->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD)
+ ->setMetadataValue('customfield:key', $key)
+ ->setOldValue($old_value)
+ ->setNewValue($new_value);
+
+ // TODO: We aren't really deleting properties that we claim to delete
+ // yet, but that needs to be specialized a little bit.
+
+ $editor = $object->getApplicationTransactionEditor()
+ ->setActor($viewer)
+ ->setContentSourceFromRequest($request)
+ ->setContinueOnNoEffect(true)
+ ->setContinueOnMissingFields(true);
+
+ try {
+ $editor->applyTransactions($object, array($xaction));
+ return id(new AphrontRedirectResponse())->setURI($cancel_uri);
+ } catch (PhabricatorApplicationTransactionValidationException $ex) {
+ $validation_exception = $ex;
+ }
+ }
+
+ return $this->newDialog()
+ ->setTitle($title)
+ ->setValidationException($validation_exception)
+ ->addHiddenInput('objectPHID', $object->getPHID())
+ ->addHiddenInput('key', $key)
+ ->appendParagraph($body)
+ ->addCancelButton($cancel_uri)
+ ->addSubmitButton($submit_text);
+ }
+
+}
diff --git a/src/applications/almanac/controller/AlmanacPropertyEditController.php b/src/applications/almanac/controller/AlmanacPropertyEditController.php
--- a/src/applications/almanac/controller/AlmanacPropertyEditController.php
+++ b/src/applications/almanac/controller/AlmanacPropertyEditController.php
@@ -6,51 +6,40 @@
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
- $id = $request->getURIData('id');
- if ($id) {
- $property = id(new AlmanacPropertyQuery())
- ->setViewer($viewer)
- ->withIDs(array($id))
- ->requireCapabilities(
- array(
- PhabricatorPolicyCapability::CAN_VIEW,
- PhabricatorPolicyCapability::CAN_EDIT,
- ))
- ->executeOne();
- if (!$property) {
- return new Aphront404Response();
- }
+ $object = id(new PhabricatorObjectQuery())
+ ->setViewer($viewer)
+ ->withPHIDs(array($request->getStr('objectPHID')))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+ if (!$object) {
+ return new Aphront404Response();
+ }
- $object = $property->getObject();
+ if (!($object instanceof AlmanacPropertyInterface)) {
+ return new Aphront404Response();
+ }
+
+ $cancel_uri = $object->getURI();
+
+ $key = $request->getStr('key');
+ if ($key) {
+ $property_key = $key;
$is_new = false;
$title = pht('Edit Property');
$save_button = pht('Save Changes');
} else {
- $object = id(new PhabricatorObjectQuery())
- ->setViewer($viewer)
- ->withPHIDs(array($request->getStr('objectPHID')))
- ->requireCapabilities(
- array(
- PhabricatorPolicyCapability::CAN_VIEW,
- PhabricatorPolicyCapability::CAN_EDIT,
- ))
- ->executeOne();
- if (!$object) {
- return new Aphront404Response();
- }
+ $property_key = null;
$is_new = true;
$title = pht('Add Property');
$save_button = pht('Add Property');
}
- if (!($object instanceof AlmanacPropertyInterface)) {
- return new Aphront404Response();
- }
-
- $cancel_uri = $object->getURI();
-
if ($is_new) {
$errors = array();
$property = null;
@@ -77,25 +66,11 @@
}
if (!$errors) {
- $property = id(new AlmanacPropertyQuery())
- ->setViewer($viewer)
- ->withObjectPHIDs(array($object->getPHID()))
- ->withNames(array($name))
- ->requireCapabilities(
- array(
- PhabricatorPolicyCapability::CAN_VIEW,
- PhabricatorPolicyCapability::CAN_EDIT,
- ))
- ->executeOne();
- if (!$property) {
- $property = id(new AlmanacProperty())
- ->setObjectPHID($object->getPHID())
- ->setFieldName($name);
- }
+ $property_key = $name;
}
}
- if (!$property) {
+ if ($property_key === null) {
$form = id(new AphrontFormView())
->setUser($viewer)
->appendChild(
@@ -115,17 +90,29 @@
}
}
- $v_name = $property->getFieldName();
- $e_name = true;
+ // Make sure property key is appropriate.
+ // TODO: It would be cleaner to put this safety check in the Editor.
+ AlmanacNames::validateServiceOrDeviceName($property_key);
- $v_value = $property->getFieldValue();
- $e_value = null;
+ // If we're adding a new property, put a placeholder on the object so
+ // that we can build a CustomField for it.
+ if (!$object->hasAlmanacProperty($property_key)) {
+ $temporary_property = id(new AlmanacProperty())
+ ->setObjectPHID($object->getPHID())
+ ->setFieldName($property_key);
- $object->attachAlmanacProperties(array($property));
+ $object->attachAlmanacProperties(array($temporary_property));
+ }
$field_list = PhabricatorCustomField::getObjectFields(
$object,
- PhabricatorCustomField::ROLE_EDIT);
+ PhabricatorCustomField::ROLE_DEFAULT);
+
+ // Select only the field being edited.
+ $fields = $field_list->getFields();
+ $fields = array_select_keys($fields, array($property_key));
+ $field_list = new PhabricatorCustomFieldList($fields);
+
$field_list
->setViewer($viewer)
->readFieldsFromStorage($object);
@@ -153,7 +140,8 @@
$form = id(new AphrontFormView())
->setUser($viewer)
->addHiddenInput('objectPHID', $request->getStr('objectPHID'))
- ->addHiddenInput('name', $request->getStr('name'))
+ ->addHiddenInput('key', $request->getStr('key'))
+ ->addHiddenInput('name', $property_key)
->addHiddenInput('isValueEdit', true);
$field_list->appendFieldsToForm($form);
diff --git a/src/applications/almanac/customfield/AlmanacCoreCustomField.php b/src/applications/almanac/customfield/AlmanacCoreCustomField.php
--- a/src/applications/almanac/customfield/AlmanacCoreCustomField.php
+++ b/src/applications/almanac/customfield/AlmanacCoreCustomField.php
@@ -8,17 +8,29 @@
return 'almanac:core';
}
+ public function getFieldKey() {
+ return $this->getProxy()->getRawStandardFieldKey();
+ }
+
+ public function getFieldName() {
+ return $this->getFieldKey();
+ }
+
public function createFields($object) {
- $specs = array();
+ $specs = $object->getAlmanacPropertyFieldSpecifications();
+
+ $default_specs = array();
foreach ($object->getAlmanacProperties() as $property) {
- $specs[$property->getFieldName()] = array(
+ $default_specs[$property->getFieldName()] = array(
'name' => $property->getFieldName(),
'type' => 'text',
);
}
- return PhabricatorStandardCustomField::buildStandardFields($this, $specs);
+ return PhabricatorStandardCustomField::buildStandardFields(
+ $this,
+ $specs + $default_specs);
}
public function shouldUseStorage() {
@@ -26,8 +38,11 @@
}
public function readValueFromObject(PhabricatorCustomFieldInterface $object) {
- $key = $this->getProxy()->getRawStandardFieldKey();
- $this->setValueFromStorage($object->getAlmanacPropertyValue($key));
+ $key = $this->getFieldKey();
+
+ if ($object->hasAlmanacProperty($key)) {
+ $this->setValueFromStorage($object->getAlmanacPropertyValue($key));
+ }
}
public function applyApplicationTransactionInternalEffects(
@@ -40,7 +55,7 @@
$object = $this->getObject();
$phid = $object->getPHID();
- $key = $this->getProxy()->getRawStandardFieldKey();
+ $key = $this->getFieldKey();
$property = id(new AlmanacPropertyQuery())
->setViewer($this->getViewer())
diff --git a/src/applications/almanac/property/AlmanacPropertyInterface.php b/src/applications/almanac/property/AlmanacPropertyInterface.php
--- a/src/applications/almanac/property/AlmanacPropertyInterface.php
+++ b/src/applications/almanac/property/AlmanacPropertyInterface.php
@@ -7,5 +7,6 @@
public function hasAlmanacProperty($key);
public function getAlmanacProperty($key);
public function getAlmanacPropertyValue($key, $default = null);
+ public function getAlmanacPropertyFieldSpecifications();
}
diff --git a/src/applications/almanac/query/AlmanacPropertyQuery.php b/src/applications/almanac/query/AlmanacPropertyQuery.php
--- a/src/applications/almanac/query/AlmanacPropertyQuery.php
+++ b/src/applications/almanac/query/AlmanacPropertyQuery.php
@@ -14,7 +14,7 @@
}
public function withObjectPHIDs(array $phids) {
- $this->phids = $phids;
+ $this->objectPHIDs = $phids;
return $this;
}
diff --git a/src/applications/almanac/query/AlmanacQuery.php b/src/applications/almanac/query/AlmanacQuery.php
--- a/src/applications/almanac/query/AlmanacQuery.php
+++ b/src/applications/almanac/query/AlmanacQuery.php
@@ -12,7 +12,7 @@
$property_query = id(new AlmanacPropertyQuery())
->setViewer($this->getViewer())
->setParentQuery($this)
- ->withObjectPHIDs(mpull($objects, null, 'getPHID'));
+ ->withObjectPHIDs(mpull($objects, 'getPHID'));
// NOTE: We disable policy filtering and object attachment to avoid
// a cyclic dependency where objects need their properties and properties
@@ -21,6 +21,7 @@
$property_query->setDisablePolicyFilteringAndAttachment(true);
$properties = $property_query->execute();
+
$properties = mgroup($properties, 'getObjectPHID');
foreach ($objects as $object) {
$object_properties = idx($properties, $object->getPHID(), array());
diff --git a/src/applications/almanac/servicetype/AlmanacClusterRepositoryServiceType.php b/src/applications/almanac/servicetype/AlmanacClusterRepositoryServiceType.php
--- a/src/applications/almanac/servicetype/AlmanacClusterRepositoryServiceType.php
+++ b/src/applications/almanac/servicetype/AlmanacClusterRepositoryServiceType.php
@@ -16,4 +16,19 @@
'Defines a repository service for use in a Phabricator cluster.');
}
+ public function getFieldSpecifications() {
+ return array(
+ 'closed' => array(
+ 'type' => 'bool',
+ 'name' => pht('Closed'),
+ 'default' => false,
+ 'strings' => array(
+ 'edit.checkbox' => pht(
+ 'Prevent new repositories from being allocated on this '.
+ 'service.'),
+ ),
+ ),
+ );
+ }
+
}
diff --git a/src/applications/almanac/servicetype/AlmanacServiceType.php b/src/applications/almanac/servicetype/AlmanacServiceType.php
--- a/src/applications/almanac/servicetype/AlmanacServiceType.php
+++ b/src/applications/almanac/servicetype/AlmanacServiceType.php
@@ -47,6 +47,14 @@
}
+ public function getDefaultPropertyMap() {
+ return array();
+ }
+
+ public function getFieldSpecifications() {
+ return array();
+ }
+
/**
* List all available service type implementations.
*
diff --git a/src/applications/almanac/storage/AlmanacBinding.php b/src/applications/almanac/storage/AlmanacBinding.php
--- a/src/applications/almanac/storage/AlmanacBinding.php
+++ b/src/applications/almanac/storage/AlmanacBinding.php
@@ -119,6 +119,10 @@
}
}
+ public function getAlmanacPropertyFieldSpecifications() {
+ return array();
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */
diff --git a/src/applications/almanac/storage/AlmanacDevice.php b/src/applications/almanac/storage/AlmanacDevice.php
--- a/src/applications/almanac/storage/AlmanacDevice.php
+++ b/src/applications/almanac/storage/AlmanacDevice.php
@@ -97,6 +97,10 @@
}
}
+ public function getAlmanacPropertyFieldSpecifications() {
+ return array();
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */
diff --git a/src/applications/almanac/storage/AlmanacNetwork.php b/src/applications/almanac/storage/AlmanacNetwork.php
--- a/src/applications/almanac/storage/AlmanacNetwork.php
+++ b/src/applications/almanac/storage/AlmanacNetwork.php
@@ -40,7 +40,7 @@
}
public function getURI() {
- return '/almanac/network/view/'.$this->getName().'/';
+ return '/almanac/network/'.$this->getID().'/';
}
diff --git a/src/applications/almanac/storage/AlmanacService.php b/src/applications/almanac/storage/AlmanacService.php
--- a/src/applications/almanac/storage/AlmanacService.php
+++ b/src/applications/almanac/storage/AlmanacService.php
@@ -121,6 +121,10 @@
}
}
+ public function getAlmanacPropertyFieldSpecifications() {
+ return $this->getServiceType()->getFieldSpecifications();
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */
diff --git a/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.php b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.php
--- a/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.php
+++ b/src/infrastructure/customfield/standard/PhabricatorStandardCustomFieldBool.php
@@ -22,9 +22,13 @@
return $this->newNumericIndex(0);
}
+ public function readValueFromRequest(AphrontRequest $request) {
+ $this->setFieldValue((bool)$request->getBool($this->getFieldKey()));
+ }
+
public function getValueForStorage() {
$value = $this->getFieldValue();
- if (strlen($value)) {
+ if ($value !== null) {
return (int)$value;
} else {
return null;
diff --git a/webroot/rsrc/css/application/almanac/almanac.css b/webroot/rsrc/css/application/almanac/almanac.css
new file mode 100644
--- /dev/null
+++ b/webroot/rsrc/css/application/almanac/almanac.css
@@ -0,0 +1,7 @@
+/**
+ * @provides almanac-css
+ */
+
+.almanac-default-property-value {
+ color: {$lightgreytext};
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 14, 1:32 PM (1 w, 6 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7388217
Default Alt Text
D10996.id26423.diff (23 KB)
Attached To
Mode
D10996: Allow Almanac service types to define default properties
Attached
Detach File
Event Timeline
Log In to Comment