#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

#65 💇 Feat: Header Buttons & CSS Refinements - #247

Merged
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements
Jun 11, 2025
Merged

#65 💇 Feat: Header Buttons & CSS Refinements#247
demariadaniel merged 23 commits into
iobiofrom
65/feat-header-refinements

Conversation

@demariadaniel

@demariadanieldemariadaniel commented Jun 4, 2025

Copy link
Copy Markdown

#65 Visualizer & File Table Buttons & CSS updates

Summary

Adds Visualizer & File Table Header navigation buttons with related CSS adjustments to match latest mockups

Issues

Description of Changes

  • Updates Icons, Colors, Typography & page layout for File Table / Visualizer navigation buttons
  • Positions Count Display at bottom of Table

Readiness Checklist

  • Self Review
    • I have performed a self review of code
    • I have run the application locally and manually tested the feature
    • I have checked all updates to correct typos and misspellings
  • Formatting
    • Code follows the project style guide
    • Autmated code formatters (ie. Prettier) have been run
  • Local Testing
    • Successfully built all packages locally
    • Successfully ran all test suites, all unit and integration tests pass
  • Updated Tests
    • Unit and integration tests have been added that describe the bug that was fixed or the features that were added
  • Documentation
    • All new environment variables added to .env.schema file and documented in the README
    • All changes to server HTTP endpoints have open-api documentation
    • All new functions exported from their module have TSDoc comment documentation

@demariadanieldemariadaniel self-assigned this Jun 4, 2025
fontColor: 'inherit',
// Table CountDisplay is hidden in order to position CountDisplay with Pagination
fontSize: '0px',
},

@demariadanieldemariadanielJun 4, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There may be a better way to solve this; this is basically moving CountDisplay out of the table and into Pagination using CSS

I do not believe Pagination has a customElements or children Prop

And CountDisplay theming only allows font related properties, so setting fontSize to 0 hides it in the Table, and CountDisplay is added to the RepoTable render beside Pagination, using position: absolute to render it next to the pagination elements

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds like a candidate use case to provide a custom element or child prop to Pagination?

@justincorrigiblejustincorrigibleJun 6, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ToolBar component is one provided as is for convenience, but a custom toolbar can be built with the individual components seen here. no need to "hack" elements out of screen.

a good example of that custom toolbar implementation can be found in your work upgrading HCMI, iirc

@demariadanieldemariadanielJun 9, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ironically the custom Toolbar implementation was blocked b/c we could not use arranger@latest:
see components/search/Search L394
https://github.com/nci-hcmi-catalog/portal/pull/1108/files#diff-9169b023a738875edfa40a7bbfd0504daf901e19afa442610f37b96052cbfd20R394

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Toolbar is updated to use individual components in the same container as the navigation Button

color: ${theme.colors.black};
left: 170px;
position: absolute;
top: 3px;

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is also some fine-tuned CSS positioning that's worth reviewing

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this to anchor a child element with flex: 1 to a parent element?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is to 'collapse' the CountDisplay container so it appears inline with the Pagination elements

From:
Screenshot 2025-06-06 at 3 56 35 PM

To:
Screenshot 2025-06-06 at 3 56 42 PM

top value is playing the role of centering the CountDisplay text with the Pagination text
The way you could leverage vertical-align: middle etc if the elements were grouped together

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't they be all "grouped together by wrapping them in a flex-ed div though?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I fixed the header up so elements are grouped and we no longer rely on position:absolute, it ends up being a nice refactor & separates logic a bit more
I will do the same for the Footer tomorrow

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Footer is updated to use separate MaxRows / CountDisplay / PageSelector components

@demariadanieldemariadaniel changed the title WIP: 💇 65/feat header refinements#65 💇 Feat: Header Buttons & CSS RefinementsJun 4, 2025
@demariadaniel
demariadaniel marked this pull request as ready for review June 4, 2025 20:05

@joneubankjoneubank left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All of this seems fine to me, would prefer you get someone else to go through the styling and layout concerns before merging.

switchTable={switchTable}
theme={theme}
/>
{isFileTableActive ? null : <FullScreenButton isFullScreen={false} setFullScreen={() => {}} theme={theme} />}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the purpose of a FullScreenButton with no setFullScreen handler?

@demariadanieldemariadanielJun 6, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh there is no purpose? It provides a sense of aesthetic to the page??
This was set up but left unfinished, was focused on style & page elements
I added a working setFullScreen handler today

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

icons/barGraph and icons/fullScreen both exports are named FullScreen
doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

@ciaranschutteciaranschutte left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's best to use a hook for theming.
the useTheme hook can be used in components as they're all under the theme provider component, this means you can remove them as args to a lot of functions and components.

Makes sense as well so we don't pass in something like white to a function which doesn't make sense to me when I read the function.

${getToggleButtonStyles({ active: isDemoData, accent, white })}

In the case of a function, this may mean you use a hook within a hook, which also works because they're built to be composable

} from '@overture-stack/iobio-components/packages/iobio-react-components/';

import { getToggleButtonStyles } from './tableUtils';
const getActiveButtonStyles = (active: boolean, theme: Theme) => {

@ciaranschutteciaranschutteJun 5, 2025

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be object params, as most of our functions use object params and it's a good default because we don't blindly pass in things that don't work

Suggested change
constgetActiveButtonStyles=(active: boolean,theme: Theme)=>{
constgetActiveButtonStyles=({active: boolean,theme: Theme})=>{

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, did a nice cleanup refactor of getButtonStyles/useTheme etc based on these comments

Comment threadcomponents/pages/explorer/HeaderButtons.tsx Outdated
Comment threadcomponents/pages/explorer/BamTable/index.tsx Outdated
@demariadaniel

Copy link
Copy Markdown
Author

icons/barGraph and icons/fullScreen both exports are named FullScreen doesn't error because it's a default export/import so can be named FunkyCocoLand with no breakage.

Naming is so hard, FunkyCocoLand is a much better suggestion :p
Updated BarGraph default export

@ciaranschutte
ciaranschutte self-requested a review June 11, 2025 21:18
@demariadaniel
demariadaniel merged commit 6b66627 into iobioJun 11, 2025
@demariadaniel
demariadaniel deleted the 65/feat-header-refinements branch June 11, 2025 21:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@demariadaniel@ciaranschutte@justincorrigible@joneubank