Skip to content

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 text 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.

@github-actions
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?

@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.

@bjarnef
Copy link
Contributor

bjarnef commented Mar 3, 2025

A note off-topic regarding drag handle:
umbraco/Umbraco-CMS#18519 (comment)

I noticed one of these libraries had a copy button as well (as inspiration):
https://f36.contentful.com/components/copy-button

Not sure how relevant it is, but some props can probably be inherited from <uui-button>.

@iOvergaard iOvergaard changed the title Adds UUI-Text-Copy feat: Adds uui-button-copy-text Mar 4, 2025
@sonarqubecloud
Copy link

sonarqubecloud bot commented Mar 4, 2025

@iOvergaard iOvergaard enabled auto-merge (squash) March 4, 2025 14:07
@iOvergaard iOvergaard merged commit 7641286 into umbraco:v1/contrib Mar 4, 2025
8 of 9 checks passed
@bjarnef
Copy link
Contributor

bjarnef commented Mar 4, 2025

@iOvergaard it would be great if we had a copy utilty function to re-use as mentioned here: #985 (comment)

As the copy of color in color picker and this could share this feature 😊

and in copy from table cell:

const copyToClipboard = (e: Event) => {

In fact I think the can be replace with this component.

<uui-button
          data-copy-to-clipboard=${property.key}
          title="Copy custom property to clipboard"
          label="Copy custom property to clipboard"
          compact
          >${copyIcon}</uui-button>

@iOvergaard
Copy link
Contributor

@bjarnef Maybe, but do you think it is worth any effort to wrap the one-liner that is navigator.clipboard.writeText(text) in a function?

@bjarnef
Copy link
Contributor

bjarnef commented Mar 4, 2025

@iOvergaard it did a bit more here: https://github.com/Georgegriff/copy-component/blob/main/CopyComponent.js#L2C8-L9

but I think it is mainly for older browsers not supporting clipboard, so the part in else is probably not needed.

Perhaps try/catch or if we want it to return a Promise.

I haven't checked what happens if copy fails though.

Can we have something like this?
https://usehooks-ts.com/react-hook/use-copy-to-clipboard

E.g. in Nuxt/Vue and the example above in React use composables. I have seen similar hooks in various libraries, but not sure if they were built on Lit.

Anyway I guess we could have a similar function returning Promise<boolean> and emit an event?

@warrenbuckley warrenbuckley deleted the feature/uui-copy branch March 7, 2025 09:57
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 notable

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants