Merge branch 'dev'

This commit is contained in:
2025-12-30 00:02:38 +01:00
5 changed files with 138 additions and 17 deletions

View File

@@ -5,6 +5,31 @@ All notable changes to WooCommerce Tier and Package Prices will be documented in
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.2.4] - 2025-12-30
### Fixed
- **Admin Table Borders (Critical)**: Fixed table borders still appearing in v1.2.3 despite borderless styling attempt. WooCommerce's default CSS was overriding `border: none` declarations. Added `!important` flags to all border removal rules and `border-collapse: collapse !important` to force borderless styling. Now all tier/package pricing tables (simple and variable products) display correctly without borders, matching WooCommerce's clean admin UI.
- **Checkbox and Help Icon Layout**: Fixed help icon positioning and checkbox spacing issues from v1.2.3. The help icon was appearing at the right edge of the container instead of next to the label text. Increased checkbox-label margin from 8px to 12px for better spacing. Changed label layout from float positioning to flexbox (`inline-flex`) to keep help icon directly adjacent to label text. Added inline description hiding when tooltip is shown.
### Technical Details
**Root Cause - Table Borders**: WooCommerce's core admin CSS has higher specificity border rules that override simple `border: none` declarations. The solution required:
- Adding `!important` to all `border: none` rules targeting tables, th, td, thead, tbody, and tr elements
- Adding `border-collapse: collapse !important` to prevent cell borders from being visible
- Comprehensive targeting of all table structural elements for complete border removal
**Root Cause - Help Icon Position**: WooCommerce's default `.woocommerce-help-tip` styling uses `float: right` which positions the icon at the container's right edge. The fix:
- Removed float positioning with `float: none`
- Changed to `display: inline-block` with `vertical-align: middle`
- Wrapped label and help-tip in flexbox container (`display: inline-flex; align-items: center`)
- Controlled spacing with precise margins (checkbox: 12px right, help-tip: 6px left)
### Changed Files
- `assets/css/admin.css` - Added `!important` flags to all border removal rules; added `border-collapse: collapse`; increased checkbox margin to 12px; converted label layout to flexbox; positioned help-tip with inline-block; added inline description hiding
## [1.2.3] - 2025-12-29 ## [1.2.3] - 2025-12-29
### Fixed ### Fixed

View File

@@ -1,7 +1,7 @@
# WooCommerce Tier and Package Prices - AI Context Document # WooCommerce Tier and Package Prices - AI Context Document
**Last Updated:** 2025-12-29 **Last Updated:** 2025-12-29
**Current Version:** 1.2.3 **Current Version:** 1.2.4
**Author:** Marco Graetsch **Author:** Marco Graetsch
**Project Status:** Production-ready WordPress plugin **Project Status:** Production-ready WordPress plugin
@@ -13,6 +13,7 @@ This is a WooCommerce plugin that adds flexible pricing capabilities to products
2. **Package Pricing (Fixed Bundles)**: Exact quantity packages at fixed prices (e.g., exactly 10 items for $95, exactly 25 for $200) 2. **Package Pricing (Fixed Bundles)**: Exact quantity packages at fixed prices (e.g., exactly 10 items for $95, exactly 25 for $200)
### Key Fact: 100% AI-Generated ### Key Fact: 100% AI-Generated
This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase was created through AI assistance. This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase was created through AI assistance.
## Technical Stack ## Technical Stack
@@ -27,6 +28,7 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
- **Internationalization:** WordPress i18n (.pot/.po/.mo files) - **Internationalization:** WordPress i18n (.pot/.po/.mo files)
### Dependencies ### Dependencies
```json ```json
{ {
"twig/twig": "^3.0", "twig/twig": "^3.0",
@@ -38,7 +40,8 @@ This project is proudly **"vibe-coded"** using Claude.AI - the entire codebase w
## Architecture ## Architecture
### Directory Structure ### Directory Structure
```
```txt
wc-tier-and-package-prices/ wc-tier-and-package-prices/
├── wc-tier-and-package-prices.php # Main plugin file (entry point) ├── wc-tier-and-package-prices.php # Main plugin file (entry point)
├── includes/ # PHP classes ├── includes/ # PHP classes
@@ -172,6 +175,7 @@ wc-tier-and-package-prices/
### Price Calculation Logic ### Price Calculation Logic
**Package Pricing** (exact match): **Package Pricing** (exact match):
```php ```php
// In cart: if quantity == 10 and package exists for 10, use package price // In cart: if quantity == 10 and package exists for 10, use package price
if ($quantity == $package['qty']) { if ($quantity == $package['qty']) {
@@ -181,6 +185,7 @@ if ($quantity == $package['qty']) {
``` ```
**Tier Pricing** (range-based): **Tier Pricing** (range-based):
```php ```php
// In cart: if quantity >= 10, use tier price for quantities 10+ // In cart: if quantity >= 10, use tier price for quantities 10+
foreach ($tiers as $tier) { foreach ($tiers as $tier) {
@@ -226,7 +231,9 @@ This metadata is used by display filters to show "(Package price)" or "(Volume d
## Common Patterns & Conventions ## Common Patterns & Conventions
### Class Instantiation Pattern ### Class Instantiation Pattern
All classes auto-instantiate at the end of their file: All classes auto-instantiate at the end of their file:
```php ```php
if (!class_exists('WC_TPP_Frontend')) { if (!class_exists('WC_TPP_Frontend')) {
class WC_TPP_Frontend { class WC_TPP_Frontend {
@@ -247,7 +254,9 @@ new WC_TPP_Frontend(); // Auto-instantiate
- Direct file access prevention via `ABSPATH` check - Direct file access prevention via `ABSPATH` check
### Translation Ready ### Translation Ready
All user-facing strings use: All user-facing strings use:
```php ```php
__('Text to translate', 'wc-tier-package-prices') __('Text to translate', 'wc-tier-package-prices')
_e('Text to translate', 'wc-tier-package-prices') _e('Text to translate', 'wc-tier-package-prices')
@@ -270,6 +279,7 @@ Note: Swiss locales use CHF currency formatting in examples (e.g., "CHF 50.-")
## Known Issues & Historical Context ## Known Issues & Historical Context
### Settings Page Duplication Saga (v1.1.15-1.1.19) ### Settings Page Duplication Saga (v1.1.15-1.1.19)
Multiple versions attempted to fix settings page appearing twice: Multiple versions attempted to fix settings page appearing twice:
- **Root cause:** Settings file auto-instantiation + Composer autoloader - **Root cause:** Settings file auto-instantiation + Composer autoloader
@@ -277,6 +287,7 @@ Multiple versions attempted to fix settings page appearing twice:
- **Prevention:** Singleton pattern + duplicate detection in array - **Prevention:** Singleton pattern + duplicate detection in array
### Class Redeclaration Issues (v1.1.8-1.1.14) ### Class Redeclaration Issues (v1.1.8-1.1.14)
Plugin was completely non-functional: Plugin was completely non-functional:
- **Cause:** Incorrect initialization pattern without `class_exists()` guards - **Cause:** Incorrect initialization pattern without `class_exists()` guards
@@ -284,7 +295,8 @@ Plugin was completely non-functional:
- **Lesson:** Always wrap class declarations in `class_exists()` checks - **Lesson:** Always wrap class declarations in `class_exists()` checks
### WooCommerce Blocks Fatal Error (v1.1.19 → v1.1.20) ### WooCommerce Blocks Fatal Error (v1.1.19 → v1.1.20)
```
```txt
Fatal error: Cannot use object of type WC_Product_Simple as array Fatal error: Cannot use object of type WC_Product_Simple as array
Location: includes/class-wc-tpp-cart.php:233 Location: includes/class-wc-tpp-cart.php:233
``` ```
@@ -296,6 +308,7 @@ Location: includes/class-wc-tpp-cart.php:233
## Release Process ## Release Process
### Version Bumping ### Version Bumping
Update version in 3 places: Update version in 3 places:
1. `wc-tier-and-package-prices.php` - Plugin header comment (line 7) 1. `wc-tier-and-package-prices.php` - Plugin header comment (line 7)
@@ -468,6 +481,7 @@ When making changes, test these critical paths:
### Common Pitfalls and Solutions ### Common Pitfalls and Solutions
#### Release Package Creation #### Release Package Creation
**Problem:** Empty or corrupted zip files (0 bytes or wrong structure) **Problem:** Empty or corrupted zip files (0 bytes or wrong structure)
**Cause:** Running zip command from wrong directory or incorrect path patterns **Cause:** Running zip command from wrong directory or incorrect path patterns
**Solution:** Always run from parent directory (`/home/magdev/workspaces/node`) and use full relative paths in exclusions **Solution:** Always run from parent directory (`/home/magdev/workspaces/node`) and use full relative paths in exclusions
@@ -481,7 +495,9 @@ When making changes, test these critical paths:
**Solution:** Follow verification steps and check package size immediately after creation **Solution:** Follow verification steps and check package size immediately after creation
#### UI Changes in Admin #### UI Changes in Admin
**WooCommerce CSS Classes:** **WooCommerce CSS Classes:**
- `short` - Small input fields (~60px width) - `short` - Small input fields (~60px width)
- `regular` - Medium input fields (~120px width) - `regular` - Medium input fields (~120px width)
- `long` - Large input fields (~200px+ width) - `long` - Large input fields (~200px+ width)
@@ -491,6 +507,7 @@ When modifying admin input fields in Twig templates, use WooCommerce's standard
**Location:** `templates/admin/*.twig` for admin UI changes **Location:** `templates/admin/*.twig` for admin UI changes
#### Git Workflow Issues #### Git Workflow Issues
**Problem:** Cannot rebase due to uncommitted changes **Problem:** Cannot rebase due to uncommitted changes
**Solution:** Stash local config files (`.claude/settings.local.json`) before git operations **Solution:** Stash local config files (`.claude/settings.local.json`) before git operations
@@ -519,7 +536,7 @@ The plugin uses Twig 3.0 for templating. Key files:
### Complete Release Workflow Summary ### Complete Release Workflow Summary
Based on v1.1.22 release experience, here's the complete workflow: Based on v1.1.22, v1.2.2, and v1.2.3 release experience, here's the complete workflow:
1. **Fix bugs/add features** on `dev` branch 1. **Fix bugs/add features** on `dev` branch
2. **Update version numbers** (3 files: main plugin file header, constant, composer.json) 2. **Update version numbers** (3 files: main plugin file header, constant, composer.json)
@@ -544,6 +561,52 @@ Based on v1.1.22 release experience, here's the complete workflow:
- `releases/wc-tier-and-package-prices-X.X.X.zip*` - Package and checksums - `releases/wc-tier-and-package-prices-X.X.X.zip*` - Package and checksums
- Feature-specific files (templates, PHP classes, etc.) - Feature-specific files (templates, PHP classes, etc.)
### Release Package Creation - Critical Notes
**IMPORTANT:** The zip command must be run from the **parent directory** to create proper archive structure.
**Correct command (from `/home/magdev/workspaces/php`):**
```bash
cd /home/magdev/workspaces/php
zip -r wc-tier-and-package-prices/releases/wc-tier-and-package-prices-X.X.X.zip wc-tier-and-package-prices/ \
-x '*/\.git/*' '*/.git/*' 'wc-tier-and-package-prices/.git/*' \
'*.gitignore' '*.log' '*/.claude/*' '*/CLAUDE.md' \
'*/releases/*' '*/wordpress/*' '*/node_modules/*' \
'*/.DS_Store' '*/Thumbs.db' '*/.vscode/*' '*/.idea/*' \
'*.sublime-*' '*/notes.*' '*/logs/*' '*/templates/cache/*' \
'*/composer.lock'
```
**Critical Exclusions:**
- `*/wordpress/*` - MUST be excluded! The project has a symlink to WordPress installation that zip will follow, creating 129MB+ packages instead of ~430KB
- `.git/*` - All git metadata (multiple patterns needed for reliability)
- `.claude/*` and `CLAUDE.md` - Development documentation
- `releases/*` - Prevents including previous releases in new ones
- `composer.lock` - Not needed in production (vendor/ is included)
**Expected Package Size:** ~430-431KB (383 files)
**Package Size Alert:** If >1MB, exclusions failed (likely wordpress symlink included)
**Verification Steps:**
```bash
# 1. Check size (should be ~430KB)
ls -lh releases/wc-tier-and-package-prices-X.X.X.zip
# 2. Verify file count (should be 383 files)
unzip -l releases/wc-tier-and-package-prices-X.X.X.zip | tail -1
# 3. Check for excluded files
unzip -l releases/wc-tier-and-package-prices-X.X.X.zip | grep -E "CLAUDE\.md|\.claude/|\.git/|wordpress/"
# Should return nothing (exit code 1)
# 4. Verify version in package
unzip -p releases/wc-tier-and-package-prices-X.X.X.zip wc-tier-and-package-prices/wc-tier-and-package-prices.php | head -30 | grep -E "Version:|WC_TPP_VERSION"
```
### Future Features and Roadmap ### Future Features and Roadmap
The is a hierarchical list for upcoming features and can be considered as a The is a hierarchical list for upcoming features and can be considered as a
@@ -578,6 +641,12 @@ Roadmap for the upcoming development.
2. ~~The checkbox styles from 1.2.2 bug 3 are still not looking correct. The helptext is written instead of hidden after the help icon and the margin between checkbox and label are to small.~~**FIXED in v1.2.3** - Added `desc_tip => true` to variation checkbox to show tooltip instead of inline text. Added CSS rules to increase checkbox-label margin (8px) and hide inline description text when tooltip is used. 2. ~~The checkbox styles from 1.2.2 bug 3 are still not looking correct. The helptext is written instead of hidden after the help icon and the margin between checkbox and label are to small.~~**FIXED in v1.2.3** - Added `desc_tip => true` to variation checkbox to show tooltip instead of inline text. Added CSS rules to increase checkbox-label margin (8px) and hide inline description text when tooltip is used.
##### Bugfixes (Completed in v1.2.4)
1. ~~Bug 1 in v1.2.3 is not fixed. Now both table display have border again. they shouldn't have border.~~**FIXED in v1.2.4** - Added `!important` flags and `border-collapse: collapse` to table CSS to override WooCommerce's default table styling. Added comprehensive border removal for all table elements (table, thead, tbody, tr, th, td) to ensure truly borderless tables across all browsers.
2. ~~Bug 2 in v1.2.3: Increase the margin between checkbox and label and put the help icon right next to the label, not at the right border~~**FIXED in v1.2.4** - Increased checkbox right margin from 8px to 12px. Repositioned help tip icon to display inline right next to the label text using flexbox layout with `display: inline-flex`, removing float positioning that caused it to appear at the right edge.
##### New Features ##### New Features
1. Create different, selectable templates for tierprices and packages to use in the frontend. Make the new templates selectable globally on the settings-page, not per product. 1. Create different, selectable templates for tierprices and packages to use in the frontend. Make the new templates selectable globally on the settings-page, not per product.
@@ -654,7 +723,7 @@ Roadmap for the upcoming development.
## Support & Resources ## Support & Resources
- **Repository:** https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices - **Repository:** <https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices>
- **Documentation:** See `README.md`, `QUICKSTART.md`, `USAGE_EXAMPLES.md`, `INSTALLATION.md` - **Documentation:** See `README.md`, `QUICKSTART.md`, `USAGE_EXAMPLES.md`, `INSTALLATION.md`
- **Changelog:** `CHANGELOG.md` (detailed version history) - **Changelog:** `CHANGELOG.md` (detailed version history)
- **Issue Tracking:** Check fatal-errors-*.log files for production errors - **Issue Tracking:** Check fatal-errors-*.log files for production errors

View File

@@ -28,19 +28,34 @@
.wc-tpp-packages-table { .wc-tpp-packages-table {
margin-top: 15px; margin-top: 15px;
margin-bottom: 15px; margin-bottom: 15px;
border: none; border: none !important;
border-collapse: collapse !important;
} }
.wc-tpp-tiers-table th, .wc-tpp-tiers-table th,
.wc-tpp-packages-table th,
.wc-tpp-tiers-table td,
.wc-tpp-packages-table td {
border: none !important;
}
.wc-tpp-tiers-table th {
font-weight: 600;
text-align: left;
}
.wc-tpp-packages-table th { .wc-tpp-packages-table th {
font-weight: 600; font-weight: 600;
text-align: left; text-align: left;
border: none;
} }
.wc-tpp-tiers-table td, .wc-tpp-tiers-table thead,
.wc-tpp-packages-table td { .wc-tpp-packages-table thead,
border: none; .wc-tpp-tiers-table tbody,
.wc-tpp-packages-table tbody,
.wc-tpp-tiers-table tr,
.wc-tpp-packages-table tr {
border: none !important;
} }
/* Table row styling - rows are now <tr> elements in a table */ /* Table row styling - rows are now <tr> elements in a table */
@@ -99,14 +114,26 @@
/* Checkbox styling improvements */ /* Checkbox styling improvements */
#_wc_tpp_restrict_to_packages, #_wc_tpp_restrict_to_packages,
input[id^="wc_tpp_restrict_to_packages_"] { input[id^="wc_tpp_restrict_to_packages_"] {
margin-right: 8px !important; margin-right: 12px !important;
} }
/* Ensure description is properly hidden when desc_tip is used */ /* Position help tip icon right next to the label text */
.wc-tpp-tier-pricing .woocommerce-help-tip, .wc-tpp-tier-pricing .woocommerce-help-tip,
.wc-tpp-package-pricing .woocommerce-help-tip, .wc-tpp-package-pricing .woocommerce-help-tip,
.wc-tpp-variation-pricing .woocommerce-help-tip { .wc-tpp-variation-pricing .woocommerce-help-tip {
margin-left: 5px; margin-left: 6px;
margin-right: 0;
float: none;
display: inline-block;
vertical-align: middle;
}
/* Fix WooCommerce checkbox label layout for our checkboxes */
label[for="_wc_tpp_restrict_to_packages"],
label[for^="wc_tpp_restrict_to_packages_"] {
display: inline-flex;
align-items: center;
gap: 0;
} }
/* Hide inline description text when tooltip is shown */ /* Hide inline description text when tooltip is shown */

View File

@@ -1,7 +1,7 @@
{ {
"name": "magdev/wc-tier-package-prices", "name": "magdev/wc-tier-package-prices",
"description": "WooCommerce plugin for tier pricing and package prices with Twig templates", "description": "WooCommerce plugin for tier pricing and package prices with Twig templates",
"version": "1.2.3", "version": "1.2.4",
"type": "wordpress-plugin", "type": "wordpress-plugin",
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"authors": [ "authors": [

View File

@@ -4,7 +4,7 @@
* Plugin Name: WooCommerce Tier and Package Prices * Plugin Name: WooCommerce Tier and Package Prices
* Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices * Plugin URI: https://src.bundespruefstelle.ch/magdev/wc-tier-package-prices
* Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices * Description: Add tier pricing and package prices to WooCommerce products with configurable quantities at fixed prices
* Version: 1.2.3 * Version: 1.2.4
* Author: Marco Graetsch * Author: Marco Graetsch
* Author URI: https://src.bundespruefstelle.ch/magdev * Author URI: https://src.bundespruefstelle.ch/magdev
* Text Domain: wc-tier-package-prices * Text Domain: wc-tier-package-prices
@@ -23,7 +23,7 @@ if (!defined('ABSPATH')) {
// Define plugin constants // Define plugin constants
if (!defined('WC_TPP_VERSION')) { if (!defined('WC_TPP_VERSION')) {
define('WC_TPP_VERSION', '1.2.3'); define('WC_TPP_VERSION', '1.2.4');
} }
if (!defined('WC_TPP_PLUGIN_DIR')) { if (!defined('WC_TPP_PLUGIN_DIR')) {
define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__)); define('WC_TPP_PLUGIN_DIR', plugin_dir_path(__FILE__));