feat: custom byline interface#3746
Conversation
claudiulodro
left a comment
There was a problem hiding this comment.
Overall I think this is coming together! The UX of it feels good. I noticed a few quirks in my testing:
- In general it's kind of hard to read once there are a few authors in there:
Not sure if we should reduce the size of the author boxes or how best to handle that. What do you think, @thomasguillot?
- Using the arrow keys, you can go into one of the boxes and then type to modify the content. I think it should not be editable.
- If you select a portion of the text that includes a box and delete, the box doesn't go back into the available authors section:
- Authors are always inserted at the end of the text box. I think the best experience would be for them to be inserted at the cursor position, otherwise it's tricky to edit existing bylines to add/change authors around.
|
This is starting to look pretty good! Here are two things I noticed:
The idea of storing the ID and the name is to have a fallback in case the user is deleted. When we render the byline, we'll always read the ID and get the Display name from the database, but if the ID is gone, we'll use the name that is stored there. |
|
Ah, and before you get crazy and go deep in a rabbit role, we DON'T NEED TO SUPPORT Guest Authors |
You're right, this doesn't look good. Let me think about a different approach here. |
|
Note: The panel should simply be named "Byline", not "Newspack Custom Byline" |
|
Can we please make sure the style matches Core's FormTokenField Also we can use |
|
I've just tested on a fresh post and I still have issues with the backspace interaction: custom-byline.movAnother problem I faced while drafting the new post was that the additional authors only became available after I saved and refreshed the post. Ideally, the component would be aware of the edited changes and update the component's available tokens. |
|
The latest commit fixes the backspace interaction, @miguelpeixe. About authors, it was expected that for the first version that would be acceptable (to have to refresh the page to make them available to use on byline), can you confirm that, @claudiulodro? |
|
Thanks for the revisions @allysonsouza! Backspace interaction is working well for deleting the token when the cursor is at the end of it. I'm facing a couple of issues still:
bylines.mov |
|
After struggling to handle the state of the content, which was not being managed by React state, @goldenapples started working on a simplification to use He's proposing it on this PR on our fork, I've been testing it and it seems like we need to deal with the removal of the tokens itself when there's a change to the token content (like adding characters or removing them with backspace or delete). That seems possible to be handled by onInput too, by adding an onInput on each token to remove itself when changes happen and to keep the onInput on the wrapper contenteditable div. |
b49dbc5 to
0867dfa
Compare
ef23903 to
d403417
Compare
|
Heads up that I've implemented the data structure changes that this PR does in trunk to allow us to move on with some tests. This might create conflicts that should be easily resolved - just ignore the changes on trunk |
miguelpeixe
left a comment
There was a problem hiding this comment.
Thank you for all the revisions, the code is well organized and very readable!
I ran into a couple of issues, but I'm not considering them blockers because we can address them separately:
- When backspacing a token, my cursor gets reset to position zero
- Making changes to the post authors does not update the available tokens. This is also the case after saving the changes. Only after a page refresh I'm able to use the new authors. This only happens when using Co-Authors Plus.
Other than that, I'm able to make changes to the byline and save with different token/text variations without issues.
|
Hey @allysonsouza, good job getting this PR merged! 🎉 Now, the Please check if this PR needs to be included in the "Upcoming Changes" and "Release Notes" doc. If it doesn't, simply remove the label. If it does, please add an entry to our shared document, with screenshots and testing instructions if applicable, then remove the label. Thank you! ❤️ |
|
🎉 This PR is included in version 6.3.0-hotfix-just-to-test-ci-changes.1 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
* fix: path to autoload (#3808) * fix(ia): render all emails on reset (#3867) This fixes an issue where resetting an email template in Newspack > Settings > Emails would only render Woo templates on success. * refactor(corrections): remove feature flag (#3866) * feat: custom byline interface (#3746) * feat: modify textarea to RichText and add TagInlineBlock with dummy authors * feat: fetch authors from co-authors plus and set tokens on BylinesSettingsPanel * chore: improve inline documentation * feat: [WIP] add author tokens on click * feat: append users to the end of the byline * feat: add author tokens to custom byline * feat: handling tokens with vanilla JS (WIP) * feat: useRef to manage tokens in use * chore: improve inline docs * feat: check custom byline after DOM ready * chore: addEventListener trough ref instead of DOM directly Also adds the return of a function on useEffect to allow React cleanup on unmount * feat: display icons on tokens (plus to insert and close to remove) * feat: add mutation observer to remove tokens on erasing with backspace/delete * chore: enhance inline documentation * fix: stylize tokens according to FormTokenField * fix: remove token when characterData changes * fix: improved mutation observer callback logic to update data correctly * fix: initilize only on DOM ready and main byline element ready * fix: properly add the mutation observer after child component is ready * fix: implement setTokensInUse function to better reuse code * fix: split byline "textarea" and tokens to avoid unwanted re-rendering * feat: parse meta with <Author> before rendering byline * feat: store byline meta according to the expected format * chore: refacot bylineParser function * feat: make custom bylines to work without co-author plus activated * feat: make custom byline field to be displayed on a modal * fix: mystype newspackByline.is_co_authors_plus_active * fix: adding space after token insertion at the end of byline * fix: improve byline innerHTML assignment * fix: typo isTokensdReady * docs: update docs * fix: remove non used authors query * fix: cubic-bezier transition typo * fix: remove updateBylineMeta from click on x/removal callback event * fix: remove unnecessary "backwards" compatibility since it's new feature * refactor: replace MutationObserver with event listeners Replaced the MutationObserver with an event listener, replaced some of the DOM interaction with a useRef element, and tried to refactor some of the data getters and setters. * fix: update effect registration so it only runs on mounting * refactor: remove unneded "remove token" handler * fix: look up the byline meta on mount, not just on initial render * fix: set contenteditable="false" on token spans Prevents editing the content in these spans, and makes it so that deleting (with backspace) will remove the whole span at once rather than editing within the span. * chore: add some missing docblocks and fix some lint issues * fix: set default insert location to end of editable field Updates the "cursorPos" variable logic to use the end of the line if there's no cursor position set yet, and to add a non-breaking space at the end of the text if necessary. Also updates the white-space styling of the editable area, to ensure that users can select any point in the text they may need to. * fix: remove margin from last token to prevent confusion with whitespace * feat: add preview to sidebar interface * fix: rename panel to Byline * fix: make modal width fixed * feat: add function to parse meta for preview * feat: default custom byline on first toggle * feat: set default custom byline meta on toggle * feat: update styles to match new designs * feat: update styles to match designs * chore: cleanup, comments, organization --------- Co-authored-by: Leo Germani <leogermani@automattic.com> Co-authored-by: goldenapples <goldenapplesdesign@gmail.com> Co-authored-by: Joeleen Kennedy <joeleen@humanmade.com> * feat: frontend display of bylines (#3856) * feat: modify textarea to RichText and add TagInlineBlock with dummy authors * feat: fetch authors from co-authors plus and set tokens on BylinesSettingsPanel * chore: improve inline documentation * feat: [WIP] add author tokens on click * feat: append users to the end of the byline * feat: add author tokens to custom byline * feat: handling tokens with vanilla JS (WIP) * feat: useRef to manage tokens in use * chore: improve inline docs * feat: check custom byline after DOM ready * chore: addEventListener trough ref instead of DOM directly Also adds the return of a function on useEffect to allow React cleanup on unmount * feat: display icons on tokens (plus to insert and close to remove) * feat: add mutation observer to remove tokens on erasing with backspace/delete * chore: enhance inline documentation * fix: stylize tokens according to FormTokenField * fix: remove token when characterData changes * fix: improved mutation observer callback logic to update data correctly * fix: initilize only on DOM ready and main byline element ready * fix: properly add the mutation observer after child component is ready * fix: implement setTokensInUse function to better reuse code * fix: split byline "textarea" and tokens to avoid unwanted re-rendering * feat: parse meta with <Author> before rendering byline * feat: store byline meta according to the expected format * chore: refacot bylineParser function * feat: make custom bylines to work without co-author plus activated * feat: make custom byline field to be displayed on a modal * fix: mystype newspackByline.is_co_authors_plus_active * fix: adding space after token insertion at the end of byline * fix: improve byline innerHTML assignment * docs: update docs * fix: typo isTokensdReady * fix: remove non used authors query * fix: cubic-bezier transition typo * fix: remove updateBylineMeta from click on x/removal callback event * fix: remove unnecessary "backwards" compatibility since it's new feature * feat: add byline output to pre_newspack_posted_by hook * Tried to simplify some things Replaced the MutationObserver with an event listener, replaced some of the DOM interaction with a useRef element, and tried to refactor some of the data getters and setters. * Update effects on mounting * Remove unneded remove handler. * Look up the byline on mount, not just on initial render. * feat: modify textarea to RichText and add TagInlineBlock with dummy authors * feat: fetch authors from co-authors plus and set tokens on BylinesSettingsPanel * chore: improve inline documentation * feat: [WIP] add author tokens on click * feat: append users to the end of the byline * feat: add author tokens to custom byline * feat: handling tokens with vanilla JS (WIP) * feat: useRef to manage tokens in use * chore: improve inline docs * feat: check custom byline after DOM ready * chore: addEventListener trough ref instead of DOM directly Also adds the return of a function on useEffect to allow React cleanup on unmount * feat: display icons on tokens (plus to insert and close to remove) * feat: add mutation observer to remove tokens on erasing with backspace/delete * chore: enhance inline documentation * fix: stylize tokens according to FormTokenField * fix: remove token when characterData changes * fix: improved mutation observer callback logic to update data correctly * fix: initilize only on DOM ready and main byline element ready * fix: properly add the mutation observer after child component is ready * fix: implement setTokensInUse function to better reuse code * fix: split byline "textarea" and tokens to avoid unwanted re-rendering * feat: parse meta with <Author> before rendering byline * feat: store byline meta according to the expected format * chore: refacot bylineParser function * feat: make custom bylines to work without co-author plus activated * feat: make custom byline field to be displayed on a modal * fix: mystype newspackByline.is_co_authors_plus_active * fix: adding space after token insertion at the end of byline * fix: improve byline innerHTML assignment * fix: typo isTokensdReady * docs: update docs * fix: remove non used authors query * fix: cubic-bezier transition typo * fix: remove updateBylineMeta from click on x/removal callback event * fix: remove unnecessary "backwards" compatibility since it's new feature * refactor: replace MutationObserver with event listeners Replaced the MutationObserver with an event listener, replaced some of the DOM interaction with a useRef element, and tried to refactor some of the data getters and setters. * fix: update effect registration so it only runs on mounting * refactor: remove unneded "remove token" handler * fix: look up the byline meta on mount, not just on initial render * fix: set contenteditable="false" on token spans Prevents editing the content in these spans, and makes it so that deleting (with backspace) will remove the whole span at once rather than editing within the span. * chore: add some missing docblocks and fix some lint issues * fix: set default insert location to end of editable field Updates the "cursorPos" variable logic to use the end of the line if there's no cursor position set yet, and to add a non-breaking space at the end of the text if necessary. Also updates the white-space styling of the editable area, to ensure that users can select any point in the text they may need to. * fix: remove margin from last token to prevent confusion with whitespace * feat: add preview to sidebar interface * fix: rename panel to Byline * fix: make modal width fixed * feat: add function to parse meta for preview * feat: default custom byline on first toggle * feat: set default custom byline meta on toggle * feat: replace author shortcodes on output * feat: update styles to match new designs * feat: update styles to match designs * chore: cleanup, comments, organization * feat: return an array of coauthors plus authors object, for authors in use in the byline * chore: few tweaks and linting --------- Co-authored-by: Leo Germani <leogermani@automattic.com> Co-authored-by: goldenapples <goldenapplesdesign@gmail.com> Co-authored-by: Joeleen Kennedy <joeleen@humanmade.com> * fix: handle missing Mailchimp API key in auth status (#3873) * fix: remove Mailchimp for WooCommerce from wizard (#3876) * fix(notices): fix PHP notice (#3872) * chore: remove unused `react-daterange-picker` package (#3879) * chore: prevent PHP notice with is_singular (#3874) * fix(guest-contributors): return them in authors query * fix: remove the Design link from the Appearance menu (#3878) * feat(esp-sync): add constant contact support (#3832) * fix: add constant contact list id setting * fix: add constant contact to Sync settings * fix: add constant contact to reader activation settings * chore: refactor esp settings component * fix: regressions --------- Co-authored-by: dkoo <derrick.koo@automattic.com> * ci: build distributable after release --------- Co-authored-by: Ron Chambers <116242607+ronchambers@users.noreply.github.com> Co-authored-by: Rasmy Nguyen <raz@automattic.com> Co-authored-by: Takshil Kunadia <71006004+Takshil-Kunadia@users.noreply.github.com> Co-authored-by: Allyson <2000638+allysonsouza@users.noreply.github.com> Co-authored-by: Leo Germani <leogermani@automattic.com> Co-authored-by: goldenapples <goldenapplesdesign@gmail.com> Co-authored-by: Joeleen Kennedy <joeleen@humanmade.com> Co-authored-by: Camilla Krag Jensen <naxoc@users.noreply.github.com> Co-authored-by: matticbot <sysops+ghmatticbot@automattic.com> Co-authored-by: Adam Cassis <adam@adamcassis.com> Co-authored-by: Adam Cassis <adam.cassis@automattic.com> Co-authored-by: Laurel <laurel.fulford@automattic.com> Co-authored-by: dkoo <derrick.koo@automattic.com>
# [6.3.0-alpha.1](v6.2.2...v6.3.0-alpha.1) (2025-04-04) ### Bug Fixes * **guest-contributors:** return them in authors query ([3703559](3703559)) * handle missing Mailchimp API key in auth status ([#3873](#3873)) ([6df6fda](6df6fda)) * **ia:** render all emails on reset ([#3867](#3867)) ([c6a71c0](c6a71c0)) * **notices:** fix PHP notice ([#3872](#3872)) ([cc928b2](cc928b2)) * path to autoload ([#3808](#3808)) ([97fa24a](97fa24a)) * remove Mailchimp for WooCommerce from wizard ([#3876](#3876)) ([f6b2484](f6b2484)) * remove the Design link from the Appearance menu ([#3878](#3878)) ([e24f147](e24f147)) ### Features * custom byline interface ([#3746](#3746)) ([289f55e](289f55e)) * **esp-sync:** add constant contact support ([#3832](#3832)) ([8198956](8198956)) * frontend display of bylines ([#3856](#3856)) ([9feeba8](9feeba8))
|
🎉 This PR is included in version 6.3.0-alpha.1 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
# [6.4.0-alpha.1](v6.3.0...v6.4.0-alpha.1) (2025-04-09) ### Bug Fixes * **guest-contributors:** return them in authors query ([3703559](3703559)) * handle missing Mailchimp API key in auth status ([#3873](#3873)) ([6df6fda](6df6fda)) * **ia:** render all emails on reset ([#3867](#3867)) ([c6a71c0](c6a71c0)) * **notices:** fix PHP notice ([#3872](#3872)) ([cc928b2](cc928b2)) * path to autoload ([#3808](#3808)) ([97fa24a](97fa24a)) * remove Mailchimp for WooCommerce from wizard ([#3876](#3876)) ([f6b2484](f6b2484)) * remove the Design link from the Appearance menu ([#3878](#3878)) ([e24f147](e24f147)) ### Features * custom byline interface ([#3746](#3746)) ([289f55e](289f55e)) * **esp-sync:** add constant contact support ([#3832](#3832)) ([8198956](8198956)) * frontend display of bylines ([#3856](#3856)) ([9feeba8](9feeba8))
|
🎉 This PR is included in version 6.4.0-alpha.1 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
# [6.4.0](v6.3.1...v6.4.0) (2025-04-14) ### Bug Fixes * **guest-contributors:** return them in authors query ([3703559](3703559)) * handle missing Mailchimp API key in auth status ([#3873](#3873)) ([6df6fda](6df6fda)) * **ia:** render all emails on reset ([#3867](#3867)) ([c6a71c0](c6a71c0)) * **notices:** fix PHP notice ([#3872](#3872)) ([cc928b2](cc928b2)) * path to autoload ([#3808](#3808)) ([97fa24a](97fa24a)) * remove Mailchimp for WooCommerce from wizard ([#3876](#3876)) ([f6b2484](f6b2484)) * remove the Design link from the Appearance menu ([#3878](#3878)) ([e24f147](e24f147)) ### Features * custom byline interface ([#3746](#3746)) ([289f55e](289f55e)) * **esp-sync:** add constant contact support ([#3832](#3832)) ([8198956](8198956)) * frontend display of bylines ([#3856](#3856)) ([9feeba8](9feeba8))
|
🎉 This PR is included in version 6.4.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |

All Submissions:
Changes proposed in this Pull Request:
This Pull Request implements the feature to allow the selection of author tokens from authors selected on Co-Authors Plus to compound a custom byline with them.
How to test the changes in this Pull Request:
divwithcontenteditable. Below it you should see the authors assigned to the post as buttons that will insert the tokens on the content when clicked.Things to check:
Other information: