Compare commits

...

1172 Commits

Author SHA1 Message Date
30fd283898 use matrix to build amd64/arm64 images 2023-06-07 20:25:12 +02:00
726ea7312b add arm to qemu platform 2023-06-07 20:10:25 +02:00
f3a7180d4b change run script for docker file 2023-06-07 19:52:48 +02:00
0173ce32c3 Implement Turborepo to include Build Caching in CI/CD 2023-06-07 19:50:48 +02:00
d4b6c16bf9 updating dependencies, fixing server reloads 2023-06-07 18:39:14 +02:00
c571f201d3 update version 2023-06-07 17:18:33 +02:00
e4ecf50ed4 add missing backslash 2023-06-07 17:18:18 +02:00
5ee99cfdab attempt to fix internal server error 2023-06-07 12:06:04 +02:00
72e610b50d Merge pull request #1323 from AmruthPillai/i18n_main
New Crowdin updates
2023-05-30 16:53:03 +02:00
ba34787333 Merge pull request #1326 from AmruthPillai/dependabot/docker/server/playwright-v1.34.3-focal
Bump playwright from v1.34.0-focal to v1.34.3-focal in /server
2023-05-30 16:52:54 +02:00
e11b0e6224 Bump playwright from v1.34.0-focal to v1.34.3-focal in /server
Bumps playwright from v1.34.0-focal to v1.34.3-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-29 02:58:15 +00:00
c78ee18e05 New translations common.json (Norwegian) 2023-05-26 14:15:52 +02:00
5f5b484243 New translations builder.json (Norwegian) 2023-05-26 14:15:50 +02:00
bcc451a6a1 Merge pull request #1320 from AmruthPillai/dependabot/docker/server/playwright-v1.34.0-focal
Bump playwright from v1.32.3-focal to v1.34.0-focal in /server
2023-05-23 21:09:04 +02:00
55a7f6a556 Merge pull request #1315 from dev-abir/main
add icons
2023-05-23 21:08:55 +02:00
e9b6265c60 Merge pull request #1304 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.8.21
Bump org.jetbrains.kotlin.android from 1.8.20 to 1.8.21 in /app
2023-05-23 21:08:40 +02:00
2e2f3271c9 Bump playwright from v1.32.3-focal to v1.34.0-focal in /server
Bumps playwright from v1.32.3-focal to v1.34.0-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-22 02:58:19 +00:00
fa3e92d643 Merge pull request #1314 from jobayer12/issue-1309
Rename the Work Experience label.
2023-05-17 10:33:51 +02:00
1f9b52eda6 Added the experience section on the leftSidebar. 2023-05-13 17:58:27 +06:00
7074b6fc76 add icon packs according to #834 2023-05-09 22:10:31 +05:30
b4c4fb94f7 Renamed the Work Experience label. 2023-05-08 10:44:57 +06:00
22bdb64fa9 Added the experience section on the leftSidebar. 2023-05-08 10:42:27 +06:00
af02158d05 Bump org.jetbrains.kotlin.android from 1.8.20 to 1.8.21 in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.8.20 to 1.8.21.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.8.20...v1.8.21)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-01 03:03:01 +00:00
6a8db92fc4 fix bugs 2023-04-21 01:13:32 +02:00
6f219ef17e bump up version to 3.7.2 2023-04-20 23:02:14 +02:00
667e51abdc implement larger pool size for db 2023-04-20 22:52:24 +02:00
7b98277c32 Merge pull request #1294 from AmruthPillai/dependabot/docker/server/playwright-v1.32.3-focal
Bump playwright from v1.32.1-focal to v1.32.3-focal in /server
2023-04-20 22:34:03 +02:00
77ed7ed8be Merge pull request #1293 from AmruthPillai/dependabot/github_actions/actions/checkout-3.5.2
Bump actions/checkout from 3.5.0 to 3.5.2
2023-04-20 22:33:56 +02:00
ce584d9326 Merge pull request #1289 from AmruthPillai/i18n_main
New Crowdin updates
2023-04-20 22:33:48 +02:00
5685352375 Merge pull request #1286 from AmruthPillai/dependabot/github_actions/martinbeentjes/npm-get-version-action-1.3.1
Bump martinbeentjes/npm-get-version-action from 1.2.3 to 1.3.1
2023-04-20 22:33:38 +02:00
036b2917a6 update dependencies, attempt to fix server restart issue 2023-04-20 22:33:11 +02:00
e972320722 Bump playwright from v1.32.1-focal to v1.32.3-focal in /server
Bumps playwright from v1.32.1-focal to v1.32.3-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-17 02:59:32 +00:00
4ac1e9db35 Bump actions/checkout from 3.5.0 to 3.5.2
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.5.0 to 3.5.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.5.0...v3.5.2)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-17 02:58:06 +00:00
9fe4403b40 New translations modals.json (Nepali) 2023-04-11 08:37:33 +02:00
4f4084ab45 New translations modals.json (Amharic) 2023-04-11 08:37:32 +02:00
72227dc9ab New translations modals.json (Odia) 2023-04-11 08:37:31 +02:00
d44795a421 New translations modals.json (Kannada) 2023-04-11 08:37:30 +02:00
e9584144e4 New translations modals.json (Malayalam) 2023-04-11 08:37:30 +02:00
bbedfa3b75 New translations modals.json (Hindi) 2023-04-11 08:37:29 +02:00
03f7d74096 New translations modals.json (Marathi) 2023-04-11 08:37:28 +02:00
a62693d611 New translations modals.json (Bengali) 2023-04-11 08:37:27 +02:00
421f195e1e New translations modals.json (Tamil) 2023-04-11 08:37:26 +02:00
b22dff523f New translations modals.json (Khmer) 2023-04-11 08:37:25 +02:00
58d0c6e315 New translations modals.json (Persian) 2023-04-11 08:37:24 +02:00
36178cac22 New translations landing.json (Nepali) 2023-04-11 08:37:24 +02:00
376786fa25 New translations landing.json (Amharic) 2023-04-11 08:37:23 +02:00
efceda1c55 New translations landing.json (Odia) 2023-04-11 08:37:22 +02:00
047e317c51 New translations landing.json (Kannada) 2023-04-11 08:37:21 +02:00
36ad63adb9 New translations landing.json (Malayalam) 2023-04-11 08:37:20 +02:00
45c88caf58 New translations landing.json (Hindi) 2023-04-11 08:37:20 +02:00
ca11a9217a New translations landing.json (Marathi) 2023-04-11 08:37:19 +02:00
fd6fbbba77 New translations landing.json (Bengali) 2023-04-11 08:37:18 +02:00
e2fb83bda9 New translations landing.json (Tamil) 2023-04-11 08:37:17 +02:00
40567e8f61 New translations landing.json (Khmer) 2023-04-11 08:37:16 +02:00
64c899b159 New translations modals.json (Indonesian) 2023-04-11 08:37:12 +02:00
b267cc4097 New translations modals.json (Vietnamese) 2023-04-11 08:37:11 +02:00
f4657b6592 New translations modals.json (Chinese Simplified) 2023-04-11 08:37:10 +02:00
6a2f512638 New translations modals.json (Ukrainian) 2023-04-11 08:37:10 +02:00
499005c21f New translations modals.json (Turkish) 2023-04-11 08:37:09 +02:00
0e18d3fc48 New translations modals.json (Serbian (Cyrillic)) 2023-04-11 08:37:08 +02:00
3b831c4eb4 New translations modals.json (Russian) 2023-04-11 08:37:07 +02:00
40564944ef New translations modals.json (Polish) 2023-04-11 08:37:06 +02:00
fdbb6d2e5b New translations modals.json (Norwegian) 2023-04-11 08:37:06 +02:00
398cd63082 New translations modals.json (Dutch) 2023-04-11 08:37:05 +02:00
efd4af14e5 New translations modals.json (Japanese) 2023-04-11 08:37:03 +02:00
889697fc31 New translations modals.json (Hungarian) 2023-04-11 08:37:02 +02:00
3aedf6618d New translations modals.json (Finnish) 2023-04-11 08:37:01 +02:00
abf42e13af New translations modals.json (Greek) 2023-04-11 08:37:00 +02:00
40bcbebadd New translations modals.json (Danish) 2023-04-11 08:36:59 +02:00
364f2e6d49 New translations modals.json (Czech) 2023-04-11 08:36:58 +02:00
7e5dfd75f9 New translations modals.json (Catalan) 2023-04-11 08:36:57 +02:00
b94d10c614 New translations modals.json (Bulgarian) 2023-04-11 08:36:57 +02:00
8c40b417ec New translations modals.json (Arabic) 2023-04-11 08:36:56 +02:00
1f17dfe6ea New translations landing.json (Indonesian) 2023-04-11 08:36:55 +02:00
be6ea1a224 New translations landing.json (Vietnamese) 2023-04-11 08:36:54 +02:00
583e9effae New translations builder.json (Nepali) 2023-04-11 08:36:53 +02:00
619b2757c8 New translations builder.json (Amharic) 2023-04-11 08:36:52 +02:00
9e27eee029 New translations builder.json (Odia) 2023-04-11 08:36:51 +02:00
c2d3c611e1 New translations builder.json (Kannada) 2023-04-11 08:36:50 +02:00
735f589e54 New translations builder.json (Malayalam) 2023-04-11 08:36:49 +02:00
1e3d6fbb77 New translations builder.json (Hindi) 2023-04-11 08:36:48 +02:00
3995e7159a New translations builder.json (Marathi) 2023-04-11 08:36:47 +02:00
6662acf0b0 New translations builder.json (Bengali) 2023-04-11 08:36:47 +02:00
feb8abca95 New translations builder.json (Tamil) 2023-04-11 08:36:46 +02:00
75c83bd91d New translations builder.json (Khmer) 2023-04-11 08:36:45 +02:00
f6d5897ed3 New translations landing.json (Chinese Simplified) 2023-04-11 08:36:44 +02:00
ed356763a1 New translations landing.json (Ukrainian) 2023-04-11 08:36:43 +02:00
4847246d84 New translations landing.json (Turkish) 2023-04-11 08:36:42 +02:00
a0ae6cb77e New translations landing.json (Serbian (Cyrillic)) 2023-04-11 08:36:42 +02:00
2aa2550be0 New translations landing.json (Russian) 2023-04-11 08:36:41 +02:00
df39913d49 New translations landing.json (Polish) 2023-04-11 08:36:40 +02:00
2225505d48 New translations landing.json (Norwegian) 2023-04-11 08:36:39 +02:00
afe20e61ee New translations landing.json (Dutch) 2023-04-11 08:36:38 +02:00
794e9c6511 New translations landing.json (Japanese) 2023-04-11 08:36:37 +02:00
e7e423bf29 New translations landing.json (Hungarian) 2023-04-11 08:36:35 +02:00
2173297207 New translations landing.json (Finnish) 2023-04-11 08:36:34 +02:00
b091cfa474 New translations landing.json (Greek) 2023-04-11 08:36:33 +02:00
057bb3a414 New translations landing.json (Czech) 2023-04-11 08:36:33 +02:00
c1442c9acc New translations landing.json (Catalan) 2023-04-11 08:36:32 +02:00
977f1beafd New translations landing.json (Bulgarian) 2023-04-11 08:36:31 +02:00
39ee710e97 New translations landing.json (Arabic) 2023-04-11 08:36:30 +02:00
1d1841c8db New translations builder.json (Indonesian) 2023-04-11 08:36:29 +02:00
3e44774ed4 New translations builder.json (Vietnamese) 2023-04-11 08:36:28 +02:00
9e2fa01896 New translations builder.json (Chinese Simplified) 2023-04-11 08:36:28 +02:00
7811f9840c New translations builder.json (Ukrainian) 2023-04-11 08:36:27 +02:00
34425c6200 New translations builder.json (Turkish) 2023-04-11 08:36:26 +02:00
46f9fc549a New translations builder.json (Serbian (Cyrillic)) 2023-04-11 08:36:25 +02:00
237abf359b New translations builder.json (Russian) 2023-04-11 08:36:24 +02:00
c5e8739009 New translations builder.json (Polish) 2023-04-11 08:36:23 +02:00
0ea8040977 New translations builder.json (Norwegian) 2023-04-11 08:36:22 +02:00
1f10e8efe3 New translations builder.json (Dutch) 2023-04-11 08:36:21 +02:00
8c2688670e New translations builder.json (Japanese) 2023-04-11 08:36:20 +02:00
bc5d49b568 New translations builder.json (Hungarian) 2023-04-11 08:36:19 +02:00
27ea84e720 New translations builder.json (Finnish) 2023-04-11 08:36:17 +02:00
0becb66bfd New translations builder.json (Greek) 2023-04-11 08:36:16 +02:00
11f88492e9 New translations builder.json (Czech) 2023-04-11 08:36:15 +02:00
ae3e01466f New translations builder.json (Catalan) 2023-04-11 08:36:14 +02:00
5d04dd8a83 New translations builder.json (Bulgarian) 2023-04-11 08:36:13 +02:00
52c15a8151 New translations builder.json (Arabic) 2023-04-11 08:36:12 +02:00
f6104e7051 Bump martinbeentjes/npm-get-version-action from 1.2.3 to 1.3.1
Bumps [martinbeentjes/npm-get-version-action](https://github.com/martinbeentjes/npm-get-version-action) from 1.2.3 to 1.3.1.
- [Release notes](https://github.com/martinbeentjes/npm-get-version-action/releases)
- [Commits](https://github.com/martinbeentjes/npm-get-version-action/compare/v1.2.3...v1.3.1)

---
updated-dependencies:
- dependency-name: martinbeentjes/npm-get-version-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-10 03:09:34 +00:00
ed710f6fe5 hotfix for docker CMD script 2023-04-06 15:41:00 +02:00
7e6e239d7f Merge pull request #1279 from AmruthPillai/i18n_main
New Crowdin updates
2023-04-06 15:04:42 +02:00
b4381a22f3 remove VERSION env dependency from server 2023-04-06 15:03:53 +02:00
ba6ca4d220 update build commands for pnpm on Dockerfile 2023-04-06 14:42:36 +02:00
5486906b05 use corepack to install pnpm, over regular method 2023-04-06 13:08:51 +02:00
7348b295cb upgrade gradle version from 7.4.0 to 7.4.2 2023-04-06 12:40:57 +02:00
025762fdf6 update Gradle distributions on Android App 2023-04-06 11:58:00 +02:00
96411cdb90 remove turbo from the workspace 2023-04-06 11:50:28 +02:00
835f453384 New translations dashboard.json (Italian) 2023-04-05 22:56:45 +02:00
cc475ae1e9 New translations common.json (Italian) 2023-04-05 22:56:44 +02:00
a5249ec646 New translations modals.json (Italian) 2023-04-05 22:56:42 +02:00
d0e3090421 New translations landing.json (Italian) 2023-04-05 22:56:39 +02:00
14f68c8937 New translations builder.json (Italian) 2023-04-05 22:56:37 +02:00
9c0c6076b3 update pnpm in dockerfile 2023-04-05 09:25:28 +02:00
36bf729161 update dependencies, fix typescript issues, optimize lodash imports 2023-04-05 09:06:49 +02:00
3a430ad98c bump up version to 3.6.19 2023-04-04 23:47:28 +02:00
90a8610dd7 update dependencies 2023-04-04 23:47:02 +02:00
d62ddab140 Merge pull request #1276 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.8.20
Bump org.jetbrains.kotlin.android from 1.8.10 to 1.8.20 in /app
2023-04-04 12:53:30 +02:00
ca0186bb67 Merge pull request #1268 from AmruthPillai/dependabot/docker/server/playwright-v1.32.1-focal
Bump playwright from v1.30.0-focal to v1.32.1-focal in /server
2023-04-04 12:44:15 +02:00
88ac8389ea Merge pull request #1267 from AmruthPillai/dependabot/github_actions/actions/checkout-3.5.0
Bump actions/checkout from 3.3.0 to 3.5.0
2023-04-04 11:38:14 +02:00
2f3864fff2 Merge pull request #1254 from AmruthPillai/dependabot/github_actions/docker/setup-buildx-action-2.5.0
Bump docker/setup-buildx-action from 2.4.0 to 2.5.0
2023-04-04 11:38:03 +02:00
7878e52cc4 Merge pull request #1227 from AmruthPillai/i18n_main
New Crowdin updates
2023-04-04 11:37:51 +02:00
08b1967a4e Bump org.jetbrains.kotlin.android from 1.8.10 to 1.8.20 in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.8.10 to 1.8.20.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/commits)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-03 03:02:02 +00:00
b870ca8297 New translations dashboard.json (Korean) 2023-04-01 21:34:54 +02:00
1507c54671 New translations common.json (Korean) 2023-04-01 21:34:53 +02:00
0984ca4daf New translations modals.json (Korean) 2023-04-01 21:34:51 +02:00
438798f8de New translations landing.json (Korean) 2023-04-01 21:34:49 +02:00
27aadb8948 New translations builder.json (Korean) 2023-04-01 21:34:47 +02:00
244a4118cf New translations common.json (Korean) 2023-04-01 20:24:02 +02:00
cde320ce46 New translations dashboard.json (Hebrew) 2023-03-30 11:44:14 +02:00
4772df7618 New translations modals.json (Hebrew) 2023-03-30 11:44:11 +02:00
ecb95b35f3 New translations landing.json (Hebrew) 2023-03-30 11:44:07 +02:00
24b09af563 New translations builder.json (Hebrew) 2023-03-30 11:44:03 +02:00
9471fb4169 New translations dashboard.json (Hebrew) 2023-03-30 10:38:01 +02:00
2f296d6f08 New translations common.json (Hebrew) 2023-03-30 10:38:00 +02:00
cd3d3caa15 New translations modals.json (Hebrew) 2023-03-30 10:37:57 +02:00
440eefe46e Bump playwright from v1.30.0-focal to v1.32.1-focal in /server
Bumps playwright from v1.30.0-focal to v1.32.1-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-27 02:59:00 +00:00
5787e2badb Bump actions/checkout from 3.3.0 to 3.5.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.3.0 to 3.5.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.3.0...v3.5.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-27 02:58:28 +00:00
c235e5ab16 Bump docker/setup-buildx-action from 2.4.0 to 2.5.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.4.0 to 2.5.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2.4.0...v2.5.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-13 02:59:14 +00:00
f584c70f27 New translations landing.json (Danish) 2023-02-17 04:15:04 +05:30
3aa0279519 New translations builder.json (Danish) 2023-02-17 04:15:00 +05:30
6830aec2f9 New translations landing.json (Danish) 2023-02-17 01:27:01 +05:30
9a3d7af325 New translations common.json (French) 2023-02-12 19:25:54 +05:30
52f7e8557f New translations modals.json (French) 2023-02-12 19:25:50 +05:30
12c17d1c7c New translations landing.json (French) 2023-02-12 19:25:47 +05:30
67918187a1 New translations builder.json (French) 2023-02-12 19:25:46 +05:30
dcbc0c2b45 New translations dashboard.json (French) 2023-02-12 16:57:35 +05:30
26b6a741c2 New translations builder.json (French) 2023-02-12 16:57:29 +05:30
d7064129e8 Merge pull request #1225 from raphaelcangucu/feature.pt-BR
Translation fixes on LeftSideBar
2023-02-10 08:33:56 +05:30
279dd36a13 Fix translations for other languages 2023-02-08 19:19:48 -03:00
49e47b28de fix date and start to translate to pt-br 2023-02-08 15:43:23 -03:00
a782343e0a Merge pull request #1218 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.8.10
Bump org.jetbrains.kotlin.android from 1.8.0 to 1.8.10 in /app
2023-02-08 02:03:17 +05:30
1e7821a46d Merge pull request #1217 from AmruthPillai/dependabot/github_actions/docker/setup-buildx-action-2.4.0
Bump docker/setup-buildx-action from 2.3.0 to 2.4.0
2023-02-08 02:03:08 +05:30
f7bea5a218 Merge pull request #1216 from AmruthPillai/dependabot/github_actions/docker/build-push-action-4.0.0
Bump docker/build-push-action from 3.3.0 to 4.0.0
2023-02-08 02:02:57 +05:30
05fa4f3192 Merge pull request #1190 from AmruthPillai/i18n_main
New Crowdin updates
2023-02-08 02:02:46 +05:30
ed357f0ebc Merge pull request #1215 from C4illin/main
Add ISO 8601 option
2023-02-08 02:02:36 +05:30
1774832a58 Bump org.jetbrains.kotlin.android from 1.8.0 to 1.8.10 in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.8.0 to 1.8.10.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.8.10/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.8.0...v1.8.10)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-06 02:25:09 +00:00
2837befd52 Bump docker/setup-buildx-action from 2.3.0 to 2.4.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.3.0 to 2.4.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2.3.0...v2.4.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-06 02:20:21 +00:00
38d866c0c2 Bump docker/build-push-action from 3.3.0 to 4.0.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.3.0 to 4.0.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3.3.0...v4.0.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-06 02:20:16 +00:00
87c7acf4f1 New translations modals.json (Swedish) 2023-02-06 01:53:14 +01:00
1bd68118ce New translations landing.json (Swedish) 2023-02-06 01:53:11 +01:00
5c34b28c80 New translations builder.json (Swedish) 2023-02-06 01:53:08 +01:00
c550183720 Add ISO 8601 option 2023-02-05 23:28:21 +01:00
3605579b1b Merge pull request #1206 from AmruthPillai/dependabot/github_actions/docker/setup-buildx-action-2.3.0
Bump docker/setup-buildx-action from 2.2.1 to 2.3.0
2023-01-30 08:40:37 +01:00
fa2e28688f Merge pull request #1207 from AmruthPillai/dependabot/docker/server/playwright-v1.30.0-focal
Bump playwright from v1.29.2-focal to v1.30.0-focal in /server
2023-01-30 08:40:27 +01:00
20f1031e28 Bump playwright from v1.29.2-focal to v1.30.0-focal in /server
Bumps playwright from v1.29.2-focal to v1.30.0-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-30 02:17:52 +00:00
292cb6d0ed Bump docker/setup-buildx-action from 2.2.1 to 2.3.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.2.1 to 2.3.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2.2.1...v2.3.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-30 02:16:52 +00:00
45f2dc1cfc Merge pull request #1195 from busches/castform-masthead-spacing
fix: extra whitespace in Castform header
2023-01-23 13:10:56 +01:00
e319dd3e3d fix: extra whitespace in Castform header
Using the Castform template without a summary, still has extra whitespace for the summary. This commit fixes the extra whitespace to not appear when no summary is present.
2023-01-22 17:48:27 -06:00
9678f7a6e5 New translations modals.json (Portuguese) 2023-01-22 22:58:07 +01:00
0cca4e21fb New translations landing.json (Portuguese) 2023-01-22 22:58:04 +01:00
f6758f191d New translations builder.json (Portuguese) 2023-01-22 22:58:01 +01:00
983662f877 New translations common.json (German) 2023-01-21 00:50:00 +01:00
c7fc28a5c5 New translations modals.json (German) 2023-01-21 00:49:57 +01:00
1f7c33e805 New translations common.json (German) 2023-01-20 23:41:22 +01:00
437cc331a8 New translations landing.json (German) 2023-01-20 23:41:15 +01:00
aef51375b8 New translations builder.json (German) 2023-01-20 23:41:14 +01:00
bdd65968e5 New translations dashboard.json (Spanish) 2023-01-20 19:04:27 +01:00
061a789c18 New translations modals.json (Spanish) 2023-01-20 19:04:23 +01:00
68507d0501 New translations builder.json (Spanish) 2023-01-20 19:04:19 +01:00
1e28c5adfa New translations modals.json (Romanian) 2023-01-20 10:41:28 +01:00
3b09550ebd New translations landing.json (Romanian) 2023-01-20 10:41:25 +01:00
16aef9cbec New translations builder.json (Romanian) 2023-01-20 10:41:22 +01:00
b24da90ba7 bump up version to 3.6.18 2023-01-19 07:55:12 +01:00
2aa7dbd3ad Merge pull request #1188 from AmruthPillai/feat/implement-self-serve-account-deletion
[Feature] Implement Self-Serve Account Deletion
2023-01-19 07:53:49 +01:00
9f8f2c4b8b remove console.log 2023-01-19 07:52:59 +01:00
5331ecccc1 i18n-ize the user profile modal 2023-01-19 07:51:43 +01:00
f2ec86940c Merge branch 'main' into feat/implement-self-serve-account-deletion 2023-01-19 07:34:11 +01:00
cd74e707ba update dependencies 2023-01-19 07:33:15 +01:00
ff101dbfac [Feature] Implement Self-Serve Account Deletion 2023-01-19 00:11:15 +01:00
5024c19f87 fix error messages not displaying toasts sometimes, add axios error interceptors 2023-01-18 21:36:05 +01:00
c9850b5815 Merge pull request #1183 from AmruthPillai/i18n_main
New Crowdin updates
2023-01-18 20:37:54 +01:00
6fe4e7d7e1 Merge pull request #1184 from AmruthPillai/dependabot/github_actions/docker/build-push-action-3.3.0
Bump docker/build-push-action from 3.2.0 to 3.3.0
2023-01-16 10:53:29 +01:00
a5b8b91e82 Bump docker/build-push-action from 3.2.0 to 3.3.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.2.0 to 3.3.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3.2.0...v3.3.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-16 02:33:23 +00:00
cc7095adc3 New translations landing.json (Spanish) 2023-01-16 01:53:40 +01:00
e2703f55aa New translations builder.json (Spanish) 2023-01-16 01:53:37 +01:00
8c5849c988 Merge pull request #1172 from AmruthPillai/dependabot/github_actions/actions/checkout-3.3.0
Bump actions/checkout from 3.2.0 to 3.3.0
2023-01-09 10:02:35 +01:00
5322ab2420 Merge pull request #1173 from AmruthPillai/dependabot/docker/server/playwright-v1.29.2-focal
Bump playwright from v1.29.1-focal to v1.29.2-focal in /server
2023-01-09 10:02:27 +01:00
b84e6bcfb1 Bump playwright from v1.29.1-focal to v1.29.2-focal in /server
Bumps playwright from v1.29.1-focal to v1.29.2-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-09 02:06:20 +00:00
a4ab0174c7 Bump actions/checkout from 3.2.0 to 3.3.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.2.0 to 3.3.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.2.0...v3.3.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-09 02:05:40 +00:00
7e93b5a757 update dependencies 2023-01-04 22:15:13 +01:00
044820fa71 Update README.md 2023-01-04 16:05:30 +01:00
322178e8a4 Merge pull request #1165 from JadinHeaston/main
Fixing unconditional ```http://``` prefix.
2023-01-03 23:22:17 +01:00
6358fbad30 Adding check for ``addHttp()` to see if `mailto:` or `tel:`` is present.Signed-off-by: Jadin Heaston <jadin.heaston@como.gov> 2023-01-03 13:57:07 -06:00
d342c0a9af fix axios type issue 2023-01-03 17:17:35 +01:00
63084eebb4 feat(dependencies): ⬆️ update dependencies, fix date display issue, add more profile icons 2023-01-03 17:06:30 +01:00
3b4ea00db8 Merge pull request #1162 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.8.0
Bump org.jetbrains.kotlin.android from 1.7.22 to 1.8.0 in /app
2023-01-03 16:51:17 +01:00
c8f7bffe7e Merge pull request #1160 from coolswood/main
fix: Gengar two cols bug
2023-01-03 16:51:09 +01:00
3ff56f89d9 Merge pull request #1158 from AmruthPillai/i18n_main
New Crowdin updates
2023-01-03 16:50:48 +01:00
7fb9f27837 Bump org.jetbrains.kotlin.android from 1.7.22 to 1.8.0 in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.7.22 to 1.8.0.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.22...v1.8.0)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-01-02 02:04:34 +00:00
c9685d4ce7 fix: Gengar two cols bug 2022-12-31 10:01:54 +02:00
4dc987e27d New translations landing.json (Persian) 2022-12-30 19:09:41 +01:00
f7af06ae9a New translations builder.json (Persian) 2022-12-30 18:12:15 +01:00
a5c337faa3 Merge pull request #1151 from AmruthPillai/dependabot/github_actions/digitalocean/action-doctl-2.3.0
Bump digitalocean/action-doctl from 2.2.0 to 2.3.0
2022-12-30 11:48:34 +01:00
fc4704f0a6 Merge pull request #1150 from AmruthPillai/dependabot/docker/server/playwright-v1.29.1-focal
Bump playwright from v1.29.0-focal to v1.29.1-focal in /server
2022-12-30 11:48:25 +01:00
d968334ada Merge pull request #1155 from coolswood/main
fix: overflow-y-auto
2022-12-29 21:37:29 +01:00
fea6d23178 fix: overflow-y-auto 2022-12-29 19:37:47 +02:00
3fefc95572 Bump digitalocean/action-doctl from 2.2.0 to 2.3.0
Bumps [digitalocean/action-doctl](https://github.com/digitalocean/action-doctl) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/digitalocean/action-doctl/releases)
- [Commits](https://github.com/digitalocean/action-doctl/compare/v2.2.0...v2.3.0)

---
updated-dependencies:
- dependency-name: digitalocean/action-doctl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-26 02:04:49 +00:00
b07e7d1213 Bump playwright from v1.29.0-focal to v1.29.1-focal in /server
Bumps playwright from v1.29.0-focal to v1.29.1-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-26 02:04:31 +00:00
d47b8bfb03 Merge pull request #1139 from AmruthPillai/dependabot/github_actions/actions/checkout-3.2.0
Bump actions/checkout from 3.1.0 to 3.2.0
2022-12-19 10:22:44 +01:00
5bf7fbdae1 Merge pull request #1140 from AmruthPillai/dependabot/docker/server/playwright-v1.29.0-focal
Bump playwright from v1.28.1-focal to v1.29.0-focal in /server
2022-12-19 10:22:34 +01:00
fca766b382 Bump playwright from v1.28.1-focal to v1.29.0-focal in /server
Bumps playwright from v1.28.1-focal to v1.29.0-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-19 02:06:27 +00:00
feadfb1b67 Bump actions/checkout from 3.1.0 to 3.2.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.1.0...v3.2.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-19 02:06:19 +00:00
e69000f221 Merge pull request #1137 from AmruthPillai/feat/add-remark-gfm-math-plugins
feat(client):  add github flavored syntax and math equations to markdown support
2022-12-17 10:27:19 +01:00
6b4a54465a feat(client): add github flavored syntax and math equations to markdown support 2022-12-17 10:19:25 +01:00
878659999f Merge pull request #1135 from AmruthPillai/i18n_main
New Crowdin updates
2022-12-17 09:53:13 +01:00
1868c47e30 New translations common.json (Dutch) 2022-12-17 09:48:12 +01:00
51442efc23 New translations common.json (German) 2022-12-17 09:48:07 +01:00
556e962ec5 refactor(client): 📝 add link to subreddit 2022-12-16 22:56:23 +01:00
b5ce67f863 Update README.md 2022-12-16 18:06:46 +01:00
c3ce89dc3a Update README.md 2022-12-16 18:04:22 +01:00
e87930c758 bump version to 3.6.16 2022-12-16 17:59:58 +01:00
815a693e58 Merge pull request #1134 from AmruthPillai/feature/configure-gitpod
Configure Gitpod for easier development and self-hosting
2022-12-16 17:58:50 +01:00
8287fcae96 add gitpod to README.md 2022-12-16 17:58:38 +01:00
cd7fe6c404 Remove .env.gitpod 2022-12-16 15:58:22 +00:00
d47d5dd819 build and run project finally, in gitpod 2022-12-16 16:52:37 +01:00
1919d79e43 fix url host parsing 2022-12-16 15:50:43 +00:00
ab08cd9e34 add sync await/done 2022-12-16 16:46:26 +01:00
2522bdd0a2 add onOpen: ignore to postgres port 2022-12-16 16:42:02 +01:00
f9b6aefffe create .env generation script 2022-12-16 16:39:29 +01:00
2ba6658a0b add CORS to server, input appUrl 2022-12-16 15:04:08 +00:00
dbc46f27a3 add postgres port 2022-12-16 14:12:43 +00:00
f21e1caed1 trying this now 2022-12-16 15:09:43 +01:00
4ffe2a6330 add 2022-12-16 15:03:22 +01:00
1bc0438872 remove 2022-12-16 15:03:06 +01:00
57fb9fdaea add dockerfile support to gitpod.yml 2022-12-16 14:01:17 +00:00
58ce641f18 add postgres to gitpod 2022-12-16 13:56:08 +00:00
5f4e7802e4 Merge branch 'main' into feature/configure-gitpod 2022-12-16 13:44:46 +00:00
42d3109ae1 Merge pull request #1128 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.7.22
Bump org.jetbrains.kotlin.android from 1.7.21 to 1.7.22 in /app
2022-12-16 14:43:57 +01:00
f7ca7b97fa Merge pull request #1127 from AmruthPillai/dependabot/docker/server/playwright-v1.28.1-focal
Bump playwright from v1.28.0-focal to v1.28.1-focal in /server
2022-12-16 14:43:51 +01:00
f5d8a54134 Merge pull request #1130 from Jack-Kingdom/main
Fix: wait for networkidle event to ensure image load
2022-12-16 14:43:43 +01:00
eaec14dc62 initial gitpod configuration 2022-12-16 13:42:03 +00:00
c93b3264cd Bump playwright from v1.28.0-focal to v1.28.1-focal in /server
Bumps playwright from v1.28.0-focal to v1.28.1-focal.

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-16 13:34:56 +00:00
bf41aa9c6c feat(sentry): remove sentry integration 2022-12-16 14:34:15 +01:00
8af6bfd5ae Fix: wait for networkidle event to ensure image load 2022-12-10 02:55:38 +08:00
ab08c10874 Bump org.jetbrains.kotlin.android from 1.7.21 to 1.7.22 in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.7.21 to 1.7.22.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.21...v1.7.22)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-05 02:08:23 +00:00
9af9a0284e set sentry user ID, if available and applicable 2022-12-03 00:15:08 +01:00
716a05032d one more attempt to fix sentry auth issue 2022-12-02 23:54:25 +01:00
43e43e7d76 one more attempt to fix sentry auth issue 2022-12-02 23:44:51 +01:00
c91af3668d attempt to fix sentry auth issue 2022-12-02 23:32:04 +01:00
52f41f0b3b bump version to v3.6.15 2022-12-02 23:22:54 +01:00
3b709d606b Merge pull request #1120 from AmruthPillai/feature/sentry-integration
[Feature] Sentry Integration (Optional for Self Hosted)
2022-12-02 23:21:59 +01:00
2e5fafac62 remove unnecessary envs 2022-12-02 23:21:00 +01:00
ea2aee2d25 add release version to sentry ci process 2022-12-02 23:16:48 +01:00
e36fbb5f64 Update .env.example 2022-12-02 22:13:07 +01:00
5221ef707b Merge branch 'main' into feature/sentry-integration 2022-12-02 22:10:58 +01:00
f0df806f01 remove link underline style 2022-12-02 22:10:08 +01:00
9d01d6a833 update version ot 3.6.14 2022-12-02 13:59:13 +01:00
1914ebb9ae fix links in PDF 2022-12-02 13:55:56 +01:00
686dba90c9 Merge pull request #1114 from tryallthethings/pdf-template-fix
Fix for links in PDFs, template fix
2022-12-02 13:41:37 +01:00
95dc3bf571 Merge pull request #1108 from tryallthethings/translation-fix
Translation fix
2022-12-02 13:37:35 +01:00
1c8fdbf848 Merge pull request #1107 from tryallthethings/main
fix: made some missing texts translatable
2022-12-02 13:37:25 +01:00
d8357c9959 Fix: Every other instance of invoked clsx hence adding it here as well. 2022-11-26 14:37:48 +01:00
90e994377b Fix: Adding quotation marks seems to fix #1112 2022-11-26 14:36:56 +01:00
82c6ee6d5d fix: Updated German translation. A lot of minor changes as well as rephrasing of whole sentences. This translation is now also 100% formal, instead of a mix of formal and informal. 2022-11-25 18:42:37 +01:00
7b615e73c3 fix: Changed German language description to formal 2022-11-25 18:42:00 +01:00
268e4a87fe Revert "fix: made some missing texts translatable"
This reverts commit deb4e0a0de.
2022-11-25 18:39:09 +01:00
73f8eb84c9 Revert "fix: Updated German translation. A lot of minor changes as well as rephrasing of whole sentences."
This reverts commit e0a42fd928.
2022-11-25 18:39:07 +01:00
a31ef89996 Revert "fix: Changed German language description to formal"
This reverts commit d6bca7ebab.
2022-11-25 18:38:55 +01:00
d6bca7ebab fix: Changed German language description to formal 2022-11-25 18:29:55 +01:00
e0a42fd928 fix: Updated German translation. A lot of minor changes as well as rephrasing of whole sentences. 2022-11-25 18:27:28 +01:00
deb4e0a0de fix: made some missing texts translatable
BREAKING CHANGE: locales without the new fields will display the field name
2022-11-25 18:22:29 +01:00
a687062866 Merge pull request #1105 from tryallthethings/patch-3
Update date.ts
2022-11-25 18:10:11 +01:00
700439c8a8 Update date.ts
Added a common date format for Germany.
2022-11-25 18:00:08 +01:00
fb09283e53 add some more properties for sentry 2022-11-25 13:07:40 +01:00
88ac365e03 use v1.28.0-focal instead of next-jammy 2022-11-25 11:52:14 +01:00
aec78cf875 lay the ground work for sentry integration 2022-11-25 11:32:57 +01:00
77c587681b using fetch instead of axios, should fix the issue 2022-11-24 22:25:23 +01:00
7ac8b906d9 add await 2022-11-24 22:16:00 +01:00
e9a5f86a6a using fetch instead of axios, server side 2022-11-24 22:14:01 +01:00
7238a3b50e some more logs 2022-11-24 22:01:00 +01:00
ebe13fa82e push a bunch of console.logs 2022-11-24 21:45:42 +01:00
6ee290a625 add logs to check what's wrong 2022-11-24 21:31:43 +01:00
69f2b7070f remove arm64 support for the time being, because of upstream support 2022-11-24 21:09:32 +01:00
11bea1c7c4 updating version to v3.6.13 2022-11-24 20:35:28 +01:00
68a1dc65c1 update pnpm-lock.yaml 2022-11-24 17:04:11 +01:00
4b1ce539d5 remove sentry integration 2022-11-24 16:58:36 +01:00
a6fbb8191d Update docker-build-push.yml 2022-11-24 16:32:22 +01:00
552ff281b8 I have no idea what I'm doing here. 2022-11-24 16:29:36 +01:00
54fad2f6d8 update docker-build-push.yml 2022-11-24 16:20:40 +01:00
78edcd7d0e fix typo in github workflow 2022-11-24 16:02:39 +01:00
a8034b21d5 attempting to fix github actions 2022-11-24 15:58:27 +01:00
f0e95905d2 trying out env instead of secrets 2022-11-24 15:44:28 +01:00
69a5276614 attempt to fix locale issue 2022-11-24 15:40:49 +01:00
2e62eea351 fix sentry issue: 28c5a41aea3c4435902046e56c435e56 2022-11-24 15:38:21 +01:00
13d972b8f3 update docker-build-push.yaml 2022-11-24 15:15:35 +01:00
03cb198e95 move from env to secrets 2022-11-24 15:11:55 +01:00
67ee55b502 fix env for sentry auth token 2022-11-24 15:01:33 +01:00
b5998d7f3a pass sentry token to docker build push step 2022-11-24 14:58:26 +01:00
f71cf99b77 remove .git from .dockerignore 2022-11-24 13:27:43 +01:00
a2092a6a39 revert version back to 3.6.12 2022-11-24 12:58:15 +01:00
43c09666a0 add sentry CLI to github actions 2022-11-24 11:42:03 +01:00
0da23f95fd Merge pull request #1101 from stonespheres/patch-1
Fix link typo
2022-11-24 11:25:17 +01:00
e8f44e2142 update pnpm-lock.yaml 2022-11-24 11:23:37 +01:00
fbb237e982 Fix link typo
Bad practice on my part for last commit - did not check before push.
Link under table of contents fixed and now directs to the documentation at https://docs.rxresu.me
2022-11-24 18:22:57 +08:00
7f7c1d7b87 update version to 3.6.13 2022-11-24 11:21:45 +01:00
be0b7f20f9 integrate sentry for error logging 2022-11-24 11:21:30 +01:00
0672988fff Merge pull request #1100 from stonespheres/patch-1
Fixed formatting and typos on README.md
2022-11-24 11:01:38 +01:00
75dad60cb5 Fixed formatting and typos on README.md
- Under Table of Contents: Fixed the formatting error for the link to the docs.
- Under Languages: fixed typo Ukranian -> Ukrainian
- Under Building from Source: ...head over to the doc's -> head over to the docs
2022-11-24 17:47:29 +08:00
0140e3fce0 update version to 3.6.12 2022-11-23 15:20:34 +01:00
42d0e14b98 fix styling issues and theme cascades across all templates 2022-11-23 15:20:04 +01:00
9a42d684fb add branching deploy condition 2022-11-23 14:15:36 +01:00
ab6ad65445 update github actions to a more streamlined workflow using gh matrix 2022-11-23 14:10:14 +01:00
b613764ccc fix matrix variable name 2022-11-23 13:59:25 +01:00
ac44d0489f change name of test action so as to not trigger further actions 2022-11-23 13:56:59 +01:00
c57e6fbbb8 fix versioning of github action package 2022-11-23 13:56:22 +01:00
6c6da215c8 add on: [workflow_dispatch] to test github action 2022-11-23 13:55:15 +01:00
be700c7629 Testing a new streamlined GitHub Actions workflow 2022-11-23 13:53:41 +01:00
b697f73492 fix #1096 2022-11-23 13:11:29 +01:00
3106f94989 - update version to v.3.6.11
- update dependencies to latest versions
2022-11-23 13:04:59 +01:00
50f41f73d5 Add detailed description to page title, to increase SEO 2022-11-23 12:57:07 +01:00
83e3f59e68 fix #1082 2022-11-23 12:47:29 +01:00
056c61e985 resolves #1061, resolves #1027, resolves #1007, resolves #1001, resolves #987, resolves #890, resolves #882, resolves #837 2022-11-23 12:24:17 +01:00
d1a1b68302 fix #1095: make PDF_DELETION_TIME optional, add default value 2022-11-23 11:51:28 +01:00
6bd7b9a50f Merge pull request #1092 from GETandSELECT/main
Update common.json - tiny translation error to German
2022-11-23 11:41:54 +01:00
e6967aab88 Update common.json 2022-11-22 10:03:14 +00:00
47e96803e3 fix password recovery link 2022-11-19 09:37:23 +01:00
f9ef4d0a64 fix max width of description 2022-11-18 09:42:59 +01:00
c4b4e6013f Merge pull request #1073 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.7.21
Bump org.jetbrains.kotlin.android from 1.7.20 to 1.7.21 in /app
2022-11-15 11:36:04 +01:00
24bbc46c32 Merge pull request #1075 from RobbeVanslambrouck/main
fix typos in English and Dutch translation
2022-11-15 11:35:54 +01:00
85bc9ef124 fix typos in English and Dutch translation 2022-11-14 17:29:09 +01:00
33755a8573 remove console.log 2022-11-14 10:06:19 +01:00
ab45321889 fixes #1074 2022-11-14 10:05:51 +01:00
940b310f64 Bump org.jetbrains.kotlin.android from 1.7.20 to 1.7.21 in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.7.20 to 1.7.21.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.20...v1.7.21)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-11-14 02:06:07 +00:00
8026241b6c release: v3.6.9 2022-11-13 14:28:47 +01:00
89b35392bd Merge pull request #1060 from sashokbg/feat/multiple_work_sections
feat: additional work sections
2022-11-13 10:28:28 +01:00
62eb239ec4 Merge pull request #1023 from klejejs/main
Add PDF file caching
2022-11-13 10:28:19 +01:00
7fdf8c1f0c Merge pull request #1069 from arvaid/main
fixed grammatical and stylistic errors in Hungarian translation
2022-11-07 09:28:00 +01:00
538697238a fixed grammatical and stylistic errors in Hungarian translation 2022-11-06 14:46:55 +01:00
7bc4a998fe feat: additional work sections 2022-11-03 17:59:15 +01:00
e33df485ab Merge pull request #951 from Leopere/patch-3
Cleanup superfluous docker-compose.yml declarations
2022-11-02 23:36:21 +01:00
36ae54fe17 Merge branch 'main' into patch-3 2022-11-02 23:36:13 +01:00
50958fd6df Merge pull request #1058 from klejejs/fix/zip_file_upload_crash
Fix server crash when non-zip file is uploaded
2022-10-26 07:57:49 +02:00
e9e595f0d0 Fix server crash when non-zip file is uploaded 2022-10-25 22:03:18 +03:00
43ddfba777 Add scheduled deletion for cached PDF files 2022-10-25 21:10:40 +03:00
78a32961d7 Add PDF file caching 2022-10-25 20:16:39 +03:00
9b1f3eda05 Merge pull request #1053 from AmruthPillai/i18n_main
New Crowdin updates
2022-10-24 07:58:36 +02:00
1154621e5c Merge pull request #1057 from AmruthPillai/dependabot/github_actions/docker/setup-buildx-action-2.2.1
Bump docker/setup-buildx-action from 2.1.0 to 2.2.1
2022-10-24 07:58:25 +02:00
e7aeee77a7 Merge pull request #1056 from AmruthPillai/dependabot/github_actions/digitalocean/action-doctl-2.2.0
Bump digitalocean/action-doctl from 2.1.1 to 2.2.0
2022-10-24 07:58:16 +02:00
fab3988a36 Bump docker/setup-buildx-action from 2.1.0 to 2.2.1
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.1.0 to 2.2.1.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2.1.0...v2.2.1)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 02:53:50 +00:00
354cad88d3 Bump digitalocean/action-doctl from 2.1.1 to 2.2.0
Bumps [digitalocean/action-doctl](https://github.com/digitalocean/action-doctl) from 2.1.1 to 2.2.0.
- [Release notes](https://github.com/digitalocean/action-doctl/releases)
- [Commits](https://github.com/digitalocean/action-doctl/compare/v2.1.1...v2.2.0)

---
updated-dependencies:
- dependency-name: digitalocean/action-doctl
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-24 02:53:45 +00:00
876f930f30 New translations builder.json (Indonesian) 2022-10-21 05:55:29 +02:00
5b3ea46f0f Merge pull request #1045 from AmruthPillai/dependabot/github_actions/docker/setup-buildx-action-2.1.0
Bump docker/setup-buildx-action from 2.0.0 to 2.1.0
2022-10-17 10:39:55 +02:00
37a2563c11 Merge pull request #1047 from AmruthPillai/dependabot/github_actions/docker/build-push-action-3.2.0
Bump docker/build-push-action from 3.1.1 to 3.2.0
2022-10-17 10:39:42 +02:00
cb977a146b Merge pull request #1046 from AmruthPillai/dependabot/github_actions/docker/login-action-2.1.0
Bump docker/login-action from 2.0.0 to 2.1.0
2022-10-17 10:39:31 +02:00
72b2551b6d Merge pull request #1044 from AmruthPillai/dependabot/github_actions/docker/setup-qemu-action-2.1.0
Bump docker/setup-qemu-action from 2.0.0 to 2.1.0
2022-10-17 10:39:22 +02:00
c94633e616 Bump docker/build-push-action from 3.1.1 to 3.2.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.1.1 to 3.2.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3.1.1...v3.2.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 02:21:39 +00:00
7fee2d670f Bump docker/login-action from 2.0.0 to 2.1.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 02:21:36 +00:00
837b06eb38 Bump docker/setup-buildx-action from 2.0.0 to 2.1.0
Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](https://github.com/docker/setup-buildx-action/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 02:21:33 +00:00
2b8860b21c Bump docker/setup-qemu-action from 2.0.0 to 2.1.0
Bumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](https://github.com/docker/setup-qemu-action/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 02:21:31 +00:00
3a7b98d30e Fix issue with variable accessor 2022-10-15 23:47:16 +02:00
284a39aa77 add libc6-compat to dockerfile 2022-10-15 01:27:06 +02:00
c14c9955dd modify docker-build-push action 2022-10-15 01:19:19 +02:00
4de787157a update dependencies 2022-10-15 01:10:10 +02:00
6bc6425a01 Merge pull request #1039 from AmruthPillai/i18n_main
New Crowdin updates
2022-10-15 01:03:08 +02:00
6051305908 New translations builder.json (Turkish) 2022-10-15 00:59:54 +02:00
5e13253454 New translations builder.json (Swedish) 2022-10-15 00:59:53 +02:00
c1fd2b40e3 New translations builder.json (Serbian (Cyrillic)) 2022-10-15 00:59:52 +02:00
fccf7a7b56 New translations builder.json (Russian) 2022-10-15 00:59:51 +02:00
5098b094db New translations builder.json (Portuguese) 2022-10-15 00:59:50 +02:00
7c1eb74aca New translations builder.json (Polish) 2022-10-15 00:59:49 +02:00
7f9ede8ff0 New translations builder.json (Norwegian) 2022-10-15 00:59:48 +02:00
172b23e429 New translations builder.json (Dutch) 2022-10-15 00:59:47 +02:00
f287ca6183 New translations builder.json (Korean) 2022-10-15 00:59:46 +02:00
7548e36aaf New translations builder.json (Japanese) 2022-10-15 00:59:45 +02:00
2f754616b4 New translations builder.json (Ukrainian) 2022-10-15 00:59:44 +02:00
dc51f6f9b2 New translations builder.json (Italian) 2022-10-15 00:59:43 +02:00
0cdac1d657 New translations builder.json (Hebrew) 2022-10-15 00:59:42 +02:00
c3cfe8ae7b New translations builder.json (Finnish) 2022-10-15 00:59:41 +02:00
08435c173b New translations builder.json (Greek) 2022-10-15 00:59:40 +02:00
62cc2d6eac New translations builder.json (German) 2022-10-15 00:59:39 +02:00
5a6f6e2b6c New translations builder.json (Danish) 2022-10-15 00:59:38 +02:00
2dfa8c04a1 New translations builder.json (Czech) 2022-10-15 00:59:37 +02:00
63e3f94d2d New translations builder.json (Catalan) 2022-10-15 00:59:36 +02:00
7f45a8cb7f New translations builder.json (Bulgarian) 2022-10-15 00:59:35 +02:00
4377ebb811 New translations builder.json (Arabic) 2022-10-15 00:59:35 +02:00
ed3af6975b New translations builder.json (Spanish) 2022-10-15 00:59:34 +02:00
7904905a8b New translations builder.json (Hungarian) 2022-10-15 00:59:33 +02:00
bd2e6d2bf2 New translations builder.json (French) 2022-10-15 00:59:32 +02:00
ae4e9e688e New translations builder.json (Chinese Simplified) 2022-10-15 00:59:31 +02:00
78c45b7019 New translations builder.json (Indonesian) 2022-10-15 00:59:30 +02:00
9a2fbbec4e New translations builder.json (Vietnamese) 2022-10-15 00:59:25 +02:00
93d751d9be New translations builder.json (Nepali) 2022-10-15 00:59:24 +02:00
9926ed2262 New translations builder.json (Odia) 2022-10-15 00:59:23 +02:00
62220d20e7 New translations builder.json (Kannada) 2022-10-15 00:59:22 +02:00
2f6108cd29 New translations builder.json (Malayalam) 2022-10-15 00:59:21 +02:00
7aeed37869 New translations builder.json (Hindi) 2022-10-15 00:59:20 +02:00
ed99659b7b New translations builder.json (Marathi) 2022-10-15 00:59:19 +02:00
5e33d00910 New translations builder.json (Bengali) 2022-10-15 00:59:18 +02:00
c00d0341e6 New translations builder.json (Tamil) 2022-10-15 00:59:17 +02:00
511ae036c2 New translations builder.json (Khmer) 2022-10-15 00:59:16 +02:00
1642ec9ba2 New translations builder.json (Persian) 2022-10-15 00:59:15 +02:00
1115bc2b69 New translations builder.json (Amharic) 2022-10-15 00:59:14 +02:00
27e5c7811c New translations builder.json (Romanian) 2022-10-15 00:59:13 +02:00
3b739f0bb7 New translations common.json (Marathi) 2022-10-15 00:56:28 +02:00
d937ba2056 New translations common.json (Khmer) 2022-10-15 00:56:25 +02:00
de110d7de1 New translations common.json (Vietnamese) 2022-10-15 00:56:23 +02:00
b03229b5e0 New translations common.json (Korean) 2022-10-15 00:56:16 +02:00
280fc73c7b New translations common.json (Hungarian) 2022-10-15 00:56:13 +02:00
677ad2a115 New translations common.json (Odia) 2022-10-15 00:56:12 +02:00
f394b26d18 New translations common.json (Nepali) 2022-10-15 00:56:11 +02:00
aab4e2e941 New translations common.json (Czech) 2022-10-15 00:55:50 +02:00
f0f552a635 Feature: Toggle Page Size between ISO A4 and US Letter 2022-10-15 00:54:59 +02:00
136e143e12 Merge pull request #1032 from kmkhant/main
FIX whole page reload when press enter
2022-10-13 19:16:16 +02:00
857e4b8670 Merge branch 'main' of https://github.com/kmkhant/Reactive-Resume 2022-10-13 20:45:28 +06:30
ff03d41d97 feat:add pressing return(enter) to submit modal 2022-10-13 20:40:51 +06:30
2bad37aaf3 Merge branch 'main' into main 2022-10-13 17:08:08 +06:30
3a40fbf78b Merge pull request #1036 from dnltsk/main
cleanup - removed temp thumbnail file
2022-10-13 09:43:41 +02:00
49c638fb18 Delete .DS_Store 2022-10-12 22:37:08 +02:00
50e8d60773 fix interest form reloads when press enter 2022-10-10 18:24:57 +06:30
bf157a8d1a Merge pull request #1030 from AmruthPillai/dependabot/github_actions/actions/checkout-3.1.0
Bump actions/checkout from 3.0.2 to 3.1.0
2022-10-10 08:31:58 +02:00
c4f5955fcd Merge pull request #1031 from SSHSRN/loginModal
Updated login modal
2022-10-10 08:31:48 +02:00
86d33b0f21 updated login modal
Signed-off-by: SRIHARI S <sshsrn@gmail.com>
2022-10-10 08:17:04 +05:30
56bca30639 Bump actions/checkout from 3.0.2 to 3.1.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.2 to 3.1.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.0.2...v3.1.0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-10 02:15:49 +00:00
eed3b76959 ignore axios ts error 2022-10-07 11:04:13 +02:00
615eb3ad5d update dependencies, update version to 3.6.7 2022-10-07 10:44:29 +02:00
b505199319 add Amharic language 2022-10-07 10:31:03 +02:00
91e55e642c Merge pull request #1025 from AmruthPillai/i18n_main
New Crowdin updates
2022-10-07 10:18:53 +02:00
f549d8749a New translations landing.json (French) 2022-10-07 10:18:05 +02:00
f31123659e Merge pull request #1020 from arefathi/amharic-locale
Completed Amharic translations
2022-10-07 10:12:59 +02:00
93633c9415 Completed Amharic translations 2022-10-04 14:14:28 +03:00
19b9fa4857 Merge pull request #1021 from Rohanfizz/main
Fixed digitalOcean Sponsor logo
2022-10-04 10:25:09 +02:00
a5c84214f9 Fixed digitalOcean Sponsor logo 2022-10-03 23:35:26 +05:30
65bb8b5ceb Worked on Amharic translations 2022-10-03 16:15:52 +03:00
06a11a1f2a Merge pull request #1018 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.7.20
Bump org.jetbrains.kotlin.android from 1.7.10 to 1.7.20 in /app
2022-10-03 07:20:15 +02:00
53eedc8500 Bump org.jetbrains.kotlin.android from 1.7.10 to 1.7.20 in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.7.10 to 1.7.20.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.7.20/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.10...v1.7.20)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-03 02:27:56 +00:00
4b2d9d7026 skip React.FC for App 2022-09-15 20:40:19 +02:00
045145ed67 upgrade version to v3.6.6 2022-09-15 19:57:46 +02:00
ec27e5e6ab fix language difference when printing resume 2022-09-15 19:49:57 +02:00
2faa15db5a Merge pull request #997 from AmruthPillai/i18n_main
New Crowdin updates
2022-09-13 07:00:22 +02:00
2c2893d5fc New translations common.json (Khmer) 2022-09-07 04:39:03 +02:00
19c7ebe8a4 Update README.md 2022-09-04 08:12:55 +02:00
c24847ac0b Update README.md 2022-09-04 08:10:54 +02:00
7137694832 update app version to 3.6.5 2022-08-29 20:44:24 +02:00
049de38da2 fix local storage upload of photo/avatar 2022-08-29 20:44:07 +02:00
17019e446b Update FUNDING.yml 2022-08-29 19:57:16 +02:00
d73ee7b7f8 reformat docker setup to remove traefik dependency 2022-08-29 09:03:23 +02:00
2c95dc2ac8 Merge pull request #990 from AymaneBoukrouh/main
update landing.json
2022-08-29 07:48:54 +02:00
e148dd3e82 Merge pull request #1 from AymaneBoukrouh/AymaneBoukrouh-fr-locale-fix
update landing.json
2022-08-28 21:42:43 +01:00
0aa2d61c55 update landing.json
Fix typo (mauvaiss -> mauvaise)
Fix innacuracy (pistage -> traçabilité), pistage (tracking) means car track, and not user tracking.
2022-08-28 21:40:07 +01:00
0b2c1ffd26 add ko, mr locales 2022-08-28 16:22:14 +02:00
a531e8cd89 Merge pull request #989 from AmruthPillai/i18n_main
New Crowdin updates
2022-08-28 15:50:51 +02:00
152e386141 New translations landing.json (Odia) 2022-08-28 15:50:22 +02:00
87189cd045 New translations landing.json (Kannada) 2022-08-28 15:50:21 +02:00
114b04a740 New translations landing.json (Malayalam) 2022-08-28 15:50:20 +02:00
383cde53df New translations landing.json (Bengali) 2022-08-28 15:50:19 +02:00
9bf98d3c49 New translations landing.json (Tamil) 2022-08-28 15:50:18 +02:00
e62f0a3f5e New translations landing.json (Persian) 2022-08-28 15:50:17 +02:00
10fb7b143a New translations landing.json (Indonesian) 2022-08-28 15:50:16 +02:00
67ba58e798 New translations landing.json (Vietnamese) 2022-08-28 15:50:15 +02:00
179cf99f83 New translations landing.json (Chinese Simplified) 2022-08-28 15:50:14 +02:00
81a51d487b New translations landing.json (Turkish) 2022-08-28 15:50:13 +02:00
b41b50565a New translations landing.json (Hindi) 2022-08-28 15:50:13 +02:00
8cd073eb62 New translations landing.json (Swedish) 2022-08-28 15:50:12 +02:00
f4f8502703 New translations landing.json (Russian) 2022-08-28 15:50:03 +02:00
0d079d7b24 New translations landing.json (Portuguese) 2022-08-28 15:50:02 +02:00
167f7c902f New translations landing.json (Polish) 2022-08-28 15:49:50 +02:00
7c630df927 New translations landing.json (Dutch) 2022-08-28 15:49:49 +02:00
b391c561e5 New translations landing.json (Italian) 2022-08-28 15:49:48 +02:00
4dbe015fbf New translations landing.json (Hungarian) 2022-08-28 15:49:47 +02:00
bae35b2614 New translations landing.json (Hebrew) 2022-08-28 15:49:46 +02:00
8b7719a198 New translations landing.json (Finnish) 2022-08-28 15:49:46 +02:00
39cf238de3 New translations landing.json (Greek) 2022-08-28 15:49:45 +02:00
98855ae230 New translations landing.json (German) 2022-08-28 15:49:44 +02:00
ab92cbf21e New translations landing.json (Danish) 2022-08-28 15:49:43 +02:00
388ab4e29a New translations landing.json (Czech) 2022-08-28 15:49:42 +02:00
bb18c59018 New translations landing.json (Arabic) 2022-08-28 15:49:41 +02:00
217ab6ab93 New translations landing.json (French) 2022-08-28 15:49:40 +02:00
12690b33d7 New translations landing.json (Spanish) 2022-08-28 15:49:36 +02:00
bff5173701 New translations builder.json (Indonesian) 2022-08-28 15:49:34 +02:00
821813d90d New translations builder.json (Vietnamese) 2022-08-28 15:49:33 +02:00
b1d3c4da5b New translations builder.json (Chinese Simplified) 2022-08-28 15:49:32 +02:00
39f962b440 New translations builder.json (Swedish) 2022-08-28 15:49:31 +02:00
b1cfd4b7c8 New translations builder.json (Serbian (Cyrillic)) 2022-08-28 15:49:31 +02:00
c98d4a6004 New translations builder.json (Russian) 2022-08-28 15:49:30 +02:00
a5ec1f8609 New translations builder.json (Portuguese) 2022-08-28 15:49:29 +02:00
b2c897660d New translations builder.json (Polish) 2022-08-28 15:49:28 +02:00
c1a7fe7354 New translations builder.json (Dutch) 2022-08-28 15:49:27 +02:00
b628c4a21b New translations builder.json (Italian) 2022-08-28 15:49:26 +02:00
5fb4935146 New translations builder.json (Persian) 2022-08-28 15:49:25 +02:00
ae5280435d New translations builder.json (Hungarian) 2022-08-28 15:49:24 +02:00
6451609d8f New translations builder.json (Finnish) 2022-08-28 15:49:24 +02:00
edfe79f580 New translations builder.json (Greek) 2022-08-28 15:49:23 +02:00
5d7318d46d New translations builder.json (German) 2022-08-28 15:49:22 +02:00
77428c1661 New translations builder.json (Danish) 2022-08-28 15:49:21 +02:00
a2e075df39 New translations builder.json (Czech) 2022-08-28 15:49:20 +02:00
63af1d2b69 New translations builder.json (Arabic) 2022-08-28 15:49:19 +02:00
99c5016762 New translations builder.json (Spanish) 2022-08-28 15:49:18 +02:00
44ff6caf27 New translations builder.json (French) 2022-08-28 15:49:17 +02:00
7d2981f7ce New translations landing.json (Bulgarian) 2022-08-28 15:49:16 +02:00
fcc5dd4bad New translations builder.json (Hebrew) 2022-08-28 15:49:15 +02:00
a9fb995d39 New translations builder.json (Tamil) 2022-08-28 15:49:14 +02:00
31a85bfaa6 New translations builder.json (Hindi) 2022-08-28 15:49:13 +02:00
51151a601e New translations builder.json (Bengali) 2022-08-28 15:49:08 +02:00
9931b22313 New translations builder.json (Odia) 2022-08-28 15:49:04 +02:00
fdf6b76c21 New translations builder.json (Kannada) 2022-08-28 15:49:03 +02:00
b4696301ed New translations builder.json (Malayalam) 2022-08-28 15:49:02 +02:00
294d7b5dab New translations builder.json (Bulgarian) 2022-08-28 15:49:00 +02:00
0430920f56 New translations landing.json (Catalan) 2022-08-28 15:48:59 +02:00
5444b4f5ab New translations landing.json (Romanian) 2022-08-28 15:48:58 +02:00
d649b7fc08 New translations dashboard.json (Marathi) 2022-08-28 15:48:58 +02:00
20b39c0b35 New translations dashboard.json (Korean) 2022-08-28 15:48:56 +02:00
8b87b054ee New translations common.json (Marathi) 2022-08-28 15:48:53 +02:00
5eb68e9e21 New translations landing.json (Japanese) 2022-08-28 15:48:53 +02:00
ec2606d625 New translations common.json (Korean) 2022-08-28 15:48:51 +02:00
9055010f61 New translations builder.json (Marathi) 2022-08-28 15:48:49 +02:00
9763b5c270 New translations builder.json (Ukrainian) 2022-08-28 15:48:48 +02:00
75c3bfe9e5 New translations builder.json (Norwegian) 2022-08-28 15:48:47 +02:00
7f39247655 New translations builder.json (Korean) 2022-08-28 15:48:46 +02:00
d6f11e7807 New translations builder.json (Japanese) 2022-08-28 15:48:45 +02:00
361a1e65d0 New translations builder.json (Catalan) 2022-08-28 15:48:44 +02:00
6fddbe0c59 New translations landing.json (Korean) 2022-08-28 15:48:43 +02:00
3412711f27 New translations landing.json (Serbian (Cyrillic)) 2022-08-28 15:48:42 +02:00
a4bfc17431 New translations landing.json (Khmer) 2022-08-28 15:48:41 +02:00
7c698ef9d2 New translations builder.json (Khmer) 2022-08-28 15:48:40 +02:00
e929faf9b0 New translations builder.json (Turkish) 2022-08-28 15:48:39 +02:00
e3ff18b6dd New translations landing.json (Nepali) 2022-08-28 15:48:37 +02:00
2734493ca4 New translations landing.json (Norwegian) 2022-08-28 15:48:36 +02:00
f0015143c6 New translations builder.json (Nepali) 2022-08-28 15:48:35 +02:00
8d97b195a0 New translations modals.json (Korean) 2022-08-28 15:48:33 +02:00
f30692196a New translations landing.json (Marathi) 2022-08-28 15:48:31 +02:00
242278edd1 New translations landing.json (Ukrainian) 2022-08-28 15:48:30 +02:00
162759c716 New translations modals.json (Marathi) 2022-08-28 15:48:29 +02:00
f0c6bd16f5 New translations builder.json (Romanian) 2022-08-28 15:48:28 +02:00
fac8a9d4ff fix ul > li styles, add docs link to pages 2022-08-28 15:38:52 +02:00
9ff1ffb0b9 Merge pull request #988 from AmruthPillai/feature/remove-docs
Feature Release: v3.6.3
2022-08-28 11:51:08 +02:00
79d3ef1306 docs(docs): 🗑️ remove docs app, include more i18n locales 2022-08-28 11:16:08 +02:00
f4a12285f5 Merge branch 'main' of github.com:AmruthPillai/Reactive-Resume 2022-08-28 10:57:49 +02:00
120ad827ad Merge pull request #986 from AmruthPillai/i18n_main
New Crowdin updates
2022-08-28 10:57:40 +02:00
a129b2033f New translations builder.json (Bengali) 2022-08-28 10:56:29 +02:00
372e508936 New translations builder.json (Hindi) 2022-08-28 10:56:28 +02:00
ce8ada2621 New translations builder.json (Malayalam) 2022-08-28 10:56:27 +02:00
d0563d2ec9 New translations builder.json (Kannada) 2022-08-28 10:56:26 +02:00
dacd4e311c New translations builder.json (Odia) 2022-08-28 10:56:25 +02:00
d6d016ba5d New translations builder.json (Finnish) 2022-08-28 10:56:12 +02:00
407ac990ac New translations builder.json (French) 2022-08-28 10:56:12 +02:00
895e9845fc New translations builder.json (Spanish) 2022-08-28 10:56:11 +02:00
859a44197d New translations builder.json (Arabic) 2022-08-28 10:56:10 +02:00
0b80f33d46 New translations builder.json (Czech) 2022-08-28 10:56:09 +02:00
f246a17038 New translations builder.json (Danish) 2022-08-28 10:56:08 +02:00
10c13d54be New translations builder.json (German) 2022-08-28 10:56:07 +02:00
66316b740b New translations builder.json (Greek) 2022-08-28 10:56:06 +02:00
ae94748abe New translations builder.json (Hebrew) 2022-08-28 10:56:05 +02:00
fe11be60d3 New translations builder.json (Portuguese) 2022-08-28 10:56:04 +02:00
1d3e47adb2 New translations builder.json (Italian) 2022-08-28 10:56:03 +02:00
fdd5f373c4 New translations builder.json (Dutch) 2022-08-28 10:56:02 +02:00
0f99d6cdfb New translations builder.json (Polish) 2022-08-28 10:56:01 +02:00
742865a66a New translations builder.json (Russian) 2022-08-28 10:56:00 +02:00
12dcf04981 New translations builder.json (Swedish) 2022-08-28 10:55:58 +02:00
c0d76eaf0e New translations builder.json (Chinese Simplified) 2022-08-28 10:55:57 +02:00
2f430a1d07 New translations builder.json (Vietnamese) 2022-08-28 10:55:57 +02:00
576b942027 New translations builder.json (Indonesian) 2022-08-28 10:55:56 +02:00
7df777ad0c New translations builder.json (Persian) 2022-08-28 10:55:55 +02:00
e5e30f290a New translations builder.json (Hungarian) 2022-08-28 10:55:54 +02:00
dcb476c28b New translations builder.json (Tamil) 2022-08-28 10:55:53 +02:00
e09f281461 New translations landing.json (Norwegian) 2022-08-28 10:55:52 +02:00
293f008f0a New translations landing.json (Japanese) 2022-08-28 10:55:51 +02:00
f9cd1c779f New translations landing.json (Catalan) 2022-08-28 10:55:51 +02:00
d931590374 New translations landing.json (Romanian) 2022-08-28 10:55:50 +02:00
907ffacca0 New translations dashboard.json (Ukrainian) 2022-08-28 10:55:49 +02:00
a263d54319 New translations dashboard.json (Serbian (Cyrillic)) 2022-08-28 10:55:48 +02:00
0d478e1286 New translations dashboard.json (Japanese) 2022-08-28 10:55:47 +02:00
08997a1728 New translations dashboard.json (Catalan) 2022-08-28 10:55:46 +02:00
688bb11844 New translations common.json (Ukrainian) 2022-08-28 10:55:45 +02:00
0bf4e0b2ae New translations common.json (Serbian (Cyrillic)) 2022-08-28 10:55:44 +02:00
60bbfb6703 New translations common.json (Norwegian) 2022-08-28 10:55:43 +02:00
706307b073 New translations common.json (Japanese) 2022-08-28 10:55:42 +02:00
3be18636ff New translations common.json (Catalan) 2022-08-28 10:55:42 +02:00
b2ee2f9d09 New translations common.json (Romanian) 2022-08-28 10:55:41 +02:00
fe54a2388e New translations dashboard.json (Romanian) 2022-08-28 10:55:40 +02:00
be170dd985 New translations landing.json (Ukrainian) 2022-08-28 10:55:39 +02:00
7fd26ad2c3 New translations landing.json (Serbian (Cyrillic)) 2022-08-28 10:55:38 +02:00
ec30aff4d1 New translations modals.json (Romanian) 2022-08-28 10:55:37 +02:00
0b3023989b New translations modals.json (Khmer) 2022-08-28 10:55:37 +02:00
3b96348183 New translations modals.json (Nepali) 2022-08-28 10:55:34 +02:00
30080b23cd New translations landing.json (Nepali) 2022-08-28 10:55:33 +02:00
b3ba1e5b56 New translations dashboard.json (Nepali) 2022-08-28 10:55:32 +02:00
bf72b557ca New translations builder.json (Nepali) 2022-08-28 10:55:31 +02:00
344fcb1078 New translations common.json (Nepali) 2022-08-28 10:55:30 +02:00
ddd71567c1 New translations modals.json (Ukrainian) 2022-08-28 10:55:29 +02:00
adc679a6e5 New translations modals.json (Serbian (Cyrillic)) 2022-08-28 10:55:29 +02:00
8f49536119 New translations modals.json (Norwegian) 2022-08-28 10:55:28 +02:00
750fedbd74 New translations modals.json (Japanese) 2022-08-28 10:55:27 +02:00
cd59ea7e9b New translations modals.json (Catalan) 2022-08-28 10:55:26 +02:00
5c1b44ddea New translations builder.json (Japanese) 2022-08-28 10:55:25 +02:00
eb6450a9de New translations builder.json (Norwegian) 2022-08-28 10:55:24 +02:00
0b620f41fc New translations builder.json (Ukrainian) 2022-08-28 10:55:24 +02:00
64e0e677d7 New translations builder.json (Bulgarian) 2022-08-28 10:55:23 +02:00
19ae1cf036 New translations builder.json (Turkish) 2022-08-28 10:55:22 +02:00
c221cef77f New translations builder.json (Khmer) 2022-08-28 10:55:21 +02:00
77e3dc2b16 New translations builder.json (Catalan) 2022-08-28 10:55:20 +02:00
9c9368acd5 New translations builder.json (Romanian) 2022-08-28 10:55:19 +02:00
22b91d3f94 feat(docker): add arm64 support 2022-08-28 09:57:15 +02:00
d844092d0f fix(client): 🎨 add style to make list item appear after bullet icon 2022-08-28 09:57:00 +02:00
b3e118fb8b New translations builder.json (Serbian (Cyrillic)) 2022-08-27 12:11:42 +02:00
fe37eb2791 fix(client): 💄 add overflow-y-scroll to left/right sidebar navigation 2022-08-26 08:06:47 +02:00
7902f67f4f feat: update app version to 3.6.2 2022-08-26 00:00:18 +02:00
57dd110187 Merge pull request #981 from AmruthPillai/i18n_main
New Crowdin updates
2022-08-25 10:06:11 +02:00
829375e87a New translations landing.json (Khmer) 2022-08-24 14:27:42 +02:00
0a15b4ebc9 New translations dashboard.json (Khmer) 2022-08-24 14:27:41 +02:00
2bff3fc20b New translations common.json (Khmer) 2022-08-24 14:27:40 +02:00
1e997fe67c bump up versions to v3.6.1 2022-08-23 08:04:25 +02:00
dbf06455e4 Merge pull request #980 from AmruthPillai/i18n_main
New Crowdin updates
2022-08-22 20:44:32 +02:00
42c7c9ade1 New translations modals.json (Odia) 2022-08-22 20:15:54 +02:00
36c19bac3f New translations modals.json (Kannada) 2022-08-22 20:15:53 +02:00
44a9300aff New translations modals.json (Malayalam) 2022-08-22 20:15:52 +02:00
610b5ba9d4 New translations modals.json (Hindi) 2022-08-22 20:15:51 +02:00
769e8811cd New translations modals.json (Bengali) 2022-08-22 20:15:50 +02:00
676fbcafe7 New translations modals.json (Tamil) 2022-08-22 20:15:49 +02:00
3935ae1e04 New translations modals.json (Indonesian) 2022-08-22 20:15:41 +02:00
ef6b765266 New translations modals.json (Persian) 2022-08-22 20:15:40 +02:00
647dd6e682 New translations modals.json (Vietnamese) 2022-08-22 20:15:39 +02:00
43841e9962 New translations modals.json (Chinese Simplified) 2022-08-22 20:15:38 +02:00
e2236c3207 New translations modals.json (German) 2022-08-22 20:15:37 +02:00
7389d33ee5 New translations modals.json (Greek) 2022-08-22 20:15:25 +02:00
4b21eabec9 New translations modals.json (Dutch) 2022-08-22 20:15:24 +02:00
1815b0fa21 New translations modals.json (Hebrew) 2022-08-22 20:15:23 +02:00
6c4d3cbd56 New translations modals.json (Finnish) 2022-08-22 20:15:22 +02:00
8c2f3c8504 New translations modals.json (Turkish) 2022-08-22 20:15:21 +02:00
3aa7a98d9d New translations modals.json (Swedish) 2022-08-22 20:15:20 +02:00
5519ec898d New translations modals.json (Russian) 2022-08-22 20:15:19 +02:00
1cd4c5d733 New translations modals.json (Portuguese) 2022-08-22 20:15:18 +02:00
73d11c323f New translations modals.json (Polish) 2022-08-22 20:15:17 +02:00
38812fcf25 New translations modals.json (French) 2022-08-22 20:15:16 +02:00
c22de12f12 New translations modals.json (Spanish) 2022-08-22 20:15:15 +02:00
c94c971599 New translations modals.json (Arabic) 2022-08-22 20:15:13 +02:00
c9a71a5917 New translations modals.json (Czech) 2022-08-22 20:15:12 +02:00
8a29387470 New translations modals.json (Danish) 2022-08-22 20:15:11 +02:00
592511b090 New translations modals.json (Hungarian) 2022-08-22 20:15:10 +02:00
af63fd38d4 New translations modals.json (Italian) 2022-08-22 20:15:09 +02:00
bf38b1b254 New translations modals.json (Bulgarian) 2022-08-22 20:14:23 +02:00
4a1c0079db Merge pull request #979 from AmruthPillai/feature/turbo
Implement Turbo Workspaces, add ARM64 support, fix Google OAuth etc.
2022-08-22 19:59:43 +02:00
5b6f6b7621 use nodemailer/smtp instead of sendgrid 2022-08-22 19:26:13 +02:00
02587255fe update version to 3.6.0 2022-08-22 15:24:30 +02:00
9ef2a84ac2 update examples for reaching client/server in .env 2022-08-22 12:44:50 +02:00
77b1c5b536 update Dockerfile 2022-08-22 12:17:41 +02:00
bf956fe18c use @react-oauth/google library for google auth 2022-08-22 11:26:30 +02:00
4114f1e1dd remove timeouts in CI 2022-08-22 09:34:35 +02:00
668d39fa87 change tagname of docker image 2022-08-22 09:17:32 +02:00
0d88a18757 remove husky, lint-staged 2022-08-21 22:18:27 +02:00
0630369087 Implement Turbo Workspaces, among other things 2022-08-21 22:18:12 +02:00
73af4a6859 chore(dependencies): updating dependencies to latest versions 2022-08-21 00:44:11 +02:00
99ddeb25a9 Merge pull request #972 from AmruthPillai/i18n_main
New Crowdin updates
2022-08-17 08:46:38 +02:00
685aa06778 Merge pull request #974 from kgotso/main
Removed Check on hard coded urls
2022-08-15 22:57:01 +02:00
460abc6f1d Removed Check on hard coded urls
This forces the backend to continuously call home and break if no response is received
2022-08-15 19:43:32 +02:00
04f02157ac New translations builder.json (Turkish) 2022-08-14 21:41:45 +02:00
828a4a8715 Merge pull request #970 from m-GDEV/patch-1
Fixed small formatting issue in README
2022-08-13 09:23:43 +02:00
5b3141cd49 Fixed small formatting issue in README 2022-08-12 17:06:55 -04:00
779d22101f chore(release): 3.5.3 2022-08-11 20:21:55 +02:00
ef240b2110 add Bulgarian language, update dependencies 2022-08-11 20:21:19 +02:00
32bb7354a4 Merge pull request #969 from AmruthPillai/i18n_main
New Crowdin updates
2022-08-11 20:12:06 +02:00
0dcbad1f8a New translations modals.json (Bulgarian) 2022-08-11 10:27:23 +02:00
a74921b27a New translations builder.json (Bulgarian) 2022-08-11 10:27:21 +02:00
d4f47423c9 New translations common.json (Bulgarian) 2022-08-11 10:27:20 +02:00
03f9a6543c New translations dashboard.json (Bulgarian) 2022-08-11 10:27:18 +02:00
eb89cfcf5d New translations landing.json (Bulgarian) 2022-08-11 10:27:17 +02:00
c52ef9ecb7 Merge pull request #965 from AmruthPillai/dependabot/github_actions/docker/build-push-action-3.1.1
chore(deps): bump docker/build-push-action from 3.1.0 to 3.1.1
2022-08-08 05:53:47 +02:00
c499abbb88 chore(deps): bump docker/build-push-action from 3.1.0 to 3.1.1
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.1.0 to 3.1.1.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3.1.0...v3.1.1)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-08 02:15:50 +00:00
1a7ee88ecd chore(release): 3.5.2 2022-08-04 16:15:29 +02:00
16d19eb70f feat(client): 💫 add Finnish language support 2022-08-04 16:13:49 +02:00
331346b99c chore(dependencies): ⬆️ upgrading dependencies to latest versions 2022-08-04 16:10:33 +02:00
95d265f672 Merge pull request #956 from AmruthPillai/i18n_main
New Crowdin updates
2022-08-04 16:09:46 +02:00
315c7d6328 New translations modals.json (Finnish) 2022-07-31 22:22:32 +02:00
490e174564 New translations common.json (Finnish) 2022-07-31 22:22:30 +02:00
b5cde79f8b New translations builder.json (Finnish) 2022-07-31 22:22:29 +02:00
d50f14bb78 New translations dashboard.json (Finnish) 2022-07-31 22:22:28 +02:00
c13a751c1a New translations landing.json (Finnish) 2022-07-31 22:22:26 +02:00
5c37fc55d5 New translations builder.json (Indonesian) 2022-07-30 17:08:34 +02:00
48a0f90597 chore(release): 3.5.1 2022-07-30 13:01:00 +02:00
05d3f1f06f fix(server): don't initialize sendgrid if the apikey is empty 2022-07-30 12:57:35 +02:00
4d43f6a642 feat(client): ask for confirmation when resetting a resume 2022-07-30 12:56:40 +02:00
f7363ccdd7 Merge branch 'main' of github.com:AmruthPillai/Reactive-Resume 2022-07-30 12:56:13 +02:00
07c91e9ac2 feat(docker): remove ports from postgres docker instance 2022-07-30 12:56:04 +02:00
cbe08f1d2c Merge pull request #950 from AmruthPillai/dependabot/github_actions/docker/build-push-action-3.1.0
chore(deps): bump docker/build-push-action from 3.0.0 to 3.1.0
2022-07-30 12:43:46 +02:00
c2617a8277 Merge pull request #944 from AmruthPillai/i18n_main
New Crowdin updates
2022-07-30 12:43:36 +02:00
fe72d2de41 chore(release): 3.5.0 2022-07-30 12:42:31 +02:00
23667e218f chore(deps): updating project dependencies to their latest versions 2022-07-30 12:41:37 +02:00
977fa72dde fix(client): 🐛 fix mui rendering of utc dates 2022-07-30 12:21:05 +02:00
5197f954c0 fix(client): 🐛 attempt to fix the one-off date issue
use utc functions from dayjs to correspond to the same date on the server
2022-07-31 02:13:08 -08:00
58341e4cd2 New translations builder.json (Serbian (Cyrillic)) 2022-07-28 13:44:38 +02:00
fc0b69796f Cleanup superfluous docker-compose.yml declarations 2022-07-25 10:15:03 -04:00
1559703567 chore(deps): bump docker/build-push-action from 3.0.0 to 3.1.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v3.0.0...v3.1.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-25 02:24:03 +00:00
0a1fd50d07 New translations dashboard.json (Norwegian) 2022-07-17 03:00:38 +02:00
1c19062c63 chore(release): 3.4.8 2022-07-13 11:08:14 +02:00
25cf594eb9 feat(google): add toast to display error message from google 2022-07-13 11:05:27 +02:00
1c3beee6cd chore(deps): update dependencies 2022-07-13 09:40:29 +02:00
95c3d4c315 Merge pull request #937 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.7.10
chore(deps): bump org.jetbrains.kotlin.android from 1.7.0 to 1.7.10 in /app
2022-07-12 15:33:31 +02:00
85df339e56 chore(deps): bump org.jetbrains.kotlin.android in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.7.0 to 1.7.10.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.7.10/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.0...v1.7.10)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-11 02:40:56 +00:00
d61ad44ebc chore(release): 3.4.7 2022-07-01 01:04:52 +02:00
ccb1eff749 chore(mui): migrate from mui/lab to mui/x-date-pickers 2022-07-01 01:04:03 +02:00
bfb48e3aa7 fix(mui): update mui datepickers to newer package 2022-07-01 01:01:27 +02:00
e2e08ad390 Merge branch 'main' of github.com:AmruthPillai/Reactive-Resume 2022-07-01 00:50:17 +02:00
f0dda06af3 Merge pull request #932 from AmruthPillai/i18n_main
New Crowdin updates
2022-07-01 00:50:10 +02:00
4c4e77e21d New translations common.json (Portuguese) 2022-07-01 00:48:52 +02:00
f364ae8929 New translations common.json (Indonesian) 2022-07-01 00:48:49 +02:00
b52f292d89 New translations dashboard.json (Indonesian) 2022-07-01 00:48:32 +02:00
8cac7f907c New translations modals.json (Hebrew) 2022-07-01 00:48:25 +02:00
a18a60679f New translations builder.json (Hebrew) 2022-07-01 00:48:04 +02:00
5cc6a81b8c New translations landing.json (Hebrew) 2022-07-01 00:48:02 +02:00
6ff212b698 New translations dashboard.json (Hebrew) 2022-07-01 00:48:00 +02:00
56bcec5196 chore(deps): update dependencies across all projects 2022-07-01 00:46:41 +02:00
12019f90e9 Merge pull request #928 from ravindra3003/main
UpdateTutorial
2022-07-01 00:27:29 +02:00
7e6e69ed49 Update create-resume.mdx 2022-06-23 13:14:16 +05:30
a09a945e17 Update create-account.mdx 2022-06-23 13:12:21 +05:30
df714dc8de Update create-account.mdx 2022-06-22 15:47:01 +05:30
28b63ef0c7 Update create-account.mdx 2022-06-22 15:16:45 +05:30
1b594dac61 Update create-resume.mdx 2022-06-22 15:00:18 +05:30
dd34a30ee0 Update create-account.mdx 2022-06-22 12:09:18 +05:30
0af398ceed Update create-account.mdx 2022-06-22 11:45:45 +05:30
04abd2cacc Update create-account.mdx 2022-06-22 11:37:15 +05:30
a037a091e7 chore(release): 3.4.6 2022-06-19 20:55:23 +02:00
f3a4c17cb4 correct versions 2022-06-19 20:55:14 +02:00
f06f7ad2e5 chore(release): 3.6.2 2022-06-19 20:52:34 +02:00
aab2e5c8a9 correct versions 2022-06-19 20:52:24 +02:00
4318dbe762 add languages 2022-06-19 20:51:10 +02:00
ae3ff274ee updates to app 2022-06-19 20:44:28 +02:00
164403c495 chore(release): 3.4.6 2022-06-19 20:44:04 +02:00
8595c92fb7 Merge pull request #906 from dvd741-a/main
Add File based Storage toggle for Photos
2022-06-18 16:53:05 +02:00
8f75f32f88 Merge pull request #903 from AmruthPillai/i18n_main
New Crowdin updates
2022-06-18 16:52:54 +02:00
0d44189a5f Merge branch 'main' into i18n_main 2022-06-18 16:51:51 +02:00
cd16a6d360 Merge pull request #902 from Mhnramin/main
New translation for Bahasa (Indonesia)
2022-06-18 16:49:25 +02:00
7b795bfaa4 Merge pull request #914 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.7.0
chore(deps): bump org.jetbrains.kotlin.android from 1.6.21 to 1.7.0 in /app
2022-06-18 16:49:08 +02:00
8f78d47661 Change Dockerfile to include Volume 2022-06-18 14:21:10 +02:00
0b5e5a2ece New translations common.json (Hebrew) 2022-06-14 03:09:35 +05:30
9eade9514c chore(deps): bump org.jetbrains.kotlin.android in /app
Bumps [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) from 1.6.21 to 1.7.0.
- [Release notes](https://github.com/JetBrains/kotlin/releases)
- [Changelog](https://github.com/JetBrains/kotlin/blob/v1.7.0/ChangeLog.md)
- [Commits](https://github.com/JetBrains/kotlin/compare/v1.6.21...v1.7.0)

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-13 02:22:25 +00:00
d744e06e96 New translations builder.json (Persian) 2022-06-07 23:23:40 +05:30
9657c199d2 New translations common.json (Persian) 2022-06-07 23:23:39 +05:30
2dbe737b73 New translations dashboard.json (Persian) 2022-06-07 23:23:38 +05:30
f624699efa New translations landing.json (Persian) 2022-06-07 23:23:37 +05:30
e46f473754 New translations modals.json (Persian) 2022-06-07 23:23:36 +05:30
767f4bf4bc Correction 2022-06-06 15:41:08 +02:00
1c5d025c15 Version 2022-06-06 15:26:37 +02:00
8de8d89290 File Storage toggle 2022-06-06 15:15:39 +02:00
83662122a5 Changes 2022-06-06 02:31:44 +02:00
126482a760 chore(release): 3.6.1 2022-06-06 01:36:29 +02:00
b04c22a27b Changes 2022-06-06 01:35:46 +02:00
63f88a3d1c Changes 2022-06-06 01:34:58 +02:00
bd519db14f chore(release): 3.6.0 2022-06-06 01:32:56 +02:00
a49aa42176 New translations modals.json (Indonesian) 2022-06-05 12:49:38 +05:30
1a382db4d9 New translations builder.json (Indonesian) 2022-06-05 12:49:36 +05:30
c68f75dc8c New translations common.json (Indonesian) 2022-06-05 12:49:35 +05:30
c12de0c013 New translations dashboard.json (Indonesian) 2022-06-05 12:49:34 +05:30
4cafaf306a New translations landing.json (Indonesian) 2022-06-05 12:49:33 +05:30
0238cf18a5 New translation for Bahasa (Indonesia) 2022-06-05 08:16:49 +08:00
2f6072a7ba Merge pull request #889 from AmruthPillai/i18n_main
New Crowdin updates
2022-05-24 08:25:16 +05:30
55dd2c5925 Merge pull request #879 from AmruthPillai/dependabot/github_actions/docker/build-push-action-3.0.0
chore(deps): bump docker/build-push-action from 2.10.0 to 3.0.0
2022-05-24 08:25:05 +05:30
a3e25f87fa Merge pull request #878 from AmruthPillai/dependabot/github_actions/docker/login-action-2.0.0
chore(deps): bump docker/login-action from 1.14.1 to 2.0.0
2022-05-24 08:24:56 +05:30
9e82ea11c3 chore(release): 3.4.5 2022-05-24 08:23:03 +05:30
62fd63e41f fix(i18n): fix language mismatch in exported pdf 2022-05-24 08:21:03 +05:30
b91c175352 New translations builder.json (Arabic) 2022-05-18 19:51:52 +05:30
898e2314fc New translations builder.json (Arabic) 2022-05-18 18:39:53 +05:30
bca2aa2fe5 chore(deps): bump docker/build-push-action from 2.10.0 to 3.0.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2.10.0 to 3.0.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v2.10.0...v3.0.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-09 02:51:05 +00:00
427fdb717a chore(deps): bump docker/login-action from 1.14.1 to 2.0.0
Bumps [docker/login-action](https://github.com/docker/login-action) from 1.14.1 to 2.0.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](https://github.com/docker/login-action/compare/v1.14.1...v2.0.0)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-09 02:51:02 +00:00
ee5b0187e2 docs(i18n): add Hungarian language to docs readme 2022-05-02 09:01:50 +02:00
94d05f33b4 chore(release): v3.4.4 2022-05-02 08:59:36 +02:00
35fe4e2774 feat(i18n): add Hungrarian (Magyar) language 2022-05-02 08:58:25 +02:00
317901a4d2 Merge pull request #870 from AmruthPillai/i18n_main
New Crowdin updates
2022-05-02 08:50:01 +02:00
350ffcbc43 New translations builder.json (Odia) 2022-05-02 08:47:55 +02:00
2c074a96c8 New translations builder.json (Kannada) 2022-05-02 08:47:54 +02:00
79f140b2d0 New translations builder.json (Malayalam) 2022-05-02 08:47:53 +02:00
649c655ad5 New translations builder.json (Hindi) 2022-05-02 08:47:52 +02:00
d5284a90d1 New translations builder.json (Bengali) 2022-05-02 08:47:51 +02:00
bd18c53ab8 New translations builder.json (Tamil) 2022-05-02 08:47:50 +02:00
704c1ab7d4 New translations builder.json (Vietnamese) 2022-05-02 08:47:35 +02:00
1dbd7f221e New translations builder.json (Chinese Simplified) 2022-05-02 08:47:34 +02:00
e1a47ffbe2 New translations modals.json (Hungarian) 2022-05-02 08:47:33 +02:00
2add629970 New translations modals.json (Czech) 2022-05-02 08:47:31 +02:00
a48fcd9c97 New translations landing.json (Hungarian) 2022-05-02 08:47:29 +02:00
df7b00cb2c New translations builder.json (Turkish) 2022-05-02 08:47:28 +02:00
27fc939101 New translations builder.json (Portuguese) 2022-05-02 08:47:26 +02:00
7c574d17e4 New translations builder.json (Polish) 2022-05-02 08:47:25 +02:00
86a105f5a5 New translations builder.json (Dutch) 2022-05-02 08:47:25 +02:00
327bcc2b32 New translations builder.json (Italian) 2022-05-02 08:47:24 +02:00
a6cbd85010 New translations builder.json (Greek) 2022-05-02 08:47:23 +02:00
371b820923 New translations builder.json (German) 2022-05-02 08:47:22 +02:00
1d47fd0267 New translations builder.json (Danish) 2022-05-02 08:47:21 +02:00
276fc95bb0 New translations builder.json (Czech) 2022-05-02 08:47:20 +02:00
34c8861321 New translations builder.json (Arabic) 2022-05-02 08:47:19 +02:00
780b782579 New translations builder.json (French) 2022-05-02 08:47:18 +02:00
9daa99fd5b New translations builder.json (Spanish) 2022-05-02 08:47:16 +02:00
76b3aa29cf New translations landing.json (Czech) 2022-05-02 08:47:16 +02:00
25d4913fab New translations common.json (Hungarian) 2022-05-02 08:47:15 +02:00
0efeff3a4f New translations common.json (Czech) 2022-05-02 08:47:13 +02:00
f56089925e New translations builder.json (Swedish) 2022-05-02 08:47:12 +02:00
5afae08f20 New translations builder.json (Hungarian) 2022-05-02 08:47:11 +02:00
4bf114dfd6 New translations dashboard.json (Hungarian) 2022-05-02 08:47:09 +02:00
23a3c2e624 New translations dashboard.json (Czech) 2022-05-02 08:47:07 +02:00
71862f4354 New translations builder.json (Russian) 2022-05-01 15:42:24 +02:00
6861c0f0fa chore(release): 3.4.3 2022-05-01 08:03:37 +02:00
9a18e74b90 revert(react): downgrade back to 17.0.2 due to lack of support 2022-05-01 08:03:22 +02:00
4dd1b70079 remove linux/arm64 builds, failing temporarily 2022-04-30 13:39:23 +02:00
f9580fe716 chore(release): 3.4.2 2022-04-30 13:19:34 +02:00
3545f7939f remove linux/arm64 for server, as playwright does not support it 2022-04-30 13:19:08 +02:00
9caad3bc0b chore(release): 3.4.1 2022-04-30 13:01:59 +02:00
5bdb92b1cf fix(typeorm): update typeorm to latest 0.2.x for secpatch 2022-04-30 13:01:45 +02:00
87d381fe8e feat(all): upgrade to v3.4.0 2022-04-30 12:58:17 +02:00
ccfb4d3cb0 Merge pull request #867 from Tomiiwa/Table-of-Contents
[DOC] Added Table of Contents to ReadMe
2022-04-30 09:11:08 +02:00
763074a86c Added Table of Contents to ReadMe 2022-04-29 16:41:52 +01:00
0f46895711 Merge pull request #861 from AmruthPillai/dependabot/github_actions/actions/checkout-3.0.2
chore(deps): bump actions/checkout from 3.0.1 to 3.0.2
2022-04-25 09:34:20 +02:00
aa736af0f5 Merge pull request #858 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.6.21
chore(deps): bump org.jetbrains.kotlin.android from 1.6.20 to 1.6.21 in /app
2022-04-25 09:33:53 +02:00
1d9056f935 chore(deps): bump actions/checkout from 3.0.1 to 3.0.2
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.0.1...v3.0.2)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-25 03:11:03 +00:00
9cadd603f3 chore(deps): bump org.jetbrains.kotlin.android in /app
Bumps org.jetbrains.kotlin.android from 1.6.20 to 1.6.21.

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-25 03:08:55 +00:00
b7b62d7bd0 Merge pull request #853 from AmruthPillai/i18n_main
New Crowdin updates
2022-04-24 08:06:24 +02:00
820e6c90d3 New translations modals.json (Greek) 2022-04-22 15:06:52 +02:00
ea642d1b60 New translations landing.json (Greek) 2022-04-22 15:06:51 +02:00
ec006779a8 New translations common.json (Greek) 2022-04-22 15:06:47 +02:00
515be23c44 New translations dashboard.json (Greek) 2022-04-22 15:06:46 +02:00
c11aec8b44 Merge pull request #851 from AmruthPillai/i18n_main
New Crowdin updates
2022-04-22 07:14:41 +02:00
3c2147e72c New translations landing.json (Swedish) 2022-04-21 21:01:56 +02:00
15a35e6243 New translations modals.json (Swedish) 2022-04-21 21:01:53 +02:00
d53a5a492c New translations landing.json (Swedish) 2022-04-21 20:00:31 +02:00
0810e5ae6a Merge pull request #842 from AmruthPillai/i18n_main
New Crowdin updates
2022-04-20 09:21:40 +02:00
881b183db5 Merge pull request #844 from AmruthPillai/dependabot/github_actions/actions/checkout-3.0.1
chore(deps): bump actions/checkout from 3.0.0 to 3.0.1
2022-04-20 09:21:32 +02:00
15cea02872 Delete close-stale.yml 2022-04-19 06:45:45 +02:00
c195561df0 Merge pull request #843 from augustocardoso07/fix/page-counter
Fix page counter in the center section
2022-04-18 18:15:24 +02:00
fc725cfc0c chore(deps): bump actions/checkout from 3.0.0 to 3.0.1
Bumps [actions/checkout](https://github.com/actions/checkout) from 3.0.0 to 3.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3.0.0...v3.0.1)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-18 02:30:45 +00:00
9f54516e8c Fix page counter in the center section 2022-04-17 21:09:55 -03:00
68a4cd9635 New translations builder.json (Swedish) 2022-04-17 19:42:51 +02:00
ff01802f2f New translations common.json (Swedish) 2022-04-17 19:42:49 +02:00
bb900bc2e1 New translations dashboard.json (Swedish) 2022-04-17 19:42:48 +02:00
459f82b66b Merge pull request #828 from AmruthPillai/i18n_main
New Crowdin updates
2022-04-11 07:48:37 +02:00
4b382243e4 New translations modals.json (Odia) 2022-04-10 12:17:28 +02:00
af074085d1 New translations landing.json (Odia) 2022-04-10 12:17:25 +02:00
0c8c872668 New translations dashboard.json (Odia) 2022-04-10 12:17:25 +02:00
ddb29bb40d New translations common.json (Odia) 2022-04-10 12:17:23 +02:00
aecb627ab7 New translations builder.json (Odia) 2022-04-10 12:17:22 +02:00
b8cd53cb59 chore(release): 3.3.4 2022-04-09 22:02:26 +02:00
e61f6153c3 Merge pull request #823 from AmruthPillai/i18n_main
New Crowdin updates
2022-04-09 22:01:54 +02:00
386e8ab902 Merge pull request #827 from AmruthPillai/compose-envs
Remove YAML anchors and prefer Docker Compose Environment Arrays
2022-04-09 22:01:41 +02:00
5e8f02e3ca add local build context comment in docker-compose 2022-04-09 21:47:41 +02:00
f219562e72 style(eslint): client/next: add specific rule for no-html-link-for-pages 2022-04-09 21:25:19 +02:00
29d94dfc14 ci(docker): remove yaml anchors in favor of environment array in docker-compose
fix #825, fix #824, fix #820
2022-04-09 21:21:45 +02:00
622f5fc28c ci(github-actions): update key tags for GitHub action to build docker image 2022-04-09 09:33:44 +02:00
647f01e25c Merge branch 'main' of github.com:AmruthPillai/Reactive-Resume 2022-04-09 09:32:20 +02:00
5a79c0e5c2 chore(release): 3.3.3 2022-04-09 09:32:04 +02:00
2a4c298572 Merge pull request #819 from martadinata666/combine-tags
combine-tags
2022-04-09 09:30:46 +02:00
1e59f73f79 feat(profile): add XING profile icon
fix #821
2022-04-09 09:29:51 +02:00
feb911aea0 feat(s3): implement non-ephemeral storage through S3/DO Spaces 2022-04-09 09:28:08 +02:00
d0863d68c6 chore(release): 3.3.3 2022-04-09 09:26:34 +02:00
447d9b3ca1 New translations builder.json (Greek) 2022-04-08 19:35:17 +02:00
86e66eb6a0 combine-tags 2022-04-08 19:08:01 +07:00
b2c9515a63 Create SECURITY.md 2022-04-08 10:37:24 +02:00
db04c5caee update CHANGELOG.md 2022-04-08 10:34:27 +02:00
33526d5d13 chore(release): 3.3.2 2022-04-08 10:33:44 +02:00
fc77b548d8 fix(types/react): downgrade to <18 2022-04-08 10:33:06 +02:00
bf7a168f2e chore(release): 3.3.1 2022-04-08 09:50:34 +02:00
17b1551bab ci(buildx): buildx docker, remove arm/v7 for non-support 2022-04-08 09:50:23 +02:00
8864243558 update 2022-04-08 09:41:50 +02:00
37aab7a16f chore(release): 3.3.1 2022-04-08 09:40:46 +02:00
86e1bdf7ea chore(typescript): downgrade to "<4.6.0" 2022-04-08 09:40:34 +02:00
4547fd213d chore(release): 3.3.0 2022-04-08 09:39:01 +02:00
5aacec40cc chore(typescript): downgrade to "<4.6.0" 2022-04-08 09:38:41 +02:00
1df78100ca feat(upgrade): changes to code to support new template 2022-04-08 09:37:26 +02:00
9cd36fcb9b Merge pull request #817 from schklom/patch-2
Automatic multi-platform Docker image build
2022-04-08 08:24:17 +02:00
24b32eb917 Merge pull request #811 from klejejs/main
A new template - Leafish
2022-04-08 08:24:10 +02:00
dec0e41fec Merge pull request #806 from AmruthPillai/i18n_main
New Crowdin updates
2022-04-08 08:21:05 +02:00
42700ad2b2 Update docker-build-push.yml
QEMU + Docker Buildx + multi-platform
2022-04-07 18:32:39 +02:00
df51d79f6b Merge pull request #812 from AmruthPillai/dependabot/gradle/app/org.jetbrains.kotlin.android-1.6.20
Bump org.jetbrains.kotlin.android from 1.6.10 to 1.6.20 in /app
2022-04-04 09:57:39 +02:00
be1673a6a7 Bump org.jetbrains.kotlin.android from 1.6.10 to 1.6.20 in /app
Bumps org.jetbrains.kotlin.android from 1.6.10 to 1.6.20.

---
updated-dependencies:
- dependency-name: org.jetbrains.kotlin.android
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-04 02:21:29 +00:00
648f182e76 Added new template - Leafish 2022-04-03 20:23:06 +03:00
3aa56f0886 New translations landing.json (Portuguese) 2022-03-31 22:19:33 +02:00
b795534da7 New translations landing.json (Portuguese) 2022-03-31 21:13:27 +02:00
c67e2ac9f8 Merge pull request #791 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-28 16:44:24 +02:00
beb418bd5d chore(release): 3.2.11 2022-03-28 16:43:35 +02:00
2b3d9533b0 Merge pull request #797 from chandiwalaaadhar/fix/#795-No-Scrollbar-on-overflow
Fix-#795 No Scoll Behaviour on Overflow
2022-03-28 16:42:52 +02:00
b061f139bd Fix-#795 No Scoll Behaviour on Overflow 2022-03-28 19:56:54 +05:30
ac569324cf New translations common.json (Portuguese) 2022-03-25 15:24:14 +01:00
357d197bb3 New translations common.json (Portuguese) 2022-03-25 14:13:12 +01:00
5eed1186ff chore(release): 3.2.10 2022-03-24 11:59:03 +01:00
a87a9b3247 revert changes made to unreleased v3.2.10 2022-03-24 11:58:44 +01:00
7f1c82cd91 feat(i18n): add portuguese (pt) language to i18n locales 2022-03-24 11:57:16 +01:00
048c1ed3ed Merge pull request #764 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-24 11:54:48 +01:00
9a2570d7e7 New translations builder.json (Portuguese) 2022-03-24 11:46:44 +01:00
00b9c2156d chore(release): 3.2.10 2022-03-24 11:33:14 +01:00
ff8b22274f ci(docker): use docker compose yaml anchor values and extension fields 2022-03-24 11:32:57 +01:00
786937f847 ci(gh): add .devcontainer for GitHub Codespaces 2022-03-24 09:16:54 +00:00
c95efee8ec perf(security): generate random salt rounds integer 2022-03-24 08:45:22 +01:00
776d2f79a6 ci(dependabot): upgrade npm dependencies manually, using local chore 2022-03-24 08:38:54 +01:00
25a6b8cce6 chore(deps): update dependencies to latest 2022-03-24 08:37:57 +01:00
f6d7cae17b Merge pull request #789 from AmruthPillai/dependabot/npm_and_yarn/typeorm-0.3.3
Bump typeorm from 0.2.45 to 0.3.3
2022-03-24 08:16:39 +01:00
944a0b5fb1 Bump typeorm from 0.2.45 to 0.3.3
Bumps [typeorm](https://github.com/typeorm/typeorm) from 0.2.45 to 0.3.3.
- [Release notes](https://github.com/typeorm/typeorm/releases)
- [Changelog](https://github.com/typeorm/typeorm/blob/master/CHANGELOG.md)
- [Commits](https://github.com/typeorm/typeorm/compare/0.2.45...0.3.3)

---
updated-dependencies:
- dependency-name: typeorm
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:15:35 +00:00
7769653224 Merge pull request #782 from AmruthPillai/dependabot/npm_and_yarn/server/nestjs/config-2.0.0
Bump @nestjs/config from 1.2.1 to 2.0.0 in /server
2022-03-24 08:15:25 +01:00
ccdc5b5fae Merge pull request #781 from AmruthPillai/dependabot/npm_and_yarn/docs/types/react-17.0.42
Bump @types/react from 17.0.40 to 17.0.42 in /docs
2022-03-24 08:15:20 +01:00
20158f573e Merge pull request #779 from AmruthPillai/dependabot/npm_and_yarn/client/types/node-17.0.23
Bump @types/node from 17.0.21 to 17.0.23 in /client
2022-03-24 08:15:10 +01:00
87c60729b5 Merge branch 'main' into dependabot/npm_and_yarn/client/types/node-17.0.23 2022-03-24 08:14:59 +01:00
a03a50b7c6 Merge pull request #777 from AmruthPillai/dependabot/npm_and_yarn/server/googleapis-98.0.0
Bump googleapis from 97.0.0 to 98.0.0 in /server
2022-03-24 08:14:35 +01:00
fb85ccf501 Merge pull request #776 from AmruthPillai/dependabot/npm_and_yarn/client/types/react-17.0.42
Bump @types/react from 17.0.40 to 17.0.42 in /client
2022-03-24 08:14:31 +01:00
3179442d8f Merge pull request #773 from AmruthPillai/dependabot/github_actions/docker/build-push-action-2.10.0
Bump docker/build-push-action from 2.9.0 to 2.10.0
2022-03-24 08:14:27 +01:00
33d3c52cd9 Merge pull request #772 from AmruthPillai/dependabot/github_actions/digitalocean/action-doctl-2.1.1
Bump digitalocean/action-doctl from 2.1.0 to 2.1.1
2022-03-24 08:14:22 +01:00
1d33e01a43 Merge pull request #771 from AmruthPillai/dependabot/docker/client/node-17-alpine
Bump node from 16-alpine to 17-alpine in /client
2022-03-24 08:14:17 +01:00
52ff221dd1 Merge pull request #770 from AmruthPillai/dependabot/docker/server/node-17-alpine
Bump node from 16-alpine to 17-alpine in /server
2022-03-24 08:13:57 +01:00
5afe178e23 Update dependabot.yml 2022-03-24 08:13:38 +01:00
9118b76084 Bump @nestjs/config from 1.2.1 to 2.0.0 in /server
Bumps [@nestjs/config](https://github.com/nestjs/config) from 1.2.1 to 2.0.0.
- [Release notes](https://github.com/nestjs/config/releases)
- [Changelog](https://github.com/nestjs/config/blob/master/.release-it.json)
- [Commits](https://github.com/nestjs/config/compare/1.2.1...2.0.0)

---
updated-dependencies:
- dependency-name: "@nestjs/config"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:04:09 +00:00
5a62b527b9 Bump @types/react from 17.0.40 to 17.0.42 in /docs
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 17.0.40 to 17.0.42.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:04:08 +00:00
2e9e14dc72 Bump @types/node from 17.0.21 to 17.0.23 in /client
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 17.0.21 to 17.0.23.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:03:51 +00:00
0a0b4893aa Bump googleapis from 97.0.0 to 98.0.0 in /server
Bumps [googleapis](https://github.com/googleapis/google-api-nodejs-client) from 97.0.0 to 98.0.0.
- [Release notes](https://github.com/googleapis/google-api-nodejs-client/releases)
- [Changelog](https://github.com/googleapis/google-api-nodejs-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/googleapis/google-api-nodejs-client/compare/googleapis-v97.0.0...googleapis-v98.0.0)

---
updated-dependencies:
- dependency-name: googleapis
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:03:37 +00:00
6277f81e26 Bump @types/react from 17.0.40 to 17.0.42 in /client
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 17.0.40 to 17.0.42.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:03:35 +00:00
d550150787 Bump docker/build-push-action from 2.9.0 to 2.10.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 2.9.0 to 2.10.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v2.9.0...v2.10.0)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:41 +00:00
7626b2153f Bump digitalocean/action-doctl from 2.1.0 to 2.1.1
Bumps [digitalocean/action-doctl](https://github.com/digitalocean/action-doctl) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/digitalocean/action-doctl/releases)
- [Commits](https://github.com/digitalocean/action-doctl/compare/v2.1.0...v2.1.1)

---
updated-dependencies:
- dependency-name: digitalocean/action-doctl
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:38 +00:00
6d17d1001d Bump node from 16-alpine to 17-alpine in /client
Bumps node from 16-alpine to 17-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:34 +00:00
0273738d7a Bump node from 16-alpine to 17-alpine in /server
Bumps node from 16-alpine to 17-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-24 07:02:34 +00:00
322df25ecc Merge pull request #769 from modem7/dependabot-changes
Dependabot
2022-03-24 08:02:15 +01:00
ab3867d9a8 Merge pull request #768 from modem7/DockerChanges
Docker changes
2022-03-24 08:01:07 +01:00
9bf8ec88f4 Merge pull request #767 from modem7/readme-update
Update README
2022-03-24 07:58:58 +01:00
685f4d37a6 Merge pull request #766 from modem7/image-size
Reduced image sizes
2022-03-24 07:58:19 +01:00
f3b3fe8ac9 Update dependabot.yml
added gradle
2022-03-24 00:47:21 +00:00
d5fa49172a Create dependabot.yml
This will assist with version updates and vulnerability scans.

Dependabot scans will need to be enabled in the repo itself under https://github.com/AmruthPillai/Reactive-Resume/settings/security_analysis

It would also be worthwhile pairing this with Snyk (https://app.snyk.io/) for vulnerability monitoring.
2022-03-23 23:04:47 +00:00
b8303b9977 Update .env.example
Updated env variables to be clearer about which service requires it.
2022-03-23 23:03:29 +00:00
16d06c6356 Update README.md
As the logo is already in the repo, might as well utilise it.

Added Docker build status
2022-03-23 22:54:33 +00:00
79ddd887d9 Docker changes
Added:
Healthchecks
Changed Postgres to Alpine + pinned
Pinned Traefik Version
Made Env Vars easier to see + change/reference for those using their own env file.
2022-03-23 22:52:30 +00:00
c394bc6725 Reduced image sizes
This reduces images size from a total of 9.22mb to 6.11mb.
2022-03-23 22:41:24 +00:00
9e6d7630f4 New translations landing.json (Portuguese) 2022-03-23 23:06:12 +01:00
e2fbdd3c2f New translations modals.json (Portuguese) 2022-03-23 21:57:14 +01:00
849171af8f New translations dashboard.json (Portuguese) 2022-03-23 21:01:36 +01:00
884975dda6 chore(release): 3.2.9 2022-03-21 08:58:19 +01:00
03cbf22c9b feat(i18n): add nl and ru i18n locales to app 2022-03-21 08:57:47 +01:00
a10cee2efa Merge pull request #740 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-21 08:32:28 +01:00
479c94a11d Merge pull request #746 from GovindKrishnan/main
Cleaned Issue Templates Using Comments
2022-03-21 08:32:18 +01:00
c057f31e97 Merge pull request #750 from chandiwalaaadhar/fix/work-experience-website-link-redirects-404
Fixed URL 404 issue in Profile Section URL
2022-03-21 08:32:08 +01:00
d0bc9db6e5 Fixed issue in Profile Section URL 2022-03-21 06:14:22 +05:30
e2dd8dd1d7 Commenting Out Help Lines [FR Template]
To avoid clutter & increase readability of issues, I suggest commenting out the extra help tips so that they don't appear in the actual report.
2022-03-20 05:48:54 +05:30
f2ff12faa6 Commenting Out Help Lines [Bug Template]
To avoid clutter & increase readability of issues, I suggest commenting out the extra help tips so that they don't appear in the actual report.
2022-03-20 05:45:58 +05:30
50cc3d7da8 New translations modals.json (Russian) 2022-03-19 11:32:35 +01:00
60b1f7a816 New translations dashboard.json (Russian) 2022-03-19 11:32:31 +01:00
33d2bf043b New translations landing.json (Russian) 2022-03-19 10:16:47 +01:00
86b20dcae6 New translations builder.json (Russian) 2022-03-19 10:16:42 +01:00
caf4936c9b New translations dashboard.json (Russian) 2022-03-19 10:16:40 +01:00
7e864d2447 New translations common.json (Russian) 2022-03-19 10:16:38 +01:00
ff324688f6 Merge pull request #742 from GovindKrishnan/main
Linking Badges to Releases & License
2022-03-19 09:29:45 +01:00
efaeb1b341 Linking Badges to Releases & License (DOCS)
Linked the Version badge to Releases and License badge to MIT License.
2022-03-19 09:03:23 +05:30
488cb7f8a2 Linking Badges to Releases & License (README)
Linked the Version badge to Releases and License badge to MIT License.
2022-03-19 08:59:56 +05:30
974fa08651 New translations builder.json (Dutch) 2022-03-18 21:46:54 +01:00
8f3312e8a8 New translations landing.json (Dutch) 2022-03-18 20:46:24 +01:00
57d5da0490 New translations modals.json (Dutch) 2022-03-18 20:46:21 +01:00
daeb67319e New translations dashboard.json (Dutch) 2022-03-18 20:46:18 +01:00
213665bd1d New translations common.json (Dutch) 2022-03-18 20:46:16 +01:00
dfc48d6aa9 Merge pull request #738 from martadinata666/docusaurus-port-server
Update docusaurus to prevent crash with client
2022-03-18 19:38:40 +01:00
d71d40453f Update package.json 2022-03-18 23:23:30 +07:00
635afbc892 Merge pull request #737 from GovindKrishnan/main
Removed Self Referring Link in Docs
2022-03-18 16:47:30 +01:00
e90037e363 Removed Self Referring Link in Docs
Instead, linked to the GitHub Repo so that they can check out this repo.

If you got some other important link, feel free to change.
2022-03-18 20:07:57 +05:30
a730359736 chore(release): 3.2.8 2022-03-18 11:18:10 +01:00
80acfe97c7 fix(disable_user_signups): hide create account link under flag 2022-03-18 11:17:30 +01:00
b6267d07ba feat(flags): introduce flags, disable_user_signups
fix #698
2022-03-18 11:12:26 +01:00
910f764823 Merge pull request #735 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-18 10:56:08 +01:00
7a8f302c21 New translations common.json (Malayalam) 2022-03-18 10:55:35 +01:00
fb0c3b55c1 New translations common.json (Hindi) 2022-03-18 10:55:15 +01:00
f9579855a9 New translations common.json (Bengali) 2022-03-18 10:55:14 +01:00
0dd1e2720a New translations common.json (Vietnamese) 2022-03-18 10:55:14 +01:00
331d2d3d26 New translations common.json (Chinese Simplified) 2022-03-18 10:55:13 +01:00
f56554c2d4 New translations common.json (Turkish) 2022-03-18 10:55:11 +01:00
98131b389c New translations common.json (Portuguese) 2022-03-18 10:55:10 +01:00
7cfe6288e1 New translations common.json (Polish) 2022-03-18 10:55:09 +01:00
84041ef2ff New translations common.json (Italian) 2022-03-18 10:55:07 +01:00
9a2af8079e New translations common.json (German) 2022-03-18 10:54:55 +01:00
633162d9af New translations common.json (Danish) 2022-03-18 10:54:54 +01:00
50baa0227d New translations common.json (Kannada) 2022-03-18 10:54:44 +01:00
18da00f2e2 New translations common.json (Tamil) 2022-03-18 10:54:41 +01:00
f4f0b2c4b5 New translations common.json (Arabic) 2022-03-18 10:54:38 +01:00
b7d3007d31 New translations common.json (Spanish) 2022-03-18 10:54:37 +01:00
67384981c1 New translations common.json (French) 2022-03-18 10:54:36 +01:00
4390bccfb9 feat(i18n): add Vietnamese language to i18n locales 2022-03-18 10:52:06 +01:00
8f5632c5ad feat(client/theme): add theme switcher to landing page 2022-03-18 10:20:39 +01:00
1facd2ad11 fix(client/create-rename-slug): fix slug accepting apostrophes and other special characters
fix #706
2022-03-18 09:37:09 +01:00
0e1e2bbe4e chore(release): 3.2.7 2022-03-18 09:29:54 +01:00
3a2e62be4c feat(i18n): add Malayalam (മലയാളം) language to i18n locales 2022-03-18 09:27:04 +01:00
697ceef8f2 Merge branch 'main' of github.com:AmruthPillai/Reactive-Resume 2022-03-18 09:25:13 +01:00
c8e81a456d Merge pull request #731 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-18 09:25:09 +01:00
2b334e5c5a Merge pull request #727 from chandiwalaaadhar/fix/crash-on-pasting-hex-without-#-prefix
Fix-Crash on Entering Primary Color Hex Code without # Prefix
2022-03-18 09:24:54 +01:00
90321e1284 fix(printer/i18n): fix dates not showing up in resume language when printing
fix #729
2022-03-18 09:24:33 +01:00
9bcddb4b5c New translations modals.json (Malayalam) 2022-03-18 02:48:34 +01:00
72fdc05f69 New translations landing.json (Malayalam) 2022-03-18 02:48:33 +01:00
e1d6540500 New translations dashboard.json (Malayalam) 2022-03-18 02:48:32 +01:00
4b17719c69 New translations common.json (Malayalam) 2022-03-18 02:48:31 +01:00
da056307dd New translations builder.json (Malayalam) 2022-03-18 02:48:29 +01:00
e4950728d8 Refactored- Avoiding modifying the prop 2022-03-18 06:18:17 +05:30
dac4e862b8 Fix-Crash on Entering Primary Color Hex Code without # Prefix 2022-03-17 19:42:26 +05:30
5fa45ef5bd chore(release): 3.2.6 2022-03-17 14:05:31 +01:00
9e6dafc8ca fix(i18n): add missing languages to dayjs date wrapper locales
fix #719
2022-03-17 14:05:13 +01:00
a02b85b4bb fix(linkedin): fix skill modal crashing when importing from linkedin
fix #718
2022-03-17 13:58:49 +01:00
b3ff7805cd fix(json-export): add mimeType and charset to JSON export
fix #726
2022-03-17 13:11:18 +01:00
7f0ee40af4 feat(client/auth/google): disable google login/registration if GOOGLE_CLIENT_ID is not in ENV
fix #724
2022-03-17 12:17:41 +01:00
39fa6da5dd feat(i18n): add arabic language to i18n locale 2022-03-17 12:16:25 +01:00
7fd96a4540 Merge pull request #723 from GovindKrishnan/main
Adding Contributors Wall to README
2022-03-17 07:07:03 +01:00
8f5832b2ca Merge branch 'main' into main 2022-03-17 11:34:46 +05:30
58ce09ee06 Contributors Wall to index.mdx 2022-03-17 11:32:40 +05:30
3f5323d5a3 Update bug-report.md 2022-03-17 07:02:09 +01:00
d62482b280 Merge pull request #722 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-17 06:53:14 +01:00
a609ea551a Merge pull request #720 from chandiwalaaadhar/fix/shared-resume-not-scrollable-on-phone-screen
Fix- Resume Shared is not Scrollable on Phone Screen
2022-03-17 06:52:55 +01:00
1f8e3647d3 Styling 2022-03-16 22:20:58 +05:30
76975ddc6c Adding Contributors Wall to README
Using an open-source web tool called contrib.rocks that sync daily with Contributors Club.

Sort of experimental as I came across this today. But yea, it does no harm to production to say the least. 😅
2022-03-16 22:11:33 +05:30
6ed0bb62b4 New translations modals.json (Arabic) 2022-03-16 17:34:58 +01:00
11d15d8dbb New translations builder.json (Arabic) 2022-03-16 17:34:55 +01:00
7cf92ddb81 New translations dashboard.json (Arabic) 2022-03-16 17:34:53 +01:00
d907b36d59 New translations landing.json (Arabic) 2022-03-16 16:22:21 +01:00
307b626189 Fix- Shared Resume not Scrollable on Phone Screen 2022-03-16 18:45:10 +05:30
f573e60079 Merge pull request #717 from chandiwalaaadhar/fix/integrations-empty-date-sections-not-loading
Fix-Json with Empty Date Strings in Sections doesn't get loaded in the Resume
2022-03-16 11:48:34 +01:00
d3c52476f7 Merge pull request #716 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-16 11:47:00 +01:00
4f9d2ea846 New translations modals.json (Vietnamese) 2022-03-16 09:10:28 +01:00
ec617d682e Revert "Fix- Language Modal Slider Component Label Text Overlapping"
This reverts commit 5a60c99df9.
2022-03-16 13:39:27 +05:30
72d3d46e88 Fix- Integration LinkedIn Empty Date 2022-03-16 13:36:21 +05:30
110797da9d Fix - Integration JSON Resume Empty Date 2022-03-16 13:32:59 +05:30
ab90a2e1dd Fix- Reactive Resume v2 Integration Empty Date 2022-03-16 13:29:37 +05:30
1a3c950847 New translations dashboard.json (Vietnamese) 2022-03-16 08:11:13 +01:00
7fcc792255 New translations landing.json (Vietnamese) 2022-03-16 08:11:10 +01:00
97a13f9f41 New translations builder.json (Vietnamese) 2022-03-16 08:11:08 +01:00
29f1afac9a New translations common.json (Vietnamese) 2022-03-16 08:11:03 +01:00
c5d0abdc79 Merge pull request #714 from chandiwalaaadhar/fix/publication-modal-label-text
Fix- Publication Modal Label text
2022-03-16 07:24:31 +01:00
5a60c99df9 Fix- Language Modal Slider Component Label Text Overlapping 2022-03-16 11:25:48 +05:30
7d188622a8 chore(release): 3.2.5 2022-03-16 06:50:18 +01:00
97e9432d6b feat(i18n): add danish, polish and turkish locales to i18n 2022-03-16 06:48:33 +01:00
c46b8fc162 Fix- Publication Modal Label text 2022-03-16 11:17:33 +05:30
b2f1fb3a55 fix(client/templates): fix text veering off of artboard in most templates
fix #702
2022-03-16 06:41:48 +01:00
4743828e6b chore(deps): update dependencies to match latest patch fixes 2022-03-16 06:40:49 +01:00
519fbbd1b2 Merge pull request #689 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-16 06:21:54 +01:00
ebc084ad52 Create FUNDING.yml 2022-03-16 06:09:50 +01:00
26fdd72610 New translations modals.json (Italian) 2022-03-15 16:28:53 +01:00
ea704c6d99 New translations modals.json (Chinese Simplified) 2022-03-15 16:28:52 +01:00
ea88044d25 New translations modals.json (Bengali) 2022-03-15 16:28:51 +01:00
a461cc147b New translations modals.json (Hindi) 2022-03-15 16:28:50 +01:00
5aefcae2ac New translations modals.json (German) 2022-03-15 16:28:40 +01:00
ba1e968510 New translations modals.json (Spanish) 2022-03-15 16:28:38 +01:00
ba12abe506 New translations modals.json (French) 2022-03-15 16:28:37 +01:00
29fb1dcca3 New translations modals.json (Kannada) 2022-03-15 16:28:14 +01:00
4be6c48aab New translations modals.json (Tamil) 2022-03-15 16:28:13 +01:00
ee1017aa25 Merge pull request #699 from chandiwalaaadhar/fix/pikachu-profile-image-uncontrolled-size
Fix - Pikachu User Image upload, uncontrolled Image Size
2022-03-15 16:25:19 +01:00
bf806c5ecf New translations dashboard.json (Italian) 2022-03-15 15:52:23 +01:00
bf9709ed8e New translations landing.json (Italian) 2022-03-15 15:52:21 +01:00
6c74ecfef7 New translations builder.json (Italian) 2022-03-15 15:52:17 +01:00
fb8c925037 New translations common.json (Italian) 2022-03-15 15:52:13 +01:00
c8c154c2f4 Merge pull request #701 from GovindKrishnan/main
Fixed a Typo in README
2022-03-15 15:15:39 +01:00
92b2c4b757 New translations modals.json (Polish) 2022-03-15 14:41:14 +01:00
260a354c22 New translations dashboard.json (Polish) 2022-03-15 14:41:11 +01:00
c67a969353 New translations landing.json (Polish) 2022-03-15 14:41:09 +01:00
8d61703250 New translations builder.json (Polish) 2022-03-15 14:41:04 +01:00
28df783bba New translations common.json (Polish) 2022-03-15 14:41:03 +01:00
51575a340b New translations modals.json (Danish) 2022-03-15 13:44:39 +01:00
8068d34bf3 New translations dashboard.json (Danish) 2022-03-15 13:44:35 +01:00
b154fae0fa New translations landing.json (Danish) 2022-03-15 13:44:34 +01:00
c5ba1730c3 New translations builder.json (Danish) 2022-03-15 13:44:29 +01:00
a7d90da30e New translations common.json (Danish) 2022-03-15 13:44:26 +01:00
0bbc54a97f Merge pull request #1 from GovindKrishnan/patch-1
Fixed Same Typos in index.mdx
2022-03-15 17:07:47 +05:30
2081f1344f Fixed Same Typos in index.mdx 2022-03-15 17:05:46 +05:30
d029607e16 Fixing Typos in README 2022-03-15 16:46:58 +05:30
5fe0c02cec Fixed a Typo in README
Very trivial. But still, here's my contribution! 😄 

After all, grammar is very important in resumes. 😉
2022-03-15 16:41:10 +05:30
70b45b3686 New translations modals.json (Turkish) 2022-03-15 11:49:35 +01:00
ff098d5df1 New translations landing.json (Turkish) 2022-03-15 11:49:30 +01:00
95d7d70caa New translations builder.json (Turkish) 2022-03-15 10:34:48 +01:00
107ba6e525 New translations common.json (Turkish) 2022-03-15 10:34:45 +01:00
f72e0556e5 Fix - Pikachu User Image after upload covers the center content 2022-03-15 05:57:50 +05:30
0ef975a177 chore(release): 3.2.4 2022-03-14 22:08:16 +01:00
eb9f5450df chore(donation): replace buymeacoffee links with paypal.me links 2022-03-14 22:08:04 +01:00
c7fffff495 chore(release): 3.2.3 2022-03-14 21:50:20 +01:00
42408ce8c5 feat(client/import): implement import json from reactive resume v2 2022-03-14 21:50:04 +01:00
7c49b50979 New translations builder.json (Czech) 2022-03-14 21:27:52 +01:00
59b2fc9fd6 New translations common.json (Portuguese) 2022-03-14 18:58:46 +01:00
f93ac987ac New translations dashboard.json (Turkish) 2022-03-14 16:52:59 +01:00
fb32f9b523 New translations common.json (Arabic) 2022-03-14 16:52:52 +01:00
ed78f8fc4e Merge pull request #687 from chandiwalaaadhar/fix/pikachu-masthead-asymmetric-basic-details
Fix-Pikachu Masthead Basic Details looks asymmetric Due to Centred Alignment
2022-03-14 15:51:16 +01:00
318145f007 Create CODE_OF_CONDUCT.md 2022-03-14 15:09:47 +01:00
c2a35a1066 Merge pull request #685 from chandiwalaaadhar/fix/work-experience-website-link-redirects-404
Fix - Work Experience Website Link Redirects to 404 if manually entered without http/https
2022-03-14 15:08:54 +01:00
541cfa784d Fix-Pikachu Masthead Asymmetric Basic Details 2022-03-14 19:38:49 +05:30
de53d8dfe7 Removed url && in the link prop 2022-03-14 19:32:12 +05:30
c28afbc75d Fix Work Experience Website Link redirects to 404 if entered without http or https 2022-03-14 19:12:36 +05:30
40e6227aa9 chore(release): 3.2.2 2022-03-14 10:28:29 +01:00
02e396bfdb fix(client/skills): make skill level optional 2022-03-14 10:26:57 +01:00
4dc83c1d7f docs(docker): update docs to add docker deployment example to droplet 2022-03-14 10:18:04 +01:00
143a123212 Create docker.mdx 2022-03-14 10:11:52 +01:00
c64b96619f docs(source-code): fix links to docker, local-build on source-code index page 2022-03-14 09:26:15 +01:00
ff35a2a95c chore(release): 3.2.1 2022-03-14 09:23:16 +01:00
549363bbe5 feat(i18n): add Chinese (Simplified) language to locales 2022-03-14 09:23:01 +01:00
e6bda688ac fix(client/basics): fix issue with overlapping photo filters on safari/webkit/iOS 2022-03-14 09:19:22 +01:00
64b0c5e7cf Merge pull request #681 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-14 09:09:26 +01:00
57f7edc134 fix(docker): fix docker-compose for production grade deployments 2022-03-14 09:03:47 +01:00
c62a3c2dfd New translations modals.json (Chinese Simplified) 2022-03-14 07:38:30 +01:00
b7f024913c New translations dashboard.json (Chinese Simplified) 2022-03-14 07:38:28 +01:00
488631e6b0 New translations landing.json (Chinese Simplified) 2022-03-14 07:38:25 +01:00
ca5a866249 New translations builder.json (Chinese Simplified) 2022-03-14 07:38:23 +01:00
3a0cd4e150 New translations common.json (Chinese Simplified) 2022-03-14 07:38:19 +01:00
e82e714e41 chore(release): 3.2.0 2022-03-14 06:40:41 +01:00
21931bc324 feat(i18n): add Bengali, Italian and other languages 2022-03-14 06:40:16 +01:00
ed75a85827 fix(client): fix issue with react-query cache 2022-03-14 06:33:14 +01:00
fbb0285d0d Merge pull request #678 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-14 06:10:51 +01:00
b056b002b7 New translations builder.json (Italian) 2022-03-14 02:04:09 +01:00
8b32bfb9f4 New translations modals.json (Italian) 2022-03-13 22:03:59 +01:00
cf3696c976 New translations dashboard.json (Italian) 2022-03-13 22:03:56 +01:00
aa0dc1d7fb New translations landing.json (Italian) 2022-03-13 22:03:54 +01:00
f5bf77cfd0 New translations builder.json (Italian) 2022-03-13 22:03:51 +01:00
9ddbc7cab2 New translations common.json (Italian) 2022-03-13 22:03:49 +01:00
f7d11c5fd2 New translations landing.json (Bengali) 2022-03-13 21:03:51 +01:00
bede07656b New translations dashboard.json (Bengali) 2022-03-13 21:03:48 +01:00
49b56f7a76 New translations modals.json (Bengali) 2022-03-13 20:08:25 +01:00
1421fc5183 New translations common.json (Bengali) 2022-03-13 20:08:20 +01:00
b3da226d24 New translations builder.json (Bengali) 2022-03-13 20:08:19 +01:00
3d7a5b9313 Merge pull request #675 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-13 19:02:01 +01:00
86ca4602fd Merge pull request #667 from chandiwalaaadhar/fix/skillModal-disable-and-beginner-text-clashing
Fixed Near Overlapping of "Disable" & "Beginner" Label Text in Skills Modal for Desktop Screen
2022-03-13 19:01:52 +01:00
3dde7e5772 Merge pull request #669 from chandiwalaaadhar/fix/gengar-theme-masthead-icons-disapper
Fix-Gengar Theme MastHead Icons Disappear on Theme/Primary Color Change
2022-03-13 19:01:45 +01:00
0782c616ea Merge branch 'main' into fix/gengar-theme-masthead-icons-disapper 2022-03-13 18:56:14 +01:00
d1d3f240b4 Merge branch 'main' of github.com:AmruthPillai/Reactive-Resume 2022-03-13 18:54:03 +01:00
b18120b3f7 fix(app): fix issue with external link redirection in android app 2022-03-13 18:53:48 +01:00
b5809ea449 New translations common.json (Vietnamese) 2022-03-13 17:52:24 +01:00
01acec4a51 New translations common.json (Spanish) 2022-03-13 17:52:21 +01:00
9d076d384c Merge branch 'main' into fix/gengar-theme-masthead-icons-disapper 2022-03-13 21:35:16 +05:30
e7a8596456 Fix-Gengar Theme MastHead Icons Disappear on Theme Change 2022-03-13 12:47:57 +05:30
ab4df6193c Fixed Near Overlapping of Disable & Beginner Text in Skills Modal for Desktop 2022-03-13 12:00:25 +05:30
e4a9f269d2 Merge pull request #662 from AmruthPillai/i18n_main
New Crowdin updates
2022-03-13 07:24:36 +01:00
189cc702c2 New translations modals.json (Italian) 2022-03-13 07:13:32 +01:00
c348b6449b New translations landing.json (Italian) 2022-03-13 07:13:29 +01:00
708920df44 New translations landing.json (German) 2022-03-13 07:13:28 +01:00
81733e5855 New translations landing.json (Spanish) 2022-03-13 07:13:27 +01:00
794c7df374 New translations modals.json (German) 2022-03-13 07:13:24 +01:00
267f593ec2 New translations modals.json (Spanish) 2022-03-13 07:13:23 +01:00
048927a163 New translations dashboard.json (Spanish) 2022-03-13 07:13:16 +01:00
f4a65122c6 New translations dashboard.json (German) 2022-03-13 07:13:15 +01:00
6587c76397 New translations dashboard.json (Italian) 2022-03-13 07:13:14 +01:00
80223a240c New translations builder.json (Italian) 2022-03-13 07:13:12 +01:00
50faa5dff3 New translations modals.json (French) 2022-03-12 20:25:37 +01:00
6a4521b057 New translations landing.json (French) 2022-03-12 20:25:33 +01:00
81a4d7291a New translations dashboard.json (French) 2022-03-12 20:25:32 +01:00
381cfcc220 New translations builder.json (French) 2022-03-12 20:25:28 +01:00
0f555e4f88 New translations common.json (French) 2022-03-12 20:25:27 +01:00
ebd9253038 chore(release): 3.1.4 2022-03-12 19:46:45 +01:00
cf670af403 fix(client): exported pdf did not contain "Present" keyword with translations 2022-03-12 19:46:30 +01:00
dfccb3130f fix(client): fix issues raised through lgtm alerts 2022-03-12 18:56:00 +01:00
ef06240935 docs(readme): add localization percentage badge 2022-03-12 18:47:34 +01:00
55e57353a4 New translations modals.json (Italian) 2022-03-12 18:23:47 +01:00
f0144cc6e7 New translations landing.json (Italian) 2022-03-12 18:23:44 +01:00
e5150ab128 New translations common.json (Italian) 2022-03-12 18:23:40 +01:00
d61905db10 chore(release): 3.1.3 2022-03-12 17:41:29 +01:00
6d55f917ea fix(server): reform url for pdf generation and download
fix #661
2022-03-12 17:41:16 +01:00
4371f3b693 New translations dashboard.json (Italian) 2022-03-12 17:28:42 +01:00
c8c5916d02 Update local-build.mdx 2022-03-12 16:09:08 +01:00
3ca27f2326 docs(style): update CHANGELOG.md 2022-03-12 15:59:34 +01:00
529 changed files with 56289 additions and 13332 deletions

View File

@ -1,21 +1,27 @@
# Android App
/app
# Build Artifacts
dist
.next
/schema/dist
/server/dist
/client/.next
# IDEs
.vscode
# Project Metadata
.crowdin.yml
# Documentation
README.md
SECURITY.md
CHANGELOG.md
CODE_OF_CONDUCT.md
# Project Dependencies
node_modules
**/node_modules
# Docker
Dockerfile
.dockerignore
docker-compose.yml
# Android App
/app

View File

@ -1,30 +1,36 @@
# App
# Server + Client
TZ=UTC
SECRET_KEY=change-me
# URLs
PUBLIC_URL=http://localhost:3000
PUBLIC_SERVER_URL=http://localhost:3100
PUBLIC_GOOGLE_CLIENT_ID=
# Database
# Server + Database
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
# Server
SECRET_KEY=
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_SECRET=
JWT_EXPIRY_TIME=604800
GOOGLE_CLIENT_SECRET=
GOOGLE_API_KEY=
MAIL_FROM_NAME=
MAIL_FROM_EMAIL=
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
STORAGE_BUCKET=
STORAGE_REGION=
STORAGE_ENDPOINT=
STORAGE_URL_PREFIX=
STORAGE_ACCESS_KEY=
STORAGE_SECRET_KEY=
PDF_DELETION_TIME=345600000
# 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=
# Client
PUBLIC_FLAG_DISABLE_SIGNUPS=false

View File

@ -1,31 +1,34 @@
{
"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"],
"extends": ["plugin:@typescript-eslint/recommended"],
"plugins": ["@typescript-eslint/eslint-plugin", "unused-imports", "simple-import-sort"],
"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
// ESLint
"no-unused-vars": "off",
// Unused Imports
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"warn",
{
"vars": "all",
"varsIgnorePattern": "^_",
"args": "none",
"varsIgnorePattern": "^_",
"argsIgnorePattern": "^_"
}
]
],
// Simple Import Sort
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
// TypeScript ESLint
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-non-null-assertion": "off",
"@typescript-eslint/interface-name-prefix": "off",
"@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/explicit-module-boundary-types": "off"
},
"overrides": [
{

2
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,2 @@
github: AmruthPillai
custom: https://paypal.me/RajaRajanA

View File

@ -1,38 +1,43 @@
---
name: Bug Report
about: Create a report to help improve
title: "[BUG] "
title: '[BUG] '
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
<!-- A clear and concise description of what the bug is. -->
**Product Flavor**
- [ ] Managed (https://rxresu.me)
- [ ] Self Hosted
**To Reproduce**
Steps to reproduce the behavior:
<!-- Steps to reproduce the behavior: -->
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots**
If applicable, add screenshots to help explain your problem.
<!-- If applicable, add screenshots to help explain your problem. -->
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**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]
- OS: <!--[e.g. iOS]-->
- Browser <!--[e.g. chrome, safari]-->
- Version <!--[e.g. 22]-->
**Additional context**
Add any other context about the problem here.
<!-- Add any other context about the problem here. -->

View File

@ -1,20 +1,23 @@
---
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.
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context**
Add any other context or screenshots about the feature request here.
<!-- Add any other context or screenshots about the feature request here. -->

22
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,22 @@
version: 2
updates:
- package-ecosystem: 'docker'
directory: '/server'
schedule:
interval: 'weekly'
- package-ecosystem: 'docker'
directory: '/client'
schedule:
interval: 'weekly'
- package-ecosystem: 'gradle'
directory: '/app'
schedule:
interval: 'weekly'
- package-ecosystem: 'github-actions'
directory: '/'
schedule:
interval: 'weekly'

View File

@ -1,16 +0,0 @@
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

@ -8,14 +8,21 @@ on:
- completed
jobs:
deploy:
on-success:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- name: Install DigitalOcean CLI
uses: digitalocean/action-doctl@v2.1.0
uses: digitalocean/action-doctl@v2.3.0
with:
token: ${{ secrets.DIGITALOCEAN_TOKEN }}
- name: Create Deployment with Latest Version
run: doctl apps create-deployment ${{ secrets.DIGITALOCEAN_APP_ID }} --wait --force-rebuild
on-failure:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
steps:
- name: Abruptly end the worklfow
run: exit 1

View File

@ -1,120 +1,61 @@
name: Build and Push Docker Image
on:
workflow_dispatch:
release:
types: [published]
jobs:
docker_client:
name: Docker (Client)
build_matrix:
name: Build and Push Docker Image
runs-on: ubuntu-latest
strategy:
matrix:
image: [client, server]
arch: [linux/amd64, linux/arm64]
steps:
- name: Checkout the repository
uses: actions/checkout@v3.0.0
uses: actions/checkout@v3.5.2
- id: version
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
name: App Version
uses: martinbeentjes/npm-get-version-action@v1.3.1
- name: Login to Docker
uses: docker/login-action@v1.14.1
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.1.0
with:
platforms: ${{ matrix.arch }}
- id: buildx
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.5.0
- name: Login to Docker Hub
uses: docker/login-action@v2.1.0
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
uses: docker/login-action@v2.1.0
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
- name: Build and Push Docker Image
uses: docker/build-push-action@v4.0.0
with:
context: .
push: true
file: client/Dockerfile
platforms: ${{ matrix.arch }}
file: ${{ matrix.image }}/Dockerfile
build-args: |
TURBO_TOKEN=${{ secrets.TURBO_TOKEN }}
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 }}
amruthpillai/reactive-resume:${{ matrix.image }}-latest
amruthpillai/reactive-resume:${{ matrix.image }}-${{ steps.version.outputs.current-version }}
ghcr.io/amruthpillai/reactive-resume:${{ matrix.image }}-latest
ghcr.io/amruthpillai/reactive-resume:${{ matrix.image }}-${{ steps.version.outputs.current-version }}

10
.gitignore vendored
View File

@ -1,10 +1,18 @@
# Environment Variables
.env
.env.*
*.env
!.env.gitpod
!.env.example
# Project Dependencies
node_modules
# macOS
.DS_Store
.DS_Store
# Intellij
.idea
# Turborepo
.turbo

41
.gitpod.yml Normal file
View File

@ -0,0 +1,41 @@
tasks:
- name: Run PostgreSQL Database
command: docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -d postgres
- name: Install Project Dependencies
command: |
pnpm install
pnpm dlx playwright install --with-deps chromium
gp sync-done deps
- name: Generate Environment Variables
init: gp sync-await deps
command: |
if [ -f .env ]; then
echo "Found .env in workspace, skipping generation"
else
pnpm generate-env
fi
gp sync-done env
- name: Build and Run Project
init: gp sync-await env
command: |
pnpm build
pnpm start
ports:
# PostgreSQL
- port: 5432
onOpen: ignore
visibility: private
# Client
- port: 3100
onOpen: ignore
visibility: public
# Client
- port: 3000
onOpen: open-browser
visibility: public

View File

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

2
.npmrc Normal file
View File

@ -0,0 +1,2 @@
auto-install-peers=true
strict-peer-dependencies=false

View File

@ -1,3 +1,6 @@
# Android App
/app
# Schema
schema/dist
@ -18,15 +21,9 @@ CHANGELOG.md
# Project Dependencies
node_modules
pnpm-lock.yaml
# Docker
Dockerfile
.dockerignore
docker-compose.yml
# Android App
/app
# Docs
docs/build
docs/.docusaurus
docker-compose.yml

View File

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

26
.vscode/launch.json vendored
View File

@ -1,26 +0,0 @@
{
"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,25 +1,22 @@
{
"css.validate": false,
"scss.validate": false,
"editor.wordWrap": "on",
"npm.packageManager": "pnpm",
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"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
"conventionalCommits.scopes": [
"client",
"server",
"docker",
"dependencies"
]
}

View File

@ -1,54 +0,0 @@
# 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.1.2](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.1.1...v3.1.2) (2022-03-12)
### [3.1.1](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.1.0...v3.1.1) (2022-03-12)
### Features
* **client:** add product hunt announcement banner ([b515fc3](https://github.com/AmruthPillai/Reactive-Resume/commit/b515fc36e7f282db92e8eb509b6c5004a944fa95))
## [3.1.0](https://github.com/AmruthPillai/Reactive-Resume/compare/v3.0.0...v3.1.0) (2022-03-12)
### Features
* **client:** add "spanish (es)" language to i18n locales ([bf167f8](https://github.com/AmruthPillai/Reactive-Resume/commit/bf167f81a3659677dada55856f5eaf0fc469e697))
* **client:** add mm/yyyy date option to date format options ([82bf44d](https://github.com/AmruthPillai/Reactive-Resume/commit/82bf44daa24422156779e9b38d3dc695176eaa09)), closes [#656](https://github.com/AmruthPillai/Reactive-Resume/issues/656)
* **client:** add sitemap generation to next app ([2cbc582](https://github.com/AmruthPillai/Reactive-Resume/commit/2cbc582a12b72b3012246022d4b518ed657d4c08))
* **client:** disable "Toggle Page Orientation" when there's only one page on the artboard ([01da1a0](https://github.com/AmruthPillai/Reactive-Resume/commit/01da1a06b802f1063a41d7a9a682e76b1daf9461)), closes [#655](https://github.com/AmruthPillai/Reactive-Resume/issues/655)
### Bug Fixes
* **client:** remove hard-coded "keywords:" in certain templates ([dda42b4](https://github.com/AmruthPillai/Reactive-Resume/commit/dda42b4c6b3bc359ac4f2bb91ca8118ddc84ec07)), closes [#650](https://github.com/AmruthPillai/Reactive-Resume/issues/650)
* **client:** show "present" string if end date is not entered, also add to i18n locales ([b5cd6c4](https://github.com/AmruthPillai/Reactive-Resume/commit/b5cd6c412b5b6b6ca7bb43c3801762de451f06b4)), closes [#653](https://github.com/AmruthPillai/Reactive-Resume/issues/653)
* **server:** photo uploads not working, fix save location and returned url ([799f208](https://github.com/AmruthPillai/Reactive-Resume/commit/799f20823e6d97a1ff0ba2c45c61d56304d0fa58)), closes [#658](https://github.com/AmruthPillai/Reactive-Resume/issues/658)
## [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))

128
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
im.amruth@gmail.com.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@ -1,10 +1,13 @@
<img src="https://i.imgur.com/pc8Ingg.png" alt="Reactive Resume" width="256px" height="256px" />
<img src="https://rxresu.me/images/logos/logo.png" alt="Reactive Resume" width="256px" height="256px" />
# Reactive Resume
![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)
[![Project Version](https://img.shields.io/github/package-json/v/AmruthPillai/Reactive-Resume?style=flat-square)](https://github.com/AmruthPillai/Reactive-Resume/releases)
[![Project License](https://img.shields.io/github/license/AmruthPillai/Reactive-Resume?style=flat-square)](https://github.com/AmruthPillai/Reactive-Resume/blob/main/LICENSE)
[![Crowdin](https://badges.crowdin.net/reactive-resume/localized.svg)](https://translate.rxresu.me)
[![Docker Pulls](https://img.shields.io/docker/pulls/amruthpillai/reactive-resume?style=flat-square)](https://hub.docker.com/r/amruthpillai/reactive-resume)
![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/AmruthPillai/Reactive-Resume/docker-build-push.yml?branch=main&label=docker%20build&style=flat-square)
[![Gitpod](https://img.shields.io/badge/Contribute%20with-Gitpod-908a85?logo=gitpod)](https://gitpod.io/#https://github.com/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)
## [Go to App](https://rxresu.me) | [Docs](https://docs.rxresu.me)
@ -13,6 +16,24 @@ Reactive Resume is a free and open source resume builder thats built to make
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.
## Table of Contents
- [Reactive Resume](#reactive-resume)
- [Go to App | Docs](#go-to-app--docs)
- [Table of Contents](#table-of-contents)
- [Features](#features)
- [Languages](#languages)
- [Tutorial](#tutorial)
- [Build from Source](#build-from-source)
- [Contributing](#contributing)
- [Report Bugs and Feature Requests](#report-bugs-and-feature-requests)
- [Donations](#donations)
- [GitHub Sponsor](#github-sponsor)
- [PayPal](#paypal)
- [Infrastructure](#infrastructure)
- [Contributors Wall](#contributors-wall)
- [License](#license)
## Features
- Free, forever
@ -35,12 +56,46 @@ You have complete control over what goes into your resume, how it looks, what co
## Languages
- Amharic (አማርኛ)
- Arabic (اَلْعَرَبِيَّةُ)
- Bengali (বাংলা)
- Bulgarian (български)
- Catalan (Valencian)
- Chinese (中文)
- Czech (čeština)
- Danish (Dansk)
- Dutch (Nederlands)
- English
- Finnish (Suomi)
- French (Français)
- German (Deutsch)
- Greek (Ελληνικά)
- Hebrew (Ivrit)
- Hindi (हिन्दी)
- Kannada (ಕನ್ನಡ) (@aksh1251)
- Spanish (Español) (@seba11998)
- Hungarian (Magyar)
- Indonesian (Bahasa Indonesia)
- Italian (Italiano)
- Japanese (日本語)
- Kannada (ಕನ್ನಡ)
- Khmer (ភាសាខ្មែរ)
- Korean (한국어)
- Malayalam (മലയാളം)
- Marathi (मराठी)
- Nepali (नेपाली)
- Norwegian (Norsk)
- Odia (ଓଡ଼ିଆ)
- Persian (فارسی)
- Polish (Polski)
- Portuguese (Português)
- Romanian (limba română)
- Russian (русский)
- Serbian (српски језик)
- Spanish (Español)
- Swedish (Svenska)
- Tamil (தமிழ்)
- Turkish (Türkçe)
- Ukrainian (Українська мова)
- Vietnamese (Tiếng Việt)
Help by [translating Reactive Resume](https://translate.rxresu.me) to your language!
@ -50,7 +105,11 @@ The docs include an extensive [Tutorial](https://docs.rxresu.me/tutorial) sectio
## 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.
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/AmruthPillai/Reactive-Resume)
Initially building the image and project on Gitpod will take at least ~10 minutes, so please be patient on first launch.
For extensive information on how to build the app on your local machine, head over to the docs [Source Code](https://docs.rxresu.me/source-code) section.
## Contributing
@ -64,15 +123,20 @@ This project makes use of [conventional commits](https://www.conventionalcommits
NOTE: Be sure to merge the latest from `main` before making a pull request!
## Bugs? Feature Requests?
## Report Bugs and 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.
Reactive Resume would be nothing without the folks who supported me and kept the project alive in the beginning, and your continued 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 you can.
### [☕️ Buy me a coffee](https://www.buymeacoffee.com/AmruthPillai) | [💸 PayPal](https://paypal.me/RajaRajanA)
### [GitHub Sponsor](https://github.com/sponsors/AmruthPillai)
### [PayPal](https://paypal.me/RajaRajanA)
## GitHub Star History
[![Star History Chart](https://api.star-history.com/svg?repos=AmruthPillai/Reactive-Resume&type=Date)](https://star-history.com/#AmruthPillai/Reactive-Resume&Date)
## Infrastructure
@ -88,6 +152,14 @@ Reactive Resume would be nothing without the folks who supported me and kept the
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" width="200px" />
</a>
## Contributors Wall
<a href="https://github.com/AmruthPillai/Reactive-Resume/graphs/contributors">
<img src="https://contrib.rocks/image?repo=AmruthPillai/Reactive-Resume" />
</a>
_Note: It may take up to 24h for the [contrib.rocks](https://contrib.rocks/image?repo=AmruthPillai/Reactive-Resume) plugin to update because it's refreshed once a day._
## 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.

13
SECURITY.md Normal file
View File

@ -0,0 +1,13 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 3.x.x | :white_check_mark: |
| 2.x.x | :x: |
| 1.x.x | :x: |
## Reporting a Vulnerability
Create an issue on GitHub or send me an email through the contact form on my website at https://amruthpillai.com/

View File

@ -10,10 +10,10 @@ android {
applicationId "me.rxresu.app"
minSdk 21
targetSdk 32
versionCode 2
versionCode 3
versionName "1.0"
resConfigs 'en'
resConfigs "en"
}
buildTypes {
@ -38,6 +38,7 @@ android {
buildFeatures {
viewBinding true
}
namespace 'me.rxresu.app'
}
dependencies {

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.rxresu.app">
<manifest
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
@ -10,11 +10,11 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ReactiveResume.NoActionBar">
android:theme="@style/AppTheme">
<activity
android:configChanges="orientation|screenSize"
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.ReactiveResume.NoActionBar">
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -0,0 +1,21 @@
package me.rxresu.app
import android.content.Intent
import android.net.Uri
import android.webkit.WebView
import android.webkit.WebViewClient
internal class CustomWebViewClient : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
val hostname = "rxresu.me"
val uri = Uri.parse(url)
if (uri.host != null && uri.host!!.endsWith(hostname)) {
return false
}
view.context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))
return true
}
}

View File

@ -1,21 +1,14 @@
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"
private var url = "https://rxresu.me"
@SuppressLint("SetJavaScriptEnabled")
override fun onCreate(savedInstanceState: Bundle?) {
@ -24,53 +17,18 @@ class MainActivity : AppCompatActivity() {
webView = findViewById(R.id.webview)
webView.webViewClient = CustomWebViewClient()
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"
webView.loadUrl(url)
}
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 onBackPressed() {
if (webView.canGoBack()) {
webView.goBack()
} else {
super.onBackPressed()
}
}
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

@ -2,7 +2,6 @@
<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">

View File

@ -1,12 +1,6 @@
<resources>
<style name="Theme.ReactiveResume" parent="Theme.MaterialComponents.DayNight.DarkActionBar" />
<style name="Theme.ReactiveResume.NoActionBar">
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<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>

View File

@ -1,7 +1,7 @@
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
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false
id 'org.jetbrains.kotlin.android' version '1.8.21' apply false
}
task clean(type: Delete) {

View File

@ -1,6 +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
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

View File

@ -1,8 +1,33 @@
{
"extends": ["../.eslintrc.json", "next/core-web-vitals"],
"extends": ["../.eslintrc.json", "next/core-web-vitals", "plugin:tailwindcss/recommended"],
"plugins": ["unused-imports"],
"ignorePatterns": [".next", "__ENV.js"],
"settings": {
"next": {
"rootDir": "client"
}
},
"rules": {
// Next.js
"@next/next/no-img-element": "off",
"@next/next/no-sync-scripts": "off"
"@next/next/no-sync-scripts": "off",
// React Hooks
"react-hooks/exhaustive-deps": "off",
// Unused Imports
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"warn",
{
"vars": "all",
"args": "none",
"varsIgnorePattern": "^_",
"argsIgnorePattern": "^_"
}
],
// Tailwind CSS
"tailwindcss/no-custom-classname": ["warn", { "whitelist": ["preview-mode", "printer-mode", "markdown"] }]
}
}

5
client/.gitignore vendored
View File

@ -36,4 +36,7 @@ yarn-error.log*
*.tsbuildinfo
# react-env
__ENV.js
__ENV.js
# next-sitemap
sitemap*.xml

View File

@ -1,22 +1,19 @@
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
FROM node:lts-alpine AS base
WORKDIR /app
RUN apk add --no-cache g++ git make curl python3 libc6-compat \
&& corepack enable && corepack prepare pnpm@latest --activate
FROM base as dependencies
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
FROM base as builder
COPY . .
@ -24,21 +21,17 @@ 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
ARG TURBO_TOKEN
ENV TURBO_TOKEN=$TURBO_TOKEN
FROM node:16-alpine as production
RUN pnpm exec turbo --filter client build
WORKDIR /app
FROM base as production
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/package.json /app/pnpm-*.yaml ./
COPY --from=builder /app/client/package.json ./client/package.json
RUN pnpm install -F client --frozen-lockfile --prod
RUN pnpm install --filter client --prod --frozen-lockfile --workspace-root
COPY --from=builder /app/client/.next ./client/.next
COPY --from=builder /app/client/public ./client/public
@ -49,4 +42,4 @@ EXPOSE 3000
ENV PORT 3000
CMD [ "pnpm", "run", "start:client" ]
CMD [ "pnpm", "run", "--filter", "client", "start" ]

View File

@ -0,0 +1,43 @@
FROM node:18-alpine AS base
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
else echo "Lockfile not found." && exit 1; \
fi
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV NEXT_TELEMETRY_DISABLED 1
RUN yarn global add pnpm && pnpm build
FROM base AS runner
WORKDIR /app
ENV NODE_ENV production
ENV NEXT_TELEMETRY_DISABLED 1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT 3000
CMD ["node", "client/server.js"]

View File

@ -5,17 +5,21 @@ import {
FilterCenterFocus,
InsertPageBreak,
Link,
RedoOutlined,
UndoOutlined,
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 dayjs from 'dayjs';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import toast from 'react-hot-toast';
import { useMutation } from 'react-query';
import { ReactZoomPanPinchRef } from 'react-zoom-pan-pinch';
import { ReactZoomPanPinchHandlers } from 'react-zoom-pan-pinch';
import { ActionCreators } from 'redux-undo';
import { ServerError } from '@/services/axios';
import { printResumeAsPdf, PrintResumeAsPdfParams } from '@/services/printer';
@ -25,20 +29,24 @@ import getResumeUrl from '@/utils/getResumeUrl';
import styles from './ArtboardController.module.scss';
const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, centerView }) => {
const ArtboardController: React.FC<ReactZoomPanPinchHandlers> = ({ 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 pages = useAppSelector((state) => state.resume.metadata.layout);
const { past, present: resume, future } = useAppSelector((state) => state.resume);
const pages = get(resume, 'metadata.layout');
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 handleUndo = () => dispatch(ActionCreators.undo());
const handleRedo = () => dispatch(ActionCreators.redo());
const handleTogglePageBreakLine = () => dispatch(togglePageBreakLine());
const handleTogglePageOrientation = () => dispatch(togglePageOrientation());
@ -52,7 +60,7 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
const url = getResumeUrl(resume, { withHost: true });
await navigator.clipboard.writeText(url);
toast.success(t('common.toast.success.resume-link-copied'));
toast.success(t<string>('common.toast.success.resume-link-copied'));
};
const handleExportPDF = async () => {
@ -60,10 +68,11 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
const slug = get(resume, 'slug');
const username = get(resume, 'user.username');
const updatedAt = get(resume, 'updatedAt');
const url = await mutateAsync({ username, slug });
const url = await mutateAsync({ username, slug, lastUpdated: dayjs(updatedAt).unix().toString() });
download(`/api${url}`);
download(url);
};
return (
@ -75,19 +84,33 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
})}
>
<div className={styles.controller}>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.zoom-in') as string}>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.undo')}>
<ButtonBase onClick={handleUndo} className={clsx({ 'pointer-events-none opacity-50': past.length < 2 })}>
<UndoOutlined fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.redo')}>
<ButtonBase onClick={handleRedo} className={clsx({ 'pointer-events-none opacity-50': future.length === 0 })}>
<RedoOutlined fontSize="medium" />
</ButtonBase>
</Tooltip>
<Divider />
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.zoom-in')}>
<ButtonBase onClick={() => zoomIn(0.25)}>
<ZoomIn fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.zoom-out') as string}>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.zoom-out')}>
<ButtonBase onClick={() => zoomOut(0.25)}>
<ZoomOut fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.center-artboard') as string}>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.center-artboard')}>
<ButtonBase onClick={() => centerView(0.95)}>
<FilterCenterFocus fontSize="medium" />
</ButtonBase>
@ -97,25 +120,26 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
{isDesktop && (
<>
{pages.length > 1 && (
<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<string>('builder.controller.tooltip.toggle-orientation')}>
<ButtonBase
onClick={handleTogglePageOrientation}
className={clsx({ 'pointer-events-none opacity-50': pages.length === 1 })}
>
{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}>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.toggle-page-break-line')}>
<ButtonBase onClick={handleTogglePageBreakLine}>
<InsertPageBreak fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.toggle-sidebars') as string}>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.toggle-sidebars')}>
<ButtonBase onClick={handleToggleSidebar}>
<ViewSidebar fontSize="medium" />
</ButtonBase>
@ -125,13 +149,13 @@ const ArtboardController: React.FC<ReactZoomPanPinchRef> = ({ zoomIn, zoomOut, c
</>
)}
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.copy-link') as string}>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.copy-link')}>
<ButtonBase onClick={handleCopyLink}>
<Link fontSize="medium" />
</ButtonBase>
</Tooltip>
<Tooltip arrow placement="top" title={t('builder.controller.tooltip.export-pdf') as string}>
<Tooltip arrow placement="top" title={t<string>('builder.controller.tooltip.export-pdf')}>
<ButtonBase onClick={handleExportPDF} disabled={isLoading}>
<Download fontSize="medium" />
</ButtonBase>

View File

@ -5,7 +5,7 @@
}
.wrapper {
@apply h-full w-full #{!important};
@apply h-full w-full overflow-visible #{!important};
}
.artboard {

View File

@ -13,7 +13,7 @@ import Page from './Page';
const Center = () => {
const orientation = useAppSelector((state) => state.build.page.orientation);
const resume = useAppSelector((state) => state.resume);
const resume = useAppSelector((state) => state.resume.present);
const layout: string[][][] = get(resume, 'metadata.layout');
if (isEmpty(resume)) return null;

View File

@ -20,7 +20,6 @@ import {
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';
@ -28,6 +27,7 @@ import { useTranslation } from 'next-i18next';
import { useEffect, useMemo, useState } from 'react';
import toast from 'react-hot-toast';
import { useMutation } from 'react-query';
import { Resume } from 'schema';
import { RESUMES_QUERY } from '@/constants/index';
import { ServerError } from '@/services/axios';
@ -53,12 +53,11 @@ const Header = () => {
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
const { mutateAsync: duplicateMutation } = useMutation<Resume, ServerError, DuplicateResumeParams>(duplicateResume);
const resume = useAppSelector((state) => state.resume.present);
const { left, right } = useAppSelector((state) => state.build.sidebar);
const { mutateAsync: deleteMutation } = useMutation<void, ServerError, DeleteResumeParams>(deleteResume);
const resume = useAppSelector((state) => state.resume);
const { left, right } = useAppSelector((state) => state.build.sidebar);
const { mutateAsync: duplicateMutation } = useMutation<Resume, ServerError, DuplicateResumeParams>(duplicateResume);
const name = useMemo(() => get(resume, 'name'), [resume]);
@ -133,7 +132,7 @@ const Header = () => {
const url = getResumeUrl(resume, { withHost: true });
await navigator.clipboard.writeText(url);
toast.success(t('common.toast.success.resume-link-copied'));
toast.success(t<string>('common.toast.success.resume-link-copied'));
};
return (
@ -166,14 +165,14 @@ const Header = () => {
<ListItemIcon>
<DriveFileRenameOutline className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.rename')}</ListItemText>
<ListItemText>{t<string>('builder.header.menu.rename')}</ListItemText>
</MenuItem>
<MenuItem onClick={handleDuplicate}>
<ListItemIcon>
<CopyAll className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.duplicate')}</ListItemText>
<ListItemText>{t<string>('builder.header.menu.duplicate')}</ListItemText>
</MenuItem>
{resume.public ? (
@ -181,27 +180,27 @@ const Header = () => {
<ListItemIcon>
<LinkIcon className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.share-link')}</ListItemText>
<ListItemText>{t<string>('builder.header.menu.share-link')}</ListItemText>
</MenuItem>
) : (
<Tooltip arrow placement="right" title={t('builder.header.menu.tooltips.share-link') as string}>
<Tooltip arrow placement="right" title={t<string>('builder.header.menu.tooltips.share-link')}>
<div>
<MenuItem>
<ListItemIcon>
<LinkIcon className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.share-link')}</ListItemText>
<ListItemText>{t<string>('builder.header.menu.share-link')}</ListItemText>
</MenuItem>
</div>
</Tooltip>
)}
<Tooltip arrow placement="right" title={t('builder.header.menu.tooltips.delete') as string}>
<Tooltip arrow placement="right" title={t<string>('builder.header.menu.tooltips.delete')}>
<MenuItem onClick={handleDelete}>
<ListItemIcon>
<Delete className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.header.menu.delete')}</ListItemText>
<ListItemText>{t<string>('builder.header.menu.delete')}</ListItemText>
</MenuItem>
</Tooltip>
</Menu>

View File

@ -15,7 +15,7 @@
}
&.break::after {
content: 'A4 Page Break';
content: 'Page Break';
top: calc(297mm - 19px);
@apply absolute w-full border-b border-dashed border-neutral-800/75;
@ -27,6 +27,15 @@
@apply hidden;
}
}
&.format-letter {
width: 216mm;
min-height: 279mm;
&.break::after {
top: calc(279mm - 19px);
}
}
}
.pageNumber {

View File

@ -1,10 +1,10 @@
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 { CustomCSS, PageConfig, ThemeConfig, Typography } from 'schema';
import { useAppSelector } from '@/store/hooks';
import templateMap from '@/templates/templateMap';
@ -20,25 +20,27 @@ type Props = PageProps & {
const Page: React.FC<Props> = ({ page, showPageNumbers = false }) => {
const { t } = useTranslation();
const resume = useAppSelector((state) => state.resume);
const resume = useAppSelector((state) => state.resume.present);
const breakLine: boolean = useAppSelector((state) => state.build.page.breakLine);
const theme: Theme = get(resume, 'metadata.theme');
const theme: ThemeConfig = 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 pageConfig: PageConfig = get(resume, 'metadata.page', {} as PageConfig);
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={styles.container} data-page={page + 1} data-format={pageConfig?.format || 'A4'}>
<div
className={clsx({
reset: true,
[styles.page]: true,
[styles.break]: breakLine,
[styles['format-letter']]: pageConfig?.format === 'Letter',
[css(themeCSS)]: true,
[css(typographyCSS)]: true,
[css(customCSS.value)]: customCSS.visible,
@ -48,9 +50,7 @@ const Page: React.FC<Props> = ({ page, showPageNumbers = false }) => {
</div>
{showPageNumbers && (
<h4 className={styles.pageNumber}>
{t('builder.common.glossary.page')} {page + 1}
</h4>
<h4 className={styles.pageNumber}>{`${t<string>('builder.common.glossary.page')} ${page + 1}`}</h4>
)}
</div>
);

View File

@ -1,14 +1,15 @@
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 cloneDeep from 'lodash/cloneDeep';
import get from 'lodash/get';
import Link from 'next/link';
import { useTranslation } from 'next-i18next';
import { useMemo } from 'react';
import React, { ReactComponentElement, useMemo } from 'react';
import { Section as SectionRecord } from 'schema';
import { validate } from 'uuid';
import Logo from '@/components/shared/Logo';
import { getCustomSections, left } from '@/config/sections';
import { getCustomSections, getSectionsByType, left } from '@/config/sections';
import { setSidebarState } from '@/store/build/buildSlice';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { addSection } from '@/store/resume/resumeSlice';
@ -25,7 +26,8 @@ const LeftSidebar = () => {
const isDesktop = useMediaQuery(theme.breakpoints.up('lg'));
const sections = useAppSelector((state) => state.resume.sections);
const sections = useAppSelector((state) => state.resume.present.sections);
const { open } = useAppSelector((state) => state.build.sidebar.left);
const customSections = useMemo(() => getCustomSections(sections), [sections]);
@ -52,7 +54,49 @@ const LeftSidebar = () => {
items: [],
};
dispatch(addSection({ value: newSection }));
dispatch(addSection({ value: newSection, type: 'custom' }));
};
const sectionsList = () => {
const sectionsComponents: Array<ReactComponentElement<any>> = [];
for (const item of left) {
const id = (item as any).id;
const component = (item as any).component;
const type = component.props.type;
const addMore = !!component.props.addMore;
sectionsComponents.push(
<section key={id} id={id}>
{component}
</section>
);
if (addMore) {
const additionalSections = getSectionsByType(sections, type);
const elements = [];
for (const element of additionalSections) {
const newId = element.id;
const props = cloneDeep(component.props);
props.path = 'sections.' + newId;
props.name = element.name;
props.isDeletable = true;
props.addMore = false;
props.isDuplicated = true;
const newComponent = React.cloneElement(component, props);
elements.push(
<section key={newId} id={`section-${newId}`}>
{newComponent}
</section>
);
}
sectionsComponents.push(...elements);
}
}
return sectionsComponents;
};
return (
@ -65,12 +109,10 @@ const LeftSidebar = () => {
variant={isDesktop ? 'persistent' : 'temporary'}
>
<div className={styles.container}>
<nav>
<nav className="overflow-y-auto">
<div>
<Link href="/dashboard">
<a className="inline-flex">
<Logo size={40} />
</a>
<Logo size={40} />
</Link>
<Divider />
</div>
@ -81,15 +123,20 @@ const LeftSidebar = () => {
arrow
key={id}
placement="right"
title={get(sections, `${id}.name`, t<string>(`builder.leftSidebar.sections.${id}.heading`))}
title={t<string>(`builder.leftSidebar.sections.${id}.heading`, get(sections, `${id}.name`))}
>
<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)}>
<Tooltip
key={id}
title={t<string>(`builder.leftSidebar.sections.${id}.heading`, get(sections, `${id}.name`))}
placement="right"
arrow
>
<IconButton onClick={() => id && handleClick(id)}>
<Star />
</IconButton>
</Tooltip>
@ -100,21 +147,19 @@ const LeftSidebar = () => {
</nav>
<main>
{left.map(({ id, component }) => (
<section key={id} id={id}>
{component}
</section>
))}
{sectionsList()}
{customSections.map(({ id }) => (
<section key={id} id={`section-${id}`}>
<Section path={`sections.${id}`} isEditable isHideable isDeletable />
<Section path={`sections.${id}`} type="custom" 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') })}
{t<string>('builder.common.actions.add', {
token: t<string>('builder.leftSidebar.sections.section.heading'),
})}
</Button>
</div>
</main>

View File

@ -24,17 +24,19 @@ const Basics = () => {
return (
<>
<Heading path="sections.basics" name={t('builder.leftSidebar.sections.basics.heading')} />
<Heading path="sections.basics" name={t<string>('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="grid items-center gap-4 sm:col-span-2 sm:grid-cols-3">
<div className="mx-auto">
<PhotoUpload />
</div>
<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" />
<div className="grid w-full gap-2 sm:col-span-2">
<ResumeInput label={t<string>('builder.leftSidebar.sections.basics.name.label')} path="basics.name" />
<Button variant="outlined" startIcon={<PhotoFilter />} onClick={handleClick}>
{t('builder.leftSidebar.sections.basics.actions.photo-filters')}
{t<string>('builder.leftSidebar.sections.basics.actions.photo-filters')}
</Button>
<Popover
@ -55,20 +57,30 @@ const Basics = () => {
</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" />
<ResumeInput
type="date"
label={t<string>('builder.leftSidebar.sections.basics.birthdate.label')}
path="basics.birthdate"
className="sm:col-span-2"
/>
<ResumeInput
label={t<string>('builder.common.form.email.label')}
path="basics.email"
className="sm:col-span-2"
/>
<ResumeInput label={t<string>('builder.common.form.phone.label')} path="basics.phone" />
<ResumeInput label={t<string>('builder.common.form.url.label')} path="basics.website" />
<Divider className="sm:col-span-2" />
<ResumeInput
label={t('builder.leftSidebar.sections.basics.headline.label')}
label={t<string>('builder.leftSidebar.sections.basics.headline.label')}
path="basics.headline"
className="sm:col-span-2"
/>
<ResumeInput
type="textarea"
label={t('builder.common.form.summary.label')}
label={t<string>('builder.common.form.summary.label')}
path="basics.summary"
className="sm:col-span-2"
markdownSupported

View File

@ -8,19 +8,28 @@ const Location = () => {
return (
<>
<Heading path="sections.location" name={t('builder.leftSidebar.sections.location.heading')} />
<Heading path="sections.location" name={t<string>('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')}
label={t<string>('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')}
label={t<string>('builder.leftSidebar.sections.location.city.label')}
path="basics.location.city"
/>
<ResumeInput
label={t<string>('builder.leftSidebar.sections.location.region.label')}
path="basics.location.region"
/>
<ResumeInput
label={t<string>('builder.leftSidebar.sections.location.country.label')}
path="basics.location.country"
/>
<ResumeInput
label={t<string>('builder.leftSidebar.sections.location.postal-code.label')}
path="basics.location.postalCode"
/>
</div>

View File

@ -1,8 +1,8 @@
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 { Photo, PhotoShape } from 'schema';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setResumeState } from '@/store/resume/resumeSlice';
@ -12,7 +12,7 @@ const PhotoFilters = () => {
const dispatch = useAppDispatch();
const photo: Photo = useAppSelector((state) => get(state.resume, 'basics.photo'));
const photo: Photo = useAppSelector((state) => get(state.resume.present, '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);
@ -32,7 +32,7 @@ const PhotoFilters = () => {
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>
<h4 className="font-medium">{t<string>('builder.leftSidebar.sections.basics.photo-filters.size.heading')}</h4>
<div className="mx-2">
<Slider
@ -54,18 +54,20 @@ const PhotoFilters = () => {
<Divider />
<div>
<h4 className="font-medium">{t('builder.leftSidebar.sections.basics.photo-filters.effects.heading')}</h4>
<h4 className="font-medium">
{t<string>('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}
label={t<string>('builder.leftSidebar.sections.basics.photo-filters.effects.grayscale.label')}
control={
<Checkbox color="secondary" checked={grayscale} onChange={(_, value) => handleSetGrayscale(value)} />
}
/>
<FormControlLabel
label={t('builder.leftSidebar.sections.basics.photo-filters.effects.border.label') as string}
label={t<string>('builder.leftSidebar.sections.basics.photo-filters.effects.border.label')}
control={<Checkbox color="secondary" checked={border} onChange={(_, value) => handleSetBorder(value)} />}
/>
</div>
@ -74,7 +76,7 @@ const PhotoFilters = () => {
<Divider />
<div className="flex flex-col gap-2">
<h4 className="font-medium">{t('builder.leftSidebar.sections.basics.photo-filters.shape.heading')}</h4>
<h4 className="font-medium">{t<string>('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">

View File

@ -1,11 +1,11 @@
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 { Photo, Resume } from 'schema';
import { ServerError } from '@/services/axios';
import { deletePhoto, DeletePhotoParams, uploadPhoto, UploadPhotoParams } from '@/services/resume';
@ -21,8 +21,8 @@ const PhotoUpload: React.FC = () => {
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 id: number = useAppSelector((state) => get(state.resume.present, 'id'));
const photo: Photo = useAppSelector((state) => get(state.resume.present, 'basics.photo'));
const { mutateAsync: uploadMutation, isLoading } = useMutation<Resume, ServerError, UploadPhotoParams>(uploadPhoto);
@ -49,7 +49,7 @@ const PhotoUpload: React.FC = () => {
const file = event.target.files[0];
if (file.size > FILE_UPLOAD_MAX_SIZE) {
toast.error(t('common.toast.error.upload-photo-size'));
toast.error(t<string>('common.toast.error.upload-photo-size'));
return;
}
@ -67,8 +67,8 @@ const PhotoUpload: React.FC = () => {
<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)
? (t<string>('builder.leftSidebar.sections.basics.photo-upload.tooltip.upload') as string)
: (t<string>('builder.leftSidebar.sections.basics.photo-upload.tooltip.remove') as string)
}
>
<Avatar sx={{ width: 96, height: 96 }} src={photo.url} />

View File

@ -1,7 +1,7 @@
import { Add } from '@mui/icons-material';
import { Button } from '@mui/material';
import { ListItem } from '@reactive-resume/schema';
import { useTranslation } from 'next-i18next';
import { ListItem } from 'schema';
import Heading from '@/components/shared/Heading';
import List from '@/components/shared/List';
@ -28,7 +28,7 @@ const Profiles = () => {
return (
<>
<Heading path="sections.profiles" name={t('builder.leftSidebar.sections.profiles.heading')} />
<Heading path="sections.profiles" name={t<string>('builder.leftSidebar.sections.profiles.heading')} />
<List
path="basics.profiles"
@ -40,8 +40,8 @@ const Profiles = () => {
<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 }),
{t<string>('builder.common.actions.add', {
token: t<string>('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
})}
</Button>
</footer>

View File

@ -1,62 +1,86 @@
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 { ListItem, Section as SectionRecord, SectionType } from 'schema';
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 { duplicateItem, duplicateSection } from '@/store/resume/resumeSlice';
import SectionSettings from './SectionSettings';
type Props = {
path: `sections.${string}`;
type?: SectionType;
name?: string;
titleKey?: string;
subtitleKey?: string;
isEditable?: boolean;
isHideable?: boolean;
isDeletable?: boolean;
addMore?: boolean;
isDuplicated?: boolean;
};
const Section: React.FC<Props> = ({
path,
name = 'Section Name',
type = 'basic',
titleKey = 'title',
subtitleKey = 'subtitle',
isEditable = false,
isHideable = false,
isDeletable = false,
addMore = false,
isDuplicated = 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 heading = useAppSelector<string>((state) => get(state.resume.present, `${path}.name`, name));
const visibility = useAppSelector<boolean>((state) => get(state.resume.present, `${path}.visible`, true));
const handleAdd = () => {
const id = path.split('.')[1];
const modal: ModalName = validate(id) ? 'builder.sections.custom' : `builder.${path}`;
const modal: ModalName = `builder.sections.${type}`;
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}`;
let modal: ModalName = validate(id) ? 'builder.sections.custom' : `builder.${path}`;
const payload = validate(id) ? { path, item } : { item };
if (isDuplicated) {
modal = `builder.sections.${type}`;
payload.path = path;
}
dispatch(setModalState({ modal, state: { open: true, payload } }));
};
const handleDuplicate = (item: ListItem) => dispatch(duplicateItem({ path: `${path}.items`, value: item }));
const handleDuplicateSection = () => {
const newSection: SectionRecord = {
name: `${heading}`,
type: type,
visible: true,
columns: 2,
items: [],
isDuplicated: true,
};
dispatch(duplicateSection({ value: newSection, type }));
};
return (
<>
<Heading path={path} name={name} isEditable={isEditable} isHideable={isHideable} isDeletable={isDeletable} />
@ -74,9 +98,21 @@ const Section: React.FC<Props> = ({
<SectionSettings path={path} />
<Button variant="outlined" startIcon={<Add />} onClick={handleAdd}>
{t('builder.common.actions.add', { token: heading })}
{t<string>('builder.common.actions.add', {
token: t<string>(`builder.leftSidebar.${path}.heading`, { defaultValue: heading }),
})}
</Button>
</footer>
{addMore ? (
<div className="py-6 text-right">
<Button fullWidth variant="outlined" startIcon={<Add />} onClick={handleDuplicateSection}>
{t<string>('builder.common.actions.duplicate')}
</Button>
</div>
) : (
<></>
)}
</>
);
};

View File

@ -18,7 +18,7 @@ const SectionSettings: React.FC<Props> = ({ path }) => {
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
const columns = useAppSelector<number>((state) => get(state.resume, `${path}.columns`, 2));
const columns = useAppSelector<number>((state) => get(state.resume.present, `${path}.columns`, 2));
const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {
setAnchorEl(event.currentTarget);
@ -32,7 +32,7 @@ const SectionSettings: React.FC<Props> = ({ path }) => {
return (
<div>
<Tooltip title={t('builder.common.columns.tooltip') as string}>
<Tooltip title={t<string>('builder.common.columns.tooltip')}>
<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>
@ -48,7 +48,7 @@ const SectionSettings: React.FC<Props> = ({ path }) => {
}}
>
<div className="p-5 dark:bg-neutral-800">
<h4 className="mb-2 font-medium">{t('builder.common.columns.heading')}</h4>
<h4 className="mb-2 font-medium">{t<string>('builder.common.columns.heading')}</h4>
<ToggleButtonGroup exclusive value={columns} onChange={(_, value: number) => handleSetColumns(value)}>
{[1, 2, 3, 4].map((index) => (

View File

@ -1,5 +1,5 @@
import { Divider, IconButton, SwipeableDrawer, Tooltip, useMediaQuery, useTheme } from '@mui/material';
import { capitalize } from 'lodash';
import capitalize from 'lodash/capitalize';
import { useTranslation } from 'next-i18next';
import Avatar from '@/components/shared/Avatar';
@ -43,7 +43,7 @@ const RightSidebar = () => {
variant={isDesktop ? 'persistent' : 'temporary'}
>
<div className={styles.container}>
<nav>
<nav className="overflow-y-auto">
<div>
<Avatar size={40} />
<Divider />

View File

@ -1,10 +1,10 @@
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 { CustomCSS as CustomCSSType } from 'schema';
import Heading from '@/components/shared/Heading';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
@ -17,7 +17,9 @@ const CustomCSS = () => {
const dispatch = useAppDispatch();
const customCSS: CustomCSSType = useAppSelector((state) => get(state.resume, 'metadata.css', {}));
const customCSS: CustomCSSType = useAppSelector((state) =>
get(state.resume.present, 'metadata.css', {} as CustomCSSType)
);
const handleChange = (value: string | undefined) => {
dispatch(setResumeState({ path: 'metadata.css.value', value }));
@ -25,7 +27,7 @@ const CustomCSS = () => {
return (
<>
<Heading path="metadata.css" name={t('builder.rightSidebar.sections.css.heading')} isHideable />
<Heading path="metadata.css" name={t<string>('builder.rightSidebar.sections.css.heading')} isHideable />
<Editor
height="200px"

View File

@ -1,5 +1,6 @@
import { PictureAsPdf, Schema } from '@mui/icons-material';
import { List, ListItem, ListItemButton, ListItemText } from '@mui/material';
import dayjs from 'dayjs';
import get from 'lodash/get';
import pick from 'lodash/pick';
import { useTranslation } from 'next-i18next';
@ -13,18 +14,18 @@ import { useAppSelector } from '@/store/hooks';
const Export = () => {
const { t } = useTranslation();
const resume = useAppSelector((state) => state.resume);
const resume = useAppSelector((state) => state.resume.present);
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'),
primary: t<string>('builder.rightSidebar.sections.export.pdf.normal.primary'),
secondary: t<string>('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'),
primary: t<string>('builder.rightSidebar.sections.export.pdf.loading.primary'),
secondary: t<string>('builder.rightSidebar.sections.export.pdf.loading.secondary'),
},
};
@ -34,9 +35,10 @@ const Export = () => {
const redactedResume = pick(resume, ['basics', 'sections', 'metadata', 'public']);
const jsonString = JSON.stringify(redactedResume, null, 4);
const jsonBlob = new Blob([jsonString], { type: 'application/json;charset=utf-8' });
const filename = `RxResume_JSONExport_${nanoid()}.json`;
download(jsonString, filename, 'application/json');
download(jsonBlob, filename);
};
const handleExportPDF = async () => {
@ -44,15 +46,16 @@ const Export = () => {
const slug = get(resume, 'slug');
const username = get(resume, 'user.username');
const updatedAt = get(resume, 'updatedAt');
const url = await mutateAsync({ username, slug });
const url = await mutateAsync({ username, slug, lastUpdated: dayjs(updatedAt).unix().toString() });
download(`/api${url}`);
download(url);
};
return (
<>
<Heading path="metadata.export" name={t('builder.rightSidebar.sections.export.heading')} />
<Heading path="metadata.export" name={t<string>('builder.rightSidebar.sections.export.heading')} />
<List sx={{ padding: 0 }}>
<ListItem sx={{ padding: 0 }}>
@ -60,8 +63,8 @@ const Export = () => {
<Schema />
<ListItemText
primary={t('builder.rightSidebar.sections.export.json.primary')}
secondary={t('builder.rightSidebar.sections.export.json.secondary')}
primary={t<string>('builder.rightSidebar.sections.export.json.primary')}
secondary={t<string>('builder.rightSidebar.sections.export.json.secondary')}
/>
</ListItemButton>
</ListItem>

View File

@ -1,10 +1,10 @@
import { DragDropContext, Draggable, DraggableLocation, Droppable, DropResult } from '@hello-pangea/dnd';
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';
@ -23,8 +23,8 @@ const Layout = () => {
const dispatch = useAppDispatch();
const layout = useAppSelector((state) => state.resume.metadata.layout);
const resumeSections = useAppSelector((state) => state.resume.sections);
const layout = useAppSelector((state) => state.resume.present.metadata.layout);
const resumeSections = useAppSelector((state) => state.resume.present.sections);
const onDragEnd = (dropResult: DropResult) => {
const { source: srcLoc, destination: destLoc } = dropResult;
@ -60,9 +60,9 @@ const Layout = () => {
<>
<Heading
path="metadata.layout"
name={t('builder.rightSidebar.sections.layout.heading')}
name={t<string>('builder.rightSidebar.sections.layout.heading')}
action={
<Tooltip title={t('builder.rightSidebar.sections.layout.tooltip.reset-layout') as string}>
<Tooltip title={t<string>('builder.rightSidebar.sections.layout.tooltip.reset-layout')}>
<IconButton onClick={handleResetLayout}>
<Restore />
</IconButton>
@ -76,12 +76,16 @@ const Layout = () => {
<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}
{t<string>('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}
title={
t<string>('builder.common.actions.delete', {
token: t<string>('builder.common.glossary.page'),
}) as string
}
>
<IconButton size="small" onClick={() => handleDeletePage(pageIndex)}>
<Close fontSize="small" />
@ -113,7 +117,7 @@ const Layout = () => {
[styles.disabled]: !get(resumeSections, `${sectionId}.visible`, true),
})}
>
{get(resumeSections, `${sectionId}.name`)}
{get(resumeSections, `${sectionId}.name`, '') as string}
</div>
</div>
)}
@ -132,7 +136,7 @@ const Layout = () => {
<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') })}
{t<string>('builder.common.actions.add', { token: t<string>('builder.common.glossary.page') })}
</Button>
</div>
</DragDropContext>

View File

@ -3,7 +3,7 @@ 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 { DOCS_URL, DONATION_URL, GITHUB_ISSUES_URL, GITHUB_URL, REDDIT_URL } from '@/constants/index';
import styles from './Links.module.scss';
@ -12,39 +12,53 @@ const Links = () => {
return (
<>
<Heading path="metadata.links" name={t('builder.rightSidebar.sections.links.heading')} />
<Heading path="metadata.links" name={t<string>('builder.rightSidebar.sections.links.heading')} />
<div className={styles.container}>
<div className={styles.section}>
<h2>
<Savings fontSize="small" />
{t('builder.rightSidebar.sections.links.donate.heading')}
{t<string>('builder.rightSidebar.sections.links.donate.heading')}
</h2>
<p>{t('builder.rightSidebar.sections.links.donate.body')}</p>
<p>{t<string>('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>
<Button startIcon={<Coffee />}>{t<string>('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')}
{t<string>('builder.rightSidebar.sections.links.bugs-features.heading')}
</h2>
<p>{t('builder.rightSidebar.sections.links.bugs-features.body')}</p>
<p>{t<string>('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>
<Button startIcon={<GitHub />}>
{t<string>('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')}
{t<string>('builder.rightSidebar.sections.links.github')}
</Button>
</a>
<a href={REDDIT_URL} target="_blank" rel="noreferrer">
<Button variant="text" startIcon={<Link />}>
{t<string>('builder.rightSidebar.sections.links.reddit')}
</Button>
</a>
<a href={DOCS_URL} target="_blank" rel="noreferrer">
<Button variant="text" startIcon={<Link />}>
{t<string>('builder.rightSidebar.sections.links.docs')}
</Button>
</a>
</div>

View File

@ -10,13 +10,13 @@ import {
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 { useMemo, useState } from 'react';
import { useMutation } from 'react-query';
import { DateConfig, PageConfig, Resume } from 'schema';
import Heading from '@/components/shared/Heading';
import ThemeSwitch from '@/components/shared/ThemeSwitch';
@ -36,9 +36,11 @@ const Settings = () => {
const { locale, ...router } = useRouter();
const resume = useAppSelector((state) => state.resume);
const [confirmReset, setConfirmReset] = useState(false);
const resume = useAppSelector((state) => state.resume.present);
const theme = useAppSelector((state) => state.build.theme);
const pages = useAppSelector((state) => state.resume.metadata.layout);
const pages = useAppSelector((state) => state.resume.present.metadata.layout);
const breakLine = useAppSelector((state) => state.build.page.breakLine);
const orientation = useAppSelector((state) => state.build.page.orientation);
@ -46,9 +48,10 @@ const Settings = () => {
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 pageConfig: PageConfig | undefined = useMemo(() => get(resume, 'metadata.page'), [resume]);
const isDarkMode = useMemo(() => theme === 'dark', [theme]);
const exampleString = useMemo(() => `Eg. ${dayjs().format(dateConfig.format)}`, [dateConfig.format]);
const exampleDateString = 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>(
@ -58,6 +61,9 @@ const Settings = () => {
const handleSetTheme = (value: boolean) => dispatch(setTheme({ theme: value ? 'dark' : 'light' }));
const handleChangePageFormat = (value: PageConfig['format'] | null) =>
dispatch(setResumeState({ path: 'metadata.page.format', value }));
const handleChangeDateFormat = (value: string | null) =>
dispatch(setResumeState({ path: 'metadata.date.format', value }));
@ -66,6 +72,7 @@ const Settings = () => {
const code = value?.code || 'en';
document.cookie = `NEXT_LOCALE=${code}; path=/; expires=2147483647`;
dispatch(setResumeState({ path: 'metadata.locale', value: code }));
push({ pathname, query }, asPath, { locale: code });
};
@ -77,20 +84,25 @@ const Settings = () => {
};
const handleResetResume = async () => {
await resetResumeMutation({ id });
if (!confirmReset) {
return setConfirmReset(true);
}
queryClient.invalidateQueries(`resume/${username}/${slug}`);
await resetResumeMutation({ id });
await queryClient.invalidateQueries(`resume/${username}/${slug}`);
setConfirmReset(false);
};
return (
<>
<Heading path="metadata.settings" name={t('builder.rightSidebar.sections.settings.heading')} />
<Heading path="metadata.settings" name={t<string>('builder.rightSidebar.sections.settings.heading')} />
<List sx={{ padding: 0 }}>
<List disablePadding>
{/* Global Settings */}
<>
<ListSubheader className="rounded">
{t('builder.rightSidebar.sections.settings.global.heading')}
<ListSubheader disableSticky className="rounded">
{t<string>('builder.rightSidebar.sections.settings.global.heading')}
</ListSubheader>
<ListItem>
@ -98,7 +110,7 @@ const Settings = () => {
<Palette />
</ListItemIcon>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.global.theme.primary')}
primary={t<string>('builder.rightSidebar.sections.settings.global.theme.primary')}
secondary={themeString}
/>
<ThemeSwitch checked={isDarkMode} onChange={(_, value: boolean) => handleSetTheme(value)} />
@ -107,26 +119,26 @@ const Settings = () => {
<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')}
primary={t<string>('builder.rightSidebar.sections.settings.global.date.primary')}
secondary={t<string>('builder.rightSidebar.sections.settings.global.date.secondary')}
/>
<Autocomplete<string, false, boolean, false>
<Autocomplete<string, false, true, false>
disableClearable
className="my-2 w-full"
options={dateFormatOptions}
value={dateConfig.format}
onChange={(_, value) => handleChangeDateFormat(value)}
renderInput={(params) => <TextField {...params} helperText={exampleString} />}
renderInput={(params) => <TextField {...params} helperText={exampleDateString} />}
/>
</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')}
primary={t<string>('builder.rightSidebar.sections.settings.global.language.primary')}
secondary={t<string>('builder.rightSidebar.sections.settings.global.language.secondary')}
/>
<Autocomplete<Language, false, boolean, false>
<Autocomplete<Language, false, true, false>
disableClearable
className="my-2 w-full"
options={languages}
@ -147,15 +159,34 @@ const Settings = () => {
{/* Page Settings */}
<>
<ListSubheader className="rounded">{t('builder.rightSidebar.sections.settings.page.heading')}</ListSubheader>
<ListSubheader disableSticky className="rounded">
{t<string>('builder.rightSidebar.sections.settings.page.heading')}
</ListSubheader>
<ListItem className="flex-col">
<ListItemText
className="w-full"
primary={t<string>('builder.rightSidebar.sections.settings.page.format.primary')}
secondary={t<string>('builder.rightSidebar.sections.settings.page.format.secondary')}
/>
<Autocomplete<PageConfig['format'], false, true, false>
disableClearable
defaultValue="A4"
className="my-2 w-full"
options={['A4', 'Letter']}
value={pageConfig?.format || 'A4'}
renderInput={(params) => <TextField {...params} />}
onChange={(_, value) => handleChangePageFormat(value)}
/>
</ListItem>
<ListItem>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.page.orientation.primary')}
primary={t<string>('builder.rightSidebar.sections.settings.page.orientation.primary')}
secondary={
pages.length === 1
? t('builder.rightSidebar.sections.settings.page.orientation.disabled')
: t('builder.rightSidebar.sections.settings.page.orientation.secondary')
? t<string>('builder.rightSidebar.sections.settings.page.orientation.disabled')
: t<string>('builder.rightSidebar.sections.settings.page.orientation.secondary')
}
/>
<Switch
@ -168,8 +199,8 @@ const Settings = () => {
<ListItem>
<ListItemText
primary={t('builder.rightSidebar.sections.settings.page.break-line.primary')}
secondary={t('builder.rightSidebar.sections.settings.page.break-line.secondary')}
primary={t<string>('builder.rightSidebar.sections.settings.page.break-line.primary')}
secondary={t<string>('builder.rightSidebar.sections.settings.page.break-line.secondary')}
/>
<Switch color="secondary" checked={breakLine} onChange={() => dispatch(togglePageBreakLine())} />
</ListItem>
@ -177,30 +208,34 @@ const Settings = () => {
{/* Resume Settings */}
<>
<ListSubheader className="rounded">
{t('builder.rightSidebar.sections.settings.resume.heading')}
<ListSubheader disableSticky className="rounded">
{t<string>('builder.rightSidebar.sections.settings.resume.heading')}
</ListSubheader>
<ListItem>
<ListItem disableGutters>
<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')}
primary={t<string>('builder.rightSidebar.sections.settings.resume.sample.primary')}
secondary={t<string>('builder.rightSidebar.sections.settings.resume.sample.secondary')}
/>
</ListItemButton>
</ListItem>
<ListItem>
<ListItem disableGutters>
<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')}
primary={
confirmReset
? 'Are you sure?'
: t<string>('builder.rightSidebar.sections.settings.resume.reset.primary')
}
secondary={t<string>('builder.rightSidebar.sections.settings.resume.reset.secondary')}
/>
</ListItemButton>
</ListItem>

View File

@ -17,7 +17,7 @@ const Sharing = () => {
const [showShortUrl, setShowShortUrl] = useState(false);
const resume = useAppSelector((state) => state.resume);
const resume = useAppSelector((state) => state.resume.present);
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]);
@ -29,19 +29,19 @@ const Sharing = () => {
await navigator.clipboard.writeText(text);
toast.success(t('common.toast.success.resume-link-copied'));
toast.success(t<string>('common.toast.success.resume-link-copied'));
};
return (
<>
<Heading path="metadata.sharing" name={t('builder.rightSidebar.sections.sharing.heading')} />
<Heading path="metadata.sharing" name={t<string>('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')}
primary={t<string>('builder.rightSidebar.sections.sharing.visibility.title')}
secondary={t<string>('builder.rightSidebar.sections.sharing.visibility.subtitle')}
/>
<Switch color="secondary" checked={isPublic} onChange={(_, value) => handleSetVisibility(value)} />
</div>
@ -63,7 +63,7 @@ const Sharing = () => {
<div className="mt-1 flex w-full">
<FormControlLabel
label={t('builder.rightSidebar.sections.sharing.short-url.label') as string}
label={t<string>('builder.rightSidebar.sections.sharing.short-url.label')}
control={
<Checkbox className="mr-1" checked={showShortUrl} onChange={(_, value) => setShowShortUrl(value)} />
}

View File

@ -16,7 +16,7 @@ const Templates = () => {
const dispatch = useAppDispatch();
const currentTemplate: string = useAppSelector((state) => get(state.resume, 'metadata.template'));
const currentTemplate: string = useAppSelector((state) => get(state.resume.present, 'metadata.template'));
const handleChange = (template: TemplateMeta) => {
dispatch(setResumeState({ path: 'metadata.template', value: template.id }));
@ -24,14 +24,21 @@ const Templates = () => {
return (
<>
<Heading path="metadata.templates" name={t('builder.rightSidebar.sections.templates.heading')} />
<Heading path="metadata.templates" name={t<string>('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" />
<Image
fill
priority
alt={template.name}
src={template.preview}
className="rounded-sm"
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
/>
</ButtonBase>
</div>

View File

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

View File

@ -1,6 +1,6 @@
import { Theme } from '@reactive-resume/schema';
import get from 'lodash/get';
import { useTranslation } from 'next-i18next';
import { ThemeConfig } from 'schema';
import ColorAvatar from '@/components/shared/ColorAvatar';
import ColorPicker from '@/components/shared/ColorPicker';
@ -16,15 +16,17 @@ const Theme = () => {
const dispatch = useAppDispatch();
const { background, text, primary } = useAppSelector<Theme>((state) => get(state.resume, 'metadata.theme'));
const { background, text, primary } = useAppSelector<ThemeConfig>((state) =>
get(state.resume.present, 'metadata.theme')
);
const handleChange = (property: string, color: string) => {
dispatch(setResumeState({ path: `metadata.theme.${property}`, value: color }));
dispatch(setResumeState({ path: `metadata.theme.${property}`, value: color[0] !== '#' ? `#${color}` : color }));
};
return (
<>
<Heading path="metadata.theme" name={t('builder.rightSidebar.sections.theme.heading')} />
<Heading path="metadata.theme" name={t<string>('builder.rightSidebar.sections.theme.heading')} />
<div className={styles.container}>
<div className={styles.colorOptions}>
@ -34,18 +36,18 @@ const Theme = () => {
</div>
<ColorPicker
label={t('builder.rightSidebar.sections.theme.form.primary.label')}
label={t<string>('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')}
label={t<string>('builder.rightSidebar.sections.theme.form.background.label')}
color={background}
onChange={(color) => handleChange('background', color)}
/>
<ColorPicker
label={t('builder.rightSidebar.sections.theme.form.text.label')}
label={t<string>('builder.rightSidebar.sections.theme.form.text.label')}
color={text}
onChange={(color) => handleChange('text', color)}
/>

View File

@ -1,9 +1,9 @@
import { Autocomplete, Skeleton, Slider, TextField } from '@mui/material';
import { Font, TypeCategory, TypeProperty, Typography as TypographyType } from '@reactive-resume/schema';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
import { useTranslation } from 'next-i18next';
import { useQuery } from 'react-query';
import { Font, TypeCategory, TypeProperty, Typography as TypographyType } from 'schema';
import Heading from '@/components/shared/Heading';
import { FONTS_QUERY } from '@/constants/index';
@ -33,7 +33,7 @@ const Widgets: React.FC<WidgetProps> = ({ label, category }) => {
const dispatch = useAppDispatch();
const { family, size } = useAppSelector<TypographyType>((state) => get(state.resume, 'metadata.typography'));
const { family, size } = useAppSelector<TypographyType>((state) => get(state.resume.present, 'metadata.typography'));
const { data: fonts } = useQuery(FONTS_QUERY, fetchFonts, {
select: (fonts) => fonts.sort((a, b) => a.category.localeCompare(b.category)),
@ -64,7 +64,7 @@ const Widgets: React.FC<WidgetProps> = ({ label, category }) => {
step={1}
marks={[
{ value: 12, label: '12px' },
{ value: 24, label: t('builder.rightSidebar.sections.typography.form.font-size.label') },
{ value: 24, label: t<string>('builder.rightSidebar.sections.typography.form.font-size.label') },
{ value: 36, label: '36px' },
]}
valueLabelDisplay="auto"
@ -82,7 +82,10 @@ const Widgets: React.FC<WidgetProps> = ({ label, category }) => {
value={fonts.find((font) => font.family === family[category])}
onChange={(_, font: Font | null) => handleChange('family', font)}
renderInput={(params) => (
<TextField {...params} label={t('builder.rightSidebar.sections.typography.form.font-family.label')} />
<TextField
{...params}
label={t<string>('builder.rightSidebar.sections.typography.form.font-family.label')}
/>
)}
/>
</div>
@ -95,10 +98,13 @@ const Typography = () => {
return (
<>
<Heading path="metadata.typography" name={t('builder.rightSidebar.sections.typography.heading')} />
<Heading path="metadata.typography" name={t<string>('builder.rightSidebar.sections.typography.heading')} />
<Widgets label={t('builder.rightSidebar.sections.typography.widgets.headings.label')} category="heading" />
<Widgets label={t('builder.rightSidebar.sections.typography.widgets.body.label')} category="body" />
<Widgets
label={t<string>('builder.rightSidebar.sections.typography.widgets.headings.label')}
category="heading"
/>
<Widgets label={t<string>('builder.rightSidebar.sections.typography.widgets.body.label')} category="body" />
</>
);
};

View File

@ -16,9 +16,7 @@ type Props = {
const ResumeCard: React.FC<Props> = ({ modal, icon: Icon, title, subtitle }) => {
const dispatch = useAppDispatch();
const handleClick = () => {
dispatch(setModalState({ modal, state: { open: true } }));
};
const handleClick = () => dispatch(setModalState({ modal, state: { open: true } }));
return (
<section className={styles.resume}>

View File

@ -7,7 +7,6 @@ import {
OpenInNew,
} from '@mui/icons-material';
import { ButtonBase, ListItemIcon, ListItemText, Menu, MenuItem, Tooltip } from '@mui/material';
import { Resume } from '@reactive-resume/schema';
import Image from 'next/image';
import Link from 'next/link';
import { useRouter } from 'next/router';
@ -15,6 +14,7 @@ import { useTranslation } from 'next-i18next';
import { useState } from 'react';
import toast from 'react-hot-toast';
import { useMutation } from 'react-query';
import { Resume } from 'schema';
import { RESUMES_QUERY } from '@/constants/index';
import { ServerError } from '@/services/axios';
@ -94,7 +94,7 @@ const ResumePreview: React.FC<Props> = ({ resume }) => {
const url = getResumeUrl(resume, { withHost: true });
await navigator.clipboard.writeText(url);
toast.success(t('common.toast.success.resume-link-copied'));
toast.success(t<string>('common.toast.success.resume-link-copied'));
};
const handleDelete = async () => {
@ -115,16 +115,14 @@ const ResumePreview: React.FC<Props> = ({ resume }) => {
}}
>
<ButtonBase className={styles.preview}>
{resume.image ? (
<Image src={resume.image} alt={resume.name} objectFit="cover" layout="fill" priority />
) : null}
{resume.image ? <Image src={resume.image} alt={resume.name} priority width={400} height={0} /> : null}
</ButtonBase>
</Link>
<footer>
<div className={styles.meta}>
<p>{resume.name}</p>
<p>{t('dashboard.resume.timestamp', { timestamp: getRelativeTime(resume.updatedAt) })}</p>
<p>{t<string>('dashboard.resume.timestamp', { timestamp: getRelativeTime(resume.updatedAt) })}</p>
</div>
<ButtonBase className={styles.menu} onClick={handleOpenMenu}>
@ -136,21 +134,21 @@ const ResumePreview: React.FC<Props> = ({ resume }) => {
<ListItemIcon>
<OpenInNew className="scale-90" />
</ListItemIcon>
<ListItemText>{t('dashboard.resume.menu.open')}</ListItemText>
<ListItemText>{t<string>('dashboard.resume.menu.open')}</ListItemText>
</MenuItem>
<MenuItem onClick={handleRename}>
<ListItemIcon>
<DriveFileRenameOutline className="scale-90" />
</ListItemIcon>
<ListItemText>{t('dashboard.resume.menu.rename')}</ListItemText>
<ListItemText>{t<string>('dashboard.resume.menu.rename')}</ListItemText>
</MenuItem>
<MenuItem onClick={handleDuplicate}>
<ListItemIcon>
<ContentCopy className="scale-90" />
</ListItemIcon>
<ListItemText>{t('dashboard.resume.menu.duplicate')}</ListItemText>
<ListItemText>{t<string>('dashboard.resume.menu.duplicate')}</ListItemText>
</MenuItem>
{resume.public ? (
@ -158,27 +156,27 @@ const ResumePreview: React.FC<Props> = ({ resume }) => {
<ListItemIcon>
<LinkIcon className="scale-90" />
</ListItemIcon>
<ListItemText>{t('dashboard.resume.menu.share-link')}</ListItemText>
<ListItemText>{t<string>('dashboard.resume.menu.share-link')}</ListItemText>
</MenuItem>
) : (
<Tooltip arrow placement="right" title={t('dashboard.resume.menu.tooltips.share-link') as string}>
<Tooltip arrow placement="right" title={t<string>('dashboard.resume.menu.tooltips.share-link')}>
<div>
<MenuItem>
<ListItemIcon>
<LinkIcon className="scale-90" />
</ListItemIcon>
<ListItemText>{t('dashboard.resume.menu.share-link')}</ListItemText>
<ListItemText>{t<string>('dashboard.resume.menu.share-link')}</ListItemText>
</MenuItem>
</div>
</Tooltip>
)}
<Tooltip arrow placement="right" title={t('dashboard.resume.menu.tooltips.delete') as string}>
<Tooltip arrow placement="right" title={t<string>('dashboard.resume.menu.tooltips.delete')}>
<MenuItem onClick={handleDelete}>
<ListItemIcon>
<DeleteOutline className="scale-90" />
</ListItemIcon>
<ListItemText>{t('dashboard.resume.menu.delete')}</ListItemText>
<ListItemText>{t<string>('dashboard.resume.menu.delete')}</ListItemText>
</MenuItem>
</Tooltip>
</Menu>

View File

@ -1,9 +1,9 @@
.testimony {
@apply grid gap-2;
@apply border-2 rounded p-4 dark:border-neutral-800;
@apply rounded border-2 p-4 dark:border-neutral-800;
blockquote {
@apply text-xs leading-normal text-justify opacity-90;
@apply text-justify text-xs leading-normal opacity-90;
}
figcaption {

View File

@ -1,8 +1,8 @@
import { Testimony } from '@/data/testimonials';
import { Testimony as TestimonyType } from '@/data/testimonials';
import styles from './Testimony.module.scss';
type Props = Testimony;
type Props = TestimonyType;
const Testimony: React.FC<Props> = ({ name, message }) => {
return (

View File

@ -1,7 +0,0 @@
.container {
@apply z-10 fixed top-0 left-0 right-0;
strong {
@apply font-semibold;
}
}

View File

@ -1,26 +0,0 @@
import { AnnouncementOutlined } from '@mui/icons-material';
import { Alert, Collapse } from '@mui/material';
import { useState } from 'react';
import { PRODUCT_HUNT_URL } from '@/constants/index';
import styles from './Announcement.module.scss';
const Announcement = () => {
const [open, setOpen] = useState(true);
return (
<div className={styles.container}>
<Collapse in={open}>
<Alert icon={<AnnouncementOutlined />} severity="info" onClose={() => setOpen(false)}>
<a href={PRODUCT_HUNT_URL} target="_blank" rel="noreferrer">
<strong>Reactive Resume is featured on Product Hunt.</strong> If you liked this app, please show your
support by <strong>upvoting</strong>!
</a>
</Alert>
</Collapse>
</div>
);
};
export default Announcement;

View File

@ -8,14 +8,14 @@ import styles from './ArrayInput.module.scss';
type Props = {
label: string;
value: string[];
value?: string[];
className?: string;
onChange: (event: any) => void;
errors?: FieldError | FieldError[];
};
const ArrayInput: React.FC<Props> = ({ value, label, onChange, errors, className }) => {
const [items, setItems] = useState<string[]>(value);
const [items, setItems] = useState<string[]>(value || []);
const onAdd = () => setItems([...items, '']);

View File

@ -6,15 +6,17 @@ import { useState } from 'react';
import { logout } from '@/store/auth/authSlice';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setModalState } from '@/store/modal/modalSlice';
import getGravatarUrl from '@/utils/getGravatarUrl';
import styles from './Avatar.module.scss';
type Props = {
size?: number;
interactive?: boolean;
};
const Avatar: React.FC<Props> = ({ size = 64 }) => {
const Avatar: React.FC<Props> = ({ size = 64, interactive = true }) => {
const router = useRouter();
const { t } = useTranslation();
@ -34,6 +36,11 @@ const Avatar: React.FC<Props> = ({ size = 64 }) => {
setAnchorEl(null);
};
const handleOpenProfile = () => {
dispatch(setModalState({ modal: 'auth.profile', state: { open: true } }));
handleClose();
};
const handleLogout = () => {
dispatch(logout());
handleClose();
@ -43,25 +50,25 @@ const Avatar: React.FC<Props> = ({ size = 64 }) => {
return (
<>
<IconButton onClick={handleOpen}>
<IconButton onClick={handleOpen} disabled={!interactive}>
<Image
width={size}
height={size}
alt={user?.name}
className={styles.avatar}
src={getGravatarUrl(email, size)}
alt={user?.name ?? 'User Avatar'}
/>
</IconButton>
<Menu anchorEl={anchorEl} onClose={handleClose} open={Boolean(anchorEl)}>
<MenuItem>
<MenuItem onClick={handleOpenProfile}>
<div>
<span className="text-xs opacity-50">{t('common.avatar.menu.greeting')}</span>
<span className="text-xs opacity-50">{t<string>('common.avatar.menu.greeting')},</span>
<p>{user?.name}</p>
</div>
</MenuItem>
<Divider />
<MenuItem onClick={handleLogout}>{t('common.avatar.menu.logout')}</MenuItem>
<MenuItem onClick={handleLogout}>{t<string>('common.avatar.menu.logout')}</MenuItem>
</Menu>
</>
);

View File

@ -1,10 +1,16 @@
.content {
@apply rounded p-6 text-sm shadow lg:w-1/2 xl:w-2/5;
@apply rounded px-6 text-sm shadow lg:w-1/2 xl:w-2/5;
@apply absolute inset-4 sm:inset-x-4 sm:inset-y-auto lg:inset-auto;
@apply overflow-scroll bg-neutral-50 dark:bg-neutral-900 lg:overflow-auto;
@apply max-h-[90vh] min-h-fit;
&::-webkit-scrollbar {
display: none;
}
}
.header {
@apply sticky top-0 left-0 right-0 z-50 bg-neutral-50 pt-6 dark:bg-neutral-900;
@apply flex items-center justify-between;
@apply w-full border-b pb-5 dark:border-white/10;
@ -27,6 +33,7 @@
}
.footer {
@apply sticky bottom-0 left-0 right-0 z-50 bg-neutral-50 pb-6 dark:bg-neutral-900;
@apply flex items-center justify-end gap-x-4;
@apply w-full border-t pt-5 dark:border-white/10;
}

View File

@ -5,11 +5,12 @@ import { useRouter } from 'next/router';
import styles from './BaseModal.module.scss';
type Props = {
icon?: React.ReactNode;
isOpen: boolean;
heading: string;
handleClose: () => void;
icon?: React.ReactNode;
children?: React.ReactNode;
footerChildren?: React.ReactNode;
handleClose: () => void;
};
const BaseModal: React.FC<Props> = ({ icon, isOpen, heading, children, handleClose, footerChildren }) => {

View File

@ -10,7 +10,7 @@ const Footer: React.FC<Props> = ({ className }) => {
return (
<div className={clsx('text-xs', className)}>
<p>{t('common.footer.license')}</p>
<p>{t<string>('common.footer.license')}</p>
<p>
<Trans t={t} i18nKey="common.footer.credit">

View File

@ -32,8 +32,8 @@ const Heading: React.FC<Props> = ({
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`, name));
const visibility = useAppSelector((state) => get(state.resume, `${path}.visible`, true));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`, name));
const visibility = useAppSelector((state) => get(state.resume.present, `${path}.visible`, true));
const [editMode, setEditMode] = useState(false);
@ -62,7 +62,7 @@ const Heading: React.FC<Props> = ({
{editMode ? (
<TextField size="small" value={heading} className="w-3/4" onChange={handleChange} />
) : (
<h1>{heading}</h1>
<h1>{t<string>(`builder.leftSidebar.${path}.heading`, { defaultValue: heading })}</h1>
)}
</div>
@ -72,19 +72,19 @@ const Heading: React.FC<Props> = ({
})}
>
{isEditable && (
<Tooltip title={t('builder.common.tooltip.rename-section') as string}>
<Tooltip title={t<string>('builder.common.tooltip.rename-section')}>
<IconButton onClick={toggleEditMode}>{editMode ? <Check /> : <DriveFileRenameOutline />}</IconButton>
</Tooltip>
)}
{isHideable && (
<Tooltip title={t('builder.common.tooltip.toggle-visibility') as string}>
<Tooltip title={t<string>('builder.common.tooltip.toggle-visibility')}>
<IconButton onClick={toggleVisibility}>{visibility ? <Visibility /> : <VisibilityOff />}</IconButton>
</Tooltip>
)}
{isDeletable && (
<Tooltip title={t('builder.common.tooltip.delete-section') as string}>
<Tooltip title={t<string>('builder.common.tooltip.delete-section')}>
<IconButton onClick={handleDelete}>
<Delete />
</IconButton>

View File

@ -9,5 +9,5 @@
}
.language {
@apply py-2 px-4 cursor-pointer text-center hover:underline;
@apply cursor-pointer py-2 px-4 text-center hover:underline;
}

View File

@ -1,64 +1,51 @@
import { Language } from '@mui/icons-material';
import { IconButton, Popover } from '@mui/material';
import { IconButton, Menu, MenuItem } from '@mui/material';
import { useRouter } from 'next/router';
import { useTranslation } from 'next-i18next';
import { MouseEvent, useState } from 'react';
import { languages } from '@/config/languages';
import styles from './LanguageSwitcher.module.scss';
import { TRANSLATE_URL } from '@/constants/index';
const LanguageSwitcher = () => {
const router = useRouter();
const { t } = useTranslation();
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
const handleClick = (event: MouseEvent<HTMLButtonElement>) => setAnchorEl(event.currentTarget);
const handleClose = () => setAnchorEl(null);
const handleChangeLanguage = (locale: string) => {
const handleChange = (locale: string) => {
const { pathname, asPath, query } = router;
handleClose();
document.cookie = `NEXT_LOCALE=${locale}; path=/; expires=2147483647`;
router.push({ pathname, query }, asPath, { locale });
};
const handleAddLanguage = () => window.open(TRANSLATE_URL, '_blank');
return (
<div>
<IconButton onClick={handleClick}>
<Language />
</IconButton>
<Popover
anchorEl={anchorEl}
open={Boolean(anchorEl)}
onClose={handleClose}
anchorOrigin={{
vertical: 'top',
horizontal: 'right',
}}
transformOrigin={{
vertical: 'bottom',
horizontal: 'right',
}}
>
<div className={styles.popover}>
<div className={styles.container}>
{languages.map(({ code, name, localName }) => (
<p key={code} className={styles.language} onClick={() => handleChangeLanguage(code)}>
{name} {localName && `(${localName})`}
</p>
))}
<Menu anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={handleClose}>
{languages.map(({ code, name, localName }) => (
<MenuItem key={code} onClick={() => handleChange(code)}>
{name} {localName && `(${localName})`}
</MenuItem>
))}
<a href="https://translate.rxresu.me" target="_blank" rel="noreferrer" className={styles.language}>
{t('common.footer.language.missing')}
</a>
</div>
</div>
</Popover>
<MenuItem>
<span className="font-bold" onClick={handleAddLanguage}>
Add your language
</span>
</MenuItem>
</Menu>
</div>
);
};

View File

@ -1,4 +1,3 @@
import { ListItem as ListItemType } from '@reactive-resume/schema';
import clsx from 'clsx';
import get from 'lodash/get';
import isArray from 'lodash/isArray';
@ -8,6 +7,7 @@ import { useTranslation } from 'next-i18next';
import { useCallback } from 'react';
import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { ListItem as ListItemType } from 'schema';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { deleteItem, setResumeState } from '@/store/resume/resumeSlice';
@ -36,7 +36,7 @@ const List: React.FC<Props> = ({
const dispatch = useAppDispatch();
const list: Array<ListItemType> = useAppSelector((state) => get(state.resume, path, []));
const list: Array<ListItemType> = useAppSelector((state) => get(state.resume.present, path, []));
const handleEdit = (item: ListItemType) => {
isFunction(onEdit) && onEdit(item);
@ -66,7 +66,7 @@ const List: React.FC<Props> = ({
return (
<DndProvider backend={HTML5Backend}>
<div className={clsx(styles.container, className)}>
{isEmpty(list) && <div className={styles.empty}>{t('builder.common.list.empty-text')}</div>}
{isEmpty(list) && <div className={styles.empty}>{t<string>('builder.common.list.empty-text')}</div>}
{list.map((item, index) => {
const title = get(item, titleKey, '');
@ -76,6 +76,7 @@ const List: React.FC<Props> = ({
return (
<ListItem
key={item.id}
path={path}
item={item}
index={index}
title={title}

View File

@ -1,11 +1,11 @@
import { DeleteOutline, DriveFileRenameOutline, FileCopy, MoreVert } from '@mui/icons-material';
import { Divider, IconButton, ListItemIcon, ListItemText, Menu, MenuItem, Tooltip } from '@mui/material';
import { ListItem as ListItemType } from '@reactive-resume/schema';
import clsx from 'clsx';
import isFunction from 'lodash/isFunction';
import { useTranslation } from 'next-i18next';
import React, { useRef, useState } from 'react';
import { DropTargetMonitor, useDrag, useDrop, XYCoord } from 'react-dnd';
import { ListItem as ListItemType } from 'schema';
import styles from './ListItem.module.scss';
@ -17,6 +17,7 @@ interface DragItem {
type Props = {
item: ListItemType;
path: string;
index: number;
title: string;
subtitle?: string;
@ -26,14 +27,14 @@ type Props = {
onDuplicate?: (item: ListItemType) => void;
};
const ListItem: React.FC<Props> = ({ item, index, title, subtitle, onMove, onEdit, onDelete, onDuplicate }) => {
const ListItem: React.FC<Props> = ({ item, path, index, title, subtitle, onMove, onEdit, onDelete, onDuplicate }) => {
const { t } = useTranslation();
const ref = useRef<HTMLDivElement>(null);
const [anchorEl, setAnchorEl] = useState<Element | null>(null);
const [{ handlerId }, drop] = useDrop<DragItem, any, any>({
accept: 'ListItem',
accept: path,
collect(monitor) {
return { handlerId: monitor.getHandlerId() };
},
@ -68,7 +69,7 @@ const ListItem: React.FC<Props> = ({ item, index, title, subtitle, onMove, onEdi
});
const [{ isDragging }, drag] = useDrag({
type: 'ListItem',
type: path,
item: () => {
return { id: item.id, index };
},
@ -125,25 +126,25 @@ const ListItem: React.FC<Props> = ({ item, index, title, subtitle, onMove, onEdi
<ListItemIcon>
<DriveFileRenameOutline className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.common.list.actions.edit')}</ListItemText>
<ListItemText>{t<string>('builder.common.list.actions.edit')}</ListItemText>
</MenuItem>
<MenuItem onClick={() => handleDuplicate(item)}>
<ListItemIcon>
<FileCopy className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.common.list.actions.duplicate')}</ListItemText>
<ListItemText>{t<string>('builder.common.list.actions.duplicate')}</ListItemText>
</MenuItem>
<Divider />
<Tooltip arrow placement="right" title={t('builder.common.tooltip.delete-item') as string}>
<Tooltip arrow placement="right" title={t<string>('builder.common.tooltip.delete-item')}>
<div>
<MenuItem onClick={() => handleDelete(item)}>
<ListItemIcon>
<DeleteOutline className="scale-90" />
</ListItemIcon>
<ListItemText>{t('builder.common.list.actions.delete')}</ListItemText>
<ListItemText>{t<string>('builder.common.list.actions.delete')}</ListItemText>
</MenuItem>
</div>
</Tooltip>

View File

@ -5,6 +5,7 @@ import styles from './Loading.module.scss';
const Loading: React.FC = () => {
const { isReady } = useRouter();
const isFetching = useIsFetching();
const isMutating = useIsMutating();

View File

@ -4,8 +4,8 @@ type Props = {
size?: 256 | 64 | 48 | 40 | 32;
};
const Logo: React.FC<Props> = ({ size = 64 }) => {
return <Image alt="Reactive Resume" src="/images/logos/logo.svg" className="rounded" width={size} height={size} />;
};
const Logo: React.FC<Props> = ({ size = 64 }) => (
<Image alt="Reactive Resume" src="/images/logos/logo.svg" className="rounded" width={size} height={size} priority />
);
export default Logo;

View File

@ -1,7 +1,9 @@
import clsx from 'clsx';
import { isEmpty } from 'lodash';
import isEmpty from 'lodash/isEmpty';
import ReactMarkdown from 'react-markdown';
import rehypeKatex from 'rehype-katex';
import remarkGfm from 'remark-gfm';
import remarkMath from 'remark-math';
type Props = {
children?: string;
@ -12,7 +14,11 @@ const Markdown: React.FC<Props> = ({ className, children }) => {
if (!children || isEmpty(children)) return null;
return (
<ReactMarkdown remarkPlugins={[remarkGfm]} className={clsx('markdown', className)}>
<ReactMarkdown
className={clsx('markdown', className)}
remarkPlugins={[remarkGfm, remarkMath]}
rehypePlugins={[rehypeKatex]}
>
{children}
</ReactMarkdown>
);

View File

@ -1,5 +0,0 @@
import dynamic from 'next/dynamic';
const NoSSR: React.FC = ({ children }) => <>{children}</>;
export default dynamic(() => Promise.resolve(NoSSR), { ssr: false });

View File

@ -1,4 +1,6 @@
import { TextField } from '@mui/material';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import dayjs from 'dayjs';
import get from 'lodash/get';
import { useEffect, useState } from 'react';
@ -8,7 +10,7 @@ import { setResumeState } from '@/store/resume/resumeSlice';
import MarkdownSupported from './MarkdownSupported';
interface Props {
type?: 'text' | 'textarea';
type?: 'text' | 'textarea' | 'date';
label: string;
path: string;
className?: string;
@ -18,7 +20,7 @@ interface Props {
const ResumeInput: React.FC<Props> = ({ type = 'text', label, path, className, markdownSupported = false }) => {
const dispatch = useAppDispatch();
const stateValue = useAppSelector((state) => get(state.resume, path, ''));
const stateValue = useAppSelector((state) => get(state.resume.present, path, ''));
useEffect(() => {
setValue(stateValue);
@ -31,6 +33,11 @@ const ResumeInput: React.FC<Props> = ({ type = 'text', label, path, className, m
dispatch(setResumeState({ path, value: event.target.value }));
};
const onChangeValue = (value: string) => {
setValue(value);
dispatch(setResumeState({ path, value }));
};
if (type === 'textarea') {
return (
<TextField
@ -45,6 +52,21 @@ const ResumeInput: React.FC<Props> = ({ type = 'text', label, path, className, m
);
}
if (type === 'date') {
return (
<DatePicker
openTo="year"
label={label}
value={dayjs(value)}
slots={{ textField: (params) => <TextField {...params} error={false} className={className} /> }}
onChange={(date: dayjs.Dayjs | null) => {
if (!date) return onChangeValue('');
if (dayjs(date).isValid()) return onChangeValue(dayjs(date).format('YYYY-MM-DD'));
}}
/>
);
}
return <TextField type={type} label={label} value={value} onChange={onChange} className={className} />;
};

View File

@ -2,38 +2,51 @@ export type Language = {
code: string;
name: string;
localName?: string;
isRTL?: boolean;
};
export const languages: Language[] = [
{
code: 'en',
name: 'English',
},
{
code: 'de',
name: 'German',
localName: 'Deutsch',
},
{
code: 'hi',
name: 'Hindi',
localName: 'हिन्दी',
},
{
code: 'kn',
name: 'Kannada',
localName: 'ಕನ್ನಡ',
},
{
code: 'es',
name: 'Spanish',
localName: 'Español',
},
{
code: 'ta',
name: 'Tamil',
localName: 'தமிழ்',
},
{ code: 'am', name: 'Amharic', localName: 'አማርኛ' },
{ code: 'ar', name: 'Arabic', localName: 'اَلْعَرَبِيَّةُ', isRTL: true },
{ code: 'bg', name: 'Bulgarian', localName: 'български' },
{ code: 'bn', name: 'Bengali', localName: 'বাংলা' },
{ code: 'ca', name: 'Catalan', localName: 'Valencian' },
{ code: 'cs', name: 'Czech', localName: 'čeština' },
{ code: 'da', name: 'Danish', localName: 'Dansk' },
{ code: 'de', name: 'German', localName: 'Deutsch Formell / Sie' },
{ code: 'el', name: 'Greek', localName: 'Ελληνικά' },
{ code: 'en', name: 'English' },
{ code: 'es', name: 'Spanish', localName: 'Español' },
{ code: 'fa', name: 'Persian', localName: 'فارسی', isRTL: true },
{ code: 'fi', name: 'Finnish', localName: 'Suomi' },
{ code: 'fr', name: 'French', localName: 'Français' },
{ code: 'he', name: 'Hebrew', localName: 'Ivrit', isRTL: true },
{ code: 'hi', name: 'Hindi', localName: 'हिन्दी' },
{ code: 'hu', name: 'Hungarian', localName: 'Magyar' },
{ code: 'id', name: 'Indonesian', localName: 'Bahasa Indonesia' },
{ code: 'it', name: 'Italian', localName: 'Italiano' },
{ code: 'ja', name: 'Japanese', localName: '日本語' },
{ code: 'km', name: 'Khmer', localName: 'ភាសាខ្មែរ' },
{ code: 'kn', name: 'Kannada', localName: 'ಕನ್ನಡ' },
{ code: 'ko', name: 'Korean', localName: '한국어' },
{ code: 'ml', name: 'Malayalam', localName: 'മലയാളം' },
{ code: 'mr', name: 'Marathi', localName: 'मराठी' },
{ code: 'ne', name: 'Nepali', localName: 'नेपाली' },
{ code: 'nl', name: 'Dutch', localName: 'Nederlands' },
{ code: 'no', name: 'Norwegian', localName: 'Norsk' },
{ code: 'or', name: 'Odia', localName: 'ଓଡ଼ିଆ' },
{ code: 'pl', name: 'Polish', localName: 'Polski' },
{ code: 'pt', name: 'Portuguese', localName: 'Português' },
{ code: 'pt-BR', name: 'Brazilian Portuguese', localName: 'Brasil' },
{ code: 'ro', name: 'Romanian', localName: 'limba română' },
{ code: 'ru', name: 'Russian', localName: 'русский' },
{ code: 'sr', name: 'Serbian', localName: 'српски језик' },
{ code: 'sv', name: 'Swedish', localName: 'Svenska' },
{ code: 'ta', name: 'Tamil', localName: 'தமிழ்' },
{ code: 'tr', name: 'Turkish', localName: 'Türkçe' },
{ code: 'uk', name: 'Ukranian', localName: 'Українська мова' },
{ code: 'vi', name: 'Vietnamese', localName: 'Tiếng Việt' },
{ code: 'zh', name: 'Chinese', localName: '中文' },
].sort((a, b) => a.name.localeCompare(b.name));
export const languageMap: Record<string, Language> = languages.reduce(

View File

@ -23,8 +23,8 @@ import {
VolunteerActivism,
Work,
} from '@mui/icons-material';
import { Section as SectionRecord } from '@reactive-resume/schema';
import isEmpty from 'lodash/isEmpty';
import { Section as SectionRecord, SectionType } from 'schema';
import Basics from '@/components/build/LeftSidebar/sections/Basics';
import Location from '@/components/build/LeftSidebar/sections/Location';
@ -60,59 +60,136 @@ export const left: SidebarSection[] = [
{
id: 'work',
icon: <Work />,
component: <Section path="sections.work" titleKey="name" subtitleKey="position" isEditable isHideable />,
component: (
<Section
type={'work'}
addMore={true}
path="sections.work"
titleKey="name"
subtitleKey="position"
isEditable
isHideable
/>
),
},
{
id: 'education',
icon: <School />,
component: <Section path="sections.education" titleKey="institution" subtitleKey="area" isEditable isHideable />,
component: (
<Section
type={'education'}
path="sections.education"
titleKey="institution"
subtitleKey="area"
isEditable
isHideable
/>
),
},
{
id: 'awards',
icon: <EmojiEvents />,
component: <Section path="sections.awards" titleKey="title" subtitleKey="awarder" isEditable isHideable />,
component: (
<Section type={'awards'} path="sections.awards" titleKey="title" subtitleKey="awarder" isEditable isHideable />
),
},
{
id: 'certifications',
icon: <CardGiftcard />,
component: <Section path="sections.certifications" titleKey="name" subtitleKey="issuer" isEditable isHideable />,
component: (
<Section
type={'certifications'}
path="sections.certifications"
titleKey="name"
subtitleKey="issuer"
isEditable
isHideable
/>
),
},
{
id: 'publications',
icon: <MenuBook />,
component: <Section path="sections.publications" titleKey="name" subtitleKey="publisher" isEditable isHideable />,
component: (
<Section
type={'publications'}
path="sections.publications"
titleKey="name"
subtitleKey="publisher"
isEditable
isHideable
/>
),
},
{
id: 'skills',
icon: <Architecture />,
component: <Section path="sections.skills" titleKey="name" subtitleKey="level" isEditable isHideable />,
component: (
<Section type={'skills'} path="sections.skills" titleKey="name" subtitleKey="level" isEditable isHideable />
),
},
{
id: 'languages',
icon: <Language />,
component: <Section path="sections.languages" titleKey="name" subtitleKey="level" isEditable isHideable />,
component: (
<Section type={'languages'} path="sections.languages" titleKey="name" subtitleKey="level" isEditable isHideable />
),
},
{
id: 'interests',
icon: <Sailing />,
component: <Section path="sections.interests" titleKey="name" subtitleKey="keywords" isEditable isHideable />,
component: (
<Section
type={'interests'}
path="sections.interests"
titleKey="name"
subtitleKey="keywords"
isEditable
isHideable
/>
),
},
{
id: 'volunteer',
icon: <VolunteerActivism />,
component: (
<Section path="sections.volunteer" titleKey="organization" subtitleKey="position" isEditable isHideable />
<Section
type={'volunteer'}
path="sections.volunteer"
titleKey="organization"
subtitleKey="position"
isEditable
isHideable
/>
),
},
{
id: 'projects',
icon: <Coffee />,
component: <Section path="sections.projects" titleKey="name" subtitleKey="description" isEditable isHideable />,
component: (
<Section
type={'projects'}
path="sections.projects"
titleKey="name"
subtitleKey="description"
isEditable
isHideable
/>
),
},
{
id: 'references',
icon: <Groups />,
component: <Section path="sections.references" titleKey="name" subtitleKey="relationship" isEditable isHideable />,
component: (
<Section
type={'references'}
path="sections.references"
titleKey="name"
subtitleKey="relationship"
isEditable
isHideable
/>
),
},
];
@ -164,7 +241,19 @@ export const right: SidebarSection[] = [
},
];
export const getCustomSections = (sections: Record<string, SectionRecord>): Array<Required<SectionRecord>> => {
export const getSectionsByType = (sections: Record<string, SectionRecord>, type: SectionType): SectionRecord[] => {
if (isEmpty(sections)) return [];
return Object.entries(sections).reduce((acc, [id, section]) => {
if (section.type.startsWith(type) && section.isDuplicated) {
return [...acc, { ...section, id }];
}
return acc;
}, [] as SectionRecord[]);
};
export const getCustomSections = (sections: Record<string, SectionRecord>): SectionRecord[] => {
if (isEmpty(sections)) return [];
return Object.entries(sections).reduce((acc, [id, section]) => {
@ -173,7 +262,7 @@ export const getCustomSections = (sections: Record<string, SectionRecord>): Arra
}
return acc;
}, [] as Array<Required<SectionRecord>>);
}, [] as SectionRecord[]);
};
const sections = [...left, ...right];

View File

@ -1,6 +1,6 @@
import { createTheme } from '@mui/material';
import { createTheme, ThemeOptions } from '@mui/material/styles';
const theme = createTheme({
const theme: ThemeOptions = {
typography: {
fontSize: 12,
fontFamily: 'Inter, sans-serif',
@ -49,7 +49,7 @@ const theme = createTheme({
},
},
},
});
};
export const lightTheme = createTheme({
...theme,

View File

@ -0,0 +1,3 @@
import env from '@beam-australia/react-env';
export const FLAG_DISABLE_SIGNUPS = env('FLAG_DISABLE_SIGNUPS') === 'true';

View File

@ -3,13 +3,21 @@ export const FONTS_QUERY = 'fonts';
export const RESUMES_QUERY = 'resumes';
// Regular Expressions
export const VALID_URL_REGEX = /[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
export const VALID_URL_REGEX = /[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&/=]*)/;
// Date Formats
export const FILENAME_TIMESTAMP = 'DDMMYYYYHHmmss';
// Links
export const DONATION_URL = 'https://www.buymeacoffee.com/AmruthPillai';
export const DOCS_URL = 'https://docs.rxresu.me';
export const DONATION_URL = 'https://paypal.me/RajaRajanA';
export const TRANSLATE_URL = 'https://translate.rxresu.me/';
export const DIGITALOCEAN_URL = 'https://pillai.xyz/digitalocean';
export const REDDIT_URL = 'https://www.reddit.com/r/reactiveresume/';
export const GITHUB_URL = 'https://github.com/AmruthPillai/Reactive-Resume';
export const PRODUCT_HUNT_URL = 'https://www.producthunt.com/posts/reactive-resume-v3';
export const GITHUB_ISSUES_URL = 'https://github.com/AmruthPillai/Reactive-Resume/issues/new/choose';
// Default Error Message
export const DEFAULT_ERROR_MESSAGE =
'Something went wrong while performing this action, please report this issue on GitHub.';

View File

@ -54,16 +54,16 @@ const ForgotPasswordModal: React.FC = () => {
<BaseModal
icon={<Password />}
isOpen={isOpen}
heading={t('modals.auth.forgot-password.heading')}
heading={t<string>('modals.auth.forgot-password.heading')}
handleClose={handleClose}
footerChildren={
<Button type="submit" disabled={isLoading} onClick={handleSubmit(onSubmit)}>
{t('modals.auth.forgot-password.actions.send-email')}
{t<string>('modals.auth.forgot-password.actions.send-email')}
</Button>
}
>
<div className="grid gap-4">
<p>{t('modals.auth.forgot-password.body')}</p>
<p>{t<string>('modals.auth.forgot-password.body')}</p>
<form className="grid gap-4 xl:w-2/3">
<Controller
@ -72,7 +72,7 @@ const ForgotPasswordModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
autoFocus
label={t('modals.auth.forgot-password.form.email.label')}
label={t<string>('modals.auth.forgot-password.form.email.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -81,7 +81,7 @@ const ForgotPasswordModal: React.FC = () => {
/>
</form>
<p className="text-xs">{t('modals.auth.forgot-password.help-text')}</p>
<p className="text-xs">{t<string>('modals.auth.forgot-password.help-text')}</p>
</div>
</BaseModal>
</>

View File

@ -1,16 +1,18 @@
import env from '@beam-australia/react-env';
import { joiResolver } from '@hookform/resolvers/joi';
import { Google, Login, Visibility, VisibilityOff } from '@mui/icons-material';
import { Login, Visibility, VisibilityOff } from '@mui/icons-material';
import { Button, IconButton, InputAdornment, TextField } from '@mui/material';
import { CredentialResponse, GoogleLogin } from '@react-oauth/google';
import Joi from 'joi';
import isEmpty from 'lodash/isEmpty';
import { Trans, useTranslation } from 'next-i18next';
import { useMemo, useState } from 'react';
import { GoogleLoginResponse, GoogleLoginResponseOffline, useGoogleLogin } from 'react-google-login';
import { Controller, useForm } from 'react-hook-form';
import toast from 'react-hot-toast';
import { useIsMutating, useMutation } from 'react-query';
import BaseModal from '@/components/shared/BaseModal';
import { FLAG_DISABLE_SIGNUPS } from '@/constants/flags';
import { login, LoginParams, loginWithGoogle, LoginWithGoogleParams } from '@/services/auth';
import { ServerError } from '@/services/axios';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
@ -54,29 +56,13 @@ const LoginModal: React.FC = () => {
loginWithGoogle
);
const { signIn } = useGoogleLogin({
clientId: env('GOOGLE_CLIENT_ID'),
onSuccess: async (response: GoogleLoginResponse | GoogleLoginResponseOffline) => {
await loginWithGoogleMutation({ accessToken: (response as GoogleLoginResponse).accessToken });
handleClose();
},
});
const handleClose = () => {
dispatch(setModalState({ modal: 'auth.login', state: { open: false } }));
reset();
};
const onSubmit = async ({ identifier, password }: FormData) => {
await loginMutation(
{ identifier, password },
{
onError: (error) => {
toast.error(error.message);
},
}
);
await loginMutation({ identifier, password });
handleClose();
};
@ -91,8 +77,16 @@ const LoginModal: React.FC = () => {
dispatch(setModalState({ modal: 'auth.forgot', state: { open: true } }));
};
const handleLoginWithGoogle = () => {
signIn();
const handleLoginWithGoogle = async (response: CredentialResponse) => {
if (response.credential) {
await loginWithGoogleMutation({ credential: response.credential }, { onError: handleGoogleLoginError });
handleClose();
}
};
const handleGoogleLoginError = () => {
toast.error("Google doesn't seem to be responding, please try logging in using email/password instead.");
};
const PasswordVisibility = (): React.ReactElement => {
@ -111,27 +105,21 @@ const LoginModal: React.FC = () => {
<BaseModal
icon={<Login />}
isOpen={isOpen}
heading={t('modals.auth.login.heading')}
heading={t<string>('modals.auth.login.heading')}
handleClose={handleClose}
footerChildren={
<div className="flex gap-4">
<Button
type="submit"
variant="outlined"
disabled={isLoading}
startIcon={<Google />}
onClick={handleLoginWithGoogle}
>
{t('modals.auth.login.actions.google')}
</Button>
{!isEmpty(env('GOOGLE_CLIENT_ID')) && (
<GoogleLogin onSuccess={handleLoginWithGoogle} onError={handleGoogleLoginError} />
)}
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
{t('modals.auth.login.actions.login')}
{t<string>('modals.auth.login.actions.login')}
</Button>
</div>
}
>
<p>{t('modals.auth.login.body')}</p>
<p>{t<string>('modals.auth.login.body')}</p>
<form className="grid gap-4 xl:w-2/3">
<Controller
@ -140,9 +128,9 @@ const LoginModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
autoFocus
label={t('modals.auth.login.form.username.label')}
label={t<string>('modals.auth.login.form.username.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message || t('modals.auth.login.form.username.help-text')}
helperText={fieldState.error?.message || t<string>('modals.auth.login.form.username.help-text')}
{...field}
/>
)}
@ -154,7 +142,7 @@ const LoginModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
type={showPassword ? 'text' : 'password'}
label={t('modals.auth.login.form.password.label')}
label={t<string>('modals.auth.login.form.password.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
InputProps={{ endAdornment: <PasswordVisibility /> }}
@ -164,16 +152,18 @@ const LoginModal: React.FC = () => {
/>
</form>
<p className="text-xs">
<Trans t={t} i18nKey="modals.auth.login.register-text">
If you don&apos;t have one, you can <a onClick={handleCreateAccount}>create an account</a> here.
</Trans>
</p>
{!FLAG_DISABLE_SIGNUPS && (
<p className="text-xs">
<Trans t={t} i18nKey="modals.auth.login.register-text">
If you don&apos;t have one, you can <a onClick={handleCreateAccount}>create an account here.</a>
</Trans>
</p>
)}
<p className="text-xs">
<Trans t={t} i18nKey="modals.auth.login.recover-text">
In case you have forgotten your password, you can <a onClick={handleRecoverAccount}>recover your account</a>
here.
In case you have forgotten your password, you can
<a onClick={handleRecoverAccount}>recover your account here.</a>
</Trans>
</p>
</BaseModal>

View File

@ -1,11 +1,13 @@
import env from '@beam-australia/react-env';
import { joiResolver } from '@hookform/resolvers/joi';
import { Google, HowToReg } from '@mui/icons-material';
import { HowToReg } from '@mui/icons-material';
import { Button, TextField } from '@mui/material';
import { CredentialResponse, GoogleLogin } from '@react-oauth/google';
import Joi from 'joi';
import isEmpty from 'lodash/isEmpty';
import { Trans, useTranslation } from 'next-i18next';
import { GoogleLoginResponse, GoogleLoginResponseOffline, useGoogleLogin } from 'react-google-login';
import { Controller, useForm } from 'react-hook-form';
import toast from 'react-hot-toast';
import { useMutation } from 'react-query';
import BaseModal from '@/components/shared/BaseModal';
@ -62,15 +64,6 @@ const RegisterModal: React.FC = () => {
loginWithGoogle
);
const { signIn } = useGoogleLogin({
clientId: env('GOOGLE_CLIENT_ID'),
onSuccess: async (response: GoogleLoginResponse | GoogleLoginResponseOffline) => {
await loginWithGoogleMutation({ accessToken: (response as GoogleLoginResponse).accessToken });
handleClose();
},
});
const handleClose = () => {
dispatch(setModalState({ modal: 'auth.register', state: { open: false } }));
reset();
@ -86,35 +79,37 @@ const RegisterModal: React.FC = () => {
dispatch(setModalState({ modal: 'auth.login', state: { open: true } }));
};
const handleLoginWithGoogle = () => {
signIn();
const handleLoginWithGoogle = async (response: CredentialResponse) => {
if (response.credential) {
await loginWithGoogleMutation({ credential: response.credential }, { onError: handleGoogleLoginError });
handleClose();
}
};
const handleGoogleLoginError = () => {
toast("Google doesn't seem to be responding, please try logging in using email/password instead.");
};
return (
<BaseModal
icon={<HowToReg />}
isOpen={isOpen}
heading={t('modals.auth.register.heading')}
heading={t<string>('modals.auth.register.heading')}
handleClose={handleClose}
footerChildren={
<>
<Button
type="submit"
variant="outlined"
disabled={isLoading}
startIcon={<Google />}
onClick={handleLoginWithGoogle}
>
{t('modals.auth.register.actions.google')}
</Button>
<div className="flex gap-4">
{!isEmpty(env('GOOGLE_CLIENT_ID')) && (
<GoogleLogin onSuccess={handleLoginWithGoogle} onError={handleGoogleLoginError} />
)}
<Button type="submit" onClick={handleSubmit(onSubmit)} disabled={isLoading}>
{t('modals.auth.register.actions.register')}
{t<string>('modals.auth.register.actions.register')}
</Button>
</>
</div>
}
>
<p>{t('modals.auth.register.body')}</p>
<p>{t<string>('modals.auth.register.body')}</p>
<form className="grid gap-4 md:grid-cols-2">
<Controller
@ -123,7 +118,7 @@ const RegisterModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
autoFocus
label={t('modals.auth.register.form.name.label')}
label={t<string>('modals.auth.register.form.name.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -136,7 +131,7 @@ const RegisterModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('modals.auth.register.form.username.label')}
label={t<string>('modals.auth.register.form.username.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -150,7 +145,7 @@ const RegisterModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
type="email"
label={t('modals.auth.register.form.email.label')}
label={t<string>('modals.auth.register.form.email.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message}
@ -165,7 +160,7 @@ const RegisterModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
type="password"
label={t('modals.auth.register.form.password.label')}
label={t<string>('modals.auth.register.form.password.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -179,7 +174,7 @@ const RegisterModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
type="password"
label={t('modals.auth.register.form.confirm-password.label')}
label={t<string>('modals.auth.register.form.confirm-password.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}

View File

@ -65,15 +65,15 @@ const ResetPasswordModal: React.FC = () => {
<BaseModal
icon={<LockReset />}
isOpen={isOpen}
heading={t('modals.auth.reset-password.heading')}
heading={t<string>('modals.auth.reset-password.heading')}
handleClose={handleClose}
footerChildren={
<Button type="submit" disabled={isLoading} onClick={handleSubmit(onSubmit)}>
{t('modals.auth.reset-password.actions.set-password')}
{t<string>('modals.auth.reset-password.actions.set-password')}
</Button>
}
>
<p>{t('modals.auth.reset-password.body')}</p>
<p>{t<string>('modals.auth.reset-password.body')}</p>
<form className="grid gap-4 md:grid-cols-2">
<Controller
@ -83,7 +83,7 @@ const ResetPasswordModal: React.FC = () => {
<TextField
autoFocus
type="password"
label={t('modals.auth.reset-password.form.password.label')}
label={t<string>('modals.auth.reset-password.form.password.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -97,7 +97,7 @@ const ResetPasswordModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
type="password"
label={t('modals.auth.reset-password.form.confirm-password.label')}
label={t<string>('modals.auth.reset-password.form.confirm-password.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}

View File

@ -0,0 +1,161 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { CrisisAlert, ManageAccounts } from '@mui/icons-material';
import { Button, Divider, TextField } from '@mui/material';
import Joi from 'joi';
import { useRouter } from 'next/router';
import { Trans, useTranslation } from 'next-i18next';
import { useEffect, useMemo, useState } from 'react';
import { Controller, useForm } from 'react-hook-form';
import { useMutation } from 'react-query';
import Avatar from '@/components/shared/Avatar';
import BaseModal from '@/components/shared/BaseModal';
import { deleteAccount, updateProfile, UpdateProfileParams } from '@/services/auth';
import { ServerError } from '@/services/axios';
import { useAppDispatch, useAppSelector } from '@/store/hooks';
import { setModalState } from '@/store/modal/modalSlice';
type FormData = {
name: string;
email: string;
};
const defaultState: FormData = {
name: '',
email: '',
};
const schema = Joi.object({
name: Joi.string().required(),
email: Joi.string()
.email({ tlds: { allow: false } })
.required(),
});
const UserProfileModal = () => {
const router = useRouter();
const { t } = useTranslation();
const dispatch = useAppDispatch();
const [deleteText, setDeleteText] = useState<string>('');
const isDeleteTextValid = useMemo(() => deleteText.toLowerCase() === 'delete', [deleteText]);
const user = useAppSelector((state) => state.auth.user);
const { open: isOpen } = useAppSelector((state) => state.modal['auth.profile']);
const { mutateAsync: deleteAccountMutation } = useMutation<void, ServerError>(deleteAccount);
const { mutateAsync: updateProfileMutation } = useMutation<void, ServerError, UpdateProfileParams>(updateProfile);
const { reset, getFieldState, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
resolver: joiResolver(schema),
});
useEffect(() => {
if (user && !getFieldState('name').isTouched && !getFieldState('email').isTouched) {
reset({ name: user.name, email: user.email });
}
}, [user]);
const handleClose = () => {
dispatch(setModalState({ modal: 'auth.profile', state: { open: false } }));
};
const handleUpdate = handleSubmit(async (data) => {
handleClose();
await updateProfileMutation({ name: data.name });
});
const handleDelete = async () => {
await deleteAccountMutation();
handleClose();
router.push('/');
};
return (
<BaseModal isOpen={isOpen} handleClose={handleClose} heading="Your Account" icon={<ManageAccounts />}>
<div className="grid gap-4">
<form className="grid gap-4 xl:w-2/3">
<div className="flex items-center gap-4">
<Avatar interactive={false} />
<div className="grid flex-1 gap-1.5">
<Controller
name="name"
control={control}
render={({ field, fieldState }) => (
<TextField
autoFocus
label={t<string>('modals.auth.profile.form.name.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
/>
)}
/>
<p className="pl-4 text-[10.25px] opacity-50">
<Trans t={t} i18nKey="modals.auth.profile.form.avatar.help-text">
You can update your profile picture on{' '}
<a href="https://gravatar.com/" target="_blank" rel="noreferrer">
Gravatar
</a>
</Trans>
</p>
</div>
</div>
<Controller
name="email"
control={control}
render={({ field, fieldState }) => (
<TextField
disabled
label={t<string>('modals.auth.profile.form.email.label')}
error={!!fieldState.error}
helperText={t<string>('modals.auth.profile.form.email.help-text')}
{...field}
/>
)}
/>
<div>
<Button onClick={handleUpdate}>{t<string>('modals.auth.profile.actions.save')}</Button>
</div>
</form>
<div className="my-2">
<Divider />
</div>
<div className="flex items-center gap-2">
<CrisisAlert />
<h5 className="font-medium">{t<string>('modals.auth.profile.delete-account.heading')}</h5>
</div>
<p className="text-xs opacity-75">
{t<string>('modals.auth.profile.delete-account.body', { keyword: 'delete' })}
</p>
<div className="flex max-w-xs flex-col gap-4">
<TextField
value={deleteText}
placeholder="Type 'delete' to confirm"
onChange={(e) => setDeleteText(e.target.value)}
/>
<div>
<Button variant="contained" color="error" disabled={!isDeleteTextValid} onClick={handleDelete}>
{t<string>('modals.auth.profile.delete-account.actions.delete')}
</Button>
</div>
</div>
</div>
</BaseModal>
);
};
export default UserProfileModal;

View File

@ -1,8 +1,8 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import DatePicker from '@mui/lab/DatePicker';
import { Button, TextField } from '@mui/material';
import { Award, SectionPath } from '@reactive-resume/schema';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import { Award, SectionPath } from 'schema';
import dayjs from 'dayjs';
import Joi from 'joi';
import get from 'lodash/get';
@ -44,14 +44,14 @@ const AwardModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -93,7 +93,7 @@ const AwardModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="title"
control={control}
@ -101,7 +101,7 @@ const AwardModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.title.label')}
label={t<string>('builder.common.form.title.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -115,7 +115,7 @@ const AwardModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label={t('builder.leftSidebar.sections.awards.form.awarder.label')}
label={t<string>('builder.leftSidebar.sections.awards.form.awarder.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -128,21 +128,23 @@ const AwardModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
)}
/>
)}
/>
@ -152,7 +154,7 @@ const AwardModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.url.label')}
label={t<string>('builder.common.form.url.label')}
placeholder="https://"
error={!!fieldState.error}
helperText={fieldState.error?.message}
@ -169,7 +171,7 @@ const AwardModal: React.FC = () => {
multiline
minRows={3}
maxRows={6}
label={t('builder.common.form.summary.label')}
label={t<string>('builder.common.form.summary.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message || <MarkdownSupported />}
@ -177,6 +179,7 @@ const AwardModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,8 +1,8 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import DatePicker from '@mui/lab/DatePicker';
import { Button, TextField } from '@mui/material';
import { Certificate, SectionPath } from '@reactive-resume/schema';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import { Certificate, SectionPath } from 'schema';
import dayjs from 'dayjs';
import Joi from 'joi';
import get from 'lodash/get';
@ -44,14 +44,14 @@ const CertificateModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -93,7 +93,7 @@ const CertificateModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="name"
control={control}
@ -101,7 +101,7 @@ const CertificateModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.name.label')}
label={t<string>('builder.common.form.name.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -115,7 +115,7 @@ const CertificateModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label={t('builder.leftSidebar.sections.certifications.form.issuer.label')}
label={t<string>('builder.leftSidebar.sections.certifications.form.issuer.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -128,21 +128,23 @@ const CertificateModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
)}
/>
)}
/>
@ -152,7 +154,7 @@ const CertificateModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.url.label')}
label={t<string>('builder.common.form.url.label')}
placeholder="https://"
error={!!fieldState.error}
helperText={fieldState.error?.message}
@ -169,7 +171,7 @@ const CertificateModal: React.FC = () => {
multiline
minRows={3}
maxRows={6}
label={t('builder.common.form.summary.label')}
label={t<string>('builder.common.form.summary.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message || <MarkdownSupported />}
@ -177,6 +179,7 @@ const CertificateModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,8 +1,8 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import DatePicker from '@mui/lab/DatePicker';
import { Button, Slider, TextField } from '@mui/material';
import { Custom } from '@reactive-resume/schema';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import { Custom } from 'schema';
import dayjs from 'dayjs';
import Joi from 'joi';
import get from 'lodash/get';
@ -60,15 +60,16 @@ const CustomModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal['builder.sections.custom']);
const path: string = get(payload, 'path', '');
const path: string = get(payload, 'path', 'sections.custom');
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -110,7 +111,7 @@ const CustomModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="title"
control={control}
@ -118,7 +119,7 @@ const CustomModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.title.label')}
label={t<string>('builder.common.form.title.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -131,7 +132,7 @@ const CustomModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.subtitle.label')}
label={t<string>('builder.common.form.subtitle.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -144,21 +145,23 @@ const CustomModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.start-date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.start-date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
)}
/>
)}
/>
@ -168,21 +171,23 @@ const CustomModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.end-date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.end-date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || t<string>('builder.common.form.end-date.help-text')}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || 'Leave this field blank, if still present'}
/>
)}
/>
)}
/>
@ -192,7 +197,7 @@ const CustomModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.url.label')}
label={t<string>('builder.common.form.url.label')}
placeholder="https://"
className="col-span-2"
error={!!fieldState.error}
@ -207,7 +212,7 @@ const CustomModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.level.label')}
label={t<string>('builder.common.form.level.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message}
@ -221,7 +226,7 @@ const CustomModal: React.FC = () => {
control={control}
render={({ field }) => (
<div className="col-span-2">
<h4 className="mb-3 font-semibold">{t('builder.common.form.levelNum.label')}</h4>
<h4 className="mb-3 font-semibold">{t<string>('builder.common.form.levelNum.label')}</h4>
<div className="px-10">
<Slider
@ -245,7 +250,7 @@ const CustomModal: React.FC = () => {
defaultValue={0}
color="secondary"
valueLabelDisplay="auto"
aria-label={t('builder.common.form.levelNum.label')}
aria-label={t<string>('builder.common.form.levelNum.label')}
/>
</div>
</div>
@ -260,9 +265,9 @@ const CustomModal: React.FC = () => {
multiline
minRows={3}
maxRows={6}
label={t('builder.common.form.summary.label')}
className="col-span-2"
error={!!fieldState.error}
label={t<string>('builder.common.form.summary.label')}
helperText={fieldState.error?.message || <MarkdownSupported />}
{...field}
/>
@ -274,7 +279,7 @@ const CustomModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<ArrayInput
label={t('builder.common.form.keywords.label')}
label={t<string>('builder.common.form.keywords.label')}
value={field.value as string[]}
onChange={field.onChange}
errors={fieldState.error}
@ -282,6 +287,7 @@ const CustomModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,8 +1,8 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import DatePicker from '@mui/lab/DatePicker';
import { Button, TextField } from '@mui/material';
import { Education, SectionPath } from '@reactive-resume/schema';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import { Education, SectionPath } from 'schema';
import dayjs from 'dayjs';
import Joi from 'joi';
import get from 'lodash/get';
@ -57,14 +57,14 @@ const EducationModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -106,7 +106,7 @@ const EducationModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="institution"
control={control}
@ -114,7 +114,7 @@ const EducationModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.leftSidebar.sections.education.form.institution.label')}
label={t<string>('builder.leftSidebar.sections.education.form.institution.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -128,7 +128,7 @@ const EducationModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label={t('builder.leftSidebar.sections.education.form.degree.label')}
label={t<string>('builder.leftSidebar.sections.education.form.degree.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -141,7 +141,7 @@ const EducationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.leftSidebar.sections.education.form.area-study.label')}
label={t<string>('builder.leftSidebar.sections.education.form.area-study.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -154,7 +154,7 @@ const EducationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.leftSidebar.sections.education.form.grade.label')}
label={t<string>('builder.leftSidebar.sections.education.form.grade.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -167,21 +167,23 @@ const EducationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.start-date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.start-date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
)}
/>
)}
/>
@ -191,21 +193,23 @@ const EducationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.end-date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.end-date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || t<string>('builder.common.form.end-date.help-text')}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || t('builder.common.form.end-date.help-text')}
/>
)}
/>
)}
/>
@ -215,7 +219,7 @@ const EducationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.url.label')}
label={t<string>('builder.common.form.url.label')}
placeholder="https://"
className="col-span-2"
error={!!fieldState.error}
@ -233,7 +237,7 @@ const EducationModal: React.FC = () => {
multiline
minRows={3}
maxRows={6}
label={t('builder.common.form.summary.label')}
label={t<string>('builder.common.form.summary.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message || <MarkdownSupported />}
@ -247,7 +251,7 @@ const EducationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<ArrayInput
label={t('builder.leftSidebar.sections.education.form.courses.label')}
label={t<string>('builder.leftSidebar.sections.education.form.courses.label')}
value={field.value as string[]}
onChange={field.onChange}
errors={fieldState.error}
@ -255,6 +259,7 @@ const EducationModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,7 +1,7 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import { Button, TextField } from '@mui/material';
import { Interest, SectionPath } from '@reactive-resume/schema';
import { Interest, SectionPath } from 'schema';
import Joi from 'joi';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
@ -35,14 +35,14 @@ const InterestModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -84,7 +84,7 @@ const InterestModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="name"
control={control}
@ -92,7 +92,7 @@ const InterestModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.name.label')}
label={t<string>('builder.common.form.name.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message}
@ -106,7 +106,7 @@ const InterestModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<ArrayInput
label={t('builder.common.form.keywords.label')}
label={t<string>('builder.common.form.keywords.label')}
value={field.value as string[]}
onChange={field.onChange}
errors={fieldState.error}
@ -114,6 +114,7 @@ const InterestModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,7 +1,7 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import { Button, Slider, TextField } from '@mui/material';
import { Language, SectionPath } from '@reactive-resume/schema';
import { Language, SectionPath } from 'schema';
import Joi from 'joi';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
@ -36,14 +36,14 @@ const LanguageModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -85,7 +85,7 @@ const LanguageModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="name"
control={control}
@ -93,7 +93,7 @@ const LanguageModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.name.label')}
label={t<string>('builder.common.form.name.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -107,7 +107,7 @@ const LanguageModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label={t('builder.common.form.level.label')}
label={t<string>('builder.common.form.level.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -120,7 +120,7 @@ const LanguageModal: React.FC = () => {
control={control}
render={({ field }) => (
<div className="col-span-2">
<h4 className="mb-3 font-semibold">{t('builder.common.form.levelNum.label')}</h4>
<h4 className="mb-3 font-semibold">{t<string>('builder.common.form.levelNum.label')}</h4>
<div className="px-10">
<Slider
@ -144,12 +144,13 @@ const LanguageModal: React.FC = () => {
defaultValue={0}
color="secondary"
valueLabelDisplay="auto"
aria-label={t('builder.common.form.levelNum.label')}
aria-label={t<string>('builder.common.form.levelNum.label')}
/>
</div>
</div>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,7 +1,7 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, AlternateEmail, DriveFileRenameOutline } from '@mui/icons-material';
import { Button, TextField } from '@mui/material';
import { Profile } from '@reactive-resume/schema';
import { Profile } from 'schema';
import Joi from 'joi';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
@ -42,11 +42,11 @@ const ProfileModal: React.FC = () => {
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = t('builder.common.actions.add', {
token: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
const addText = t<string>('builder.common.actions.add', {
token: t<string>('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
});
const editText = t('builder.common.actions.edit', {
token: t('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
const editText = t<string>('builder.common.actions.edit', {
token: t<string>('builder.leftSidebar.sections.profiles.heading', { count: 1 }),
});
const { reset, control, handleSubmit } = useForm<FormData>({
@ -89,7 +89,7 @@ const ProfileModal: React.FC = () => {
handleClose={handleClose}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="network"
control={control}
@ -97,7 +97,7 @@ const ProfileModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.leftSidebar.sections.profiles.form.network.label')}
label={t<string>('builder.leftSidebar.sections.profiles.form.network.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -111,7 +111,7 @@ const ProfileModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label={t('builder.leftSidebar.sections.profiles.form.username.label')}
label={t<string>('builder.leftSidebar.sections.profiles.form.username.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
InputProps={{
@ -127,7 +127,7 @@ const ProfileModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.url.label')}
label={t<string>('builder.common.form.url.label')}
className="col-span-2"
placeholder="https://"
error={!!fieldState.error}
@ -136,6 +136,7 @@ const ProfileModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,8 +1,8 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import DatePicker from '@mui/lab/DatePicker';
import { Button, TextField } from '@mui/material';
import { Project, SectionPath } from '@reactive-resume/schema';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import { Project, SectionPath } from 'schema';
import dayjs from 'dayjs';
import Joi from 'joi';
import get from 'lodash/get';
@ -53,14 +53,14 @@ const ProjectModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -102,7 +102,7 @@ const ProjectModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="name"
control={control}
@ -110,7 +110,7 @@ const ProjectModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.name.label')}
label={t<string>('builder.common.form.name.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -124,7 +124,7 @@ const ProjectModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label={t('builder.common.form.description.label')}
label={t<string>('builder.common.form.description.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -137,21 +137,23 @@ const ProjectModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.start-date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.start-date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
)}
/>
)}
/>
@ -161,21 +163,23 @@ const ProjectModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.end-date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.end-date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || t<string>('builder.common.form.end-date.help-text')}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || 'Leave this field blank, if still present'}
/>
)}
/>
)}
/>
@ -185,7 +189,7 @@ const ProjectModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.url.label')}
label={t<string>('builder.common.form.url.label')}
placeholder="https://"
className="col-span-2"
error={!!fieldState.error}
@ -203,7 +207,7 @@ const ProjectModal: React.FC = () => {
multiline
minRows={3}
maxRows={6}
label={t('builder.common.form.summary.label')}
label={t<string>('builder.common.form.summary.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message || <MarkdownSupported />}
@ -217,7 +221,7 @@ const ProjectModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<ArrayInput
label={t('builder.common.form.keywords.label')}
label={t<string>('builder.common.form.keywords.label')}
value={field.value as string[]}
onChange={field.onChange}
errors={fieldState.error}
@ -225,6 +229,7 @@ const ProjectModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,8 +1,8 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import DatePicker from '@mui/lab/DatePicker';
import { Button, TextField } from '@mui/material';
import { Publication, SectionPath } from '@reactive-resume/schema';
import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import { Publication, SectionPath } from 'schema';
import dayjs from 'dayjs';
import Joi from 'joi';
import get from 'lodash/get';
@ -44,14 +44,14 @@ const PublicationModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -93,7 +93,7 @@ const PublicationModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="name"
control={control}
@ -101,7 +101,7 @@ const PublicationModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.name.label')}
label={t<string>('builder.common.form.name.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -115,7 +115,7 @@ const PublicationModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label="{t('builder.leftSidebar.sections.publications.form.publisher.label')}"
label={t<string>('builder.leftSidebar.sections.publications.form.publisher.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -128,21 +128,23 @@ const PublicationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<DatePicker
{...field}
openTo="year"
label={t('builder.common.form.date.label')}
inputRef={field.ref}
label={t<string>('builder.common.form.date.label')}
value={dayjs(field.value)}
views={['year', 'month', 'day']}
onChange={(date: Date | null, keyboardInputValue: string | undefined) => {
isEmpty(keyboardInputValue) && field.onChange('');
date && dayjs(date).isValid() && field.onChange(date.toISOString());
slots={{
textField: (params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
),
}}
onChange={(date: dayjs.Dayjs | null) => {
date && dayjs(date).isValid() && field.onChange(dayjs(date).format('YYYY-MM-DD'));
}}
renderInput={(params) => (
<TextField
{...params}
error={!!fieldState.error}
helperText={fieldState.error?.message || params.inputProps?.placeholder}
/>
)}
/>
)}
/>
@ -152,7 +154,7 @@ const PublicationModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.url.label')}
label={t<string>('builder.common.form.url.label')}
placeholder="https://"
error={!!fieldState.error}
helperText={fieldState.error?.message}
@ -169,7 +171,7 @@ const PublicationModal: React.FC = () => {
multiline
minRows={3}
maxRows={6}
label={t('builder.common.form.summary.label')}
label={t<string>('builder.common.form.summary.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message || <MarkdownSupported />}
@ -177,6 +179,7 @@ const PublicationModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

View File

@ -1,7 +1,7 @@
import { joiResolver } from '@hookform/resolvers/joi';
import { Add, DriveFileRenameOutline } from '@mui/icons-material';
import { Button, TextField } from '@mui/material';
import { Reference, SectionPath } from '@reactive-resume/schema';
import { Reference, SectionPath } from 'schema';
import Joi from 'joi';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
@ -41,14 +41,14 @@ const ReferenceModal: React.FC = () => {
const dispatch = useAppDispatch();
const heading = useAppSelector((state) => get(state.resume, `${path}.name`));
const heading = useAppSelector((state) => get(state.resume.present, `${path}.name`));
const { open: isOpen, payload } = useAppSelector((state) => state.modal[`builder.${path}`]);
const item: FormData = get(payload, 'item', null);
const isEditMode = useMemo(() => !!item, [item]);
const addText = useMemo(() => t('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t('builder.common.actions.edit', { token: heading }), [t, heading]);
const addText = useMemo(() => t<string>('builder.common.actions.add', { token: heading }), [t, heading]);
const editText = useMemo(() => t<string>('builder.common.actions.edit', { token: heading }), [t, heading]);
const { reset, control, handleSubmit } = useForm<FormData>({
defaultValues: defaultState,
@ -90,7 +90,7 @@ const ReferenceModal: React.FC = () => {
heading={isEditMode ? editText : addText}
footerChildren={<Button onClick={handleSubmit(onSubmit)}>{isEditMode ? editText : addText}</Button>}
>
<form className="my-2 grid grid-cols-2 gap-4">
<form className="my-2 grid grid-cols-2 gap-4" onSubmit={handleSubmit(onSubmit)}>
<Controller
name="name"
control={control}
@ -98,7 +98,7 @@ const ReferenceModal: React.FC = () => {
<TextField
required
autoFocus
label={t('builder.common.form.name.label')}
label={t<string>('builder.common.form.name.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -112,7 +112,7 @@ const ReferenceModal: React.FC = () => {
render={({ field, fieldState }) => (
<TextField
required
label={t('builder.leftSidebar.sections.references.form.relationship.label')}
label={t<string>('builder.leftSidebar.sections.references.form.relationship.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -125,7 +125,7 @@ const ReferenceModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.phone.label')}
label={t<string>('builder.common.form.phone.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -138,7 +138,7 @@ const ReferenceModal: React.FC = () => {
control={control}
render={({ field, fieldState }) => (
<TextField
label={t('builder.common.form.email.label')}
label={t<string>('builder.common.form.email.label')}
error={!!fieldState.error}
helperText={fieldState.error?.message}
{...field}
@ -154,7 +154,7 @@ const ReferenceModal: React.FC = () => {
multiline
minRows={3}
maxRows={6}
label={t('builder.common.form.summary.label')}
label={t<string>('builder.common.form.summary.label')}
className="col-span-2"
error={!!fieldState.error}
helperText={fieldState.error?.message || <MarkdownSupported />}
@ -162,6 +162,7 @@ const ReferenceModal: React.FC = () => {
/>
)}
/>
<input type="submit" style={{ display: 'none' }} />
</form>
</BaseModal>
);

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