Kanka Search Upgrades

Adds a link to the full Search page to top bar search results so you can look in content in addition to entity titles, and optionally looks for user and campaign settings that match your query.

目前為 2023-03-28 提交的版本,檢視 最新版本

// ==UserScript==
// @name         Kanka Search Upgrades
// @namespace    http://tampermonkey.net/
// @version      3
// @description  Adds a link to the full Search page to top bar search results so you can look in content in addition to entity titles, and optionally looks for user and campaign settings that match your query.
// @author       Salvatos
// @match        https://kanka.io/*
// @icon         https://www.google.com/s2/favicons?domain=kanka.io
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

// PREFERENCES
const requireSettingsSwitch = true; // Set to false to always show matching settings, or true to require the character below to trigger settings search
const settingsSwitch = "#"; // If the above is true, settings search only happens when your query starts with this character (must be a single character)

GM_addStyle(`
#content-search-prompt {
}
#content-search-prompt:hover {
}
#content-search-prompt a {
	color: var(--search-cursor-text) !important;
}
#matched-settings a {
	display: inline;
	color: var(--link-text) !important;
	padding: 0;
    font-size: 13px;
    text-decoration: underline;
}
`);

// Prepare base URLs for this campaign/user
const campaignPath = location.pathname.split("/", 4);
const campaignId = campaignPath[3];
let campaign = location.origin + campaignPath.join("/");
const userPath = location.pathname.split("/", 2);
let settings = location.origin + userPath.join("/");

// Define settings pages
const settingsPages = [
    // Profile
    {
        title: "Default list layout (user)",
        keywords: "flat nested entities tree view",
        url: `${settings}/appearance`
    },
    {
        title: "Advanced mentions",
        keywords: "",
        url: `${settings}/appearance`
    },
    {
        title: "User theme", keywords: "dark",
        url: `${settings}/appearance`
    },
    {
        title: "Pagination",
        keywords: "page results per",
        url: `${settings}/appearance`
    },
    {
        title: "Date format",
        keywords: "",
        url: `${settings}/appearance`},
    {
        title: "New entity workflow",
        keywords: "creation", url: `${settings}/appearance`
    },
    {
        title: "Text editor",
        keywords: "summernote tinymce",
        url: `${settings}/appearance`
    },
    {
        title: "Campaign switcher sorting order",
        keywords: "list",
        url: `${settings}/appearance`
    },
    {
        title: "Notifications",
        keywords: "newsletter updates news subscriptions",
        url: `${settings}/notification`
    },
    {
        title: "Profile",
        keywords: "privacy name username avatar picture",
        url: `${settings}/profile`
    },
    {
        title: "Boosters",
        keywords: "boosted campaigns boost superboost superboosted",
        url: `${settings}/boost`
    },
    {
        title: "Payment method",
        keywords: "credit card paypal currency",
        url: `${settings}/billing-information`
    },
    {
        title: "Subscription",
        keywords: "tier level subscribe upgrade downgrade kobold owlbear elemental wyvern",
        url: `${settings}/subscription`
    },
    {
        title: "App integration",
        keywords: "sync discord",
        url: `${settings}/apps`
    },
    // Campaign
    {
        title: "Campaign overview",
        keywords: "edit delete",
        url: `${campaign}/campaigns`
    },
    // Main settings form
    {
        title: "Campaign settings",
        keywords: "name description image picture",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-entry`
    },
    {
        title: "Campaign visibility",
        keywords: "public private",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-public`
    },
    {
        title: "Campaign language",
        keywords: "language locale",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-public`
    },
    {
        title: "Game system",
        keywords: "rpg",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-public`
    },
    {
        title: "Campaign theme",
        keywords: "",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-ui`
    },
    {
        title: "Member list visibility",
        keywords: "users members privacy",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-ui`
    },
    {
        title: "Entity history log visibility",
        keywords: "",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-ui`
    },
    {
        title: "Entity tooltips",
        keywords: "",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-ui`
    },
    {
        title: "Default entity connections interface",
        keywords: "explorer list relations",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-ui`
    },
    {
        title: "Default list layout (campaign)",
        keywords: "flat nested entities tree view",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-ui`
    },
    {
        title: "New posts collapsed by default",
        keywords: "",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-ui`
    },
    {
        title: "Default permissions for new entities and elements",
        keywords: "visibility default entity",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-permission`
    },
    {
        title: "Dashboard header text and image",
        keywords: "",
        url: `${campaign}/campaigns/${campaignId}/edit#tab_form-dashboard`
    },
    // Other campaign options
    {
        title: "Export campaign",
        keywords: "",
        url: `${campaign}/campaign-export`
    },
    {
        title: "Recover deleted entities",
        keywords: "recovery restore archive",
        url: `${campaign}/recovery`
    },
    {
        title: "Achievements",
        keywords: "",
        url: `${campaign}/stats`
    },
    {
        title: "Member list",
        keywords: "members users invite",
        url: `${campaign}/campaign_users`
    },
    {
        title: "Campaign membership applications",
        keywords: "public open request",
        url: `${campaign}/campaign_submissions`
    },
    {
        title: "User roles",
        keywords: "groups permissions",
        url: `${campaign}/campaign_roles`
    },
    {
        title: " Modules",
        keywords: "types features",
        url: `${campaign}/modules`
    },
    {
        title: "Default entity icons",
        keywords: "images",
        url: `${campaign}/plugins`
    },
    {
        title: "Theming",
        keywords: "theme css style sheet",
        url: `${campaign}/campaign_styles`
    },
    {
        title: "Sidebar setup",
        keywords: "custom names menu navigation",
        url: `${campaign}/sidebar-setup`
    }
];

// On input, update link
$("#entity-lookup").on("input", updSugg);

function updSugg() {
    let searchtext = $("#entity-lookup").val();
    let listAppend = false;

    // Create a container for the dropdown
    if ($("#content-search-prompt").length == 0) {
        $(".search-recent .grow")[0].insertAdjacentHTML("afterbegin", "<div id='content-search-prompt' class='italic m-2 rounded p-1 hover:lookup-entity'></div>");
    }

    // Propose a full search, unless a settings search is specifically requested
    if (requireSettingsSwitch === false || searchtext.substr(0,1) != settingsSwitch) {
        // Insert link target and text
        $("#content-search-prompt").html("<a href='" + campaign + "/search?q=" + searchtext + "' class=''><i>Search entity contents for \"" + searchtext + "\"</i></a>");
        // Make sure setting search doesn’t override the prompt in combined mode
        listAppend = true;
    }

    // Look for matching settings pages if desired, as indicated by the first character or preferences
    if (requireSettingsSwitch === false || searchtext.substr(0,1) === settingsSwitch) {
        searchtext = searchtext.substr(1);
        // match anything in title:
        let titleMatches = settingsPages.filter(element => element.title.toLowerCase().match(searchtext.toLowerCase()));
        // match anything in keywords:
        let keywordMatches = settingsPages.filter(element => element.keywords.toLowerCase().match(searchtext.toLowerCase()));
        // match whole words only in keywords:
        //let keywordMatches = settingsPages.filter(element => element.keywords.toLowerCase().split(" ").includes(searchtext.toLowerCase()));
        // combine and remove duplicates:
        let allMatches = Array.from(new Set(titleMatches.concat(keywordMatches)));

        // Make links for matches
        if (allMatches.length > 0) {
            let listOfPages = `<div id='matched-settings' class=''>Your search matches the following settings: `;
            allMatches.forEach(function (item) {
                listOfPages += `<a href='${item.url}'>${item.title}</a> · `;
            });
            // Remove last separator and close div
            listOfPages = listOfPages.substring(0, listOfPages.length -3) + `</div>`;

            // Append after full search if requested, or refresh contents otherwise
            if (listAppend) {
                try {
                    $("#matched-settings").remove();
                }
                catch (e) {
                }
                finally {
                    $("#content-search-prompt")[0].insertAdjacentHTML("afterend",listOfPages);
                }
            }
            else {
                $("#content-search-prompt").html(listOfPages);
            }
        }
    }
}