Skip to content

Commit 5272881

Browse files
committed
Grey out exclusive toggle depending if name includes scope, and show warning
about what will happen with conflicting scoped labels.
1 parent f3bb56e commit 5272881

File tree

7 files changed

+72
-16
lines changed

7 files changed

+72
-16
lines changed

models/issues/label.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,11 @@ func (label *Label) ExclusiveScope() string {
194194
if !label.Exclusive {
195195
return ""
196196
}
197-
lastIndex := strings.LastIndex(label.Name, "/")
198-
if lastIndex == -1 {
197+
index := strings.Index(label.Name, "/")
198+
if index == -1 || index == 0 || index == len(label.Name)-1 {
199199
return ""
200200
}
201-
return label.Name[:lastIndex]
201+
return label.Name[:index]
202202
}
203203

204204
// NewLabel creates a new label

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,6 +1400,7 @@ issues.label_description = Description
14001400
issues.label_color = Color
14011401
issues.label_exclusive = Exclusive
14021402
issues.label_exclusive_desc = Name the label <code>scope/item</code> to make it mutually exclusive with other <code>scope/</code> labels.
1403+
issues.label_exclusive_warning = Any conflicting scoped labels will be removed when editing the labels of an issue or pull request.
14031404
issues.label_count = %d labels
14041405
issues.label_open_issues = %d open issues/pull requests
14051406
issues.label_edit = Edit

templates/repo/issue/labels/edit_delete_label.tmpl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,24 @@
2929
<div class="required field">
3030
<label for="name">{{.locale.Tr "repo.issues.label_title"}}</label>
3131
<div class="ui small input">
32-
<input class="new-label-input emoji-input" name="title" placeholder="{{.locale.Tr "repo.issues.new_label_placeholder"}}" autofocus required maxlength="50">
32+
<input class="label-name-input emoji-input" name="title" placeholder="{{.locale.Tr "repo.issues.new_label_placeholder"}}" autofocus required maxlength="50">
3333
</div>
3434
</div>
35-
<div class="field">
35+
<div class="field label-exclusive-input-field">
3636
<div class="ui checkbox">
37-
<input class="new-label-exclusive" name="exclusive" type="checkbox">
37+
<input class="label-exclusive-input" name="exclusive" type="checkbox">
3838
<label>{{.locale.Tr "repo.issues.label_exclusive"}}</label>
3939
</div>
4040
<br/>
4141
<small class="desc">{{.locale.Tr "repo.issues.label_exclusive_desc" | Safe}}</small>
42+
<div class="desc gt-hidden label-exclusive-warning">
43+
<br/>{{.locale.Tr "repo.issues.label_exclusive_warning" | Safe}}
44+
</div>
4245
</div>
4346
<div class="field">
4447
<label for="description">{{.locale.Tr "repo.issues.label_description"}}</label>
4548
<div class="ui small fluid input">
46-
<input class="new-label-desc-input" name="description" placeholder="{{.locale.Tr "repo.issues.new_label_desc_placeholder"}}" maxlength="200">
49+
<input class="label-desc-input" name="description" placeholder="{{.locale.Tr "repo.issues.new_label_desc_placeholder"}}" maxlength="200">
4750
</div>
4851
</div>
4952
<div class="field color-field">

templates/repo/issue/labels/label_list.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@
4444
<div class="three wide column">
4545
{{if and (not $.PageIsOrgSettingsLabels ) (not $.Repository.IsArchived) (or $.CanWriteIssues $.CanWritePulls)}}
4646
<a class="ui right delete-button" href="#" data-url="{{$.Link}}/delete" data-id="{{.ID}}">{{svg "octicon-trash"}} {{$.locale.Tr "repo.issues.label_delete"}}</a>
47-
<a class="ui right edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{$.locale.Tr "repo.issues.label_edit"}}</a>
47+
<a class="ui right edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} data-num-issues="{{.NumIssues}}" data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{$.locale.Tr "repo.issues.label_edit"}}</a>
4848
{{else if $.PageIsOrgSettingsLabels}}
4949
<a class="ui right delete-button" href="#" data-url="{{$.Link}}/delete" data-id="{{.ID}}">{{svg "octicon-trash"}} {{$.locale.Tr "repo.issues.label_delete"}}</a>
50-
<a class="ui right edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{$.locale.Tr "repo.issues.label_edit"}}</a>
50+
<a class="ui right edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} data-num-issues="{{.NumIssues}}" data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{$.locale.Tr "repo.issues.label_edit"}}</a>
5151
{{end}}
5252
</div>
5353
</div>

templates/repo/issue/labels/label_new.tmpl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
<div class="required field">
99
<label for="name">{{.locale.Tr "repo.issues.label_title"}}</label>
1010
<div class="ui small input">
11-
<input class="new-label-input emoji-input" name="title" placeholder="{{.locale.Tr "repo.issues.new_label_placeholder"}}" autofocus required maxlength="50">
11+
<input class="label-name-input emoji-input" name="title" placeholder="{{.locale.Tr "repo.issues.new_label_placeholder"}}" autofocus required maxlength="50">
1212
</div>
1313
</div>
14-
<div class="field">
14+
<div class="field label-exclusive-input-field">
1515
<div class="ui checkbox">
16-
<input class="new-label-exclusive" name="exclusive" type="checkbox">
16+
<input class="label-exclusive-input" name="exclusive" type="checkbox">
1717
<label>{{.locale.Tr "repo.issues.label_exclusive"}}</label>
1818
</div>
1919
<br/>
@@ -22,7 +22,7 @@
2222
<div class="field">
2323
<label for="description">{{.locale.Tr "repo.issues.label_description"}}</label>
2424
<div class="ui small fluid input">
25-
<input class="new-label-desc-input" name="description" placeholder="{{.locale.Tr "repo.issues.new_label_desc_placeholder"}}" maxlength="200">
25+
<input class="label-desc-input" name="description" placeholder="{{.locale.Tr "repo.issues.new_label_desc_placeholder"}}" maxlength="200">
2626
</div>
2727
</div>
2828
<div class="field color-field">

web_src/js/features/comp/LabelEdit.js

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,36 @@
11
import $ from 'jquery';
22
import {initCompColorPicker} from './ColorPicker.js';
33

4+
function isExclusiveScopeName(name) {
5+
return /.*[^/]\/[^/].*/.test(name);
6+
}
7+
8+
function updateExclusiveLabelEdit(form) {
9+
const nameInput = $(`${form} .label-name-input`);
10+
const exclusiveField = $(`${form} .label-exclusive-input-field`);
11+
const exclusiveCheckbox = $(`${form} .label-exclusive-input`);
12+
const exclusiveWarning = $(`${form} .label-exclusive-warning`);
13+
14+
if (isExclusiveScopeName(nameInput.val())) {
15+
exclusiveField.removeClass('muted');
16+
if (exclusiveCheckbox.prop('checked') && exclusiveCheckbox.data('exclusive-warn')) {
17+
exclusiveWarning.removeClass('gt-hidden');
18+
} else {
19+
exclusiveWarning.addClass('gt-hidden');
20+
}
21+
} else {
22+
exclusiveField.addClass('muted');
23+
exclusiveWarning.addClass('gt-hidden');
24+
}
25+
}
26+
427
export function initCompLabelEdit(selector) {
528
if (!$(selector).length) return;
629
initCompColorPicker();
730

831
// Create label
932
$('.new-label.button').on('click', () => {
33+
updateExclusiveLabelEdit('.new-label');
1034
$('.new-label.modal').modal({
1135
onApprove() {
1236
$('.new-label.form').trigger('submit');
@@ -19,16 +43,40 @@ export function initCompLabelEdit(selector) {
1943
$('.edit-label-button').on('click', function () {
2044
$('.edit-label .color-picker').minicolors('value', $(this).data('color'));
2145
$('#label-modal-id').val($(this).data('id'));
22-
$('.edit-label .new-label-input').val($(this).data('title'));
23-
$('.edit-label .new-label-exclusive').prop('checked', this.hasAttribute('data-exclusive'));
24-
$('.edit-label .new-label-desc-input').val($(this).data('description'));
46+
47+
const nameInput = $('.edit-label .label-name-input');
48+
nameInput.val($(this).data('title'));
49+
50+
const exclusiveCheckbox = $('.edit-label .label-exclusive-input');
51+
exclusiveCheckbox.prop('checked', this.hasAttribute('data-exclusive'));
52+
// Warn when label was previously not exclusive and used in issues
53+
exclusiveCheckbox.data('exclusive-warn',
54+
$(this).data('num-issues') > 0 &&
55+
(!this.hasAttribute('data-exclusive') || !isExclusiveScopeName(nameInput.val())));
56+
updateExclusiveLabelEdit('.edit-label');
57+
58+
$('.edit-label .label-desc-input').val($(this).data('description'));
2559
$('.edit-label .color-picker').val($(this).data('color'));
2660
$('.edit-label .minicolors-swatch-color').css('background-color', $(this).data('color'));
61+
2762
$('.edit-label.modal').modal({
2863
onApprove() {
2964
$('.edit-label.form').trigger('submit');
3065
}
3166
}).modal('show');
3267
return false;
3368
});
69+
70+
$('.new-label .label-name-input').on('input', () => {
71+
updateExclusiveLabelEdit('.new-label');
72+
});
73+
$('.new-label .label-exclusive-input').on('change', () => {
74+
updateExclusiveLabelEdit('.new-label');
75+
});
76+
$('.edit-label .label-name-input').on('input', () => {
77+
updateExclusiveLabelEdit('.edit-label');
78+
});
79+
$('.edit-label .label-exclusive-input').on('change', () => {
80+
updateExclusiveLabelEdit('.edit-label');
81+
});
3482
}

web_src/less/_base.less

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,6 +1365,10 @@ a.ui.card:hover,
13651365
-webkit-text-fill-color: var(--color-black) !important;
13661366
}
13671367

1368+
.ui.form .field.muted {
1369+
opacity: var(--opacity-disabled);
1370+
}
1371+
13681372
.ui.loading.loading.input > i.icon svg {
13691373
visibility: hidden;
13701374
}

0 commit comments

Comments
 (0)