Merge branch 'master' of github.com:Ocelot-Social-Community/Ocelot-Social into 4265-move-sort-newsfeed-menu-into-filter-menu
8
.github/ISSUE_TEMPLATE/question.md
vendored
@ -1,12 +1,12 @@
|
||||
---
|
||||
name: 💬 Question
|
||||
about: If you need help understanding HumanConnection.
|
||||
about: If you need help understanding ocelot.social.
|
||||
labels: question
|
||||
title: 💬 [Question]
|
||||
---
|
||||
<!-- Chat with Team HumanConnection -->
|
||||
<!-- If you need an answer right away, visit the HumanConnection Discord:
|
||||
https://discord.gg/Q3mpcgr -->
|
||||
<!-- Chat with ocelot.social team -->
|
||||
<!-- If you need an answer right away, visit the ocelot.social Discord:
|
||||
https://discord.gg/AJSX9DCSUA -->
|
||||
|
||||
## :speech_balloon: Question
|
||||
<!-- Describe your Question in detail. Include screenshots and drawings if needed. -->
|
||||
|
||||
16
.github/workflows/publish.yml
vendored
@ -4,6 +4,7 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
# - 4451-new-deployment-with-base-and-code # for testing while developing
|
||||
|
||||
jobs:
|
||||
##############################################################################
|
||||
@ -92,7 +93,10 @@ jobs:
|
||||
# BUILD BACKEND DOCKER IMAGE (production) ################################
|
||||
##########################################################################
|
||||
- name: Backend | Build `production` image
|
||||
run: docker build --target production -t "ocelotsocialnetwork/backend:latest" -t "ocelotsocialnetwork/backend:${VERSION}" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/
|
||||
run: |
|
||||
docker build --target base -t "ocelotsocialnetwork/backend:latest-base" -t "ocelotsocialnetwork/backend:${VERSION}-base" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/
|
||||
docker build --target code -t "ocelotsocialnetwork/backend:latest-code" -t "ocelotsocialnetwork/backend:${VERSION}-code" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/
|
||||
docker build --target production -t "ocelotsocialnetwork/backend:latest" -t "ocelotsocialnetwork/backend:${VERSION}" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/
|
||||
- name: Backend | Save docker image
|
||||
run: docker save "ocelotsocialnetwork/backend" > /tmp/backend.tar
|
||||
- name: Upload Artifact
|
||||
@ -129,7 +133,10 @@ jobs:
|
||||
# BUILD WEBAPP DOCKER IMAGE (build) ######################################
|
||||
##########################################################################
|
||||
- name: Webapp | Build `production` image
|
||||
run: docker build --target production -t "ocelotsocialnetwork/webapp:latest" -t "ocelotsocialnetwork/webapp:${VERSION}" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/
|
||||
run: |
|
||||
docker build --target base -t "ocelotsocialnetwork/webapp:latest-base" -t "ocelotsocialnetwork/webapp:${VERSION}-base" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/
|
||||
docker build --target code -t "ocelotsocialnetwork/webapp:latest-code" -t "ocelotsocialnetwork/webapp:${VERSION}-code" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/
|
||||
docker build --target production -t "ocelotsocialnetwork/webapp:latest" -t "ocelotsocialnetwork/webapp:${VERSION}" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/
|
||||
- name: Webapp | Save docker image
|
||||
run: docker save "ocelotsocialnetwork/webapp" > /tmp/webapp.tar
|
||||
- name: Upload Artifact
|
||||
@ -166,7 +173,10 @@ jobs:
|
||||
# BUILD MAINTENANCE DOCKER IMAGE (build) #################################
|
||||
##########################################################################
|
||||
- name: Maintenance | Build `production` image
|
||||
run: docker build --target production -t "ocelotsocialnetwork/maintenance:latest" -t "ocelotsocialnetwork/maintenance:${VERSION}" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance
|
||||
run: |
|
||||
docker build --target base -t "ocelotsocialnetwork/maintenance:latest-base" -t "ocelotsocialnetwork/maintenance:${VERSION}-base" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance
|
||||
docker build --target code -t "ocelotsocialnetwork/maintenance:latest-code" -t "ocelotsocialnetwork/maintenance:${VERSION}-code" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance
|
||||
docker build --target production -t "ocelotsocialnetwork/maintenance:latest" -t "ocelotsocialnetwork/maintenance:${VERSION}" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance
|
||||
- name: Maintenance | Save docker image
|
||||
run: docker save "ocelotsocialnetwork/maintenance" > /tmp/maintenance.tar
|
||||
- name: Upload Artifact
|
||||
|
||||
62
CHANGELOG.md
@ -4,11 +4,43 @@ 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).
|
||||
|
||||
#### [v1.0.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.1...v1.0.2)
|
||||
#### [v1.0.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.3...v1.0.4)
|
||||
|
||||
- fixed wrong env variable [`#4474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4474)
|
||||
- chore: [WIP] 🍰 New Deployment With 'base' And 'code' Docker Images [`#4452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4452)
|
||||
- feat: 🍰 Flexible Footer Links [`#4468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4468)
|
||||
- docs: 🍰 Correct 'Contribution.md' [`#4466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4466)
|
||||
- docs: 🍰 Correct Discord Links And Divers [`#4461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4461)
|
||||
- Implement flexible page footer links [`1bd4af6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/1bd4af6fd3b5db167575910948a0a72461a1129a)
|
||||
- Implement tests for flexible page footer links [`627a20f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/627a20f66a65450996a5fe3128fd37769fdfd629)
|
||||
- Correct Discord links and divers [`0318910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0318910488e245c4a1d09181265de63d05a89cf1)
|
||||
|
||||
#### [1.0.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.2...1.0.3)
|
||||
|
||||
> 19 May 2021
|
||||
|
||||
- chore: 🍰 Release v1.0.3 [`#4435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4435)
|
||||
- chore: 🍰 Refactor Logos [`#4433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4433)
|
||||
- feat: 🍰 Show Password Component [`#4370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4370)
|
||||
- chore: 🍰 Replace Ocelot Logos 619x593 With 600x570 [`#4428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4428)
|
||||
- Coverage [`#4393`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4393)
|
||||
- correct_docker_tagging [`#4391`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4391)
|
||||
- 🍰 Get Cypress Tests Running Again [`#4338`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4338)
|
||||
- frontend + backend coverage tests [`#4367`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4367)
|
||||
- refactor: 🍰 Refactor E-Mail Templates [`#4350`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4350)
|
||||
- feat: 🍰 Remove More-Info Of Post [`#4316`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4316)
|
||||
- have cypress running locally - the tests still fail [`e3e0341`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e3e03415e1bd9e0be88f33930a52e63d8af64ee1)
|
||||
- have cypress running locally - the tests still fail [`0ec0574`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0ec05743751cfef0cb86c17b87e9e4ef9a2c9e47)
|
||||
- Refactor logos, first step [`ff6cc30`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/ff6cc306aff6150a924f1a647387e498d050ea9f)
|
||||
|
||||
#### [1.0.2](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.1...1.0.2)
|
||||
|
||||
> 6 April 2021
|
||||
|
||||
- fix: Email Confirmation-Link When An Invite-Code Is Given [`#4336`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4336)
|
||||
- release v1.0.2 [`e583010`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/e5830101e4b449905fe2d0018627d75af62b2a20)
|
||||
- slider jumps to enter-nonce when link contains invite-code, email and nonce and method is invite-code. Thanks @tirokk [`c80b3a2`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/c80b3a212835f76cfc2f11542345d6c3b226995b)
|
||||
- fix enail confirmation link when an invite-code is given [`27f0de9`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/27f0de9464685c8f960bde9d07986fdc5b20f8f9)
|
||||
- linting [`21a667e`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/21a667eb25a236c69f69b61f24d1578ea005a910)
|
||||
|
||||
#### [1.0.1](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.0...1.0.1)
|
||||
|
||||
@ -136,21 +168,11 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||
- file upload: refactored [`650e83f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/650e83f4c250389477933a2e7d21d8245b0ce882)
|
||||
- change user role: tests are working [`14dfe2a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/14dfe2ae2cd4a24c06c9229893b33586dfceae4f)
|
||||
|
||||
#### [0.6.5](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.6.4...0.6.5)
|
||||
#### [0.6.5](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.4...0.6.5)
|
||||
|
||||
> 8 February 2021
|
||||
|
||||
- - adjusted changelog to ocelot-social repo [`9603882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9603882edebf8967e05abfa94e4e1ebf452d4e24)
|
||||
- - first steps towards docker image deployment & github autotagging [`5503216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5503216ad4a0230ac533042e4a69806590fc2a5a)
|
||||
- - deploy structure image [`a60400b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a60400b4fe6f59bbb80e1073db4def3ba205e1a7)
|
||||
|
||||
#### [v0.6.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.4...v0.6.4)
|
||||
|
||||
> 9 February 2021
|
||||
|
||||
- chore(release): 0.6.4 [`8b7570d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/8b7570dc35d0ea431f673a711ac051f1e1320acb)
|
||||
- change user roles is working, test fails [`8c3310a`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/8c3310abaf87c0e5597fec4f93fb37d27122c9e7)
|
||||
- change user role: tests are working [`f10da4b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/f10da4b09388fe1e2b85abd53f6ffc67c785d4c1)
|
||||
- updated CHANGELOG.md [`9d9075f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9d9075f2117b2eb4b607e7d59ab18c7e655c6ea7)
|
||||
|
||||
#### [0.6.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.3...0.6.4)
|
||||
|
||||
@ -160,15 +182,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||
- fetch full history [`5ecee4d`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5ecee4d73a92d2e5c5ae971d79848ed27f65a72c)
|
||||
- don't fail if tag exists (release) [`39c82fc`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/39c82fcb37d5c8e7e78a79288e1ef6280f8d0892)
|
||||
|
||||
#### [0.6.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.6.3...0.6.3)
|
||||
|
||||
> 8 February 2021
|
||||
|
||||
- - adjusted changelog to ocelot-social repo [`9603882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9603882edebf8967e05abfa94e4e1ebf452d4e24)
|
||||
- - fixed changelog [`cf70b12`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/cf70b12ed74011924ea788ab932fc9d7ac0e6bd9)
|
||||
- - yarn install to allow yarn auto-changelog [`fc496aa`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/fc496aa04cb7e804da4335da0cb5cda26f874ea2)
|
||||
|
||||
#### [v0.6.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.0...v0.6.3)
|
||||
#### [0.6.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/0.6.0...0.6.3)
|
||||
|
||||
> 8 February 2021
|
||||
|
||||
@ -177,9 +191,9 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||
- feat: 🍰 Allow Only Supported Image File Formats [`#3928`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/3928)
|
||||
- refactor: Disbale Emoji, Language And Catgeory Filter [`#4193`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4193)
|
||||
- refactor: Remove Catgeories From Post Teaser [`#4191`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4191)
|
||||
- - adjusted changelog to ocelot-social repo [`9603882`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/9603882edebf8967e05abfa94e4e1ebf452d4e24)
|
||||
- - first steps towards docker image deployment & github autotagging [`5503216`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/5503216ad4a0230ac533042e4a69806590fc2a5a)
|
||||
- - lots of additional tests [`0ba37aa`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0ba37aab18f537d722aede7b87fa0b8e79f80e66)
|
||||
- - deploy structure image [`a60400b`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/a60400b4fe6f59bbb80e1073db4def3ba205e1a7)
|
||||
|
||||
#### [0.6.0](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/v0.6.0...0.6.0)
|
||||
|
||||
|
||||
@ -4,31 +4,33 @@ Thank you so much for thinking of contributing to the Human Connection project!
|
||||
|
||||
## Getting Set Up
|
||||
|
||||
Instructions for how to install all the necessary software and some code guidelines can be found in our [documentation](https://docs.human-connection.org/human-connection/).
|
||||
Instructions for how to install all the necessary software and some code guidelines can be found in our main [Readme](/README.md) or in our [documentation](https://docs.human-connection.org/human-connection/).
|
||||
|
||||
To get you started we recommend that you join forces with a regular contributor. Please join [our discord instance](https://human-connection.org/discord) to chat with developers or just get in touch directly on an issue on either [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) or [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089):
|
||||
To get you started we recommend that you join forces with a regular contributor. Please join [our Discord instance](https://discord.gg/AJSX9DCSUA) to chat with developers or just get in touch directly on an issue on either [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) or [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089):
|
||||
|
||||

|
||||
|
||||
We also have regular pair programming sessions that you are very welcome to join! We feel this is often the best way to get to know both the project and the team. Most developers are also available for spontaneous sessions if the times listed below don't work for you – just ping us on discord.
|
||||
We also have regular pair programming sessions that you are very welcome to join! We feel this is often the best way to get to know both the project and the team. Most developers are also available for spontaneous sessions if the times listed below don't work for you – just ping us on Discord.
|
||||
|
||||
## Development Flow
|
||||
|
||||
We operate in two week sprints that are planned, estimated and prioritised on [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089). All issues are also linked to and synced with [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues). Look for the `good first issue` label if you're not sure where to start!
|
||||
|
||||
We try to discuss all questions directly related to a feature or bug in the respective issue, in order to preserve it for the future and for other developers. We use discord for real-time communication.
|
||||
We try to discuss all questions directly related to a feature or bug in the respective issue, in order to preserve it for the future and for other developers. We use Discord for real-time communication.
|
||||
|
||||
This is how we solve bugs and implement features, step by step:
|
||||
|
||||
1. We find an issue we want to work on, usually during the sprint planning but as an open source contributor this can happen at any time.
|
||||
2. We communicate with the team to see if the issue is still available. (When you comment on an issue but don't get an answer there within 1-2 days try to mention @Human-Connection/hc-dev-team to make sure we check in.)
|
||||
3. We make sure we understand the issue in detail – what problem is it solving and how should it be implemented?
|
||||
4. We assign ourselves to the issue and move it to `In Progress` on [Zenhub](https://app.zenhub.com/workspaces/human-connection-nitro-5c0154ecc699f60fc92cf11f).
|
||||
4. We assign ourselves to the issue and move it to `In Progress` on [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089).
|
||||
5. We start working on it in a `new branch` and open a `pull request` prefixed with `[WIP]` (work in progress) to which we regularly push our changes.
|
||||
6. When questions come up we clarify them with the team (directly in the issue on Github).
|
||||
7. When we are happy with our work and our PR is passing all tests we remove the `[WIP]` from the PR description and ask for reviews (if you're not sure who to ask there is @Human-Connection/hc-dev-team which pings all core developers).
|
||||
8. We then incorporate the suggestions from the reviews into our work and once it has been approved it can be merged into master!
|
||||
|
||||
Every pull request needs to:
|
||||
|
||||
* fix an issue (if there is something you want to work on but there is no issue for it, create one first and discuss it with the team)
|
||||
* include tests for the code that is added or changed
|
||||
* pass all tests (linter, backend, frontend, end-to-end)
|
||||
@ -38,37 +40,46 @@ Every pull request needs to:
|
||||
|
||||
There are many volunteers all around the world helping us build this network and without their contributions we wouldn't be where we are today. Big thank you to all of you!
|
||||
|
||||
You can see the core team behind Human Connection [on our website](https://human-connection.org/en/the-team/). On Github you will mostly run into our developers:
|
||||
* Robert (@roschaefer)
|
||||
* Matt (@mattwr18)
|
||||
You can talk to our core team on [Discord](https://discord.gg/AJSX9DCSUA). And on Github you will mostly run into our core developers:
|
||||
|
||||
* Ulf (@ulfgebhardt)
|
||||
* Moriz (@Mogge)
|
||||
* Wolle (@Tirokk)
|
||||
* Alex (@ogerly)
|
||||
|
||||
<!-- * Robert (@roschaefer)
|
||||
* Matt (@mattwr18)
|
||||
* Alina (@alina-beck)
|
||||
* Martin (@datenbrei), our head of IT
|
||||
* and sometimes Dennis (@DennisHack), the founder of Human Connection
|
||||
* and sometimes Dennis (@DennisHack), the founder of Human Connection -->
|
||||
|
||||
## Meetings and Pair Programming Sessions
|
||||
|
||||
Times below refer to **German Time** – that's CET (GMT+1) in winter and CEST (GMT+2) in summer – because most Human Connection core team members are living in Germany.
|
||||
|
||||
Daily standup
|
||||
* every Monday–Friday 11:30
|
||||
* in the discord `Conference Room`
|
||||
|
||||
* every Monday–Thursday 11:30 am (german time see above 👆🏼)
|
||||
* in our [Discord](https://discord.gg/AJSX9DCSUA) `Office Cube`
|
||||
* all contributors welcome!
|
||||
* everybody shares what they are working on and asks for help if they are blocked
|
||||
|
||||
<!--
|
||||
Regular pair programming sessions
|
||||
|
||||
* every Monday, Wednesday and Thursday 15:00
|
||||
* the link will be posted in the [discord chat](https://discord.gg/6ub73U3) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
||||
* the link will be posted in the [Discord chat](https://discord.gg/AJSX9DCSUA) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
||||
* all contributors welcome!
|
||||
* we team up and work on an issue together (often using Visual Studio live sharing sessions)
|
||||
|
||||
Open-Source Community Meeting
|
||||
|
||||
* bi-weekly on Mondays 13:00 (when there is no sprint retrospective)
|
||||
* the link will be posted in the [discord chat](https://discord.gg/6ub73U3) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
||||
* the link will be posted in the [Discord chat](https://discord.gg/AJSX9DCSUA) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
||||
* all contributors welcome!
|
||||
|
||||
Meet the team
|
||||
|
||||
* every Monday 21:00 (at the moment only in German)
|
||||
* details here https://human-connection.org/veranstaltungen/
|
||||
* via this [zoom link](https://zoom.us/j/936943532)
|
||||
@ -76,6 +87,7 @@ Meet the team
|
||||
* users of the network chat with the Human Connection team and discuss current questions and issues
|
||||
|
||||
Sprint planning
|
||||
|
||||
* bi-weekly on Tuesday 13:00
|
||||
* via this [zoom link](https://zoom.us/j/7743582385)
|
||||
* all contributors welcome (recommended for those who want to work on an issue in this sprint)
|
||||
@ -87,6 +99,7 @@ Sprint retrospective
|
||||
* via this [zoom link](https://zoom.us/j/7743582385)
|
||||
* all contributors welcome (most interesting for those who participated in the sprint)
|
||||
* we review the past sprint and talk about what went well and what we could improve
|
||||
-->
|
||||
|
||||
## Philosophy
|
||||
|
||||
@ -102,10 +115,9 @@ We use pair programming sessions as a tool for knowledge sharing. We can learn a
|
||||
|
||||
As a volunteeer you have no commitment except your own self development and your awesomeness by contributing to this free and open-source software project. Cheers to you!
|
||||
|
||||
|
||||
## Open-Source Bounties
|
||||
|
||||
There are so many good reasons to contribute to Human Connection
|
||||
There are so many good reasons to contribute to ocelot.social
|
||||
|
||||
* You learn state-of-the-art technologies
|
||||
* You build your portfolio
|
||||
@ -121,7 +133,7 @@ pull request approved and merged for free**. You can choose something really
|
||||
quick and easy. What's important is starting a working relationship with the
|
||||
team, learning the workflow, and understanding this contribution guide. You can
|
||||
filter issues by 'good first issue', to get an idea where to start. Please join
|
||||
our our [community chat](https://human-connection.org/discord), too.
|
||||
our our [Discord community chat](https://discord.gg/AJSX9DCSUA), too.
|
||||
|
||||
You can filter Github issues with label [bounty](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aopen+is%3Aissue+label%3Abounty). These issues should have a second label `€<amount>`
|
||||
which indicate their respective financial compensation in Euros.
|
||||
|
||||
21
README.md
@ -13,7 +13,7 @@ ocelot.social is a nonprofit social, action and knowledge network that connects
|
||||
* **Action**: Don't just read about how to make the world a better place, but come into **Action** by following provided suggestions on the **Action** tab provided by other people or **Organisations**.
|
||||
|
||||
<p align="center">
|
||||
<img src="webapp/static/img/custom/welcome.svg" alt="Ocelot-Social" width="40%" height="40%">
|
||||
<img src="webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%">
|
||||
</p>
|
||||
|
||||
## Live demo
|
||||
@ -31,6 +31,7 @@ Logins:
|
||||
## Directory Layout
|
||||
|
||||
There are four important directories:
|
||||
|
||||
* [Backend](./backend) runs on the server and is a middleware between database and frontend
|
||||
* [Frontend](./webapp) is a server-side-rendered and client-side-rendered web frontend
|
||||
* [Cypress](./cypress) contains end-to-end tests and executable feature specifications
|
||||
@ -46,16 +47,19 @@ There are two approaches:
|
||||
## Installation
|
||||
|
||||
### Clone the Repository
|
||||
|
||||
Clone the repository, this will create a new folder called `Ocelot-Social`:
|
||||
|
||||
Using HTTPS:
|
||||
|
||||
```bash
|
||||
$ git clone https://github.com/Ocelot-Social-Community/Ocelot-Social.git
|
||||
```
|
||||
|
||||
Using SSH:
|
||||
|
||||
```bash
|
||||
$ git clone git@github.com:Human-Connection/Human-Connection.git
|
||||
$ git clone git@github.com:Ocelot-Social-Community/Ocelot-Social.git
|
||||
```
|
||||
|
||||
Change into the new folder.
|
||||
@ -88,13 +92,15 @@ docker-compose version 1.23.2
|
||||
#### Start Ocelot-Social via Docker-Compose
|
||||
|
||||
For Development:
|
||||
|
||||
```bash
|
||||
docker-compose up
|
||||
$ docker-compose up
|
||||
```
|
||||
|
||||
For Production
|
||||
For Production:
|
||||
|
||||
```bash
|
||||
docker-compose -f docker-compose.yml up
|
||||
$ docker-compose -f docker-compose.yml up
|
||||
```
|
||||
|
||||
This will start all required Docker containers
|
||||
@ -107,12 +113,12 @@ The only deployment method in this repository is `docker-compose` for developmen
|
||||
|
||||
## Developer Chat
|
||||
|
||||
Join our friendly open-source community on [Discord](https://discordapp.com/invite/DFSjPaX) :heart_eyes_cat:
|
||||
Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) :heart_eyes_cat:
|
||||
Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard:
|
||||
Check out the [contribution guideline](./CONTRIBUTING.md), too!
|
||||
|
||||
We give write permissions to every developer who asks for it. Just text us on
|
||||
[Discord](https://discord.gg/6ub73U3).
|
||||
[Discord](https://discord.gg/AJSX9DCSUA).
|
||||
|
||||
## Technology Stack
|
||||
|
||||
@ -131,4 +137,5 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/)
|
||||
<img alt="BrowserStack Logo" src=".gitbook/assets/browserstack-logo.svg" width="256">
|
||||
|
||||
## License
|
||||
|
||||
See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT).
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
##################################################################################
|
||||
# BASE ###########################################################################
|
||||
# BASE (Is pushed to DockerHub for rebranding) ###################################
|
||||
##################################################################################
|
||||
FROM node:12.19.0-alpine3.10 as base
|
||||
|
||||
@ -59,12 +59,18 @@ FROM base as development
|
||||
CMD /bin/sh -c "yarn install && yarn run dev"
|
||||
|
||||
##################################################################################
|
||||
# BUILD (Does contain all files and is therefore bloated) ########################
|
||||
# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ###
|
||||
##################################################################################
|
||||
FROM base as build
|
||||
FROM base as code
|
||||
|
||||
# Copy everything
|
||||
# copy everything, but do not build.
|
||||
COPY . .
|
||||
|
||||
##################################################################################
|
||||
# BUILD (Does contain all files and the compilate and is therefore bloated) ######
|
||||
##################################################################################
|
||||
FROM code as build
|
||||
|
||||
# yarn install
|
||||
RUN yarn install --production=false --frozen-lockfile --non-interactive
|
||||
# yarn build
|
||||
@ -85,7 +91,6 @@ FROM base as production
|
||||
|
||||
# Copy "binary"-files from build image
|
||||
COPY --from=build ${DOCKER_WORKDIR}/dist ./dist
|
||||
COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules
|
||||
# Copy static files
|
||||
# TODO - externalize the uploads so we can copy the whole folder
|
||||
COPY --from=build ${DOCKER_WORKDIR}/public/img/ ./public/img/
|
||||
@ -94,4 +99,4 @@ COPY --from=build ${DOCKER_WORKDIR}/public/providers.json ./public/providers.jso
|
||||
COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json
|
||||
|
||||
# Run command
|
||||
CMD /bin/sh -c "yarn run start"
|
||||
CMD /bin/sh -c "yarn run start"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ocelot-social-backend",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.4",
|
||||
"description": "GraphQL Backend for ocelot.social",
|
||||
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
|
||||
"author": "ocelot.social Community",
|
||||
@ -39,6 +39,12 @@
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/cli": "~7.8.4",
|
||||
"@babel/core": "~7.9.0",
|
||||
"@babel/node": "~7.8.7",
|
||||
"@babel/plugin-proposal-throw-expressions": "^7.8.3",
|
||||
"@babel/preset-env": "~7.9.5",
|
||||
"@babel/register": "^7.9.0",
|
||||
"@hapi/joi": "^17.1.1",
|
||||
"@sentry/node": "^5.15.4",
|
||||
"apollo-cache-inmemory": "~1.6.5",
|
||||
@ -48,6 +54,9 @@
|
||||
"apollo-server": "~2.14.2",
|
||||
"apollo-server-express": "^2.14.2",
|
||||
"aws-sdk": "^2.652.0",
|
||||
"babel-core": "~7.0.0-0",
|
||||
"babel-eslint": "~10.1.0",
|
||||
"babel-jest": "~25.2.6",
|
||||
"babel-plugin-transform-runtime": "^6.23.0",
|
||||
"bcryptjs": "~2.4.3",
|
||||
"cheerio": "~1.0.0-rc.3",
|
||||
@ -111,16 +120,7 @@
|
||||
"xregexp": "^4.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/cli": "~7.8.4",
|
||||
"@babel/core": "~7.9.0",
|
||||
"@babel/node": "~7.8.7",
|
||||
"@babel/plugin-proposal-throw-expressions": "^7.8.3",
|
||||
"@babel/preset-env": "~7.9.5",
|
||||
"@babel/register": "^7.9.0",
|
||||
"apollo-server-testing": "~2.11.0",
|
||||
"babel-core": "~7.0.0-0",
|
||||
"babel-eslint": "~10.1.0",
|
||||
"babel-jest": "~25.2.6",
|
||||
"chai": "~4.2.0",
|
||||
"cucumber": "~6.0.5",
|
||||
"eslint": "~6.8.0",
|
||||
|
||||
@ -40,8 +40,8 @@ const server = {
|
||||
const smtp = {
|
||||
SMTP_HOST: env.SMTP_HOST,
|
||||
SMTP_PORT: env.SMTP_PORT,
|
||||
SMTP_IGNORE_TLS: env.SMTP_IGNORE_TLS === 'true' || true,
|
||||
SMTP_SECURE: env.SMTP_IGNORE_TLS === 'true' || false,
|
||||
SMTP_IGNORE_TLS: env.SMTP_IGNORE_TLS !== 'false', // default = true
|
||||
SMTP_SECURE: env.SMTP_SECURE === 'true',
|
||||
SMTP_USERNAME: env.SMTP_USERNAME,
|
||||
SMTP_PASSWORD: env.SMTP_PASSWORD,
|
||||
}
|
||||
|
||||
@ -1,6 +1,13 @@
|
||||
// this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding
|
||||
export default {
|
||||
ORGANIZATION: 'https://ocelot.social',
|
||||
DONATE: 'https://ocelot-social.herokuapp.com/donations',
|
||||
FAQ: 'https://ocelot.social',
|
||||
SUPPORT: 'https://ocelot.social',
|
||||
|
||||
// on null or empty strings internal imprint is used, see 'webapp/locales/html/'
|
||||
DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly
|
||||
IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly
|
||||
TERMS_AND_CONDITIONS: null,
|
||||
CODE_OF_CONDUCT: null,
|
||||
DATA_PRIVACY: null,
|
||||
FAQ: 'https://ocelot.social',
|
||||
}
|
||||
|
||||
10
backend/src/config/logos.js
Normal file
@ -0,0 +1,10 @@
|
||||
// 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_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',
|
||||
}
|
||||
@ -1,7 +1,9 @@
|
||||
// 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',
|
||||
APPLICATION_DESCRIPTION: 'ocelot.social Community Network',
|
||||
COOKIE_NAME: 'ocelot-social-token',
|
||||
ORGANIZATION_NAME: 'ocelot.social Community',
|
||||
ORGANIZATION_JURISDICTION: 'City of Angels',
|
||||
}
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
import mustache from 'mustache'
|
||||
import CONFIG from '../../config'
|
||||
import logosWebapp from '../../config/logos.js'
|
||||
|
||||
import * as templates from './templates'
|
||||
|
||||
const from = CONFIG.EMAIL_DEFAULT_SENDER
|
||||
const welcomeImageUrl = new URL(`/img/custom/welcome.svg`, CONFIG.CLIENT_URI)
|
||||
const welcomeImageUrl = new URL(logosWebapp.LOGO_WELCOME_PATH, CONFIG.CLIENT_URI)
|
||||
|
||||
const defaultParams = {
|
||||
supportUrl: CONFIG.SUPPORT_URL,
|
||||
|
||||
@ -18,7 +18,6 @@ services:
|
||||
- webapp_node_modules:/app/node_modules
|
||||
# bind the local folder to the docker to allow live reload
|
||||
- ./webapp:/app
|
||||
|
||||
########################################################
|
||||
# BACKEND ##############################################
|
||||
########################################################
|
||||
@ -35,7 +34,6 @@ services:
|
||||
- backend_node_modules:/app/node_modules
|
||||
# bind the local folder to the docker to allow live reload
|
||||
- ./backend:/app
|
||||
|
||||
########################################################
|
||||
# NEO4J ################################################
|
||||
########################################################
|
||||
@ -47,13 +45,11 @@ services:
|
||||
networks:
|
||||
# So we can access the neo4j query browser from our host machine
|
||||
- external-net
|
||||
|
||||
########################################################
|
||||
# MAINTENANCE ##########################################
|
||||
########################################################
|
||||
maintenance:
|
||||
image: ocelotsocialnetwork/maintenance:development
|
||||
|
||||
########################################################
|
||||
# MAILSERVER TO FAKE SMTP ##############################
|
||||
########################################################
|
||||
@ -63,6 +59,7 @@ services:
|
||||
- 1080:80
|
||||
networks:
|
||||
- external-net
|
||||
|
||||
volumes:
|
||||
webapp_node_modules:
|
||||
backend_node_modules:
|
||||
|
||||
@ -12,7 +12,6 @@ services:
|
||||
- NODE_ENV="test"
|
||||
volumes:
|
||||
- ./coverage:/app/coverage
|
||||
|
||||
########################################################
|
||||
# BACKEND ##############################################
|
||||
########################################################
|
||||
@ -24,7 +23,6 @@ services:
|
||||
- NODE_ENV="test"
|
||||
volumes:
|
||||
- ./coverage:/app/coverage
|
||||
|
||||
########################################################
|
||||
# NEO4J ################################################
|
||||
########################################################
|
||||
@ -41,13 +39,11 @@ services:
|
||||
networks:
|
||||
# So we can access the neo4j query browser from our host machine
|
||||
- external-net
|
||||
|
||||
########################################################
|
||||
# MAINTENANCE ##########################################
|
||||
########################################################
|
||||
maintenance:
|
||||
image: ocelotsocialnetwork/maintenance:test
|
||||
|
||||
########################################################
|
||||
# MAILSERVER TO FAKE SMTP ##############################
|
||||
########################################################
|
||||
@ -57,6 +53,7 @@ services:
|
||||
- 1080:80
|
||||
networks:
|
||||
- external-net
|
||||
|
||||
volumes:
|
||||
webapp_node_modules:
|
||||
backend_node_modules:
|
||||
|
||||
@ -35,7 +35,6 @@ services:
|
||||
- GRAPHQL_URI=http://backend:4000
|
||||
env_file:
|
||||
- ./webapp/.env
|
||||
|
||||
########################################################
|
||||
# BACKEND ##############################################
|
||||
########################################################
|
||||
@ -68,7 +67,6 @@ services:
|
||||
- CLIENT_URI=http://webapp:3000
|
||||
env_file:
|
||||
- ./backend/.env
|
||||
|
||||
########################################################
|
||||
# NEO4J ################################################
|
||||
########################################################
|
||||
@ -92,7 +90,6 @@ services:
|
||||
# TODO: clarify if that is the only thing needed to unlock the Enterprise version
|
||||
# - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes
|
||||
# TODO: Remove the playground from production
|
||||
|
||||
########################################################
|
||||
# MAINTENANCE ##########################################
|
||||
########################################################
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ocelot-social",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.4",
|
||||
"description": "Fullstack and API tests with cypress and cucumber for ocelot.social",
|
||||
"author": "ocelot.social Community",
|
||||
"license": "MIT",
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
##################################################################################
|
||||
# BASE ###########################################################################
|
||||
# BASE (Is pushed to DockerHub for rebranding) ###################################
|
||||
##################################################################################
|
||||
FROM node:12.19.0-alpine3.10 as base
|
||||
|
||||
@ -59,12 +59,18 @@ FROM base as development
|
||||
CMD /bin/sh -c "yarn install && yarn run dev"
|
||||
|
||||
##################################################################################
|
||||
# BUILD (Does contain all files and is therefore bloated) ########################
|
||||
# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ###
|
||||
##################################################################################
|
||||
FROM base as build
|
||||
FROM base as code
|
||||
|
||||
# Copy everything
|
||||
# copy everything, but do not build.
|
||||
COPY . .
|
||||
|
||||
##################################################################################
|
||||
# BUILD (Does contain all files and the compilate and is therefore bloated) ######
|
||||
##################################################################################
|
||||
FROM code as build
|
||||
|
||||
# yarn install
|
||||
RUN yarn install --production=false --frozen-lockfile --non-interactive
|
||||
# yarn build
|
||||
@ -83,18 +89,13 @@ CMD /bin/sh -c "yarn run dev"
|
||||
##################################################################################
|
||||
FROM base as production
|
||||
|
||||
# TODO - do all copying with one COPY command to have one layer
|
||||
# Copy "binary"-files from build image
|
||||
COPY --from=build ${DOCKER_WORKDIR}/.nuxt ./.nuxt
|
||||
COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules
|
||||
COPY --from=build ${DOCKER_WORKDIR}/nuxt.config.js ./nuxt.config.js
|
||||
# Copy static files
|
||||
# TODO - this should be one Folder containign all stuff needed to be copied
|
||||
COPY --from=build ${DOCKER_WORKDIR}/config/ ./config/
|
||||
COPY --from=build ${DOCKER_WORKDIR}/constants ./constants
|
||||
COPY --from=build ${DOCKER_WORKDIR}/static ./static
|
||||
COPY --from=build ${DOCKER_WORKDIR}/locales ./locales
|
||||
# Copy package.json for script definitions (lock file should not be needed)
|
||||
COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json
|
||||
|
||||
# Run command
|
||||
CMD /bin/sh -c "yarn run start"
|
||||
CMD /bin/sh -c "yarn run start"
|
||||
|
||||
@ -48,11 +48,12 @@ WORKDIR ${DOCKER_WORKDIR}
|
||||
CMD ["yarn", "run", "start"]
|
||||
|
||||
##################################################################################
|
||||
# BUILD ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO ##
|
||||
# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ###
|
||||
##################################################################################
|
||||
FROM base as build
|
||||
FROM base as code
|
||||
|
||||
COPY package.json yarn.lock ./
|
||||
# yarn install
|
||||
RUN yarn install --production=false --frozen-lockfile --non-interactive
|
||||
|
||||
COPY assets assets
|
||||
@ -67,10 +68,17 @@ COPY constants constants
|
||||
COPY nuxt.config.js nuxt.config.js
|
||||
COPY config/ config/
|
||||
|
||||
# this is needed in rebranding
|
||||
COPY maintenance/nginx maintenance/nginx
|
||||
# this will also ovewrite the existing package.json
|
||||
COPY maintenance/source ./
|
||||
|
||||
##################################################################################
|
||||
# BUILD ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO ##
|
||||
##################################################################################
|
||||
FROM code as build
|
||||
|
||||
# yarn generate
|
||||
RUN yarn run generate
|
||||
|
||||
##################################################################################
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
<base-card>
|
||||
<template #imageColumn>
|
||||
<a :href="links.ORGANIZATION" :title="$t('login.moreInfo', metadata)" target="_blank">
|
||||
<img class="image" alt="Welcome" src="/img/custom/welcome.svg" />
|
||||
<logo logoType="welcome" />
|
||||
</a>
|
||||
</template>
|
||||
<h2 class="title">{{ $t('login.login') }}</h2>
|
||||
@ -31,11 +31,7 @@
|
||||
ref="password"
|
||||
:type="showPassword ? 'text' : 'password'"
|
||||
/>
|
||||
<span class="click-wrapper" @click="toggleShowPassword">
|
||||
<span class="icon-wrapper" :data-test="iconName">
|
||||
<base-icon class="toggle-icon" :name="iconName" />
|
||||
</span>
|
||||
</span>
|
||||
<show-password @show-password="toggleShowPassword" :iconName="iconName" />
|
||||
</div>
|
||||
<nuxt-link to="/password-reset/request">
|
||||
{{ $t('login.forgotPassword') }}
|
||||
@ -56,13 +52,17 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import LocaleSwitch from '~/components/LocaleSwitch/LocaleSwitch'
|
||||
import links from '~/constants/links.js'
|
||||
import metadata from '~/constants/metadata.js'
|
||||
import LocaleSwitch from '~/components/LocaleSwitch/LocaleSwitch'
|
||||
import Logo from '~/components/Logo/Logo'
|
||||
import ShowPassword from '../ShowPassword/ShowPassword.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LocaleSwitch,
|
||||
Logo,
|
||||
ShowPassword,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@ -98,9 +98,8 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
toggleShowPassword(event) {
|
||||
toggleShowPassword() {
|
||||
this.showPassword = !this.showPassword
|
||||
event.preventDefault()
|
||||
this.$nextTick(() => {
|
||||
this.$refs.password.$el.children[1].children[1].focus()
|
||||
this.$emit('focus')
|
||||
@ -114,7 +113,7 @@ export default {
|
||||
.login-form {
|
||||
width: 80vw;
|
||||
max-width: 620px;
|
||||
margin: auto;
|
||||
/* margin: auto; */
|
||||
|
||||
.base-button {
|
||||
display: block;
|
||||
@ -122,9 +121,6 @@ export default {
|
||||
margin-top: $space-large;
|
||||
margin-bottom: $space-small;
|
||||
}
|
||||
.image {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.password-wrapper {
|
||||
@ -145,28 +141,6 @@ export default {
|
||||
outline: none;
|
||||
transition: all $duration-short $ease-out;
|
||||
|
||||
.icon-wrapper {
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.click-wrapper {
|
||||
padding: 8px;
|
||||
align-content: center;
|
||||
color: $text-color-disabled;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.click-wrapper:hover {
|
||||
&:focus-within {
|
||||
background-color: $background-color-base;
|
||||
border: $input-border-size solid $border-color-active;
|
||||
|
||||
.toggle-icon {
|
||||
color: $text-color-base;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:focus-within {
|
||||
background-color: $background-color-base;
|
||||
border: $input-border-size solid $border-color-active;
|
||||
|
||||
@ -4,18 +4,20 @@ import Logo from './Logo.vue'
|
||||
const localVue = global.localVue
|
||||
|
||||
describe('Logo.vue', () => {
|
||||
let wrapper
|
||||
let mocks
|
||||
let mocks, propsData, wrapper
|
||||
|
||||
beforeEach(() => {
|
||||
mocks = {
|
||||
$t: jest.fn(),
|
||||
}
|
||||
propsData = {
|
||||
logoType: 'header',
|
||||
}
|
||||
})
|
||||
|
||||
describe('mount', () => {
|
||||
const Wrapper = () => {
|
||||
return mount(Logo, { mocks, localVue })
|
||||
return mount(Logo, { mocks, localVue, propsData })
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
|
||||
@ -1,24 +1,47 @@
|
||||
<template>
|
||||
<component :is="tag" class="ds-logo" :class="[inverse && 'ds-logo-inverse']">
|
||||
<svg-logo v-if="!inverse" class="ds-logo-svg" />
|
||||
<svg-logo-inverse v-else class="ds-logo-svg" />
|
||||
<img
|
||||
v-if="!inverse"
|
||||
class="ds-logo-svg"
|
||||
:alt="metadata.APPLICATION_NAME + ' ' + logo.alt"
|
||||
:src="logo.path"
|
||||
:style="logoWidthStyle"
|
||||
/>
|
||||
<img
|
||||
v-else
|
||||
class="ds-logo-svg"
|
||||
:alt="metadata.APPLICATION_NAME + ' ' + logo.alt"
|
||||
:src="logo.path"
|
||||
:style="logoWidthStyle"
|
||||
/>
|
||||
</component>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import svgLogo from '~/static/img/custom/Logo-Horizontal.svg'
|
||||
import svgLogoInverse from '~/static/img/custom/Logo-Horizontal-Dark.svg'
|
||||
import logos from '~/constants/logos.js'
|
||||
import metadata from '~/constants/metadata.js'
|
||||
|
||||
/**
|
||||
* This component displays the brand's logo.
|
||||
* @version 1.0.0
|
||||
*/
|
||||
export default {
|
||||
name: 'Logo',
|
||||
components: {
|
||||
svgLogo,
|
||||
svgLogoInverse,
|
||||
},
|
||||
props: {
|
||||
/**
|
||||
* Logo type
|
||||
*/
|
||||
logoType: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
/**
|
||||
* Logo width
|
||||
*/
|
||||
logoWidth: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
/**
|
||||
* Inverse the logo
|
||||
*/
|
||||
@ -34,6 +57,39 @@ export default {
|
||||
default: 'div',
|
||||
},
|
||||
},
|
||||
data() {
|
||||
const logosObject = {
|
||||
header: { path: logos.LOGO_HEADER_PATH, alt: 'Header', widthDefault: '130px' },
|
||||
welcome: { path: logos.LOGO_WELCOME_PATH, alt: 'Welcome', widthDefault: '200px' },
|
||||
signup: { path: logos.LOGO_SIGNUP_PATH, alt: 'Sign Up', widthDefault: '200px' },
|
||||
logout: { path: logos.LOGO_LOGOUT_PATH, alt: 'Logging Out', widthDefault: '200px' },
|
||||
passwordReset: {
|
||||
path: logos.LOGO_PASSWORD_RESET_PATH,
|
||||
alt: 'Reset Your Password',
|
||||
widthDefault: '200px',
|
||||
},
|
||||
maintenance: {
|
||||
path: logos.LOGO_MAINTENACE_RESET_PATH,
|
||||
alt: 'Under Maintenance',
|
||||
widthDefault: '75%',
|
||||
},
|
||||
}
|
||||
return {
|
||||
logo: logosObject[this.logoType],
|
||||
metadata,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
logoWidthStyle() {
|
||||
let width = ''
|
||||
if (this.logoWidth === null) {
|
||||
width = this.logo.widthDefault
|
||||
} else {
|
||||
width = this.logoWidth
|
||||
}
|
||||
return `width: ${width};`
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { config, mount } from '@vue/test-utils'
|
||||
import PageFooter from './PageFooter.vue'
|
||||
import links from '~/constants/links.js'
|
||||
import linksDefault from '~/constants/links.js'
|
||||
|
||||
const localVue = global.localVue
|
||||
|
||||
@ -8,6 +8,7 @@ config.stubs['nuxt-link'] = '<span class="nuxt-link"><slot /></span>'
|
||||
|
||||
describe('PageFooter.vue', () => {
|
||||
let mocks
|
||||
let wrapper
|
||||
|
||||
beforeEach(() => {
|
||||
mocks = {
|
||||
@ -15,30 +16,118 @@ describe('PageFooter.vue', () => {
|
||||
$env: {
|
||||
VERSION: 'v1.0.0',
|
||||
},
|
||||
links,
|
||||
}
|
||||
})
|
||||
|
||||
describe('mount', () => {
|
||||
let wrapper
|
||||
const Wrapper = () => {
|
||||
return mount(PageFooter, { mocks, localVue })
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper()
|
||||
describe('links.js', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper()
|
||||
})
|
||||
|
||||
it('renders four links', () => {
|
||||
expect(wrapper.findAll('a')).toHaveLength(4)
|
||||
})
|
||||
|
||||
it('renders three nuxt-links', () => {
|
||||
expect(wrapper.findAll('.nuxt-link')).toHaveLength(3)
|
||||
})
|
||||
|
||||
it('renders version', () => {
|
||||
expect(wrapper.find('.ds-footer').text()).toContain('v1.0.0')
|
||||
})
|
||||
})
|
||||
|
||||
it('renders three links', () => {
|
||||
expect(wrapper.findAll('a')).toHaveLength(3)
|
||||
describe('inflexible links', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper()
|
||||
})
|
||||
|
||||
it('renders ORGANIZATION', () => {
|
||||
expect(wrapper.find('a[data-test="organization-link"]').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders version', () => {
|
||||
expect(wrapper.find('a[data-test="version-link"]').exists()).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
it('renders four nuxt-links', () => {
|
||||
expect(wrapper.findAll('.nuxt-link')).toHaveLength(4)
|
||||
describe('flexible links not set', () => {
|
||||
beforeEach(async () => {
|
||||
const links = {
|
||||
...linksDefault,
|
||||
IMPRINT: null,
|
||||
TERMS_AND_CONDITIONS: null,
|
||||
CODE_OF_CONDUCT: null,
|
||||
DATA_PRIVACY: null,
|
||||
FAQ: null,
|
||||
}
|
||||
wrapper = Wrapper()
|
||||
wrapper.setData({ links })
|
||||
await wrapper.vm.$nextTick()
|
||||
})
|
||||
|
||||
it('renders IMPRINT as nuxt-link', () => {
|
||||
expect(wrapper.find('span[data-test="imprint-nuxt-link"]').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders TERMS_AND_CONDITIONS as nuxt-link', () => {
|
||||
expect(wrapper.find('span[data-test="terms-nuxt-link"]').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders CODE_OF_CONDUCT as nuxt-link', () => {
|
||||
expect(wrapper.find('span[data-test="code-nuxt-link"]').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders DATA_PRIVACY as nuxt-link', () => {
|
||||
expect(wrapper.find('span[data-test="data-nuxt-link"]').exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders FAQ as nuxt-link', () => {
|
||||
expect(wrapper.find('span[data-test="faq-nuxt-link"]').exists()).toBe(true)
|
||||
})
|
||||
})
|
||||
|
||||
it('renders version', () => {
|
||||
expect(wrapper.find('.ds-footer').text()).toContain('v1.0.0')
|
||||
describe('flexible links set', () => {
|
||||
beforeEach(async () => {
|
||||
const links = {
|
||||
...linksDefault,
|
||||
IMPRINT: 'https://ocelot.social/IMPRINT',
|
||||
TERMS_AND_CONDITIONS: 'https://ocelot.social/TERMS_AND_CONDITIONS',
|
||||
CODE_OF_CONDUCT: 'https://ocelot.social/CODE_OF_CONDUCT',
|
||||
DATA_PRIVACY: 'https://ocelot.social/DATA_PRIVACY',
|
||||
FAQ: 'https://ocelot.social/FAQ',
|
||||
}
|
||||
wrapper = Wrapper()
|
||||
wrapper.setData({ links })
|
||||
await wrapper.vm.$nextTick()
|
||||
})
|
||||
|
||||
it('renders IMPRINT as "a" tag link', () => {
|
||||
expect(wrapper.find(`a[href="https://ocelot.social/IMPRINT"]`).exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders TERMS_AND_CONDITIONS as "a" tag link', () => {
|
||||
expect(wrapper.find(`a[href="https://ocelot.social/TERMS_AND_CONDITIONS"]`).exists()).toBe(
|
||||
true,
|
||||
)
|
||||
})
|
||||
|
||||
it('renders CODE_OF_CONDUCT as "a" tag link', () => {
|
||||
expect(wrapper.find(`a[href="https://ocelot.social/CODE_OF_CONDUCT"]`).exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders DATA_PRIVACY as "a" tag link', () => {
|
||||
expect(wrapper.find(`a[href="https://ocelot.social/DATA_PRIVACY"]`).exists()).toBe(true)
|
||||
})
|
||||
|
||||
it('renders FAQ as "a" tag link', () => {
|
||||
expect(wrapper.find(`a[href="https://ocelot.social/FAQ"]`).exists()).toBe(true)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@ -1,26 +1,67 @@
|
||||
<template>
|
||||
<div id="footer" class="ds-footer">
|
||||
<a :href="links.ORGANIZATION" target="_blank" v-html="$t('site.made')"></a>
|
||||
<!-- made with ❤️ -->
|
||||
<a :href="links.ORGANIZATION" target="_blank" data-test="organization-link">
|
||||
{{ $t('site.made') }}
|
||||
</a>
|
||||
<span>-</span>
|
||||
<nuxt-link to="/imprint">
|
||||
<!-- imprint -->
|
||||
<nuxt-link v-if="noLinkDefined(links.IMPRINT)" to="/imprint" data-test="imprint-nuxt-link">
|
||||
{{ $t('site.imprint') }}
|
||||
</nuxt-link>
|
||||
<a v-else :href="links.IMPRINT" target="_blank">
|
||||
{{ $t('site.imprint') }}
|
||||
</a>
|
||||
<span>-</span>
|
||||
<nuxt-link to="/terms-and-conditions">{{ $t('site.termsAndConditions') }}</nuxt-link>
|
||||
<!-- terms and conditions -->
|
||||
<nuxt-link
|
||||
v-if="noLinkDefined(links.TERMS_AND_CONDITIONS)"
|
||||
to="/terms-and-conditions"
|
||||
data-test="terms-nuxt-link"
|
||||
>
|
||||
{{ $t('site.termsAndConditions') }}
|
||||
</nuxt-link>
|
||||
<a v-else :href="links.TERMS_AND_CONDITIONS" target="_blank">
|
||||
{{ $t('site.termsAndConditions') }}
|
||||
</a>
|
||||
<span>-</span>
|
||||
<nuxt-link to="/code-of-conduct">{{ $t('site.code-of-conduct') }}</nuxt-link>
|
||||
<!-- code of conduct -->
|
||||
<nuxt-link
|
||||
v-if="noLinkDefined(links.CODE_OF_CONDUCT)"
|
||||
to="/code-of-conduct"
|
||||
data-test="code-nuxt-link"
|
||||
>
|
||||
{{ $t('site.code-of-conduct') }}
|
||||
</nuxt-link>
|
||||
<a v-else :href="links.CODE_OF_CONDUCT" target="_blank">
|
||||
{{ $t('site.code-of-conduct') }}
|
||||
</a>
|
||||
<span>-</span>
|
||||
<nuxt-link to="/data-privacy">
|
||||
<!-- data privacy -->
|
||||
<nuxt-link
|
||||
v-if="noLinkDefined(links.DATA_PRIVACY)"
|
||||
to="/data-privacy"
|
||||
data-test="data-nuxt-link"
|
||||
>
|
||||
{{ $t('site.data-privacy') }}
|
||||
</nuxt-link>
|
||||
<a v-else :href="links.DATA_PRIVACY" target="_blank">
|
||||
{{ $t('site.data-privacy') }}
|
||||
</a>
|
||||
<span>-</span>
|
||||
<a :href="links.FAQ" target="_blank">
|
||||
<!-- faq -->
|
||||
<nuxt-link v-if="noLinkDefined(links.FAQ)" to="/faq" data-test="faq-nuxt-link">
|
||||
{{ $t('site.faq') }}
|
||||
</nuxt-link>
|
||||
<a v-else :href="links.FAQ" target="_blank">
|
||||
{{ $t('site.faq') }}
|
||||
</a>
|
||||
<span>-</span>
|
||||
<!-- version -->
|
||||
<a
|
||||
href="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CHANGELOG.md"
|
||||
target="_blank"
|
||||
data-test="version-link"
|
||||
>
|
||||
{{ version }}
|
||||
</a>
|
||||
@ -29,10 +70,16 @@
|
||||
|
||||
<script>
|
||||
import links from '~/constants/links.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return { links, version: `v${this.$env.VERSION}` }
|
||||
},
|
||||
methods: {
|
||||
noLinkDefined(link) {
|
||||
return !link || link.length === 0
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@ -40,24 +40,43 @@
|
||||
:label="$t('settings.data.labelName')"
|
||||
:placeholder="$t('settings.data.namePlaceholder')"
|
||||
/>
|
||||
<ds-input
|
||||
id="password"
|
||||
model="password"
|
||||
type="password"
|
||||
autocomplete="off"
|
||||
:label="$t('settings.security.change-password.label-new-password')"
|
||||
/>
|
||||
<ds-input
|
||||
id="passwordConfirmation"
|
||||
model="passwordConfirmation"
|
||||
type="password"
|
||||
autocomplete="off"
|
||||
:label="$t('settings.security.change-password.label-new-password-confirm')"
|
||||
/>
|
||||
<label for="password">
|
||||
{{ $t('settings.security.change-password.label-new-password') }}
|
||||
</label>
|
||||
<div class="password-wrapper">
|
||||
<ds-input
|
||||
id="password"
|
||||
model="password"
|
||||
:type="showPassword ? 'text' : 'password'"
|
||||
autocomplete="off"
|
||||
class="password-field"
|
||||
ref="password"
|
||||
/>
|
||||
<show-password
|
||||
@show-password="toggleShowPassword('password')"
|
||||
:iconName="iconNamePassword"
|
||||
/>
|
||||
</div>
|
||||
<label for="passwordConfirmation">
|
||||
{{ $t('settings.security.change-password.label-new-password-confirm') }}
|
||||
</label>
|
||||
<div class="password-wrapper">
|
||||
<ds-input
|
||||
id="passwordConfirmation"
|
||||
model="passwordConfirmation"
|
||||
:type="showPasswordConfirm ? 'text' : 'password'"
|
||||
autocomplete="off"
|
||||
class="password-field"
|
||||
ref="confirmPassword"
|
||||
/>
|
||||
<show-password
|
||||
@show-password="toggleShowPassword('confirmPassword')"
|
||||
:iconName="iconNamePasswordConfirm"
|
||||
/>
|
||||
</div>
|
||||
<password-strength class="password-strength" :password="formData.password" />
|
||||
|
||||
<email-display-and-verify :email="sliderData.collectedInputData.email" />
|
||||
|
||||
<ds-text>
|
||||
<input
|
||||
id="checkbox0"
|
||||
@ -106,6 +125,7 @@ import EmailDisplayAndVerify from './EmailDisplayAndVerify'
|
||||
import { SweetalertIcon } from 'vue-sweetalert-icons'
|
||||
import PasswordForm from '~/components/utils/PasswordFormHelper'
|
||||
import { SignupVerificationMutation } from '~/graphql/Registration.js'
|
||||
import ShowPassword from '../ShowPassword/ShowPassword.vue'
|
||||
|
||||
export default {
|
||||
name: 'RegistrationSlideCreate',
|
||||
@ -113,6 +133,7 @@ export default {
|
||||
PasswordStrength,
|
||||
EmailDisplayAndVerify,
|
||||
SweetalertIcon,
|
||||
ShowPassword,
|
||||
},
|
||||
props: {
|
||||
sliderData: { type: Object, required: true },
|
||||
@ -140,6 +161,8 @@ export default {
|
||||
// have checkmarks available.
|
||||
termsAndConditionsConfirmed: false,
|
||||
recieveCommunicationAsEmailsEtcConfirmed: false,
|
||||
showPassword: false,
|
||||
showPasswordConfirm: false,
|
||||
}
|
||||
},
|
||||
mounted: function () {
|
||||
@ -180,6 +203,12 @@ export default {
|
||||
this.recieveCommunicationAsEmailsEtcConfirmed
|
||||
)
|
||||
},
|
||||
iconNamePassword() {
|
||||
return this.showPassword ? 'eye-slash' : 'eye'
|
||||
},
|
||||
iconNamePasswordConfirm() {
|
||||
return this.showPasswordConfirm ? 'eye-slash' : 'eye'
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
termsAndConditionsConfirmed() {
|
||||
@ -251,6 +280,21 @@ export default {
|
||||
this.submit()
|
||||
return true
|
||||
},
|
||||
toggleShowPassword(e) {
|
||||
if (e === 'password') {
|
||||
this.showPassword = !this.showPassword
|
||||
this.$nextTick(() => {
|
||||
this.$refs.password.$el.children[1].children[0].focus()
|
||||
this.$emit('focus')
|
||||
})
|
||||
} else {
|
||||
this.showPasswordConfirm = !this.showPasswordConfirm
|
||||
this.$nextTick(() => {
|
||||
this.$refs.confirmPassword.$el.children[1].children[0].focus()
|
||||
this.$emit('focus')
|
||||
})
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -259,4 +303,44 @@ export default {
|
||||
.password-strength {
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.password-wrapper {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
align-items: center;
|
||||
padding: $input-padding-vertical $space-x-small;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
height: $input-height;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 16px;
|
||||
|
||||
color: $text-color-base;
|
||||
background: $background-color-disabled;
|
||||
|
||||
border: $input-border-size solid $border-color-softer;
|
||||
border-left: none;
|
||||
border-radius: $border-radius-base;
|
||||
outline: none;
|
||||
transition: all $duration-short $ease-out;
|
||||
|
||||
&:focus-within {
|
||||
background-color: $background-color-base;
|
||||
border: $input-border-size solid $border-color-active;
|
||||
|
||||
.toggle-icon {
|
||||
color: $text-color-base;
|
||||
}
|
||||
}
|
||||
|
||||
.password-field {
|
||||
position: relative;
|
||||
padding-top: 16px;
|
||||
border: none;
|
||||
border-style: none;
|
||||
appearance: none;
|
||||
margin-left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<base-card>
|
||||
<template #imageColumn>
|
||||
<a :href="links.ORGANIZATION" :title="$t('login.moreInfo', metadata)" target="_blank">
|
||||
<img class="image" alt="Welcome" src="/img/custom/welcome.svg" />
|
||||
<logo logoType="signup" />
|
||||
</a>
|
||||
</template>
|
||||
|
||||
@ -47,6 +47,7 @@ import links from '~/constants/links.js'
|
||||
import metadata from '~/constants/metadata.js'
|
||||
import ComponentSlider from '~/components/ComponentSlider/ComponentSlider'
|
||||
import LocaleSwitch from '~/components/LocaleSwitch/LocaleSwitch'
|
||||
import Logo from '~/components/Logo/Logo'
|
||||
import RegistrationSlideCreate from './RegistrationSlideCreate'
|
||||
import RegistrationSlideEmail from './RegistrationSlideEmail'
|
||||
import RegistrationSlideInvite from './RegistrationSlideInvite'
|
||||
@ -58,6 +59,7 @@ export default {
|
||||
components: {
|
||||
ComponentSlider,
|
||||
LocaleSwitch,
|
||||
Logo,
|
||||
RegistrationSlideCreate,
|
||||
RegistrationSlideEmail,
|
||||
RegistrationSlideInvite,
|
||||
|
||||
33
webapp/components/ShowPassword/ShowPassword.spec.js
Normal file
@ -0,0 +1,33 @@
|
||||
import Vue from 'vue'
|
||||
import { mount } from '@vue/test-utils'
|
||||
|
||||
import ShowPassword from './ShowPassword.vue'
|
||||
|
||||
describe('ShowPassword', () => {
|
||||
describe('State of show password icon', () => {
|
||||
const wrapper = mount(ShowPassword, {
|
||||
propsData: {
|
||||
iconName: 'eye',
|
||||
},
|
||||
})
|
||||
|
||||
it('Shows eye icon by default', () => {
|
||||
expect(wrapper.find('.icon-wrapper').attributes('data-test')).toEqual('eye')
|
||||
})
|
||||
|
||||
describe('After click', () => {
|
||||
it('Password wrapper emits show-password event', async () => {
|
||||
wrapper.find('.click-wrapper').trigger('click')
|
||||
await Vue.nextTick()
|
||||
expect(wrapper.emitted()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('Shows the slash-eye icon after click', async () => {
|
||||
wrapper.find('.click-wrapper').trigger('click')
|
||||
wrapper.setProps({ iconName: 'eye-slash' })
|
||||
await Vue.nextTick()
|
||||
expect(wrapper.find('.icon-wrapper').attributes('data-test')).toEqual('eye-slash')
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
44
webapp/components/ShowPassword/ShowPassword.vue
Normal file
@ -0,0 +1,44 @@
|
||||
<template>
|
||||
<span class="click-wrapper" @click="togglePassword">
|
||||
<span class="icon-wrapper" :data-test="iconName">
|
||||
<base-icon class="toggle-icon" :name="iconName" />
|
||||
</span>
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ['iconName'],
|
||||
emits: ['toggle-password'],
|
||||
methods: {
|
||||
togglePassword(event) {
|
||||
event.preventDefault()
|
||||
this.$emit('show-password')
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.icon-wrapper {
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.click-wrapper {
|
||||
padding: 8px;
|
||||
align-content: center;
|
||||
color: $text-color-disabled;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.click-wrapper:hover {
|
||||
&:focus-within {
|
||||
background-color: $background-color-base;
|
||||
border: $input-border-size solid $border-color-active;
|
||||
|
||||
.toggle-icon {
|
||||
color: $text-color-base;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -1,5 +1,6 @@
|
||||
import { storiesOf } from '@storybook/vue'
|
||||
import helpers from '~/storybook/helpers'
|
||||
import logos from '~/constants/logos.js'
|
||||
import BaseCard from './BaseCard.vue'
|
||||
|
||||
storiesOf('Generic/BaseCard', module)
|
||||
@ -33,7 +34,7 @@ storiesOf('Generic/BaseCard', module)
|
||||
template: `
|
||||
<base-card style="width: 600px;">
|
||||
<template #imageColumn>
|
||||
<img class="image" alt="Example image" src="/img/custom/welcome.svg" />
|
||||
<img class="image" alt="Example image" src="${logos.LOGO_WELCOME_PATH}" />
|
||||
</template>
|
||||
<h2 class="title">I am a card heading</h2>
|
||||
<p>And I am a paragraph.</p>
|
||||
@ -46,7 +47,7 @@ storiesOf('Generic/BaseCard', module)
|
||||
template: `
|
||||
<base-card style="width: 600px;">
|
||||
<template #imageColumn>
|
||||
<img class="image" alt="Example image" src="/img/custom/welcome.svg" />
|
||||
<img class="image" alt="Example image" src="${logos.LOGO_WELCOME_PATH}" />
|
||||
</template>
|
||||
<h2 class="title">I am a card heading</h2>
|
||||
<p>And I am a paragraph.</p>
|
||||
|
||||
@ -1,6 +1,13 @@
|
||||
// this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding
|
||||
export default {
|
||||
ORGANIZATION: 'https://ocelot.social',
|
||||
DONATE: 'https://ocelot-social.herokuapp.com/donations',
|
||||
FAQ: 'https://ocelot.social',
|
||||
SUPPORT: 'https://ocelot.social',
|
||||
|
||||
// on null or empty strings internal imprint is used, see 'webapp/locales/html/'
|
||||
DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly
|
||||
IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly
|
||||
TERMS_AND_CONDITIONS: null,
|
||||
CODE_OF_CONDUCT: null,
|
||||
DATA_PRIVACY: null,
|
||||
FAQ: 'https://ocelot.social',
|
||||
}
|
||||
|
||||
10
webapp/constants/logos.js
Normal file
@ -0,0 +1,10 @@
|
||||
// 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_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',
|
||||
}
|
||||
@ -1,8 +1,9 @@
|
||||
// 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',
|
||||
APPLICATION_SHORT_NAME: 'ocelot.social',
|
||||
APPLICATION_DESCRIPTION: 'ocelot.social Community Network',
|
||||
COOKIE_NAME: 'ocelot-social-token',
|
||||
ORGANIZATION_NAME: 'ocelot.social Community',
|
||||
ORGANIZATION_JURISDICTION: 'City of Angels',
|
||||
COOKIE_NAME: 'ocelot-social-token',
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
<ds-flex-item width="5.5%" />
|
||||
<ds-flex-item style="flex-grow: 1" width="20%">
|
||||
<a @click="redirectToRoot">
|
||||
<logo />
|
||||
<logo logoType="header" />
|
||||
</a>
|
||||
</ds-flex-item>
|
||||
<ds-flex-item width="20%" style="flex-grow: 0">
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
<ds-flex class="main-navigation-flex">
|
||||
<ds-flex-item :width="{ base: '142px' }">
|
||||
<nuxt-link :to="{ name: 'index' }" v-scroll-to="'.main-navigation'">
|
||||
<logo />
|
||||
<logo logoType="header" />
|
||||
</nuxt-link>
|
||||
</ds-flex-item>
|
||||
<ds-flex-item
|
||||
|
||||
@ -782,7 +782,7 @@
|
||||
"faq": "FAQ",
|
||||
"germany": "Deutschland",
|
||||
"imprint": "Impressum",
|
||||
"made": "Mit ❤ gemacht",
|
||||
"made": "Mit ❤️ gemacht",
|
||||
"register": "Registernummer",
|
||||
"responsible": "Verantwortlich für Inhalte dieser Seite (§ 55 Abs. 2 RStV)",
|
||||
"taxident": "Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz (Deutschland)",
|
||||
|
||||
@ -782,7 +782,7 @@
|
||||
"faq": "FAQ",
|
||||
"germany": "Germany",
|
||||
"imprint": "Imprint",
|
||||
"made": "Made with ❤",
|
||||
"made": "Made with ❤️",
|
||||
"register": "Registry number",
|
||||
"responsible": "responsible for contents of this page (§ 55 Abs. 2 RStV)",
|
||||
"taxident": "USt-ID. according to §27a of the German Sales Tax Law:",
|
||||
|
||||
@ -703,7 +703,7 @@
|
||||
"faq": "Preguntas más frecuentes",
|
||||
"germany": "Alemania",
|
||||
"imprint": "Pie de imprenta",
|
||||
"made": "Hecho con ❤",
|
||||
"made": "Hecho con ❤️",
|
||||
"register": "Número de registro",
|
||||
"responsible": "Responsable según § 55 Abs. 2 RStV (Alemania)",
|
||||
"taxident": "Número de identificación del impuesto sobre el valor añadido según el § 27 a de la Ley del Impuesto sobre el Valor Añadido (Alemania)",
|
||||
|
||||
@ -671,7 +671,7 @@
|
||||
"faq": "FAQ",
|
||||
"germany": "Allemagne",
|
||||
"imprint": "Mentions légales",
|
||||
"made": "Fabriqué avec ❤",
|
||||
"made": "Fabriqué avec ❤️",
|
||||
"register": "Numéro de registre",
|
||||
"responsible": "Responsable selon § 55 Abs. 2 RStV (Allemagne)",
|
||||
"taxident": "Numéro d'identification à la taxe sur la valeur ajoutée selon § 27 a de la loi sur la taxe sur la valeur ajoutée (Allemagne)",
|
||||
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>Ich bin der Inhalt vom Verhaltenskodex</p>
|
||||
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>Das hier wäre der Inhalt der Datenschutzbestimmungen</p>
|
||||
|
||||
3
webapp/locales/html/de/faq.html
Normal file
@ -0,0 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>Hier stehen die FAQs</p>
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>Ich bin das Impressum</p>
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
import termsAndConditions from './terms-and-conditions.html'
|
||||
import codeOfConduct from './code-of-conduct.html'
|
||||
import dataPrivacy from './data-privacy.html'
|
||||
import faq from './faq.html'
|
||||
import imprint from './imprint.html'
|
||||
|
||||
export default {
|
||||
termsAndConditions,
|
||||
codeOfConduct,
|
||||
dataPrivacy,
|
||||
faq,
|
||||
imprint,
|
||||
}
|
||||
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>Ich bin der Inhalt der Seite "Nutzungsbedingungen"</p>
|
||||
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>I am the content of the code of conduct</p>
|
||||
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>This would be our data privacy section</p>
|
||||
|
||||
3
webapp/locales/html/en/faq.html
Normal file
@ -0,0 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>Here are the FAQs</p>
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>I am the imprint</p>
|
||||
|
||||
@ -1,11 +1,13 @@
|
||||
import termsAndConditions from './terms-and-conditions.html'
|
||||
import codeOfConduct from './code-of-conduct.html'
|
||||
import dataPrivacy from './data-privacy.html'
|
||||
import faq from './faq.html'
|
||||
import imprint from './imprint.html'
|
||||
|
||||
export default {
|
||||
termsAndConditions,
|
||||
codeOfConduct,
|
||||
dataPrivacy,
|
||||
faq,
|
||||
imprint,
|
||||
}
|
||||
|
||||
@ -1 +1,3 @@
|
||||
<!-- this file is replaced on rebranding -->
|
||||
|
||||
<p>I am the content of the page "terms and conditions"<p>
|
||||
|
||||
@ -621,7 +621,7 @@
|
||||
"faq": null,
|
||||
"germany": "Germania",
|
||||
"imprint": "Impressum",
|
||||
"made": "Con ❤ fatto",
|
||||
"made": "Con ❤️ fatto",
|
||||
"register": "numero di registro",
|
||||
"responsible": "Responsabile ai sensi del § 55 Abs. 2 RStV (Germania)",
|
||||
"taxident": "Numero di identificazione dell'imposta sul valore aggiunto ai sensi del § 27 a Legge sull'imposta sul valore aggiunto (Germania)",
|
||||
|
||||
@ -165,7 +165,7 @@
|
||||
"director": "Directeur",
|
||||
"germany": "Duitsland",
|
||||
"imprint": "Afdruk",
|
||||
"made": "Met ❤ gemaakt",
|
||||
"made": "Met ❤️ gemaakt",
|
||||
"register": "inschrijfnummer",
|
||||
"responsible": "Verantwoordelijk volgens § 55 Abs. 2 RStV (Duitsland).",
|
||||
"taxident": "Identificatienummer voor de belasting over de toegevoegde waarde overeenkomstig § 27 a Wet op de belasting over de toegevoegde waarde (Duitsland).",
|
||||
|
||||
@ -350,7 +350,7 @@
|
||||
"director": "Dyrektor zarządzający",
|
||||
"germany": "Niemcy",
|
||||
"imprint": "Nadruk",
|
||||
"made": "Z ❤ zrobiony",
|
||||
"made": "Z ❤️ zrobiony",
|
||||
"register": "numer rejestracyjny",
|
||||
"responsible": "Odpowiedzialny zgodnie z § 55 Abs. 2 RStV (Niemcy)",
|
||||
"taxident": "Numer identyfikacyjny podatku od wartości dodanej zgodnie z § 27 a Ustawa o podatku od wartości dodanej (Niemcy)",
|
||||
|
||||
@ -656,7 +656,7 @@
|
||||
"faq": "FAQ",
|
||||
"germany": "Alemanha",
|
||||
"imprint": "Impressão",
|
||||
"made": "Feito com ❤",
|
||||
"made": "Feito com ❤️",
|
||||
"register": "número de registo",
|
||||
"responsible": "Responsável segundo § 55 Abs. 2 RStV (Alemanha) ",
|
||||
"taxident": "Número de identificação do imposto sobre o valor acrescentado de acordo com o § 27 da Lei do Imposto sobre o Valor Acrescentado (Alemanha)",
|
||||
|
||||
@ -703,7 +703,7 @@
|
||||
"faq": "ЧаВо (FAQ)",
|
||||
"germany": "Германия",
|
||||
"imprint": "Импрессум",
|
||||
"made": "Сделано с ❤",
|
||||
"made": "Сделано с ❤️",
|
||||
"register": "Регистрационный номер",
|
||||
"responsible": "ответственный за содержание этой страницы (§ 55 Abs. 2 RStV)",
|
||||
"taxident": "UST-ID. в соответствии с §27a Закона о налоге с продаж Германии:",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@ocelot-social/maintenance",
|
||||
"version": "0.6.3",
|
||||
"version": "1.0.3",
|
||||
"description": "Maintenance page for ocelot.social",
|
||||
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
|
||||
"author": "ocelot.social Community",
|
||||
|
||||
@ -9,11 +9,7 @@
|
||||
<ds-flex-item :width="{ base: '100%', sm: 1, md: 1 }">
|
||||
<ds-space>
|
||||
<a :href="links.ORGANIZATION" :title="$t('login.moreInfo', metadata)" target="_blank">
|
||||
<img
|
||||
class="image"
|
||||
alt="Under maintenance"
|
||||
src="/img/custom/under-maintenance.svg"
|
||||
/>
|
||||
<img class="image" alt="Under maintenance" src="/img/custom/logo-squared.svg" />
|
||||
</a>
|
||||
</ds-space>
|
||||
</ds-flex-item>
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ocelot-social-webapp",
|
||||
"version": "1.0.2",
|
||||
"version": "1.0.4",
|
||||
"description": "ocelot.social Frontend",
|
||||
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
|
||||
"author": "ocelot.social Community",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<ds-space>
|
||||
<ds-space margin="small">
|
||||
<ds-heading tag="h2">{{ $t('site.code-of-conduct') }}</ds-heading>
|
||||
</ds-space>
|
||||
<ds-container>
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<ds-space>
|
||||
<ds-space margin="small">
|
||||
<ds-heading tag="h2">{{ $t('site.data-privacy') }}</ds-heading>
|
||||
</ds-space>
|
||||
|
||||
<ds-container>
|
||||
<div v-html="$t('html.dataPrivacy')" />
|
||||
</ds-container>
|
||||
|
||||
38
webapp/pages/faq.spec.js
Normal file
@ -0,0 +1,38 @@
|
||||
import { mount } from '@vue/test-utils'
|
||||
import Faq from './faq.vue'
|
||||
import VueMeta from 'vue-meta'
|
||||
|
||||
const localVue = global.localVue
|
||||
localVue.use(VueMeta, { keyName: 'head' })
|
||||
|
||||
describe('faq.vue', () => {
|
||||
let wrapper
|
||||
let mocks
|
||||
|
||||
beforeEach(() => {
|
||||
mocks = {
|
||||
$t: (t) => t,
|
||||
}
|
||||
})
|
||||
|
||||
describe('mount', () => {
|
||||
const Wrapper = () => {
|
||||
return mount(Faq, {
|
||||
mocks,
|
||||
localVue,
|
||||
})
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
wrapper = Wrapper()
|
||||
})
|
||||
|
||||
it('renders', () => {
|
||||
expect(wrapper.is('div')).toBe(true)
|
||||
})
|
||||
|
||||
it('has correct <head> content', () => {
|
||||
expect(wrapper.vm.$metaInfo.title).toBe('site.faq')
|
||||
})
|
||||
})
|
||||
})
|
||||
21
webapp/pages/faq.vue
Normal file
@ -0,0 +1,21 @@
|
||||
<template>
|
||||
<div>
|
||||
<ds-space margin="small">
|
||||
<ds-heading tag="h2">{{ $t('site.faq') }}</ds-heading>
|
||||
</ds-space>
|
||||
<ds-container>
|
||||
<div v-html="$t('html.faq')" />
|
||||
</ds-container>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
layout: 'basic',
|
||||
head() {
|
||||
return {
|
||||
title: this.$t('site.faq'),
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
@ -1,9 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<ds-space>
|
||||
<ds-space margin="small">
|
||||
<ds-heading tag="h2">{{ $t('site.imprint') }}</ds-heading>
|
||||
</ds-space>
|
||||
|
||||
<ds-container>
|
||||
<div v-html="$t('html.imprint')" />
|
||||
</ds-container>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<ds-flex>
|
||||
<ds-flex-item :width="{ base: '100%' }" centered>
|
||||
<ds-space style="text-align: center" margin-top="large" margin-bottom="xxx-small" centered>
|
||||
<img style="width: 200px" alt="Logging out" src="/img/custom/logout.svg" />
|
||||
<logo logoType="logout" />
|
||||
</ds-space>
|
||||
<ds-space style="text-align: center" margin-top="small" margin-bottom="xxx-small" centered>
|
||||
<ds-heading tag="h3" soft>Logging out...</ds-heading>
|
||||
@ -14,8 +14,13 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Logo from '~/components/Logo/Logo'
|
||||
|
||||
export default {
|
||||
layout: 'blank',
|
||||
components: {
|
||||
Logo,
|
||||
},
|
||||
async beforeCreate() {
|
||||
await this.$store.dispatch('auth/logout')
|
||||
this.$router.replace('/login')
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<base-card>
|
||||
<template #imageColumn>
|
||||
<a :href="links.ORGANIZATION" :title="$t('login.moreInfo', metadata)" target="_blank">
|
||||
<img class="image" alt="Reset your password" src="/img/custom/password-reset.svg" />
|
||||
<logo logoType="passwordReset" />
|
||||
</a>
|
||||
</template>
|
||||
<nuxt-child />
|
||||
@ -18,10 +18,12 @@
|
||||
import links from '~/constants/links.js'
|
||||
import metadata from '~/constants/metadata.js'
|
||||
import LocaleSwitch from '~/components/LocaleSwitch/LocaleSwitch'
|
||||
import Logo from '~/components/Logo/Logo'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LocaleSwitch,
|
||||
Logo,
|
||||
},
|
||||
layout: 'no-header',
|
||||
data() {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<ds-space>
|
||||
<ds-space margin="small">
|
||||
<ds-heading tag="h2">{{ $t('site.termsAndConditions') }}</ds-heading>
|
||||
</ds-space>
|
||||
<ds-container>
|
||||
|
||||
|
Before Width: | Height: | Size: 34 KiB |
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="828" height="260" viewBox="0 0 828 260" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<svg width="100%" height="100%" viewBox="0 0 828 260" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(2.95533,0,0,2.95533,-18.4944,-17.8011)">
|
||||
<path d="M50.078,80.683C50.078,83.106 55.132,85.274 56.169,85.541C57.205,85.809 56.888,86.99 59.656,86.414C62.423,85.837 65.412,83.181 68.261,79.517C71.11,75.853 69.025,73.224 66.9,70.435C64.775,67.646 60.169,64.412 59.656,58.155C59.252,53.234 63.3,53.047 64.996,52.876C66.693,52.705 69.497,54.85 70.654,54.602C71.76,54.366 76.418,58.834 76.929,57.234C76.642,55.298 77.838,54.264 79.448,54.2C81.057,54.136 81.623,56.773 82.356,58.155C83.259,59.861 83.998,58.66 84.146,57.229C84.538,53.415 83.26,49.493 83.911,46.972C84.277,45.555 85.282,45.386 86.792,43.731C90.77,39.372 90.818,32.915 89.923,29.827C90.954,28.574 92.317,28.571 92.521,21.538C92.726,14.505 87.451,8.531 86.038,7.721C84.624,6.91 80.605,7.633 79.555,8.51C78.506,9.387 66.486,19.391 64.996,21.1C63.507,22.81 62.752,23.616 63.556,27.206C60.728,24.559 56.073,22.692 50.078,23.64C44.083,22.692 39.427,24.559 36.6,27.206C37.403,23.616 36.649,22.81 35.159,21.1C33.669,19.391 21.65,9.387 20.6,8.51C19.551,7.633 15.532,6.91 14.118,7.721C12.704,8.531 7.43,14.505 7.634,21.538C7.838,28.571 9.201,28.574 10.233,29.827C9.337,32.915 9.385,39.372 13.363,43.731C14.874,45.386 15.878,45.555 16.245,46.972C16.896,49.493 15.617,53.415 16.01,57.229C16.157,58.66 16.896,59.861 17.8,58.155C18.532,56.773 19.099,54.136 20.708,54.2C22.317,54.264 23.514,55.298 23.227,57.234C23.737,58.834 28.396,54.366 29.502,54.602C30.659,54.85 33.462,52.705 35.159,52.876C36.856,53.047 40.904,53.234 40.5,58.155C39.987,64.412 35.381,67.646 33.256,70.435C31.13,73.224 29.046,75.853 31.894,79.517C34.743,83.181 37.732,85.837 40.5,86.414C43.268,86.99 42.951,85.809 43.987,85.541C45.023,85.274 50.078,83.106 50.078,80.683C50.078,78.259 50.078,78.259 50.078,80.683Z" style="fill:rgb(230,121,25);"/>
|
||||
<path d="M50,86.57C52.004,86.57 56.013,85.541 56.013,85.541C57.049,85.809 56.732,86.99 59.5,86.414C59.5,86.414 60.917,86.187 61.043,87.1C61.17,88.013 60.255,90.034 57.757,91.5C55.258,92.966 52.642,92.872 50,92.901C47.358,92.872 44.742,92.966 42.243,91.5C39.745,90.034 38.83,88.013 38.957,87.1C39.083,86.187 40.5,86.414 40.5,86.414C43.268,86.99 42.951,85.809 43.987,85.541C43.987,85.541 47.996,86.57 50,86.57Z" style="fill:rgb(134,131,131);"/>
|
||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="600" height="570" viewBox="0 0 600 570" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.04809,0,0,1.04809,274.036,-174.508)">
|
||||
<svg width="100%" height="100%" viewBox="0 0 600 570" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.09038,0,0,1.09038,282.489,-181.549)">
|
||||
<g transform="matrix(2.95533,0,0,2.95533,-122.994,148.699)">
|
||||
<path d="M50.078,80.683C50.078,83.106 55.132,85.274 56.169,85.541C57.205,85.809 56.888,86.99 59.656,86.414C62.423,85.837 65.412,83.181 68.261,79.517C71.11,75.853 69.025,73.224 66.9,70.435C64.775,67.646 60.169,64.412 59.656,58.155C59.252,53.234 63.3,53.047 64.996,52.876C66.693,52.705 69.497,54.85 70.654,54.602C71.76,54.366 76.418,58.834 76.929,57.234C76.642,55.298 77.838,54.264 79.448,54.2C81.057,54.136 81.623,56.773 82.356,58.155C83.259,59.861 83.998,58.66 84.146,57.229C84.538,53.415 83.26,49.493 83.911,46.972C84.277,45.555 85.282,45.386 86.792,43.731C90.77,39.372 90.818,32.915 89.923,29.827C90.954,28.574 92.317,28.571 92.521,21.538C92.726,14.505 87.451,8.531 86.038,7.721C84.624,6.91 80.605,7.633 79.555,8.51C78.506,9.387 66.486,19.391 64.996,21.1C63.507,22.81 62.752,23.616 63.556,27.206C60.728,24.559 56.073,22.692 50.078,23.64C44.083,22.692 39.427,24.559 36.6,27.206C37.403,23.616 36.649,22.81 35.159,21.1C33.669,19.391 21.65,9.387 20.6,8.51C19.551,7.633 15.532,6.91 14.118,7.721C12.704,8.531 7.43,14.505 7.634,21.538C7.838,28.571 9.201,28.574 10.233,29.827C9.337,32.915 9.385,39.372 13.363,43.731C14.874,45.386 15.878,45.555 16.245,46.972C16.896,49.493 15.617,53.415 16.01,57.229C16.157,58.66 16.896,59.861 17.8,58.155C18.532,56.773 19.099,54.136 20.708,54.2C22.317,54.264 23.514,55.298 23.227,57.234C23.737,58.834 28.396,54.366 29.502,54.602C30.659,54.85 33.462,52.705 35.159,52.876C36.856,53.047 40.904,53.234 40.5,58.155C39.987,64.412 35.381,67.646 33.256,70.435C31.13,73.224 29.046,75.853 31.894,79.517C34.743,83.181 37.732,85.837 40.5,86.414C43.268,86.99 42.951,85.809 43.987,85.541C45.023,85.274 50.078,83.106 50.078,80.683C50.078,78.259 50.078,78.259 50.078,80.683Z" style="fill:rgb(230,121,25);"/>
|
||||
<path d="M50,86.57C52.004,86.57 56.013,85.541 56.013,85.541C57.049,85.809 56.732,86.99 59.5,86.414C59.5,86.414 60.917,86.187 61.043,87.1C61.17,88.013 60.255,90.034 57.757,91.5C55.258,92.966 52.642,92.872 50,92.901C47.358,92.872 44.742,92.966 42.243,91.5C39.745,90.034 38.83,88.013 38.957,87.1C39.083,86.187 40.5,86.414 40.5,86.414C43.268,86.99 42.951,85.809 43.987,85.541C43.987,85.541 47.996,86.57 50,86.57Z" style="fill:rgb(134,131,131);"/>
|
||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 28 KiB |