diff --git a/couchpotato/core/_base/clientscript.py b/couchpotato/core/_base/clientscript.py index 92bc419e..ec8a51b2 100644 --- a/couchpotato/core/_base/clientscript.py +++ b/couchpotato/core/_base/clientscript.py @@ -28,7 +28,6 @@ class ClientScript(Plugin): 'scripts/vendor/form_replacement/form_radio.js', 'scripts/vendor/form_replacement/form_dropdown.js', 'scripts/vendor/form_replacement/form_selectoption.js', - 'scripts/vendor/spin.js', 'scripts/vendor/Array.stableSort.js', 'scripts/vendor/history.js', 'scripts/library/uniform.js', diff --git a/couchpotato/core/media/_base/search/static/search.scss b/couchpotato/core/media/_base/search/static/search.scss index d9d16756..a53783db 100644 --- a/couchpotato/core/media/_base/search/static/search.scss +++ b/couchpotato/core/media/_base/search/static/search.scss @@ -239,13 +239,4 @@ } } - .mask, - .media_result .mask { - position: absolute; - height: 100%; - width: 100%; - left: 0; - top: 0; - } - } diff --git a/couchpotato/core/media/movie/_base/static/details.js b/couchpotato/core/media/movie/_base/static/details.js index 88cd69f2..b00b1525 100644 --- a/couchpotato/core/media/movie/_base/static/details.js +++ b/couchpotato/core/media/movie/_base/static/details.js @@ -12,7 +12,11 @@ var MovieDetails = new Class({ self.el = new Element('div',{ 'class': 'page active movie_details level_' + (options.level || 0) }).adopt( - self.overlay = new Element('div.overlay').grab( + self.overlay = new Element('div.overlay', { + 'events': { + 'click': self.close.bind(self) + } + }).grab( new Element('a.close.icon-left-arrow') ), self.content = new Element('div.content').grab( @@ -36,6 +40,12 @@ var MovieDetails = new Class({ 'class': 'section section_' + name }).grab(section_el) ); + }, + + close: function(){ + var self = this; + + self.el.dispose(); } -}); \ No newline at end of file +}); diff --git a/couchpotato/core/media/movie/_base/static/movie.actions.js b/couchpotato/core/media/movie/_base/static/movie.actions.js index b21d0e02..e84d7598 100644 --- a/couchpotato/core/media/movie/_base/static/movie.actions.js +++ b/couchpotato/core/media/movie/_base/static/movie.actions.js @@ -138,8 +138,6 @@ MA.Release = new Class({ getDetails: function(refresh){ var self = this; - p('test'); - if(!self.options_container || refresh){ self.options_container = new Element('div.options').grab( self.release_container = new Element('div.releases.table') @@ -181,7 +179,7 @@ MA.Release = new Class({ 'id': 'release_'+release._id }).adopt( new Element('span.name', {'text': release_name, 'title': release_name}), - new Element('span.status', {'text': release.status, 'class': 'release_status '+release.status}), + new Element('span.status', {'text': release.status, 'class': 'status '+release.status}), new Element('span.quality', {'text': quality.label + (release.is_3d ? ' 3D' : '') || 'n/a'}), new Element('span.size', {'text': info.size ? Math.floor(self.get(release, 'size')) : 'n/a'}), new Element('span.age', {'text': self.get(release, 'age')}), @@ -533,7 +531,8 @@ MA.Edit = new Class({ create: function(){ var self = this; - self.el = new Element('a.edit', { + self.button = new Element('a.edit', { + 'text': 'Edit', 'title': 'Change movie information, like title and quality.', 'events': { 'click': self.editMovie.bind(self) @@ -656,7 +655,8 @@ MA.Refresh = new Class({ create: function(){ var self = this; - self.el = new Element('a.refresh', { + self.button = new Element('a.refresh', { + 'text': 'Refresh', 'title': 'Refresh the movie info and do a forced search', 'events': { 'click': self.doRefresh.bind(self) @@ -667,7 +667,7 @@ MA.Refresh = new Class({ doRefresh: function(e){ var self = this; - (e).preventDefault(); + (e).stop(); Api.request('media.refresh', { 'data': { diff --git a/couchpotato/core/media/movie/_base/static/movie.js b/couchpotato/core/media/movie/_base/static/movie.js index 23c7513d..40c439a4 100644 --- a/couchpotato/core/media/movie/_base/static/movie.js +++ b/couchpotato/core/media/movie/_base/static/movie.js @@ -38,16 +38,15 @@ var Movie = new Class({ 'level': 3 }); - App.getPageContainer().grab(self.details); - // Add action items self.actions.each(function(action, nr){ var details = action.getDetails(); - p(action, action.getLabel(), details); if(details) self.details.addSection(action.getLabel(), details); }); } + + App.getPageContainer().grab(self.details); }, addEvents: function(){ @@ -60,7 +59,6 @@ var Movie = new Class({ if(self.data._id != notification.data._id) return; self.busy(false); - self.removeView(); self.update.delay(2000, self, notification); }; App.on('movie.update', self.global_events['movie.update']); @@ -132,7 +130,7 @@ var Movie = new Class({ if(self.mask) self.mask.destroy(); if(self.spinner) - self.spinner.el.destroy(); + self.spinner.destroy(); self.spinner = null; self.mask = null; }, timeout || 400); @@ -160,7 +158,6 @@ var Movie = new Class({ self.data = notification.data; self.el.empty(); - self.removeView(); self.profile = Quality.getProfile(self.data.profile_id) || {}; self.category = CategoryList.getCategory(self.data.category_id) || {}; @@ -225,7 +222,13 @@ var Movie = new Class({ } }) ), - self.actions_el = new Element('div.actions') + self.actions_el = new Element('div.actions', { + 'events': { + 'click': function(e){ + (e).stopPropagation(); + } + } + }) ) ); diff --git a/couchpotato/core/media/movie/_base/static/movie.scss b/couchpotato/core/media/movie/_base/static/movie.scss index d0651ebd..c22580c6 100644 --- a/couchpotato/core/media/movie/_base/static/movie.scss +++ b/couchpotato/core/media/movie/_base/static/movie.scss @@ -72,6 +72,7 @@ @include span(6); float: left; margin-bottom: $padding; + position: relative; &:nth-child(4n+4){ @include span(last); @@ -82,7 +83,7 @@ } .poster { - border-radius: 2px; + border-radius: $border_radius; overflow: hidden; width: 100%; float: left; @@ -92,6 +93,7 @@ clear: both; .info { + height: 44px; .title { @include flexbox(); @@ -126,6 +128,32 @@ } } } + + .actions { + position: absolute; + top: $padding / 2; + right: $padding / 2; + display: none; + + a { + display: block; + background: $background_color; + padding: $padding / 3; + width: auto; + margin-bottom: 1px; + clear: both; + float: right; + } + } + + &:hover .actions { + display: block; + } + + .mask { + bottom: 44px; + border-radius: $border_radius; + } } } @@ -190,6 +218,28 @@ border-bottom: 1px solid rgba(0,0,0,.1); } } + + .releases { + + .item span { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + text-align: center; + } + + .item .name { + @include flex(1 auto); + text-align: left; + } + .status { min-width: 70px; max-width: 70px; } + .quality { min-width: 60px; max-width: 60px; } + .size { min-width: 40px; max-width: 40px; } + .age { min-width: 40px; max-width: 40px; } + .score { min-width: 45px; max-width: 45px; } + .provider { min-width: 100px; max-width: 100px; } + + } } diff --git a/couchpotato/core/notifications/core/static/notification.js b/couchpotato/core/notifications/core/static/notification.js index 2a67e78e..73eadb72 100644 --- a/couchpotato/core/notifications/core/static/notification.js +++ b/couchpotato/core/notifications/core/static/notification.js @@ -174,7 +174,7 @@ var NotificationBase = new Class({ var new_message = new Element('div', { 'class': 'message' + (sticky ? ' sticky' : ''), - 'html': message + 'html': '
' + message + '
' }).inject(self.message_container, 'top'); setTimeout(function(){ diff --git a/couchpotato/static/scripts/vendor/mootools_tween_css3.js b/couchpotato/static/scripts/vendor/mootools_tween_css3.js deleted file mode 100644 index 8f6460b4..00000000 --- a/couchpotato/static/scripts/vendor/mootools_tween_css3.js +++ /dev/null @@ -1,141 +0,0 @@ -/* ---- -name: Fx.Tween.CSS3.Replacement -script: Fx.Tween.CSS3.Replacement.js -license: MIT-style license. -description: Same behavior like Fx.Tween but tries to use native CSS3 transition if possible (Overwrites Fx.Tween). -copyright: Copyright (c) 2010, Dipl.-Ing. (FH) André Fiedler , based on code by eskimoblood (mootools users group) -authors: [André Fiedler, eskimoblood] - -requires: [Core/Class.Extras, Core/Element.Event, Core/Element.Style, Core/Fx.Tween] - -provides: [Fx.Tween] -... -*/ - -Element.NativeEvents.transitionend = 2; -Element.NativeEvents.webkitTransitionEnd = 2; -Element.NativeEvents.oTransitionEnd = 2; -Element.NativeEvents.msTransitionEnd = 2; - -Element.Events.transitionend = { - base: Browser.safari || Browser.chrome ? 'webkitTransitionEnd' : (Browser.opera ? 'oTransitionEnd' : (Browser.ie && Browser.version > 8 ? 'msTransitionEnd' : 'transitionend')) -}; - -Event.implement({ - - getPropertyName: function(){ - return this.event.propertyName; - }, - - getElapsedTime: function(nativeTime){ - return nativeTime ? this.event.elapsedTime : (this.event.elapsedTime * 1000).toInt(); - } - -}); - -Element.implement({ - - supportStyle: function(style){ - var value = this.style[style]; - return !!(value || value === ''); - }, - - supportVendorStyle: function(style){ - var prefixedStyle = null; - return this.supportStyle(style) ? style : ['webkit', 'Moz', 'o', 'ms'].some(function(prefix){ - prefixedStyle = prefix + style.capitalize(); - return this.supportStyle(prefixedStyle); - }, this) ? prefixedStyle : null; - } - -}); - -Fx.TweenCSS2 = Fx.Tween; - -Fx.Tween = new Class({ - - Extends: Fx.TweenCSS2, - - transitionTimings: { - 'linear' : '0,0,1,1', - 'expo:in' : '0.71,0.01,0.83,0', - 'expo:out' : '0.14,1,0.32,0.99', - 'expo:in:out' : '0.85,0,0.15,1', - 'circ:in' : '0.34,0,0.96,0.23', - 'circ:out' : '0,0.5,0.37,0.98', - 'circ:in:out' : '0.88,0.1,0.12,0.9', - 'sine:in' : '0.22,0.04,0.36,0', - 'sine:out' : '0.04,0,0.5,1', - 'sine:in:out' : '0.37,0.01,0.63,1', - 'quad:in' : '0.14,0.01,0.49,0', - 'quad:out' : '0.01,0,0.43,1', - 'quad:in:out' : '0.47,0.04,0.53,0.96', - 'cubic:in' : '0.35,0,0.65,0', - 'cubic:out' : '0.09,0.25,0.24,1', - 'cubic:in:out' : '0.66,0,0.34,1', - 'quart:in' : '0.69,0,0.76,0.17', - 'quart:out' : '0.26,0.96,0.44,1', - 'quart:in:out' : '0.76,0,0.24,1', - 'quint:in' : '0.64,0,0.78,0', - 'quint:out' : '0.22,1,0.35,1', - 'quint:in:out' : '0.9,0,0.1,1' - }, - - initialize: function(element, options){ - options.transition = options.transition || 'sine:in:out'; - this.parent(element, options); - if (typeof this.options.transition != 'string') alert('Only short notated transitions (like \'sine:in\') are supported by Fx.Tween.CSS3'); - this.options.transition = this.options.transition.toLowerCase(); - this.transition = this.element.supportVendorStyle('transition'); - this.css3Supported = !!this.transition && !!this.transitionTimings[this.options.transition]; - }, - - check: function(){ - if (!this.boundComplete) return true; - return this.parent(); - }, - - start: function(property, from, to){ - if (this.css3Supported){ - if (!this.check(property, from, to)) return this; - var args = Array.flatten(arguments); - this.property = this.options.property || args.shift(); - var parsed = this.prepare(this.element, this.property, args); - this.from = parsed.from; - this.to = parsed.to; - this.boundComplete = function(event){ - if (event.getPropertyName() == this.property /* && event.getElapsedTime() == this.options.duration */ ){ - this.element.removeEvent('transitionend', this.boundComplete); - this.boundComplete = null; - this.fireEvent('complete', this); - } - }.bind(this); - this.element.addEvent('transitionend', this.boundComplete); - var trans = function(){ - this.element.setStyle(this.transition, this.property + ' ' + this.options.duration + 'ms cubic-bezier(' + this.transitionTimings[this.options.transition] + ')'); - this.element.setStyle(this.property, this.to[0].value + this.options.unit); - }.bind(this); - if (args[1]){ - this.element.setStyle(this.transition, 'none'); - this.element.setStyle(this.property, this.from[0].value + this.options.unit); - trans.delay(0.1); - } else - trans(); - this.fireEvent('start', this); - return this; - } - return this.parent(property, from, to); - }, - - cancel: function(){ - if (this.css3Supported){ - this.element.setStyle(this.transition, 'none'); - this.element.removeEvent('transitionend', this.boundComplete); - this.boundComplete = null; - } - this.parent(); - return this; - } - -}); diff --git a/couchpotato/static/scripts/vendor/spin.js b/couchpotato/static/scripts/vendor/spin.js deleted file mode 100644 index 6c2d0d59..00000000 --- a/couchpotato/static/scripts/vendor/spin.js +++ /dev/null @@ -1,301 +0,0 @@ -//fgnass.github.com/spin.js#v1.2.4 -(function(window, document, undefined) { - -/** - * Copyright (c) 2011 Felix Gnass [fgnass at neteye dot de] - * Licensed under the MIT license - */ - - var prefixes = ['webkit', 'Moz', 'ms', 'O']; /* Vendor prefixes */ - var animations = {}; /* Animation rules keyed by their name */ - var useCssAnimations; - - /** - * Utility function to create elements. If no tag name is given, - * a DIV is created. Optionally properties can be passed. - */ - function createEl(tag, prop) { - var el = document.createElement(tag || 'div'); - var n; - - for(n in prop) { - el[n] = prop[n]; - } - return el; - } - - /** - * Appends children and returns the parent. - */ - function ins(parent /* child1, child2, ...*/) { - for (var i=1, n=arguments.length; i> 1) : o.left+mid) + 'px', - top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : o.top+mid) + 'px' - }); - } - - el.setAttribute('aria-role', 'progressbar'); - self.lines(el, self.opts); - - if (!useCssAnimations) { - // No CSS animation support, use setTimeout() instead - var i = 0; - var fps = o.fps; - var f = fps/o.speed; - var ostep = (1-o.opacity)/(f*o.trail / 100); - var astep = f/o.lines; - - !function anim() { - i++; - for (var s=o.lines; s; s--) { - var alpha = Math.max(1-(i+s*astep)%f * ostep, o.opacity); - self.opacity(el, o.lines-s, alpha, o); - } - self.timeout = self.el && setTimeout(anim, ~~(1000/fps)); - }(); - } - return self; - }, - stop: function() { - var el = this.el; - if (el) { - clearTimeout(this.timeout); - if (el.parentNode) el.parentNode.removeChild(el); - this.el = undefined; - } - return this; - }, - lines: function(el, o) { - var i = 0; - var seg; - - function fill(color, shadow) { - return css(createEl(), { - position: 'absolute', - width: (o.length+o.width) + 'px', - height: o.width + 'px', - background: color, - boxShadow: shadow, - transformOrigin: 'left', - transform: 'rotate(' + ~~(360/o.lines*i) + 'deg) translate(' + o.radius+'px' +',0)', - borderRadius: (o.width>>1) + 'px' - }); - } - for (; i < o.lines; i++) { - seg = css(createEl(), { - position: 'absolute', - top: 1+~(o.width/2) + 'px', - transform: o.hwaccel ? 'translate3d(0,0,0)' : '', - opacity: o.opacity, - animation: useCssAnimations && addAnimation(o.opacity, o.trail, i, o.lines) + ' ' + 1/o.speed + 's linear infinite' - }); - if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'})); - ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)'))); - } - return el; - }, - opacity: function(el, i, val) { - if (i < el.childNodes.length) el.childNodes[i].style.opacity = val; - } - }; - - ///////////////////////////////////////////////////////////////////////// - // VML rendering for IE - ///////////////////////////////////////////////////////////////////////// - - /** - * Check and init VML support - */ - !function() { - var s = css(createEl('group'), {behavior: 'url(#default#VML)'}); - var i; - - if (!vendor(s, 'transform') && s.adj) { - - // VML support detected. Insert CSS rules ... - for (i=4; i--;) sheet.addRule(['group', 'roundrect', 'fill', 'stroke'][i], 'behavior:url(#default#VML)'); - - Spinner.prototype.lines = function(el, o) { - var r = o.length+o.width; - var s = 2*r; - - function grp() { - return css(createEl('group', {coordsize: s +' '+s, coordorigin: -r +' '+-r}), {width: s, height: s}); - } - - var margin = -(o.width+o.length)*2+'px'; - var g = css(grp(), {position: 'absolute', top: margin, left: margin}); - - var i; - - function seg(i, dx, filter) { - ins(g, - ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}), - ins(css(createEl('roundrect', {arcsize: 1}), { - width: r, - height: o.width, - left: o.radius, - top: -o.width>>1, - filter: filter - }), - createEl('fill', {color: o.color, opacity: o.opacity}), - createEl('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change - ) - ) - ); - } - - if (o.shadow) { - for (i = 1; i <= o.lines; i++) { - seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)'); - } - } - for (i = 1; i <= o.lines; i++) seg(i); - return ins(el, g); - }; - Spinner.prototype.opacity = function(el, i, val, o) { - var c = el.firstChild; - o = o.shadow && o.lines || 0; - if (c && i+o < c.childNodes.length) { - c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild; - if (c) c.opacity = val; - } - }; - } - else { - useCssAnimations = vendor(s, 'animation'); - } - }(); - - window.Spinner = Spinner; - -})(window, document); diff --git a/couchpotato/static/style/main.scss b/couchpotato/static/style/main.scss index add298f8..b0146728 100644 --- a/couchpotato/static/style/main.scss +++ b/couchpotato/static/style/main.scss @@ -356,11 +356,76 @@ input, textarea, select { } } +/* Messages */ +.messages { + position: fixed; + right: 0; + bottom: 0; + width: 320px; + z-index: 20; + overflow: hidden; + font-size: 14px; + font-weight: bold; + padding: 5px; + + .message { + overflow: hidden; + transition: all .6s cubic-bezier(0.9,0,0.1,1); + width: 100%; + position: relative; + max-height: 0; + font-size: 1.1em; + font-weight: normal; + transform: scale(0); + background: $primary_color; + margin-bottom: 4px; + border-radius: $border_radius; + box-shadow: 0 0 15px 2px rgba(0,0,0,.15); + + .inner { + padding: 15px 30px 15px 20px; + background: $background_color; + margin-bottom: 4px; + border-radius: $border_radius; + } + + &.sticky { + background-color: $primary_color; + } + + &.show { + max-height: 100px; + transform: scale(1); + } + + &.hide { + max-height: 0; + padding: 0 20px; + margin: 0; + transform: scale(0); + } + } + + .close { + position: absolute; + padding: 10px 8px; + top: 0; + right: 0; + color: #FFF; + } +} + +/* Mask */ .mask{ - background: rgba(0,0,0, 0.9); + background: rgba(0,0,0, .8); z-index: 100; text-align: center; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; $spinner_size: 22px; @@ -375,24 +440,51 @@ input, textarea, select { margin-top: -($spinner_size/2); margin-left: -($spinner_size/2); outline: 1px solid transparent; - border: 1px solid #FFF; - @include animation(rotating 4.4s $cubic infinite normal); + @include animation(rotating 2.5s $cubic infinite normal); } } @keyframes rotating { 0% { - @include transform(rotate(0deg) scale(1.4)); - border-radius: 2px; + @include transform(rotate(0deg) scale(1.6)); + border-radius: 1px; } - 45% { + 48% { @include transform(rotate(360deg) scale(1)); border-radius: 50%; } - 55% {} + 52% {} 100% { - @include transform(rotate(720deg) scale(1.4)); - border-radius: 2px; + @include transform(rotate(720deg) scale(1.6)); + border-radius: 1px; + } +} + +.table { + + .head { + font-weight: bold; + } + + .item { + @include flexbox(); + border-bottom: 1px solid rgba(0,0,0,.2); + + &:last-child { + border-bottom: none; + } + + span { + padding: 1px 2px; + + &:first-child { + padding-left: 0; + } + + &:last-child { + padding-right: 0; + } + } } }