- // ==UserScript==
- // @name Kanka Search Upgrades
- // @namespace http://tampermonkey.net/
- // @version 9
- // @license MIT
- // @description Adds the ability to look for user and campaign settings in Kanka’s search field for faster access.
- // @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("/", 3);
- const campaignId = campaignPath[2];
- let campaign = location.origin + "/w/" + campaignId;
- let settings = location.origin + "/settings";
-
- // Define settings pages (no need to add words from the title to the keywords)
- const settingsPages = [
- // User settings
- {
- title: "User settings",
- keywords: "personal preferences",
- url: `${settings}/appearance`
- },
- {
- title: "User-preferred theme",
- keywords: "dark light midnight",
- url: `${settings}/appearance`
- },
- {
- title: "Pagination",
- keywords: "page results per",
- url: `${settings}/appearance`
- },
- {
- title: "Date format",
- keywords: "",
- url: `${settings}/appearance`
- },
- {
- title: "Campaign switcher sorting order",
- keywords: "list",
- url: `${settings}/appearance`
- },
- {
- title: "New entity workflow",
- keywords: "create creation",
- url: `${settings}/appearance`
- },
- {
- title: "Text editor",
- keywords: "summernote tinymce",
- url: `${settings}/appearance`
- },
- {
- title: "Entity list layout",
- keywords: "default grid table entities",
- url: `${settings}/appearance`
- },
- {
- title: "Entity list nesting (user)",
- keywords: "default flat nested entities tree view",
- url: `${settings}/appearance`
- },
- {
- title: "Advanced mentions",
- keywords: "",
- url: `${settings}/appearance`
- },
- {
- title: "Notifications",
- keywords: "updates news subscriptions",
- url: `${settings}/newsletter`
- },
- {
- title: "Profile",
- keywords: "privacy name username avatar picture",
- url: `${settings}/profile`
- },
- {
- title: "Subscription",
- keywords: "tier level subscribe upgrade downgrade kobold owlbear elemental wyvern patreon",
- url: `${settings}/subscription`
- },
- {
- title: "Boosters",
- keywords: "boosted campaigns boost superboost superboosted premium",
- url: `${settings}/boosters`
- },
- {
- title: "Premium campaigns",
- keywords: "boost campaigns premium",
- url: `${settings}/premium`
- },
- {
- title: "Payment method",
- keywords: "credit card paypal currency",
- url: `${settings}/billing/payment-method`
- },
- {
- title: "Billing",
- keywords: "invoices history",
- url: `${settings}/billing/history`
- },
- {
- title: "App integration",
- keywords: "sync discord",
- url: `${settings}/apps`
- },
- {
- title: "API",
- keywords: "key token",
- url: `${settings}/api`
- },
- // Campaign
- {
- title: "Campaign overview and settings",
- keywords: "edit delete settings",
- url: `${campaign}/overview`
- },
- // Main settings form
- {
- title: "Basic campaign configuration",
- keywords: "name description image picture settings",
- url: `${campaign}/edit#tab_form-entry`
- },
- {
- title: "Vanity URL",
- keywords: "custom personalized address domain",
- url: `${campaign}/edit#tab_form-entry`
- },
- {
- title: "Campaign visibility",
- keywords: "public private",
- url: `${campaign}/edit#tab_form-public`
- },
- {
- title: "Campaign language",
- keywords: "language locale",
- url: `${campaign}/edit#tab_form-public`
- },
- {
- title: "Game system",
- keywords: "rpg",
- url: `${campaign}/edit#tab_form-public`
- },
- {
- title: "Campaign-enforced theme",
- keywords: "light dark midnight",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "Member list visibility",
- keywords: "users members privacy",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "Entity history log visibility",
- keywords: "",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "Entity image in tooltips",
- keywords: "",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "Default entity connections display",
- keywords: "explorer list relations",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "Default filtering of entity descendants",
- keywords: "sublist direct indirect hierarchy children child",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "Entity list layout (campaign)",
- keywords: "default flat nested entities tree view",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "New posts collapsed by default",
- keywords: "",
- url: `${campaign}/edit#tab_form-ui`
- },
- {
- title: "Default permissions for new entities and elements",
- keywords: "visibility entity",
- url: `${campaign}/edit#tab_form-permission`
- },
- {
- title: "Dashboard header text and image",
- keywords: "",
- url: `${campaign}/edit#tab_form-dashboard`
- },
- // Other campaign options
- {
- title: "Export campaign",
- keywords: "JSON",
- url: `${campaign}/campaign-export`
- },
- {
- title: "Recover deleted entities",
- keywords: "recovery restore archive",
- url: `${campaign}/recovery`
- },
- {
- title: "Achievements",
- keywords: "campaign stats",
- url: `${campaign}/achievements`
- },
- {
- title: "Member list",
- keywords: "members users invite",
- url: `${campaign}/campaign_users`
- },
- {
- title: "Campaign membership applications",
- keywords: "public open request join",
- url: `${campaign}/campaign_submissions`
- },
- {
- title: "User roles",
- keywords: "groups permissions players",
- url: `${campaign}/campaign_roles`
- },
- {
- title: "Modules (entity types)",
- keywords: "features enable disable rename icons categories",
- url: `${campaign}/modules`
- },
- {
- title: "Marketplace plugins",
- keywords: "enable disable themes character sheets content packs",
- url: `${campaign}/plugins`
- },
- {
- title: "Default entity thumbnails",
- keywords: "images icons fallback",
- url: `${campaign}/default-images`
- },
- {
- title: "Theming (campaign styles)",
- keywords: "theme css style sheet customize appearance skin look",
- url: `${campaign}/campaign_styles`
- },
- {
- title: "Theme builder (color palette)",
- keywords: "theme builder css colors colours palette customize skin",
- url: `${campaign}/theme-builder`
- },
- {
- title: "Sidebar setup",
- keywords: "custom names links menu navigation order icons",
- url: `${campaign}/sidebar-setup`
- },
- {
- title: "Bookmarks",
- keywords: "custom quick links menu shortcuts",
- url: `${campaign}/bookmarks`
- },
- {
- title: "Campaign stats",
- keywords: "facts info count number",
- url: `${campaign}/stats`
- }
- ];
-
- // On input, update link
- $("#entity-lookup").on("input", updSugg);
-
- function updSugg() {
- let searchtext = $("#entity-lookup").val();
-
- // 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>");
- }
-
- // 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:<ul>`;
- allMatches.forEach(function (item) {
- listOfPages += `<li><a href='${item.url}'>${item.title}</a></li>`;
- });
- // Remove last separator and close div
- listOfPages = listOfPages.substring(0, listOfPages.length -3) + `</ul></div>`;
-
- // Insert or refresh suggestions
- $("#content-search-prompt").html(listOfPages);
- }
- else {
- // If we showed results previously but no longer match anyhing, remove the previous suggestions
- try {
- $("#matched-settings").remove();
- }
- catch (e) {
- }
- }
- }
- else {
- // If we showed results previously but no longer match anyhing, remove the previous suggestions
- try {
- $("#matched-settings").remove();
- }
- catch (e) {
- }
- }
- }