<div class="navigator">
-
- <div class="navigator-header">
- <h1 class="navigator-header-title">Issues</h1>
- </div>
-
+ <div class="navigator-header"></div>
<div class="navigator-filters"></div>
<div class="navigator-results"></div>
<div class="navigator-details"></div>
-
<div class="navigator-actions"></div>
-
</div>
-
<script id="filterBarTemplate" type="text/template">
<div class="navigator-filters-list"></div>
<button class="navigator-filter-submit"><%= message('search_verb') -%></button>
</script>
<%= render :partial => '/navigator/filter_templates' -%>
+<%= render :partial => '/issues/templates/header.hbs' -%>
<%= render :partial => '/issues/templates/issue.hbs' -%>
<%= render :partial => '/issues/templates/issues_actions.hbs' -%>
<%= render :partial => '/issues/templates/no_issues.hbs' -%>
-
+<%= render :partial => '/issues/templates/issues_details_favorite_filter.hbs' -%>
<script>
_.templateSettings = {
'any': '<%= escape_javascript message('any') -%>',
'anytime': '<%= escape_javascript message('anytime') -%>',
'all': '<%= escape_javascript message('all') -%>',
- 'manage': '<%= escape_javascript message('manage') -%>',
'to': '<%= escape_javascript message('to') -%>',
'project': '<%= escape_javascript message('issue_filter.criteria.project') -%>',
'severity': '<%= escape_javascript message('issue_filter.criteria.severity') -%>',
--- /dev/null
+<script id="issues-header-template" type="text/x-handlebars-template">
+ <h1 class="navigator-header-title">{{#if name}}{{name}}{{else}}<%= message ('issues') -%>{{/if}}</h1>
+
+ <div class="navigator-header-actions">
+ <button id="issues-new-search"><%= message ('issue_filter.new_search') -%></button>
+ {{#if canSave}}<button id="issues-filter-save"><%= message('save') -%></button>{{/if}}
+ {{#if canSaveAs}}<button id="issues-filter-save-as"><%= message('save_as') -%></button>{{/if}}
+ {{#if canCopy}}<button id="issues-filter-copy"><%= message('copy') -%></button>{{/if}}
+ {{#if canEdit}}<button id="issues-filter-edit"><%= message('edit') -%></button>{{/if}}
+ </div>
+</script>
--- /dev/null
+<script id="issues-details-favorite-filter-template" type="text/x-handlebars-template">
+ <ul class="navigator-filter-select-list">
+ {{#each items}}
+ <li>
+ <label data-id="{{id}}">{{{name}}}</label>
+ </li>
+ {{/each}}
+ <li class="line"></li>
+ <li class="manage">
+ <label id="manage-favorites"><%= message('manage') -%></label>
+ </li>
+ </ul>
+</script>
if (this.choices && this.selection && value.length > 0) {
this.selection.reset([]);
+ this.model.set({
+ value: value,
+ enabled: true
+ }, {
+ silent: true
+ });
if (_.isArray(param.text) && param.text.length === value.length) {
this.restoreFromText(value, param.text);
} else {
this.restoreByRequests(value);
}
+ } else {
+ this.clear();
}
},
onRestore: function(value) {
this.detailsView.updateLists();
- this.model.set({
- value: value,
- enabled: true
- }, {
- silent: true
- });
+ this.renderBase();
+ },
+
+
+ clear: function() {
+ this.model.unset('value');
+ if (this.selection && this.choices) {
+ this.choices.reset([]);
+ this.selection.reset([]);
+ }
this.renderBase();
},
detailsView: AjaxSelectDetailsFilterView
});
- this.selection = new ProjectSuggestions();
- this.choices = new ProjectSuggestions();
+ this.selection = new ComponentSuggestions();
+ this.choices = new ComponentSuggestions();
},
var param = _.findWhere(q, { key: this.model.get('property') });
if (param && param.value) {
this.restore(param.value, param);
+ } else {
+ this.clear();
}
},
},
+ clear: function() {
+ this.model.unset('value');
+ },
+
+
disable: function(e) {
e.stopPropagation();
this.hideDetails();
itemViewOptions: function() {
return {
- filterBarView: this
+ filterBarView: this,
+ app: this.options.app
};
},
render: function() {
Backbone.Marionette.CompositeView.prototype.render.apply(this, arguments);
- if (this.collection.where({ type: window.SS.FavoriteFilterView }).length > 0) {
+ if (this.collection.where({ type: window.SS.FavoriteFilterView }).length > 0 ||
+ this.collection.where({ type: window.SS.IssuesFavoriteFilterView }).length > 0) {
this.$el.addClass('navigator-filter-list-favorite');
}
},
*/
_.extend(window.SS, {
+ DetailsFavoriteFilterView: DetailsFavoriteFilterView,
FavoriteFilterView: FavoriteFilterView
});
});
this.renderBase();
+ } else {
+ this.clear();
+ }
+ },
+
+
+ clear: function() {
+ var that = this;
+ this.model.unset('value');
+ if (this.selection && this.choices) {
+ this.selection.each(function(m) {
+ that.choices.add(m);
+ });
+ this.selection.reset([]);
}
+ this.renderBase();
},
NavigatorApp.addRegions({
+ headerRegion: '.navigator-header',
filtersRegion: '.navigator-filters',
resultsRegion: '.navigator-results',
actionsRegion: '.navigator-actions'
this.issues = new window.SS.Issues();
this.issuesPage = 1;
+ this.favoriteFilter = new window.SS.FavoriteFilter();
+ this.issuesHeaderView = new window.SS.IssuesHeaderView({
+ app: this,
+ model: this.favoriteFilter
+ });
+ this.headerRegion.show(this.issuesHeaderView);
+
this.issuesView = new window.SS.IssuesView({
collection: this.issues
});
NavigatorApp.addInitializer(function() {
this.filters = new window.SS.Filters();
- if (_.isObject(window.SS.favorites)) {
- this.filters.add([
- new window.SS.Filter({
- type: window.SS.FavoriteFilterView,
- enabled: true,
- optional: false,
- choices: window.SS.favorites,
- favoriteUrl: '/issues/filter',
- manageUrl: '/issues/manage'
- })]);
- }
-
this.filters.add([
new window.SS.Filter({
name: window.SS.phrases.project,
]);
+ this.favoriteFilters = new window.SS.FavoriteFilters();
+ this.filters.unshift([
+ new window.SS.Filter({
+ type: window.SS.IssuesFavoriteFilterView,
+ enabled: true,
+ optional: false,
+ choices: this.favoriteFilters,
+ manageUrl: '/issues/manage'
+ })]);
+ this.favoriteFilters.fetch({
+ reset: true
+ });
+
+
this.filterBarView = new window.SS.IssuesFilterBarView({
app: this,
collection: this.filters,
this.router = new window.SS.IssuesRouter({
app: this
});
- Backbone.history.start()
+ Backbone.history.start();
+
+ var router = this.router;
+ this.favoriteFilter.on('change:query', function(model, query) {
+ router.navigate(query, { trigger: true });
+ });
});
var queryString = _.map(fullQuery, function(v, k) {
return [k, encodeURIComponent(v)].join('=');
- }).join('&');
+ }).join('|');
this.router.navigate(queryString);
};
jQuery(function() {
- var Issue = Backbone.Model.extend({
-
- });
-
-
-
+ var Issue = Backbone.Model.extend({});
var Issues = Backbone.Collection.extend({
model: Issue,
+ var FavoriteFilter = Backbone.Model.extend({
+
+ url: function() {
+ return baseUrl + '/api/issue_filters/show/' + this.get('id');
+ },
+
+
+ parse: function(r) {
+ return r.filter ? r.filter : r;
+ }
+ });
+
+
+
+ var FavoriteFilters = Backbone.Collection.extend({
+ model: FavoriteFilter,
+
+
+ url: function() {
+ return baseUrl + '/api/issue_filters/favorites';
+ },
+
+
+ parse: function(r) {
+ return r.favoriteFilters;
+ }
+ });
+
+
+
var IssueView = Backbone.Marionette.ItemView.extend({
template: Handlebars.compile(jQuery('#issue-template').html() || ''),
tagName: 'li',
+ var IssuesHeaderView = Backbone.Marionette.ItemView.extend({
+ template: Handlebars.compile(jQuery('#issues-header-template').html() || ''),
+
+
+ modelEvents: {
+ 'change': 'render'
+ },
+
+
+ events: {
+ 'click #issues-new-search': 'newSearch'
+ },
+
+
+ newSearch: function() {
+ this.options.app.router.navigate('', { trigger: true });
+ }
+
+ });
+
+
+
+ var IssuesDetailsFavoriteFilterView = window.SS.DetailsFavoriteFilterView.extend({
+ template: Handlebars.compile(jQuery('#issues-details-favorite-filter-template').html() || ''),
+
+
+ applyFavorite: function(e) {
+ var id = $j(e.target).data('id'),
+ filter = this.model.get('choices').get(id),
+ app = this.options.filterView.options.app;
+
+ filter.fetch({
+ success: function() {
+ app.favoriteFilter.set(filter.toJSON());
+ }
+ });
+
+ this.options.filterView.hideDetails();
+ },
+
+
+ serializeData: function() {
+ return _.extend({}, this.model.toJSON(), {
+ items: this.model.get('choices').toJSON()
+ });
+ }
+ });
+
+
+
+ var IssuesFavoriteFilterView = window.SS.FavoriteFilterView.extend({
+
+ initialize: function() {
+ window.SS.BaseFilterView.prototype.initialize.call(this, {
+ detailsView: IssuesDetailsFavoriteFilterView
+ });
+
+ this.listenTo(this.model.get('choices'), 'reset', this.render);
+ }
+ });
+
+
+
var IssuesRouter = Backbone.Router.extend({
routes: {
index: function(query) {
- var params = (query || '').split('&').map(function(t) {
+ var params = (query || '').split('|').map(function(t) {
return {
key: t.split('=')[0],
value: decodeURIComponent(t.split('=')[1])
_.extend(window.SS, {
Issue: Issue,
Issues: Issues,
+ FavoriteFilter: FavoriteFilter,
+ FavoriteFilters: FavoriteFilters,
IssueView: IssueView,
IssuesView: IssuesView,
IssuesActionsView: IssuesActionsView,
IssuesFilterBarView: IssuesFilterBarView,
+ IssuesHeaderView: IssuesHeaderView,
+ IssuesFavoriteFilterView: IssuesFavoriteFilterView,
IssuesRouter: IssuesRouter
});
padding: 0 10px;
border-bottom: 1px solid #cdcdcd;
background-color: #efefef;
+ font-size: 0;
}
.navigator-header-title {
+ position: relative;
+ top: -2px;
+ display: inline-block;
+ vertical-align: middle;
font-size: 20px;
line-height: 34px;
}
+.navigator-header-actions {
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 24px;
+}
+.navigator-header-actions > button {
+ position: relative;
+ z-index: 2;
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0;
+ padding: 2px 8px;
+ font-size: 11px;
+ font-weight: normal;
+ cursor: pointer;
+}
+.navigator-header-actions > button:hover,
+.navigator-header-actions > button:focus {
+ z-index: 3;
+}
+.navigator-header-actions > button + button {
+ left: -1px;
+}
.navigator-results {
border-right: 1px solid #e1e1e1;
background-color: #ffffff;
padding: 0 10px;
border-bottom: 1px solid #cdcdcd;
background-color: #efefef;
+ font-size: 0;
}
.navigator-header-title {
+ position: relative;
+ top: -2px;
+ display: inline-block;
+ vertical-align: middle;
font-size: 20px;
line-height: 34px;
}
+.navigator-header-actions {
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 24px;
+}
+.navigator-header-actions > button {
+ position: relative;
+ z-index: 2;
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0;
+ padding: 2px 8px;
+ font-size: 11px;
+ font-weight: normal;
+ cursor: pointer;
+}
+.navigator-header-actions > button:hover,
+.navigator-header-actions > button:focus {
+ z-index: 3;
+}
+.navigator-header-actions > button + button {
+ left: -1px;
+}
.navigator-results {
border-right: 1px solid #e1e1e1;
background-color: #ffffff;
padding: 0 @navigatorPadding;
border-bottom: 1px solid @navigatorBorderColor;
background-color: @navigatorBarBackground;
+ font-size: 0;
}
.navigator-header-title {
+ position: relative;
+ top: -2px;
+ display: inline-block;
+ vertical-align: middle;
font-size: 20px;
line-height: @navigatorHeaderHeight;
}
+.navigator-header-actions {
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 24px;
+
+ & > button {
+ position: relative;
+ z-index: 2;
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0;
+ padding: 2px 8px;
+ font-size: @smallFontSize;
+ font-weight: normal;
+ cursor: pointer;
+
+ &:hover, &:focus {
+ z-index: 3;
+ }
+ }
+
+ & > button + button {
+ left: -1px;
+ }
+}
+
// Results
@baseFontSize: 13px;
@baseFontColor: #444;
+@smallFontSize: 11px;