LinkedIn Tool

Minor enhancements to LinkedIn. Mostly just hotkeys.

这些是代码更新过的版本。 显示所有版本

  • v5.97 2024-03-04

    Move Scroller assignment from ctor to setter.

    Issue #240.

    Refactor Scroller.#validateInstance().

    Was getting a bit long.

    Issue #241.

    Migrate most modules to use base.Exception.

    Issue #259.

    Update release notes.

    Bump version number.

  • v5.96 2024-02-26

    Use optional chaining with this.#scroller.

    Upcoming changing will make this field optional (e.g., secondary Scrollers).

    Issue #240.

    Use a setter to assign the managed Scroller.

    Issue #240.

    Handle the selectorArray option in Scroller.click().

    Issue #241.

    Add clickConfig to MyNetwork.

    Issue #241.

    Depend on most recent version of lib/base.

    This is to grab the new Exception class.

    Issue #259.

    Update release notes.

    Bump version number.

  • v5.95 2024-02-25

    Expose this.#globals via a getter.

    Issue #240.

    Add validation for clickConfig.

    Issue #241.

    Bump version number.

  • v5.94 2024-02-23

    Stop using name as an identifier as it shadows a global.

    This change addresses local variable.

    Issue #238.

    Implement setter to take the LinkedIn instance.

    Issue #240.

    Acknowledge a number a newly discovered pages.

    Also changed markdown styling for the page names in the comments.

    Issues #244, #255, #256, #257.

    Support an ElementFinder function in Scroller.click().

    Issue #241.

    Initial migration work in Notification for Scroller.click().

    Issue #241.

    Update release notes.

    Bump version number.

  • v5.93 2024-02-19

    JSDoc: Spelling error.

    Consistently name items using navbar rather than navBar.

    Issue #240.

    Add a feature flag for using the new Scroller.click() method.

    Issue #241.

    Bump version number.

  • v5.92 2024-02-18

    Rename self to myself to avoid shadowing a global.

    Issue #238.

    Rename ScrollerService to LinkedInScrollerService.

    Alas, it will no longer be generic.

    Issue #240.

    If no current item, simply click activeElement.

    Issue #241.

    Bump version number.

  • v5.91 2024-02-16

    Migrate to using Service() from lib/base.

    Issue #167.

    Wrap Scroller.name in double quotes in the bug message.

    Makes it a little bit easier to read. E.g., for "Events events" was...

    Issue #241.

    Support the Your events collection.

    Issue #236.

    Implement Share current event.

    Issue #236.

    Acknowledge My Network Events page.

    Issue #253.

    JSDoc: Add missing word.

    Make a log statement a bit more precise.

    Issue #240.

    Fire a resize event each time the navbar changes size.

    Issue #240.

    Update release notes.

    Bump version number.

  • v5.90 2024-02-14

    Bump version of lib/base.js being used.

    This will expose the version of Service there.

    Issue #167.

    Implement n/p secondary navigation within collections.

    Issue #236.

    Use the logger from the Scroller instead of the global logger.

    Stop using event as a local name as it shadows a global.

    Issue #238.

    Fix typo in comment.

    Allow changing top/bottom margins in Scroller.

    We now know that the values sometimes need to change after being initialized.

    Issue #240.

    Add exception list for bugging about unsupported pages.

    Issue #244.

    Post error if Scroller.click() called without being configured.

    Issue #241.

    Update release notes.

    Bump version number.

  • v5.89 2024-02-12

    Migrate primary Scroller setup to base class.

    Issue #234.

    Support primary navigation.

    Issue #236.

    eslint: Rename a local variable that shadows a browser global.

    Issue #238.

    Migrate Service to lib/base.

    Issue #167.

    Define a clickConfig property for Scroller.

    Issue #241.

    TIL: Array.from() takes a mapping function.

    Expose a shallow copy of the current active Pages.

    Issue #244.

    Notify via an error condition whenever an unknown page is visited.

    Issue #244.

    Rework My Network to use the terms collection and individual.

    Individual is not quite right either, since it could be a person, group, event, etc. But, they are not always *card*s, either.

    Issue #245.

    Update release notes.

    Bump version number.

  • v5.88 2024-02-08

    White space around logging intro/outro.

    Fix spelling of property and remove some logging.

    Initial Events support.

    Does nothing more than exist.

    Issue #236.

    Fix two cases where a global was accidentally being used.

    Issue #238.

    Stop logging what each mutation record type is.

    It does not matter at this point, and nothing is being done with that information.

    Issue #239.

    Stow away a pointer to the actual current item element.

    Amusingly, this is how Scroller initially worked before changing to item ids.

    Issue #239.

    Add a monitor to Scroller for the current item staying connected.

    We can capture more state if we see it in other places.

    Issue #239.

    Simple variable rename.

    Issue #240.

    Attach a ResizeObserver to the global nav bar.

    First step in plumbing through detecting changes.

    Issue #240.

    Skeleton for new Scroller.click() method.

    Issue #241.

    Wait for the For Business menu item to show up.

    Identified by the --divider subclass, on some pages, this item gets added later. Actually, the entire navbar content gets rebuilt, causing us to have to reconnect the LIT menu button.

    If this pans out, we can make it the official item, simplifying this code.

    Issue #242.

    Normalize vertical white space around logging {intro,outro}s.

    Closes #243.

    Update release notes.

    Bump version number.

  • v5.87 2024-02-02

    JSDoc: Simplify the Page subclass constructor.

    Start refactoring constructor().

    Issue #234.

    Bump version number.

  • v5.86 2024-01-31

    Minor tweaks to comments.

    Hoist allowReactivation() to base class.

    Closes #228.

    Initial refactoring of the InvitationManager* classes.

    The idea seems to work. Some details will be tricky due to how #private variables work in JavaScript, but those can be worked around.

    Issue #234.

    Bump version number.

  • v5.85 2024-01-29

    Implement Withdrawn invitiation.

    Issue #233.

    Update release notes.

    Bump version number.

  • v5.84 2024-01-27

    Fine tune the pageReadySelector.

    Issue #157.

    Enable reactivation of active pages when revisiting the same page.

    Not experienced any drawbacks. Does not seem to work all the time, but those are likely Page specific issues to be investigated.

    Issue #218.

    Additional tweaks after renaming InvitationManagerReceivedInvites.

    Issue #233.

    Handle the Sent Invites page.

    Essentially a direct copy of the Received Invites page with a number of shortcuts removed that do not make sense in this context.

    Issue #233.

    Update release notes.

    Bump version number.

  • v5.83 2024-01-24

    Invites no longer have menu items.

    Tweak selector to work on both Received/Sent invites.

    Issue #157.

    Rename InvitationManager to InvitationManagerReceivedInvites.

    Issue #233.

    White space around logging intro/outro.

    Migrate InvitationManagerReceivedInvites to containerItems.

    This allows removal of a bunch of custom code.

    Closes #176.

    Bump version number.

  • v5.82 2024-01-21

    Implement l to focus on the tab list.

    Issue #157.

    JSDoc: Update to reflect new approach for impelmenting Services.

    Issue #227.

    Implement J/K for toggle/navigate combo in JobCollections.

    Closes #231.

    Simplify Feed.nextPostPlus() based learning from JobCollections.

    Additional logging about 'focus' events.

    Issue #232.

    Create new Scroller.focus() method.

    This combines shine() and show(), often called together, along with the actual setting of the focus.

    This does not work yet, as after calling this, something resets the focused element back to document.body.

    Issue #232.

    Update release notes.

    Bump version number.

  • v5.81 2024-01-17

    Migrate LinkedInToolbarService from inheritance to messaging.

    Issue #227.

    Add feature flag enableScrollerChangesFocus.

    Not connected to anything yet.

    Issue #232.

    Update release notes.

    Bump version number.

  • v5.80 2024-01-14

    Move the URL monitoring into a click handler.

    Since #gotoNavLink() calls click() this handles both key stroke navigation and old-fashioned clicking with the mouse.

    Issue #218.

    Migrate VMKeyboardService from inheritance to messaging.

    Issue #227.

    Expose Scroller.name.

    Issue #230.

    Bump library versions.

    Really only need lib/base, to pick up the Logger stack trace fix, but might as well bump lib/widget while in here.

    Issue #226.

    Disable reactivation on the details Scroller.

    Because the other Scrollers were disabled, the details one always gets to be set as the #lastScroller. So the first/last actions always worked on it rather than the job cards.

    Closes #230.

    Update release notes.

    Bump version number.

  • v5.79 2024-01-11

    Migrate ScrollerService from inheritance to messaging.

    Issue #227.

    The HTML on the Jobs page changed, so tweaks in response.

    Closes #229.

    Update release notes.

    Bump version number.

  • v5.78 2024-01-09

    Implement Next/Previous/change for pagination navigation.

    Issue #209.

    Rearrange how saved options are loaded.

    Not sure why, but the previous arrangement was not working well.

    Factor out listing the names of active pages.

    Method is getting a little long.

    Issue #218.

    Add temp option to control reactiving currently active pages.

    Issue #218.

    Migrate Service from abstract methods to dispatching.

    Also, tests.

    Issue #227.

    Update release notes.

    Bump version number.

  • v5.77 2024-01-07

    Basic navigation.

    Issue #209.

    Tweak a logging statement.

    Modify ScrollerService to make reactivation optional.

    Issue #218.

    Tune some ScrollerServices to disable reactivation (if active).

    Issue #218.

    Update release notes.

    Bump version number.

  • v5.76 2024-01-06

    Initial SearchResultsPeople support.

    Does nothing but exist.

    Issue #209.

    Improve quality of a random debug logging statement.

    Promote gentlyScrollIntoView() to a full fledged method.

    Need to add more logging and that was going to make #scrollToCurrentItem() too long.

    Issue #218.

    Update release notes.

    Bump version number.

  • v5.75 2024-01-05

    Additional logging in JobCollections.

    Issue #218.

    Bump version number.

  • v5.74 2024-01-04

    Implement Apply, Follow, and Save features.

    Issue #160.

    Update release notes.

    Bump version number.

  • v5.73 2024-01-03

    Update the names for JobCollections Scrollers.

    Tune the pageReadySelector.

    Found a job view where the initial value was not sufficient. Likely no harm in going with both initial candidate selectors.

    Issue #160.

    Implement m to show more/less details.

    At least one cosmetic issue, but not unique to this page.

    Issue #160.

    Call SPA.activate() when the URL does not change.

    Due to how activate() is current written, this is a no-op.

    Issue #218.

    Update release notes.

    Bump version number.

  • v5.72 2024-01-02

    Update release notes.

    Implement n/p for navigating inside some cards.

    Not many options really, just More jobs.

    Issue #160.

    Update release notes.

    Bump version number.

  • v5.71 2024-01-01

    Call getBoundingClientRect() again after (maybe) scrolling.

    It turns out that the result of item.getBoundingClientRect() is not a live object, so after scrolling the bottom of the item into view, we need to refetch the value to see if the top went out of view.

    Adding this one line pushed the length of the method over the configured limit, so also moved this else condition into a separate nested function.

    Since doing that, also rid of the single property destructuring assignment const {item} = this; and replaced it with a traditional assignment of const item = this.item.

    Closes #225.

    Use latest version of lib/web.

    Issue #221.

    Additional monitoring for Global.gotoNavLink().

    Now track and indicate whether the URL actually changed.

    Also switched from otrot2() to otmot() as it will allow us to exit the function sooner if a change is detected.

    Issue #218.

    Additional logging in SPA.activate().

    Issue #218.

    Bump version number.

  • v5.70 2023-12-31

    Implement basic navigation.

    Issue #160.

    Update release notes.

    Bump version number.

  • v5.69 2023-12-30

    Bump all library versions to the latest one.

    Most of these are releases with just additional/updated testing. We really only need lib/web, but makes sense to update all of them at once.

    Issue #221.

    Additional logging in Page.activate().

    Issue #218.

    Factor out common code into a new LinkedInToolbarService class.

    Closes #224.

    Bump version number.

  • v5.68 2023-12-29

    Initial JobView support.

    Does nothing but exist.

    Did notice a pattern similar to what happens with Profile, so will factor that out in a bit.

    Issue #160.

    Update release notes.

    Bump version number.

  • v5.67 2023-12-27

    Include the height of the toolbar in the Scroller margins.

    Issue #156.

    Implement n/p for scrolling through job details.

    Issue #169.

    Bump to latest lib/web release to grab refactored otmot().

    Issue #221.

    Mix in the notification URL to dedupe when text is identical.

    Closes #222.

    Update how the menu is found in Feed.

    Closes #223.

    Update release notes.

    Bump version number.

  • v5.66 2023-12-26

    Move Scroller fixups into a local Service class.

    Most pages do fixups upon app initialization. However, Profile needs to do some extra work with information that is only available after this page has been visited at least once. So defer it until that initial activation.

    Note that it does not yet do that extra work. This is just prep.

    Issue #156.

    Fine-tune the CSS selector for the details pane.

    Issue #169.

    Re-add the LIT menu item if it disappears.

    Sometimes the global nav menu items get rebuilt shortly after we add our custom item.

    Now we monitor the nav list, and if it changes, we re-add ours if necessary.

    Closes #220.

    Update release notes.

    Bump version number.

  • v5.65 2023-12-24

    Move initial primary Scroller creation into the getter.

    Issue #156.

    Switch results page selection to N/P.

    This frees up n/p for use inside the details pane. This will make it consistent with how Messaging is handled.

    Issue #169.

    Add some additional monitoring to Global.#gotoNavLink().

    Issue #218.

    Update release notes.

    Bump version number.

  • v5.64 2023-12-23

    Do fixups on Profile.#entriesHow.

    Issue #156.

    Add some initial logging to some navigation methods.

    Issue #218.

    Bump version number.

  • v5.63 2023-12-21

    Update MyNetwork to the new layout.

    Hopefully this is already rolled out completely and will not be rolled back again.

    While at it, may the cards uid function use anchor hrefs instead of the whole innerText if available.

    Closes #219.

    Update release notes.

  • v5.62 2023-12-21

    Implement Edit for the current section.

    Issue #156.

    Migrate a couple of static methods to instance methods.

    Issue #218.

    Update release notes.

    Bump version number.

  • v5.61 2023-12-19

    Implement m to view more (or Show all...) for the current item.

    Issue #156.

    Switch from local constant to one from lib/base.

    The other one this time.

    Closes #216.

    Update release notes.

    Bump version number.

  • v5.60 2023-12-17

    Have #isItemViewable() explicitly return a Boolean.

    Also, log this fact during getItems post processing.

    Previously, it would return a truthy value of the height in pixels, while, valid code wise, was difficult to pick out in the logs.

    Issue #208.

    Implement next/previous for entries inside a section.

    Different sections have different layouts, so need a few different selectors to figure them out. Would not be surprised if a few are missed.

    Sections that have tab panels inside of them (currently know about Interests and Recommendations) are triggering a known issue with Scroller not wrapping. Fortunately, in practical use, not a big deal, however, it does give us a good test bed to find a fix.

    Issue #156, #208.

    Filter out non-viewable items before scrolling by N.

    This allows removing the skipping non-viewable loop completely.

    Issue #208.

    Update release notes.

    Bump version number.

  • v5.59 2023-12-16

    Basic navigation keys.

    Issue #156.

    Update release notes.

    Bump version number.

  • v5.58 2023-12-14

    Initial support for the Profile view.

    Does nothing more than exists.

    Issue #156.

    Update release notes.

    Bump version number.

  • v5.57 2023-12-12

    Implement S to toggle the star on a conversation.

    Issue #144.

    Update release notes.

    Bump version number.

  • v5.56 2023-12-11

    Implement = to open the nearest menu.

    Issue #144.

    Remove now unused method, dumpInfoAboutElement.

    Issue #205.

    Update release notes.

    Bump version number.

  • v5.55 2023-12-10

    Migrate uses of SPA.dumpInfoAboutElement() to promoted version.

    Issue #205.

    Switch from local constant to one from lib/base.

    Issue #216.

    Bump version number.

  • v5.54 2023-12-09

    Add descriptive text to the assertEqual() in a loop.

    Issue #215.

    Update to most recent release of all libraries.

    We base and web some upcoming changes.

    Issue #205.

    Normalize how Shortcuts are formatted.

    This change covers Messaging and Notifications.

    Closes #213.

    Bump version number.

  • v5.53 2023-12-08

    Promote SPA.dumpInfoAboutElement() to lib/web.js.

    Issue #205.

    Make how often fake error messages show up on page load a tunable.

    Closes #217.

    Normalize how Shortcuts are formatted.

    This change is Jobs and JobCollections.

    Issue #213.

    Bump version number.

  • v5.52 2023-12-05

    Promote ONE_ITEM to a global constant.

    Issue #216.

    Update the Shortcut example to match the new recommendation.

    Issue #213.

    Normalize how Shortcuts are formatted.

    This change is MyNetwork and InvitationManager.

    Issue #213.

    Bump version number.

  • v5.51 2023-12-04

    Implement next/previous message for conversation pane.

    Issue #144.

    Remove some resets in Scroller.

    They do not seem to be needed any more.

    Closes #212.

    Normlize how Shortcuts are formatted, mostly in Feed.

    Issue #213.

    JSDoc: Update some references to the new (or correct) location.

    Closes #214.

    Update release notes.

    Bump version number.

  • v5.50 2023-12-03

    Implement moving to the Message box.

    Issue #144.

    Update release notes.

    Bump version number.

  • v5.49 2023-12-02

    Switch monitoring of the message box to a focus event.

    There are cases where the message box will get focus without setting the data-artdeco-is-focused attribute. This might be a bug in LinkedIn, but does not matter. It is not a good signal.

    Also work around a quirk in Scroller that is needed for other containers that constantly rebuild the elements being tracked. This causes a 'change' event for the old item then one for the new item. And that would result in nested event handlers. It turns out if the user navigates at the right pace, an outer handler could be removed, causing them all to be removed (same callback function after all), and then leave the focus in the message box, resulting in random navigation characters showing up. One Page's fix is another Page's problem.

    Issues #144, #212.

    Update release notes.

    Bump version number.

  • v5.48 2023-12-01

    Basic conversation card scrolling.

    Still has a focus problem where, at the beginning, keyboard navigation will cause focus to move to the message box. However, clicking once on a conversation card will prevent that until the site is reloaded. Definitely a problem to be addressed.

    Issue #144.

    Update release notes.

    Bump version number.

  • v5.46 2023-11-28

    Reset the tracking id on duplicate items.

    This helps with, but does not solve, the issue with duplicate items in a Scroller.

    Issue #204.

    Make use of the new TestCase.assertNoRaises() method.

    Issue #211.

    Bump version number.

  • v5.47 2023-11-28 Imported from URL
  • v5.46 2023-11-27

    Reset the tracking id on duplicate items.

    This helps with, but does not solve, the issue with duplicate items in a Scroller.

    Issue #204.

    Make use of the new TestCase.assertNoRaises() method.

    Issue #211.

    Bump version number.

  • v5.45 2023-11-26

    Use optional chaining in case the querySelector() fails.

    Retire SPADetails setup issues in favor of NH.base.issues.

    Issue #205.

    Normalize spacing around logger.{entered,leaving}() in Logger.

    This makes it easier to read the code.

    Issues #204, #208.

    Update release notes.

    Bump version number.

  • v5.44 2023-11-25

    Bump all libraries to the current version.

    We only need recent changes to lib/base, but might as well grab everything.

    Issue #205.

    Plug in using NH.base.issues.

    Issue #205.

    Replace logging duplicates to posting to the new issues listener.

    Issue #204.

    Ignore non-viewable items when checking for duplicates.

    For lazily loaded items, they all get the same uid and that stays persistent, even after they are loaded. On the other hand, this did end up stress testing the new issue message queue.

    Issue #204.

    Update release notes.

    Bump version number.

  • v5.43 2023-11-24

    Tweak log message grammar.

    Issue #144.

    Fix typo in selector.

    Amazingly it was working (sometimes), even with the typo.

    Issue #144.

    Reduce calls into Scroller by keeping result in a local variable.

    Issue #144.

    eslint: Explicitly configure newline-per-chained-call and fix-ups.

    Closes #203.

    Log detection of duplicate items in a Scroller.

    Factored out an inner loop to do this, as the surrounding function became too large.

    Issue #204.

    Update release notes.

    Bump version number.

  • v5.42 2023-11-23

    Detect when focus shows up in message box and act accordingly.

    I am not keen on the idea of moving focus back to the current conversation card, but not sure where else to put it.

    Issue #144.

    Update selectors for hide/show job card in JobCollections.

    I guess someone from the Job team moved over to the JobCollections team because now they use similar mark up.

    Closes #206.

    Update release notes.

    Bump version number.

  • v5.41 2023-11-22

    Remove errant log statement.

    Issue #144.

    Move control of the tablist monitor into Scroller activation.

    It turns out that having two services that control the same thing (current item) starting up at the same time is a bit of a pain. It works, but functions are effectively multi-threading and really making the logger upset that groups are exiting in the wrong order. This is purely a cosmetic issue.

    But, since it is easily fixed by this change, which also happens to reduce code size a tiny bit, it is worth doing.

    Issue #144.

    Update release notes.

    Bump version number.

  • v5.40 2023-11-20

    Validate uidCallback.

    This will help with silly mistakes when adding a new Scroller.

    Issue #144.

    Use this.id to ease custom naming in test methods.

    Add Scroller for Messaging view.

    No hotkeys yet, but the basics are here, including finding the active card on both page activate and changing the active Focused/Other tab.

    When a new conversation is selected (and this happens without LIT), the focus immediately moves to the Write a message... text area, which makes navigation tricky. The user would need to a nav-key TAB nav-key TAB sequence to move around.

    Need to review other pages to see if they have a similar problem and if we already have precedence on how to handle this.

    Issue #144.

    Update release notes.

    Bump version number.

  • v5.39 2023-11-19

    Implement moving to the message tablist.

    Issue #144.

    Update release notes.

    Bump version number.

  • v5.38 2023-11-18

    Monitor which messaging tab (Focused/Other) is currently active.

    Issue #144.

    Bump version number.

  • v5.37 2023-11-17

    Bump all libraries to the current version.

    This is also a good time to switch them all to the new URLs Greasy Fork is using.

    Issue #200.

    Update release notes.

    Bump version number.

  • v5.36 2023-11-16

    Enable GM.setValue() and GM.getValue().

    Issue #170.

    Update release notes.

    Bump version number.

  • v5.35 2023-11-14

    Tweak HTML in news content.

    This more closely matches what the markdown on GitHub and Greasy Fork use.

    Update release notes.

    Bump version number.

  • v5.34 2023-11-13

    Support an optional timeout on containers in Scroller.

    Issue #165.

    Switch the paginationScroller to using containeritems.

    The 1 second timeout may need tweaking after experience.

    This had to wait until Scroller supported timeouts in activating container click handlers. Otherwise, it could just wait forever. Not all pages handled by JobCollections will have pagination. It depends on both the page and the number of items that page may serve.

    Closes #177.

    Switch everything over to using the new devmode option.

    Closes #198.

    Remove old comment.

    Issue #173.

    Rewrite testParseSeq() as a TestCase.

    Issue #179.

    Update release notes.

    Bump version number.

  • v5.33 2023-11-12

    JSDoc: Correct outdated reference.

    Issue #141.

    Rename properties with underscores in them in Page subclasses.

    Issue #141.

    Verify a container exists before looking for items.

    Issue #165.

    Implement a simple (for now!) loadOptions().

    Issue #198.

    Update release notes.

    Bump version number.

  • v5.32 2023-11-10

    More renaming getters from old private _names to current names.

    Issue #141.

    Change terminology from 'base' to 'container' as appropriate.

    Issue #177.

    Rewrite testScroller() as a TestCase.

    Issue #179.

    Bump version number.

  • v5.31 2023-11-09

    Rename getters from old-style private _names to current names.

    This change is invasive enough to do stand-alone.

    Issue #141.

    Listen for clicks during the capture phase in Scroller.

    We want to make sure we see them before the web page may cancel it.

    Closes #161.

    Update release notes.

    Bump version number.

  • v5.30 2023-11-08

    style-nudge: Make a #private field static in Feed.

    This happens to be used in a string necessary early in the loading process. In order for it to be placed in the style-guide preferred location, it needed to be static.

    Issue #173.

    style-nudge: Right place #private methods in Page subclasses.

    Issue #173.

    style-nudge: Right place #private methods in SPA.

    Issue #173.

    Remove experimental support for w2ui.

    Issue #189.

    Bump version numbers.

  • v5.29 2023-11-07

    Bump versions of many libraries.

    Mostly this grabs new dev things, like better error messaging and test assertions.

    Issues #170, #185.

    Move loading and saving of Logger configs outside of testing.

    The lib/userscript variations will do sensible things when the {get,set}Value functions are not granted, which is currently the case. However, developers can turn them on for testing.

    This particular sequences, of saving on hidden and loading on visible, allows developers to switch to another tab that has the userscript manager UI, tweak the values there, and then load the new values when returning to the LinkedIn tab. At least, until we get an in-app UI built for this.

    Issues #145, #170.

    Simplify Feed.#onPostActivate().

    We really only care if the post still has the has-occluded-height attribute at this point. So, just check that directly rather than looping through the list of attribute changes.

    Also, since we now want to log inside the monitor, change it to an arrow function.

    Issue #150.

    Make item being viewable a criteria for reactivation.

    This comes closer to solve the special case for Feed. It still needs to handle the case where, here, the classes are properly assigned, but by the time this function leaves and Feed takes back over, all of the classes are explicitly reset by LinkedIn.

    Issue #150.

    style-nudge: Right place a #private field in Scroller.

    This was a recent addition. Missed because this is not yet a precommit hook.

    Issue #173.

    Retire the DummyService.

    No longer needed as we have real ones to test with.

    Issue #130.

    style-nudge: Right place most #private fields in Page subclasses.

    One needs to be changed to a static #private field, and that will be a separate change.

    Also took the opportunity to remove some unnecessary initializers which were holdovers from earlier days in the project.

    Issue #173.

    style-nudge: Right place #private fields in SPADetails.

    Issue #173.

    style-nudge: Right place #private fields in LinkedIn.

    Issue #173.

    style-nudge: Right place #private fields in SPA.

    Issue #173.

    Update release notes.

    Bump version numbers.

  • v5.28 2023-11-06

    style-nudge: Right place static #private fields in Page subclasses.

    Issue #173.

    Move news content out of LinkedIn to a global variable.

    As static #private fields, they needed to be moved to the correct location inside the class. Might as well make them global to the app.

    Issue #173.

    Wait for current item to reappear when Scroller is reactivated.

    Works well enough to remove equivalent code from three locations. To handle the one in Feed requires a bit more work.

    Not perfect, but a good start.

    Issue #150.

    Update release notes.

    Bump version numbers.

  • v5.27 2023-11-05

    Bump lib/userscript to version 3.

    This picks up a fix for using Greasemonkey.

    Closes #187.

    style-nudge: Right place a static #private field in LinkedIn.

    Issue #173.

    Bump lib/widget to version 2.

    Does not do anything yet, but it does allow me to act in developer mode with one less local change.

    Issue #185.

    Fix typo in the name of logging group.

    Include the unknown issues in the error message.

    Update release notes.

    Bump version numbers.

  • v5.26 2023-11-04

    Missed adding a known issue.

  • v5.25 2023-11-04

    style-nudge: Alphabetize #private properties in Page.

    Issue #173.

    Remove Page._refresh().

    Issue #150, #178.

    style-nudge: Right place static pubic methods in SPA.

    I had been putting this particular move off because I know these methods are going to be removed. But that is taking longer than hoped.

    Going ahead and doing this will allow a new (dumb) linting tool to be created.

    Issue #173.

    Bump lib/base to version 22.

    Use new simpleParseWords() function and retire similar static SPA method.

    Issues #130, #180.

    style-nudge: Alphabetize some public getters in Page subclasses.

    Issue #173.

    style-nudge: Organize public getters in SPADetails.

    Issue #173.

    style-nudge: Organizer getters in SPA.

    Issue #173.

    style-nudge: Organize public methods in LinkedIn.

    Issue #173.

    Experiment with using the w2ui library.

    Issue #185.

    Update release notes.

    Bump version numbers.

  • v5.24 2023-11-03

    Add missing '*' from a comment.

    Issue #173.

    style-nudge: Right place a getter in Scroller.

    Issue #173.

    style-nudge: Right place a property in AccordionTableWidget.

    Issue #173.

    style-nudge: Move a static #private property in Page.

    Issue #173.

    style-nudge: Right place a property in Global.

    Issue #173.

    style-nudge: Right place properties in VMKeyboardService.

    Issue #173.

    Migrate Notifications from refresh to onScrollerActivate.

    Issue #178.

    Update release notes.

    Bump version numbers.

  • v5.23 2023-11-02

    Implement s to focus on the Search messages input field.

    Issue #144.

    Move static public methods in all remaining class.

    Issue #173.

    Variable renaming from 'resultspage' to 'pagination'.

    Issue #177.

    Migrate InvitationManager from refresh to onScrollerActivate.

    Issue #178.

    Move saving Logger configs to when the page goes away.

    Since we are tracking counters, not just booleans, it makes sense to have it automatic rather than opening some future config screen.

    Issue #145.

    Update release notes.

    Bump version numbers.

  • v5.22 2023-11-01

    Bump lib/widget to version 1 and Widget from that library.

    Issue #167.

    Make all static _unique functions officially public.

    I am not a big fan of this, preferring that they stay private. However, there are a couple of issues:

    • The older version of eslint I am using cannot handle multiple static #private methods
    • Making them static #private arrow functions would require that they be defined before the static field that references it, violating the style guide.

    Just easier to do this for now.

    Issues #141, #173.

    Migrate MyNetwork from using refresh to onScrollerActivate.

    Issue #178.

    Bump version numbers.

  • v5.21 2023-10-31

    Implement N to compose a New message.

    Issue #144.

    Depend on lib/widget version 0.

    Also make use of the Info widget.

    The Widget base class is purposefully not exposed (at the moment), so we have to keep it duplicated until we migrate the new accordion over.

    Issue #167.

    style-nudge: Move public methods in Page.

    Issue #173.

    Make a #private method an arrow function.

    Issue #141.

    Move static #private methods in Global.

    Issue #173.

    Move the constructor() to the top of all remaining classes.

    Issue #173.

    Add styling for the keystrokes tab in the new info view.

    Issue #180.

    Add a colon (:) at the end of keystroke sequences.

    Issue #180.

    Update release notes.

    Bump version numbers.

  • v5.20 2023-10-30

    Move saving of Logger configs into closing the new info view.

    This is still behind a dev flag.

    Issue #145.

    style-nudge: Move public getters in Page.

    Issue #173.

    Implement l to load more conversations.

    Issue #144.

    Start refactoring widgets into their own library.

    Issue #167.

    Migrate Feed from using refresh to onScrollerActivate.

    Issue #178.

    Run shortcut key sequences through parseSeq() and adjust CSS.

    Issue #180.

    Update release notes (formatting as well as content).

    Bump version numbers.

  • v5.19 2023-10-29

    Move parseSeq from SPA to VMKeyboardService.

    Both currently use VM.shortcut facilities, so it makes sense to put them together.

    Issue #130.

    Switch Messaging to using containerItems for primary Scroller.

    Issue #165.

    Reflow the containerItems in Feed for consistency.

    This is how we ended up doing this for all other locations that do not fit on one line.

    Issue #165.

    Bump lib/web to version 1 and use functions from that library.

    Issue #167.

    Remove some unnecessary trailing semicolons.

    Issue #173.

    style-nudge: Move constructor() to the top of Page.

    Issue #173.

    Bump version numbers.

  • v5.18 2023-10-28

    Minor tweak to JSDoc wording.

    Issue #130.

    Enhance TabbedUI to take an HTML element as well as a string.

    This will make it easier for a tab to be another widget.

    Issue #130.

    Implement Widget.clear().

    Issue #130.

    Create a simple AccordionTableWidget.

    Does not do much yet, just a base to build on.

    Issue #130.

    Start populating the new table with shortcuts.

    Very raw, no styling yet.

    Issue #130.

    Add a VMKeyboardService to all Pages.

    They still do nothing, but it will at least allow the new info view to have content.

    Issue #130.

    Switch JobCollections to using containerItems for one Scroller.

    Issue #165.

    Fix minor typo in a logging context.

    Make CSS selectors for the pagination scroller a bit more precise.

    Issue #165.

    Bump lib/userscript to version 2.

    Make use of the new environmentData() function.

    Issue #167.

    Migrate a number of functions to lib/web.

    These include clickElement(), focusOnElement(), and isInput().

    I have no idea how I missed these when I added the otmot family.

    Issue #167.

    style-nudge: Move static #private fields into the correct location.

    Issue #173.

    Bump version numbers.

  • v5.17 2023-10-28

    Depend on lib/web version 0.

    Also use all of the function already migrated to it.

    Issue #167.

    Factor some reusable code out of InfoWidget into a base class.

    Other rendering widgets can also use this base, but will require a bit more work. This is essentially a distilaltion of previous implementations.

    More imporantly, this can be used for the forthcoming accordion widget.

    Issue #130.

    Switch MyNetwork to using containerItems for primary Scroller.

    Issue #165.

    Add environmentData() to lib/userscript.

    Mostly a raw copy from _errorPlatformInfo(). Untested in its current form.

    Issue #167.

    style-nudge: Move #private properties to the correct location.

    Missed a static method last time, as well. Also, changed setKeyboardContext from an arrow function to a regular method. This is not in effect yet, so this may change. But I do not think it needs to be an arrow function here.

    Issue #173.

    Update release notes.

    Bump version numbers.

  • v5.16 2023-10-28

    Missed a known issue, thus breaking the application.

  • v5.15 2023-10-27

    Hook in building shortcut table each time the info view is opened.

    Does not yet actually build anything, just logs.

    Issue #130.

    Switch Feed to using containerItems for primary Scroller.

    Also made the container selector a bit more precise.

    Issue #165.

    Bump versions of all libraries being used.

    Also make use of the ensure() feature that provides a restricted namespace.

    Issue #167. Closes #175.

    style-nudge: Reorder a single property in ScrollerService.

    Issue #173.

    style-nudge: Move public static methods to the correct location.

    In this case, constructor() counts as a public static method.

    Issue #173.

    Start refactoring WEB API specific code into its own library.

    Issue #167.

    Bump version numbers.

  • v5.14 2023-10-27

    style-nudge: Reorder the properties in Service.

    Issue #173.

    Make a couple of CSS selectors available as constants.

    Issue #174.

    Have Jobs pageReadySelector use the newly available constant.

    Issue #174.

    Have Messaging pageReadySelector use the new constant.

    The effect of using this selector over the previous one is minimal, but is starts a pattern of consistency across Pages where it is possible.

    Closes #174.

    Correct TabbedUI example.

    Export VMKeyboardService.#services as a getter.

    Issue #130.

    Create an empty shortcuts tab for the new info view.

    Issue #130.

    Depend on lib/userscript version 0.

    Also use the licenseData() function from it.

    Issue #167.

    Bump version numbers.

  • v5.13 2023-10-26

    Bump versions of lib/base and lib/xunit being used.

    Also migrate namespace from NH.base.testing to NH.xunit.testing.

    Issues #167, #172.

    style-nudge: Alphabetize a LinkedInGlobals getter.

    Issue #173.

    Move linkedInGlobals close to first use.

    Issue #173.

    Expose active status of a VMKeyboardService instance.

    Issue #130.

    Switch Jobs' primary Scroller to using containerItems.

    Issue #165.

    Start refactoring userscript specific code into own library.

    Issue #167.

    Bump version numbers.

  • v5.12 2023-10-25

    Move running tests to before instantiating LinkedIn.

    Too much interleaving of logs otherwise.

    Issue #172.

    Depend on lib/xunit version 0.

    Issue #167.

    Allow use of containerItems.

    Issue #165.

    Rename some event handlers.

    Issue #130.

    Prefer new info view in dev mode.

    Issue #130.

    Missed a known issue in the initial list.

    Issue #106.

    Throw Error if there are unknown issues when building the News tab.

    After some experience, it turns out throwing an error is more important than silently ignoring it.

    Issue #106.

    Give Service a shortName property.

    Issue #130.

    Improve list of shortcut in VMKeyboardService.

    Expose the list via a getter and update it when instance are removed.

    Issue #130.

    Bump version numbers.

  • v5.11 2023-10-25

    Factor out generation of the name and instruction elements.

    The function was getting too long.

    Issue #130.

    Add hotkey navigation for inside the new info view.

    Issue #130.

    Tune Jobs pageReadySelector again.

    It turns out that #compactfooter-copyright is loaded lazily. So, if the user scrolls down the Jobs page, visits a job, and comes back, the copyright will not show up until until the user scrolls it into view. So the page is not activated until that happens.

    However, the aside element, which will eventually contain the copyright, is loaded earlier. Still after main, though in that same batch.

    Issue #165.

    Have Scroller.#getItems support #containerItems.

    This may not be the final form, but it is simple. Unlike how we handled #onClickElements, where we changed a single HTML element to a set of elements, here we are going from an (element, [string]) tuple to a list of string, string pairs. Unless we need to do massaging of the information while poplating the list of elements to actually return, I suspect this may be the simplest way to go.

    Anyway, I suspect this may be the last thing necessary to support containerItems. We should start migrating the other major scrollers in a day or two.

    Issue #165.

    Move Scroller #private properties.

    Issue #173.

    Bump version numbers.

  • v5.10 2023-10-24

    style-nudge: Move TabbedUI #private fields to the correct location.

    Issue #173.

    Install event listeners for the new info widget.

    Issue #130.

    Install tabs in the new info widget.

    Also populated it with a couple of easy to handle tabs.

    Issue #130.

    Change Jobs pageReadySelector to #compactfooter-copyright.

    Measured, and shows up noticeably later than main.

    Issue #165.

    Give Jobs experimental containerItems.

    Like many things, keyed to testing being enabled. And does not work yet.

    Issue #165.

    Have Scroller.#waitForBases return the Promise.all().

    The caller will soon have a need for them.

    Issue #165.

    Change Scroller's #onClickElement to a set of elements.

    Issue #165.

    style-nudge: Move Scroller public methods.

    Issue #173.

    Bump lib/base to version 12.

    Make use of the new ensure function.

    Issue #167.

    Bump version numbers.

  • v5.9 2023-10-22

    Initial support for the Messaging page.

    Figuring out when a page is ready to be activated has long been an issue. I finally wrote up some documentation for it: https://github.com/nexushoratio/userscripts/blob/main/STYLE-GUIDE.md#supporting-a-new-page

    Issue #144.

    Replace Jobs refresh() with scroller onActivate.

    This page is a good place to test the containerItems stuff.

    Issue #165.

    Bump version numbers.

  • v5.8 2023-10-21

    Basic News tab.

    Pretty ugly, but a start.

    Issue #106.

    Use a local variable for tracking the infowidget container element.

    Issue #130.

    Add a dismiss button to the header of the new info widget.

    Issue #130.

    Bump version numbers.

  • v5.7 2023-10-19

    Move the #private property towards the end of the class.

    Issue #173.

    Turn static URLs into a couple of helper functions.

    This is really just a personal helper function. The editor I use happend to have problems with formatting if #private properties are used inside template literals. So I moved them out. Lame reason, I know.

    Issue #106.

    Move #private properties to the end of LinkedIn.

    Issue #173.

    Split the lit-instructions CSS class into two.

    Issue #130.

    Move the info widget styling to CSS classes.

    Issue #130.

    Additional logging for Scroller.

    Issue #165.

    Move the deprecated refresh to after services are activated.

    Every current refresh depends on Scroller, which is now wrapped by service activation.

    At the moment this means nothing, but it does confuse debugging.

    Issue #165.

    style-nudge: Move Scroller's getters to the correct place.

    Issue #173.

    style-nudge: Move Jobs' #private fields to the correct location.

    Issue #173.

    Bump lib/base to version 9.

    Remove Dispatcher from this file and use the version from the library.

    Issue #167.

    Add missing eslint-enable at the end of tests.

    Bump version numbers.

  • v5.6 2023-10-19

    Factor out the GitHub and Greasy Fork URLs so they can be reused.

    Issue #106.

    Style the new info widget to be the same size as the old one.

    Issue #130.

    Replace a spa class with a lit one.

    Also have #addLitStyles use the same pattern for adding styles as other places in the code.

    Issue #130.

    Make Scroller.#containerItems default to an empty array.

    Issue #165.

    Have Scroller.activate() wait for containers to show up.

    Issue #165.

    Bump lib/base to version 8.

    No recent code migrations, just pulling in new features.

    Issue #167.

    Migrate Dispatcher to lib/base.

    Issue #167.

    Use the new test runner from lib/base.

    Issue #172.

    Move public methods closer to the top of TabbedUI.

    Issue #173.

    Bump version numbers.

  • v5.5.2 2023-10-18

    Create a simple test runner.

    Issue #172.

    Move InfoWidget #private properties to the end of the class.

    Issues #130, #167.

    Move one TabbedUI #private method to the end of the class.

    Just prep work before moving this to lib/base.

    Issue #167.

    Introduce ContainerItemsSelector to Scroller.

    Issue #165.

    Move #private properties to the end of Dispatcher.

    Just prep work before moving this to lib/base.

    Issue #167.

    Move some #private properties to later in the class for Service.

    Just prep work before moving this to lib/base.

    Issue #167.

    Bump version number.

  • v5.5.1 2023-10-17

    Add a placeholder comment.

    This will make applying a particular patch that enables debugging easier to apply.

    Issue #170.

    Minor rearranging of code.

    Just nudging to code towards the new style guide prior to eventual refactoring.

    Issue #167.

    Add open and close methods and events to InfoWidget.

    Issue #130.

    Migrate some hold overs to #private properties.

    Issue #141.

    Replace a thenable with await.

    Now that the wrapping IIFE is an async function, we can replace waiting on LinkedIn.ready's with an await rather than a then().

    This pausing the subsequent testing, which could get the proceeding log message and those from creating SPA and the Page classes mixed in with it.

    This does not eliminate all mixed in logs, since we do have event handling all over the place. But, it does reduce it.

    Issue #167.

    Move Scroller constructor validation to a separate method.

    Future validations are going to make the function too long, so refactor now.

    Issue #165.

    Correct some strings in Scroller's tests.

    Issue #165.

    Bump lib/base to version 6.

    Remove uuId, safeId, and strHash from this file and use the versions from the library.

    NOTE: Due to lack of proper coding hygiene (see issue #171), lib/base calls itself version 5.

    Issue #167.

    Bump version number.

  • v5.5.0 2023-10-16

    Implement + and - for thumbs-up and thumbs-down on job cards.

    This is a bit of a cheat. Depending on the exact page being visited, the job card may either have thumbs-{up,down} buttons OR a X dismiss button.

    The way dismiss and thumbs-down are selected are identical (at the moment), so dismiss just calls thumbs-down.

    It is always possible that in the future, these two will have different ways of selecting them and this will have to be changed again.

    Closes #168.

    Expose the #details property via a getter.

    Page subclasses will generally be application specific and may need information from this SPADetails instance.

    Issue #130.

    Create a LinkedIn.navBarScrollerFixup() method.

    Page classes often need to have the {Scroller~How} configurations fixed up once we know how tall the navbar is. Instead of having having the LinkedIn class updating static public properties, the classes can now send in the properties for update.

    Issue #130.

    Page classes ask the LinkedIn instance to update some properties.

    A later change can make these public properties #private.

    Issue #130.

    Bump lib/base to version 5.

    Remove Logger from this file and use the version from the library.

    Issue #167.

    More Scroller hardening and tests.

    Issue #165.

    Migrate uuId, safeId, and strHash to lib/base.

    Issue #167.

    Bump version number.

  • v5.4.8 2023-10-16

    Move #private properties to the end of the class.

    Just prep work before moving this to lib/base.

    Issue #167.

    Move a lost comment to a sensible place.

    Start writing tests for Scroller.

    Issue #165.

    Make a CSS selector case insensitive.

    Apparently a matching word changed from "Undo" to "undo".

    Issue #168.

  • v5.4.7 2023-10-15

    Bump version number.

  • v5.4.6 2023-10-15

    Move setting #spa from start() to constructor().

    One more step in eliminating start().

    Issue #130.

  • v5.4.6 2023-10-14

    Simple toggle to bounce between info views.

    Only happens in testing mode.

    Also move saving Logger configs to this same if statement merely for convenience.

    Issues #130, #145.

    Use #lastScroller technique in Jobs.

    Closes #163.

    Implement waitForSelector and migrate users to it.

    The most common use of otmot is waiting for elements to show up. This provides a simple way of doing that.

    I realized this after looking at other JS libraries hosted on GreasyFork and seeing how many implement this same pattern. And that we will need it for Scroller.

    Issue #165.

    Bump lib/base to version 3.

    Remove DefaultMap from this file and use the version from the library.

    Issue #167.

    Add ability for a test case to have a testName property.

    If a test case is defined using a static #private method, then there will be no name available, and it is not possible to assign one easily. However, assigning a property called testName works, so allow that as an option.

    Issue #167.

    Migrate Logger to base.

    Some cosmetic differences between the original version and this one:

    • GroupMode is now internal. I figured out how to use static initialization blocks to create the known enums and freeze the nested class.
    • #Config is now a private class.
    • These classes required a lot of rearranging to meet the new style guidelines.

    I did waffle a bit about whether I should move GroupMode into Logger or Config out. With the way the library explicitly exposes symbols, both would allow them to be effectively private. Since this whole userscript thing is as much of a learning exercise as anything else, I went with the hardway, simply for the experience. If Logger was going to be in a standalone module, I would likely have moved them out, but since these libraries will not be that granular, I also think this makes more sense.

    Issue #167.

    Bump version number.

  • v5.4.5 2023-10-14

    Include libraries and version numbers in the Errors tab.

    Issue #167.

    Expose the container element via a getter.

    Issue #130.

    Add header information to the infoWidget.

    Issue #130.

    Use #lastScroller technique in MyNetwork.

    Issue #163.

    Correct how Dispatcher.fire() is documented and works.

    In a handler is register for multiple events, the eventType should be included.

    Also make sure the JSDoc matches the API.

    Migrate DefaultMap to base.

    Issue #167.

    Bump lib/base to version 2.

    Issue #167.

  • v5.4.4 2023-10-13

    First use of the new base library.

    Issue #167.

    Fix bug when restoring configs.

    It was actually merging not replacing configs.

    Issue #145.

    Bump version number.

  • v5.4.3 2023-10-12

    Tweak how tests are logged a bit.

    A bunch of tests for Logger, especially the new config stuff.

    Issue #145.

    Plug in loading saved Logger configs.

    Again, disabled by default.

    Issue #145.

    Rip out Jobs Rube Goldberg device for monitoring changes.

    While working on a replacement built into Scroller, I disabled this one and realized it is no longer needed. I suppose the recent changes to how sections are built resolved this issue.

    Issue #150.

    Initial MutationObserver framework for Scroller.

    Just does some minor logging at the moment. We examine each current _refresh() implementation in turn and replicate what they need in here.

    Issue #150.

    Initial framework for an InfoWidget.

    We will slowly duplicate the stuff already in the info view, but populating it with data obtained from items factored out.

    Issue #130.

    Use #lastScroller technique in Feed.

    I was not sure that all uses of _hasActiveComment could be replace, but, it was!

    While I could have removed the uses of const el = here, it does keep most of the lines using it from wrapping.

    Issue #163.

    Normalize the ot?ot family to have the same structure.

    • Initialize local variables from arguments
    • Create logger and other local variables
    • Observer callback function
    • Timeout callback function
    • Create observer
    • Start timer
    • Start observing
    • Trigger

    Logging is now consistent across the functions. Reworked otrot so fewer lines of code. The action function of otrot2 now takes resize records.

    Operations wise, there are still a few inconsistencies, but this change preserves those. Though they will be updated in a future change.

    Issue #165.

    Bump version number.

  • v5.4.2 2023-10-12

    Rename Scrollers's element tracking attribute.

    Issue #130.

    eslint: Enable and configure no-underscore-dangle.

    Not complete, but the new configuration should prevent any backsliding.

    Issue #141.

    Turn off some logging by default.

    Issue #130.

    Change the pageReadySelector for JobCollections.

    It turns out that some view do not have enough job cards to require a results paginator, in which case, waiting for one to show up will not work.

    So, move to a different one.

    However, since we were depending on the above to conviently make sure that it was available to set the results page scroller, we had to change how that is done as well. The usual monitor stuff.

    Amusingly enough the now breaks an invariant of Logger: Groups will always be nested. Both 'activate' handlers gets invoked around the same time, so both have active logging groups. However, depending on how the page loads, they may exit at different times. Since we know what order these things will finish, we could probably rearrange the order of the calls of addService, but this is a good reminder that JS does have microtasks.

    Issue #143.

    Fixed some bad indentation.

    Initial implementation of saving Logger config.

    I do not know if this applies to all userscript managers, but at least Violentmonkey does not appear to use JSON.stringify() when saving values. So we need cannot use the standard toJSON() method to convert. Instead, we will use toPojo().

    This is all disabled for now because I realized we need to first inform the users that we will start saving data.

    Issue #145.

    Give the news icon a meaningful class name.

    Issue #106.

    Move testing Logger into the test runner.

    Issue #145.

    Remove explicit setting of Loggers for debug reasons.

    Issue #145.

    Add ability to look up GroupMode by name.

    Issue #145.

    Implement setting configs from an object.

    There is no hardening at this point. Just what comes out can go back in.

    Issue #145.

    Bump version number.

  • v5.4.1 2023-10-11

    Migrate SPA._pages to a #private property.

    I think this is the last of the easy stuff.

    Issue #141.

    Rename job to jobCard.

    Issue #143.

    Rename page to resultsPage.

    Issue #143.

    Bump version number.

  • v5.4.0 2023-10-10

    Migrate more SPA items to #private properties.

    These are all URL related ones.

    I notice that most of the rest will likely be factored out shortly. Getting close to the end of this particular adventure.

    Issue #141.

    Move pageScroller set up to its own method.

    After some experience, I now feel comfortable that selecting the button for the current page upon loading does not trigger another reload, and thus interferring with waiting for job cards to load. So move it out.

    Really only doing this because #onJobActivate was going to get too long.

    Issue #143.

    Give the job card a couple of seconds to show up.

    Issue #143.

    Switch all Page Scrollers to use the ScrollerService.

    Issue #149.

    Have all secondary Scrollers created immediately.

    This allows the automatic click handling to work right after a primary Scroller navigates onto a container.

    Also, it turns out that using ScrollerService with a secondary one does not work. I failed to test that last minute change.

    Issue #149.

    Give Scroller the option to call activate upon construction.

    Will be useful for secondary scrollers to engage click handling.

    Issue #149.

    Migrate all secondary Scrollers to using autoActivate.

    Secondary scrollers tend to just disappear on a page change, so this is handy for them.

    I believe this is really the last change in the migration to supporting click handling inside Scroller.

    Closes #149.

    Bump version number.

  • v5.3.2 2023-10-10

    Create a VMKeyboardService.

    Not yet fully enabled, though does listen for 'focus' events and can handle arbitrary conditions like 'inDialog'.

    Right now, handling of these kinds of events is global.

    This implementation will also allow each Page to register more than one set of shortcuts. In theory, shortcuts common to different views could be shared, though may be difficult depending on how much information they would need to share between them.

    Issue #130.

    Add a Logger.clear() method.

    I have wanted this so many times!

    Issue #130.

    Create DebugKeys as an optional set of shortcuts for Global.

    No-op as VMKeyboardService does not yet actively enable keys.

    Issue #130.

    Change the pagination Scroller to use a different element.

    Instead of using the button, use the li that surrounds the button. This allows shining to work, so we can go back to the more traditional "navigate to an item (page number) then select it (Enter key)."

    Issue #143.

    Allow pagination Scroller to get focus.

    This whole #lastScroller thing is nice. It may be worth converting some existing Pages that use the hasActiveSubitem() approach.

    Issue #143.

    Give pagination Scroller a bit of a buffer on the bottom.

    Now that we are doing a traditional scrolling, having some room at the bottom of the screen is a little nicer.

    Issue #143.

    Missed a place where we need to loop over values in a Map.

    Issue #130.

    Change hotkey from Enter to c.

    In other cases where we can easily detect that focus is on an element inside the current Scroller element. There we can elect to allow the standard browser function take over (e.g., TABbing to a link and hitting ENTER).

    So here, we will use n and p to select a page, then c to change to it.

    Issue #143.

    Give the job cards a bottom scroll margin as well.

    Just looks nicer.

    Issue #143.

    Change the job card Scroller to use a different element.

    Like the recent change to the pagination one, use the surrounding li. It allows the highlights to shine through.

    However, we are going to keep the auto-click on change feature. Unlike scrolling through the pages at the bottom, moving to a job card then selecting it feels clunky. Updating as we navigate feels natural. Maybe it is due to the dual pane layout.

    Issue #143.

    Add method to navigate to a specific item.

    Technically, this can already be achieved through the item setter, however, that sometimes looks a little strange:

    this._foo.item = this._foo.item
    

    will become

    this._foo.goto(this._foo.item)
    

    Issue #143.

    Add methods to get uid and then later go to it directly.

    This will simplify some unusual page loads. It could also be used to simplify some refreshes in the short term.

    Issues #143, #150.

    Migrate JobCollections to the ScrollerService.

    Issues #143, #149.

    Initial work selecting job card on initial page load.

    • Updated pageReadySelector
    • Handle activate message
    • Do update the pagination scroller

    Issue #143.

    Bump version number.

  • v5.3.1 2023-10-09

    Migrate SPA._log to a #private property with a getter.

    Issue #141.

    Wrap the last few long lines in the file.

    Issue #148.

    Fire activate and deactivate events.

    Issues #143, #149.

    Bump version number.

  • v5.3.0 2023-10-09

    Migrate a few SPA items to #private properties.

    This class has a lot of them; too many to do at once.

    Issue #141.

    Implement Save job toggle.

    Issue #143.

    Explicitly set snapToTop false.

    On this particular view, snapping the job cards to the top is a little confusing. Allowing the highlighting to move down seems to work better. When scrolling back up, they will natually pin to the top, but that seems all right.

    Issue #143.

    Update focusing on the details pane.

    The built in button does not do anything useful. User would have to click that button the TAB once. So just go there directly.

    Oddly enough, after selecting a new job card, hitting TAB TAB works as well, so this is not much of a short cut, but it is already here.

    Issue #143.

    Add comment about there really being two Save buttons.

    Issue #143.

    Implement = to open the job details menu.

    Issue #143.

    Implement toggle to Follow the company.

    Issue #143.

    Implement Apply to job.

    Issue #143.

    Update comments about multiple buttons for a given action.

    They do not all match.

    Issue #143.

    Implement opening the job share menu.

    Issue #143.

    Implement toggle the job search aLert.

    Alas, A is already used for Apply.

    Issue #143.

    Fix up some comment indentations.

    Sometimes eslint messes them up.

    Issue #143.

    Bump version number.

  • v5.2.2 2023-10-09

    Fix typo in comment.

    Issue #130.

    Have Page use the pathname passed in via details.

    Issues #130, #149.

    Allow addService() to pass arguments during construction.

    Issues #130, #149.

    Create a ScrollerService adapter and have Feed use it.

    This will allow the the click support in Scroller to be turned on and off as the user navigates through the pages.

    Issue #149.

    Remove the start() method from Service.

    We are going to remove start() from Page soon, so it makes no sense to have a new use of it.

    Issue #130.

    Bump version number.

  • v5.2.1 2023-10-08

    Wrap long lines in SPA.

    Issue #148.

    Normalize all block comments to a single line if possible.

    Have all Page subclasses use a PageDetails.

    Issues #130, #149.

    Move _refresh() from enableOnClick() to activate().

    Issue #149.

    Remove all click handling from Page and subclasses.

    Closes #149.

    Factor out a common pattern for create unique strings.

    Bump version number.

  • v5.2.0 2023-10-08

    Change SPA to register a class, not an instance.

    This will allow us to move eventually remove the start() method.

    Issue #130.

    Migrate LinkedIn to #private properties.

    Issue #141.

    Toggle dismissing job.

    Issue #143.

    Enable click handling by default in Scroller.

    It works surprisingly well. A few oddities to work out, but rare.

    Issue #149.

    Bump version number.

  • v5.1.0 2023-10-08

    Have addService() return the instance it just created.

    This way the caller can track it.

    Issue #130.

    Track the DummyService that was created.

    Issue #130.

    Normalize variable naming to use all caps for CSS.

    Enhance Page to take a PageDetails upon construction.

    With #private variables, we need to move away from having code in the base class that can use overrides in the subclasses. Instead, we will need to pass them in through the constructor or other mechanisms. Here, we are adding some items similar to what we already use, but can do differently.

    Issue #130.

    Have Feed start using the new PageDetails argument.

    Issue #130.

    Rename pageReadyCSS to pageReadySelector.

    Issue #130.

    Wait until the page settles before activating services.

    Issue #130.

    Update comment about moving the call to _refresh().

    it is a race between two bugs to see which will get fixed first!

    Issues #130, #150.

    Finish migrating SPADetails to #private properties.

    What is left will be refactored away under another change anyway.

    Issue #141.

    Jump to the job details pane.

    It does this by click on the normally hidden, but always active button called Jump to active job details.

    Normally users only see this button by TABbing to it (shortly after the toggle alert button).

    Issue #143.

    Make _jobsHow #private.

    Unlike all of the other Scroller~How objects, this one does not need a fix-up after the height of the navbar is discovered.

    Issue #143.

    Allow Scroller classes to be optional.

    Issue #143.

    Implement navigation through the results pages using a Scroller.

    This is a little cumbersome for a few reasons:

    • Like all Scrollers, it starts on the out-of-bounds item. So the first n goes to the page the user is already on, making it appear that nothing happened. This can likely be fixed by one of those new Service things being worked on.

    • The site CSS does not allow the page result buttons to be high-lighted, so this initial version just immediately navigates to the next page. However, the user gets no visual feedback on this. Idea: Try a selector that choses the li around the button.

    • Due to the page result buttons being at the bottom on the page, and lazy loading of jobs, it is difficult to get to them so the user can see what page they are on. It keeps scrolling away.

    Issue #143.

    Wrap long lines in LinkedIn.

    Issue #148.

    Bump version number.

  • v5.0.1 2023-10-07

    Rename property #log to #logger and use a getter from now on.

    Issue #149.

    Move dispatcher getter next to logger.

    Issue #149.

    Explicitly make snapToTop optional with a default to false.

    Issue #149.

    Add onClick support to Scroller.

    This was suprisingly easy. Should have done it ages ago.

    Issue #149.

    Switch Feed to use the new Scroller click handler.

    As a bonus feature, add click handling to the comments as well. Kind of. The comment scroller has to exist before it can handle clicks and, currently, it only exists after the first usage after a post is selected. Need to figure out the best approach for that before this is a complete example.

    Issue #149.

    Update how Feed creates a comment scroller.

    It now does so immediately upon changing posts.

    This now makes Feed a good example for migrating other Page classes to using the Scroller built-in click handling.

    Issue #149.

  • v5.0.0 2023-10-07

    Wrap long lines in Notifications.

    Issue #148.

    Rename Information tab to About.

    JSDoc: Normalize most constructor() comments.

    At least those for Page subclasses, and a few others.

    Issue #130.

    Migrate SPADetails._id to a #private property with a getter.

    Issue #141.

    Support the /jobs/{collections,search}/ pages. | | Initial navigation. A few bugs, like losing highlighting quickly, but definitely usable.

    Supporting a new page warrants a bump in the major version number.

    Issue #143.

  • v4.2.1 2023-10-06

    Egads! Another misspelling!

    Additional logging.

    Issue #157.

    Enable some logging while working on this issue.

    Issue #157.

    JSDoc: Explicitly define the dispatch handlers.

    Update 's to properly reference the additional parameter.

    Update how 's tests are managed.

    JSDoc: Put a space between @tab and {type}.

    JSDoc: Move ellipsis inside the parameter's {type}.

    Update JSDoc for addService.

    Issue #130.

    Differentiate base class log message.

    Migrate SPADetails._log to a #private property with a getter.

    Issue #141.

    Change MyNetwork card viewing from v to Enter.

    Just much more natural.

    The MyNetwork cards need more selectors.

    Closes #159.

  • v4.2.0 2023-10-05

    Clean up remnants of the old shortcuts tables.

    This also removes the original typedef for Shortcut.

    Closes #140.

    Migrate some Notifications items to #private properties.

    This wraps up the existing Page subclasses.

    Issue #141.

    A rough initial implmentation of how a Service might work with SPA.

    Issue #130.

    Fix misspelling.

    Wrap and clean up job entries CSS selectors.

    It looks like some recent changes made a couple of the selectors obsolete.

    Issue #148.

    Wrap long lines in Jobs.

    Issue #148.

    Wait for current invitation to show back up when refreshing.

    This is definitely lazy programming here, knowing that the real way to fix this is by addressing issue #150.

    Still, this was the last bit to implement for InvitationManager.

    Closes #153.

  • v4.1.4 2023-10-04

    Migrate Notifications to self-registering shortcuts.

    Issue #140.

    Migrate many Jobs items to #private properties.

    Issue #141.

    Group logging mode can now be explicitly set before hand.

    It also affects any general logging statements while the group is active. For example, a group can be silenced before being seen, and not only will intro/outro messages not be logged, neither will any messages in between. Unless a new group is activated.

    The API is still in flux.

    Issue #145.

    Wrap long lines in MyNetwork.

    Issue #148.

    Track current invite so it can be found again later.

    We really need to move this into the Scroller class (#150).

    Issue #153.

    Update mutationHandler intro.

    First, match should have been watch.

    Second, emphasize the fact that the watch text could be empty.

    Issue #155.

    Include tagName when watching mutations.

    There are new job sections have have no identifying elements in them, so the fallback was use the first line of innerText. Unfortunately this meant the section matched the first job entry in these new sections. This confused some other code, causing an infinite loop.

    For this particular case, we can differentiate by including the element name in the comparison. Really, this is hack. But since we hope to solve this problem in a more general solution inside Scroller itself, this should not be a problem.

    Closes #155.

    Bump version number.

  • v4.1.3 2023-10-03

    Migrate Jobs to self-registering shortcuts.

    I was lazy this time and did not wrap long lines. That can happen during the max-len sweep going on.

    Issue #140.

    Enhance GroupMode with metadata.

    Not happy with converting this enum to do more, but it is easier than trying to maintain a parallel object that using the enums for keys, particularly since it was cumbersome.

    Issue #145.

    Refactor nearly identical methods.

    Issue #145.

    Minor tweak to description for the Scroller class.

    Normalize the naming for Scroller instances.

    It was a mix of singular and plural names. Settled on singular.

    Wrap long lines in Feed.

    Also a good chance for additional comments.

    Issue #148.

    Bump version number.

  • v4.1.2 2023-10-03

    Support clicking on an invite to select it.

    Also a placeholder refresh hook.

    Issue #153.

    Update text used to find a button.

    While it was a simple textual change, we have seen LI go back and forth on these kinds of changes before. So switch to using a regular expression that matches both the old and new text.

    Closes #154.

  • v4.1.1 2023-10-03

    Rearrange shortcut methods in Jobs and Notifications.

    They now match the order of the current key listings, which will make subsequent changes easier to read.

    Issue #140.

    Migrate many Feed items to #private properties.

    Issue #141.

    Switch Logger from group stacks to a single one.

    We will be switching groups to configurable, but using the current settings as the defaults.

    Issue #145.

    Bump version number.

  • v4.1.0 2023-10-01

    Logger: Track groups as they are encountered, setting with default values.

    Next change will be consolidating the opened/closed stacks into a single one.

    Issue #145.

    Implement many Invitation manager actions.

    • more of the invite (e.g., the inviter included a message that is cut short
    • inviter view
    • target view (may be different from inviter, e.g., newsletter)
    • = for menus (again, so far seen with a message)
    • Accept invite
    • Ignore invite
    • Message invite

    Likely finishes off any shortcuts needed for this Page.

    Need to handle a page reload after visiting something, but it looks like it will be mildly complicated.

    Issue #153.

    Bump version number.

  • v4.0.1 2023-10-01

    Remove some unused #private properties.

    Apparently the older version of eslint I am using missed this.

    Issue #145.

    Migrate Feed to self-registering shortcuts.

    Issue #140.

    Migrate Global to #private properties.

    Issue #141.

    Bump version number.

  • v4.0.0 2023-09-29

    Rearrange shortcut methods in Feed to match order of register.

    This will make a subsequent change easier to read.

    Issue #140.

    Migrate many Page items to #private properties.

    Those that are left are used in subclasses and/or will be removed due to forthcoming refactorings. Actually, some of those done in this change will be removed as well, but I already changed them.

    Issue #141.

    Rename #tab to #tabSnippet.

    I could not remember what that variable was all about!

    Issue #140.

    Remove extra blank line.

    Plumb in simple Logger enabled and trace configurations.

    This was easier than I expected. Somewhat scared.

    Next will be adding groups as they are encountered.

    Issue #145.

    Wrap long line in Global.

    Issue #148.

    Reset card scroller when revisiting the MyNetwork page.

    Not sure what is happening here, but a reset works well enough for now.

    Closes #151.

    Remove old TODO.

    Closes #142.

    Make sure the first item of the log() statement is a string.

    Correct the description for focus.

    Issue #142.

    Support the /mynetwork/invitation-manager/ page.

    Basic navigation around the invitations.

    Supporting a new page warrants a bump in the major version number.

    Issue #153.

  • v3.4.0 2023-09-29

    Migrate Page._log to a #private property with a getter.

    Issue #141.

    Disable debugging in card scroller.

    Issue #142.

    Enable X to dismiss a card.

    This finishes up basic support for the My Network view. There will be follow-up issues for bugs discovered.

    Closes #142.

    New framework for centralized logging configuration.

    Next change will wire it in.

    Issue #145.

    Wrap long line in Page.

    Issue #148.

    Correct example.

    It turns out that #private properties cannot be enumerated as the example shows.

    Issue #140.

    Migrate Global to self-registering shortcuts.

    The shortcut arrays are going to be in the next biggest things to need line wraps. So, might as well start migrating them the Shortcuts instead.

    Issue #140.

    Bump version number.

  • v3.3.0 2023-09-27

    Migrate Page._spa to a #private property.

    Since this is used in subclasses, a getter is needed.

    Page is a complicated class with lots of subclasses. Migration will be slow and methodical.

    Issue #141.

    Reword Activate to View.

    Activate is just to much of an, active, verb for a passive action. Particularly when compared with other actions available on cards (Connect, Follow, Join, etc).

    Issue #142.

    Add Engage as a way to interact with the current card.

    I am not sold on this choice at all. It is better than having separate keys for each of Connect, Join, Follow, etc, but that verb... yuck.

    I do not want to go with ENTER because, on this page, the actions are a bit more aggressive than what is done on the Notifications page. And we want to keep these types of actions associated with upper-case letters. So, subject to change.

    Issue #142.

    JSDoc: Normalize how @type is done.

    Set enabled using the new getter.

    Issue #145.

    Wrap long lines in Scroller.

    Issue #148.

    Bump version number.

  • v3.2.4 2023-09-26

    Migrate LinkedInGlobals to #private properties.

    Issue #141.

    A fix to yesterday's improvement to CSS selectors.

    My testing was not as careful as it should have been.

    The My Network page has at least three different types of sections:

    • Invitations (first section)
    • More suggestions for you (last section)
    • Everything else (in the middle)

    Each type has a different way of selecting the items (mostly cards) inside of them. The tweak I made yesterday resulted in the Everything else type of card to be selected twice. Once as a 'li' element, and once as a 'section' element. And the uid calculation we use gave them the same id. So the Scroller would look for the next element, see it was id X, then end up repicking the same element it was just on, stuck in an endless loop trying to move forward.

    Since my testing only involved move from the See all button to the first card, nothing seemed amiss. I will try to do better.

    Issue #142.

    Give testing its own Logger.

    Issue #145.

    Replace enable()/disable() methods with a single setter.

    Turns out this is more cumbersome that I expected.

    Issue #145.

    Wrap long lines in TabbedUI.

    This contained some surprising policy decisions.

    We had been trying to keep CSS consistent with: selector { prop: value; prop: value; }\n

    Now, being broken across lines of code, we still want to have some consistency in how it is both presented in the JS, but also in the browser when debugging.

    For the code, it goes somewhat like:

    'selector {' +
      ' prop: value;' +
      ' prop: value;' +
      '}\n';
    

    Which, in the browser, loses the last space before the closing }. All-in-all, a minor annoyance, but still was something to think about.

    Issue #148.

    Bump version number.

  • v3.2.3 2023-09-25

    Fix JSDoc after switch from string to RegExp.

    Issue #147.

    Remove old _parseSeq() implementation.

    Closes #110.

    Finish migrating Scroller to #private properties.

    This time, methods. And, one field I missed last time.

    Issue #141.

    Add option to clickElement() to click itself.

    Originally the function would only click an element that was a child of itself. That is, "click a button inside this paragraph."

    Now we have a need where a Scroller will match a button, and we want to click it, not a child.

    Issue #142.

    Improve CSS selectors for both sections and cards.

    The My Network page has a variety of ways of wrapping things in HTML, so finding the right element to use can be tricky.

    Among other things, it no longer uses the headers of sections that do not have a See all button.

    Issue #142.

    Track known Logger instances.

    Due to using an older version of eslint, have to also explicitly add WeakRef as a known global.

    Issue #145.

    Wrap long lines in otrot.

    Issue #148.

    Bump version number.

  • v3.2.2 2023-09-24

    Implement a DefaultMap class, like Python's defaultdict.

    Issue #145.

    Switch everything over to the new key table generator.

    This includes some things that depended on the old CSS, but did not use the generator directly.

    Issue #110.

    Last bit of help to info migration.

    Closes #116.

    Partial migration of Scroller to #private properties.

    Only fields in this change.

    Issue #141.

    Bring current section back into view if possible.

    An interesting thing about the My Network view, is that the various subsections change upon page reload. If the user views a specific card, be it user, group, whatever, then returns, that subsection may not be there upon the reload.

    For now, we give it 10 seconds to show up, then give up. If it does show up, we go back to it. Otherwise, nothing happens.

    Issue #142.

    Switch SPA over to using RegExp for matching pages.

    This required getting rid of special handling for the global page. As a result, more than one page could be active at a time. For instance, Global matches all URLs, while a specific page may only match some URLs.

    Now we have a set of active pages. Moreover, the rewrite also handles the case where, if there is a redirect, we end up with the exact same set of pages matching, so nothing gets excessively disabled only to be immediately reenabled. Nicely, this fixes another bug!

    Closes #146, #147.

    Wrap long lines in DefaultMap',Logger, andisInput`.

    Issue #148.

    Bump version number.

  • v3.2.1 2023-09-23

    Change pages registered in SPA from a Map to a Set.

    Issue #146.

    Minor tweak to new key table generator.

    No space around the + symbol.

    Issue #110.

    Some more help to info migration.

    This time focused on keyboard related stuff.

    Issue #116.

    Migrate Dispatcher to #private properties.

    Issue #141.

    Set correct value in name: field.

    That must have been a strange copy-paste to get that value in there.

    Support clicking on a My Network section to select it.

    Also an initial refresh, which we know is incomplete, but provides a starting point.

    Issue #142.

    Turn pathname into equivalent RegExps.

    Not using them yet. That will be a bigger change considering the new requirement added to the tracking bug.

    Issue #146.

    Reflow all comments based on newly decided line-length.

    Issue #148.

    Bump version number.

  • v3.2.0 2023-09-23

    New key table generator is complete and passes all tests.

    Next we will integrate it into the UI and make it look good.

    Issue #110.

    Rename some properties with help in them.

    Mostly tab related stuff.

    Issue #116.

    Finish migrating TabbedUI to #private properties.

    Because I am using an older version of eslint, it cannot handle private methods (#foo() {...}), so we have to use function expressions (in this case, arrow functions).

    Issue #141.

    Turn off debugging for MyNetwork sections scroller.

    Issue #142.

    Make MyNetwork getters and static methods old-school _private.

    As mentioned in another recent change, I am using an older version of eslint that does not handle #privateMethods well. As I just learned, this also applies to getters.

    Doing this in a separate change to make subsequence diffs cleaner.

    Issue #142.

    Add navigation amongst cards in a section using n/p.

    Activation now only applies to cards and not sections. Instead, like with Notifications, See all will count as a card.

    Returning to the page after viewing a user is cumbersome as all state is lost.

    Issue #142.

    Bump version number.

  • v3.1.0 2023-09-21

    Give self-registering shortcuts a try.

    Using the new Page subclass, MyNetwork as a test case.

    Issue #140.

    Initial tweak to precise URL mapping.

    This is not the final form, which will likely involve RegExp. But, it does simplify issues while developing another page.

    Issue #146.

    Handle Alt key in new key table generator.

    Issue #110.

    A batch of variable renaming from help to info.

    Issue #116.

    Partial migration of TabbedUI to using #private properties.

    Only the fields in this change. Doing the methods may require rearranging code.

    Issue #141.

    Add a simple Activate current item feature.

    Does not yet do much since the only items we handle are the larger sections.

    Issue #142.

    Bump version number.

  • v3.0.0 2023-09-21

    A batch of variable renaming from help to info.

    Issue #116.

    Stop automatically binding callback functions to this.

    Everything is now converted to arrow functions assigned to properties and appears to work properly without this.

    Closes #97.

    Solve a couple more test cases for new key table generator.

    Raw upper case letter, X becomes Shift + x (this was the primary impetus for this). c-x becomes Ctrl + x.

    Issue #110.

    Add some test error messages.

    More help to info migrations.

    Update a comment and user visible text.

    Rename some properties.

    Issue #116.

    Remove leading underscore from global functions.

    Issue #141.

    Support the /mynetwork/ page.

    Basic navigation around sections.

    Supporting a new page warrants a bump in the major version number.

    Issue #142.

  • v2.20.2 2023-09-19

    Minor JSDoc tweak.

    Explicitly enable logging and announce success when running tests.

    Initial scaffolding for an improved key sequence parser/emitter.

    Will revisit and improve as time goes on. Not all test cases have expectations as we are still working out the details.

    Issue #110.

    Minor reworking of how testing is done.

    Mostly this replaces a couple of variables with underscores in their names.

    Issue #141.

    Update comment about #private properties.

    Issue #141.

    Migrate Logger to using #private properties.

    Issue #141.

    Add and handle another test case for new key table generator.

    Issue #110.

    Bump version number.

  • v2.20.1 2023-09-17

    Fix typo in comment.

    Factor out some code from the LinkedIn class into a helper class.

    While a bit of a nuisance, this does eliminate the current no-use-before-define linter issues.

    Issue #117.

    JSDoc: Normalize how @type items are described.

    @type/@param {TYPE} - Description.

    If possible, fit on a single line using /** ... */.

    If Emacs decides it wants to reflow onto two lines, then use blockquotes.

    Purposefully did not touch simple methods.

    Move URL monitoring into the SPA class.

    Closes #117.

    Switch many Notifications methods to arrow functions.

    Issue #97.

    Bump version number.

  • v2.20.0 2023-09-16

    Make selector for tab labels more precise.

    Closes #139.

    Loop through tabpanels on open to reset scroll.

    I do not think there is a way to make this work on iframes.

    Closes #138.

    Implement v R to view a posts reposts.

    Closes #109.

  • v2.19.4 2023-09-15

    Remove optional results property from a Continuation.

    Mark up a section name with the idiomatic text element.

    Issue #135.

    Handle the situation where there may not be a Jobs Scroller.

    Also, renamed variable to be consistent with surrounding code.

    Closes #135.

    All possible migrations of uses of then() to await.

    Those at the top level could not be migrated at the moment, but it turns out those will be move into class methods soon anyway, so they will be updated then.

    Closes #134.

    Switch many Jobs methods to arrow functions.

    Issue #97.

    Remove errant debug statements.

    Turn off debugging for SPA.

    Remove extraneous "with" in debug comment.

    In this case, Logger will add "with" automatically.

    Add debugging to otrot.

    Nearly identical to what is used in otmot.

    Issue #136.

    Do not wrap clicking save job button with otrot.

    Currently, toggling the Save Job button does not cause a resize of the job element. So otrot never gets a signal about a change and times out instead.

    So, just do a straight forward click instead.

    Closes #136.

    Bump version number.

  • v2.19.3 2023-09-15

    Rearrange code.

    Move standalone functions closer to the top, mostly alphabetical order.

    The Logger class is still at the top because it is used in some functions.

    Issue #117.

    Do not call methods on non-existent elements.

    Not every Page has keystroke entries. For example, JobsCollections which is in development.

    Since there is no header to highlight and normalize, we need to make sure we do not fail in those situations.

    Closes #133.

    Switch many Feed methods to arrow functions.

    Issue #97.

    Bump version number.

  • v2.19.2 2023-09-15

    Correct JSDoc from @returns to @type.

    Introduce a new configuration item to move away from a global.

    It turns out that all current Scrollers use the same value (of course, it had been a global!). So, for now, have a loop that finishes configuration for static items instead.

    Closes #131.

    Move some global properties and functions into the LinkedIn class.

    Not exactly keen on disabling the linter warnings about use-before-define, but moving the code around will be messy and so done in a separate change.

    Issue #117.

    Bump version number.

  • v2.19.1 2023-09-14

    Replace last use of VM.observe with otmot.

    They are both basically wrappers around MutationObserver and this remove the need for one @require.

    Closes #111.

  • v2.19.0 2023-09-13

    Bump version number.

  • v2.18.1 2023-09-13

    Ensure Page and SPADetails are abstract classes.

    Turn _autoRegisteredKeys from a field to a getter.

    Issue #97.

    Move destructive keystrokes to the end of the Feed list.

    As a result, the constructive keystrokes move up a bit.

    Issue #108.

    Implement Comment, Repost, and Send command in the Feed view.

    Closes #108.

  • v2.18.1 2023-09-08

    Move nav CSS styles back to the end of the list.

    Apparently there are some LI provided styles that have the same specificity for section elements, and so the LI ones, which were later in the list, were being applied. Essentially, no highlighting for section elements.

    This was only impacting the /jobs/ page, so it went unnoticed for a bit.

    Issue #106.

    Bump version number.

  • v2.18.0 2023-09-07

    Disabling spellchecking is spelled false, not off.

    Issue #94.

    Migrate tabpanels from height: 100%; to flex-grow: 1;.

    I thought I did this before committing earlier, but guess I missed it.

    Issue #94.

    Make tabpanels flex containers as well as flex items.

    This will make subsequent changes easier.

    Issue #94.

    Make the Errors tab textarea fill the tabpanel.

    Issue #94.

    Make tabpanels have a scrollbar only when necessary.

    With making nested items have scrollbars (such as the textarea in the Errors panel), we end up with double scrollbars, one of which is inactive.

    So we either have the issue where some panels have scrollbars and others do not, which makes text wrapping jump a bit (due the different line lengths) as the user navigates through panels, or we end up with double scrollbars.

    I think dealing with the text wrapping changes is better than double scrollbars.

    Issue #94.

    Lazily load the full text of the license.

    Issue #106.

  • v2.17.1 2023-09-07

    Create a couple of buttons to navigate through the tabbed ui.

    Closes #122.

    Change mouse cursor when moving over a label in the tabbed ui.

    Issue #94.

    Put tool icon into the correct location.

    We were accidentally nesting it inside the Me button, not next to it.

    Issue #125.

    Build content from array of strings instead of concatenation.

    Add vertical bar between tab labels and new buttons on the same line.

    I think it looks better. We can give it a try for a while.

    Issue #94.

    Change current tab indicator from bold text to underline.

    I have always noticed that the bolding of the text will cause things to shift horizontally because it is slightly bigger. This approach keeps the text the same size, but still indicates the current tab.

    Issue #94.

    Change CSS from height: 0 to overflow-y: hidden.

    The effect is the same (part of what makes the scrollbars show up on the content). But less confusing to understand years later.

    Issue #98.

    Bump version number.

  • v2.17.0 2023-09-06

    Reflow a comment.

    Fix a JSDoc comment missed during a recent change.

    Clarify a comment a bit.

    Trim whitespace after getting the license URL.

    Issue #106.

    Rearrange the HTML inside the TabbedUI.

    Before we were doing:

    • div-container
      • input-1
      • label-1
      • input-2
      • label-2
      • div-1
      • div-2

    Now we are going to do:

    • section-container
      • input-1
      • input-2
      • nav
      • label-1
      • label-2
      • div
      • section-1
      • section-2

    This will allow for easier styling for some upcoming changes.

    We do lose some other easy styling because we can no longer do: input:checked + label {... shine ...}

    But that is easily replaced with one line for each tab: input[data-name="foo"]:checked ~ nav > [data-name="foo"] {... shine ...}

    Issue #94.

    Add a bit more debugging info to the Errors tab.

    Update license URL to the HTML version.

    Issue #106.

    Change TabbedUI to use the CSS flexbox model.

    The panels will use columnar mode, while the tab elements will be horizontal.

    Issues #94, #98.

    Use the CSS flexbox model to style the instruction row.

    This works better when the user resizes the browser.

    Issue #94.

    Just a bit of debugging for TabbedUI.

    Remove the panels container that we just added.

    Unnecessary and interferes with a future change.

    Issue #98.

    Move the scrollbars to the inner panels of the tab view.

    This change does mix the SPA and TabbedUI CSS a bit to achieve to effect. Will need to refactor again.

    Closes #98.

    Minor tweak to info view.

    Just a horizontal line below the instructions and surrounding vertical space changes.

    Issue #94.

    Bump version number.

  • v2.16.6 2023-09-04

    Tie in an event handler to know when a tab is shown.

    This allows information to be loaded lazily.

    Issue #106.

    Rename activate event to expose.

    What can I say, I like the X Window System.

    Simple little test framework.

    Factor out a string normalizing function for reuse.

    With tests!

    Remove logging from safeId. Too chatty.

    Give more classes derived named and unique IDs.

    Makes debugging easier.

    Give installed styles unique IDs and put at the top.

    Makes it easier to identify where they came from and to find.

    Issue #106.

    Replace += based string concatenation with joining arrays.

    This makes the code easier to read. Also has the benefit of using new line characters in the style text, which is easier to read in the browser when debugging.

    Win, win.

    Issue #94.

    Missed an old string when refactoring the TabbedUI stuff.

    Issue #118.

    Add a -container suffix to the name of the TabbedUI container.

    Issue #118.

    Bump version number.

  • v2.16.5 2023-09-02

    Discovered a repeated word in a message.

    Handle cases where we cannot get the license information.

    Closes #120.

  • v2.16.4 2023-09-02

    Use a different approach to getting the license info on Tampermonkey.

    Issue #120.

  • v2.16.3 2023-09-02

    Update comments for dumpInfoAboutElement().

    Factor out the tabbed ui stuff into a new class, TabbedUI.

    Closes #118.

    Bump version number.

  • v2.16.2 2023-09-02

    Initial License tab.

    Issue #106.

    Build up the help dialog using Web API elements rather than raw html.

    We are going to need access some of the elements later in the function, and rather than looking them back up via querySelector, just keep them handy this way.

    Issue #106.

    More dynamic building of the UI rather than raw HTML.

    Also a proof-of-concept callback for when a tab is triggered so that it can be rendered lazily.

    Issue #106.

    Bump version number.

  • v2.16.1 2023-09-01

    eslint: Enable and configure padded-blocks along with fix-ups.

    Issue #69.

    eslint: Enable semi along with fix-ups.

    Issue #69.

    eslint: Enable and configure space-before-function-paren along with a fix-up.

    Issue #69.

    Bump version number.

  • v2.16.0 2023-09-01

    Do not scroll to the keys for the current page.

    Turns out to be more confusing than helpful.

    Also, always start at the top of the page.

    Issue #115.

    Document what a Promise resolves with.

    Style the hot keys header for the current page.

    Closes #115.

  • v2.15.8 2023-09-01

    Switch a number of methods to arrow functions.

    This removes the need to use bind(this) in various callbacks.

    Issue #97.

    Replace bound functions with explicit arrow functions.

    Issue #97.

    Replace bound functions with arrow functions.

    Since these functions are likely to be overridden in subclasses, need to include a post-instantiation init() function to set them up as callbacks.

    Issue #97.

    Found typo in a property name.

    Run through ispell.

    Replace bound function with explicit arrow functions.

    Issue #97.

    Bump version number.

  • v2.15.7 2023-09-01

    Initial implementation of new Logger API.

    Done in terms of the existing API while migrating.

    Issue #114.

    Improved Logger example.

    Issue #114.

    Migrate Scroller to the new Logger API.

    The irony, since Logger originated in Scroller.

    Issue #114.

    Migrate Jobs to the new Scroller API.

    Issue #114.

    Migrate LinkedIn to new Scroller API.

    Issue #114.

    Migrate SPA to new Scroller API.

    Issue #114.

    Another tweak to the Logger example.

    Issue #114.

    Remove errant log.enable() left over from debugging.

    Finish improvements to the Logger API.

    When creating a new group, it will no longer emit both the group header and the Entered message unless there is extra information passed along.

    Calls the enter/leaving and starting/finished are always checked for correct pairing even if the logger is disabled.

    Closes #114.

    Remove extra string from a log statement.

  • v2.15.6 2023-08-31

    Replace setter hack with explicit clear function.

    Closes #93.

  • v2.15.5 2023-08-31

    eslint: Use destructuring to initialize a few variables.

    Issue #113.

    eslint: Enable and configure arrow-parens along with fix-ups.

    Issue #69.

    eslint: Enable and configure comma-dangle along with a fix-up.

    Issue #69.

    eslint: Enable and configure no-extra-parens along with fix-ups.

    Issue #69.

  • v2.15.4 2023-08-31

    Remove errant log.disable() left over from debugging.

    New selector to find carousel items.

    Does not yet scroll automatically, and scrolling manually loses state.

    Issue #89.

    Add another scrollIntoView() for horizontal.

    This was eerily simple. Not sure I trust it, but works for the moment.

    Issue #89.

    Wrap the Scroller's Logger name with curly braces.

    I realized that it can be difficult to distinguish between the logs from the Scroller named "Job sections" and the class named "Jobs". Since "{Job sections}" kind of look like scrolls, wrapping the names helps provide a visual clue.

    Additional logging.

    Removed errant debug statement. Again.

    Do not reset current job section if clicking on the current one.

    Closes #89.

    Bump version number.

  • v2.15.3 2023-08-30

    eslint: Enable no-plusplus along with fix-ups.

    I am surprised this did not catch more, but I guess the fact that we use a lot of for..of loops works well. Had there been more, I probably would have enabled the allowForLoopAfterthoughts option.

    Issue #68.

    eslint: Enable no-shadow along with fix-ups.

    This found a real bug!

    Issue #68.

    eslint: Comment on no-unused-expressions along with some fix-ups.

    Again, due to old system, this currently gives false positives for optional chaining, so leave off for now.

    Issue #68.

    Minor comment cleanup.

    eslint: Enable prefer-named-capture-group along with fix-ups.

    Issue #68.

    eslint: Enable prefer-promise-reject-errors along with fix-ups.

    Issue #68.

    eslint: Enable require-unicode-regexp along with fix-ups.

    Issue #68.

    eslint: TIL about the greasemonkey environment.

    eslint: Enable and configure yoda along with a fix-up.

    Closes #68.

    Bump version number.

  • v2.15.2 2023-08-30

    Move LIT icon to after the Profile/Me icon.

    Just being polite when the window is really narrow.

    Issue #112.

    Collect issues that happen before the Errors panel is built.

    Closes #112.

    Bump version number.

  • v2.15.1 2023-08-30

    eslint: Enable and configure no-bitwise along with some fix-ups.

    Issue #68.

    eslint: Enable no-else-return along with a fix-up.

    Issue #68.

    eslint: Enable no-empty-function along with some fix-ups.

    Ideally, I would have added a comment like /* No-op. */ to the functions, but that triggered another lint issue. And THAT one could be addressed if I was using a modern version of eslint.

    Issue #68.

    eslint: Enable and configure no-magic-numbers along with fix-ups.

    This did expose some, even those that were 1, so I addressed those. But most were of the first-item-in-array or next-item kind of things.

    Issue #68.

    Reorder key sequences in the help view.

    Make them all consistent:

    • View only commands first.
    • * Nav first, major then minor.
    • * Various load more content.
    • State changing commands.

    Closes #63.

  • v2.15.0 2023-08-30

    Add notification bubbles to the LIT icon.

    Made use of the CSS classes LI already provides for the error count. Made own for use with any future News tab.

    Closes #105.

  • v2.14.5 2023-08-29

    Rename function from On to Until.

    Add a Tool icon for the userscript.

    Does not do anything yet, but it looks good.

    Issue #105.

    Tie the Tool button into bringing up the help dialog.

    Also migrated the ? key to click that button rather than bringing up the dialog directly.

    Issue #105.

  • v2.14.4 2023-08-29

    Refactor: Move dumpInfoAboutElement into SPA.

    Closes #100.

    Add some data-spa-id attributes to help view tab elements.

    Issue #105.

    Give SPA its own Logger.

    Rename _initializeHelpMenu to _initializeHelpView.

    Make SPADetails a class to instantiate, not just a static class.

    It turns out that trying to implement an inherited class full of static properties and methods is just too annoying.

    Issue #105.

    help view: Highlight the Errors tab if here are any logged.

    Issue #105.

    Framework to allow SPA to notify SPADetails on things.

    Issue #105.

    Add debug logging to otmot.

    Migrate waiting for the navbar to appear to inside LinkedIn.

    Upcoming changes require the navbar to already be present. Since we already have code waiting for it, makes sense to move that into this class.

    We then wait for that to finish before proceeding with the rest of the initialization. And this is probably a Good Thing (tm) anyway.

    Issue #105.

  • v2.14.3 2023-08-28

    Fixed typo in name of a property.

    Add platform information to the Errors panel in the help view.

    Issue #105.

    Rename global logger.

    Move some typedefs closer to where they are used.

    Rename Pages to SPA.

    The Pages class has very little that is LinkedIn specific, but we will be moving what little bit is out.

    This is a good time to rename it to SPA, for single-page application.

    Issue #107.

    Reword comment that is now confusing after renaming a class.

    Issue #107.

    Rename variables from pages to spa.

    Amusingly, not all users of pages referred to the Pages instance.

    Issue #107.

    Rename CSS classes, et al.,from lit- to spa-.

    It was short for LinkedIn Tool, but now a bit more generic.

    Issue #107.

    Document SPA properties.

    Issue #107.

    Factor out LinkedIn specific information from SPA.

    Closes #107.

  • v2.14.2 2023-08-27

    Minor tweak to help view tab headers.

    Make current tab bold and retire the * marker.

    Issue #94.

    eslint: Enable no-alert along with some fix-ups.

    Issues #68, #105.

    help view: Add header and minor content update to Information tab.

    I just discovered GM.info and noticed it has some useful information.

  • v2.14.1 2023-08-27

    Give each Page its own Logger instance.

    Issue #104.

    Configure a second MutationObserver for Jobs.

    In order to capture changes to certain sections, we need to observe changes to classes. However, these need to be done for the subtree. Monitoring the entire subtree for childList changes, however, is excessive and results in both multiple matches and noticable performance issues.

    Since we are observing the same element (div.scaffold-finite-scroll__content), we need two observers. Fortunately we can reuse the same callback function.

    Closes #86.

    Bump version number.

  • v2.14.0 2023-08-27

    Scroll to keyboard help for current view if available.

    Closes #55.

  • v2.13.5 2023-08-26

    Change help view tab navigation to control-arrow keys.

    This was easier than trying to deal with having the user need to tab out of the textarea to get navigation back.

    Closes #99.

  • v2.13.4 2023-08-26

    eslint: Enable and configure max-statements along with a fix-up.

    Issue #68.

    Set local values with destructuring assignments for what/how patterns.

    This came out of examining ways to reduce code for the eslint max-statements directive.

    This style makes it easier to provide default values for optional items. Also, all items are accessed consistently.

    Reordered some values for consistency.

    Made one timeout officially optional with a default of 0.

    Messed up renaming of a local variable in last change.

    Factor out the Scroller logging logic into a Logger class.

    Keeps all of the feature that the original logging had plus:

    • Can turn on/off at runtime.
    • Can switch inclusion of stack traces at runtime.

    Instatiated a global logger and migrated few explicit uses of console.debug to it.

    Closes #104.

  • v2.13.3 2023-08-26

    Properly document a property as optional vs nullable.

    eslint: Migrate otrot2 to the what/how pattern.

    Issue #101.

    eslint: Migrate otmot to the what/how pattern and configure max-param.

    Closes #101.

  • v2.13.2 2023-08-24

    Properly document a property as optional vs nullable.

    Turn off debug mode for the jobs scroller.

    eslint: Migrate otrot to the what/how pattern.

    At least one of the one time observers has too many parameters. Will migrate all of them to the what/how pattern to keep them consistent, even in this case where it is only 3 parameters.

    Issue #101.

  • v2.13.1 2023-08-24

    Make the onClickSelector a bit more precise.

    Right now we call refresh at the some time we reenable the onClick event handler. No technical reason, was just convienent.

    However, in this case, that calls refresh before enough of the notifications view is rebuilt that the notification cards are not yet present.

    Here we try to make sure more of the page is repopulated before doing the same stuff.

    Most likely this is not sufficient, but perhaps Good enough.

    Closes #103.

  • v2.13.0 2023-08-24

    Support the New notifications button.

    Using the same approach we used for loading new posts in the feed. If the button is present, go to the first item, otherwise, try to keep the current position.

    Closes #102.

  • v2.12.5 2023-08-23

    Add missing word in comment.

    Remove stale comment.

    Issue #39.

    eslint: Make a SimpleFunction callback in JSDoc.

    This will ease an upcoming change.

    Issue #68.

    Minor typo in comment.

    eslint: Reduce number of parameters to Scroller.

    Six was too many. Now broken down to just What and How objects.

    Issue #68.

    Bump version number.

  • v2.12.4 2023-08-23

    Click on any link or button found in a notification card.

    If a card does not have a match for .nt-card__headline, then just try any single button or link. This happens to catch the case where the only thing in a card is the Undo (the delete) button.

  • v2.12.3 2023-08-22

    Use optional chaining in Page.

    Issue #92.

    Use optional chaining in Global.

    Issue #92.

    Use optional chaining in Feed.

    Issue #92.

    Apply similiar style to _viewReactions as used in last change.

    Unrelated to ongoing optional chaining work, but nice to have.

    Use optional chaining in Jobs.

    Issue #92.

    Use optional chaining in Pages.

    Closes #92.

    Bump version number.

  • v2.12.2 2023-08-22

    Use optional chaining in Scrollbar.

    Issue #92.

    Looks like they are rolling out new class names for post reactions.

  • v2.12.1 2023-08-22

    eslint: Add JSDoc for the last remaining functions.

    Issue #71.

    eslint: Enable max-lines-per-function along with a fix-up.

    Seems like a reasonable default limit. Except of course, for userscripts IIFE.

    Issue #68.

    Bump version number.

  • v2.12.0 2023-08-22

    Remove unnecessary wrapping by Array.from().

    Log error messages into the Errors panel in the help view.

    Users can now easily edit/sanitize then copy-and-paste the content into a bug report.

    Closes #39.

  • v2.11.1 2023-08-21

    Tweak how buttons look in the help view.

    • Support ⋯ as an actual button
    • Disabled so they cannot be tabbed to
    • Rounded a bit more

    Closes #43.

  • v2.11.0 2023-08-21

    Remove matchesKnownText() approach to finding buttons.

    Everything now goes through one approach, simplifying the function.

    We may find more in the future. But for now, nice and clean.

    Closes #42.

  • v2.10.2 2023-08-21

    Detect when toggle+next is executed before there is a current item.

    Issue #95.

    Refactor how empty items are detected.

    Both approaches were necessary, but neither sufficient.

    Closes #95.

  • v2.10.1 2023-08-20

    Minor tweak to a comment and remove an outdated eslint directive.

    Remove float: left from a span.

    While cute in that is allows symmetry between the two consecutive spans, it caused the wrapping div to have a height of zero. And that caused the hr to be in the middle of the text.

    Remove jitter when there is an active comment during toggle+next.

    Handle feed positioning better when loading more posts.

    Introduced otrot2. This function watches for resizes and simply calls an action function every time it sees something.

    Essentially, we are constantly trying to put the window back where it was.

    Works well for adding new posts at the end. When the Load more posts button comes up, however, just give up and jump to the first post. Sorry.

    Closes #96.

  • v2.10.0 2023-08-20

    Minor tweak to a comment.

    Simple refactoring of the generation of the help view.

    Issue #39.

    Start building the help view programmatically.

    This will reduce the need to keep the number of tab style selectors and tab content in sync.

    Issue #39.

    Finish with generating the help view programmatically.

    Issue #39.

    And pointers on where to find documentation and how to file feedback.

    Closes #39

  • v2.9.1 2023-08-20

    eslint: Add JSDoc for the Pages class.

    Issue #71.

    eslint: Enable func-names along with appropriate fix-ups.

    Issue #68.

  • v2.9.0 2023-08-19

    Minor tweak to description for the ? key.

    Issue #44.

    More cheesy CSS to indicate the current tab.

    Can you tell I use a lot of text mode interfaces?

    Issue #44.

    Add keystroke support for selecting current help tab.

    Still ugly, but working. Will file another bug to pretty is up.

    Closes #44.

    Add initial support for an Errors panel.

    Issue #39.

    Bump version number.

  • v2.8.3 2023-08-19

    Use -1 as the tabindex in focusOnElement.

    Refactor _setInputFocus to be more general.

    Issue #24.

    Disable hotkeys while help dialog is up.

    Closes #24.

  • v2.8.2 2023-08-19

    Forgot to update comment after copy-and-paste.

    Implement (barely) a tabbed view on the help screen.

    The styling is crap. There is useful new content. And, ironically, the only way to switch between tabs is by using a mouse.

    But, it is a start.

    Issue #44.

  • v2.8.1 2023-08-18

    eslint: Normalize how @type is used.

    Descriptions go above the type.

    Simple definitions are inlined in comments.

    Issue #71.

    eslint: Configure valid-jsdoc to no longer requireReturn.

    Also remove all of the @returns {void} directives. Just too noisy.

    Issue #71.

    eslint: Add JSDoc for the Notifcations class.

    Issue #71.

    Move comment off of opening comment line, just for consistency.

    eslint: Enable curly and apply fix-ups.

    Issue #68.

  • v2.8.0 2023-08-18

    Implement ability to jump directly to the sidebars when present.

    Use the , and . keys.

    Closes #91.

  • v2.7.2 2023-08-18

    LI changed the Feed UI again and post menu was not working.

    Not sure if rolling it out then back again, or I am hitting a different server or what. I also notice that the Like/Comment/Repost footer changed back to the old one as well.

    Using both old and new selectors now.

    Issue #78.

  • v2.7.1 2023-08-18

    eslint: Add JSDoc for the Jobs class.

    Issue #71.

    Rename monitor function from f to monitor.

    eslint: Enable consistent-return and apply a single fix up.

    Issue #68.

    Tweak dumpInfoAboutElement a little bit.

    Support some more notification types.

    It appears that there are buttons as well as anchors with the .nt-card__headline class. Testing seems to indicate that only one or the other appears.

    It turns out that deleted notifications have neither. But we can detect the Undo button and click it. If we ever see another Apply early notification though, and it turns out it can be found with .nt-card__headline, then we will probably drop matchesKnownText(), and thus supporting the Undo through activation.

    Issue #42.

    Use otrot to monitor changes when deleting a notification.

    Did not look into details. Most likely the element gets completely rebuilt, so need to wait for things to settle down before looking for new the one.

  • v2.7.0 2023-08-17

    Implement save and dismiss toggles for jobs.

    Tied to the S and X keys, respectively.

    Closes #88.

  • v2.6.4 2023-08-17

    Improve focusing a bit.

    While technically not related to this particular issue, it will the user experience a bit better.

    Issue #90., Followup to previous change for another page.

    Technically, this one is not necessary since we are not dealing with nested Scrollers here. However, it does no harm and makes the code consistent.

    Issue #90., Use a better selector to find the load more content button.

    I am starting to recognize some of these things.

    Issue #90., Rename trigger function from f to trigger., Handle scrolling while loading more consistently: stay in place.

    Invoking a manual load would cause the currently selected items to come back into view. If the user had purposefully scrolled them out of view then manually invoked load more again, this would be impolite.

    Also added this stickiness to Notifications.

    Closes #90.

  • v2.6.3 2023-08-17

    Restore currently selected job when elements are automatically loaded.

    Issue #87., Bump version number.

    Closes #87.

  • v2.6.2 2023-08-17

    The previous change did break something: job navigation.

    Issue #68.

  • v2.6.1 2023-08-17

    Minor comment formatting tweaks., eslint: Improve some existing JSDoc., eslint: More improvements to existing JSDoc., eslint: Add JSDoc for the Feed class.

    Issue #71., eslint: Enable class-methods-use-this.

    Resulted in a lot of methods become static, and needing to update the callers.

    Hopefully I did not break anything.

    Issue 68.

  • v2.6.0 2023-08-16

    Only obvserve childList changes., Minor typo in a comment., eslint: Add JSDoc for the Global class.

    Issue #71., Factor out code for dumping stuff to console.debug.

    Have an upcoming use for it.

    Issue #39., Clarify a description a bit., Use optional chaining (?.) to avoid throwing an error when returning to the sidebar., Add navigation through jobs within a jobs section.

    Support next/previous with n/p. Jobs can be activated (visited) with the Enter key.

    The first/last/focus actions (<, >, f) are context sensitive for the section or job items.

    Like for the Notifications page, the way to uniquely identify job entries is complicated. Lots of variations.

    Known problem with losing track of the current job is more of anything is loaded (sections or job items).

    Closes #62.

  • v2.5.10 2023-08-16

    Support clicking on a job section to select it.

    Issue #46., Turn off sectionScroller debugging., Implement detection for when the current job section is rebuilt.

    A Rube Goldberg device, indeed.

    Closes #46. Closes #84.

  • v2.5.9 2023-08-15

    Port Job section navigation to the Scroller class.

    Another easy port. Bug compatible (one thing about doing these migrations is testing more corner cases and trying to figure out if something is a new bug or an old one).

    Closes #75.

  • v2.5.8 2023-08-15

    Typo: there -> where, Put guards around this.item in shine() and dull()., Refocus on current item when returning to a page.

    Different pages have different things they need to do. Notifications are small, so they are all loaded up front, and can see it right away. Meanwhile, posts are loaded lazily, and we need to wait for the content to be present before acting on them.

    Not perfect. I am sure corner cases will show up.

    Issue #46.

  • v2.5.7 2023-08-15

    Update how we find the button for loading more comments.

    Turns out there are at least two different messages, but they share a common CSS class. So now we can use clickElement() as well.

    Closes #83.

  • v2.5.6 2023-08-15

    Remove comment.

    The request is asked for is not possible with JS.

    Closes #82., Differentiate reject messages a bit., Verify item existence before scrolling to it., Turn off debugging for the notification Scroller., Save and restore current post AND comment before loading more.

    This is not a perfect solution. If the comment is not the bottom on on the page, it will be. So a little bit of jitter. But at least in the same realm.

    Also, if the user does a lot of loads and navigating around through comments at the same time, the UI may end up scrolling elsewhere (to where new content is loading). Either focus or another navigation (comment or post), will bring it back into view.

    Closes #79.

  • v2.5.5 2023-08-14

    esline: Enable camelcase.

    Renamed some variables from snake_case to lowerCamelCase.

    Issue #68., Turn off Scroller debugging for Feed.

    Issue #75., Port Notification navigation to the Scroller class.

    This was an easy one. Unsurprising since many of the special cases Scroller was designed to handle came from Notifications.

    Issue #75.

  • v2.5.4 2023-08-14

    eslint: Add JSDoc for the Page class.

    Issue #71.

  • v2.5.3 2023-08-14

    Add @noframes userscript directive.

    Closes #81.

  • v2.5.2 2023-08-14

    Simple renaming of event from href to urlchange.

    Issue #74., Rename function from onHref to onUrlChange.

    Issue #74., Use Tampermonkey's urlchange monitoring if available.

    Closes #74., Missed some eslint directives on previous change.

    Issue #74.

  • v2.5.1 2023-08-13

    eslint: Redo otmot and otrot documentation as JSDoc.

    Issue #71., eslint: Add JSDoc for set item.

    Also improve the docs for _msg.

    Issue #71.

  • v2.5.0 2023-08-13

    Port Feed navigation to the Scroller class.

    Appears to be bug compatible with previous iteration.

    This is a big enough refactor to bump the middle version number.

    Issue #75.

  • v2.4.9 2023-08-13

    Update CSS selector to find the view reactions button.

    Closes #80.

  • v2.4.8 2023-08-13

    Add new change event type to the Scroller dispatcher.

    Issue #75., Add more logging to _scrollToCurrentItem().

    Issue #75., Add new shine() and dull() methods to Scroller.

    These will add/remove the CSS classes to the current item.

    From current post tracking stuff, we know we need to remove the highlights before attaching a ResizeObserver. See 5de89b4.

    Issue #75., Add new show() method to Scroller.

    Necessary to support otrot since will we no longer have a view specific _scrollToX().

    Issue #75.

  • v2.4.7 2023-08-13

    Rename _comment to _comments.

    This better reflects that this is a container (Scroller).

    Issue #75., Rename _activeComment to _hasActiveComment.

    Issue #75., Update initial debug message.

    Now that we are using eslint on a regular basis, and that catches parsing errors, we don't need the line to say anything about parsing.

    However, now that it is at the end of the file, I have noticed it will fail during initialization issues.

    So might as well make it about that., Create a postScroller.

    Not used anywhere yet, but this bit seems stable.

    Issue #75., Use new selector to find menu button in posts.

    Closes #78.

  • v2.4.6 2023-08-12

    eslint: Enable arrow-body-style and configure no-confusing-arrow.

    Apparently it is well known that these two do not play well together out of the box.

    As a result, also revert a change as a result of earlier linting.

    Issue #68.

  • v2.4.5 2023-08-12

    eslint: Batch of new JSDoc comments.

    Issue #71.

  • v2.4.4 2023-08-12

    Create a simple Dispatcher class.

    Issue #77., TIL: Nullish coalescing assignment, Replace parentCallback with a dispatched message.

    Migrate the comment scroller to use it.

    Closes #77.

  • v2.4.3 2023-08-11

    eslint: enable no-use-before-define.

    This did require moving some code around. No changes, just moves.

    Closes #67.

  • v2.4.2 2023-08-11

    Do not create comment scroller when no active post.

    In testing, only the first/last actions cause the script to get confused at this point. So only those are using the new activeComment property.

    Closes #76.

  • v2.4.1 2023-08-11

    Clean up: Rename clickHandler to onClick.

    And related names.

    Closes #73.

  • v2.4.0 2023-08-11

    Missing trailing semicolon., Factor out common navigation code to a new Scroller class.

    And migrated comments to using it.

    It should have most of the bits necessary to support are current corner cases. I'm sure that future ports will expose some that are missing.

    Also first foray into using JSDoc. I'm sure I'm doing some of it wrong.

    The _msg method is probably over kill, but it sure was handy in debugging. Purposefully leaving it enabled for comments for the time being.

    This is a big enough refactor that I went ahead and bumped the middle version number.

    Closes #65.

  • v2.3.3 2023-08-10

    eslint: Investigate no-ternary and address a couple of issues.

    I like the ternary operator, but agree it is not always the best solution. For instance, I just learned about the Nullish coalescing operator and think that is a better solution in some of these case flagged. But certainly not all. And there are currently enough left over to use selective disabling. So, leaving it turned off for now.

    A refactoring in progress will remove most of those, however, so when that is done, I think it will be appropriate to revisit this.

    Meanwhile, there are also a couple of similar ternary related rules and while they do not trigger on any existing code, I went ahead and enabled them.

    Issue #68.

  • v2.3.2 2023-08-09

    Reenable no-console lint check.

    I do have a habit of having to delete, or almost checking in, errant debug statements.

    Issue #66., Enable more eslint rules.

    Went through https://eslint.org/docs/latest/rules/#possible-problems and turned on ones that look useful and required minimal changes.

    Issue #66.

  • v2.3.1 2023-08-09

    Change accident var to const., Remove unnecessary local variable., Address easy to deal with eslint errors.

    Issue #66., Fix bug introduced by 2df7434a.

    Found by eslint. Missed because we do not yet support any views on longer URLs. Well, that and because lack of tests.

    Closes #66.

  • v2.3.0 2023-08-08

    Implement load more sections with the l key.

    Necessary when the window is narrowed and autoloading becomes disabled.

    Closes #64.

  • v2.2.0 2023-08-08

    Implement jumping to first/last section on the Jobs page.

    Closes #61., Make description for the other first/last keys consistent.

  • v2.1.3 2023-08-07

    Implement a quick hash to use for identifying notification cards.

    Not used yet. Still need to handle the case of deleted cards.

    Issue #60., Switch notifications to using a unique identifier for cards.

    Notifications cards are a pain. Different variations, the elements change out from under us, and when deleted, no identifying marks at all.

    Still, this seems to work.

    Close #60.

  • v2.1.2 2023-08-07

    Handle Enter more carefully.

    Closes #54.

  • v2.1.1 2023-08-07

    Factor out the code for focussing on the sidebar.

    Issue #57.

  • v2.1.0 2023-08-07

    Move the + n onto the previous line., Make post navigation looping include the sidebar.

    Issue #57., Make notification card navigation looping include the sidebar.

    I'm starting to see a pattern here.

    Closes #57.

  • v2.0.2 2023-08-07

    Switch posts and comments to tracking via a unique identifier.

    This will (mostly) track posts between feed views.

    Upon returning to the feed, if the previous post was not in the currently loaded posts, it won't be found, and will reset to the top post. But maybe that is something we can revisit in the future.

    Closes #59., Bump version number.

  • v2.0.1 2023-08-07

    Update stuff about browser focus.

    • Factor out how we save and restore tabindex
    • Add focus support to notifications
    • Make help screen wording consistent

    Closes #58., Bump version number.

  • v2.0.0 2023-08-07

    Support the /jobs/ page.

    Not perfect, but is usable.

    User can navigate up and down through the sections and focus on the current section and TAB through items.

    Supporting a new page warrants a bump in the major version number.

    Closes #56.

  • v1.10.6 2023-08-06

    Reduce jitter when jumping to the last post.

    Turns out that posts at the end are loaded lazily as they scroll into view. So jumping to the last one can be a chaotic experience.

    Now just jump to the last fill post, and let the next ones start filling up.

    Closes #53.

  • v1.10.5 2023-08-06

    Remove jitter when explicitly loading more posts.

    LinkedIn's UI will explicitly jump to the new posts at the end of the page when loading. Now detect when the containing div changes size before scrolling back to our own idea of the current post.

    Now the user can use l to load more posts while reading, and do so multiple times while leisurely scrolling through currently loaded posts.

    Unfortunately this does not handle the case when going to the last post with > and autoloading kicks in. Since autoloading may or may not kick in, handling that case may be different.

  • v1.10.4 2023-08-06

    Removed errant debug statement., Fix issue where the initial next post goes to the second post.

    The incr+mod approach works nice for looping once already established. But that first time in needs a little hand holding.

    Another approach would be, if the first action is next post, to set current index to posts.length instead of -1, but the math works out the same way.

    Closes #52.

  • v1.10.3 2023-08-06

    Rewrite how we monitor for url changes.

    Previously we were monitoring every single element added/removed to the web page and using that as an execuse to check to see if the URL changed.

    Now we know that div.authentication-outlet is sufficient. So use otmot to monitor for that special div to show up, then register a long lived MutationObserver to it.

    I had hoped that we could monitor only that div's direct descendents changing as the pages are being rewritten. However, those particular elements are removed and new ones added before the URL is updated (in many cases). As a result, we miss the change.

    We could revisit and restrict this MO to the smaller subset, and if we create a more thorough only until the URL changes., Remove errant debug statement., Remove jitter from toggle+next action.

    Use a ResizeObserver to detect when the toggled post collapses and scroll back to the current post.

    I'm not sure how this works so well. I expected there to be more jitter, but at least ending up at the right place.

    I suspect that things just happened to get queued the right way so all updates are resolved before the next screen refresh. Pure luck, but I'll take it.

    There can still be a little bit of jitter as rendering of letters seems to occasionally shift a pixel or two. This may be related to the scrollbar resizing when elements are reduced in size, and then subsequent adjustements by the engine. But they are very minor, especially compared to the previous jitter.

    Closes #17.

  • v1.10.1 2023-08-05

    Rewrite how we detect the height of the navbar.

    There was no functional need for this particular rewrite. Instead, it is a prepatory refactor for upcoming changes.

    Specifically, it is learning how to tie together Promises and MutationObservers.

    Issues #17, #46.

  • v1.10.0 2023-08-05

    Implement P to go to the Start a post share box.

    Does not start anything, just scrolls it into view and gives focus. The user can then start writing a post there, or TAB to one of the other items to start creating something.

    Closes #34.

  • v1.9.0 2023-08-05

    Fix issue where first k will visit next-to-last post.

    Closes #51., Support Load previous replies button.

    When reading comments, use that button first, if not present, then the Load more comments button.

    Closes #30.

  • v1.8.1 2023-08-04

    Remove errant debug statement., Switch notification activation from a to Enter.

    An incompatible change, but it seems to make more sense.

    Closes #50., Implement click-to-visit on notifications.

    Not that it works all that well. Clicking all notifications I currently have is the same as activating it. So by the time we receive the click, all of the notifications have already been removed, so unable to find it for tracking purposes. When the user comes back to the page, nothing can be found.

    The only thing that keeps the notification around is clicking on the menu.

    Closes #47.

  • v1.7.0 2023-08-04

    Implement ability to jump to first or last post loaded.

    When in the middle, and want to get to and end fast, here you go.

    Issue #48., Implement ability to jump to first or last notification loaded.

    Closes #48.

  • v1.6.0 2023-08-04

    Implement l to load more notifications.

    Closes #49.

  • v1.5.0 2023-08-04

    Do scroll to top of post if no comment is selected.

    It turns out that if the user reads a lot of comments, then scrolls back to the top of the post, the user cannot easily read the post again. We simply don't scroll in that situation.

    We want to keep from scrolling in the situation where the users requests more comments when in the middle of reading some. But not when they scroll off the top.

    Issue #28., Let users loop through loaded comments.

    When visiting a post, p will go to the last loaded comment. When visiting the last loaded comment, n will go to the top of the post.

    Issue #29., Let users loop through loaded posts.

    On initial load, no post is selected, and j would take the user to the first post. Now, in that state, k will take the user to the last post. While on the first or last post, they will go to the opposite end (unlike comments, which will take the user back to the containing post). A little bit inconsisent, but I think appropriate.

    One current problem is, when visiting the last post, it will often the UI to load more posts. This loading will interfere with keeping the current post in view. This problem exists else where as well, so a common solution will be needed. However, once posts are loaded, navigating up or down then back will get to the correct post.

    Issue #29., Let users loop through notifications.

    Closes #29.

  • v1.4.0 2023-08-03

    Minor tweak to how missing notifications are logged., The View N Jobs notification can also be activated by a link.

    Switch to using that to simplify the code.

    I suspect, but do not yet know, this will work for most, if not all, notifications. But need more examples first.

    Issue #42., A debugging alert.

    Hopefully I'll trigger this soon before I forget about it.

    Issue #42., Implement X to toggle a notification deletion (like hiding a post).

    This is certainly much faster than = TAB RET.

    Moved undeleting a notification from = to X for consistency.

    Issue #35.

  • v1.3.0 2023-08-03

    More precise selector catches better anchors.

    Lots of investigation for a simple improvement.

    Issue #42.

  • v1.2.0 2023-08-03

    Implement v r to view an item's reactions.

    Issue #23.

  • v1.1.0 2023-08-03

    Implement v p to view a post directly.

    Not happy with it, as it currently causes a page reload. Hopefully can figure that out in the future.

    Issue #23.

  • v1.0.3 2023-08-02

    Factor out common button clicking pattern.

    Code is a little easier to read, and avoids the possibility of doing something like undefined.click().

    Closes #38.

  • v1.0.2 2023-08-02

    Wrap most querySelectorAll with Array.from and avoid Array.prototype.func.call.

    It does make the code look cleaner.

    Closes #37.

  • v1.0.1 2023-08-02

    Change uses of findIndex to indexOf.

    Issue #37.

  • v1.0.0 2023-08-01

    Support the /notifications/ page.

    Adds navigating up and down posts, opening the menu, and activating the notification (same as click on it).

    Not perfect, but works well enough to ship and get feedback.

    I had most of my notifications turned off, so I am unable to test against most of them. And it appears that almost every notification has a different way of activating it. So I'm sure I missed many.

    Supporting a new page warrants a bump in the major version number.

    Closes #35.

  • v0.20.2 2023-08-01

    Reflow and improve some comments., Switch to only tracking focus events for disabling hotkeys.

    The previous implementation depended on catching blur events to determine if a user left an input field so that hotkeys could be reenabled. However, it turns out that those events will not be fired if the focused element is destroyed. When a focused element is destroyed, focus will change, causing another focus event, so that can be used to see what really happened.

    Did involved introducing a new global variable, but really, that is what setContext is doing anyway, just hidden.

    Closes #36.

  • v0.20.1 2023-07-31

    Do not focus on the post if it is already the one we are reading.

    Mostly for when loading comments, we keep our current position rather than popping back to the top of the post.

    Usually I'm not a big fan of early returns, but the function is small enough I think it is all right for now.

    Closes #28.

  • v0.20 2023-07-31

    Use the f key to change the browser focus to the current item.

    We were intentially not updating the browser focus because it requires adding tabindex the the element, and apparently that is bad form, accessibility wise. However, there are times when it is useful. So this will temporarily update tabindex, focus, then drop tabindex.

    Closes #33.

  • v0.19 2023-07-31

    Handle the case where the element passed to inInput does not have a tagName.

    Not sure if this is because of the previous change, or I just never noticed this before. Sometimes the element passed to isInput is document, which does not have a tagName property. And referring to it would throw exceptions. Really all this does is makes sure not to clutter the log., Support the = to bring up a nearby menu.

    I wanted to use the - key, but the library I'm using doesn't support that. Bummer.

    Closes #32.

  • v0.18.5 2023-07-31

    Make the isInput function a bit more robust.

    It now handles textarea as well as input fields.

    I have not come across any textareas on LI, but because of the converstation on https://github.com/violentmonkey/vm-shortcut/issues/10, I decided to update it.

  • v0.18.4 2023-07-31

    Just a version change to trigger a push to openuserjs (take 2).

  • v0.18.3 2023-07-31

    Just a version change to trigger a push to openuserjs.

  • v0.18.2 2023-07-31

    Update @supportURL to point to newly written documentation.

    Also update @description to match the new docs.

  • v0.18.1 2023-07-30

    Add license to the source file.

  • v0.18 2023-07-30 Imported from URL