diff --git a/common/static/common/js/discussion/views/discussion_topic_menu_view.js b/common/static/common/js/discussion/views/discussion_topic_menu_view.js
index 95c90cc366..5c2bd591ff 100644
--- a/common/static/common/js/discussion/views/discussion_topic_menu_view.js
+++ b/common/static/common/js/discussion/views/discussion_topic_menu_view.js
@@ -16,7 +16,7 @@
initialize: function(options) {
this.course_settings = options.course_settings;
this.currentTopicId = options.topicId;
- this.maxNameWidth = 26;
+ this.maxNameWidth = 100;
_.bindAll(this,
'toggleTopicDropdown', 'handleTopicEvent', 'hideTopicDropdown', 'ignoreClick'
);
@@ -90,6 +90,9 @@
this.dropdownButton.addClass('dropped');
this.topicMenu.show();
$(document.body).on('click.topicMenu', this.hideTopicDropdown);
+ // Set here because 1) the window might get resized and things could
+ // change and 2) can't set in initialize because the button is hidden
+ this.maxNameWidth = this.dropdownButton.width() - 40;
return this;
},
@@ -145,12 +148,29 @@
}
},
+ // @TODO move into utils.coffee
+ getNameWidth: function(name) {
+ var $test = $('
'),
+ width;
+
+ $test.css({
+ 'font-size': this.dropdownButton.css('font-size'),
+ 'opacity': 0,
+ 'position': 'absolute',
+ 'left': -1000,
+ 'top': -1000
+ }).html(name).appendTo(document.body);
+ width = $test.width();
+ $test.remove();
+ return width;
+ },
+
// @TODO move into utils.coffee
fitName: function(name) {
var ellipsisText = gettext('…'),
partialName, path, rawName;
- if (name.length < this.maxNameWidth) {
+ if (this.getNameWidth(name) < this.maxNameWidth) {
return name;
} else {
path = _.map(name.split('/'), function(item){
@@ -158,15 +178,15 @@
});
while (path.length > 1) {
path.shift();
- partialName = ellipsisText + '/' + path.join('/');
- if (partialName.length > this.maxNameWidth) {
- return partialName;
+ partialName = ellipsisText + ' / ' + path.join(' / ');
+ if (this.getNameWidth(partialName) < this.maxNameWidth) {
+ return partialName;
}
}
rawName = path[0];
name = ellipsisText + ' / ' + rawName;
- while (name.length > this.maxNameWidth) {
- rawName = rawName.slice(0, this.maxNameWidth);
+ while (this.getNameWidth(name) > this.maxNameWidth) {
+ rawName = rawName.slice(0, -1);
name = ellipsisText + ' / ' + rawName + ' ' + ellipsisText;
}
}
diff --git a/common/static/common/js/spec/discussion/view/discussion_topic_menu_view_spec.js b/common/static/common/js/spec/discussion/view/discussion_topic_menu_view_spec.js
index 36052be60c..36a0481041 100644
--- a/common/static/common/js/spec/discussion/view/discussion_topic_menu_view_spec.js
+++ b/common/static/common/js/spec/discussion/view/discussion_topic_menu_view_spec.js
@@ -10,7 +10,7 @@
}, options);
this.view = new DiscussionTopicMenuView(options);
this.view.render().appendTo('#fixture-element');
- this.defaultTextWidth = this.completeText.length;
+ this.defaultTextWidth = this.view.getNameWidth(this.completeText);
};
this.openMenu = function() {
@@ -68,10 +68,31 @@
expect(this.completeText).toEqual(dropdownText);
});
+ it('completely show just sub-category', function() {
+ var dropdownText;
+ this.createTopicView();
+ this.view.maxNameWidth = this.defaultTextWidth - 10;
+ this.view.$el.find('a.topic-title').first().click();
+ dropdownText = this.view.$el.find('.js-selected-topic').text();
+ expect(dropdownText.indexOf('…')).toEqual(0);
+ expect(dropdownText).toContain(this.selectedOptionText);
+ });
+
+ it('partially show sub-category', function() {
+ this.createTopicView();
+ var parentWidth = this.view.getNameWidth(this.parentCategoryText),
+ dropdownText;
+ this.view.maxNameWidth = this.defaultTextWidth - parentWidth;
+ this.view.$el.find('a.topic-title').first().click();
+ dropdownText = this.view.$el.find('.js-selected-topic').text();
+ expect(dropdownText.indexOf('…')).toEqual(0);
+ expect(dropdownText.lastIndexOf('…')).toBeGreaterThan(0);
+ });
+
it('broken span doesn\'t occur', function() {
var dropdownText;
this.createTopicView();
- this.view.maxNameWidth = this.selectedOptionText.length + 100;
+ this.view.maxNameWidth = this.view.getNameWidth(this.selectedOptionText) + 100;
this.view.$el.find('a.topic-title').first().click();
dropdownText = this.view.$el.find('.js-selected-topic').text();
expect(dropdownText.indexOf('/ span>')).toEqual(-1);
diff --git a/scripts/safelint_thresholds.json b/scripts/safelint_thresholds.json
index de94d25232..de4e1d036c 100644
--- a/scripts/safelint_thresholds.json
+++ b/scripts/safelint_thresholds.json
@@ -4,8 +4,8 @@
"javascript-escape": 7,
"javascript-interpolate": 49,
"javascript-jquery-append": 104,
- "javascript-jquery-html": 276,
- "javascript-jquery-insert-into-target": 27,
+ "javascript-jquery-html": 277,
+ "javascript-jquery-insert-into-target": 28,
"javascript-jquery-insertion": 29,
"javascript-jquery-prepend": 13,
"mako-html-entities": 0,