Skip to content

Runtime Version Scanner: Dynamically load EOL versions; improve documentation #246

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 27 commits into from
Jul 17, 2025

Conversation

toph-allen
Copy link
Collaborator

@toph-allen toph-allen commented Jul 14, 2025

  • Loads R and Python EOL versions dynamically (with tests to confirm the parsing works)
    • These fall back to locally-defined versions if something fails in the loading/parsing.
  • Displays app help in a popover from a tooltip on the app's title. Wordsmithing feedback welcomed.
  • Adds an update-manifest command to help with updating the manifest. It doesn't allow you to add new files, that's still a bit fiddly, but it does the most common most fiddly things quite well.
  • Loads content data asynchronously to speed up the app becoming responsive.
  • Uses the content name if it has no title, and labels it "[Untitled]" if it has neither, matching the Connect UI.

Play with this version (Posit-private links)

Fixes #245
Fixes #241

"version. The content list will show content running an older version than ",
"the one selected in the corresponding dropdown menu in the sidebar. ",
"The menus include options to show content running Python outside of the ",
"official support window, and R outside of the tidyverse support window."
Copy link
Contributor

Choose a reason for hiding this comment

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

The filter selector says "EOL" not "support window", so we should use "end of life (EOL)" somewhere in here. (Saying "support window" too is fine if you want, maybe that's helpful in explaining what EOL is, up to you.)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I agree — I used "EOL" in the sidebar because it works much better width-wise in a dropdown alongside entries that say "< 3.4.1" etc. Connecting those things together here makes sense.

@@ -256,6 +315,10 @@ server <- function(input, output, session) {
)
})

observeEvent(input$show_runtime_help, {
showModal(runtime_help_modal())
Copy link
Contributor

Choose a reason for hiding this comment

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

I'm not sure how exactly you control this, but I loaded one of the versions of this you deployed, and while the table was loading data (the spinner thing was going), I figured I'd check out the modal. But when I clicked, nothing happened. So I kept clicking. When the table finally rendered, the modal opened--actually, one for every click!

There's probably a way to make it not be blocked by the table loading, but IDK what that would be.

Copy link
Collaborator Author

@toph-allen toph-allen Jul 15, 2025

Choose a reason for hiding this comment

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

Yeah, I noticed the same behavior. I'll see if there's a way to finesse that at all. Loading the usage data is async; perhaps I need to make all the loading async.

Of course, async here means actually using plan(multisession) — do you think that's a bad thing to do on Connect? It seems to work fine.

Copy link
Contributor

Choose a reason for hiding this comment

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

No idea. Would be good to know (and share!)

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I've given it a try! I'll post about it tomorrow more broadly.

@toph-allen
Copy link
Collaborator Author

toph-allen commented Jul 16, 2025

@nealrichardson I've addressed your feedback here. I'm having some issues migrating to mirai, so if it's easy for you to re-review this now, I can make that switch in a follow-on PR.

Better that than holding this PR open and increasing scope :)

[edit] David helped me find an easy way to do it.

@cgraham-rs
Copy link
Contributor

Uses the content name if it has no title, and labels it "[Untitled]" if it has neither, matching the Connect UI.

That's good to know, I wasn't aware of the [Untitled] default and we should be trying to maintain consistency when possible.

I figured I'd check out the modal. But when I clicked, nothing happened. So I kept clicking. When the table finally rendered, the modal opened--actually, one for every click!

This still seems to be a problem but I don't think it's particularly important.

Other comments from exploratory testing, none require any action in this PR, or possibly at all.

  • The UI and table are very clean, professional, usable, and understandable. Great job.
  • I observed the table is using Title as opposed to Name as seen in the Posit Connect Content list. Should we follow the Content list UX for consistency?
  • Owner column data gets truncated at narrow screen widths, but the other columns wrap. This is not critical, just an observation.
  • It was not intuitive how to remove selected Content Types as the UX is different than the Posit Connect UI but I eventually figured out you just your keyboard delete/backspace buttons. This is not critical and could be a minor future improvement if it the selected types had a little x in their top corner.
  • The Owner column appears to display the username of the owner as opposed to the owner's name as seen in the Posit Connect Content list table. It's not clear to me if all systems would have usable usernames or not? Should we follow the Content list UX for consistency? This is not critical and could be a minor future change.
  • Download Filtered Data does not maintain the sort order in place at the time you click that button. This is not critical and it is easy enough to sort the CSV data in other tools.
  • Download Filtered Data is enabled even when there are 0 items in the table. I wouldn't even bother changing this.
  • In the summary above the table sometimes a period appears at the end of a version string which looks a little odd Showing 0 items using Quarto version < 1.4.557. or Showing 0 items using Python version < 3.9.0. It may only occur if there's 0 items available.
  • Bug: Spot checking some of the content data in the RSV table and it does not seem to be correct. See this example where pins-tutorial but the GUID and link are for a completely different piece of content. This requires further analysis but it seems like it's probably an issue with the first record in the table leaking into the filtered table views as e28f587b-7317-47ab-97c5-c77bda50daee is the first GUID in the default table view and that GUID and link remains the first item in the table after filtering. At least that's what appears to be happening.
image image

@toph-allen
Copy link
Collaborator Author

toph-allen commented Jul 17, 2025

That's good to know, I wasn't aware of the [Untitled] default and we should be trying to maintain consistency when possible.

Technically the Connect UI calls it Untitled lol. So, not actually being consistent. Should I just use Untitled?

I figured I'd check out the modal. But when I clicked, nothing happened. So I kept clicking. When the table finally rendered, the modal opened--actually, one for every click!

This still seems to be a problem but I don't think it's particularly important.

This also happened to me. Loading the content table asynchronously makes the modal trigger active much sooner, but it still queues up clicks until various parts of the reactive graph have completed rendering. I don't think I can change this behavior without delving deeper into Shiny stuff or doing more restructuring — or at all?

Other comments from exploratory testing, none require any action in this PR, or possibly at all.

  • The UI and table are very clean, professional, usable, and understandable. Great job.
  • I observed the table is using Title as opposed to Name as seen in the Posit Connect Content list. Should we follow the Content list UX for consistency?

Are you talking about the data fields displayed, or the way they're described? The Connect list uses title but falls back to name if no title is given — at least, that's what I think happens. Maybe I'm misunderstanding what you're saying.

  • Owner column data gets truncated at narrow screen widths, but the other columns wrap. This is not critical, just an observation.

I can't get any columns to wrap at narrow widths except GUID. Most of the columns are intended to truncate. I made GUID wrap because I figure, if you've enabled that column, maybe you want to copy the GUID, so it should all be visible.

  • It was not intuitive how to remove selected Content Types as the UX is different than the Posit Connect UI but I eventually figured out you just your keyboard delete/backspace buttons. This is not critical and could be a minor future improvement if it the selected types had a little x in their top corner.

This was pretty easy to enable in selectizeInput — it's done. :)

  • The Owner column appears to display the username of the owner as opposed to the owner's name as seen in the Posit Connect Content list table. It's not clear to me if all systems would have usable usernames or not? Should we follow the Content list UX for consistency? This is not critical and could be a minor future change.

Yeah, I'll just make it use the name instead of the username. Agreed about consistency! Easy change.

  • Download Filtered Data does not maintain the sort order in place at the time you click that button. This is not critical and it is easy enough to sort the CSV data in other tools.

Yeah, the download button downloads the data before it's sent to the reactable, so it would not be trivial to maintain the sort order. I figure that the filtering is more important than the sorting, but it would be nice to maintain.

  • Download Filtered Data is enabled even when there are 0 items in the table. I wouldn't even bother changing this.

This was a pretty easy fix!

  • In the summary above the table sometimes a period appears at the end of a version string which looks a little odd Showing 0 items using Quarto version < 1.4.557. or Showing 0 items using Python version < 3.9.0. It may only occur if there's 0 items available.

This is intentional 😅 — it occurs when only one filter is enabled, because the text that appears is a complete sentence. I agree it looks a tiny bit odd, but I didn't think it was that bad. No periods at the end of bullets because they're fragments, not complete sentences.

  • Bug: Spot checking some of the content data in the RSV table and it does not seem to be correct. See this example where pins-tutorial but the GUID and link are for a completely different piece of content. This requires further analysis but it seems like it's probably an issue with the first record in the table leaking into the filtered table views as e28f587b-7317-47ab-97c5-c77bda50daee is the first GUID in the default table view and that GUID and link remains the first item in the table after filtering. At least that's what appears to be happening.

Gonna look into this. Thanks. This shouldn't be the case — I'm using pretty standard dplyr filtering. 🤔 [Edit] Replicated, awesome catch!!

Copy link
Contributor

@cgraham-rs cgraham-rs left a comment

Choose a reason for hiding this comment

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

I've done my best looking at the actual code, which looks good to me, and is laid out so it is fairly easy to follow and is understandable. Note I did find one bug that should be fixed which I left in a separate comment.

@cgraham-rs
Copy link
Contributor

That's good to know, I wasn't aware of the [Untitled] default and we should be trying to maintain consistency when possible.

Technically the Connect UI calls it Untitled lol. So, not actually being consistent. Should I just use Untitled?

My suggestion is to mirror the Posit Connect UI behavior, naming, language, etc as closely as possible. It should help make things as intuitive as possible.

I figured I'd check out the modal. But when I clicked, nothing happened. So I kept clicking. When the table finally rendered, the modal opened--actually, one for every click!

This still seems to be a problem but I don't think it's particularly important.

This also happened to me. Loading the content table asynchronously makes the modal trigger active much sooner, but it still queues up clicks until various parts of the reactive graph have completed rendering. I don't think I can change this behavior without delving deeper into Shiny stuff or doing more restructuring — or at all?

It is not important IMO, ignore it.

Other comments from exploratory testing, none require any action in this PR, or possibly at all.

  • The UI and table are very clean, professional, usable, and understandable. Great job.
  • I observed the table is using Title as opposed to Name as seen in the Posit Connect Content list. Should we follow the Content list UX for consistency?

Are you talking about the data fields displayed, or the way they're described? The Connect list uses title but falls back to name if no title is given — at least, that's what I think happens. Maybe I'm misunderstanding what you're saying.

I am referring to the header text. Connect uses Name. I believe the actual RVS column data matches what we see in the Connect content list UI.

  • Owner column data gets truncated at narrow screen widths, but the other columns wrap. This is not critical, just an observation.

I can't get any columns to wrap at narrow widths except GUID. Most of the columns are intended to truncate. I made GUID wrap because I figure, if you've enabled that column, maybe you want to copy the GUID, so it should all be visible.

  • It was not intuitive how to remove selected Content Types as the UX is different than the Posit Connect UI but I eventually figured out you just your keyboard delete/backspace buttons. This is not critical and could be a minor future improvement if it the selected types had a little x in their top corner.

This was pretty easy to enable in selectizeInput — it's done. :)

Nice!

  • The Owner column appears to display the username of the owner as opposed to the owner's name as seen in the Posit Connect Content list table. It's not clear to me if all systems would have usable usernames or not? Should we follow the Content list UX for consistency? This is not critical and could be a minor future change.

Yeah, I'll just make it use the name instead of the username. Agreed about consistency! Easy change.

👍

  • Download Filtered Data does not maintain the sort order in place at the time you click that button. This is not critical and it is easy enough to sort the CSV data in other tools.

Yeah, the download button downloads the data before it's sent to the reactable, so it would not be trivial to maintain the sort order. I figure that the filtering is more important than the sorting, but it would be nice to maintain.

  • Download Filtered Data is enabled even when there are 0 items in the table. I wouldn't even bother changing this.

This was a pretty easy fix!

  • In the summary above the table sometimes a period appears at the end of a version string which looks a little odd Showing 0 items using Quarto version < 1.4.557. or Showing 0 items using Python version < 3.9.0. It may only occur if there's 0 items available.

This is intentional 😅 — it occurs when only one filter is enabled, because the text that appears is a complete sentence. I agree it looks a tiny bit odd, but I didn't think it was that bad. No periods at the end of bullets because they're fragments, not complete sentences.

  • Bug: Spot checking some of the content data in the RSV table and it does not seem to be correct. See this example where pins-tutorial but the GUID and link are for a completely different piece of content. This requires further analysis but it seems like it's probably an issue with the first record in the table leaking into the filtered table views as e28f587b-7317-47ab-97c5-c77bda50daee is the first GUID in the default table view and that GUID and link remains the first item in the table after filtering. At least that's what appears to be happening.

Gonna look into this. Thanks. This shouldn't be the case — I'm using pretty standard dplyr filtering. 🤔 [Edit] Replicated, awesome catch!!

Glad we caught it. 😄

@toph-allen toph-allen requested a review from cgraham-rs July 17, 2025 19:43
@toph-allen
Copy link
Collaborator Author

Worked around the reactable issue (glin/reactable#109) and that bug should be fixed.

Copy link
Contributor

@cgraham-rs cgraham-rs left a comment

Choose a reason for hiding this comment

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

Worked around the reactable issue (glin/reactable#109) and that bug should be fixed.

Looks like that is fixed. 👍

@toph-allen toph-allen merged commit b63912d into main Jul 17, 2025
18 checks passed
@toph-allen toph-allen deleted the toph/rvs-documentation branch July 17, 2025 20:15
Sign up for free to 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.

Runtime Version Scanner: Load official EOL versions from an API Runtime Version Scanner: Move application docs to a popover
3 participants