Compare commits

..

379 Commits

Author SHA1 Message Date
Szilárd Dóró
6a74a97cd0 Merge pull request #1978 from nhost/changeset-release/main
chore: update versions
2023-05-30 15:07:59 +02:00
github-actions[bot]
291185e609 chore: update versions 2023-05-30 12:43:56 +00:00
Szilárd Dóró
d3f965048a Merge pull request #1976 from nhost/feat/enable-secrets
feat(dashboard): enable secrets
2023-05-30 14:42:39 +02:00
Szilárd Dóró
9b0d4dde50 feat: enable secrets 2023-05-30 14:16:20 +02:00
Nuno Pato
06d6ae0e86 Merge pull request #1971 from nhost/changeset-release/main
chore: update versions
2023-05-28 01:22:55 +00:00
github-actions[bot]
1777c147b2 chore: update versions 2023-05-26 18:59:45 +00:00
Nuno Pato
9d784b82c8 Merge pull request #1969 from nhost/chore/add-postgres-latest-version
chore: add latest postgres image
2023-05-26 18:58:30 +00:00
Nuno Pato
15d84a1966 chore: add latest postgres image 2023-05-26 16:52:52 +00:00
Nuno Pato
8a1a1e06aa Merge pull request #1963 from nhost/dbarroso/functions-metrics
chore: docs: update info about metrics to mention functions
2023-05-26 10:17:43 +00:00
David Barroso
eb1d7137cf fix link 2023-05-26 11:02:09 +02:00
David Barroso
cf55e8e111 chore: ammend functions dashboard (#1964) 2023-05-25 19:25:30 +02:00
David Barroso
b47c797d73 asd 2023-05-25 14:50:25 +02:00
David Barroso
dafc4b2635 chore: docs: update info about metrics to mention functions 2023-05-25 14:49:45 +02:00
David Barroso
0ccd9c82b1 feat: observability: added dashboard for metrics (#1961) 2023-05-25 13:29:55 +02:00
Szilárd Dóró
0dd1883815 Merge pull request #1954 from nhost/changeset-release/main
chore: update versions
2023-05-24 09:43:17 +02:00
github-actions[bot]
01ba429007 chore: update versions 2023-05-23 14:38:21 +00:00
Szilárd Dóró
fdf5b3035c Merge pull request #1951 from nhost/feat/pat-ui
feat(dashboard): add support for personal access tokens
2023-05-23 16:37:07 +02:00
Szilárd Dóró
ae52ca6303 fix: don't break tests 2023-05-23 15:52:36 +02:00
Szilárd Dóró
428222bf5f chore: revert "Note" to "Name" 2023-05-23 15:42:47 +02:00
Szilárd Dóró
090ee51854 Merge branch 'main' into feat/pat-ui 2023-05-23 15:34:42 +02:00
Szilárd Dóró
766c8431f1 Merge pull request #1944 from nhost/chore/under-the-hood-improvements
chore(dashboard): under the hood improvements
2023-05-23 15:31:45 +02:00
Szilárd Dóró
4c62617472 chore: add changeset 2023-05-23 15:10:45 +02:00
Szilárd Dóró
01f3cbb07a chore: update import paths 2023-05-23 15:09:20 +02:00
Szilárd Dóró
62f5d8b69e Merge branch 'main' into chore/under-the-hood-improvements 2023-05-23 14:37:57 +02:00
Szilárd Dóró
88e2c05afc Merge pull request #1947 from nhost/renovate/fontsource-inter-5.x
fix(deps): bump @fontsource monorepo to v5
2023-05-23 14:04:34 +02:00
Szilárd Dóró
f1edbfdbf1 chore: improve PAT table 2023-05-23 13:56:15 +02:00
Szilárd Dóró
a9943eef3f chore: remove unused codegen plugin 2023-05-23 12:42:29 +02:00
Szilárd Dóró
431e61a684 Merge branch 'main' into renovate/fontsource-inter-5.x 2023-05-23 12:40:44 +02:00
Szilárd Dóró
87e7f7d4f5 fix: revert to 365 days 2023-05-23 12:39:20 +02:00
Szilárd Dóró
5aab6b1896 fix: don't break tests 2023-05-23 11:11:29 +02:00
Szilárd Dóró
e4e216da6d chore: update PAT form structure 2023-05-23 11:07:59 +02:00
Szilárd Dóró
cd8ccdf59a Merge remote-tracking branch 'origin/main' into feat/pat-ui 2023-05-23 10:27:26 +02:00
Szilárd Dóró
9421dda73d Merge pull request #1953 from nhost/changeset-release/main
chore: update versions
2023-05-23 10:20:13 +02:00
github-actions[bot]
f13dc75993 chore: update versions 2023-05-23 08:16:17 +00:00
Szilárd Dóró
0a8b42d371 Merge pull request #1939 from nhost/feat/service-versions
feat(dashboard): add service version selectors
2023-05-23 10:15:03 +02:00
Szilárd Dóró
bd59d61e94 chore: update available Hasura Storage versions 2023-05-23 09:46:27 +02:00
Szilárd Dóró
349622fca2 chore: update available Hasura versions 2023-05-23 09:43:41 +02:00
Szilárd Dóró
dfe8588a94 chore: simplify account settings structure 2023-05-23 09:40:33 +02:00
Szilárd Dóró
0167df5534 chore: update settings layout 2023-05-23 09:30:37 +02:00
Szilárd Dóró
7c790b3afe fix: don't use test.only 2023-05-22 20:57:06 +02:00
Szilárd Dóró
1b3a8a1638 chore: add tests for PAT 2023-05-22 17:38:19 +02:00
Szilárd Dóró
99edd0129a chore: add changeset 2023-05-22 16:26:15 +02:00
Szilárd Dóró
cfb759c34a feat: finalize PAT support 2023-05-22 16:25:49 +02:00
Szilárd Dóró
6c5a645876 feat: add support for listing PATs 2023-05-22 16:10:56 +02:00
Szilárd Dóró
db459b09ec feat: add support for PAT creation 2023-05-22 15:57:37 +02:00
Szilárd Dóró
e4fa63a571 feat: start working on PAT settings 2023-05-22 15:37:15 +02:00
Szilárd Dóró
4ce552c8eb feat: restore password change feature 2023-05-22 15:03:10 +02:00
Szilárd Dóró
b847c6d003 feat: prepare account settings page 2023-05-22 14:42:27 +02:00
Szilárd Dóró
daab7d8eeb Merge branch 'main' into feat/service-versions 2023-05-22 13:29:08 +02:00
Szilárd Dóró
1b4f074dfd chore: update Hasura version selector 2023-05-22 13:15:41 +02:00
Szilárd Dóró
cca7075721 fix: use tailwind classes in features 2023-05-22 12:26:18 +02:00
Szilárd Dóró
4c1b96ccc6 Merge branch 'main' into chore/under-the-hood-improvements 2023-05-22 11:53:08 +02:00
Szilárd Dóró
809a2d35f8 Merge pull request #1940 from nhost/changeset-release/main
chore: update versions
2023-05-22 11:51:04 +02:00
Szilárd Dóró
084b7ce6d2 Merge branch 'main' into feat/service-versions 2023-05-22 09:41:39 +02:00
github-actions[bot]
e17ec7fce7 chore: update versions 2023-05-22 07:26:27 +00:00
Szilárd Dóró
241175b158 Merge pull request #1935 from nhost/renovate/prettier-plugin-tailwindcss-0.x
chore(deps): update dependency prettier-plugin-tailwindcss to ^0.3.0
2023-05-22 09:14:39 +02:00
Szilárd Dóró
9b209ef419 update pnpm-lock file 2023-05-22 09:07:45 +02:00
Szilárd Dóró
a86d17c81f Merge branch 'renovate/fontsource-inter-5.x' of https://github.com/nhost/nhost into renovate/fontsource-inter-5.x 2023-05-22 09:07:32 +02:00
Szilárd Dóró
cc047b719a chore: bump @fontsource monorepo 2023-05-22 09:06:09 +02:00
renovate[bot]
889b071134 fix(deps): update dependency @fontsource/inter to v5 2023-05-22 07:04:25 +00:00
Szilárd Dóró
51ceaf2696 Merge pull request #1950 from nhost/fix/nextjs-react-error
fix(nextjs): don't break Next.js when using SignedIn/SignedOut
2023-05-22 09:00:26 +02:00
renovate[bot]
eee3f5723e fix(deps): update dependency @fontsource/inter to v5 2023-05-21 16:50:23 +00:00
Szilárd Dóró
490b77cde4 Merge pull request #1949 from nhost/fix/local-infinite-loop
fix(dashboard): don't enter an infinite loop in local mode
2023-05-21 18:14:05 +02:00
Szilárd Dóró
7fea29a8b4 chore: add changeset 2023-05-21 18:13:34 +02:00
Szilárd Dóró
1a34e011ad fix: don't break Next.js when using SignedIn/SignedOut 2023-05-21 18:08:42 +02:00
Szilárd Dóró
395839f449 chore: check service URL when creating client 2023-05-21 16:34:00 +02:00
Szilárd Dóró
399009d66a fix(gql): don't enter an infinite loop when fetching remote app data 2023-05-21 16:31:57 +02:00
Szilárd Dóró
12eb236c4a chore: add changeset 2023-05-19 17:14:22 +02:00
Szilárd Dóró
2218e5cd5b Merge branch 'main' into renovate/prettier-plugin-tailwindcss-0.x 2023-05-19 17:12:36 +02:00
Szilárd Dóró
2dcf1b38c6 Merge pull request #1945 from nhost/fix/404-not-found
fix(dashboard): don't redirect to 404 on project creation
2023-05-19 16:16:13 +02:00
Szilárd Dóró
412520ac10 fix: don't break tests 2023-05-19 15:32:27 +02:00
Szilárd Dóró
ad49c92879 fix: trigger project list refetch properly 2023-05-19 15:31:17 +02:00
Szilárd Dóró
13dd57eeb4 Merge pull request #1943 from nhost/fix/deployment-sorting
fix(dashboard): sync deployment sorting
2023-05-19 15:27:44 +02:00
Szilárd Dóró
1345741b11 fix: don't redirect to 404 2023-05-19 15:26:20 +02:00
Szilárd Dóró
3cb63a6da9 chore: move overview files to the features folder 2023-05-19 14:36:08 +02:00
Szilárd Dóró
985f648204 chore: simplify folder structure 2023-05-19 13:47:21 +02:00
Szilárd Dóró
bbc3aa8896 fix: don't hide custom option 2023-05-19 13:44:05 +02:00
Szilárd Dóró
3d51de4a60 chore: move hooks to the features folder 2023-05-19 12:15:42 +02:00
Szilárd Dóró
b46afa37c6 chore: simplify folder structure 2023-05-19 12:10:08 +02:00
Szilárd Dóró
8ad6358d76 chore: delete unnecessary hook 2023-05-19 12:01:16 +02:00
Szilárd Dóró
f73f8366e4 chore: move every database code to features 2023-05-19 11:58:45 +02:00
renovate[bot]
511615f176 chore(deps): update dependency prettier-plugin-tailwindcss to ^0.3.0 2023-05-19 09:51:56 +00:00
Szilárd Dóró
1198c201f1 Merge pull request #1922 from nhost/renovate/turbo-1.x
chore(deps): update dependency turbo to v1.9.8
2023-05-19 11:48:43 +02:00
Szilárd Dóró
cab803e5b7 chore: move data browser files to features 2023-05-19 11:10:36 +02:00
Szilárd Dóró
59fea65eb6 feat: migrate storage-related files to features 2023-05-19 10:44:58 +02:00
Szilárd Dóró
f9b81a2ae9 chore: bump version in the Dockerfile as well 2023-05-19 10:34:21 +02:00
Szilárd Dóró
23bac2d29c Merge branch 'main' into feat/service-versions 2023-05-19 10:27:55 +02:00
Szilárd Dóró
78739f77b1 feat: add support for project status indicator 2023-05-19 09:59:33 +02:00
Szilárd Dóró
dff0894f37 Revert "fix: sync deployment sorting"
This reverts commit 80f3645d57.
2023-05-19 09:38:04 +02:00
Szilárd Dóró
80f3645d57 fix: sync deployment sorting 2023-05-19 09:27:24 +02:00
Szilárd Dóró
7ddb9a654e fix: sync deployment sorting 2023-05-19 09:10:44 +02:00
Szilárd Dóró
71f3be15d8 Merge pull request #1941 from nhost/chore/under-the-hood-improvements
chore(dashboard): under the hood improvements
2023-05-19 09:03:46 +02:00
Szilárd Dóró
96a9070836 chore: loosen eslint rules 2023-05-18 17:07:15 +02:00
Szilárd Dóró
329e5a91b9 fix: use the correct deployment ordering 2023-05-18 16:01:44 +02:00
Szilárd Dóró
6d559d6e23 chore: under the hood improvements 2023-05-18 11:39:22 +02:00
renovate[bot]
f4f1450d06 chore(deps): update dependency turbo to v1.9.8 2023-05-18 08:22:54 +00:00
Szilárd Dóró
a1eea9df7d Merge pull request #1932 from nhost/renovate/docusaurus-monorepo
fix(deps): update docusaurus monorepo to v2.4.1
2023-05-18 10:16:23 +02:00
Szilárd Dóró
26f2b665e6 Merge pull request #1924 from nhost/feat/pat
feat(hasura-auth-js): add support for personal access tokens
2023-05-18 10:14:12 +02:00
Szilárd Dóró
8989202692 chore: improve variable name 2023-05-18 10:09:03 +02:00
Szilárd Dóró
2ae463f11f fix: don't break builds 2023-05-18 10:06:43 +02:00
Szilárd Dóró
18a786e880 feat: add storage settings page 2023-05-18 10:03:15 +02:00
Szilárd Dóró
c88fbe1e17 feat: allow changing db version
chore: reorganize features folder
2023-05-18 09:50:36 +02:00
Szilárd Dóró
78c7109c46 chore: add changeset 2023-05-18 08:54:41 +02:00
Szilárd Dóró
c7b968868a feat: use hardcoded images instead 2023-05-17 16:47:40 +02:00
Szilárd Dóró
77a3473166 feat: add support for version autocomplete 2023-05-17 13:51:39 +02:00
renovate[bot]
224a5cc805 fix(deps): update docusaurus monorepo to v2.4.1 2023-05-17 11:05:58 +00:00
David Barroso
59125b3c77 Merge pull request #1937 from nhost/dbarroso/react-apollo-example-update
chore: update react-apollo example's dependencies
2023-05-17 13:02:09 +02:00
Szilárd Dóró
91e2affa6f chore: use cache-and-network fetch policy 2023-05-17 12:52:52 +02:00
Szilárd Dóró
a8d747976b feat: add support for changing hasura images 2023-05-17 11:23:44 +02:00
Szilárd Dóró
5b69e3efd8 fix: don't break builds 2023-05-17 10:41:27 +02:00
Szilárd Dóró
c9a444d048 chore: sync playwright versions 2023-05-17 10:21:03 +02:00
Szilárd Dóró
fc16fd5452 fix: refresh auth settings on page change 2023-05-17 10:04:19 +02:00
David Barroso
2eeac45718 asd 2023-05-17 09:54:44 +02:00
Szilárd Dóró
afc9de7994 chore: create dedicated hook 2023-05-17 09:40:36 +02:00
David Barroso
fe8ca8aba6 Update examples/react-apollo/package.json
Co-authored-by: Szilárd Dóró <doroszilard@icloud.com>
2023-05-17 09:32:13 +02:00
David Barroso
086ee46b08 chore: update react-apollo example's dependencies 2023-05-17 09:21:25 +02:00
Szilárd Dóró
37c1c18b43 feat: fetch docker images from lambda 2023-05-16 16:50:23 +02:00
Szilárd Dóró
67078b9a72 feat: add support for selecting Auth version 2023-05-16 16:22:55 +02:00
Szilárd Dóró
203bc97f51 feat: add useSignInPAT to @nhost/vue 2023-05-16 14:42:55 +02:00
Szilárd Dóró
b24af44aac feat: add support for refreshTokenId 2023-05-16 12:54:51 +02:00
Szilárd Dóró
cdaa6d4e73 chore: remove hash function 2023-05-16 12:16:35 +02:00
Szilárd Dóró
09e2c8f5c7 feat: add hash function 2023-05-16 11:24:52 +02:00
Szilárd Dóró
4581677830 chore: update docs 2023-05-16 09:37:51 +02:00
Szilárd Dóró
7bfa6c9f93 fix: use correct hasura-auth image 2023-05-16 08:59:17 +02:00
Szilárd Dóró
80ef430d70 feat: add personal access token docs 2023-05-16 08:51:22 +02:00
Szilárd Dóró
bad8af0fd1 Merge branch 'main' into feat/pat 2023-05-16 08:35:24 +02:00
Szilárd Dóró
69caa34c43 Merge pull request #1934 from nhost/changeset-release/main
chore: update versions
2023-05-16 08:34:38 +02:00
github-actions[bot]
1d898e2893 chore: update versions 2023-05-15 18:43:10 +00:00
Szilárd Dóró
e87621cbde Merge pull request #1936 from nhost/fix/security-key-url
fix(hasura-auth-js): make the call to the correct endpoint
2023-05-15 20:41:59 +02:00
Szilárd Dóró
0d6fc42158 fix: make the call to the correct endpoint 2023-05-15 19:46:26 +02:00
Szilárd Dóró
f6fbee6b13 Merge pull request #1933 from nhost/fix/project-rename-prevent-404
fix(dashboard): don't redirect to 404 on project rename
2023-05-15 16:59:00 +02:00
Szilárd Dóró
1230b72222 fix: don't redirect to 404 on project rename 2023-05-15 16:05:45 +02:00
Szilárd Dóró
6cc7704555 Merge pull request #1931 from nhost/changeset-release/main
chore: update versions
2023-05-15 15:47:22 +02:00
github-actions[bot]
c0954dec09 chore: update versions 2023-05-15 13:30:42 +00:00
Szilárd Dóró
6c25480a7a Merge pull request #1929 from nhost/fix/build-targets
chore: change build target to ES2019
2023-05-15 15:29:32 +02:00
Szilárd Dóró
da03bf390c chore: change build target to ES2019 2023-05-15 11:09:00 +02:00
Szilárd Dóró
3b513be9f2 Merge pull request #1926 from nhost/changeset-release/main
chore: update versions
2023-05-12 16:55:46 +02:00
github-actions[bot]
e450e9d636 chore: update versions 2023-05-12 14:27:16 +00:00
Szilárd Dóró
ed1ee10879 Merge pull request #1925 from nhost/fix/postgres-connection-string
fix(dashboard): show correct postgres connection string
2023-05-12 16:25:51 +02:00
Szilárd Dóró
a6120bf366 feat: update API
chore: fix tests
2023-05-12 14:59:07 +02:00
Szilárd Dóró
349aac369e chore: add changeset 2023-05-12 14:23:54 +02:00
Szilárd Dóró
5a84362c80 fix: construct postgres connection string 2023-05-12 14:23:05 +02:00
Szilárd Dóró
b23dc058a6 Merge branch 'main' into feat/pat 2023-05-12 14:14:09 +02:00
Szilárd Dóró
ad0dda7493 feat: extend nhost.auth.createPAT with id 2023-05-12 14:09:57 +02:00
Szilárd Dóró
4063507d59 chore: improve CLI example 2023-05-12 14:01:11 +02:00
Szilárd Dóró
f59a77b1c8 Merge pull request #1923 from nhost/changeset-release/main
chore: update versions
2023-05-12 10:25:12 +02:00
github-actions[bot]
30686bc4ce chore: update versions 2023-05-12 08:03:41 +00:00
Szilárd Dóró
0c4ac8d368 Merge pull request #1919 from nhost/chore/update-staging-urls
chore(dashboard): change URL construction
2023-05-12 10:02:32 +02:00
Szilárd Dóró
85439307a9 feat: finalize CLI example 2023-05-12 09:34:22 +02:00
Szilárd Dóró
0d8baa4065 feat: allow PAT creation through the example 2023-05-12 08:56:56 +02:00
Szilárd Dóró
7da0e5e256 Merge pull request #1918 from nhost/changeset-release/main
chore: update versions
2023-05-11 15:30:16 +02:00
Szilárd Dóró
4bca94425e chore: add useful information to the README 2023-05-11 15:26:15 +02:00
Szilárd Dóró
9f948385c0 feat: improve readability, add book relationship 2023-05-11 15:23:59 +02:00
Szilárd Dóró
294c504b61 chore: update pnpm-lock file 2023-05-11 15:10:28 +02:00
Szilárd Dóró
1469ec2969 Merge branch 'main' into feat/pat 2023-05-11 15:09:31 +02:00
github-actions[bot]
8229101efe chore: update versions 2023-05-11 13:07:57 +00:00
Szilárd Dóró
afad1778f8 Merge pull request #1895 from nhost/renovate/react-monorepo
chore(deps): update react monorepo
2023-05-11 15:06:23 +02:00
Szilárd Dóró
28fc7b84c7 chore: update changeset 2023-05-11 13:38:39 +02:00
Szilárd Dóró
3f478a4e3c chore: include vitest in the bump, add changeset 2023-05-11 13:37:34 +02:00
Szilárd Dóró
aa54666941 fix: don't break builds 2023-05-11 12:53:45 +02:00
Szilárd Dóró
20fb69faba chore: change URL construction 2023-05-11 12:46:49 +02:00
renovate[bot]
1caeb2a548 chore(deps): update react monorepo 2023-05-11 10:12:59 +00:00
Szilárd Dóró
6356c5a2c8 Merge pull request #1906 from nhost/chore/bump-pnpm
chore: bump `pnpm` and `turbo` version
2023-05-11 12:10:10 +02:00
Szilárd Dóró
6ec1dd3248 chore: bump lock file again 2023-05-11 11:07:27 +02:00
Szilárd Dóró
8a4b5031dc Merge branch 'main' into chore/bump-pnpm 2023-05-11 11:06:57 +02:00
Szilárd Dóró
4790fee41f Merge pull request #1916 from nhost/changeset-release/main
chore: update versions
2023-05-11 09:26:44 +02:00
github-actions[bot]
0a8033812d chore: update versions 2023-05-11 06:56:16 +00:00
Szilárd Dóró
2b56ffc29e Merge pull request #1915 from nhost/fix/project-redirects
fix(dashboard): redirect an invalid project to the 404 page
2023-05-11 08:54:58 +02:00
Szilárd Dóró
aa9b926cd7 Merge branch 'main' into fix/project-redirects 2023-05-10 17:21:18 +02:00
Szilárd Dóró
575404ad62 Merge pull request #1917 from nhost/fix/imports
fix(dashboard): don't break builds
2023-05-10 17:20:37 +02:00
Szilárd Dóró
3f6dfc7bcd fix: don't break builds 2023-05-10 17:19:32 +02:00
Szilárd Dóró
682e64d7a3 fix: don't break build 2023-05-10 16:51:59 +02:00
Szilárd Dóró
30cee4f86c Merge branch 'main' into fix/project-redirects 2023-05-10 16:51:06 +02:00
Szilárd Dóró
29dcc8c63e Merge pull request #1911 from nhost/fix/non-owner-functionality
fix(dashboard): restrict non-owner functionality
2023-05-10 16:47:06 +02:00
Szilárd Dóró
d926f15676 fix: redirect an invalid project to the 404 page 2023-05-10 16:46:16 +02:00
Szilárd Dóró
726c33d1b2 feat: finalize CLI example 2023-05-10 16:41:49 +02:00
Szilárd Dóró
11b9cfbc0d feat: add an example CLI tool to showcase PATs 2023-05-10 15:35:54 +02:00
Szilárd Dóró
d4a0aad2dd Merge pull request #1913 from nhost/changeset-release/main
chore: update versions
2023-05-10 14:24:09 +02:00
github-actions[bot]
1030813279 chore: update versions 2023-05-10 11:50:46 +00:00
Nuno Pato
917a14aa40 Merge pull request #1912 from nhost/docs/add-metrics
Add section on Metrics to the documentation
2023-05-10 11:49:27 +00:00
Szilárd Dóró
6381d1b095 Merge pull request #1893 from nhost/feat/metrics-page 2023-05-10 13:43:34 +02:00
Nuno Pato
8dbdc0bf50 asd 2023-05-10 11:32:34 +00:00
Nuno Pato
8c072a4c6e asd 2023-05-10 10:10:38 +00:00
Nuno Pato
fe341519f7 Add section on Metrics to the documentation 2023-05-10 10:09:12 +00:00
Szilárd Dóró
ea09384064 fix: update import paths 2023-05-10 10:45:20 +02:00
Szilárd Dóró
49b9972885 chore: add changeset 2023-05-10 10:42:35 +02:00
Szilárd Dóró
98c541ee52 feat: introduce useIsCurrentUserOwner hook
- chore: improve file structure
2023-05-10 10:41:35 +02:00
Szilárd Dóró
79aaa91e67 chore: update hasura-auth version 2023-05-09 17:19:40 +02:00
Szilárd Dóró
df4d24320a chore: update example metadata 2023-05-09 14:33:49 +02:00
Szilárd Dóró
757c888656 Merge pull request #1910 from nhost/changeset-release/main
chore: update versions
2023-05-09 11:40:16 +02:00
github-actions[bot]
7c13eb5f9b chore: update versions 2023-05-09 09:17:43 +00:00
Szilárd Dóró
a84608e086 Merge pull request #1907 from nhost/fix/upgrade
fix(dashboard): unpause after upgrading a paused project to pro
2023-05-09 11:13:44 +02:00
Szilárd Dóró
e43c079b9c feat: poll project state after unpausing with upgrade 2023-05-09 10:50:34 +02:00
Szilárd Dóró
3f396a9ebb chore: add changesets 2023-05-08 19:28:42 +02:00
Szilárd Dóró
6ed605beb8 fix: update desiredState on plan change 2023-05-08 17:58:06 +02:00
Szilárd Dóró
edd223d29c fix: don't go to 404 page unnecessarily 2023-05-08 17:47:04 +02:00
Szilárd Dóró
baa3ef794e feat(examples): add PAT example 2023-05-08 17:03:49 +02:00
Szilárd Dóró
da7ffbe523 feat: add useSignInPAT hook 2023-05-08 16:04:00 +02:00
Szilárd Dóró
15a985e079 fix: don't break dashboard build 2023-05-08 15:29:29 +02:00
Szilárd Dóró
8ff00a4258 chore(ci): bump pnpm version to v8.4.0 2023-05-08 15:19:53 +02:00
Szilárd Dóró
7e27d7c0a1 chore: update changeset, bump turbo version 2023-05-08 15:17:42 +02:00
Szilárd Dóró
49f9b8372a chore: bump pnpm version to v8.4.0 2023-05-08 15:09:29 +02:00
Szilárd Dóró
3ca70554c8 feat: add support for PAT sign in 2023-05-08 14:34:12 +02:00
Szilárd Dóró
077b200510 Merge branch 'main' into feat/pat 2023-05-08 14:04:11 +02:00
Szilárd Dóró
925bf0f13f Merge pull request #1905 from nhost/changeset-release/main
chore: update versions
2023-05-08 13:51:55 +02:00
github-actions[bot]
30d35f9607 chore: update versions 2023-05-08 10:10:25 +00:00
Szilárd Dóró
755aa56f12 Merge pull request #1904 from nhost/fix/package-json-types
chore: add `types` to `package.json`
2023-05-08 12:09:11 +02:00
Szilárd Dóró
4c7e7c57a9 fix: don't break tests 2023-05-08 10:29:13 +02:00
Szilárd Dóró
36708e2853 Merge pull request #1903 from hrmoller/fix/wrong-linking-in-docs
Fixed linking to wrong destination in docs
2023-05-08 10:26:31 +02:00
Szilárd Dóró
90c6031189 chore: add types to package.json 2023-05-08 09:54:27 +02:00
Martin Møller
f044dbdb10 Fixed linking to wrong destination 2023-05-05 08:03:50 +02:00
Szilárd Dóró
c2f3bce5f9 Merge pull request #1902 from nhost/chore/probot-improvements
chore: refine probot config
2023-05-04 16:20:59 +02:00
Szilárd Dóró
22d9877b97 chore: update probot config 2023-05-04 16:04:09 +02:00
Szilárd Dóró
628e96dcc3 Merge pull request #1901 from nhost/chore/probot-stale
chore: add probot/stale configuration
2023-05-04 15:32:50 +02:00
Szilárd Dóró
3e9d3c42b6 fix: disable exemptLabels 2023-05-04 15:20:23 +02:00
Szilárd Dóró
a1e7b87c38 add probot/stale configuration 2023-05-04 15:08:37 +02:00
David Barroso
1bd800359e Merge pull request #1894 from nhost/dbarroso/obs-dash-improv
fix: observability: filter pod metrics
2023-05-03 12:59:07 +02:00
David Barroso
54a204a34e fix: observability: filter pod metrics 2023-05-03 10:09:27 +02:00
Szilárd Dóró
b17e8d6f3c fix: don't break e2e tests 2023-05-03 10:00:29 +02:00
Szilárd Dóró
12e2855f01 chore: update description and prevent free access
- bump `jsdom` to v22
- increase test timeout
2023-05-03 09:57:11 +02:00
Szilárd Dóró
c1080d9e63 fix: don't break the UI 2023-05-03 09:38:48 +02:00
Szilárd Dóró
e4972b8307 feat: add Grafana page 2023-05-03 09:35:06 +02:00
Szilárd Dóró
2e7ec0697e Merge pull request #1881 from nhost/changeset-release/main
chore: update versions
2023-05-02 21:06:46 +02:00
github-actions[bot]
2d9baec9d4 chore: update versions 2023-05-02 18:56:49 +00:00
Szilárd Dóró
7a7750be0b Merge pull request #1892 from nhost/fix/disable-downgrade
fix: disallow downgrading through the UI
2023-05-02 20:55:24 +02:00
Szilárd Dóró
0f34f0c6b9 fix: disallow downgrading 2023-05-02 15:31:39 +02:00
Nestor Manrique
d05253183a Merge pull request #1883 from nhost/nestor/fix-grafana-dashboard-datasource
fix: use dashboard externally exported version
2023-05-02 13:15:40 +02:00
Nestor Manrique
65df016bbc fix: fix datasource config 2023-04-28 17:28:43 +02:00
David Barroso
3e6ee1ae97 Merge pull request #1882 from nhost/dbarroso/observability-dashboard
feat: added project metrics observability dashboard
2023-04-28 14:32:55 +02:00
David Barroso
6042ed101f feat: added project metrics observability dashboard 2023-04-28 11:49:33 +02:00
Szilárd Dóró
384bce59bf Merge pull request #1859 from nhost/renovate/react-monorepo
chore(deps): update react monorepo
2023-04-28 09:59:24 +02:00
Szilárd Dóró
8da291ad4d chore: add changeset 2023-04-28 09:42:13 +02:00
renovate[bot]
f94eb3c467 chore(deps): update react monorepo 2023-04-27 18:07:47 +00:00
Szilárd Dóró
9baf3f4ac7 Merge pull request #1876 from nhost/changeset-release/main
chore: update versions
2023-04-27 20:00:27 +02:00
github-actions[bot]
9c406548e3 chore: update versions 2023-04-27 17:47:36 +00:00
Szilárd Dóró
1c08cd1949 Merge pull request #1878 from nhost/fix/local-users-page 2023-04-27 19:46:28 +02:00
Szilárd Dóró
adc828a582 fix: don't enter an infinite loop 2023-04-27 17:45:04 +02:00
Szilárd Dóró
2f220db84a extend machine with PAT sign in 2023-04-27 17:06:26 +02:00
Szilárd Dóró
f1ec6b9a93 Merge pull request #1871 from nhost/docs/local-development-migration
docs: add migration info
2023-04-27 16:37:40 +02:00
Szilárd Dóró
233b7e383e Merge pull request #1873 from nhost/changeset-release/main
chore: update versions
2023-04-27 16:06:05 +02:00
github-actions[bot]
7ea469a1e3 chore: update versions 2023-04-27 13:46:37 +00:00
Szilárd Dóró
ebd218c180 Merge pull request #1855 from nhost/feat/resource-replicas
feat(dashboard): Service Replicas
2023-04-27 15:45:31 +02:00
Nuno Pato
5ab1626f73 Merge pull request #1869 from nhost/docs/add-service-replicas
docs: add service replicas
2023-04-27 13:35:53 +00:00
Nuno Pato
444c3b86ca asd 2023-04-27 13:34:35 +00:00
Szilárd Dóró
7238412341 Merge pull request #1872 from nhost/chore/remove-backend-url
chore(dashboard): remove deprecated environment variable
2023-04-27 14:36:09 +02:00
Szilárd Dóró
f6639ae05c chore: add changeset 2023-04-27 13:54:27 +02:00
Szilárd Dóró
d8ceccec5d chore: add changeset 2023-04-27 13:41:11 +02:00
Szilárd Dóró
6db257d4c7 chore: remove deprecated backend URL 2023-04-27 13:40:41 +02:00
Szilárd Dóró
93dab2d183 docs: add migration info 2023-04-27 11:56:41 +02:00
Nuno Pato
dfc18368be asd 2023-04-26 18:09:42 +00:00
Nuno Pato
f7c6e80bf2 asd 2023-04-26 17:38:53 +00:00
Nuno Pato
573cac1431 asd 2023-04-26 17:23:11 +00:00
Nuno Pato
d72ae3f362 docs: add service replicas 2023-04-26 00:42:16 +00:00
Szilárd Dóró
49ec7ec385 fix: mobile improvements, improved validation 2023-04-25 15:30:38 +02:00
Szilárd Dóró
7d2b4083c2 chore: reorder components, update labels 2023-04-24 17:24:54 +02:00
Szilárd Dóró
696b493745 chore: increase test timeout 2023-04-24 16:23:51 +02:00
Szilárd Dóró
15a117a861 feat: improve cost calculation 2023-04-24 15:48:20 +02:00
Szilárd Dóró
e7ff1f79f8 feat: add information about replicas 2023-04-24 14:29:20 +02:00
Szilárd Dóró
33c7368a2e chore: update validation error message 2023-04-24 11:40:05 +02:00
Szilárd Dóró
664c182c8e fix: use font-medium for confirmation labels 2023-04-24 11:36:48 +02:00
Szilárd Dóró
c1ab4e0a77 chore: improve validation messages 2023-04-24 11:36:10 +02:00
Szilárd Dóró
4a4bd61757 chore: update tooltip label 2023-04-24 11:16:51 +02:00
Szilárd Dóró
b6d05289be fix: don't fail tests 2023-04-24 11:13:39 +02:00
Szilárd Dóró
5857458ca5 chore: improve resources form validation 2023-04-24 11:09:00 +02:00
Szilárd Dóró
2fb1145fe0 chore: add changeset 2023-04-24 10:22:44 +02:00
Szilárd Dóró
546d710102 Merge branch 'main' into feat/resource-replicas 2023-04-24 10:21:04 +02:00
Szilárd Dóró
7756103476 Merge pull request #1861 from nhost/changeset-release/main 2023-04-24 09:38:50 +02:00
github-actions[bot]
fef9456c12 chore: update versions 2023-04-23 19:36:24 +00:00
Szilárd Dóró
2d6d56f6b0 Merge pull request #1860 from nhost/fix/project-details
fix(dashboard): filter projects by workspace
2023-04-23 21:35:16 +02:00
Szilárd Dóró
f54be0fefd fix: don't break unit tests 2023-04-23 19:27:36 +02:00
Szilárd Dóró
4e76d388ab fix: remove unused query parameter 2023-04-23 16:42:33 +02:00
Szilárd Dóró
84b84ab785 fix: filter projects by workspace 2023-04-23 16:34:39 +02:00
Szilárd Dóró
ed66769688 Merge branch 'main' into feat/resource-replicas 2023-04-21 14:31:51 +02:00
Szilárd Dóró
899732f280 Merge pull request #1852 from nhost/changeset-release/main
chore: update versions
2023-04-21 13:40:09 +02:00
github-actions[bot]
037b566e39 chore: update versions 2023-04-21 11:23:53 +00:00
Szilárd Dóró
829f20c83c Merge pull request #1856 from nhost/renovate/vitejs-plugin-react-4.x
chore(deps): update dependency @vitejs/plugin-react to v4
2023-04-21 13:22:44 +02:00
Szilárd Dóró
f1b5a944a3 chore: add changeset 2023-04-21 11:42:44 +02:00
renovate[bot]
5ccb764ae5 chore(deps): update dependency @vitejs/plugin-react to v4 2023-04-21 09:38:43 +00:00
Szilárd Dóró
ef2b639734 Merge pull request #1839 from nhost/renovate/vueuse-core-10.x
fix(deps): update dependency @vueuse/core to v10
2023-04-21 11:36:00 +02:00
Szilárd Dóró
a5b895a827 chore: add changeset 2023-04-21 11:14:13 +02:00
renovate[bot]
b441b4bae2 fix(deps): update dependency @vueuse/core to v10 2023-04-21 09:02:30 +00:00
Szilárd Dóró
a6c67c1e4c Merge pull request #1836 from nhost/renovate/react-monorepo
chore(deps): update dependency @types/react to v18.0.37
2023-04-21 10:54:19 +02:00
Szilárd Dóró
7f1785ac0f chore: add changeset 2023-04-21 10:21:02 +02:00
Szilárd Dóró
a0298e0bdb chore: increase test timeout, improve stability 2023-04-20 16:40:42 +02:00
Szilárd Dóró
3fd94b1cdf chore: improve validation, fix tests 2023-04-20 16:08:37 +02:00
Szilárd Dóró
61d5f7d616 feat: make use of replicas from API 2023-04-20 14:56:52 +02:00
Szilárd Dóró
cde9a0a715 chore: extend tests, improve validation 2023-04-20 14:50:12 +02:00
Szilárd Dóró
eae6349b04 feat: add new pricing to confirmation dialog 2023-04-20 14:19:53 +02:00
Szilárd Dóró
211b930b84 chore: fix after effects of the new data structure 2023-04-20 13:53:06 +02:00
Szilárd Dóró
4ae463074b chore: simplify form data structure 2023-04-20 13:19:59 +02:00
Szilárd Dóró
1c5a4746f7 chore: improve validation error 2023-04-20 11:35:25 +02:00
Szilárd Dóró
d6ae1fa44a feat: resource validation when replicas > 1 2023-04-20 10:28:31 +02:00
Szilárd Dóró
a3abb81b37 feat: add replica slider to services 2023-04-19 15:57:57 +02:00
renovate[bot]
ec74e7fe98 chore(deps): update dependency @types/react to v18.0.37 2023-04-19 12:53:55 +00:00
Szilárd Dóró
6713c198c6 Merge pull request #1833 from nhost/renovate/turbo-1.x
chore(deps): update dependency turbo to v1.9.3
2023-04-19 14:52:03 +02:00
renovate[bot]
35a6b9cf47 chore(deps): update dependency turbo to v1.9.3 2023-04-19 09:32:19 +00:00
Szilárd Dóró
79f97fad76 Merge pull request #1838 from nhost/renovate/graphql-request-6.x
fix(deps): update dependency graphql-request to v6
2023-04-19 11:29:16 +02:00
Szilárd Dóró
2faf79077d chore: add changeset 2023-04-19 11:07:46 +02:00
Szilárd Dóró
4972b6feb6 chore: sync versions, update codegen 2023-04-19 11:07:15 +02:00
Szilárd Dóró
23d5861c4c Merge pull request #1837 from rikardwissing/fix/wait-for-valid-token
Wait for valid token or sign out before establishing connection.
2023-04-19 09:31:56 +02:00
renovate[bot]
098ac5a71c fix(deps): update dependency graphql-request to v6 2023-04-18 18:54:27 +00:00
Nuno Pato
3a15329cfd Merge pull request #1849 from nhost/docs/add-compute-section
add compute section to the docs
2023-04-18 13:20:39 +00:00
Nuno Pato
c3e798aa1d asd 2023-04-18 13:15:40 +00:00
Szilárd Dóró
eec5e6a93d Merge pull request #1843 from nhost/changeset-release/main
chore: update versions
2023-04-18 15:10:41 +02:00
Nuno Pato
d964b689cd move compute resources to position 1 2023-04-18 09:37:28 +00:00
Nuno Pato
1e080c1af5 add compute section to the docs 2023-04-18 09:35:01 +00:00
github-actions[bot]
177bba7ec0 chore: update versions 2023-04-18 07:27:56 +00:00
Szilárd Dóró
a593b45dc2 Merge pull request #1845 from nhost/chore/dashboard-update-nomenclature-compute
chore: dashboard: update nomenclature for compute
2023-04-18 09:24:46 +02:00
Szilárd Dóró
b384fb8bd8 chore: merge changesets 2023-04-17 20:58:38 +02:00
Nuno Pato
abd8620ded "Resources" -> "Compute" 2023-04-17 16:58:45 +00:00
Szilárd Dóró
e62ccdcaae Merge pull request #1844 from nhost/fix/resource-memory-limit
fix(dashboard): use correct vCPUs and memory after reset
2023-04-17 14:17:49 +02:00
Szilárd Dóró
46d01b09d6 chore: use constants 2023-04-17 13:45:59 +02:00
Szilárd Dóró
ff74e712f8 fix: use correct vCPUs and memory after reset 2023-04-17 13:38:47 +02:00
Szilárd Dóró
770794ccad Merge pull request #1709 from nhost/feat/resource-sliders
feat(dashboard): Resource Sliders
2023-04-17 13:03:04 +02:00
Szilárd Dóró
aa80d1795d chore: update initial resource ratio 2023-04-17 09:28:17 +02:00
Szilárd Dóró
eaa7720c65 fix: fix tests 2023-04-17 09:17:34 +02:00
Szilárd Dóró
7f447d1182 fix: don't break the initial UI 2023-04-17 08:43:23 +02:00
Szilárd Dóró
5d3dd84762 Merge branch 'main' into feat/resource-sliders 2023-04-17 08:36:55 +02:00
Szilárd Dóró
c625317342 Merge pull request #1841 from nhost/changeset-release/main
chore: update versions
2023-04-17 08:36:12 +02:00
Rikard Wissing
117398f5dc Add changeset 2023-04-16 15:00:50 +01:00
Rikard Wissing
4e421eb4bd Refactor a bit 2023-04-16 14:55:51 +01:00
Rikard Wissing
771447b089 Remove log 2023-04-16 14:52:35 +01:00
github-actions[bot]
8ab75a4146 chore: update versions 2023-04-14 09:54:44 +00:00
Szilárd Dóró
607f465616 Merge pull request #1840 from nhost/chore/use-dialog-hook
chore(dashboard): unify payment dialog management
2023-04-14 11:50:15 +02:00
Szilárd Dóró
668c877130 chore: add changeset 2023-04-14 11:17:32 +02:00
Szilárd Dóró
4bd870eb96 chore: relocate BillingPaymentMethodForm 2023-04-14 11:15:58 +02:00
Szilárd Dóró
39b3161d91 fix: use up-to-date card information 2023-04-14 10:31:27 +02:00
Szilárd Dóró
ae090a6585 chore: unify modal management for payments 2023-04-13 16:53:30 +02:00
Rikard Wissing
be4831ae62 Update integrations/apollo/src/index.ts
Co-authored-by: Szilárd Dóró <doroszilard@gmail.com>
2023-04-13 15:10:14 +02:00
Szilárd Dóró
4fb0c18c32 Merge branch 'main' into feat/resource-sliders 2023-04-13 14:56:03 +02:00
Rikard Wissing
99e80cea44 Wait for valid token 2023-04-12 23:45:38 +02:00
Szilárd Dóró
f2f1c01e3b chore: refactor memory steps 2023-04-12 17:43:44 +02:00
Szilárd Dóró
2c0f98e85c Merge branch 'main' into feat/resource-sliders 2023-04-12 14:43:12 +02:00
Szilárd Dóró
20a83362ee fix: don't break builds 2023-04-11 15:28:23 +02:00
Szilárd Dóró
20b800c3e4 Merge branch 'main' into feat/resource-sliders 2023-04-11 15:24:28 +02:00
Szilárd Dóró
baaa510309 fix: add price to GQL 2023-03-31 15:28:59 +02:00
Szilárd Dóró
a84aa5ad68 Merge branch 'main' into feat/resource-sliders 2023-03-31 15:19:09 +02:00
Szilárd Dóró
4191b933c9 Merge branch 'main' into feat/resource-sliders 2023-03-24 10:57:01 +01:00
Szilárd Dóró
cf2264ce1d Merge branch 'main' into feat/resource-sliders 2023-03-20 16:25:34 +01:00
Szilárd Dóró
02dd9dd8c0 Merge branch 'main' into feat/resource-sliders 2023-03-20 12:41:38 +01:00
Szilárd Dóró
d4ff25df0f fix: adjust warning color 2023-03-10 14:19:10 +01:00
Szilárd Dóró
3d74374780 fix: update codegen 2023-03-09 10:22:43 +01:00
Szilárd Dóró
7063af678c Merge remote-tracking branch 'origin/main' into feat/resource-sliders 2023-03-09 10:14:33 +01:00
Szilárd Dóró
2b44a1cf27 chore: add tests, fix flaky tests
- fix a UI glitch where values jumped after reset
2023-03-08 16:33:02 +01:00
Szilárd Dóró
c4f60b3645 feat: fetch plan independently 2023-03-08 15:44:30 +01:00
Szilárd Dóró
f86f658aa5 feat: improve upgrade / downgrade experience 2023-03-08 13:54:35 +01:00
Szilárd Dóró
bd02bd3f3e fix: cpu -> vcpu and selected -> available 2023-03-08 13:41:50 +01:00
Szilárd Dóró
a133faa797 chore: added submission tests 2023-03-08 11:24:17 +01:00
Szilárd Dóró
bb0269691d Merge remote-tracking branch 'origin/main' into feat/resource-sliders 2023-03-08 10:23:48 +01:00
Szilárd Dóró
8d6171d22d chore: move test-related stuff 2023-03-07 17:23:09 +01:00
Szilárd Dóró
fff178d79f fix: fix unit tests 2023-03-07 16:59:15 +01:00
Szilárd Dóró
5e5e454ae7 chore: remove inputs from total resources 2023-03-07 16:34:40 +01:00
Szilárd Dóró
ce005f6d9e Merge remote-tracking branch 'origin/main' into feat/resource-sliders 2023-03-07 15:37:42 +01:00
Szilárd Dóró
85889ee882 chore: add changeset 2023-03-07 10:23:33 +01:00
Szilárd Dóró
351873059e fix: use correct colors in light mode 2023-03-07 10:09:00 +01:00
Szilárd Dóró
8ccfc10522 fix: fix inner slider behaviour 2023-03-07 10:05:25 +01:00
Szilárd Dóró
82b02ca70b feat: improve slider appearance 2023-03-07 09:12:28 +01:00
Szilárd Dóró
14fc132040 fix: show footer when downgrading 2023-03-06 17:02:54 +01:00
Szilárd Dóró
a35da349ed fix: fix tests and prevent error when plan is missing 2023-03-06 16:48:43 +01:00
Szilárd Dóró
302e1d9d33 feat: retrieve plan info from the project 2023-03-06 16:18:42 +01:00
Szilárd Dóró
0db40184e8 fix: show values correctly after saving resources 2023-03-06 15:38:07 +01:00
Szilárd Dóró
d38649494e chore: added tests 2023-03-06 15:14:30 +01:00
Szilárd Dóró
5f22f1b5e5 chore: restructure to support tests
- added network requests to retrieve computation info
2023-03-06 14:13:48 +01:00
Szilárd Dóró
494f93a4bf chore: change terminology RAM -> Memory 2023-03-06 10:28:40 +01:00
Szilárd Dóró
84c8af232c fix: don't nest p in p 2023-03-03 16:54:21 +01:00
Szilárd Dóró
7f101d54da feat: add pricing placeholders 2023-03-03 16:53:28 +01:00
Szilárd Dóró
75b497412e fix: reset error, fix RAM label 2023-03-03 16:16:09 +01:00
Szilárd Dóró
5bd774afbb chore: improve readability 2023-03-03 16:11:54 +01:00
Szilárd Dóró
cdfe203fe4 Merge remote-tracking branch 'origin/main' into feat/resource-sliders 2023-03-03 15:37:45 +01:00
Szilárd Dóró
4c7d32e944 fix: resource labels 2023-03-03 15:35:17 +01:00
Szilárd Dóró
447c622fc0 fix: remove unnecessary inputs from services 2023-03-03 15:33:01 +01:00
Szilárd Dóró
03f22aed72 chore: improved resource constants 2023-03-03 15:21:15 +01:00
Szilárd Dóró
ede5abf2ac fix: use correct width for inner slider rail 2023-03-03 15:09:33 +01:00
Szilárd Dóró
0bdd1d0e0c fix: fixed top slider vlaidation 2023-03-03 14:19:08 +01:00
Szilárd Dóró
61de7b21fd feat: improve slider rails 2023-03-03 14:00:57 +01:00
Szilárd Dóró
4b6ead1b17 feat: add validation to top slider 2023-03-03 13:18:57 +01:00
Szilárd Dóró
0b193e6310 feat: create form fragments 2023-03-03 12:15:29 +01:00
Szilárd Dóró
b21a5403fe feat: add sections for services, improve slider 2023-03-03 11:15:01 +01:00
Szilárd Dóró
e8320be941 feat: initial Resource page code 2023-03-02 16:23:23 +01:00
834 changed files with 25915 additions and 11574 deletions

View File

@@ -14,7 +14,7 @@ runs:
steps:
- uses: pnpm/action-setup@v2.2.4
with:
version: 7.17.0
version: 8.4.0
run_install: false
- name: Get pnpm cache directory
id: pnpm-cache-dir

16
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
# Configuration for probot-stale - https://github.com/probot/stale
daysUntilStale: 180
daysUntilClose: 7
limitPerRun: 30
onlyLabels: []
exemptLabels: []
exemptProjects: false
exemptMilestones: false
exemptAssignees: false
staleLabel: stale
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.

View File

@@ -36,6 +36,7 @@ export default defineConfig({
}
},
build: {
target: 'es2019',
sourcemap: true,
lib: {
entry,

View File

@@ -25,8 +25,11 @@ module.exports = {
'error',
{ allowArrowFunctions: true, allowFunctions: true },
],
'import/no-named-as-default': 'off',
'import/prefer-default-export': 'off',
'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
// TODO: Temporarily disable this rule because of a WIP refactoring
'import/no-named-as-default': 'off',
curly: ['error', 'all'],
'no-restricted-exports': 'off',
'no-undef': 'off',
@@ -81,7 +84,7 @@ module.exports = {
},
{
group: ['@testing-library/react*'],
message: 'Please use @/utils/testUtils instead.',
message: 'Please use @/tests/testUtils instead.',
},
],
},

View File

@@ -1,5 +1,159 @@
# @nhost/dashboard
## 0.17.1
### Patch Changes
- 9b0d4dde: feat(secrets): enable secrets
## 0.17.0
### Minor Changes
- 15d84a19: Add postgres 14.6-20230525
## 0.16.14
### Patch Changes
- 4c626174: chore: updated import paths, improved directory structure
- cc047b71: chore(deps): bump `@fontsource` monorepo to `v5.0.0`
- 99edd012: feat(account): add support for personal access tokens
## 0.16.13
### Patch Changes
- 78c7109c: feat(settings): allow selecting service versions
## 0.16.12
### Patch Changes
- 399009d6: fix(gql): don't enter an infinite loop when fetching remote app data
- 329e5a91: fix(deployments): use the same sorting of deployments everywhere
- 6d559d6e: chore(settings): add under the hood improvements to the settings page
- 12eb236c: chore(deps): bump `prettier-plugin-tailwindcss` to `v0.3.0`
- f9b81a2a: chore(deps): bump `turbo` to `v1.9.8`
- 1345741b: fix(projects): don't redirect to 404 on project creation
- Updated dependencies [7fea29a8]
- @nhost/react-apollo@5.0.23
- @nhost/nextjs@1.13.25
## 0.16.11
### Patch Changes
- 1230b722: fix(projects): don't redirect to 404 on when the project is renamed
- @nhost/react-apollo@5.0.22
- @nhost/nextjs@1.13.24
## 0.16.10
### Patch Changes
- Updated dependencies [da03bf39]
- @nhost/react-apollo@5.0.21
- @nhost/nextjs@1.13.23
## 0.16.9
### Patch Changes
- 349aac36: fix(settings): use region domain when constructing the postgres connection string
## 0.16.8
### Patch Changes
- 20fb69fa: chore(projects): change the way how API URLs are constructed
## 0.16.7
### Patch Changes
- 49f9b837: chore(docker): bump `pnpm` to `v8.4.0` and `turbo` to `v1.9.3`
- 3f478a4e: chore(deps): bump `vitest` to `v0.31.0`, `@types/react` to `v18.2.6` and `@types/react-dom` to `v18.2.4`
## 0.16.6
### Patch Changes
- d926f156: fix(projects): redirect to 404 when an invalid project is opened
- 49b99728: fix(projects): disable features for non-owner members of workspaces
## 0.16.5
### Patch Changes
- 12e2855f: chore(deps): bump `jsdom` to v22
- e4972b83: feat(metrics): add Grafana page
## 0.16.4
### Patch Changes
- 3f396a9e: fix(projects): unpause after upgrading a paused project to pro
- 3f396a9e: fix(projects): don't redirect to 404 page after project creation
## 0.16.3
### Patch Changes
- Updated dependencies [90c60311]
- @nhost/react-apollo@5.0.20
- @nhost/nextjs@1.13.22
## 0.16.2
### Patch Changes
- 0f34f0c6: fix(projects): disallow downgrading to free plan
- 8da291ad: chore(deps): bump `@types/react` to v18.2.0 and `@types/react-dom` to v18.2.1
## 0.16.1
### Patch Changes
- adc828a5: fix(gql): don't enter an infinite loop when fetching remote app data
## 0.16.0
### Minor Changes
- 2fb1145f: feat(compute): add support for replicas
### Patch Changes
- d8ceccec: chore(env): remove deprecated `NHOST_BACKEND_URL` environment variable
## 0.15.2
### Patch Changes
- 84b84ab7: fix(projects): filter projects by workspace
## 0.15.1
### Patch Changes
- 2faf7907: chore(deps): bump `graphql-request` to v6
- f1b5a944: chore(deps): bump `@vitejs/plugin-react` to v4
- 7f1785ac: chore(deps): bump `@types/react` to v18.0.37
- @nhost/react-apollo@5.0.19
## 0.15.0
### Minor Changes
- 85889ee8: feat(dashboard): add Compute management to the settings
## 0.14.8
### Patch Changes
- 668c8771: chore(dialogs): unify dialog management of payment dialogs
## 0.14.7
### Patch Changes

View File

@@ -3,7 +3,7 @@ RUN apk add --no-cache libc6-compat
RUN apk update
WORKDIR /app
RUN yarn global add turbo@1.8.6
RUN yarn global add turbo@1.9.8
COPY . .
RUN turbo prune --scope="@nhost/dashboard" --docker
@@ -29,7 +29,7 @@ ENV NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL __NEXT_PUBLIC_NHOST_HASURA_CONSOLE_URL_
ENV NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL __NEXT_PUBLIC_NHOST_HASURA_MIGRATIONS_API_URL__
ENV NEXT_PUBLIC_NHOST_HASURA_API_URL __NEXT_PUBLIC_NHOST_HASURA_API_URL__
RUN yarn global add pnpm@7.17.0
RUN yarn global add pnpm@8.4.0
COPY .gitignore .gitignore
COPY --from=pruner /app/out/json/ .
COPY --from=pruner /app/out/pnpm-*.yaml .

View File

@@ -0,0 +1,51 @@
import { faker } from '@faker-js/faker';
import type { Page } from '@playwright/test';
import { expect, test } from '@playwright/test';
let page: Page;
test.beforeAll(async ({ browser }) => {
page = await browser.newPage();
});
test.beforeEach(async () => {
await page.goto('/');
});
test.afterAll(async () => {
await page.close();
});
test('should be able to create then delete a personal access token', async () => {
await page.waitForLoadState('networkidle');
await page.getByRole('banner').getByRole('button').last().click();
await page.getByRole('link', { name: /account settings/i }).click();
await page
.getByRole('button', { name: /create personal access token/i })
.click();
const patName = faker.lorem.slug(3);
await page.getByRole('textbox', { name: /name/i }).fill(patName);
await page.getByRole('button', { name: /expiration/i }).click();
await page.getByRole('option', { name: /7 days/i }).click();
await page.getByRole('button', { name: /create/i }).click();
await expect(
page.getByText(
/this token will not be shown again. make sure to copy it now./i,
),
).toBeVisible();
await page.getByRole('button', { name: /close/i }).click();
await expect(page.getByText(patName)).toBeVisible();
await page
.getByRole('button', { name: `More options for ${patName}`, exact: true })
.click();
await page.getByRole('menuitem', { name: /delete/i }).click();
await page.getByRole('button', { name: /delete/i }).click();
await expect(page.getByText(patName)).not.toBeVisible();
});

View File

@@ -30,7 +30,7 @@ test('should show a sidebar with menu items', async () => {
const navLocator = page.getByRole('navigation', { name: /main navigation/i });
await expect(navLocator).toBeVisible();
await expect(navLocator.getByRole('list').getByRole('listitem')).toHaveCount(
10,
11,
);
await expect(
navLocator.getByRole('link', { name: /overview/i }),
@@ -53,6 +53,9 @@ test('should show a sidebar with menu items', async () => {
navLocator.getByRole('link', { name: /backups/i }),
).toBeVisible();
await expect(navLocator.getByRole('link', { name: /logs/i })).toBeVisible();
await expect(
navLocator.getByRole('link', { name: /metrics/i }),
).toBeVisible();
await expect(
navLocator.getByRole('link', { name: /settings/i }),
).toBeVisible();

View File

@@ -46,7 +46,7 @@ async function globalTeardown() {
await hasuraPage.locator('a', { hasText: /data/i }).click();
await hasuraPage.getByRole('link', { name: /sql/i }).click();
await hasuraPage.getByRole('textbox').fill(`
await hasuraPage.locator('#raw_sql > textarea').fill(`
DO $$ DECLARE
tablename text;
BEGIN

View File

@@ -1,6 +1,6 @@
{
"name": "@nhost/dashboard",
"version": "0.14.7",
"version": "0.17.1",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
@@ -15,7 +15,7 @@
"format": "prettier --write \"src/**/*.{js,ts,tsx,jsx,json,md}\" --plugin-search-dir=.",
"storybook": "start-storybook -p 6006 -s public",
"build-storybook": "build-storybook",
"e2e": "npx playwright@1.31.2 install --with-deps && playwright test"
"e2e": "npx playwright@1.34.0 install --with-deps && playwright test"
},
"dependencies": {
"@apollo/client": "^3.7.10",
@@ -24,8 +24,8 @@
"@emotion/react": "^11.10.5",
"@emotion/server": "^11.4.0",
"@emotion/styled": "^11.10.5",
"@fontsource/inter": "^4.5.14",
"@fontsource/roboto-mono": "^4.5.8",
"@fontsource/inter": "^5.0.0",
"@fontsource/roboto-mono": "^5.0.0",
"@graphiql/react": "^0.17.0",
"@graphiql/toolkit": "^0.8.2",
"@headlessui/react": "^1.6.5",
@@ -51,7 +51,7 @@
"generate-password": "^1.7.0",
"graphiql": "^2.4.0",
"graphql": "^16.6.0",
"graphql-request": "^4.3.0",
"graphql-request": "^6.0.0",
"graphql-tag": "^2.12.6",
"graphql-ws": "^5.11.2",
"just-kebab-case": "^4.1.1",
@@ -84,11 +84,10 @@
"@faker-js/faker": "^7.6.0",
"@graphql-codegen/cli": "^3.0.0",
"@graphql-codegen/typescript": "^3.0.0",
"@graphql-codegen/typescript-graphql-request": "^4.5.1",
"@graphql-codegen/typescript-operations": "^3.0.0",
"@graphql-codegen/typescript-react-apollo": "^3.3.1",
"@next/bundle-analyzer": "^12.3.1",
"@playwright/test": "^1.31.2",
"@playwright/test": "^1.34.0",
"@storybook/addon-actions": "^6.5.14",
"@storybook/addon-essentials": "^6.5.14",
"@storybook/addon-interactions": "^6.5.14",
@@ -105,15 +104,15 @@
"@types/lodash.debounce": "^4.0.7",
"@types/node": "^16.11.7",
"@types/pluralize": "^0.0.29",
"@types/react": "18.0.34",
"@types/react-dom": "18.0.11",
"@types/react": "18.2.6",
"@types/react-dom": "18.2.4",
"@types/react-table": "^7.7.12",
"@types/testing-library__jest-dom": "^5.14.5",
"@types/validator": "^13.7.10",
"@typescript-eslint/eslint-plugin": "^5.43.0",
"@typescript-eslint/parser": "^5.43.0",
"@vitejs/plugin-react": "^3.0.0",
"@vitest/coverage-c8": "^0.30.0",
"@vitejs/plugin-react": "^4.0.0",
"@vitest/coverage-c8": "^0.31.0",
"autoprefixer": "^10.4.13",
"babel-loader": "^8.3.0",
"babel-plugin-transform-remove-console": "^6.9.4",
@@ -129,7 +128,7 @@
"eslint-plugin-jsx-a11y": "^6.6.1",
"eslint-plugin-react": "^7.31.11",
"eslint-plugin-react-hooks": "^4.6.0",
"jsdom": "^21.0.0",
"jsdom": "^22.0.0",
"lint-staged": ">=13",
"msw": "^1.0.1",
"msw-storybook-addon": "^1.6.3",
@@ -137,7 +136,7 @@
"postcss": "^8.4.19",
"prettier": "^2.7.1",
"prettier-plugin-organize-imports": "^3.2.0",
"prettier-plugin-tailwindcss": "^0.2.0",
"prettier-plugin-tailwindcss": "^0.3.0",
"react-date-fns-hooks": "^0.9.4",
"require-from-string": "^2.0.2",
"snake-case": "^3.0.4",
@@ -147,8 +146,7 @@
"tsconfig-paths-webpack-plugin": "^4.0.0",
"vite": "^4.0.2",
"vite-tsconfig-paths": "^4.0.3",
"vitest": "^0.30.0",
"webpack": "^5.75.0"
"vitest": "^0.31.0"
},
"browserslist": {
"production": [

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -114,6 +114,9 @@ export default function AppDeployments(props: AppDeploymentsProps) {
const { deployments } = deploymentPageData || { deployments: [] };
const { deployments: scheduledOrPendingDeployments } =
scheduledOrPendingDeploymentsData || { deployments: [] };
const isDeploymentInProgress = deployments?.some((deployment) =>
['PENDING', 'SCHEDULED'].includes(deployment.deploymentStatus),
);
const latestDeployment = latestDeploymentData?.deployments[0];
const latestLiveDeployment = latestLiveDeploymentData?.deployments[0];
@@ -135,7 +138,10 @@ export default function AppDeployments(props: AppDeploymentsProps) {
deployment={deployment}
isLive={liveDeploymentId === deployment.id}
showRedeploy={latestDeployment.id === deployment.id}
disableRedeploy={scheduledOrPendingDeployments?.length > 0}
disableRedeploy={
scheduledOrPendingDeployments?.length > 0 ||
isDeploymentInProgress
}
/>
{index !== deployments.length - 1 && <Divider component="li" />}

View File

@@ -1,6 +1,6 @@
import FeedbackForm from '@/components/common/FeedbackForm';
import { FeedbackForm } from '@/components/common/FeedbackForm';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useInterval } from '@/hooks/useInterval';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Button from '@/ui/v2/Button';
import { Dropdown } from '@/ui/v2/Dropdown';

View File

@@ -1,8 +1,8 @@
import FeedbackForm from '@/components/common/FeedbackForm';
import { FeedbackForm } from '@/components/common/FeedbackForm';
import Container from '@/components/layout/Container';
import { useAppCreatedAt } from '@/hooks/useAppCreatedAt';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useIsCurrentUserOwner } from '@/features/projects/hooks/useIsCurrentUserOwner';
import { useCurrentDate } from '@/hooks/useCurrentDate';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import type { ApplicationState } from '@/types/application';
import { ApplicationStatus } from '@/types/application';
import { Modal } from '@/ui/Modal';
@@ -10,18 +10,16 @@ import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Button from '@/ui/v2/Button';
import { Dropdown } from '@/ui/v2/Dropdown';
import Text from '@/ui/v2/Text';
import { discordAnnounce } from '@/utils/discordAnnounce';
import { getPreviousApplicationState } from '@/utils/getPreviousApplicationState';
import { getApplicationStatusString } from '@/utils/helpers';
import { triggerToast } from '@/utils/toast';
import {
useDeleteApplicationMutation,
useGetApplicationStateQuery,
useInsertApplicationMutation,
useUpdateApplicationMutation,
} from '@/utils/__generated__/graphql';
import { discordAnnounce } from '@/utils/discordAnnounce';
import { getPreviousApplicationState } from '@/utils/getPreviousApplicationState';
import { getApplicationStatusString } from '@/utils/helpers';
import { triggerToast } from '@/utils/toast';
import { updateOwnCache } from '@/utils/updateOwnCache';
import { useApolloClient } from '@apollo/client';
import { useUserData } from '@nhost/nextjs';
import Image from 'next/image';
import { useState } from 'react';
@@ -31,7 +29,11 @@ import { RemoveApplicationModal } from './RemoveApplicationModal';
import { StagingMetadata } from './StagingMetadata';
export default function ApplicationErrored() {
const { currentWorkspace, currentProject } = useCurrentWorkspaceAndProject();
const {
currentWorkspace,
currentProject,
refetch: refetchProject,
} = useCurrentWorkspaceAndProject();
const [changingApplicationStateLoading, setChangingApplicationStateLoading] =
useState(false);
@@ -53,14 +55,11 @@ export default function ApplicationErrored() {
const [showRecreateModal, setShowRecreateModal] = useState(false);
const [showDeleteModal, setShowDeleteModal] = useState(false);
const [insertApp] = useInsertApplicationMutation();
const client = useApolloClient();
const { currentDate } = useCurrentDate();
const user = useUserData();
const isOwner = currentWorkspace.workspaceMembers.some(
({ id, type }) => id === user?.id && type === 'owner',
);
const isOwner = useIsCurrentUserOwner();
const { appCreatedAt } = useAppCreatedAt();
const appCreatedAt = new Date(currentProject.createdAt).getTime();
const FIVE_DAYS_IN_MILLISECONDS = 60 * 24 * 60 * 5 * 1000;
const HALF_DAY_IN_MILLISECONDS = 60 * 12 * 60 * 1000;
@@ -95,7 +94,7 @@ export default function ApplicationErrored() {
});
discordAnnounce(`Recreating: ${currentProject?.name} (${user.email})`);
triggerToast(`Recreating ${currentProject?.name} `);
await updateOwnCache(client);
await refetchProject();
} catch (e) {
triggerToast(`Error trying to recreate: ${currentProject?.name}`);
}

View File

@@ -1,15 +1,15 @@
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import {
GetAllWorkspacesAndProjectsDocument,
useDeleteApplicationMutation,
} from '@/generated/graphql';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import Button from '@/ui/v2/Button';
import ArrowRightIcon from '@/ui/v2/icons/ArrowRightIcon';
import Link from '@/ui/v2/Link';
import Text from '@/ui/v2/Text';
import { Button } from '@/ui/v2/Button';
import { ArrowRightIcon } from '@/ui/v2/icons/ArrowRightIcon';
import { Link } from '@/ui/v2/Link';
import { Text } from '@/ui/v2/Text';
import { copy } from '@/utils/copy';
import { getApplicationStatusString } from '@/utils/helpers';
import getServerError from '@/utils/settings/getServerError';
import { getServerError } from '@/utils/settings/getServerError';
import { getToastStyleProps } from '@/utils/settings/settingsConstants';
import { formatDistance } from 'date-fns';
import { useRouter } from 'next/router';
@@ -18,18 +18,14 @@ import { toast } from 'react-hot-toast';
export default function ApplicationInfo() {
const { currentProject } = useCurrentWorkspaceAndProject();
const [deleteApplication] = useDeleteApplicationMutation({
refetchQueries: [GetAllWorkspacesAndProjectsDocument],
refetchQueries: [{ query: GetAllWorkspacesAndProjectsDocument }],
});
const router = useRouter();
async function handleClickRemove() {
try {
await toast.promise(
deleteApplication({
variables: {
appId: currentProject.id,
},
}),
deleteApplication({ variables: { appId: currentProject.id } }),
{
loading: 'Deleting project...',
success: 'The project has been deleted successfully.',
@@ -46,6 +42,10 @@ export default function ApplicationInfo() {
}
}
if (!currentProject) {
return null;
}
return (
<div className="mt-4 grid grid-flow-row gap-4">
<div className="grid grid-flow-row justify-center gap-0.5">

View File

@@ -1,16 +1,16 @@
import MaintenanceAlert from '@/components/common/MaintenanceAlert';
import RetryableErrorBoundary from '@/components/common/RetryableErrorBoundary';
import { MaintenanceAlert } from '@/components/common/MaintenanceAlert';
import { RetryableErrorBoundary } from '@/components/common/RetryableErrorBoundary';
import Container from '@/components/layout/Container';
import OverviewDeployments from '@/components/overview/OverviewDeployments';
import OverviewDocumentation from '@/components/overview/OverviewDocumentation';
import OverviewMetrics from '@/components/overview/OverviewMetrics/OverviewMetrics';
import OverviewProjectInfo from '@/components/overview/OverviewProjectInfo';
import OverviewRepository from '@/components/overview/OverviewRepository';
import OverviewTopBar from '@/components/overview/OverviewTopBar';
import OverviewUsage from '@/components/overview/OverviewUsage';
import { features } from '@/components/overview/features';
import { frameworks } from '@/components/overview/frameworks';
import useIsPlatform from '@/hooks/common/useIsPlatform';
import { useIsPlatform } from '@/features/projects/hooks/useIsPlatform';
import { OverviewDeployments } from '@/features/projects/overview/components/OverviewDeployments';
import { OverviewDocumentation } from '@/features/projects/overview/components/OverviewDocumentation';
import { OverviewMetrics } from '@/features/projects/overview/components/OverviewMetrics';
import { OverviewProjectInfo } from '@/features/projects/overview/components/OverviewProjectInfo';
import { OverviewRepository } from '@/features/projects/overview/components/OverviewRepository';
import { OverviewTopBar } from '@/features/projects/overview/components/OverviewTopBar';
import { OverviewUsage } from '@/features/projects/overview/components/OverviewUsage';
import { features } from '@/features/projects/overview/features';
import { frameworks } from '@/features/projects/overview/frameworks';
import { Alert } from '@/ui/Alert';
import Divider from '@/ui/v2/Divider';

View File

@@ -3,12 +3,13 @@ import { ChangePlanModal } from '@/components/applications/ChangePlanModal';
import { StagingMetadata } from '@/components/applications/StagingMetadata';
import { useDialog } from '@/components/common/DialogProvider';
import Container from '@/components/layout/Container';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useIsCurrentUserOwner } from '@/features/projects/hooks/useIsCurrentUserOwner';
import {
GetAllWorkspacesAndProjectsDocument,
useGetFreeAndActiveProjectsQuery,
useUnpauseApplicationMutation,
} from '@/generated/graphql';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { Modal } from '@/ui';
import { Alert } from '@/ui/Alert';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
@@ -26,24 +27,19 @@ import { RemoveApplicationModal } from './RemoveApplicationModal';
export default function ApplicationPaused() {
const { openDialog } = useDialog();
const {
currentWorkspace,
currentProject,
refetch: refetchWorkspaceAndProject,
} = useCurrentWorkspaceAndProject();
const { currentProject, refetch: refetchWorkspaceAndProject } =
useCurrentWorkspaceAndProject();
const isOwner = useIsCurrentUserOwner();
const user = useUserData();
const isOwner = currentWorkspace.workspaceMembers.some(
({ id, type }) => id === user?.id && type === 'owner',
);
const [showDeletingModal, setShowDeletingModal] = useState(false);
const [unpauseApplication, { loading: changingApplicationStateLoading }] =
useUnpauseApplicationMutation({
refetchQueries: [GetAllWorkspacesAndProjectsDocument],
refetchQueries: [{ query: GetAllWorkspacesAndProjectsDocument }],
});
const { data, loading } = useGetFreeAndActiveProjectsQuery({
variables: { userId: user?.id },
fetchPolicy: 'cache-and-network',
skip: !user,
});
@@ -120,24 +116,22 @@ export default function ApplicationPaused() {
</Box>
<Box className="grid grid-flow-row gap-2">
<Button
className="mx-auto w-full max-w-[280px]"
onClick={() => {
openDialog({
title: 'Upgrade your plan.',
component: <ChangePlanModal />,
props: {
PaperProps: { className: 'p-0' },
hidePrimaryAction: true,
hideSecondaryAction: true,
hideTitle: true,
maxWidth: 'lg',
},
});
}}
>
Upgrade to Pro
</Button>
{isOwner && (
<Button
className="mx-auto w-full max-w-[280px]"
onClick={() => {
openDialog({
component: <ChangePlanModal />,
props: {
PaperProps: { className: 'p-0' },
maxWidth: 'lg',
},
});
}}
>
Upgrade to Pro
</Button>
)}
<div className="grid grid-flow-row gap-2">
<Button

View File

@@ -1,6 +1,6 @@
import Container from '@/components/layout/Container';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useCheckProvisioning } from '@/hooks/useCheckProvisioning';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { ApplicationStatus } from '@/types/application';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Text from '@/ui/v2/Text';
@@ -27,7 +27,7 @@ export default function ApplicationProvisioning() {
{currentProjectState.state === ApplicationStatus.Empty ? (
<div className="grid grid-flow-row gap-1">
<Text variant="h3" component="h1">
Setting Up {currentProject.name}
Setting Up {currentProject?.name}
</Text>
<Text>This normally takes around 2 minutes</Text>
<ActivityIndicator className="mx-auto" />

View File

@@ -1,6 +1,6 @@
import Container from '@/components/layout/Container';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useCheckProvisioning } from '@/hooks/useCheckProvisioning';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { ApplicationStatus } from '@/types/application';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Text from '@/ui/v2/Text';
@@ -26,7 +26,7 @@ export default function ApplicationRestoring() {
{currentProjectState.state === ApplicationStatus.Empty ? (
<div className="grid grid-flow-row gap-1">
<Text variant="h3" component="h1">
Setting Up {currentProject.name}
Setting Up {currentProject?.name}
</Text>
<Text>This normally takes around 2 minutes</Text>

View File

@@ -1,11 +1,11 @@
import FeedbackForm from '@/components/common/FeedbackForm';
import { FeedbackForm } from '@/components/common/FeedbackForm';
import Container from '@/components/layout/Container';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useIsCurrentUserOwner } from '@/features/projects/hooks/useIsCurrentUserOwner';
import { Modal } from '@/ui/Modal';
import Button from '@/ui/v2/Button';
import { Dropdown } from '@/ui/v2/Dropdown';
import Text from '@/ui/v2/Text';
import { useUserData } from '@nhost/nextjs';
import Image from 'next/image';
import { useState } from 'react';
import ApplicationInfo from './ApplicationInfo';
@@ -13,12 +13,9 @@ import { RemoveApplicationModal } from './RemoveApplicationModal';
import { StagingMetadata } from './StagingMetadata';
export default function ApplicationUnknown() {
const { currentWorkspace, currentProject } = useCurrentWorkspaceAndProject();
const { currentProject } = useCurrentWorkspaceAndProject();
const [showDeleteModal, setShowDeleteModal] = useState(false);
const user = useUserData();
const isOwner = currentWorkspace.workspaceMembers.some(
({ id, type }) => id === user?.id && type === 'owner',
);
const isOwner = useIsCurrentUserOwner();
return (
<>

View File

@@ -1,5 +1,5 @@
import Container from '@/components/layout/Container';
import useProjectRedirectWhenReady from '@/hooks/common/useProjectRedirectWhenReady';
import { useProjectRedirectWhenReady } from '@/features/projects/hooks/useProjectRedirectWhenReady';
import Image from 'next/image';
import { AppLoader } from './AppLoader';

View File

@@ -1,120 +0,0 @@
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import Input from '@/ui/v2/Input';
import Text from '@/ui/v2/Text';
import { nhost } from '@/utils/nhost';
import { triggerToast } from '@/utils/toast';
import React, { useState } from 'react';
export function ChangePasswordModal({ close }: any) {
const [formState, setFormState] = useState<{
loading: boolean;
error: null | string;
}>({
loading: false,
error: null,
});
const [newPassword, setNewPassword] = useState('');
const [newPasswordConfirm, setNewPasswordConfirm] = useState('');
const handleSubmit = async (e: React.SyntheticEvent<HTMLFormElement>) => {
e.preventDefault();
setFormState({
loading: true,
error: null,
});
if (newPassword !== newPasswordConfirm) {
setFormState({
loading: false,
error: 'Passwords do not match',
});
return;
}
const { error } = await nhost.auth.changePassword({ newPassword });
if (error) {
setFormState({
loading: false,
error: error.message,
});
return;
}
triggerToast(`Your password has been updated`);
close();
};
return (
<Box className="w-full max-w-md rounded-md px-6 py-6 text-left">
<form onSubmit={handleSubmit}>
<div className="grid grid-flow-row gap-4">
<div className="grid grid-flow-row gap-2">
<Text variant="h3">Choose New Password</Text>
<Text className="mt-2 font-normal">
Make sure to pick a strong password with at least 8 characters.
</Text>
</div>
<div className="grid grid-flow-row gap-2">
<Input
type="password"
id="newPassword"
name="newPassword"
label="New Password"
placeholder="New password"
autoFocus
value={newPassword}
onChange={(event) => setNewPassword(event.target.value)}
hideEmptyHelperText
fullWidth
required
/>
<Input
type="password"
id="confirmNewPassword"
name="confirmNewPassword"
label="Confirm New Password"
placeholder="Confirm new password"
value={newPasswordConfirm}
onChange={(event) => setNewPasswordConfirm(event.target.value)}
hideEmptyHelperText
fullWidth
required
/>
</div>
<div className="grid grid-flow-row gap-2">
{formState.error && (
<Text className="w-full px-4 text-center" color="error">
Error: {formState.error}
</Text>
)}
<Button type="submit" loading={formState.loading}>
Set New Password
</Button>
<Button
type="reset"
variant="outlined"
color="secondary"
onClick={close}
>
Cancel
</Button>
</div>
</div>
</form>
</Box>
);
}
export default ChangePasswordModal;

View File

@@ -1,34 +1,30 @@
import { BillingPaymentMethodForm } from '@/components/billing-payment-method/BillingPaymentMethodForm';
import { useDialog } from '@/components/common/DialogProvider';
import { useUI } from '@/context/UIContext';
import { BillingPaymentMethodForm } from '@/components/workspace/BillingPaymentMethodForm';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import {
refetchGetApplicationPlanQuery,
useGetAppPlanAndGlobalPlansQuery,
useGetPaymentMethodsQuery,
useUpdateApplicationMutation,
} from '@/generated/graphql';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { Modal } from '@/ui/Modal';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import Checkbox from '@/ui/v2/Checkbox';
import Text from '@/ui/v2/Text';
import useApplicationState from '@/hooks/useApplicationState';
import { ApplicationStatus } from '@/types/application';
import { ActivityIndicator } from '@/ui/v2/ActivityIndicator';
import { Box } from '@/ui/v2/Box';
import { Button } from '@/ui/v2/Button';
import { Checkbox } from '@/ui/v2/Checkbox';
import { BaseDialog } from '@/ui/v2/Dialog';
import { Link } from '@/ui/v2/Link';
import { Text } from '@/ui/v2/Text';
import { planDescriptions } from '@/utils/planDescriptions';
import { triggerToast } from '@/utils/toast';
import { useTheme } from '@mui/material';
import { getServerError } from '@/utils/settings/getServerError';
import { getToastStyleProps } from '@/utils/settings/settingsConstants';
import Image from 'next/image';
import { useRouter } from 'next/router';
import { useState } from 'react';
import { useEffect, useState } from 'react';
import { toast } from 'react-hot-toast';
function Plan({
planName,
price,
setPlan,
planId,
selectedPlanId,
currentPlan,
}: any) {
function Plan({ planName, price, setPlan, planId, selectedPlanId }: any) {
return (
<button
type="button"
@@ -49,7 +45,7 @@ function Plan({
component="p"
className="self-center text-left font-medium"
>
{currentPlan.price > price ? 'Downgrade' : 'Upgrade'} to {planName}
Upgrade to {planName}
</Text>
</div>
@@ -59,20 +55,24 @@ function Plan({
</div>
<Text variant="h3" component="p">
$ {price}/mo
${price}/mo
</Text>
</button>
);
}
export function ChangePlanModalWithData({ app, plans, close }: any) {
const theme = useTheme();
const [selectedPlanId, setSelectedPlanId] = useState('');
const { closeAlertDialog } = useDialog();
const [pollingCurrentProject, setPollingCurrentProject] = useState(false);
const { currentWorkspace, currentProject } = useCurrentWorkspaceAndProject();
const {
currentWorkspace,
currentProject,
refetch: refetchWorkspaceAndProject,
} = useCurrentWorkspaceAndProject();
const { state } = useApplicationState();
// get workspace payment methods
const { data } = useGetPaymentMethodsQuery({
variables: {
workspaceId: currentWorkspace?.id,
@@ -80,15 +80,35 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
skip: !currentWorkspace,
});
const { openPaymentModal, closePaymentModal, paymentModal } = useUI();
const [showPaymentModal, setShowPaymentModal] = useState(false);
const paymentMethodAvailable = data?.paymentMethods.length > 0;
const currentPlan = plans.find((plan) => plan.id === app.plan.id);
const selectedPlan = plans.find((plan) => plan.id === selectedPlanId);
const isDowngrade = currentPlan.price > selectedPlan?.price;
useEffect(() => {
if (!pollingCurrentProject || state === ApplicationStatus.Paused) {
return;
}
close?.();
closeAlertDialog();
setShowPaymentModal(false);
setPollingCurrentProject(false);
}, [state, pollingCurrentProject, close, closeAlertDialog]);
useEffect(() => {
if (!pollingCurrentProject) {
return () => {};
}
const interval = setInterval(() => {
refetchWorkspaceAndProject();
}, 1000);
return () => clearInterval(interval);
}, [pollingCurrentProject, refetchWorkspaceAndProject, currentProject]);
// graphql mutations
const [updateApp] = useUpdateApplicationMutation({
refetchQueries: [
refetchGetApplicationPlanQuery({
@@ -98,28 +118,32 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
],
});
// function handlers
const handleUpdateAppPlan = async () => {
await updateApp({
variables: {
appId: app.id,
app: {
planId: selectedPlan.id,
try {
await toast.promise(
updateApp({
variables: {
appId: app.id,
app: {
planId: selectedPlan.id,
desiredState: 5,
},
},
}),
{
loading: 'Updating plan...',
success: `Plan has been updated successfully to ${selectedPlan.name}.`,
error: getServerError(
'An error occurred while updating the plan. Please try again.',
),
},
},
});
getToastStyleProps(),
);
if (isDowngrade) {
if (close) {
close();
}
closeAlertDialog();
setPollingCurrentProject(true);
} catch (error) {
// Note: Error is handled by the toast.
}
triggerToast(
`${currentProject.name} plan changed to ${selectedPlan.name}.`,
);
};
const handleChangePlanClick = async () => {
@@ -128,33 +152,114 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
}
if (!paymentMethodAvailable) {
openPaymentModal();
setShowPaymentModal(true);
return;
}
await handleUpdateAppPlan();
if (close) {
close();
}
closeAlertDialog();
};
if (pollingCurrentProject) {
return (
<Box className="mx-auto w-full max-w-xl rounded-lg p-6 text-left">
<div className="flex flex-col">
<div className="mx-auto">
<Image
src="/assets/upgrade.svg"
alt="Nhost Logo"
width={72}
height={72}
/>
</div>
<Text variant="h3" component="h2" className="mt-2 text-center">
Successfully upgraded to {currentPlan.name}
</Text>
<ActivityIndicator
label="We are unpausing your project. This may take some time..."
className="mx-auto mt-2"
/>
<Button
variant="outlined"
color="secondary"
className="mx-auto mt-4 w-full max-w-sm"
onClick={() => {
if (close) {
close();
}
closeAlertDialog();
}}
>
Cancel
</Button>
</div>
</Box>
);
}
if (app.plan.id !== plans.find((plan) => plan.isFree)?.id) {
return (
<Box className="mx-auto w-full max-w-xl rounded-lg p-6 text-left">
<div className="flex flex-col">
<div className="mx-auto">
<Image
src="/assets/upgrade.svg"
alt="Nhost Logo"
width={72}
height={72}
/>
</div>
<Text variant="h3" component="h2" className="mt-2 text-center">
Downgrade is not available
</Text>
<Text className="mt-1 text-center">
You can&apos;t downgrade from a paid plan to a free plan here.
</Text>
<Text className="text-center">
Please contact us at{' '}
<Link href="mailto:info@nhost.io">info@nhost.io</Link> if you want
to downgrade.
</Text>
<div className="mt-6 grid grid-flow-row gap-2">
<Button
variant="outlined"
color="secondary"
className="mx-auto w-full max-w-sm"
onClick={() => {
if (close) {
close();
}
closeAlertDialog();
}}
>
Cancel
</Button>
</div>
</div>
</Box>
);
}
return (
<Box className="w-full max-w-xl rounded-lg p-6 text-left">
<Modal
showModal={paymentModal}
close={closePaymentModal}
dialogStyle={{ zIndex: theme.zIndex.modal + 1 }}
<BaseDialog
open={showPaymentModal}
onClose={() => setShowPaymentModal(false)}
>
<BillingPaymentMethodForm
close={closePaymentModal}
onPaymentMethodAdded={handleUpdateAppPlan}
workspaceId={currentWorkspace.id}
/>
</Modal>
</BaseDialog>
<div className="flex flex-col">
<div className="mx-auto">
<Image
@@ -171,7 +276,7 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
You&apos;re currently on the <strong>{app.plan.name}</strong> plan.
</Text>
<div className="mt-5">
<div className="mt-2">
{plans
.filter((plan) => plan.id !== app.plan.id)
.map((plan) => (
@@ -189,11 +294,13 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
))}
</div>
<div className="mt-6 grid grid-flow-row gap-2">
<Button onClick={handleChangePlanClick} disabled={!selectedPlan}>
{!selectedPlan && 'Change Plan'}
{selectedPlan && isDowngrade && 'Downgrade'}
{selectedPlan && !isDowngrade && 'Upgrade'}
<div className="mt-2 grid grid-flow-row gap-2">
<Button
onClick={handleChangePlanClick}
disabled={!selectedPlan}
loading={pollingCurrentProject}
>
Upgrade
</Button>
<Button
@@ -217,14 +324,12 @@ export function ChangePlanModalWithData({ app, plans, close }: any) {
export interface ChangePlanModalProps {
/**
* Function to close the modal if mounted on parent component.
*
* @deprecated Implement modal by using `openAlertDialog` hook instead.
* Function to close the modal.
*/
close?: () => void;
onCancel?: () => void;
}
export function ChangePlanModal({ close }: ChangePlanModalProps) {
export function ChangePlanModal({ onCancel }: ChangePlanModalProps) {
const {
query: { workspaceSlug, appSlug },
} = useRouter();
@@ -250,5 +355,5 @@ export function ChangePlanModal({ close }: ChangePlanModalProps) {
const { apps, plans } = data;
const app = apps[0];
return <ChangePlanModalWithData app={app} plans={plans} close={close} />;
return <ChangePlanModalWithData app={app} plans={plans} close={onCancel} />;
}

View File

@@ -1,15 +1,16 @@
import { LoadingScreen } from '@/components/common/LoadingScreen';
import useIsPlatform from '@/hooks/common/useIsPlatform';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useIsPlatform } from '@/features/projects/hooks/useIsPlatform';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import IconButton from '@/ui/v2/IconButton';
import ArrowSquareOutIcon from '@/ui/v2/icons/ArrowSquareOutIcon';
import CopyIcon from '@/ui/v2/icons/CopyIcon';
import Text from '@/ui/v2/Text';
import generateAppServiceUrl, {
import {
defaultLocalBackendSlugs,
defaultRemoteBackendSlugs,
generateAppServiceUrl,
} from '@/utils/common/generateAppServiceUrl';
import { copy } from '@/utils/copy';
import { getHasuraConsoleServiceUrl } from '@/utils/env';
@@ -33,7 +34,7 @@ export function HasuraData({ close }: HasuraDataProps) {
? `${getHasuraConsoleServiceUrl()}`
: generateAppServiceUrl(
currentProject?.subdomain,
currentProject?.region.awsName,
currentProject?.region,
'hasura',
defaultLocalBackendSlugs,
{ ...defaultRemoteBackendSlugs, hasura: '/console' },

View File

@@ -1,4 +1,4 @@
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import Checkbox from '@/ui/v2/Checkbox';
@@ -46,7 +46,7 @@ export function RemoveApplicationModal({
className,
}: RemoveApplicationModalProps) {
const [deleteApplication] = useDeleteApplicationMutation({
refetchQueries: [GetAllWorkspacesAndProjectsDocument],
refetchQueries: [{ query: GetAllWorkspacesAndProjectsDocument }],
});
const [loadingRemove, setLoadingRemove] = useState(false);
const { currentProject } = useCurrentWorkspaceAndProject();

View File

@@ -1,4 +1,4 @@
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import Checkbox from '@/ui/v2/Checkbox';

View File

@@ -1,5 +1,6 @@
import { ChangePlanModal } from '@/components/applications/ChangePlanModal';
import { useDialog } from '@/components/common/DialogProvider';
import { useIsCurrentUserOwner } from '@/features/projects/hooks/useIsCurrentUserOwner';
import { Alert } from '@/ui/Alert';
import Button from '@/ui/v2/Button';
import Text from '@/ui/v2/Text';
@@ -20,29 +21,36 @@ export function UnlockFeatureByUpgrading({
...props
}: UnlockFeatureByUpgradingProps) {
const { openDialog } = useDialog();
const isOwner = useIsCurrentUserOwner();
return (
<div className={twMerge('flex', className)} {...props}>
<Alert className="grid w-full grid-flow-col place-content-between items-center gap-2">
<Text className="text-left">{message}</Text>
<Text className="grid grid-flow-row justify-items-start gap-0.5">
<Text component="span">{message}</Text>
<Button
variant="borderless"
onClick={() => {
openDialog({
title: 'Upgrade your plan.',
component: <ChangePlanModal />,
props: {
PaperProps: { className: 'p-0 max-w-xl w-full' },
hidePrimaryAction: true,
hideSecondaryAction: true,
hideTitle: true,
},
});
}}
>
Upgrade
</Button>
{!isOwner && (
<Text component="span" color="secondary" className="text-sm">
Ask an owner of this workspace to upgrade the project.
</Text>
)}
</Text>
{isOwner && (
<Button
variant="borderless"
onClick={() => {
openDialog({
component: <ChangePlanModal />,
props: {
PaperProps: { className: 'p-0 max-w-xl w-full' },
},
});
}}
>
Upgrade
</Button>
)}
</Alert>
</div>
);

View File

@@ -1,5 +1,5 @@
import type { ConnectGithubModalState } from '@/components/applications/ConnectGithubModal';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { FormProvider, useForm } from 'react-hook-form';
import { EditRepositorySettingsModal } from './EditRepositorySettingsModal';

View File

@@ -2,14 +2,12 @@ import type { EditRepositorySettingsFormData } from '@/components/applications/g
import { useDialog } from '@/components/common/DialogProvider';
import ErrorBoundaryFallback from '@/components/common/ErrorBoundaryFallback';
import GithubIcon from '@/components/icons/GithubIcon';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useUpdateApplicationMutation } from '@/generated/graphql';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import Button from '@/ui/v2/Button';
import Text from '@/ui/v2/Text';
import { discordAnnounce } from '@/utils/discordAnnounce';
import { triggerToast } from '@/utils/toast';
import { updateOwnCache } from '@/utils/updateOwnCache';
import { useApolloClient } from '@apollo/client';
import { ErrorBoundary } from 'react-error-boundary';
import { useFormContext } from 'react-hook-form';
import { RepoAndBranch } from './RepoAndBranch';
@@ -27,12 +25,11 @@ export function EditRepositorySettingsModal({
const isNotCompleted = !watch('productionBranch') || !watch('repoBaseFolder');
const { closeAlertDialog } = useDialog();
const { currentProject } = useCurrentWorkspaceAndProject();
const { currentProject, refetch: refetchProject } =
useCurrentWorkspaceAndProject();
const [updateApp, { loading }] = useUpdateApplicationMutation();
const client = useApolloClient();
const handleEditGitHubIntegration = async (
data: EditRepositorySettingsFormData,
) => {
@@ -60,7 +57,8 @@ export function EditRepositorySettingsModal({
});
}
await updateOwnCache(client);
await refetchProject();
if (close) {
close();
} else {

View File

@@ -1,5 +1,5 @@
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useRemoteApplicationGQLClient } from '@/hooks/useRemoteApplicationGQLClient';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Option from '@/ui/v2/Option';
import Select from '@/ui/v2/Select';

View File

@@ -1,6 +1,6 @@
import NavLink from '@/components/common/NavLink';
import useIsPlatform from '@/hooks/common/useIsPlatform';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useIsPlatform } from '@/features/projects/hooks/useIsPlatform';
import type { BoxProps } from '@/ui/v2/Box';
import Box from '@/ui/v2/Box';
import Text from '@/ui/v2/Text';

View File

@@ -1,2 +1,2 @@
export * from './Breadcrumbs';
export { default } from './Breadcrumbs';
export { default as Breadcrumbs } from './Breadcrumbs';

View File

@@ -2,7 +2,7 @@ import type {
AutocompleteOption,
AutocompleteProps,
} from '@/ui/v2/Autocomplete';
import Autocomplete from '@/ui/v2/Autocomplete';
import { Autocomplete } from '@/ui/v2/Autocomplete';
import callAll from '@/utils/callAll';
import type { ForwardedRef } from 'react';
import { forwardRef } from 'react';

View File

@@ -1,2 +1,5 @@
export * from './ControlledAutocomplete';
export { default } from './ControlledAutocomplete';
export {
default as ControlledAutocomplete,
default,
} from './ControlledAutocomplete';

View File

@@ -1,2 +1,2 @@
export * from './ControlledCheckbox';
export { default } from './ControlledCheckbox';
export { default as ControlledCheckbox, default } from './ControlledCheckbox';

View File

@@ -1,5 +1,5 @@
import type { SelectProps } from '@/ui/v2/Select';
import Select from '@/ui/v2/Select';
import { Select } from '@/ui/v2/Select';
import type { ForwardedRef } from 'react';
import { forwardRef } from 'react';
import type { FieldValues, UseControllerProps } from 'react-hook-form';

View File

@@ -1,2 +1,2 @@
export * from './ControlledSelect';
export { default } from './ControlledSelect';
export { default as ControlledSelect, default } from './ControlledSelect';

View File

@@ -1,4 +1,4 @@
import { render, screen } from '@/utils/testUtils';
import { render, screen } from '@/tests/testUtils';
import type { Column } from 'react-table';
import { expect, test } from 'vitest';
import DataGrid from './DataGrid';

View File

@@ -2,11 +2,11 @@ import DataGridBody from '@/components/common/DataGridBody';
import DataGridFrame from '@/components/common/DataGridFrame';
import type { DataGridHeaderProps } from '@/components/common/DataGridHeader';
import DataGridHeader from '@/components/common/DataGridHeader';
import DataBrowserEmptyState from '@/components/dataBrowser/DataBrowserEmptyState';
import { DataGridProvider } from '@/context/DataGridContext';
import { DataBrowserEmptyState } from '@/features/database/dataGrid/components/DataBrowserEmptyState';
import type { DataBrowserGridColumn } from '@/features/database/dataGrid/types/dataBrowser';
import type { UseDataGridOptions } from '@/hooks/useDataGrid';
import useDataGrid from '@/hooks/useDataGrid';
import type { DataBrowserGridColumn } from '@/types/dataBrowser';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Box from '@/ui/v2/Box';
import type { ForwardedRef } from 'react';

View File

@@ -1,7 +1,7 @@
import type { DataGridProps } from '@/components/common/DataGrid';
import DataGridCell from '@/components/common/DataGridCell';
import type { DataBrowserGridColumn } from '@/features/database/dataGrid/types/dataBrowser';
import useDataGridConfig from '@/hooks/useDataGridConfig';
import type { DataBrowserGridColumn } from '@/types/dataBrowser';
import type { BoxProps } from '@/ui/v2/Box';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';

View File

@@ -3,7 +3,7 @@ import type {
ColumnType,
DataBrowserGridCell,
DataBrowserGridCellProps,
} from '@/types/dataBrowser';
} from '@/features/database/dataGrid/types/dataBrowser';
import type { BoxProps } from '@/ui/v2/Box';
import Box from '@/ui/v2/Box';
import Tooltip, { useTooltip } from '@/ui/v2/Tooltip';

View File

@@ -1,6 +1,6 @@
import type { DataGridProps } from '@/components/common/DataGrid';
import type { DataBrowserGridColumn } from '@/features/database/dataGrid/types/dataBrowser';
import useDataGridConfig from '@/hooks/useDataGridConfig';
import type { DataBrowserGridColumn } from '@/types/dataBrowser';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import Divider from '@/ui/v2/Divider';

View File

@@ -2,8 +2,8 @@ import AudioPreview from '@/components/icons/AudioPreview';
import { FileIcon } from '@/components/icons/FileIcon';
import PDFPreview from '@/components/icons/PDFPreview';
import VideoPreview from '@/components/icons/VideoPreview';
import { useAppClient } from '@/hooks/useAppClient';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { useAppClient } from '@/features/projects/hooks/useAppClient';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { Modal } from '@/ui/Modal';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Box from '@/ui/v2/Box';

View File

@@ -1,7 +1,7 @@
import type { IconLinkProps } from '@/components/common/IconLink';
import IconLink from '@/components/common/IconLink';
import { Nav } from '@/components/dashboard/Nav';
import useProjectRoutes from '@/hooks/common/useProjectRoutes';
import { useProjectRoutes } from '@/features/projects/hooks/useProjectRoutes';
import type { BoxProps } from '@/ui/v2/Box';
import Box from '@/ui/v2/Box';
import { useRouter } from 'next/router';

View File

@@ -22,7 +22,7 @@ export interface OpenDialogOptions {
/**
* Title of the dialog.
*/
title: ReactNode;
title?: ReactNode;
/**
* Component to render inside the dialog skeleton.
*/

View File

@@ -1,2 +1,2 @@
export * from './FeedbackForm';
export { default } from './FeedbackForm';
export { default as FeedbackForm } from './FeedbackForm';

View File

@@ -1,2 +1,2 @@
export * from './Form';
export { default } from './Form';
export { default as Form, default } from './Form';

View File

@@ -1,2 +1,5 @@
export * from './FormActivityIndicator';
export { default } from './FormActivityIndicator';
export {
default,
default as FormActivityIndicator,
} from './FormActivityIndicator';

View File

@@ -1,15 +1,19 @@
import Breadcrumbs from '@/components/common/Breadcrumbs';
import FeedbackForm from '@/components/common/FeedbackForm';
import LocalAccountMenu from '@/components/common/LocalAccountMenu';
import Logo from '@/components/common/Logo';
import MobileNav from '@/components/common/MobileNav';
import NavLink from '@/components/common/NavLink';
import { Breadcrumbs } from '@/components/common/Breadcrumbs';
import { FeedbackForm } from '@/components/common/FeedbackForm';
import { LocalAccountMenu } from '@/components/common/LocalAccountMenu';
import { Logo } from '@/components/common/Logo';
import { MobileNav } from '@/components/common/MobileNav';
import { NavLink } from '@/components/common/NavLink';
import { AccountMenu } from '@/components/dashboard/AccountMenu';
import useIsPlatform from '@/hooks/common/useIsPlatform';
import Box from '@/ui/v2/Box';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useIsPlatform } from '@/features/projects/hooks/useIsPlatform';
import { ApplicationStatus } from '@/types/application';
import { Box } from '@/ui/v2/Box';
import { Chip } from '@/ui/v2/Chip';
import { Dropdown } from '@/ui/v2/Dropdown';
import { useRouter } from 'next/router';
import type { DetailedHTMLProps, HTMLProps, PropsWithoutRef } from 'react';
import { useEffect } from 'react';
import { twMerge } from 'tailwind-merge';
export interface HeaderProps
@@ -20,6 +24,25 @@ export interface HeaderProps
export default function Header({ className, ...props }: HeaderProps) {
const router = useRouter();
const isPlatform = useIsPlatform();
const { currentProject, refetch: refetchProject } =
useCurrentWorkspaceAndProject();
const isProjectUpdating =
currentProject?.appStates[0]?.stateId === ApplicationStatus.Updating;
// Poll for project updates
useEffect(() => {
if (!isProjectUpdating) {
return () => {};
}
const interval = setInterval(async () => {
await refetchProject();
}, 5000);
return () => {
clearInterval(interval);
};
}, [isProjectUpdating, refetchProject]);
return (
<Box
@@ -39,6 +62,10 @@ export default function Header({ className, ...props }: HeaderProps) {
{(router.query.workspaceSlug || router.query.appSlug) && (
<Breadcrumbs aria-label="Workspace breadcrumbs" />
)}
{isProjectUpdating && (
<Chip size="small" label="Updating" color="warning" />
)}
</div>
<div className="hidden grid-flow-col items-center gap-2 sm:grid">

View File

@@ -1 +1 @@
export { default } from './HighlightedText';
export { default as HighlightedText } from './HighlightedText';

View File

@@ -1,2 +1,2 @@
export * from './InlineCode';
export { default } from './InlineCode';
export { default, default as InlineCode } from './InlineCode';

View File

@@ -1,8 +1,11 @@
import ThemeSwitcher from '@/components/common/ThemeSwitcher';
import { ThemeSwitcher } from '@/components/common/ThemeSwitcher';
import { Avatar } from '@/ui/Avatar';
import { Box } from '@/ui/v2/Box';
import { Divider } from '@/ui/v2/Divider';
import { Dropdown } from '@/ui/v2/Dropdown';
import IconButton from '@/ui/v2/IconButton';
import UserIcon from '@/ui/v2/icons/UserIcon';
import Text from '@/ui/v2/Text';
import { IconButton } from '@/ui/v2/IconButton';
import { UserIcon } from '@/ui/v2/icons/UserIcon';
import { Text } from '@/ui/v2/Text';
import getConfig from 'next/config';
export default function LocalAccountMenu() {
@@ -25,14 +28,38 @@ export default function LocalAccountMenu() {
<Dropdown.Content
PaperProps={{
className: 'mt-1 p-6 grid grid-flow-row gap-4 w-full max-w-xs',
className: 'mt-1 grid grid-flow-row w-full max-w-xs',
}}
>
<ThemeSwitcher label="Theme" />
<Box className="grid grid-flow-col items-center justify-start gap-4 p-4">
<Avatar name="Local User" className="h-10 w-10" />
<Text className="text-center text-xs" color="disabled">
Dashboard Version: {publicRuntimeConfig?.version || 'n/a'}
</Text>
<Box className="grid grid-flow-row gap-0.5">
<Text className="font-semibold">Local User</Text>
</Box>
</Box>
<Divider />
<Box className="grid grid-flow-row gap-2 p-2">
<ThemeSwitcher
label="Theme"
variant="inline"
fullWidth
className="grid-cols-auto justify-between px-2"
slotProps={{
label: { className: '!text-sm+' },
}}
/>
</Box>
<Divider />
<Box className="py-4">
<Text className="text-center text-xs" color="disabled">
Dashboard Version: {publicRuntimeConfig?.version || 'n/a'}
</Text>
</Box>
</Dropdown.Content>
</Dropdown.Root>
);

View File

@@ -1 +1 @@
export { default } from './LocalAccountMenu';
export { default as LocalAccountMenu } from './LocalAccountMenu';

View File

@@ -0,0 +1 @@
export { default as Logo } from './Logo';

View File

@@ -1 +1 @@
export { default } from './MaintenanceAlert';
export { default as MaintenanceAlert } from './MaintenanceAlert';

View File

@@ -1,23 +1,21 @@
import { ChangePasswordModal } from '@/components/applications/ChangePasswordModal';
import FeedbackForm from '@/components/common/FeedbackForm';
import NavLink from '@/components/common/NavLink';
import ThemeSwitcher from '@/components/common/ThemeSwitcher';
import { FeedbackForm } from '@/components/common/FeedbackForm';
import { NavLink } from '@/components/common/NavLink';
import { ThemeSwitcher } from '@/components/common/ThemeSwitcher';
import { Nav } from '@/components/dashboard/Nav';
import useIsPlatform from '@/hooks/common/useIsPlatform';
import useProjectRoutes from '@/hooks/common/useProjectRoutes';
import { useIsPlatform } from '@/features/projects/hooks/useIsPlatform';
import { useProjectRoutes } from '@/features/projects/hooks/useProjectRoutes';
import { useNavigationVisible } from '@/hooks/useNavigationVisible';
import { Modal } from '@/ui/Modal';
import type { ButtonProps } from '@/ui/v2/Button';
import Button from '@/ui/v2/Button';
import Divider from '@/ui/v2/Divider';
import Drawer from '@/ui/v2/Drawer';
import { Button } from '@/ui/v2/Button';
import { Divider } from '@/ui/v2/Divider';
import { Drawer } from '@/ui/v2/Drawer';
import { Dropdown } from '@/ui/v2/Dropdown';
import MenuIcon from '@/ui/v2/icons/MenuIcon';
import XIcon from '@/ui/v2/icons/XIcon';
import List from '@/ui/v2/List';
import { MenuIcon } from '@/ui/v2/icons/MenuIcon';
import { XIcon } from '@/ui/v2/icons/XIcon';
import { List } from '@/ui/v2/List';
import type { ListItemButtonProps } from '@/ui/v2/ListItem';
import { ListItem } from '@/ui/v2/ListItem';
import Text from '@/ui/v2/Text';
import { Text } from '@/ui/v2/Text';
import { useApolloClient } from '@apollo/client';
import { useSignOut } from '@nhost/nextjs';
import getConfig from 'next/config';
@@ -86,7 +84,6 @@ export default function MobileNav({ className, ...props }: MobileNavProps) {
const { allRoutes } = useProjectRoutes();
const shouldDisplayNav = useNavigationVisible();
const [menuOpen, setMenuOpen] = useState(false);
const [showChangePasswordModal, setShowChangePasswordModal] = useState(false);
const { signOut } = useSignOut();
const apolloClient = useApolloClient();
const router = useRouter();
@@ -94,14 +91,6 @@ export default function MobileNav({ className, ...props }: MobileNavProps) {
return (
<>
<Modal
showModal={showChangePasswordModal}
close={() => setShowChangePasswordModal(false)}
>
{/** TODO: Make use of `DialogProvider` here or create a separate page. */}
<ChangePasswordModal close={() => setShowChangePasswordModal(false)} />
</Modal>
<Button
variant="borderless"
color="secondary"
@@ -228,15 +217,14 @@ export default function MobileNav({ className, ...props }: MobileNavProps) {
<List className="grid grid-flow-row gap-2">
<ListItem.Root>
<ListItem.Button
component={NavLink}
variant="borderless"
color="secondary"
className="w-full justify-start border-none px-2 py-2.5 text-[16px]"
onClick={() => {
setMenuOpen(false);
setShowChangePasswordModal(true);
}}
href="/account"
onClick={() => setMenuOpen(false)}
>
Change Password
Settings
</ListItem.Button>
</ListItem.Root>
@@ -245,7 +233,7 @@ export default function MobileNav({ className, ...props }: MobileNavProps) {
<ListItem.Root>
<ListItem.Button
variant="borderless"
color="secondary"
sx={{ color: 'error.main' }}
className="justify-start border-none px-2 py-2.5 text-[16px]"
onClick={async () => {
setMenuOpen(false);

View File

@@ -1,2 +1,2 @@
export * from './MobileNav';
export { default } from './MobileNav';
export { default as MobileNav } from './MobileNav';

View File

@@ -1,2 +1,2 @@
export * from './NavLink';
export { default } from './NavLink';
export { default as NavLink, default } from './NavLink';

View File

@@ -1,3 +1,2 @@
export * from './Pagination';
export { default } from './Pagination';
export { default as Pagination } from './Pagination';

View File

@@ -1,2 +1,5 @@
export * from './RetryableErrorBoundary';
export { default } from './RetryableErrorBoundary';
export {
default,
default as RetryableErrorBoundary,
} from './RetryableErrorBoundary';

View File

@@ -22,6 +22,7 @@ export default function ThemeSwitcher({
onChange?.(event, value);
}}
slotProps={{
...props?.slotProps,
listbox: { className: 'min-w-0 w-full' },
popper: {
disablePortal: false,

View File

@@ -1,2 +1,2 @@
export * from './ThemeSwitcher';
export { default } from './ThemeSwitcher';
export { default as ThemeSwitcher } from './ThemeSwitcher';

View File

@@ -1,119 +0,0 @@
import { ChangePasswordModal } from '@/components/applications/ChangePasswordModal';
import ThemeSwitcher from '@/components/common/ThemeSwitcher';
import { Avatar } from '@/ui/Avatar';
import { Modal } from '@/ui/Modal';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import { Dropdown, useDropdown } from '@/ui/v2/Dropdown';
import PowerIcon from '@/ui/v2/icons/PowerIcon';
import Text from '@/ui/v2/Text';
import { useApolloClient } from '@apollo/client';
import { useSignOut, useUserData } from '@nhost/nextjs';
import getConfig from 'next/config';
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
interface AccountMenuContentProps {
onChangePasswordClick: VoidFunction;
}
function AccountMenuContent({
onChangePasswordClick,
}: AccountMenuContentProps) {
const user = useUserData();
const { signOut } = useSignOut();
const router = useRouter();
const apolloClient = useApolloClient();
const { handleClose } = useDropdown();
const { publicRuntimeConfig } = getConfig();
return (
<Box className="relative grid w-full grid-flow-row gap-5 p-6">
<div className="grid grid-flow-row justify-center">
<Avatar
className="mx-auto mb-2 h-16 w-16 rounded-full"
name={user?.displayName}
avatarUrl={user?.avatarUrl}
/>
<Text variant="h3" component="h2" className="text-center">
{user?.displayName}
</Text>
<Text className="text-center font-medium">{user?.email}</Text>
</div>
<div className="grid grid-flow-row gap-2">
<Button
variant="outlined"
color="secondary"
onClick={() => {
onChangePasswordClick();
handleClose();
}}
>
Change Password
</Button>
<Button
variant="outlined"
color="secondary"
onClick={async () => {
await apolloClient.clearStore();
await signOut();
await router.push('/signin');
}}
endIcon={<PowerIcon className="mr-1 h-4 w-4" />}
>
Sign Out
</Button>
</div>
<ThemeSwitcher label="Theme" />
<Text className="text-center text-xs" color="disabled">
Dashboard Version: {publicRuntimeConfig?.version || 'n/a'}
</Text>
</Box>
);
}
export function AccountMenu() {
const user = useUserData();
const [changePasswordModal, setChangePasswordModal] = useState(false);
useEffect(() => {
if (window.location.hash.search('type=passwordReset') !== -1) {
setChangePasswordModal(true);
}
}, []);
return (
<>
<Modal
showModal={changePasswordModal}
close={() => setChangePasswordModal(false)}
>
<ChangePasswordModal close={() => setChangePasswordModal(false)} />
</Modal>
<Dropdown.Root>
<Dropdown.Trigger hideChevron className="rounded-full">
<Avatar
className="h-7 w-7 self-center rounded-full"
name={user?.displayName}
avatarUrl={user?.avatarUrl}
/>
</Dropdown.Trigger>
<Dropdown.Content PaperProps={{ className: 'mt-1 max-w-xs w-full' }}>
<AccountMenuContent
onChangePasswordClick={() => setChangePasswordModal(true)}
/>
</Dropdown.Content>
</Dropdown.Root>
</>
);
}
export default AccountMenu;

View File

@@ -0,0 +1,113 @@
import { NavLink } from '@/components/common/NavLink';
import { ThemeSwitcher } from '@/components/common/ThemeSwitcher';
import { Avatar } from '@/ui/Avatar';
import { Box } from '@/ui/v2/Box';
import { Button } from '@/ui/v2/Button';
import { Divider } from '@/ui/v2/Divider';
import { Dropdown, useDropdown } from '@/ui/v2/Dropdown';
import { Text } from '@/ui/v2/Text';
import { useApolloClient } from '@apollo/client';
import { useSignOut, useUserData } from '@nhost/nextjs';
import getConfig from 'next/config';
import { useRouter } from 'next/router';
function AccountMenuContent() {
const user = useUserData();
const { signOut } = useSignOut();
const router = useRouter();
const apolloClient = useApolloClient();
const { handleClose } = useDropdown();
const { publicRuntimeConfig } = getConfig();
return (
<Box className="grid grid-flow-row">
<Box className="grid grid-flow-col items-center justify-start gap-4 p-4">
<Avatar
name={user?.displayName}
avatarUrl={user?.avatarUrl}
className="h-10 w-10"
/>
<Box className="grid grid-flow-row gap-0.5">
<Text className="font-semibold">{user?.displayName}</Text>
<Text color="secondary" className="text-sm">
{user?.email}
</Text>
</Box>
</Box>
<Divider />
<Box className="p-2">
<ThemeSwitcher
label="Theme"
variant="inline"
fullWidth
className="grid-cols-auto justify-between px-2"
slotProps={{
label: { className: '!text-sm+' },
}}
/>
</Box>
<Divider />
<Box className="grid grid-flow-row gap-1 p-2">
<Button
variant="borderless"
color="secondary"
className="w-full justify-start"
LinkComponent={NavLink}
href="/account"
onClick={handleClose}
>
Account Settings
</Button>
<Button
color="error"
variant="borderless"
className="w-full justify-start"
onClick={async () => {
handleClose();
await apolloClient.clearStore();
await signOut();
await router.push('/signin');
}}
>
Sign out
</Button>
</Box>
<Divider />
<Box className="py-4">
<Text className="text-center text-xs" color="disabled">
Dashboard Version: {publicRuntimeConfig?.version || 'n/a'}
</Text>
</Box>
</Box>
);
}
function AccountMenu() {
const user = useUserData();
return (
<Dropdown.Root>
<Dropdown.Trigger hideChevron className="rounded-full">
<Avatar
className="h-7 w-7 self-center rounded-full"
name={user?.displayName}
avatarUrl={user?.avatarUrl}
/>
</Dropdown.Trigger>
<Dropdown.Content PaperProps={{ className: 'mt-1 max-w-xs w-full' }}>
<AccountMenuContent />
</Dropdown.Content>
</Dropdown.Root>
);
}
export default AccountMenu;

View File

@@ -0,0 +1 @@
export { default as AccountMenu } from './AccountMenu';

View File

@@ -22,6 +22,13 @@ export function CountrySelector({ value, onChange }: CountrySelectorProps) {
value={value || null}
onChange={(_event, inputValue) => onChange(inputValue as string)}
placeholder="Select Country"
slotProps={{
listbox: { className: 'min-w-0 w-full' },
popper: {
disablePortal: false,
className: 'z-[10000] w-[270px] w-full',
},
}}
>
{countries?.map((country) => (
<Option key={country.name} value={country.code}>

View File

@@ -1,2 +0,0 @@
export * from './BaseColumnForm';
export { default } from './BaseColumnForm';

View File

@@ -1,2 +0,0 @@
export * from './BaseForeignKeyForm';
export { BaseForeignKeyForm as default } from './BaseForeignKeyForm';

View File

@@ -1,2 +0,0 @@
export * from './BaseRecordForm';
export { default } from './BaseRecordForm';

View File

@@ -1,2 +0,0 @@
export * from './BaseTableForm';
export { default } from './BaseTableForm';

View File

@@ -1,2 +0,0 @@
export * from './ColumnAutocomplete';
export { default } from './ColumnAutocomplete';

View File

@@ -1,2 +0,0 @@
export * from './CreateColumnForm';
export { default } from './CreateColumnForm';

View File

@@ -1,2 +0,0 @@
export * from './CreateForeignKeyForm';
export { default } from './CreateForeignKeyForm';

View File

@@ -1,2 +0,0 @@
export * from './CreateRecordForm';
export { default } from './CreateRecordForm';

View File

@@ -1,2 +0,0 @@
export * from './CreateTableForm';
export { default } from './CreateTableForm';

View File

@@ -1,2 +0,0 @@
export * from './DataBrowserEmptyState';
export { default } from './DataBrowserEmptyState';

View File

@@ -1,2 +0,0 @@
export * from './DataBrowserGrid';
export { default } from './DataBrowserGrid';

View File

@@ -1,2 +0,0 @@
export * from './DataBrowserGridControls';
export { default } from './DataBrowserGridControls';

View File

@@ -1,2 +0,0 @@
export * from './DataBrowserLayout';
export { default } from './DataBrowserLayout';

View File

@@ -1,2 +0,0 @@
export * from './DataBrowserSidebar';
export { default } from './DataBrowserSidebar';

View File

@@ -1,2 +0,0 @@
export * from './DatabaseRecordInputGroup';
export { default } from './DatabaseRecordInputGroup';

View File

@@ -1,2 +0,0 @@
export * from './EditColumnForm';
export { default } from './EditColumnForm';

View File

@@ -1,2 +0,0 @@
export * from './EditForeignKeyForm';
export { default } from './EditForeignKeyForm';

View File

@@ -1,2 +0,0 @@
export * from './EditPermissionsForm';
export { default } from './EditPermissionsForm';

View File

@@ -1,2 +0,0 @@
export * from './EditTableForm';
export { default } from './EditTableForm';

View File

@@ -1,2 +0,0 @@
export * from './RuleGroupEditor';
export { default } from './RuleGroupEditor';

View File

@@ -1,2 +1,5 @@
export * from './AppDeploymentDuration';
export { default } from './AppDeploymentDuration';
export {
default as AppDeploymentDuration,
default,
} from './AppDeploymentDuration';

View File

@@ -1,20 +1,24 @@
import NavLink from '@/components/common/NavLink';
import AppDeploymentDuration from '@/components/deployments/AppDeploymentDuration';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { NavLink } from '@/components/common/NavLink';
import { AppDeploymentDuration } from '@/components/deployments/AppDeploymentDuration';
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { Avatar } from '@/ui/Avatar';
import type { DeploymentStatus } from '@/ui/StatusCircle';
import { StatusCircle } from '@/ui/StatusCircle';
import Button from '@/ui/v2/Button';
import Chip from '@/ui/v2/Chip';
import { Button } from '@/ui/v2/Button';
import { Chip } from '@/ui/v2/Chip';
import { ArrowCounterclockwiseIcon } from '@/ui/v2/icons/ArrowCounterclockwiseIcon';
import { ChevronRightIcon } from '@/ui/v2/icons/ChevronRightIcon';
import { ListItem } from '@/ui/v2/ListItem';
import Tooltip from '@/ui/v2/Tooltip';
import ArrowCounterclockwiseIcon from '@/ui/v2/icons/ArrowCounterclockwiseIcon';
import ChevronRightIcon from '@/ui/v2/icons/ChevronRightIcon';
import type { DeploymentRowFragment } from '@/utils/__generated__/graphql';
import { useInsertDeploymentMutation } from '@/utils/__generated__/graphql';
import getServerError from '@/utils/settings/getServerError';
import { Tooltip } from '@/ui/v2/Tooltip';
import { getServerError } from '@/utils/settings/getServerError';
import { getToastStyleProps } from '@/utils/settings/settingsConstants';
import type { DeploymentRowFragment } from '@/utils/__generated__/graphql';
import {
GetAllWorkspacesAndProjectsDocument,
useInsertDeploymentMutation,
} from '@/utils/__generated__/graphql';
import { formatDistanceToNowStrict, parseISO } from 'date-fns';
import type { MouseEvent } from 'react';
import { toast } from 'react-hot-toast';
import { twMerge } from 'tailwind-merge';
@@ -52,9 +56,39 @@ export default function DeploymentListItem({
})
: '';
const [insertDeployment, { loading }] = useInsertDeploymentMutation();
const [insertDeployment, { loading }] = useInsertDeploymentMutation({
refetchQueries: [{ query: GetAllWorkspacesAndProjectsDocument }],
});
const { commitMessage } = deployment;
async function redeployDeployment(event: MouseEvent<HTMLButtonElement>) {
event.stopPropagation();
event.preventDefault();
const insertDeploymentPromise = insertDeployment({
variables: {
object: {
appId: currentProject?.id,
commitMessage: deployment.commitMessage,
commitSHA: deployment.commitSHA,
commitUserAvatarUrl: deployment.commitUserAvatarUrl,
commitUserName: deployment.commitUserName,
deploymentStatus: 'SCHEDULED',
},
},
});
await toast.promise(
insertDeploymentPromise,
{
loading: 'Scheduling deployment...',
success: 'Deployment has been scheduled successfully.',
error: getServerError('An error occurred when scheduling deployment.'),
},
getToastStyleProps(),
);
}
return (
<ListItem.Root>
<ListItem.Button
@@ -88,7 +122,7 @@ export default function DeploymentListItem({
{showRedeploy && (
<Tooltip
title={
!disableRedeploy && !loading
disableRedeploy || loading
? 'Deployments cannot be re-triggered when a deployment is in progress.'
: ''
}
@@ -100,35 +134,7 @@ export default function DeploymentListItem({
size="small"
color="secondary"
variant="outlined"
onClick={async (event) => {
event.stopPropagation();
event.preventDefault();
const insertDeploymentPromise = insertDeployment({
variables: {
object: {
appId: currentProject?.id,
commitMessage: deployment.commitMessage,
commitSHA: deployment.commitSHA,
commitUserAvatarUrl: deployment.commitUserAvatarUrl,
commitUserName: deployment.commitUserName,
deploymentStatus: 'SCHEDULED',
},
},
});
await toast.promise(
insertDeploymentPromise,
{
loading: 'Scheduling deployment...',
success: 'Deployment has been scheduled successfully.',
error: getServerError(
'An error occurred when scheduling deployment.',
),
},
getToastStyleProps(),
);
}}
onClick={redeployDeployment}
startIcon={
<ArrowCounterclockwiseIcon className={twMerge('h-4 w-4')} />
}

View File

@@ -1,2 +1,2 @@
export * from './DeploymentListItem';
export { default } from './DeploymentListItem';
export { default, default as DeploymentListItem } from './DeploymentListItem';

View File

@@ -1,5 +1,5 @@
import { render, screen } from '@/tests/testUtils';
import type { Deployment } from '@/types/application';
import { render, screen } from '@/utils/testUtils';
import { test, vi } from 'vitest';
import DeploymentStatusMessage from './DeploymentStatusMessage';

View File

@@ -1,2 +0,0 @@
export * from './FilesDataGrid';
export { default } from './FilesDataGrid';

View File

@@ -1,2 +0,0 @@
export * from './FilesDataGridControls';
export { default } from './FilesDataGridControls';

View File

@@ -1,16 +1,16 @@
import { useDialog } from '@/components/common/DialogProvider';
import Form from '@/components/common/Form';
import { Form } from '@/components/common/Form';
import type { DialogFormProps } from '@/types/common';
import Button from '@/ui/v2/Button';
import Input from '@/ui/v2/Input';
import { Button } from '@/ui/v2/Button';
import { Input } from '@/ui/v2/Input';
import { slugifyString } from '@/utils/helpers';
import { getServerError } from '@/utils/settings/getServerError';
import { getToastStyleProps } from '@/utils/settings/settingsConstants';
import {
GetAllWorkspacesAndProjectsDocument,
useInsertWorkspaceMutation,
useUpdateWorkspaceMutation,
} from '@/utils/__generated__/graphql';
import { slugifyString } from '@/utils/helpers';
import getServerError from '@/utils/settings/getServerError';
import { getToastStyleProps } from '@/utils/settings/settingsConstants';
import { yupResolver } from '@hookform/resolvers/yup';
import { useUserData } from '@nhost/nextjs';
import { useRouter } from 'next/router';

View File

@@ -1,16 +1,15 @@
import { useIsPlatform } from '@/features/projects/hooks/useIsPlatform';
import {
GetAllWorkspacesAndProjectsDocument,
GetWorkspaceMemberInvitesToManageDocument,
useGetWorkspaceMemberInvitesToManageQuery,
} from '@/generated/graphql';
import useIsPlatform from '@/hooks/common/useIsPlatform';
import { useSubmitState } from '@/hooks/useSubmitState';
import Box from '@/ui/v2/Box';
import Button from '@/ui/v2/Button';
import Text from '@/ui/v2/Text';
import { nhost } from '@/utils/nhost';
import { triggerToast } from '@/utils/toast';
import { updateOwnCache } from '@/utils/updateOwnCache';
import { useApolloClient } from '@apollo/client';
import { alpha } from '@mui/system';
import { useUserData } from '@nhost/nextjs';
@@ -28,13 +27,18 @@ export function InviteAnnounce() {
useSubmitState();
// @FIX: We probably don't want to poll every ten seconds for possible invites. (We can change later depending on how it works in production.) Maybe just on the workspace page?
const { data, loading, error, refetch, startPolling } =
useGetWorkspaceMemberInvitesToManageQuery({
variables: {
userId: user?.id,
},
skip: !isPlatform || !user,
});
const {
data,
loading,
error,
refetch: refetchInvitations,
startPolling,
} = useGetWorkspaceMemberInvitesToManageQuery({
variables: {
userId: user?.id,
},
skip: !isPlatform || !user,
});
useEffect(() => {
startPolling(15000);
@@ -79,9 +83,14 @@ export function InviteAnnounce() {
});
}
await updateOwnCache(client);
await client.refetchQueries({
include: [
GetAllWorkspacesAndProjectsDocument,
GetWorkspaceMemberInvitesToManageDocument,
],
});
await router.push(`/${invite.workspace.slug}`);
await refetch();
await refetchInvitations();
triggerToast('Workspace invite accepted');
return setSubmitState({
error: null,

View File

@@ -1,5 +1,5 @@
import { useCurrentWorkspaceAndProject } from '@/features/projects/hooks/useCurrentWorkspaceAndProject';
import { useInsertFeedbackOneMutation } from '@/generated/graphql';
import { useCurrentWorkspaceAndProject } from '@/hooks/v2/useCurrentWorkspaceAndProject';
import { Avatar } from '@/ui/Avatar';
import Button from '@/ui/v2/Button';
import Input from '@/ui/v2/Input';

View File

@@ -207,19 +207,6 @@ export default function WorkspaceAndProjectList({
</div>
))}
</Box>
<Text className="font-medium" color="secondary">
Looking for your old apps? They&apos;re still on{' '}
<Link
href="https://console.nhost.io"
target="_blank"
rel="noreferrer"
underline="always"
>
console.nhost.io
</Link>{' '}
during this beta.
</Text>
</Box>
);
}

View File

@@ -1,12 +1,12 @@
import Header from '@/components/common/Header';
import HighlightedText from '@/components/common/HighlightedText';
import RetryableErrorBoundary from '@/components/common/RetryableErrorBoundary';
import { HighlightedText } from '@/components/common/HighlightedText';
import { RetryableErrorBoundary } from '@/components/common/RetryableErrorBoundary';
import { InviteAnnounce } from '@/components/home/InviteAnnounce';
import type { BaseLayoutProps } from '@/components/layout/BaseLayout';
import BaseLayout from '@/components/layout/BaseLayout';
import Container from '@/components/layout/Container';
import useIsHealthy from '@/hooks/common/useIsHealthy';
import useIsPlatform from '@/hooks/common/useIsPlatform';
import { useIsHealthy } from '@/features/projects/hooks/useIsHealthy';
import { useIsPlatform } from '@/features/projects/hooks/useIsPlatform';
import ActivityIndicator from '@/ui/v2/ActivityIndicator';
import Link from '@/ui/v2/Link';
import Text from '@/ui/v2/Text';

View File

@@ -1,2 +1,2 @@
export * from './AuthenticatedLayout';
export { default } from './AuthenticatedLayout';
export { default as AuthenticatedLayout, default } from './AuthenticatedLayout';

View File

@@ -1,2 +1,2 @@
export * from './Container';
export { default } from './Container';
export { default as Container, default } from './Container';

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