diff --git a/src/authentication.js b/src/authentication.js index 480ab48..a201ec6 100644 --- a/src/authentication.js +++ b/src/authentication.js @@ -22,6 +22,7 @@ database.connect().then(async e => { if(communities[i].title_id !== null) { for(let j = 0; j < communities[i].title_id.length; j++) { communityMap.set(communities[i].title_id[j], communities[i].name); + communityMap.set(communities[i].title_id[j] + '-id', communities[i].community_id); } } } diff --git a/src/database.js b/src/database.js index 34bc496..d57cb5a 100644 --- a/src/database.js +++ b/src/database.js @@ -203,6 +203,18 @@ async function getCommunityPostsAfterTimestamp(post, numberOfPosts) { }).limit(numberOfPosts); } +async function pushNewNotificationByPID(PID, content, link) { + verifyConnected(); + return USER.update( + { pid: PID }, { $push: { notification_list: { content: content, link: link, read: false, created_at: Date() }}}); +} + +async function pushNewNotificationToAll(content, link) { + verifyConnected(); + return USER.updateMany( + {}, { $push: { notification_list: { content: content, link: link, read: false, created_at: Date() }}}); +} + async function getDiscoveryHosts() { verifyConnected(); return ENDPOINT.findOne({ @@ -267,5 +279,7 @@ module.exports = { getUserByUsername, getUserPostsAfterTimestamp, getCommunityPostsAfterTimestamp, - getServerConfig + getServerConfig, + pushNewNotificationByPID, + pushNewNotificationToAll }; \ No newline at end of file diff --git a/src/services/juxt-web/routes/admin/api.js b/src/services/juxt-web/routes/admin/api.js index a1478d4..f1dfa35 100644 --- a/src/services/juxt-web/routes/admin/api.js +++ b/src/services/juxt-web/routes/admin/api.js @@ -431,4 +431,19 @@ router.post('/posts/:postID/delete', function (req, res) { }); }); +router.get('/notifications', function (req, res) { + database.connect().then(async e => { + await database.pushNewNotificationToAll('Testing a system wide notification and linking to a post', '/users/me') + res.sendStatus(200); + }).catch(error => + { + res.statusCode = 400; + let response = { + error_code: 400, + message: error.message + }; + res.send(response); + }); +}); + module.exports = router; \ No newline at end of file diff --git a/src/services/juxt-web/routes/ctr/userpage.js b/src/services/juxt-web/routes/ctr/userpage.js index 5523b92..39ae275 100644 --- a/src/services/juxt-web/routes/ctr/userpage.js +++ b/src/services/juxt-web/routes/ctr/userpage.js @@ -28,7 +28,7 @@ router.get('/me', function (req, res) { }); } else { - res.render('ctr/portal_user_page.ejs', { + res.render('ctr/user_page.ejs', { // EJS variable and server-side variable user: user, newPosts: newPosts, @@ -62,7 +62,7 @@ router.get('/show', function (req, res) { let newPosts = await database.getPostsByUserID(user.pid); let numPosts = await database.getNumberPostsByUserID(user.pid); if(isAJAX) { - res.render('ctr/portal_user_page_ajax.ejs', { + res.render('ctr/user_page_ajax.ejs', { // EJS variable and server-side variable user: user, newPosts: newPosts, @@ -70,7 +70,7 @@ router.get('/show', function (req, res) { }); } else { - res.render('ctr/portal_user_page.ejs', { + res.render('ctr/user_page.ejs', { // EJS variable and server-side variable user: user, newPosts: newPosts, diff --git a/src/services/juxt-web/routes/portal/communities.js b/src/services/juxt-web/routes/portal/communities.js index 8d0fdc5..c416faa 100644 --- a/src/services/juxt-web/routes/portal/communities.js +++ b/src/services/juxt-web/routes/portal/communities.js @@ -9,25 +9,14 @@ var router = express.Router(); router.get('/', function (req, res) { res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2'); - var isAJAX = ((req.query.ajax+'').toLowerCase() === 'true') database.connect().then(async e => { let popularCommunities = await database.getMostPopularCommunities(9); let newCommunities = await database.getNewCommunities(6); - if(isAJAX) { - res.render('portal/portal_communities_ajax.ejs', { - // EJS variable and server-side variable - popularCommunities: popularCommunities, - newCommunities: newCommunities - }); - } - else { - res.render('portal/portal_communities.ejs', { - // EJS variable and server-side variable - popularCommunities: popularCommunities, - newCommunities: newCommunities - }); - } - + res.render('portal/communities.ejs', { + // EJS variable and server-side variable + popularCommunities: popularCommunities, + newCommunities: newCommunities + }); }).catch(error => { res.set("Content-Type", "application/xml"); res.statusCode = 400; @@ -46,20 +35,11 @@ router.get('/', function (req, res) { router.get('/all', function (req, res) { res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2'); - var isAJAX = ((req.query.ajax+'').toLowerCase() === 'true') database.connect().then(async e => { let communities = await database.getCommunities(90); - if(isAJAX) { - res.render('portal/portal_all_communities_ajax.ejs', { - communities: communities, - }); - } - else { - res.render('portal/portal_all_communities.ejs', { - communities: communities, - }); - } - + res.render('portal/all_communities.ejs', { + communities: communities, + }); }).catch(error => { res.set("Content-Type", "application/xml"); res.statusCode = 400; @@ -78,7 +58,6 @@ router.get('/all', function (req, res) { router.get('/announcements', function (req, res) { res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2'); - var isAJAX = ((req.query.ajax+'').toLowerCase() === 'true') database.connect().then(async e => { let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]); if(pid === null) @@ -87,25 +66,13 @@ router.get('/announcements', function (req, res) { let community = await database.getCommunityByID('announcements'); let newPosts = await database.getNumberNewCommunityPostsByID(community, 25); let totalNumPosts = await database.getTotalPostsByCommunity(community); - - if(isAJAX) { - res.render('portal/portal_announcements_ajax.ejs', { - moment: moment, - community: community, - newPosts: newPosts, - user: user, - totalNumPosts: totalNumPosts - }); - } - else { - res.render('portal/portal_announcements.ejs', { - moment: moment, - community: community, - newPosts: newPosts, - user: user, - totalNumPosts: totalNumPosts - }); - } + res.render('portal/announcements.ejs', { + moment: moment, + community: community, + newPosts: newPosts, + user: user, + totalNumPosts: totalNumPosts + }); }).catch(error => { console.error(error); res.set("Content-Type", "application/xml"); @@ -123,9 +90,8 @@ router.get('/announcements', function (req, res) { }); }); -router.get('/:communityID', function (req, res) { +router.get('/:communityID/:type', function (req, res) { res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2'); - var isAJAX = ((req.query.ajax+'').toLowerCase() === 'true') database.connect().then(async e => { let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]); if(pid === null) @@ -134,28 +100,15 @@ router.get('/:communityID', function (req, res) { console.log(req.params.communityID) let community = await database.getCommunityByID(req.params.communityID.toString()); let newPosts = await database.getNumberNewCommunityPostsByID(community, 5); - let totalNumPosts = await database.getTotalPostsByCommunity(community); - - if(isAJAX) { - res.render('portal/portal_community_ajax.ejs', { - // EJS variable and server-side variable - moment: moment, - community: community, - newPosts: newPosts, - totalNumPosts: totalNumPosts, - user: user - }); - } - else { - res.render('portal/portal_community.ejs', { - // EJS variable and server-side variable - moment: moment, - community: community, - newPosts: newPosts, - totalNumPosts: totalNumPosts, - user: user - }); - } + let totalNumPosts = await database.getTotalPostsByCommunity(community) + res.render('portal/community.ejs', { + // EJS variable and server-side variable + moment: moment, + community: community, + newPosts: newPosts, + totalNumPosts: totalNumPosts, + user: user + }); }).catch(error => { console.error(error); res.set("Content-Type", "application/xml"); @@ -202,7 +155,7 @@ router.get('/:communityID/:type/loadPosts', function (req, res) { if(posts.length > 0) { - res.render('portal/portal_more_posts_ajax.ejs', { + res.render('portal/more_posts.ejs', { communityMap: communityMap, moment: moment, database: database, diff --git a/src/services/juxt-web/routes/portal/feed.js b/src/services/juxt-web/routes/portal/feed.js index bcad95c..1cf8e4d 100644 --- a/src/services/juxt-web/routes/portal/feed.js +++ b/src/services/juxt-web/routes/portal/feed.js @@ -23,7 +23,7 @@ router.get('/loadPosts', function (req, res) { let communityMap = await util.data.getCommunityHash(); if(newPosts.length > 0) { - res.render('portal/portal_more_posts_ajax.ejs', { + res.render('portal/more_posts_ajax.ejs', { communityMap: communityMap, moment: moment, user: user, diff --git a/src/services/juxt-web/routes/portal/notifications.js b/src/services/juxt-web/routes/portal/notifications.js index 5edd03c..3b6450f 100644 --- a/src/services/juxt-web/routes/portal/notifications.js +++ b/src/services/juxt-web/routes/portal/notifications.js @@ -7,7 +7,6 @@ var router = express.Router(); router.get('/', function (req, res) { res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2||fonts.googleapis.com,,2'); - var isAJAX = ((req.query.ajax+'').toLowerCase() === 'true') database.connect().then(async e => { //let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]); @@ -16,21 +15,14 @@ router.get('/', function (req, res) { if(pid === null) pid = 1000000000; let user = await database.getUserByPID(pid); - if(isAJAX) { - res.render('portal/notifications_ajax.ejs', { - moment: moment, - user: user, - }); - } - else { - res.render('portal/notifications.ejs', { - moment: moment, - user: user, - }); - } + res.render('portal/notifications.ejs', { + moment: moment, + user: user, + }); user.notification_list.filter(noti => noti.read === false).forEach(function(notification) { notification.read = true; }); + user.markModified('notification_list'); user.save(); }).catch(error => { console.log(error); diff --git a/src/services/juxt-web/routes/portal/show.js b/src/services/juxt-web/routes/portal/show.js index f283a63..dc91f17 100644 --- a/src/services/juxt-web/routes/portal/show.js +++ b/src/services/juxt-web/routes/portal/show.js @@ -13,14 +13,14 @@ router.get('/', function (req, res) { let user = null; if(pid === null) { - res.render('portal/portal_guest_notice.ejs', {}); + res.render('portal/guest_notice.ejs', {}); } else { user = await database.getUserByPID(pid); if(user === null) { - res.render('portal/portal_first_run.ejs', {}); + res.render('portal/first_run.ejs', {}); } if(moment(user.ban_lift_date).format('YYYY-MM-DD') <= moment().format('YYYY-MM-DD') && user.account_status !== 3) { user.account_status = 0; @@ -35,7 +35,7 @@ router.get('/', function (req, res) { */ if(user.account_status !== 0) { - res.render('portal/portal_ban_notification.ejs', { + res.render('portal/ban_notification.ejs', { user: user, moment: moment }); @@ -44,7 +44,7 @@ router.get('/', function (req, res) { { let popularCommunities = await database.getMostPopularCommunities(9); let newCommunities = await database.getNewCommunities(6); - res.render('portal/portal_communities.ejs', { + res.render('portal/communities.ejs', { popularCommunities: popularCommunities, newCommunities: newCommunities }); @@ -69,7 +69,7 @@ router.get('/', function (req, res) { router.get('/first', function (req, res) { res.header('X-Nintendo-WhiteList','1|http,youtube.com,,2|https,youtube.com,,2|http,.youtube.com,,2|https,.youtube.com,,2|http,.ytimg.com,,2|https,.ytimg.com,,2|http,.googlevideo.com,,2|https,.googlevideo.com,,2|https,youtube.com,/embed/,6|https,youtube.com,/e/,6|https,youtube.com,/v/,6|https,www.youtube.com,/embed/,6|https,www.youtube.com,/e/,6|https,www.youtube.com,/v/,6|https,youtube.googleapis.com,/e/,6|https,youtube.googleapis.com,/v/,6|http,maps.googleapis.com,/maps/api/streetview,2|https,maps.googleapis.com,/maps/api/streetview,2|http,cbk0.google.com,/cbk,2|https,cbk0.google.com,/cbk,2|http,cbk1.google.com,/cbk,2|https,cbk1.google.com,/cbk,2|http,cbk2.google.com,/cbk,2|https,cbk2.google.com,/cbk,2|http,cbk3.google.com,/cbk,2|https,cbk3.google.com,/cbk,2|https,.cloudfront.net,,2|https,www.google-analytics.com,/,2|https,stats.g.doubleclick.net,,2|https,www.google.com,/ads/,2|https,ssl.google-analytics.com,,2|http,fonts.googleapis.com,,2|fonts.googleapis.com,,2|https,www.googletagmanager.com,,2'); - res.render('portal/portal_first_run.ejs', {}); + res.render('portal/first_run.ejs', {}); }); router.post('/newUser', function (req, res) { diff --git a/src/services/juxt-web/routes/portal/userpage.js b/src/services/juxt-web/routes/portal/userpage.js index c4760f4..b4d0682 100644 --- a/src/services/juxt-web/routes/portal/userpage.js +++ b/src/services/juxt-web/routes/portal/userpage.js @@ -21,7 +21,7 @@ router.get('/me', function (req, res) { let numPosts = await database.getTotalPostsByUserID(pid); let communityMap = await util.data.getCommunityHash(); if(isAJAX) { - res.render('portal/portal_me_page_ajax.ejs', { + res.render('portal/me_page_ajax.ejs', { // EJS variable and server-side variable communityMap: communityMap, moment: moment, @@ -31,7 +31,7 @@ router.get('/me', function (req, res) { }); } else { - res.render('portal/portal_me_page.ejs', { + res.render('portal/me_page.ejs', { // EJS variable and server-side variable communityMap: communityMap, moment: moment, @@ -114,28 +114,15 @@ router.get('/show', function (req, res) { let newPosts = await database.getNumberUserPostsByID(user.pid, 10); let numPosts = await database.getTotalPostsByUserID(user.pid); let communityMap = await util.data.getCommunityHash(); - if(isAJAX) { - res.render('portal/portal_user_page_ajax.ejs', { - // EJS variable and server-side variable - communityMap: communityMap, - moment: moment, - user: user, - newPosts: newPosts, - numPosts: numPosts, - parentUser: parentUser - }); - } - else { - res.render('portal/portal_user_page.ejs', { - // EJS variable and server-side variable - communityMap: communityMap, - moment: moment, - user: user, - newPosts: newPosts, - numPosts: numPosts, - parentUser: parentUser - }); - } + res.render('portal/user_page.ejs', { + // EJS variable and server-side variable + communityMap: communityMap, + moment: moment, + user: user, + newPosts: newPosts, + numPosts: numPosts, + parentUser: parentUser + }); }).catch(error => { console.error(error); res.set("Content-Type", "application/xml"); @@ -165,7 +152,7 @@ router.get('/loadPosts', function (req, res) { let communityMap = await util.data.getCommunityHash(); if(newPosts.length > 0) { - res.render('portal/portal_more_posts_ajax.ejs', { + res.render('portal/more_posts_ajax.ejs', { communityMap: communityMap, moment: moment, user: user, @@ -205,6 +192,7 @@ router.post('/follow', upload.none(), function (req, res) { userToFollow.addToFollowers(user.pid); user.addToUsers(userToFollow.pid); res.sendStatus(200); + await database.pushNewNotificationByPID(userToFollow.pid, user.user_id + ' followed you!', '/users/show?pid=' + user.pid) } else if(req.body.type === 'false' && user !== null && user.followed_users.indexOf(userToFollow.pid) !== -1) { diff --git a/src/services/juxt-web/routes/portal/web.js b/src/services/juxt-web/routes/portal/web.js index 6239f59..fd74e5b 100644 --- a/src/services/juxt-web/routes/portal/web.js +++ b/src/services/juxt-web/routes/portal/web.js @@ -5,26 +5,37 @@ const util = require('../../../../authentication'); var path = require('path'); router.get('/css/juxt.css', function (req, res) { + res.set("Content-Type", "text/css"); res.sendFile('css/juxt.css', {root: path.join(__dirname, '../../../../webfiles/portal/')}); }); router.get('/js/juxt.js', function (req, res) { + res.set("Content-Type", "application/javascript; charset=utf-8"); res.sendFile('js/juxt.js', {root: path.join(__dirname, '../../../../webfiles/portal/')}); }); +router.get('/js/pjax.min.js', function (req, res) { + res.set("Content-Type", "application/javascript; charset=utf-8"); + res.sendFile('js/pjax.min.js', {root: path.join(__dirname, '../../../../webfiles/portal/')}); +}); + router.get('/fonts/Poppins-Light.woff', function (req, res) { + res.set("Content-Type", "font/woff"); res.sendFile('fonts/Poppins-Light.woff', {root: path.join(__dirname, '../../../../webfiles/portal/')}); }); router.get('/fonts/Poppins-Light.ttf', function (req, res) { + res.set("Content-Type", "font/ttf"); res.sendFile('fonts/Poppins-Light.ttf', {root: path.join(__dirname, '../../../../webfiles/portal/')}); }); router.get('/favicon.ico', function (req, res) { + res.set("Content-Type", "image/x-icon"); res.sendFile('css/favicon.ico', {root: path.join(__dirname, '../../../../webfiles/portal/')}); }); router.get('/icons/:image_id.png', function (req, res) { + res.set("Content-Type", "image/png"); database.connect().then(async e => { let community = await database.getCommunityByID(req.params.image_id.toString()); if(community !== null) { @@ -50,6 +61,7 @@ router.get('/icons/:image_id.png', function (req, res) { }); router.get('/banner/:image_id.png', function (req, res) { + res.set("Content-Type", "image/png"); database.connect().then(async e => { let community = await database.getCommunityByID(req.params.image_id.toString()); if(community !== null) diff --git a/src/webfiles/portal/portal_all_communities.ejs b/src/webfiles/portal/all_communities.ejs similarity index 68% rename from src/webfiles/portal/portal_all_communities.ejs rename to src/webfiles/portal/all_communities.ejs index 716e769..35ccb2a 100644 --- a/src/webfiles/portal/portal_all_communities.ejs +++ b/src/webfiles/portal/all_communities.ejs @@ -1,6 +1,7 @@
+ @@ -21,13 +22,13 @@ -