Merge branch 'master' into deployment-pod-ressources

This commit is contained in:
Ulf Gebhardt 2023-04-13 09:02:54 +02:00
commit 07b78e62a6
Signed by: ulfgebhardt
GPG Key ID: DA6B843E748679C9
102 changed files with 2615 additions and 5365 deletions

View File

@ -1,79 +0,0 @@
name: publish-branded
on:
repository_dispatch:
types: [trigger-build-success]
jobs:
build_branded:
name: Docker Build Branded
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
ref: ${{ github.event.client_payload.ref }}
- name: Setup env
run: echo "OCELOT_VERSION=${{ github.event.client_payload.BUILD_VERSION }}" >> $GITHUB_ENV
- name: Build branded images
run: |
deployment/scripts/branded-images.build.sh
docker save "ocelotsocialnetwork/backend-branded" > /tmp/backend-branded.tar
docker save "ocelotsocialnetwork/webapp-branded" > /tmp/webapp-branded.tar
docker save "ocelotsocialnetwork/maintenance-branded" > /tmp/maintenance-branded.tar
- name: Upload Artifact (Backend)
uses: actions/upload-artifact@v2
with:
name: docker-backend-branded
path: /tmp/backend-branded.tar
- name: Upload Artifact (Webapp)
uses: actions/upload-artifact@v2
with:
name: docker-webapp-branded
path: /tmp/webapp-branded.tar
- name: Upload Artifact (Maintenance)
uses: actions/upload-artifact@v2
with:
name: docker-maintenance-branded
path: /tmp/maintenance-branded.tar
upload_to_dockerhub:
name: Upload to Dockerhub
runs-on: ubuntu-latest
needs: [build_branded]
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
ref: ${{ github.event.client_payload.ref }}
- name: Download Docker Image (Backend)
uses: actions/download-artifact@v2
with:
name: docker-backend-branded
path: /tmp
- name: Load Docker Image
run: docker load < /tmp/backend-branded.tar
- name: Download Docker Image (Webapp)
uses: actions/download-artifact@v2
with:
name: docker-webapp-branded
path: /tmp
- name: Load Docker Image
run: docker load < /tmp/webapp-branded.tar
- name: Download Docker Image (Maintenance)
uses: actions/download-artifact@v2
with:
name: docker-maintenance-branded
path: /tmp
- name: Load Docker Image
run: docker load < /tmp/maintenance-branded.tar
- name: Upload to dockerhub
run: deployment/scripts/branded-images.upload.sh

View File

@ -292,85 +292,18 @@ jobs:
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
- run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
- name: Repository Dispatch
#- name: Repository Dispatch
# uses: peter-evans/repository-dispatch@v2
# with:
# token: ${{ github.token }}
# event-type: trigger-ocelot-build-success
# repository: ${{ github.repository }}
# client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
- name: Repository Dispatch stage.ocelot.social
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ github.token }}
event-type: trigger-build-success
repository: ${{ github.repository }}
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
# ##############################################################################
# # JOB: KUBERNETES DEPLOY ACTUAL/LATEST VERSION ######################################
# ##############################################################################
# kubernetes_deploy:
# # see example https://github.com/do-community/example-doctl-action
# # see example https://github.com/do-community/example-doctl-action/blob/main/.github/workflows/workflow.yaml
# name: Kubernetes deploy of latest version to stage.ocelot.social cluster at DigitalOcean
# runs-on: ubuntu-latest
# needs: [upload_to_dockerhub]
# steps:
# ##########################################################################
# # CHECKOUT CODE ##########################################################
# ##########################################################################
# - name: Checkout code
# uses: actions/checkout@v3
# ##########################################################################
# # SET ENVS ###############################################################
# ##########################################################################
# - name: ENV - VERSION
# run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
# - name: ENV - BUILD_VERSION
# run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
# ##########################################################################
# # Install DigitalOceans doctl and set kubeconfig #########################
# ##########################################################################
# - name: Install doctl
# uses: digitalocean/action-doctl@v2
# with:
# token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }}
# - name: Save DigitalOcean kubeconfig with short-lived credentials
# run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 cluster-stage-ocelot-social
# ##########################################################################
# # Deploy new Docker images to DigitalOcean Kubernetes cluster ############
# ##########################################################################
# # - name: Deploy 'latest' to DigitalOcean Kubernetes
# # run: |
# # kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:latest
# # kubectl -n default rollout restart deployment/ocelot-webapp
# # kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:latest
# # kubectl -n default rollout restart deployment/ocelot-backend
# # kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:latest
# # kubectl -n default rollout restart deployment/ocelot-maintenance
# # kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:latest
# # kubectl -n default rollout restart deployment/ocelot-neo4j
# - name: Deploy actual version '$BUILD_VERSION' to DigitalOcean Kubernetes
# run: |
# kubectl -n default set image deployment/ocelot-webapp container-ocelot-webapp=ocelotsocialnetwork/webapp:$BUILD_VERSION
# kubectl -n default rollout restart deployment/ocelot-webapp
# kubectl -n default set image deployment/ocelot-backend container-ocelot-backend=ocelotsocialnetwork/backend:$BUILD_VERSION
# kubectl -n default rollout restart deployment/ocelot-backend
# kubectl -n default set image deployment/ocelot-maintenance container-ocelot-maintenance=ocelotsocialnetwork/maintenance:$BUILD_VERSION
# kubectl -n default rollout restart deployment/ocelot-maintenance
# kubectl -n default set image deployment/ocelot-neo4j container-ocelot-neo4j=ocelotsocialnetwork/neo4j-community:$BUILD_VERSION
# kubectl -n default rollout restart deployment/ocelot-neo4j
# # because this step 'kubectl -n default rollout status deployment/* --timeout=600s' does not work as expected
# # and we need the pods to be up again for cleaning and seeding the Neo4j database and the backend.
# # !!! this is not a perfect solution !!!
# # deployments are regularly up again after 3 minutes and 10 seconds
# - name: Sleep for 4 minutes, means 240 seconds
# run: sleep 240s
# shell: bash
# - name: Verify deployment and wait for the pods of each deployment to get ready for cleaning and seeding of the database
# run: |
# kubectl -n default rollout status deployment/ocelot-backend --timeout=600s
# kubectl -n default rollout status deployment/ocelot-neo4j --timeout=600s
# kubectl -n default rollout status deployment/ocelot-maintenance --timeout=600s
# kubectl -n default rollout status deployment/ocelot-webapp --timeout=600s
# - name: Run migrations for Neo4j database via backend for staging
# run: |
# kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "yarn prod:migrate up"
# - name: Reset and seed Neo4j database via backend for staging
# # db cleaning and seeding is only possible in production if env 'PRODUCTION_DB_CLEAN_ALLOW=true' is set in deployment
# run: |
# kubectl -n default exec -it $(kubectl -n default get pods | grep ocelot-backend | awk '{ print $1 }') -- /bin/sh -c "node --experimental-repl-await dist/db/clean.js && node --experimental-repl-await dist/db/seed.js"
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
event-type: trigger-ocelot-build-success
repository: 'Ocelot-Social-Community/stage.ocelot.social'
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'

3
.gitmodules vendored
View File

@ -1,3 +1,6 @@
[submodule "styleguide"]
path = styleguide
url = https://github.com/Human-Connection/Nitro-Styleguide.git
[submodule "deployment/configurations/stage.ocelot.social"]
path = deployment/configurations/stage.ocelot.social
url = git@github.com:Ocelot-Social-Community/stage.ocelot.social.git

View File

@ -4,8 +4,141 @@ All notable changes to this project will be documented in this file. Dates are d
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
#### [2.5.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.5.0...2.5.1)
- feat(webapp): add tooltips to all menu icons [`#6185`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6185)
- fix(webapp): popup filter max-width [`#6177`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6177)
- Add tooltip to header notifications menu [`28505a5`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/28505a5b181008ebcde6fa58b7a4a8459a492018)
- Add tooltip to header avatar menu [`4c0469f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/4c0469f61a3c2fae23e50c6a5a2a91b63fac149a)
- Add tooltip to locale switch menu [`26b90fc`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/26b90fce4704e537126fd15ad950ea04e14890ba)
#### [2.5.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.4.0...2.5.0)
> 21 March 2023
- chore(other): release v2.5.0 [`#6172`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6172)
- fix(other): publish transmit github run number properly [`#6171`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6171)
- feat(other): deployment include GitHub run number on branded images [`#6170`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6170)
- fix(backend): new migration to create search indexes [`#6167`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6167)
- fix(other): prevent exposing secrets in the github actions by not setting debug mode on cluster deploy [`#6168`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6168)
- feat(other): echo current configuration when running scripts [`#6169`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6169)
- refactor(other): build & deployment of branded images on stage.ocelot.social [`#6163`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6163)
- fix(webapp): close popover notification menu [`#6166`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6166)
- fix(webapp): small buttons in notifications menu [`#6162`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6162)
- fix(webapp): revert pr `on newsfeed add bigger y-gap between posts #6121` [`#6164`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6164)
- fix(webapp): join leave button for pending members [`#6152`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6152)
- feat(backend): notifications for groups [`#6150`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6150)
- feat(webapp): add hint text to create and edit a post of a group aside of the save and abort buttons [`#6114`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6114)
- fix(other): use access token to trigger build on external repo [`#6145`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6145)
- feat(webapp): set different icon and text on join leave button, when member is pending [`#6124`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6124)
- refactor(other): deployment upgrade to specific version, trigger build on stage [`#6143`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6143)
- feat(webapp): show 2 GroupItem per row in GroupList [`#6135`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6135)
- fix(backend): do not delete migrations on db reset [`#6136`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6136)
- feat(other): deployment reseed [`#6129`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6129)
- feat(other): deployment secrets [`#6120`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6120)
- feat(webapp): refactor notification page [`#6116`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6116)
- fix(webapp): fix ribbons position [`#6130`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6130)
- fix(webapp): fix donation bar blink [`#6107`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6107)
- feat(webapp): change order of groups to new first [`#6122`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6122)
- fix(webapp): error in user profil on the 'show x more' button [`#6093`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6093)
- feat(webapp): filter button style change [`#6109`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6109)
- refactor(other): deactivate video recording & only upload screenshots, if tests fail for e2e tests [`#6125`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6125)
- fix(webapp): change icon color of active topics (categories) of post teaser [`#6112`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6112)
- docs(other): correct **/README.md [`#6059`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6059)
- fix(webapp): fix `viewport``width=device-width` by removing it [`#6110`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6110)
- feat(webapp): on newsfeed add bigger y-gap between posts [`#6121`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6121)
- Bump peter-evans/repository-dispatch from 1 to 2 [`#6117`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6117)
- fix(webapp): fix gap news feed [`#6065`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6065)
- feat(webapp): change shout icon `bullhorn` to `heart-o` [`#6115`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6115)
- refactor(webapp): change invite code button and menu to copy invite link [`#6108`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6108)
- feat(webapp): change group filter button text [`#6105`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6105)
- feat(webapp): 🍰 allows mark all notifications as read [`#3922`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3922)
- fix(other): deploy branded - upload to dockerhub [`#6099`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6099)
- feat(webapp): remove user from group [`#6072`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6072)
- chore(other): remove apple m1 docker overrides [`#6056`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6056)
- refactor(other): ocelot publish workflows [`#6083`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6083)
- fix(other): lint pr only on pullrequest [`#6088`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6088)
- fix(other): dependabot do not rebase [`#6096`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6096)
- feat(backend): filter posts in my groups [`#6091`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6091)
- refactor(backend): withdraw mock of gql and replace with graphql-tag function [`#6022`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6022)
- docs(other): update readme.md [`#6090`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6090)
- feat(webapp): adjust and create branding possibilities [`#6063`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6063)
- fix(other): exclude dependabot from pr title linting [`#6085`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6085)
- feat(webapp): change ``Benutzer`` to ``Nutzer`` [`#6027`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6027)
- docs(webapp): change the used nvm version [`#6023`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6023)
- feat(other): backup script [`#6051`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6051)
- fix(backend): user or group has null as description [`#5996`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5996)
- feat(other): script to set a cluster in maintenance mode [`#6042`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6042)
- feat(other): fix dependabot [`#6035`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6035)
- fix(other): fix maintenance page & maintenance build [`#6032`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6032)
- refactor(webapp): upgrade jest and vue test util [`#5968`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5968)
- refactor(other): deployment [`#5975`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5975)
- fix(webapp): remove additional markers from map [`#6021`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6021)
- feat(webapp): add align center to the user profile slug [`#6012`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6012)
- chore(other): update github actions for node 16 [`#5971`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5971)
- refactor(backend): update jest [`#5964`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5964)
- Revert "V2.3.0" [`#95`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/95)
- V2.3.0 [`#94`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/94)
- v2.3.0-281 [`#93`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/93)
- rebranding for yunite [`#26`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/26)
- feat(webapp): copy fonts from assets [`#25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/25)
- feat(webapp): copy fonts from assets [`#92`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/92)
- chore: 🍰 Release v2.2.0-267 Fixes And Groups Page Etc. [`#19`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/19)
- fix: 🍰 Change Hasttag Menu Search Color To `#17b53f` [`#21`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/21)
- chore: 🍰 Release v2.2.0-267 [`#90`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/90)
- Docu Updates [`#86`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/86)
- chore: 🍰 Release v2.1.0-253 Merge Groups Into master Epic Groups [`#12`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/12)
- chore: 🍰 Release v2.1.0-253 [`#87`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/87)
- chore: [WIP] 🍰 Release v2.0.0-250 Groups Configurable Header Menu Is Translatable Etc. [`#16`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/16)
- chore: 🍰 Release v2.0.0 Groups Etc. Extend Rebranding And Deployment [`#83`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/83)
- fix: 🍰 Fix Implementation Of Overwriting Locales [`#80`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/80)
- feat: 🍰 Merge Locales [`#77`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/77)
- chore: 🍰 Groups Release v1.1.1-231 - Show New Features [`#14`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/14)
- chore: 🍰 Release v1.1.1 First Design Rebranding [`#10`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/10)
- chore: [WIP] 🍰 Refine Rebanding And Deployment [`#8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8)
- chore: 🍰 Fix Folder Name From `branding/assets/styles/import` To `branding/assets/styles/imports` [`#71`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/71)
- chore: 🍰 Release v1.1.1-228 Refactor Rebranding [`#68`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/68)
- chore: 🍰 Release v1.1.0-205 [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6)
- chore: 🍰 Release v1.1.0-225 [`#66`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/66)
- chore: [WIP] 🍰 Refine Deployment Setup And Documentation [`#46`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/46)
- chore: [WIP] 🍰 Release v1.1.0 - Implement Categories Again [`#63`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/63)
- Update issue templates [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3)
- chore: 🍰 Release v1.0.9-199 [`#59`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/59)
- chore: 🍰 Implement `PRODUCTION_DB_CLEAN_ALLOW` for Staging Production Environments [`#56`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/56)
- chore: 🍰 Add Docker Compose Override For Apple M1 And Docu [`#57`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/57)
- Chore: 🍰 Fix `apiVersion: cert-manager.io/v1alpha2` To `*/v1` [`#53`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/53)
- chore: 🍰 Adjust `maintenance` Container Name In Deployment With Helm [`#50`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/50)
- chore: 🍰 Release New Build Version `v1.0.8-184` [`#51`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/51)
- chore: 🍰 Rename Neo4j Docker Image In General To `neo4j-community:*` [`#49`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/49)
- feat: 🍰 Release v1.0.8 Configure Cookie Expire Time second run [`#44`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/44)
- feat: 🍰 Configure Cookie Expire Time [`#43`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/43)
- docs: 🍰 Add Docs For Backups, Rollbacks, And Release v1.0.7-171 [`#40`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/40)
- chore: 🍰 Realease v1.0.6-170 [`#37`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/37)
- chore: 🍰 Refactor FAQ Link To Use Internal Page Which Was Implemented Before [`#36`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/36)
- chore: 🍰 Add Branding Templates For Terms And Conditions Etc. [`#32`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/32)
- feat: 🍰 Add Rebranded E-Mails For Sending Notifications [`#29`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/29)
- bug: 🍰 Fix Minor Errors And Clarify Docs [`#28`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/28)
- chore: 🍰 Implement New Internal Pages Main Release v1.0.5 [`#25`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/25)
- feat: [WIP] 🍰 Add Landing Page Etc. [`#22`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/22)
- docs: 🍰 [WIP] Add Configure And Rebranding Readme.md [`#20`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/20)
- chore: [WIP] 🍰 New Deployment With 'base' And 'code' Docker Images [`#15`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/15)
- feat: [WIP] 🍰 Flexible Footer Links [`#17`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/17)
- 💥 Release v1.0.3 [`#12`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/12)
- 🛠 [Refactor] Add README And LICENSE [`#11`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/11)
- chore: 🍰 Implement Use Of package.json 'Version' Etc. For Build And Refine Helm Chart [`#8`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/8)
- chore: 🍰 Replace Ocelot Logos 619x593 With 600x570 [`#6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/6)
- brand_as_default [`#4`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4)
- limit_replicasets [`#3`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3)
- Deployment [`#2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/2)
- moved example into stage.ocelot.social [`61b5112`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/61b5112b8b547a7491d644c7c4dbfead39b61d79)
- feat(backand): upgrade jest to 29.4 [`4390d72`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/4390d72477fb941f69bc9bdc24ac7713ef06e827)
- pages tests nearly working [`4850e45`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/4850e456fe5b7c158f23acc7f153576472604300)
#### [2.4.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/2.3.0...2.4.0)
> 10 February 2023
- chore(release): v2.4.0 [`#5961`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5961)
- fix(webapp): post teaser width in mobile view [`#5958`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5958)
- fix(webapp): navbar disappears when scrolling to top [`#5957`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5957)
- fix(webapp): close mobile menu on all links [`#5956`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/5956)

View File

@ -1,7 +1,7 @@
##################################################################################
# BASE (Is pushed to DockerHub for rebranding) ###################################
##################################################################################
FROM node:19.4.0-alpine3.17 as base
FROM node:19.8.1-alpine3.17 as base
# ENVs
## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame

View File

@ -1,6 +1,6 @@
{
"name": "ocelot-social-backend",
"version": "2.4.0",
"version": "2.5.1",
"description": "GraphQL Backend for ocelot.social",
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
"author": "ocelot.social Community",
@ -87,7 +87,7 @@
"mustache": "^4.2.0",
"neo4j-driver": "^4.0.2",
"neo4j-graphql-js": "^2.11.5",
"neode": "^0.4.8",
"neode": "^0.4.9",
"node-fetch": "~2.6.1",
"nodemailer": "^6.4.4",
"nodemailer-html-to-text": "^3.2.0",

View File

@ -23,6 +23,7 @@ export const cleanDatabase = async (options = {}) => {
return transaction.run(
`
MATCH (everything)
WHERE NOT 'Migration' IN labels(everything)
DETACH DELETE everything
`,
)

View File

@ -86,13 +86,6 @@ class Store {
if (CONFIG.CATEGORIES_ACTIVE) await createCategories(session)
const writeTxResultPromise = session.writeTransaction(async (txc) => {
await txc.run('CALL apoc.schema.assert({},{},true)') // drop all indices and constraints
return Promise.all(
[
'CALL db.index.fulltext.createNodeIndex("user_fulltext_search",["User"],["name", "slug"])',
'CALL db.index.fulltext.createNodeIndex("post_fulltext_search",["Post"],["title", "content"])',
'CALL db.index.fulltext.createNodeIndex("tag_fulltext_search",["Tag"],["id"])',
].map((statement) => txc.run(statement)),
)
})
try {
await writeTxResultPromise

View File

@ -0,0 +1,68 @@
import { getDriver } from '../../db/neo4j'
export const description = ''
export async function up(next) {
const driver = getDriver()
const session = driver.session()
const transaction = session.beginTransaction()
try {
// Drop indexes if they exist because due to legacy code they might be set already
const indexesResponse = await transaction.run(`CALL db.indexes()`)
const indexes = indexesResponse.records.map((record) => record.get('indexName'))
if (indexes.indexOf('user_fulltext_search') > -1) {
await transaction.run(`CALL db.index.fulltext.drop("user_fulltext_search")`)
}
if (indexes.indexOf('post_fulltext_search') > -1) {
await transaction.run(`CALL db.index.fulltext.drop("post_fulltext_search")`)
}
if (indexes.indexOf('tag_fulltext_search') > -1) {
await transaction.run(`CALL db.index.fulltext.drop("tag_fulltext_search")`)
}
// Create indexes
await transaction.run(
`CALL db.index.fulltext.createNodeIndex("user_fulltext_search",["User"],["name", "slug"])`,
)
await transaction.run(
`CALL db.index.fulltext.createNodeIndex("post_fulltext_search",["Post"],["title", "content"])`,
)
await transaction.run(
`CALL db.index.fulltext.createNodeIndex("tag_fulltext_search",["Tag"],["id"])`,
)
await transaction.commit()
next()
} catch (error) {
// eslint-disable-next-line no-console
console.log(error)
await transaction.rollback()
// eslint-disable-next-line no-console
console.log('rolled back')
throw new Error(error)
} finally {
session.close()
}
}
export async function down(next) {
const driver = getDriver()
const session = driver.session()
const transaction = session.beginTransaction()
try {
await transaction.run(`CALL db.index.fulltext.drop("user_fulltext_search")`)
await transaction.run(`CALL db.index.fulltext.drop("post_fulltext_search")`)
await transaction.run(`CALL db.index.fulltext.drop("tag_fulltext_search")`)
await transaction.commit()
next()
} catch (error) {
// eslint-disable-next-line no-console
console.log(error)
await transaction.rollback()
// eslint-disable-next-line no-console
console.log('rolled back')
throw new Error(error)
} finally {
session.close()
}
}

View File

@ -51,6 +51,50 @@ const publishNotifications = async (context, promises) => {
})
}
const handleJoinGroup = async (resolve, root, args, context, resolveInfo) => {
const { groupId, userId } = args
const user = await resolve(root, args, context, resolveInfo)
if (user) {
await publishNotifications(context, [
notifyOwnersOfGroup(groupId, userId, 'user_joined_group', context),
])
}
return user
}
const handleLeaveGroup = async (resolve, root, args, context, resolveInfo) => {
const { groupId, userId } = args
const user = await resolve(root, args, context, resolveInfo)
if (user) {
await publishNotifications(context, [
notifyOwnersOfGroup(groupId, userId, 'user_left_group', context),
])
}
return user
}
const handleChangeGroupMemberRole = async (resolve, root, args, context, resolveInfo) => {
const { groupId, userId } = args
const user = await resolve(root, args, context, resolveInfo)
if (user) {
await publishNotifications(context, [
notifyMemberOfGroup(groupId, userId, 'changed_group_member_role', context),
])
}
return user
}
const handleRemoveUserFromGroup = async (resolve, root, args, context, resolveInfo) => {
const { groupId, userId } = args
const user = await resolve(root, args, context, resolveInfo)
if (user) {
await publishNotifications(context, [
notifyMemberOfGroup(groupId, userId, 'removed_user_from_group', context),
])
}
return user
}
const handleContentDataOfPost = async (resolve, root, args, context, resolveInfo) => {
const idsOfUsers = extractMentionedUsers(args.content)
const post = await resolve(root, args, context, resolveInfo)
@ -94,6 +138,72 @@ const postAuthorOfComment = async (commentId, { context }) => {
}
}
const notifyOwnersOfGroup = async (groupId, userId, reason, context) => {
const cypher = `
MATCH (group:Group { id: $groupId })<-[membership:MEMBER_OF]-(owner:User)
WHERE membership.role = 'owner'
WITH owner, group
MERGE (group)-[notification:NOTIFIED {reason: $reason}]->(owner)
WITH group, owner, notification
SET notification.read = FALSE
SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime()))
SET notification.updatedAt = toString(datetime())
SET notification.relatedUserId = $userId
RETURN notification {.*, from: group, to: properties(owner)}
`
const session = context.driver.session()
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
const notificationTransactionResponse = await transaction.run(cypher, {
groupId,
reason,
userId,
})
return notificationTransactionResponse.records.map((record) => record.get('notification'))
})
try {
const notifications = await writeTxResultPromise
return notifications
} catch (error) {
throw new Error(error)
} finally {
session.close()
}
}
const notifyMemberOfGroup = async (groupId, userId, reason, context) => {
const { user: owner } = context
const cypher = `
MATCH (user:User { id: $userId })
MATCH (group:Group { id: $groupId })
WITH user, group
MERGE (group)-[notification:NOTIFIED {reason: $reason}]->(user)
WITH group, user, notification
SET notification.read = FALSE
SET notification.createdAt = COALESCE(notification.createdAt, toString(datetime()))
SET notification.updatedAt = toString(datetime())
SET notification.relatedUserId = $ownerId
RETURN notification {.*, from: group, to: properties(user)}
`
const session = context.driver.session()
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
const notificationTransactionResponse = await transaction.run(cypher, {
groupId,
reason,
userId,
ownerId: owner.id,
})
return notificationTransactionResponse.records.map((record) => record.get('notification'))
})
try {
const notifications = await writeTxResultPromise
return notifications
} catch (error) {
throw new Error(error)
} finally {
session.close()
}
}
const notifyUsersOfMention = async (label, id, idsOfUsers, reason, context) => {
if (!(idsOfUsers && idsOfUsers.length)) return []
await validateNotifyUsers(label, reason)
@ -188,5 +298,9 @@ export default {
UpdatePost: handleContentDataOfPost,
CreateComment: handleContentDataOfComment,
UpdateComment: handleContentDataOfComment,
JoinGroup: handleJoinGroup,
LeaveGroup: handleLeaveGroup,
ChangeGroupMemberRole: handleChangeGroupMemberRole,
RemoveUserFromGroup: handleRemoveUserFromGroup,
},
}

View File

@ -3,6 +3,13 @@ import { cleanDatabase } from '../../db/factories'
import { createTestClient } from 'apollo-server-testing'
import { getNeode, getDriver } from '../../db/neo4j'
import createServer, { pubsub } from '../../server'
import {
createGroupMutation,
joinGroupMutation,
leaveGroupMutation,
changeGroupMemberRoleMutation,
removeUserFromGroupMutation,
} from '../../graphql/groups'
let server, query, mutate, notifiedUser, authenticatedUser
let publishSpy
@ -92,6 +99,9 @@ describe('notifications', () => {
read
reason
createdAt
relatedUser {
id
}
from {
__typename
... on Post {
@ -102,6 +112,9 @@ describe('notifications', () => {
id
content
}
... on Group {
id
}
}
}
}
@ -185,6 +198,7 @@ describe('notifications', () => {
id: 'c47',
content: commentContent,
},
relatedUser: null,
},
],
},
@ -357,6 +371,7 @@ describe('notifications', () => {
id: 'p47',
content: expectedUpdatedContent,
},
relatedUser: null,
},
],
},
@ -513,6 +528,7 @@ describe('notifications', () => {
id: 'c47',
content: commentContent,
},
relatedUser: null,
},
],
},
@ -547,6 +563,7 @@ describe('notifications', () => {
id: 'c47',
content: commentContent,
},
relatedUser: null,
},
],
},
@ -616,4 +633,232 @@ describe('notifications', () => {
})
})
})
describe('group notifications', () => {
let groupOwner
beforeEach(async () => {
groupOwner = await neode.create(
'User',
{
id: 'group-owner',
name: 'Group Owner',
slug: 'group-owner',
},
{
email: 'owner@example.org',
password: '1234',
},
)
authenticatedUser = await groupOwner.toJson()
await mutate({
mutation: createGroupMutation(),
variables: {
id: 'closed-group',
name: 'The Closed Group',
about: 'Will test the closed group!',
description: 'Some description' + Array(50).join('_'),
groupType: 'public',
actionRadius: 'regional',
categoryIds,
},
})
})
describe('user joins group', () => {
beforeEach(async () => {
authenticatedUser = await notifiedUser.toJson()
await mutate({
mutation: joinGroupMutation(),
variables: {
groupId: 'closed-group',
userId: authenticatedUser.id,
},
})
authenticatedUser = await groupOwner.toJson()
})
it('has the notification in database', async () => {
await expect(
query({
query: notificationQuery,
}),
).resolves.toMatchObject({
data: {
notifications: [
{
read: false,
reason: 'user_joined_group',
createdAt: expect.any(String),
from: {
__typename: 'Group',
id: 'closed-group',
},
relatedUser: {
id: 'you',
},
},
],
},
errors: undefined,
})
})
})
describe('user leaves group', () => {
beforeEach(async () => {
authenticatedUser = await notifiedUser.toJson()
await mutate({
mutation: joinGroupMutation(),
variables: {
groupId: 'closed-group',
userId: authenticatedUser.id,
},
})
await mutate({
mutation: leaveGroupMutation(),
variables: {
groupId: 'closed-group',
userId: authenticatedUser.id,
},
})
authenticatedUser = await groupOwner.toJson()
})
it('has two the notification in database', async () => {
await expect(
query({
query: notificationQuery,
}),
).resolves.toMatchObject({
data: {
notifications: [
{
read: false,
reason: 'user_left_group',
createdAt: expect.any(String),
from: {
__typename: 'Group',
id: 'closed-group',
},
relatedUser: {
id: 'you',
},
},
{
read: false,
reason: 'user_joined_group',
createdAt: expect.any(String),
from: {
__typename: 'Group',
id: 'closed-group',
},
relatedUser: {
id: 'you',
},
},
],
},
errors: undefined,
})
})
})
describe('user role in group changes', () => {
beforeEach(async () => {
authenticatedUser = await notifiedUser.toJson()
await mutate({
mutation: joinGroupMutation(),
variables: {
groupId: 'closed-group',
userId: authenticatedUser.id,
},
})
authenticatedUser = await groupOwner.toJson()
await mutate({
mutation: changeGroupMemberRoleMutation(),
variables: {
groupId: 'closed-group',
userId: 'you',
roleInGroup: 'admin',
},
})
authenticatedUser = await notifiedUser.toJson()
})
it('has notification in database', async () => {
await expect(
query({
query: notificationQuery,
}),
).resolves.toMatchObject({
data: {
notifications: [
{
read: false,
reason: 'changed_group_member_role',
createdAt: expect.any(String),
from: {
__typename: 'Group',
id: 'closed-group',
},
relatedUser: {
id: 'group-owner',
},
},
],
},
errors: undefined,
})
})
})
describe('user is removed from group', () => {
beforeEach(async () => {
authenticatedUser = await notifiedUser.toJson()
await mutate({
mutation: joinGroupMutation(),
variables: {
groupId: 'closed-group',
userId: authenticatedUser.id,
},
})
authenticatedUser = await groupOwner.toJson()
await mutate({
mutation: removeUserFromGroupMutation(),
variables: {
groupId: 'closed-group',
userId: 'you',
},
})
authenticatedUser = await notifiedUser.toJson()
})
it('has notification in database', async () => {
await expect(
query({
query: notificationQuery,
}),
).resolves.toMatchObject({
data: {
notifications: [
{
read: false,
reason: 'removed_user_from_group',
createdAt: expect.any(String),
from: {
__typename: 'Group',
id: 'closed-group',
},
relatedUser: {
id: 'group-owner',
},
},
],
},
errors: undefined,
})
})
})
})
})

View File

@ -47,12 +47,22 @@ export default {
`
MATCH (resource {deleted: false, disabled: false})-[notification:NOTIFIED]->(user:User {id:$id})
${whereClause}
WITH user, notification, resource,
OPTIONAL MATCH (relatedUser:User { id: notification.relatedUserId })
OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(relatedUser)
WITH user, notification, resource, membership, relatedUser,
[(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts
WITH resource, user, notification, authors, posts,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0]} AS finalResource
RETURN notification {.*, from: finalResource, to: properties(user)}
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author)} ] AS posts
WITH resource, user, notification, authors, posts, relatedUser, membership,
resource {.*,
__typename: labels(resource)[0],
author: authors[0],
post: posts[0],
myRole: membership.role } AS finalResource
RETURN notification {.*,
from: finalResource,
to: properties(user),
relatedUser: properties(relatedUser)
}
${orderByClause}
${offset} ${limit}
`,
@ -81,8 +91,9 @@ export default {
WITH user, notification, resource,
[(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts
WITH resource, user, notification, authors, posts,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0]} AS finalResource
OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user)
WITH resource, user, notification, authors, posts, membership,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role } AS finalResource
RETURN notification {.*, from: finalResource, to: properties(user)}
`,
{ resourceId: args.id, id: currentUser.id },
@ -110,8 +121,9 @@ export default {
WITH user, notification, resource,
[(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts
WITH resource, user, notification, authors, posts,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0]} AS finalResource
OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user)
WITH resource, user, notification, authors, posts, membership,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role} AS finalResource
RETURN notification {.*, from: finalResource, to: properties(user)}
`,
{ id: currentUser.id },

View File

@ -397,18 +397,20 @@ describe('given some notifications', () => {
it('returns all as read', async () => {
const response = await mutate({ mutation: markAllAsReadMutation(), variables })
expect(response.data.markAllAsRead).toEqual([
{
createdAt: '2019-08-30T19:33:48.651Z',
from: { __typename: 'Comment', content: 'You have been mentioned in a comment' },
read: true,
},
{
createdAt: '2019-08-31T17:33:48.651Z',
from: { __typename: 'Post', content: 'You have been mentioned in a post' },
read: true,
},
])
expect(response.data.markAllAsRead).toEqual(
expect.arrayContaining([
{
createdAt: '2019-08-30T19:33:48.651Z',
from: { __typename: 'Comment', content: 'You have been mentioned in a comment' },
read: true,
},
{
createdAt: '2019-08-31T17:33:48.651Z',
from: { __typename: 'Post', content: 'You have been mentioned in a post' },
read: true,
},
]),
)
expect(response.errors).toBeUndefined()
})
})

View File

@ -1,5 +0,0 @@
enum ReasonNotification {
mentioned_in_post
mentioned_in_comment
commented_on_post
}

View File

@ -6,9 +6,10 @@ type NOTIFIED {
updatedAt: String!
read: Boolean
reason: NotificationReason
relatedUser: User
}
union NotificationSource = Post | Comment
union NotificationSource = Post | Comment | Group
enum NotificationOrdering {
createdAt_asc
@ -21,6 +22,10 @@ enum NotificationReason {
mentioned_in_post
mentioned_in_comment
commented_on_post
user_joined_group
user_left_group
changed_group_member_role
removed_user_from_group
}
type Query {

View File

@ -8034,17 +8034,7 @@ neo4j-driver-core@^4.4.7:
resolved "https://registry.yarnpkg.com/neo4j-driver-core/-/neo4j-driver-core-4.4.7.tgz#d2475e107b3fea2b9d1c36b0c273da5c5a291c37"
integrity sha512-NhvVuQYgG7eO/vXxRaoJfkWUNkjvIpmCIS9UWU9Bbhb4V+wCOyX/MVOXqD0Yizhs4eyIkD7x90OXb79q+vi+oA==
neo4j-driver@^4.0.1, neo4j-driver@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-4.0.2.tgz#78de3b91e91572bcbd9d2e02554322fe1ab399ea"
integrity sha512-xQN4BZZsweaNNac7FDYAV6f/JybghwY3lk4fwblS8V5KQ+DBMPe4Pthh672mp+wEYZGyzPalq5CfpcBrWaZ4Gw==
dependencies:
"@babel/runtime" "^7.5.5"
rxjs "^6.5.2"
text-encoding-utf-8 "^1.0.2"
uri-js "^4.2.2"
neo4j-driver@^4.2.2:
neo4j-driver@^4.0.1, neo4j-driver@^4.0.2, neo4j-driver@^4.2.2:
version "4.4.7"
resolved "https://registry.yarnpkg.com/neo4j-driver/-/neo4j-driver-4.4.7.tgz#51b3fb48241e66eb3be94e90032cc494c44e59f3"
integrity sha512-N7GddPhp12gVJe4eB84u5ik5SmrtRv8nH3rK47Qy7IUKnJkVEos/F1QjOJN6zt1jLnDXwDcGzCKK8XklYpzogw==
@ -8067,10 +8057,10 @@ neo4j-graphql-js@^2.11.5:
lodash "^4.17.15"
neo4j-driver "^4.0.1"
neode@^0.4.8:
version "0.4.8"
resolved "https://registry.yarnpkg.com/neode/-/neode-0.4.8.tgz#0889b4fc7f1bf0b470b01fa5b8870373b5d47ad6"
integrity sha512-pb91NfCOg4Fj5o+98H+S2XYC+ByQfbdhwcc1UVuzuUQ0Ezzj+jWz8NmKWU8ZfCH6l4plk71yDAPd2eTwpt+Xvg==
neode@^0.4.9:
version "0.4.9"
resolved "https://registry.yarnpkg.com/neode/-/neode-0.4.9.tgz#11c46c50d0348751dc6db828f3ca59252e7c247f"
integrity sha512-3RufLD2cmTXrPpvsgkEAqS3maRjXJ89vjbyYmyqJMJl5uv6gcUa32N6hRwHcqfjWRWUaFKaoGLEJLaOQobs4eA==
dependencies:
"@hapi/joi" "^15.1.1"
dotenv "^4.0.0"
@ -9496,7 +9486,7 @@ run-parallel@^1.1.9:
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
rxjs@^6.4.0, rxjs@^6.5.2, rxjs@^6.5.4:
rxjs@^6.4.0, rxjs@^6.5.4:
version "6.5.4"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
@ -10311,11 +10301,6 @@ test-exclude@^6.0.0:
glob "^7.1.4"
minimatch "^3.0.4"
text-encoding-utf-8@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13"
integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"

View File

@ -1,5 +0,0 @@
# Configure And Branding
In this folder you will find all configuration files and logo images to customise the configuration and branding of the [ocelot.social](https://github.com/Ocelot-Social-Community/Ocelot-Social) network code to your own needs.
Please change these and they will be used automatically as part of the [deployment](/deployment/README.md) process.

View File

@ -1,5 +0,0 @@
/*
*
* Here, all SCSS variables and classes can be adapted to your custom design.
*
*/

View File

@ -1 +0,0 @@
export const PROGRESS_BAR_COLOR_TYPE = 'gradient' // 'uni' is the other option

View File

@ -1,8 +0,0 @@
// this file is duplicated in `backend/src/config/` and `webapp/constants/` and replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/
export default {
SUPPORT_EMAIL: 'hello@ocelot.social',
MODERATION_EMAIL: 'hello@ocelot.social',
// ATTENTION: the following links have to be defined even for internal pages with full URLs as example like 'https://staging.ocelot.social/support', because they are used in e-mails!
ORGANIZATION_LINK: 'https://ocelot.social',
SUPPORT_LINK: 'https://ocelot.social',
}

View File

@ -1,5 +0,0 @@
// this file is duplicated in `backend/src/constants/group.js` and `webapp/constants/group.js`
export const NAME_LENGTH_MIN = 3
export const NAME_LENGTH_MAX = 50
export const DESCRIPTION_WITHOUT_HTML_LENGTH_MIN = 100 // with removed HTML tags
export const SHOW_GROUP_BUTTON_IN_HEADER = true

View File

@ -1,13 +0,0 @@
export default {
MENU: [
// {
// nameIdent: 'nameIdent',
// path: '/',
// },
// {
// nameIdent: 'nameIdent',
// url: 'https://ocelot.social',
// target: '_blank',
// },
],
}

View File

@ -1,152 +0,0 @@
// this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/constants/
import { defaultPageParamsPages } from '~/components/utils/InternalPages.js'
const ORGANIZATION = defaultPageParamsPages.ORGANIZATION.overwrite({
// if defined it's dominating
externalLink: {
url: 'https://ocelot.social',
target: '_blank',
},
internalPage: {
// footerIdent: 'site.made', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.made', // localized string identifier, if undefined default is used
// headlineIdent: 'site.made', // localized string identifier, on null it's hidden, if undefined default is used
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
const DONATE = defaultPageParamsPages.DONATE.overwrite({
// if defined it's dominating
externalLink: {
// we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly
url: 'https://ocelot-social.herokuapp.com/donations',
target: '_blank',
},
internalPage: {
// footerIdent: 'site.donate', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.donate', // localized string identifier, if undefined default is used
// headlineIdent: 'site.donate', // localized string identifier, on null it's hidden, if undefined default is used
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
const IMPRINT = defaultPageParamsPages.IMPRINT.overwrite({
// if defined it's dominating
externalLink: {
// we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly
url: 'https://ocelot-social.herokuapp.com/imprint',
target: '_blank',
},
internalPage: {
// footerIdent: 'site.imprint', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.imprint', // localized string identifier, if undefined default is used
// headlineIdent: 'site.imprint', // localized string identifier, on null it's hidden, if undefined default is used
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
const TERMS_AND_CONDITIONS = defaultPageParamsPages.TERMS_AND_CONDITIONS.overwrite({
// externalLink: null, // if defined it's dominating
internalPage: {
// footerIdent: 'site.termsAndConditions', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.termsAndConditions', // localized string identifier, if undefined default is used
// headlineIdent: 'site.termsAndConditions', // localized string identifier, on null it's hidden, if undefined default is used
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
const CODE_OF_CONDUCT = defaultPageParamsPages.CODE_OF_CONDUCT.overwrite({
// externalLink: null, // if defined it's dominating
internalPage: {
// footerIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.code-of-conduct', // localized string identifier, if undefined default is used
// headlineIdent: 'site.code-of-conduct', // localized string identifier, on null it's hidden, if undefined default is used
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
const DATA_PRIVACY = defaultPageParamsPages.DATA_PRIVACY.overwrite({
// externalLink: null, // if defined it's dominating
internalPage: {
// footerIdent: 'site.data-privacy', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.data-privacy', // localized string identifier, if undefined default is used
// headlineIdent: 'site.data-privacy', // localized string identifier, on null it's hidden, if undefined default is used
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
const FAQ = defaultPageParamsPages.FAQ.overwrite({
// externalLink: null, // if defined it's dominating
internalPage: {
// footerIdent: 'site.faq', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.faq', // localized string identifier, if undefined default is used
// headlineIdent: 'site.faq', // on null default is used, on empty string it's hidden
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
const SUPPORT = defaultPageParamsPages.SUPPORT.overwrite({
// if defined it's dominating
externalLink: {
url: 'https://ocelot.social',
target: '_blank',
},
internalPage: {
// footerIdent: 'site.support', // localized string identifier, if undefined default is used
// headTitleIdent: 'site.support', // localized string identifier, if undefined default is used
// headlineIdent: 'site.support', // on null default is used, on empty string it's hidden
hasContainer: true,
hasBaseCard: true,
hasLoginInHeader: true,
// in case internal page content is here 'branding/locales/html/'
},
})
export default {
LANDING_PAGE: '/login', // examples: '/login', '/registration', '/organization', or external 'https://ocelot.social'
// you can find and store templates for 👇🏼 at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/
ORGANIZATION,
DONATE,
IMPRINT,
TERMS_AND_CONDITIONS,
CODE_OF_CONDUCT,
DATA_PRIVACY,
FAQ,
SUPPORT,
FOOTER_LINK_LIST: [
ORGANIZATION,
TERMS_AND_CONDITIONS,
CODE_OF_CONDUCT,
DATA_PRIVACY,
FAQ,
DONATE,
IMPRINT,
SUPPORT,
],
}

View File

@ -1,24 +0,0 @@
// this file is duplicated in `backend/src/config/logos.js` and `webapp/constants/logos.js` and replaced on rebranding
// this are the paths in the webapp
export default {
LOGO_HEADER_PATH: '/img/custom/logo-horizontal.svg',
LOGO_HEADER_WIDTH: '130px',
LOGO_HEADER_CLICK: {
// externalLink: {
// url: 'https://ocelot.social',
// target: '_blank',
// },
externalLink: null,
internalPath: {
to: {
name: 'index',
},
scrollTo: '.main-navigation',
},
},
LOGO_SIGNUP_PATH: '/img/custom/logo-squared.svg',
LOGO_WELCOME_PATH: '/img/custom/logo-squared.svg',
LOGO_LOGOUT_PATH: '/img/custom/logo-squared.svg',
LOGO_PASSWORD_RESET_PATH: '/img/custom/logo-squared.svg',
LOGO_MAINTENACE_RESET_PATH: '/img/custom/logo-squared.svg',
}

View File

@ -1,9 +0,0 @@
// this file is duplicated in `backend/src/config/metadata.js` and `webapp/constants/metadata.js` and replaced on rebranding
export default {
APPLICATION_NAME: 'ocelot.social',
APPLICATION_SHORT_NAME: 'ocelot.social',
APPLICATION_DESCRIPTION: 'Ocelot Social Community',
COOKIE_NAME: 'ocelot-social-token',
ORGANIZATION_NAME: 'busFaktor e.V.',
ORGANIZATION_JURISDICTION: 'Deutschland',
}

View File

@ -1 +0,0 @@
we can put multilanguage e-mails and a layout.html in here

View File

@ -1 +0,0 @@
we can put translated e-mails in here

View File

@ -1 +0,0 @@
we can put translated e-mails in here

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Präambel
</h3>
<p>
Ich bin der Inhalt vom Verhaltenskodex.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Information über die Erhebung personenbezogener Daten
</h3>
<p>
Das hier wäre der Inhalt der Datenschutzbestimmungen.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Wohin kann ich spenden?
</h3>
<p>
Hier steht was zu den Spenden.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,67 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Wie bediene ich dieses Netzwerk?
</h3>
<p>
Hier findest Du die
<a href="https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki" target="_blank" >Bedienungsanleitung</a>.<br>
</p>
<h3>
Betreiberspezifische FAQs
</h3>
<p>
Hier steht was zu den betreiberspezifischen FAQs.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Betreiber
</h3>
<p>
Ich bin das Impressum.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Das Entwicklernetzwerk
</h3>
<p>
Hier wird das Netzwerk beschrieben.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Ansprechpartner
</h3>
<p>
Ich bin der Inhalt vom Support.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,61 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
Für das soziale Netzwerk Ocelot.Social Staging
</h2>
<h3>
Nutzung und Lizenz
</h3>
<p>
Ich bin der Inhalt der Seite "Nutzungsbedingungen".
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
Präambel
</h3>
<p>
I am the content of the code of conduct.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
Information about the collection of personal data
</h3>
<p>
This would be our data privacy section.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
Where can I donate?
</h3>
<p>
Here's what it says about donations.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,67 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
How do I operate this network?
</h3>
<p>
Here you can find the
<a href="https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki" target="_blank" >user manual</a>.<br>
</p>
<h3>
Operator-Specific FAQs
</h3>
<p>
Here are the operator-specific FAQs.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
Operator
</h3>
<p>
I am the imprint.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
The Developers Network
</h3>
<p>
Here the network is described.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
Contact
</h3>
<p>
I am the content of the support.
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,60 +0,0 @@
<!-- this file is replaced on rebranding by https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/locales/html/ -->
<!-- you can find and store templates at https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/tree/master/branding/templates/ -->
<div class="info-page">
<h2>
For the social network Ocelot.Social Staging
</h2>
<h3>
Use and License
</h3>
<p>
I am the content of the page "Terms And Conditions".
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 34 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 34 KiB

View File

@ -1,62 +0,0 @@
<!-- this file is a template for rebranding of 'branding/locales/html/de/faq.html' -->
<!-- template for the 'FAQ' in general -->
<div class="info-page">
<h2>
Für das soziale Netzwerk {{ organization }}
</h2>
<h3>
Wie bediene ich dieses Netzwerk?
</h3>
<p>
Hier findest Du die
<a href="https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki" target="_blank" >Bedienungsanleitung</a>.<br>
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,62 +0,0 @@
<!-- this file is a template for rebranding of 'branding/locales/html/de/faq.html' -->
<!-- template for the 'FAQ' in general -->
<div class="info-page">
<h2>
For the social network of {{ organization }}
</h2>
<h3>
How do I operate this network?
</h3>
<p>
Here you can find the
<a href="https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki" target="_blank" >user manual</a>.<br>
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,163 +0,0 @@
<!-- this file is a template for rebranding of 'branding/locales/html/en/code-of-conduct.html' -->
<!-- template for the 'Code Of Conduct' from the old HC network. in the old repo you will find other languages as well -->
<div class="info-page">
<h2>
Für das soziale Netzwerk {{ organization }}
</h2>
<h3>
Präambel
</h3>
<p>
{{ networkName}} ist ein gemeinnütziges soziales Wissens- und Aktionsnetzwerk der nächsten Generation.
Von Menschen für Menschen.
Free-Software, Open-Source, fair und transparent.
Für positiven lokalen und globalen Wandel in allen Lebensbereichen.
Wir gestalten den öffentlichen Austausch von Wissen, Ideen und Projekten völlig neu.
Die Funktionen von {{ networkName }} bringen die Menschen zusammen offline und online so dass wir die Welt zu einem besseren Ort machen können.<br>
</p>
<h3>
Zweck
</h3>
<p>
Mit diesen Verhaltensregeln regeln wir die wesentlichen Grundsätze für das Verhalten in unserem Sozialen Netzwerk.
Dabei ist die Menschenrechtscharta der Vereinten Nationen unsere Orientierung und bildet das Herz unseres Werteverständnisses.
Die Verhaltensregeln dienen als Leitsätze für den persönlichen Auftritt und den Umgang untereinander.
Wer als Nutzer im {{ networkName }} Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an.<br>
</p>
<h3>
Erwartetes Verhalten
</h3>
<p>
Die folgenden Verhaltensweisen werden von allen Community-Mitgliedern erwartet und gefordert:<br>
</p>
<ul>
<li>
Sei rücksichtsvoll und respektvoll, bei dem, was Du schreibst und tust.
</li>
<li>
Versuche auf andere zuzugehen, bevor ein Konflikt entsteht.
</li>
<li>
Vermeide erniedrigende, diskriminierende oder belästigende Verhaltensweisen und Ausdrücke.
</li>
<li>
Achte Dein Umfeld und Deine Mitmenschen. Warne die Verantwortlichen der Community, falls Du eine gefährliche Situation, jemanden in Not oder Verstöße gegen diesen Verhaltenskodex bemerkst, auch wenn diese unbedeutend erscheinen.
</li>
</ul>
<h3>
Nichtakzeptables Verhalten
</h3>
<p>
Die folgenden Verhaltensweisen sind in unserer Community inakzeptabel:<br>
</p>
<ul>
<li>
Diskriminierende Beiträge, Kommentare, Äußerungen oder Beleidigungen, insbesondere solche, die sich auf Geschlecht, sexuelle Orientierung, Rasse, Religion, politische oder weltanschauliche Ausrichtung oder Behinderung beziehen
</li>
<li>
Das Senden oder Verlinken eindeutig pornografischen Materials
</li>
<li>
Verherrlichung oder Verharmlosung grausamer oder unmenschlicher Gewalttätigkeiten
</li>
<li>
Das Veröffentlichen von personenbezogenen Daten anderer ohne deren Einverständnis oder das Androhen dessen („Doxing“)
</li>
<li>
Absichtliche Einschüchterung, Stalking oder Verfolgung
</li>
<li>
Bewerben von Produkten und Dienstleistungen mit kommerzieller Absicht
</li>
<li>
Strafbares Verhalten bzw. Verstoß gegen deutsches Recht
</li>
<li>
Befürworten oder Ermutigen zu diesen Verhaltensweisen
</li>
</ul>
<h3>
Konsequenzen inakzeptablen Verhaltens
</h3>
<p>
Wenn ein Gemeinschaftsmitglied inakzeptables Verhalten an den Tag legt, können die verantwortlichen Betreiber, Moderatoren und Administratoren des Netzwerks angemessene Maßnahmen ergreifen, u.a.:<br>
</p>
<ul>
<li>
Auffordern zum sofortigen Abstellen des inakzeptablen Verhaltens
</li>
<li>
Sperren oder Löschen von Kommentaren
</li>
<li>
Vorübergehender Ausschluss aus dem jeweiligen Beitrag
</li>
<li>
Sperren bzw. Löschen von Inhalten
</li>
<li>
Vorübergehender Entzug von Schreibrechten
</li>
<li>
Vorübergehender Ausschluss aus dem Netzwerk
</li>
<li>
Endgültiger Ausschluss aus dem Netzwerk
</li>
<li>
Verstöße gegen deutsches Recht können zur Anzeige gebracht werden.
</li>
</ul>
<p>
Wenn Du einem inakzeptablen Verhalten ausgesetzt bist, es miterlebst oder andere Bedenken hast, melde bitte so schnell wie möglich den oder die entsprechenden Inhalte an die Moderatoren.
Bitte klicke beim Beitrag, Kommentar oder Benutzer auf die drei Punkte und melde ihn über das aufgeklappte Menü.<br>
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,136 +0,0 @@
<!-- this file is a template for rebranding of 'branding/locales/html/de/terms-and-conditions.html' -->
<!-- template for the 'Terms And Conditions' from the old HC network. in the old repo you will find other languages as well -->
<div class="info-page">
<h2>
Für das soziale Netzwerk {{ organization }}
</h2>
<h3>
Nutzungsbedingungen
</h3>
<p>
Die folgenden Nutzungsbedingungen sind Basis für die Nutzung unseres {{ networkName }} Netzwerkes.
Beim Registrieren musst Du diese anerkennen und wir werden Dich auch später über ggf. stattfindende Änderungen informieren.
Unser Netzwerk wird in der {{ organizationLocation }} betrieben und unterliegt daher {{ organizationLocation2 }} Recht.
Gerichtsstand ist {{ legacyLocation }}.
Zu Details schau in unser Impressum: <a href="https://{{ networkURL }}/imprint/" target="_blank" >https://{{ networkURL }}/imprint/</a>.<br>
</p>
<h3>
Nutzung und Lizenz
</h3>
<p>
Sind Inhalte, die Du bei uns einstellst, durch Rechte am geistigen Eigentum geschützt, erteilst Du uns eine nicht-exklusive, übertragbare, unterlizenzierbare und weltweite Lizenz für die Nutzung dieser Inhalte für die Bereitstellung in unserem Netzwerk.
Diese Lizenz endet, sobald Du Deine Inhalte oder Deinen ganzen Account löscht.
Bedenke, dass andere Deine Inhalte weiter teilen können und wir diese nicht löschen können.<br>
</p>
<h3>
Datenschutz
</h3>
<p>
Unser Netzwerk ist ein soziales Wissens- und Aktionsnetzwerk.
Daher ist es uns besonders wichtig, dass möglichst viele Inhalte öffentlich zugänglich sind.
Im Laufe der Entwicklung unseres Netzwerkes wird es mehr und mehr die Möglichkeit geben, über die Sichtbarkeit der selbst angegebenen bzw. persönlichen Daten zu entscheiden.
Über diese neuen Funktionen werden wir Euch informieren.
Ansonsten gilt, dass Du immer darüber nachdenken solltest, welche persönlichen Daten Du über Dich (oder andere) preisgibst.
Dies gilt insbesondere für Inhalte von Beiträgen und Kommentaren, da diese einen weitgehend öffentlichen Charakter haben.
Später wird es Möglichkeiten geben, die Sichtbarkeit Deines Profils einzuschränken.
Teil der Nutzungsbedingungen ist unsere Datenschutzerklärung, die Dich über die einzelnen Datenverarbeitungen in unserem Netzwerk informiert: <a href="https://{{ networkURL }}/data-privacy" target="_blank">https://{{ networkURL }}/data-privacy</a>.
Unsere Datenschutzerklärung ist an die Gesetzeslage und die Charakteristika unseres Netzwerks angepasst und gilt immer in der aktuellsten Version.<br>
</p>
<h3>
Verhaltenscodex
</h3>
<p>
Unser Verhaltenskodex dient als Leitfaden für das persönliche Auftreten und den Umgang miteinander.
Wer als Nutzer im {{ networkName }} Netzwerk aktiv ist, Beiträge verfasst, kommentiert oder mit anderen Nutzern, auch außerhalb des Netzwerkes, Kontakt aufnimmt, erkennt diese Verhaltensregeln als verbindlich an. <a href="https://{{ networkURL }}/code-of-conduct" target="_blank">https://{{ networkURL }}/code-of-conduct</a><br>
</p>
<h3>
Moderation
</h3>
<p>
Bis unsere finanziellen Möglichkeiten uns erlauben, das Community-Moderationssystem zu implementieren, moderieren wir mit einem vereinfachten System und eigenen bzw. ggf. ehrenamtlichen Mitarbeitern.
Wir schulen diese Moderatoren und aus diesem Grund treffen auch nur diese entsprechende Entscheidungen.
Diese Moderatoren führen Ihre Tätigkeit anonym aus.
Du kannst uns Beiträge, Kommentare und auch Nutzer melden (wenn diese zum Beispiel in ihrem Profil Angaben machen oder Bilder haben, die diese Nutzungsbedingungen verletzen).
Wenn Du uns etwas meldest, kannst Du einen Meldegrund angeben und noch eine kurze Erläuterung mitgeben.
Wir schauen uns dann das Gemeldete an und sanktionieren ggf., z.B. indem wir Beiträge, Kommentare oder Nutzer sperren.
Du und auch der Betroffene erhalten derzeitig von uns leider noch keine Rückmeldung, das ist aber in Planung.
Unabhängig davon behalten wir uns prinzipiell Sanktionen vor aus Gründen, die unter Umständen nicht oder noch nicht in unserem Verhaltenscodex oder diesen Nutzungsbedingungen aufgeführt sind.<br>
</p>
<h3>
Fehler und Rückmeldungen
</h3>
<p>
Wir sind sehr bemüht, unser Netzwerk und unsere Daten sicher und abrufbar zu erhalten.
Jede neue Version der Software durchläuft sowohl automatisierte als auch manuelle Tests.
Es können jedoch unvorhergesehene Fehler auftreten.
Deshalb sind wir dankbar für jeden gemeldeten Fehler.
Du kannst gerne jeden von Dir entdeckten Fehler dem Support/der Hilfe-Assistenz mitteilen: <a href="https://{{ networkURL }}/support" target="_blank">https://{{ networkURL }}/support</a>.<br>
</p>
<h3>
Keine kommerzielle Nutzung
</h3>
<p>
Die Nutzung des {{ networkName }} Netzwerkes ist nicht für kommerzielle Zwecke gestattet.
Darunter fällt unter anderem das Bewerben von Produkten mit kommerzieller Absicht, das Einstellen von Affiliate-Links (Geschäftspartner-Links), direkter Aufruf zu Spenden oder finanzieller Unterstützung für Zwecke, die steuerlich nicht als gemeinnützig anerkannt sind.<br>
</p>
<h3>
Keine politische Nutzung
</h3>
<p>
Nutzerkonten von politischen Parteien oder offizielle Nutzerkonten eines politischen Vertreters sind unzulässig.<br>
</p>
<h3>
Hilfe und Fragen
</h3>
<p>
Für Hilfe und Fragen haben wir Dir eine umfassende Sammlung an häufig gestellten Fragen und Antworten (FAQ) zusammengestellt; Du findest diese auf <a href="https://{{ networkURL }}/faq" target="_blank">https://{{ networkURL }}/faq</a>.<br>
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,163 +0,0 @@
<!-- this file is a template for rebranding of 'branding/locales/html/en/code-of-conduct.html' -->
<!-- template for the 'Code Of Conduct' from the old HC network. in the old repo you will find other languages as well -->
<div class="info-page">
<h2>
For the social network of {{ organization }}
</h2>
<h3>
Präambel
</h3>
<p>
{{ networkName }} is a non-profit social knowledge and action network of the next generation.
By people - for people. Free software, open source, fair and transparent.
For positive local and global change in all areas of life.
We completely redesign the public exchange of knowledge, ideas and projects.
The functions of {{ networkName }} bring people together - offline and online - so that we can make the world a better place.<br>
</p>
<h3>
Purpose
</h3>
<p>
With these code of conduct we regulate the essential principles for behavior in our social network.
The United Nations Charter of Human Rights is our orientation and forms the heart of our understanding of values.
The code of conduct serves as guiding principles for our personal appearance and interaction with one another.
Anyone who is active as a user in the {{ networkName }} Network, writes articles, comments or contacts other users, including those outside the network,acknowledges these rules of conduct as binding.<br>
</p>
<h3>
Expected Behaviour
</h3>
<p>
The following behaviors are expected and requested of all community members:<br>
</p>
<ul>
<li>
Exercise consideration and respect in your speech and actions.
</li>
<li>
Attempt collaboration before conflict.
</li>
<li>
Refrain from demeaning, discriminatory, or harassing behavior and speech.
</li>
<li>
Be mindful of your surroundings and of your fellow participants.
Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential.
</li>
</ul>
<h3>
Unacceptable Behavior
</h3>
<p>
The following behaviors are unacceptable within our community:<br>
</p>
<ul>
<li>
Discriminatory posts, comments, utterances or insults, particularly those relating to gender, sexual orientation, race, religion, political or philosophical orientation or disability.
</li>
<li>
Posting or linking of clearly pornographic material.
</li>
<li>
Glorification or trivialization of cruel or inhuman acts of violence.
</li>
<li>
The disclosure of others' personal information without their consent or threat there of ("doxing").
</li>
<li>
Intentional intimidation, stalking or persecution.
</li>
<li>
Advertising products and services with commercial intent.
</li>
<li>
Criminal behavior or violation of German law.
</li>
<li>
Endorse or encourage such conduct.
</li>
</ul>
<h3>
Consequences of Unacceptable Behavior
</h3>
<p>
If a community member exhibits unacceptable behaviour, the responsible operators, moderators and administrators of the network may take appropriate measures, including but not limited to:<br>
</p>
<ul>
<li>
Request for immediate cessation of unacceptable conduct
</li>
<li>
Locking or deleting comments
</li>
<li>
Temporary exclusion from the respective post or contribution
</li>
<li>
Blocking or deleting of content
</li>
<li>
Temporary withdrawal of write permissions
</li>
<li>
Temporary exclusion from the network
</li>
<li>
Final exclusion from the network
</li>
<li>
Violations of German law can be reported.
</li>
</ul>
<p>
If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible and link or refer to the corresponding content.
Please click on the three dots on the post, comment or user and report it using the drop-down menu.<br>
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,135 +0,0 @@
<!-- this file is a template for rebranding of 'branding/locales/html/en/terms-and-conditions.html' -->
<!-- template for the 'Terms And Conditions' from the old HC network. in the old repo you will find other languages as well -->
<div class="info-page">
<h2>
For the social network of {{ organization }}
</h2>
<h3>
Terms of Service
</h3>
<p>
The following terms of use form the basis for the use of our network.
When you register, you must accept them and we will inform you later about any changes that may take place.
The {{ networkName }} Network is operated in Germany and is therefore subject to German law.
Place of jurisdiction is {{ organizationLocation }}.
For details see our imprint: <a href="https://{{ networkURL }}/imprint/" target="_blank" >https://{{ networkURL }}/imprint/</a><br>
</p>
<h3>
Use and License
</h3>
<p>
If any content you post to us is protected by intellectual property rights, you grant us a non-exclusive, transferable, sublicensable, worldwide license to use such content for posting to our network.
This license expires when you delete your content or your entire account.
Remember that others may share your content and we cannot delete it.<br>
</p>
<h3>
Privacy Statement
</h3>
<p>
Our network is a social knowledge and action network.
It is therefore particularly important to us that as much content as possible is publicly accessible.
In the course of the development of our network there will be more and more the possibility to decide about the visibility of the personal data.
We will inform you about these new features.
Otherwise, you should always think about which personal data you disclose about yourself (or others).
This applies in particular to the content of posts and comments, as these have a largely public character.
Later there will be possibilities to limit the visibility of your profile.
Part of the terms of service is our privacy statement, which informs you about the individual data processing operations in our network: <a href="https://{{ networkURL }}/data-privacy" target="_blank">https://{{ networkURL }}/data-privacy</a>.
Our privacy statement is adapted to the legal situation and characteristics of our network and is always valid in the most current version.<br>
</p>
<h3>
Code of Conduct
</h3>
<p>
Our code of conduct serves as a handbook for personal appearance and interaction with each other.
Whoever is active as a user in the {{ networkName }} network, writes articles, comments or makes contact with other users, even outside the network, acknowledges these rules of conduct as binding. <a href="https://{{ networkURL }}/code-of-conduct" target="_blank">https://{{ networkURL }}/code-of-conduct</a><br>
</p>
<h3>
Moderation
</h3>
<p>
Until our financial possibilities allow us to implement the community moderation system, we moderate with a simplified system and with our own or possibly volunteer staff.
We train these moderators and for this reason only they make the appropriate decisions.
These moderators carry out their work anonymously.
You can report posts, comments and users to us (for example, if they provide information in their profile or have images that violate these Terms of Use).
If you report something to us, you can give us a reason and a short explanation.
We will then take a look at what you have reported and sanction you if necessary, e.g. by blocking contributions, comments or users.
Unfortunately, you and the person concerned will not receive any feedback from us at this time, but this is in the planning stage.
Irrespective of this, we reserve the right to impose sanctions in principle for reasons that may not or not yet be listed in our Code of Conduct or these terms of service.<br>
</p>
<h3>
Errors and Feedback
</h3>
<p>
We make every effort to keep our network and data secure and available.
Each new release of the software goes through both automated and manual testing.
However, unforeseen errors may occur. Therefore, we are grateful for any reported bugs.
You are welcome to report any bugs you discover by emailing Support at <a href="https://{{ networkURL }}/support" target="_blank">https://{{ networkURL }}/support</a><br>
</p>
<h3>
No Commercial Use
</h3>
<p>
The use of the {{ networkName }} Network is not permitted for commercial purposes.
This includes, but is not limited to, advertising products with commercial intent, posting affiliate links, directly soliciting donations, or providing financial support for purposes that are not recognized as charitable for tax purposes.<br>
</p>
<h3>
No Political Use
</h3>
<p>
User accounts of political parties or official user accounts of a political representative are not permitted.<br>
</p>
<h3>
Help and Questions
</h3>
<p>
For help and questions we have compiled a comprehensive collection of frequently asked questions and answers (FAQ) for you. You can find them here: <a href="https://{{ networkURL }}/faq" target="_blank">https://{{ networkURL }}/faq</a><br>
</p>
</div>
<style type="text/css">
.info-page {
margin-bottom: 48px;
}
.info-page h2 {
margin: 24px 0;
}
.info-page h3 {
margin: 24px 0 16px 0;
}
.info-page h4 {
margin: 16px 0 8px 0;
}
.info-page p {
margin: 8px 0;
}
.info-page ul {
list-style-type: disc;
margin: 16px 0 16px 14px;
}
.info-page table {
background-color: #fff;
border: 1px solid #e0dede;
border-collapse: collapse;
box-shadow: 0 1px 3px rgba(0,0,0,.08),inset 0 0 0 1px rgba(255,255,255,.5);
margin: 16px 0;
max-width: 100%;
}
.info-page table thead {
background-color: #f0f0f0;
}
.info-page table td,
.info-page table th {
border: 1px solid #e0dede;
padding: 10px;
}
</style>

View File

@ -1,12 +0,0 @@
# please duplicate template file and rename to "dns.values.yaml" and fill in your value
provider: digitalocean
digitalocean:
# create the API token at https://cloud.digitalocean.com/account/api/tokens
# needs read + write
apiToken: "TODO"
domainFilters:
# domains you want external-dns to be able to edit
- TODO.TODO
rbac:
create: true

View File

@ -1,124 +0,0 @@
# please duplicate template file and rename to "values.yaml" and fill in your value
# change all the below if needed
MAPBOX_TOKEN: "pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g"
PRODUCTION_DB_CLEAN_ALLOW: false # only true for production environments on staging servers
PUBLIC_REGISTRATION: false
INVITE_REGISTRATION: false
COOKIE_EXPIRE_TIME: 730 # days (730 days, two years is the default in main code)
CATEGORIES_ACTIVE: false
BACKEND:
# change all the below if needed
# DOCKER_IMAGE_REPO - change that to your branded docker image
# label is appended based on .Chart.appVersion
DOCKER_IMAGE_REPO: "ocelotsocialnetwork/backend-branded"
CLIENT_URI: "https://staging.ocelot.social"
# create a new one for your network
JWT_SECRET: "b/&&7b78BF&fv/Vd"
PRIVATE_KEY_PASSPHRASE: "a7dsf78sadg87ad87sfagsadg78"
# ocelot.social mail dummy
EMAIL_DEFAULT_SENDER: "devops@ocelot.social"
SMTP_HOST: "mail.ocelot.social"
SMTP_USERNAME: "devops@ocelot.social"
SMTP_PASSWORD: "devops@ocelot.social"
SMTP_PORT: "587"
SMTP_IGNORE_TLS: 'false'
SMTP_SECURE: 'false' # true for 465, false for other ports
# or
# SMTP_PORT: "465"
# SMTP_IGNORE_TLS: 'true'
# SMTP_SECURE: 'true' # true for 465, false for other ports
# most likely you don't need to change this
MIN_READY_SECONDS: "15"
PROGRESS_DEADLINE_SECONDS: "60"
REVISIONS_HISTORY_LIMIT: "25"
CONTAINER_RESTART_POLICY: "Always"
CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30"
DOCKER_IMAGE_PULL_POLICY: "Always"
STORAGE_UPLOADS: "25Gi"
RESOURCE_REQUESTS_MEMORY: "1G"
RESOURCE_LIMITS_MEMORY: "2G"
WEBAPP:
# change all the below if needed
# DOCKER_IMAGE_REPO - change that to your branded docker image
# label is appended based on .Chart.appVersion
DOCKER_IMAGE_REPO: "ocelotsocialnetwork/webapp-branded"
WEBSOCKETS_URI: "wss://staging.ocelot.social/api/graphql"
# Most likely you don't need to change this
REPLICAS: "2"
MIN_READY_SECONDS: "15"
PROGRESS_DEADLINE_SECONDS: "60"
REVISIONS_HISTORY_LIMIT: "25"
CONTAINER_RESTART_POLICY: "Always"
CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30"
DOCKER_IMAGE_PULL_POLICY: "Always"
RESOURCE_REQUESTS_MEMORY: "1G"
RESOURCE_LIMITS_MEMORY: "2G"
NEO4J:
# most likely you don't need to change this
REVISIONS_HISTORY_LIMIT: "25"
DOCKER_IMAGE_REPO: "ocelotsocialnetwork/neo4j-community-branded"
DOCKER_IMAGE_PULL_POLICY: "Always"
CONTAINER_RESTART_POLICY: "Always"
CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30"
STORAGE: "5Gi"
RESOURCE_REQUESTS_MEMORY: "2G"
RESOURCE_LIMITS_MEMORY: "4G"
# required for Neo4j Enterprice version
#ACCEPT_LICENSE_AGREEMENT: "yes"
ACCEPT_LICENSE_AGREEMENT: "no"
AUTH: "none"
#DBMS_CONNECTOR_BOLT_THREAD_POOL_MAX_SIZE: "10000" # hc value
DBMS_CONNECTOR_BOLT_THREAD_POOL_MAX_SIZE: "400" # default value
#DBMS_MEMORY_HEAP_INITIAL_SIZE: "500MB" # HC value
DBMS_MEMORY_HEAP_INITIAL_SIZE: "" # default
#DBMS_MEMORY_HEAP_MAX_SIZE: "500MB" # HC value
DBMS_MEMORY_HEAP_MAX_SIZE: "" # default
#DBMS_MEMORY_PAGECACHE_SIZE: "490M" # HC value
DBMS_MEMORY_PAGECACHE_SIZE: "" # default
#APOC_IMPORT_FILE_ENABLED: "true" # HC value
APOC_IMPORT_FILE_ENABLED: "false" # default
DBMS_SECURITY_PROCEDURES_UNRESTRICTED: "algo.*,apoc.*"
MAINTENANCE:
# change all the below if needed
# DOCKER_IMAGE_REPO - change that to your branded docker image
# label is appended based on .Chart.appVersion
DOCKER_IMAGE_REPO: "ocelotsocialnetwork/maintenance-branded"
# Most likely you don't need to change this
REVISIONS_HISTORY_LIMIT: "25"
CONTAINER_RESTART_POLICY: "Always"
CONTAINER_TERMINATION_GRACE_PERIOD_SECONDS: "30"
DOCKER_IMAGE_PULL_POLICY: "Always"
RESOURCE_REQUESTS_MEMORY: "500M"
RESOURCE_LIMITS_MEMORY: "1G"
LETSENCRYPT:
# change all the below if needed
# ISSUER is used by cert-manager to set up certificates with the given provider.
# change it to "letsencrypt-production" once you are ready to have valid cetrificates.
# Be aware that the is an issuing limit with letsencrypt, so a dry run with staging might be wise
ISSUER: "letsencrypt-staging"
EMAIL: "devops@ocelot.social"
DOMAINS:
- "staging.ocelot.social"
- "www.staging.ocelot.social"
NGINX:
# most likely you don't need to change this
PROXY_BODY_SIZE: "10m"
STORAGE:
# change all the below if needed
PROVISIONER: "dobs.csi.digitalocean.com"
# most likely you don't need to change this
RECLAIM_POLICY: "Retain"
VOLUME_BINDING_MODE: "Immediate"
ALLOW_VOLUME_EXPANSION: true

@ -0,0 +1 @@
Subproject commit 540bd503b9401c1608ccda77bdd23fe47ba008fb

View File

@ -9,19 +9,30 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
echo "Using CONFIGURATION=${CONFIGURATION}"
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
DOCKERHUB_ORGANISATION=${DOCKERHUB_ORGANISATION:-"ocelotsocialnetwork"}
OCELOT_VERSION=${OCELOT_VERSION:-$(node -p -e "require('${SCRIPT_DIR}/../../package.json').version")}
OCELOT_GITHUB_RUN_NUMBER=${OCELOT_GITHUB_RUN_NUMBER:-master}
OCELOT_VERSION_BUILD=${OCELOT_VERSION_BUILD:-${OCELOT_VERSION}-${OCELOT_GITHUB_RUN_NUMBER}}
BRANDED_VERSION=${BRANDED_VERSION:-${GITHUB_RUN_NUMBER:-"local"}}
BUILD_DATE=${BUILD_DATE:-$(date -u +'%Y-%m-%dT%H:%M:%SZ')}
BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION}
BUILD_VERSION_BASE=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION}
BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION_BUILD}
BUILD_COMMIT=${GITHUB_SHA:-"0000000"}
# backend
docker build --target branded \
-t "${DOCKERHUB_ORGANISATION}/backend-branded:latest" \
-t "${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION}" \
-t "${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION_BUILD}" \
-t "${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION_BASE}" \
-t "${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION}" \
-f "${SCRIPT_DIR}/../src/docker/backend.Dockerfile" \
--build-arg "CONFIGURATION=${CONFIGURATION}" \
@ -33,6 +44,8 @@ docker build --target branded \
docker build --target branded \
-t "${DOCKERHUB_ORGANISATION}/webapp-branded:latest" \
-t "${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION}" \
-t "${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION_BUILD}" \
-t "${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION_BASE}" \
-t "${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION}" \
-f "${SCRIPT_DIR}/../src/docker/webapp.Dockerfile" \
--build-arg "CONFIGURATION=${CONFIGURATION}" \
@ -44,6 +57,8 @@ docker build --target branded \
docker build --target branded \
-t "${DOCKERHUB_ORGANISATION}/maintenance-branded:latest" \
-t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION}" \
-t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION_BUILD}" \
-t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION_BASE}" \
-t "${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION}" \
-f "${SCRIPT_DIR}/../src/docker/maintenance.Dockerfile" \
--build-arg "CONFIGURATION=${CONFIGURATION}" \

View File

@ -13,8 +13,11 @@ SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# configuration
DOCKERHUB_ORGANISATION=${DOCKERHUB_ORGANISATION:-"ocelotsocialnetwork"}
OCELOT_VERSION=${OCELOT_VERSION:-$(node -p -e "require('${SCRIPT_DIR}/../../package.json').version")}
OCELOT_GITHUB_RUN_NUMBER=${OCELOT_GITHUB_RUN_NUMBER:-master}
OCELOT_VERSION_BUILD=${OCELOT_VERSION_BUILD:-${OCELOT_VERSION}-${OCELOT_GITHUB_RUN_NUMBER}}
BRANDED_VERSION=${BRANDED_VERSION:-${GITHUB_RUN_NUMBER:-"local"}}
BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION}
BUILD_VERSION_BASE=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION}
BUILD_VERSION=${BRANDED_VERSION}-ocelot.social${OCELOT_VERSION_BUILD}
# login to dockerhub
echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin
@ -22,14 +25,20 @@ echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-s
# push backend images
docker push ${DOCKERHUB_ORGANISATION}/backend-branded:latest
docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION}
docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${OCELOT_VERSION_BUILD}
docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION_BASE}
docker push ${DOCKERHUB_ORGANISATION}/backend-branded:${BUILD_VERSION}
# push webapp images
docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:latest
docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION}
docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${OCELOT_VERSION_BUILD}
docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION_BASE}
docker push ${DOCKERHUB_ORGANISATION}/webapp-branded:${BUILD_VERSION}
# push maintenance images
docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:latest
docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION}
docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${OCELOT_VERSION_BUILD}
docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION_BASE}
docker push ${DOCKERHUB_ORGANISATION}/maintenance-branded:${BUILD_VERSION}

View File

@ -4,8 +4,13 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml}
BACKUP_DATE=$(date "+%F_%H-%M-%S")
BACKUP_FOLDER=${BACKUP_FOLDER:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/backup/${BACKUP_DATE}}

View File

@ -4,8 +4,14 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
echo "Using CONFIGURATION=${CONFIGURATION}"
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml}
case $1 in

View File

@ -4,8 +4,14 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
echo "Using CONFIGURATION=${CONFIGURATION}"
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml}
# clean & seed

View File

@ -4,10 +4,21 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
echo "Using CONFIGURATION=${CONFIGURATION}"
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml}
VALUES=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubernetes/values.yaml
DOCKERHUB_OCELOT_TAG=${DOCKERHUB_OCELOT_TAG:-"latest"}
# upgrade with helm
helm --kubeconfig=${KUBECONFIG} upgrade ocelot --values ${VALUES} ${SCRIPT_DIR}/../src/kubernetes/ --debug --timeout 10m
helm --kubeconfig=${KUBECONFIG} upgrade ocelot \
--values ${VALUES} \
--set appVersion="${DOCKERHUB_OCELOT_TAG}" \
${SCRIPT_DIR}/../src/kubernetes/ \
--timeout 10m

View File

@ -7,8 +7,14 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
echo "Using CONFIGURATION=${CONFIGURATION}"
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
SECRET_FILE=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/SECRET
openssl rand -base64 32 > ${SECRET_FILE}

View File

@ -7,8 +7,14 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
echo "Using CONFIGURATION=${CONFIGURATION}"
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
SECRET=${SECRET}
SECRET_FILE=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/SECRET
FILES=(\

View File

@ -7,8 +7,14 @@
SCRIPT_PATH=$(realpath $0)
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
# check CONFIGURATION
if [ -z ${CONFIGURATION} ]; then
echo "You must provide a `CONFIGURATION` via environment variable"
exit 1
fi
echo "Using CONFIGURATION=${CONFIGURATION}"
# configuration
CONFIGURATION=${CONFIGURATION:-"example"}
SECRET=${SECRET}
SECRET_FILE=${SCRIPT_DIR}/../configurations/${CONFIGURATION}/SECRET
FILES=(\

View File

@ -1,6 +1,6 @@
{
"name": "ocelot-social",
"version": "2.4.0",
"version": "2.5.1",
"description": "Free and open source software program code available to run social networks.",
"author": "ocelot.social Community",
"license": "MIT",
@ -22,8 +22,8 @@
"release": "yarn version --no-git-tag-version --no-commit-hooks --no-commit && auto-changelog --latest-version $(node -p -e \"require('./package.json').version\") && cd backend && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp/maintenance/source && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../../../package.json').version\")"
},
"devDependencies": {
"@babel/core": "^7.9.0",
"@babel/preset-env": "^7.12.7",
"@babel/core": "^7.21.4",
"@babel/preset-env": "^7.21.4",
"@babel/register": "^7.12.10",
"@faker-js/faker": "5.1.0",
"auto-changelog": "^2.3.0",
@ -36,7 +36,7 @@
"cypress-file-upload": "^3.5.3",
"date-fns": "^2.25.0",
"dotenv": "^8.2.0",
"expect": "^25.3.0",
"expect": "^29.5.0",
"graphql-request": "^2.0.0",
"import": "^0.0.6",
"jsonwebtoken": "^8.5.1",

View File

@ -1,7 +1,7 @@
##################################################################################
# BASE (Is pushed to DockerHub for rebranding) ###################################
##################################################################################
FROM node:19.4.0-alpine3.17 as base
FROM node:19.8.1-alpine3.17 as base
# ENVs
## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame

View File

@ -1,7 +1,7 @@
##################################################################################
# BASE ###########################################################################
##################################################################################
FROM node:19.4.0-alpine3.17 as base
FROM node:19.8.1-alpine3.17 as base
# ENVs
## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame

View File

@ -11,7 +11,15 @@
"
@click.prevent="toggleMenu"
>
<profile-avatar :profile="user" size="small" />
<profile-avatar
:profile="user"
size="small"
:showProfileNameTitle="false"
v-tooltip="{
content: $t('header.avatarMenu.button.tooltip'),
placement: 'bottom-start',
}"
/>
<base-icon class="dropdown-arrow" name="angle-down" />
</a>
</template>
@ -80,7 +88,7 @@ export default {
icon: 'user',
},
{
name: this.$t('header.avatarMenu.Groups'),
name: this.$t('header.avatarMenu.groups'),
path: '/groups',
icon: 'users',
},

View File

@ -6,6 +6,7 @@
:icon="icon"
:filled="isMember && !hovered"
:danger="isMember && hovered"
v-tooltip="tooltip"
@mouseenter.native="onHover"
@mouseleave.native="hovered = false"
@click.prevent="toggle"
@ -24,6 +25,7 @@ export default {
group: { type: Object, required: true },
userId: { type: String, required: true },
isMember: { type: Boolean, required: true },
isNonePendingMember: { type: Boolean, required: true },
disabled: { type: Boolean, default: false },
loading: { type: Boolean, default: false },
},
@ -35,17 +37,33 @@ export default {
},
computed: {
icon() {
if (this.isMember && this.hovered) {
return 'close'
} else {
return this.isMember ? 'check' : 'plus'
if (this.isMember) {
if (this.isNonePendingMember) {
return this.hovered ? 'close' : 'check'
} else {
return this.hovered ? 'close' : 'question-circle'
}
}
return 'plus'
},
label() {
if (this.isMember) {
return this.$t('group.joinLeaveButton.iAmMember')
} else {
return this.$t('group.joinLeaveButton.join')
if (this.isNonePendingMember) {
return this.hovered
? this.$t('group.joinLeaveButton.leave')
: this.$t('group.joinLeaveButton.iAmMember')
} else {
return this.$t('group.joinLeaveButton.pendingMember')
}
}
return this.$t('group.joinLeaveButton.join')
},
tooltip() {
return {
content: this.$t('group.joinLeaveButton.tooltip'),
placement: 'right',
show: this.isMember && !this.isNonePendingMember && this.hovered,
trigger: 'manual',
}
},
},

View File

@ -41,7 +41,7 @@
{{ formData.title.length }}/{{ formSchema.title.max }}
<base-icon v-if="errors && errors.title" name="warning" />
</ds-chip>
<hc-editor
<editor
:users="users"
:value="formData.content"
:hashtags="hashtags"
@ -64,14 +64,30 @@
{{ formData.categoryIds.length }} / 3
<base-icon v-if="errors && errors.categoryIds" name="warning" />
</ds-chip>
<div class="buttons">
<base-button data-test="cancel-button" :disabled="loading" @click="$router.back()" danger>
{{ $t('actions.cancel') }}
</base-button>
<base-button type="submit" icon="check" :loading="loading" :disabled="errors" filled>
{{ $t('actions.save') }}
</base-button>
</div>
<ds-flex class="buttons-footer" gutter="xxx-small">
<ds-flex-item width="3.5" style="margin-right: 16px; margin-bottom: 6px">
<!-- eslint-disable vue/no-v-text-v-html-on-component -->
<ds-text
v-if="showGroupHint"
v-html="$t('contribution.visibleOnlyForMembersOfGroup', { name: groupName })"
/>
<!-- eslint-enable vue/no-v-text-v-html-on-component -->
</ds-flex-item>
<ds-flex-item width="0.15" />
<ds-flex-item class="action-buttons-group" width="2">
<base-button
data-test="cancel-button"
:disabled="loading"
@click="$router.back()"
danger
>
{{ $t('actions.cancel') }}
</base-button>
<base-button type="submit" icon="check" :loading="loading" :disabled="errors" filled>
{{ $t('actions.save') }}
</base-button>
</ds-flex-item>
</ds-flex>
</base-card>
</template>
</ds-form>
@ -80,7 +96,7 @@
<script>
import gql from 'graphql-tag'
import { mapGetters } from 'vuex'
import HcEditor from '~/components/Editor/Editor'
import Editor from '~/components/Editor/Editor'
import PostMutations from '~/graphql/PostMutations.js'
import CategoriesSelect from '~/components/CategoriesSelect/CategoriesSelect'
import ImageUploader from '~/components/Uploader/ImageUploader'
@ -89,7 +105,7 @@ import PageParamsLink from '~/components/_new/features/PageParamsLink/PageParams
export default {
components: {
HcEditor,
Editor,
ImageUploader,
PageParamsLink,
CategoriesSelect,
@ -99,8 +115,8 @@ export default {
type: Object,
default: () => ({}),
},
groupId: {
type: String,
group: {
type: Object,
default: () => null,
},
},
@ -152,6 +168,15 @@ export default {
contentLength() {
return this.$filters.removeHtml(this.formData.content).length
},
groupId() {
return this.group && this.group.id
},
showGroupHint() {
return this.groupId && ['closed', 'hidden'].includes(this.group.groupType)
},
groupName() {
return this.group && this.group.name
},
},
methods: {
submit() {
@ -284,9 +309,22 @@ export default {
align-self: flex-end;
}
> .buttons {
> .buttons-footer {
justify-content: flex-end;
align-self: flex-end;
width: 100%;
margin-top: $space-base;
> .action-buttons-group {
margin-left: auto;
display: flex;
justify-content: flex-end;
> button {
margin-left: 1em;
min-width: fit-content;
}
}
}
.blur-toggle {
@ -297,5 +335,30 @@ export default {
display: block;
}
}
@media screen and (max-width: 656px) {
> .buttons-footer {
flex-direction: column;
margin-top: 5px;
> .action-buttons-group {
> button {
margin-left: 1em;
}
}
}
}
@media screen and (max-width: 280px) {
> .buttons-footer {
> .action-buttons-group {
flex-direction: column;
> button {
margin-bottom: 5px;
}
}
}
}
}
</style>

View File

@ -1,9 +1,14 @@
<template>
<div class="group-list">
<ds-space margin-bottom="small" v-for="group in groups" :key="group.id">
<ds-flex class="group-list">
<ds-flex-item
v-for="group in groups"
:key="group.id"
:width="{ base: '98%', sm: '98%', md: '48%' }"
class="group-item"
>
<group-teaser :group="group" />
</ds-space>
</div>
</ds-flex-item>
</ds-flex>
</template>
<script>
@ -19,3 +24,8 @@ export default {
},
}
</script>
<style lang="scss" scoped>
.group-item {
margin: 0 1% 2% 1%;
}
</style>

View File

@ -2,7 +2,15 @@
<client-only>
<dropdown ref="menu" :placement="placement" :offset="offset">
<template #default="{ toggleMenu }">
<a class="locale-menu" href="#" @click.prevent="toggleMenu()">
<a
class="locale-menu"
href="#"
v-tooltip="{
content: $t('localeSwitch.tooltip'),
placement: 'bottom-start',
}"
@click.prevent="toggleMenu()"
>
<!-- <base-icon name="globe" /> -->
<span class="label">{{ current.code.toUpperCase() }}</span>
<base-icon class="dropdown-arrow" name="angle-down" />

View File

@ -30,7 +30,7 @@ export default {
/* dirty fix to override broken styleguide inline-styles */
.ds-grid {
grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 1fr)) !important;
gap: 32px 16px !important;
gap: 16px !important;
grid-auto-rows: 20px;
}

View File

@ -1,19 +1,24 @@
<template>
<article :class="{ '--read': notification.read, notification: true }">
<client-only>
<user-teaser :user="from.author" :date-time="from.createdAt" />
<user-teaser
:user="isGroup ? notification.relatedUser : from.author"
:date-time="from.createdAt"
/>
</client-only>
<p class="description">{{ $t(`notifications.reason.${notification.reason}`) }}</p>
<nuxt-link
class="link"
:to="{ name: 'post-id-slug', params, ...hashParam }"
:to="{ name: isGroup ? 'group-id-slug' : 'post-id-slug', params, hashParam }"
@click.native="$emit('read')"
>
<base-card wideContent>
<h2 class="title">{{ from.title || from.post.title }}</h2>
<h2 class="title">{{ from.title || from.groupName || from.post.title }}</h2>
<p>
<strong v-if="isComment" class="comment">{{ $t(`notifications.comment`) }}:</strong>
{{ from.contentExcerpt | removeHtml }}
<strong v-if="isGroup" class="comment">{{ $t(`notifications.group`) }}:</strong>
{{ from.descriptionExcerpt | removeHtml }}
</p>
</base-card>
</nuxt-link>
@ -41,11 +46,14 @@ export default {
isComment() {
return this.from.__typename === 'Comment'
},
isGroup() {
return this.from.__typename === 'Group'
},
params() {
const post = this.isComment ? this.from.post : this.from
const target = this.isComment ? this.from.post : this.from
return {
id: post.id,
slug: post.slug,
id: target.id,
slug: target.slug,
}
},
hashParam() {

View File

@ -4,30 +4,51 @@
class="notifications-menu"
:to="{ name: 'notifications' }"
>
<base-button icon="bell" ghost circle />
<base-button
icon="bell"
ghost
circle
v-tooltip="{
content: $t('notifications.headerMenuButton.tooltip'),
placement: 'bottom-start',
}"
/>
</nuxt-link>
<dropdown v-else class="notifications-menu" offset="8" :placement="placement">
<template #default="{ toggleMenu }">
<base-button @click="toggleMenu" ghost circle>
<base-button
ghost
circle
v-tooltip="{
content: $t('notifications.headerMenuButton.tooltip'),
placement: 'bottom-start',
}"
@click="toggleMenu"
>
<counter-icon icon="bell" :count="unreadNotificationsCount" danger />
</base-button>
</template>
<template #popover>
<template #popover="{ closeMenu }">
<div class="notifications-menu-popover">
<notification-list :notifications="notifications" @markAsRead="markAsRead" />
</div>
<ds-flex class="notifications-link-container">
<ds-flex-item :width="{ base: 'auto' }" centered>
<ds-flex-item class="notifications-link-container-item" :width="{ base: '100%' }" centered>
<nuxt-link :to="{ name: 'notifications' }">
<ds-button ghost primary>
<base-button ghost primary>
{{ $t('notifications.pageLink') }}
</ds-button>
</base-button>
</nuxt-link>
</ds-flex-item>
<ds-flex-item :width="{ base: 'auto' }" centered>
<ds-button ghost primary @click="markAllAsRead" data-test="markAllAsRead-button">
<ds-flex-item class="notifications-link-container-item" :width="{ base: '100%' }" centered>
<base-button
ghost
primary
@click="markAllAsRead(closeMenu)"
data-test="markAllAsRead-button"
>
{{ $t('notifications.markAllAsRead') }}
</ds-button>
</base-button>
</ds-flex-item>
</ds-flex>
</template>
@ -74,11 +95,12 @@ export default {
this.$toast.error(error.message)
}
},
async markAllAsRead() {
async markAllAsRead(closeMenu) {
if (!this.hasNotifications) {
return
}
closeMenu()
try {
await this.$apollo.mutate({
mutation: markAllAsReadMutation(this.$i18n),
@ -144,16 +166,15 @@ export default {
<style lang="scss">
.notifications-menu-popover {
max-width: 500px;
margin-bottom: $size-height-base;
}
.notifications-link-container {
background-color: $background-color-softer-active;
justify-content: center;
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: $size-height-base;
padding: $space-x-small;
flex-direction: row;
}
.notifications-link-container-item {
justify-content: center;
display: flex;
}
</style>

View File

@ -39,7 +39,11 @@
<ds-space margin-bottom="base">
<client-only>
<user-teaser
:user="notification.from.author"
:user="
isGroup(notification.from)
? notification.relatedUser
: notification.from.author
"
:date-time="notification.from.createdAt"
:class="{ 'notification-status': notification.read }"
/>
@ -61,14 +65,18 @@
class="notification-mention-post"
:class="{ 'notification-status': notification.read }"
:to="{
name: 'post-id-slug',
name: isGroup(notification.from) ? 'group-id-slug' : 'post-id-slug',
params: params(notification.from),
hash: hashParam(notification.from),
}"
@click.native="markNotificationAsRead(notification.from.id)"
>
<b>
{{ notification.from.title || notification.from.post.title | truncate(50) }}
{{
notification.from.title ||
notification.from.groupName ||
notification.from.post.title | truncate(50)
}}
</b>
</nuxt-link>
</base-card>
@ -76,7 +84,10 @@
<ds-flex-item>
<base-card :wide-content="true">
<b :class="{ 'notification-status': notification.read }">
{{ notification.from.contentExcerpt | removeHtml }}
{{
notification.from.contentExcerpt ||
notification.from.descriptionExcerpt | removeHtml
}}
</b>
</base-card>
</ds-flex-item>
@ -132,11 +143,16 @@ export default {
isComment(notificationSource) {
return notificationSource.__typename === 'Comment'
},
isGroup(notificationSource) {
return notificationSource.__typename === 'Group'
},
params(notificationSource) {
const post = this.isComment(notificationSource) ? notificationSource.post : notificationSource
const target = this.isComment(notificationSource)
? notificationSource.post
: notificationSource
return {
id: post.id,
slug: post.slug,
id: target.id,
slug: target.slug,
}
},
hashParam(notificationSource) {

View File

@ -8,7 +8,7 @@
:src="profile.avatar | proxyApiUrl"
class="image"
:alt="profile.name"
:title="profile.name"
:title="showProfileNameTitle ? profile.name : ''"
@error="$event.target.style.display = 'none'"
/>
</div>
@ -29,6 +29,10 @@ export default {
type: Object,
default: null,
},
showProfileNameTitle: {
type: Boolean,
default: true,
},
},
computed: {
isAnonymous() {

View File

@ -6,6 +6,7 @@ import {
userFragment,
postFragment,
commentFragment,
groupFragment,
} from './Fragments'
export const profileUserQuery = (i18n) => {
@ -113,6 +114,7 @@ export const notificationQuery = (_i18n) => {
${userFragment}
${commentFragment}
${postFragment}
${groupFragment}
query ($read: Boolean, $orderBy: NotificationOrdering, $first: Int, $offset: Int) {
notifications(read: $read, orderBy: $orderBy, first: $first, offset: $offset) {
@ -121,6 +123,9 @@ export const notificationQuery = (_i18n) => {
reason
createdAt
updatedAt
to {
...user
}
from {
__typename
... on Post {
@ -141,6 +146,12 @@ export const notificationQuery = (_i18n) => {
}
}
}
... on Group {
...group
}
}
relatedUser {
...user
}
}
}
@ -152,6 +163,7 @@ export const markAsReadMutation = (_i18n) => {
${userFragment}
${commentFragment}
${postFragment}
${groupFragment}
mutation ($id: ID!) {
markAsRead(id: $id) {
@ -177,6 +189,9 @@ export const markAsReadMutation = (_i18n) => {
}
}
}
... on Group {
...group
}
}
}
}
@ -188,6 +203,7 @@ export const markAllAsReadMutation = (_i18n) => {
${userFragment}
${commentFragment}
${postFragment}
${groupFragment}
mutation {
markAllAsRead {
@ -213,6 +229,9 @@ export const markAllAsReadMutation = (_i18n) => {
}
}
}
... on Group {
...group
}
}
}
}

View File

@ -289,7 +289,8 @@
},
"supportedFormats": "Füge ein Bild im Dateiformat JPG, PNG oder GIF ein"
},
"title": "Titel"
"title": "Titel",
"visibleOnlyForMembersOfGroup": "Dieser Beitrag wird nur für Mitglieder der Gruppe „<b>{name}</b>“ sichtbar sein."
},
"delete": {
"cancel": "Abbrechen",
@ -447,7 +448,10 @@
"in": "in",
"joinLeaveButton": {
"iAmMember": "Bin Mitglied",
"join": "Beitreten"
"join": "Beitreten",
"leave": "Verlassen",
"pendingMember": "Ausstehendes Mitglied",
"tooltip": "Der Gruppeninhaber muss dich noch bestätigen."
},
"labelSlug": "Eindeutiger Gruppenname",
"leaveModal": {
@ -482,7 +486,7 @@
"admin": "Administrator",
"owner": "Inhaber",
"pending": "Ausstehendes Mitglied",
"usual": "Einfaches Mitglied"
"usual": "Mitglied"
},
"save": "Neue Gruppe anlegen",
"type": "Öffentlichkeit der Gruppe",
@ -506,7 +510,10 @@
},
"header": {
"avatarMenu": {
"Groups": "Gruppen",
"button": {
"tooltip": "Mein Profil"
},
"groups": "Gruppen",
"myProfile": "Mein Profil"
}
},
@ -516,13 +523,16 @@
},
"invite-codes": {
"button": {
"tooltip": "Lade deine Freunde ein"
"tooltip": "Freunde einladen"
},
"copy-code": "Einladungslink kopieren",
"copy-success": "Einladungscode erfolgreich in die Zwischenablage kopiert",
"not-available": "Du hast keinen Einladungscode zur Verfügung!",
"your-code": "Sende diesen Link per E-Mail oder in sozialen Medien, um deine Freunde einzuladen:"
},
"localeSwitch": {
"tooltip": "Sprache wählen"
},
"login": {
"email": "Deine E-Mail",
"failure": "Fehlerhafte E-Mail-Adresse oder Passwort.",
@ -636,20 +646,28 @@
},
"notifications": {
"comment": "Kommentar",
"content": "Inhalt",
"content": "Inhalt oder Beschreibung",
"empty": "Bedaure, Du hast momentan keinerlei Benachrichtigungen.",
"filterLabel": {
"all": "Alle",
"read": "Gelesen",
"unread": "Ungelesen"
},
"group": "Beschreibung",
"headerMenuButton": {
"tooltip": "Meine Benachrichtigungen"
},
"markAllAsRead": "Markiere alle als gelesen",
"pageLink": "Alle Benachrichtigungen",
"post": "Beitrag",
"post": "Beitrag oder Gruppe",
"reason": {
"changed_group_member_role": "Hat Deine Rolle in der Gruppe geändert …",
"commented_on_post": "Hat Deinen Beitrag kommentiert …",
"mentioned_in_comment": "Hat Dich in einem Kommentar erwähnt …",
"mentioned_in_post": "Hat Dich in einem Beitrag erwähnt …"
"mentioned_in_post": "Hat Dich in einem Beitrag erwähnt …",
"removed_user_from_group": "Hat Dich aus der Gruppe entfernt …",
"user_joined_group": "Ist Deiner Gruppe beigetreten …",
"user_left_group": "Hat deine Gruppe verlassen …"
},
"title": "Benachrichtigungen",
"user": "Nutzer"

View File

@ -289,7 +289,8 @@
},
"supportedFormats": "Insert a picture of file format JPG, PNG or GIF"
},
"title": "Title"
"title": "Title",
"visibleOnlyForMembersOfGroup": "This post will only be visible to members of the “<b>{name}</b>” group."
},
"delete": {
"cancel": "Cancel",
@ -447,7 +448,10 @@
"in": "in",
"joinLeaveButton": {
"iAmMember": "I'm a member",
"join": "Join"
"join": "Join",
"leave": "Leave",
"pendingMember": "Pending member",
"tooltip": "The group owner has yet to confirm you."
},
"labelSlug": "Unique group name",
"leaveModal": {
@ -482,7 +486,7 @@
"admin": "Administrator",
"owner": "Owner",
"pending": "Pending Member",
"usual": "Simple Member"
"usual": "Member"
},
"save": "Create new group",
"type": "Visibility of the group",
@ -506,7 +510,10 @@
},
"header": {
"avatarMenu": {
"Groups": "Groups",
"button": {
"tooltip": "My profile"
},
"groups": "Groups",
"myProfile": "My profile"
}
},
@ -516,13 +523,16 @@
},
"invite-codes": {
"button": {
"tooltip": "Invite your friends"
"tooltip": "Invite friends"
},
"copy-code": "Copy Invite Link",
"copy-success": "Invite code copied to clipboard",
"not-available": "You have no valid invite code available!",
"your-code": "Send this link per e-mail or in social media to invite your friends:"
},
"localeSwitch": {
"tooltip": "Choose language"
},
"login": {
"email": "Your E-mail",
"failure": "Incorrect email address or password.",
@ -636,20 +646,28 @@
},
"notifications": {
"comment": "Comment",
"content": "Content",
"content": "Content or Description",
"empty": "Sorry, you don't have any notifications at the moment.",
"filterLabel": {
"all": "All",
"read": "Read",
"unread": "Unread"
},
"group": "Description",
"headerMenuButton": {
"tooltip": "My notifications"
},
"markAllAsRead": "Mark all as read",
"pageLink": "All notifications",
"post": "Post",
"post": "Post or Group",
"reason": {
"changed_group_member_role": "Changed your role in group …",
"commented_on_post": "Commented on your post …",
"mentioned_in_comment": "Mentioned you in a comment …",
"mentioned_in_post": "Mentioned you in a post …"
"mentioned_in_post": "Mentioned you in a post …",
"removed_user_from_group": "Removed you from group …",
"user_joined_group": "Joined your group …",
"user_left_group": "Left your group …"
},
"title": "Notifications",
"user": "User"

View File

@ -302,7 +302,8 @@
"goal": null,
"joinLeaveButton": {
"iAmMember": null,
"join": null
"join": null,
"pendingMember": null
},
"membersCount": null,
"membersListTitle": null

View File

@ -291,7 +291,8 @@
"goal": null,
"joinLeaveButton": {
"iAmMember": null,
"join": null
"join": null,
"pendingMember": null
},
"membersCount": null,
"membersListTitle": null

View File

@ -299,7 +299,8 @@
"goal": null,
"joinLeaveButton": {
"iAmMember": null,
"join": null
"join": null,
"pendingMember": null
},
"membersCount": null,
"membersListTitle": null

View File

@ -87,7 +87,8 @@
"goal": null,
"joinLeaveButton": {
"iAmMember": null,
"join": null
"join": null,
"pendingMember": null
},
"membersCount": null,
"membersListTitle": null

View File

@ -171,7 +171,8 @@
"goal": null,
"joinLeaveButton": {
"iAmMember": null,
"join": null
"join": null,
"pendingMember": null
},
"membersCount": null,
"membersListTitle": null

View File

@ -337,7 +337,8 @@
"goal": null,
"joinLeaveButton": {
"iAmMember": null,
"join": null
"join": null,
"pendingMember": null
},
"membersCount": null,
"membersListTitle": null

View File

@ -316,7 +316,8 @@
"goal": null,
"joinLeaveButton": {
"iAmMember": null,
"join": null
"join": null,
"pendingMember": null
},
"membersCount": null,
"membersListTitle": null

View File

@ -1,6 +1,6 @@
{
"name": "@ocelot-social/maintenance",
"version": "2.4.0",
"version": "2.5.1",
"description": "Maintenance page for ocelot.social",
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
"author": "ocelot.social Community",

View File

@ -1,6 +1,6 @@
{
"name": "ocelot-social-webapp",
"version": "2.4.0",
"version": "2.5.1",
"description": "ocelot.social Frontend",
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
"author": "ocelot.social Community",
@ -38,7 +38,7 @@
"express": "~4.17.1",
"graphql": "~14.7.0",
"intersection-observer": "^0.12.0",
"jsonwebtoken": "~8.5.1",
"jsonwebtoken": "~9.0.0",
"linkify-it": "~3.0.2",
"mapbox-gl": "1.13.2",
"node-fetch": "^2.6.1",
@ -65,7 +65,7 @@
"zxcvbn": "^4.4.2"
},
"devDependencies": {
"@babel/core": "~7.12.3",
"@babel/core": "~7.21.4",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "^7.20.2",
"@faker-js/faker": "5.1.0",
@ -81,7 +81,7 @@
"async-validator": "^3.2.4",
"babel-core": "~7.0.0-bridge.0",
"babel-eslint": "~10.1.0",
"babel-jest": "29.4",
"babel-jest": "29.5",
"babel-loader": "~8.1.0",
"babel-plugin-require-context-hook": "^1.0.0",
"babel-preset-vue": "~2.0.2",
@ -100,7 +100,7 @@
"eslint-plugin-vue": "~6.2.2",
"flush-promises": "^1.0.2",
"identity-obj-proxy": "^3.0.0",
"jest": "29.4",
"jest": "29.5",
"jest-environment-jsdom": "^29.4.2",
"mutation-observer": "^1.0.3",
"prettier": "~2.7.1",

View File

@ -102,6 +102,7 @@
:group="group || {}"
:userId="currentUser.id"
:isMember="isGroupMember"
:isNonePendingMember="isGroupMemberNonePending"
:disabled="isGroupOwner"
:loading="$apollo.loading"
@prepare="prepareJoinLeave"
@ -564,7 +565,7 @@ export default {
// },
prepareJoinLeave() {
// "membersCountStartValue" is updated to avoid counting from 0 when join/leave
this.membersCountStartValue = this.GroupMembers.length
this.membersCountStartValue = (this.GroupMembers && this.GroupMembers.length) || 0
},
updateJoinLeave({ myRoleInGroup }) {
this.Group[0].myRole = myRoleInGroup

View File

@ -4,7 +4,7 @@
<tab-navigation :tabs="tabOptions" :activeTab="tabActive" @switch-tab="handleTab" />
</ds-space>
<ds-space margin="large" />
<ds-container>
<ds-space>
<!-- create group -->
<ds-space centered>
<nuxt-link :to="{ name: 'group-create' }">
@ -49,7 +49,7 @@
@next="nextResults"
/>
</ds-space>
</ds-container>
</ds-space>
</div>
</template>

View File

@ -346,7 +346,7 @@ export default {
position: fixed;
z-index: 6;
margin-top: -35px;
padding: 20px 10px 5px 10px;
padding: 20px 10px 20px 10px;
background-color: #f5f4f6;
}
@media screen and (max-width: 656px) {
@ -355,6 +355,7 @@ export default {
}
}
#my-filter {
max-width: 1028px;
background-color: white;
box-shadow: rgb(189 189 189) 1px 9px 15px 1px;
max-height: 950px;

View File

@ -9,7 +9,7 @@
<ds-space margin="large" />
<ds-flex :width="{ base: '100%' }" gutter="base">
<ds-flex-item :width="{ base: '100%', md: 5 }">
<contribution-form :groupId="groupId" />
<contribution-form :group="group" />
</ds-flex-item>
<ds-flex-item :width="{ base: '100%', md: 1 }">&nbsp;</ds-flex-item>
</ds-flex>

View File

@ -9,7 +9,10 @@
<ds-space margin="large" />
<ds-flex :width="{ base: '100%' }" gutter="base">
<ds-flex-item :width="{ base: '100%', md: 3 }">
<contribution-form :contribution="contribution" />
<contribution-form
:contribution="contribution"
:group="contribution && contribution.group ? contribution.group : null"
/>
</ds-flex-item>
<ds-flex-item :width="{ base: '100%', md: 1 }">&nbsp;</ds-flex-item>
</ds-flex>

Some files were not shown because too many files have changed in this diff Show More