From ee2dd9d24c629b026be99dea8eeebb7479b854f3 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 24 Oct 2013 15:19:15 -0400 Subject: [PATCH] Working drop downs for category changing --- .../components/breadcrumbs_component.js | 16 ++++- .../components/categorydrop_component.js | 44 ++++++++++++ .../discourse-breadcrumbs.js.handlebars | 17 ++--- .../discourse-categorydrop.js.handlebars | 15 +++- app/assets/stylesheets/desktop/topic.scss | 69 ++++++++++++++++--- 5 files changed, 136 insertions(+), 25 deletions(-) create mode 100644 app/assets/javascripts/discourse/components/categorydrop_component.js diff --git a/app/assets/javascripts/discourse/components/breadcrumbs_component.js b/app/assets/javascripts/discourse/components/breadcrumbs_component.js index b60c811f372..05ae9585b67 100644 --- a/app/assets/javascripts/discourse/components/breadcrumbs_component.js +++ b/app/assets/javascripts/discourse/components/breadcrumbs_component.js @@ -1,5 +1,19 @@ Discourse.DiscourseBreadcrumbsComponent = Ember.Component.extend({ classNames: ['category-breadcrumb'], tagName: 'ol', - parentCategory: Em.computed.alias('category.parentCategory') + parentCategory: Em.computed.alias('category.parentCategory'), + + parentCategories: Em.computed.filter('categories', function(c) { + return !c.get('parentCategory'); + }), + + targetCategory: function() { + // Note we can't use Em.computed.or here because it returns a boolean not the object + return this.get('parentCategory') || this.get('category'); + }.property('parentCategory', 'category'), + + childCategories: Em.computed.filter('categories', function(c) { + return c.get('parentCategory') === this.get('targetCategory'); + }) + }); diff --git a/app/assets/javascripts/discourse/components/categorydrop_component.js b/app/assets/javascripts/discourse/components/categorydrop_component.js new file mode 100644 index 00000000000..e1cec611aa5 --- /dev/null +++ b/app/assets/javascripts/discourse/components/categorydrop_component.js @@ -0,0 +1,44 @@ +Discourse.DiscourseCategorydropComponent = Ember.Component.extend({ + + classNameBindings: ['category::no-category', 'categories:has-drop'], + tagName: 'li', + + iconClass: function() { + if (this.get('expanded')) { return "icon icon-caret-down"; } + return "icon icon-caret-right"; + }.property('expanded'), + + actions: { + expand: function() { + if (this.get('expanded')) { + this.close(); + return; + } + + if (this.get('categories')) { + this.set('expanded', true); + } + + var self = this, + $dropdown = this.$()[0]; + + $('html').on('click.category-drop', function(e) { + var closest = $(e.target).closest($dropdown); + return (closest.length && closest[0] === $dropdown) ? true : self.close(); + }); + } + }, + + close: function() { + $('html').off('click.category-drop'); + this.set('expanded', false); + }, + + didInsertElement: function() { + }, + + willDestroyElement: function() { + $('html').off('click.category-drop'); + } + +}); diff --git a/app/assets/javascripts/discourse/templates/components/discourse-breadcrumbs.js.handlebars b/app/assets/javascripts/discourse/templates/components/discourse-breadcrumbs.js.handlebars index e076c749ffb..c20dfc4a542 100644 --- a/app/assets/javascripts/discourse/templates/components/discourse-breadcrumbs.js.handlebars +++ b/app/assets/javascripts/discourse/templates/components/discourse-breadcrumbs.js.handlebars @@ -1,18 +1,9 @@ -
  • - {{title}} - -
  • +{{discourse-categorydrop title=title categories=parentCategories}} + +{{discourse-categorydrop category=targetCategory categories=childCategories}} {{#if parentCategory}} -
  • - {{discourse-categorydrop category=parentCategory categories=categories}} -
  • -{{/if}} - -{{#if category}} -
  • - {{discourse-categorydrop category=category}} -
  • + {{discourse-categorydrop category=category}} {{/if}}
    \ No newline at end of file diff --git a/app/assets/javascripts/discourse/templates/components/discourse-categorydrop.js.handlebars b/app/assets/javascripts/discourse/templates/components/discourse-categorydrop.js.handlebars index 35ba8bcf4a8..5be553f5c43 100644 --- a/app/assets/javascripts/discourse/templates/components/discourse-categorydrop.js.handlebars +++ b/app/assets/javascripts/discourse/templates/components/discourse-categorydrop.js.handlebars @@ -1,4 +1,15 @@ -{{categoryLink category}} +{{#if category}} + {{categoryLink category}} +{{else}} + {{title}} +{{/if}} + {{#if categories}} - + + +
    + {{#each categories}} +
    {{categoryLink this}}
    + {{/each}} +
    {{/if}} \ No newline at end of file diff --git a/app/assets/stylesheets/desktop/topic.scss b/app/assets/stylesheets/desktop/topic.scss index 3f156d29161..70451b2b8a9 100644 --- a/app/assets/stylesheets/desktop/topic.scss +++ b/app/assets/stylesheets/desktop/topic.scss @@ -203,25 +203,62 @@ ol.category-breadcrumb { margin: 0 0 10px 0; padding: 0; - .first-caret { - margin: 0 3px 0 3px; - color: #666; - font-size: 13px; - } - li { float: left; margin-right: 5px; border: 1px solid transparent; - height: 21px; - padding-top: 2px; + + &.no-category { + font-size: 13px; + + a { + margin-right: 3px; + margin-left: 4px; + + &:hover { + color: black; + } + } + + button { + padding-left: 6px; + &:hover { + background-color: #eee; + } + } + + &.has-drop:hover { + background-color: #f9f9f9; + button { + border-left: 1px solid #bbb; + } + } + + .category-menu { + margin-left: -1px; + padding: 8px 5px 0 3px; + } + } + + .badge-category { + margin: 0; + display: inline-block; + padding: 1px 6px 2px 6px; + } button { background: none; border: 1px solid transparent; - padding: 0px 4px; + padding: 0 4px 0 2px; margin: 0; + height: 22px; color: #666; + line-height: 13px; + text-align: center; + + i.icon-caret-down { + margin-left: -2px; + } } &.has-drop:hover { @@ -238,5 +275,19 @@ ol.category-breadcrumb { clear: both; } + .category-menu { + overflow-x: hidden; + overflow-y: scroll; + position: absolute; + border: 1px solid #ccc; + background-color: white; + width: 200px; + height: 200px; + padding: 8px 5px 0 7px; + z-index: 100; + div { + margin-bottom: 10px; + } + } }