diff --git a/framework/core/ember/app/components/button-item.js b/framework/core/ember/app/components/button-item.js deleted file mode 100644 index ed81a892a..000000000 --- a/framework/core/ember/app/components/button-item.js +++ /dev/null @@ -1,18 +0,0 @@ -import Ember from 'ember'; - -export default Ember.View.extend({ - title: '', - icon: '', - class: '', - action: null, - - tagName: 'a', - classNames: ['btn'], - classNameBindings: ['class', 'disabled'], - - layout: Ember.Handlebars.compile('{{#if view.icon}}{{fa-icon view.icon class="fa-fw"}} {{/if}}{{view.title}}'), - - click: function() { - this.action(); - } -}); diff --git a/framework/core/ember/app/components/discussion-post.js b/framework/core/ember/app/components/discussion-post.js deleted file mode 100644 index 1eeaa9604..000000000 --- a/framework/core/ember/app/components/discussion-post.js +++ /dev/null @@ -1,55 +0,0 @@ -import Ember from 'ember'; - -import Menu from '../utils/menu'; -import MenuItem from '../components/menu-item'; - -export default Ember.View.extend({ - tagName: 'article', - templateName: 'discussion-post', - - controls: null, - - contentComponent: function() { - return 'post-type-'+this.get('post.type'); - }.property('post.type'), - - classNames: ['post'], - classNameBindings: ['post.deleted', 'post.edited'], - - construct: function() { - this.set('controls', Menu.create()); - - var post = this.get('post'); - - if (post.get('deleted')) { - this.addControl('restore', 'Restore', 'reply', 'canEdit'); - this.addControl('delete', 'Delete', 'times', 'canDelete'); - } else { - if (post.get('type') == 'comment') { - this.addControl('edit', 'Edit', 'pencil', 'canEdit'); - this.addControl('hide', 'Delete', 'times', 'canEdit'); - } else { - this.addControl('delete', 'Delete', 'times', 'canDelete'); - } - } - }.on('init'), - - didInsertElement: function() { - this.$().hide().fadeIn('slow'); - }, - - addControl: function(tag, title, icon, permissionAttribute) { - if (permissionAttribute && ! this.get('post').get(permissionAttribute)) { - return; - } - - var self = this; - var action = function(post) { - self.get('controller').send(actionName, post); - }; - - var item = MenuItem.extend({title: title, icon: icon, action: action}); - this.get('controls').addItem(tag, item); - } - -}); diff --git a/framework/core/ember/app/components/discussions-list-item.js b/framework/core/ember/app/components/discussions/discussion-listing.js similarity index 94% rename from framework/core/ember/app/components/discussions-list-item.js rename to framework/core/ember/app/components/discussions/discussion-listing.js index f9be29fc2..addf8019a 100755 --- a/framework/core/ember/app/components/discussions-list-item.js +++ b/framework/core/ember/app/components/discussions/discussion-listing.js @@ -1,12 +1,12 @@ - import Ember from 'ember'; -import Menu from '../utils/menu'; -import MenuItem from '../components/menu-item'; -export default Ember.View.extend({ +import TaggedArray from '../../utils/tagged-array'; +import ActionButton from '../ui/controls/action-button'; + +export default Ember.Component.extend({ _init: function() { - this.set('controls', Menu.create()); + // this.set('controls', Menu.create()); }.on('init'), tagName: 'li', @@ -18,7 +18,7 @@ export default Ember.View.extend({ 'discussion.following:following', 'active' ], - templateName: 'discussions-result', + templateName: 'components/discussions/discussion-listing', active: function() { return this.get('childViews').anyBy('active'); diff --git a/framework/core/ember/app/components/discussions/post.js b/framework/core/ember/app/components/discussions/post.js new file mode 100644 index 000000000..5e1bf63ad --- /dev/null +++ b/framework/core/ember/app/components/discussions/post.js @@ -0,0 +1,55 @@ +import Ember from 'ember'; + +import TaggedArray from '../../utils/tagged-array'; +import ActionButton from '../ui/controls/action-button'; + +export default Ember.Component.extend({ + tagName: 'article', + templateName: 'components/discussions/post', + + // controls: null, + + contentComponent: function() { + return 'discussions/post-'+this.get('post.type'); + }.property('post.type'), + + classNames: ['post'], + classNameBindings: ['post.deleted', 'post.edited'], + + construct: function() { + // this.set('controls', Menu.create()); + + // var post = this.get('post'); + + // if (post.get('deleted')) { + // this.addControl('restore', 'Restore', 'reply', 'canEdit'); + // this.addControl('delete', 'Delete', 'times', 'canDelete'); + // } else { + // if (post.get('type') == 'comment') { + // this.addControl('edit', 'Edit', 'pencil', 'canEdit'); + // this.addControl('hide', 'Delete', 'times', 'canEdit'); + // } else { + // this.addControl('delete', 'Delete', 'times', 'canDelete'); + // } + // } + }.on('init'), + + didInsertElement: function() { + this.$().hide().fadeIn('slow'); + }, + + addControl: function(tag, title, icon, permissionAttribute) { + if (permissionAttribute && ! this.get('post').get(permissionAttribute)) { + return; + } + + var self = this; + var action = function(post) { + self.get('controller').send(actionName, post); + }; + + var item = MenuItem.extend({title: title, icon: icon, action: action}); + this.get('controls').addItem(tag, item); + } + +}); diff --git a/framework/core/ember/app/components/discussion-item.js b/framework/core/ember/app/components/discussions/stream-item.js similarity index 98% rename from framework/core/ember/app/components/discussion-item.js rename to framework/core/ember/app/components/discussions/stream-item.js index 060a75d2c..919f3f872 100644 --- a/framework/core/ember/app/components/discussion-item.js +++ b/framework/core/ember/app/components/discussions/stream-item.js @@ -4,7 +4,7 @@ import Ember from 'ember'; // single item may represent a single post, or it may represent a gap of many // posts which have not been loaded. -export default Ember.View.extend({ +export default Ember.Component.extend({ classNames: ['item'], classNameBindings: ['item.gap:gap', 'loading', 'direction'], attributeBindings: [ diff --git a/framework/core/ember/app/components/discussion-scrollbar.js b/framework/core/ember/app/components/discussions/stream-scrollbar.js similarity index 97% rename from framework/core/ember/app/components/discussion-scrollbar.js rename to framework/core/ember/app/components/discussions/stream-scrollbar.js index e4acd0d5f..3f31dbd88 100644 --- a/framework/core/ember/app/components/discussion-scrollbar.js +++ b/framework/core/ember/app/components/discussions/stream-scrollbar.js @@ -1,8 +1,7 @@ import Ember from 'ember'; -import MenuItem from '../components/menu-item'; -import Scrollbar from '../utils/scrollbar'; -import PostStreamMixin from '../mixins/post-stream'; +import Scrollbar from '../../utils/scrollbar'; +import PostStreamMixin from '../../mixins/post-stream'; export default Ember.View.extend(PostStreamMixin, { @@ -10,7 +9,7 @@ export default Ember.View.extend(PostStreamMixin, { @property templateName @type String */ - templateName: 'components/discussion-scrollbar', + templateName: 'components/discussions/stream-scrollbar', classNames: ['scrubber', 'discussion-scrubber'], // An object which represents/ecapsulates the scrollbar. diff --git a/framework/core/ember/app/components/dropdown-button.js b/framework/core/ember/app/components/dropdown-button.js deleted file mode 100644 index bbbf25034..000000000 --- a/framework/core/ember/app/components/dropdown-button.js +++ /dev/null @@ -1,37 +0,0 @@ -import Ember from 'ember'; - -import MenuItemContainer from '../components/menu-item-container'; - -export default Ember.Component.extend({ - items: null, // NamedContainerView/Menu - layoutName: 'components/dropdown-button', - classNames: ['dropdown', 'btn-group'], - classNameBindings: ['itemCountClass'], - - title: 'Controls', - icon: 'ellipsis-v', - buttonClass: 'btn-default', - menuClass: 'pull-right', - - dropdownMenuClass: function() { - return 'dropdown-menu '+this.get('menuClass'); - }.property('menuClass'), - - itemCountClass: function() { - return 'item-count-'+this.get('items.length'); - }.property('items'), - - containedItems: function() { - var contained = []; - this.get('items').forEach(function(item) { - if (item.tagName != 'li') { - contained.push(MenuItemContainer.extend({ - item: item - })); - } else { - contained.push(item); - } - }); - return contained; - }.property('items.[]') -}); diff --git a/framework/core/ember/app/components/dropdown-split.js b/framework/core/ember/app/components/dropdown-split.js deleted file mode 100644 index 7465d159d..000000000 --- a/framework/core/ember/app/components/dropdown-split.js +++ /dev/null @@ -1,40 +0,0 @@ -import Ember from 'ember'; - -import MenuItemContainer from '../components/menu-item-container'; - -export default Ember.Component.extend({ - items: null, // NamedContainerView/Menu - layoutName: 'components/dropdown-split', - classNames: ['dropdown', 'dropdown-split', 'btn-group'], - classNameBindings: ['itemCountClass'], - - buttonClass: 'btn-default', - menuClass: 'pull-right', - icon: 'ellipsis-v', - - mainButtonClass: function() { - return 'btn '+this.get('buttonClass'); - }.property('buttonClass'), - - dropdownMenuClass: function() { - return 'dropdown-menu '+this.get('menuClass'); - }.property('menuClass'), - - itemCountClass: function() { - return 'item-count-'+this.get('items.length'); - }.property('items'), - - containedItems: function() { - var contained = []; - this.get('items').forEach(function(item) { - if (item.tagName != 'li') { - contained.push(MenuItemContainer.extend({ - item: item - })); - } else { - contained.push(item); - } - }); - return contained; - }.property('items.[]') -}); diff --git a/framework/core/ember/app/components/item-collection.js b/framework/core/ember/app/components/item-collection.js deleted file mode 100644 index a9a01a5cf..000000000 --- a/framework/core/ember/app/components/item-collection.js +++ /dev/null @@ -1,6 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Component.extend({ - tagName: 'ul', - layoutName: 'components/item-collection', -}); diff --git a/framework/core/ember/app/components/menu-list.js b/framework/core/ember/app/components/menu-list.js deleted file mode 100644 index da93e4c22..000000000 --- a/framework/core/ember/app/components/menu-list.js +++ /dev/null @@ -1,6 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Component.extend({ - tagName: 'ul', - layoutName: 'components/menu-list' -}); diff --git a/framework/core/ember/app/components/menu-item.js b/framework/core/ember/app/components/ui/controls/action-button.js similarity index 70% rename from framework/core/ember/app/components/menu-item.js rename to framework/core/ember/app/components/ui/controls/action-button.js index f96caadae..f24158268 100644 --- a/framework/core/ember/app/components/menu-item.js +++ b/framework/core/ember/app/components/ui/controls/action-button.js @@ -1,6 +1,6 @@ import Ember from 'ember'; -var MenuItem = Ember.Component.extend({ +export default Ember.Component.extend({ title: '', icon: '', className: '', @@ -8,6 +8,8 @@ var MenuItem = Ember.Component.extend({ divider: false, active: false, + classNames: ['btn', 'btn-default'], + tagName: 'a', attributeBindings: ['href'], classNameBindings: ['className'], @@ -19,14 +21,4 @@ var MenuItem = Ember.Component.extend({ // this.sendAction('action'); this.get('action')(); } -}); - -MenuItem.reopenClass({ - separator: function() { - return this.create({ - divider: true - }); - } -}) - -export default MenuItem; +}); \ No newline at end of file diff --git a/framework/core/ember/app/components/ui/controls/dropdown-button.js b/framework/core/ember/app/components/ui/controls/dropdown-button.js new file mode 100644 index 000000000..ff74c9287 --- /dev/null +++ b/framework/core/ember/app/components/ui/controls/dropdown-button.js @@ -0,0 +1,21 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + items: null, // TaggedArray + layoutName: 'components/ui/controls/dropdown-button', + classNames: ['dropdown', 'btn-group'], + classNameBindings: ['itemCountClass'], + + title: 'Controls', + icon: 'ellipsis-v', + buttonClass: 'btn-default', + menuClass: 'pull-right', + + dropdownMenuClass: function() { + return 'dropdown-menu '+this.get('menuClass'); + }.property('menuClass'), + + itemCountClass: function() { + return 'item-count-'+this.get('items.length'); + }.property('items.length') +}); diff --git a/framework/core/ember/app/components/dropdown-select.js b/framework/core/ember/app/components/ui/controls/dropdown-select.js similarity index 79% rename from framework/core/ember/app/components/dropdown-select.js rename to framework/core/ember/app/components/ui/controls/dropdown-select.js index 779c54120..367cdccbf 100644 --- a/framework/core/ember/app/components/dropdown-select.js +++ b/framework/core/ember/app/components/ui/controls/dropdown-select.js @@ -1,10 +1,8 @@ import Ember from 'ember'; -import Menu from '../utils/menu'; - export default Ember.Component.extend({ items: [], - layoutName: 'components/dropdown-select', + layoutName: 'components/ui/controls/dropdown-select', classNames: ['dropdown', 'dropdown-select', 'btn-group'], classNameBindings: ['itemCountClass'], @@ -24,7 +22,12 @@ export default Ember.Component.extend({ return 'item-count-'+this.get('items.length'); }.property('items.length'), - currentItem: function() { + activeItem: function() { return this.get('menu.childViews').findBy('active'); }.property('menu.childViews.@each.active') + +}).reopenClass({ + createWithItems: function(items) { + return this.create({items: items}); + } }); diff --git a/framework/core/ember/app/components/ui/controls/dropdown-split.js b/framework/core/ember/app/components/ui/controls/dropdown-split.js new file mode 100644 index 000000000..099479e69 --- /dev/null +++ b/framework/core/ember/app/components/ui/controls/dropdown-split.js @@ -0,0 +1,16 @@ +import Ember from 'ember'; + +import DropdownButton from './dropdown-button'; + +export default DropdownButton.extend({ + layoutName: 'components/ui/controls/dropdown-split', + classNames: ['dropdown', 'dropdown-split', 'btn-group'], + + mainButtonClass: function() { + return 'btn '+this.get('buttonClass'); + }.property('buttonClass'), + + firstItem: function() { + return this.get('items').objectAt(0); + }.property('items.[]') +}); diff --git a/framework/core/ember/app/components/ui/controls/item-list.js b/framework/core/ember/app/components/ui/controls/item-list.js new file mode 100644 index 000000000..72899f14e --- /dev/null +++ b/framework/core/ember/app/components/ui/controls/item-list.js @@ -0,0 +1,20 @@ +import Ember from 'ember'; + +import ComponentItem from '../items/component-item'; + +export default Ember.Component.extend({ + tagName: 'ul', + layoutName: 'components/ui/controls/item-list', + + listItems: function() { + if (!this.get('items')) return []; + var listItems = []; + this.get('items').forEach(function(item) { + if (item.tagName != 'li') { + item = ComponentItem.extend({component: item}); + } + listItems.push(item); + }); + return listItems; + }.property('items.[]') +}); diff --git a/framework/core/ember/app/components/loading-indicator.js b/framework/core/ember/app/components/ui/controls/loading-indicator.js similarity index 99% rename from framework/core/ember/app/components/loading-indicator.js rename to framework/core/ember/app/components/ui/controls/loading-indicator.js index 6da887851..fc3c97e22 100644 --- a/framework/core/ember/app/components/loading-indicator.js +++ b/framework/core/ember/app/components/ui/controls/loading-indicator.js @@ -1,7 +1,6 @@ import Ember from 'ember'; export default Ember.Component.extend({ - classNames: ['loading'], layout: Ember.Handlebars.compile(' '), @@ -9,5 +8,4 @@ export default Ember.Component.extend({ didInsertElement: function() { this.$().spin(this.get('size')); } - }); diff --git a/framework/core/ember/app/components/search-input.js b/framework/core/ember/app/components/ui/controls/search-input.js similarity index 100% rename from framework/core/ember/app/components/search-input.js rename to framework/core/ember/app/components/ui/controls/search-input.js diff --git a/framework/core/ember/app/components/select-input.js b/framework/core/ember/app/components/ui/controls/select-input.js similarity index 99% rename from framework/core/ember/app/components/select-input.js rename to framework/core/ember/app/components/ui/controls/select-input.js index 2800009a2..18c797501 100644 --- a/framework/core/ember/app/components/select-input.js +++ b/framework/core/ember/app/components/ui/controls/select-input.js @@ -1,9 +1,7 @@ import Ember from 'ember'; export default Ember.View.extend({ - tagName: 'span', classNames: ['select'], layout: Ember.Handlebars.compile('{{view "select" content=view.content optionValuePath=view.optionValuePath optionLabelPath=view.optionLabelPath value=view.value}} {{fa-icon "sort"}}') - }); diff --git a/framework/core/ember/app/components/menu-item-container.js b/framework/core/ember/app/components/ui/items/component-item.js similarity index 63% rename from framework/core/ember/app/components/menu-item-container.js rename to framework/core/ember/app/components/ui/items/component-item.js index bb7e0d3bd..5ab602774 100644 --- a/framework/core/ember/app/components/menu-item-container.js +++ b/framework/core/ember/app/components/ui/items/component-item.js @@ -2,5 +2,5 @@ import Ember from 'ember'; export default Ember.Component.extend({ tagName: 'li', - layoutName: 'components/menu-item-container' + layoutName: 'components/ui/items/component-item' }); diff --git a/framework/core/ember/app/components/nav-item.js b/framework/core/ember/app/components/ui/items/nav-item.js similarity index 100% rename from framework/core/ember/app/components/nav-item.js rename to framework/core/ember/app/components/ui/items/nav-item.js diff --git a/framework/core/ember/app/components/menu-item-separator.js b/framework/core/ember/app/components/ui/items/separator-item.js similarity index 57% rename from framework/core/ember/app/components/menu-item-separator.js rename to framework/core/ember/app/components/ui/items/separator-item.js index 4845311e3..3b1c679c8 100644 --- a/framework/core/ember/app/components/menu-item-separator.js +++ b/framework/core/ember/app/components/ui/items/separator-item.js @@ -1,6 +1,6 @@ import Ember from 'ember'; export default Ember.Component.extend({ - liClass: 'divider', - active: false -}); + tagName: 'li', + classNames: ['divider'] +}); \ No newline at end of file diff --git a/framework/core/ember/app/templates/application.hbs b/framework/core/ember/app/templates/application.hbs index 2f5eae784..483f43f9c 100644 --- a/framework/core/ember/app/templates/application.hbs +++ b/framework/core/ember/app/templates/application.hbs @@ -23,17 +23,17 @@ {{/link-to}} - {{menu-list items=headerPrimaryControls class="nav"}} + {{ui/controls/item-list items=headerPrimaryControls class="nav"}}
- {{menu-list items=headerSecondaryControls}} + {{ui/controls/item-list items=headerSecondaryControls}}
@@ -46,7 +46,7 @@ diff --git a/framework/core/ember/app/templates/components/discussion-post.hbs b/framework/core/ember/app/templates/components/discussion-post.hbs deleted file mode 100644 index 443143e5c..000000000 --- a/framework/core/ember/app/templates/components/discussion-post.hbs +++ /dev/null @@ -1,13 +0,0 @@ -{{#if view.controls}} -
- - {{menu-list items=view.controls class="dropdown-menu pull-right"}} -
-{{/if}} - -{{#link-to "discussion" view.post.discussion (query-params start=view.post.number) class="time"}} - {{abbreviate-time view.post.time}} - {{!-- #{{view.post.number}} (ID: {{view.post.id}}) --}} -{{/link-to}} - -{{dynamic-component type=view.contentComponent post=view.post}} diff --git a/framework/core/ember/app/templates/components/discussions-list-item.hbs b/framework/core/ember/app/templates/components/discussions/discussion-listing.hbs similarity index 87% rename from framework/core/ember/app/templates/components/discussions-list-item.hbs rename to framework/core/ember/app/templates/components/discussions/discussion-listing.hbs index bf443df94..096e67475 100644 --- a/framework/core/ember/app/templates/components/discussions-list-item.hbs +++ b/framework/core/ember/app/templates/components/discussions/discussion-listing.hbs @@ -1,7 +1,4 @@ -
- - {{menu-list items=controls class="dropdown-menu pull-right"}} -
+{{ui/controls/dropdown-button items=controls class="contextual-controls"}}
diff --git a/framework/core/ember/app/templates/components/post-type-comment.hbs b/framework/core/ember/app/templates/components/discussions/post-comment.hbs similarity index 100% rename from framework/core/ember/app/templates/components/post-type-comment.hbs rename to framework/core/ember/app/templates/components/discussions/post-comment.hbs diff --git a/framework/core/ember/app/templates/components/post-type-title.hbs b/framework/core/ember/app/templates/components/discussions/post-title.hbs similarity index 100% rename from framework/core/ember/app/templates/components/post-type-title.hbs rename to framework/core/ember/app/templates/components/discussions/post-title.hbs diff --git a/framework/core/ember/app/templates/components/discussions/post.hbs b/framework/core/ember/app/templates/components/discussions/post.hbs new file mode 100644 index 000000000..33b8bb121 --- /dev/null +++ b/framework/core/ember/app/templates/components/discussions/post.hbs @@ -0,0 +1,12 @@ +{{!-- {{#if view.controls}} +
+ + {{menu-list items=controls class="dropdown-menu pull-right"}} +
+{{/if}} --}} + +{{#link-to "discussion" post.discussion (query-params start=post.number) class="time"}} + {{abbreviate-time post.time}} +{{/link-to}} + +{{dynamic-component type=contentComponent post=post}} diff --git a/framework/core/ember/app/templates/components/discussion-scrollbar.hbs b/framework/core/ember/app/templates/components/discussions/scrollbar.hbs similarity index 100% rename from framework/core/ember/app/templates/components/discussion-scrollbar.hbs rename to framework/core/ember/app/templates/components/discussions/scrollbar.hbs diff --git a/framework/core/ember/app/templates/components/menu-item-container.hbs b/framework/core/ember/app/templates/components/menu-item-container.hbs deleted file mode 100644 index 6c76e440e..000000000 --- a/framework/core/ember/app/templates/components/menu-item-container.hbs +++ /dev/null @@ -1 +0,0 @@ -{{view item}} \ No newline at end of file diff --git a/framework/core/ember/app/templates/components/menu-list.hbs b/framework/core/ember/app/templates/components/menu-list.hbs deleted file mode 100644 index 0eddfdb34..000000000 --- a/framework/core/ember/app/templates/components/menu-list.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{{#each item in items}} - {{view item}} -{{/each}} diff --git a/framework/core/ember/app/templates/components/dropdown-button.hbs b/framework/core/ember/app/templates/components/ui/controls/dropdown-button.hbs similarity index 80% rename from framework/core/ember/app/templates/components/dropdown-button.hbs rename to framework/core/ember/app/templates/components/ui/controls/dropdown-button.hbs index 166c04c1c..d48fb2bc2 100644 --- a/framework/core/ember/app/templates/components/dropdown-button.hbs +++ b/framework/core/ember/app/templates/components/ui/controls/dropdown-button.hbs @@ -4,5 +4,5 @@ {{title}} {{fa-icon "caret-down" class="icon-caret"}} - {{menu-list items=containedItems class=dropdownMenuClass}} + {{ui/controls/item-list items=items class=dropdownMenuClass}} {{/if}} \ No newline at end of file diff --git a/framework/core/ember/app/templates/components/dropdown-select.hbs b/framework/core/ember/app/templates/components/ui/controls/dropdown-select.hbs similarity index 56% rename from framework/core/ember/app/templates/components/dropdown-select.hbs rename to framework/core/ember/app/templates/components/ui/controls/dropdown-select.hbs index c9edd6eaa..9a57f27c9 100644 --- a/framework/core/ember/app/templates/components/dropdown-select.hbs +++ b/framework/core/ember/app/templates/components/ui/controls/dropdown-select.hbs @@ -1,7 +1,7 @@ {{#if items}} - {{menu-list items=items class=dropdownMenuClass viewName="menu"}} + {{ui/controls/item-list items=items class=dropdownMenuClass viewName="menu"}} {{/if}} \ No newline at end of file diff --git a/framework/core/ember/app/templates/components/dropdown-split.hbs b/framework/core/ember/app/templates/components/ui/controls/dropdown-split.hbs similarity index 66% rename from framework/core/ember/app/templates/components/dropdown-split.hbs rename to framework/core/ember/app/templates/components/ui/controls/dropdown-split.hbs index 3175accb3..ecbb4ed42 100644 --- a/framework/core/ember/app/templates/components/dropdown-split.hbs +++ b/framework/core/ember/app/templates/components/ui/controls/dropdown-split.hbs @@ -1,8 +1,8 @@ {{#if items}} - {{view items.firstItem class=mainButtonClass}} + {{view firstItem class=mainButtonClass}} - {{menu-list items=containedItems class=dropdownMenuClass}} + {{ui/controls/item-list items=items class=dropdownMenuClass}} {{/if}} \ No newline at end of file diff --git a/framework/core/ember/app/templates/components/item-collection.hbs b/framework/core/ember/app/templates/components/ui/controls/item-list.hbs similarity index 50% rename from framework/core/ember/app/templates/components/item-collection.hbs rename to framework/core/ember/app/templates/components/ui/controls/item-list.hbs index 0eddfdb34..1d60ed182 100644 --- a/framework/core/ember/app/templates/components/item-collection.hbs +++ b/framework/core/ember/app/templates/components/ui/controls/item-list.hbs @@ -1,3 +1,3 @@ -{{#each item in items}} +{{#each item in listItems}} {{view item}} {{/each}} diff --git a/framework/core/ember/app/templates/components/search-input.hbs b/framework/core/ember/app/templates/components/ui/controls/search-input.hbs similarity index 100% rename from framework/core/ember/app/templates/components/search-input.hbs rename to framework/core/ember/app/templates/components/ui/controls/search-input.hbs diff --git a/framework/core/ember/app/templates/components/text-editor.hbs b/framework/core/ember/app/templates/components/ui/controls/text-editor.hbs similarity index 100% rename from framework/core/ember/app/templates/components/text-editor.hbs rename to framework/core/ember/app/templates/components/ui/controls/text-editor.hbs diff --git a/framework/core/ember/app/templates/components/ui/items/component-item.hbs b/framework/core/ember/app/templates/components/ui/items/component-item.hbs new file mode 100644 index 000000000..d56136e7a --- /dev/null +++ b/framework/core/ember/app/templates/components/ui/items/component-item.hbs @@ -0,0 +1 @@ +{{view component}} \ No newline at end of file diff --git a/framework/core/ember/app/templates/composer.hbs b/framework/core/ember/app/templates/composer.hbs index ec63b0940..0e6734076 100644 --- a/framework/core/ember/app/templates/composer.hbs +++ b/framework/core/ember/app/templates/composer.hbs @@ -11,7 +11,7 @@

{{{title}}}

- {{text-editor placeholder=""}} + {{ui/controls/text-editor placeholder=""}}
diff --git a/framework/core/ember/app/templates/discussions.hbs b/framework/core/ember/app/templates/discussions.hbs index c18e15832..c940cd9f5 100644 --- a/framework/core/ember/app/templates/discussions.hbs +++ b/framework/core/ember/app/templates/discussions.hbs @@ -1,44 +1,40 @@
- - {{#link-to (query-params show="discussions") class="btn btn-default btn-sm"}}{{fa-icon "bars"}}{{/link-to}} - {{#link-to (query-params show="posts") class="btn btn-default btn-sm"}}{{fa-icon "square-o"}}{{/link-to}} + + {{#link-to (query-params show="discussions") class="btn btn-default"}}{{fa-icon "bars"}}{{/link-to}} + {{#link-to (query-params show="posts") class="btn btn-default"}}{{fa-icon "square-o"}}{{/link-to}} - {{select-input - content=sortOptions - optionValuePath="content.sort" - optionLabelPath="content.label" - value=sort}} + {{ui/controls/select-input class="control-sort" content=sortOptions optionValuePath="content.sort" optionLabelPath="content.label" value=sort}}
- + {{#ui/controls/action-button class="control-markAsRead"}}{{fa-icon "check"}}{{/ui/controls/action-button}}
{{#if resultsLoading}} - {{loading-indicator size="small"}} + {{ui/controls/loading-indicator size="small"}} {{else}} {{#if moreResults}}
{{#if loadingMore}} - {{loading-indicator size="small"}} + {{ui/controls/loading-indicator size="small"}} {{else}} - + {{#ui/controls/action-button class="control-loadMore" action="loadMore"}}Load More{{/ui/controls/action-button}} {{/if}}
{{/if}} diff --git a/framework/core/ember/app/utils/menu.js b/framework/core/ember/app/utils/menu.js deleted file mode 100644 index 533eef4da..000000000 --- a/framework/core/ember/app/utils/menu.js +++ /dev/null @@ -1,14 +0,0 @@ -import Ember from 'ember'; - -import NamedContainerView from './named-container-view'; -import MenuItemSeparator from '../components/menu-item-separator'; - -export default NamedContainerView.extend({ - - i: 1, - addSeparator: function(index) { - var item = MenuItemSeparator; - this.addItem('separator'+(this.i++), item, index); - } - -}); diff --git a/framework/core/ember/app/utils/named-container-view.js b/framework/core/ember/app/utils/named-container-view.js deleted file mode 100644 index ca1f7b9b3..000000000 --- a/framework/core/ember/app/utils/named-container-view.js +++ /dev/null @@ -1,56 +0,0 @@ -import Ember from 'ember'; - -export default Ember.ArrayProxy.extend({ - - content: null, - namedViews: null, - - init: function() { - this.set('content', Ember.A()); // this is an important line. - this.set('namedViews', Ember.Object.create()); - this._super(); - }, - - // Add an item to the container. - addItem: function(name, viewClass, index) { - // view = this.createChildView(view); - - if (typeof index == 'undefined') { - index = this.get('length'); - } - this.replace(index, 0, [viewClass]); - this.get('namedViews').set(name, viewClass); - }, - - // Remove an item from the container. - removeItem: function(name) { - this.removeObject(this.get('namedViews').get(name)); - this.get('namedViews').set(name, null); - }, - - // Replace an item in the container with another one. - replaceItem: function(name, viewClass) { - // view = this.createChildView(view); - - var oldView = this.get('namedViews').get(name); - var index = this.indexOf(oldView); - this.replace(index, 1, [viewClass]) - this.get('namedViews').set(name, viewClass); - }, - - // Move an item in the container to a new position. - moveItem: function(name, index) { - var view = this.get('namedViews').get(name); - this.removeItem(name); - this.addItem(name, view, index); - }, - - firstItem: function() { - return this.objectAt(0); - }.property('content.@each'), - - getItem: function(name) { - return this.get('namedViews').get(name); - } - -}); diff --git a/framework/core/ember/app/utils/tagged-array.js b/framework/core/ember/app/utils/tagged-array.js new file mode 100644 index 000000000..76b253082 --- /dev/null +++ b/framework/core/ember/app/utils/tagged-array.js @@ -0,0 +1,57 @@ +import Ember from 'ember'; + +export default Ember.ArrayProxy.extend({ + content: null, + taggedObjects: null, + + init: function() { + this.set('content', []); + this.set('taggedObjects', {}); + this._super(); + }, + + pushObjectWithTag: function(obj, tag) { + this.insertAtWithTag(this.get('length'), obj, tag); + }, + + insertAtWithTag: function(idx, obj, tag) { + this.insertAt(idx, obj); + this.get('taggedObjects')[tag] = obj; + }, + + insertAfterTag: function(anchorTag, obj, tag) { + var idx = this.indexOfTag(anchorTag); + this.insertAtWithTag(idx + 1, obj, newTag); + }, + + insertBeforeTag: function(anchorTag, obj, tag) { + var idx = this.indexOfTag(anchorTag); + this.insertAtWithTag(idx - 1, obj, tag); + }, + + removeByTag: function(tag) { + var idx = this.indexOfTag(tag); + this.removeAt(idx); + delete this.get('taggedObjects')[tag]; + }, + + replaceByTag: function(tag, obj) { + var idx = this.indexOfTag(tag); + this.removeByTag(tag); + this.insertAtWithTag(idx, obj, tag); + }, + + moveByTag: function(tag, idx) { + var obj = this.objectByTag(tag); + this.removeByTag(tag); + this.insertAtWithTag(idx, obj, tag); + }, + + indexOfTag: function(tag) { + return this.indexOf(this.get('taggedObjects')[tag]); + }, + + objectByTag: function(tag) { + return this.get('taggedObjects')[tag]; + } +}); diff --git a/framework/core/ember/app/views/discussion.js b/framework/core/ember/app/views/discussion.js index 2b5a92e30..dff73d884 100644 --- a/framework/core/ember/app/views/discussion.js +++ b/framework/core/ember/app/views/discussion.js @@ -1,16 +1,15 @@ import Ember from 'ember'; -import NamedContainerView from '../utils/named-container-view'; -import Menu from '../utils/menu'; -import MenuItem from '../components/menu-item'; -import DropdownSplit from '../components/dropdown-split'; -import DropdownButton from '../components/dropdown-button'; -import DiscussionScrollbar from '../components/discussion-scrollbar'; +import TaggedArray from '../utils/tagged-array'; +import ActionButton from '../components/ui/controls/action-button'; +import DropdownSplit from '../components/ui/controls/dropdown-split'; +import DropdownButton from '../components/ui/controls/dropdown-button'; +import DiscussionScrollbar from '../components/discussions/stream-scrollbar'; import PostStreamMixin from '../mixins/post-stream'; export default Ember.View.extend(Ember.Evented, PostStreamMixin, { - sidebar: Ember.ContainerView, + sidebarItems: Ember.ContainerView, // Set up a new menu view that will contain controls to be shown in the // footer. The template will only render these controls if the last post is @@ -30,7 +29,7 @@ export default Ember.View.extend(Ember.Evented, PostStreamMixin, { didInsertElement: function() { // We've just inserted the discussion view. - this.trigger('populateSidebar', this.get('sidebar')); + // this.trigger('populateSidebar', this.get('sidebar')); // Whenever the window's scroll position changes, we want to check to // see if any terminal 'gaps' are in the viewport and trigger their @@ -60,14 +59,14 @@ export default Ember.View.extend(Ember.Evented, PostStreamMixin, { }, setupSidebar: function(sidebar) { - this.set('controls', Menu.create()); - this.trigger('populateControls', this.get('controls')); - sidebar.pushObject(DropdownSplit.create({ - items: this.get('controls'), + var items = TaggedArray.create(); + this.trigger('populateControls', items); + sidebarItems.pushObject(DropdownSplit.create({ + items: items, icon: 'reply', buttonClass: 'btn-primary', menuClass: 'pull-right' - })); + }), 'controls'); sidebar.pushObject(DropdownButton.create({items: this.get('controls')})); diff --git a/framework/core/ember/app/views/discussions.js b/framework/core/ember/app/views/discussions.js index b16e7ed47..30e1e4ec0 100644 --- a/framework/core/ember/app/views/discussions.js +++ b/framework/core/ember/app/views/discussions.js @@ -1,13 +1,13 @@ import Ember from 'ember'; -import DropdownSelect from '../components/dropdown-select'; -import ButtonItem from '../components/button-item'; -import NavItem from '../components/nav-item'; -import Menu from '../utils/menu'; +import DropdownSelect from '../components/ui/controls/dropdown-select'; +import ActionButton from '../components/ui/controls/action-button'; +import NavItem from '../components/ui/items/nav-item'; +import TaggedArray from '../utils/tagged-array'; export default Ember.View.extend({ - sidebarView: Ember.ContainerView.extend(), + sidebarItems: null, classNameBindings: ['pinned'], @@ -17,7 +17,9 @@ export default Ember.View.extend({ didInsertElement: function() { - this.trigger('populateSidebar', this.get('sidebar')); + var sidebarItems = TaggedArray.create(); + this.trigger('populateSidebar', sidebarItems); + this.set('sidebarItems', sidebarItems); var view = this; @@ -58,44 +60,37 @@ export default Ember.View.extend({ }); }, - setupSidebar: function(sidebar) { - sidebar.pushObject(ButtonItem.create({ + populateSidebarDefault: function(sidebar) { + var newDiscussion = ActionButton.create({ title: 'Start a Discussion', icon: 'edit', class: 'btn-primary' - })); + }) + sidebar.pushObjectWithTag(newDiscussion, 'newDiscussion'); - var nav = Menu.create(); + var nav = TaggedArray.create(); this.trigger('populateNav', nav); - sidebar.pushObject(DropdownSelect.create({ - items: nav - })); + sidebar.pushObjectWithTag(DropdownSelect.createWithItems(nav), 'nav'); }.on('populateSidebar'), - setupNav: function(nav) { - nav.addItem('all', NavItem.create({ + populateNavDefault: function(nav) { + nav.pushObjectWithTag(NavItem.create({ title: 'All Discussions', icon: 'comments-o', linkTo: '"discussions" (query-params filter="")' - })); + }), 'all'); - nav.addItem('private', NavItem.create({ + nav.pushObjectWithTag(NavItem.create({ title: 'Private', icon: 'envelope-o', linkTo: '"discussions" (query-params filter="private")' - })); + }), 'private'); - nav.addItem('following', NavItem.create({ + nav.pushObjectWithTag(NavItem.create({ title: 'Following', icon: 'star', linkTo: '"discussions" (query-params filter="following")' - })); - - nav.addItem('categories', NavItem.create({ - title: 'Categories', - icon: 'reorder', - linkTo: '"categories"' - })); + }), 'following'); }.on('populateNav'), willDestroyElement: function() {