From 433f3ef7811c5eb51ba3c9dd4bf630b98e578b14 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 22 Jan 2025 20:57:08 -0400 Subject: [PATCH 01/18] watch for pug file changes and rebuild --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0f4aa703..ce00d521 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 63c4307f7ed763eb00947fff9f48afd89c2e0d8c Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 22 Jan 2025 20:57:29 -0400 Subject: [PATCH 02/18] support archive and restore in table mode --- src/languages/en-us.ts | 9 +++- src/routes/wishlist/index.js | 42 ++++++++++++++++ src/static/css/main.css | 9 ++++ src/structures/Wishlist.js | 13 +++++ src/views/wishlist.pug | 93 +++++++++++++++++++++++++++++++++++- 5 files changed, 163 insertions(+), 3 deletions(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 0a8b4bb0..85866c16 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -208,7 +208,14 @@ 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_ARCHIVE: 'Archive', + WISHLIST_RESTORE: 'Restore', + WISHLIST_ARCHIVED_ITEMS: 'Archived Items', + WISHLIST_ARCHIVE_SUCCESS : 'Successfully archived item.', + WISHLIST_RESTORE_SUCCESS : 'Successfully restored item.', + WISHLIST_ARCHIVE_GUARD: 'You are not allowed to archive this item', + WISHLIST_RESTORE_GUARD: 'You are not allowed to restore this item', 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`, } as const diff --git a/src/routes/wishlist/index.js b/src/routes/wishlist/index.js index 04253c74..2c30bd4e 100644 --- a/src/routes/wishlist/index.js +++ b/src/routes/wishlist/index.js @@ -239,5 +239,47 @@ export default function (db) { res.redirect(`/wishlist/${req.params.user}/note/${req.params.id}`) }) + router.post('/:user/archive/:itemId', verifyAuth(), async (req, res) => { + try { + const wishlist = await wishlistManager.get(req.params.user) + const item = await wishlist.get(req.params.itemId) + + const isOwnWishlist = req.user._id === wishlist.username + const addedByUser = item.addedBy === req.user._id + if (!isOwnWishlist && !addedByUser) { + throw new Error(_CC.lang('WISHLIST_ARCHIVE_GUARD')) + } + + await wishlist.archive(item.id) + + req.flash('success', _CC.lang('WISHLIST_ARCHIVE_SUCCESS')) + } catch (error) { + req.flash('error', `${error}`) + } + + res.redirect(`/wishlist/${req.params.user}`) + }) + + router.post('/:user/restore/:itemId', verifyAuth(), async (req, res) => { + try { + const wishlist = await wishlistManager.get(req.params.user) + const item = await wishlist.get(req.params.itemId) + + const isOwnWishlist = req.user._id === wishlist.username + const addedByUser = item.addedBy === req.user._id + if (!isOwnWishlist && !addedByUser) { + throw new Error(_CC.lang('WISHLIST_RESTORE_GUARD')) + } + + await wishlist.restore(item.id) + + req.flash('success', _CC.lang('WISHLIST_RESTORE_SUCCESS')) + } catch (error) { + req.flash('error', `${error}`) + } + + res.redirect(`/wishlist/${req.params.user}`) + }) + return router } diff --git a/src/static/css/main.css b/src/static/css/main.css index 0b4dfdd9..9ca5fa78 100644 --- a/src/static/css/main.css +++ b/src/static/css/main.css @@ -64,4 +64,13 @@ img.logo-image { .print-gift:last-child { margin-bottom: 0; +} + +summary{ + font-weight: bold; + font-size: 18px; + } + +summary:hover { + cursor: pointer; } \ No newline at end of file diff --git a/src/structures/Wishlist.js b/src/structures/Wishlist.js index 260d3079..b0918887 100644 --- a/src/structures/Wishlist.js +++ b/src/structures/Wishlist.js @@ -178,6 +178,19 @@ export class Wishlist { await this.save() } + + async archive (id) { + const item = await this.get(id) + item.archived = true + await this.save() + } + + async restore (id) { + const item = await this.get(id) + item.archived = false + await this.save() + } + } function parseURL (string) { diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 212691fe..67c29aa3 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -56,8 +56,10 @@ block content else th= lang('WISHLIST_PLEDGE') th= lang('WISHLIST_DELETE') + if req.params.user === req.user._id + th= lang('WISHLIST_ARCHIVE') tbody - each item, index in items + each item, index in items.filter(item => !item.archived) tr(id=item.id) td.rank= index + 1 td @@ -179,7 +181,31 @@ block content ) span.icon i.fas.fa-trash - + if req.params.user === req.user._id + if item.archived + td(data-label='Unarchive Item') + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unarchive/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon + i.fas.fa-undo + else + td(data-label='Archive Item') + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon + i.fas.fa-archive else each item, index in items if req.user._id === item.addedBy || req.params.user !== req.user._id @@ -288,6 +314,69 @@ block content input.inline.button(type='submit', value=lang('WISHLIST_SUGGEST'), name='suggest') script(src=`${_CC.config.base}js/wishlist.js`) + br + details + summary= lang('WISHLIST_ARCHIVED_ITEMS') + if global._CC.config.wishlist.table + .box + table.table.has-mobile-cards + thead + tr + th # + th(style='width: 10%;')= lang('WISHLIST_IMAGE') + th(style='width: 25%;')= lang('WISHLIST_NAME') + th(style='width: 50%;')= lang('WISHLIST_NOTE') + th(style='width: 10%;')= lang('WISHLIST_PRICE') + th(style='width: 10%;')= lang('WISHLIST_RESTORE') + tbody + each item, index in items.filter(item => item.archived) + tr(id=item.id) + td.rank= index + 1 + td + figure(style='width: 100%; margin: 0;') + img(src=item.image, style='width: 100%; max-height: 20em; object-fit: contain;') + if item.url + td.ugc(data-label=lang('WISHLIST_NAME')) + if item.pledgedBy && item.addedBy != req.user._id + strike + a( + href=item.url, + rel='noopener noreferrer', + target='_blank' + )= (item.name ? item.name : item.url) + else + a( + href=item.url, + rel='noopener noreferrer', + target='_blank' + )= (item.name ? item.name : item.url) + else + td.ugc(data-label='Name') + if item.pledgedBy && item.addedBy != req.user._id + strike + span= item.name + else + span= item.name + td= item.price + if _CC.config.wishlist.note.markdown + td.ugc(data-label=lang('WISHLIST_NOTE')) + div!= compiledNotes[item.id] + else + td.ugc(data-label=lang('WISHLIST_NOTE'))= item.note + td + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon + i.fas.fa-undo + + + block print h1 #{req.params.user}'s Wishlist .print-gifts From e73e8c0807513d9772c7d306241e8739b224a972 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 22 Jan 2025 21:26:06 -0400 Subject: [PATCH 03/18] add card support and delete confirmation --- src/languages/en-us.ts | 1 + src/views/wishlist.pug | 73 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 85866c16..b9f0b9ed 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -215,6 +215,7 @@ export const strings = { WISHLIST_RESTORE_SUCCESS : 'Successfully restored item.', WISHLIST_ARCHIVE_GUARD: 'You are not allowed to archive this item', WISHLIST_RESTORE_GUARD: 'You are not allowed to restore this item', + WISHLIST_DELETE_CONFIRM: 'Are you sure you want to delete this item?', 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 67c29aa3..94713edd 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -170,7 +170,8 @@ block content td(data-label='Delete Item') form.inline( method='POST', - action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}` + action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, + onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")` ) .field.inline .control.inline @@ -207,7 +208,7 @@ block content span.icon i.fas.fa-archive else - each item, index in items + each item, index in items.filter(item => !item.archived) if req.user._id === item.addedBy || req.params.user !== req.user._id .box if item.price @@ -264,10 +265,10 @@ block content .control.inline input.inline.button(type='submit' value=lang('WISHLIST_UNPLEDGE')) if req.user._id === req.params.user - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`) + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")`) .field.inline .control.inline - input.inline.button.is-warning(type='submit' value=lang('WISHLIST_DELETE')) + input.inline.button.is-danger(type='submit' value=lang('WISHLIST_DELETE')) if req.user._id === req.params.user || req.user._id === item.addedBy form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) .field.inline @@ -288,6 +289,11 @@ block content .field.inline .control.inline input.inline.button(type='submit' value=lang('WISHLIST_MOVE_ITEM_BOTTOM')) + if req.user._id === req.params.user + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) + .field.inline + .control.inline + input.inline.button.is-warning(type='submit' value=lang('WISHLIST_ARCHIVE')) form(method='POST')#addWishlistItem .field label.label!=lang('WISHLIST_URL_LABEL') @@ -374,8 +380,63 @@ block content ) span.icon i.fas.fa-undo - - + else + each item, index in items.filter(item => item.archived) + if req.user._id === item.addedBy || req.params.user !== req.user._id + .box + if item.price + .tag + i.fas.fa-tag(style='margin-right: .5em;') + span= item.price + span.overflowWrap + if item.price + span= ' ' + if item.url + if item.pledgedBy && item.addedBy != req.user._id + strike + a( + href=item.url, + rel='noopener noreferrer', + target='_blank' + )= (item.name ? item.name : item.url) + else + a( + href=item.url, + rel='noopener noreferrer', + target='_blank' + )= (item.name ? item.name : item.url) + else + if item.pledgedBy && item.addedBy != req.user._id + strike + span= item.name + else + span= item.name + hr + if item.note || item.image + .columns + if item.image + .column + figure(style='width: 100%; padding: 2em;') + img(src=item.image, style='width: 100%;') + .column.is-three-quarters + if item.note + textarea.textarea.has-fixed-size( + style='height: 100%;' + readonly + )= item.note + hr + div + if req.user._id === req.params.user + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")`) + .field.inline + .control.inline + input.inline.button.is-danger(type='submit' value=lang('WISHLIST_DELETE')) + span= ' ' + if req.user._id === req.params.user + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) + .field.inline + .control.inline + input.inline.button.is-success(type='submit' value=lang('WISHLIST_RESTORE')) block print h1 #{req.params.user}'s Wishlist From 870ef01f034c522e5e89edaace02c63528127497 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 22 Jan 2025 21:56:00 -0400 Subject: [PATCH 04/18] add support for pledge auto archiving --- src/config/index.ts | 1 + src/routes/wishlist/index.js | 6 +++++- src/structures/Wishlist.js | 4 ++++ src/views/wishlists.pug | 4 ++-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/config/index.ts b/src/config/index.ts index 6c11e4c3..80a6aabc 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -30,6 +30,7 @@ const config = { oidcProviderName: process.env.OIDC_PROVIDER_NAME || 'Google', oidcEnabled: false, rootUrl: appendSlash(process.env.ROOT_URL ?? process.env.ROOT_PATH ?? '/'), + autoArchivePledges: process.env.AUTO_ARCHIVE_PLEDGES || false, base: '' // automatically set below } diff --git a/src/routes/wishlist/index.js b/src/routes/wishlist/index.js index 2c30bd4e..f9f78fd0 100644 --- a/src/routes/wishlist/index.js +++ b/src/routes/wishlist/index.js @@ -12,11 +12,15 @@ const DOMPurify = createDOMPurify(window) const totals = wishlist => { let unpledged = 0 let pledged = 0 + let active = 0 + let archived = 0 wishlist.forEach(wishItem => { if (wishItem.pledgedBy) pledged += 1 else unpledged += 1 + if (wishItem.archived) archived += 1 + else active += 1 }) - return { unpledged, pledged } + return { unpledged, pledged, active, archived } } export default function (db) { diff --git a/src/structures/Wishlist.js b/src/structures/Wishlist.js index b0918887..9e4f5691 100644 --- a/src/structures/Wishlist.js +++ b/src/structures/Wishlist.js @@ -98,6 +98,10 @@ export class Wishlist { async pledge (id, user) { const item = await this.get(id) item.pledgedBy = user + + if (_CC.config.autoArchivePledges) { + item.archived = true + } await this.save() } diff --git a/src/views/wishlists.pug b/src/views/wishlists.pug index 4243928a..d179d8a5 100644 --- a/src/views/wishlists.pug +++ b/src/views/wishlists.pug @@ -77,8 +77,8 @@ block content figure.image.is-square.is-fullwidth.is-marginless(style='display: inline-block;') img.is-rounded.is-fullwidth(src=user.doc.pfp, style='object-fit: cover;') .column - span= lang('WISHLISTS_COUNTS', user.id, totals(user.doc.wishlist).pledged, user.doc.wishlist.length) - progress.progress.is-info(value=totals(user.doc.wishlist).pledged, max=user.doc.wishlist.length) + span= lang('WISHLISTS_COUNTS', user.id, totals(user.doc.wishlist).pledged, totals(user.doc.wishlist).active) + progress.progress.is-info(value=totals(user.doc.wishlist).pledged, max=totals(user.doc.wishlist).active) +wishlistDetails(user.doc.wishlist) script. document.querySelectorAll('.wishlist-dropdown-button') From 5795bb1e6b5e6f153cf13281c12526409c9eb3fb Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 22 Jan 2025 21:57:12 -0400 Subject: [PATCH 05/18] add docs for auto archiving --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8a45f079..c257d3fa 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,9 @@ MARKDOWN=false # OIDC_TOKEN_URL=https://oauth2.googleapis.com/token # OIDC_ISSUER=https://accounts.google.com # OIDC_PROVIDER_NAME=Google + +## Auto archive pledges +AUTO_ARCHIVE_PLEDGES=false ``` ## Default Profile Pictures From 07d754102da553da22a44be00514d648b5e4b772 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 22 Jan 2025 22:04:40 -0400 Subject: [PATCH 06/18] only list active items --- src/views/wishlists.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/wishlists.pug b/src/views/wishlists.pug index d179d8a5..08adfe10 100644 --- a/src/views/wishlists.pug +++ b/src/views/wishlists.pug @@ -8,7 +8,7 @@ mixin wishlistDetails(wishlist, onlyShowAddedByUser) i.fas.fa-chevron-down ul.wishlist-dropdown for item in wishlist - if onlyShowAddedByUser === undefined || item.addedBy === onlyShowAddedByUser + if !item.archived && onlyShowAddedByUser === undefined || item.addedBy === onlyShowAddedByUser li if item.pledgedBy && !onlyShowAddedByUser strike= item.name From 7a7bd1b42158c5bf87533c1a4828ed7c735ebe9a Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Wed, 22 Jan 2025 22:09:40 -0400 Subject: [PATCH 07/18] remove unnecessary comma --- src/languages/en-us.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index b9f0b9ed..3a8e5a89 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -218,5 +218,5 @@ export const strings = { WISHLIST_DELETE_CONFIRM: 'Are you sure you want to delete this item?', 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` } as const From 732d996f336f79f8135288720f40c068ac5a5008 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Thu, 23 Jan 2025 17:42:33 -0400 Subject: [PATCH 08/18] fix order or archive table columns --- src/views/wishlist.pug | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 94713edd..0a73ced3 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -333,7 +333,8 @@ block content th(style='width: 25%;')= lang('WISHLIST_NAME') th(style='width: 50%;')= lang('WISHLIST_NOTE') th(style='width: 10%;')= lang('WISHLIST_PRICE') - th(style='width: 10%;')= lang('WISHLIST_RESTORE') + th(style='width: 5%;')= lang('WISHLIST_DELETE') + th(style='width: 5%;')= lang('WISHLIST_RESTORE') tbody each item, index in items.filter(item => item.archived) tr(id=item.id) @@ -363,12 +364,27 @@ block content span= item.name else span= item.name - td= item.price if _CC.config.wishlist.note.markdown td.ugc(data-label=lang('WISHLIST_NOTE')) div!= compiledNotes[item.id] else td.ugc(data-label=lang('WISHLIST_NOTE'))= item.note + td= item.price + td(data-label='Delete Item') + form.inline( + method='POST', + action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, + onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")` + ) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon + i.fas.fa-trash td form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) .field.inline From f944297acc02290877e41bc64562be45ab64e998 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Fri, 24 Jan 2025 17:00:36 -0400 Subject: [PATCH 09/18] pugs don't need rebuilds, rappers do https://en.wikipedia.org/wiki/Guns_Don%27t_Kill_People,_Rappers_Do --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ee9e215c..1b16dd4e 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,pug --exec 'npm run build && node built/index.js'", + "dev": "nodemon --watch src -e ts,js --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 eae7599d23c06e513dad0635347b54cc0329e898 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Fri, 24 Jan 2025 20:58:47 -0400 Subject: [PATCH 10/18] add parentheses for readability --- src/views/wishlists.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/wishlists.pug b/src/views/wishlists.pug index 08adfe10..ce3b528e 100644 --- a/src/views/wishlists.pug +++ b/src/views/wishlists.pug @@ -8,7 +8,7 @@ mixin wishlistDetails(wishlist, onlyShowAddedByUser) i.fas.fa-chevron-down ul.wishlist-dropdown for item in wishlist - if !item.archived && onlyShowAddedByUser === undefined || item.addedBy === onlyShowAddedByUser + if (!item.archived && onlyShowAddedByUser === undefined) || item.addedBy === onlyShowAddedByUser li if item.pledgedBy && !onlyShowAddedByUser strike= item.name From b088c7b77b180e580780e2bd054ff996e05964da Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Fri, 24 Jan 2025 21:43:26 -0400 Subject: [PATCH 11/18] move wishlist generation to mixins --- src/views/wishlist.pug | 584 +++++++++++++++++------------------------ 1 file changed, 240 insertions(+), 344 deletions(-) diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 0a73ced3..b2743ce9 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -6,93 +6,68 @@ mixin sharedInfoProp(key, label) th= lang(label) td= sharedInfo[key] -block title - h1 - .level - .level-left - .level-item - button.button.is-rounded(onclick='this.firstChild.firstChild.classList.add("fa-pulse"); location.reload()') - span.icon - i.fas.fa-sync-alt - .level-item - span= lang('WISHLIST_TITLE', name) - .level-right - .level-item - a(href="#addWishlistItem").button.button.is-primary.is-rounded - span.icon - i.fas.fa-plus - span= lang('WISHLIST_ADD_NEW') - - -block content - script(type='data/user_id')= req.user._id - table.table(style='width: fit-content;') - tbody - +sharedInfoProp('shoeSize', 'PROFILE_SHOE_SIZE') - +sharedInfoProp('ringSize', 'PROFILE_RING_SIZE') - +sharedInfoProp('dressSize', 'PROFILE_DRESS_SIZE') - +sharedInfoProp('sweaterSize', 'PROFILE_SWEATER_SIZE') - +sharedInfoProp('shirtSize', 'PROFILE_SHIRT_SIZE') - +sharedInfoProp('pantsSize', 'PROFILE_PANTS_SIZE') - +sharedInfoProp('coatSize', 'PROFILE_COAT_SIZE') - +sharedInfoProp('hatSize', 'PROFILE_HAT_SIZE') - +sharedInfoProp('phoneModel', 'PROFILE_PHONE_MODEL') - if global._CC.config.wishlist.table - .box - table.table.has-mobile-cards - thead - th # - th(style='width: 15%;')= lang('WISHLIST_IMAGE') - th(style='width: 25%;')= lang('WISHLIST_NAME') - th(style='width: 50%;')= lang('WISHLIST_NOTE') - th(style='width: 10%;')= lang('WISHLIST_PRICE') +mixin wishlistTable(items, archived) + .box + table.table.has-mobile-cards + thead + th # + th(style='width: 15%;')= lang('WISHLIST_IMAGE') + th(style='width: 25%;')= lang('WISHLIST_NAME') + th(style='width: 50%;')= lang('WISHLIST_NOTE') + th(style='width: 10%;')= lang('WISHLIST_PRICE') + if req.params.user === req.user._id th= lang('WISHLIST_EDIT_ITEM') - th= lang('WISHLIST_ADDED_BY') - if req.params.user === req.user._id - th= lang('WISHLIST_MOVE_TOP') - th= lang('WISHLIST_MOVE_UP') - th= lang('WISHLIST_MOVE_DOWN') - th= lang('WISHLIST_MOVE_BOTTOM') - else + th= lang('WISHLIST_ADDED_BY') + if req.params.user === req.user._id && !archived + th= lang('WISHLIST_MOVE_TOP') + th= lang('WISHLIST_MOVE_UP') + th= lang('WISHLIST_MOVE_DOWN') + th= lang('WISHLIST_MOVE_BOTTOM') + else + if !archived th= lang('WISHLIST_PLEDGE') + if req.params.user === req.user._id th= lang('WISHLIST_DELETE') - if req.params.user === req.user._id - th= lang('WISHLIST_ARCHIVE') - tbody - each item, index in items.filter(item => !item.archived) - tr(id=item.id) - td.rank= index + 1 - td - figure(style='width: 100%; margin: 0;') - img(src=item.image, style='width: 100%; max-height: 20em; object-fit: contain;') - if item.url - td.ugc(data-label=lang('WISHLIST_NAME')) - if item.pledgedBy && item.addedBy != req.user._id - strike - a( - href=item.url, - rel='noopener noreferrer', - target='_blank' - )= (item.name ? item.name : item.url) - else - a( - href=item.url, - rel='noopener noreferrer', - target='_blank' - )= (item.name ? item.name : item.url) - else - td.ugc(data-label='Name') - if item.pledgedBy && item.addedBy != req.user._id - strike - span= item.name - else + if archived + th= lang('WISHLIST_RESTORE') + else + th= lang('WISHLIST_ARCHIVE') + tbody + each item, index in items + tr(id=item.id) + td.rank= index + 1 + td + figure(style='width: 100%; margin: 0;') + img(src=item.image, style='width: 100%; max-height: 20em; object-fit: contain;') + if item.url + td.ugc(data-label=lang('WISHLIST_NAME')) + if item.pledgedBy && item.addedBy != req.user._id + strike + a( + href=item.url, + rel='noopener noreferrer', + target='_blank' + )= (item.name ? item.name : item.url) + else + a( + href=item.url, + rel='noopener noreferrer', + target='_blank' + )= (item.name ? item.name : item.url) + else + td.ugc(data-label='Name') + if item.pledgedBy && item.addedBy != req.user._id + strike span= item.name - if _CC.config.wishlist.note.markdown - td.ugc(data-label=lang('WISHLIST_NOTE')) - div!= compiledNotes[item.id] - else - td.ugc(data-label=lang('WISHLIST_NOTE'))= item.note - td.ugc(data-label=lang('WISHLIST_PRICE'))= item.price + else + span= item.name + if _CC.config.wishlist.note.markdown + td.ugc(data-label=lang('WISHLIST_NOTE')) + div!= compiledNotes[item.id] + else + td.ugc(data-label=lang('WISHLIST_NOTE'))= item.note + td.ugc(data-label=lang('WISHLIST_PRICE'))= item.price + if req.params.user === req.user._id td(data-label=lang('WISHLIST_EDIT_ITEM')) form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) .field.inline @@ -104,53 +79,54 @@ block content ) span.icon i.far.fa-edit - td.ugc(data-label=lang('WISHLIST_ADDED_BY'))= item.addedBy - if req.params.user === req.user._id - td(data-label=lang('WISHLIST_MOVE_ITEM_TOP')) - form.topForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/top/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=index === 0 - ) - span.icon - i.fas.fa-angle-double-up - td(data-label=lang('WISHLIST_MOVE_ITEM_UP')) - form.upForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/up/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=index === 0 - ) - span.icon - i.fas.fa-arrow-up - td(data-label=lang('WISHLIST_MOVE_ITEM_DOWN')) - form.downForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/down/${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-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.ugc(data-label=lang('WISHLIST_ADDED_BY'))= item.addedBy + if req.params.user === req.user._id && !archived + td(data-label=lang('WISHLIST_MOVE_ITEM_TOP')) + form.topForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/top/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=index === 0 + ) + span.icon + i.fas.fa-angle-double-up + td(data-label=lang('WISHLIST_MOVE_ITEM_UP')) + form.upForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/up/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=index === 0 + ) + span.icon + i.fas.fa-arrow-up + td(data-label=lang('WISHLIST_MOVE_ITEM_DOWN')) + form.downForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/down/${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-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 + if !archived td(data-label=lang('WISHLIST_PLEDGE')) if req.params.user !== req.user._id && !item.pledgedBy form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/pledge/${item.id}`) @@ -167,6 +143,7 @@ block content span.ugc=lang('WISHLIST_PLEDGED_GUEST') else span.ugc=lang('WISHLIST_PLEDGED', item.pledgedBy) + if req.params.user === req.user._id td(data-label='Delete Item') form.inline( method='POST', @@ -182,98 +159,99 @@ block content ) span.icon i.fas.fa-trash - if req.params.user === req.user._id - if item.archived - td(data-label='Unarchive Item') - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unarchive/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon - i.fas.fa-undo - else - td(data-label='Archive Item') - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon - i.fas.fa-archive - else - each item, index in items.filter(item => !item.archived) - if req.user._id === item.addedBy || req.params.user !== req.user._id - .box - if item.price - .tag - i.fas.fa-tag(style='margin-right: .5em;') - span= item.price - span.overflowWrap - if item.price - span= ' ' - if item.url - if item.pledgedBy && item.addedBy != req.user._id - strike - a( - href=item.url, - rel='noopener noreferrer', - target='_blank' - )= (item.name ? item.name : item.url) + if archived + td(data-label='Unarchive Item') + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unarchive/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon + i.fas.fa-undo else + td(data-label='Archive Item') + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon + i.fas.fa-archive + +mixin wishlistBox(items, archived) + each item, index in items + if req.user._id === item.addedBy || req.params.user !== req.user._id + .box + if item.price + .tag + i.fas.fa-tag(style='margin-right: .5em;') + span= item.price + span.overflowWrap + if item.price + span= ' ' + if item.url + if item.pledgedBy && item.addedBy != req.user._id + strike a( href=item.url, rel='noopener noreferrer', target='_blank' )= (item.name ? item.name : item.url) else - if item.pledgedBy && item.addedBy != req.user._id - strike - span= item.name - else + a( + href=item.url, + rel='noopener noreferrer', + target='_blank' + )= (item.name ? item.name : item.url) + else + if item.pledgedBy && item.addedBy != req.user._id + strike span= item.name - hr - if item.note || item.image - .columns - if item.image - .column - figure(style='width: 100%; padding: 2em;') - img(src=item.image, style='width: 100%;') - .column.is-three-quarters - if item.note - textarea.textarea.has-fixed-size( - style='height: 100%;' - readonly - )= item.note - span.overflowWrap=lang('WISHLIST_ADDED_BY_USER', item.addedBy) - hr - div - if req.params.user !== req.user._id && !item.pledgedBy - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/pledge/${item.id}`) - .field.inline - .control.inline - input.inline.button.is-primary(type='submit' value=lang('WISHLIST_PLEDGE')) - if item.pledgedBy === req.user._id - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unpledge/${item.id}`) - .field.inline - .control.inline - input.inline.button(type='submit' value=lang('WISHLIST_UNPLEDGE')) - if req.user._id === req.params.user - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")`) - .field.inline - .control.inline - input.inline.button.is-danger(type='submit' value=lang('WISHLIST_DELETE')) - if req.user._id === req.params.user || req.user._id === item.addedBy - form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) - .field.inline - .control.inline - input.inline.button(type='submit', value=lang('WISHLIST_EDIT_ITEM')) + else + span= item.name + hr + if item.note || item.image + .columns + if item.image + .column + figure(style='width: 100%; padding: 2em;') + img(src=item.image, style='width: 100%;') + .column.is-three-quarters + if item.note + textarea.textarea.has-fixed-size( + style='height: 100%;' + readonly + )= item.note + span.overflowWrap=lang('WISHLIST_ADDED_BY_USER', item.addedBy) + hr + div + if req.params.user !== req.user._id && !item.pledgedBy + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/pledge/${item.id}`) + .field.inline + .control.inline + input.inline.button.is-primary(type='submit' value=lang('WISHLIST_PLEDGE')) + if item.pledgedBy === req.user._id + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unpledge/${item.id}`) + .field.inline + .control.inline + input.inline.button(type='submit' value=lang('WISHLIST_UNPLEDGE')) + if req.user._id === req.params.user + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")`) + .field.inline + .control.inline + input.inline.button.is-danger(type='submit' value=lang('WISHLIST_DELETE')) + if req.user._id === req.params.user || req.user._id === item.addedBy + form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) + .field.inline + .control.inline + input.inline.button(type='submit', value=lang('WISHLIST_EDIT_ITEM')) + if !archived if index !== 0 && req.user._id === req.params.user form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/up/${item.id}`) .field.inline @@ -289,11 +267,56 @@ block content .field.inline .control.inline input.inline.button(type='submit' value=lang('WISHLIST_MOVE_ITEM_BOTTOM')) - if req.user._id === req.params.user + if req.user._id === req.params.user + if !archived form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) .field.inline .control.inline input.inline.button.is-warning(type='submit' value=lang('WISHLIST_ARCHIVE')) + else + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) + .field.inline + .control.inline + input.inline.button.is-success(type='submit' value=lang('WISHLIST_RESTORE')) + +block title + h1 + .level + .level-left + .level-item + button.button.is-rounded(onclick='this.firstChild.firstChild.classList.add("fa-pulse"); location.reload()') + span.icon + i.fas.fa-sync-alt + .level-item + span= lang('WISHLIST_TITLE', name) + .level-right + .level-item + a(href="#addWishlistItem").button.button.is-primary.is-rounded + span.icon + i.fas.fa-plus + span= lang('WISHLIST_ADD_NEW') + + +block content + script(type='data/user_id')= req.user._id + table.table(style='width: fit-content;') + tbody + +sharedInfoProp('shoeSize', 'PROFILE_SHOE_SIZE') + +sharedInfoProp('ringSize', 'PROFILE_RING_SIZE') + +sharedInfoProp('dressSize', 'PROFILE_DRESS_SIZE') + +sharedInfoProp('sweaterSize', 'PROFILE_SWEATER_SIZE') + +sharedInfoProp('shirtSize', 'PROFILE_SHIRT_SIZE') + +sharedInfoProp('pantsSize', 'PROFILE_PANTS_SIZE') + +sharedInfoProp('coatSize', 'PROFILE_COAT_SIZE') + +sharedInfoProp('hatSize', 'PROFILE_HAT_SIZE') + +sharedInfoProp('phoneModel', 'PROFILE_PHONE_MODEL') + + if global._CC.config.wishlist.table + +wishlistTable(items.filter(item => !item.archived), false) + else + +wishlistBox(items.filter(item => !item.archived), false) + + br form(method='POST')#addWishlistItem .field label.label!=lang('WISHLIST_URL_LABEL') @@ -319,140 +342,13 @@ block content .control input.inline.button(type='submit', value=lang('WISHLIST_SUGGEST'), name='suggest') script(src=`${_CC.config.base}js/wishlist.js`) - br details summary= lang('WISHLIST_ARCHIVED_ITEMS') if global._CC.config.wishlist.table - .box - table.table.has-mobile-cards - thead - tr - th # - th(style='width: 10%;')= lang('WISHLIST_IMAGE') - th(style='width: 25%;')= lang('WISHLIST_NAME') - th(style='width: 50%;')= lang('WISHLIST_NOTE') - th(style='width: 10%;')= lang('WISHLIST_PRICE') - th(style='width: 5%;')= lang('WISHLIST_DELETE') - th(style='width: 5%;')= lang('WISHLIST_RESTORE') - tbody - each item, index in items.filter(item => item.archived) - tr(id=item.id) - td.rank= index + 1 - td - figure(style='width: 100%; margin: 0;') - img(src=item.image, style='width: 100%; max-height: 20em; object-fit: contain;') - if item.url - td.ugc(data-label=lang('WISHLIST_NAME')) - if item.pledgedBy && item.addedBy != req.user._id - strike - a( - href=item.url, - rel='noopener noreferrer', - target='_blank' - )= (item.name ? item.name : item.url) - else - a( - href=item.url, - rel='noopener noreferrer', - target='_blank' - )= (item.name ? item.name : item.url) - else - td.ugc(data-label='Name') - if item.pledgedBy && item.addedBy != req.user._id - strike - span= item.name - else - span= item.name - if _CC.config.wishlist.note.markdown - td.ugc(data-label=lang('WISHLIST_NOTE')) - div!= compiledNotes[item.id] - else - td.ugc(data-label=lang('WISHLIST_NOTE'))= item.note - td= item.price - td(data-label='Delete Item') - form.inline( - method='POST', - action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, - onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")` - ) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon - i.fas.fa-trash - td - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon - i.fas.fa-undo + +wishlistTable(items.filter(item => !item.archived), true) else - each item, index in items.filter(item => item.archived) - if req.user._id === item.addedBy || req.params.user !== req.user._id - .box - if item.price - .tag - i.fas.fa-tag(style='margin-right: .5em;') - span= item.price - span.overflowWrap - if item.price - span= ' ' - if item.url - if item.pledgedBy && item.addedBy != req.user._id - strike - a( - href=item.url, - rel='noopener noreferrer', - target='_blank' - )= (item.name ? item.name : item.url) - else - a( - href=item.url, - rel='noopener noreferrer', - target='_blank' - )= (item.name ? item.name : item.url) - else - if item.pledgedBy && item.addedBy != req.user._id - strike - span= item.name - else - span= item.name - hr - if item.note || item.image - .columns - if item.image - .column - figure(style='width: 100%; padding: 2em;') - img(src=item.image, style='width: 100%;') - .column.is-three-quarters - if item.note - textarea.textarea.has-fixed-size( - style='height: 100%;' - readonly - )= item.note - hr - div - if req.user._id === req.params.user - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")`) - .field.inline - .control.inline - input.inline.button.is-danger(type='submit' value=lang('WISHLIST_DELETE')) - span= ' ' - if req.user._id === req.params.user - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) - .field.inline - .control.inline - input.inline.button.is-success(type='submit' value=lang('WISHLIST_RESTORE')) + +wishlistBox(items.filter(item => item.archived), true) block print h1 #{req.params.user}'s Wishlist From 43fbd20563b13c216c3cbc11cd9f7d74636a3acf Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Fri, 24 Jan 2025 22:52:38 -0400 Subject: [PATCH 12/18] expandable menu of options to declutter table --- src/languages/en-us.ts | 1 + src/routes/wishlist/index.js | 2 +- src/static/css/main.css | 24 ++++- src/static/js/wishlist.js | 5 ++ src/views/wishlist.pug | 165 ++++++++++++++++++----------------- 5 files changed, 113 insertions(+), 84 deletions(-) diff --git a/src/languages/en-us.ts b/src/languages/en-us.ts index 8353094a..ef5e2592 100644 --- a/src/languages/en-us.ts +++ b/src/languages/en-us.ts @@ -221,6 +221,7 @@ export const strings = { WISHLIST_ARCHIVE_GUARD: 'You are not allowed to archive this item', WISHLIST_RESTORE_GUARD: 'You are not allowed to restore this item', WISHLIST_DELETE_CONFIRM: 'Are you sure you want to delete this item?', + WISHLIST_ITEM_OPTIONS: 'Options', WISHLISTS_COUNTS_SELF: name => `${name}: ???/???`, WISHLISTS_COUNTS: (name, pledged, total) => `${name}: ${pledged}/${total}`, WISHLISTS_TITLE: `${_CC.config.siteTitle} - Wishlists`, diff --git a/src/routes/wishlist/index.js b/src/routes/wishlist/index.js index f9f78fd0..6410a169 100644 --- a/src/routes/wishlist/index.js +++ b/src/routes/wishlist/index.js @@ -35,6 +35,7 @@ export default function (db) { if (row.doc.admin) return res.redirect(`/wishlist/${row.doc._id}`) } } + console.log(docs) res.render('wishlists', { title: _CC.lang('WISHLISTS_TITLE'), users: docs.rows, totals }) }) @@ -100,7 +101,6 @@ export default function (db) { } catch (error) { req.flash('error', `${error}`) } - res.redirect(`/wishlist/${req.params.user}`) }) diff --git a/src/static/css/main.css b/src/static/css/main.css index 9ca5fa78..203e9805 100644 --- a/src/static/css/main.css +++ b/src/static/css/main.css @@ -73,4 +73,26 @@ summary{ summary:hover { cursor: pointer; -} \ No newline at end of file +} + +.hamburger { + font-size: 24px; + background: none; + border: none; + cursor: pointer; +} + +.hidden-menu { + display: none; + margin-top: 10px; +} + +.hidden-menu button { + display: block; + margin: 5px 0; +} + +.hidden-menu.active { + display: block; +} + diff --git a/src/static/js/wishlist.js b/src/static/js/wishlist.js index 07ae70d0..deaaf423 100644 --- a/src/static/js/wishlist.js +++ b/src/static/js/wishlist.js @@ -149,3 +149,8 @@ document.addEventListener('DOMContentLoaded', () => { updateArrow('price', sortBy) }) }) + +function toggleMenu(button) { + const menu = button.nextElementSibling; + menu.classList.toggle('active'); +} diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 13e561b7..42c01026 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -15,23 +15,17 @@ mixin wishlistTable(items, archived) th(style='width: 25%;')= lang('WISHLIST_NAME') th(style='width: 50%;')= lang('WISHLIST_NOTE') th(style='width: 10%;')= lang('WISHLIST_PRICE') - if req.params.user === req.user._id - th= lang('WISHLIST_EDIT_ITEM') th= lang('WISHLIST_ADDED_BY') if req.params.user === req.user._id && !archived - th= lang('WISHLIST_MOVE_TOP') th= lang('WISHLIST_MOVE_UP') th= lang('WISHLIST_MOVE_DOWN') - th= lang('WISHLIST_MOVE_BOTTOM') else if !archived th= lang('WISHLIST_PLEDGE') - if req.params.user === req.user._id - th= lang('WISHLIST_DELETE') if archived - th= lang('WISHLIST_RESTORE') + th= " " else - th= lang('WISHLIST_ARCHIVE') + th= " " tbody each item, index in items tr(id=item.id) @@ -67,34 +61,11 @@ mixin wishlistTable(items, archived) else td.ugc(data-label=lang('WISHLIST_NOTE'))= item.note td.ugc(data-label=lang('WISHLIST_PRICE'))= item.price - if req.params.user === req.user._id - td(data-label=lang('WISHLIST_EDIT_ITEM')) - form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;' - disabled=item.addedBy !== req.user._id - ) - span.icon - i.far.fa-edit if item.addedBy === '_CCUNKNOWN' td.ugc(data-label=lang('WISHLIST_ADDED_BY'))= lang('WISHLIST_ADDED_BY_GUEST') else td.ugc(data-label=lang('WISHLIST_ADDED_BY'))= item.addedBy if req.params.user === req.user._id && !archived - td(data-label=lang('WISHLIST_MOVE_ITEM_TOP')) - form.topForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/top/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=index === 0 - ) - span.icon - i.fas.fa-angle-double-up td(data-label=lang('WISHLIST_MOVE_ITEM_UP')) form.upForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/up/${item.id}`) .field.inline @@ -117,17 +88,6 @@ mixin wishlistTable(items, archived) ) 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 if !archived td(data-label=lang('WISHLIST_PLEDGE')) @@ -147,45 +107,86 @@ mixin wishlistTable(items, archived) else span.ugc=lang('WISHLIST_PLEDGED', item.pledgedBy) if req.params.user === req.user._id - td(data-label='Delete Item') - form.inline( - method='POST', - action=`${_CC.config.base}wishlist/${req.params.user}/remove/${item.id}`, - onsubmit=`return confirm("${lang('WISHLIST_DELETE_CONFIRM')}")` - ) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon - i.fas.fa-trash - if archived - td(data-label='Unarchive Item') - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unarchive/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon - i.fas.fa-undo - else - td(data-label='Archive Item') - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon - i.fas.fa-archive + td(data-label=lang('WISHLIST_ITEM_OPTIONS')) + button.hamburger(onclick="toggleMenu(this)") ☰ + //- Hidden menu of buttons + div.hidden-menu.hidden + if req.params.user === req.user._id + form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;' + disabled=item.addedBy !== req.user._id + ) + span.icon(title=lang('WISHLIST_EDIT_ITEM')) + i.far.fa-edit + if !archived + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/up/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=index === 0 + ) + span.icon(title=lang('WISHLIST_MOVE_ITEM_UP')) + i.fas.fa-arrow-up + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/down/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=index === items.length - 1 + ) + span.icon(title=lang('WISHLIST_MOVE_ITEM_DOWN')) + i.fas.fa-arrow-down + form.topForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/top/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=index === 0 + ) + span.icon(title=lang('WISHLIST_MOVE_ITEM_TOP')) + i.fas.fa-angle-double-up + 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(title=lang('WISHLIST_MOVE_ITEM_BOTTOM')) + i.fas.fa-angle-double-down + + if !archived + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon(title=lang('WISHLIST_ARCHIVE')) + i.fas.fa-archive + else + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) + .field.inline + .control.inline + button.button.is-text( + type='submit', + style='text-decoration: none;', + disabled=item.addedBy !== req.user._id + ) + span.icon(title=lang('WISHLIST_RESTORE')) + i.fas.fa-undo + mixin wishlistBox(items, archived) each item, index in items @@ -352,7 +353,7 @@ block content details summary= lang('WISHLIST_ARCHIVED_ITEMS') if global._CC.config.wishlist.table - +wishlistTable(items.filter(item => !item.archived), true) + +wishlistTable(items.filter(item => item.archived), true) else +wishlistBox(items.filter(item => item.archived), true) From 85112b6e51c262cc248849b130839219968dd18c Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Fri, 24 Jan 2025 23:01:08 -0400 Subject: [PATCH 13/18] localized sensible heading --- src/views/wishlist.pug | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 42c01026..8497b9bc 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -22,10 +22,7 @@ mixin wishlistTable(items, archived) else if !archived th= lang('WISHLIST_PLEDGE') - if archived - th= " " - else - th= " " + th= lang('WISHLIST_ITEM_OPTIONS') tbody each item, index in items tr(id=item.id) From 9405ff2f15adc26b1355f6d83ef9ec4ee32a67f9 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 28 Jan 2025 21:45:36 -0400 Subject: [PATCH 14/18] fix linting issues --- src/static/css/main.css | 29 ++++++++++++++--------------- src/static/js/wishlist.js | 6 +++--- src/structures/Wishlist.js | 5 ++--- src/views/wishlist.pug | 2 +- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/static/css/main.css b/src/static/css/main.css index 5446d480..becce2f6 100644 --- a/src/static/css/main.css +++ b/src/static/css/main.css @@ -110,36 +110,35 @@ img.logo-image { } .print-gift:last-child { - margin-bottom: 0; + margin-bottom: 0; } -summary{ - font-weight: bold; - font-size: 18px; - } +summary { + font-weight: bold; + font-size: 18px; +} summary:hover { cursor: pointer; } .hamburger { - font-size: 24px; - background: none; - border: none; - cursor: pointer; + font-size: 24px; + background: none; + border: none; + cursor: pointer; } .hidden-menu { - display: none; - margin-top: 10px; + display: none; + margin-top: 10px; } .hidden-menu button { - display: block; - margin: 5px 0; + display: block; + margin: 5px 0; } .hidden-menu.active { - display: block; + display: block; } - diff --git a/src/static/js/wishlist.js b/src/static/js/wishlist.js index aa4e3a0f..79806e3f 100644 --- a/src/static/js/wishlist.js +++ b/src/static/js/wishlist.js @@ -164,7 +164,7 @@ document.addEventListener('DOMContentLoaded', () => { }) }) -function toggleMenu(button) { - const menu = button.nextElementSibling; - menu.classList.toggle('active'); +function _toggleMenu(button) { + const menu = button.nextElementSibling + menu.classList.toggle('active') } diff --git a/src/structures/Wishlist.js b/src/structures/Wishlist.js index baf6f892..886dd115 100644 --- a/src/structures/Wishlist.js +++ b/src/structures/Wishlist.js @@ -188,18 +188,17 @@ export class Wishlist { await this.save() } - async archive (id) { + async archive(id) { const item = await this.get(id) item.archived = true await this.save() } - async restore (id) { + async restore(id) { const item = await this.get(id) item.archived = false await this.save() } - } function parseURL(string) { diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 8497b9bc..59ee45a0 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -105,7 +105,7 @@ mixin wishlistTable(items, archived) span.ugc=lang('WISHLIST_PLEDGED', item.pledgedBy) if req.params.user === req.user._id td(data-label=lang('WISHLIST_ITEM_OPTIONS')) - button.hamburger(onclick="toggleMenu(this)") ☰ + button.hamburger(onclick="_toggleMenu(this)") ☰ //- Hidden menu of buttons div.hidden-menu.hidden if req.params.user === req.user._id From 1b2f5067efb38382985fdfcd480f4674b8114d90 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 28 Jan 2025 21:45:47 -0400 Subject: [PATCH 15/18] add linting convenience script --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index afab656c..c5f61c4b 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "dev": "nodemon --watch src -e ts,js --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" + "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", + "lint": "eslint src && prettier . --write" }, "author": "Wingysam ", "license": "AGPL-3.0", From afe5a84c693ec75317503d448751643e6e1c88c1 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 28 Jan 2025 23:20:20 -0400 Subject: [PATCH 16/18] discord like table options (wip) --- src/static/css/main.css | 22 +++++ src/views/wishlist.pug | 193 ++++++++++++++++------------------------ 2 files changed, 98 insertions(+), 117 deletions(-) diff --git a/src/static/css/main.css b/src/static/css/main.css index becce2f6..2ac4559f 100644 --- a/src/static/css/main.css +++ b/src/static/css/main.css @@ -142,3 +142,25 @@ summary:hover { .hidden-menu.active { display: block; } + +button.button.dropdown-item.is-text { + display: grid; + grid-template-columns: auto 1fr auto; + align-items: center; + width: 100%; + text-align: left; + padding-right: 10px; /* extra Spacing to push icons to the right a bunch */ + text-decoration: none; +} + +/* Ensure the text stays left-aligned */ +button.button.dropdown-item.is-text span { + grid-column: 1; + text-align: left; +} + +/* Ensure the icon is pulled to the right */ +button.button.dropdown-item.is-text i { + grid-column: 3; + margin-left: auto; +} diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 59ee45a0..0873ea3d 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -16,12 +16,8 @@ mixin wishlistTable(items, archived) th(style='width: 50%;')= lang('WISHLIST_NOTE') th(style='width: 10%;')= lang('WISHLIST_PRICE') th= lang('WISHLIST_ADDED_BY') - if req.params.user === req.user._id && !archived - th= lang('WISHLIST_MOVE_UP') - th= lang('WISHLIST_MOVE_DOWN') - else - if !archived - th= lang('WISHLIST_PLEDGE') + if !req.params.user === req.user._id && !archived + th= lang('WISHLIST_PLEDGE') th= lang('WISHLIST_ITEM_OPTIONS') tbody each item, index in items @@ -62,127 +58,90 @@ mixin wishlistTable(items, archived) td.ugc(data-label=lang('WISHLIST_ADDED_BY'))= lang('WISHLIST_ADDED_BY_GUEST') else td.ugc(data-label=lang('WISHLIST_ADDED_BY'))= item.addedBy - if req.params.user === req.user._id && !archived - td(data-label=lang('WISHLIST_MOVE_ITEM_UP')) - form.upForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/up/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=index === 0 - ) - span.icon - i.fas.fa-arrow-up - td(data-label=lang('WISHLIST_MOVE_ITEM_DOWN')) - form.downForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/down/${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-arrow-down - else - if !archived - td(data-label=lang('WISHLIST_PLEDGE')) - if req.params.user !== req.user._id && !item.pledgedBy - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/pledge/${item.id}`) - .field.inline - .control.inline - input.inline.button.is-primary(type='submit' value=lang('WISHLIST_PLEDGE_ITEM')) - if item.pledgedBy === req.user._id - form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unpledge/${item.id}`) - .field.inline - .control.inline - input.inline.button(type='submit' value=lang('WISHLIST_UNPLEDGE')) - if item.pledgedBy && item.pledgedBy !== req.user._id - if item.pledgedBy === '_CCUNKNOWN' - span.ugc=lang('WISHLIST_PLEDGED_GUEST') - else - span.ugc=lang('WISHLIST_PLEDGED', item.pledgedBy) + if !req.params.user === req.user._id && !archived + td(data-label=lang('WISHLIST_PLEDGE')) + if req.params.user !== req.user._id && !item.pledgedBy + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/pledge/${item.id}`) + .field.inline + .control.inline + input.inline.button.is-primary(type='submit' value=lang('WISHLIST_PLEDGE_ITEM')) + if item.pledgedBy === req.user._id + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/unpledge/${item.id}`) + .field.inline + .control.inline + input.inline.button(type='submit' value=lang('WISHLIST_UNPLEDGE')) + if item.pledgedBy && item.pledgedBy !== req.user._id + if item.pledgedBy === '_CCUNKNOWN' + span.ugc=lang('WISHLIST_PLEDGED_GUEST') + else + span.ugc=lang('WISHLIST_PLEDGED', item.pledgedBy) if req.params.user === req.user._id td(data-label=lang('WISHLIST_ITEM_OPTIONS')) - button.hamburger(onclick="_toggleMenu(this)") ☰ - //- Hidden menu of buttons - div.hidden-menu.hidden - if req.params.user === req.user._id - form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;' - disabled=item.addedBy !== req.user._id - ) - span.icon(title=lang('WISHLIST_EDIT_ITEM')) - i.far.fa-edit + div.dropdown.is-right.is-hoverable + div.dropdown-trigger + button.button.is-primary( + aria-haspopup='true', + aria-controls=`dropdown-menu${index}` + ) + span.icon + i.fas.fa-cog + div.dropdown-menu(id=`dropdown-menu${index}`, role='menu') + div.dropdown-content + form.inline(method='GET', action=`${_CC.config.base}wishlist/${req.params.user}/note/${item.id}`) + button.button.dropdown-item.is-text( + type='submit' + ) + span= lang('WISHLIST_EDIT_ITEM') + i.far.fa-edit + if !archived form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/up/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=index === 0 - ) - span.icon(title=lang('WISHLIST_MOVE_ITEM_UP')) - i.fas.fa-arrow-up + button.button.dropdown-item.is-text( + type='submit', + disabled=index === 0 + ) + span= lang('WISHLIST_MOVE_ITEM_UP') + i.fas.fa-arrow-up + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/down/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=index === items.length - 1 - ) - span.icon(title=lang('WISHLIST_MOVE_ITEM_DOWN')) - i.fas.fa-arrow-down - form.topForm.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/top/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=index === 0 - ) - span.icon(title=lang('WISHLIST_MOVE_ITEM_TOP')) - i.fas.fa-angle-double-up - 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(title=lang('WISHLIST_MOVE_ITEM_BOTTOM')) - i.fas.fa-angle-double-down + button.button.dropdown-item.is-text( + type='submit', + disabled=index === items.length - 1 + ) + span= lang('WISHLIST_MOVE_ITEM_DOWN') + i.fas.fa-arrow-down + + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/top/${item.id}`) + button.button.dropdown-item.is-text( + type='submit', + disabled=index === 0 + ) + span= lang('WISHLIST_MOVE_ITEM_TOP') + i.fas.fa-angle-double-up + form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/move/bottom/${item.id}`) + button.button.dropdown-item.is-text( + type='submit', + disabled=index === items.length - 1 + ) + span= lang('WISHLIST_MOVE_ITEM_BOTTOM') + i.fas.fa-angle-double-down + + hr.dropdown-divider if !archived form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/archive/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon(title=lang('WISHLIST_ARCHIVE')) - i.fas.fa-archive + button.button.dropdown-item.is-text.has-text-danger( + type='submit' + ) + span= lang('WISHLIST_ARCHIVE') + i.fas.fa-archive else form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/restore/${item.id}`) - .field.inline - .control.inline - button.button.is-text( - type='submit', - style='text-decoration: none;', - disabled=item.addedBy !== req.user._id - ) - span.icon(title=lang('WISHLIST_RESTORE')) - i.fas.fa-undo + button.button.dropdown-item.is-text.has-text-danger( + type='submit' + ) + span= lang('WISHLIST_RESTORE') + i.fas.fa-restore mixin wishlistBox(items, archived) From ad5b3d849f426392b5cebb7d88c91e33cda44147 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 28 Jan 2025 23:39:42 -0400 Subject: [PATCH 17/18] Possible solution for #154? --- src/views/wishlist.pug | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/views/wishlist.pug b/src/views/wishlist.pug index 0873ea3d..7c8c2591 100644 --- a/src/views/wishlist.pug +++ b/src/views/wishlist.pug @@ -11,14 +11,15 @@ mixin wishlistTable(items, archived) table.table.has-mobile-cards thead th # - th(style='width: 15%;')= lang('WISHLIST_IMAGE') - th(style='width: 25%;')= lang('WISHLIST_NAME') - th(style='width: 50%;')= lang('WISHLIST_NOTE') + th(style='width: 10%;')= lang('WISHLIST_IMAGE') + th(style='width: 20%;')= lang('WISHLIST_NAME') + th(style='width: 30%;')= lang('WISHLIST_NOTE') th(style='width: 10%;')= lang('WISHLIST_PRICE') th= lang('WISHLIST_ADDED_BY') - if !req.params.user === req.user._id && !archived - th= lang('WISHLIST_PLEDGE') - th= lang('WISHLIST_ITEM_OPTIONS') + if !(req.params.user === req.user._id) + th(style='width: 10%;')= lang('WISHLIST_PLEDGE') + else + th(style='width: 10%;')= lang('WISHLIST_ITEM_OPTIONS') tbody each item, index in items tr(id=item.id) @@ -58,9 +59,9 @@ mixin wishlistTable(items, archived) td.ugc(data-label=lang('WISHLIST_ADDED_BY'))= lang('WISHLIST_ADDED_BY_GUEST') else td.ugc(data-label=lang('WISHLIST_ADDED_BY'))= item.addedBy - if !req.params.user === req.user._id && !archived + if !(req.params.user === req.user._id) td(data-label=lang('WISHLIST_PLEDGE')) - if req.params.user !== req.user._id && !item.pledgedBy + if req.params.user !== req.user._id && !item.pledgedBy && !item.archived form.inline(method='POST', action=`${_CC.config.base}wishlist/${req.params.user}/pledge/${item.id}`) .field.inline .control.inline From 0e1132946a648fdef79a610f59aed7474f1bae42 Mon Sep 17 00:00:00 2001 From: Christopher Blake Date: Tue, 28 Jan 2025 23:39:54 -0400 Subject: [PATCH 18/18] Resolve auto archiving issue --- src/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/index.ts b/src/config/index.ts index 7df2f040..6bd092e4 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -39,7 +39,7 @@ const config = { oidcEnabled: false, pfpUploadMaxSize: process.env.UPLOAD_PFP_MAX_SIZE || 5, rootUrl: appendSlash(process.env.ROOT_URL ?? process.env.ROOT_PATH ?? '/'), - autoArchivePledges: process.env.AUTO_ARCHIVE_PLEDGES || false, + autoArchivePledges: process.env.AUTO_ARCHIVE_PLEDGES === 'true', base: '', // automatically set below }