diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts index f37f0ce4f9..274b72e102 100644 --- a/src/app/core/cache/builders/remote-data-build.service.ts +++ b/src/app/core/cache/builders/remote-data-build.service.ts @@ -153,4 +153,45 @@ export class RemoteDataBuildService { const domainModel = getMapsTo(normalized.constructor); return Object.assign(new domainModel(), normalized, links); } + + aggregate(input: RemoteData[]): RemoteData { + const requestPending: Observable = > Observable.combineLatest( + ...input.map(rd => rd.isRequestPending), + (...pendingArray) => pendingArray.every(e => e === true) + ).distinctUntilChanged(); + const responsePending: Observable = > Observable.combineLatest( + ...input.map(rd => rd.isResponsePending), + (...pendingArray) => pendingArray.every(e => e === true) + ).distinctUntilChanged(); + const isSuccessFul: Observable = > Observable.combineLatest( + ...input.map(rd => rd.hasSucceeded), + (...successArray) => successArray.every(e => e === true) + ).distinctUntilChanged(); + const errorMessage: Observable = > Observable.combineLatest( + ...input.map(rd => rd.errorMessage), + (...errors) => errors + .map((e, idx) => { + if (hasValue(e)) { + return `[${idx}]: ${e}`; + } + }) + .filter(e => hasValue(e)) + .join(", ") + ); + const payload = > Observable.combineLatest( + ...input.map(rd => rd.payload) + ); + + return new RemoteData( + // This is an aggregated object, it doesn't necessarily correspond + // to a single REST endpoint, so instead of a self link, use the + // current time in ms for a somewhat unique id + `${new Date().getTime()}`, + requestPending, + responsePending, + isSuccessFul, + errorMessage, + payload + ); + } } diff --git a/yarn.lock b/yarn.lock index 17ed417d48..c1e67e8572 100644 --- a/yarn.lock +++ b/yarn.lock @@ -301,14 +301,10 @@ alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" -amdefine@1.0.0: +amdefine@1.0.0, amdefine@>=0.0.4: version "1.0.0" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - angular2-express-engine@2.1.0-rc.1: version "2.1.0-rc.1" resolved "https://registry.yarnpkg.com/angular2-express-engine/-/angular2-express-engine-2.1.0-rc.1.tgz#79c8e481cde7ff1253b373cbf98de7c9fab4f215" @@ -3521,11 +3517,7 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" -lru-cache@2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" - -lru-cache@2.2.x: +lru-cache@2, lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" @@ -4659,14 +4651,10 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@1.4.1: +q@1.4.1, q@^1.1.2, q@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" -q@^1.1.2, q@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" - qjobs@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" @@ -5063,13 +5051,13 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.0, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.4, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.6.0, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" -rimraf@2.5.4, rimraf@^2.4.4: +rimraf@2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: