@openneuro/app 4.29.8 → 4.30.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/.scss-lint.yml +11 -11
  2. package/maintenance.html +26 -20
  3. package/package.json +3 -3
  4. package/src/@types/custom.d.ts +6 -0
  5. package/src/index.html +14 -10
  6. package/src/scripts/datalad/routes/dataset-redirect.tsx +2 -0
  7. package/src/scripts/dataset/mutations/__tests__/update-permissions.spec.jsx +2 -1
  8. package/src/scripts/dataset/mutations/update-permissions.tsx +1 -9
  9. package/src/scripts/routes.tsx +17 -0
  10. package/src/scripts/users/__tests__/user-account-view.spec.tsx +152 -0
  11. package/src/scripts/users/__tests__/user-card.spec.tsx +110 -0
  12. package/src/scripts/users/__tests__/user-query.spec.tsx +65 -0
  13. package/src/scripts/users/__tests__/user-routes.spec.tsx +102 -0
  14. package/src/scripts/users/__tests__/user-tabs.spec.tsx +84 -0
  15. package/src/scripts/users/components/close-button.tsx +20 -0
  16. package/src/scripts/users/components/edit-button.tsx +20 -0
  17. package/src/scripts/users/components/edit-list.tsx +103 -0
  18. package/src/scripts/users/components/edit-string.tsx +90 -0
  19. package/src/scripts/users/components/editable-content.tsx +98 -0
  20. package/src/scripts/users/scss/editable-content.scss +15 -0
  21. package/src/scripts/users/scss/user-meta-blocks.scss +14 -0
  22. package/src/scripts/users/scss/useraccountview.module.scss +20 -0
  23. package/src/scripts/users/scss/usercard.module.scss +24 -0
  24. package/src/scripts/users/scss/usercontainer.module.scss +38 -0
  25. package/src/scripts/users/scss/usertabs.module.scss +63 -0
  26. package/src/scripts/users/user-account-view.tsx +142 -0
  27. package/src/scripts/users/user-card.tsx +86 -0
  28. package/src/scripts/users/user-container.tsx +49 -0
  29. package/src/scripts/users/user-datasets-view.tsx +53 -0
  30. package/src/scripts/users/user-notifications-view.tsx +11 -0
  31. package/src/scripts/users/user-query.tsx +76 -0
  32. package/src/scripts/users/user-routes.tsx +52 -0
  33. package/src/scripts/users/user-tabs.tsx +74 -0
  34. package/src/scripts/utils/__tests__/markdown.spec.tsx +1 -2
  35. package/src/scripts/utils/validationUtils.ts +8 -0
  36. package/src/scripts/validation/validation.tsx +11 -8
package/.scss-lint.yml CHANGED
@@ -1,15 +1,15 @@
1
- scss_files: 'src/sass/**/*.scss'
1
+ scss_files: "src/sass/**/*.scss"
2
2
 
3
3
  exclude:
4
- - 'src/sass/animate/**'
5
- - 'src/sass/bootstrap/**'
6
- - 'src/sass/font-awesome/**'
7
- - 'src/sass/fonts/**'
8
- - 'src/sass/_bootstrap-compass.scss'
9
- - 'src/sass/_bootstrap-mincer.scss'
10
- - 'src/sass/_bootstrap-sprockets.scss'
11
- - 'src/sass/_bootstrap.scss'
12
- - 'src/sass/react-select.scss'
4
+ - "src/sass/animate/**"
5
+ - "src/sass/bootstrap/**"
6
+ - "src/sass/font-awesome/**"
7
+ - "src/sass/fonts/**"
8
+ - "src/sass/_bootstrap-compass.scss"
9
+ - "src/sass/_bootstrap-mincer.scss"
10
+ - "src/sass/_bootstrap-sprockets.scss"
11
+ - "src/sass/_bootstrap.scss"
12
+ - "src/sass/react-select.scss"
13
13
 
14
14
  linters:
15
15
  BorderZero:
@@ -26,4 +26,4 @@ linters:
26
26
  enabled: false
27
27
 
28
28
  NestingDepth:
29
- enabled: false
29
+ enabled: false
package/maintenance.html CHANGED
@@ -1,23 +1,29 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
+ <head>
4
+ <base href="/" />
5
+ <meta http-equiv="expires" content="0" />
6
+ <meta charset="utf-8" />
7
+ <title>OpenNeuro - Maintenance</title>
8
+ <link id="favicon" rel="icon" type="image/png" href="/favicon.ico" />
9
+ <link
10
+ href="https://fonts.googleapis.com/css?family=Open+Sans:300,400,700,300italic,400italic,700italic|Cabin:400,400italic"
11
+ rel="stylesheet"
12
+ type="text/css"
13
+ />
14
+ </head>
3
15
 
4
- <head>
5
- <base href="/">
6
- </base>
7
- <meta http-equiv="expires" content="0" />
8
- <meta charset="utf-8" />
9
- <title>OpenNeuro - Maintenance</title>
10
- <link id="favicon" rel="icon" type="image/png" href="/favicon.ico" />
11
- <link href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,700,300italic,400italic,700italic|Cabin:400,400italic'
12
- rel='stylesheet' type='text/css' />
13
- </head>
14
-
15
- <body style="font-family: Cabin, sans-serif; color: #424242; display: flex; align-items: center; justify-content: center; flex-direction: column;">
16
- <img src="data:image/png;base64,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" />
17
- <div style="font-size: 75px;">Open<span style="color: #00505c;">Neuro</span></div>
18
- <h1 style="font-family: Open Sans, sans-serif; font-weight: 100;">
19
- OpenNeuro is undergoing maintenance and will return shortly.
20
- </h1>
21
- </body>
22
-
23
- </html>
16
+ <body
17
+ style="font-family: Cabin, sans-serif; color: #424242; display: flex; align-items: center; justify-content: center; flex-direction: column"
18
+ >
19
+ <img
20
+ src="data:image/png;base64,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"
21
+ />
22
+ <div style="font-size: 75px">
23
+ Open<span style="color: #00505c">Neuro</span>
24
+ </div>
25
+ <h1 style="font-family: Open Sans, sans-serif; font-weight: 100">
26
+ OpenNeuro is undergoing maintenance and will return shortly.
27
+ </h1>
28
+ </body>
29
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openneuro/app",
3
- "version": "4.29.8",
3
+ "version": "4.30.0-alpha.0",
4
4
  "description": "React JS web frontend for the OpenNeuro platform.",
5
5
  "license": "MIT",
6
6
  "main": "public/client.js",
@@ -20,7 +20,7 @@
20
20
  "@emotion/react": "11.11.1",
21
21
  "@emotion/styled": "11.11.0",
22
22
  "@niivue/niivue": "0.45.1",
23
- "@openneuro/components": "^4.29.8",
23
+ "@openneuro/components": "^4.30.0-alpha.0",
24
24
  "@sentry/react": "^8.25.0",
25
25
  "@tanstack/react-table": "^8.9.3",
26
26
  "buffer": "^6.0.3",
@@ -74,5 +74,5 @@
74
74
  "publishConfig": {
75
75
  "access": "public"
76
76
  },
77
- "gitHead": "1cf2284b38246032cf3eca1046e697301d7c78e1"
77
+ "gitHead": "e310c9093b9acc5ff079664407cd4f2da9522651"
78
78
  }
@@ -11,6 +11,12 @@ declare module "*.svg" {
11
11
  export = value
12
12
  }
13
13
 
14
+ // Allow custom scss modules
15
+ declare module "*.module.scss" {
16
+ const classes: { [key: string]: string }
17
+ export default classes
18
+ }
19
+
14
20
  // Allow .scss imports
15
21
  declare module "*.scss" {
16
22
  const value: string
package/src/index.html CHANGED
@@ -1,23 +1,27 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
-
4
- <head>
3
+ <head>
5
4
  <script src="/crn/config.js" type="module"></script>
6
5
  <script async src="https://www.googletagmanager.com/gtag/js"></script>
7
- <script src="https://kit.fontawesome.com/fa7ae96ba1.js" crossorigin="anonymous"></script>
6
+ <script
7
+ src="https://kit.fontawesome.com/fa7ae96ba1.js"
8
+ crossorigin="anonymous"
9
+ ></script>
8
10
  <meta http-equiv="expires" content="0" />
9
11
  <meta charset="utf-8" />
10
12
  <meta name="viewport" content="width=device-width, initial-scale=1" />
11
13
  <title>OpenNeuro</title>
12
14
  <link id="favicon" rel="icon" type="image/png" href="/favicon.ico" />
13
- <link rel="preconnect" href="https://fonts.googleapis.com">
14
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
15
- <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet">
16
- </head>
15
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
16
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
17
+ <link
18
+ href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap"
19
+ rel="stylesheet"
20
+ />
21
+ </head>
17
22
 
18
- <body>
23
+ <body>
19
24
  <div id="main"></div>
20
25
  <script src="/client.jsx" type="module"></script>
21
- </body>
22
-
26
+ </body>
23
27
  </html>
@@ -49,6 +49,8 @@ const redirectLib = {
49
49
  ds002222: "ds002250",
50
50
  ds002245: "ds002345",
51
51
  ds001988: "ds001996",
52
+ ds004215: "ds005752",
53
+ ds004935: "ds005754",
52
54
  }
53
55
 
54
56
  const datasetIdPattern = /ds\d{6}/gim
@@ -2,12 +2,13 @@ import React from "react"
2
2
  import { fireEvent, render, screen, waitFor } from "@testing-library/react"
3
3
  import { MockedProvider } from "@apollo/client/testing"
4
4
  import {
5
- isValidOrcid,
6
5
  UPDATE_ORCID_PERMISSIONS,
7
6
  UPDATE_PERMISSIONS,
8
7
  UpdateDatasetPermissions,
9
8
  } from "../update-permissions"
10
9
 
10
+ import { isValidOrcid } from "../../../utils/validationUtils.ts"
11
+
11
12
  function permissionMocksFactory(
12
13
  updatePermissionsCalled,
13
14
  updateOrcidPermissionsCalled,
@@ -7,15 +7,7 @@ import ToastContent from "../../common/partials/toast-content"
7
7
  import { validate as isValidEmail } from "email-validator"
8
8
  import { Button } from "@openneuro/components/button"
9
9
 
10
- export function isValidOrcid(orcid: string) {
11
- if (orcid) {
12
- return /^[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]$/.test(orcid)
13
- ? true
14
- : false
15
- } else {
16
- return false
17
- }
18
- }
10
+ import { isValidOrcid } from "../../utils/validationUtils"
19
11
 
20
12
  export const UPDATE_PERMISSIONS = gql`
21
13
  mutation updatePermissions(
@@ -17,6 +17,10 @@ import FourOFourPage from "./errors/404page"
17
17
  import { ImportDataset } from "./pages/import-dataset"
18
18
  import { DatasetMetadata } from "./pages/metadata/dataset-metadata"
19
19
  import { TermsPage } from "./pages/terms"
20
+ import { UserQuery } from "./users/user-query"
21
+ import LoggedIn from "../scripts/authentication/logged-in"
22
+ import LoggedOut from "../scripts/authentication/logged-out"
23
+ import FourOThreePage from "./errors/403page"
20
24
 
21
25
  const AppRoutes: React.VoidFunctionComponent = () => (
22
26
  <Routes>
@@ -33,6 +37,19 @@ const AppRoutes: React.VoidFunctionComponent = () => (
33
37
  <Route path="/import" element={<ImportDataset />} />
34
38
  <Route path="/metadata" element={<DatasetMetadata />} />
35
39
  <Route path="/public" element={<Navigate to="/search" replace />} />
40
+ <Route
41
+ path="/user/:orcid/*"
42
+ element={
43
+ <>
44
+ <LoggedIn>
45
+ <UserQuery />
46
+ </LoggedIn>
47
+ <LoggedOut>
48
+ <FourOThreePage />
49
+ </LoggedOut>
50
+ </>
51
+ }
52
+ />
36
53
  <Route
37
54
  path="/saved"
38
55
  element={<Navigate to="/search?bookmarks" replace />}
@@ -0,0 +1,152 @@
1
+ import React from "react"
2
+ import { MockedProvider } from "@apollo/client/testing"
3
+ import {
4
+ fireEvent,
5
+ render,
6
+ screen,
7
+ waitFor,
8
+ within,
9
+ } from "@testing-library/react"
10
+ import { UserAccountView } from "../user-account-view"
11
+ import { GET_USER_BY_ORCID, UPDATE_USER } from "../user-query"
12
+
13
+ const baseUser = {
14
+ id: "1",
15
+ name: "John Doe",
16
+ email: "johndoe@example.com",
17
+ orcid: "0000-0001-2345-6789",
18
+ location: "San Francisco, CA",
19
+ institution: "University of California",
20
+ links: ["https://example.com", "https://example.org"],
21
+ github: "johndoe",
22
+ }
23
+
24
+ const mocks = [
25
+ {
26
+ request: {
27
+ query: GET_USER_BY_ORCID,
28
+ variables: { userId: baseUser.id },
29
+ },
30
+ result: {
31
+ data: {
32
+ user: baseUser,
33
+ },
34
+ },
35
+ },
36
+ {
37
+ request: {
38
+ query: UPDATE_USER,
39
+ variables: {
40
+ id: baseUser.id,
41
+ location: "Marin, CA",
42
+ links: ["https://newlink.com"],
43
+ institution: "New University",
44
+ },
45
+ },
46
+ result: {
47
+ data: {
48
+ updateUser: {
49
+ id: baseUser.id,
50
+ location: "Marin, CA",
51
+ links: ["https://newlink.com"],
52
+ institution: "New University",
53
+ },
54
+ },
55
+ },
56
+ },
57
+ ]
58
+
59
+ describe("<UserAccountView />", () => {
60
+ it("should render the user details correctly", () => {
61
+ render(
62
+ <MockedProvider mocks={mocks} addTypename={false}>
63
+ <UserAccountView user={baseUser} />
64
+ </MockedProvider>,
65
+ )
66
+ expect(screen.getByText("Name:")).toBeInTheDocument()
67
+ expect(screen.getByText("John Doe")).toBeInTheDocument()
68
+ expect(screen.getByText("Email:")).toBeInTheDocument()
69
+ expect(screen.getByText("johndoe@example.com")).toBeInTheDocument()
70
+ expect(screen.getByText("ORCID:")).toBeInTheDocument()
71
+ expect(screen.getByText("0000-0001-2345-6789")).toBeInTheDocument()
72
+ expect(screen.getByText("GitHub:")).toBeInTheDocument()
73
+ expect(screen.getByText("johndoe")).toBeInTheDocument()
74
+ })
75
+
76
+ it("should render location with EditableContent", async () => {
77
+ render(
78
+ <MockedProvider mocks={mocks} addTypename={false}>
79
+ <UserAccountView user={baseUser} />
80
+ </MockedProvider>,
81
+ )
82
+ const locationSection = within(screen.getByTestId("location-section"))
83
+ expect(screen.getByText("Location")).toBeInTheDocument()
84
+ const editButton = locationSection.getByText("Edit")
85
+ fireEvent.click(editButton)
86
+ const textbox = locationSection.getByRole("textbox")
87
+ fireEvent.change(textbox, { target: { value: "Marin, CA" } })
88
+ const saveButton = locationSection.getByText("Save")
89
+ fireEvent.click(saveButton)
90
+ await waitFor(() => {
91
+ expect(locationSection.getByText("Marin, CA")).toBeInTheDocument()
92
+ })
93
+ })
94
+
95
+ it("should render institution with EditableContent", async () => {
96
+ render(
97
+ <MockedProvider mocks={mocks} addTypename={false}>
98
+ <UserAccountView user={baseUser} />
99
+ </MockedProvider>,
100
+ )
101
+ const institutionSection = within(screen.getByTestId("institution-section"))
102
+ expect(screen.getByText("Institution")).toBeInTheDocument()
103
+ const editButton = institutionSection.getByText("Edit")
104
+ fireEvent.click(editButton)
105
+ const textbox = institutionSection.getByRole("textbox")
106
+ fireEvent.change(textbox, { target: { value: "New University" } })
107
+ const saveButton = institutionSection.getByText("Save")
108
+ fireEvent.click(saveButton)
109
+ await waitFor(() => {
110
+ expect(institutionSection.getByText("New University")).toBeInTheDocument()
111
+ })
112
+ })
113
+
114
+ it("should render links with EditableContent and validation", async () => {
115
+ render(
116
+ <MockedProvider mocks={mocks} addTypename={false}>
117
+ <UserAccountView user={baseUser} />
118
+ </MockedProvider>,
119
+ )
120
+ const linksSection = within(screen.getByTestId("links-section"))
121
+ expect(screen.getByText("Links")).toBeInTheDocument()
122
+ const editButton = linksSection.getByText("Edit")
123
+ fireEvent.click(editButton)
124
+ const textbox = linksSection.getByRole("textbox")
125
+ fireEvent.change(textbox, { target: { value: "https://newlink.com" } })
126
+ const saveButton = linksSection.getByText("Add")
127
+ fireEvent.click(saveButton)
128
+ await waitFor(() => {
129
+ expect(linksSection.getByText("https://newlink.com")).toBeInTheDocument()
130
+ })
131
+ })
132
+
133
+ it("should show an error message when invalid URL is entered in links section", async () => {
134
+ render(
135
+ <MockedProvider mocks={mocks} addTypename={false}>
136
+ <UserAccountView user={baseUser} />
137
+ </MockedProvider>,
138
+ )
139
+ const linksSection = within(screen.getByTestId("links-section"))
140
+ const editButton = linksSection.getByText("Edit")
141
+ fireEvent.click(editButton)
142
+ const textbox = linksSection.getByRole("textbox")
143
+ fireEvent.change(textbox, { target: { value: "invalid-url" } })
144
+ const saveButton = linksSection.getByText("Add")
145
+ fireEvent.click(saveButton)
146
+ await waitFor(() => {
147
+ expect(
148
+ linksSection.getByText("Invalid URL format. Please use a valid link."),
149
+ ).toBeInTheDocument()
150
+ })
151
+ })
152
+ })
@@ -0,0 +1,110 @@
1
+ import React from "react"
2
+ import { render, screen } from "@testing-library/react"
3
+ import type { User } from "../user-card"
4
+ import { UserCard } from "../user-card"
5
+
6
+ describe("UserCard Component", () => {
7
+ const baseUser: User = {
8
+ name: "John Doe",
9
+ email: "johndoe@example.com",
10
+ orcid: "0000-0001-2345-6789",
11
+ location: "San Francisco, CA",
12
+ institution: "University of California",
13
+ links: ["https://example.com", "https://example.org"],
14
+ github: "johndoe",
15
+ }
16
+
17
+ it("renders all user details when all data is provided", () => {
18
+ render(<UserCard user={baseUser} />)
19
+
20
+ const orcidLink = screen.getByRole("link", {
21
+ name: "ORCID profile of John Doe",
22
+ })
23
+ expect(orcidLink).toHaveAttribute(
24
+ "href",
25
+ "https://orcid.org/0000-0001-2345-6789",
26
+ )
27
+ expect(screen.getByText("University of California")).toBeInTheDocument()
28
+ expect(screen.getByText("San Francisco, CA")).toBeInTheDocument()
29
+
30
+ const emailLink = screen.getByRole("link", { name: "johndoe@example.com" })
31
+ expect(emailLink).toHaveAttribute("href", "mailto:johndoe@example.com")
32
+
33
+ const githubLink = screen.getByRole("link", {
34
+ name: "Github profile of John Doe",
35
+ })
36
+ expect(githubLink).toHaveAttribute("href", "https://github.com/johndoe")
37
+ expect(
38
+ screen.getByRole("link", { name: "https://example.com" }),
39
+ ).toHaveAttribute("href", "https://example.com")
40
+ expect(
41
+ screen.getByRole("link", { name: "https://example.org" }),
42
+ ).toHaveAttribute("href", "https://example.org")
43
+ })
44
+
45
+ it("renders without optional fields", () => {
46
+ const minimalUser: User = {
47
+ name: "Jane Doe",
48
+ email: "janedoe@example.com",
49
+ orcid: "0000-0002-3456-7890",
50
+ links: [],
51
+ }
52
+
53
+ render(<UserCard user={minimalUser} />)
54
+
55
+ const orcidLink = screen.getByRole("link", {
56
+ name: "ORCID profile of Jane Doe",
57
+ })
58
+ expect(orcidLink).toHaveAttribute(
59
+ "href",
60
+ "https://orcid.org/0000-0002-3456-7890",
61
+ )
62
+ const emailLink = screen.getByRole("link", { name: "janedoe@example.com" })
63
+ expect(emailLink).toHaveAttribute("href", "mailto:janedoe@example.com")
64
+ expect(screen.queryByText("University of California")).not
65
+ .toBeInTheDocument()
66
+ expect(screen.queryByText("San Francisco, CA")).not.toBeInTheDocument()
67
+ expect(screen.queryByRole("link", { name: "Github profile of Jane Doe" }))
68
+ .not.toBeInTheDocument()
69
+ })
70
+
71
+ it("renders correctly when links are empty", () => {
72
+ const userWithEmptyLinks: User = {
73
+ ...baseUser,
74
+ links: [],
75
+ }
76
+
77
+ render(<UserCard user={userWithEmptyLinks} />)
78
+
79
+ expect(screen.queryByRole("link", { name: "https://example.com" })).not
80
+ .toBeInTheDocument()
81
+ expect(screen.queryByRole("link", { name: "https://example.org" })).not
82
+ .toBeInTheDocument()
83
+ })
84
+
85
+ it("renders correctly when location and institution are missing", () => {
86
+ const userWithoutLocationAndInstitution: User = {
87
+ name: "Emily Doe",
88
+ email: "emilydoe@example.com",
89
+ orcid: "0000-0003-4567-8901",
90
+ links: ["https://example.com"],
91
+ }
92
+
93
+ render(<UserCard user={userWithoutLocationAndInstitution} />)
94
+
95
+ const orcidLink = screen.getByRole("link", {
96
+ name: "ORCID profile of Emily Doe",
97
+ })
98
+ expect(orcidLink).toHaveAttribute(
99
+ "href",
100
+ "https://orcid.org/0000-0003-4567-8901",
101
+ )
102
+ const emailLink = screen.getByRole("link", { name: "emilydoe@example.com" })
103
+ expect(emailLink).toHaveAttribute("href", "mailto:emilydoe@example.com")
104
+ const link = screen.getByRole("link", { name: "https://example.com" })
105
+ expect(link).toHaveAttribute("href", "https://example.com")
106
+ expect(screen.queryByText("San Francisco, CA")).not.toBeInTheDocument()
107
+ expect(screen.queryByText("University of California")).not
108
+ .toBeInTheDocument()
109
+ })
110
+ })