Skip to content
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

Change scroll top button to component #2170

Merged
merged 43 commits into from
Mar 17, 2023

Conversation

yucheng11122017
Copy link
Contributor

@yucheng11122017 yucheng11122017 commented Feb 15, 2023

What is the purpose of this pull request?

  • Documentation update
  • Bug fix
  • Feature addition or enhancement
  • Code maintenance
  • DevOps
  • Improve developer experience
  • Others, please explain:

Fixes #2081

Overview of changes:
Change scroll to top button to be a Vue component. This is to be inserted into layout file.
This allow users to

  • Not use it if they want
  • Change the icon
  • Change the icon size and color
  • Change the position

Anything you'd like to highlight/discuss:

Testing instructions:
Insert <scroll-top-button></scroll-top-button> to layout file.

Proposed commit message: (wrap lines at 72 characters)
Change scroll top button to component

It is currently added to all pages, cannot be disabled, and does not support styling or positioning.

This limits the usability and customization for users.

Changing the scroll top button to a component allows users to not include it in their layout if they want and allows them to style it by passing attributes to it.

Let's make

  • scroll top button no longer compulsory and to be added to layout file if users want it
  • scroll top button added to default file when project is initialized
  • support different icons for button
  • support positioning for scroll top button
  • support customized icon size and color

Checklist: ☑️

  • Updated the documentation for feature additions and enhancements
  • Added tests for bug fixes or features
  • Linked all related issues
  • No unrelated changes

Breaking change descriptions:
Scroll to Top button is changed to a component to allow for more flexibility in its usage. This includes allowing users to

  • Not use it if they want
  • Change the icon
  • Change the icon size and color
  • Change the position

It is no longer automatically added to pages on the website. To add the Scroll to Top Button to a website, add the component to the layout page

In layout page

...
<scroll-top-button />
...

This button is still added to the default layout when users initialise a Markbind project.

Copy link
Contributor

@jovyntls jovyntls left a comment

Choose a reason for hiding this comment

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

Thank you for the work @yucheng11122017 ! This is a nice component to have 🎉 The fading in/out is a nice touch!

I'm not sure if I missed it (from all of the changes in the test files oops) - are there tests for this new component?

packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
docs/userGuide/syntax/scrollTopButton.md Outdated Show resolved Hide resolved
packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
@yucheng11122017
Copy link
Contributor Author

Thank you for the work @yucheng11122017 ! This is a nice component to have 🎉 The fading in/out is a nice touch!

I'm not sure if I missed it (from all of the changes in the test files oops) - are there tests for this new component?

Hi @jovyntls, thank you for your comments! I have updated them accordingly. I also added test cases for the component.
One thing I am struggling with is testing that the button appears after the user scrolls. I think the problem is that there is a set timeout which only updates the button after 0.1s so the display in the button doesn't update immediately. I was wondering if you would have any advice on how to tackle this problem? :)

@jovyntls
Copy link
Contributor

Hi @jovyntls, thank you for your comments! I have updated them accordingly. I also added test cases for the component. One thing I am struggling with is testing that the button appears after the user scrolls. I think the problem is that there is a set timeout which only updates the button after 0.1s so the display in the button doesn't update immediately. I was wondering if you would have any advice on how to tackle this problem? :)

Thanks for looking out for that test case! Hmm might be tricky, will does combining these work?:

Copy link
Contributor

@jovyntls jovyntls left a comment

Choose a reason for hiding this comment

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

Thanks for the tests @yucheng11122017 ! Just a few more nits

docs/userGuide/syntax/scrollTopButton.md Outdated Show resolved Hide resolved
packages/vue-components/src/ScrollTopButton.vue Outdated Show resolved Hide resolved
docs/userGuide/syntax/scrollTopButton.md Outdated Show resolved Hide resolved
package-lock.json Outdated Show resolved Hide resolved
Copy link
Contributor

@tlylt tlylt left a comment

Choose a reason for hiding this comment

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

May I confirm if this means the scroll-top button is no longer a default (i.e. included when someone does markbind init?)

@yucheng11122017
Copy link
Contributor Author

@tlylt I added the scroll top button to the default layout in packages/core/template/default/_markbind/layouts/default.md so when markbind init is called, it will still be included.

@tlylt
Copy link
Contributor

tlylt commented Mar 12, 2023

@tlylt I added the scroll top button to the default layout in packages/core/template/default/_markbind/layouts/default.md so when markbind init is called, it will still be included.

Can we include a line explaining how this can optionally be removed in the docs?

Also, this is indeed breaking change as mentioned in the original issue, will pause the merge until we want to move on to v5

@tlylt tlylt modified the milestones: v4.2.0, v5.0.0 Mar 12, 2023
@tlylt
Copy link
Contributor

tlylt commented Mar 12, 2023

Can we also include all details in the proposed commit message? Will need these in the release draft for this major change.

@tlylt tlylt added the s.OnHold label Mar 12, 2023
@jovyntls jovyntls added the breakingChange 💥 Feature will behave significantly different, or is made obsolete label Mar 12, 2023
@tlylt tlylt removed the s.OnHold label Mar 16, 2023
@tlylt
Copy link
Contributor

tlylt commented Mar 16, 2023

Hi @yucheng11122017, thank you for the work on this. I think we are ready to merge this soon if you could help resolve the conflicts.

@tlylt
Copy link
Contributor

tlylt commented Mar 16, 2023

https://se-education.org/guides/conventions/git.html

@yucheng11122017 can you kindly help to adjust the commit message format according to the guide, please? Main reason why I think the format is superior is not just for the sake of consistency, but also because it highlights the rationale behind a change, which is crucial context for future devs.

…mponentifyBackToTopButton

# Conflicts:
#	packages/cli/test/functional/test_site/expected/bugs/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/nested_sub_site/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/nested_sub_site/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAnchorGeneration.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAnnotate.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAntiFOUCStyles.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testCenterText.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testCodeBlocks.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testDates.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testEmptyFrontmatter.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testExternalScripts.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testHr.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testImages.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludeBoilerplate.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludeMultipleModals.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludePluginsRendered.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLayouts.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLayoutsOverride.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLinks.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testMath.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testModals.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNav.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavPrint.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavTarget.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavWithOnlyTitle.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavWithoutTitleAndNavHeadings.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanelMarkdownParsing.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanels.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanelsClosingTransition.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPlantUML.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPopoverTrigger.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPopovers.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testThumbnails.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testTooltipSpacing.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testTree.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testVariableContainsInclude.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/test_md_fragment.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic1.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic2.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic3a.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic3b.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/index.page-vue-render.js
@tlylt
Copy link
Contributor

tlylt commented Mar 17, 2023

Tips on how to fix the conflicts:

  • ensure the fork is latest
  • ensure local master is in sync with fork master
  • checkout to pr branch
  • git merge master
  • accept any (just choose one) changes to conflicts in generated test files, doesn't really matter as we will override them
  • once the merge is done, npm run updatetest to generate latest test files

…mponentifyBackToTopButton

# Conflicts:
#	packages/cli/test/functional/test_site/expected/bugs/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/nested_sub_site/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/nested_sub_site/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAnchorGeneration.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAnnotate.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAntiFOUCStyles.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testCenterText.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testCodeBlocks.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testDates.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testEmptyFrontmatter.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testExternalScripts.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testHr.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testImages.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludeBoilerplate.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludeMultipleModals.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludePluginsRendered.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLayouts.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLayoutsOverride.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLinks.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testMath.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testModals.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNav.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavPrint.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavTarget.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavWithOnlyTitle.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavWithoutTitleAndNavHeadings.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanelMarkdownParsing.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanels.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanelsClosingTransition.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPlantUML.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPopoverTrigger.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPopovers.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testThumbnails.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testTooltipSpacing.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testTree.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testVariableContainsInclude.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/test_md_fragment.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic1.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic2.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic3a.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic3b.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/index.page-vue-render.js
…mponentifyBackToTopButton

# Conflicts:
#	packages/cli/test/functional/test_site/expected/bugs/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/nested_sub_site/index.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/nested_sub_site/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/sub_site/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAnchorGeneration.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAnnotate.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testAntiFOUCStyles.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testCenterText.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testCodeBlocks.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testDates.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testEmptyFrontmatter.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testExternalScripts.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testHr.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testImages.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludeBoilerplate.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludeMultipleModals.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testIncludePluginsRendered.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLayouts.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLayoutsOverride.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testLinks.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testMath.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testModals.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testNunjucksPathResolving.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNav.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavPrint.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavTarget.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavWithOnlyTitle.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPageNavWithoutTitleAndNavHeadings.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanelMarkdownParsing.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanels.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPanelsClosingTransition.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPlantUML.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPopoverTrigger.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testPopovers.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testThumbnails.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testTooltipSpacing.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testTree.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/testVariableContainsInclude.page-vue-render.js
#	packages/cli/test/functional/test_site/expected/test_md_fragment.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic1.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic2.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic3a.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/contents/topic3b.page-vue-render.js
#	packages/cli/test/functional/test_site_templates/test_default/expected/index.page-vue-render.js
@yucheng11122017
Copy link
Contributor Author

Thank you for the advice @tlylt! I managed to solve the merge conflicts

@tlylt tlylt merged commit 2cebe9e into MarkBind:master Mar 17, 2023
ong6 pushed a commit to ong6/markbind that referenced this pull request Mar 23, 2023
Change scroll top button to component

It is currently added to all pages, cannot be disabled, and does not support styling or positioning.

This limits the usability and customization for users.

Changing the scroll top button to a component allows users to not include it in their layout if they want and allows them to style it by passing attributes to it.

Let's make

- scroll top button no longer compulsory and to be added to layout file if users want it
- scroll top button added to default file when project is initialized
- support different icons for button
- support positioning for scroll top button
- support customized icon size and color
@yucheng11122017
Copy link
Contributor Author

Tips on how to fix the conflicts:

  • ensure the fork is latest
  • ensure local master is in sync with fork master
  • checkout to pr branch
  • git merge master
  • accept any (just choose one) changes to conflicts in generated test files, doesn't really matter as we will override them
  • once the merge is done, npm run updatetest to generate latest test files

Hi @tlylt, I was thinking about adding these instructions about solving merge conflicts to the DG which talks about updating functional test. Might be helpful for other devs!

@tlylt
Copy link
Contributor

tlylt commented Apr 2, 2023

Tips on how to fix the conflicts:

  • ensure the fork is latest
  • ensure local master is in sync with fork master
  • checkout to pr branch
  • git merge master
  • accept any (just choose one) changes to conflicts in generated test files, doesn't really matter as we will override them
  • once the merge is done, npm run updatetest to generate latest test files

Hi @tlylt, I was thinking about adding these instructions about solving merge conflicts to the DG which talks about updating functional test. Might be helpful for other devs!

Sounds good 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
breakingChange 💥 Feature will behave significantly different, or is made obsolete
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Component-ify the back-to-top button
3 participants