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

Adds UUI-Text-Copy #985

Open
wants to merge 24 commits into
base: v1/contrib
Choose a base branch
from

Conversation

warrenbuckley
Copy link
Contributor

@warrenbuckley warrenbuckley commented Dec 23, 2024

Description

Adds a button to trigger copying content to the clipboard, by two approaches:

  • Setting the value property on uui-copy to contain the text content you want to copy to the clipboard
  • Setting the copy-from property will look for HTML element with that ID and use the text content
    • If the selected element has a value property then assume we want to get the value of an input field such as uui-input
    • By setting copy-from it overrides any value set in the value property

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Chore (minor updates related to the tooling or maintenance of the repository, does not impact compiled assets)

Motivation and context

How to test?

I believe the stories should cover some scenarios

Screenshots (if appropriate)

Checklist

  • If my change requires a change to the documentation, I have updated the documentation in this pull request.
  • I have read the CONTRIBUTING document.
  • I have added tests to cover my changes.

Copy link

Hi there @warrenbuckley, thank you for this contribution! 👍

While we wait for the team to have a look at your work, we wanted to let you know about that we have a checklist for some of the things we will consider during review:

  • It's clear what problem this is solving, there's a connected issue or a description of what the changes do and how to test them
  • The automated tests all pass (see "Checks" tab on this PR)
  • The level of security for this contribution is the same or improved
  • The level of performance for this contribution is the same or improved
  • Avoids creating breaking changes; note that behavioral changes might also be perceived as breaking
  • If this is a new feature, Umbraco HQ provided guidance on the implementation beforehand
  • 💡 The contribution looks original and the contributor is presumably allowed to share it

Don't worry if you got something wrong. We like to think of a pull request as the start of a conversation, we're happy to provide guidance on improving your contribution.

If you realize that you might want to make some changes then you can do that by adding new commits to the branch you created for this work and pushing new commits. They should then automatically show up as updates to this pull request.

Thanks, from your friendly Umbraco GitHub bot 🤖 🙂

@warrenbuckley
Copy link
Contributor Author

I am open for discussion and feedback to improve this
/cc @iOvergaard & @nielslyngsoe

@warrenbuckley warrenbuckley marked this pull request as ready for review December 23, 2024 23:30
@warrenbuckley
Copy link
Contributor Author

I may need some pointers or advice with the tests please @nielslyngsoe or @iOvergaard

Copy link
Contributor

@iOvergaard iOvergaard left a comment

Choose a reason for hiding this comment

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

Looks good, but I am not sure how to fix the tests. It says the browser asked for permission to copy but the user denied it, so we probably need Playwright to launch the browser with a special parameter to allow non-user interaction...?

Important to me is that we can use this inside the <umb-code-block> element in the Backoffice. Did you try and test it there yet?

packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
await navigator.clipboard
.writeText(this.#valueToCopy)
.then(() => {
button.state = 'success';
Copy link
Contributor

Choose a reason for hiding this comment

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

In the <umb-code-block> element in the Backoffice, where we also have a copy button, we introduced a delay of 2000 ms before setting the button state. The value is copied immediately, but this provides better feedback to the user seeing that the animation happens slower. I think Shoelace also allows to set this duration through a property...?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I have set it to 2 seconds but not sure if it looks odd/weird to me @iOvergaard

Recording.2025-01-07.143504.mp4

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Changed it to 250ms as the default as per your suggestion via Slack and also set it as a property so it can be changed/overriden.

packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
@warrenbuckley
Copy link
Contributor Author

Important to me is that we can use this inside the element in the Backoffice. Did you try and test it there yet?

I wouldn't know how to do that @iOvergaard as its over in the CMS repo, is there something I can do to try/test this out then?

@iOvergaard
Copy link
Contributor

Important to me is that we can use this inside the element in the Backoffice. Did you try and test it there yet?

I wouldn't know how to do that @iOvergaard as its over in the CMS repo, is there something I can do to try/test this out then?

You can run npm link in the uui-copy folder, then go over to your Backoffice installation and run npm link @umbraco-ui/uui-copy there, and it should then be available. You may need to run npm run build first in the uui-copy folder.

… before this would work properly as it had not registered the webcoponents that it depends upon
@warrenbuckley
Copy link
Contributor Author

It would also be good to allow a custom icon, so perhaps we could introduce an icon property.

I am not sure this is explicitly needed in my opinion @iOvergaard as the default slot can be swapped out, as shown in examples and screenshot of a story.

<uui-input id="inputToCopy" placeholder="Type something">
  <uui-copy copy-from="inputToCopy" slot="append" compact>
    <uui-icon name="copy"></uui-icon>
  </uui-copy>
</uui-input>

Or

<uui-copy value="Custom slot content">Custom Copy Text</uui-copy>
<uui-copy value="Different Icon"><uui-icon name=""></uui-icon> COPY ME</uui-copy>

image

@warrenbuckley
Copy link
Contributor Author

Ready for a re-review and see what you think @iOvergaard

Copy link
Contributor

@iOvergaard iOvergaard left a comment

Choose a reason for hiding this comment

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

Functionally, this is exactly what we want to have. I have included some suggestions based on feedback from the team at HQ to optimize the package and the component even further. Please let me know if you would like to take it to the finish line or if we should take over.

* @slot - Use to replace the default content of 'Copy' and the copy icon
*/
@defineElement('uui-copy')
export class UUICopyElement extends LabelMixin('', LitElement) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Good that you extend the LabelMixin now, @warrenbuckley. I mentioned it to @nielslyngsoe and he was asking why we don't just extend the UUIButtonElement itself as we only ever have a <uui-button></uui-button> in the rendered output. If you extend from UUIButtonElement, you can remove many of the properties from uui-copy as they would already be present there.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

My question to you both @iOvergaard & @nielslyngsoe is that as this is not a typical Form Control and inherting/extending from UUIButton which in turn extends with the mixin UUIFormControlMixin which in turn already has a value field.

So can you let me still if you want me to extend from UUIButton, as it seems extra bloat to me to participate as a native form control when it will never be used as part of a form submission.

packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
packages/uui-copy/lib/uui-copy.element.ts Outdated Show resolved Hide resolved
@iOvergaard iOvergaard added feature Something we are looking to build community/pr labels Jan 9, 2025
Copy link
Contributor

@iOvergaard iOvergaard left a comment

Choose a reason for hiding this comment

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

I would say this looks fine and I accept your premise that it is indeed not a form control, thus it doesn't make sense to extend uui-button.

I have suggested a few quick fixes here, but what remains to be tested is to use it inside the backoffice in the code snippet or sysinfo element. I will try to see to that later on.

packages/uui-text-copy/lib/uui-text-copy.element.ts Outdated Show resolved Hide resolved
packages/uui-text-copy/lib/uui-text-copy.element.ts Outdated Show resolved Hide resolved
@warrenbuckley warrenbuckley changed the title Adds UUI-Copy Adds UUI-Text-Copy Jan 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
community/pr feature Something we are looking to build
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants