Problem/Motivation

jQuery Joyride was added to support tours. It is used in a Views tour and a welcome tour in Umami. However Joyride has not been maintained for the last 2 years. See https://zurb.com/playground/jquery-joyride-feature-tour-plugin and commit history at https://github.com/zurb/joyride

Proposed resolution

  • Replace joyride with Shepherd.
  • Refactor Tour JavaScript to work with the Shepherd API instead of Joyride's
  • Deprecate tour config properties and Tour tip plugin methods specific to joyride that won't work with Shepherd
  • Trigger E_USER_WARNING warnings when deprecated Tour tip methods are called directly to encourage changing these as soon as possible. These methods will still be available with BC support for common use cases, but it ma not be possible to cover every use case due to the extensibility of tip plugins.
  • Provide an update hook that converts deprecated tour config properties to Shepherd-compatible ones.
  • Refactor Tour Tip plugin and view builder PHP to work with Shepherd config, as well as Backwards compatibility support for plugins configured for Joyride
  • Provide JavaScript in Stable/Stable9 that rebuilds Shepherd tip markup to the markup provided by Joyride.

Shepherd Dependency evaluation (see #58)

Dependency evaluation reply from Shepherd maintainer

Maintainership of the package

The package is managed by Ship Shape Consulting, and features 80 contributors with 302 applications on GitHub marked as direct dependencies of shepherd.

It features the use of automated dependency management and has no security advisories active. It features a wealth of commits and has been recently committed to by varying contributors - not only dependabot.

Security policies of the package

Packages with security vulnerabilities are publicly disclosed via the built-in vetting functionality provided by GitHub, and the management of those dependencies is automated with the use of Dependabot. The commit history shows there's a significant amount of this work happened and without issue.

Expected release and support cycles

Releases are infrequent but they consistently have occurred at least once every couple of months throughout the current year (2020). Release notes however are a little inconsistent - as some lack detail. 2021 Update - minor releases have been updated roughly once a month this year, and have good notes and links to docs and issues.
https://github.com/shipshapecode/shepherd/releases

Code quality

shepherd features the use of many open source static analysis tools in its workflow and uses CI as part of development workflow. With the security measures and tools in place to secure the analysis of the code quality and security - not limited to maintainability rating scores and code coverage tests. shepherd appears to be a very good library if it's fit for purpose.

Remaining tasks

  • Implement proposed resolution
  • Add tons of test coverage
  • Add dependency evaluation
  • get release manager sign-off
  • Review the MR and address remaining feedback
  • Update issue summary with API changes and release note
  • Update change records

User interface changes

Tour tips now appear as true modals. When open, the rest of the page is not intractable, and keyboard focus is trapped within the modal. The non-interactable area is masked.

Shepherd pointing to the horizontal center of the element they are associated with. This is different from Joyride, which defaults to pointing to the left side

API changes

TipPluginInterface::getOutput() is deprecated
TipPluginInterface::getAttributes() is deprecated
New TourTipPluginInterface should be implemented by existing plugins

Full BC and deprecation warnings are in place.

Data model changes

Deprecated the attributes key of the tour schema.
New selector key added to the tour schema.

Release notes snippet

The tour module previously depended on jQuery Joyride. Joyride is now replaced with Shepherd.
The core/jquery.joyride is now deprecated and core/shepherd is added. Tour config has changed, it no longer uses attributes with a data-id or data-class to indicate a target element for the tour. The selector property is used instead.
A BC layer is provided so that existing tours will still function, and any themes which use Stable or Stable9 as a base will have consistent markup for the Tour so that no theming changes should be necessary.

CommentFileSizeAuthor
#93 tour-wildwest.png20.24 KBzrpnr
#93 tour-stable.png16.98 KBzrpnr
#93 tour-bartik.png17.05 KBzrpnr
#93 tour-seven.png34.93 KBzrpnr
#93 tour-claro.png34.4 KBzrpnr
#79 3051766-79-this-will-fail.patch486.95 KBbnjmnm
#76 3051766-76.patch448.58 KBbnjmnm
#76 interdiff_74-76.txt62.8 KBbnjmnm
#74 interdiff_73_74.txt795 bytesanmolgoyal74
#74 3051766-74-FOR-EVALUATING-APPROACH.patch413.54 KBanmolgoyal74
#73 interdiff_69-73.txt42.08 KBbnjmnm
#73 3051766-73-FOR-EVALUATING-APPROACH.patch413.57 KBbnjmnm
#69 3051766-69.patch384.63 KBbnjmnm
#69 interdiff_67-69.txt853 bytesbnjmnm
#67 3051766-67.patch384.82 KBbnjmnm
#67 interdiff_66-67.txt999 bytesbnjmnm
#66 3051766--66.patch384.83 KBbnjmnm
#66 interdiff__64-66.txt13.54 KBbnjmnm
#64 joyridezoom2.png412.07 KBbnjmnm
#64 joyride-zoom.png317.79 KBbnjmnm
#64 Shepherd-zoom.png375.07 KBbnjmnm
#64 3051766--64.patch384.61 KBbnjmnm
#64 interdiff__62-64.txt7.84 KBbnjmnm
#62 3051766-62.patch384.5 KBbnjmnm
#62 interdiff_60-62.txt8.7 KBbnjmnm
#60 3051766-60.patch384.65 KBbnjmnm
#60 interdiff_54-60.txt384.22 KBbnjmnm
#55 Home-Umami-Food-Magazine.png683.46 KBvacho
#54 3051766-54.patch105.36 KBvacho
#53 interdiff_50-53.txt3.37 KBoleksiy
#53 3051766-53.patch105.36 KBoleksiy
#50 3051766-50.patch104.37 KBoleksiy
#47 interdiff_44-47.txt11.98 KBfinnsky
#47 3051766-47.patch104.17 KBfinnsky
#46 umami.gif4.42 MBfinnsky
#46 claro.gif2.08 MBfinnsky
#46 seven.gif2.93 MBfinnsky
#44 interdiff_39_44.txt134.1 KBfinnsky
#44 3051766-44.patch99.1 KBfinnsky
#40 3051766-39.patch74.77 KBjungle
#39 3051766-38.patch116.27 KBjungle
#32 interdiff_28-32.txt13.82 KBoleksiy
#32 3051766-32.patch116.36 KBoleksiy
#28 3051766-28.patch110.47 KBoleksiy
#28 interdiff_25-28.txt5.43 KBoleksiy
#25 3051766-25.patch106.79 KBoleksiy
#25 interdiff_22-25.txt91.91 KBoleksiy
#24 interdiff_19-22.txt99.84 KBoleksiy
#24 3051766-22.patch14.76 KBoleksiy
#20 example.gif1.52 MBfinnsky
#19 interdiff-10-19.txt208.57 KBfinnsky
#19 3051766-19.patch105.91 KBfinnsky
#17 markup.png168.7 KBfinnsky
#17 shepherd.png384.52 KBfinnsky
#10 3051766-10.patch110.15 KBwim leers
#10 interdiff.txt1.02 KBwim leers
#10 Screenshot 2019-08-19 at 15.48.22.png427.3 KBwim leers
#10 Screenshot 2019-08-19 at 15.49.17.png358.72 KBwim leers
#8 3051766-8.patch109.76 KBfinnsky
#8 demo.gif18.42 MBfinnsky

Issue fork drupal-3051766

Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

Gábor Hojtsy created an issue. See original summary.

wim leers’s picture

Contrib modules also use it. At least https://www.drupal.org/project/cdn does :)

baluertl’s picture

Right at the very beginning of this issue thread, I do feel that two questions were asked:

A) Relying on Joyride JS-library or seek another one?
I'm not eligible to form an opinion on that.

B) Keeping the Tour functionality in Drupal core?
I vote a heartful +1 to support keeping Tour module in Drupal core as it has a great (yet underused, indeed) added value for those in the audience we'll try to engage better: sitebuilders.

andypost’s picture

It still mentioned many times in help topics issue #2920309: Add experimental module for Help Topics as better approach to help

rachel_norfolk’s picture

Oh no! We were literally talking yesterday about the Tour functionality in core being key to the "Try Drupal" refresh on Drupal.org!!

Being able to guide people around a new demo install is super useful. Would be a great shame to lose it but I also appreciate that the library in question does need support for that to be safe.

andrewmacpherson’s picture

Tour module has a lot of accessibility problems. Not all of them are Joyride's fault, but linking the related issue.

finnsky’s picture

Assigned: Unassigned » finnsky
finnsky’s picture

Assigned: finnsky » Unassigned
Status: Active » Needs review
StatusFileSize
new18.42 MB
new109.76 KB

Hello all!
Added quick implementation of https://github.com/shipshapecode/shepherd
which seems me good alternative of Joyride.
DEMO: https://shepherdjs.dev/demo/

Looks pretty accessible and configurable out of box.
This patch is just for tests. But mostly api and configs should be same.
Use default umami profile installation for tests with drush for example:
`drush si demo_umami`

demo

claudiu.cristea’s picture

Could please look alo into this? Now the tour is hard coupled with the toolbar: #3012027: Decouple tour triggering from the toolbar.

wim leers’s picture

Title: Reconsider our usage of JQuery Joyride (tour) » Reconsider our usage of jQuery Joyride (for tours)
Component: javascript » tour.module
Issue summary: View changes
Issue tags: +JavaScript, +Needs change record
StatusFileSize
new358.72 KB
new427.3 KB
new1.02 KB
new110.15 KB

Great research and PoC, @finnsky! That's looking very promising indeed. I'd love to see this fleshed out further.

  1. There are still a few lingering references to jQuery Joyride in tour.js, but I'm sure you knew about that :)
  2. The bigger concern are accessibility and usability: the current styling is problematic in terms of visual association (no arrow pointing to the targeted element, necessary for visual users) and the absence of contrast (necessary for visual users, especially visually impaired ones, but really it affects all of them).
Before
After

(Fixed two nits in the patch: Joyride was still being injected and was not yet deprecated.)

finnsky’s picture

Assigned: Unassigned » finnsky
finnsky’s picture

Assigned: finnsky » Unassigned
Status: Needs review » Needs work

@Wim Leers i see much more abilities to optimise tour here.
https://github.com/zurb/joyride#usage Joyride required tour source to be in html list on page. But shepherd dont. we can change backend of module to send simple js object with tour items in drupalSettings. So maybe we need to rework it?

wim leers’s picture

That HTML list is just an implementation detail and not an API, so I think it's definitely reasonable to rework this 👍 Thanks for taking this on!

andypost’s picture

Storing tours in drupalSettings is bad idea, because it syncs with every ajax requiest.

@finnsky Tours are markup and conversion of it to JSON looks useless browser operation

andypost’s picture

Also the related issue could change how tours could be found

wim leers’s picture

Storing tours in drupalSettings is bad idea, because it syncs with every ajax requiest.

Huh? drupalSettings.ajaxPageState does, not all of drupalSettings. Or what am I missing?

finnsky’s picture

StatusFileSize
new384.52 KB
new168.7 KB

@andypost thanks for review
1) get tour items from js object cheaper than search html list it on page/parse attributes/and render as tour items again.
https://git.drupalcode.org/project/drupal/blob/8.8.x/core/modules/tour/j...
2) On shepherd side we need js object. Not markup. Example from specs:

tour.addStep({
  title: 'Creating a Shepherd Tour',
  text: `Creating a Shepherd tour is easy. too!\
  Just create a \`Tour\` instance, and add as many steps as you want.`,
  attachTo: {
    element: '.hero-example',
    on: 'bottom'
  },
  buttons: [
    {
      action() {
        return this.back();
      },
      classes: 'shepherd-button-secondary',
      text: 'Back'
    },
    {
      action() {
        return this.next();
      },
      text: 'Next'
    }
  ],
  id: 'creating'
});

3) We may use something like Drupal.TourNotRefresheableOnEveryAjaxRequest. I'm sure can be way
4) Shepherd has pretty nice default markup. We should reuse it. So current backend should be changed anyway. Right now it adds Title/Text/Pagination in predefined tags, which we will need to parse on js before send it to shepherd.

Default shepherd markup
shepherd
Current tour module list.
current

So API will be same. Tours will be attached in same way https://www.drupal.org/docs/8/api/tour-api/overview#content-tour-yaml-do...
As @Wim Leers mentioned it will be change only implementation in module.

finnsky’s picture

Assigned: Unassigned » finnsky
finnsky’s picture

Assigned: finnsky » Unassigned
Status: Needs work » Needs review
StatusFileSize
new105.91 KB
new208.57 KB

1) updated shepherd to 5.0.0 to disable default shepherd styles https://github.com/shipshapecode/shepherd/pull/526
2) Moved tour items to drupalSettings. Backenders help definetly needed.
3) Updated js according.
4) Updated part of css.
5) Enabled partial background shadow in shepherd. Looks nice imo. Browsers tests needed.
6) Tested a11y. On gif attached i used tabs only :)

TODO:
1) Manage js logic in case of query in url http://example.com/foo?tour=1&tips=bar
2) Manage data attributes.
3) Update css in module, stable theme, and in umami installation profile.
4) Update functional tests. Here should be same problems as in https://www.drupal.org/project/drupal/issues/3074267#comment-13232996

Only local images are allowed.

finnsky’s picture

StatusFileSize
new1.52 MB

example

wim leers’s picture

Wow, that auto-highlighting feature is excellent! That was often lacking in existing tour integrations.

I'm not sure it is equally clear for low vision users though. This will need accessibility review. I see you already tested as a keyboard-only user for the GIF in #20 — that's already an excellent piece of validation, thanks! :)

Status: Needs review » Needs work

The last submitted patch, 19: 3051766-19.patch, failed testing. View results
- codesniffer_fixes.patch Interdiff of automated coding standards fixes only.

wim leers’s picture

It'd be great to fix those last 4 failures while we wait for accessibility review :)

oleksiy’s picture

StatusFileSize
new14.76 KB
new99.84 KB

Updated a bit backend part + little changes to js.

oleksiy’s picture

StatusFileSize
new91.91 KB
new106.79 KB

Sorry, missed to add library in patch

finnsky’s picture

Assigned: Unassigned » finnsky
finnsky’s picture

Assigned: finnsky » Unassigned
oleksiy’s picture

StatusFileSize
new5.43 KB
new110.47 KB

Tried to fix the failures.

rachel_norfolk’s picture

Quick review of #28 on Safari 12.1.2:

  1. The auto-highlighting function is AWESOME
  2. We probably need to look at a border or something around the actual speech bubble, to separate it from the highlighted region
  3. On Safari at least, the scroll-to-region is not working properly in the Umami demo. Seems to scroll consistently with the highlighted region (and bubble) off the top of the screen
  4. Apostrophes etc are being escaped. Probably need to look at how we can avoid this or add it into documentation
wim leers’s picture

Just one more failing test to fix!

oleksiy’s picture

Assigned: Unassigned » oleksiy
oleksiy’s picture

Assigned: oleksiy » Unassigned
Status: Needs work » Needs review
StatusFileSize
new116.36 KB
new13.82 KB
wim leers’s picture

Yay, this is green now! Well done, @Oleksiy! 👏

@Oleksiy Do you think you could also address @rachel_norfolk's feedback in #29?

+++ b/core/modules/tour/tests/tour_test/src/Plugin/tour/tip/TipPluginImage.php
@@ -35,14 +35,14 @@ class TipPluginImage extends TipPluginBase {
+      'title' => Html::escape($this->get('label')),

Although I think this already addressed her point 4 :)

rachel_norfolk’s picture

Also worth taking a look in places that might still need some JoyRide artefacts pulling out?

Places I think look like candidates:

  1. core/modules/tour/tour.libraries.yml -- references jquery but do we still need it?
  2. core/modules/tour/css/tour.module.css
  3. core/modules/tour/js/tour.es6.js -- is _removeIrrelevantTourItems() still needed or need updating?
  4. core/core.libraries.yml -- line 400ish
  5. core/themes/seven/css/components/tour.theme.css -- hmm, what do we do about this?
  6. and the actual joyride lib!
oleksiy’s picture

Thanks, @Wim Leers

@Oleksiy Do you think you could also address @rachel_norfolk's feedback in #29?

Yes. It seems related to the point 4.

wim leers’s picture

#34 All good feedback! Only point 6 is not quite true: we can't remove an asset library, we can only deprecate it. Removing it would be a backwards compatibility break.

Deprecating asset libraries is possible since about two months, see https://www.drupal.org/node/3064022 :)

rachel_norfolk’s picture

Ah that is a good point about deprecation (though it does remind me we *really* need to declare what is a public and what is a private api, so we can replace the implementation without changing the public interface of the tour module!)

It might mean that 2,3,5 and 6 should all remain ( as "part of the library") ?

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.0-alpha1 will be released the week of October 14th, 2019, which means new developments and disruptive changes should now be targeted against the 8.9.x-dev branch. (Any changes to 8.9.x will also be committed to 9.0.x in preparation for Drupal 9’s release, but some changes like significant feature additions will be deferred to 9.1.x.). For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

jungle’s picture

Issue tags: -JavaScript +JavaScript
StatusFileSize
new116.27 KB

Rerolled from #32 and made a small change below.

  1. +++ b/core/assets/vendor/shepherd/shepherd.min.js
    @@ -0,0 +1,4 @@
    +/*! shepherd.js 5.0.0 */
    

    included version is 5.0.0

  2. +++ b/core/core.libraries.yml
    @@ -923,6 +924,16 @@ picturefill:
    +  version: "4.6.0"
    

    in lib, it's 4.6.0

So changed 4.6.0 to 5.0.0

jungle’s picture

StatusFileSize
new74.77 KB

Changed the library version to 7.0.1

As https://github.com/shipshapecode/shepherd/releases/tag/v7.0.1 was released, let's work on the new version if it's ok. But:

Shepherd v6.x no longer ships with the required polyfills to work with IE 11 out of the box

See https://github.com/shipshapecode/shepherd#ie-11

bnjmnm’s picture

Issue summary: View changes
Status: Needs review » Needs work

Updated issue summary to document @todo items referencing this issue.

Also regarding #40. First, good catch! One of the three polyfills needed - Object.assign is already part of core drupal.object.assign, but I'm setting this to needs work to add the two additional ones needed, Symbol and element.matches and to make them dependencies of core/shepherd. For reference, polyfills were recently added as part of a library update in this issue: #3108402: Update to Popper.js to 2.0.0

Also wanted to make sure shepherdjs meets the criteria here: https://www.drupal.org/core/dependencies#criteria, I may have missed this in the issue but wanted to mention just in case as it would be unfortunate if all this effort was directed towards it only to discover it didn't meet the criteria necessary to be included in core.

catch’s picture

Issue tags: +Drupal 10

Tagging for Drupal 10 since this is one of about two ways we can replace our jquery cookie shim (the other would be relying on joyride's fallback behaviour).

finnsky’s picture

Assigned: Unassigned » finnsky

current patch is broken. since ol#tour was removed and some code still expect it. gonna fix.

finnsky’s picture

Assigned: finnsky » Unassigned
Status: Needs work » Needs review
StatusFileSize
new99.1 KB
new134.1 KB

Reworked patch.

1) Added `Shepherd` in eslint globals
2) Updated library to 7.0.4
3) Updated css for module, stable, claro and umami
4) Fixed js.
Now all previous features work. Like:

   * - tour: When ?tour=1 is present, the tour will start automatically after
   * - tips: Pass ?tips=class in the url to filter the available tips to the

Removed jQuery where it is possible.

Current results:

Seven:
alt

Claro:

alt

Umami:

alt

We need to update specs and tests. Patch is mostly ok.

Status: Needs review » Needs work

The last submitted patch, 44: 3051766-44.patch, failed testing. View results

finnsky’s picture

StatusFileSize
new2.93 MB
new2.08 MB
new4.42 MB
finnsky’s picture

Status: Needs work » Needs review
StatusFileSize
new104.17 KB
new11.98 KB

Hi all!

1) Fixed coding standard messages.
2) Managed focus states for all themes.
3) Removed `console.log`. Sorry:)
4) Fixed tests
5) Moved tour.theme.css to /theme dir for claro

Patch became ready to implement now. Please review.

Status: Needs review » Needs work

The last submitted patch, 47: 3051766-47.patch, failed testing. View results

Version: 8.9.x-dev » 9.1.x-dev

Drupal 8.9.0-beta1 was released on March 20, 2020. 8.9.x is the final, long-term support (LTS) minor release of Drupal 8, which means new developments and disruptive changes should now be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

oleksiy’s picture

StatusFileSize
new104.37 KB

The tests still need work

oleksiy’s picture

oleksiy’s picture

oleksiy’s picture

Status: Needs work » Needs review
StatusFileSize
new105.36 KB
new3.37 KB

Fixed TourViewBuilder and tests.

(Sorry, for the empty comments above. There was some issue with the comment submit)

vacho’s picture

StatusFileSize
new105.36 KB

Patch #53 rerolled.

vacho’s picture

StatusFileSize
new683.46 KB

After a test, I found all right execpt by one issue.

At the home screen of unamy profile, the first tour message has a bad space at the right.

bad implementation

vacho’s picture

Status: Needs review » Needs work

Version: 9.1.x-dev » 9.2.x-dev

Drupal 9.1.0-alpha1 will be released the week of October 19, 2020, which means new developments and disruptive changes should now be targeted for the 9.2.x-dev branch. For more information see the Drupal 9 minor version schedule and the Allowed changes during the Drupal 9 release cycle.

fubarhouse’s picture

In evaluation for the use of `shepherd`, I'd like to throw my evaluation for the use against Drupal's Criteria for adding dependencies.

Maintainership of the package

The package is managed by Ember Consulting, and features 79 contributors with 200 applications on GitHub marked as direct dependencies of `shepherd`. It features the use of automated dependency management and has no security advisories active. It features a wealth of commits and has been recently committed to by varying contributors - not only dependabot.

Security policies of the package

Packages with security vulnerabilities are publicly disclosed via the built-in vetting functionality provided by GitHub, and the management of those dependencies is automated with the use of Dependabot. The commit history shows there's a significant amount of this work happened and without issue.

Expected release and support cycles

Releases are infrequent but they consistently have occurred at least once every couple of months throughout the current year (2020). Release notes however are a little inconsistent - as some lack detail.

Code quality

`shepherd` features the use of many open source static analysis tools in its workflow and uses CI as part of development workflow. With the security measures and tools in place to secure the analysis of the code quality and security - not limited to maintainability rating scores and code coverage tests. `shepherd` appears to be a very good library if it's fit for purpose.

larowlan’s picture

bnjmnm’s picture

Status: Needs work » Needs review
StatusFileSize
new384.22 KB
new384.65 KB

This

  • Rerolls
  • Addresses #55 and other similar styling issues that I identified while fixing that one
  • Updated to latest version of Shepherd
  • Adjusted the config so arrows don't overlap with the element they are tethered to.
  • Confirmed the accessibility is significantly better than Joyride. The modal receives focus on activation, the tour can be navigated via keyboard, and the close/next controls correctly use a <button> element instead of <a>. I'd want to spend a bit more time with it before granting an accessibility signoff, but this is promising.
nod_’s picture

Status: Needs review » Needs work

That looks great! love the highlight of the element. Just a few details:

  1. +++ b/core/modules/tour/js/tour.es6.js
    @@ -25,10 +25,12 @@
    +      Array.prototype.forEach.call(
    +        context.querySelectorAll('body:not(.js-tour)'),
    

    We have a polyfill for that core/drupal.nodelist.foreach, also feels like a no-jquery once? if that's the case I wouldn't change it here at the moment.

  2. +++ b/core/modules/tour/js/tour.es6.js
    @@ -148,26 +154,71 @@
    +            const tour = new Shepherd.Tour({
    

    Can we put the default settings at the top of this file? not a fan of putting a whole bunch of configuration values in the middle of code logic, makes it easier to find as well if people want to change it somehow.

  3. +++ b/core/modules/tour/js/tour.es6.js
    @@ -202,7 +253,7 @@
           _getDocument() {
    -        return $(document);
    +        return document;
    

    do we still need this method?

bnjmnm’s picture

Status: Needs work » Needs review
StatusFileSize
new8.7 KB
new384.5 KB

#61.1 Looks like that was trying to get around using once(), so I agree that should be switched back and taken care of in #3183149: Deprecate jquery.once and use the new once lib

#61.2

Can we put the default settings at the top of this file? not a fan of putting a whole bunch of configuration values in the middle of code logic, makes it easier to find as well if people want to change it somehow.

This could be seen as out of scope as the existing joyride tour accepts config in this manner, but this also seems like a potentially useful non-risky change so I've added it in the initialization of tour's JS settings in \Drupal\tour\TourViewBuilder

#61.3 May technically be out of scope too, but looks like _getDocument() hasn't been needed for ~7 years #2088121: Remove Overlay and seems like a reasonable thing to address as it's incorporated into code blocks we're already refactoring.

xjm’s picture

Title: Reconsider our usage of jQuery Joyride (for tours) » Deprecate and replace jQuery Joyride (for tours)
Parent issue: #3051352: [Plan] Remove unused jQuery UI components and replace with a suite of contrib packages for the continuous upgrade path » #3052002: [meta] Replace JQuery with vanilla Javascript in core
bnjmnm’s picture

Issue tags: -Needs accessibility review
StatusFileSize
new7.84 KB
new384.61 KB
new375.07 KB
new317.79 KB
new412.07 KB

This provides a reroll, addresses several things caught by the new custom commands on DrupalCI, and a few other small fixes.

I also did an accessibility review and compared it against the many accessibility bugs found in the Joyride implementation: #2961001: [META] Improve accessibility of tour module

Here's a list of accessibility issues with the Joyride implementation that are fixed with the Shepherd implementation here:
Joyride accessibilty issues that are fixed here

  • When the toolbar button has keyboard focus, activatig the button makes the tooltip appear, but focus remains on the button. Sighted keyboard user can see the first tip, but effectively cannot advance to the next tip. Focus will move from tour toolbar button to user account link
  • Should move focus to start of dialog
  • For assitive tech, there's no indication that anything has happened. There is an aria-pressed="false", but this DOES NOT CHANGE when pressing it. With screen reader, when you arrive at the button, it says "tour, button, not pressed". Press it, the dialog appears, but focus remains on the toolbar button, and the screen reader says "button, not pressed"
  • We would expect it to announce a "dialog". Actually it has a dialog role, but it isn't announced because focus hasn't moved there. If you use a mouse when running a screen reader, you can hear the dialog being announced.
  • Focus not constrained in dialog
  • No focus style for the tour tip close button.

I tested with browser Zoom and there it's not always ideal at higher magnifications when the tourtip text is longer. This is also a problem with Joyride, but the symptoms are different with Shepherd.
Shepherd: The tip may overlap the content it's highlighting
Scrolling will align it, however

Joyride: the tip may not be fully in view
Similar to Shepherd, scrolling will get these to a good place.

While zoom isn't perfect with Shepherd, it does not appear to be a step down from Joyride.

While Shepherd seems to address all accessibility "bugs" There are still some good suggestions in #2961001: [META] Improve accessibility of tour module, but are better categorized as improvements. That issue should get updated when this one is committed.

nod_’s picture

  1. +++ b/core/modules/tour/js/tour.es6.js
    @@ -122,6 +125,7 @@
    +        this._removeIrrelevantTourItems(this._getTour());
    

    Any reason why this moved from toggle to initialize? I think the idea was that the page can be dynamic and the moment the tour is triggered, some items could have gone missing.

  2. +++ b/core/modules/tour/js/tour.es6.js
    @@ -148,26 +152,49 @@
    +            $tour.forEach((step) => {
    

    here $tour is the settings right? should be tourSettings or something.

  3. +++ b/core/modules/tour/js/tour.es6.js
    @@ -148,26 +152,49 @@
    +              if (step['#wrapper_attributes']['data-class']) {
    

    any chances we can use something more meaningful than #wrapper_attribute? it's too render-array-y.

  4. +++ b/core/modules/tour/src/TourViewBuilder.php
    @@ -15,58 +15,79 @@ class TourViewBuilder extends EntityViewBuilder {
    +      $build['#attached']['drupalSettings']['tourShepherdConfig'] = [
    

    Putting that in the PHP could be good, what I meant was to put that at the top of the tour.es6.js file, so that it's not mixed with the initialization logic.
    I don't think there is a lot of value to make it go through drupalSettings.

  5. +++ b/core/modules/tour/tests/src/Functional/TourTest.php
    @@ -75,33 +75,57 @@ public function testTourFunctionality() {
    +    $tips = $this->getTourTips();
    ...
    +    $elements = $this->findTip($tips, [
    

    with this we're not using the DOM anymore to check for elements, it's only checking that a value is in an array.

    I'm ok with it, just that the test is very different.

bnjmnm’s picture

StatusFileSize
new13.54 KB
new384.83 KB

#65.1

Any reason why this moved from toggle to initialize? I think the idea was that the page can be dynamic and the moment the tour is triggered, some items could have gone missing.

It looks like it was removed from toggle in #24 and I'm not sure why. I agree with the reasoning that this should be in toggle, so I've returned it there.

#65.2
Improved the variable naming

#65.3 This has been changed as the use of #wrapper_attributes was for joyride, which required an already-rendered HTML list. After making these changes I realized it may be a BC break as custom/contrib may be attempting to override this property. I'm leaving the changes in for now as this will likely require some discussion and that will make the discussion easier. The tour is not rendered as an HTML list, so there are some definite differences already occurring. I find @lauriii is quite helpful when I'm trying to figure out acceptable levels of BC changes

#65.4

I don't think there is a lot of value to make it go through drupalSettings.

My thought is that the tour items are already configured via tourSettings, so it would be structurally consistent to approach global tour config the same way. It's not a particularly strong opinion, though.

#65.5
These tests were added well before I started working on the issue, but the comment motivated me to look at the tests a little closer. My takeaway is similar, it's quite different but the changes seem like a good way to adjust to the new library. It's quite possible tests written from scratch would be structured quite differently, but I'm glad so much of the existing test code still works.

bnjmnm’s picture

StatusFileSize
new999 bytes
new384.82 KB

Fixing a stray keystroke that got into the patch in #66

Status: Needs review » Needs work

The last submitted patch, 67: 3051766-67.patch, failed testing. View results

bnjmnm’s picture

Status: Needs work » Needs review
StatusFileSize
new853 bytes
new384.63 KB

#67 addressed an issue that allowed tests to run, and once the tests run there were failures due to #wrapper-attributes being removed since tips are no longer a render array. This suggests it may be necessary to keep that property for BC purposes. I'll look into that further.

lauriii’s picture

Status: Needs review » Needs work
Issue tags: +Needs frontend framework manager review
  1. +++ b/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
    @@ -120,9 +120,11 @@ public function getAttributes() {
    -    return ['#markup' => $output];
    ...
    +      'title' => Html::escape($this->getLabel()),
    +      'body' => $this->token->replace($this->getBody()),
    +      'location' => $this->getLocation(),
    

    We should update docs in Drupal\tour\TipPluginInterface given that the expected return value has changed. However, the fact that we have to make changes to an interface points out that this is a BC breaking change.

    Given that the name of the method name is ::getOutput, it seems that it would be better to split this method into three different methods for each of the array items (to not have to deal with arrays). I'm not sure what to do with the current method given that it would have to be deprecated.

  2. +++ b/core/modules/tour/src/Plugin/tour/tip/TipPluginText.php
    @@ -120,9 +120,11 @@ public function getAttributes() {
    +      'title' => Html::escape($this->getLabel()),
    +      'body' => $this->token->replace($this->getBody()),
    +      'location' => $this->getLocation(),
    
    +++ b/core/modules/tour/tests/src/Functional/TourTestBase.php
    @@ -33,13 +33,14 @@ abstract class TourTestBase extends BrowserTestBase {
    -      // Tips are rendered as <li> elements inside <ol id="tour">.
    ...
    +      // Tips are rendered as drupalSettings values.
    

    Adding a reminder for myself to check all of the potential impacts of this change later.

  3. +++ b/core/themes/seven/css/components/tour.theme.css
    --- a/core/themes/stable/css/tour/tour.module.css
    +++ b/core/themes/stable/css/tour/tour.module.css
    

    The fact that we have to make this many changes in Stable suggests that this patch is introducing BC breaking changes for markup. Is there way for us to revert those changes in Stable?

bnjmnm’s picture

Regarding the TipPlugin BC concerns from #70 #70, I've thought of a potential approach.

Given that:
Tip Plugins extend TipPluginBase.
TipPluginBase implements TipPluginInterface

  1. Deprecate the joyride-specific getOutput() method in TipPluginInterface.
  2. Create a TipPluginShepardCompatibleInterface with new Shepard-specific methods. This interface would be implemented by individual plugin definitions, not TipPluginBase
  3. The tour module's one Tip plugin, TipPluginText, would implement TipPluginShepardCompatibleInterface
  4. TourViewBuilder would build tips differently if the tip was instanceof TipPluginShepardCompatibleInterface
  5. In Drupal 10, TipPluginBase would implement The TipPluginShepardCompatibleInterface in addition to TipPluginInterface
larowlan’s picture

I think #71 sounds like a great approach, but note we have the 1:1 rule here, so we could do 5 now, with a best-intentions approach by putting 4 inside the base plugin as a bridge

bnjmnm’s picture

StatusFileSize
new413.57 KB
new42.08 KB

@tim.plunkett suggested adding a new getConfiguration() method to TipPluginBase that defaults to returning null. Then the checks for old/new plugin can be made based on what getConfiguration() returns. That is the approach in this patch.

This patch also added shims to Stable that rebuild the markup to match Joyride. Accomplishing this is different depending on whether the TipPlugin uses getOutput()
or getConfiguration(). Tests were added to confirm both scenarios result in the same markup that Joyride would have been provided.

Some of the remaining tasks (assuming the approach is sound)

  • JS can probably be cleaned up
  • Any changes to Stable also need to go into Stable 9
  • Needs more comments
  • Deprecations haven't been added yet
anmolgoyal74’s picture

StatusFileSize
new413.54 KB
new795 bytes

Fixed CS issues.

lauriii’s picture

  1. +++ b/core/modules/tour/src/TipPluginBase.php
    @@ -79,4 +79,14 @@ public function set($key, $value) {
    +   * @return array|null
    ...
    +  public function getConfiguration() : ?array {
    

    For better DX, instead of returning an array, we could split this into multiple methods.

  2. If the interface doesn't contain ::getOutput method in Drupal 10, people writing code using Drupal 10 could end up writing code incompatible with Drupal 9 LTS because the interface in Drupal 9 would still require ::getOutput. It's also not ideal to leave classes with stale ::getOutput methods which would have to be cleaned up at a later point when Drupal 9 is not supported anymore.

    Solution for this would be to deprecate Drupal\tour\TipPluginInterface as a whole, and replace with a new interface. If we also created a new base class for the new interface, Drupal\tour\TipPluginBase we wouldn't have the problem with stale ::getOutput methods getting left in the code base. Then we would check in Drupal\tour\TourViewBuilder::viewMultiple which interface the plugin is implementing as proposed in #71. This way also any code written in Drupal 10 would be compatible with Drupal 9 LTS because it would include the new interface.

bnjmnm’s picture

Status: Needs work » Needs review
StatusFileSize
new62.8 KB
new448.58 KB

This goes with the direction in #75 and the result is a chunky 62k interdiff. Some of the 62k is copying the Tour JS from Stable to Stable 9, but that's certainly not all of it.

Also tried to expand the docs+comments to make this increasingly large patch (even without the Shepherd library) reviewable.

bnjmnm’s picture

Still needs review from someone that didn't write the past several patches, but spotted these two things in my own patch:

  1. +++ b/core/modules/tour/js/tour.es6.js
    @@ -147,27 +150,64 @@
    +                  `<p>${step.body}</p><div class="tour-progress tp-js">${step.counter}</div>`,
    

    tp-js class is not neccessary

  2. +++ b/core/modules/tour/tests/src/Functional/Update/TourTipSelectorConfigUpdateTest.php
    @@ -0,0 +1,62 @@
    +      __DIR__ . '/../../../../../system/tests/fixtures/update/drupal-8.8.0.bare.standard.php.gz',
    

    A 9.0.0 fixture was just added to core, probably best to switch to that.

lauriii’s picture

  1. +++ b/core/modules/tour/src/TourTipPluginBase.php
    @@ -0,0 +1,189 @@
    +abstract class TourTipPluginBase extends PluginBase implements TipPluginInterface, TourTipPluginInterface {
    

    I'm fine with prepending tour to the class names but I wanted to mention that Shepherd is calling these as steps. I'm wondering if it would make sense for us to rename Tips to Steps?

  2. +++ b/core/modules/tour/src/TourTipPluginBase.php
    @@ -0,0 +1,189 @@
    +  public function getAttributes() {
    +    return $this->get('attributes') ?: [];
    +  }
    ...
    +  final public function getOutput() {
    ...
    +    return [];
    +  }
    

    Why do we allow using attributes with the new abstract class but not output?

  3. +++ b/core/modules/tour/src/TourTipPluginBase.php
    @@ -0,0 +1,189 @@
    +   * options. Accepted values: 'auto', 'auto-start', 'auto-end', 'top',
    +   * 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'right',
    +   * 'right-start', 'right-end', 'left', 'left-start', 'left-end'.
    ...
    +    return $this->get('location');
    

    Should we add an assert that checks if a valid location has been defined?

  4. +++ b/core/modules/tour/src/TourTipPluginInterface.php
    @@ -67,11 +59,32 @@ public function get($key);
    +   * @return string
    +   *   The body content of the tooltip.
    +   */
    +  public function getBody();
    

    Is there a particular reason we want this method to return a string rather than render array? That seems like better DX because it would rely on pre-existing XSS handling in render arrays.

  5. +++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
    @@ -137,6 +137,10 @@ public static function getSkippedDeprecations() {
    +      // @todo remove the Tour related items below in https://drupal.org/node/3195823
    

    Is there a particular reason for handling these in a follow-up rather than on this issue?

bnjmnm’s picture

StatusFileSize
new486.95 KB

This covers #78, and I confirmed that the deprecated properties I planned to change in #3195823: [PP-1] refactor all tours to not use deprecated code/properties should happen here as it's policy to not have core code use anything deprecated, so this patch now has many new changes to existing tours.

I've run into one snag with this, specific to the deprecated schema properties. I have a test, TourLegacyMarkupTest, that runs a tour that uses these deprecated properties. If I create the tour with a file in config/install DefaultConfigTest, which tests EVERY config in core (tests included) will fail with a deprecation error. I attempted to work around this by removing the tour with deprecated properties from config/install and manually adding it in the test.

 public function setUp(): void {
    parent::setUp();

    // Manually install a tour using legacy properties. If this config is
    // located in config/install there will be deprecation errors in
    // DefaultConfigTest will re
    $config_path = drupal_get_path('module', 'tour') . '/tests/fixtures/legacy_config';
    $source = new FileStorage($config_path);
    $config_storage = \Drupal::service('config.storage');
    $this->assertTrue($source->exists('tour.tour.tour-test-legacy'));
    $config_storage->write('tour.tour.tour-test-legacy', $source->read('tour.tour.tour-test-legacy'));
    drupal_flush_all_caches();
}

I've confirmed the config is added to the database, but the tour that should accompany the page still doesn't load. This is why TourLegacyMarkupTest is failing in the attached patch. Hopefully there is an obvious fix I'm overlooking.

Status: Needs review » Needs work

The last submitted patch, 79: 3051766-79-this-will-fail.patch, failed testing. View results

bnjmnm’s picture

Status: Needs work » Needs review

Setting this to needs review. The failing test flipped it to Needs Work, but that was an expected fail and a review/help with #79 is welcome.

Version: 9.2.x-dev » 9.3.x-dev

Drupal 9.2.0-alpha1 will be released the week of May 3, 2021, which means new developments and disruptive changes should now be targeted for the 9.3.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

tim.plunkett’s picture

Hiding old patch files now that this issue has an MR

voleger’s picture

Needs rebase against 9.3.x branch. The target branch of MR also requires to be updated to 9.3.x.

lauriii’s picture

Discussed with @alexpott about the changes to the plugins. We talked about various potential approaches, and tried to find one that would be least disruptive to site maintainers, as well as module authors.

Because Drupal\tour\TourInterface::getTip() has a return signature of \Drupal\tour\TipPluginInterface, replacing the interface with another is a bit tricky. Therefore, we thought it would be better to deprecated individual methods from the interface rather than the whole interface. This can be done by adding @deprecated to the method documentation.

New interface is needed for the new methods that we want to add. We should create a new interface that extends \Drupal\tour\TipPluginInterface. Now that the interface is not deprecated, we don’t necessarily need a new base class. Instead of the base class implementing the new interface, we should add a check in the __constructor for whether the class is implementing the new interface, and throw a deprecation error in the cases where it doesn’t. The action that we expect plugin implementation to take is to continue extending the base class, and make the plugin implementation implement the new interface.

We should add empty methods to the base class for deprecated methods in \Drupal\tour\TipPluginInterface that trigger warnings for any code calling them, and returns empty values that are compatible with the signatures defined in the interface. Instead of deprecation errors, the functions should use trigger_error() with E_USER_WARNING severity to make sure that the errors are logged, since the empty values would lead into some functionality rendered unusable.

To avoid the error from being triggered, we should try to find a way to implement BC layers in the core plugin implementations. However, even those functions should call the base class function for the warning to be triggered.

D10 Only (prior to major release)

  1. Move the new interface methods upstream to TipPluginInterface. This is allowed because we added the check to the constructor and in D9 you'll get a deprecation warning if you tip plugin doesn't implement the new interface.
  2. Remove the deprecated methods and any implementations of them.
  3. Consider changing plugins to implement TipPluginInterface only.

D10 Follow-up

  1. Deprecate the "new interface" which at this point will be empty but extending TipPluginInterface.

D11 Only (prior to major release)

  1. Remove the new interface.
bnjmnm’s picture

#88 makes sense. I have one concern regarding how to best warn plugins that use getOutput() instead of getBody() / getTitle()
(as a list just to separate points for readability)

  • getOutput() is a requirement of TipPluginInterface
  • TipPluginBase, implements TipPluginInterface, but it's and abstract class and leaves it up to the classes that extend it to implement getOutput()
  • Triggering an error from a TipPluginBase implmentation of getOutput() would never be triggered, as all plugins at the moment must implement their own getOutput(), and there's no parent method to call
  • getOutput() is the method that would most benefit from having E_USER_WARNING severity warning trigger, but custom Tip plugins extending TipPluginInterface won't get this warning (Plugins that extend existing tip plugins such as the one in tour_ui will work)
tim.plunkett’s picture

This might be a really bad idea, but could we in __construct() call $this->getOutput() and emit a warning if it is non-empty?

bnjmnm’s picture

Issue summary: View changes
tim.plunkett’s picture

Noticing this in test runs:

  8x: The tour.tip 'location' config schema property is deprecated in drupal:9.2.0 and is removed from drupal:10.0.0. Instead use 'position' with the opposite value of 'location' (top becomes bottom, left becomes right, and vice-versa). See https://www.drupal.org/node/3204093
    4x in TourTest::testTourFunctionality from Drupal\Tests\tour\Functional
    4x in TourTest::testTips from Drupal\Tests\tour\Functional

  6x: Tip plugins implementing Drupal\tour\TipPluginInterface that don't also implement Drupal\tour\TourTipPluginInterface are deprecated in drupal:9.2.0. See https://www.drupal.org/node/3204096
    3x in TourTest::testTourFunctionality from Drupal\Tests\tour\Functional
    3x in TourTest::testTips from Drupal\Tests\tour\Functional
zrpnr’s picture

Issue summary: View changes
StatusFileSize
new34.4 KB
new34.93 KB
new17.05 KB
new16.98 KB
new20.24 KB

I manually tested Shepherd vs Joyride using the Views tour, the Example tour from examples module and the overview and tour edit pages from the Tour UI module.

Shepherd is visually an improvement, the default modal and highlighting are nice.
With a window resize Shepherd is able to re-orient itself while Joyride cancels entirely.

The "next" button maintains focus on each step, unlike joyride, which make it more accessible.

The main changes in core/modules/tour/js/tour.es6.js are related to how joyride gets the steps from markup on the page while shepherd loads an object stored in drupalSettings.
Shepherd's approach simplifies adding and filtering the steps in toggleTour and _removeIrrelevantTourItems.

Adding a query string ?tour=anything to any page with a tour works for autostarting the tour.
The class name filter just needs a change to the property name, class --> classes, I added a suggestion in the issue fork. With that change it works as well.

This file also checks for convertToJoyrideMarkup to convert the markup for any themes that use stable or stable9 as a base theme.

This is needed for BC, so any themes based on stable or stable9 that style a tour don't have changes to markup.
The markup is similar, but when converted to joyride the <header>, body div, and <footer> elements are removed, the <h3> replaced with <h2>. All the joyride classes are present and on the correct elements, plus the added shepherd classes.

I noticed that in joyride, the <h2> has an id that corresponds to the step tour-tip-first-item-label and the body has an id like tour-tip-first-item-contents. This increments first, second, third etc. In the converted shepherd markup the ids are generated with a uuid like step-0f62c302-ee2e-4d56-9a4f-5f12e4f4e6a9-label. Not sure how important it is to match the ids, it also seems like these are internal for Shepherd.

The javascript and css in stable are identical to stable9.

All the tour.tour yml files were updated, I didn't find any occurrences of attributes, data-id, data-class or location in any files except for where they are supposed to still be in:

  • core/modules/tour/tests/tour_legacy_test/config/install/tour.tour.tour-test-legacy-location.yml
  • core/modules/tour/tests/fixtures/legacy_config/tour.tour.tour-test-legacy-location.yml

The docs page at https://www.drupal.org/docs/8/api/tour-api/overview will need to be updated after this lands.

Attached side by side screenshots for each theme I tested, Claro, Seven, Bartik, test theme based on stable, and wild west (not based on stable).

zrpnr’s picture

The latest changes: https://git.drupalcode.org/project/drupal/-/merge_requests/400/diffs?dif...

  • Update variable name for "step" to be more clearly separate from a Shepherd Step
  • Improve jsDoc comments, add additional helpful explanation of properties and where they come from
  • Fix "classes" property name bug mentioned in #93, adding ?tips=some-class-name now works!

I didn't look at the hook update changes, but the javascript changes look good!

alexpott made their first commit to this issue’s fork.

zrpnr’s picture

Looks like @bnjmnm addressed all of @lauriii 's comments, I wasn't able to mark them resolved but I commented when I checked each change.
I made a small change to match formatting and comment in tour.es6.js between stable and stable9, and fixed the casing in TourJavascriptTest.

alexpott’s picture

Re adding to the skippedDeprecations - we shouldn't be adding to that. As per the UpdatePathTestBase documentation ALL update path tests should be in the legacy group...

 * - Ensure that the test is in the legacy group. Tests can have multiple
 *   groups.
lauriii’s picture

zrpnr’s picture

Issue summary: View changes
Issue tags: +Needs release manager review

Dependency evaluation in #58, the IS link didn't go anywhere.
Updated the IS and tagging needs release manager review

zrpnr’s picture

Issue summary: View changes
catch’s picture

The dependency evaluation looks great.

Change records: https://www.drupal.org/node/3204096 - this still needs a description.

https://www.drupal.org/node/3195234 and https://www.drupal.org/node/3204093 - both of these are very clear.

Left a couple of comments on the PR. Can't usefully review the js, but it looks like the bc layer is pretty comprehensive.

Untagging for release manager review - looks good to go with the minor points above.

tim.plunkett’s picture

Updated CR per #101: https://www.drupal.org/node/3204096
Updated IS to include API changes and Data model changes section.

zrpnr’s picture

Issue summary: View changes

added a release note

zrpnr’s picture

Issue summary: View changes
tim.plunkett’s picture

Issue summary: View changes
Status: Needs review » Reviewed & tested by the community
Issue tags: -Needs release note

I think that's everything taken care of! Marking this RTBC, thanks.

zrpnr’s picture

Issue summary: View changes

Heard back from Shepherd maintainer about the dependency evaluation, updated the IS with a link.

lauriii’s picture

Went through all recent commits and all of the changes looked good 👌

  • catch committed 9630f29 on 9.3.x
    Issue #3051766 by bnjmnm, alexpott, Oleksiy, finnsky, zrpnr, jungle, Wim...

  • catch committed 202aa37 on 9.2.x
    Issue #3051766 by bnjmnm, alexpott, Oleksiy, finnsky, zrpnr, jungle, Wim...
catch’s picture

Version: 9.3.x-dev » 9.2.x-dev
Status: Reviewed & tested by the community » Fixed
Issue tags: +9.2.0 release notes

OK @lauriii and @alexpott asked me to review this since they didn't feel comfortable committing having both done recent work on the patch.

Did not really do a full review (and can't usefully review JavaScript recently), but found a couple of minor issues (now resolved) and not much else to complain about.

So.. Committed/pushed to 9.3.x and cherry-picked to 9.2.x, thanks!

gábor hojtsy’s picture

Adding to highlights.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.

andypost’s picture

Not clear why 2 change records are not published but have a lot of mentions in code

- https://www.drupal.org/node/3204093
- https://www.drupal.org/node/3195234

Faced in #3261249: Remove deprecated tour.module functions

clemens.tolboom’s picture

I've published the mentioned + 1 CR as D 9.2.0 is long out

- https://www.drupal.org/node/3204096
- https://www.drupal.org/node/3195234
- https://www.drupal.org/node/3204093

@andypost we can do this too ;-)

clemens.tolboom’s picture

Hmmm ... there are more draft CR regarding Tour 28-Jun-2016 between 30-Nov-2021 ... anyone?

See https://www.drupal.org/list-changes/drupal/drafts?keywords_description=tour

andypost’s picture

Maybe we could reopen and repurpose #3261249: Remove deprecated tour.module functions for 9.4.x (property drprecate tour parts)

And use #3195193: Remove Shepherd shim code from Tour to remove the deprecations