diff --git a/README.md b/README.md index 2c91cca..4693d88 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +# Wheel of Fortune Plugin + +Test posodobitve za preverjanje Gitea workflow. + # Wheel of Fortune - WordPress Plugin Vtičnik "Kolo Sreče" (Wheel of Fortune) omogoča uporabnikom vrtenje kolesa za nagrade. Povezan je z WooCommerce za dodeljevanje spinov ob nakupu izdelkov. diff --git a/assets/css/wheel.css b/assets/css/wheel.css index 056b034..4eca9f6 100644 --- a/assets/css/wheel.css +++ b/assets/css/wheel.css @@ -301,7 +301,7 @@ align-items: center; justify-content: center; margin: 20px auto 0 auto; - padding: 0 40px; + padding: 0 40px !important; background: linear-gradient(135deg, #ff00c4, #00dfe9); color: #fff; border: none; @@ -316,7 +316,10 @@ height: 56px; min-width: 140px; letter-spacing: 2px; + line-height: 1 !important; text-shadow: 0 2px 8px #000, 0 0 10px #0cf101; + -webkit-appearance: none; + appearance: none; } /* Button hover effect */ @@ -631,4 +634,4 @@ .wheel-container.scale-50 { transform: scale(0.5); -} \ No newline at end of file +} diff --git a/code_export.txt b/code_export.txt index 0cc722f..f54ab65 100644 --- a/code_export.txt +++ b/code_export.txt @@ -1,5 +1,9 @@ "./README.md" : """ +# Wheel of Fortune Plugin + +Test posodobitve za preverjanje Gitea workflow. + # Wheel of Fortune - WordPress Plugin Vtičnik "Kolo Sreče" (Wheel of Fortune) omogoča uporabnikom vrtenje kolesa za nagrade. Povezan je z WooCommerce za dodeljevanje spinov ob nakupu izdelkov. @@ -1346,6 +1350,17 @@ if (class_exists('WooCommerce')) {
+ +
+

: + + + +

+
+

@@ -1533,6 +1548,43 @@ jQuery(document).ready(function($) { }); }); }); + + + """ @@ -2800,6 +2852,41 @@ if (isset($_POST['mark_redeemed']) && isset($_POST['prize_id'])) { '

'; } +// Ponastavi spine na 0 za vse uporabnike na izbranem kolesu +if (isset($_POST['reset_all_spins_wheel']) && isset($_POST['wheel_id'])) { + check_admin_referer('reset_spins_wheel_nonce', 'reset_spins_wheel_nonce'); + + $wheel_id = intval($_POST['wheel_id']); + + // Preveri, če kolo obstaja + $wheel_exists = $wpdb->get_var($wpdb->prepare("SELECT id FROM $wheels_table WHERE id = %d", $wheel_id)); + + if ($wheel_exists) { + // Ponastavi spine na 0 za vse uporabnike na tem kolesu + $result = $wpdb->update( + $spins_table, + array('spins_available' => 0), + array('wheel_id' => $wheel_id), + array('%d'), + array('%d') + ); + + if ($result !== false) { + echo '

' . + sprintf(__('Vsi spini za kolo ID %d so bili uspešno ponastavljeni na 0.', 'wheel-of-fortune'), $wheel_id) . + '

'; + } else { + echo '

' . + __('Prišlo je do napake pri ponastavitvi spinov.', 'wheel-of-fortune') . + '

'; + } + } else { + echo '

' . + __('Izbrano kolo ne obstaja.', 'wheel-of-fortune') . + '

'; + } +} + // Izberi uporabnika za podrobnosti $selected_user_id = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0; @@ -2825,6 +2912,22 @@ if ($selected_user_id > 0) {

+ +
+

+ : + +

+ + + +
+

+
+
@@ -2851,9 +2954,45 @@ if ($selected_user_id > 0) {
+

- + +
+

+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
@@ -2973,7 +3112,203 @@ if ($selected_user_id > 0) {

- """ + + + """ "./admin/users-page.php" : @@ -3803,12 +4138,12 @@ $wheels = $wpdb->get_results("SELECT * FROM $wheels_table ORDER BY id ASC", ARRA transition: all 0.2s; } -/* Simple gradients for cross-browser compatibility */ -.wheel-segment-yellow { fill: #ffdd00; } -.wheel-segment-green { fill: #88ff00; } -.wheel-segment-red { fill: #ff5500; } -.wheel-segment-pink { fill: #ff44aa; } -.wheel-segment-blue { fill: #00ccff; } +/* Simple solid fills for segment color classes */ +.wheel-segment-red { fill: #ff3131; } +.wheel-segment-green { fill: #7ed957; } +.wheel-segment-purple { fill: #8c52ff; } +.wheel-segment-orange { fill: #ff914d; } +.wheel-segment-blue { fill: #1da3e7; } /* Divider between segments */ .wheel-divider { @@ -5551,8 +5886,10 @@ class WheelOfFortune { add_action('wp_ajax_wheel_get_product', array($this, 'ajax_get_product')); add_action('wp_ajax_wheel_test_email', array($this, 'ajax_test_email')); add_action('wp_ajax_wheel_get_prizes', array($this, 'ajax_get_prizes')); + add_action('wp_ajax_ajax_update_wheel_product_spins', array($this, 'ajax_update_wheel_product_spins')); add_action('wp_ajax_wof_delete_wheel_product', array($this, 'ajax_delete_wheel_product')); - add_action('wp_ajax_wof_update_wheel_product_spins', array($this, 'ajax_update_wheel_product_spins')); + add_action('wp_ajax_wheel_migrate_try_again', array($this, 'ajax_migrate_try_again')); + add_action('wp_ajax_wheel_reset_spins_wheel', array($this, 'ajax_reset_spins_wheel')); // Vključi testno skripto za kupone if (is_admin()) { @@ -5652,19 +5989,17 @@ class WheelOfFortune { } public function activate() { - error_log("Wheel of Fortune: Aktivacija plugina..."); $this->create_database_tables(); $this->run_migration(); $this->set_default_options(); - $this->add_default_prizes(); - // --- TUKAJ OSTANE SAMO NAČRTOVANJE DOGODKA --- - if (!wp_next_scheduled('wof_daily_spin_event')) { - wp_schedule_event(time(), 'daily', 'wof_daily_spin_event'); - error_log("Wheel of Fortune: Cron job 'wof_daily_spin_event' scheduled."); + + // Dodaj cron opravilo za dnevne spine + if (!wp_next_scheduled('wheel_daily_spins_cron')) { + wp_schedule_event(time(), 'wheel_daily', 'wheel_daily_spins_cron'); } - // --------------------------------------------- - flush_rewrite_rules(); - error_log("Wheel of Fortune: Aktivacija končana."); + + // Izvedi migracijo za is_try_again stolpec + $this->migrate_add_is_try_again_column(); } public function deactivate() { @@ -5741,6 +6076,7 @@ class WheelOfFortune { redemption_code varchar(100) DEFAULT '', is_discount tinyint(1) NOT NULL DEFAULT 0, discount_value float DEFAULT 0, + is_try_again tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id), KEY wheel_id (wheel_id) ) $charset_collate;"; @@ -5800,6 +6136,29 @@ class WheelOfFortune { } else { error_log("Wheel of Fortune: Tabela $wheel_products_table uspešno ustvarjena."); } + + // Migracija: dodaj stolpec is_try_again v obstoječe tabele + $this->migrate_add_is_try_again_column(); + } + + private function migrate_add_is_try_again_column() { + global $wpdb; + $table_prizes = $wpdb->prefix . 'wheel_prizes'; + + // Preveri, če stolpec is_try_again že obstaja + $column_exists = $wpdb->get_results("SHOW COLUMNS FROM $table_prizes LIKE 'is_try_again'"); + + if (empty($column_exists)) { + // Dodaj stolpec is_try_again + $result = $wpdb->query("ALTER TABLE $table_prizes ADD COLUMN is_try_again tinyint(1) NOT NULL DEFAULT 0"); + if ($result !== false) { + error_log("Wheel of Fortune: Stolpec is_try_again uspešno dodan v tabelo $table_prizes"); + } else { + error_log("Wheel of Fortune: Napaka pri dodajanju stolpca is_try_again v tabelo $table_prizes"); + } + } else { + error_log("Wheel of Fortune: Stolpec is_try_again že obstaja v tabeli $table_prizes"); + } } private function run_migration() { @@ -6051,7 +6410,8 @@ class WheelOfFortune { } } - if (get_option('wheel_send_emails', true)) { + // Pošlji email samo, če ni "try again" nagrada + if (get_option('wheel_send_emails', true) && (!isset($prize['is_try_again']) || $prize['is_try_again'] != 1)) { $this->send_prize_email($user_id, $prize); } @@ -6266,7 +6626,8 @@ class WheelOfFortune { $text_paths = ''; // Generate segments and text paths - $segment_colors = ['#00dfe9', '#ff00c4', '#0cf101']; + // Updated segment color palette + $segment_colors = ['#ff3131', '#7ed957', '#8c52ff', '#ff914d', '#1da3e7']; for ($i = 0; $i < $num_prizes; $i++) { $prize = $prizes[$i]; $start_angle = $i * $angle; @@ -6372,6 +6733,7 @@ class WheelOfFortune { $email_subject = isset($_POST['email_subject']) ? sanitize_text_field($_POST['email_subject']) : ''; $email_template = isset($_POST['email_template']) ? wp_kses_post($_POST['email_template']) : ''; $discount_value = isset($_POST['discount_value']) ? floatval($_POST['discount_value']) : 0; + $is_try_again = isset($_POST['is_try_again']) ? intval($_POST['is_try_again']) : 0; if (empty($name)) { wp_send_json_error(['message' => __('Prize name is required.', 'wheel-of-fortune')]); @@ -6399,9 +6761,10 @@ class WheelOfFortune { 'email_subject' => $email_subject, 'email_template' => $email_template, 'discount_value' => $discount_value, + 'is_try_again' => $is_try_again, ]; - $format = ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%s', '%s', '%f']; + $format = ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%s', '%s', '%f', '%d']; if ($prize_id > 0) { $result = $wpdb->update($table_name, $data, ['id' => $prize_id], $format, ['%d']); @@ -6835,6 +7198,12 @@ class WheelOfFortune { * @param array $prize The prize details array. */ public function send_prize_email($user_id, $prize) { + // Ne pošlji emaila, če je nagrada "try again" + if (isset($prize['is_try_again']) && $prize['is_try_again'] == 1) { + wheel_of_fortune_debug_log("send_prize_email: Email ni poslan za 'try again' nagrado: {$prize['name']}"); + return; + } + $user = get_userdata($user_id); if (!$user) { wheel_of_fortune_debug_log("send_prize_email: Uporabnik z ID {$user_id} ni bil najden."); @@ -6956,32 +7325,83 @@ class WheelOfFortune { } public function ajax_delete_wheel_product() { - check_ajax_referer('wof_delete_wheel_product'); + check_ajax_referer('wof_delete_wheel_product', '_ajax_nonce'); + if (!current_user_can('manage_options')) { - wp_send_json_error(__('Nimaš dovoljenja.', 'wheel-of-fortune')); + wp_send_json_error(['message' => __('You do not have permission to perform this action.', 'wheel-of-fortune')]); } - global $wpdb; + $id = isset($_POST['id']) ? intval($_POST['id']) : 0; - // Debug informacije - error_log("=== AJAX DELETE WHEEL PRODUCT DEBUG ==="); - error_log("POST data: " . print_r($_POST, true)); - error_log("ID to delete: " . $id); - - if ($id > 0) { - $table = $wpdb->prefix . 'wheel_of_fortune_products'; - error_log("Table: " . $table); - - $result = $wpdb->delete($table, ['id' => $id], ['%d']); - error_log("Delete result: " . $result); - error_log("Last SQL query: " . $wpdb->last_query); - error_log("Last SQL error: " . $wpdb->last_error); - - if ($result !== false) { - wp_send_json_success(); - } + if (!$id) { + wp_send_json_error(['message' => __('Invalid ID.', 'wheel-of-fortune')]); + } + + global $wpdb; + $table_name = $wpdb->prefix . 'wheel_of_fortune_products'; + + $result = $wpdb->delete($table_name, ['id' => $id]); + + if ($result !== false) { + wp_send_json_success(['message' => __('Product deleted successfully.', 'wheel-of-fortune')]); + } else { + wp_send_json_error(['message' => __('Failed to delete product.', 'wheel-of-fortune')]); + } + } + + public function ajax_migrate_try_again() { + check_ajax_referer('wheel_admin_nonce', '_ajax_nonce'); + + if (!current_user_can('manage_options')) { + wp_send_json_error(['message' => __('You do not have permission to perform this action.', 'wheel-of-fortune')]); + } + + $this->migrate_add_is_try_again_column(); + + wp_send_json_success(['message' => __('Migration completed successfully. The is_try_again column has been added to the database.', 'wheel-of-fortune')]); + } + + public function ajax_reset_spins_wheel() { + check_ajax_referer('wheel_admin_nonce', '_ajax_nonce'); + + if (!current_user_can('manage_options')) { + wp_send_json_error(['message' => __('You do not have permission to perform this action.', 'wheel-of-fortune')]); + } + + $wheel_id = isset($_POST['wheel_id']) ? intval($_POST['wheel_id']) : 0; + + if (!$wheel_id) { + wp_send_json_error(['message' => __('Wheel ID is required.', 'wheel-of-fortune')]); + } + + global $wpdb; + $wheels_table = $wpdb->prefix . 'wof_wheels'; + $spins_table = $wpdb->prefix . 'wheel_spins'; + + // Preveri, če kolo obstaja + $wheel_exists = $wpdb->get_var($wpdb->prepare("SELECT id FROM $wheels_table WHERE id = %d", $wheel_id)); + + if (!$wheel_exists) { + wp_send_json_error(['message' => __('Selected wheel does not exist.', 'wheel-of-fortune')]); + } + + // Ponastavi spine na 0 za vse uporabnike na tem kolesu + $result = $wpdb->update( + $spins_table, + array('spins_available' => 0), + array('wheel_id' => $wheel_id), + array('%d'), + array('%d') + ); + + if ($result !== false) { + wp_send_json_success([ + 'message' => sprintf(__('All spins for wheel ID %d have been successfully reset to 0.', 'wheel-of-fortune'), $wheel_id), + 'affected_users' => $result + ]); + } else { + wp_send_json_error(['message' => __('An error occurred while resetting spins.', 'wheel-of-fortune')]); } - wp_send_json_error(__('Napaka pri brisanju.', 'wheel-of-fortune')); } // --- NOVE METODE ZA CRON --- @@ -7020,6 +7440,7 @@ class WheelOfFortune { } } } + // ---------------------------- } diff --git a/export_code.sh b/export_code.sh old mode 100644 new mode 100755 index a0428ad..1a37df6 --- a/export_code.sh +++ b/export_code.sh @@ -1,26 +1,58 @@ #!/bin/bash -# Set the output file +# Nastavitev imena izhodne datoteke OUTPUT_FILE="code_export.txt" -# Remove the output file if it exists +# Odstrani izhodno datoteko, če že obstaja, da začnemo s čisto datoteko if [ -f "$OUTPUT_FILE" ]; then rm "$OUTPUT_FILE" fi -# Find all files except hidden files and directories -find . -type f -not -path "*/\.*" -not -path "*node_modules*" -not -path "*vendor*" | sort | while read -r file; do - # Skip the output file itself and this script +# Poišči vse datoteke, razen skritih datotek in določenih map (npr. node_modules). +# Dodane so izjeme za slike, videoposnetke, PDF-je, arhive in druge binarne datoteke +# neposredno v ukaz 'find' za boljšo zmogljivost. +find . -type f \ + -not -path "*/\.*" \ + -not -path "*node_modules*" \ + -not -path "*vendor*" \ + -not -path "*dist*" \ + -not -path "*build*" \ + -not -path "*/images/*" \ + -not -iname "*.jpg" -not -iname "*.jpeg" \ + -not -iname "*.png" -not -iname "*.gif" \ + -not -iname "*.bmp" -not -iname "*.tiff" \ + -not -iname "*.svg" -not -iname "*.ico" \ + -not -iname "*.webp" \ + -not -iname "*.mp4" -not -iname "*.mov" \ + -not -iname "*.avi" -not -iname "*.mkv" \ + -not -iname "*.webm" \ + -not -iname "*.mp3" -not -iname "*.wav" \ + -not -iname "*.ogg" -not -iname "*.flac" \ + -not -iname "*.pdf" \ + -not -iname "*.zip" \ + -not -iname "*.tar" \ + -not -iname "*.gz" \ + -not -iname "*.bz2" \ + -not -iname "*.rar" \ + -not -iname "*.7z" \ + -not -iname "*.doc" -not -iname "*.docx" \ + -not -iname "*.xls" -not -iname "*.xlsx" \ + -not -iname "*.ppt" -not -iname "*.pptx" \ + -not -iname "*.eot" -not -iname "*.ttf" \ + -not -iname "*.woff" -not -iname "*.woff2" \ + | sort | while read -r file; do + + # Preskoči samo izhodno datoteko in to skripto if [[ "$file" == "./$OUTPUT_FILE" || "$file" == "./export_code.sh" ]]; then continue fi - # Skip binary files and the output file itself - if file "$file" | grep -q "binary"; then + # Dodatna varnostna preverba: preskoči slikovne datoteke po MIME tipu + if file --mime-type -b "$file" | grep -qiE '^(image)/'; then continue fi - # Add the filename and content to the output file + # Dodaj ime datoteke in njeno vsebino v izhodno datoteko echo "\"$file\" : " >> "$OUTPUT_FILE" echo "\"\"\"" >> "$OUTPUT_FILE" cat "$file" >> "$OUTPUT_FILE" @@ -29,4 +61,4 @@ find . -type f -not -path "*/\.*" -not -path "*node_modules*" -not -path "*vendo echo "" >> "$OUTPUT_FILE" done -echo "Code export completed. Output saved to $OUTPUT_FILE" \ No newline at end of file +echo "Izvoz kode končan. Vsebina je shranjena v datoteko $OUTPUT_FILE"