File size: 6,142 Bytes
046723b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
$(document).ready(function () {
    // Function to set up button event handlers
    function setupButtonHandlers() {
        // Unbind existing handlers first to prevent duplicates
        $(".addRuleRow, .removeRuleRow, .verifyRuleRow").off("click");
        
        // Add row button handler
        $(".addRuleRow").on("click", function(e) {
            e.preventDefault();
            
            let currentRow = $(this).closest(".fieldlist-row");
            
            // Clone without events
            let newRow = currentRow.clone(false);
            
            // Reset input values in the cloned row
            newRow.find("input").val("");
            newRow.find("select").prop("selectedIndex", 0);
            
            // Insert the new row after the current one
            currentRow.after(newRow);
            
            // Reindex all rows
            reindexRules();
        });
        
        // Remove row button handler
        $(".removeRuleRow").on("click", function(e) {
            e.preventDefault();
            
            // Only remove if there's more than one row
            if ($("#rulesTable .fieldlist-row").length > 1) {
                $(this).closest(".fieldlist-row").remove();
                reindexRules();
            }
        });
        
        // Verify rule button handler
        $(".verifyRuleRow").on("click", function(e) {
            e.preventDefault();
            
            let row = $(this).closest(".fieldlist-row");
            let field = row.find("select[name$='field']").val();
            let operator = row.find("select[name$='operator']").val();
            let value = row.find("input[name$='value']").val();
            
            // Validate that all fields are filled
            if (!field || field === "None" || !operator || operator === "None" || !value) {
                alert("Please fill in all fields (Field, Operator, and Value) before verifying.");
                return;
            }

            
            // Create a rule object
            let rule = {
                field: field,
                operator: operator,
                value: value
            };
            
            // Show a spinner or some indication that verification is in progress
            const $button = $(this);
            const originalHTML = $button.html();
            $button.html("⌛").prop("disabled", true);
            
            // Collect form data - similar to request_textpreview_update() in watch-settings.js
            let formData = new FormData();
            $('#edit-text-filter textarea, #edit-text-filter input').each(function() {
                const $element = $(this);
                const name = $element.attr('name');
                if (name) {
                    if ($element.is(':checkbox')) {
                        formData.append(name, $element.is(':checked') ? $element.val() : false);
                    } else {
                        formData.append(name, $element.val());
                    }
                }
            });
            
            // Also collect select values
            $('#edit-text-filter select').each(function() {
                const $element = $(this);
                const name = $element.attr('name');
                if (name) {
                    formData.append(name, $element.val());
                }
            });


            // Send the request to verify the rule
            $.ajax({
                url: verify_condition_rule_url+"?"+ new URLSearchParams({ rule: JSON.stringify(rule) }).toString(),
                type: "POST",
                data: formData,
                processData: false, // Prevent jQuery from converting FormData to a string
                contentType: false, // Let the browser set the correct content type
                success: function (response) {
                    if (response.status === "success") {
                        if(rule['field'] !== "page_filtered_text") {
                            // A little debug helper for the user
                            $('#verify-state-text').text(`${rule['field']} was value "${response.data[rule['field']]}"`)
                        }
                        if (response.result) {
                            alert("✅ Condition PASSES verification against current snapshot!");
                        } else {
                            alert("❌ Condition FAILS verification against current snapshot.");
                        }
                    } else {
                        alert("Error: " + response.message);
                    }
                    $button.html(originalHTML).prop("disabled", false);
                },
                error: function (xhr) {
                    let errorMsg = "Error verifying condition.";
                    if (xhr.responseJSON && xhr.responseJSON.message) {
                        errorMsg = xhr.responseJSON.message;
                    }
                    alert(errorMsg);
                    $button.html(originalHTML).prop("disabled", false);
                }
            });
        });
    }

    // Function to reindex form elements and re-setup event handlers
    function reindexRules() {
        // Unbind all button handlers first
        $(".addRuleRow, .removeRuleRow, .verifyRuleRow").off("click");
        
        // Reindex all form elements
        $("#rulesTable .fieldlist-row").each(function(index) {
            $(this).find("select, input").each(function() {
                let oldName = $(this).attr("name");
                let oldId = $(this).attr("id");

                if (oldName) {
                    let newName = oldName.replace(/\d+/, index);
                    $(this).attr("name", newName);
                }

                if (oldId) {
                    let newId = oldId.replace(/\d+/, index);
                    $(this).attr("id", newId);
                }
            });
        });
        
        // Reattach event handlers after reindexing
        setupButtonHandlers();
    }

    // Initial setup of button handlers
    setupButtonHandlers();
});