+
+
+
+
+
+
+
+
+ {{ card.name }}
+
+
+ {{ formatNumber(card.subscriberCount) }} subscribers
+
+
+
+
+
+
+
+ changeSubscribe(card, ack)"
+ >
+ {{ card.subscribed ? 'Unsubscribe' : 'Subscribe' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/imports/client/ui/router.js b/app/imports/client/ui/router.js
index c5c54bfc..4f3fe2cc 100644
--- a/app/imports/client/ui/router.js
+++ b/app/imports/client/ui/router.js
@@ -9,6 +9,7 @@ const CharacterListToolbarItems = () => import('/imports/client/ui/creature/crea
const Library = () => import('/imports/client/ui/pages/Library.vue');
const LibraryCollection = () => import('/imports/client/ui/pages/LibraryCollection.vue');
const LibraryCollectionToolbar = () => import('/imports/client/ui/library/LibraryCollectionToolbar.vue');
+const LibraryBrowser = () => import('/imports/client/ui/pages/LibraryBrowser.vue');
const CharacterSheetPage = () => import('/imports/client/ui/pages/CharacterSheetPage.vue');
const CharacterSheetToolbar = () => import('/imports/client/ui/creature/character/CharacterSheetToolbar.vue');
const CharacterSheetRightDrawer = () => import('/imports/client/ui/creature/character/CharacterSheetRightDrawer.vue');
@@ -168,6 +169,15 @@ RouterFactory.configure(router => {
meta: {
title: 'Library Collection',
},
+ }, {
+ name: 'libraryBrowser',
+ path: '/community-libraries',
+ components: {
+ default: LibraryBrowser,
+ },
+ meta: {
+ title: 'Community Libraries',
+ },
}, {
name: 'characterSheet',
path: '/character/:id',
diff --git a/app/imports/client/ui/utility/numberFormatter.js b/app/imports/client/ui/utility/numberFormatter.js
new file mode 100644
index 00000000..794498f3
--- /dev/null
+++ b/app/imports/client/ui/utility/numberFormatter.js
@@ -0,0 +1,3 @@
+const formatter = Intl.NumberFormat('en', { notation: 'compact' });
+
+export default formatter;
\ No newline at end of file
diff --git a/app/imports/migrations/server/dbv2/dbv2.js b/app/imports/migrations/server/dbv2/dbv2.js
index 38880147..2ba5fca3 100644
--- a/app/imports/migrations/server/dbv2/dbv2.js
+++ b/app/imports/migrations/server/dbv2/dbv2.js
@@ -1,9 +1,11 @@
import { Migrations } from 'meteor/percolate:migrations';
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
import { union } from 'lodash';
+import Libraries from '/imports/api/library/Libraries.js';
+import LibraryCollections from '/imports/api/library/LibraryCollections.js';
-// Git version 2.0-beta.33
-// Database version 1
+// Git version 2.0.52
+// Database version 2
Migrations.add({
version: 2,
name: 'Separates creature property tags from library tags',
@@ -13,10 +15,11 @@ Migrations.add({
const bulk = LibraryNodes.rawCollection().initializeUnorderedBulkOp();
LibraryNodes.find({}).forEach(prop => migratePropUp(bulk, prop));
bulk.execute();
+ countSubscribers();
},
down() {
- console.log('migrating down library nodes 2 -> 1');
+ console.log('Migrating down library nodes 2 -> 1');
const bulk = LibraryNodes.rawCollection().initializeUnorderedBulkOp();
LibraryNodes.find({}).forEach(prop => migratePropDown(bulk, prop));
bulk.execute();
@@ -61,3 +64,30 @@ export function migratePropDown(bulk, prop) {
}
bulk.find({ _id: prop._id }).updateOne(update);
}
+
+function countSubscribers() {
+ console.log('Migrating up libraries and collections to count subscribers');
+ const bulkLib = Libraries.rawCollection().initializeUnorderedBulkOp();
+ Libraries.find({}, {
+ fields: { _id: 1 }
+ }).forEach(lib => {
+ bulkLib.find({ _id: lib._id }).updateOne({
+ $set: {
+ subscriberCount: Meteor.users.find({ subscribedLibraries: lib._id }).count(),
+ }
+ });
+ });
+ bulkLib.execute();
+
+ const bulkLibCols = Libraries.rawCollection().initializeUnorderedBulkOp();
+ LibraryCollections.find({}, {
+ fields: { _id: 1 }
+ }).forEach(col => {
+ bulkLibCols.find({ _id: col._id }).updateOne({
+ $set: {
+ subscriberCount: Meteor.users.find({ subscribedLibraryCollections: col._id }).count(),
+ }
+ });
+ });
+ bulkLibCols.execute();
+}
diff --git a/app/imports/server/publications/library.js b/app/imports/server/publications/library.js
index 007b5b52..cae264a9 100644
--- a/app/imports/server/publications/library.js
+++ b/app/imports/server/publications/library.js
@@ -141,6 +141,24 @@ Meteor.publish('libraries', function () {
});
});
+Meteor.publish('browseLibraries', function () {
+ if (!this.userId) return [];
+ return [
+ Libraries.find({
+ showInMarket: true,
+ public: true,
+ }, {
+ sort: { name: 1 }
+ }),
+ LibraryCollections.find({
+ showInMarket: true,
+ public: true,
+ }, {
+ sort: { name: 1 }
+ }),
+ ];
+});
+
Meteor.publish('library', function (libraryId) {
if (!libraryId) return [];
libraryIdSchema.validate({ libraryId });