Git Product home page Git Product logo

christmas-community's Introduction

Christmas Community

Docker Pulls Version Language Runtime

Web app for your family's Christmas shopping

Purpose

To create a simple place for your entire family to use to find gifts that people want, and to avoid double-gifting.

Screenshots

Screenshot Screenshot Screenshot Screenshot

Amazon Smile

By default, Christmas Community converts www.amazon.com links to smile.amazon.com. If you do not want this, set the environment variable SMILE to false (if you are using Docker Compose, make sure to put "false" in quotes).

Root Path

If you want put Christmas Community on a subdirectory, such as /christmas-community, set ROOT_PATH to that path.

Docker

docker run --detach --name christmas-community -p 80:80 --restart always wingysam/christmas-community

Docker Compose

---
version: "3"
services:
  christmas-community:
    image: wingysam/christmas-community
    volumes:
      - ./data:/data
    ports:
      # If you want to go to localhost:8080 to access Christmas Community,
      # use - 8080:80 instead of
      - 80:80
    environment:
      # Amazon Smile, set to 'false' to disable www.amazon.com links
      # turning into smile.amazon.com
      SMILE: 'true'
      # Table mode, set to 'false' to revert to box mode
      TABLE: 'true'
      # Single list mode
      # (for weddings, birthdays, etc. only the admin account's list is accessible)
      # Set to 'true' to enable
      SINGLE_LIST: 'false'
      # Some websites (like walmart) send headers that are larger than 8MB in
      # length. If issues are encountered, set the node.js limit to a higher
      # number than 8192
      #NODE_OPTIONS: "--max-http-header-size=32768"
    restart: always

Install

git clone https://github.com/wingysam/Christmas-Community
cd Christmas-Community
npm install

Configuration

Add environment variables with a .env. Example:

## Core Settings
# Where to store databases, can be a CouchDB compatible server or directory.
DB_PREFIX=dbs/
# Where to send someone if they need to log in
DEFAULT_FAILURE_REDIRECT=/login
# Port to listen on
PORT=80
# Expose the internal PouchDB with CouchDB API and Fauxton browser. Mostly used for debugging. Leave empty to disable.
DB_EXPOSE_PORT=
# Proxy to send item data requests to. Leave empty to disable.
PROXY_SERVER=
# Secret string to store session cookies with. Automatically generated if not provided.
SECRET=
# How long a user is logged in (milliseconds). Defaults to one week.
SESSION_MAX_AGE=604800000
# The name of the site in the <title> and navigation bar
SITE_TITLE=Christmas Community
# Used when shared to home screen
SHORT_TITLE=Christmas
# The root path for forms, CSS, and a small amount of JS. Useful when proxying.
ROOT_PATH=/
# Where to trust the X-Forwarded-For header from. Defaults to "loopback". Useful for proxying to docker.
TRUST_PROXY=loopback
# Any theme from https://jenil.github.io/bulmaswatch
BULMASWATCH=default
# Set to false to disable update notices
UPDATE_CHECK=true
# Set to false to disable the profile pictures feature
PFP=true
# Language of the interface, options listed in `languages` directory
LANGUAGE=en-US
# Password to enter guest mode,
# e.g. https://wishes.example.com?pw=ReplaceWithYourGuestPassword
# GUEST_PASSWORD=ReplaceWithYourGuestPassword

## Wishlist Settings
# Set to true to not allow users to have their own lists. You may want this for a birthday or wedding.
SINGLE_LIST=false
# Set to false to allow viewing wishlists without logging in
LISTS_PUBLIC=false
# Defaults to true. Set to false for legacy cards view.
TABLE=true
# Convert Amazon links to Amazon Smile links. A percentage of the profit goes to a charity of buyer's choice. Defaults to true.
SMILE=true
# Allow Markdown in item notes. Does not work with TABLE=false. Defaults to false.
MARKDOWN=false

## Custom HTML Snippets
# These are inserted into specific locations in the relevant page
# HTML is not escaped. Don't put untrusted data here.
# CUSTOM_HTML_LOGIN=<p style="margin-top: 1em;">Some custom text for the Login page</p>
# CUSTOM_HTML_WISHLISTS=

# Custom CSS stylesheet
# If you wish to include a custom stylesheet you can add the filename in the variable here.
# Remember to add the stylesheet to the filesystem at `static/css/custom.css`. In docker, mount `/usr/src/app/src/static/css/custom.css`.
# CUSTOM_CSS=custom.css

Default Profile Pictures

To replace the default snowman profile pictures, replace the files in static/img/default-pfps. In docker, mount /usr/src/app/src/static/img/default-pfps.

Startup

npm start

Setup

Visit / on the HTTP server to add an admin account.

Adding Sites

Christmas Community gets data about products automatically with Wingysam/get-product-data. Please submit pull requests for new sites or fixes for changes to existing sites!

Groups

Christmas Community does not yet support having multiple families in one instance. This is a planned feature that will, for example, allow you to have one group for your mom's side of the family and one group for your dad's side of the family, where both groups can access your wishlist but not each others' wishlists. A fork of Christmas Community that has this feature does exist, but most likely will not receive all new features added to the main project. It was not merged into this project because the architecture of Christmas Community prevented implementing it in a maintainable way before some refactoring is done.

Christmas-Community-Groups

About Developer

Hi, I'm Wingy. I made this app. My website is samwing.dev. Please hire me.

ko-fi

Collaborators

Wingysam
Wingysam

Contributors

Wingysam
Wingysam
PeteS4
PeteS4
cj13579
cj13579
frostyfrog
frostyfrog
dbarenholz
dbarenholz
Laeborg
Laeborg
LarsStegman
LarsStegman
BootVirtual
BootVirtual
FlatDudeInVR
FlatDudeInVR
IvySaskia
IvySaskia
mtrunt
mtrunt
Na0mir
Na0mir
ndlanier
ndlanier
RestartFU
RestartFU
dotromain
dotromain
RonnyAL
RonnyAL
CantisW
CantisW
StS82
StS82
jskiddie
jskiddie
toastie89
toastie89
zethis
zethis

christmas-community's People

Contributors

bootvirtual avatar cantisw avatar cj13579 avatar dbarenholz avatar dotromain avatar flatdudeinvr avatar frostyfrog avatar github-actions[bot] avatar ivysaskia avatar jskiddie avatar laeborg avatar larsstegman avatar mtrunt avatar na0mir avatar ndlanier avatar petes4 avatar restartfu avatar ronnyal avatar sts82 avatar toastie89 avatar wingysam avatar zethis avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

christmas-community's Issues

Request: Ability to Change Page Headers from a Customization Menu

It would be neat if one could change the Christmas Community text (in any of the spots in the attached screenshot of the login page) to something of their own choosing
image
If this feature was added, I wouldn't complain if " - Christmas Community" was appended to the custom titles or something.

Docker image for ARM64

I wanted to try it out on a RasPi, but unfortunately, there is no Docker image for arm64. Does it not work there? Do you think you could add one? 🙂

Internal Server Error after logging in; Cannot read property 'expires' of undefined in express-session

Possibly an upstream issue, as I don't see files from this project in the stack trace?

Version: 1.27.1 (9e6149c) + a tiny hack to get my modifications to get-product-name included (see bottom of the issue)

[ EXPRESS ] 10.79.0.1 - POST /login
[ EXPRESS ] 10.79.0.1 - GET /
TypeError: Cannot read property 'expires' of undefined
    at SessionStore.Store.createSession (/usr/src/app/node_modules/express-session/session/store.js:87:29)
    at inflate (/usr/src/app/node_modules/express-session/index.js:372:13)
    at /usr/src/app/node_modules/express-session/index.js:499:11
    at SessionStore.get (/usr/src/app/node_modules/session-pouchdb-store/lib/store.js:193:5)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)

Possibly related to the following stacktrace from a day earlier;

TypeError: maxAge must be a number or Date
    at Cookie.set maxAge [as maxAge] (/usr/src/app/node_modules/express-session/session/cookie.js:85:13)
    at new Cookie (/usr/src/app/node_modules/express-session/session/cookie.js:37:19)
    at SessionStore.Store.createSession (/usr/src/app/node_modules/express-session/session/store.js:90:17)
    at inflate (/usr/src/app/node_modules/express-session/index.js:372:13)
    at /usr/src/app/node_modules/express-session/index.js:499:11
    at SessionStore.get (/usr/src/app/node_modules/session-pouchdb-store/lib/store.js:187:4)
    at session (/usr/src/app/node_modules/express-session/index.js:485:11)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
    at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
    at urlencodedParser (/usr/src/app/node_modules/body-parser/lib/types/urlencoded.js:91:7)
    at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
    at /usr/src/app/node_modules/express/lib/router/index.js:284:7

[expand] My local changes for running custom get-product-name
diff --git a/Dockerfile b/Dockerfile
index e114ef1..6fc0667 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -5,8 +5,20 @@ RUN apk --no-cache add curl
 ENV NODE_ENV production
 WORKDIR /usr/src/app
 
-COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "patched-express-response.js", "./"]
-RUN npm install --production --silent
+COPY ["package.json", "npm-shrinkwrap.json*", "patched-express-response.js", "./"]
+COPY ./get-product-name ./get-product-name
+
+#RUN yarn install --force
+#RUN pushd get-product-name; yarn install --force; popd
+
+
+RUN cd get-product-name && npm install --production; cd ..
+RUN npm install --production
+RUN npm install session-pouchdb-store
+RUN npm install passport-local
+RUN npm install bcrypt-nodejs
+RUN npm install connect-flash
+RUN npm install passport
 
 COPY . .
 
@@ -19,4 +31,4 @@ ENV DB_PREFIX /data/dbs/
 
 ENV SECRET_DIRNAME /data
 
-CMD ./Dockerstart.sh
\ No newline at end of file
+CMD ./Dockerstart.sh
diff --git a/package.json b/package.json
index e4bf0e0..57de08d 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,7 @@
     "express": "4.17.1",
     "express-pouchdb": "^4.2.0",
     "express-session": "^1.17.2",
-    "get-product-name": "1",
+    "get-product-name": "file:./get-product-name",
     "jsdom": "^17.0.0",
     "lodash": "^4.17.20",
     "marked": "^3.0.3",

Hide items added by users for anonymous logins

Could you add an option in the config for hiding items that are added by others registered users to anonymous logins please?
The goal is to avoid ruining surprise for someone clicking on his/her personal wishlist without noticing he/she isn't connected.

Here is an example of what I would avoid:

  • The admin allowed public access
  • Registered user A have a wishlist and a registered account.
  • Registered user B make a suggestion in the wishlist of user A
  • Later user A go to Christmas-Community and click on his/her wishlist and see the suggested item aded by B

Obviously the public access have to be enabled to enable this issue, but for some non tech-savvy user it can be needed to do it.

Thanks!

Add doc "how to adding supported site"

Can you provide a doc to add a supported site ?
Too much site are only available in one language, so like this we can do a PR to add a new supported site :)

Thanks !

Possibility to implement groups?

Hi,

This will be my 3rd year using this. Very happy so far!

Would it be a possibility to implement groups?

In my ideal usecase I'd be able to add my SO's family to the app as well, but by using groups they won't see my parent's wishes and vice versa since they're not going to give each other any gifts.

Prices not captured from Amazon links

When adding an item with an Amazon link, the "Price" field for the item on the wish list is not populated.

For example, if I use the link
https://www.amazon.com/dp/B01N3A4070

I see a price of $19.82 on the Amazon detail page, but nothing on my wishlist entry. I've had this same issue for several Amazon items that I've added. The "Image" and "Name" fields work fine; only "Price" is not working.

I am using version 1.29.0 from the Docker image at https://hub.docker.com/r/wingysam/christmas-community/tags.

Ability to suggest an item for someone else

Currently I can only Pledge an item for someone else. But it would be nice to be able to suggest an item for someone else without being the one who buys it.

Thanks for the great app.

Possibility to anonymize/hide the ${pledgedBy}

Let say I create a wishlist to help my family before we meet around the Christmas tree.

I like the fact that I don't see the items that are pledged on my list. This keep the surprise.

I would prefer not to see the "Pledged by ${pledgedBy}" on items already pledged in other person lists.
This way, when someone take a gift under the tree, I will not know what it is and to whom it will be offered... Maybe it is me ???

Could you add this option ?

In the mean time, I patched the WISHLIST_PLEDGED in the translation file (under language).

Thank you.

disable/improve profile pictures

Please allow for disabling profile pictures and/or add more pictures and make their size much smaller (preferably in the low 10s of kbs instead of 100s).

I don't dislike the idea of profile pictures but currently there are only 10 and they're too heavy. With over 10 accounts in my database, multiple accounts are sharing the same profile picture. I think this defeats one of the main purposes of having them.

...and thank you for this great project. My family used it last year and it was a big hit. They've already told me to get it set up for Christmas this year :)

Where to crerate bind mount?

Hi, I was wondering where I should be creating a bind mount to persist data?

I have read the Readme and could not see it mentioned.

Translations

Hello !

Christmas is coming soon...
Can you please make it possible to translate the interface ?
Once done, I promise I will provide the French translation of your resource file as a pull request.

Best regards and thank you !

Pierre

Czech localization

Hi Wingysam,
Thanks for the work you're doing on this project. It's awesome! I noticed that you made support for localization, so I made the first version of the translation into Czech :)
I created czech localization, unfortunately I'm not very good with git, so I'm putting the code here :)

module.exports.momentLocale = 'cz'

module.exports.strings = {
  _NOT_LOCALIZED: key => '${key} ještě nebylo přeloženo do češtiny.',
  ADMIN_CLEAR_WISHLISTS_BUTTON: 'Odstranit všechny seznamy',
  ADMIN_CLEAR_WISHLISTS_DESCRIPTION: 'Tohle obratem <b>odstraní všechny seznamy přání!</b> Zvažte vyvoření zálohy databáze, než budete pokračovat.',
  ADMIN_CLEAR_WISHLISTS_HEADER: 'Odstanění seznamů',
  ADMIN_SETTINGS_CLEARDB_BUTTON: 'Odstranění seznamů',
  ADMIN_SETTINGS_CLEARDB_DESCRIPTION: '<b>Upozornění</b>: Tyto volby <b>odstraní data</b>! Zvažte vyvoření zálohy databáze, než budete pokračovat.',
  ADMIN_SETTINGS_CLEARDB_HEADER: 'Odstranění dat',
  ADMIN_SETTINGS_CLEARDB_SUCCESS: 'Všechny seznamy úspěšně vymazány',
  ADMIN_SETTINGS_HEADER: 'Admin Settings',
  ADMIN_SETTINGS_USERS_ADD_BUTTON: 'Přidat uživatele',
  ADMIN_SETTINGS_USERS_ADD_HEADER: 'Přidat uživatele',
  ADMIN_SETTINGS_USERS_ADD_PLACEHOLDER: 'Martin',
  ADMIN_SETTINGS_USERS_ADD_USERNAME: 'Uživatelské jméno',
  ADMIN_SETTINGS_USERS_EDIT_DELETE_FAIL_ADMIN: 'Není možné odstanit uživatele s právy správce.',
  ADMIN_SETTINGS_USERS_EDIT_DELETE_SUCCESS: name => 'Uživatel ${name} úspěšně odstraněn',
  ADMIN_SETTINGS_USERS_EDIT_DEMOTE_NOT_ADMIN: 'uživatel nemá oprávnění správce',
  ADMIN_SETTINGS_USERS_EDIT_DEMOTE_SELF: 'Nemůžete odebrat oprávění sami sobě.',
  ADMIN_SETTINGS_USERS_EDIT_DEMOTE_SUCCESS: name => '${name} už nemá oprávnění správce.',
  ADMIN_SETTINGS_USERS_EDIT_IMPERSONATE_SUCCESS: name => 'Nyní jste přihlášen jako ${name}.',
  ADMIN_SETTINGS_USERS_EDIT_NO_USERNAME_PROVIDED: 'Nevybrán žádný uživatel.',
  ADMIN_SETTINGS_USERS_EDIT_PROMOTE_ALREADY_ADMIN: 'Uživatel již má oprávnění správce.',
  ADMIN_SETTINGS_USERS_EDIT_PROMOTE_DEMOTE_NOT_FOUND: 'Uživatel nenalezen.',
  ADMIN_SETTINGS_USERS_EDIT_PROMOTE_SUCCESS: name => 'Oprávnění spravce přidělena ${name}.',
  ADMIN_SETTINGS_USERS_EDIT_RENAMED_USER: 'Uživatel přejmenován!',
  ADMIN_SETTINGS_USERS_EDIT_SAME_NAME: 'Původní uživatelské jméno je stejné jako to původní.',
  ADMIN_SETTINGS_USERS_EDIT: 'Upravit',
  ADMIN_SETTINGS_USERS_HEADER: 'Uživatelé',
  ADMIN_SETTINGS_VERSION_INFO: 'Informace o verzi',
  ADMIN_USER_EDIT_ACCOUNT_UNCONFIRMED: "Tento účet zatím ještě nebyl potvrzen.",
  ADMIN_USER_EDIT_ADMIN_ISADMIN: name => '${name} je spravcem.',
  ADMIN_USER_EDIT_ADMIN_NOTADMIN: name => '${name} není správcem.',
  ADMIN_USER_EDIT_ADMIN: 'Správce',
  ADMIN_USER_EDIT_CHANGE_NAME: 'Změnit jméno',
  ADMIN_USER_EDIT_CHANGE_USERNAME: 'Změnit přihlašovací jméno',
  ADMIN_USER_EDIT_CONFIRMATION_LINK: 'Potvrzovací odkaz',
  ADMIN_USER_EDIT_DELETE_ADMIN: 'Uživatel je spávce',
  ADMIN_USER_EDIT_DELETE_HEADER: 'Nezvratné odstranění',
  ADMIN_USER_EDIT_DELETE_USER: name => 'Odstranit uživatele ${name}',
  ADMIN_USER_EDIT_DEMOTE_SELF: 'Nemůžete odebrat oprávění sami sobě.',
  ADMIN_USER_EDIT_DEMOTE: name => 'Odebrat oprávnění ${name}',
  ADMIN_USER_EDIT_EDITING_USER: name => 'Úprava uživatele "${name}"',
  ADMIN_USER_EDIT_GENERATE_NEW_LINK: 'Vygenerovat nový odkaz',
  ADMIN_USER_EDIT_IMPERSONATE_BUTTON: name => 'Přihlásit se jako ${name}',
  ADMIN_USER_EDIT_IMPERSONATE_HEADER: 'Přihlásit se jako',
  ADMIN_USER_EDIT_LINK_EXPIRY_FUTURE: fromNow => 'Platnost odkazu vyprší ${fromNow}', // fromNow is localized by moment
  ADMIN_USER_EDIT_LINK_EXPIRY_PAST: fromNow => 'Platnost odkazu vypršela ${fromNow}',
  ADMIN_USER_EDIT_PROMOTE: name => 'Přidat oprávnění ${name}',
  ADMIN_USER_EDIT_RESET_PASSWORD_HASLINK_EXPIRY_FUTURE: fromNow => 'Vyprší ${fromNow}',
  ADMIN_USER_EDIT_RESET_PASSWORD_HASLINK_EXPIRY_PAST: fromNow => 'Vypršelo ${fromNow}',
  ADMIN_USER_EDIT_RESET_PASSWORD_HASLINK: 'Zde je odkaz na obnovení hesla pro uživatele.',
  ADMIN_USER_EDIT_RESET_PASSWORD_HEADER: 'Obnovit heslo',
  ADMIN_USER_EDIT_RESET_PASSWORD_LINK_CANCEL: 'Zneplatnit odkaz na obnovení hesla',
  ADMIN_USER_EDIT_RESET_PASSWORD_LINK_CREATE: 'Vytvořit odkaz na obnovení hesla',
  ADMIN_USER_EDIT_RESET_PASSWORD_LINK_REFRESH: 'Obnovit odkaz na obnovení hesla',
  ADMIN_USER_EDIT_USERNAME: 'Uživatelské jméno',
  BACK_BUTTON: 'Zpět',
  CONFIRM_ACCOUNT_EXPIRED: 'Váš odkaz pro vytvoření účtu vypršel. Zažádejte si o nový.',
  CONFIRM_ACCOUNT_HEADER_INVALID: '${_CC.config.siteTitle} | Neplatný potvrzovací odkaz',
  CONFIRM_ACCOUNT_HEADER_VALID: '${_CC.config.siteTitle} | Potvrdit vytvoření účtu',
  CONFIRM_ACCOUNT_INVALID: "Tento potvrzovací odkaz není platný. Účet mohl být vymazán neco odkaz nebyl zpopírován celý.",
  CONFIRM_ACCOUNT_SET_PW_BUTTON: 'Join ${_CC.config.siteTitle}',
  CONFIRM_ACCOUNT_SET_PW_PLACEHOLDER: 'hEsl0!',
  CONFIRM_ACCOUNT_SET_PW_TEXT: name => 'Ahoj ${name}! Prosím nastavte si zde heslo.',
  CONFIRM_ACCOUNT_SUCCESS: 'Vítejte na ${_CC.config.siteTitle}!',
  LOGIN_BUTTON: 'Přihlásit',
  LOGIN_PASSWORD_PLACEHOLDER: 'hEsl0!',
  LOGIN_PASSWORD: 'Heslo',
  LOGIN_USERNAME_PLACEHOLDER: 'Martin',
  LOGIN_USERNAME: 'Uživatelské jméno',
  LOGOUT_BUTTON: 'Odhlásit',
  NAVBAR_ADMIN: 'Správa',
  NAVBAR_LOGIN: 'Přihlásit',
  NAVBAR_LOGOUT: 'Odhlásit',
  NAVBAR_PROFILE: 'Profil',
  NAVBAR_WISHLIST: 'Můj seznam přání',
  NOTE_BACK: name => 'Zpět na ${name} seznam přání',
  NOTE_GET_PRODUCT_DATA: 'Získat data o produktu',
  NOTE_GUARD: 'Neplatné uživatelské jméno',
  NOTE_IMAGE_URL: 'URL obrázku',
  NOTE_MISSING_PROP: prop => 'Chybí vlastnost: ${prop}', // not really possible to localize this unfortunately
  NOTE_NAME: 'Jméno',
  NOTE_NOTE: 'Poznámka',
  NOTE_PRICE: 'Cena',
  NOTE_REFRESH_DATA: 'Obnovit data',
  NOTE_REMOVE_GUARD: 'Neplatné uživatelské jméno',
  NOTE_REMOVE_MISSING: 'Nemá žádnou poznámku',
  NOTE_REMOVE_SUCCESS: 'Poznámka úspěšně odstraněna',
  NOTE_SAVE_BUTTON: 'Uložit položku',
  NOTE_SUCCESS: 'Úspěšně uloženo!',
  NOTE_URL: 'URL',
  PROFILE_HEADER: 'Profil',
  PROFILE_PASSWORD_BUTTON: 'Uložit',
  PROFILE_PASSWORD_NEW: 'Nové heslo',
  PROFILE_PASSWORD_OLD_MISMATCH: 'Nesprávné původní heslo',
  PROFILE_PASSWORD_OLD: 'Původní heslo',
  PROFILE_PASSWORD_PLACEHOLDER: 'hEsl0!',
  PROFILE_PASSWORD_REQUIRED_NEW: 'Nevyplněno nové heslo',
  PROFILE_PASSWORD_REQUIRED_OLD: 'Nevyplněno původní heslo',
  PROFILE_PASSWORD_SUCCESS: 'Heslo úspěšně změněno!',
  PROFILE_PASSWORD_TITLE: name => 'Nastavení profilu - Heslo - ${name}',
  PROFILE_PFP_IMAGE_URL: 'URL obrázku',
  PROFILE_SAVE_PFP_DISABLED: 'Profilové obrázky jsou zakázané',
  PROFILE_SAVE_PFP_SUCCESS: 'Profilový obrázek úspěšně uložen!',
  PROFILE_SECURITY_CHANGE_PASSWORD: 'Změnit heslo',
  PROFILE_SECURITY: 'Zabezpečení',
  PROFILE_TITLE: name => 'Nastavení profilu - ${name}',
  RESET_PASSWORD_BUTTON: 'Obnovení hesla',
  RESET_PASSWORD_GREETING_EXPIRED: 'Platnost Vašeho odkazu pro obnovení hesla vypršela. Požádejte si o nový.',
  RESET_PASSWORD_GREETING_INVALID: "Tento odkaz pro obnovení hesla není platný. Účet mohl být vymazán neco odkaz nebyl zpopírován celý.",
  RESET_PASSWORD_GREETING_VALID: name => 'Ahoj ${name}! Prosím nastavte si zde heslo.',
  RESET_PASSWORD_HEADER_INVALID: '${_CC.config.siteTitle} | Neplatný odkaz pro obnovení hesla',
  RESET_PASSWORD_HEADER_VALID: '${_CC.config.siteTitle} | Obnovit heslo',
  RESET_PASSWORD_PASSWORD_PLACEHOLDER: 'hEsl0!',
  RESET_PASSWORD_PASSWORD: 'Heslo',
  RESET_PASSWORD_SUCCESS: 'Heslo úspěšně obnoveno',
  SETUP_ADMIN_USER: 'Správce',
  SETUP_BUTTON: 'Nastavit!',
  SETUP_HEADER: 'Nastavení',
  SETUP_PASSWORD_PLACEHOLDER: 'hEsl0!',
  SETUP_PASSWORD: 'Heslo',
  SETUP_USERNAME_PLACEHOLDER: 'Martin',
  SETUP_USERNAME: 'Uživatelské jméno',
  SUPPORTED_SITES_HEADER: 'Podporované obchody',
  SUPPORTED_SITES_TEXT: 'Nefunguje obchod nebo úplně chybí? Založ nový ticket <a href="https://gitlab.com/wingysam/get-product-name/-/issues/new">ZDE</a>! :)',
  UPDATE_NOTICE: (current, latest) => '
    <span class="has-text-danger is-size-4 has-text-weight-bold">
      Nepoužíváte poslední verzi Christmas Community. V nové verzi mohou být nové funkce nebo opravy chyb. Zvžte aktualizaci :)
    </span>
    <br>
    <span>(Tuto notifikaci můžete vypnout změnou v konfiguračním souboru <code>UPDATE_CHECK=false</code>)</span>
    <br><br>
    <span>Stavající verze: ${current}</span>
    <br>
    <span>Aktuální verze: ${latest}</span>
    <span class="has-text-info" style="float: right;">Tato notifikace se zobrazuje pouze správcům.</span>',
  WISHLIST_ADD: 'Přidat položku na seznam přání',
  WISHLIST_ADDED_BY_USER: addedBy => 'Přidáno: ${addedBy}',
  WISHLIST_ADDED_BY: 'Přidáno',
  WISHLIST_CONFLICT: 'Položky byly přidány příliš rychle po sobě. Zkuste to znovu.',
  WISHLIST_DELETE: 'Odstranit',
  WISHLIST_EDIT_ITEM: 'Upravit',
  WISHLIST_IMAGE: 'Obrázek',
  WISHLIST_MOVE_DOWN: 'Posunout dolů',
  WISHLIST_MOVE_GUARD: 'Nesprávný uživatel',
  WISHLIST_MOVE_INVALID: 'Nepovoleny posun',
  WISHLIST_MOVE_ITEM_DOWN: 'Posunout dolů',
  WISHLIST_MOVE_ITEM_TOP: 'Posunout až nahoru',
  WISHLIST_MOVE_ITEM_UP: 'Posunout nahoru',
  WISHLIST_MOVE_SUCCESS: 'Úspěšně přesunuto!',
  WISHLIST_MOVE_TOP: 'Posunout až nahoru',
  WISHLIST_MOVE_UP: 'Posunout nahoru',
  WISHLIST_NAME: 'Jméno',
  WISHLIST_NOTE: 'Poznámka',
  WISHLIST_OPTIONAL: 'Nepovinné',
  WISHLIST_PLEDGE_DUPLICATE: 'Item already pledged for',
  WISHLIST_PLEDGE_ITEM: 'Rezervovat',
  WISHLIST_PLEDGE_SUCCESS: 'Úspěšně zarezervováno!',
  WISHLIST_PLEDGE: 'Rezervovat',
  WISHLIST_PLEDGED: pledgedBy => 'Zarezervováno ${pledgedBy}',
  WISHLIST_PRICE: 'Cena',
  WISHLIST_REFRESH_GUARD: 'Neplatné uživatelské jméno',
  WISHLIST_REFRESH_NO_URL: 'Položka nená žádný odkaz.',
  WISHLIST_REFRESH_SUCCESS: 'Data zaktualizována!',
  WISHLIST_REMOVE_GUARD: 'Nesprávný uživatel',
  WISHLIST_REMOVE_MISSING: 'Položka nenalezena',
  WISHLIST_REMOVE_SUCCESS: 'Úspěšně odebráno ze seznamu',
  WISHLIST_TITLE: name => '${_CC.config.siteTitle} - Seznam přání - ${name}',
  WISHLIST_UNPLEDGE_GUARD: 'You did not pledge for this', // should never happen unless someone makes their own http requests
  WISHLIST_UNPLEDGE_MISSING: 'Položka nenalezena',
  WISHLIST_UNPLEDGE_SUCCESS: 'Rezervace zrušena!',
  WISHLIST_UNPLEDGE: 'Zrušit rezervaci',
  WISHLIST_URL_LABEL: 'Jméno položky nebo odkaz na ni (odkazy na CZ obchody nefunkční) (<a href="/supported-sites">Podporované obchody</a>)',
  WISHLIST_URL_PLACEHOLDER: 'https://www.amazon.com/dp/B00ZV9RDKK',
  WISHLIST_URL_REQUIRED: 'Nevyplněna položka nebo odkaz na ni.',
  WISHLISTS_COUNTS_SELF: name => '${name}: ???/???',
  WISHLISTS_COUNTS: (name, pledged, total) => '${name}: ${pledged}/${total}',
  WISHLISTS_TITLE: '${_CC.config.siteTitle} - Seznamy přání'
} 

Migrate to SQLite

Christmas Community should use SQLite rather than PouchDB. This may fix #6.

TOTP-based MFA

Christmas Community should allow users to sign in with TOTP 2FA codes.

Supported Sites

Hey there,
Is it possible to disable Supported Sites ?
I want my users can make any link and be clikable.
Or link in "notes" can be clikable

Thanks

How to set an initial admin password

When I start the docker-compose stack, I get a login prompt but I haven't found a way to set up an admin user with a password. I've run the docker-compose.yaml stack here from the repository. When I get to / I get automatically redirected to the /login prompt. Any hints are appreciated.

can't delete items from wishlist

Hello,

I have the issue that I can't delete items from my wishlist. I receive the following error message: Error: Failed to find item

I can add, update or move items. I tried to call the delete url (/wishlist/user/delete/id) but it fails: Cannot GET /wishlist/user/delete/id

:-/

Request: Automatically Update Item Prices

Currently, an item's price is pulled from the source website when it is first added to a user's wishlist and never updated again. This can result in inaccurate prices in CC, especially for items added around the Holidays, which tends to see more volatile prices.

If the items on a list could be pinged whenever a list is loaded to have prices updated, that would be beneficial.

Request: Ability to Generate a Generic Invitation URL

A generic invitation URL would work wonders when first launching this list. Instead of setting up users manually, could one generate a URL like wishlist.website/joinrandomstringorwhatever that would allow whoever opened it to create their own username and password?

Web url too may redirects

Hello,
Thank you for an amazing wish list manager.

I have mine on a docker container which works great when I access via local_ip:port number

In order to get this online, I registered with no-ip and have my router register via dynamic dnd (ddns) and forward the port.

So now I have a url like no-ip-url:port-no/wishlist. This works great once on the login page and then no longer works with "too many redirects". However the local ip method works.

Is this setup sound right or am I missing a step.

Thank you!

It

Suggestion: "Add items" button/popup

How about a button at the top of the list that says "add an item to your wishlist" (or is just a +)? This button could open a pop-up with two boxes and two buttons:

One box for the URL or item name
One box for the notes
One button to cancel (close the popup)
One Submit button

The popup could then display a success or failure message, and display two new buttons:

One button to review the list (closing the popup)
One button to add another item (restarting the process)

Guest mode with pledging

So my family hasn't been playing ball with using this. My wife is onboard, but just about everybody else seems to find it a little obnoxious that they have to create an account and that I won't just give them an amazon wishlist (the whole point of this for me was to move away from that).

I've been trying to think of a more friendly way for people to do this and feel like there's less effort involved. I've switched my instance to public, which I don't love but it'll have to do for now. But I think I've thought of a way that might be a little more friendly.

Login page either accepts users or a universal guest password that I could provide along with the URL to family members.

Guest password allows everybody to see everything -- so users with an account might not want to use it!

Pledging still works, but opens a text field where people need to write their names in. Assuming this is still shared within a small community of people, none of these names should be a surprise.

I realize this is a pretty big feature, but I thought I would float it. I still like an appreciate this and will continue to use it whether everybody else likes it or not :)

Drag/Drop Wishlist Reordering

    I'm not sure that it's necessary but I'd be willing to implement a PR to add drag/drop reordering.

Originally posted by @Wingysam in #53 (comment)

I don't know if this is necessary but it probably is worth the increased complexity. I'm willing to merge a PR if someone were to implement this.

Mobile layout issue

Dropdown/Expansion arrows are squished into the progress bars.
To click the drop down arrows you have to tap above the progress bar.

Collapsible wishlists page

Interested in a feature/UI change that allows you to view each users list from the main screen by collapsing each users section.

image

Add a Configuration Page

Environment variables should generally be optionally replaced by a configuration page. When the environment variable is set, the relevant input on the configuration page should be disabled and locked to the configured value.

Private wishlist

Hi,
It would be nice to allow users to create "private" wishlists.
Usecase example: All the family use Christmas-Community for birthdays, christmas etc. So everyone already have an account and can see the list of eachh others. But I would like to create a hidden wishlist for my girlfriend with all the things I can purchase as a present for future occasion without her to be able to see it.
Hidden wishlist allow to keep the surprise for who will receive the gift but keep the utility of sharing lists with others members.

PS: Thanks for your great work!

TypeScript

When I started building Christmas Community as a 13-year-old learning JavaScript, I didn't see the value of TypeScript. The project is somewhat large at this point, so an incremental migration is ideal. What is the best way to go about this?

"You did not pledge for this"

If someone adds an item to someone else's wishlist without pledging for it then tries to delete the item, this error is thrown.
image

Usernames should be case-insensitive

Hello,
I noticed this in the following mobile browser:
Chrome 96.0.4664.116
iOS 15.1.1

The first letter of the username comes up as Uppercase by default(see Uppercase arrow highlighted). I do not see this in the desktop browser. Is this browser related? This usually results in invalid username or password, if the username is first letter lower case, and the user may not know what the issue is.

image

Thanks!

503 on data load for Amazon items

Version Info:
Christmas Community: v1.27.0
Get Product Data: v1.27.0
Node: v15.14.0
PID: 72

I am receiving the following 503 error when attempting to add new items or refresh items from Amazon.

/usr/src/app/node_modules/get-product-name/sites/amazon.js:90
    if (!res.ok) throw new Error(`Res not ok. Status: ${res.status} ${res.statusText}`)
                       ^

Error: Res not ok. Status: 503 Service Unavailable
    at getter (/usr/src/app/node_modules/get-product-name/sites/amazon.js:90:24)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async fetchData (/usr/src/app/node_modules/get-product-name/index.js:6:16)
    at async /usr/src/app/routes/wishlist/index.js:260:27

Request: Allow adding an alternative to a item

Something like the ability to add an alternative place to buy, or a link to a different item. So far I have just been putting it in the notes, but it would be nice to have some sort of integration

Remove Passport.js

Passport is unnecessary and overly complex. Tokens for users should be stored in the database, then should be validated during http request handling.

Strikethrough on pledged items in bulleted list

My mom and my sister got confused on what was already pledged and bought my wife the same gifts haha. From a usability standpoint, formatting pledged items from the main page with a strikethrough and possibly allowing it to be a numbered list instead would be good options to include in the env variables.

Add helm chart

It would be great to install this app on a kubernetes cluster. For me the easiest way would be an official helm chart: https://helm.sh

Would it be possible to add one?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.