diff --git a/control/content/index.html b/control/content/index.html index dbf30c8..0afbf86 100755 --- a/control/content/index.html +++ b/control/content/index.html @@ -18,6 +18,7 @@ + diff --git a/control/content/js/content.controller.js b/control/content/js/content.controller.js index 6da8734..af091b4 100644 --- a/control/content/js/content.controller.js +++ b/control/content/js/content.controller.js @@ -10,7 +10,7 @@ const contentController = { Settings.get().then((result) => { if (!result || !Object.keys(result).length) { Analytics.init(); // init analytics only for the first time of installing the plugin - Settings.save(new Setting({ navigateToCwByDefault: true })).then((settings) => { + Settings.save(new Setting({ navigateToCwByDefault: true, createdBy: authManager.currentUser.userId })).then((settings) => { state.settings = new Setting(); resolve(); }).catch((err) => { // don't blok the ui, just print the error and resolve diff --git a/control/content/js/index.js b/control/content/js/index.js index 0407755..38e7435 100644 --- a/control/content/js/index.js +++ b/control/content/js/index.js @@ -38,5 +38,7 @@ const contentPage = { }; window.onload = () => { - contentPage.init(); + authManager.enforceLogin().then(() => { + contentPage.init(); + }); }; diff --git a/control/settings/index.html b/control/settings/index.html index 7a38332..da36507 100644 --- a/control/settings/index.html +++ b/control/settings/index.html @@ -18,6 +18,7 @@ + diff --git a/control/settings/js/index.js b/control/settings/js/index.js index f178eb4..9f6daf7 100644 --- a/control/settings/js/index.js +++ b/control/settings/js/index.js @@ -226,7 +226,8 @@ const settingsPage = { })); this.updateDeepSettingValue(`${settingKey}.tags`, updatedTags); }; - tagsInput.set(settingValue.tags); + const tags = settingValue.tags.map(tag => ({...tag, tagName: tag.tagName ? tag.tagName : tag.value})); + tagsInput.set(tags); }, initDropdown(options) { @@ -385,5 +386,7 @@ const settingsPage = { }; window.onload = () => { - settingsPage.init(); + authManager.enforceLogin().then(() => { + settingsPage.init(); + }); }; diff --git a/widget/global/js/repositories/Settings.js b/widget/global/js/repositories/Settings.js index 8f79720..0854fa2 100644 --- a/widget/global/js/repositories/Settings.js +++ b/widget/global/js/repositories/Settings.js @@ -17,6 +17,8 @@ class Settings { static save(settings) { return new Promise((resolve, reject) => { + settings.lastUpdatedOn = new Date(); + settings.lastUpdatedBy = authManager.currentUser.userId; buildfire.datastore.save(new Setting(settings), this.TAG, (err, res) => { if (err) { reject(err); diff --git a/widget/global/js/repositories/UserCredits.js b/widget/global/js/repositories/UserCredits.js index b59b9a0..419fa83 100644 --- a/widget/global/js/repositories/UserCredits.js +++ b/widget/global/js/repositories/UserCredits.js @@ -18,6 +18,7 @@ class UserCredits { if (!results || !results.length) { const data = new UserCredit({ userId, + createdBy: userId, }).toJSON(); this.insert(data).then((res) => { res.data.id = res.id; diff --git a/widget/index.html b/widget/index.html index 8a7baad..cab5898 100755 --- a/widget/index.html +++ b/widget/index.html @@ -93,16 +93,16 @@
@@ -129,16 +129,16 @@ diff --git a/widget/js/app.js b/widget/js/app.js index a123c21..68b9cbf 100644 --- a/widget/js/app.js +++ b/widget/js/app.js @@ -15,7 +15,7 @@ const hasPermission = (permissionType) => { const permissionTags = state.settings.permissions[permissionType].tags; for (let i = 0; i < permissionTags.length; i++) { - if (userTags.some((_tag) => _tag.tagName === permissionTags[i].tagName)) { + if (userTags.some((_tag) => (_tag.tagName === permissionTags[i].tagName || _tag.tagName === permissionTags[i].value))) { userPermitted = true; break; } diff --git a/widget/js/pages/home/index.js b/widget/js/pages/home/index.js index 6547e40..9754f9f 100644 --- a/widget/js/pages/home/index.js +++ b/widget/js/pages/home/index.js @@ -68,7 +68,7 @@ const homePage = { suggestionTitle.innerHTML = suggestion.title; suggestionBodyText.innerHTML = suggestion.suggestion; widgetPagesShared.validateSuggestionImage(suggestionBodyText); - suggestionVotesCount.innerHTML = `${Object.keys(suggestion.upVotedBy).length}`; + let suggestionVotesCountClasses = 'margin--0'; if (!state.settings.enableComments) { suggestionCommentContainer.classList.add('hidden'); @@ -76,11 +76,16 @@ const homePage = { if (authManager.currentUser && suggestion.upVotedBy && suggestion.upVotedBy[authManager.currentUser.userId]) { upvote_icon.className = 'padding-zero margin--zero iconsTheme material-icons'; + suggestionVotesCountClasses += ' iconsTheme' + } else { + suggestionVotesCountClasses += ' bodyTextTheme' } if (suggestion.status === SUGGESTION_STATUS.COMPLETED) { upvote_icon.classList.add('disabled'); } + suggestionVotesCount.innerHTML = `${Object.keys(suggestion.upVotedBy).length}`; + suggestionCommentContainer.onclick = () => widgetPagesShared.navigateToSuggestionComments(suggestion); upvote_icon.onclick = () => widgetPagesShared.voteToSuggestion(suggestion); suggestionStatus.onclick = () => widgetPagesShared.updateSuggestionStatus(suggestion); @@ -223,20 +228,11 @@ const homePage = { }); if (suggestions.length < state.pageSize) { - if (state.currentStatusSearch === SUGGESTION_STATUS.COMPLETED) { + if (state.startFetchingCompleted) { state.isAllSuggestionFetched = true; if (!state.suggestionsList.length) this.printEmptyState(); - } else if (state.currentStatusSearch === SUGGESTION_STATUS.INPROGRESS) { - state.currentStatusSearch = SUGGESTION_STATUS.COMPLETED; - state.page = 0; - - widgetController.getSuggestions().then((suggestions) => { - this.handleSuggestionPage(suggestions) - }).catch((err) => { - console.error(err); - }); } else { - state.currentStatusSearch = SUGGESTION_STATUS.INPROGRESS; + state.startFetchingCompleted = true; state.page = 0; widgetController.getSuggestions().then((suggestions) => { @@ -251,7 +247,7 @@ const homePage = { init() { this.initSelectors(); - widgetController.getSuggestions().then((suggestions) => { + widgetController.getFirstSuggestionsPage().then((suggestions) => { setTimeout(() => { this.destroySkeleton(); diff --git a/widget/js/pages/suggestion/index.js b/widget/js/pages/suggestion/index.js index d2360fc..0b0f821 100644 --- a/widget/js/pages/suggestion/index.js +++ b/widget/js/pages/suggestion/index.js @@ -50,7 +50,7 @@ const suggestionDetailsPage = { suggestionTitle.innerHTML = state.activeSuggestion.title; suggestionBodyText.innerHTML = state.activeSuggestion.suggestion; widgetPagesShared.validateSuggestionImage(suggestionBodyText); - suggestionVotesCount.innerHTML = `${Object.keys(state.activeSuggestion.upVotedBy).length}`; + let suggestionVotesCountClasses = 'margin--0'; if (!state.settings.enableComments) { suggestionCommentContainer.classList.add('hidden'); @@ -58,11 +58,16 @@ const suggestionDetailsPage = { if (authManager.currentUser && state.activeSuggestion.upVotedBy && state.activeSuggestion.upVotedBy[authManager.currentUser.userId]) { upvote_icon.className = 'padding-zero margin--zero iconsTheme material-icons'; + suggestionVotesCountClasses += ' iconsTheme' + } else { + suggestionVotesCountClasses += ' bodyTextTheme' } if (state.activeSuggestion.status === SUGGESTION_STATUS.COMPLETED) { upvote_icon.classList.add('disabled'); } + suggestionVotesCount.innerHTML = `${Object.keys(state.activeSuggestion.upVotedBy).length}`; + suggestionCommentContainer.onclick = () => widgetPagesShared.navigateToSuggestionComments(state.activeSuggestion); upvote_icon.onclick = () => widgetPagesShared.voteToSuggestion(state.activeSuggestion); suggestionStatus.onclick = () => widgetPagesShared.updateSuggestionStatus(state.activeSuggestion); diff --git a/widget/js/pages/widgetPagesShared.js b/widget/js/pages/widgetPagesShared.js index 3c9e6a0..af7ebb2 100644 --- a/widget/js/pages/widgetPagesShared.js +++ b/widget/js/pages/widgetPagesShared.js @@ -256,11 +256,11 @@ const widgetPagesShared = { }).then((isConfirmed) => { if (isConfirmed) { widgetController.handleSuggestionUnVote(suggestion).then((updatedSuggestion) => { - if (upvote_icon) upvote_icon.className = 'padding-zero margin--zero iconsTheme material-icons-outlined'; - if (suggestionVotesCount) suggestionVotesCount.innerHTML = `${Object.keys(updatedSuggestion.upVotedBy).length}`; + if (upvote_icon) upvote_icon.className = 'padding-zero margin--zero bodyTextTheme material-icons'; + if (suggestionVotesCount) suggestionVotesCount.innerHTML = `${Object.keys(updatedSuggestion.upVotedBy).length}`; - if (detailsVoteIcon) detailsVoteIcon.className = 'padding-zero margin--zero iconsTheme material-icons-outlined'; - if (detailsVotesCount) detailsVotesCount.innerHTML = `${Object.keys(updatedSuggestion.upVotedBy).length}`; + if (detailsVoteIcon) detailsVoteIcon.className = 'padding-zero margin--zero bodyTextTheme material-icons'; + if (detailsVotesCount) detailsVotesCount.innerHTML = `${Object.keys(updatedSuggestion.upVotedBy).length}`; }).catch((err) => { console.error(err); if (upvote_icon) upvote_icon.classList.remove('disabled'); diff --git a/widget/js/state.js b/widget/js/state.js index d5de98c..9306b23 100644 --- a/widget/js/state.js +++ b/widget/js/state.js @@ -51,9 +51,9 @@ const state = { settings: new Setting(), page: 0, pageSize: 50, - currentStatusSearch: SUGGESTION_STATUS.BACKLOG, fetching: false, isAllSuggestionFetched: false, + startFetchingCompleted: false, validUserImages: {}, suggestionsList: [], updatedUsersData: [], diff --git a/widget/js/widget.controller.js b/widget/js/widget.controller.js index 4fb2dcb..b7b65d2 100644 --- a/widget/js/widget.controller.js +++ b/widget/js/widget.controller.js @@ -53,15 +53,17 @@ const widgetController = { getSuggestions() { return new Promise((resolve) => { - const { page, pageSize, settings, currentStatusSearch } = state; + const { page, pageSize, settings, startFetchingCompleted } = state; const searchOptions = { page, pageSize }; let $match = { "_buildfire.index.string1": { $exists: false } }, $sort = {}; - if (currentStatusSearch === SUGGESTION_STATUS.COMPLETED) { + if (startFetchingCompleted) { + // hide completed immediately if (settings.hideCompletedItems === 0) return resolve([]); + // hide completed after a certain period if (settings.hideCompletedItems > 0) { const startDate = new Date(); startDate.setDate(startDate.getDate() - settings.hideCompletedItems); @@ -71,10 +73,14 @@ const widgetController = { { modifiedOn: { $gte: startDate } } ]; } else { - $match.status = { $eq: currentStatusSearch }; + // never hide the completed items + $match.status = { $eq: SUGGESTION_STATUS.COMPLETED }; } } else { - $match.status = { $eq: currentStatusSearch }; + $match['$or'] = [ + { status: SUGGESTION_STATUS.BACKLOG }, + { status: SUGGESTION_STATUS.INPROGRESS }, + ]; } switch (settings.defaultItemSorting) { @@ -124,6 +130,23 @@ const widgetController = { }); }, + getFirstSuggestionsPage() { + return new Promise((resolve, reject) => { + this.getSuggestions().then((suggestions) => { + if (suggestions.length >= 10) { + resolve(suggestions); + } else { + state.startFetchingCompleted = true; + state.page = 0; + + this.getSuggestions().then(() => { + resolve(state.suggestionsList); + }); + } + }) + }) + }, + getSuggestionById(suggestionId) { return new Promise((resolve, reject) => { Suggestions.getById(suggestionId).then((suggestion) => { @@ -221,6 +244,8 @@ const widgetController = { const payload = { $set: { credits: encryptedCredits, + lastUpdatedBy: authManager.currentUser._id, + lastUpdatedOn: new Date(), }, }; return UserCredits.update(authManager.currentUser._id, payload).then((updatedCredits) => { @@ -242,14 +267,15 @@ const widgetController = { const encryptedCredits = widgetUtils.encryptCredit(state.settings.inAppPurchase.votesPerPurchase, ENUMS.SECRET_KEY); const payload = { $set: { - createdBy: authManager.currentUser._id, + lastUpdatedBy: authManager.currentUser._id, + lastUpdatedOn: new Date(), credits: encryptedCredits, firstTimePurchase: true, }, }; UserCredits.update(authManager.currentUser._id, payload).then((updatedCredits) => { state.userCredits = { - createdBy: authManager.currentUser._id, + lastUpdatedBy: authManager.currentUser._id, credits: encryptedCredits, firstTimePurchase: true, };