diff --git a/app/assets/javascripts/admin/components/permalinks-list.js.es6 b/app/assets/javascripts/admin/components/permalinks-list.js.es6 deleted file mode 100644 index c5027fe8e78..00000000000 --- a/app/assets/javascripts/admin/components/permalinks-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/permalinks-list-item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-emails-list.js.es6 b/app/assets/javascripts/admin/components/screened-emails-list.js.es6 deleted file mode 100644 index aaf883a3c98..00000000000 --- a/app/assets/javascripts/admin/components/screened-emails-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened-emails-list-item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 b/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 deleted file mode 100644 index 83abab4b8ca..00000000000 --- a/app/assets/javascripts/admin/components/screened-ip-addresses-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened-ip-addresses-list-item"}) -}); diff --git a/app/assets/javascripts/admin/components/screened-urls-list.js.es6 b/app/assets/javascripts/admin/components/screened-urls-list.js.es6 deleted file mode 100644 index b34bc3fc518..00000000000 --- a/app/assets/javascripts/admin/components/screened-urls-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 32, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/screened-urls-list-item"}) -}); diff --git a/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 b/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 deleted file mode 100644 index bf681755635..00000000000 --- a/app/assets/javascripts/admin/components/staff-action-logs-list.js.es6 +++ /dev/null @@ -1,8 +0,0 @@ -import ListView from 'ember-addons/list-view'; -import ListItemView from 'ember-addons/list-item-view'; - -export default ListView.extend({ - height: 700, - rowHeight: 75, - itemViewClass: ListItemView.extend({templateName: "admin/templates/logs/staff-action-logs-list-item"}) -}); diff --git a/app/assets/javascripts/admin/templates/components/permalinks-list.hbs b/app/assets/javascripts/admin/templates/components/permalinks-list.hbs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/assets/javascripts/admin/templates/logs/screened-emails-list-item.hbs b/app/assets/javascripts/admin/templates/logs/screened-emails-list-item.hbs deleted file mode 100644 index 27cbf419854..00000000000 --- a/app/assets/javascripts/admin/templates/logs/screened-emails-list-item.hbs +++ /dev/null @@ -1,10 +0,0 @@ -
-
{{email}}
-
-
{{actionName}}
-
{{match_count}}
-
{{age-with-tooltip last_match_at}}
-
{{age-with-tooltip created_at}}
-
{{ip_address}}
-
-
diff --git a/app/assets/javascripts/admin/templates/logs/screened-emails.hbs b/app/assets/javascripts/admin/templates/logs/screened-emails.hbs index b36d2a56886..685d8455c39 100644 --- a/app/assets/javascripts/admin/templates/logs/screened-emails.hbs +++ b/app/assets/javascripts/admin/templates/logs/screened-emails.hbs @@ -19,7 +19,22 @@
- {{screened-emails-list content=model}} + {{#each model as |item|}} +
+
+
{{item.email}}
+
+
{{item.actionName}}
+
{{item.match_count}}
+
{{age-with-tooltip item.last_match_at}}
+
{{age-with-tooltip item.created_at}}
+
{{item.ip_address}}
+
+ {{d-button action="clearBlock" actionParam=item icon="check" label="admin.logs.screened_emails.actions.allow"}} +
+
+
+ {{/each}} {{else}} diff --git a/app/assets/javascripts/admin/templates/logs/screened-ip-addresses-list-item.hbs b/app/assets/javascripts/admin/templates/logs/screened-ip-addresses-list-item.hbs deleted file mode 100644 index 056b86f9e59..00000000000 --- a/app/assets/javascripts/admin/templates/logs/screened-ip-addresses-list-item.hbs +++ /dev/null @@ -1,43 +0,0 @@ -
- {{#if editing}} - {{text-field value=ip_address autofocus="autofocus"}} - {{else}} - - {{#if isRange}} - {{ip_address}} - {{else}} - {{ip_address}} - {{/if}} - - {{/if}} -
-
- {{#if isBlocked}} - {{fa-icon "ban"}} - {{else}} - {{fa-icon "check"}} - {{/if}} - {{actionName}} -
-
{{match_count}}
-
- {{#if last_match_at}} - {{age-with-tooltip last_match_at}} - {{/if}} -
-
{{age-with-tooltip created_at}}
-
- {{#unless editing}} - {{d-button action="destroy" actionParam=this icon="trash-o" class="btn-danger"}} - {{d-button action="edit" actionParam=this icon="pencil"}} - {{#if isBlocked}} - {{d-button action="allow" actionParam=this icon="check" label="admin.logs.screened_ips.actions.do_nothing"}} - {{else}} - {{d-button action="block" actionParam=this icon="ban" label="admin.logs.screened_ips.actions.block"}} - {{/if}} - {{else}} - {{d-button action="save" actionParam=this label="admin.logs.save"}} - {{i18n 'cancel'}} - {{/unless}} -
-
diff --git a/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs b/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs index 82e4f888889..ca6c216f502 100644 --- a/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs +++ b/app/assets/javascripts/admin/templates/logs/screened-ip-addresses.hbs @@ -24,7 +24,53 @@
- {{screened-ip-addresses-list content=model}} + {{#each model as |item|}} +
+
+ {{#if item.editing}} + {{text-field value=item.ip_address autofocus="autofocus"}} + {{else}} + + {{#if item.isRange}} + {{item.ip_address}} + {{else}} + {{item.ip_address}} + {{/if}} + + {{/if}} +
+
+ {{#if item.isBlocked}} + {{fa-icon "ban"}} + {{else}} + {{fa-icon "check"}} + {{/if}} + {{item.actionName}} +
+
{{item.match_count}}
+
+ {{#if item.last_match_at}} + {{age-with-tooltip item.last_match_at}} + {{/if}} +
+
{{age-with-tooltip item.created_at}}
+
+ {{#unless item.editing}} + {{d-button action="destroy" actionParam=item icon="trash-o" class="btn-danger"}} + {{d-button action="edit" actionParam=item icon="pencil"}} + {{#if isBlocked}} + {{d-button action="allow" actionParam=item icon="check" label="admin.logs.screened_ips.actions.do_nothing"}} + {{else}} + {{d-button action="block" actionParam=item icon="ban" label="admin.logs.screened_ips.actions.block"}} + {{/if}} + {{else}} + {{d-button action="save" actionParam=item label="admin.logs.save"}} + {{i18n 'cancel'}} + {{/unless}} +
+
+
+ {{/each}} {{else}} diff --git a/app/assets/javascripts/admin/templates/logs/screened-urls-list-item.hbs b/app/assets/javascripts/admin/templates/logs/screened-urls-list-item.hbs deleted file mode 100644 index 234f2481296..00000000000 --- a/app/assets/javascripts/admin/templates/logs/screened-urls-list-item.hbs +++ /dev/null @@ -1,8 +0,0 @@ -
-
{{domain}}
-
-
{{actionName}}
-
{{match_count}}
-
{{age-with-tooltip last_match_at}}
-
{{age-with-tooltip created_at}}
-
diff --git a/app/assets/javascripts/admin/templates/logs/screened-urls.hbs b/app/assets/javascripts/admin/templates/logs/screened-urls.hbs index 68071cb32d6..40aaceba70d 100644 --- a/app/assets/javascripts/admin/templates/logs/screened-urls.hbs +++ b/app/assets/javascripts/admin/templates/logs/screened-urls.hbs @@ -16,7 +16,18 @@
- {{screened-urls-list content=model}} + {{#each model as |url|}} +
+
+
{{url.domain}}
+
+
{{url.actionName}}
+
{{url.match_count}}
+
{{age-with-tooltip url.last_match_at}}
+
{{age-with-tooltip url.created_at}}
+
+
+ {{/each}} {{else}} {{i18n 'search.no_results'}} diff --git a/app/assets/javascripts/admin/templates/logs/staff-action-logs-list-item.hbs b/app/assets/javascripts/admin/templates/logs/staff-action-logs-list-item.hbs deleted file mode 100644 index 266c1be7eb8..00000000000 --- a/app/assets/javascripts/admin/templates/logs/staff-action-logs-list-item.hbs +++ /dev/null @@ -1,28 +0,0 @@ -
- {{#link-to 'adminUser' acting_user}}{{avatar acting_user imageSize="tiny"}}{{/link-to}} - {{acting_user.username}} -
-
- {{actionName}} -
-
- {{#if target_user}} - {{#link-to 'adminUser' target_user}}{{avatar target_user imageSize="tiny"}}{{/link-to}} - {{target_user.username}} - {{/if}} - {{#if subject}} - {{subject}} - {{/if}} -
-
{{age-with-tooltip created_at}}
-
- {{{formattedDetails}}} - {{#if useCustomModalForDetails}} - {{i18n 'admin.logs.staff_actions.show'}} - {{/if}} - {{#if useModalForDetails}} - {{i18n 'admin.logs.staff_actions.show'}} - {{/if}} -
-
{{context}}
-
diff --git a/app/assets/javascripts/admin/templates/logs/staff-action-logs.hbs b/app/assets/javascripts/admin/templates/logs/staff-action-logs.hbs index 4b2654eadd9..18a622f958a 100644 --- a/app/assets/javascripts/admin/templates/logs/staff-action-logs.hbs +++ b/app/assets/javascripts/admin/templates/logs/staff-action-logs.hbs @@ -49,10 +49,39 @@ {{#conditional-loading-spinner condition=loading}} - {{#if model.length}} - {{staff-action-logs-list content=model}} + {{#each model as |item|}} +
+
+ {{#link-to 'adminUser' item.acting_user}}{{avatar item.acting_user imageSize="tiny"}}{{/link-to}} + {{item.acting_user.username}} +
+
+ {{item.actionName}} +
+
+ {{#if item.target_user}} + {{#link-to 'adminUser' item.target_user}}{{avatar item.target_user imageSize="tiny"}}{{/link-to}} + {{item.target_user.username}} + {{/if}} + {{#if item.subject}} + {{item.subject}} + {{/if}} +
+
{{age-with-tooltip item.created_at}}
+
+ {{{item.formattedDetails}}} + {{#if item.useCustomModalForDetails}} + {{i18n 'admin.logs.staff_actions.show'}} + {{/if}} + {{#if item.useModalForDetails}} + {{i18n 'admin.logs.staff_actions.show'}} + {{/if}} +
+
{{item.context}}
+
+
{{else}} {{i18n 'search.no_results'}} - {{/if}} + {{/each}} {{/conditional-loading-spinner}} diff --git a/app/assets/javascripts/admin/templates/permalinks-list-item.hbs b/app/assets/javascripts/admin/templates/permalinks-list-item.hbs deleted file mode 100644 index 2a143e07ed7..00000000000 --- a/app/assets/javascripts/admin/templates/permalinks-list-item.hbs +++ /dev/null @@ -1,23 +0,0 @@ -
{{url}}
-
- {{#if topic_id}} - {{topic_title}} - {{/if}} -
-
- {{#if post_id}} - #{{post_number}} {{post_topic_title}} - {{/if}} -
-
- {{#if category_id}} - {{category_name}} - {{/if}} -
-
- {{#if external_url}} - {{external_url}} - {{/if}} -
-
-
diff --git a/app/assets/javascripts/admin/templates/permalinks.hbs b/app/assets/javascripts/admin/templates/permalinks.hbs index 17b33b00370..3ff0b00539f 100644 --- a/app/assets/javascripts/admin/templates/permalinks.hbs +++ b/app/assets/javascripts/admin/templates/permalinks.hbs @@ -17,7 +17,35 @@
- {{permalinks-list content=model}} + {{#each model as |pl|}} +
+
{{pl.url}}
+
+ {{#if pl.topic_id}} + {{pl.topic_title}} + {{/if}} +
+
+ {{#if pl.post_id}} + #{{pl.post_number}} {{pl.post_topic_title}} + {{/if}} +
+
+ {{#if pl.category_id}} + {{pl.category_name}} + {{/if}} +
+
+ {{#if pl.external_url}} + {{pl.external_url}} + {{/if}} +
+
+ {{d-button action="destroy" actionParam=pl icon="trash-o" class="btn-danger"}} +
+
+
+ {{/each}} {{else}} {{i18n 'search.no_results'}} diff --git a/app/assets/javascripts/ember-addons/list-item-view-mixin.js.es6 b/app/assets/javascripts/ember-addons/list-item-view-mixin.js.es6 deleted file mode 100644 index a9faf184a76..00000000000 --- a/app/assets/javascripts/ember-addons/list-item-view-mixin.js.es6 +++ /dev/null @@ -1,45 +0,0 @@ -import Ember from 'ember'; - -function samePosition(a, b) { - return a && b && a.x === b.x && a.y === b.y; -} - -function positionElement() { - var element, position, _position; - - Ember.instrument('view.updateContext.positionElement', this, function() { - element = this.element; - position = this.position; - _position = this._position; - - if (!position || !element) { - return; - } - - // // TODO: avoid needing this by avoiding unnecessary - // // calls to this method in the first place - if (samePosition(position, _position)) { - return; - } - - Ember.run.schedule('render', this, this._parentView.applyTransform, this, position.x, position.y); - this._position = position; - }, this); -} - -export default Ember.Mixin.create({ - classNames: ['ember-list-item-view'], - style: Ember.String.htmlSafe(''), - attributeBindings: ['style'], - _position: null, - _positionElement: positionElement, - - positionElementWhenInserted: Ember.on('init', function(){ - this.one('didInsertElement', positionElement); - }), - - updatePosition: function(position) { - this.position = position; - this._positionElement(); - } -}); diff --git a/app/assets/javascripts/ember-addons/list-item-view.js.es6 b/app/assets/javascripts/ember-addons/list-item-view.js.es6 deleted file mode 100644 index bb24adc8541..00000000000 --- a/app/assets/javascripts/ember-addons/list-item-view.js.es6 +++ /dev/null @@ -1,57 +0,0 @@ -import Ember from 'ember'; -import ListItemViewMixin from './list-item-view-mixin'; - -var get = Ember.get, set = Ember.set; - -/** - The `Ember.ListItemView` view class renders a - [div](https://developer.mozilla.org/en/HTML/Element/div) HTML element - with `ember-list-item-view` class. It allows you to specify a custom item - handlebars template for `Ember.ListView`. - - Example: - - ```handlebars - - ``` - - ```javascript - App.ListView = Ember.ListView.extend({ - height: 500, - rowHeight: 20, - itemViewClass: Ember.ListItemView.extend({templateName: "row_item"}) - }); - ``` - - @extends Ember.View - @class ListItemView - @namespace Ember -*/ -export default Ember.View.extend(ListItemViewMixin, { - updateContext: function(newContext) { - var context = get(this, 'context'); - - Ember.instrument('view.updateContext.render', this, function() { - if (context !== newContext) { - set(this, 'context', newContext); - if (newContext && newContext.isController) { - set(this, 'controller', newContext); - } - } - }, this); - }, - - rerender: function () { - if (this.isDestroying || this.isDestroyed) { - return; - } - - return this._super.apply(this, arguments); - }, - - _contextDidChange: Ember.observer(function () { - Ember.run.once(this, this.rerender); - }, 'context', 'controller') -}); diff --git a/app/assets/javascripts/ember-addons/list-view-helper.js.es6 b/app/assets/javascripts/ember-addons/list-view-helper.js.es6 deleted file mode 100644 index 70053a194bd..00000000000 --- a/app/assets/javascripts/ember-addons/list-view-helper.js.es6 +++ /dev/null @@ -1,94 +0,0 @@ -import Ember from 'ember'; - -// TODO - remove this! -var el = document.body || document.createElement('div'); -var style = el.style; -var set = Ember.set; - -function getElementStyle (prop) { - var uppercaseProp = prop.charAt(0).toUpperCase() + prop.slice(1); - - var props = [ - prop, - 'webkit' + prop, - 'webkit' + uppercaseProp, - 'Moz' + uppercaseProp, - 'moz' + uppercaseProp, - 'ms' + uppercaseProp, - 'ms' + prop - ]; - - for (var i=0; i < props.length; i++) { - var property = props[i]; - - if (property in style) { - return property; - } - } - - return null; -} - -function getCSSStyle (attr) { - var styleName = getElementStyle(attr); - var prefix = styleName.toLowerCase().replace(attr, ''); - - var dic = { - webkit: '-webkit-' + attr, - moz: '-moz-' + attr, - ms: '-ms-' + attr - }; - - if (prefix && dic[prefix]) { - return dic[prefix]; - } - - return styleName; -} - -var styleAttributeName = getElementStyle('transform'); -var transformProp = getCSSStyle('transform'); -var perspectiveProp = getElementStyle('perspective'); -var supports2D = !!transformProp; -var supports3D = !!perspectiveProp; - -function setStyle (optionalStyleString) { - return function (obj, x, y) { - var isElement = obj instanceof Element; - - if (optionalStyleString && (supports2D || supports3D)) { - var style = Ember.String.fmt(optionalStyleString, x, y); - - if (isElement) { - obj.style[styleAttributeName] = Ember.String.htmlSafe(style); - } else { - set(obj, 'style', Ember.String.htmlSafe(transformProp + ': ' + style)); - } - } else { - if (isElement) { - obj.style.top = y; - obj.style.left = x; - } - } - }; -} - -export default { - transformProp: transformProp, - applyTransform: (function () { - if (supports2D) { - return setStyle('translate(%@px, %@px)'); - } - - return setStyle(); - })(), - apply3DTransform: (function () { - if (supports3D) { - return setStyle('translate3d(%@px, %@px, 0)'); - } else if (supports2D) { - return setStyle('translate(%@px, %@px)'); - } - - return setStyle(); - })() -}; diff --git a/app/assets/javascripts/ember-addons/list-view-mixin.js.es6 b/app/assets/javascripts/ember-addons/list-view-mixin.js.es6 deleted file mode 100644 index bcc0a444490..00000000000 --- a/app/assets/javascripts/ember-addons/list-view-mixin.js.es6 +++ /dev/null @@ -1,886 +0,0 @@ -// TODO: remove unused: false -/* jshint unused: false*/ -import Ember from 'ember'; -import ReusableListItemView from './reusable-list-item-view'; - -var get = Ember.get; -var set = Ember.set; -var min = Math.min; -var max = Math.max; -var floor = Math.floor; -var ceil = Math.ceil; -var forEach = Ember.ArrayPolyfills.forEach; - -function addContentArrayObserver() { - var content = get(this, 'content'); - if (content) { - content.addArrayObserver(this); - } -} - -function removeAndDestroy(object) { - this.removeObject(object); - object.destroy(); -} - -function syncChildViews() { - Ember.run.once(this, '_syncChildViews'); -} - -function sortByContentIndex (viewOne, viewTwo) { - return get(viewOne, 'contentIndex') - get(viewTwo, 'contentIndex'); -} - -function removeEmptyView() { - var emptyView = get(this, 'emptyView'); - if (emptyView && emptyView instanceof Ember.View) { - emptyView.removeFromParent(); - if (this.totalHeightDidChange !== undefined) { - this.totalHeightDidChange(); - } - } -} - -function addEmptyView() { - var emptyView = get(this, 'emptyView'); - - if (!emptyView) { - return; - } - - if ('string' === typeof emptyView) { - emptyView = get(emptyView) || emptyView; - } - - emptyView = this.createChildView(emptyView); - set(this, 'emptyView', emptyView); - - if (Ember.CoreView.detect(emptyView)) { - this._createdEmptyView = emptyView; - } - - this.unshiftObject(emptyView); -} - -function enableProfilingOutput() { - function before(name, time/*, payload*/) { - console.time(name); - } - - function after (name, time/*, payload*/) { - console.timeEnd(name); - } - - if (Ember.ENABLE_PROFILING) { - Ember.subscribe('view._scrollContentTo', { - before: before, - after: after - }); - Ember.subscribe('view.updateContext', { - before: before, - after: after - }); - } -} - -/** - @class Ember.ListViewMixin - @namespace Ember -*/ -export default Ember.Mixin.create({ - itemViewClass: ReusableListItemView, - emptyViewClass: Ember.View, - classNames: ['ember-list-view'], - attributeBindings: ['style'], - classNameBindings: ['_isGrid:ember-list-view-grid:ember-list-view-list'], - scrollTop: 0, - bottomPadding: 0, // TODO: maybe this can go away - _lastEndingIndex: 0, - paddingCount: 1, - _cachedPos: 0, - - _isGrid: Ember.computed.gt('columnCount', 1).readOnly(), - - /** - @private - - Setup a mixin. - - adding observer to content array - - creating child views based on height and length of the content array - - @method init - */ - init: function() { - this._super(); - this._cachedHeights = [0]; - this.on('didInsertElement', this._syncListContainerWidth); - this.columnCountDidChange(); - this._syncChildViews(); - this._addContentArrayObserver(); - }, - - _addContentArrayObserver: Ember.beforeObserver(function() { - addContentArrayObserver.call(this); - }, 'content'), - - /** - Called on your view when it should push strings of HTML into a - `Ember.RenderBuffer`. - - Adds a [div](https://developer.mozilla.org/en-US/docs/HTML/Element/div) - with a required `ember-list-container` class. - - @method render - @param {Ember.RenderBuffer} buffer The render buffer - */ - render: function (buffer) { - var element = buffer.element(); - var dom = buffer.dom; - var container = dom.createElement('div'); - container.className = 'ember-list-container'; - element.appendChild(container); - - this._childViewsMorph = dom.appendMorph(container, container, null); - - return container; - }, - - createChildViewsMorph: function (element) { - this._childViewsMorph = this._renderer._dom.createMorph(element.lastChild, element.lastChild, null); - return element; - }, - - willInsertElement: function() { - if (!this.get('height') || !this.get('rowHeight')) { - throw new Error('A ListView must be created with a height and a rowHeight.'); - } - this._super(); - }, - - /** - @private - - Sets inline styles of the view: - - height - - width - - position - - overflow - - -webkit-overflow - - overflow-scrolling - - Called while attributes binding. - - @property {Ember.ComputedProperty} style - */ - style: Ember.computed('height', 'width', function() { - var height, width, style, css; - - height = get(this, 'height'); - width = get(this, 'width'); - css = get(this, 'css'); - - style = ''; - - if (height) { - style += 'height:' + height + 'px;'; - } - - if (width) { - style += 'width:' + width + 'px;'; - } - - for ( var rule in css ) { - if (css.hasOwnProperty(rule)) { - style += rule + ':' + css[rule] + ';'; - } - } - - return Ember.String.htmlSafe(style); - }), - - /** - @private - - Performs visual scrolling. Is overridden in Ember.ListView. - - @method scrollTo - */ - scrollTo: function(y) { - throw new Error('must override to perform the visual scroll and effectively delegate to _scrollContentTo'); - }, - - /** - @private - - Internal method used to force scroll position - - @method scrollTo - */ - _scrollTo: Ember.K, - - /** - @private - @method _scrollContentTo - */ - _scrollContentTo: function(y) { - var startingIndex, endingIndex, - contentIndex, visibleEndingIndex, maxContentIndex, - contentIndexEnd, contentLength, scrollTop, content; - - scrollTop = max(0, y); - - if (this.scrollTop === scrollTop) { - return; - } - - // allow a visual overscroll, but don't scroll the content. As we are doing needless - // recycyling, and adding unexpected nodes to the DOM. - var maxScrollTop = max(0, get(this, 'totalHeight') - get(this, 'height')); - scrollTop = min(scrollTop, maxScrollTop); - - content = get(this, 'content'); - contentLength = get(content, 'length'); - startingIndex = this._startingIndex(contentLength); - - Ember.instrument('view._scrollContentTo', { - scrollTop: scrollTop, - content: content, - startingIndex: startingIndex, - endingIndex: min(max(contentLength - 1, 0), startingIndex + this._numChildViewsForViewport()) - }, function () { - this.scrollTop = scrollTop; - - maxContentIndex = max(contentLength - 1, 0); - - startingIndex = this._startingIndex(); - visibleEndingIndex = startingIndex + this._numChildViewsForViewport(); - - endingIndex = min(maxContentIndex, visibleEndingIndex); - - if (startingIndex === this._lastStartingIndex && - endingIndex === this._lastEndingIndex) { - - this.trigger('scrollYChanged', y); - return; - } else { - - Ember.run(this, function() { - this._reuseChildren(); - - this._lastStartingIndex = startingIndex; - this._lastEndingIndex = endingIndex; - this.trigger('scrollYChanged', y); - }); - } - }, this); - - }, - - /** - @private - - Computes the height for a `Ember.ListView` scrollable container div. - You must specify `rowHeight` parameter for the height to be computed properly. - - @property {Ember.ComputedProperty} totalHeight - */ - totalHeight: Ember.computed('content.length', - 'rowHeight', - 'columnCount', - 'bottomPadding', function() { - if (typeof this.heightForIndex === 'function') { - return this._totalHeightWithHeightForIndex(); - } else { - return this._totalHeightWithStaticRowHeight(); - } - }), - - _doRowHeightDidChange: function() { - this._cachedHeights = [0]; - this._cachedPos = 0; - this._syncChildViews(); - }, - - _rowHeightDidChange: Ember.observer('rowHeight', function() { - Ember.run.once(this, this._doRowHeightDidChange); - }), - - _totalHeightWithHeightForIndex: function() { - var length = this.get('content.length'); - return this._cachedHeightLookup(length); - }, - - _totalHeightWithStaticRowHeight: function() { - var contentLength, rowHeight, columnCount, bottomPadding; - - contentLength = get(this, 'content.length'); - rowHeight = get(this, 'rowHeight'); - columnCount = get(this, 'columnCount'); - bottomPadding = get(this, 'bottomPadding'); - - return ((ceil(contentLength / columnCount)) * rowHeight) + bottomPadding; - }, - - /** - @private - @method _prepareChildForReuse - */ - _prepareChildForReuse: function(childView) { - childView.prepareForReuse(); - }, - - createChildView: function (_view) { - return this._super(_view, this._itemViewProps || {}); - }, - - /** - @private - @method _reuseChildForContentIndex - */ - _reuseChildForContentIndex: function(childView, contentIndex) { - var content, context, newContext, childsCurrentContentIndex, position, enableProfiling, oldChildView; - - var contentViewClass = this.itemViewForIndex(contentIndex); - - if (childView.constructor !== contentViewClass) { - // rather then associative arrays, lets move childView + contentEntry maping to a Map - var i = this._childViews.indexOf(childView); - childView.destroy(); - childView = this.createChildView(contentViewClass); - this.insertAt(i, childView); - } - - content = get(this, 'content'); - enableProfiling = get(this, 'enableProfiling'); - position = this.positionForIndex(contentIndex); - childView.updatePosition(position); - - set(childView, 'contentIndex', contentIndex); - - if (enableProfiling) { - Ember.instrument('view._reuseChildForContentIndex', position, function() { - - }, this); - } - - newContext = content.objectAt(contentIndex); - childView.updateContext(newContext); - }, - - /** - @private - @method positionForIndex - */ - positionForIndex: function(index) { - if (typeof this.heightForIndex !== 'function') { - return this._singleHeightPosForIndex(index); - } - else { - return this._multiHeightPosForIndex(index); - } - }, - - _singleHeightPosForIndex: function(index) { - var elementWidth, width, columnCount, rowHeight, y, x; - - elementWidth = get(this, 'elementWidth') || 1; - width = get(this, 'width') || 1; - columnCount = get(this, 'columnCount'); - rowHeight = get(this, 'rowHeight'); - - y = (rowHeight * floor(index/columnCount)); - x = (index % columnCount) * elementWidth; - - return { - y: y, - x: x - }; - }, - - // 0 maps to 0, 1 maps to heightForIndex(i) - _multiHeightPosForIndex: function(index) { - var elementWidth, width, columnCount, rowHeight, y, x; - - elementWidth = get(this, 'elementWidth') || 1; - width = get(this, 'width') || 1; - columnCount = get(this, 'columnCount'); - - x = (index % columnCount) * elementWidth; - y = this._cachedHeightLookup(index); - - return { - x: x, - y: y - }; - }, - - _cachedHeightLookup: function(index) { - for (var i = this._cachedPos; i < index; i++) { - this._cachedHeights[i + 1] = this._cachedHeights[i] + this.heightForIndex(i); - } - this._cachedPos = i; - return this._cachedHeights[index]; - }, - - /** - @private - @method _childViewCount - */ - _childViewCount: function() { - var contentLength, childViewCountForHeight; - - contentLength = get(this, 'content.length'); - childViewCountForHeight = this._numChildViewsForViewport(); - - return min(contentLength, childViewCountForHeight); - }, - - /** - @private - - Returns a number of columns in the Ember.ListView (for grid layout). - - If you want to have a multi column layout, you need to specify both - `width` and `elementWidth`. - - If no `elementWidth` is specified, it returns `1`. Otherwise, it will - try to fit as many columns as possible for a given `width`. - - @property {Ember.ComputedProperty} columnCount - */ - columnCount: Ember.computed('width', 'elementWidth', function() { - var elementWidth, width, count; - - elementWidth = get(this, 'elementWidth'); - width = get(this, 'width'); - - if (elementWidth && width > elementWidth) { - count = floor(width / elementWidth); - } else { - count = 1; - } - - return count; - }), - - /** - @private - - Fires every time column count is changed. - - @event columnCountDidChange - */ - columnCountDidChange: Ember.observer(function() { - var ratio, currentScrollTop, proposedScrollTop, maxScrollTop, - scrollTop, lastColumnCount, newColumnCount, element; - - lastColumnCount = this._lastColumnCount; - - currentScrollTop = this.scrollTop; - newColumnCount = get(this, 'columnCount'); - maxScrollTop = get(this, 'maxScrollTop'); - element = this.element; - - this._lastColumnCount = newColumnCount; - - if (lastColumnCount) { - ratio = (lastColumnCount / newColumnCount); - proposedScrollTop = currentScrollTop * ratio; - scrollTop = min(maxScrollTop, proposedScrollTop); - - this._scrollTo(scrollTop); - this.scrollTop = scrollTop; - } - - if (arguments.length > 0) { - // invoked by observer - Ember.run.schedule('afterRender', this, this._syncListContainerWidth); - } - }, 'columnCount'), - - /** - @private - - Computes max possible scrollTop value given the visible viewport - and scrollable container div height. - - @property {Ember.ComputedProperty} maxScrollTop - */ - maxScrollTop: Ember.computed('height', 'totalHeight', function(){ - var totalHeight, viewportHeight; - - totalHeight = get(this, 'totalHeight'); - viewportHeight = get(this, 'height'); - - return max(0, totalHeight - viewportHeight); - }), - - /** - @private - - Determines whether the emptyView is the current childView. - - @method _isChildEmptyView - */ - _isChildEmptyView: function() { - var emptyView = get(this, 'emptyView'); - - return emptyView && emptyView instanceof Ember.View && - this._childViews.length === 1 && this._childViews.indexOf(emptyView) === 0; - }, - - /** - @private - - Computes the number of views that would fit in the viewport area. - You must specify `height` and `rowHeight` parameters for the number of - views to be computed properly. - - @method _numChildViewsForViewport - */ - _numChildViewsForViewport: function() { - - if (this.heightForIndex) { - return this._numChildViewsForViewportWithMultiHeight(); - } else { - return this._numChildViewsForViewportWithoutMultiHeight(); - } - }, - - _numChildViewsForViewportWithoutMultiHeight: function() { - var height, rowHeight, paddingCount, columnCount; - - height = get(this, 'height'); - rowHeight = get(this, 'rowHeight'); - paddingCount = get(this, 'paddingCount'); - columnCount = get(this, 'columnCount'); - - return (ceil(height / rowHeight) * columnCount) + (paddingCount * columnCount); - }, - - _numChildViewsForViewportWithMultiHeight: function() { - var rowHeight, paddingCount, columnCount; - var scrollTop = this.scrollTop; - var viewportHeight = this.get('height'); - var length = this.get('content.length'); - var heightfromTop = 0; - var padding = get(this, 'paddingCount'); - - var startingIndex = this._calculatedStartingIndex(); - var currentHeight = 0; - - var offsetHeight = this._cachedHeightLookup(startingIndex); - for (var i = 0; i < length; i++) { - if (this._cachedHeightLookup(startingIndex + i + 1) - offsetHeight > viewportHeight) { - break; - } - } - - return i + padding + 1; - }, - - - /** - @private - - Computes the starting index of the item views array. - Takes `scrollTop` property of the element into account. - - Is used in `_syncChildViews`. - - @method _startingIndex - */ - _startingIndex: function(_contentLength) { - var scrollTop, rowHeight, columnCount, calculatedStartingIndex, - contentLength; - - if (_contentLength === undefined) { - contentLength = get(this, 'content.length'); - } else { - contentLength = _contentLength; - } - - scrollTop = this.scrollTop; - rowHeight = get(this, 'rowHeight'); - columnCount = get(this, 'columnCount'); - - if (this.heightForIndex) { - calculatedStartingIndex = this._calculatedStartingIndex(); - } else { - calculatedStartingIndex = floor(scrollTop / rowHeight) * columnCount; - } - - var viewsNeededForViewport = this._numChildViewsForViewport(); - var paddingCount = (1 * columnCount); - var largestStartingIndex = max(contentLength - viewsNeededForViewport, 0); - - return min(calculatedStartingIndex, largestStartingIndex); - }, - - _calculatedStartingIndex: function() { - var rowHeight, paddingCount, columnCount; - var scrollTop = this.scrollTop; - var viewportHeight = this.get('height'); - var length = this.get('content.length'); - var heightfromTop = 0; - var padding = get(this, 'paddingCount'); - - for (var i = 0; i < length; i++) { - if (this._cachedHeightLookup(i + 1) >= scrollTop) { - break; - } - } - - return i; - }, - - /** - @private - @event contentWillChange - */ - contentWillChange: Ember.beforeObserver(function() { - var content = get(this, 'content'); - - if (content) { - content.removeArrayObserver(this); - } - }, 'content'), - - /**), - @private - @event contentDidChange - */ - contentDidChange: Ember.observer(function() { - addContentArrayObserver.call(this); - syncChildViews.call(this); - }, 'content'), - - /** - @private - @property {Function} needsSyncChildViews - */ - needsSyncChildViews: Ember.observer(syncChildViews, 'height', 'width', 'columnCount'), - - /** - @private - - Returns a new item view. Takes `contentIndex` to set the context - of the returned view properly. - - @param {Number} contentIndex item index in the content array - @method _addItemView - */ - _addItemView: function (contentIndex) { - var itemViewClass, childView; - - itemViewClass = this.itemViewForIndex(contentIndex); - childView = this.createChildView(itemViewClass); - this.pushObject(childView); - }, - - /** - @public - - Returns a view class for the provided contentIndex. If the view is - different then the one currently present it will remove the existing view - and replace it with an instance of the class provided - - @param {Number} contentIndex item index in the content array - @method _addItemView - @returns {Ember.View} ember view class for this index - */ - itemViewForIndex: function(contentIndex) { - return get(this, 'itemViewClass'); - }, - - /** - @public - - Returns a view class for the provided contentIndex. If the view is - different then the one currently present it will remove the existing view - and replace it with an instance of the class provided - - @param {Number} contentIndex item index in the content array - @method _addItemView - @returns {Ember.View} ember view class for this index - */ - heightForIndex: null, - - /** - @private - - Intelligently manages the number of childviews. - - @method _syncChildViews - **/ - _syncChildViews: function () { - var childViews, childViewCount, - numberOfChildViews, numberOfChildViewsNeeded, - contentIndex, startingIndex, endingIndex, - contentLength, emptyView, count, delta; - - if (this.isDestroyed || this.isDestroying) { - return; - } - - contentLength = get(this, 'content.length'); - emptyView = get(this, 'emptyView'); - - childViewCount = this._childViewCount(); - childViews = this.positionOrderedChildViews(); - - if (this._isChildEmptyView()) { - removeEmptyView.call(this); - } - - startingIndex = this._startingIndex(); - endingIndex = startingIndex + childViewCount; - - numberOfChildViewsNeeded = childViewCount; - numberOfChildViews = childViews.length; - - delta = numberOfChildViewsNeeded - numberOfChildViews; - - if (delta === 0) { - // no change - } else if (delta > 0) { - // more views are needed - contentIndex = this._lastEndingIndex; - - for (count = 0; count < delta; count++, contentIndex++) { - this._addItemView(contentIndex); - } - } else { - // less views are needed - forEach.call( - childViews.splice(numberOfChildViewsNeeded, numberOfChildViews), - removeAndDestroy, - this - ); - } - - this._reuseChildren(); - - this._lastStartingIndex = startingIndex; - this._lastEndingIndex = this._lastEndingIndex + delta; - - if (contentLength === 0 || contentLength === undefined) { - addEmptyView.call(this); - } - }, - - /** - @private - - Applies an inline width style to the list container. - - @method _syncListContainerWidth - **/ - _syncListContainerWidth: function() { - var elementWidth, columnCount, containerWidth, element; - - elementWidth = get(this, 'elementWidth'); - columnCount = get(this, 'columnCount'); - containerWidth = elementWidth * columnCount; - element = this.$('.ember-list-container'); - - if (containerWidth && element) { - element.css('width', containerWidth); - } - }, - - /** - @private - @method _reuseChildren - */ - _reuseChildren: function(){ - var contentLength, childViews, childViewsLength, - startingIndex, endingIndex, childView, attrs, - contentIndex, visibleEndingIndex, maxContentIndex, - contentIndexEnd, scrollTop; - - scrollTop = this.scrollTop; - contentLength = get(this, 'content.length'); - maxContentIndex = max(contentLength - 1, 0); - childViews = this.getReusableChildViews(); - childViewsLength = childViews.length; - - startingIndex = this._startingIndex(); - visibleEndingIndex = startingIndex + this._numChildViewsForViewport(); - - endingIndex = min(maxContentIndex, visibleEndingIndex); - - contentIndexEnd = min(visibleEndingIndex, startingIndex + childViewsLength); - - for (contentIndex = startingIndex; contentIndex < contentIndexEnd; contentIndex++) { - childView = childViews[contentIndex % childViewsLength]; - this._reuseChildForContentIndex(childView, contentIndex); - } - }, - - /** - @private - @method getReusableChildViews - */ - getReusableChildViews: function() { - return this._childViews; - }, - - /** - @private - @method positionOrderedChildViews - */ - positionOrderedChildViews: function() { - return this.getReusableChildViews().sort(sortByContentIndex); - }, - - arrayWillChange: Ember.K, - - /** - @private - @event arrayDidChange - */ - // TODO: refactor - arrayDidChange: function(content, start, removedCount, addedCount) { - var index, contentIndex, state; - - if (this._isChildEmptyView()) { - removeEmptyView.call(this); - } - - // Support old and new Ember versions - state = this._state || this.state; - - if (state === 'inDOM') { - // ignore if all changes are out of the visible change - if (start >= this._lastStartingIndex || start < this._lastEndingIndex) { - index = 0; - // ignore all changes not in the visible range - // this can re-position many, rather then causing a cascade of re-renders - forEach.call( - this.positionOrderedChildViews(), - function(childView) { - contentIndex = this._lastStartingIndex + index; - this._reuseChildForContentIndex(childView, contentIndex); - index++; - }, - this - ); - } - - syncChildViews.call(this); - } - }, - - destroy: function () { - if (!this._super()) { - return; - } - - if (this._createdEmptyView) { - this._createdEmptyView.destroy(); - } - - return this; - } -}); diff --git a/app/assets/javascripts/ember-addons/list-view.js.es6 b/app/assets/javascripts/ember-addons/list-view.js.es6 deleted file mode 100644 index d931babeb08..00000000000 --- a/app/assets/javascripts/ember-addons/list-view.js.es6 +++ /dev/null @@ -1,167 +0,0 @@ -import Ember from 'ember'; -import ListViewHelper from './list-view-helper'; -import ListViewMixin from './list-view-mixin'; - -var get = Ember.get; - -/** - The `Ember.ListView` view class renders a - [div](https://developer.mozilla.org/en/HTML/Element/div) HTML element, - with `ember-list-view` class. - - The context of each item element within the `Ember.ListView` are populated - from the objects in the `ListView`'s `content` property. - - ### `content` as an Array of Objects - - The simplest version of an `Ember.ListView` takes an array of object as its - `content` property. The object will be used as the `context` each item element - inside the rendered `div`. - - Example: - - ```javascript - App.ContributorsRoute = Ember.Route.extend({ - model: function () { - return [ - { name: 'Stefan Penner' }, - { name: 'Alex Navasardyan' }, - { name: 'Ray Cohen'} - ]; - } - }); - ``` - - ```handlebars - {{#ember-list items=contributors height=500 rowHeight=50}} - {{name}} - {{/ember-list}} - ``` - - Would result in the following HTML: - - ```html -
-
-
- Stefan Penner -
-
- Alex Navasardyan -
-
- Ray Cohen -
-
-
- ``` - - By default `Ember.ListView` provides support for `height`, - `rowHeight`, `width`, `elementWidth`, `scrollTop` parameters. - - Note, that `height` and `rowHeight` are required parameters. - - ```handlebars - {{#ember-list items=this height=500 rowHeight=50}} - {{name}} - {{/ember-list}} - ``` - - If you would like to have multiple columns in your view layout, you can - set `width` and `elementWidth` parameters respectively. - - ```handlebars - {{#ember-list items=this height=500 rowHeight=50 width=500 elementWidth=80}} - {{name}} - {{/ember-list}} - ``` - - ### Extending `Ember.ListView` - - Example: - - ```handlebars - {{view 'list-view' content=content}} - - - ``` - - ```javascript - App.ListView = Ember.ListView.extend({ - height: 500, - width: 500, - elementWidth: 80, - rowHeight: 20, - itemViewClass: Ember.ListItemView.extend({templateName: "row_item"}) - }); - ``` - - @extends Ember.ContainerView - @class ListView - @namespace Ember -*/ -export default Ember.ContainerView.extend(ListViewMixin, { - css: { - position: 'relative', - overflow: 'auto', - '-webkit-overflow-scrolling': 'touch', - 'overflow-scrolling': 'touch' - }, - - applyTransform: ListViewHelper.applyTransform, - - _scrollTo: function(scrollTop) { - var element = this.element; - - if (element) { element.scrollTop = scrollTop; } - }, - - didInsertElement: function() { - var that = this; - - this._updateScrollableHeight(); - - this._scroll = function(e) { that.scroll(e); }; - - Ember.$(this.element).on('scroll', this._scroll); - }, - - willDestroyElement: function() { - Ember.$(this.element).off('scroll', this._scroll); - }, - - scroll: function(e) { - this.scrollTo(e.target.scrollTop); - }, - - scrollTo: function(y) { - this._scrollTo(y); - this._scrollContentTo(y); - }, - - totalHeightDidChange: Ember.observer(function () { - Ember.run.scheduleOnce('afterRender', this, this._updateScrollableHeight); - }, 'totalHeight'), - - _updateScrollableHeight: function () { - var height, state; - - // Support old and new Ember versions - state = this._state || this.state; - - if (state === 'inDOM') { - // if the list is currently displaying the emptyView, remove the height - if (this._isChildEmptyView()) { - height = ''; - } else { - height = get(this, 'totalHeight'); - } - - this.$('.ember-list-container').css({ - height: height - }); - } - } -}); diff --git a/app/assets/javascripts/ember-addons/reusable-list-item-view.js.es6 b/app/assets/javascripts/ember-addons/reusable-list-item-view.js.es6 deleted file mode 100644 index e2ca3a0f4c6..00000000000 --- a/app/assets/javascripts/ember-addons/reusable-list-item-view.js.es6 +++ /dev/null @@ -1,38 +0,0 @@ -import Ember from 'ember'; -import ListItemViewMixin from './list-item-view-mixin'; - -var get = Ember.get, set = Ember.set; - -export default Ember.View.extend(ListItemViewMixin, { - prepareForReuse: Ember.K, - - init: function () { - this._super(); - var context = Ember.ObjectProxy.create(); - this.set('context', context); - this._proxyContext = context; - }, - - isVisible: Ember.computed('context.content', function () { - return !!this.get('context.content'); - }), - - updateContext: function (newContext) { - var context = get(this._proxyContext, 'content'); - - // Support old and new Ember versions - var state = this._state || this.state; - - if (context !== newContext) { - if (state === 'inDOM') { - this.prepareForReuse(newContext); - } - - set(this._proxyContext, 'content', newContext); - - if (newContext && newContext.isController) { - set(this, 'controller', newContext); - } - } - } -}); diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index afb57053662..92e4fb820c3 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -1832,6 +1832,12 @@ table#user-badges { } } +.admin-list-item { + width: 100%; + border-top: 1px solid #e9e9e9; + padding: 0.25em 0; +} + // Webhook .web-hook-container {