Summary: Allow duplicate tasks to be selected and merged in Maniphest. I didn't create a separate transaction type for this because that implies a bunch of really complicated rules which I don't want to sort out right now (e.g., do we need to do cycle detection for merges? If so, what do we do when we detect a cycle?) since I think it's unnecessary to get right for the initial implementation (my Tasks merge implementation was similar to this and worked quite well) and if/when we eventually need the metadata to be available in a computer-readable form that need should inform the implementation. Plenty of room for improvement here, of course. Test Plan: Merged duplicate tasks, tried to perform invalid merge operations (e.g., merge a task into itself). Tested existing attach workflows (task -> revision, revision -> task). Reviewed By: aran Reviewers: tuomaspelkonen, jungejason, aran CC: anjali, aran Differential Revision: 459
95 lines
1.6 KiB
CSS
95 lines
1.6 KiB
CSS
/**
|
|
* @provides phabricator-object-selector-css
|
|
* @requires aphront-dialog-view-css
|
|
*/
|
|
|
|
.phabricator-object-selector-dialog {
|
|
width: 960px;
|
|
}
|
|
|
|
.phabricator-object-selector-dialog .aphront-dialog-body {
|
|
padding: 0;
|
|
}
|
|
|
|
.phabricator-object-selector-search {
|
|
width: 100%;
|
|
background: #ededed;
|
|
}
|
|
|
|
.phabricator-object-selector-search td {
|
|
padding: 4px 8px;
|
|
}
|
|
|
|
td.phabricator-object-selector-search-text {
|
|
width: 100%;
|
|
}
|
|
|
|
.phabricator-object-selector-search-text input {
|
|
width: 100%;
|
|
}
|
|
|
|
.phabricator-object-selector-results {
|
|
position: relative;
|
|
height: 24em;
|
|
border: solid #bbbbbb;
|
|
border-width: 1px 0px;
|
|
overflow-y: scroll;
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
.phabricator-object-selector-handle {
|
|
width: 100%;
|
|
background: #e9e9e9;
|
|
margin-bottom: 1px;
|
|
}
|
|
|
|
.phabricator-object-selector-handle td {
|
|
padding: 4px 1em;
|
|
}
|
|
|
|
.phabricator-object-selector-handle th {
|
|
padding: 4px 1em;
|
|
font-weight: bold;
|
|
vertical-align: middle;
|
|
width: 100%;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.phabricator-object-selector-header {
|
|
padding: 2px;
|
|
border-bottom: 1px solid #d0d0d0;
|
|
margin-bottom: 16px;
|
|
color: #444444;
|
|
}
|
|
|
|
.phabricator-object-selector-attach-explicit {
|
|
padding: 4px;
|
|
background: #f3f3f3;
|
|
border: solid #bbbbbb;
|
|
border-width: 1px 0px;
|
|
}
|
|
|
|
.phabricator-object-selector-currently-attached {
|
|
background: #fff;
|
|
padding: 16px;
|
|
border: 1px solid #dddddd;
|
|
}
|
|
|
|
.phabricator-object-selector-current {
|
|
background: #ededed;
|
|
padding: 8px 8px;
|
|
}
|
|
|
|
|
|
.object-selector-nothing {
|
|
padding: 1em;
|
|
color: #888888;
|
|
text-align: center;
|
|
}
|
|
|
|
.phabricator-object-selector-instructions {
|
|
font-size: 11px;
|
|
color: #666666;
|
|
margin-top: 1.25em;
|
|
}
|