@openneuro/app 4.36.2 → 4.37.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 (74) hide show
  1. package/package.json +5 -3
  2. package/src/scripts/components/accordion/accordion.scss +1 -1
  3. package/src/scripts/components/activity-slider/ActivitySlider.tsx +4 -22
  4. package/src/scripts/components/activity-slider/slider.scss +1 -82
  5. package/src/scripts/components/button/button.scss +1 -1
  6. package/src/scripts/components/count-toggle/count-toggle.scss +1 -1
  7. package/src/scripts/components/dropdown/dropdown.scss +1 -1
  8. package/src/scripts/components/facets/facet.scss +5 -4
  9. package/src/scripts/components/footer/footer.scss +1 -1
  10. package/src/scripts/components/front-page/front-page.scss +1 -1
  11. package/src/scripts/components/header/header.scss +1 -1
  12. package/src/scripts/components/input/input.scss +1 -1
  13. package/src/scripts/components/input/term-search.scss +1 -1
  14. package/src/scripts/components/loading/loading.scss +1 -1
  15. package/src/scripts/components/modal/modal.scss +1 -1
  16. package/src/scripts/components/modality-cube/ModalityHexagon.tsx +29 -0
  17. package/src/scripts/components/modality-cube/modality-cube.scss +1 -1
  18. package/src/scripts/components/modality-cube/modality-hexagon.scss +93 -0
  19. package/src/scripts/components/page/page.scss +1 -1
  20. package/src/scripts/components/progress-bar/progress-bar.scss +1 -1
  21. package/src/scripts/components/radio/radio.scss +2 -2
  22. package/src/scripts/components/range/TwoHandleRange.scss +3 -3
  23. package/src/scripts/components/read-more/read-more.scss +1 -1
  24. package/src/scripts/components/scss/upload-modal.scss +1 -1
  25. package/src/scripts/components/tooltip/tooltip.scss +1 -1
  26. package/src/scripts/dataset/__tests__/__snapshots__/snapshot-container.spec.tsx.snap +132 -128
  27. package/src/scripts/dataset/__tests__/draft-container.spec.tsx +136 -0
  28. package/src/scripts/dataset/common/follow-toggles.tsx +1 -1
  29. package/src/scripts/dataset/components/DatasetHeader.tsx +13 -16
  30. package/src/scripts/dataset/components/DatasetToolButton.tsx +6 -7
  31. package/src/scripts/dataset/components/DatasetTools.tsx +6 -2
  32. package/src/scripts/dataset/draft-container.tsx +30 -24
  33. package/src/scripts/dataset/files/{file-display.jsx → file-display.tsx} +32 -19
  34. package/src/scripts/dataset/routes/tab-routes-draft.tsx +6 -1
  35. package/src/scripts/dataset/routes/tab-routes-snapshot.tsx +5 -1
  36. package/src/scripts/dataset/snapshot-container.tsx +37 -43
  37. package/src/scripts/scss/dataset/dataset-page.scss +44 -120
  38. package/src/scripts/scss/variables.scss +65 -13
  39. package/src/scripts/{components/search-page → search}/__tests__/NuerobagelSearch.spec.tsx +1 -1
  40. package/src/scripts/search/components/DatasetsRadioTabs.tsx +103 -0
  41. package/src/scripts/{components/search-page → search/components}/FilterListItem.tsx +1 -1
  42. package/src/scripts/{components/search-page → search/components}/FiltersBlock.tsx +5 -8
  43. package/src/scripts/search/components/MetaListItemList.tsx +31 -0
  44. package/src/scripts/{components/search-page → search/components}/SearchPage.tsx +15 -8
  45. package/src/scripts/search/components/SearchResultDetails.tsx +167 -0
  46. package/src/scripts/{components/search-page → search/components}/SearchResultItem.tsx +57 -173
  47. package/src/scripts/search/components/SearchResultsList.tsx +45 -0
  48. package/src/scripts/{components/search-page → search/components}/SearchSort.tsx +2 -2
  49. package/src/scripts/search/filters-block-container.tsx +1 -1
  50. package/src/scripts/search/inputs/index.ts +0 -4
  51. package/src/scripts/search/inputs/sliding-radio-group.tsx +127 -0
  52. package/src/scripts/search/inputs/sort-by-select.tsx +1 -1
  53. package/src/scripts/{components/search-page → search/scss}/filters-block.scss +1 -1
  54. package/src/scripts/{components/search-page → search/scss}/search-page.scss +123 -92
  55. package/src/scripts/search/scss/search-result-details.scss +70 -0
  56. package/src/scripts/{components/search-page → search/scss}/search-result.scss +29 -56
  57. package/src/scripts/{components/search-page → search/scss}/search-sort.scss +1 -1
  58. package/src/scripts/search/scss/sliding-radio-group.scss +115 -0
  59. package/src/scripts/search/search-container.tsx +90 -24
  60. package/src/scripts/search/use-search-results.tsx +3 -0
  61. package/src/scripts/users/github-auth-button.tsx +1 -1
  62. package/src/scripts/components/scss/_variables.scss +0 -245
  63. package/src/scripts/components/search-page/SearchResultsList.tsx +0 -29
  64. package/src/scripts/dataset/files/index.tsx +0 -6
  65. package/src/scripts/search/inputs/admin-allDatasets-toggle.tsx +0 -47
  66. package/src/scripts/search/inputs/show-datasets-radios.tsx +0 -74
  67. /package/src/scripts/{components/search-page → search/components}/CommunityHeader.tsx +0 -0
  68. /package/src/scripts/{components/search-page → search/components}/FacetBlockContainerExample.tsx +0 -0
  69. /package/src/scripts/{components/search-page → search/components}/FilterDateItem.tsx +0 -0
  70. /package/src/scripts/{components/search-page → search/components}/ModalityHeader.tsx +0 -0
  71. /package/src/scripts/{components/search-page → search/components}/NeurobagelSearch.tsx +0 -0
  72. /package/src/scripts/{components/search-page → search/components}/SearchSortContainerExample.tsx +0 -0
  73. /package/src/scripts/{components/search-page → search/components}/TermListItem.tsx +0 -0
  74. /package/src/scripts/{components/search-page → search/components}/neurobagel_logo.svg +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openneuro/app",
3
- "version": "4.36.2",
3
+ "version": "4.37.0-alpha.0",
4
4
  "description": "React JS web frontend for the OpenNeuro platform.",
5
5
  "license": "MIT",
6
6
  "main": "public/client.js",
@@ -16,7 +16,7 @@
16
16
  "dependencies": {
17
17
  "@apollo/client": "3.13.8",
18
18
  "@artsy/fresnel": "^1.3.1",
19
- "@bids/validator": "npm:@jsr/bids__validator@^2.0.3",
19
+ "@bids/validator": "npm:@jsr/bids__validator@^2.0.7",
20
20
  "@emotion/react": "11.11.1",
21
21
  "@emotion/styled": "11.11.0",
22
22
  "@niivue/niivue": "0.57.0",
@@ -51,8 +51,10 @@
51
51
  "universal-cookie": "^4.0.4"
52
52
  },
53
53
  "devDependencies": {
54
+ "@testing-library/dom": "^10.4.0",
54
55
  "@testing-library/jest-dom": "6.4.2",
55
56
  "@testing-library/react": "^14.2.1",
57
+ "@testing-library/user-event": "^14.6.1",
56
58
  "@types/dompurify": "^3",
57
59
  "@types/jsdom": "^16",
58
60
  "@types/node": "20.12.7",
@@ -75,5 +77,5 @@
75
77
  "publishConfig": {
76
78
  "access": "public"
77
79
  },
78
- "gitHead": "b5acb4d59334f72298be62066e4064d59c8e10bc"
80
+ "gitHead": "01cd2b234a23c76a234dfb2c2839857041da777b"
79
81
  }
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  /* Accordion styles */
3
3
 
4
4
  .on-accordion-wrapper {
@@ -6,6 +6,7 @@ import Carousel from "react-multi-carousel/lib/Carousel"
6
6
  import type { ArrowProps, ResponsiveType } from "react-multi-carousel/lib/types"
7
7
  import "react-multi-carousel/lib/styles.css"
8
8
  import "./slider.scss"
9
+ import { ModalityHexagon } from "../../components/modality-cube/ModalityHexagon"
9
10
 
10
11
  export interface ActivitySliderProps {
11
12
  className?: string
@@ -62,28 +63,9 @@ export const ActivitySlider = ({
62
63
  {data.map(({ node }) => (
63
64
  <div className="activity-slider-node" key={node.id}>
64
65
  <div className="ds-modality">
65
- <div className="hexagon-wrapper">
66
- {node.latestSnapshot.summary?.primaryModality
67
- ? (
68
- <>
69
- <div
70
- className={"hexagon " +
71
- node.latestSnapshot.summary?.primaryModality
72
- .toLowerCase()}
73
- >
74
- </div>
75
- <div className="label">
76
- {node.latestSnapshot.summary?.primaryModality}
77
- </div>
78
- </>
79
- )
80
- : (
81
- <>
82
- <div className="hexagon no-modality"></div>
83
- <div className="label">N/A</div>
84
- </>
85
- )}
86
- </div>
66
+ <ModalityHexagon
67
+ primaryModality={node.latestSnapshot.summary?.primaryModality}
68
+ />
87
69
  </div>
88
70
  <div className="ds-name">
89
71
  <h4>
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  .activity-slider {
4
4
  h3 {
@@ -32,87 +32,6 @@
32
32
  margin: 10px 0 0;
33
33
  }
34
34
  }
35
- .activity-slider-node {
36
- .hexagon-wrapper {
37
- text-align: center;
38
- margin: 20px auto 0;
39
- position: relative;
40
- display: inline-block;
41
- width: 45px;
42
- height: 45px;
43
- div.label {
44
- position: absolute;
45
- top: 0;
46
- text-align: center;
47
- width: 100%;
48
- left: 0;
49
- right: 0;
50
- bottom: 0;
51
- display: flex;
52
- justify-content: center;
53
- align-items: center;
54
- color: #fff;
55
- font-weight: 600;
56
- font-size: 13px;
57
- }
58
- }
59
-
60
- .hexagon {
61
- height: 100%;
62
- width: calc(100% * 0.57735);
63
- display: inline-block;
64
- }
65
-
66
- .hexagon:before {
67
- position: absolute;
68
- top: 0;
69
- right: calc((100% / 2) - ((100% * 0.57735) / 2));
70
- background-color: inherit;
71
- height: inherit;
72
- width: inherit;
73
- content: '';
74
- transform: rotateZ(60deg);
75
- }
76
-
77
- .hexagon:after {
78
- position: absolute;
79
- top: 0;
80
- right: calc((100% / 2) - ((100% * 0.57735) / 2));
81
- background-color: inherit;
82
- height: inherit;
83
- width: inherit;
84
- content: '';
85
- transform: rotateZ(-60deg);
86
- }
87
- .hexagon {
88
- transition: background-color 0.3s;
89
- background-color: $on-dark-aqua;
90
-
91
- &.mri {
92
- background-color: $mri-theme;
93
- }
94
- &.eeg {
95
- background-color: $eeg-theme;
96
- }
97
-
98
- &.pet {
99
- background-color: $pet-theme;
100
- }
101
- &.ieeg {
102
- background-color: $ieeg-theme;
103
- }
104
-
105
- &.meg {
106
- background-color: $meg-theme;
107
- }
108
- &.eeg {
109
- background-color: $on-light-green;
110
- }
111
- &.nirs{
112
- background-color: $nirs-theme;
113
- }
114
- }
115
- }
116
35
  }
117
36
  .react-multi-carousel-dot--active button {
118
37
  background-color: var(--current-theme-primary);
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  .on-button {
4
4
  font-family: $font-sans;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  .toggle-btn {
4
4
  border: 1px solid #aaa;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  .dropdown-wrapper {
4
4
  display: inline-block;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  .facet-accordion.on-accordion-wrapper {
4
4
  padding: 0 15px;
@@ -45,7 +45,7 @@
45
45
  .level-1 > li {
46
46
  border-top: 1px solid #dfdfdf;
47
47
  > span:hover {
48
- background-color: var(--current-theme-primary-light);
48
+ background-color: var(--current-theme-primary-ultralight);
49
49
  }
50
50
 
51
51
  > .label {
@@ -60,7 +60,7 @@
60
60
  display: flex;
61
61
  justify-content: flex-start;
62
62
  &:hover {
63
- background-color: var(--current-theme-primary-light);
63
+ background-color: var(--current-theme-primary-ultralight);
64
64
  }
65
65
 
66
66
  .label {
@@ -165,7 +165,8 @@
165
165
  .search-nav .facet-open.modality-facet {
166
166
  margin: 20px 0;
167
167
  border: 0;
168
- background: #e5f4f7;
168
+ background: var(--current-theme-primary-ultralight);
169
+ border: 1px solid var(--current-theme-primary-light);
169
170
  border-radius: $border-radius-default;
170
171
  padding: 10px;
171
172
 
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  footer {
4
4
  background: $charcoal;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  body {
4
4
  font-family: $font-sans;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  header {
3
3
  position: relative;
4
4
  }
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  form,
4
4
  fieldset {
@@ -1,4 +1,4 @@
1
- @import "../scss/variables";
1
+ @import "../../scss/variables";
2
2
 
3
3
  .term-input {
4
4
  display: flex;
@@ -18,7 +18,7 @@ $spinner-hexagon-bg-color: var(--current-theme-primary);
18
18
  width: $spinner-width;
19
19
  height: $spinner-height;
20
20
  border-radius: 0;
21
- background: var(--current-theme-primary-light);
21
+ background: var(--current-theme-primary-ultralight);
22
22
  opacity: 1;
23
23
  top: $spinner-base-value;
24
24
  }
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  .modal-wrapper {
4
4
  position: fixed;
@@ -0,0 +1,29 @@
1
+ import React from "react"
2
+ import type { FC } from "react"
3
+ import { modalityShortMapping } from "../../components/formatting/modality-label"
4
+ import "./modality-hexagon.scss"
5
+ interface ModalityHexagonProps {
6
+ primaryModality: string | null | undefined
7
+ }
8
+
9
+ //ModalityHexagon component displays a colored hexagon and label
10
+ // based on the provided primaryModality.
11
+
12
+ export const ModalityHexagon: FC<ModalityHexagonProps> = ({
13
+ primaryModality,
14
+ }) => {
15
+ const hexagonClass = primaryModality
16
+ ? primaryModality.toLowerCase()
17
+ : "no-modality"
18
+
19
+ const labelText = primaryModality
20
+ ? modalityShortMapping(primaryModality)
21
+ : <i className="fa fa-circle-o-notch fa-spin"></i>
22
+
23
+ return (
24
+ <div className="hexagon-wrapper">
25
+ <div className={`hexagon ${hexagonClass}`}></div>
26
+ <div className="label">{labelText}</div>
27
+ </div>
28
+ )
29
+ }
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  // Variables for hexagonal grid and cube sizes
3
3
  $hex-width: 240px;
4
4
  $hex-height: 450px; // Height for the hex grid
@@ -0,0 +1,93 @@
1
+ @import '../../scss/variables';
2
+
3
+ .hexagon-wrapper {
4
+ text-align: center;
5
+ position: relative;
6
+ display: inline-block;
7
+ width: 45px;
8
+ height: 45px;
9
+
10
+ div.label {
11
+ position: absolute;
12
+ top: 0;
13
+ text-align: center;
14
+ width: 100%;
15
+ left: 0;
16
+ right: 0;
17
+ bottom: 0;
18
+ display: flex;
19
+ justify-content: center;
20
+ align-items: center;
21
+ font-weight: 600;
22
+ font-size: 13px;
23
+ color: #fff; // Default label color
24
+ }
25
+
26
+ .hexagon {
27
+ height: 100%;
28
+ width: calc(100% * 0.57735);
29
+ display: inline-block;
30
+ transition: background-color 0.3s;
31
+ background-color: $on-dark-aqua; // Default hexagon background
32
+
33
+ &:before,
34
+ &:after {
35
+ position: absolute;
36
+ top: 0;
37
+ right: calc((100% / 2) - ((100% * 0.57735) / 2));
38
+ background-color: inherit;
39
+ height: inherit;
40
+ width: inherit;
41
+ content: '';
42
+ }
43
+
44
+ &:before {
45
+ transform: rotateZ(60deg);
46
+ }
47
+
48
+ &:after {
49
+ transform: rotateZ(-60deg);
50
+ }
51
+
52
+ &.mri { background-color: $mri-theme; }
53
+ &.eeg { background-color: $on-light-green; } // EEG uses on-light-green
54
+ &.pet { background-color: $pet-theme; }
55
+ &.ieeg { background-color: $ieeg-theme; }
56
+ &.meg { background-color: $meg-theme; }
57
+ &.nirs { background-color: $nirs-theme; }
58
+ }
59
+ }
60
+
61
+ a {
62
+ .hexagon-wrapper {
63
+ margin: 20px auto;
64
+
65
+ div.label {
66
+ color: unset;
67
+ }
68
+
69
+ .hexagon {
70
+ transition: color 0.3s;
71
+ background-color: #fff;
72
+
73
+ // Modality specific colors (when inside 'a')
74
+ &.mri { background-color: #fff; color: $mri-theme; }
75
+ &.eeg { background-color: #fff; color: $eeg-theme; }
76
+ &.pet { background-color: #fff; color: $pet-theme; }
77
+ &.ieeg { background-color: #fff; color: $ieeg-theme; }
78
+ &.meg { background-color: #fff; color: $meg-theme; }
79
+ &.nirs { background-color: #fff; color: $nirs-theme; }
80
+ }
81
+
82
+ &:hover {
83
+ .hexagon {
84
+ color: lighten($on-dark-aqua, 15%);
85
+ &.mri { color: lighten($mri-theme, 10%); }
86
+ &.eeg { color: lighten($eeg-theme, 10%); }
87
+ &.pet { color: lighten($pet-theme, 10%); }
88
+ &.ieeg { color: lighten($ieeg-theme, 10%); }
89
+ &.meg { color: lighten($meg-theme, 10%); }
90
+ }
91
+ }
92
+ }
93
+ }
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  @import '../scss//normalize';
3
3
  @import '../scss//helper-classes';
4
4
  @import '../scss//flex-grid';
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  // Outer container
3
3
  .progress {
4
4
  overflow: hidden;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  .custom-radio {
3
3
  margin: 10px 0 20px;
4
4
  [type='radio']:checked,
@@ -319,7 +319,7 @@
319
319
  }
320
320
  }
321
321
  [type='radio']:not(:checked) + label:hover {
322
- background-color: var(--current-theme-primary-light);
322
+ background-color: var(--current-theme-primary-ultralight);
323
323
  }
324
324
  [type='radio']:checked + label {
325
325
  color: #fff;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  $rangeWidth: 90%;
3
3
 
4
4
  .formRange-inner {
@@ -82,7 +82,7 @@ $rangeWidth: 90%;
82
82
  /* For Chrome browsers */
83
83
  .thumb::-webkit-slider-thumb {
84
84
  background-color: #fff;
85
- border: 1px solid var(--current-theme-primary-light);
85
+ border: 1px solid var(--current-theme-primary-ultralight);
86
86
  border-radius: 50%;
87
87
  box-shadow: 0 0 5px -1px var(--current-theme-primary);
88
88
  cursor: pointer;
@@ -96,7 +96,7 @@ $rangeWidth: 90%;
96
96
  /* For Firefox browsers */
97
97
  .thumb::-moz-range-thumb {
98
98
  background-color: #fff;
99
- border: 1px solid var(--current-theme-primary-light);
99
+ border: 1px solid var(--current-theme-primary-ultralight);
100
100
  border-radius: 50%;
101
101
  box-shadow: 0 0 5px -1px var(--current-theme-primary);
102
102
  cursor: pointer;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
  .has-read-more {
3
3
  position: relative;
4
4
 
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  .upload-modal.modal-wrapper {
4
4
  // display: block;
@@ -1,4 +1,4 @@
1
- @import '../scss/variables';
1
+ @import '../../scss/variables';
2
2
 
3
3
  /* START TOOLTIP STYLES */
4
4
  [data-tooltip] {