Compare commits

...

924 Commits
v1 ... v3.0.0

Author SHA1 Message Date
30d0151bdb Merge pull request #646 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-11 20:28:50 +01:00
4dd94c3363 Update CHANGELOG.md 2022-03-11 20:27:25 +01:00
f711b089bc New translations landing.json (German) 2022-03-11 20:25:38 +01:00
01c1125153 New translations modals.json (German) 2022-03-11 20:25:37 +01:00
fa42d82416 New translations dashboard.json (German) 2022-03-11 20:25:32 +01:00
6322d4d105 New translations builder.json (German) 2022-03-11 20:25:28 +01:00
77467929c7 New translations common.json (German) 2022-03-11 20:25:27 +01:00
3a524f9c9c fix(lang): add hi, de to next-i18next 2022-03-11 20:21:35 +01:00
63f900870b chore(release): 3.0.0 2022-03-11 20:03:50 +01:00
32f78e85f7 Merge pull request #645 from AmruthPillai/feat/add-docs-workspace
Add docs powered by Docusaurus v2
2022-03-11 20:03:29 +01:00
1cc2232730 docs(docusaurus): update docs, add languages, ready to build 2022-03-11 20:02:16 +01:00
2ff6761630 Merge branch 'main' into feat/add-docs-workspace 2022-03-11 19:48:35 +01:00
5836e55a36 docs(readme): update readme with languages section, add license badge 2022-03-11 19:42:07 +01:00
ec98c14fbd Create LICENSE 2022-03-11 19:40:38 +01:00
78c1f5a380 Delete feature_request.md 2022-03-11 19:29:10 +01:00
808fa45124 Delete bug_report.md 2022-03-11 19:29:04 +01:00
2625ed4f3d Merge pull request #644 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-11 19:27:42 +01:00
40085f8d78 New translations modals.json (Hindi) 2022-03-11 19:26:50 +01:00
f4e3be178c New translations landing.json (German) 2022-03-11 19:26:48 +01:00
601f61c59a New translations dashboard.json (Hindi) 2022-03-11 19:26:47 +01:00
59049e8f77 New translations modals.json (German) 2022-03-11 19:26:45 +01:00
798e77f693 New translations landing.json (Hindi) 2022-03-11 19:26:44 +01:00
78565079e7 New translations common.json (Hindi) 2022-03-11 19:26:42 +01:00
0bec4cff05 New translations dashboard.json (German) 2022-03-11 19:26:38 +01:00
26dc0069f9 New translations common.json (German) 2022-03-11 19:26:36 +01:00
90bb80b1e2 New translations builder.json (German) 2022-03-11 19:26:35 +01:00
61ed3ff018 New translations modals.json (Kannada) 2022-03-11 19:26:34 +01:00
36a12e82a2 New translations builder.json (Hindi) 2022-03-11 19:26:26 +01:00
a3cf1752cc Merge pull request #643 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-11 19:06:12 +01:00
5b79e23564 Merge branch 'main' into i18n_main 2022-03-11 19:06:05 +01:00
300e4a790d New translations modals.json (Kannada) 2022-03-11 19:04:32 +01:00
ba4666b767 New translations modals.json (Tamil) 2022-03-11 19:04:31 +01:00
b283c6ee8f New translations landing.json (Tamil) 2022-03-11 19:04:29 +01:00
316eca35ef New translations common.json (Kannada) 2022-03-11 19:04:27 +01:00
16c18de964 New translations common.json (Tamil) 2022-03-11 19:04:26 +01:00
0c23af4be8 New translations builder.json (Kannada) 2022-03-11 19:04:25 +01:00
fe1b325fdf New translations builder.json (Tamil) 2022-03-11 19:04:24 +01:00
9395a4d578 docs(style): update CHANGELOG.md 2022-03-11 15:46:49 +01:00
c11f92841b chore(release): 3.0.0-beta.6 2022-03-11 15:44:42 +01:00
2654cba039 fix(webkit): fix issue with webkit not supporting .at() 2022-03-11 15:40:25 +01:00
7d8828a358 fix(i18n): add missing translation keys, update lang/locale logic 2022-03-11 08:43:20 +01:00
8bc7d2599e feat(lang): add language switcher on the landing page, in the footer 2022-03-10 21:59:16 +01:00
036adbfc96 Delete .DS_Store 2022-03-10 15:34:02 +01:00
4b7e43424c style(changelog): add standard-version to automate releases and tags 2022-03-10 15:32:46 +01:00
0f1c3a8142 chore(release): 3.0.0 2022-03-10 15:29:49 +01:00
8dc27ecf07 Merge pull request #641 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-10 14:58:45 +01:00
a05917b00d New translations modals.json (Kannada) 2022-03-10 14:58:17 +01:00
d5f2eea34c New translations landing.json (Kannada) 2022-03-10 14:58:16 +01:00
29bc3f33a6 New translations dashboard.json (Kannada) 2022-03-10 14:58:15 +01:00
b332b77eff New translations dashboard.json (Tamil) 2022-03-10 14:58:14 +01:00
8e09db276e New translations builder.json (Kannada) 2022-03-10 14:58:12 +01:00
2f7cfd2add New translations builder.json (Tamil) 2022-03-10 14:58:11 +01:00
6a4464b239 New translations common.json (Kannada) 2022-03-10 14:29:16 +01:00
972e8b1bcf fix(app): fix issue with using swipelayout 2022-03-10 14:13:54 +01:00
ad916c5b07 Create close-stale.yml 2022-03-10 09:37:47 +01:00
eca80a1663 feat(health): add health checks to server api 2022-03-10 09:25:15 +01:00
8f48f5fcd6 remove codemagic.yaml 2022-03-10 00:18:50 +01:00
40f5111eba update local.properties path 2022-03-10 00:12:33 +01:00
55a09c0c05 remove other group from codemagic.yml 2022-03-09 23:58:25 +01:00
1e72efa7ac ci(codemagic): add android app ci to build and publish automatically 2022-03-09 23:49:22 +01:00
fd752bfd70 Merge pull request #640 from AmruthPillai/feat/android-app
Adding Android App Source Code to the Monorepo
2022-03-09 23:40:56 +01:00
ee328186c8 fix(client): add safety check on path.id split 2022-03-09 23:39:04 +01:00
ecab1e0bfa style(eslint): do not log all files when linting, just errors 2022-03-09 22:43:45 +01:00
cbbdc92c66 style(prettier): add android app to ignore files for eslint, prettier and docker 2022-03-09 22:41:57 +01:00
5d54f8101b feat(app): add an android app that loads beta.rxresu.me through a webview 2022-03-09 22:40:59 +01:00
4fe5788b23 docs(landing): add links to privacy policy and terms of service 2022-03-09 20:19:05 +01:00
612335696c ci(docker): use version instead of commit sha 2022-03-09 19:30:30 +01:00
781dc4d231 ci(release): remove release-it 2022-03-09 19:18:31 +01:00
5d37dcb0ed ci(release-it): add release-it to auto-generate changelogs and release to github 2022-03-09 19:15:20 +01:00
6255849822 fix(printer): fix issue with printer service, locating the right URL of the server 2022-03-09 18:55:17 +01:00
ef3b2c5638 docs(source-code): add docs to build project from source, docker + local build 2022-03-09 14:05:40 +01:00
6c671f2dba Merge branch 'main' into feat/add-docs-workspace 2022-03-09 11:08:17 +01:00
4447b58b8f Merge pull request #635 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-09 09:45:28 +01:00
b210b19b03 Merge branch 'main' into i18n_main 2022-03-09 09:45:06 +01:00
1e909f3257 docs(changelog): add CHANGELOG.md 2022-03-09 09:44:11 +01:00
c3f037ee1d chore(version): bump version to v3.0.0.beta.1 2022-03-09 09:40:16 +01:00
6f02048ebd feat(client/landing): add testimonials section to landing page 2022-03-09 09:37:38 +01:00
78cd1c036e Update source file landing.json 2022-03-09 00:02:00 +01:00
7e1448bbf9 docs(readme): add fossa license check badge 2022-03-08 23:56:11 +01:00
dc4aa0b496 feat(docs): add docusaurus workspace, initial setup of docs 2022-03-08 23:54:00 +01:00
a131bb3652 feat(client): add language selector, language detector and privacy/tos pages 2022-03-08 22:57:47 +01:00
bf9da32465 Merge pull request #634 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-08 16:33:25 +01:00
efba6ee7dd New translations landing.json (Tamil) 2022-03-08 16:30:34 +01:00
9c2ff5e14f New translations common.json (Tamil) 2022-03-08 16:30:31 +01:00
d167baa607 Merge pull request #633 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-08 16:23:21 +01:00
e420ea6ce4 New translations modals.json (Kannada) 2022-03-08 16:22:51 +01:00
ec0a88675b New translations modals.json (Tamil) 2022-03-08 16:22:50 +01:00
11827dcc29 New translations landing.json (Kannada) 2022-03-08 16:22:49 +01:00
1f6f052129 New translations landing.json (Tamil) 2022-03-08 16:22:48 +01:00
66b98a21e8 New translations dashboard.json (Kannada) 2022-03-08 16:22:47 +01:00
b017d7aa41 New translations dashboard.json (Tamil) 2022-03-08 16:22:47 +01:00
62398fd96f New translations common.json (Kannada) 2022-03-08 16:22:46 +01:00
8167f51ce1 New translations common.json (Tamil) 2022-03-08 16:22:45 +01:00
f0a381a37c New translations builder.json (Kannada) 2022-03-08 16:22:44 +01:00
d923dfe3c0 New translations builder.json (Tamil) 2022-03-08 16:22:43 +01:00
d3f1cc746a Update Crowdin configuration file 2022-03-08 16:22:32 +01:00
8ee4993321 Update README.md 2022-03-08 15:49:04 +01:00
917850157e Update issue templates 2022-03-08 15:12:24 +01:00
b4856be5ab refactor(.env.example): update example to match current configuration 2022-03-08 14:07:28 +01:00
fc29fb8eb4 docs(readme): update description, add sections to README.md 2022-03-08 14:03:09 +01:00
2e288a5407 ci(github): add github action to redeploy latest version after docker image ci 2022-03-08 11:50:59 +01:00
43ce43ab5b refactor(server): remove api prefix for all routes 2022-03-08 10:52:13 +01:00
5a2594eb88 refactor(server): use proxy mechanisms to remove server_url config 2022-03-08 10:36:04 +01:00
e52edaa552 chore(husky): implement husky commit hooks to install, lint and format before commit 2022-03-08 08:11:47 +01:00
54fd97b5ec fix(pnpm): install deps to update pnpm-lock.yaml 2022-03-08 07:56:25 +01:00
9df12194bf fix(mail.service): use sendgrid api instead of nodemailer for better deliverability 2022-03-08 07:46:06 +01:00
e96b090904 fix(printer.service): add --disable-dev-shm-usage flag to chromium headless playwright browser 2022-03-08 00:06:07 +01:00
d79997d380 ci(docker): add env port to dockerfile, use port env instead of server_port 2022-03-07 23:52:39 +01:00
2696a54d17 fix(playwright): use playwright docker image due to runtime error 2022-03-07 23:09:14 +01:00
28ba2b1b8f ci(docker): fix short sha generation, seperate jobs for parallel execution 2022-03-07 22:42:09 +01:00
deb51f0e29 ci(docker): publish multiple docker images, to multiple registries 2022-03-07 22:26:33 +01:00
aa5e748cca ci(docker): use docker hub instead of digitalocean container registry 2022-03-07 21:55:37 +01:00
b0a295d8bb build(docker): minimize production docker image size by using ubuntu:focal 2022-03-07 21:43:38 +01:00
c738f311da fix(databasemodule): make ssl optional, pass ca cert as base64 env 2022-03-07 15:06:16 +01:00
cff51a8be9 Update docker-build-push.yml 2022-03-07 14:05:27 +01:00
1a0ab6fb22 ci(docker): add github action to build docker images automatically 2022-03-07 14:02:40 +01:00
938e2e8e25 build(v3): use pnpm, docker, docker-compose to orchestrate two services (client, server) 2022-03-07 13:43:34 +01:00
9c1380f401 🚀 release v3.0.0 2022-03-06 22:48:29 +01:00
00505a9e5d ci(docker): changes to dockerfile to make builds faster 2022-03-05 23:18:47 +01:00
37f0ab3bca ci(docker): attempt to fix production deploy, with env management 2022-03-05 14:36:38 +01:00
a4983ac6bc fix(i18n): load locales from file system, instead of http-backend 2022-03-05 10:08:28 +01:00
7c73685759 1646397537 2022-03-04 13:38:58 +01:00
269d5206e6 1646393163 2022-03-04 12:26:03 +01:00
e1529e03f9 add option to pass CA certificate for database deploys 2022-03-04 11:50:10 +01:00
5104ea6438 perf(app): working docker build stage, with github actions ci to push image 2022-03-04 10:54:31 +01:00
36f41c2f9d add commit script in npm 2022-03-03 21:14:46 +01:00
7e50c8e85b ci(docker): build production Docker image, also push to Docker Hub 2022-03-03 21:14:07 +01:00
993fd82f4c testing github actions 2022-03-03 20:15:19 +01:00
ed6578b052 attempting to make docker package smaller, and take less memory 2022-03-03 20:05:22 +01:00
5fc7a32c67 attempt docker build with pnpm 2022-03-03 15:33:11 +01:00
58160b2b6e experiments with docker packaging, figuring out deploy plan 2022-03-03 12:24:32 +01:00
2aa3786f5f experiments with docker packaging, figuring out deploy plan 2022-03-03 09:35:13 +01:00
a30011e841 switch from pnpm to npm as package manager 2022-03-02 20:46:14 +01:00
295172687b 🚀 release: v3.0.0 2022-03-02 17:44:11 +01:00
2175256310 clear everything 2022-02-28 20:23:10 +01:00
ff892e3ea5 Merge pull request #624 from AmruthPillai/dependabot/npm_and_yarn/url-parse-1.5.10
Bump url-parse from 1.5.7 to 1.5.10
2022-02-28 06:53:30 +01:00
0e2e50d658 Bump url-parse from 1.5.7 to 1.5.10
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.7 to 1.5.10.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.7...1.5.10)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-28 04:36:42 +00:00
4657f1f5f5 Merge pull request #622 from AmruthPillai/dependabot/npm_and_yarn/follow-redirects-1.14.8
Bump follow-redirects from 1.14.1 to 1.14.8
2022-02-20 07:07:59 +01:00
81fc3b981c Merge pull request #618 from AmruthPillai/dependabot/npm_and_yarn/ws-5.2.3
Bump ws from 5.2.2 to 5.2.3
2022-02-20 07:07:53 +01:00
e961d043da Merge pull request #617 from AmruthPillai/dependabot/npm_and_yarn/simple-get-3.1.1
Bump simple-get from 3.1.0 to 3.1.1
2022-02-20 07:07:48 +01:00
4d4c24b79d Merge pull request #616 from AmruthPillai/dependabot/npm_and_yarn/functions/lodash-4.17.21
Bump lodash from 4.17.20 to 4.17.21 in /functions
2022-02-20 07:07:43 +01:00
d40539680a Merge pull request #623 from AmruthPillai/dependabot/npm_and_yarn/url-parse-1.5.7
Bump url-parse from 1.5.1 to 1.5.7
2022-02-20 07:07:29 +01:00
ea0a5ec989 Bump url-parse from 1.5.1 to 1.5.7
Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.7.
- [Release notes](https://github.com/unshiftio/url-parse/releases)
- [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.7)

---
updated-dependencies:
- dependency-name: url-parse
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-19 08:10:21 +00:00
9e855be82c Bump follow-redirects from 1.14.1 to 1.14.8
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.1 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.1...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-14 16:37:08 +00:00
a9be89a754 Bump ws from 5.2.2 to 5.2.3
Bumps [ws](https://github.com/websockets/ws) from 5.2.2 to 5.2.3.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/5.2.2...5.2.3)

---
updated-dependencies:
- dependency-name: ws
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-09 12:18:40 +00:00
789c49e47e Bump simple-get from 3.1.0 to 3.1.1
Bumps [simple-get](https://github.com/feross/simple-get) from 3.1.0 to 3.1.1.
- [Release notes](https://github.com/feross/simple-get/releases)
- [Commits](https://github.com/feross/simple-get/compare/v3.1.0...v3.1.1)

---
updated-dependencies:
- dependency-name: simple-get
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-09 12:18:30 +00:00
56f46a185c Bump lodash from 4.17.20 to 4.17.21 in /functions
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21)

---
updated-dependencies:
- dependency-name: lodash
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-09 12:17:25 +00:00
3a8f4f00d0 Merge pull request #614 from martadinata666/gatsby-host
use -H 0.0.0.0 on Gatsby
2022-02-09 13:16:54 +01:00
e9c7f33d30 Merge pull request #609 from apat183/fix-image-stretching
add 'object cover' class to templates that have issues with profile image stretching.
2022-02-08 09:16:21 +01:00
7e1483b2a2 Merge pull request #613 from zzarc/fix-readme-translation
fix translation error for language Japanese
2022-02-05 19:50:47 +01:00
d3359cfa58 fix translation error 2022-02-05 01:20:09 -08:00
04afc009ef use -H 0.0.0.0 on Gatsby 2022-02-05 10:33:15 +07:00
46090b0793 fix translation error in readme 2022-02-04 01:49:01 -08:00
b617ec6bfa add 'object cover' class to templates that have issues with profile images streatching 2022-01-25 20:30:35 +13:00
fd15989346 Merge pull request #599 from adamantike/allow-links-for-awards-and-certs
Allow links for certifications
2022-01-10 08:42:35 +01:00
fd00a4b4e1 Merge pull request #601 from mupsys/remove_dup_address_onyx
Added new ContactE without the address block and added it to the Onyx…
2022-01-10 07:50:12 +01:00
30d567d853 Added new ContactE without the address block and added it to the Onyx template (removes the duplicate address in that template.)
Signed-off-by: mupsys <1337sword@protonmail.com>
2022-01-09 23:03:35 -07:00
a9d1f0fa7b Revert changes to awards 2022-01-09 17:15:24 -03:00
3be316e9dd Allow links for awards and certifications
Add option to set a URL for each award or certification. This is useful,
for example, when sharing verified certificates as proofs provided by
issuers.

Fixes #575
2022-01-09 14:31:58 -03:00
2426144d1b Merge pull request #580 from AmruthPillai/l10n_develop
New Crowdin updates
2021-11-01 10:25:36 +01:00
c04367b7b5 New translations en.json (Croatian) 2021-10-30 13:49:08 +02:00
59828140ee Merge pull request #579 from AmruthPillai/l10n_develop
New Crowdin updates
2021-10-26 16:58:35 +02:00
8b12d366f9 New translations en.json (Croatian) 2021-10-26 01:04:26 +02:00
0117e5735e bump version 2021-10-25 12:46:03 +02:00
7a3626df1c fixing unsplash cors issue 2021-10-25 12:45:13 +02:00
ba11af887c bump to v2.7.9 2021-10-24 13:36:40 +02:00
41a9ce2b06 Merge pull request #577 from AmruthPillai/l10n_develop
New Crowdin updates
2021-10-24 13:36:16 +02:00
becb4993b2 New translations en.json (Danish) 2021-10-24 13:35:37 +02:00
bcc3ab44eb New translations en.json (German) 2021-10-24 13:35:33 +02:00
5d2961945c Merge pull request #570 from HristovCodes/develop
Translated to Bulgarian
2021-10-24 13:08:57 +02:00
bb1e68fcc5 Translated to Bulgarian 2021-10-03 15:48:05 +03:00
4d9c41f52b Merge pull request #543 from kescherCode/develop
German locale corrections and improvements
2021-09-30 09:43:11 +02:00
13abbd21e2 Merge pull request #547 from preetamm/develop
1] sidebar toggle feature 2] ask for confirmation before delete operation
2021-09-30 09:42:39 +02:00
a9f4fb863f Merge pull request #551 from hpierre74/gfm
feat(markdown): add gfm support
2021-09-30 09:42:03 +02:00
97f2b0c6f8 Merge pull request #561 from AmruthPillai/l10n_develop
New Crowdin updates
2021-09-30 09:41:26 +02:00
7cf57a999d New translations en.json (Indonesian) 2021-09-02 23:55:53 +05:30
1e927838d0 Update src/pages/app/dashboard.js 2021-08-10 13:09:12 +02:00
cfad352903 feat(markdown): add gfm support
revert firebase changes
2021-08-10 12:50:04 +02:00
2cbdf77c51 added sidebar toggle feature and confirmation prompt before deleting any list-item 2021-08-08 18:36:07 +05:30
3b127a81fd German locale corrections and improvements 2021-07-28 15:10:20 +02:00
99d7d3aad2 v2.7.8: update dependencies 2021-07-13 10:57:20 +05:30
1640ffb177 Merge pull request #530 from AmruthPillai/l10n_develop
New Crowdin updates
2021-07-13 10:42:38 +05:30
9f31a890ef New translations en.json (Italian) 2021-07-13 10:42:09 +05:30
8b79a88809 New translations en.json (Portuguese, Brazilian) 2021-07-13 10:42:08 +05:30
3801b54ced Merge pull request #528 from lpmi-13/set_present_as_end_date
update Project data model to use "Present" if no end date selected
2021-07-13 10:40:26 +05:30
d6d8f240bd Merge branch 'develop' into set_present_as_end_date 2021-07-13 10:40:20 +05:30
ec7b33c008 Merge pull request #527 from lpmi-13/add_info_to_readme
add information on setting up firebase to the readme
2021-07-13 10:39:36 +05:30
d11784161a Merge pull request #526 from lpmi-13/fix_date_placholder
fix typo in placeholder dates
2021-07-13 10:39:26 +05:30
b869291589 set more recent date as placeholder 2021-07-12 23:20:28 +01:00
be4334f6a2 update Project data model to use "Present" if no end date selected
Sometimes, projects are ongoing, and it would be helpful to be able to show that, similar to how it's done in the Work section.

This is what's expected in the `formatDateRange` function, and it's more consistent with the way things are done in other parts of the application.
2021-07-06 13:36:47 +01:00
ed950ddcdc add information on setting up firebase to the readme
I had to think a bit about what values to put in the .env file, and once I figured it out, I thought it would be helpful to add that information explicitly in the readme so other developers could speed up local development.
2021-07-06 13:34:08 +01:00
5771f28018 fix typo in placeholder dates 2021-07-06 13:01:19 +01:00
5fbf48cc3b Merge pull request #523 from faturachmanyusup/develop
Change button text "Add New" in List.js from STATIC to DYNAMIC using …
2021-06-28 20:39:08 +05:30
36a9b1302b Change button text "Add New" in List.js from STATIC to DYNAMIC using translation shared.buttons.add and improve Indonesian translation 2021-06-28 15:22:43 +07:00
6754cb1e45 bump verison to v2.7.7, translations added 2021-06-26 21:21:28 +05:30
4f40e8421f Merge pull request #522 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-26 21:19:45 +05:30
d6470620eb Update run-tests.yml 2021-06-26 21:19:14 +05:30
795f14713d New translations en.json (Hebrew) 2021-06-26 21:17:54 +05:30
6b7b71dc7b New translations en.json (Romanian) 2021-06-26 21:17:53 +05:30
75f76b267f New translations en.json (French) 2021-06-26 21:17:52 +05:30
cdf8a133e3 New translations en.json (Spanish) 2021-06-26 21:17:51 +05:30
91ffcba7da New translations en.json (German) 2021-06-26 21:17:49 +05:30
04e3cd4b8d New translations en.json (Italian) 2021-06-26 21:17:48 +05:30
a256bb8ce7 New translations en.json (Norwegian) 2021-06-26 21:17:45 +05:30
d33dc23ad1 New translations en.json (Polish) 2021-06-26 21:17:45 +05:30
4dde9fbcc1 New translations en.json (Russian) 2021-06-26 21:17:44 +05:30
b9c5aac485 New translations en.json (Swedish) 2021-06-26 21:17:43 +05:30
19906ea18b New translations en.json (Turkish) 2021-06-26 21:17:42 +05:30
eebb6890ab New translations en.json (Ukrainian) 2021-06-26 21:17:41 +05:30
6ecf8dd404 New translations en.json (Portuguese, Brazilian) 2021-06-26 21:17:40 +05:30
affbc26e22 New translations en.json (Persian) 2021-06-26 21:17:39 +05:30
cfff2bf562 New translations en.json (Hindi) 2021-06-26 21:17:38 +05:30
9db04bfaba New translations en.json (Greek) 2021-06-26 21:17:37 +05:30
21b4e02dee New translations en.json (Kannada) 2021-06-26 21:10:05 +05:30
8804a3a18d New translations en.json (Arabic) 2021-06-26 21:10:03 +05:30
ff2131141c New translations en.json (Czech) 2021-06-26 21:10:02 +05:30
62b3144ef9 New translations en.json (Japanese) 2021-06-26 21:10:01 +05:30
75dd08188e New translations en.json (Chinese Simplified) 2021-06-26 21:09:59 +05:30
ef59464bcd New translations en.json (Japanese) 2021-06-26 16:23:39 +05:30
08325b3bdd - fix: Indonesian language display
- update dependencies
2021-06-24 12:52:19 +05:30
56e0852d23 Create SECURITY.md 2021-06-24 12:47:01 +05:30
c4ddba2933 Merge pull request #519 from mberlinger3/pikachu_address
Pikachu address
2021-06-24 12:44:45 +05:30
2eaeb11c93 Merge pull request #518 from mberlinger3/bugfix
Removed duplicate locale
2021-06-24 12:44:20 +05:30
60b84b8e14 Added address to pikachu template with icon 2021-06-23 22:31:13 -07:00
97d5bf73c4 Removed duplicate locale 2021-06-23 22:27:20 -07:00
db9dc36e6d Merge pull request #517 from faturachmanyusup/develop
Fix Error when select Bahasa Indonesia
2021-06-23 17:23:13 +05:30
9dab038a9a Update README.md
- change bahasa Indonesi to Bahasa Indonesia
2021-06-22 21:42:38 +07:00
08b5ac588c Merge branch 'develop' of https://github.com/faturachmanyusup/Reactive-Resume into develop 2021-06-22 21:41:26 +07:00
cddb238994 FIX error when select Indonesian Language
- import 'id.json' in src/i18n/locales/index.js
- import 'dayjs/locale/id' in src/utils/dayjs.js
2021-06-22 21:32:29 +07:00
b2583724fd fix lint 2021-06-22 16:56:53 +05:30
c908f450f9 update dependencies 2021-06-22 16:56:29 +05:30
c6986b5048 v2.7.5 - add Indonesian language 2021-06-22 16:53:37 +05:30
6f12251aef Merge pull request #516 from faturachmanyusup/develop
add new translation 'Indonesian (Bahasa Indonesia)' with code 'id'
2021-06-22 16:49:02 +05:30
6539430980 add new translation 'Indonesian (Bahasa Indonesia)' with code 'id' 2021-06-19 17:55:13 +07:00
a13842d014 Merge pull request #513 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-19 10:57:00 +05:30
8d72ec2460 New translations en.json (Dutch) 2021-06-18 13:23:03 +05:30
47f1beec48 Merge pull request #512 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-17 15:16:57 +05:30
b3ca6be1c4 New translations en.json (Dutch) 2021-06-17 14:36:14 +05:30
36c54a0af2 New translations en.json (Danish) 2021-06-17 12:59:37 +05:30
da4c74917d New translations en.json (Finnish) 2021-06-17 12:59:36 +05:30
c4495d2912 New translations en.json (Dutch) 2021-06-17 11:46:23 +05:30
f9183384e9 Merge pull request #503 from AmruthPillai/imgbot
[ImgBot] Optimize images
2021-06-17 09:24:15 +05:30
7a4f50cb92 Merge pull request #504 from m4rcs/translate-contact
Add translation for "Contact" in Gengar theme.
2021-06-17 09:23:46 +05:30
9084a2803e v2.7.4 - Added Hebrew (עִברִית) Language 2021-06-17 09:22:59 +05:30
45042050ee Merge pull request #510 from AmruthPillai/l10n_develop
New Crowdin updates
2021-06-17 09:20:16 +05:30
d4f9926e94 New translations en.json (Hebrew) 2021-06-13 17:31:53 +05:30
79c903f02d - v2.7.3: update dependencies 2021-06-09 11:30:59 +05:30
d23040a374 Add translation for "Contact" in Gengar theme.
Reworked german translation.
2021-06-03 11:50:23 +02:00
882fde899b [ImgBot] Optimize images
/static/images/picture.jpg -- 188.32kb -> 170.83kb (9.29%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2021-06-03 03:33:42 +00:00
fc96a6fc92 - change demoState picture URL 2021-06-03 09:01:01 +05:30
847c2c0f9b - update to v2.7.2
- update dependencies
2021-06-03 08:52:19 +05:30
2a1a6498e2 - update to 2.7.1
- add webpack cache
2021-06-03 08:45:50 +05:30
7a721f40b6 - update to 2.7.1 2021-06-03 08:42:26 +05:30
23690d7bc1 Merge pull request #501 from m4rcs/patch-1
Improvement of German Translation
2021-06-03 08:41:15 +05:30
4fb6763328 Merge pull request #496 from NatProView/patch-2
Improvement of polish translations
2021-06-03 08:41:04 +05:30
85939e59c6 Merge pull request #495 from NatProView/patch-1
Correcting typos in pl.json
2021-06-03 08:40:45 +05:30
bb7a41cd62 Merge pull request #494 from theoctober19th/develop
Add appropriate icon for YouTube channel in profile information.
2021-06-03 08:39:55 +05:30
d0c18afed1 Merge branch 'develop' into develop 2021-06-03 08:39:45 +05:30
6bd545df55 Merge pull request #498 from gianantoniopini/develop
Addition of unit tests related to Delete Account
2021-06-03 08:37:25 +05:30
d71d378aa1 Fixed Jest warnings occurring after latest merge from upstream 2021-06-02 15:02:36 +02:00
99f87ebb3e Fixed Jest errors occurring after latest merge from upstream 2021-06-01 12:14:12 +02:00
fbe2c1f91c Merge remote-tracking branch 'upstream/develop' into develop 2021-06-01 09:28:35 +02:00
4af318dc61 - update to 2.7.0 2021-05-29 12:02:57 +05:30
2c22c13f3e - update dependencies
- upgrade gatsby v2 to v3
- update functions
2021-05-29 11:47:34 +05:30
6daf6e8b11 Update de.json
Changed translation of present to a more CV suitable
2021-05-28 10:43:29 +02:00
fb18b5c94c FirebaseStub: added more unit tests related to functions 2021-05-25 12:48:38 +02:00
a4d474b8ec FirebaseStub: added more unit tests related to auth 2021-05-25 12:16:49 +02:00
23ebb25a89 Improvement of polish translations 2021-05-21 14:56:47 +02:00
ab95160b04 Correcting typos in pl.json
Corrected a few minor mistakes such as too many whitespaces or typos, e.g.
**Projects** - Ptojekty (should be Projekty)
**Education** - Wyksztłacenie (should be Wykształcenie)
"CV" should be written in capital letters, it was inconsistent
2021-05-21 14:29:43 +02:00
9e63d0b2c7 Delete Account unit tests: added tests related to Google reauthentication 2021-05-20 15:57:01 +02:00
e1186591f9 Add appropriate icon for YouTube channel in profile information. 2021-05-19 17:53:09 +05:45
7cb469657d Firebase.auth Jest mock: minor fix in signOut() method 2021-05-18 13:57:34 +02:00
53d0e17865 Delete Account unit tests: fixed warnings, added test for error notifications 2021-05-18 13:41:38 +02:00
a8cf553217 Delete Account: added more unit tests 2021-05-14 18:21:47 +02:00
d11d414504 Jest mocks: added @reach/router and stub for Firebase auth signOut method 2021-05-13 16:53:04 +02:00
ffb8ae45e0 Delete Account unit tests: first attempt to spy on Firebase auth User delete 2021-05-11 17:25:30 +02:00
e794325787 FirebaseStub: added auth User class 2021-05-11 16:42:36 +02:00
eb54a7f69d Delete Account: started adding unit tests 2021-05-11 15:19:05 +02:00
b0bd8c94f3 Merge pull request #489 from gianantoniopini/develop
"Download PDF" action: basic retry mechanism - "Delete Account" action: deletion of uploaded photographs
2021-05-10 14:13:39 +05:30
9f38ebd044 "deleteUser" Firebase cloud function: added deletion of user folder from Storage, added extra checks on IDs not being empty string 2021-05-06 12:37:10 +02:00
14ea8de709 Modified 'printResume' Firebase cloud function: implemented basic retry mechanism with waitUntil 'networkidle0' and 'networkidle2', enhanced error handling to return more detailed information 2021-05-04 11:35:40 +02:00
1ac828b532 Update package-lock.json in functions 2021-05-03 11:11:53 +05:30
13508d3c16 Fix fontSize in initialState.json 2021-05-03 11:02:30 +05:30
8c849e4018 Update demoState.json to fix font size 2021-05-03 10:24:00 +05:30
4b007749cb Merge branch 'master' into develop 2021-05-03 10:01:42 +05:30
8aaee4cd9e Added .nvmrc with 14 2021-05-03 09:46:01 +05:30
aa8d9228b9 Merge pull request #485 from gianantoniopini/develop
Delete Account: fix for Firebase cloud function and error handling improvements
2021-05-01 21:44:29 +05:30
34627e2acb Settings, deleteAccount: prevent execution of deleteAccount if it is already in progress 2021-04-28 09:56:13 +02:00
b5d4d54ad3 UserContext, deleteAccount: if provider is google, use reauthenticateWithPopup to reauthenticate user 2021-04-26 15:26:02 +02:00
f53e34c37d UserContext, deleteAccount: if provider is google, always reauthenticate the user before performing any delete 2021-04-23 17:30:25 +02:00
54ddfe30d7 Updated "deleteUser" Firebase cloud function to perform updates in an atomic way, tweaked UI call and error handling 2021-04-23 15:16:37 +02:00
d4e7914a27 Updated "deleteUser" Firebase cloud function implementation, UI call and error handling 2021-04-22 18:38:02 +02:00
43c8729c5b bump version 2021-04-14 14:41:17 +05:30
8bfed6a342 update package-lock.json 2021-04-14 14:29:07 +05:30
71471020b6 Merge pull request #481 from ntotao/patch-1
Update it.json
2021-04-14 14:22:49 +05:30
1e02f5b27a Update it.json
Edited some showed-in-the-resume words, such as "present" which was translated to regalo (it's literally like a birthday present). "Attuale" is the right translation.
Also edited some wording around to enhance the experience in an Italian fluent translation.
2021-04-13 13:26:07 +02:00
abd18236ed Merge pull request #477 from ceoshikhar/develop
Fixed bug where multiple resumes are created if "Create Resume" button is spammed
2021-04-03 17:18:54 +05:30
6ffcf2a1c4 fix: multiple resumes are created if "Create Resume" button is spammed 2021-04-03 14:49:37 +05:30
8628ca5475 Merge pull request #474 from indranil32/bengali-locale
Adding Bengali translation for this amazing app
2021-03-31 12:50:28 +05:30
cf95dd6a28 Merge pull request #475 from p-8-z/local_sk
Added sk.json to i18n locales. Slovak translation
2021-03-31 12:35:02 +05:30
p8z
b392bada3b added sk.json to i18n locales 2021-03-30 20:52:00 +02:00
978207a700 Adding Bengali translation for this amazing app 2021-03-30 22:20:38 +05:30
a7fa5f5fe9 - npm audit fix 2021-03-20 12:15:01 +05:30
f73d9ad7d0 Fixed type in StorageContext.js
Thank you kind stranger.
2021-03-16 08:44:02 +05:30
ee93c47403 Create DEPLOYMENT.md 2021-03-13 11:37:17 +05:30
a0dd63edb2 Merge pull request #468 from AmruthPillai/l10n_develop
New Crowdin updates
2021-03-11 21:10:13 +05:30
0f1778a11c New translations en.json (Dutch) 2021-03-11 21:09:08 +05:30
bf03e40895 update dependencies for functions 2021-03-07 10:00:40 +05:30
9ed97c8b6c [2.6.6] Added Romanian Language 2021-03-07 09:41:39 +05:30
b06e9b3ef0 Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2021-03-07 09:38:33 +05:30
b81c167a10 Merge pull request #464 from AmruthPillai/l10n_develop
New Crowdin updates
2021-03-07 09:38:16 +05:30
33ac260683 [2.6.5] Addition of Show/Hide Selectors for all blocks
- Updating dependencies
2021-03-07 09:38:02 +05:30
e28bd17d3b New translations en.json (Persian) 2021-03-07 09:37:03 +05:30
9134375ad8 New translations en.json (Italian) 2021-03-07 09:37:02 +05:30
e6c8a73e72 New translations en.json (Japanese) 2021-03-07 09:37:01 +05:30
1e87b1a7f4 New translations en.json (Norwegian) 2021-03-07 09:36:59 +05:30
70be890e37 New translations en.json (Polish) 2021-03-07 09:36:58 +05:30
d6db251a8f New translations en.json (Russian) 2021-03-07 09:36:57 +05:30
fa5fa3e891 New translations en.json (Ukrainian) 2021-03-07 09:36:56 +05:30
a92a56449c New translations en.json (Chinese Simplified) 2021-03-07 09:36:55 +05:30
7b422bfccd New translations en.json (Portuguese, Brazilian) 2021-03-07 09:36:54 +05:30
d1feab6701 New translations en.json (Hindi) 2021-03-07 09:36:53 +05:30
b2a511736e New translations en.json (Kannada) 2021-03-07 09:36:52 +05:30
e405b3b641 New translations en.json (French) 2021-03-07 09:36:51 +05:30
4609fb583e New translations en.json (German) 2021-03-07 09:36:46 +05:30
a12a8a2f83 New translations en.json (Finnish) 2021-03-07 09:36:45 +05:30
34d07bc863 New translations en.json (Dutch) 2021-03-07 09:36:43 +05:30
e4c9833c8d New translations en.json (Swedish) 2021-03-07 09:36:42 +05:30
5070a11854 New translations en.json (Romanian) 2021-03-07 09:36:41 +05:30
1365972676 Merge pull request #462 from anu1097/feature/toggle-switch-left-panel
feat: adding a toggle switch for left panel items
2021-03-07 08:51:16 +05:30
b0e0a53794 Merge pull request #460 from lordkyuusei/develop
Updating FR.json translations
2021-02-27 20:04:14 +05:30
cf47447102 feat: adding a toggle switch for left panel items 2021-02-26 02:14:40 +05:30
7af837165d Mise à jour de certaines erreurs de traduction 2021-02-22 17:47:37 +01:00
d98e591fee [2.6.3] update dockerfile to add other required packages 2021-02-16 09:59:34 +05:30
a219b1d979 [2.6.3] updating dependencies 2021-02-16 09:17:11 +05:30
797e30022e Merge pull request #459 from mlow/develop
Dockerfile improvements
2021-02-15 00:28:57 +05:30
d6ae8309b4 Dockerfile improvements
- Add missing build dependencies for `sharp` node module (dependency of
  `gatsby-plugin-sharp`).
- Add ARG instructions for firebase variables, allowing them to be set
  via --build-arg flags when building the image.
- Use `npm ci` instead of `npm install`, and execute it after copying
  only package*.json. This prevents having to fetch all dependencies if
  package*.json hasn't changed between builds.
- Use `node:alpine` instead of `node` - not an improvement per-se,
  but I happen to be more familiar with adding build dependecies in the
  alpine based node image.
2021-02-14 00:41:29 -07:00
f1a911560d [2.6.2] add eslint-webpack-plugin 2021-02-12 11:27:56 +05:30
5e5ee5fffa [2.6.2] update dependencies, bump up version 2021-02-12 11:23:28 +05:30
0639cef426 Merge pull request #448 from agirdzius/lithuanian-locale
Added Lithuanian translations.
2021-02-12 11:18:23 +05:30
d1a392c2f0 Merge pull request #449 from AmruthPillai/l10n_develop
New Crowdin updates
2021-02-12 11:18:15 +05:30
b781731e5c Merge pull request #453 from agirdzius/missing-dayjs-locales
Added missing Hindi, Swedish and Russian dayjs locales.
2021-02-12 11:18:04 +05:30
90b968f152 Merge pull request #456 from ConorSheehan1/develop
fix link to product hunt
2021-02-12 11:17:56 +05:30
b6d5f0ce12 Merge pull request #450 from gianantoniopini/develop
Add support for drag & drop to the List component
2021-02-12 11:17:43 +05:30
eb01954b9b fix link to product hunt 2021-02-10 22:34:55 +00:00
39278b7803 Added missing Hindi, Swedish and Russian dayjs locales. 2021-02-10 12:51:26 +00:00
bd1bd2fc97 List component, drag handler: added check for source and destination id being the same 2021-02-09 12:31:54 +01:00
8ce73a38ea Builder unit tests helper: comments correction 2021-02-09 11:52:48 +01:00
2fa4ff8d9d Builder page: added unit test for drag & drop of skill 2021-02-09 09:36:36 +01:00
db460c9b55 New translations en.json (Arabic) 2021-02-09 12:27:17 +05:30
23bf495a5a List component: added support for drag & drop 2021-02-09 05:59:32 +01:00
3ff4b5c90f Version bump to 2.6.1 2021-02-08 15:12:29 +00:00
341f36870b Added Lithuanian translations. 2021-02-08 11:41:47 +00:00
89936b651a [2.6.0] update dependencies + verify firebase engine 2021-02-07 12:34:15 +05:30
04f8fe2db7 [2.6.0] update dependencies 2021-02-07 12:21:21 +05:30
91329969be Merge pull request #437 from AmruthPillai/l10n_develop
New Crowdin updates
2021-02-06 09:50:28 +05:30
142f8e0b31 Merge pull request #443 from gianantoniopini/develop
Addition of some unit tests to the Dashboard page
2021-02-06 09:50:14 +05:30
811e158fbc Merge remote-tracking branch 'upstream/develop' into develop 2021-02-02 14:20:47 +01:00
f2bc5e36b3 Dashboard: removed unit tests related to rename resume 2021-02-02 14:03:35 +01:00
a2b637fa71 Dashboard: unit tests related to rename resume 2021-02-02 14:02:56 +01:00
fd79891a1a Dashboard: unit tests related to rename resume 2021-02-02 14:01:17 +01:00
23386839a6 Firebase Stub: unit tests separated in different files 2021-02-02 12:39:16 +01:00
a589b3530a Merge pull request #442 from AmruthPillai/issue-441
Fix #441: Make Skill Level Optional
2021-02-02 15:56:02 +05:30
26022ae73e Update SkillModal.js 2021-02-02 15:46:48 +05:30
4634b4f0a0 Castform: unit tests refactoring to reduce nesting 2021-02-02 10:40:26 +01:00
f72d2639e5 Builder page: unit tests separated in different files 2021-02-02 10:27:30 +01:00
e39026c8b4 Dashboard page: unit tests separated in different files 2021-02-01 18:00:52 +01:00
5ee077dac5 Dashboard page: added unit tests related to duplicate resume interaction 2021-02-01 12:10:15 +01:00
c748e6a0b4 Dashboard page: removed unit tests related to rename resume interaction (they are generating warnings) 2021-02-01 10:49:02 +01:00
97f065f51c Merge remote-tracking branch 'upstream/develop' into develop 2021-02-01 07:23:19 +01:00
5b0124bedc New translations en.json (Spanish) 2021-02-01 07:24:24 +05:30
51673a9e6d - bump up version to 2.5.5 2021-01-31 11:03:45 +05:30
9ddba69ff0 - Added Greek Language 2021-01-31 10:59:41 +05:30
2a2ceea448 Merge pull request #434 from AmruthPillai/l10n_develop
New Crowdin updates
2021-01-31 10:57:29 +05:30
bff0bec759 New translations en.json (German) 2021-01-31 00:31:13 +05:30
7bdddb8dc7 New translations en.json (Greek) 2021-01-30 15:40:51 +05:30
da8bf8bc36 Dashboard page: added more unit tests for rename resume interaction 2021-01-27 11:33:11 +01:00
5d9527e46e Dashboard page: unit tests refactoring 2021-01-27 10:35:58 +01:00
a20fe10c06 Dashboard page: added unit test for delete resume interaction 2021-01-26 17:38:05 +01:00
8018d7f527 Dashboard page: refactored setup of fetch mock, added more assertions to unit test 2021-01-26 14:22:27 +01:00
e27bedcf88 Dashboard page: unit tests refactoring 2021-01-26 13:19:49 +01:00
b196ca1bf5 Dashboard page: added unit test related to create resume interaction 2021-01-25 17:54:36 +01:00
87fee23480 Dashboard page: added unit test related to create resume interaction 2021-01-25 17:30:05 +01:00
9d486c11cc Dashboard page: added unit test related to create resume interaction 2021-01-25 16:44:08 +01:00
ef3f2a802f Dashboard page: added first unit test for create resume interaction 2021-01-25 15:15:02 +01:00
8b39dcc239 Merge pull request #431 from AmruthPillai/l10n_develop
New Crowdin updates
2021-01-25 12:35:26 +05:30
b73e3b7c4d New translations en.json (Turkish) 2021-01-24 23:14:18 +05:30
4820a8bea3 add deploy script to package.json 2021-01-23 20:07:14 +05:30
22a171c25c [2.5.4] Add Tests, Add GitHub Action, Update Dependencies 2021-01-23 19:44:20 +05:30
30109ecb1d set up for first use on IntelliJ WebStorm 2021-01-23 19:41:11 +05:30
b76fa1dcc5 add GitHub Action to run unit tests on every PR/push 2021-01-23 19:28:01 +05:30
6c31d3dff3 Merge pull request #429 from gianantoniopini/develop
Addition of some unit tests to Builder and Dashboard pages
2021-01-23 19:19:06 +05:30
c01be98cfc Builder: added unit test for resume in initial state 2021-01-23 14:05:37 +01:00
74335a1771 Builder and Dashboard unit tests: fine tuning of assertions related to toast/notification 2021-01-23 12:21:02 +01:00
5317f5e525 Builder and Dashboard unit tests refactoring/cleanup 2021-01-23 11:45:06 +01:00
9a7bdb188b Builder: updated unit test handling non-existent resume 2021-01-22 17:25:04 +01:00
dc18e84bc2 Dashboard: updated unit tests for Delete resume 2021-01-22 16:42:21 +01:00
cb2aeec70a Dashboard: added unit tests for Delete resume 2021-01-22 10:43:06 +01:00
16ed433705 Exported LoadingScreen testId and language Storage item key in order to be used in unit tests 2021-01-22 06:36:11 +01:00
0bab0d01d1 Removed testId from LoadingScreen 2021-01-22 06:05:00 +01:00
306db64ff1 Firebase Stub: minor tweak in reference .on function 2021-01-21 16:56:05 +01:00
af966bdf7b Firebase Stub: introduced a delay in all async functions to better mimic real Firebase 2021-01-21 16:45:33 +01:00
562a07619c Merge remote-tracking branch 'upstream/develop' into develop 2021-01-20 15:53:29 +01:00
4c63f68215 Builder tests: added test for loading screen 2021-01-20 15:52:35 +01:00
1215071ab9 Dashboard tests: added test for loading screen 2021-01-20 14:27:27 +01:00
3d39576a90 Builder test: changed some queries to use *ByRole 2021-01-20 13:40:58 +01:00
155cd499fb Builder test: added test for handling non-existent resume, added resetting of language Storage item 2021-01-20 12:57:31 +01:00
aca1d13116 Merge pull request #423 from gianantoniopini/develop
Unit testing environment set up and addition of some unit tests
2021-01-20 16:19:16 +05:30
fbc5f0de72 Merge pull request #426 from 4O4/i18n-pl-improvements
Improvement of polish translations
2021-01-20 16:19:03 +05:30
536bdb7bae Merge pull request #427 from 4O4/latin-ext-webfonts
Add latin-ext subset to fix special characters missing in webfonts
2021-01-20 16:18:49 +05:30
d507b9d54d Add latin-ext subset to fix special characters missing in webfonts 2021-01-19 15:12:38 +01:00
efe1762b33 Improvement of polish translations 2021-01-19 13:52:01 +01:00
5ba978dae5 Firebase Stub: refactoring 2021-01-15 10:25:44 +01:00
aac1e12cfc Firebase Stub: leading slash in reference path is ignored 2021-01-15 09:19:35 +01:00
978aafae75 Firebase Stub: added more unit tests 2021-01-15 08:31:35 +01:00
72176e2500 Firebase Stub: .off function implementation 2021-01-14 17:49:52 +01:00
6ac0f37ada Firebase Stub: added support for data remove 2021-01-14 17:16:01 +01:00
46781bba60 Firebase Stub: simple implementation of data changes listener 2021-01-14 14:48:07 +01:00
6d36c27889 Firebase Stub: simple implementation of data changes listener 2021-01-14 14:00:07 +01:00
36036cc411 Firebase Stub: query parameters not kept between ref calls 2021-01-14 09:38:46 +01:00
b6a0527fbe Firebase Stub refactoring: private class field naming convention 2021-01-11 17:18:37 +01:00
253f778a63 Dashboard test working 2021-01-11 16:58:24 +01:00
6c1fc543ad Firebase Stub: debounce callback called by "on" function 2021-01-11 16:18:38 +01:00
dce5d2c591 Firebase Stub: resolving ESLint errors 2021-01-08 14:15:46 +01:00
cb45629032 Firebase Stub: resolving ESLint errors 2021-01-08 13:29:21 +01:00
9c5b8398a3 Firebase Stub: resolving ESLint errors 2021-01-08 12:11:02 +01:00
e78d3dbaa4 Updates after latest merge from upstream branch 2021-01-08 10:15:38 +01:00
70cd92f29e Merge remote-tracking branch 'upstream/develop' into develop 2021-01-08 09:38:13 +01:00
4a0995eeb6 [2.5.3] Added "Czech" Language 2021-01-08 08:46:19 +05:30
ba31e18ffd Merge pull request #418 from AmruthPillai/l10n_develop
New Crowdin updates
2021-01-08 08:21:11 +05:30
3c6e45abf4 Firebase Stub refactoring 2021-01-07 18:04:59 +01:00
c2ac9594ef Firebase Stub refactoring 2021-01-07 17:28:43 +01:00
69f0338b19 Firebase Stub refactoring 2021-01-07 17:17:53 +01:00
da8849c854 Firebase Stub refactoring, added eslint-plugin-jest dev dependency 2021-01-07 16:43:24 +01:00
294dbf195f FirebaseStub refactoring 2021-01-07 13:23:22 +01:00
98aef7eb77 [2.5.2] Fix fontSize not reflecting in exported PDF 2021-01-07 09:35:31 +05:30
176ba0de7a Firebase stub: added support for filtering of resumes by user 2021-01-06 17:03:46 +01:00
c667c31737 Firebase stub: added additional resume and user to test data, added more tests 2021-01-06 16:00:23 +01:00
7733d827e2 New translations en.json (Czech) 2021-01-06 19:48:32 +05:30
35c663ebe8 Dashboard test: draft version 2021-01-06 14:42:50 +01:00
854020481c Builder: 'allow to change the language' test 2021-01-06 10:10:15 +01:00
e99c73a5b1 Builder test: draft version of test changing the language 2021-01-04 16:17:51 +01:00
5197878b79 Jest configuration: updated settings for code coverage 2021-01-04 12:35:02 +01:00
57d234ae02 Jest configuration: added settings for code coverage 2021-01-04 12:09:04 +01:00
8202ca5461 FirebaseStub refactoring 2021-01-04 10:42:41 +01:00
2e346c93eb Updates after latest merge from upstream branch 2021-01-04 10:22:09 +01:00
5470fb8d6f Merge remote-tracking branch 'upstream/develop' into develop 2021-01-04 09:46:35 +01:00
4cd4af6ee1 New translations en.json (French) 2021-01-03 18:46:23 +05:30
c065c844ee New translations en.json (Danish) 2021-01-03 17:46:00 +05:30
4768135963 New translations en.json (Finnish) 2021-01-03 16:26:08 +05:30
a63496ca86 New translations en.json (Dutch) 2021-01-03 15:25:29 +05:30
c40d89e98e [2.5.1] update dependencies 2021-01-03 11:58:17 +05:30
eb4023e3b2 Merge branch 'rpolley-add-font-size-setting' into develop 2021-01-03 11:45:00 +05:30
e2218030cf Merge pull request #413 from rpolley/add-font-size-setting
Add ability to customize font size
2021-01-03 11:44:43 +05:30
fdd35492a0 [2.5] Implement Font Size Adjustments 2021-01-03 11:44:14 +05:30
297a258e4a Merge branch 'add-font-size-setting' of https://github.com/rpolley/Reactive-Resume into rpolley-add-font-size-setting 2021-01-03 11:29:31 +05:30
c0808af7f4 Merge pull request #415 from StijnSimons/develop
Fixed Dutch translation
2021-01-03 11:23:40 +05:30
5887babd15 Fixed Dutch translation 2020-12-27 23:02:07 +01:00
abd24e7eb7 Add ability to customize font size
Added an ability to customize font sizes. This is set at a new section in the settings.
The controler for this sets a number of css variables which are used in css rules that
override tailwind's text-<size> to use the font size and line spacing contained in the
variable. The control itself is a simple logarithmic slider that controls a "scale
factor" by which all the text sizes in a resume are scaled by.
2020-12-26 13:24:29 -06:00
988a903acc Merge pull request #412 from AmruthPillai/dependabot/npm_and_yarn/functions/date-and-time-0.14.2
Bump date-and-time from 0.14.1 to 0.14.2 in /functions
2020-12-25 09:12:58 +05:30
f76609c2fc Bump date-and-time from 0.14.1 to 0.14.2 in /functions
Bumps [date-and-time](https://github.com/knowledgecode/date-and-time) from 0.14.1 to 0.14.2.
- [Release notes](https://github.com/knowledgecode/date-and-time/releases)
- [Commits](https://github.com/knowledgecode/date-and-time/compare/v0.14.1...v0.14.2)

Signed-off-by: dependabot[bot] <support@github.com>
2020-12-24 21:56:54 +00:00
53333bb6fb Merge remote-tracking branch 'upstream/develop' into develop 2020-12-24 10:18:29 +01:00
d951a3f52d Castform tests refactoring 2020-12-24 10:08:17 +01:00
458aab4e8d FirebaseStub: refactoring 2020-12-24 09:53:55 +01:00
445d1e37d9 FirebaseStub: refactoring 2020-12-24 09:24:46 +01:00
85a489cefa [2.4.3] Add Docker Support, Make Address Optional 2020-12-24 11:08:59 +05:30
53b36a1aad FirebaseStub: cleanup 2020-12-23 16:23:13 +01:00
25d3661599 Minor change in FirebaseStub test file 2020-12-23 16:01:13 +01:00
2158c8b245 builder.test: cleanup 2020-12-23 15:49:56 +01:00
18e3e47ee4 Updated builder.test 2020-12-23 15:48:06 +01:00
c6a400a2f1 Updated builder.test to use DebounceWaitTime 2020-12-23 15:46:48 +01:00
30d94fd2a8 Updated builder.test to use new FirebaseStub 2020-12-23 14:46:10 +01:00
fb8dd6d986 Firebase stub: new implementation in place 2020-12-23 14:25:38 +01:00
356ae08643 Firebase stub: refactoring 2020-12-23 14:15:57 +01:00
f73359f83a Firebase mock: added auth to new implementation 2020-12-23 13:56:34 +01:00
45bf7146e5 Firebase mock: updated new implementation 2020-12-23 13:07:15 +01:00
5bec64d723 Firebase mock: started new implementation 2020-12-23 09:12:46 +01:00
a9c6ed4cdb Firebase mock: fix for property ServerValue.TIMESTAMP 2020-12-22 17:08:37 +01:00
b9014eb6cb Firebase mock: fixed issue with database namespace 2020-12-22 15:40:36 +01:00
9dc1f1b89b Builder.test: modified draft version of test for data update 2020-12-21 15:16:35 +01:00
7450b1c683 Updates after latest merge from upstream branch 2020-12-21 11:53:24 +01:00
9d713d7449 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-21 11:20:41 +01:00
c1cc9d0a69 rename workflow 2020-12-20 22:11:26 +05:30
45edbded87 Builder.test: modified draft version of test for data update 2020-12-20 17:36:24 +01:00
d6ca39817d fix build and deploy script 2020-12-20 21:51:25 +05:30
534736a3a4 fix build and deploy workflow script 2020-12-20 21:38:28 +05:30
8bac6c79a8 Merge branch 'develop' 2020-12-20 21:29:23 +05:30
7fb8d0d59d remove unnecessary alias 2020-12-20 21:28:46 +05:30
c9c62b1f3c Merge pull request #407 from AmruthPillai/develop
Adding GitHub Actions to make my life easier
2020-12-20 21:19:23 +05:30
53676ad997 version bump 2020-12-20 21:16:36 +05:30
fa1d8d50a0 Create build-and-deploy.yml 2020-12-20 21:14:23 +05:30
a13404aaf2 Merge pull request #406 from AmruthPillai/codeql-analysis
Create codeql-analysis.yml
2020-12-20 21:06:45 +05:30
a558a97cba Create codeql-analysis.yml 2020-12-20 21:02:56 +05:30
72b68e060c [2.4.1] Add Persian (Farsi) Language 2020-12-20 20:04:58 +05:30
7a0403f9d6 Merge pull request #403 from pmsoltani/pmsoltani-patch-1
Farsi (Persian) translation
2020-12-20 19:55:24 +05:30
916579c874 [v2.4] Fix JSON Resume Imports 2020-12-20 19:47:31 +05:30
b3be9e5f50 Builder.test: added draft version of test for data update 2020-12-17 17:40:54 +01:00
918100c949 Firebase mock: refactoring to mock functions with specific arguments 2020-12-17 12:32:42 +01:00
7c1076e08d Farsi (Persian) translation 2020-12-16 21:55:40 +03:30
a79de37ac9 Deleted obsolete Context mocks; added more Asserts to builder.test 2020-12-16 17:03:28 +01:00
a16f19a26f Gatsby mock: expanded useStaticQuery to support Templates, refactoring 2020-12-16 15:12:21 +01:00
0459a77e4d Firebase mock: set resume 'name' and 'user' properties 2020-12-16 11:13:49 +01:00
3a68c4b5af Firebase mock refactoring 2020-12-16 10:37:23 +01:00
d33f707cea Firebase mock: mock auth() signIn, in order to trigger onAuthStateChanged 2020-12-15 15:32:08 +01:00
942d8a0120 Updated Gatsby mock: fluid images returned by useStaticQuery 2020-12-14 15:05:03 +01:00
d51201d6f2 Firebase mock: added onAuthStateChanged observer 2020-12-14 13:26:11 +01:00
d3d51eabf5 Firebase mock: refactoring, fixed issue with call to __getResume 2020-12-14 12:03:36 +01:00
287336e166 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-14 09:00:56 +01:00
96ab340b1c set min-height for pages when printing 2020-12-13 10:37:02 +05:30
b105b08c8f Updated Firebase mock 2020-12-12 16:42:34 +01:00
d7123e511e Updated mock DatabaseContext to allow setting of resumes array 2020-12-12 14:06:00 +01:00
6e666b1435 Updated Firebase mock to allow use of demo resume 2020-12-12 13:17:57 +01:00
8ffe61a94a Updated package-lock.json after latest merge from upstream branch 2020-12-12 11:54:39 +01:00
c9ce3f6716 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-12 11:04:51 +01:00
a84cdf33cd added .env.example 2020-12-11 10:15:15 +05:30
d51363663b Stopped tracking .env files, but keep remote 2020-12-11 10:12:41 +05:30
b992bc4b73 Attempt to test Builder, using Firebase mock 2020-12-10 17:03:56 +01:00
e3d1f0305a Changes in DatabaseContext mock 2020-12-10 12:16:55 +01:00
9736b2c6d4 Attempt to test Builder, using DatabaseContext mock. 2020-12-10 11:13:03 +01:00
435400b1e3 Reinstated dependencies for Unit Testing, after latest merge from upstream branch 2020-12-09 11:05:34 +01:00
422066dd62 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-09 10:35:39 +01:00
5cd95b54f5 Create .env 2020-12-09 10:42:01 +05:30
df71b86028 - bumped version to 2.3.3
- fixed text alignment issues
- updated dependencies
- added ukranian language
2020-12-09 10:40:27 +05:30
88a3fe5148 Merge pull request #389 from AmruthPillai/l10n_develop
New Crowdin updates
2020-12-09 10:37:03 +05:30
d56ce24064 New translations en.json (Italian) 2020-12-09 10:36:41 +05:30
5f0bab8dd0 New translations en.json (Polish) 2020-12-09 10:36:37 +05:30
4be55a4133 New translations en.json (Arabic) 2020-12-09 10:27:41 +05:30
5b4f495fc9 Reinstated dependencies for Unit Testing, after latest merge from upstream branch 2020-12-07 16:02:50 +01:00
7af9b1469d Merge remote-tracking branch 'upstream/develop' into develop 2020-12-07 15:06:43 +01:00
c1c0f5a43d New translations en.json (Ukrainian) 2020-12-06 18:02:28 +05:30
bce80a9101 bump up version to 2.3 2020-12-05 16:19:52 +05:30
cd0c847606 updates to dependencies, merging to production 2020-12-05 15:22:45 +05:30
cc8729e889 Merge pull request #386 from AmruthPillai/l10n_develop
New Crowdin updates
2020-12-05 15:21:58 +05:30
faf67dd7a8 New translations en.json (French) 2020-12-05 15:21:43 +05:30
990336017e Merge pull request #384 from HristovCodes/develop
Added address info to Gengar template.
2020-12-05 11:13:15 +05:30
fe2e56bda0 Added newline at end of package.json 2020-12-02 16:56:53 +01:00
fcf578a6d9 Defined the 'prebuild' script in package.json to run the unit tests 2020-12-02 16:50:29 +01:00
4198136ce4 Merge remote-tracking branch 'upstream/develop' into develop 2020-12-01 14:43:39 +01:00
354b517200 Set up Unit Testing environment with Gatsby, Jest and @testing-library/react; added some basic unit tests for Castform template 2020-12-01 14:40:53 +01:00
902a6eb0c5 Merge branch 'develop' of https://github.com/HristovCodes/Reactive-Resume into develop 2020-11-28 18:03:08 +02:00
285cc80592 Added adress info to Gengar template. 2020-11-28 18:00:20 +02:00
8b8541227d Merge pull request #382 from AmruthPillai/l10n_develop
New Crowdin updates
2020-11-27 01:34:11 +05:30
b8701f9fc6 New translations en.json (Danish) 2020-11-22 15:42:59 +05:30
a5550d5e64 New translations en.json (Finnish) 2020-11-22 14:02:37 +05:30
d9af8286b9 New translations en.json (Dutch) 2020-11-22 14:02:35 +05:30
71914d8edb New translations en.json (French) 2020-11-22 13:01:26 +05:30
ab1b52fb77 Merge pull request #375 from rpolley/add-end-date-field-to-projects
Add end date field to projects
2020-11-22 12:00:39 +05:30
97affd54fc Merge pull request #374 from gianantoniopini/develop
Add a Birthdate field to the profile information
2020-11-22 12:00:26 +05:30
aea3950d73 Merge pull request #380 from enzo-g/develop
Update fr.json
2020-11-22 11:59:49 +05:30
06f84cd9cf Merge branch 'develop' into develop 2020-11-22 11:59:38 +05:30
0f390ab493 Issue #314: Updated Celebi, Gengar, Glalie and Pikachu templates to include new birthDate field; deleted ContactE block as it is no longer used in the Celebi template. 2020-11-10 14:01:16 +01:00
e2b242d40d use date attribute for start date 2020-11-09 16:04:03 -06:00
81ad16ae8a update project to use date range 2020-11-09 15:59:24 -06:00
df4f4e2ccd Issue #314: Updated Onyx template to incorporate birthDate field through new component BirthDateB 2020-11-09 17:07:48 +01:00
21e499502f Issue #314: Created separate component BirthDateA, with language retrieved from data.metadata.language 2020-11-09 12:42:15 +01:00
b365826f0a Merge remote-tracking branch 'upstream/develop' into develop 2020-11-09 11:54:37 +01:00
d4816291b4 Update fr.json 2020-11-09 09:19:37 +05:30
b7c242a32f Merge pull request #373 from mrjelveh/develop
Adding stackoverflow & behance icon: Fixes #372
2020-11-09 09:05:58 +05:30
74b16824fa Merge branch 'develop' into develop 2020-11-09 09:05:17 +05:30
f779ca4cbf Issue #314: Modified Castform template to handle data profile having no birthDate field (backward compatibility) 2020-11-08 14:56:52 +01:00
f0660b4266 Adding stackoverflow & behance icon 2020-11-08 16:00:54 +03:30
2e6e4ad2c7 Update fr.json
"present": "cadeau" -> cadeau means 'gift' in French.
'Aujourd'hui' is more appropriate, it's the term use by LinkedIn in French.
French is my native language.
2020-11-07 19:27:27 +09:00
ea9931a147 Issue #314: Added new BirthDate field to the i18n language files 2020-11-04 14:56:28 +01:00
59f0ff9228 Issue #314: Added BirthDate field to Profile builder and Castform template 2020-11-04 13:38:43 +01:00
5bf9d5ae9e remove annoying confirmation dialog box 2020-10-10 12:59:55 +05:30
eed71286f2 bump up version to 2.2.1 2020-10-10 12:45:19 +05:30
36aad98485 bringing back the service worker 2020-10-10 12:45:04 +05:30
6bc0451ed9 MMerge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-10-10 12:32:38 +05:30
52e43638e7 fix firebase deploy settings 2020-10-10 12:32:19 +05:30
8f17f18b2b Merge pull request #358 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-10 12:09:16 +05:30
c704f8029b [ADD] new languages [FIX] PDF export 2020-10-10 12:07:29 +05:30
32a6cb5d30 New translations en.json (Norwegian) 2020-10-10 12:01:40 +05:30
54b3b649b8 Merge pull request #357 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-10 11:53:50 +05:30
3a48d6a7c2 New translations en.json (Norwegian) 2020-10-10 11:53:41 +05:30
1ab07a2f4b New translations en.json (Russian) 2020-10-10 11:53:40 +05:30
1a275d4585 New translations en.json (Swedish) 2020-10-10 11:53:38 +05:30
8297551e7c New translations en.json (Chinese Simplified) 2020-10-10 11:53:37 +05:30
93d04f3300 New translations en.json (Hindi) 2020-10-10 11:53:29 +05:30
f2b74caa7c Merge pull request #356 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-10 11:36:42 +05:30
b451276d68 New translations en.json (Kannada) 2020-10-10 11:36:21 +05:30
aec5238456 New translations en.json (French) 2020-10-10 11:36:19 +05:30
5de45ff155 New translations en.json (Spanish) 2020-10-10 11:36:17 +05:30
4ba401cd31 New translations en.json (Arabic) 2020-10-10 11:36:16 +05:30
2c452ebd6a New translations en.json (German) 2020-10-10 11:36:13 +05:30
b43733c811 New translations en.json (Italian) 2020-10-10 11:36:11 +05:30
7118de4198 New translations en.json (Japanese) 2020-10-10 11:36:09 +05:30
7e0222402d New translations en.json (Polish) 2020-10-10 11:36:07 +05:30
1071caa062 New translations en.json (Turkish) 2020-10-10 11:36:05 +05:30
fa82978ead New translations en.json (Portuguese, Brazilian) 2020-10-10 11:36:04 +05:30
aa5be1e0a0 [FIX] exporting resume 2020-10-10 11:22:08 +05:30
2020ecfacb Merge pull request #344 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-09 08:24:36 +05:30
ab1e2a9678 Merge pull request #348 from PostIt59/develop
🐛 Fix translate mistake
2020-10-09 08:24:25 +05:30
6af4ec193e 🐛 Fix translate mistake 2020-10-05 22:23:15 +02:00
2630891cd1 New translations en.json (Finnish) 2020-10-04 20:01:35 +05:30
054a97055b New translations en.json (Danish) 2020-10-04 17:48:44 +05:30
ac7f16f829 New translations en.json (French) 2020-10-04 13:48:18 +05:30
f7a2bb5af8 New translations en.json (Dutch) 2020-10-04 12:28:34 +05:30
49d0a5607e add back purge paths 2020-10-04 09:05:55 +05:30
a11db1db10 adding stylelint to repo 2020-10-04 08:58:01 +05:30
469f53bf6e fix with firebase deploy 2020-10-03 09:10:19 +05:30
2aaed1a575 fixing crashes, upgrading dependencies, patching security vulnerabilities 2020-10-03 08:57:37 +05:30
2410ce024a Merge pull request #341 from robert-w-gries/utils_hook_fix
Fix app crashes after setting date range
2020-10-03 08:14:05 +05:30
77f3837fc8 Merge pull request #340 from thjiang/develop
- add translation for Simplified Chinese
2020-10-03 08:13:46 +05:30
c4d63da884 Merge pull request #339 from kbravh/develop
Set contact icons for phone, website, and email
2020-10-03 08:13:21 +05:30
c7b03bde79 Merge pull request #330 from AmruthPillai/dependabot/npm_and_yarn/functions/node-fetch-2.6.1
Bump node-fetch from 2.6.0 to 2.6.1 in /functions
2020-10-03 08:12:56 +05:30
0f6c4b3b45 Merge pull request #328 from AmruthPillai/l10n_develop
New Crowdin updates
2020-10-03 08:12:34 +05:30
52912aff0a Merge pull request #322 from AmruthPillai/dependabot/npm_and_yarn/functions/bl-4.0.3
Bump bl from 4.0.2 to 4.0.3 in /functions
2020-10-03 08:12:27 +05:30
0104e888e7 Merge pull request #318 from marciojpflorindo/develop
Translation to pt-PT
2020-10-03 08:12:04 +05:30
370de9ec47 Remove useTranslation hook from util functions 2020-10-02 18:17:48 +00:00
d712dbf5e2 - add translate for Simplified Chinese 2020-10-02 17:22:35 +08:00
054dec5b68 Set contact icons for phone, website, and email 2020-09-18 10:25:51 -05:00
838b63ca42 New translations en.json (Polish) 2020-09-17 01:28:43 +05:30
50da90af89 Bump node-fetch from 2.6.0 to 2.6.1 in /functions
Bumps [node-fetch](https://github.com/bitinn/node-fetch) from 2.6.0 to 2.6.1.
- [Release notes](https://github.com/bitinn/node-fetch/releases)
- [Changelog](https://github.com/node-fetch/node-fetch/blob/master/docs/CHANGELOG.md)
- [Commits](https://github.com/bitinn/node-fetch/compare/v2.6.0...v2.6.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-13 02:32:34 +00:00
656ff69af3 New translations en.json (Italian) 2020-09-09 18:01:42 +05:30
3d8b9f8ba3 Bump bl from 4.0.2 to 4.0.3 in /functions
Bumps [bl](https://github.com/rvagg/bl) from 4.0.2 to 4.0.3.
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v4.0.2...v4.0.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-09-02 18:50:19 +00:00
f622ccda1d translation to pt-PT 2020-08-31 12:31:22 +01:00
1c25ffe037 Merge pull request #308 from grijul/develop
Added GitLab icon
2020-08-22 21:27:36 +05:30
895f18181a Added GitLab icon 2020-08-19 18:40:16 +05:30
e2ef7874a6 Update README.md 2020-08-13 11:06:12 +05:30
4fecbaf8d8 Merge pull request #297 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-13 11:05:41 +05:30
0d65e9d0c0 New translations en.json (Kannada) 2020-08-13 11:03:26 +05:30
3695a25428 New translations en.json (Arabic) 2020-08-13 11:03:24 +05:30
9f30f0dafb New translations en.json (Danish) 2020-08-13 11:03:23 +05:30
1dce5f248a New translations en.json (German) 2020-08-13 11:03:22 +05:30
e0e08f7071 New translations en.json (Finnish) 2020-08-13 11:03:20 +05:30
73a6ab096f New translations en.json (Japanese) 2020-08-13 11:03:19 +05:30
64c1ec4cc2 New translations en.json (French) 2020-08-13 11:03:17 +05:30
5d1f378397 New translations en.json (Dutch) 2020-08-13 11:03:16 +05:30
d00cb00a7c New translations en.json (Turkish) 2020-08-13 11:03:14 +05:30
1c123e922d New translations en.json (Spanish) 2020-08-13 11:03:12 +05:30
9fcc3c1ae6 New translations en.json (Portuguese, Brazilian) 2020-08-13 11:03:11 +05:30
dc6c5b848b New translations en.json (Finnish) 2020-08-09 12:50:19 +05:30
929f7c7147 Merge pull request #296 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-08 09:04:23 +05:30
33ce66eab1 New translations en.json (Kannada) 2020-08-08 09:04:13 +05:30
3aa968248d New translations en.json (Arabic) 2020-08-08 09:04:12 +05:30
2d0a524f86 New translations en.json (Danish) 2020-08-08 09:04:10 +05:30
6d4bfc196b New translations en.json (German) 2020-08-08 09:04:09 +05:30
906f9434f4 New translations en.json (Finnish) 2020-08-08 09:04:07 +05:30
033b6df89b New translations en.json (Japanese) 2020-08-08 09:04:05 +05:30
5c8530f53e New translations en.json (French) 2020-08-08 09:04:04 +05:30
74c6fd7b4e New translations en.json (Dutch) 2020-08-08 09:04:02 +05:30
f45c9d3ef8 New translations en.json (Turkish) 2020-08-08 09:04:01 +05:30
f7245936c7 New translations en.json (Spanish) 2020-08-08 09:03:59 +05:30
91dc642dbd New translations en.json (Portuguese, Brazilian) 2020-08-08 09:03:57 +05:30
5955567b5e - add "Present" key string in i18n 2020-08-08 08:52:30 +05:30
1e5dc00da8 fix list style indent 2020-08-08 08:47:09 +05:30
0374f572e6 Merge pull request #295 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-08 08:39:39 +05:30
28855bcc48 New translations en.json (Portuguese, Brazilian) 2020-08-07 23:22:55 +05:30
2b0a127904 Merge pull request #292 from crazyuploader/patch-1
Update README.md
2020-08-06 19:46:05 +05:30
c148a677e9 Update README.md 2020-08-06 18:34:32 +05:30
94abd5ce4f Merge pull request #285 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-03 22:24:47 +05:30
c77448a932 Merge pull request #284 from a-thug/develop
Fix scaling for large monitor
2020-08-03 22:24:23 +05:30
dc95fb4f60 Merge pull request #283 from MeisterLLD/develop
Update fr.json
2020-08-03 22:23:55 +05:30
b52118d1b2 New translations en.json (Japanese) 2020-08-03 20:17:11 +05:30
2107a1af45 Fix scaling for large monitor 2020-08-03 23:25:33 +09:00
465ee689d3 Update fr.json 2020-08-03 12:21:51 +02:00
87e3ebfaa8 - update dependencies 2020-08-01 10:31:04 +05:30
dc6f825f2e Merge pull request #276 from AmruthPillai/l10n_develop
New Crowdin updates
2020-08-01 10:09:11 +05:30
bc622083c7 - fix black screen issue when in certain templates 2020-08-01 10:08:25 +05:30
7db22e3b42 New translations en.json (Danish) 2020-07-31 20:19:21 +05:30
ac9650e397 New translations en.json (Dutch) 2020-07-31 20:19:19 +05:30
1f80fc481d - add norwegian language 2020-07-31 19:15:20 +05:30
9f81101084 - fix typo in import text 2020-07-31 19:11:10 +05:30
3634e3cf35 Merge pull request #275 from rubjo/develop
Add Norwegian translation
2020-07-31 19:06:37 +05:30
a991546e79 - fix photo not being uploaded 2020-07-31 19:01:16 +05:30
7a2f86a5c3 Fix English typo 2020-07-31 14:19:53 +02:00
48e7149540 Add Norwegian translation 2020-07-31 14:19:39 +02:00
09ea3b95ab - fix label in contact
- fix importing from json
- fix reset everything
- update dependencies
2020-07-31 13:33:11 +05:30
714d37deca - add arabic language 2020-07-31 12:36:43 +05:30
0b6345ff16 Merge pull request #274 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-31 12:31:55 +05:30
4fbe758165 Merge branch 'develop' into l10n_develop 2020-07-31 12:31:08 +05:30
729570c8b7 New translations en.json (Arabic) 2020-07-31 12:27:06 +05:30
b8215a9081 Merge pull request #271 from A7madXatab/develop
adding support for arabic language
2020-07-31 12:14:52 +05:30
63b3c4d1dd adding support for arabic language 2020-07-30 04:28:32 -07:00
509a59b943 Merge pull request #270 from RiderExMachina/patch-1
Fix typo on the index page
2020-07-30 09:37:50 +05:30
56616183f1 Fix typo on the index page
Change "convinient" => "convenient"
2020-07-29 17:37:50 -07:00
3eb69151a6 - fix language issue when printing 2020-07-28 10:09:05 +05:30
a1d345dfb2 fix website link 2020-07-28 09:24:44 +05:30
ba0ee5fdf9 upddate dependencies, cache buster 2020-07-28 09:18:41 +05:30
e8b735e1cb - adding Japanese language 2020-07-25 20:23:10 +05:30
e4f0373661 Merge pull request #260 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-25 20:16:59 +05:30
78753dff08 New translations en.json (Kannada) 2020-07-25 20:16:43 +05:30
be8e506747 New translations en.json (Portuguese, Brazilian) 2020-07-25 20:16:36 +05:30
9d65b02554 New translations en.json (Japanese) 2020-07-25 15:47:42 +05:30
79f4d68383 Merge pull request #258 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-25 07:39:41 +05:30
0b71193526 New translations en.json (Spanish) 2020-07-25 01:38:43 +05:30
4c39d7fd74 New translations en.json (Dutch) 2020-07-24 23:33:43 +05:30
f1fe45e9c9 removed experimental code 2020-07-24 21:56:02 +05:30
f2a0b612d0 solving bugs reported in GH issues 2020-07-24 21:54:48 +05:30
586f2b1eca Merge pull request #251 from SophieMdl/customize-skills-level-input
Customize skills level input
2020-07-24 10:37:15 +05:30
59fcfbf78d replace select by single input 2020-07-22 09:53:53 +02:00
7aab7c74f6 - add multiple languages
- switch from moment to dayjs
2020-07-21 11:07:19 +05:30
e4f40f04ff Merge pull request #247 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-21 09:24:16 +05:30
068b955f6e Merge pull request #246 from 2imad/dutch-translation
add dutch translation
2020-07-21 09:17:27 +05:30
cad10b73de New translations en.json (Danish) 2020-07-21 04:26:39 +05:30
316d4c8a2a New translations en.json (German) 2020-07-21 00:26:58 +05:30
8f3ccdeabc New translations en.json (Dutch) 2020-07-21 00:26:56 +05:30
4071d7e0a3 add dutch translation 2020-07-20 20:06:26 +02:00
f13984cbf3 Update README.md 2020-07-20 18:03:49 +05:30
b696c71152 - add Turkish language
- update dependencies
- increment version
2020-07-20 07:57:40 +05:30
cee9c7f35b Merge pull request #236 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-20 07:53:05 +05:30
f54c7ec51f Merge branch 'develop' into l10n_develop 2020-07-20 07:52:26 +05:30
5aecfb47bd New translations en.json (Turkish) 2020-07-20 07:52:00 +05:30
0068b2f085 Merge pull request #234 from AtlasFontaine/develop
Added Turkish language support
2020-07-20 07:48:22 +05:30
fe645e7d4c - make dates follow internationalization standard 2020-07-20 07:43:56 +05:30
5e4dc8c4bd Added Turkish language support 2020-07-19 19:04:50 +03:00
9930cee309 - update layout to work for responsive screen sizes 2020-07-19 20:33:11 +05:30
6a8775e31b update dependencies 2020-07-19 19:02:53 +05:30
0265eea7bf - added French translations 2020-07-19 18:58:05 +05:30
84dfdbca8a Merge pull request #231 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 18:55:31 +05:30
d7fbbc3217 Merge branch 'develop' into l10n_develop 2020-07-19 18:55:18 +05:30
1d51353849 New translations en.json (French) 2020-07-19 18:51:59 +05:30
6d4f5b2e3f Merge pull request #230 from MeisterLLD/develop
fr translation
2020-07-19 18:41:58 +05:30
aa1ac369cc Merge pull request #229 from prateek-parashar/develop
Fixed a typo
2020-07-19 18:40:23 +05:30
68bd420211 some more things translated (donations, github link) 2020-07-19 14:14:37 +02:00
8137ac1c9b some missing ones 2020-07-19 13:59:40 +02:00
c20787f93e awarder-> décerné 2020-07-19 13:45:54 +02:00
cc730cf82a a few changes in fr translations 2020-07-19 13:44:57 +02:00
0a46c1ed52 Merge pull request #1 from prateek-parashar/prateek-parashar-patch-1
Updated the readme : Fixed a typo
2020-07-19 17:10:55 +05:30
7b850027fc some more fr translations 2020-07-19 13:40:24 +02:00
6c87d3c1c6 Updated the readme : Fixed a typo
Hi!
I followed the project from the Internet and notices this quick fix!
2020-07-19 17:10:13 +05:30
1a81940085 first attempt at fr translation 2020-07-19 13:20:29 +02:00
44bf41e60a added Finnish language 2020-07-19 15:20:46 +05:30
c0ae8f3e4f Merge pull request #227 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 15:09:41 +05:30
1aab5f70a9 New translations en.json (Finnish) 2020-07-19 14:57:27 +05:30
84440f09ed Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-19 09:12:59 +05:30
51b579ed3a - add Portuguese Brazillian language 2020-07-19 09:12:53 +05:30
50badbf7fe Update README.md 2020-07-19 09:10:08 +05:30
4c91d3f341 Merge pull request #226 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 09:03:41 +05:30
dce6e3aed2 New translations en.json (Portuguese, Brazilian) 2020-07-19 09:03:10 +05:30
7ec18693b4 Merge pull request #225 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-19 09:01:44 +05:30
4a53e4b1bb New translations en.json (Portuguese, Brazilian) 2020-07-19 09:00:39 +05:30
f9f84378d6 New translations en.json (Spanish) 2020-07-19 09:00:37 +05:30
e56876b56f New translations en.json (Kannada) 2020-07-19 09:00:34 +05:30
3fa849e3bc Merge pull request #224 from felcg/develop
add brazilian portuguese language
2020-07-19 08:57:06 +05:30
3c0251ca1f Create pt-br.json 2020-07-18 19:38:34 -03:00
13c5b92e53 - add spanish language 2020-07-18 23:05:25 +05:30
8e8c5f4e04 Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-18 22:58:09 +05:30
d8f35f30df Merge branch 'l10n_develop' into develop 2020-07-18 22:57:53 +05:30
626009c2b8 Merge branch 'develop' into l10n_develop 2020-07-18 22:57:46 +05:30
d15b1b4067 New translations en.json (Spanish) 2020-07-18 22:27:04 +05:30
e26a0df1bd New translations en.json (Kannada) 2020-07-18 22:27:01 +05:30
dbe6469e9d Merge pull request #219 from AmruthPillai/imgbot
[ImgBot] Optimize images
2020-07-18 22:18:14 +05:30
a33437abea [ImgBot] Optimize images
*Total -- 6,147.74kb -> 4,536.52kb (26.21%)

/static/images/screenshots/screen-3.png -- 688.75kb -> 405.73kb (41.09%)
/static/images/screenshots/screen-1.png -- 1,060.97kb -> 756.51kb (28.7%)
/static/images/screenshots/screen-4.png -- 1,223.75kb -> 896.00kb (26.78%)
/static/images/screenshots/screen-2.png -- 1,533.91kb -> 1,168.82kb (23.8%)
/static/images/screenshots/screen-5.png -- 1,640.35kb -> 1,309.47kb (20.17%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2020-07-18 16:45:08 +00:00
688a77ddb5 - update screenshots 2020-07-18 22:14:05 +05:30
b811d73f26 Update README.md 2020-07-18 21:55:08 +05:30
ec6ddd1fff fix issue with celebi printing 2020-07-18 21:51:01 +05:30
5bb4bc5941 Update README.md 2020-07-18 21:24:46 +05:30
f972d64eea fix markdown not displaying bullet lists 2020-07-18 19:30:59 +05:30
2f44f90364 update translations, fix form loading bug 2020-07-18 19:15:15 +05:30
89261f27d8 fix test being repeated in share your resume 2020-07-18 18:40:51 +05:30
eaf2f38940 Update README.md 2020-07-18 18:32:54 +05:30
ef9fc9c071 Merge pull request #214 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-17 11:17:10 +05:30
f051eb2286 New translations en.json (Kannada) 2020-07-17 11:07:09 +05:30
3a2f9c1542 - update version 2020-07-17 10:54:10 +05:30
d6ac14eb93 Merge branch 'master' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-17 10:53:58 +05:30
60acdce555 Create FUNDING.yml 2020-07-17 10:51:56 +05:30
0eab454d5d Merge pull request #213 from AmruthPillai/develop
Some more bugfixes, updates to artboard styles
2020-07-17 10:34:38 +05:30
b52f3dee07 - add app version
- fix bugs with artboard
2020-07-17 10:32:28 +05:30
da5158f757 Merge pull request #212 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-17 10:00:57 +05:30
9a9590299d New translations en.json (Hindi) 2020-07-17 10:00:37 +05:30
ab029a759f New translations en.json (French) 2020-07-17 10:00:35 +05:30
cc291b1fb5 New translations en.json (Spanish) 2020-07-17 10:00:33 +05:30
38ace117ea New translations en.json (Afrikaans) 2020-07-17 10:00:32 +05:30
aacd516cf3 New translations en.json (Arabic) 2020-07-17 10:00:30 +05:30
ceddfa6cdc New translations en.json (Bulgarian) 2020-07-17 10:00:28 +05:30
0dc6166b59 New translations en.json (Catalan) 2020-07-17 10:00:27 +05:30
568e4e72d8 New translations en.json (Czech) 2020-07-17 10:00:26 +05:30
a92941e568 New translations en.json (Danish) 2020-07-17 10:00:24 +05:30
78e97abb3b New translations en.json (German) 2020-07-17 10:00:23 +05:30
0b8145d5ff New translations en.json (Greek) 2020-07-17 10:00:21 +05:30
3eac9ef6ac New translations en.json (Finnish) 2020-07-17 10:00:20 +05:30
7bcac45214 New translations en.json (Hebrew) 2020-07-17 10:00:18 +05:30
a3d6a50489 New translations en.json (Hungarian) 2020-07-17 10:00:17 +05:30
3bab21d1e8 New translations en.json (Romanian) 2020-07-17 10:00:15 +05:30
5fc46bf634 New translations en.json (Italian) 2020-07-17 10:00:13 +05:30
4b2ce15fc9 New translations en.json (Korean) 2020-07-17 10:00:11 +05:30
bdc987e878 New translations en.json (Dutch) 2020-07-17 10:00:10 +05:30
2f9dd15c0d New translations en.json (Norwegian) 2020-07-17 10:00:09 +05:30
5becf826d2 New translations en.json (Polish) 2020-07-17 10:00:07 +05:30
33fef62417 New translations en.json (Portuguese) 2020-07-17 10:00:06 +05:30
c7aae10231 New translations en.json (Russian) 2020-07-17 10:00:05 +05:30
5dad0c7995 New translations en.json (Serbian (Cyrillic)) 2020-07-17 10:00:03 +05:30
a46550204b New translations en.json (Swedish) 2020-07-17 10:00:01 +05:30
de21432d07 New translations en.json (Turkish) 2020-07-17 10:00:00 +05:30
fc4cee3767 New translations en.json (Ukrainian) 2020-07-17 09:59:58 +05:30
6635e6556d New translations en.json (Chinese Simplified) 2020-07-17 09:59:57 +05:30
705fd4bbc6 New translations en.json (Vietnamese) 2020-07-17 09:59:56 +05:30
6f24317c94 New translations en.json (Tamil) 2020-07-17 09:59:54 +05:30
2e698a54e8 New translations en.json (Japanese) 2020-07-17 09:59:53 +05:30
2c0f58bb07 New translations en.json (Kannada) 2020-07-17 09:59:51 +05:30
6ba81683ff Merge branch 'develop' of github.com:AmruthPillai/Reactive-Resume into develop 2020-07-17 09:59:17 +05:30
31506af8fc - fix empty space at start of line 2020-07-17 09:59:13 +05:30
32dcc7ee84 New translations en.json (Hindi) 2020-07-17 09:48:31 +05:30
11e5e392c3 New translations en.json (French) 2020-07-17 09:48:30 +05:30
abee586e5a New translations en.json (Spanish) 2020-07-17 09:48:29 +05:30
0a50fc3488 New translations en.json (Afrikaans) 2020-07-17 09:48:28 +05:30
3413150177 New translations en.json (Arabic) 2020-07-17 09:48:27 +05:30
c06e3a9081 New translations en.json (Bulgarian) 2020-07-17 09:48:25 +05:30
9127bda6b3 New translations en.json (Catalan) 2020-07-17 09:48:24 +05:30
7aef4156c4 New translations en.json (Czech) 2020-07-17 09:48:23 +05:30
98501762a9 New translations en.json (Danish) 2020-07-17 09:48:21 +05:30
1e6471910b New translations en.json (German) 2020-07-17 09:48:20 +05:30
61d258d939 New translations en.json (Greek) 2020-07-17 09:48:19 +05:30
b85e5680cf New translations en.json (Finnish) 2020-07-17 09:48:18 +05:30
ef8ca86f30 New translations en.json (Hebrew) 2020-07-17 09:48:17 +05:30
a00297131b New translations en.json (Hungarian) 2020-07-17 09:48:15 +05:30
b6d853759c New translations en.json (Romanian) 2020-07-17 09:48:14 +05:30
100a7880d4 New translations en.json (Italian) 2020-07-17 09:48:13 +05:30
552287ddf8 New translations en.json (Korean) 2020-07-17 09:48:12 +05:30
b9fa284644 New translations en.json (Dutch) 2020-07-17 09:48:11 +05:30
82d512b602 New translations en.json (Norwegian) 2020-07-17 09:48:09 +05:30
9e6ff789a7 New translations en.json (Polish) 2020-07-17 09:48:08 +05:30
6a6e20ad57 New translations en.json (Portuguese) 2020-07-17 09:48:07 +05:30
d047e1e5ea New translations en.json (Russian) 2020-07-17 09:48:06 +05:30
7713d92610 New translations en.json (Serbian (Cyrillic)) 2020-07-17 09:48:05 +05:30
dfba7103ff New translations en.json (Swedish) 2020-07-17 09:48:04 +05:30
ce8f0dd497 New translations en.json (Turkish) 2020-07-17 09:48:02 +05:30
fa354bf041 New translations en.json (Ukrainian) 2020-07-17 09:48:01 +05:30
4a688a284d New translations en.json (Chinese Simplified) 2020-07-17 09:48:00 +05:30
6dda5fb226 New translations en.json (Vietnamese) 2020-07-17 09:47:59 +05:30
c5eaf43a3d New translations en.json (Tamil) 2020-07-17 09:47:58 +05:30
4a0241eded New translations en.json (Japanese) 2020-07-17 09:47:57 +05:30
678d022bb6 New translations en.json (Kannada) 2020-07-17 09:47:11 +05:30
42ee915aaf Update Crowdin configuration file 2020-07-17 09:46:24 +05:30
0a1ad4d091 Update Crowdin configuration file 2020-07-17 09:34:33 +05:30
2d76396040 Update Crowdin configuration file 2020-07-17 09:32:41 +05:30
9d0d7bd96e Merge pull request #210 from AmruthPillai/develop
Production Release of Reactive Resume v2
2020-07-17 09:26:43 +05:30
689d35a4af - add LICENSE
- update README.md
2020-07-17 09:22:10 +05:30
210d5c7f4d Merge pull request #209 from AmruthPillai/imgbot
[ImgBot] Optimize images
2020-07-17 09:12:47 +05:30
ea26241a15 [ImgBot] Optimize images
*Total -- 281.74kb -> 204.39kb (27.45%)

/static/icons/maskable.png -- 29.65kb -> 7.40kb (75.06%)
/static/images/screenshots/screen-5.png -- 34.09kb -> 16.76kb (50.84%)
/static/icons/icon-384x384.png -- 11.94kb -> 6.83kb (42.81%)
/static/icons/icon-512x512.png -- 8.42kb -> 4.83kb (42.69%)
/static/images/logo.png -- 8.30kb -> 4.85kb (41.63%)
/static/icons/icon-192x192.png -- 5.65kb -> 3.38kb (40.2%)
/static/icons/icon-96x96.png -- 2.78kb -> 1.70kb (38.67%)
/static/icons/icon-128x128.png -- 3.79kb -> 2.33kb (38.51%)
/static/icons/icon-152x152.png -- 4.44kb -> 2.73kb (38.49%)
/static/icons/icon-144x144.png -- 4.27kb -> 2.63kb (38.45%)
/static/icons/icon-72x72.png -- 1.98kb -> 1.24kb (37.53%)
/static/images/screenshots/screen-4.png -- 93.94kb -> 83.78kb (10.81%)
/static/images/screenshots/screen-2.png -- 72.49kb -> 65.94kb (9.03%)

Signed-off-by: ImgBotApp <ImgBotHelp@gmail.com>
2020-07-17 03:40:36 +00:00
5627a2e941 Merge branch 'v2' into develop 2020-07-17 09:10:04 +05:30
96259c6c5d - final sanity checks before release 2020-07-17 09:06:47 +05:30
816e400b31 - implement ability to rename sections
- clean up kannada translations
2020-07-17 08:36:46 +05:30
c57eb2e9aa Update README.md 2020-07-16 21:33:14 +05:30
f8d679993a - make the app faster, better accesibility 2020-07-16 20:30:53 +05:30
0b70d7ebec - attempt at responsiveness fix
- bring back scrollbars
- update dependencies
2020-07-16 19:53:14 +05:30
0019fee34e - switch to using downloadjs for downloading files
- increase timeout for cloud function
2020-07-16 17:34:21 +05:30
406a3dba56 - gear up for staging release 2020-07-16 15:59:35 +05:30
f41018c60b - implement "Import from JSON Resume" feature 2020-07-16 11:58:31 +05:30
8e9bd99e91 - add sitemap.xml
- reduce screenshot sizes
2020-07-16 10:31:56 +05:30
be40644497 - implement screenshots
- implement OG tags
2020-07-16 10:04:49 +05:30
a7657b4a5c - implement i18n
- translation dynamic for sections
- added articles for SEO
2020-07-16 08:42:19 +05:30
b7c565de79 - implement about section 2020-07-14 22:59:59 +05:30
af955bbf55 - implement donation link, in about section 2020-07-14 17:24:59 +05:30
851d6ef020 - fix firebase functions execution 2020-07-13 23:23:21 +05:30
e9bc40afb5 - update to use onCall from firebase functions 2020-07-13 22:13:00 +05:30
f17471b94d - fix issues with function calls 2020-07-13 17:01:56 +05:30
48b11de774 update firebase hosting link to functions 2020-07-13 16:52:26 +05:30
cf5d0b9571 - update for statging release, pre-checks 2020-07-13 16:38:08 +05:30
591c9a6ccf - remove eslint from functions project 2020-07-13 16:03:15 +05:30
c7b39c9ed3 - updated packages across projects, deployed to staging 2020-07-13 15:58:59 +05:30
55fd1d4bdc - implement celebi template 2020-07-13 09:46:55 +05:30
7b2094a543 - implement glalie template 2020-07-12 21:51:38 +05:30
41e708e302 - implement gengar template 2020-07-12 19:31:22 +05:30
5ccc360345 - implement cloud functions for printing
- implement AMOLED mode
- implement reset layout
2020-07-12 15:04:07 +05:30
f468ca73c3 - implement actions section
- implement settings section
2020-07-12 12:55:08 +05:30
8972a96afd - implement duplicate resume functionality 2020-07-11 21:45:34 +05:30
5ec1f21bd3 - complete onyx design template
- implement public sharable urls
- implement more actions
2020-07-11 20:42:16 +05:30
0b5653fab5 - completed design of Onyx template 2020-07-11 10:49:55 +05:30
a8c5d29858 - implement actions section 2020-07-10 13:40:48 +05:30
89fa8236e8 - creating a dynamic color palette
- implementing actions section
2020-07-10 01:09:33 +05:30
da197be2f5 - implement fonts section 2020-07-09 20:43:38 +05:30
3eaab3b427 - implement colors section 2020-07-09 20:06:49 +05:30
3b252476c4 - refactor sections
- combine resume and metadata contexts
2020-07-09 19:18:04 +05:30
c00d7a9eef - fixing conflicting order warning and firebase warning
- added more web manifest rules
2020-07-09 15:45:20 +05:30
370b0c4020 - implementing react-scroll 2020-07-09 14:30:06 +05:30
3aaef5f730 - memoize all components
- implement metadata context
2020-07-09 14:00:18 +05:30
9e98da038c - implementing hobby, language and reference sections
- dynamic template selection
2020-07-09 10:41:16 +05:30
9045e2983d - run eslint --fix across project 2020-07-09 00:14:13 +05:30
a1931f5e36 - switched to useSelector
- implemented skills section
2020-07-08 22:26:27 +05:30
70866420e5 - implement certifications section 2020-07-08 20:20:44 +05:30
c38788aa3b - implement awards section 2020-07-08 20:07:28 +05:30
922db70107 - implement work experience
- implement education
- show dynamic names in layout
2020-07-08 16:49:26 +05:30
bee6a40e9f - implement lists
- implement generic sections
- implement list actions
- implement error handlers
2020-07-08 05:01:50 +05:30
d7e86ddf29 - fix conflicting order warning by mini-css-extract-plugin 2020-07-07 10:01:20 +05:30
4e064dba96 - fix issue with firebase-hooks
- implement custom useAuthState
2020-07-06 19:53:47 +05:30
862ff7cdc1 - fix eslint warning 2020-07-06 16:08:01 +05:30
d02fad1164 - fix bug with multiple modal appearances 2020-07-06 16:07:32 +05:30
dbb005d26c - using nanoevents as event emitter
- bug: createResumeModal opens twice
2020-07-06 14:47:05 +05:30
6d3e5823fc - implement tips on loading screen
- implement centralized sections
- removed react-spinner package
2020-07-06 10:02:17 +05:30
65fc779d58 - switching from firestore to realtime DB
- implement debouncing tactic to sync data
- display sync indicator
2020-07-06 00:25:31 +05:30
49a867dd37 - recreating onyx template
- profile section complete
2020-07-05 16:45:29 +05:30
03e1de1d14 implement reorder/moving of sections between blocks 2020-07-05 13:34:04 +05:30
202c7f5ad4 - creating the right sidebar
- designing the artboard
- optimizing dark mode performance
- optimizing input onChange handler
2020-07-05 11:34:32 +05:30
6f66181c17 - designing the builder
- designing the left navbar and sidebar
2020-07-04 22:41:28 +05:30
f806b3f96d Update README.md 2020-07-04 15:15:18 +05:30
b42deb737c - deleting a resume 2020-07-04 15:13:50 +05:30
e247cb102c - creating and updating resumes 2020-07-04 14:31:25 +05:30
e1f1d84201 - designing the dashboard
- resume preview
- create resume modal
2020-07-04 10:26:29 +05:30
dd5e594dc9 - code cleanup and security checks 2020-07-03 21:04:43 +05:30
c53cd84722 - add icons and favicon 2020-07-03 20:55:52 +05:30
84ceae05c3 Merge pull request #204 from AmruthPillai/l10n_develop
New Crowdin updates
2020-07-03 20:45:11 +05:30
6dc2747a9b - storing user information in firestore 2020-07-03 20:44:12 +05:30
24fed8ff3f - adding icons to buttons
- styling modals for dark mode
2020-07-03 19:37:23 +05:30
3a1d42025f - integrating sign in with google
- set up dark mode context and other services
2020-07-03 18:59:25 +05:30
5f01287685 New translations objective.json (Finnish) 2020-07-03 16:15:09 +05:30
954aeef366 New translations about.json (Finnish) 2020-07-03 15:58:25 +05:30
e379533e81 New translations work.json (Finnish) 2020-07-03 15:58:23 +05:30
4caab8f7ea New translations references.json (Finnish) 2020-07-03 15:58:22 +05:30
37a31f0ecb New translations profile.json (Finnish) 2020-07-03 15:58:20 +05:30
cd2c284ca7 New translations objective.json (Finnish) 2020-07-03 15:58:19 +05:30
205c365ee2 New translations languages.json (Finnish) 2020-07-03 15:58:18 +05:30
ec44bc93f2 New translations extras.json (Finnish) 2020-07-03 15:58:17 +05:30
f0aa9a3bc9 New translations education.json (Finnish) 2020-07-03 15:58:15 +05:30
c45886dc18 New translations certifications.json (Finnish) 2020-07-03 15:58:14 +05:30
336fd22150 - building the base modal trigger architecture 2020-07-03 15:48:55 +05:30
52d9f92b62 New translations actions.json (Finnish) 2020-07-03 15:44:24 +05:30
0fa9cb5d47 New translations about.json (Finnish) 2020-07-03 15:44:23 +05:30
f145064b14 New translations actions.json (Finnish) 2020-07-03 15:20:35 +05:30
cb06f2d731 New translations settings.json (Finnish) 2020-07-03 15:04:54 +05:30
cbdd332de0 New translations fonts.json (Finnish) 2020-07-03 15:04:53 +05:30
ffbc8e560d New translations colors.json (Finnish) 2020-07-03 15:04:51 +05:30
57cdfcf7bd New translations actions.json (Finnish) 2020-07-03 15:04:50 +05:30
7bcdcf5987 New translations templates.json (Finnish) 2020-07-03 14:50:31 +05:30
48729306f1 New translations app.json (Finnish) 2020-07-03 14:50:29 +05:30
48e324b768 New translations actions.json (Finnish) 2020-07-03 14:44:41 +05:30
7d6221327d New translations app.json (Finnish) 2020-07-03 14:44:40 +05:30
17fd577a22 New translations work.json (Finnish) 2020-07-03 14:31:38 +05:30
273c81242c New translations profile.json (Finnish) 2020-07-03 14:31:36 +05:30
97e05e01e4 New translations languages.json (Finnish) 2020-07-03 14:31:35 +05:30
908d933ab8 New translations awards.json (Finnish) 2020-07-03 14:31:33 +05:30
70ef926b70 - intial gatsbyJS setup
- setting up tailwindcss and other plugins
- designing the landing page
- creating a reusable button component
2020-07-03 13:00:46 +05:30
d2e3227d01 clearing the slate 2020-07-02 21:23:03 +05:30
1340 changed files with 35483 additions and 38855 deletions

View File

@ -1,8 +1,21 @@
node_modules
git
.gitignore
.dockerignore
Dockerfile*
docker-compose*
# Build Artifacts
dist
.next
# IDEs
.vscode
# Project Metadata
README.md
LICENSE
CHANGELOG.md
# Project Dependencies
node_modules
# Docker
Dockerfile
.dockerignore
docker-compose.yml
# Android App
/app

8
.editorconfig Normal file
View File

@ -0,0 +1,8 @@
root = true
[*]
charset = utf-8
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

1
.env
View File

@ -1 +0,0 @@
SKIP_PREFLIGHT_CHECK=true

30
.env.example Normal file
View File

@ -0,0 +1,30 @@
# App
TZ=UTC
SECRET_KEY=change-me
# URLs
PUBLIC_URL=http://localhost:3000
PUBLIC_SERVER_URL=http://localhost:3100
# Database
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DATABASE=reactive_resume
POSTGRES_SSL_CERT=
# Auth
JWT_SECRET=change-me
JWT_EXPIRY_TIME=604800
# Google
PUBLIC_GOOGLE_CLIENT_ID=change-me
GOOGLE_CLIENT_SECRET=change-me
GOOGLE_API_KEY=change-me
# SendGrid (Optional)
SENDGRID_API_KEY=
SENDGRID_FORGOT_PASSWORD_TEMPLATE_ID=
SENDGRID_FROM_NAME=
SENDGRID_FROM_EMAIL=

View File

@ -1,29 +0,0 @@
{
"parser": "babel-eslint",
"parserOptions": {
"sourceType": "module",
"allowImportExportEverywhere": false,
"codeFrame": false
},
"extends": [
"airbnb",
"plugin:react/recommended",
"prettier",
"prettier/react"
],
"env": {
"browser": true,
"jest": true
},
"rules": {
"jsx-a11y/no-static-element-interactions": 0,
"jsx-a11y/click-events-have-key-events": 0,
"jsx-a11y/label-has-associated-control": 0,
"react/jsx-filename-extension": 0,
"react/no-array-index-key": 0,
"no-restricted-syntax": 0,
"no-param-reassign": 0,
"react/prop-types": 0,
"no-plusplus": 0
}
}

38
.eslintrc.json Normal file
View File

@ -0,0 +1,38 @@
{
"root": true,
"ignorePatterns": ["/app"],
"parser": "@typescript-eslint/parser",
"extends": ["plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"],
"plugins": ["@typescript-eslint/eslint-plugin", "simple-import-sort", "unused-imports"],
"rules": {
// TypeScript ESLint
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/interface-name-prefix": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/explicit-module-boundary-types": "off",
// Simple Import Sort
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
// Unused Imports
"no-unused-vars": "off",
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"warn",
{
"vars": "all",
"varsIgnorePattern": "^_",
"args": "none",
"argsIgnorePattern": "^_"
}
]
},
"overrides": [
{
"files": ["*.js"],
"rules": {
"@typescript-eslint/no-var-requires": "off"
}
}
]
}

View File

@ -1,17 +0,0 @@
{
"projects": {
"default": "rx-resume"
},
"targets": {
"rx-resume": {
"hosting": {
"app": [
"rx-resume"
],
"docs": [
"docs-rx-resume"
]
}
}
}
}

1
.github/FUNDING.yml vendored
View File

@ -1 +0,0 @@
open_collective: reactive-resume

View File

@ -1,31 +1,38 @@
---
name: Bug Report
about: Create a report to help us improve
title: "[Bug] "
about: Create a report to help improve
title: "[BUG] "
labels: bug
assignees: ''
---
**Describe the Bug**
**Describe the bug**
A clear and concise description of what the bug is.
**Reproduction**
Steps to reproduce the behaviour:
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected Behaviour**
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS/macOS/Windows 10]
- Browser [e.g. Chrome/Safari/Firefox]
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Additional Context**
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.

View File

@ -1,15 +1,14 @@
---
name: Feature Request
about: Suggest an idea for this project
title: "[Feature] "
title: "[FEATURE] "
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is.
Ex. I'm always frustrated when [...]
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.

16
.github/workflows/close-stale.yml vendored Normal file
View File

@ -0,0 +1,16 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '0 0 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v5.0.0
with:
stale-pr-message: 'This PR is stale because it has been open for 30 days with no activity. Remove the stale label or comment on this PR, otherwise it would be closed in 5 days.'
stale-issue-message: 'This issue is stale because it has been open for 30 days with no activity. Remove the stale label or comment on this issue, otherwise it would be closed in 5 days.'
days-before-stale: 30
days-before-close: 5

View File

@ -0,0 +1,21 @@
name: Deploy Latest Version on DigitalOcean
on:
workflow_run:
workflows:
- Build and Push Docker Image
types:
- completed
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Install DigitalOcean CLI
uses: digitalocean/action-doctl@v2.1.0
with:
token: ${{ secrets.DIGITALOCEAN_TOKEN }}
- name: Create Deployment with Latest Version
run: doctl apps create-deployment ${{ secrets.DIGITALOCEAN_APP_ID }} --wait --force-rebuild

120
.github/workflows/docker-build-push.yml vendored Normal file
View File

@ -0,0 +1,120 @@
name: Build and Push Docker Image
on:
release:
types: [published]
jobs:
docker_client:
name: Docker (Client)
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v3.0.0
- id: version
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Login to Docker
uses: docker/login-action@v1.14.1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Client Image
uses: docker/build-push-action@v2.9.0
with:
context: .
push: true
file: client/Dockerfile
tags: |
amruthpillai/reactive-resume:client-latest
amruthpillai/reactive-resume:client-${{ steps.version.outputs.tag }}
docker_server:
name: Docker (Server)
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v3.0.0
- id: version
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Login to Docker
uses: docker/login-action@v1.14.1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push Server Image
uses: docker/build-push-action@v2.9.0
with:
context: .
push: true
file: server/Dockerfile
tags: |
amruthpillai/reactive-resume:server-latest
amruthpillai/reactive-resume:server-${{ steps.version.outputs.tag }}
github_client:
name: GitHub (Client)
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v3.0.0
- id: version
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Login to GitHub Container Registry
uses: docker/login-action@v1.14.1
with:
registry: ghcr.io
username: $GITHUB_REPOSITORY_OWNER
password: ${{ secrets.GH_TOKEN }}
- name: Build and Push Client Image
uses: docker/build-push-action@v2.9.0
with:
context: .
push: true
file: client/Dockerfile
tags: |
ghcr.io/amruthpillai/reactive-resume:client-latest
ghcr.io/amruthpillai/reactive-resume:client-${{ steps.version.outputs.tag }}
github_server:
name: GitHub (Server)
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v3.0.0
- id: version
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Login to GitHub Container Registry
uses: docker/login-action@v1.14.1
with:
registry: ghcr.io
username: $GITHUB_REPOSITORY_OWNER
password: ${{ secrets.GH_TOKEN }}
- name: Build and Push Server Image
uses: docker/build-push-action@v2.9.0
with:
context: .
push: true
file: server/Dockerfile
tags: |
ghcr.io/amruthpillai/reactive-resume:server-latest
ghcr.io/amruthpillai/reactive-resume:server-${{ steps.version.outputs.tag }}

View File

@ -1,25 +0,0 @@
name: Build & Deploy
on:
push:
branches: [master]
jobs:
build:
name: Build & Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout GitHub Repository
uses: actions/checkout@v2.0.0
- name: Install Project Dependencies
run: npm install
- name: Build App
run: npm run build
- name: Build Documentation
run: npm run docs:build
- name: Deploy to Firebase Hosting
uses: w9jds/firebase-action@v1.3.0
with:
args: deploy --only hosting
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

36
.gitignore vendored
View File

@ -1,30 +1,10 @@
# dependencies
/node_modules
/.pnp
.pnp.js
# Environment Variables
.env
.env.*
!.env.example
# testing
/coverage
# Project Dependencies
node_modules
# production
/build
# firebase
.firebase
# tailwind
tailwind.css
# vuepress
docs/.vuepress/dist
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# macOS
.DS_Store

6
.husky/pre-commit Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm install
pnpm run lint
pnpm run format

1
.nvmrc Normal file
View File

@ -0,0 +1 @@
lts/*

32
.prettierignore Normal file
View File

@ -0,0 +1,32 @@
# Schema
schema/dist
# Server
server/dist
# Client
client/.next
client/public/__ENV.js
# IDEs
.vscode
# Project Metadata
LICENSE
README.md
CHANGELOG.md
# Project Dependencies
node_modules
# Docker
Dockerfile
.dockerignore
docker-compose.yml
# Android App
/app
# Docs
docs/build
docs/.docusaurus

View File

@ -1,7 +1,4 @@
{
"printWidth": 100,
"trailingComma": "all",
"tabWidth": 2,
"semi": true,
"printWidth": 120,
"singleQuote": true
}
}

3
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,3 @@
{
"recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "lokalise.i18n-ally"]
}

26
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Debug: Server",
"port": 9229,
"restart": true,
"stopOnEntry": false,
"protocol": "inspector"
},
{
"name": "Debug: Client",
"type": "node-terminal",
"request": "launch",
"command": "pnpm run dev:client",
"console": "integratedTerminal",
"serverReadyAction": {
"pattern": "started server on .+, url: (https?://.+)",
"uriFormat": "%s",
"action": "debugWithChrome"
}
}
]
}

25
.vscode/settings.json vendored
View File

@ -1,4 +1,25 @@
{
"i18n-ally.localesPaths": "src/i18n",
"i18n-ally.keystyle": "nested"
"css.validate": false,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.wordWrap": "on",
"eslint.workingDirectories": [
"schema",
"client",
"server"
],
"i18n-ally.enabledFrameworks": [
"react"
],
"i18n-ally.keystyle": "nested",
"i18n-ally.localesPaths": [
"client/public/locales"
],
"i18n-ally.namespace": true,
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
"i18n-ally.sortKeys": true,
"scss.validate": false
}

28
CHANGELOG.md Normal file
View File

@ -0,0 +1,28 @@
# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [3.0.0](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0-beta.6...v3.0.0) (2022-03-11)
### Features
* **lang**: add German, Kannada and Tamil languages to the app ([3a524f9](https://github.com/AmruthPillai/Reactive-Resume/commit/3a524f9c9c7a0e446491265b2242ad3dfeae188c))
* **docs:** add docusaurus workspace, initial setup of docs ([dc4aa0b](https://github.com/AmruthPillai/Reactive-Resume/commit/dc4aa0b496096bd59c45426bfcea6ba7db5f5c01))
## [3.0.0-beta.6](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0-beta.5...v3.0.0-beta.6) (2022-03-11)
### Features
* **lang:** add language switcher on the landing page, in the footer ([8bc7d25](https://github.com/AmruthPillai/Reactive-Resume/commit/8bc7d2599ef6af7a07bfbe886c43844152b0d9f7))
### Bug Fixes
* **i18n:** add missing translation keys, update lang/locale logic ([7d8828a](https://github.com/AmruthPillai/Reactive-Resume/commit/7d8828a358d653bb162877a64c75028eb82678cd))
* **webkit:** fix issue with webkit not supporting .at() ([2654cba](https://github.com/AmruthPillai/Reactive-Resume/commit/2654cba039eb73d33257c36fa90a52cabc9fda96))
## [3.0.0-beta.5](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0-beta.4...v3.0.0-beta.5) (2022-03-10)
### Bug Fixes
* **app:** fix issue with using swipelayout ([972e8b1](https://github.com/AmruthPillai/Reactive-Resume/commit/972e8b1bcf9ad44d8915bf23d189711672937bc0))

View File

@ -1,39 +0,0 @@
## build image
FROM node:13.12.0-alpine as build
## set working directory
WORKDIR /usr/src/app
## add `/usr/src/app/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH
## install and cache app dependencies
COPY package.json /usr/src/app/package.json
## install git
RUN apk add --no-cache git
## install app dependencies
RUN npm install
## copy files
COPY . /usr/src/app
## build production app
RUN npm run build
## production environment
FROM nginx:1.17.9-alpine
## copy build artifacts to nginx
COPY --from=build /usr/src/app/build /usr/share/nginx/html
## copy custom nginx config
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/nginx.conf /etc/nginx/conf.d
## export port 80
EXPOSE 80
## run nginx server
CMD ["nginx", "-g", "daemon off;"]

View File

@ -1,20 +0,0 @@
## base image
FROM node:13.12.0-alpine
## set working directory
WORKDIR /usr/src/app
## add `/usr/src/app/node_modules/.bin` to $PATH
ENV PATH /usr/src/app/node_modules/.bin:$PATH
## install and cache app dependencies
COPY package.json /usr/src/app/package.json
## install git
RUN apk add --no-cache git
## install app dependencies
RUN npm install
## start app
CMD ["npm", "start"]

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 Amruth Pillai
Copyright (c) 2022 Amruth Pillai
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1 +0,0 @@
web: bin/boot

View File

@ -1,15 +1,95 @@
<img src="https://i.imgur.com/4eps4gP.png" alt="Reactive Resume" width="256px" height="256px"/>
<img src="https://i.imgur.com/pc8Ingg.png" alt="Reactive Resume" width="256px" height="256px" />
# Reactive Resume
[![Build & Deploy](https://github.com/AmruthPillai/Reactive-Resume/workflows/Build%20&%20Deploy/badge.svg)](https://github.com/AmruthPillai/Reactive-Resume/actions)
![Code Style](https://badgen.net/badge/code%20style/airbnb/ff5a5f?icon=airbnb)
[![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume)](https://hub.docker.com/r/amruthpillai/reactive-resume)
[![Localization](https://badges.crowdin.net/reactive-resume/localized.svg)](https://crowdin.com/project/reactive-resume)
[![GitHub](https://img.shields.io/github/license/AmruthPillai/Reactive-Resume)](https://github.com/AmruthPillai/Reactive-Resume/blob/develop/LICENSE)
![Project Version](https://img.shields.io/github/package-json/v/AmruthPillai/Reactive-Resume?style=flat-square)
![Project License](https://img.shields.io/github/license/AmruthPillai/Reactive-Resume?style=flat-square)
[![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume?style=flat-square)](https://hub.docker.com/r/amruthpillai/reactive-resume)
[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2FAmruthPillai%2FReactive-Resume?ref=badge_shield)
#### A Free and Open-Source Resume Builder That Respects Your Privacy
## [Go to App](https://rxresu.me) | [Docs](https://docs.rxresu.me)
Welcome to the front page of **Reactive Resume**, a free and open-source Resume Builder web app that focuses on one thing, **Privacy**. And also few other important features such as minimalistic UI/UX, customizability, portability, regularly updated templates, etc. But the important thing is that, your personal data is yours alone.
Reactive Resume is a free and open source resume builder thats built to make the mundane tasks of creating, updating and sharing your resume as easy as 1, 2, 3. With this app, you can create multiple resumes, share them with recruiters through a unique link and print as PDF, all for free, no advertisements, without losing the integrity and privacy of your data.
### [Go to App](https://rxresu.me/) | [Documentation](https://docs.rxresu.me/)
You have complete control over what goes into your resume, how it looks, what colors, what templates, even the layout in which sections placed. Want a dark mode resume? Its as easy as editing 3 values and youre done. You dont need to wait to see your changes either. Everything you type, everything you change, appears immediately on your resume and gets updated in real time.
## Features
- Free, forever
- No Advertising
- No User Tracking
- Sync your data across devices
- Accessible in multiple languages
- Import data from [LinkedIn](https://www.linkedin.com/), [JSON Resume](https://jsonresume.org/)
- Manage multiple resumes with one account
- Open Source (with large community support)
- Send your resume to others with a unique sharable link
- Pick any font from [Google Fonts](https://fonts.google.com/) to use on your resume
- Choose from 6 vibrant templates and more coming soon
- Export your resume to JSON or PDF format with just one click
- Create an account using your email, or just Sign in with Google
- Mix and match colors to any degree, even a dark mode resume?
- Add sections, add pages and change layouts the way you want to
- Tailor-made Backend and Database, isolated from Google, Amazon etc.
- **Oh, and did I mention that it's free?**
## Languages
- English
- German (Deutsch)
- Hindi (हिन्दी)
- Kannada (ಕನ್ನಡ) (@aksh1251)
- Tamil (தமிழ்)
Help by [translating Reactive Resume](https://translate.rxresu.me) to your language!
## Tutorial
The docs include an extensive [Tutorial](https://docs.rxresu.me/tutorial) section which outline the features of Reactive Resume and help you through building your first resume on the app.
## Build from Source
For extensive information on how to build the app on your local machine, head over to the docs's [Source Code](https://docs.rxresu.me/source-code) section.
## Contributing
This project makes use of [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) style and workflow for commit messages to ensure that the CHANGELOG is auto-generated. In general, this project follows the "fork-and-pull" Git workflow.
1. **Fork** the repo on GitHub
2. **Clone** the project to your own machine
3. **Commit** changes to your own branch
4. **Push** your work back up to your fork
5. Submit a **Pull Request** so that we can review your changes
NOTE: Be sure to merge the latest from `main` before making a pull request!
## Bugs? Feature Requests?
Use the [GitHub Issues](https://github.com/AmruthPillai/Reactive-Resume/issues/new/choose) platform to notify me about bugs or new features that you would like to see in Reactive Resume. Please check before creating new issues as there might already be one.
## Donations
Reactive Resume would be nothing without the folks who supported me and kept the project alive in the beginning, and your cotinued support is what keeps me going. If you found Reactive Resume to be useful, helpful or just insightful and appreciate the effort I took to make the project, please consider donating as little or as much as your can.
### [☕️ Buy me a coffee](https://www.buymeacoffee.com/AmruthPillai) | [💸 PayPal](https://paypal.me/RajaRajanA)
## Infrastructure
- [Next.js](https://nextjs.org/), frontend
- [NestJS](https://nestjs.com/), backend
- [PostgreSQL](https://www.postgresql.org/), database
- [DigitalOcean](https://www.digitalocean.com/), infrastructure provider
- [Crowdin](https://translate.rxresu.me/), translation management platform
&nbsp;
<a href="https://pillai.xyz/digitalocean">
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" width="200px" />
</a>
## License
Reactive Resume is packaged and distributed using the [MIT License](https://choosealicense.com/licenses/mit/) which allows for commercial use, distribution, modification and private use provided that all copies of the software contain the same license and copyright.
_By the community, for the community._
A passion project by [Amruth Pillai](https://amruthpillai.com/)

View File

@ -1,13 +0,0 @@
{
"name": "Reactive Resume",
"description": "A one-of-a-kind resume builder that's not out to get your data. Completely secure, customizable, portable, open-source and free forever.",
"website": "https://rxresu.me/",
"repository": "https://github.com/AmruthPillai/Reactive-Resume",
"logo": "https://i.imgur.com/ugpElge.png",
"buildpacks": [
{
"url": "mars/create-react-app"
}
],
"keywords": ["react", "resume", "static"]
}

33
app/.gitignore vendored Normal file
View File

@ -0,0 +1,33 @@
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Log/OS Files
*.log
# Android Studio generated files and folders
captures/
.externalNativeBuild/
.cxx/
*.apk
output.json
# IntelliJ
*.iml
.idea/
misc.xml
deploymentTargetDropDown.xml
render.experimental.xml
# Keystore files
*.jks
*.keystore
# Google Services (e.g. APIs or Firebase)
google-services.json
# Android Profiling
*.hprof

8
app/app/.editorconfig Normal file
View File

@ -0,0 +1,8 @@
root = true
[*]
charset = utf-8
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

2
app/app/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/build
/release

46
app/app/build.gradle Normal file
View File

@ -0,0 +1,46 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
compileSdk 32
defaultConfig {
applicationId "me.rxresu.app"
minSdk 21
targetSdk 32
versionCode 2
versionName "1.0"
resConfigs "en"
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
viewBinding true
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'com.google.android.material:material:1.5.0'
}

21
app/app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.rxresu.app">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ReactiveResume.NoActionBar">
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.ReactiveResume.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,76 @@
package me.rxresu.app
import android.annotation.SuppressLint
import android.graphics.Bitmap
import android.os.Bundle
import android.view.KeyEvent
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var webView: WebView
private var isLoaded: Boolean = false
private var webURL = "https://rxresu.me"
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
webView = findViewById(R.id.webview)
webView.settings.javaScriptEnabled = true
webView.settings.userAgentString = "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Mobile Safari/537.36"
}
override fun onResume() {
if (!isLoaded) loadWebView()
super.onResume()
}
private fun loadWebView() {
webView.loadUrl(webURL)
webView.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
val url = request?.url.toString()
view?.loadUrl(url)
return super.shouldOverrideUrlLoading(view, request)
}
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
}
override fun onPageFinished(view: WebView?, url: String?) {
isLoaded = true
super.onPageFinished(view, url)
}
override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) {
isLoaded = false
super.onReceivedError(view, request, error)
}
}
}
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (event.action == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (webView.canGoBack()) {
webView.goBack()
}
return true
}
}
return super.onKeyDown(keyCode, event)
}
}

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<include
layout="@layout/content_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@ -0,0 +1,3 @@
<resources>
<string name="app_name">Reactive Resume</string>
</resources>

View File

@ -0,0 +1,12 @@
<resources>
<style name="Theme.ReactiveResume" parent="Theme.MaterialComponents.DayNight.DarkActionBar" />
<style name="Theme.ReactiveResume.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="Theme.ReactiveResume.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="Theme.ReactiveResume.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

9
app/build.gradle Normal file
View File

@ -0,0 +1,9 @@
plugins {
id 'com.android.application' version '7.1.2' apply false
id 'com.android.library' version '7.1.2' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}

23
app/gradle.properties Normal file
View File

@ -0,0 +1,23 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true

BIN
app/gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Wed Mar 09 21:34:49 CET 2022
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

185
app/gradlew vendored Executable file
View File

@ -0,0 +1,185 @@
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

89
app/gradlew.bat vendored Normal file
View File

@ -0,0 +1,89 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

16
app/settings.gradle Normal file
View File

@ -0,0 +1,16 @@
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "Reactive Resume"
include ':app'

8
client/.eslintrc.json Normal file
View File

@ -0,0 +1,8 @@
{
"extends": ["../.eslintrc.json", "next/core-web-vitals"],
"ignorePatterns": [".next", "__ENV.js"],
"rules": {
"@next/next/no-img-element": "off",
"@next/next/no-sync-scripts": "off"
}
}

39
client/.gitignore vendored Normal file
View File

@ -0,0 +1,39 @@
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# vercel
.vercel
# typescript
*.tsbuildinfo
# react-env
__ENV.js

52
client/Dockerfile Normal file
View File

@ -0,0 +1,52 @@
FROM node:16-alpine as dependencies
RUN apk add --no-cache curl g++ make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
WORKDIR /app
COPY package.json pnpm-*.yaml ./
COPY ./schema/package.json ./schema/package.json
COPY ./client/package.json ./client/package.json
RUN pnpm install --frozen-lockfile
FROM node:16-alpine as builder
RUN apk add --no-cache curl g++ make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
WORKDIR /app
COPY . .
COPY --from=dependencies /app/node_modules ./node_modules
COPY --from=dependencies /app/schema/node_modules ./schema/node_modules
COPY --from=dependencies /app/client/node_modules ./client/node_modules
RUN pnpm run build:schema
RUN pnpm run build:client
FROM node:16-alpine as production
WORKDIR /app
RUN apk add --no-cache curl \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
COPY --from=builder /app/pnpm-*.yaml ./
COPY --from=builder /app/package.json ./
COPY --from=builder /app/client/package.json ./client/package.json
RUN pnpm install -F client --frozen-lockfile --prod
COPY --from=builder /app/client/.next ./client/.next
COPY --from=builder /app/client/public ./client/public
COPY --from=builder /app/client/next.config.js ./client/next.config.js
COPY --from=builder /app/client/next-i18next.config.js ./client/next-i18next.config.js
EXPOSE 3000
ENV PORT 3000
CMD [ "pnpm", "run", "start:client" ]

View File

@ -0,0 +1,28 @@
.container {
@apply flex w-auto items-center justify-center;
@apply fixed inset-x-0 bottom-6;
@apply transition-[margin-left,margin-right] duration-200;
}
.pushLeft {
@apply xl:ml-[30vw] 2xl:ml-[28vw];
}
.pushRight {
@apply xl:mr-[30vw] 2xl:mr-[28vw];
}
.controller {
@apply z-20 flex items-center justify-center shadow-lg;
@apply flex rounded-l-full rounded-r-full px-4;
@apply bg-neutral-50 dark:bg-neutral-800;
@apply opacity-70 transition-opacity duration-200 hover:opacity-100;
> button {
@apply px-2.5 py-2.5;
}
> hr {
@apply mx-3 h-5 w-0.5 bg-neutral-900/40 dark:bg-neutral-50/20;
}
}

View File

@ -0,0 +1,141 @@
import {
AlignHorizontalCenter,
AlignVerticalCenter,
Download,
FilterCenterFocus,
InsertPageBreak,
Link,
ViewSidebar,
ZoomIn,
ZoomOut,
} from '@mui/icons-material';
import { ButtonBase, Divider, Tooltip, useMediaQuery, useTheme } from '@mui/material';
import clsx from 'clsx';
import { get } from 'lodash';
import { useTranslation } from 'next-i18next';
import toast from 'react-hot-toast';
import { useMutation } from 'react-query';
import { ReactZoomPanPinchRef } from 'react-zoom-pan-pinch';
import { ServerError } from '@/services/axios';
import { printResumeAsPdf, PrintResumeAsPdfParams } from '@/services/printer';
import { togglePageBreakLine, togglePageOrientation, toggleSidebar } from '@/store/build/buildSlice';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import getResumeUrl from '@/utils/getResumeUrl';
import styles from './ArtboardController.module.scss';
const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, centerView }) => {
const { t } = useTranslation();
const theme = useTheme();
const dispatch = useAppDispatch();
const resume = useAppSelector((state) => state.resume);
const isDesktop = useMediaQuery(theme.breakpoints.up('sm'));
const { left, right } = useAppSelector((state) => state.build.sidebar);
const orientation = useAppSelector((state) => state.build.page.orientation);
const { mutateAsync, isLoading } = useMutation<string, ServerError, PrintResumeAsPdfParams>(printResumeAsPdf);
const handleTogglePageBreakLine = () => dispatch(togglePageBreakLine());
const handleTogglePageOrientation = () => dispatch(togglePageOrientation());
const handleToggleSidebar = () => {
dispatch(toggleSidebar({ sidebar: 'left' }));
dispatch(toggleSidebar({ sidebar: 'right' }));
};
const handleCopyLink = async () => {
const url = getResumeUrl(resume, { withHost: true });
await navigator.clipboard.writeText(url);
toast.success(t('common.toast.success.resume-link-copied'));
};
const handleExportPDF = async () => {
const download = (await import('downloadjs')).default;
const slug = get(resume, 'slug');
const username = get(resume, 'user.username');
const url = await mutateAsync({ username, slug });
download(`/api${url}`);
};
return (
<div
className={clsx({
[styles.container]: true,
[styles.pushLeft]: left.open,
[styles.pushRight]: right.open,
})}
>
<div className={styles.controller}>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.zoom-in') as string}>
<ButtonBase onClick={() => zoomIn(0.25)}>
<ZoomIn fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.zoom-out') as string}>
<ButtonBase onClick={() => zoomOut(0.25)}>
<ZoomOut fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.center-artboard') as string}>
<ButtonBase onClick={() => centerView(0.95)}>
<FilterCenterFocus fontSize="medium" />
</ButtonBase>
</Tooltip>
<Divider />
{isDesktop && (
<>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.toggle-orientation') as string}>
<ButtonBase onClick={handleTogglePageOrientation}>
{orientation === 'vertical' ? (
<AlignHorizontalCenter fontSize="medium" />
) : (
<AlignVerticalCenter fontSize="medium" />
)}
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.toggle-page-break-line') as string}>
<ButtonBase onClick={handleTogglePageBreakLine}>
<InsertPageBreak fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.toggle-sidebars') as string}>
<ButtonBase onClick={handleToggleSidebar}>
<ViewSidebar fontSize="medium" />
</ButtonBase>
</Tooltip>
<Divider />
</>
)}
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.copy-link') as string}>
<ButtonBase onClick={handleCopyLink}>
<Link fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.export-pdf') as string}>
<ButtonBase onClick={handleExportPDF} disabled={isLoading}>
<Download fontSize="medium" />
</ButtonBase>
</Tooltip>
</div>
</div>
);
};
export default ArtboardController;

View File

@ -0,0 +1,13 @@
.center {
@apply mx-0 flex flex-grow pt-12 lg:pt-16;
@apply transition-[margin-left,margin-right] duration-200;
@apply bg-neutral-200 dark:bg-neutral-900;
}
.wrapper {
@apply h-full w-full #{!important};
}
.artboard {
@apply flex gap-8;
}

View File

@ -0,0 +1,57 @@
import clsx from 'clsx';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
import { TransformComponent, TransformWrapper } from 'react-zoom-pan-pinch';
import { useAppSelector } from '@/store/hooks';
import ArtboardController from './ArtboardController';
import styles from './Center.module.scss';
import Header from './Header';
import Page from './Page';
const Center = () => {
const orientation = useAppSelector((state) => state.build.page.orientation);
const resume = useAppSelector((state) => state.resume);
const layout: string[][][] = get(resume, 'metadata.layout');
if (isEmpty(resume)) return null;
return (
<div className={clsx(styles.center)}>
<Header />
<TransformWrapper
centerOnInit
minScale={0.25}
initialScale={0.95}
limitToBounds={false}
centerZoomedOut={false}
pinch={{ step: 1 }}
wheel={{ step: 0.1 }}
>
{(controllerProps) => (
<>
<TransformComponent wrapperClass={styles.wrapper}>
<div
className={clsx({
[styles.artboard]: true,
'flex-col': orientation === 'vertical',
})}
>
{layout.map((_, pageIndex) => (
<Page key={pageIndex} page={pageIndex} showPageNumbers />
))}
</div>
</TransformComponent>
<ArtboardController {...controllerProps} />
</>
)}
</TransformWrapper>
</div>
);
};
export default Center;

View File

@ -0,0 +1,25 @@
.header {
@apply mx-0 flex justify-between shadow;
@apply bg-neutral-800 text-neutral-100;
@apply transition-[margin-left,margin-right] duration-200;
button > svg {
@apply text-base text-neutral-100;
}
}
.pushLeft {
@apply xl:ml-[30vw] 2xl:ml-[28vw];
}
.pushRight {
@apply xl:mr-[30vw] 2xl:mr-[28vw];
}
.title {
@apply flex items-center justify-center;
h1 {
@apply ml-2;
}
}

View File

@ -0,0 +1,216 @@
import {
ChevronLeft as ChevronLeftIcon,
ChevronRight as ChevronRightIcon,
CopyAll,
Delete,
DriveFileRenameOutline,
Home as HomeIcon,
KeyboardArrowDown as KeyboardArrowDownIcon,
Link as LinkIcon,
} from '@mui/icons-material';
import {
AppBar,
IconButton,
ListItemIcon,
ListItemText,
Menu,
MenuItem,
Toolbar,
Tooltip,
useMediaQuery,
useTheme,
} from '@mui/material';
import { Resume } from '@reactive-resume/schema';
import clsx from 'clsx';
import get from 'lodash/get';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
import { useEffect, useMemo, useState } from 'react';
import toast from 'react-hot-toast';
import { useMutation } from 'react-query';
import { RESUMES_QUERY } from '@/constants/index';
import { ServerError } from '@/services/axios';
import queryClient from '@/services/react-query';
import { deleteResume, DeleteResumeParams, duplicateResume, DuplicateResumeParams } from '@/services/resume';
import { setSidebarState, toggleSidebar } from '@/store/build/buildSlice';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setModalState } from '@/store/modal/modalSlice';
import getResumeUrl from '@/utils/getResumeUrl';
import styles from './Header.module.scss';
const Header = () => {
const theme = useTheme();
const router = useRouter();
const { t } = useTranslation();
const dispatch = useAppDispatch();
const isDesktop = useMediaQuery(theme.breakpoints.up('lg'));
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
const { mutateAsync: duplicateMutation } = useMutation<Resume, ServerError, DuplicateResumeParams>(duplicateResume);
const { mutateAsync: deleteMutation } = useMutation<void, ServerError, DeleteResumeParams>(deleteResume);
const resume = useAppSelector((state) => state.resume);
const { left, right } = useAppSelector((state) => state.build.sidebar);
const name = useMemo(() => get(resume, 'name'), [resume]);
useEffect(() => {
if (isDesktop) {
dispatch(setSidebarState({ sidebar: 'left', state: { open: true } }));
dispatch(setSidebarState({ sidebar: 'right', state: { open: true } }));
} else {
dispatch(setSidebarState({ sidebar: 'left', state: { open: false } }));
dispatch(setSidebarState({ sidebar: 'right', state: { open: false } }));
}
}, [isDesktop, dispatch]);
const toggleLeftSidebar = () => dispatch(toggleSidebar({ sidebar: 'left' }));
const toggleRightSidebar = () => dispatch(toggleSidebar({ sidebar: 'right' }));
const goBack = () => router.push('/dashboard');
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const handleRename = () => {
handleClose();
dispatch(
setModalState({
modal: 'dashboard.rename-resume',
state: {
open: true,
payload: {
item: resume,
onComplete: (newResume: Resume) => {
queryClient.invalidateQueries(RESUMES_QUERY);
router.push(`/${resume.user.username}/${newResume.slug}/build`);
},
},
},
})
);
};
const handleDuplicate = async () => {
handleClose();
const newResume = await duplicateMutation({ id: resume.id });
queryClient.invalidateQueries(RESUMES_QUERY);
router.push(`/${resume.user.username}/${newResume.slug}/build`);
};
const handleDelete = async () => {
handleClose();
await deleteMutation({ id: resume.id });
queryClient.invalidateQueries(RESUMES_QUERY);
goBack();
};
const handleShareLink = async () => {
handleClose();
const url = getResumeUrl(resume, { withHost: true });
await navigator.clipboard.writeText(url);
toast.success(t('common.toast.success.resume-link-copied'));
};
return (
<AppBar elevation={0} position="fixed">
<Toolbar
variant="regular"
className={clsx({
[styles.header]: true,
[styles.pushLeft]: left.open,
[styles.pushRight]: right.open,
})}
>
<IconButton onClick={toggleLeftSidebar}>{left.open ? <ChevronLeftIcon /> : <ChevronRightIcon />}</IconButton>
<div className={styles.title}>
<IconButton className="opacity-50 hover:opacity-100" onClick={goBack}>
<HomeIcon />
</IconButton>
<span className="opacity-50">{'/'}</span>
<h1>{name}</h1>
<IconButton onClick={handleClick}>
<KeyboardArrowDownIcon />
</IconButton>
<Menu open={Boolean(anchorEl)} anchorEl={anchorEl} onClose={handleClose}>
<MenuItem onClick={handleRename}>
<ListItemIcon>
<DriveFileRenameOutline className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.rename')}</ListItemText>
</MenuItem>
<MenuItem onClick={handleDuplicate}>
<ListItemIcon>
<CopyAll className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.duplicate')}</ListItemText>
</MenuItem>
{resume.public ? (
<MenuItem onClick={handleShareLink}>
<ListItemIcon>
<LinkIcon className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.share-link')}</ListItemText>
</MenuItem>
) : (
<Tooltip arrow placement="right" title={t('builder.header.menu.tooltips.share-link') as string}>
<div>
<MenuItem>
<ListItemIcon>
<LinkIcon className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.share-link')}</ListItemText>
</MenuItem>
</div>
</Tooltip>
)}
<Tooltip arrow placement="right" title={t('builder.header.menu.tooltips.delete') as string}>
<MenuItem onClick={handleDelete}>
<ListItemIcon>
<Delete className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.delete')}</ListItemText>
</MenuItem>
</Tooltip>
</Menu>
</div>
<IconButton onClick={toggleRightSidebar}>{right.open ? <ChevronRightIcon /> : <ChevronLeftIcon />}</IconButton>
</Toolbar>
</AppBar>
);
};
export default Header;

View File

@ -0,0 +1,34 @@
.container {
@apply flex flex-col items-center gap-2;
@apply rounded-sm;
}
.page {
width: 210mm;
min-height: 297mm;
@apply relative z-50 grid shadow;
@apply print:shadow-none;
:global(.printer-mode) & {
@apply shadow-none;
}
&.break::after {
content: 'A4 Page Break';
top: calc(297mm - 19px);
@apply absolute w-full border-b border-dashed border-neutral-800/75;
@apply flex items-end justify-end pr-2 pb-0.5 text-xs font-bold text-neutral-800/75;
@apply print:hidden;
:global(.preview-mode) &,
:global(.printer-mode) & {
@apply hidden;
}
}
}
.pageNumber {
@apply text-center font-bold print:hidden;
}

View File

@ -0,0 +1,59 @@
import { css } from '@emotion/css';
import { CustomCSS, Theme, Typography } from '@reactive-resume/schema';
import clsx from 'clsx';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
import { useTranslation } from 'next-i18next';
import { useMemo } from 'react';
import { useAppSelector } from '@/store/hooks';
import templateMap from '@/templates/templateMap';
import { generateThemeStyles, generateTypographyStyles } from '@/utils/styles';
import { PageProps } from '@/utils/template';
import styles from './Page.module.scss';
type Props = PageProps & {
showPageNumbers?: boolean;
};
const Page: React.FC<Props> = ({ page, showPageNumbers = false }) => {
const { t } = useTranslation();
const resume = useAppSelector((state) => state.resume);
const breakLine: boolean = useAppSelector((state) => state.build.page.breakLine);
const theme: Theme = get(resume, 'metadata.theme');
const customCSS: CustomCSS = get(resume, 'metadata.css');
const template: string = get(resume, 'metadata.template');
const typography: Typography = get(resume, 'metadata.typography');
const themeCSS = useMemo(() => !isEmpty(theme) && generateThemeStyles(theme), [theme]);
const typographyCSS = useMemo(() => !isEmpty(typography) && generateTypographyStyles(typography), [typography]);
const TemplatePage: React.FC<PageProps> | null = useMemo(() => templateMap[template].component, [template]);
return (
<div data-page={page + 1} className={styles.container}>
<div
className={clsx({
reset: true,
[styles.page]: true,
[styles.break]: breakLine,
[css(themeCSS)]: true,
[css(typographyCSS)]: true,
[css(customCSS.value)]: customCSS.visible,
})}
>
{TemplatePage && <TemplatePage page={page} />}
</div>
{showPageNumbers && (
<h4 className={styles.pageNumber}>
{t('builder.common.glossary.page')} {page + 1}
</h4>
)}
</div>
);
};
export default Page;

View File

@ -0,0 +1,45 @@
.container {
@apply h-screen w-[95vw] md:w-[70vw] lg:w-[50vw] xl:w-[30vw] 2xl:w-[28vw];
@apply bg-neutral-50 text-neutral-900 dark:bg-neutral-900 dark:text-neutral-50;
@apply relative flex border-r-2 border-neutral-50/10;
nav {
@apply absolute inset-y-0 left-0;
@apply w-14 py-4 md:w-16 md:px-2;
@apply bg-neutral-100 shadow dark:bg-neutral-800;
@apply flex flex-col items-center justify-between;
hr {
@apply mt-2;
}
> div {
@apply grid gap-2;
}
.sections svg {
@apply opacity-75 transition-opacity hover:opacity-100;
}
}
main {
@apply overflow-y-scroll p-4;
@apply absolute inset-y-0 left-12 right-0 md:left-16;
> section {
@apply grid gap-4;
@apply pt-5 pb-7 first:pt-0;
@apply border-b border-neutral-900/10 last:border-b-0 dark:border-neutral-50/10;
hr {
@apply my-2;
}
}
-ms-overflow-style: none;
&::-webkit-scrollbar {
display: none;
}
}
}

View File

@ -0,0 +1,126 @@
import { Add, Star } from '@mui/icons-material';
import { Button, Divider, IconButton, SwipeableDrawer, Tooltip, useMediaQuery, useTheme } from '@mui/material';
import { Section as SectionRecord } from '@reactive-resume/schema';
import get from 'lodash/get';
import Link from 'next/link';
import { useTranslation } from 'next-i18next';
import { useMemo } from 'react';
import { validate } from 'uuid';
import Logo from '@/components/shared/Logo';
import { getCustomSections, left } from '@/config/sections';
import { setSidebarState } from '@/store/build/buildSlice';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { addSection } from '@/store/resume/resumeSlice';
import styles from './LeftSidebar.module.scss';
import Section from './sections/Section';
const LeftSidebar = () => {
const theme = useTheme();
const { t } = useTranslation();
const dispatch = useAppDispatch();
const isDesktop = useMediaQuery(theme.breakpoints.up('lg'));
const sections = useAppSelector((state) => state.resume.sections);
const { open } = useAppSelector((state) => state.build.sidebar.left);
const customSections = useMemo(() => getCustomSections(sections), [sections]);
const handleOpen = () => dispatch(setSidebarState({ sidebar: 'left', state: { open: true } }));
const handleClose = () => dispatch(setSidebarState({ sidebar: 'left', state: { open: false } }));
const handleClick = (id: string) => {
const elementId = validate(id) ? `#section-${id}` : `#${id}`;
const section = document.querySelector(elementId);
if (section) {
section.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
};
const handleAddSection = () => {
const newSection: SectionRecord = {
name: 'Custom Section',
type: 'custom',
visible: true,
columns: 2,
items: [],
};
dispatch(addSection({ value: newSection }));
};
return (
<SwipeableDrawer
open={open}
anchor="left"
onOpen={handleOpen}
onClose={handleClose}
PaperProps={{ className: '!shadow-lg' }}
variant={isDesktop ? 'persistent' : 'temporary'}
>
<div className={styles.container}>
<nav>
<div>
<Link href="/dashboard">
<a className="inline-flex">
<Logo size={40} />
</a>
</Link>
<Divider />
</div>
<div className={styles.sections}>
{left.map(({ id, icon }) => (
<Tooltip
arrow
key={id}
placement="right"
title={get(sections, `${id}.name`, t<string>(`builder.leftSidebar.sections.${id}.heading`))}
>
<IconButton onClick={() => handleClick(id)}>{icon}</IconButton>
</Tooltip>
))}
{customSections.map(({ id }) => (
<Tooltip key={id} title={get(sections, `${id}.name`, '')} placement="right" arrow>
<IconButton onClick={() => handleClick(id)}>
<Star />
</IconButton>
</Tooltip>
))}
</div>
<div />
</nav>
<main>
{left.map(({ id, component }) => (
<section key={id} id={id}>
{component}
</section>
))}
{customSections.map(({ id }) => (
<section key={id} id={`section-${id}`}>
<Section path={`sections.${id}`} isEditable isHideable isDeletable />
</section>
))}
<div className="py-6 text-right">
<Button fullWidth variant="outlined" startIcon={<Add />} onClick={handleAddSection}>
{t('builder.common.actions.add', { token: t('builder.leftSidebar.sections.section.heading') })}
</Button>
</div>
</main>
</div>
</SwipeableDrawer>
);
};
export default LeftSidebar;

View File

@ -0,0 +1,81 @@
import { PhotoFilter } from '@mui/icons-material';
import { Button, Divider, Popover } from '@mui/material';
import { useTranslation } from 'next-i18next';
import { useState } from 'react';
import Heading from '@/components/shared/Heading';
import ResumeInput from '@/components/shared/ResumeInput';
import PhotoFilters from './PhotoFilters';
import PhotoUpload from './PhotoUpload';
const Basics = () => {
const { t } = useTranslation();
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
return (
<>
<Heading path="sections.basics" name={t('builder.leftSidebar.sections.basics.heading')} />
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
<div className="flex flex-col items-center gap-4 sm:col-span-2 sm:flex-row">
<PhotoUpload />
<div className="flex w-full flex-col-reverse gap-4 sm:flex-col sm:gap-2">
<ResumeInput label={t('builder.leftSidebar.sections.basics.name.label')} path="basics.name" />
<Button variant="outlined" startIcon={<PhotoFilter />} onClick={handleClick}>
{t('builder.leftSidebar.sections.basics.actions.photo-filters')}
</Button>
<Popover
open={Boolean(anchorEl)}
anchorEl={anchorEl}
onClose={handleClose}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'center',
}}
transformOrigin={{
vertical: 'top',
horizontal: 'center',
}}
>
<PhotoFilters />
</Popover>
</div>
</div>
<ResumeInput label={t('builder.common.form.email.label')} path="basics.email" className="sm:col-span-2" />
<ResumeInput label={t('builder.common.form.phone.label')} path="basics.phone" />
<ResumeInput label={t('builder.common.form.url.label')} path="basics.website" />
<Divider className="sm:col-span-2" />
<ResumeInput
label={t('builder.leftSidebar.sections.basics.headline.label')}
path="basics.headline"
className="sm:col-span-2"
/>
<ResumeInput
type="textarea"
label={t('builder.common.form.summary.label')}
path="basics.summary"
className="sm:col-span-2"
markdownSupported
/>
</div>
</>
);
};
export default Basics;

View File

@ -0,0 +1,31 @@
import { useTranslation } from 'next-i18next';
import Heading from '@/components/shared/Heading';
import ResumeInput from '@/components/shared/ResumeInput';
const Location = () => {
const { t } = useTranslation();
return (
<>
<Heading path="sections.location" name={t('builder.leftSidebar.sections.location.heading')} />
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
<ResumeInput
label={t('builder.leftSidebar.sections.location.address.label')}
path="basics.location.address"
className="sm:col-span-2"
/>
<ResumeInput label={t('builder.leftSidebar.sections.location.city.label')} path="basics.location.city" />
<ResumeInput label={t('builder.leftSidebar.sections.location.region.label')} path="basics.location.region" />
<ResumeInput label={t('builder.leftSidebar.sections.location.country.label')} path="basics.location.country" />
<ResumeInput
label={t('builder.leftSidebar.sections.location.postal-code.label')}
path="basics.location.postalCode"
/>
</div>
</>
);
};
export default Location;

View File

@ -0,0 +1,97 @@
import { Circle, Square, SquareRounded } from '@mui/icons-material';
import { Checkbox, Divider, FormControlLabel, Slider, ToggleButton, ToggleButtonGroup } from '@mui/material';
import { Photo, PhotoShape } from '@reactive-resume/schema';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
const PhotoFilters = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const photo: Photo = useAppSelector((state) => get(state.resume, 'basics.photo'));
const size: number = get(photo, 'filters.size', 128);
const shape: PhotoShape = get(photo, 'filters.shape', 'square');
const grayscale: boolean = get(photo, 'filters.grayscale', false);
const border: boolean = get(photo, 'filters.border', false);
const handleChangeSize = (size: number | number[]) =>
dispatch(setResumeState({ path: 'basics.photo.filters.size', value: size }));
const handleChangeShape = (shape: PhotoShape) =>
dispatch(setResumeState({ path: 'basics.photo.filters.shape', value: shape }));
const handleSetGrayscale = (value: boolean) =>
dispatch(setResumeState({ path: 'basics.photo.filters.grayscale', value }));
const handleSetBorder = (value: boolean) => dispatch(setResumeState({ path: 'basics.photo.filters.border', value }));
return (
<div className="flex flex-col gap-2 p-5 dark:bg-neutral-800">
<div>
<h4 className="font-medium">{t('builder.leftSidebar.sections.basics.photo-filters.size.heading')}</h4>
<div className="mx-2">
<Slider
min={32}
max={512}
step={2}
marks={[
{ value: 32, label: '32' },
{ value: 128, label: '128' },
{ value: 256, label: '256' },
{ value: 512, label: '512' },
]}
value={size}
onChange={(_, value: number | number[]) => handleChangeSize(value)}
/>
</div>
</div>
<Divider />
<div>
<h4 className="font-medium">{t('builder.leftSidebar.sections.basics.photo-filters.effects.heading')}</h4>
<div className="flex items-center">
<FormControlLabel
label={t('builder.leftSidebar.sections.basics.photo-filters.effects.grayscale.label') as string}
control={
<Checkbox color="secondary" checked={grayscale} onChange={(_, value) => handleSetGrayscale(value)} />
}
/>
<FormControlLabel
label={t('builder.leftSidebar.sections.basics.photo-filters.effects.border.label') as string}
control={<Checkbox color="secondary" checked={border} onChange={(_, value) => handleSetBorder(value)} />}
/>
</div>
</div>
<Divider />
<div className="flex flex-col gap-2">
<h4 className="font-medium">{t('builder.leftSidebar.sections.basics.photo-filters.shape.heading')}</h4>
<ToggleButtonGroup exclusive value={shape} onChange={(_, value) => handleChangeShape(value)}>
<ToggleButton size="small" value="square" className="w-14">
<Square fontSize="small" />
</ToggleButton>
<ToggleButton size="small" value="rounded-square" className="w-14">
<SquareRounded fontSize="small" />
</ToggleButton>
<ToggleButton size="small" value="circle" className="w-14">
<Circle fontSize="small" />
</ToggleButton>
</ToggleButtonGroup>
</div>
</div>
);
};
export default PhotoFilters;

View File

@ -0,0 +1,83 @@
import { Avatar, IconButton, Skeleton, Tooltip } from '@mui/material';
import { Photo, Resume } from '@reactive-resume/schema';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
import { useTranslation } from 'next-i18next';
import React, { useRef } from 'react';
import toast from 'react-hot-toast';
import { useMutation } from 'react-query';
import { ServerError } from '@/services/axios';
import { deletePhoto, DeletePhotoParams, uploadPhoto, UploadPhotoParams } from '@/services/resume';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
const FILE_UPLOAD_MAX_SIZE = 2000000; // 2 MB
const PhotoUpload: React.FC = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const fileInputRef = useRef<HTMLInputElement>(null);
const id: number = useAppSelector((state) => get(state.resume, 'id'));
const photo: Photo = useAppSelector((state) => get(state.resume, 'basics.photo'));
const { mutateAsync: uploadMutation, isLoading } = useMutation<Resume, ServerError, UploadPhotoParams>(uploadPhoto);
const { mutateAsync: deleteMutation } = useMutation<Resume, ServerError, DeletePhotoParams>(deletePhoto);
const handleClick = async () => {
if (fileInputRef.current) {
if (!isEmpty(photo.url)) {
try {
await deleteMutation({ id });
} finally {
dispatch(setResumeState({ path: 'basics.photo.url', value: '' }));
}
} else {
fileInputRef.current.click();
}
fileInputRef.current.value = '';
}
};
const handleChange = async (event: React.ChangeEvent<HTMLInputElement>) => {
if (event.target.files && event.target.files[0]) {
const file = event.target.files[0];
if (file.size > FILE_UPLOAD_MAX_SIZE) {
toast.error(t('common.toast.error.upload-photo-size'));
return;
}
const resume = await uploadMutation({ id, file });
dispatch(setResumeState({ path: 'basics.photo.url', value: get(resume, 'basics.photo.url', '') }));
}
};
return (
<IconButton onClick={handleClick}>
{isLoading ? (
<Skeleton variant="circular" width={96} height={96} />
) : (
<Tooltip
title={
isEmpty(photo.url)
? (t('builder.leftSidebar.sections.basics.photo-upload.tooltip.upload') as string)
: (t('builder.leftSidebar.sections.basics.photo-upload.tooltip.remove') as string)
}
>
<Avatar sx={{ width: 96, height: 96 }} src={photo.url} />
</Tooltip>
)}
<input hidden type="file" ref={fileInputRef} onChange={handleChange} accept="image/*" />
</IconButton>
);
};
export default PhotoUpload;

View File

@ -0,0 +1,52 @@
import { Add } from '@mui/icons-material';
import { Button } from '@mui/material';
import { ListItem } from '@reactive-resume/schema';
import { useTranslation } from 'next-i18next';
import Heading from '@/components/shared/Heading';
import List from '@/components/shared/List';
import { useAppDispatch } from '@/store/hooks';
import { setModalState } from '@/store/modal/modalSlice';
import { duplicateItem } from '@/store/resume/resumeSlice';
const Profiles = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const handleAdd = () => {
dispatch(setModalState({ modal: 'builder.sections.profile', state: { open: true } }));
};
const handleEdit = (item: ListItem) => {
dispatch(setModalState({ modal: 'builder.sections.profile', state: { open: true, payload: { item } } }));
};
const handleDuplicate = (item: ListItem) => {
dispatch(duplicateItem({ path: 'basics.profiles', value: item }));
};
return (
<>
<Heading path="sections.profiles" name={t('builder.leftSidebar.sections.profiles.heading')} />
<List
path="basics.profiles"
titleKey="username"
subtitleKey="network"
onEdit={handleEdit}
onDuplicate={handleDuplicate}
/>
<footer className="flex justify-end">
<Button variant="outlined" startIcon={<Add />} onClick={handleAdd}>
{t('builder.common.actions.add', {
token: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
})}
</Button>
</footer>
</>
);
};
export default Profiles;

View File

@ -0,0 +1,84 @@
import { Add } from '@mui/icons-material';
import { Button } from '@mui/material';
import { ListItem } from '@reactive-resume/schema';
import clsx from 'clsx';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import { validate } from 'uuid';
import Heading from '@/components/shared/Heading';
import List from '@/components/shared/List';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { ModalName, setModalState } from '@/store/modal/modalSlice';
import { duplicateItem } from '@/store/resume/resumeSlice';
import SectionSettings from './SectionSettings';
type Props = {
path: `sections.${string}`;
name?: string;
titleKey?: string;
subtitleKey?: string;
isEditable?: boolean;
isHideable?: boolean;
isDeletable?: boolean;
};
const Section: React.FC<Props> = ({
path,
name = 'Section Name',
titleKey = 'title',
subtitleKey = 'subtitle',
isEditable = false,
isHideable = false,
isDeletable = false,
}) => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const heading = useAppSelector<string>((state) => get(state.resume, `${path}.name`, name));
const visibility = useAppSelector<boolean>((state) => get(state.resume, `${path}.visible`, true));
const handleAdd = () => {
const id = path.split('.')[1];
const modal: ModalName = validate(id) ? 'builder.sections.custom' : `builder.${path}`;
dispatch(setModalState({ modal, state: { open: true, payload: { path } } }));
};
const handleEdit = (item: ListItem) => {
const id = path.split('.')[1];
const modal: ModalName = validate(id) ? 'builder.sections.custom' : `builder.${path}`;
const payload = validate(id) ? { path, item } : { item };
dispatch(setModalState({ modal, state: { open: true, payload } }));
};
const handleDuplicate = (item: ListItem) => dispatch(duplicateItem({ path: `${path}.items`, value: item }));
return (
<>
<Heading path={path} name={name} isEditable={isEditable} isHideable={isHideable} isDeletable={isDeletable} />
<List
path={`${path}.items`}
titleKey={titleKey}
subtitleKey={subtitleKey}
onEdit={handleEdit}
onDuplicate={handleDuplicate}
className={clsx({ 'opacity-50': !visibility })}
/>
<footer className="flex items-center justify-between">
<SectionSettings path={path} />
<Button variant="outlined" startIcon={<Add />} onClick={handleAdd}>
{t('builder.common.actions.add', { token: heading })}
</Button>
</footer>
</>
);
};
export default Section;

View File

@ -0,0 +1,66 @@
import { ViewWeek } from '@mui/icons-material';
import { ButtonBase, Popover, ToggleButton, ToggleButtonGroup, Tooltip } from '@mui/material';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import { useState } from 'react';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
type Props = {
path: string;
};
const SectionSettings: React.FC<Props> = ({ path }) => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
const columns = useAppSelector<number>((state) => get(state.resume, `${path}.columns`, 2));
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
const handleSetColumns = (index: number) => dispatch(setResumeState({ path: `${path}.columns`, value: index }));
return (
<div>
<Tooltip title={t('builder.common.columns.tooltip') as string}>
<ButtonBase onClick={handleClick} sx={{ padding: 1, borderRadius: 1 }} className="opacity-50 hover:opacity-75">
<ViewWeek /> <span className="ml-1.5 text-xs">{columns}</span>
</ButtonBase>
</Tooltip>
<Popover
open={Boolean(anchorEl)}
anchorEl={anchorEl}
onClose={handleClose}
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left',
}}
>
<div className="p-5 dark:bg-neutral-800">
<h4 className="mb-2 font-medium">{t('builder.common.columns.heading')}</h4>
<ToggleButtonGroup exclusive value={columns} onChange={(_, value: number) => handleSetColumns(value)}>
{[1, 2, 3, 4].map((index) => (
<ToggleButton key={index} value={index} size="small" className="w-12">
{index}
</ToggleButton>
))}
</ToggleButtonGroup>
</div>
</Popover>
</div>
);
};
export default SectionSettings;

View File

@ -0,0 +1,50 @@
.container {
@apply h-screen w-[95vw] md:w-[70vw] lg:w-[50vw] xl:w-[30vw] 2xl:w-[28vw];
@apply bg-neutral-50 text-neutral-900 dark:bg-neutral-900 dark:text-neutral-50;
@apply relative flex border-l-2 border-neutral-50/10;
nav {
@apply absolute inset-y-0 right-0;
@apply w-12 py-4 md:w-16 md:px-2;
@apply bg-neutral-100 shadow dark:bg-neutral-800;
@apply flex flex-col items-center justify-between;
hr {
@apply mt-2;
}
> div {
@apply grid gap-2;
}
.sections svg {
@apply opacity-75 transition-opacity hover:opacity-100;
}
}
main {
@apply overflow-y-scroll p-4;
@apply absolute inset-y-0 right-12 left-0 md:right-16;
> section {
@apply grid gap-4;
@apply pt-5 pb-7 first:pt-0;
@apply border-b border-neutral-900/10 last:border-b-0 dark:border-neutral-50/10;
hr {
@apply my-2;
}
}
-ms-overflow-style: none;
&::-webkit-scrollbar {
display: none;
}
}
.footer {
@apply flex flex-col items-center justify-center gap-3 py-4;
@apply text-center text-xs leading-normal opacity-40;
}
}

View File

@ -0,0 +1,86 @@
import { Divider, IconButton, SwipeableDrawer, Tooltip, useMediaQuery, useTheme } from '@mui/material';
import { capitalize } from 'lodash';
import { useTranslation } from 'next-i18next';
import Avatar from '@/components/shared/Avatar';
import Footer from '@/components/shared/Footer';
import { right } from '@/config/sections';
import { setSidebarState } from '@/store/build/buildSlice';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import styles from './RightSidebar.module.scss';
const RightSidebar = () => {
const theme = useTheme();
const { t } = useTranslation();
const dispatch = useAppDispatch();
const isDesktop = useMediaQuery(theme.breakpoints.up('lg'));
const { open } = useAppSelector((state) => state.build.sidebar.right);
const handleOpen = () => dispatch(setSidebarState({ sidebar: 'right', state: { open: true } }));
const handleClose = () => dispatch(setSidebarState({ sidebar: 'right', state: { open: false } }));
const handleClick = (id: string) => {
const section = document.querySelector(`#${id}`);
if (section) {
section.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
};
return (
<SwipeableDrawer
open={open}
anchor="right"
onOpen={handleOpen}
onClose={handleClose}
PaperProps={{ className: '!shadow-lg' }}
variant={isDesktop ? 'persistent' : 'temporary'}
>
<div className={styles.container}>
<nav>
<div>
<Avatar size={40} />
<Divider />
</div>
<div className={styles.sections}>
{right.map(({ id, icon }) => (
<Tooltip
key={id}
arrow
placement="right"
title={t<string>(`builder.rightSidebar.sections.${id}.heading`, { defaultValue: capitalize(id) })}
>
<IconButton onClick={() => handleClick(id)}>{icon}</IconButton>
</Tooltip>
))}
</div>
<div />
</nav>
<main>
{right.map(({ id, component }) => (
<section key={id} id={id}>
{component}
</section>
))}
<footer className={styles.footer}>
<Footer />
<div>v{process.env.appVersion}</div>
</footer>
</main>
</div>
</SwipeableDrawer>
);
};
export default RightSidebar;

View File

@ -0,0 +1,49 @@
import Editor from '@monaco-editor/react';
import { useTheme } from '@mui/material';
import { CustomCSS as CustomCSSType } from '@reactive-resume/schema';
import clsx from 'clsx';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import React from 'react';
import Heading from '@/components/shared/Heading';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
const CustomCSS = () => {
const theme = useTheme();
const { t } = useTranslation();
const dispatch = useAppDispatch();
const customCSS: CustomCSSType = useAppSelector((state) => get(state.resume, 'metadata.css', {}));
const handleChange = (value: string | undefined) => {
dispatch(setResumeState({ path: 'metadata.css.value', value }));
};
return (
<>
<Heading path="metadata.css" name={t('builder.rightSidebar.sections.css.heading')} isHideable />
<Editor
height="200px"
language="css"
value={customCSS.value}
onChange={handleChange}
className={clsx({ 'opacity-50': !customCSS.visible })}
theme={theme.palette.mode === 'dark' ? 'vs-dark' : 'light'}
options={{
minimap: { enabled: false },
overviewRulerLanes: 0,
scrollBeyondLastColumn: 5,
overviewRulerBorder: false,
scrollBeyondLastLine: true,
}}
/>
</>
);
};
export default CustomCSS;

View File

@ -0,0 +1,81 @@
import { PictureAsPdf, Schema } from '@mui/icons-material';
import { List, ListItem, ListItemButton, ListItemText } from '@mui/material';
import get from 'lodash/get';
import pick from 'lodash/pick';
import { useTranslation } from 'next-i18next';
import { useMutation } from 'react-query';
import Heading from '@/components/shared/Heading';
import { ServerError } from '@/services/axios';
import { printResumeAsPdf, PrintResumeAsPdfParams } from '@/services/printer';
import { useAppSelector } from '@/store/hooks';
const Export = () => {
const { t } = useTranslation();
const resume = useAppSelector((state) => state.resume);
const { mutateAsync, isLoading } = useMutation<string, ServerError, PrintResumeAsPdfParams>(printResumeAsPdf);
const pdfListItemText = {
normal: {
primary: t('builder.rightSidebar.sections.export.pdf.normal.primary'),
secondary: t('builder.rightSidebar.sections.export.pdf.normal.secondary'),
},
loading: {
primary: t('builder.rightSidebar.sections.export.pdf.loading.primary'),
secondary: t('builder.rightSidebar.sections.export.pdf.loading.secondary'),
},
};
const handleExportJSON = async () => {
const { nanoid } = await import('nanoid');
const download = (await import('downloadjs')).default;
const redactedResume = pick(resume, ['basics', 'sections', 'metadata', 'public']);
const jsonString = JSON.stringify(redactedResume, null, 4);
const filename = `RxResume_JSONExport_${nanoid()}.json`;
download(jsonString, filename, 'application/json');
};
const handleExportPDF = async () => {
const download = (await import('downloadjs')).default;
const slug = get(resume, 'slug');
const username = get(resume, 'user.username');
const url = await mutateAsync({ username, slug });
download(`/api${url}`);
};
return (
<>
<Heading path="metadata.export" name={t('builder.rightSidebar.sections.export.heading')} />
<List sx={{ padding: 0 }}>
<ListItem sx={{ padding: 0 }}>
<ListItemButton className="gap-6" onClick={handleExportJSON}>
<Schema />
<ListItemText
primary={t('builder.rightSidebar.sections.export.json.primary')}
secondary={t('builder.rightSidebar.sections.export.json.secondary')}
/>
</ListItemButton>
</ListItem>
<ListItem sx={{ padding: 0 }}>
<ListItemButton className="gap-6" onClick={handleExportPDF} disabled={isLoading}>
<PictureAsPdf />
<ListItemText {...(isLoading ? pdfListItemText.loading : pdfListItemText.normal)} />
</ListItemButton>
</ListItem>
</List>
</>
);
};
export default Export;

View File

@ -0,0 +1,43 @@
.page {
@apply relative border pl-4 pb-4 dark:border-neutral-100/10;
@apply rounded bg-neutral-100 dark:bg-neutral-800;
.delete {
@apply opacity-50 hover:opacity-75;
@apply rotate-0 hover:rotate-90;
@apply transition-[opacity,transform];
}
.container {
@apply grid grid-cols-2 gap-2;
}
.heading {
@apply relative z-10 my-3;
@apply text-xs font-semibold;
}
}
.column {
@apply relative w-full px-4;
.heading {
@apply relative z-10 my-3;
@apply text-xs font-semibold;
}
.base {
@apply absolute inset-0 w-4/5;
@apply rounded bg-neutral-200 dark:bg-neutral-700;
}
}
.section {
@apply relative my-3 w-full px-4 py-2;
@apply cursor-move break-all rounded text-xs capitalize;
@apply bg-neutral-800/90 text-neutral-50 dark:bg-neutral-50/90 dark:text-neutral-800;
&.disabled {
@apply opacity-60;
}
}

View File

@ -0,0 +1,143 @@
import { Add, Close, Restore } from '@mui/icons-material';
import { Button, IconButton, Tooltip } from '@mui/material';
import clsx from 'clsx';
import cloneDeep from 'lodash/cloneDeep';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import { DragDropContext, Draggable, DraggableLocation, Droppable, DropResult } from 'react-beautiful-dnd';
import Heading from '@/components/shared/Heading';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { addPage, deletePage, setResumeState } from '@/store/resume/resumeSlice';
import styles from './Layout.module.scss';
const getIndices = (location: DraggableLocation) => ({
page: +location.droppableId.split('.')[0],
column: +location.droppableId.split('.')[1],
section: +location.index,
});
const Layout = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const layout = useAppSelector((state) => state.resume.metadata.layout);
const resumeSections = useAppSelector((state) => state.resume.sections);
const onDragEnd = (dropResult: DropResult) => {
const { source: srcLoc, destination: destLoc } = dropResult;
if (!destLoc) return;
const newLayout = cloneDeep(layout);
const srcIndex = getIndices(srcLoc);
const destIndex = getIndices(destLoc);
const section = layout[srcIndex.page][srcIndex.column][srcIndex.section];
// Remove item at source
newLayout[srcIndex.page][srcIndex.column].splice(srcIndex.section, 1);
// Insert item at destination
newLayout[destIndex.page][destIndex.column].splice(destIndex.section, 0, section);
dispatch(setResumeState({ path: 'metadata.layout', value: newLayout }));
};
const handleAddPage = () => dispatch(addPage());
const handleDeletePage = (page: number) => dispatch(deletePage({ page }));
const handleResetLayout = () => {
for (let i = layout.length - 1; i > 0; i--) {
handleDeletePage(i);
}
};
return (
<>
<Heading
path="metadata.layout"
name={t('builder.rightSidebar.sections.layout.heading')}
action={
<Tooltip title={t('builder.rightSidebar.sections.layout.tooltip.reset-layout') as string}>
<IconButton onClick={handleResetLayout}>
<Restore />
</IconButton>
</Tooltip>
}
/>
<DragDropContext onDragEnd={onDragEnd}>
{/* Pages */}
{layout.map((columns, pageIndex) => (
<div key={pageIndex} className={styles.page}>
<div className="flex items-center justify-between pr-3">
<p className={styles.heading}>
{t('builder.common.glossary.page')} {pageIndex + 1}
</p>
<div className={clsx(styles.delete, { hidden: pageIndex === 0 })}>
<Tooltip
title={t('builder.common.actions.delete', { token: t('builder.common.glossary.page') }) as string}
>
<IconButton size="small" onClick={() => handleDeletePage(pageIndex)}>
<Close fontSize="small" />
</IconButton>
</Tooltip>
</div>
</div>
<div className={styles.container}>
{/* Sections */}
{columns.map((sections, columnIndex) => {
const index = `${pageIndex}.${columnIndex}`;
return (
<Droppable key={index} droppableId={index}>
{(provided) => (
<div ref={provided.innerRef} className={styles.column} {...provided.droppableProps}>
<p className={styles.heading}>{columnIndex ? 'Sidebar' : 'Main'}</p>
<div className={styles.base} />
{/* Sections */}
{sections.map((sectionId, sectionIndex) => (
<Draggable key={sectionId} draggableId={sectionId} index={sectionIndex}>
{(provided) => (
<div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
<div
className={clsx(styles.section, {
[styles.disabled]: !get(resumeSections, `${sectionId}.visible`, true),
})}
>
{get(resumeSections, `${sectionId}.name`)}
</div>
</div>
)}
</Draggable>
))}
{provided.placeholder}
</div>
)}
</Droppable>
);
})}
</div>
</div>
))}
<div className="flex items-center justify-end">
<Button variant="outlined" startIcon={<Add />} onClick={handleAddPage}>
{t('builder.common.actions.add', { token: t('builder.common.glossary.page') })}
</Button>
</div>
</DragDropContext>
</>
);
};
export default Layout;

View File

@ -0,0 +1,20 @@
.container {
@apply grid gap-4;
.section {
@apply grid gap-2 rounded p-6;
@apply bg-neutral-100 dark:bg-neutral-800;
h2 {
@apply inline-flex items-center gap-2 text-base font-medium;
}
p {
@apply mb-3 text-xs leading-loose;
}
}
a {
@apply hover:no-underline;
}
}

View File

@ -0,0 +1,56 @@
import { BugReport, Coffee, GitHub, Link, Savings } from '@mui/icons-material';
import { Button } from '@mui/material';
import { useTranslation } from 'next-i18next';
import Heading from '@/components/shared/Heading';
import { DONATION_URL, GITHUB_ISSUES_URL, GITHUB_URL } from '@/constants/index';
import styles from './Links.module.scss';
const Links = () => {
const { t } = useTranslation();
return (
<>
<Heading path="metadata.links" name={t('builder.rightSidebar.sections.links.heading')} />
<div className={styles.container}>
<div className={styles.section}>
<h2>
<Savings fontSize="small" />
{t('builder.rightSidebar.sections.links.donate.heading')}
</h2>
<p>{t('builder.rightSidebar.sections.links.donate.body')}</p>
<a href={DONATION_URL} target="_blank" rel="noreferrer">
<Button startIcon={<Coffee />}>{t('builder.rightSidebar.sections.links.donate.button')}</Button>
</a>
</div>
<div className={styles.section}>
<h2>
<BugReport fontSize="small" />
{t('builder.rightSidebar.sections.links.bugs-features.heading')}
</h2>
<p>{t('builder.rightSidebar.sections.links.bugs-features.body')}</p>
<a href={GITHUB_ISSUES_URL} target="_blank" rel="noreferrer">
<Button startIcon={<GitHub />}>{t('builder.rightSidebar.sections.links.bugs-features.button')}</Button>
</a>
</div>
<div>
<a href={GITHUB_URL} target="_blank" rel="noreferrer">
<Button variant="text" startIcon={<Link />}>
{t('builder.rightSidebar.sections.links.github')}
</Button>
</a>
</div>
</div>
</>
);
};
export default Links;

View File

@ -0,0 +1,207 @@
import { Anchor, DeleteForever, Palette } from '@mui/icons-material';
import {
Autocomplete,
List,
ListItem,
ListItemButton,
ListItemIcon,
ListItemText,
ListSubheader,
Switch,
TextField,
} from '@mui/material';
import { DateConfig, Resume } from '@reactive-resume/schema';
import dayjs from 'dayjs';
import get from 'lodash/get';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
import { useMemo } from 'react';
import { useMutation } from 'react-query';
import Heading from '@/components/shared/Heading';
import ThemeSwitch from '@/components/shared/ThemeSwitch';
import { Language, languageMap, languages } from '@/config/languages';
import { ServerError } from '@/services/axios';
import queryClient from '@/services/react-query';
import { loadSampleData, LoadSampleDataParams, resetResume, ResetResumeParams } from '@/services/resume';
import { setTheme, togglePageBreakLine, togglePageOrientation } from '@/store/build/buildSlice';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
import { dateFormatOptions } from '@/utils/date';
const Settings = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const { locale, ...router } = useRouter();
const resume = useAppSelector((state) => state.resume);
const theme = useAppSelector((state) => state.build.theme);
const breakLine = useAppSelector((state) => state.build.page.breakLine);
const orientation = useAppSelector((state) => state.build.page.orientation);
const id: number = useMemo(() => get(resume, 'id'), [resume]);
const slug: string = useMemo(() => get(resume, 'slug'), [resume]);
const username: string = useMemo(() => get(resume, 'user.username'), [resume]);
const dateConfig: DateConfig = useMemo(() => get(resume, 'metadata.date'), [resume]);
const isDarkMode = useMemo(() => theme === 'dark', [theme]);
const exampleString = useMemo(() => `Eg. ${dayjs().format(dateConfig.format)}`, [dateConfig.format]);
const themeString = useMemo(() => (isDarkMode ? 'Matte Black Everything' : 'As bright as your future'), [isDarkMode]);
const { mutateAsync: loadSampleDataMutation } = useMutation<Resume, ServerError, LoadSampleDataParams>(
loadSampleData
);
const { mutateAsync: resetResumeMutation } = useMutation<Resume, ServerError, ResetResumeParams>(resetResume);
const handleSetTheme = (value: boolean) => dispatch(setTheme({ theme: value ? 'dark' : 'light' }));
const handleChangeDateFormat = (value: string | null) =>
dispatch(setResumeState({ path: 'metadata.date.format', value }));
const handleChangeLanguage = (value: Language | null) => {
const { pathname, asPath, query, push } = router;
const code = value?.code || 'en';
document.cookie = `NEXT_LOCALE=${code}; path=/; expires=2147483647`;
push({ pathname, query }, asPath, { locale: code });
};
const handleLoadSampleData = async () => {
await loadSampleDataMutation({ id });
queryClient.invalidateQueries(`resume/${username}/${slug}`);
};
const handleResetResume = async () => {
await resetResumeMutation({ id });
queryClient.invalidateQueries(`resume/${username}/${slug}`);
};
return (
<>
<Heading path="metadata.settings" name={t('builder.rightSidebar.sections.settings.heading')} />
<List sx={{ padding: 0 }}>
{/* Global Settings */}
<>
<ListSubheader className="rounded">
{t('builder.rightSidebar.sections.settings.global.heading')}
</ListSubheader>
<ListItem>
<ListItemIcon>
<Palette />
</ListItemIcon>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.global.theme.primary')}
secondary={themeString}
/>
<ThemeSwitch checked={isDarkMode} onChange={(_, value: boolean) => handleSetTheme(value)} />
</ListItem>
<ListItem className="flex-col">
<ListItemText
className="w-full"
primary={t('builder.rightSidebar.sections.settings.global.date.primary')}
secondary={t('builder.rightSidebar.sections.settings.global.date.secondary')}
/>
<Autocomplete<string, false, boolean, false>
disableClearable
className="my-2 w-full"
options={dateFormatOptions}
value={dateConfig.format}
onChange={(_, value) => handleChangeDateFormat(value)}
renderInput={(params) => <TextField {...params} helperText={exampleString} />}
/>
</ListItem>
<ListItem className="flex-col">
<ListItemText
className="w-full"
primary={t('builder.rightSidebar.sections.settings.global.language.primary')}
secondary={t('builder.rightSidebar.sections.settings.global.language.secondary')}
/>
<Autocomplete<Language, false, boolean, false>
disableClearable
className="my-2 w-full"
options={languages}
value={languageMap[locale ?? 'en']}
isOptionEqualToValue={(a, b) => a.code === b.code}
onChange={(_, value) => handleChangeLanguage(value)}
renderInput={(params) => <TextField {...params} />}
getOptionLabel={(language) => {
if (language.localName) {
return `${language.name} (${language.localName})`;
}
return language.name;
}}
/>
</ListItem>
</>
{/* Page Settings */}
<>
<ListSubheader className="rounded">{t('builder.rightSidebar.sections.settings.page.heading')}</ListSubheader>
<ListItem>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.page.orientation.primary')}
secondary={t('builder.rightSidebar.sections.settings.page.orientation.secondary')}
/>
<Switch
color="secondary"
checked={orientation === 'horizontal'}
onChange={() => dispatch(togglePageOrientation())}
/>
</ListItem>
<ListItem>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.page.break-line.primary')}
secondary={t('builder.rightSidebar.sections.settings.page.break-line.secondary')}
/>
<Switch color="secondary" checked={breakLine} onChange={() => dispatch(togglePageBreakLine())} />
</ListItem>
</>
{/* Resume Settings */}
<>
<ListSubheader className="rounded">
{t('builder.rightSidebar.sections.settings.resume.heading')}
</ListSubheader>
<ListItem>
<ListItemButton onClick={handleLoadSampleData}>
<ListItemIcon>
<Anchor />
</ListItemIcon>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.resume.sample.primary')}
secondary={t('builder.rightSidebar.sections.settings.resume.sample.secondary')}
/>
</ListItemButton>
</ListItem>
<ListItem>
<ListItemButton onClick={handleResetResume}>
<ListItemIcon>
<DeleteForever />
</ListItemIcon>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.resume.reset.primary')}
secondary={t('builder.rightSidebar.sections.settings.resume.reset.secondary')}
/>
</ListItemButton>
</ListItem>
</>
</List>
</>
);
};
export default Settings;

View File

@ -0,0 +1,78 @@
import { CopyAll } from '@mui/icons-material';
import { Checkbox, FormControlLabel, IconButton, List, ListItem, ListItemText, Switch, TextField } from '@mui/material';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import { useMemo, useState } from 'react';
import toast from 'react-hot-toast';
import Heading from '@/components/shared/Heading';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
import getResumeUrl from '@/utils/getResumeUrl';
const Sharing = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const [showShortUrl, setShowShortUrl] = useState(false);
const resume = useAppSelector((state) => state.resume);
const isPublic = useMemo(() => get(resume, 'public'), [resume]);
const url = useMemo(() => getResumeUrl(resume, { withHost: true }), [resume]);
const shortUrl = useMemo(() => getResumeUrl(resume, { withHost: true, shortUrl: true }), [resume]);
const handleSetVisibility = (value: boolean) => dispatch(setResumeState({ path: 'public', value }));
const handleCopyToClipboard = async () => {
const text = showShortUrl ? shortUrl : url;
await navigator.clipboard.writeText(text);
toast.success(t('common.toast.success.resume-link-copied'));
};
return (
<>
<Heading path="metadata.sharing" name={t('builder.rightSidebar.sections.sharing.heading')} />
<List sx={{ padding: 0 }}>
<ListItem className="flex flex-col" sx={{ padding: 0 }}>
<div className="flex w-full items-center justify-between">
<ListItemText
primary={t('builder.rightSidebar.sections.sharing.visibility.title')}
secondary={t('builder.rightSidebar.sections.sharing.visibility.subtitle')}
/>
<Switch color="secondary" checked={isPublic} onChange={(_, value) => handleSetVisibility(value)} />
</div>
<div className="mt-2 w-full">
<TextField
disabled
fullWidth
value={showShortUrl ? shortUrl : url}
InputProps={{
endAdornment: (
<IconButton onClick={handleCopyToClipboard}>
<CopyAll />
</IconButton>
),
}}
/>
</div>
<div className="mt-1 flex w-full">
<FormControlLabel
label={t('builder.rightSidebar.sections.sharing.short-url.label') as string}
control={
<Checkbox className="mr-1" checked={showShortUrl} onChange={(_, value) => setShowShortUrl(value)} />
}
/>
</div>
</ListItem>
</List>
</>
);
};
export default Sharing;

View File

@ -0,0 +1,22 @@
.container {
@apply grid grid-cols-2 gap-4;
}
.template {
@apply grid text-center;
.preview {
aspect-ratio: 1 / 1.4142;
@apply relative grid rounded;
@apply border-2 border-transparent;
&.selected {
@apply border-black dark:border-white;
}
}
.label {
@apply mt-1 text-xs font-medium;
}
}

View File

@ -0,0 +1,46 @@
import { ButtonBase } from '@mui/material';
import clsx from 'clsx';
import get from 'lodash/get';
import Image from 'next/image';
import { useTranslation } from 'next-i18next';
import Heading from '@/components/shared/Heading';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
import templateMap, { TemplateMeta } from '@/templates/templateMap';
import styles from './Templates.module.scss';
const Templates = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const currentTemplate: string = useAppSelector((state) => get(state.resume, 'metadata.template'));
const handleChange = (template: TemplateMeta) => {
dispatch(setResumeState({ path: 'metadata.template', value: template.id }));
};
return (
<>
<Heading path="metadata.templates" name={t('builder.rightSidebar.sections.templates.heading')} />
<div className={styles.container}>
{Object.values(templateMap).map((template) => (
<div key={template.id} className={styles.template}>
<div className={clsx(styles.preview, { [styles.selected]: template.id === currentTemplate })}>
<ButtonBase onClick={() => handleChange(template)}>
<Image src={template.preview} alt={template.name} className="rounded-sm" layout="fill" />
</ButtonBase>
</div>
<p className={styles.label}>{template.name}</p>
</div>
))}
</div>
</>
);
};
export default Templates;

View File

@ -0,0 +1,8 @@
.container {
@apply grid sm:grid-cols-2 gap-4;
}
.colorOptions {
@apply col-span-2 mb-4;
@apply grid grid-cols-8 gap-y-2 justify-items-center;
}

View File

@ -0,0 +1,57 @@
import { Theme } from '@reactive-resume/schema';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import ColorAvatar from '@/components/shared/ColorAvatar';
import ColorPicker from '@/components/shared/ColorPicker';
import Heading from '@/components/shared/Heading';
import { colorOptions } from '@/config/colors';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
import styles from './Theme.module.scss';
const Theme = () => {
const { t } = useTranslation();
const dispatch = useAppDispatch();
const { background, text, primary } = useAppSelector<Theme>((state) => get(state.resume, 'metadata.theme'));
const handleChange = (property: string, color: string) => {
dispatch(setResumeState({ path: `metadata.theme.${property}`, value: color }));
};
return (
<>
<Heading path="metadata.theme" name={t('builder.rightSidebar.sections.theme.heading')} />
<div className={styles.container}>
<div className={styles.colorOptions}>
{colorOptions.map((color) => (
<ColorAvatar key={color} color={color} onClick={(color) => handleChange('primary', color)} />
))}
</div>
<ColorPicker
label={t('builder.rightSidebar.sections.theme.form.primary.label')}
color={primary}
className="col-span-2"
onChange={(color) => handleChange('primary', color)}
/>
<ColorPicker
label={t('builder.rightSidebar.sections.theme.form.background.label')}
color={background}
onChange={(color) => handleChange('background', color)}
/>
<ColorPicker
label={t('builder.rightSidebar.sections.theme.form.text.label')}
color={text}
onChange={(color) => handleChange('text', color)}
/>
</div>
</>
);
};
export default Theme;

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