From 19d97e53936719f0ee954e04c861b394fcc19901 Mon Sep 17 00:00:00 2001 From: Ben Gotow Date: Fri, 19 Jun 2015 11:31:27 -0700 Subject: [PATCH] fix(*): Throttle so that DatabaseView won't pile on queries during scroll, better small attachment styles Summary: fix(attachment): Bad filenames breaking icons fix developer bar colors fix critical bug with files Render small attachments inline-block, without hover effect, and with nice dotted transparency background Test Plan: No new tests Reviewers: evan Reviewed By: evan Differential Revision: https://phab.nylas.com/D1661 --- .../lib/image-attachment-component.cjsx | 7 ++- .../attachments/stylesheets/attachments.less | 45 +++++++++----- .../composer/lib/image-file-upload.cjsx | 5 +- .../stylesheets/developer-bar.less | 10 ++- .../thread-list/lib/thread-list-icon.cjsx | 4 +- src/flux/models/query.coffee | 10 ++- src/flux/stores/database-view.coffee | 58 ++++++++++++++---- ...1x.png => icon-attachment-download@1x.png} | Bin ...2x.png => icon-attachment-download@2x.png} | Bin .../attachments/transparency-background.png | Bin 0 -> 48280 bytes 10 files changed, 96 insertions(+), 43 deletions(-) rename static/images/attachments/{icon-attachment-download-@1x.png => icon-attachment-download@1x.png} (100%) rename static/images/attachments/{icon-attachment-download-@2x.png => icon-attachment-download@2x.png} (100%) create mode 100644 static/images/attachments/transparency-background.png diff --git a/internal_packages/attachments/lib/image-attachment-component.cjsx b/internal_packages/attachments/lib/image-attachment-component.cjsx index aaca8b951..a6ec1d330 100644 --- a/internal_packages/attachments/lib/image-attachment-component.cjsx +++ b/internal_packages/attachments/lib/image-attachment-component.cjsx @@ -14,12 +14,13 @@ class ImageAttachmentComponent extends AttachmentComponent
- {@_fileActions()} + {@_renderFileActions()}
-
-
{@props.file.filename}
+
+
{@props.file.filename}
+
{@_imgOrLoader()}
diff --git a/internal_packages/attachments/stylesheets/attachments.less b/internal_packages/attachments/stylesheets/attachments.less index 102c8e685..fc08bcbd5 100644 --- a/internal_packages/attachments/stylesheets/attachments.less +++ b/internal_packages/attachments/stylesheets/attachments.less @@ -79,8 +79,11 @@ } } -.image-file-upload, .image-attachment-file-wrap, .attachment-file-wrap, +.image-file-upload, +.image-attachment-file-wrap, +.attachment-file-wrap, .attachment-inner-wrap { + .attachment-download-bar-wrap { display: none; } @@ -128,10 +131,15 @@ } } -.image-attachment-file-wrap, .image-file-upload { +.image-attachment-file-wrap, +.image-file-upload { + position: relative; - margin: 0 0 8px 0; text-align: center; + display:inline-block; + vertical-align: top; + margin-bottom: @spacing-standard; + margin-right: @spacing-standard; .attachment-download-progress, .attachment-upload-progress { @@ -147,11 +155,11 @@ } &:hover { - .attachment-file-actions, .attachment-name-bg, .attachment-name { + .attachment-file-actions, .attachment-name-container, .attachment-name { display: block; } } - .attachment-file-actions, .attachment-name-bg, .attachment-name { + .attachment-file-actions, .attachment-name-container, .attachment-name { display: none; } @@ -167,30 +175,35 @@ .attachment-preview { position: relative; z-index: 1; + overflow: hidden; - .attachment-name-bg { + .attachment-name-container { position: absolute; bottom: 0; top: 0; z-index: 2; width: 100%; - background: linear-gradient(to top, rgba(0,0,0,0.75) 0%,rgba(0,0,0,0) 23%) - } - .attachment-name { - color: @white; - left: 15px; - bottom: 13px; - position: absolute; - z-index: 3; + height:100%; + min-height:300px; + background: linear-gradient(to top, rgba(0,0,0,0.75) 0%,rgba(0,0,0,0) 23%); + vertical-align:bottom; + + .attachment-name { + color: @white; + left: @spacing-standard; + bottom: @spacing-standard; + position: absolute; + z-index: 3; + } } img { position: relative; z-index: 1; max-width: 100%; - background: @background-secondary; + background: url(../static/images/attachments/transparency-background.png) top left repeat; + background-size:8px; } } } - diff --git a/internal_packages/composer/lib/image-file-upload.cjsx b/internal_packages/composer/lib/image-file-upload.cjsx index 0a957f926..1cbaf76a4 100644 --- a/internal_packages/composer/lib/image-file-upload.cjsx +++ b/internal_packages/composer/lib/image-file-upload.cjsx @@ -18,8 +18,9 @@ class ImageFileUpload extends FileUpload
-
-
{@props.uploadData.fileName}
+
+
{@props.uploadData.fileName}
+
diff --git a/internal_packages/developer-bar/stylesheets/developer-bar.less b/internal_packages/developer-bar/stylesheets/developer-bar.less index 13f1423c6..268259dcd 100755 --- a/internal_packages/developer-bar/stylesheets/developer-bar.less +++ b/internal_packages/developer-bar/stylesheets/developer-bar.less @@ -9,7 +9,7 @@ order:1000; display:flex; flex-direction:column; - + .resizable { display: flex; width:100%; @@ -49,12 +49,12 @@ font-size: 13px; line-height: 15px; height: 25px; - background-color: #999; + background: rgba(60,60,60,1); color: white; } .btn:hover { - background-color: #AAA; + background: rgba(40,40,40,1); } .fa-caret-square-o-down, @@ -146,7 +146,7 @@ color: white; } } - + &.long-polling { .item { @@ -214,5 +214,3 @@ } } - - diff --git a/internal_packages/thread-list/lib/thread-list-icon.cjsx b/internal_packages/thread-list/lib/thread-list-icon.cjsx index e06f1f70d..bcf4f07d4 100644 --- a/internal_packages/thread-list/lib/thread-list-icon.cjsx +++ b/internal_packages/thread-list/lib/thread-list-icon.cjsx @@ -12,7 +12,8 @@ class ThreadListIcon extends React.Component thread: React.PropTypes.object _iconType: => - myEmail = NamespaceStore.current()?.emailAddress + if !@props.thread + return 'thread-icon-star-on-hover' if @props.thread.hasTagId('starred') return 'thread-icon-star' @@ -23,6 +24,7 @@ class ThreadListIcon extends React.Component msgs = @_nonDraftMessages() last = msgs[msgs.length - 1] + myEmail = NamespaceStore.current()?.emailAddress if msgs.length > 1 and last.from[0]?.email is myEmail if Utils.isForwardedMessage(last) return 'thread-icon-forwarded thread-icon-star-on-hover' diff --git a/src/flux/models/query.coffee b/src/flux/models/query.coffee index deeb363fa..59f46f52b 100644 --- a/src/flux/models/query.coffee +++ b/src/flux/models/query.coffee @@ -159,13 +159,19 @@ class ModelQuery Query Execution ### - # Public: Starts query execution and returns a Promise. + # Public: Short-hand syntax that calls run().then(fn) with the provided function. # # Returns a {Promise} that resolves with the Models returned by the # query, or rejects with an error from the Database layer. # then: (next) -> - @_database.run(@).then(next) + @run(@).then(next) + + # Public: Returns a {Promise} that resolves with the Models returned by the + # query, or rejects with an error from the Database layer. + # + run: -> + @_database.run(@) formatResult: (result) -> return null unless result diff --git a/src/flux/stores/database-view.coffee b/src/flux/stores/database-view.coffee index fcfa7223e..5222b2dfc 100644 --- a/src/flux/stores/database-view.coffee +++ b/src/flux/stores/database-view.coffee @@ -6,6 +6,36 @@ EventEmitter = require('events').EventEmitter verbose = true +# A small helper class that prevents the DatabaseView from making too many +# queries. It tracks the number of jobs in flight via `increment` and allows +# a callback to run "when there are fewer then N ongoing queries". +# Sort of like _.throttle, but with a work threshold rather than a time threshold. +class TaskThrottler + constructor: (@_maxConcurrent) -> + @_inflight = 0 + @_whenReady = null + + whenReady: (fn) -> + if @_inflight < @_maxConcurrent + fn() + else + @_whenReady = fn + + increment: -> + decremented = false + @_inflight += 1 + + # Returns a function that can be called once and only once to + # decrement the counter. + return => + if not decremented + @_inflight -= 1 + if @_whenReady and @_inflight < @_maxConcurrent + @_whenReady() + @_whenReady = null + decremented = true + + # Public: DatabaseView abstracts away the process of paginating a query # and loading ranges of data. It's very smart about deciding when # results need to be refreshed. There are a few core concepts that @@ -34,13 +64,15 @@ class DatabaseView extends ModelView constructor: (@klass, config = {}, @_metadataProvider) -> super @_pageSize = 100 + @_throttler = new TaskThrottler(2) + @_matchers = config.matchers ? [] @_includes = config.includes ? [] @_orders = config.orders ? [] @_count = -1 @invalidateCount() - @invalidateRetainedRangeImmediate() + @invalidateRetainedRange() @ log: -> @@ -251,18 +283,16 @@ class DatabaseView extends ModelView @_count = count @_emitter.emit('trigger') - invalidateRetainedRange: _.debounce -> - @invalidateRetainedRangeImmediate() - ,10 - - invalidateRetainedRangeImmediate: -> - for idx in @pagesRetained() - @retrievePage(idx) + invalidateRetainedRange: -> + @_throttler.whenReady => + for idx in @pagesRetained() + @retrievePage(idx) retrieveDirtyInRetainedRange: -> - for idx in @pagesRetained() - if not @_pages[idx] or @_pages[idx].lastTouchTime > @_pages[idx].lastLoadTime - @retrievePage(idx) + @_throttler.whenReady => + for idx in @pagesRetained() + if not @_pages[idx] or @_pages[idx].lastTouchTime > @_pages[idx].lastLoadTime + @retrievePage(idx) retrievePage: (idx) -> page = @_pages[idx] ? { @@ -284,7 +314,8 @@ class DatabaseView extends ModelView query.include(attr) for attr in @_includes query.order(@_orders) if @_orders.length > 0 - query.then (items) => + decrement = @_throttler.increment() + query.run().finally(decrement).then (items) => # If the page is no longer in the cache at all, it may have fallen out of the # retained range and been cleaned up. return unless @_pages[idx] @@ -323,7 +354,8 @@ class DatabaseView extends ModelView if idsMissingMetadata.length > 0 and @_metadataProvider metadataPromise = @_metadataProvider(idsMissingMetadata) - metadataPromise.then (results) => + decrement = @_throttler.increment() + metadataPromise.finally(decrement).then (results) => # If we've started reloading since we made our query, don't do any more work if page.lastTouchTime >= touchTime @log("Metadata version #{touchTime} fetched, but out of date (current is #{page.lastTouchTime})") diff --git a/static/images/attachments/icon-attachment-download-@1x.png b/static/images/attachments/icon-attachment-download@1x.png similarity index 100% rename from static/images/attachments/icon-attachment-download-@1x.png rename to static/images/attachments/icon-attachment-download@1x.png diff --git a/static/images/attachments/icon-attachment-download-@2x.png b/static/images/attachments/icon-attachment-download@2x.png similarity index 100% rename from static/images/attachments/icon-attachment-download-@2x.png rename to static/images/attachments/icon-attachment-download@2x.png diff --git a/static/images/attachments/transparency-background.png b/static/images/attachments/transparency-background.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa8018aaa13e1cb32b24fa910156c1d84a2b0e6 GIT binary patch literal 48280 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 literal 0 HcmV?d00001