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"}}