From 855f9a4827b57fa0a5ecb4077b777407591f0082 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 01:56:38 +0000 Subject: [PATCH 01/20] docs(contributor): contrib-readme-action has updated readme --- README.md | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 4b645501..c6747413 100644 --- a/README.md +++ b/README.md @@ -156,10 +156,10 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
- - Wingysam + + cj13579
- Wingysam + cj13579
@@ -191,13 +191,6 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev) cj13579 - - - frostyfrog -
- frostyfrog -
- dbarenholz @@ -211,15 +204,15 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
Laeborg
- - + LarsStegman
LarsStegman
- + + BootVirtual @@ -254,15 +247,15 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
Na0mir
- - + ndlanier
ndlanier
- + + RestartFU @@ -297,15 +290,15 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
StS82
- - + jskiddie
jskiddie
- + + toastie89 From 33a9a7adddec9533e048091a6ec784eb8c87ae0c Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Thu, 26 Sep 2024 21:49:38 -0300 Subject: [PATCH 02/20] layout users in table --- src/languages/en-us.ts | 4 ++++ src/views/adminSettings.pug | 25 ++++++++++++++++++------- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index e0c0fd9c..9fecd3b4 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -31,6 +31,10 @@ export const strings = { ADMIN_SETTINGS_USERS_EDIT: 'Edit', ADMIN_SETTINGS_USERS_HEADER: 'Users', ADMIN_SETTINGS_VERSION_INFO: 'Version Info', + ADMIN_SETTINGS_TABLE_USERNAME: 'Username', + ADMIN_SETTINGS_TABLE_ADMIN_USER: 'Admin', + ADMIN_SETTINGS_TABLE_WISHLIST_COUNT: 'Wishlist items', + ADMIN_SETTINGS_TABLE_EDIT: 'Edit', ADMIN_USER_EDIT_ACCOUNT_UNCONFIRMED: "This account hasn't been confirmed.", ADMIN_USER_EDIT_ADMIN_ISADMIN: name => `${name} is an admin.`, ADMIN_USER_EDIT_ADMIN_NOTADMIN: name => `${name} is not an admin.`, diff --git a/src/views/adminSettings.pug b/src/views/adminSettings.pug index b91b0086..d834952a 100644 --- a/src/views/adminSettings.pug +++ b/src/views/adminSettings.pug @@ -2,13 +2,24 @@ extends layout.pug block content h2= lang('ADMIN_SETTINGS_USERS_HEADER') - each user in users - span.is-size-6.inline= user.id - a(href=`${_CC.config.base}admin-settings/edit/${user.id}`) - span.is-size-7.icon.has-text-info - i.fas.fa-edit - span.is-sr-only - = lang('ADMIN_SETTINGS_USERS_EDIT') + table.table + thead + th=lang('ADMIN_SETTINGS_TABLE_USERNAME') + th=lang('ADMIN_SETTINGS_TABLE_ADMIN_USER') + th=lang('ADMIN_SETTINGS_TABLE_WISHLIST_COUNT') + th=lang('ADMIN_SETTINGS_TABLE_EDIT') + tbody + each user in users + tr(id=user.id) + td=user.id + td=user.doc.admin + td=Object.keys(user.doc.wishlist).length + td + a(href=`${_CC.config.base}admin-settings/edit/${user.id}`) + span.is-size-7.icon.has-text-info + i.fas.fa-edit + span.is-sr-only + = lang('ADMIN_SETTINGS_USERS_EDIT') br h3= lang('ADMIN_SETTINGS_USERS_ADD_HEADER') form(action=`${_CC.config.base}admin-settings/add`, method='POST') From a17f974afa6034c77ae572fac77f4acb8cd13cdd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:29:34 +0000 Subject: [PATCH 03/20] docs(contributor): contrib-readme-action has updated readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d059073a..73600610 100644 --- a/README.md +++ b/README.md @@ -158,10 +158,10 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
- - Wingysam + + cj13579
- Wingysam + cj13579
From 0111b1f548212c3fe1e529f6596456b992634c43 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Sat, 28 Sep 2024 17:49:58 -0300 Subject: [PATCH 04/20] Move an item to bottom of the list (#141) * docs(contributor): contrib-readme-action has updated readme * Move item to bottom of list --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/languages/en-us.ts | 2 ++ src/routes/wishlist/index.js | 4 +++- src/structures/Wishlist.js | 9 +++++++++ src/views/wishlist.pug | 17 +++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 9fecd3b4..6055cc63 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -164,9 +164,11 @@ export const strings = { WISHLIST_IMAGE: 'Image', WISHLIST_ITEM_MISSING: 'Failed to find item', WISHLIST_MOVE_DOWN: 'Move Down', + WISHLIST_MOVE_BOTTOM: 'Move Bottom', WISHLIST_MOVE_GUARD: 'Not correct user', WISHLIST_MOVE_INVALID: 'Invalid move', WISHLIST_MOVE_ITEM_DOWN: 'Move Item Down', + WISHLIST_MOVE_ITEM_BOTTOM: 'Move Item Bottom', WISHLIST_MOVE_ITEM_TOP: 'Move Item Top', WISHLIST_MOVE_ITEM_UP: 'Move Item Up', WISHLIST_MOVE_SUCCESS: 'Successfully moved item!', diff --git a/src/routes/wishlist/index.js b/src/routes/wishlist/index.js index 618eefea..316a2c7f 100644 --- a/src/routes/wishlist/index.js +++ b/src/routes/wishlist/index.js @@ -168,7 +168,9 @@ export default function (db) { if (req.params.direction === 'top') { await wishlist.moveTop(req.params.itemId) - } else if (req.params.direction === 'up') { + } else if (req.params.direction === 'bottom') { + await wishlist.moveBottom(req.params.itemId) + }else if (req.params.direction === 'up') { await wishlist.move(req.params.itemId, -1) } else if (req.params.direction === 'down') { await wishlist.move(req.params.itemId, 1) diff --git a/src/structures/Wishlist.js b/src/structures/Wishlist.js index 3308b5d8..75c68240 100644 --- a/src/structures/Wishlist.js +++ b/src/structures/Wishlist.js @@ -138,6 +138,15 @@ export class Wishlist { await this.save() } + async moveBottom (id) { + const index = this.items.findIndex(item => item.id === id) + if (index === -1) throw new Error(_CC.lang('WISHLIST_ITEM_MISSING')) + + const item = this.items.splice(index, 1)[0] + this.items.push(item) + await this.save() + } + async setItemData (id, data) { const item = await this.get(id) diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index e5b8bc9c..34daad04 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -45,6 +45,7 @@ block content th= lang('WISHLIST_MOVE_TOP') th= lang('WISHLIST_MOVE_UP') th= lang('WISHLIST_MOVE_DOWN') + th= lang('WISHLIST_MOVE_BOTTOM') else th= lang('WISHLIST_PLEDGE') th= lang('WISHLIST_DELETE') @@ -129,6 +130,17 @@ block content ) span.icon i.fas.fa-arrow-down + td(data-label=lang('WISHLIST_MOVE_ITEM_BOTTOM')) + form.bottomForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/bottom/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=index === items.length - 1 + ) + span.icon + i.fas.fa-angle-double-down else td(data-label=lang('WISHLIST_PLEDGE')) if req.params.user !== req.user._id && !item.pledgedBy @@ -238,6 +250,11 @@ block content .field.inline .control.inline input.inline.button(type='submit' value=lang('WISHLIST_MOVE_ITEM_DOWN')) + if index !== items.length - 1 && req.user._id === req.params.user + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/bottom/${item.id}`) + .field.inline + .control.inline + input.inline.button(type='submit' value=lang('WISHLIST_MOVE_ITEM_BOTTOM')) form(method='POST') .field label.label!=lang('WISHLIST_URL_LABEL') From 2473973bfedf0ad66393531b752b66c509109afc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2024 20:50:10 +0000 Subject: [PATCH 05/20] docs(contributor): contrib-readme-action has updated readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c6747413..21284a8c 100644 --- a/README.md +++ b/README.md @@ -156,10 +156,10 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
- - cj13579 + + Wingysam
- cj13579 + Wingysam
From a32f9389b84b4ba942d4b88916335c3602876514 Mon Sep 17 00:00:00 2001 From: Ben Siddans <96931223+bsiddans@users.noreply.github.com> Date: Sun, 29 Sep 2024 07:36:53 +1000 Subject: [PATCH 06/20] Set location of PouchDB log file with environment variable. (#93) * Set location of PouchDB log file with environment variable. * Use config system * Use config system --------- Co-authored-by: Wingy --- Dockerfile | 8 +++++--- README.md | 2 ++ src/config/index.ts | 1 + src/index.ts | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1537061c..e0ade4dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,14 +6,16 @@ ENV NODE_ENV production ENV PORT 80 ENV DB_EXPOSE_PORT 8080 ENV DB_PREFIX /data/dbs/ +ENV DB_LOG_FILE /dev/null + ENV SECRET_DIRNAME /data WORKDIR /usr/src/app COPY . . -RUN npm install --production --silent \ - && npm run build \ - && mkdir -p /data/dbs +RUN npm install --production --silent && + npm run build && + mkdir -p /data/dbs EXPOSE 80 diff --git a/README.md b/README.md index 21284a8c..d242819e 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,8 @@ Add environment variables with a .env. Example: ## Core Settings # Where to store databases, can be a CouchDB compatible server or directory. DB_PREFIX=dbs/ +# Location of DB log file (if needed for debugging). +DB_LOG_FILE=/dev/null # Where to send someone if they need to log in DEFAULT_FAILURE_REDIRECT=/login # Port to listen on diff --git a/src/config/index.ts b/src/config/index.ts index 543e782f..dd3ae864 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -3,6 +3,7 @@ const config = { defaultFailureRedirect: process.env.DEFAULT_FAILURE_REDIRECT || '/login', port: Number(process.env.PORT) || 3000, dbExposePort: Number(process.env.DB_EXPOSE_PORT) || null, + dbLogFile: process.env.DB_LOG_FILE || '/dev/null', proxyServer: process.env.PROXY_SERVER || undefined, secret: process.env.SECRET || (await import('./secret/index.js')).default, sessionMaxAge: Number(process.env.SESSION_MAX_AGE) || 1000 * 60 * 60 * 24 * 7, diff --git a/src/index.ts b/src/index.ts index 64f42f00..fb73e8f0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -118,6 +118,6 @@ app.listen(config.port, () => { logger.success('express', `Express server starte ;(() => { if (!config.dbExposePort) return const dbExposeApp = express() - dbExposeApp.use('/', ExpressPouchDB(PouchDB, { inMemoryConfig: true })) + dbExposeApp.use('/', ExpressPouchDB(PouchDB, { inMemoryConfig: true, logPath: config.dbLogFile })) dbExposeApp.listen(config.dbExposePort, () => { logger.success('db expose', `DB has been exposed on port ${config.dbExposePort}`) }) })() From 95472f008e443303c2269c2f0988dcce47fd5f52 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 28 Sep 2024 21:37:02 +0000 Subject: [PATCH 07/20] docs(contributor): contrib-readme-action has updated readme --- README.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d242819e..af4ff24d 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,13 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
+ + + bsiddans +
+ bsiddans +
+ BootVirtual @@ -249,15 +256,15 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
Na0mir
- + + ndlanier
ndlanier
- - + RestartFU @@ -292,15 +299,15 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
StS82
- + + jskiddie
jskiddie
- - + toastie89 From f914b999055b28c7f7e4634c77ee8664ffbe501e Mon Sep 17 00:00:00 2001 From: jskiddie <153759737+jskiddie@users.noreply.github.com> Date: Tue, 1 Oct 2024 18:57:28 +0200 Subject: [PATCH 08/20] The Dockerfile didn't wok for me, here's a fix (#145) * Added automation to keep contributers section current * Updated README.md to use new automation to keep contributers current * changed branch name * fix: Added backslashes and typescript install to Dockerfile * fix: Dockerfile, allow changes to be applied --------- Co-authored-by: jskidie <153759737+jskidie@users.noreply.github.com> --- Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index e0ade4dc..180ffcad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,10 +13,12 @@ ENV SECRET_DIRNAME /data WORKDIR /usr/src/app COPY . . -RUN npm install --production --silent && - npm run build && - mkdir -p /data/dbs +RUN npm install --production --silent && \ + npm install -g typescript \ + npm run build && \ + mkdir -p /data/dbs EXPOSE 80 CMD ./Dockerstart.sh + From be76412603c0ff56132231db1551936c8e1551f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:57:41 +0000 Subject: [PATCH 09/20] docs(contributor): contrib-readme-action has updated readme --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index af4ff24d..d059073a 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,13 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev) + + + jskiddie +
+ jskiddie +
+ bsiddans @@ -249,15 +256,15 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
mtrunt
- + + Na0mir
Na0mir
- - + ndlanier @@ -292,21 +299,14 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
CantisW
- + + StS82
StS82
- - - - - jskiddie -
- jskiddie -
From c73b3e9afb694a5a179d8d8b885d59ee8bb3eec4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 00:29:34 +0000 Subject: [PATCH 10/20] docs(contributor): contrib-readme-action has updated readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d059073a..73600610 100644 --- a/README.md +++ b/README.md @@ -158,10 +158,10 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
- - Wingysam + + cj13579
- Wingysam + cj13579
From fe03827d0c03ad467ca04d4d72976d2832892b16 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 9 Oct 2024 21:08:27 -0300 Subject: [PATCH 11/20] Ability to create pledge only users --- src/languages/en-us.ts | 4 ++++ src/routes/adminSettings/index.js | 20 ++++++++++++++++++++ src/routes/setup/index.js | 3 ++- src/views/admin-user-edit.pug | 9 +++++++++ src/views/adminSettings.pug | 8 +++++++- src/views/includes/navbar.pug | 3 ++- src/views/profile.pug | 31 ++++++++++++++++--------------- src/views/wishlists.pug | 4 ++-- 8 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 6055cc63..4bc33cb0 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -15,6 +15,7 @@ export const strings = { ADMIN_SETTINGS_USERS_ADD_HEADER: 'Add user', ADMIN_SETTINGS_USERS_ADD_PLACEHOLDER: 'john', ADMIN_SETTINGS_USERS_ADD_USERNAME: 'Username', + ADMIN_SETTINGS_USERS_ADD_PLEDGE_ONLY: 'Pledge only user?', ADMIN_SETTINGS_USERS_ADD_ERROR_USERNAME_EMPTY: 'Username cannot be empty.', ADMIN_SETTINGS_USERS_EDIT_DELETE_FAIL_ADMIN: 'Failed to remove: user is admin.', ADMIN_SETTINGS_USERS_EDIT_DELETE_SUCCESS: name => `Successfully removed user ${name}`, @@ -28,11 +29,14 @@ export const strings = { ADMIN_SETTINGS_USERS_EDIT_PROMOTE_SUCCESS: name => `${name} is now an admin.`, ADMIN_SETTINGS_USERS_EDIT_RENAMED_USER: 'Renamed user!', ADMIN_SETTINGS_USERS_EDIT_SAME_NAME: 'Username is same as new username.', + ADMIN_USER_EDIT_PLEDGE_ONLY: 'Pledge only', + ADMIN_USER_EDIT_PLEDGE_ONLY_BUTTON: 'Change pledge only', ADMIN_SETTINGS_USERS_EDIT: 'Edit', ADMIN_SETTINGS_USERS_HEADER: 'Users', ADMIN_SETTINGS_VERSION_INFO: 'Version Info', ADMIN_SETTINGS_TABLE_USERNAME: 'Username', ADMIN_SETTINGS_TABLE_ADMIN_USER: 'Admin', + ADMIN_SETTINGS_TABLE_PLEDGE_ONLY: 'Pledge only', ADMIN_SETTINGS_TABLE_WISHLIST_COUNT: 'Wishlist items', ADMIN_SETTINGS_TABLE_EDIT: 'Edit', ADMIN_USER_EDIT_ACCOUNT_UNCONFIRMED: "This account hasn't been confirmed.", diff --git a/src/routes/adminSettings/index.js b/src/routes/adminSettings/index.js index 87bbcac8..bd41adb8 100644 --- a/src/routes/adminSettings/index.js +++ b/src/routes/adminSettings/index.js @@ -44,10 +44,14 @@ export default function ({ db, ensurePfp }) { }) } + const pledgeOnlyValue = req.body.newPledgeOnlyUser + const pledgeOnly = pledgeOnlyValue === 'on' + await db.put({ _id: username, admin: false, wishlist: [], + pledgeOnly: pledgeOnly, signupToken: nanoid(SECRET_TOKEN_LENGTH), expiry: new Date().getTime() + SECRET_TOKEN_LIFETIME @@ -138,6 +142,22 @@ export default function ({ db, ensurePfp }) { } }) + router.post('/edit/pledgeOnly/:userToChange', verifyAuth(), async (req, res) => { + + const newPledgeValue = req.body.editPledgeOnlyUser + const newPledge = newPledgeValue === 'on' + + const userDoc = await db.get(req.params.userToChange) + userDoc.pledgeOnly = newPledge + try { + await db.put(userDoc) + await _CC.wishlistManager.clearCache() + } catch (error) { + req.flash('error', error.message) + return res.redirect(`/admin-settings/edit/${req.params.userToChange}`) + } + }) + router.post('/edit/impersonate/:userToEdit', verifyAuth(), async (req, res) => { if (!req.user.admin) return res.redirect('/') req.login({ _id: req.params.userToEdit }, err => { diff --git a/src/routes/setup/index.js b/src/routes/setup/index.js index 36cfa46d..848781f2 100644 --- a/src/routes/setup/index.js +++ b/src/routes/setup/index.js @@ -27,7 +27,8 @@ export default function ({ db, ensurePfp }) { _id: username, password: adminPasswordHash, admin: true, - wishlist: [] + wishlist: [], + pledgeOnly: false }) resolve() }) diff --git a/src/views/admin-user-edit.pug b/src/views/admin-user-edit.pug index c7869334..0976aa00 100644 --- a/src/views/admin-user-edit.pug +++ b/src/views/admin-user-edit.pug @@ -44,6 +44,15 @@ block content .field .control input.button.is-primary(type='submit' value=lang('ADMIN_USER_EDIT_CHANGE_USERNAME')) + .column.is-narrow + h2= lang('ADMIN_USER_EDIT_PLEDGE_ONLY') + form(action=`${_CC.config.base}admin-settings/edit/pledgeOnly/${user._id}`, method='POST') + .field + .control + input(type='checkbox', name='editPledgeOnlyUser', checked=user.pledgeOnly) + .field + .control + input.input.button(type='submit', value=lang('ADMIN_USER_EDIT_PLEDGE_ONLY_BUTTON'), style='margin-top: 1em;') .column.is-narrow h2= lang('ADMIN_USER_EDIT_ADMIN') //- Yes, ternary exists, but I think the code is cleaner with a more "naive" style :) diff --git a/src/views/adminSettings.pug b/src/views/adminSettings.pug index d834952a..a53d68e6 100644 --- a/src/views/adminSettings.pug +++ b/src/views/adminSettings.pug @@ -6,13 +6,15 @@ block content thead th=lang('ADMIN_SETTINGS_TABLE_USERNAME') th=lang('ADMIN_SETTINGS_TABLE_ADMIN_USER') + th=lang('ADMIN_SETTINGS_TABLE_PLEDGE_ONLY') th=lang('ADMIN_SETTINGS_TABLE_WISHLIST_COUNT') th=lang('ADMIN_SETTINGS_TABLE_EDIT') tbody each user in users tr(id=user.id) td=user.id - td=user.doc.admin + td=user.doc.admin + td=user.doc.pledgeOnly td=Object.keys(user.doc.wishlist).length td a(href=`${_CC.config.base}admin-settings/edit/${user.id}`) @@ -30,6 +32,10 @@ block content input.input(type='text', name='newUserUsername', placeholder=lang('ADMIN_SETTINGS_USERS_ADD_PLACEHOLDER')) span.icon.is-small.is-left i.fas.fa-user + .field + label.label= lang('ADMIN_SETTINGS_USERS_ADD_PLEDGE_ONLY') + .control.has-icons-left + input(type='checkbox', name='newPledgeOnlyUser') .field .control input.button.is-primary(type='submit' value=lang('ADMIN_SETTINGS_USERS_ADD_BUTTON')) diff --git a/src/views/includes/navbar.pug b/src/views/includes/navbar.pug index c110f53a..ce35d6be 100644 --- a/src/views/includes/navbar.pug +++ b/src/views/includes/navbar.pug @@ -28,7 +28,8 @@ nav.navbar.is-fixed-top(role='navigation', aria-label='main navigation',style='b .navbar-item.has-dropdown.is-hoverable a.navbar-link= req.user._id .navbar-dropdown - +navBarLink(`${_CC.config.base}wishlist/${req.user._id}`, lang('NAVBAR_WISHLIST')) + if req.user.pledgeOnly != true + +navBarLink(`${_CC.config.base}wishlist/${req.user._id}`, lang('NAVBAR_WISHLIST')) +navBarLink(`${_CC.config.base}profile`, lang('NAVBAR_PROFILE')) if req.user.admin +navBarLink(`${_CC.config.base}admin-settings`, lang('NAVBAR_ADMIN')) diff --git a/src/views/profile.pug b/src/views/profile.pug index 72390d12..c243bd23 100644 --- a/src/views/profile.pug +++ b/src/views/profile.pug @@ -36,21 +36,22 @@ block content button.button.is-primary(type='submit') span.icon i.fas.fa-save - h2= lang('PROFILE_SHARED_INFORMATION') - form(action=`${_CC.config.base}profile/info`, method='POST') - .columns.is-multiline.is-mobile - .column.is-narrow - +sharedInfoProp('shoeSize', 'PROFILE_SHOE_SIZE') - +sharedInfoProp('ringSize', 'PROFILE_RING_SIZE') - +sharedInfoProp('dressSize', 'PROFILE_DRESS_SIZE') - .column.is-narrow - +sharedInfoProp('sweaterSize', 'PROFILE_SWEATER_SIZE') - +sharedInfoProp('shirtSize', 'PROFILE_SHIRT_SIZE') - +sharedInfoProp('pantsSize', 'PROFILE_PANTS_SIZE') - .column.is-narrow - +sharedInfoProp('coatSize', 'PROFILE_COAT_SIZE') - +sharedInfoProp('hatSize', 'PROFILE_HAT_SIZE') - +sharedInfoProp('phoneModel', 'PROFILE_PHONE_MODEL') + if req.user.pledgeOnly != true + h2= lang('PROFILE_SHARED_INFORMATION') + form(action=`${_CC.config.base}profile/info`, method='POST') + .columns.is-multiline.is-mobile + .column.is-narrow + +sharedInfoProp('shoeSize', 'PROFILE_SHOE_SIZE') + +sharedInfoProp('ringSize', 'PROFILE_RING_SIZE') + +sharedInfoProp('dressSize', 'PROFILE_DRESS_SIZE') + .column.is-narrow + +sharedInfoProp('sweaterSize', 'PROFILE_SWEATER_SIZE') + +sharedInfoProp('shirtSize', 'PROFILE_SHIRT_SIZE') + +sharedInfoProp('pantsSize', 'PROFILE_PANTS_SIZE') + .column.is-narrow + +sharedInfoProp('coatSize', 'PROFILE_COAT_SIZE') + +sharedInfoProp('hatSize', 'PROFILE_HAT_SIZE') + +sharedInfoProp('phoneModel', 'PROFILE_PHONE_MODEL') h2= lang('PROFILE_SECURITY') a.button.is-primary(href=`${_CC.config.base}profile/password`) diff --git a/src/views/wishlists.pug b/src/views/wishlists.pug index 4243928a..7f141404 100644 --- a/src/views/wishlists.pug +++ b/src/views/wishlists.pug @@ -52,7 +52,7 @@ block content div!= _CC.config.customHtml.wishlists ul.noStyle.noLeftMargin - if req.user._id !== '_CCUNKNOWN' + if req.user._id !== '_CCUNKNOWN' && req.user.pledgeOnly != true li .box a(href=`${_CC.config.base}wishlist/${req.user._id}`, style='color: #4a4a4a;') @@ -67,7 +67,7 @@ block content progress.progress(value=1, max=1) +wishlistDetails(req.user.wishlist, req.user._id) each user in users - if req.user._id !== user.id + if req.user._id !== user.id && user.doc.pledgeOnly != true li .box a(href=`${_CC.config.base}wishlist/${user.id}`, style='color: #4a4a4a;') From cc185ca7618899779e794f5b2b80092727f338f1 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Fri, 11 Oct 2024 20:23:20 -0300 Subject: [PATCH 12/20] add localization --- src/languages/en-us.ts | 4 +++- src/views/adminSettings.pug | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 6055cc63..2ff72fd1 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -201,5 +201,7 @@ export const strings = { WISHLIST_URL_REQUIRED: 'Item URL or Name is required', WISHLISTS_COUNTS_SELF: name => `${name}: ???/???`, WISHLISTS_COUNTS: (name, pledged, total) => `${name}: ${pledged}/${total}`, - WISHLISTS_TITLE: `${_CC.config.siteTitle} - Wishlists` + WISHLISTS_TITLE: `${_CC.config.siteTitle} - Wishlists`, + YES: 'Yes', + NO: 'No' } as const diff --git a/src/views/adminSettings.pug b/src/views/adminSettings.pug index d834952a..e88428bc 100644 --- a/src/views/adminSettings.pug +++ b/src/views/adminSettings.pug @@ -12,7 +12,7 @@ block content each user in users tr(id=user.id) td=user.id - td=user.doc.admin + td=user.doc.admin ? lang('YES') : lang('NO') td=Object.keys(user.doc.wishlist).length td a(href=`${_CC.config.base}admin-settings/edit/${user.id}`) From 24929e8591c99d1f021c3a5a2fb6aebbff31897b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 31 Dec 2024 13:09:21 +0000 Subject: [PATCH 13/20] docs(contributor): contrib-readme-action has updated readme --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 5cc0031e..0ab844de 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,13 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev) PeteS4
+ + + jskiddie +
+ jskiddie +
+ dbarenholz @@ -208,21 +215,14 @@ Hi, I'm Wingy. I made this app. My website is [samwing.dev](https://samwing.dev)
Laeborg
- + + LarsStegman
LarsStegman
- - - - - jskiddie -
- jskiddie -
From 3f362e56d27673f226ff9d84dc25bfe32ee68c60 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 31 Dec 2024 10:36:29 -0400 Subject: [PATCH 14/20] Return when user object is updated --- src/routes/adminSettings/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/adminSettings/index.js b/src/routes/adminSettings/index.js index d81e41a9..bc70e717 100644 --- a/src/routes/adminSettings/index.js +++ b/src/routes/adminSettings/index.js @@ -153,6 +153,7 @@ export default function ({ db, ensurePfp }) { try { await db.put(userDoc) await _CC.wishlistManager.clearCache() + return res.redirect(`/admin-settings/edit/${req.params.userToChange}`) } catch (error) { req.flash('error', error.message) return res.redirect(`/admin-settings/edit/${req.params.userToChange}`) From 08a4a99dca2062bf82d9399e7de845cd9f113af4 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 31 Dec 2024 10:59:16 -0400 Subject: [PATCH 15/20] Option to disable guest suggestions --- README.md | 3 +++ src/config/index.ts | 3 ++- src/languages/en-us.ts | 1 + src/views/wishlist.pug | 50 +++++++++++++++++++++++------------------- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 0ab844de..d49ddccf 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,9 @@ MARKDOWN=false # Once you've created a client ID and secret in your Google project use the below environment variables to enable SSO # GOOGLE_CLIENT_ID=abc123 # GOOGLE_CLIENT_SECRET=123abc + +# Set to false to disable pledge only users from being able to suggest items to another user's list +GUEST_SUGGEST=true ``` ## Default Profile Pictures diff --git a/src/config/index.ts b/src/config/index.ts index 4688df1c..8214d91f 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -25,7 +25,8 @@ const config = { googleSSOClientSecret: process.env.GOOGLE_CLIENT_SECRET || null, googleSSOEnabled: false, rootUrl: appendSlash(process.env.ROOT_URL ?? process.env.ROOT_PATH ?? '/'), - base: '' // automatically set below + base: '', // automatically set below + guestSuggest: process.env.GUEST_SUGGEST === 'true' } if (config.guestPassword) config.wishlist.public = false diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 45b57662..0527dc28 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -215,6 +215,7 @@ export const strings = { WISHLIST_URL_LABEL: `Item URL or Name (Supported Sites)`, WISHLIST_URL_PLACEHOLDER: 'https://www.amazon.com/dp/B00ZV9RDKK', WISHLIST_URL_REQUIRED: 'Item URL or Name is required', + WISHLIST_GUEST_SUGGEST_DISABLED: 'Item suggestions are disabled.', WISHLISTS_COUNTS_SELF: name => `${name}: ???/???`, WISHLISTS_COUNTS: (name, pledged, total) => `${name}: ${pledged}/${total}`, WISHLISTS_TITLE: `${_CC.config.siteTitle} - Wishlists`, diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 34daad04..28114629 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -255,30 +255,34 @@ block content .field.inline .control.inline input.inline.button(type='submit' value=lang('WISHLIST_MOVE_ITEM_BOTTOM')) - form(method='POST') - .field - label.label!=lang('WISHLIST_URL_LABEL') - .control.has-icons-left - input.input( - type='text', - name='itemUrlOrName', - placeholder=lang('WISHLIST_URL_PLACEHOLDER') - ) - span.icon.is-small.is-left - i.fas.fa-gift - .field - label.label= lang('WISHLIST_NOTE') - .control - textarea.textarea( - name='note', - placeholder=lang('WISHLIST_OPTIONAL') - ) - .field.is-grouped - .control - input.button(type='submit' value=(req.user._id === req.params.user ? lang('WISHLIST_ADD') : lang('WISHLIST_PLEDGE_ITEM'))) - if req.user._id !== req.params.user + + if ! global._CC.config.guestSuggest && req.user.pledgeOnly + .notification.is-info= lang('WISHLIST_GUEST_SUGGEST_DISABLED') + else + form(method='POST') + .field + label.label!=lang('WISHLIST_URL_LABEL') + .control.has-icons-left + input.input( + type='text', + name='itemUrlOrName', + placeholder=lang('WISHLIST_URL_PLACEHOLDER') + ) + span.icon.is-small.is-left + i.fas.fa-gift + .field + label.label= lang('WISHLIST_NOTE') .control - input.inline.button(type='submit', value=lang('WISHLIST_SUGGEST'), name='suggest') + textarea.textarea( + name='note', + placeholder=lang('WISHLIST_OPTIONAL') + ) + .field.is-grouped + .control + input.button(type='submit' value=(req.user._id === req.params.user ? lang('WISHLIST_ADD') : lang('WISHLIST_PLEDGE_ITEM'))) + if req.user._id !== req.params.user + .control + input.inline.button(type='submit', value=lang('WISHLIST_SUGGEST'), name='suggest') script(src=`${_CC.config.base}js/wishlist.js`) block print From d99ad9bcb240ea7387e9d9c4719c8fe3babf22de Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 31 Dec 2024 11:25:45 -0400 Subject: [PATCH 16/20] Update if condition to enable self-adding --- src/views/wishlist.pug | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 28114629..3be114a8 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -256,8 +256,8 @@ block content .control.inline input.inline.button(type='submit' value=lang('WISHLIST_MOVE_ITEM_BOTTOM')) - if ! global._CC.config.guestSuggest && req.user.pledgeOnly - .notification.is-info= lang('WISHLIST_GUEST_SUGGEST_DISABLED') + if ((!global._CC.config.pledgeSuggest && req.user.pledgeOnly) || !global._CC.config.suggestionsEnabled || req.user._id !== req.params.user) + .notification.is-info= lang('WISHLIST_SUGGESTIONS_DISABLED') else form(method='POST') .field From f7e5b261f549494f380d76a840e58e733c256927 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 31 Dec 2024 11:26:22 -0400 Subject: [PATCH 17/20] Add global suggestions disabled support --- README.md | 5 ++++- src/config/index.ts | 3 ++- src/languages/en-us.ts | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d49ddccf..9f713486 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,10 @@ MARKDOWN=false # GOOGLE_CLIENT_SECRET=123abc # Set to false to disable pledge only users from being able to suggest items to another user's list -GUEST_SUGGEST=true +PLEDGE_SUGGEST=true + +# Set to false to disable all users from being able to suggest items to another users's list +SUGGESTIONS_ENABLED=true ``` ## Default Profile Pictures diff --git a/src/config/index.ts b/src/config/index.ts index 8214d91f..7f0f0feb 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -26,7 +26,8 @@ const config = { googleSSOEnabled: false, rootUrl: appendSlash(process.env.ROOT_URL ?? process.env.ROOT_PATH ?? '/'), base: '', // automatically set below - guestSuggest: process.env.GUEST_SUGGEST === 'true' + pledgeSuggest: process.env.PLEDGE_SUGGEST === 'true' ? true : process.env.PLEDGE_SUGGEST || true, + suggestionsEnabled: process.env.SUGGESTIONS_ENABLED === 'true' ? true : process.env.SUGGESTIONS_ENABLED || true } if (config.guestPassword) config.wishlist.public = false diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 0527dc28..f72127d8 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -215,7 +215,7 @@ export const strings = { WISHLIST_URL_LABEL: `Item URL or Name (Supported Sites)`, WISHLIST_URL_PLACEHOLDER: 'https://www.amazon.com/dp/B00ZV9RDKK', WISHLIST_URL_REQUIRED: 'Item URL or Name is required', - WISHLIST_GUEST_SUGGEST_DISABLED: 'Item suggestions are disabled.', + WISHLIST_SUGGESTIONS_DISABLED: 'Item suggestions are disabled.', WISHLISTS_COUNTS_SELF: name => `${name}: ???/???`, WISHLISTS_COUNTS: (name, pledged, total) => `${name}: ${pledged}/${total}`, WISHLISTS_TITLE: `${_CC.config.siteTitle} - Wishlists`, From 916f053f448c47e0c970d86ab5cac8ca36e6c651 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 31 Dec 2024 11:26:29 -0400 Subject: [PATCH 18/20] Dev convenience --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab26b32d..3f6daa96 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node built/manager.js", - "dev": "nodemon --watch src -e ts,js --exec 'npm run build && node built/index.js'", + "dev": "nodemon --watch src -e ts,js,pug --exec 'npm run build && node built/index.js'", "postinstall": "node postinstall.cjs", "build": "tsc", "release": "docker buildx build . --platform linux/amd64,linux/arm64 -t wingysam/christmas-community -t wingysam/christmas-community:$(./node_modules/node-jq/bin/jq -r .version < package.json) --push" From f0ed668b3d6fb02938604a8a02cec34d71c44cc1 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 31 Dec 2024 11:32:57 -0400 Subject: [PATCH 19/20] small refactor --- src/views/includes/navbar.pug | 2 +- src/views/profile.pug | 2 +- src/views/wishlists.pug | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/views/includes/navbar.pug b/src/views/includes/navbar.pug index 30a0fbaa..1c42ac01 100644 --- a/src/views/includes/navbar.pug +++ b/src/views/includes/navbar.pug @@ -30,7 +30,7 @@ nav.navbar.is-fixed-top(role='navigation', aria-label='main navigation',style='b .navbar-item.has-dropdown.is-hoverable a.navbar-link= req.user._id .navbar-dropdown - if req.user.pledgeOnly != true + if !req.user.pledgeOnly +navBarLink(`${_CC.config.base}wishlist/${req.user._id}`, lang('NAVBAR_WISHLIST')) +navBarLink(`${_CC.config.base}profile`, lang('NAVBAR_PROFILE')) if req.user.admin diff --git a/src/views/profile.pug b/src/views/profile.pug index 1cbcdfe4..8934be28 100644 --- a/src/views/profile.pug +++ b/src/views/profile.pug @@ -36,7 +36,7 @@ block content button.button.is-primary(type='submit') span.icon i.fas.fa-save - if req.user.pledgeOnly != true + if !req.user.pledgeOnly h2= lang('PROFILE_SHARED_INFORMATION') form(action=`${_CC.config.base}profile/info`, method='POST') .columns.is-multiline.is-mobile diff --git a/src/views/wishlists.pug b/src/views/wishlists.pug index 7f141404..66dae17c 100644 --- a/src/views/wishlists.pug +++ b/src/views/wishlists.pug @@ -52,7 +52,7 @@ block content div!= _CC.config.customHtml.wishlists ul.noStyle.noLeftMargin - if req.user._id !== '_CCUNKNOWN' && req.user.pledgeOnly != true + if req.user._id !== '_CCUNKNOWN' && !req.user.pledgeOnly li .box a(href=`${_CC.config.base}wishlist/${req.user._id}`, style='color: #4a4a4a;') @@ -67,7 +67,7 @@ block content progress.progress(value=1, max=1) +wishlistDetails(req.user.wishlist, req.user._id) each user in users - if req.user._id !== user.id && user.doc.pledgeOnly != true + if req.user._id !== user.id && !user.doc.pledgeOnly li .box a(href=`${_CC.config.base}wishlist/${user.id}`, style='color: #4a4a4a;') From 477153ca183f11036ffd14f5c537ebdc7e1ba555 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Fri, 24 Jan 2025 17:42:21 -0400 Subject: [PATCH 20/20] tidy up item adding --- src/config/index.ts | 4 ++-- src/static/css/main.css | 5 +++++ src/views/wishlist.pug | 16 +++++----------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/config/index.ts b/src/config/index.ts index f9b4f6b5..74b57ce3 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -31,8 +31,8 @@ const config = { oidcEnabled: false, rootUrl: appendSlash(process.env.ROOT_URL ?? process.env.ROOT_PATH ?? '/'), base: '', // automatically set below - pledgeSuggest: process.env.PLEDGE_SUGGEST === 'true' ? true : process.env.PLEDGE_SUGGEST || true, - suggestionsEnabled: process.env.SUGGESTIONS_ENABLED === 'true' ? true : process.env.SUGGESTIONS_ENABLED || true + pledgeSuggest: (process.env.PLEDGE_SUGGEST === 'true'), + suggestionsEnabled: (process.env.SUGGESTIONS_ENABLED === 'true') } if (config.guestPassword) config.wishlist.public = false diff --git a/src/static/css/main.css b/src/static/css/main.css index 0b4dfdd9..a97e32f8 100644 --- a/src/static/css/main.css +++ b/src/static/css/main.css @@ -64,4 +64,9 @@ img.logo-image { .print-gift:last-child { margin-bottom: 0; +} + +a.disabled { + pointer-events: none; + cursor: default; } \ No newline at end of file diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index bb1d8770..d2440076 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -18,6 +18,9 @@ block title span= lang('WISHLIST_TITLE', name) .level-right .level-item + if ((!global._CC.config.pledgeSuggest && req.user.pledgeOnly) || !global._CC.config.suggestionsEnabled) + span= " " + else a(href="#addWishlistItem").button.button.is-primary.is-rounded span.icon i.fas.fa-plus @@ -263,10 +266,10 @@ block content .control.inline input.inline.button(type='submit' value=lang('WISHLIST_MOVE_ITEM_BOTTOM')) - if ((!global._CC.config.pledgeSuggest && req.user.pledgeOnly) || !global._CC.config.suggestionsEnabled || req.user._id !== req.params.user) + if ((!global._CC.config.pledgeSuggest && req.user.pledgeOnly) || !global._CC.config.suggestionsEnabled) .notification.is-info= lang('WISHLIST_SUGGESTIONS_DISABLED') else - form(method='POST') + form(method='POST')#addWishlistItem .field label.label!=lang('WISHLIST_URL_LABEL') .control.has-icons-left @@ -279,15 +282,6 @@ block content i.fas.fa-gift .field label.label= lang('WISHLIST_NOTE') - .control - textarea.textarea( - name='note', - placeholder=lang('WISHLIST_OPTIONAL') - ) - .field.is-grouped - .control - input.button(type='submit' value=(req.user._id === req.params.user ? lang('WISHLIST_ADD') : lang('WISHLIST_PLEDGE_ITEM'))) - if req.user._id !== req.params.user .control textarea.textarea( name='note',