diff --git a/gui/index.html b/gui/index.html index a2b3fa894..ae5c21031 100755 --- a/gui/index.html +++ b/gui/index.html @@ -601,11 +601,13 @@

Select the folders to share with this device.

-
-
- +
+
+
+ +
@@ -766,11 +768,13 @@

Select the devices to share this folder with.

-
-
- +
+
+
+ +
@@ -1259,9 +1263,12 @@ + + + diff --git a/gui/scripts/syncthing/core/filters/groupFilter.js b/gui/scripts/syncthing/core/filters/groupFilter.js new file mode 100644 index 000000000..d960651df --- /dev/null +++ b/gui/scripts/syncthing/core/filters/groupFilter.js @@ -0,0 +1,25 @@ +/** + * Groups input in chunks of the specified size + * + * E.g. [1, 2, 3, 4, 5] with groupSize = 3 => [[1, 2, 3], [4, 5]] + * Uses pmkr.memoize to avoid infdig, see 'Johnny Hauser's "Filter Stablize" Solution' + * here: http://sobrepere.com/blog/2014/10/14/creating-groupby-filter-angularjs/ + */ +angular.module('syncthing.core') + .filter('group', [ + 'pmkr.filterStabilize', + function (stabilize) { + return stabilize(function(items, groupSize) { + var groups = []; + var inner; + for (var i = 0; i < items.length; i++) { + if (i % groupSize === 0) { + inner = []; + groups.push(inner); + } + inner.push(items[i]); + } + return groups; + }); + } + ]); diff --git a/gui/scripts/syncthing/core/services/filterStabilize.js b/gui/scripts/syncthing/core/services/filterStabilize.js new file mode 100644 index 000000000..7eb31f75e --- /dev/null +++ b/gui/scripts/syncthing/core/services/filterStabilize.js @@ -0,0 +1,27 @@ +/** + * m59peacemaker's filterStabilize + * + * See https://github.com/m59peacemaker/angular-pmkr-components/tree/master/src/services/filterStabilize + * Released under the MIT license + */ +angular.module('syncthing.core') + .factory('pmkr.filterStabilize', [ + 'pmkr.memoize', + function(memoize) { + function service(fn) { + function filter() { + var args = [].slice.call(arguments); + // always pass a copy of the args so that the original input can't be modified + args = angular.copy(args); + // return the `fn` return value or input reference (makes `fn` return optional) + var filtered = fn.apply(this, args) || args[0]; + return filtered; + } + + var memoized = memoize(filter); + return memoized; + + } + return service; + } + ]); diff --git a/gui/scripts/syncthing/core/services/memoize.js b/gui/scripts/syncthing/core/services/memoize.js new file mode 100644 index 000000000..db72e5c0a --- /dev/null +++ b/gui/scripts/syncthing/core/services/memoize.js @@ -0,0 +1,28 @@ +/** + * m59peacemaker's memoize + * + * See https://github.com/m59peacemaker/angular-pmkr-components/tree/master/src/services/memoize + * Released under the MIT license + */ +angular.module('syncthing.core') + .factory('pmkr.memoize', [ + function() { + function service() { + return memoizeFactory.apply(this, arguments); + } + function memoizeFactory(fn) { + var cache = {}; + function memoized() { + var args = [].slice.call(arguments); + var key = JSON.stringify(args); + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + cache[key] = fn.apply(this, arguments); + return cache[key]; + } + return memoized; + } + return service; + } + ]);