Arkmeds - Force Sort (Interceptador V5)

Intercepta leituras e escritas no Storage para forçar a ordenação descendente de ordem de serviços.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Arkmeds - Force Sort (Interceptador V5)
// @namespace    http://tampermonkey.net/
// @version      5.0
// @description  Intercepta leituras e escritas no Storage para forçar a ordenação descendente de ordem de serviços.
// @author       Gemini AI
// @match        https://*.arkmeds.com/*
// @run-at       document-start
// @grant        none
// ==/UserScript==

(function () {
    'use strict'

    // A chave exata que o DataTables usa
    const TARGET_KEY = "DataTables_datatable_/ordem_servico/"

    // A ordenação que queremos forçar: Coluna 11 (índice 11), Descendente
    const FORCE_ORDER = [[11, "desc"]]

    console.log("Arkmeds Script V5: Iniciando interceptação de Storage...")

    // Função auxiliar para corrigir o JSON
    function corrigirObjeto(jsonString) {
        try {
            if (!jsonString) return jsonString
            const obj = JSON.parse(jsonString)

            // Verifica se é o objeto certo (tem estrutura de DataTables)
            if (obj && (obj.time || obj.start)) {
                // Força a ordem
                obj.order = FORCE_ORDER
                // Atualiza o time para parecer recente
                obj.time = Date.now()
                return JSON.stringify(obj)
            }
        } catch (e) {
            // Se der erro no parse, retorna o original sem mexer
            return jsonString
        }
        return jsonString
    }

    // --- INTERCEPTAÇÃO (HOOK) ---

    // Guardamos as funções originais do navegador
    const originalSetItem = Storage.prototype.setItem
    const originalGetItem = Storage.prototype.getItem

    // Sobrescrevemos a função de LER dados (getItem)
    Storage.prototype.getItem = function (key) {
        // Chamamos a original para pegar o dado real
        let valor = originalGetItem.apply(this, arguments)

        // Se o site estiver pedindo a chave da tabela, nós entregamos o dado adulterado
        if (key === TARGET_KEY && valor) {
            // console.log("Arkmeds Script: O site tentou ler a configuração. Entregando versão corrigida (desc).");
            return corrigirObjeto(valor)
        }

        return valor
    }

    // Sobrescrevemos a função de SALVAR dados (setItem)
    Storage.prototype.setItem = function (key, value) {
        // Se o site tentar salvar a configuração da tabela
        if (key === TARGET_KEY) {
            // console.log("Arkmeds Script: O site tentou salvar 'asc'. Forçando 'desc' antes de gravar.");
            value = corrigirObjeto(value)
        }

        // Chama a original para salvar de fato
        originalSetItem.apply(this, [key, value])
    }

    // --- INJEÇÃO INICIAL (Garantia Extra) ---
    // Mesmo com os hooks, tentamos injetar um valor inicial caso esteja vazio
    try {
        const storageAlvo = sessionStorage // Tenta sessionStorage primeiro
        if (!storageAlvo.getItem(TARGET_KEY)) {
            // Template mínimo apenas para inicializar
            const templateInicial = {
                "time": Date.now(),
                "start": 0,
                "length": 25,
                "order": FORCE_ORDER,
                "search": { "search": "", "smart": true, "regex": false, "caseInsensitive": true },
                "columns": [] // O DataTables preenche o resto se estiver vazio
            }
            storageAlvo.setItem(TARGET_KEY, JSON.stringify(templateInicial))
            console.log("Arkmeds Script: Valor inicial injetado.")
        }
    } catch (e) {
        console.log("Erro na injeção inicial:", e)
    }

})()