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

Post Schedule: show post events #29716

Merged
merged 29 commits into from
Apr 8, 2021

Conversation

retrofox
Copy link
Contributor

@retrofox retrofox commented Mar 10, 2021

Description

This PR collects the site posts and shows them as calendar events in the post schedule component.

Also, it adds the editor.CalendarEvents filter to be able to extend the events via a hook (doc updated):

fixes #13713

How has this been tested?

Storybook

  • Run the storybook locally > npm run storybook:dev
  • Once it starts, should create a browser tan pointing to http://localhost:50240/. Search the date-time component, or simply use this URL: http://localhost:50240/?path=/story/components-datetimepicker--with-days-highlighted
  • Add events by clicking on the Add random highlight button. You should see how the calendar is populated with random events (circles with background yellow color)
  • Move to next month and confirm new other events are rendered there, too.

Screen Shot 2021-03-15 at 11 24 10 AM

Editing a post

  • Create a testing post, but before:
    • Add some posts to your testing site, ensuring some are published and others scheduled.
      ** Be sure some posts belong to the post that you are going to use to test the post schedule.
  • Open the time date picker component by clicking on the post date (Immediately as default)
  • You should see the posts highlighted in the calendar.

Videos

it updates the aria-label for each day to speak the events number, in case they exist.

post-schedule-events-a11y.mp4

Types of changes

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.

@github-actions
Copy link

github-actions bot commented Mar 10, 2021

Size Change: +1.43 kB (0%)

Total Size: 1.42 MB

Filename Size Change
build/annotations/index.js 3.77 kB -10 B (0%)
build/api-fetch/index.js 3.41 kB -3 B (0%)
build/autop/index.js 2.81 kB -2 B (0%)
build/block-directory/index.js 8.62 kB -5 B (0%)
build/block-editor/index.js 127 kB -9 B (0%)
build/block-library/blocks/button/style-rtl.css 503 B +14 B (+3%)
build/block-library/blocks/button/style.css 503 B +15 B (+3%)
build/block-library/index.js 152 kB +259 B (0%)
build/block-library/style-rtl.css 9.4 kB +12 B (0%)
build/block-library/style.css 9.41 kB +13 B (0%)
build/block-serialization-default-parser/index.js 1.87 kB -3 B (0%)
build/blocks/index.js 48.4 kB +81 B (0%)
build/components/index.js 284 kB +223 B (0%)
build/components/style-rtl.css 16.3 kB +74 B (0%)
build/components/style.css 16.3 kB +75 B (0%)
build/compose/index.js 11.2 kB -7 B (0%)
build/core-data/index.js 17.1 kB +126 B (+1%)
build/customize-widgets/index.js 7.08 kB -195 B (-3%)
build/customize-widgets/style-rtl.css 630 B -46 B (-7%)
build/customize-widgets/style.css 631 B -46 B (-7%)
build/data-controls/index.js 836 B +1 B (0%)
build/data/index.js 8.88 kB -8 B (0%)
build/date/index.js 31.9 kB +3 B (0%)
build/dom-ready/index.js 577 B +1 B (0%)
build/dom/index.js 5.16 kB -14 B (0%)
build/edit-navigation/index.js 17 kB -12 B (0%)
build/edit-post/index.js 307 kB +715 B (0%)
build/edit-post/style-rtl.css 6.95 kB +39 B (+1%)
build/edit-post/style.css 6.94 kB +41 B (+1%)
build/edit-site/index.js 28 kB -37 B (0%)
build/edit-widgets/index.js 15.7 kB -14 B (0%)
build/editor/index.js 42.4 kB +231 B (+1%)
build/element/index.js 4.61 kB -10 B (0%)
build/format-library/index.js 6.75 kB -3 B (0%)
build/hooks/index.js 2.28 kB +2 B (0%)
build/i18n/index.js 4.01 kB -6 B (0%)
build/keyboard-shortcuts/index.js 2.53 kB -6 B (0%)
build/keycodes/index.js 1.95 kB -6 B (0%)
build/list-reusable-blocks/index.js 3.19 kB +1 B (0%)
build/media-utils/index.js 5.38 kB -2 B (0%)
build/notices/index.js 1.85 kB -5 B (0%)
build/nux/index.js 3.41 kB -11 B (0%)
build/primitives/index.js 1.42 kB -6 B (0%)
build/react-i18n/index.js 1.46 kB -1 B (0%)
build/reusable-blocks/index.js 3.78 kB -6 B (0%)
build/rich-text/index.js 13.5 kB -7 B (0%)
build/server-side-render/index.js 2.6 kB -4 B (0%)
build/token-list/index.js 1.27 kB -1 B (0%)
build/url/index.js 3.02 kB -10 B (0%)
build/viewport/index.js 1.86 kB -1 B (0%)
build/warning/index.js 1.14 kB +1 B (0%)
build/wordcount/index.js 1.22 kB +1 B (0%)
ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/blob/index.js 664 B 0 B
build/block-directory/style-rtl.css 1 kB 0 B
build/block-directory/style.css 1.01 kB 0 B
build/block-editor/style-rtl.css 12.4 kB 0 B
build/block-editor/style.css 12.4 kB 0 B
build/block-library/blocks/archives/editor-rtl.css 61 B 0 B
build/block-library/blocks/archives/editor.css 60 B 0 B
build/block-library/blocks/audio/editor-rtl.css 58 B 0 B
build/block-library/blocks/audio/editor.css 58 B 0 B
build/block-library/blocks/audio/style-rtl.css 112 B 0 B
build/block-library/blocks/audio/style.css 112 B 0 B
build/block-library/blocks/block/editor-rtl.css 161 B 0 B
build/block-library/blocks/block/editor.css 161 B 0 B
build/block-library/blocks/button/editor-rtl.css 475 B 0 B
build/block-library/blocks/button/editor.css 474 B 0 B
build/block-library/blocks/buttons/editor-rtl.css 315 B 0 B
build/block-library/blocks/buttons/editor.css 315 B 0 B
build/block-library/blocks/buttons/style-rtl.css 364 B 0 B
build/block-library/blocks/buttons/style.css 363 B 0 B
build/block-library/blocks/calendar/style-rtl.css 208 B 0 B
build/block-library/blocks/calendar/style.css 208 B 0 B
build/block-library/blocks/categories/editor-rtl.css 84 B 0 B
build/block-library/blocks/categories/editor.css 83 B 0 B
build/block-library/blocks/categories/style-rtl.css 79 B 0 B
build/block-library/blocks/categories/style.css 79 B 0 B
build/block-library/blocks/code/style-rtl.css 90 B 0 B
build/block-library/blocks/code/style.css 90 B 0 B
build/block-library/blocks/columns/editor-rtl.css 190 B 0 B
build/block-library/blocks/columns/editor.css 190 B 0 B
build/block-library/blocks/columns/style-rtl.css 436 B 0 B
build/block-library/blocks/columns/style.css 435 B 0 B
build/block-library/blocks/cover/editor-rtl.css 605 B 0 B
build/block-library/blocks/cover/editor.css 605 B 0 B
build/block-library/blocks/cover/style-rtl.css 1.24 kB 0 B
build/block-library/blocks/cover/style.css 1.24 kB 0 B
build/block-library/blocks/embed/editor-rtl.css 486 B 0 B
build/block-library/blocks/embed/editor.css 486 B 0 B
build/block-library/blocks/embed/style-rtl.css 401 B 0 B
build/block-library/blocks/embed/style.css 400 B 0 B
build/block-library/blocks/file/editor-rtl.css 175 B 0 B
build/block-library/blocks/file/editor.css 174 B 0 B
build/block-library/blocks/file/style-rtl.css 248 B 0 B
build/block-library/blocks/file/style.css 248 B 0 B
build/block-library/blocks/freeform/editor-rtl.css 2.45 kB 0 B
build/block-library/blocks/freeform/editor.css 2.45 kB 0 B
build/block-library/blocks/gallery/editor-rtl.css 704 B 0 B
build/block-library/blocks/gallery/editor.css 705 B 0 B
build/block-library/blocks/gallery/style-rtl.css 1.11 kB 0 B
build/block-library/blocks/gallery/style.css 1.1 kB 0 B
build/block-library/blocks/group/editor-rtl.css 160 B 0 B
build/block-library/blocks/group/editor.css 160 B 0 B
build/block-library/blocks/group/style-rtl.css 57 B 0 B
build/block-library/blocks/group/style.css 57 B 0 B
build/block-library/blocks/heading/editor-rtl.css 129 B 0 B
build/block-library/blocks/heading/editor.css 129 B 0 B
build/block-library/blocks/heading/style-rtl.css 76 B 0 B
build/block-library/blocks/heading/style.css 76 B 0 B
build/block-library/blocks/html/editor-rtl.css 281 B 0 B
build/block-library/blocks/html/editor.css 281 B 0 B
build/block-library/blocks/image/editor-rtl.css 717 B 0 B
build/block-library/blocks/image/editor.css 716 B 0 B
build/block-library/blocks/image/style-rtl.css 476 B 0 B
build/block-library/blocks/image/style.css 478 B 0 B
build/block-library/blocks/latest-comments/style-rtl.css 281 B 0 B
build/block-library/blocks/latest-comments/style.css 282 B 0 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B 0 B
build/block-library/blocks/latest-posts/editor.css 137 B 0 B
build/block-library/blocks/latest-posts/style-rtl.css 523 B 0 B
build/block-library/blocks/latest-posts/style.css 522 B 0 B
build/block-library/blocks/legacy-widget/editor-rtl.css 398 B 0 B
build/block-library/blocks/legacy-widget/editor.css 399 B 0 B
build/block-library/blocks/list/style-rtl.css 63 B 0 B
build/block-library/blocks/list/style.css 63 B 0 B
build/block-library/blocks/media-text/editor-rtl.css 191 B 0 B
build/block-library/blocks/media-text/editor.css 191 B 0 B
build/block-library/blocks/media-text/style-rtl.css 535 B 0 B
build/block-library/blocks/media-text/style.css 532 B 0 B
build/block-library/blocks/more/editor-rtl.css 434 B 0 B
build/block-library/blocks/more/editor.css 434 B 0 B
build/block-library/blocks/navigation-link/editor-rtl.css 597 B 0 B
build/block-library/blocks/navigation-link/editor.css 597 B 0 B
build/block-library/blocks/navigation-link/style-rtl.css 1.07 kB 0 B
build/block-library/blocks/navigation-link/style.css 1.07 kB 0 B
build/block-library/blocks/navigation/editor-rtl.css 1.24 kB 0 B
build/block-library/blocks/navigation/editor.css 1.24 kB 0 B
build/block-library/blocks/navigation/style-rtl.css 204 B 0 B
build/block-library/blocks/navigation/style.css 205 B 0 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B 0 B
build/block-library/blocks/nextpage/editor.css 395 B 0 B
build/block-library/blocks/page-list/editor-rtl.css 170 B 0 B
build/block-library/blocks/page-list/editor.css 170 B 0 B
build/block-library/blocks/page-list/style-rtl.css 167 B 0 B
build/block-library/blocks/page-list/style.css 167 B 0 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B 0 B
build/block-library/blocks/paragraph/editor.css 157 B 0 B
build/block-library/blocks/paragraph/style-rtl.css 247 B 0 B
build/block-library/blocks/paragraph/style.css 248 B 0 B
build/block-library/blocks/post-author/editor-rtl.css 209 B 0 B
build/block-library/blocks/post-author/editor.css 209 B 0 B
build/block-library/blocks/post-author/style-rtl.css 183 B 0 B
build/block-library/blocks/post-author/style.css 184 B 0 B
build/block-library/blocks/post-comments-form/style-rtl.css 250 B 0 B
build/block-library/blocks/post-comments-form/style.css 250 B 0 B
build/block-library/blocks/post-content/editor-rtl.css 139 B 0 B
build/block-library/blocks/post-content/editor.css 139 B 0 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B 0 B
build/block-library/blocks/post-excerpt/editor.css 73 B 0 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B 0 B
build/block-library/blocks/post-excerpt/style.css 69 B 0 B
build/block-library/blocks/post-featured-image/editor-rtl.css 338 B 0 B
build/block-library/blocks/post-featured-image/editor.css 338 B 0 B
build/block-library/blocks/post-featured-image/style-rtl.css 100 B 0 B
build/block-library/blocks/post-featured-image/style.css 100 B 0 B
build/block-library/blocks/preformatted/style-rtl.css 103 B 0 B
build/block-library/blocks/preformatted/style.css 103 B 0 B
build/block-library/blocks/pullquote/editor-rtl.css 183 B 0 B
build/block-library/blocks/pullquote/editor.css 183 B 0 B
build/block-library/blocks/pullquote/style-rtl.css 318 B 0 B
build/block-library/blocks/pullquote/style.css 318 B 0 B
build/block-library/blocks/query-loop/editor-rtl.css 83 B 0 B
build/block-library/blocks/query-loop/editor.css 82 B 0 B
build/block-library/blocks/query-loop/style-rtl.css 315 B 0 B
build/block-library/blocks/query-loop/style.css 317 B 0 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B 0 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B 0 B
build/block-library/blocks/query-pagination/editor-rtl.css 270 B 0 B
build/block-library/blocks/query-pagination/editor.css 262 B 0 B
build/block-library/blocks/query-pagination/style-rtl.css 168 B 0 B
build/block-library/blocks/query-pagination/style.css 168 B 0 B
build/block-library/blocks/query-title/editor-rtl.css 86 B 0 B
build/block-library/blocks/query-title/editor.css 86 B 0 B
build/block-library/blocks/query/editor-rtl.css 795 B 0 B
build/block-library/blocks/query/editor.css 794 B 0 B
build/block-library/blocks/quote/style-rtl.css 169 B 0 B
build/block-library/blocks/quote/style.css 169 B 0 B
build/block-library/blocks/rss/editor-rtl.css 201 B 0 B
build/block-library/blocks/rss/editor.css 202 B 0 B
build/block-library/blocks/rss/style-rtl.css 290 B 0 B
build/block-library/blocks/rss/style.css 290 B 0 B
build/block-library/blocks/search/editor-rtl.css 189 B 0 B
build/block-library/blocks/search/editor.css 189 B 0 B
build/block-library/blocks/search/style-rtl.css 359 B 0 B
build/block-library/blocks/search/style.css 362 B 0 B
build/block-library/blocks/separator/editor-rtl.css 99 B 0 B
build/block-library/blocks/separator/editor.css 99 B 0 B
build/block-library/blocks/separator/style-rtl.css 251 B 0 B
build/block-library/blocks/separator/style.css 251 B 0 B
build/block-library/blocks/shortcode/editor-rtl.css 512 B 0 B
build/block-library/blocks/shortcode/editor.css 512 B 0 B
build/block-library/blocks/site-logo/editor-rtl.css 438 B 0 B
build/block-library/blocks/site-logo/editor.css 438 B 0 B
build/block-library/blocks/site-logo/style-rtl.css 150 B 0 B
build/block-library/blocks/site-logo/style.css 150 B 0 B
build/block-library/blocks/social-link/editor-rtl.css 164 B 0 B
build/block-library/blocks/social-link/editor.css 165 B 0 B
build/block-library/blocks/social-links/editor-rtl.css 776 B 0 B
build/block-library/blocks/social-links/editor.css 776 B 0 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB 0 B
build/block-library/blocks/social-links/style.css 1.33 kB 0 B
build/block-library/blocks/spacer/editor-rtl.css 308 B 0 B
build/block-library/blocks/spacer/editor.css 308 B 0 B
build/block-library/blocks/spacer/style-rtl.css 48 B 0 B
build/block-library/blocks/spacer/style.css 48 B 0 B
build/block-library/blocks/table/editor-rtl.css 478 B 0 B
build/block-library/blocks/table/editor.css 478 B 0 B
build/block-library/blocks/table/style-rtl.css 402 B 0 B
build/block-library/blocks/table/style.css 402 B 0 B
build/block-library/blocks/tag-cloud/editor-rtl.css 118 B 0 B
build/block-library/blocks/tag-cloud/editor.css 118 B 0 B
build/block-library/blocks/tag-cloud/style-rtl.css 94 B 0 B
build/block-library/blocks/tag-cloud/style.css 94 B 0 B
build/block-library/blocks/template-part/editor-rtl.css 552 B 0 B
build/block-library/blocks/template-part/editor.css 551 B 0 B
build/block-library/blocks/term-description/editor-rtl.css 90 B 0 B
build/block-library/blocks/term-description/editor.css 90 B 0 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B 0 B
build/block-library/blocks/text-columns/editor.css 95 B 0 B
build/block-library/blocks/text-columns/style-rtl.css 166 B 0 B
build/block-library/blocks/text-columns/style.css 166 B 0 B
build/block-library/blocks/verse/editor-rtl.css 50 B 0 B
build/block-library/blocks/verse/editor.css 50 B 0 B
build/block-library/blocks/verse/style-rtl.css 87 B 0 B
build/block-library/blocks/verse/style.css 87 B 0 B
build/block-library/blocks/video/editor-rtl.css 504 B 0 B
build/block-library/blocks/video/editor.css 503 B 0 B
build/block-library/blocks/video/style-rtl.css 187 B 0 B
build/block-library/blocks/video/style.css 187 B 0 B
build/block-library/common-rtl.css 1.31 kB 0 B
build/block-library/common.css 1.31 kB 0 B
build/block-library/editor-rtl.css 9.74 kB 0 B
build/block-library/editor.css 9.73 kB 0 B
build/block-library/reset-rtl.css 502 B 0 B
build/block-library/reset.css 503 B 0 B
build/block-library/theme-rtl.css 692 B 0 B
build/block-library/theme.css 693 B 0 B
build/block-serialization-spec-parser/index.js 3.06 kB 0 B
build/deprecated/index.js 787 B 0 B
build/edit-navigation/style-rtl.css 2.86 kB 0 B
build/edit-navigation/style.css 2.86 kB 0 B
build/edit-post/classic-rtl.css 454 B 0 B
build/edit-post/classic.css 454 B 0 B
build/edit-site/style-rtl.css 4.61 kB 0 B
build/edit-site/style.css 4.61 kB 0 B
build/edit-widgets/style-rtl.css 2.98 kB 0 B
build/edit-widgets/style.css 2.98 kB 0 B
build/editor/style-rtl.css 3.93 kB 0 B
build/editor/style.css 3.92 kB 0 B
build/escape-html/index.js 735 B 0 B
build/format-library/style-rtl.css 637 B 0 B
build/format-library/style.css 639 B 0 B
build/html-entities/index.js 622 B 0 B
build/is-shallow-equal/index.js 699 B 0 B
build/list-reusable-blocks/style-rtl.css 629 B 0 B
build/list-reusable-blocks/style.css 628 B 0 B
build/nux/style-rtl.css 731 B 0 B
build/nux/style.css 727 B 0 B
build/plugins/index.js 2.95 kB 0 B
build/priority-queue/index.js 791 B 0 B
build/redux-routine/index.js 2.84 kB 0 B
build/reusable-blocks/style-rtl.css 225 B 0 B
build/reusable-blocks/style.css 225 B 0 B
build/shortcode/index.js 1.7 kB 0 B

compressed-size-action

@retrofox retrofox added the [Type] Enhancement A suggestion for improvement. label Mar 10, 2021
@retrofox retrofox force-pushed the update/show-existing-posts-in-date-picker branch 2 times, most recently from 863f613 to 9f2c56f Compare March 10, 2021 13:43
@paaljoachim
Copy link
Contributor

I believe this meta post might have some relevance to the PR.
https://make.wordpress.org/meta/2021/02/04/in-progress-scheduling-updates-to-published-posts-on-wordpress-org/

Copy link
Contributor

@allilevine allilevine left a comment

Choose a reason for hiding this comment

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

There's a little delay before the post highlights display when testing locally, but otherwise LGTM. ✅
Screen Shot 2021-03-11 at 5 39 18 PM

@retrofox
Copy link
Contributor Author

There's a little delay before the post highlights display when testing locally, but otherwise LGTM. ✅

Yeah, which is nice! 😅 The app requests the posts after the date picker is rendered, once. If you change the month and go back to it, the delay won't happen.
We can request the events before the component is rendered in order to avoid the delay, but not sure if it worths it or even makes sense since we are going to request the site events with the possibility that they won't be used in case the popover is not opened by the user.

@retrofox
Copy link
Contributor Author

@tomjn could you take a look at this one too? I saw you have been reviewing similar suggestions lately. Thanks in advance 🙇‍♂️

@pablinos
Copy link
Member

I believe this meta post might have some relevance to the PR.
https://make.wordpress.org/meta/2021/02/04/in-progress-scheduling-updates-to-published-posts-on-wordpress-org/

Yes definitely! We could adjust the API call to bring back post revisions with a future status too. That got me wondering if we should include a way to let this be extended by plugin developers etc. Some way of adjusting the events data and how they're displayed. Not something for this PR though!

@pablinos
Copy link
Member

This is looking good, but as this will eventually be shipped to all WordPress sites, I think we should make sure that there's a way of disabling it, or some other sensible default, for sites that are posting every day. Having every date ringed (and eventually with tooltips) could be more of an annoyance than an aid.

Another thought would be to make the indicator more subtle, like the Basecamp dot calendar.

image

But I'm not sure how we'd handle having many posts on a single day and this kind of redesign seems beyond the scope of this change.

@tomjn
Copy link
Contributor

tomjn commented Mar 12, 2021 via email

@retrofox
Copy link
Contributor Author

This is looking good, but as this will eventually be shipped to all WordPress sites, I think we should make sure that there's a way of disabling it...

I've added a toggle control to show/hide the calendar events.

@pablinos pablinos added the Needs Design Feedback Needs general design feedback. label Mar 13, 2021
@pablinos
Copy link
Member

My one area of uncertainty was timeline related, afterall 1am UK time on
the 25th, is actually the 24th for someone in USA eastern time, and if I
published a post from Tokyo or New Zealand the chances are even higher

Yes, scheduling based on time zone is a tricky problem, but this is more an interface to the current functionality and the times will be displayed in the current user's timezone.

@pablinos
Copy link
Member

I've added a toggle control to show/hide the calendar events.

Cool. I've added the design feedback label because it would be good to get some input as to whether this is the best solution to the problem of a noisy calendar, and whether the toggle needs any tweaks.

I was wondering about the term 'events'. It's more obvious what it means when you see them highlighted, but I don't know if it's the best word. Having said that, I'm struggling to come up with anything else!

@paaljoachim
Copy link
Contributor

paaljoachim commented Mar 13, 2021

This is what I see:

Screen Shot 2021-03-13 at 20 16 38

Nice job Damian!

With some experimenting I see various posts that have been published as well as scheduled published posts.
It gives a nice overview. I am a bit puzzled by the words "Show events".
What it does it show past and future published posts. Which is probably too much to add. What about "Show posts"?

I believe we need some more people to take a closer look here. I searched for calendar issues and see that @retrofox Damian has gone through and taken feedback from a few of these and added it to the PR.

It would be nice with some design folks to take a look at this issue.
@melchoyce @kellychoffman and @hedgefield

@tomjn
Copy link
Contributor

tomjn commented Mar 13, 2021

Yes, scheduling based on time zone is a tricky problem, but this is more an interface to the current functionality and the times will be displayed in the current user's timezone.

Oh I understood that was the intention, it was my expectation too :) I just didn't know if it was handled or not from a read of the code, it'll need someone to confirm it by testing

@kellychoffman
Copy link
Contributor

[Design review based off of screenshots]

I love this. One of my sites is is one that I try to post daily to and its very frustrating to try and remember which day doesn't have a post and which does - especially when I'm scheduling it in advance. I would love to see a solid month of every date highlighted! Means I'm doing something right - if my job is to post daily. And on the sites I have that I barely update, this will be a good indicator of when I last posted.

I don't think this toggle should be local to the page/post. I would argue against having the setting at all, but if others have a specific use case or if we get a ton of complaints: add it in a settings page so it is site wide and out of the way here.

Having a dot to represent events on calendars is very standard practice at this point, as @pablinos mentioned. I think it would be more subtle, yet still quite useful. And then we can remove that toggle :)

Screen Shot 2021-03-13 at 12 27 02 PM

@retrofox retrofox force-pushed the update/show-existing-posts-in-date-picker branch from 18a058e to cd22e14 Compare March 15, 2021 13:50
@retrofox
Copy link
Contributor Author

I was wondering about the term 'events'.

I am a bit puzzled by the words "Show events".

I thought about events because we might add other kid of events, not only posts, such as social media events?

Do you have some suggestions for re-wording it?

@retrofox
Copy link
Contributor Author

Updated :-)

@retrofox retrofox requested a review from talldan March 15, 2021 17:32
@retrofox retrofox force-pushed the update/show-existing-posts-in-date-picker branch from f07d4bd to 3a9bc18 Compare April 7, 2021 12:12
@retrofox
Copy link
Contributor Author

retrofox commented Apr 7, 2021

This is looking pretty good @retrofox. It'll be nice to have this ability in the calendar. ✨ I highlighted some areas to 🔍 a bit more with regards to the aria-label hack. I did some light smoke testing too, and I think it's mostly good.

Thanks @gwwar for your feedback and help. I've updated the aria-label hack to make it more solid. It's in a better place to go imo. Tested with a screen reader again, just in case:

post-schedule-events-a11y.mp4

Finally, e2e tests are passing which is great. Thanks again 🙇‍♂️


parentNode.setAttribute(
'aria-label',
`${ dayAriaLabel }. ${ eventsString }`
Copy link
Contributor

Choose a reason for hiding this comment

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

Is it possible to make this a single translation string instead of a concat on two translated strings together?

Translators get more context this way and it avoids a poor translation, especially if things would be phrased differently together.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

<3. I think it's handled here f677f37

Copy link
Contributor

@gwwar gwwar 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 your work here @retrofox, folks will enjoy this one!

Giving tentative approval, but I'd like a +1 on the code approach. Perhaps @youknowriad could take another 👀

This manually tests well for me. Here's a screenshot of what the screen reader controls look like:

Screen Shot 2021-04-07 at 10 18 43 AM

}

const { parentNode } = ref.current;
const dayAriaLabel = moment( day ).format( ARIAL_LABEL_TIME_FORMAT );
Copy link
Contributor

Choose a reason for hiding this comment

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

Something I noticed and better left for a follow up PR:

This is one of the few usages of moment in the project. It looks like we might have some options using @wordpress/date or even native browser support if that eventually falls into WP support ranges:

@@ -4,6 +4,7 @@
// Needed to initialise the default datepicker styles.
// See: https://github.com/airbnb/react-dates#initialize
import 'react-dates/initialize';
import { noop } from 'lodash';
Copy link
Contributor

Choose a reason for hiding this comment

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

For other reviewers, are we trying to reduce lodash usage in the project?

() =>
( eventsByPostType || [] ).map(
( { title, type, date: eventDate } ) => ( {
title: title?.raw,
Copy link
Contributor

Choose a reason for hiding this comment

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

Do folks know if we need the raw or rendered value 🤔

Copy link
Contributor Author

@retrofox retrofox Apr 7, 2021

Choose a reason for hiding this comment

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

I wasn't sure either and since it isn't going to be consumed on this approach, I preferred using the raw version of the title. However, if we'd like to implement the events tooltip we may like to go for the rendered version to format the event list:

Copy link
Contributor Author

Choose a reason for hiding this comment

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

PR #29737

Copy link
Contributor

Choose a reason for hiding this comment

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

Seems like this should be the rendered title, the raw is used when editing only AFAIK

);

parentNode.setAttribute( 'aria-label', dayWithEventsDescription );
}, [ ref, events.length ] );
Copy link
Contributor

Choose a reason for hiding this comment

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

I don't really understand why we're accessing and modifying attributes using DOM APIs here. I'm pretty sure you can get React warnings when doing things like that to Dom elements controlled by React.

Copy link
Contributor

Choose a reason for hiding this comment

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

Also, using a "ref" as dependency is useless, a ref never changes its instance.

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 don't really understand why we're accessing and modifying attributes using DOM APIs here.

Because the component API doesn't support extending the aria-label attribute in a super flexible way. It's nice when setting the date format, which is great. We can use, and we do, the dayAriaLabelFormat prop:

<DayPickerSingleDateController
    dayAriaLabelFormat="dd"
/>

It generates the following markup (Saturday day):

<td aria-label"Sa" ...>

Even is possible to set the property using arbitrary text, something like...

<DayPickerSingleDateController
    dayAriaLabelFormat="dd [🦊 retrofox]"
/>

Screen Shot 2021-04-08 at 7 23 42 AM

However, it isn't enough for our requirements, since what we'd like to achieve is setting a custom aria-label for each rendering day. Something like the following:

<DayPickerSingleDateController
	dayAriaLabelFormat={ ( day ) => {
		const dayAriaLabel = moment( day ).format( ARIAL_LABEL_TIME_FORMAT );
		const events = this.getEventsPerDay( day );

		return sprintf(
			// translators: 1: Calendar day format, 2: Calendar event number.
			_n(
				'%1$s. There is %2$d event.',
				'%1$s. There are %2$d events.',
				events.length
			),
			dayAriaLabel,
			events.length
		);
	} }

	// ....
/>

However, dayAriaLabelFormat only accepts a string. :'(

I'm pretty sure you can get React warnings when doing things like that to Dom elements controlled by React.

I think everybody agrees with that. The approach is quite far away to be ideal, but it works and it shouldn't hurt in the sense the app shouldn't get broken. In the worse cases, it should perform any change in the markup.
Our issue is not being able to extend the component as we wish, and AFAIK, DOM manipulation is the only solution without changing the react-dates component, something that we researched a few months ago.

Copy link
Contributor

Choose a reason for hiding this comment

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

I do expect this to break often though, React might restrict us from doing that. Do we have warnings now in the console because of that?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

All warnings that I see belong to the react-dates component. They already are in the trunk branch. I don't see any about the DOM manipulation process.

image

image

Copy link
Contributor

@youknowriad youknowriad left a comment

Choose a reason for hiding this comment

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

I don't like that a11y hack personally but I can live with it if there's no alternative. Why can't we just pass the aria label as just a prop?

The ref nevers changes its value
@retrofox
Copy link
Contributor Author

retrofox commented Apr 8, 2021

I don't like that a11y hack personally but I can live with it if there's no alternative.

I think the a11y support worths it.

Why can't we just pass the aria label as just a prop?

No, it doesn't seem to be possible.

@retrofox
Copy link
Contributor Author

retrofox commented Apr 8, 2021

Thanks folks for your help. <3

@retrofox retrofox merged commit b5ec4ae into trunk Apr 8, 2021
@retrofox retrofox deleted the update/show-existing-posts-in-date-picker branch April 8, 2021 14:03
@github-actions github-actions bot added this to the Gutenberg 10.5 milestone Apr 8, 2021
@supernovia
Copy link

thank youuuuuuu!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Type] Enhancement A suggestion for improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Show Existing Scheduled Posts in Calendar / Datepicker