LinkedIn Tool

Minor enhancements to LinkedIn. Mostly just hotkeys.

这是此脚本的所有版本。 只显示代码更新过的版本

  • 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

    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.

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

显示脚本的所有版本