diff --git a/imports/api/bonus.js b/imports/api/bonus.js
index 80fbccd19ddcdc5b5d1d04f03b0da902a2e4351d..a8293c06ca875d667cf037a8db38549812d36b2a 100644
--- a/imports/api/bonus.js
+++ b/imports/api/bonus.js
@@ -16,11 +16,15 @@ export let Bonus = class Bonus {
}
static canJoinBonus (cardset_id) {
- let cardset = Cardsets.findOne({_id: cardset_id}, {fields: {_id: 1, registrationPeriod: 1, owner: 1}});
- if (Roles.userIsInRole(Meteor.userId(), ['firstLogin', 'blocked']) || cardset.owner === Meteor.userId()) {
+ let cardset = Cardsets.findOne({_id: cardset_id}, {fields: {_id: 1, registrationPeriod: 1, owner: 1, kind: 1}});
+ if (Roles.userIsInRole(Meteor.userId(), ['firstLogin', 'blocked'])) {
return false;
}
- if (Roles.userIsInRole(Meteor.userId(), ['admin', 'editor', 'lecturer', 'university', 'pro'])) {
+ let roles = ['admin', 'editor', 'lecturer', 'university', 'pro'];
+ if (cardset.kind === "free") {
+ roles.push('standard');
+ }
+ if (Roles.userIsInRole(Meteor.userId(), roles)) {
return !this.isInBonus(cardset._id) && moment(cardset.registrationPeriod).endOf('day') > new Date();
} else {
return false;
diff --git a/imports/startup/client/registerhelper.js b/imports/startup/client/registerhelper.js
index fa769f62eea5358ac0982024d4b7f8e544a72f5b..9f02257522eb874f649311860ab6a2d8d6e950b7 100644
--- a/imports/startup/client/registerhelper.js
+++ b/imports/startup/client/registerhelper.js
@@ -32,6 +32,14 @@ Template.registerHelper('getLastAppTitle', function () {
return Meteor.settings.public.welcome.title.last;
});
+Template.registerHelper('isInBonus', function () {
+ return Bonus.isInBonus(Router.current().params._id, Meteor.userId());
+});
+
+Template.registerHelper('isInBonusAndNotOwner', function () {
+ return Bonus.isInBonus(Router.current().params._id) && (!UserPermissions.isOwner(Cardsets.findOne({_id: Router.current().params._id}).owner) && !UserPermissions.isAdmin());
+});
+
Template.registerHelper('extendContext', function (key, value) {
let result = _.clone(this);
result[key] = value;
diff --git a/imports/ui/cardset/cardset.html b/imports/ui/cardset/cardset.html
index 1cdd62cc63dc37790a6d691000e23d5db88058ac..8487c5cb0e1455f2be1ce6dcc69f7406428be89f 100644
--- a/imports/ui/cardset/cardset.html
+++ b/imports/ui/cardset/cardset.html
@@ -47,7 +47,7 @@
{{selectedForLearning}}
{{/unless}}
{{#if isActiveRoute regex='cardsetdetailsid|cardsetcard'}}
- {{#unless isInBonus}}
+ {{#unless isInBonusAndNotOwner}}
{{#if this.quantity}}
{{> cardNavigation}}
diff --git a/imports/ui/cardset/navigation/item/deleteAllCards.html b/imports/ui/cardset/navigation/item/deleteAllCards.html
index 7fddc8482f5961ed0a846c5eb26dfcde14e9a09c..08244d574bd7325aa80ff991920aded296315fc8 100644
--- a/imports/ui/cardset/navigation/item/deleteAllCards.html
+++ b/imports/ui/cardset/navigation/item/deleteAllCards.html
@@ -1,17 +1,15 @@
- {{#unless isInBonus}}
- {{#unless isShuffledCardset this._id}}
- {{#if this.quantity}}
- {{#if isCardsetOwner _id}}
-
-
-
- {{/if}}
+ {{#unless isShuffledCardset this._id}}
+ {{#if this.quantity}}
+ {{#if isCardsetOwner _id}}
+
+
+
{{/if}}
- {{/unless}}
+ {{/if}}
{{/unless}}
diff --git a/imports/ui/cardset/navigation/item/deleteAllCards.js b/imports/ui/cardset/navigation/item/deleteAllCards.js
index f8e14e3e9f17104ebcc90641d7c2376b2930c8d1..97b9d8cccceacf3cfa0c9cce9191d7519062a1e0 100644
--- a/imports/ui/cardset/navigation/item/deleteAllCards.js
+++ b/imports/ui/cardset/navigation/item/deleteAllCards.js
@@ -1,20 +1,3 @@
//------------------------ IMPORTS
-import {Meteor} from "meteor/meteor";
-import {Session} from "meteor/session";
-import {Template} from "meteor/templating";
-import {Bonus} from "../../../../api/bonus";
import "../modal/deleteAllCards.js";
import "./deleteAllCards.html";
-
-/*
- * ############################################################################
- * cardsetNavigationExport
- * ############################################################################
- */
-
-Template.cardsetNavigationDeleteAllCards.helpers({
- isInBonus: function () {
- return Bonus.isInBonus(Session.get('activeCardset')._id, Meteor.userId());
- }
-});
-
diff --git a/imports/ui/cardset/navigation/item/export.html b/imports/ui/cardset/navigation/item/export.html
index e5c8dbf4c7c073ecc595f60b9ea9b7d523cc0699..a50fe4dc65aad5902d57c5641712ccb4e7adbd22 100644
--- a/imports/ui/cardset/navigation/item/export.html
+++ b/imports/ui/cardset/navigation/item/export.html
@@ -1,15 +1,13 @@
- {{#unless isInBonus}}
- {{#unless isShuffledCardset this._id}}
- {{#if this.quantity}}
- {{#if isCardsetOwner _id}}
-
-
-
- {{/if}}
+ {{#unless isShuffledCardset this._id}}
+ {{#if this.quantity}}
+ {{#if isCardsetOwner _id}}
+
+
+
{{/if}}
- {{/unless}}
+ {{/if}}
{{/unless}}
diff --git a/imports/ui/cardset/navigation/item/export.js b/imports/ui/cardset/navigation/item/export.js
index f43f03e811b45a068ed3f439a2b8a2f9a7059978..0e482e194eaf1f91ce18727d43c6e4d0e72cc020 100644
--- a/imports/ui/cardset/navigation/item/export.js
+++ b/imports/ui/cardset/navigation/item/export.js
@@ -1,8 +1,6 @@
//------------------------ IMPORTS
import {Meteor} from "meteor/meteor";
-import {Session} from "meteor/session";
import {Template} from "meteor/templating";
-import {Bonus} from "../../../../api/bonus";
import {BertAlertVisuals} from "../../../../api/bertAlertVisuals";
import "./export.html";
@@ -12,12 +10,6 @@ import "./export.html";
* ############################################################################
*/
-Template.cardsetNavigationExport.helpers({
- isInBonus: function () {
- return Bonus.isInBonus(Session.get('activeCardset')._id, Meteor.userId());
- }
-});
-
Template.cardsetNavigationExport.events({
'click #exportCardsBtn': function () {
let name = this.name;
diff --git a/imports/ui/cardset/navigation/item/import.html b/imports/ui/cardset/navigation/item/import.html
index ffea627e82167f39e000bc2c56cb0ff96f358774..319e2aa193a6ef988c63caadffaaddbc24c9b434 100644
--- a/imports/ui/cardset/navigation/item/import.html
+++ b/imports/ui/cardset/navigation/item/import.html
@@ -1,14 +1,12 @@
- {{#unless isInBonus}}
- {{#if isCardsetOwner _id}}
- {{#unless isShuffledCardset _id}}
-
- {{/unless}}
- {{/if}}
- {{/unless}}
+ {{#if isCardsetOwner _id}}
+ {{#unless isShuffledCardset _id}}
+
+ {{/unless}}
+ {{/if}}
diff --git a/imports/ui/cardset/navigation/item/import.js b/imports/ui/cardset/navigation/item/import.js
index 5b802655275e9808eeb2f6772eefa769dd040836..7613ee821d338d38f7f0ad6e306f65079d2be86f 100644
--- a/imports/ui/cardset/navigation/item/import.js
+++ b/imports/ui/cardset/navigation/item/import.js
@@ -1,8 +1,6 @@
//------------------------ IMPORTS
-import {Meteor} from "meteor/meteor";
import {Session} from "meteor/session";
import {Template} from "meteor/templating";
-import {Bonus} from "../../../../api/bonus";
import "../modal/import.js";
import "./import.html";
@@ -12,12 +10,6 @@ import "./import.html";
* ############################################################################
*/
-Template.cardsetNavigationImport.helpers({
- isInBonus: function () {
- return Bonus.isInBonus(Session.get('activeCardset')._id, Meteor.userId());
- }
-});
-
Template.cardsetNavigationImport.events({
'click #importCardsBtn': function () {
Session.set('importType', 1);
diff --git a/imports/ui/cardset/navigation/item/learning.html b/imports/ui/cardset/navigation/item/learning.html
index 7dbea9ebd4f27fc8659ac9b148cbfe52b45cd136..4033f4598563a5eb70a5bc36d2444f39d7b36f50 100644
--- a/imports/ui/cardset/navigation/item/learning.html
+++ b/imports/ui/cardset/navigation/item/learning.html
@@ -1,10 +1,8 @@
- {{#if isInBonus}}
- {{#if notEmpty}}
-
- {{/if}}
+ {{#if notEmpty}}
+
{{/if}}
diff --git a/imports/ui/cardset/navigation/item/learning.js b/imports/ui/cardset/navigation/item/learning.js
index aba7de1328ea973821619ae62b2ca584c33f0ccd..8f9aa50c8fe87bf7f2a280190ee72ada687b9435 100644
--- a/imports/ui/cardset/navigation/item/learning.js
+++ b/imports/ui/cardset/navigation/item/learning.js
@@ -6,7 +6,6 @@ import {Leitner} from "../../../../api/learned";
import {Cardsets} from "../../../../api/cardsets";
import {CardsetNavigation} from "../../../../api/cardsetNavigation";
import {BertAlertVisuals} from "../../../../api/bertAlertVisuals";
-import {Bonus} from "../../../../api/bonus";
import "./learning.html";
/*
@@ -18,13 +17,10 @@ import "./learning.html";
Template.cardsetNavigationLearning.helpers({
notEmpty: function () {
return Leitner.find({
- cardset_id: this._id,
+ cardset_id: Router.current().params._id,
user_id: Meteor.userId(),
active: true
}).count();
- },
- isInBonus: function () {
- return Bonus.isInBonus(Session.get('activeCardset')._id, Meteor.userId());
}
});
@@ -37,82 +33,77 @@ Template.cardsetNavigationLearning.events({
});
Template.cardsetNavigationLearning.onCreated(function () {
- if (!Roles.userIsInRole(Meteor.userId(), ["admin", "editor"])) {
- if (Session.get('activeCardset').owner !== Meteor.userId() && !Session.get('activeCardset').editors.includes(Meteor.userId())) {
- CardsetNavigation.addToLeitner(Session.get('activeCardset')._id);
- }
- }
+ CardsetNavigation.addToLeitner(Session.get('activeCardset')._id);
});
Template.cardsetNavigationLearning.onRendered(function () {
- if (!Roles.userIsInRole(Meteor.userId(), ["admin", "editor"])) {
- if (Meteor.userId() !== Session.get('activeCardset').owner && !Session.get('activeCardset').editors.includes(Meteor.userId())) {
- setTimeout(function () {
- Bert.defaults.hideDelay = 97200;
- let bertType = "success";
- if (Session.get('activeCardset').registrationPeriod.getTime() < new Date()) {
- if (Leitner.findOne({cardset_id: Session.get('activeCardset')._id, user_id: Meteor.userId()}, {fields: {_id: 1}}) === undefined) {
- bertType = "warning";
- BertAlertVisuals.displayBertAlert(TAPi18n.__('bonus.message.registrationPeriodExpired'), bertType, 'growl-top-left');
- return;
- }
+ setTimeout(function () {
+ Bert.defaults.hideDelay = 97200;
+ let bertType = "success";
+ if (Session.get('activeCardset').registrationPeriod.getTime() < new Date()) {
+ if (Leitner.findOne({
+ cardset_id: Session.get('activeCardset')._id,
+ user_id: Meteor.userId()
+ }, {fields: {_id: 1}}) === undefined) {
+ bertType = "warning";
+ BertAlertVisuals.displayBertAlert(TAPi18n.__('bonus.message.registrationPeriodExpired'), bertType, 'growl-top-left');
+ return;
+ }
+ }
+ if (Session.get('activeCardset').learningEnd.getTime() > new Date().getTime()) {
+ let text = "";
+ if (Leitner.find({
+ cardset_id: Session.get('activeCardset')._id,
+ user_id: Meteor.userId(),
+ active: true
+ }).count()) {
+ var active = Leitner.findOne({
+ cardset_id: Session.get('activeCardset')._id,
+ user_id: Meteor.userId(),
+ active: true
+ });
+ var deadline = new Date(active.currentDate.getTime() + Session.get('activeCardset').daysBeforeReset * 86400000);
+ if (deadline.getTime() > Session.get('activeCardset').learningEnd.getTime()) {
+ text += (TAPi18n.__('deadlinePrologue') + moment(Session.get('activeCardset').learningEnd).format("DD.MM.YYYY") + TAPi18n.__('deadlineEpilogue1'));
+ } else {
+ text += (TAPi18n.__('deadlinePrologue') + moment(deadline).format("DD.MM.YYYY") + TAPi18n.__('deadlineEpilogue2'));
}
- if (Session.get('activeCardset').learningEnd.getTime() > new Date().getTime()) {
- let text = "";
- if (Leitner.find({
- cardset_id: Session.get('activeCardset')._id,
+ bertType = "warning";
+ } else {
+ if (Leitner.find({
+ cardset_id: Session.get('activeCardset')._id,
+ user_id: Meteor.userId(),
+ box: {$ne: 6}
+ }).count() === 0) {
+ text += TAPi18n.__('bonus.message.learnedEverything');
+ } else {
+ let nextCardDate = Leitner.findOne({
+ cardset_id: Router.current().params._id,
user_id: Meteor.userId(),
- active: true
- }).count()) {
- var active = Leitner.findOne({
- cardset_id: Session.get('activeCardset')._id,
- user_id: Meteor.userId(),
- active: true
- });
- var deadline = new Date(active.currentDate.getTime() + Session.get('activeCardset').daysBeforeReset * 86400000);
- if (deadline.getTime() > Session.get('activeCardset').learningEnd.getTime()) {
- text += (TAPi18n.__('deadlinePrologue') + moment(Session.get('activeCardset').learningEnd).format("DD.MM.YYYY") + TAPi18n.__('deadlineEpilogue1'));
- } else {
- text += (TAPi18n.__('deadlinePrologue') + moment(deadline).format("DD.MM.YYYY") + TAPi18n.__('deadlineEpilogue2'));
- }
- bertType = "warning";
+ box: {$ne: 6}
+ }, {sort: {nextDate: 1}}).nextDate;
+ let learningEnd = Cardsets.findOne({_id: Router.current().params._id}).learningEnd;
+ if (nextCardDate.getTime() > learningEnd.getTime()) {
+ text += TAPi18n.__('noMoreCardsBeforeEnd');
+ }
+ let nextDate;
+ if (nextCardDate.getTime() < new Date().getTime()) {
+ nextDate = moment(new Date());
} else {
- if (Leitner.find({
- cardset_id: Session.get('activeCardset')._id,
- user_id: Meteor.userId(),
- box: {$ne: 6}
- }).count() === 0) {
- text += TAPi18n.__('bonus.message.learnedEverything');
- } else {
- let nextCardDate = Leitner.findOne({
- cardset_id: Router.current().params._id,
- user_id: Meteor.userId(),
- box: {$ne: 6}
- }, {sort: {nextDate: 1}}).nextDate;
- let learningEnd = Cardsets.findOne({_id: Router.current().params._id}).learningEnd;
- if (nextCardDate.getTime() > learningEnd.getTime()) {
- text += TAPi18n.__('noMoreCardsBeforeEnd');
- }
- let nextDate;
- if (nextCardDate.getTime() < new Date().getTime()) {
- nextDate = moment(new Date());
- } else {
- nextDate = moment(nextCardDate);
- }
- if (nextDate.get('hour') >= Meteor.settings.public.leitner.dayIntervalHour) {
- nextDate.add(1, 'day');
- }
- nextDate.hour(Meteor.settings.public.leitner.dayIntervalHour);
- nextDate.minute(0);
- text += TAPi18n.__('noCardsToLearn') + nextDate.format("DD.MM.YYYY") + TAPi18n.__('at') + nextDate.format("HH:mm") + TAPi18n.__('released');
- }
+ nextDate = moment(nextCardDate);
}
- BertAlertVisuals.displayBertAlert(text, bertType, 'growl-top-left');
- } else {
- BertAlertVisuals.displayBertAlert(TAPi18n.__('bonus.message.bonusEnded'), bertType, 'growl-top-left');
+ if (nextDate.get('hour') >= Meteor.settings.public.leitner.dayIntervalHour) {
+ nextDate.add(1, 'day');
+ }
+ nextDate.hour(Meteor.settings.public.leitner.dayIntervalHour);
+ nextDate.minute(0);
+ text += TAPi18n.__('noCardsToLearn') + nextDate.format("DD.MM.YYYY") + TAPi18n.__('at') + nextDate.format("HH:mm") + TAPi18n.__('released');
}
- Bert.defaults.hideDelay = 7;
- }, 2000);
+ }
+ BertAlertVisuals.displayBertAlert(text, bertType, 'growl-top-left');
+ } else {
+ BertAlertVisuals.displayBertAlert(TAPi18n.__('bonus.message.bonusEnded'), bertType, 'growl-top-left');
}
- }
+ Bert.defaults.hideDelay = 7;
+ }, 2000);
});
diff --git a/imports/ui/cardset/navigation/item/manage.html b/imports/ui/cardset/navigation/item/manage.html
index 29dc0213eddb404f0b7568c1e924b3526a2fe5d0..3bab10e93ad8c636193236e72e31e4d45a8d7af3 100644
--- a/imports/ui/cardset/navigation/item/manage.html
+++ b/imports/ui/cardset/navigation/item/manage.html
@@ -12,16 +12,14 @@
{{_
"report"}}
- {{#unless isInBonus}}
- {{#if learning}}
-
{{_
- "confirm-leave-cardset.btn-txt"}}
- {{else}}
-
{{_
- "confirm-leave-cardset.btn-txt"}}
- {{/if}}
- {{/unless}}
+ {{#if learning}}
+
{{_
+ "confirm-leave-cardset.btn-txt"}}
+ {{else}}
+
{{_
+ "confirm-leave-cardset.btn-txt"}}
+ {{/if}}
{{/unless}}
{{#if isEditor}}
{{#unless isCardsetOwner _id}}
diff --git a/imports/ui/cardset/navigation/item/newCard.html b/imports/ui/cardset/navigation/item/newCard.html
index ee66ced041ed843455b3f8ae733fcf3838757d96..5b150e223b18ab91fb7b2048e45a01f70c64a3cd 100644
--- a/imports/ui/cardset/navigation/item/newCard.html
+++ b/imports/ui/cardset/navigation/item/newCard.html
@@ -1,14 +1,12 @@
- {{#unless isInBonus}}
- {{#if isCardsetOwner _id}}
- {{#unless isShuffledCardset _id}}
-
- {{/unless}}
- {{/if}}
- {{/unless}}
+ {{#if isCardsetOwner _id}}
+ {{#unless isShuffledCardset _id}}
+
+ {{/unless}}
+ {{/if}}
\ No newline at end of file
diff --git a/imports/ui/cardset/navigation/item/newCard.js b/imports/ui/cardset/navigation/item/newCard.js
index 52ab3aa0de96303e42ad78f5d4de770789792543..b8fffe1161fe795ff420a81a40acc967170bba0d 100644
--- a/imports/ui/cardset/navigation/item/newCard.js
+++ b/imports/ui/cardset/navigation/item/newCard.js
@@ -1,18 +1,2 @@
//------------------------ IMPORTS
-import {Meteor} from "meteor/meteor";
-import {Session} from "meteor/session";
-import {Template} from "meteor/templating";
-import {Bonus} from "../../../../api/bonus";
import "./newCard.html";
-
-/*
- * ############################################################################
- * cardsetNavigationNewCard
- * ############################################################################
- */
-
-Template.cardsetNavigationNewCard.helpers({
- isInBonus: function () {
- return Bonus.isInBonus(Session.get('activeCardset')._id, Meteor.userId());
- }
-});
diff --git a/imports/ui/cardset/navigation/item/presentation.html b/imports/ui/cardset/navigation/item/presentation.html
index 479c4d0f865616d279f0c24e7d46740c07167c47..eeed80b17fc5ae336b08561f241667b4f1a58deb 100644
--- a/imports/ui/cardset/navigation/item/presentation.html
+++ b/imports/ui/cardset/navigation/item/presentation.html
@@ -1,15 +1,13 @@
- {{#unless isInBonus}}
- {{#if this.quantity}}
- {{#if gotPresentation}}
-
-
-
- {{/if}}
+ {{#if this.quantity}}
+ {{#if gotPresentation}}
+
+
+
{{/if}}
- {{/unless}}
+ {{/if}}
diff --git a/imports/ui/cardset/navigation/item/presentation.js b/imports/ui/cardset/navigation/item/presentation.js
index a032c85414b141c8141556a855be59a4b1b13dfd..8065df43cc3bdd1d5c2b11351453447074b132f9 100644
--- a/imports/ui/cardset/navigation/item/presentation.js
+++ b/imports/ui/cardset/navigation/item/presentation.js
@@ -1,9 +1,6 @@
//------------------------ IMPORTS
-import {Meteor} from "meteor/meteor";
-import {Session} from "meteor/session";
import {Template} from "meteor/templating";
import {CardType} from "../../../../api/cardTypes";
-import {Bonus} from "../../../../api/bonus";
import "./presentation.html";
/*
@@ -19,9 +16,6 @@ Template.cardsetNavigationPresentation.helpers({
} else {
return CardType.gotPresentationMode(this.cardType);
}
- },
- isInBonus: function () {
- return Bonus.isInBonus(Session.get('activeCardset')._id, Meteor.userId());
}
});
diff --git a/imports/ui/cardset/navigation/item/workload.html b/imports/ui/cardset/navigation/item/workload.html
index 9175089204642590c220136d86e8c1d5fb536d1e..58d3b3fd54f365eaffe0adfb64b70189d7d327b2 100644
--- a/imports/ui/cardset/navigation/item/workload.html
+++ b/imports/ui/cardset/navigation/item/workload.html
@@ -1,37 +1,35 @@
- {{#unless isInBonus}}
- {{#if this.quantity}}
- {{#if gotLearningModes}}
-
-
-
-
- {{/if}}
+ {{#if this.quantity}}
+ {{#if gotLearningModes}}
+
+
+
+
{{/if}}
- {{/unless}}
+ {{/if}}
diff --git a/imports/ui/cardset/navigation/item/workload.js b/imports/ui/cardset/navigation/item/workload.js
index eb70d1a5900e31a1f2f2e34d4db598866905cf3e..a392bd83a8756db9b93b2b6057400520065c5814 100644
--- a/imports/ui/cardset/navigation/item/workload.js
+++ b/imports/ui/cardset/navigation/item/workload.js
@@ -1,12 +1,10 @@
//------------------------ IMPORTS
import {Meteor} from "meteor/meteor";
-import {Session} from "meteor/session";
import {Template} from "meteor/templating";
import {CardType} from "../../../../api/cardTypes";
import {Leitner, Wozniak} from "../../../../api/learned";
import {Cardsets} from "../../../../api/cardsets";
import {CardsetNavigation} from "../../../../api/cardsetNavigation";
-import {Bonus} from "../../../../api/bonus";
import "../modal/leitner.js";
import "../modal/wozniak.js";
import "../modal/chooseFlashcards.js";
@@ -37,9 +35,6 @@ Template.cardsetNavigationWorkload.helpers({
return Wozniak.findOne({
cardset_id: Router.current().params._id,
user_id: Meteor.userId()});
- },
- isInBonus: function () {
- return Bonus.isInBonus(Session.get('activeCardset')._id, Meteor.userId());
}
});
diff --git a/imports/ui/cardset/navigation/navigation.html b/imports/ui/cardset/navigation/navigation.html
index c8d2927e6938ee3cc70b9cb4fd356e1c64d4ca38..1a799af4c47880260d0afb14568ce3f2474a966b 100644
--- a/imports/ui/cardset/navigation/navigation.html
+++ b/imports/ui/cardset/navigation/navigation.html
@@ -1,9 +1,14 @@