Advertisement
Guest User

Tampermonkey Gmail Filter Starterkit

a guest
Sep 11th, 2024
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 6.71 KB | Software | 0 0
  1. // ==UserScript==
  2. // @name         Gmail Filter Manager
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  Enhanced Gmail Filter Management
  6. // @match        https://mail.google.com/*
  7. // @grant        none
  8. // ==/UserScript==
  9.  
  10. (function() {
  11.     'use strict';
  12.  
  13.     console.log('Gmail Filter Manager script started');
  14.  
  15.     function createElementSafe(tag, attributes = {}, children = []) {
  16.         const element = document.createElement(tag);
  17.         Object.entries(attributes).forEach(([key, value]) => {
  18.             if (key === 'textContent') {
  19.                 element.textContent = value;
  20.             } else {
  21.                 element.setAttribute(key, value);
  22.             }
  23.         });
  24.         children.forEach(child => element.appendChild(child));
  25.         return element;
  26.     }
  27.  
  28.     function injectStyles() {
  29.         console.log('Injecting styles');
  30.         const style = createElementSafe('style', {
  31.             textContent: `
  32.                 #customFilterManager {
  33.                     margin-top: 20px;
  34.                     padding: 20px;
  35.                     border: 1px solid #ccc;
  36.                     background-color: #f9f9f9;
  37.                 }
  38.                 .filter-item {
  39.                     margin-bottom: 10px;
  40.                     padding: 10px;
  41.                     border: 1px solid #ddd;
  42.                     background-color: #fff;
  43.                 }
  44.                 .filter-title {
  45.                     font-weight: bold;
  46.                     cursor: pointer;
  47.                 }
  48.                 .filter-content {
  49.                     display: none;
  50.                     margin-top: 10px;
  51.                 }
  52.                 .filter-content.expanded {
  53.                     display: block;
  54.                 }
  55.             `
  56.         });
  57.         document.head.appendChild(style);
  58.     }
  59.  
  60.     function createFilterManager() {
  61.         console.log('Creating filter manager');
  62.         return createElementSafe('div', { id: 'customFilterManager' }, [
  63.             createElementSafe('h2', { textContent: 'Custom Filter Manager' }),
  64.             createElementSafe('div', { id: 'filterList' })
  65.         ]);
  66.     }
  67.  
  68.     function injectFilterManager() {
  69.         console.log('Attempting to inject filter manager');
  70.         const settingsContainer = document.querySelector('div[role="main"]');
  71.         if (settingsContainer && !document.getElementById('customFilterManager')) {
  72.             console.log('Injecting filter manager');
  73.             settingsContainer.appendChild(createFilterManager());
  74.             loadFilters();
  75.         } else {
  76.             console.log('Settings container not found or filter manager already exists');
  77.         }
  78.     }
  79.  
  80.     function loadFilters() {
  81.         console.log('Loading filters');
  82.         const dummyFilters = [
  83.             { id: 1, name: 'Important emails', criteria: 'from:[email protected]' },
  84.             { id: 2, name: 'Newsletters', criteria: 'subject:newsletter' }
  85.         ];
  86.         renderFilters(dummyFilters);
  87.     }
  88.  
  89.     function renderFilters(filters) {
  90.         console.log('Rendering filters');
  91.         const filterList = document.getElementById('filterList');
  92.         if (filterList) {
  93.             const fragment = document.createDocumentFragment();
  94.             filters.forEach(filter => {
  95.                 const filterItem = createElementSafe('div', { class: 'filter-item' }, [
  96.                     createElementSafe('div', {
  97.                         class: 'filter-title',
  98.                         textContent: filter.name,
  99.                         'data-id': filter.id
  100.                     }),
  101.                     createElementSafe('div', { id: `filter-content-${filter.id}`, class: 'filter-content' }, [
  102.                         createElementSafe('p', { textContent: `Criteria: ${filter.criteria}` }),
  103.                         createElementSafe('button', {
  104.                             textContent: 'Edit',
  105.                             class: 'edit-filter',
  106.                             'data-id': filter.id
  107.                         }),
  108.                         createElementSafe('button', {
  109.                             textContent: 'Delete',
  110.                             class: 'delete-filter',
  111.                             'data-id': filter.id
  112.                         })
  113.                     ])
  114.                 ]);
  115.                 fragment.appendChild(filterItem);
  116.             });
  117.             filterList.appendChild(fragment);
  118.             attachEventListeners();
  119.         } else {
  120.             console.log('Filter list element not found');
  121.         }
  122.     }
  123.  
  124.     function attachEventListeners() {
  125.         document.querySelectorAll('.filter-title').forEach(title => {
  126.             title.addEventListener('click', () => toggleFilter(title.dataset.id));
  127.         });
  128.         document.querySelectorAll('.edit-filter').forEach(button => {
  129.             button.addEventListener('click', () => editFilter(button.dataset.id));
  130.         });
  131.         document.querySelectorAll('.delete-filter').forEach(button => {
  132.             button.addEventListener('click', () => deleteFilter(button.dataset.id));
  133.         });
  134.     }
  135.  
  136.     function toggleFilter(id) {
  137.         console.log(`Toggling filter ${id}`);
  138.         const content = document.getElementById(`filter-content-${id}`);
  139.         if (content) {
  140.             content.classList.toggle('expanded');
  141.         }
  142.     }
  143.  
  144.     function editFilter(id) {
  145.         console.log(`Editing filter ${id}`);
  146.         // Implement edit functionality
  147.     }
  148.  
  149.     function deleteFilter(id) {
  150.         console.log(`Deleting filter ${id}`);
  151.         // Implement delete functionality
  152.     }
  153.  
  154.     function isFilterPage() {
  155.         const isFilterPage = window.location.hash.includes('#settings/filters');
  156.         console.log(`Is filter page: ${isFilterPage}`);
  157.         return isFilterPage;
  158.     }
  159.  
  160.     function init() {
  161.         console.log('Initializing script');
  162.         if (isFilterPage()) {
  163.             injectStyles();
  164.             injectFilterManager();
  165.         } else {
  166.             console.log('Not on filter page, skipping injection');
  167.         }
  168.     }
  169.  
  170.     const observer = new MutationObserver((mutations) => {
  171.         mutations.forEach((mutation) => {
  172.             if (mutation.type === 'attributes' && mutation.attributeName === 'href') {
  173.                 console.log('URL changed, reinitializing');
  174.                 init();
  175.             }
  176.         });
  177.     });
  178.  
  179.     observer.observe(document.body, {
  180.         attributes: true,
  181.         childList: true,
  182.         subtree: true
  183.     });
  184.  
  185.     console.log('Setting up MutationObserver');
  186.  
  187.     // Run initialization when the DOM is fully loaded
  188.     if (document.readyState === 'loading') {
  189.         document.addEventListener('DOMContentLoaded', init);
  190.     } else {
  191.         init();
  192.     }
  193. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement