diff --git a/.github/ISSUE_TEMPLATE/custom.md b/.github/ISSUE_TEMPLATE/custom.md deleted file mode 100644 index 48d5f81f..00000000 --- a/.github/ISSUE_TEMPLATE/custom.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Custom issue template -about: Describe this issue template's purpose here. -title: '' -labels: '' -assignees: '' - ---- - - diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..d75169d8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,19 @@ +## Description + + +## Type of change +- [ ] Bug fix +- [ ] New feature +- [ ] Refactoring / code improvement +- [ ] Documentation update +- [ ] Translation update + +## Checklist +- [ ] CI pipeline passes (PHPStan, migrations, translations check) +- [ ] Branch targets `main` +- [ ] Code follows PSR-12 (PHP) / project conventions +- [ ] If adding/editing translations: all language files in `src/Core/Resources/translations/` were updated +- [ ] If introducing behavior changes: CHANGELOG entry added + +## Testing + diff --git a/CHANGELOG.md b/CHANGELOG.md index 7766a9f3..2d8ba778 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,42 @@ # Changelog +## [0.6.4] - 2026-03-02 + +### Added +- Added price preview widget in the product pricing tab showing formatted prices for each billing period. +- Added email notification sent to the user when an admin creates a server on their behalf. +- Added filesystem permission precheck before plugin upload to verify write access and show clear error messages. +- Added filesystem permission precheck before theme upload to verify write access and show clear error messages. +- Added Marketplace integration in the admin panel - browse, search, and install plugins directly from marketplace.pteroca.com. +- Added support for required user-provided server variables during the server purchase flow. +- Added product egg variable validation rules support - rules defined in egg configuration are now enforced on user input. +- Added server health status badge in the admin server CRUD list view. +- Added configurable "Manage in Pterodactyl" button on the user server management page (can be enabled/disabled in settings). +- Added configurable price format settings - customizable decimal and thousands separators for price display. +- Added configurable datetime format settings - date format, timezone, and timezone visibility can be set per installation. +- Added configurable minimum top-up amount setting for wallet balance. +- Added custom head scripts setting - arbitrary scripts can be injected into the `
` of the landing page and panel. +- Added code editor field type for settings with syntax highlighting support. +- Added short description field to products for use in SEO metadata and store listing previews. + +### Changed +- Improved admin server CRUD list view - Pterodactyl server identifier is now shown in a shortened form on the index page. +- Updated contribution documentation - improved CONTRIBUTING.md, PR template, issue templates, and code of conduct. +- Updated help link in product CRUD controllers. +- Added Mailhog to the development Docker environment for local email testing. + +### Fixed +- Fixed server state in the servers list showing as unknown when the status check cannot be performed. +- Fixed doubled server ID appearing in the server name after migration from Pterodactyl. +- Fixed invalid YAML escaping in the Italian translation file. +- Fixed theme export functionality that was producing invalid archives. +- Fixed plugin migration not wrapping schema changes in a database transaction. +- Fixed saving the default theme context in theme settings. +- Fixed EasyAdmin CRUD controllers not calling the parent `configureFields` method, causing plugin-registered fields to be dropped. +- Fixed node selection not respecting Pterodactyl maintenance mode - nodes in maintenance are now skipped during automatic selection and rejected when chosen manually. + +--- + ## [0.6.3] - 2026-02-03 ### Added diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index b5659f58..2a3f7dda 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -56,6 +56,9 @@ Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. +This includes our GitHub repository, Discord server (discord.gg/Gz5phhuZym), +and any other official community spaces. + ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e4f91d75..d0628e4d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing to PteroCA -Thank you for your interest in contributing to **PteroCA**! We welcome contributions from everyone. Here’s how you can help: +Thank you for your interest in contributing to **PteroCA**! We welcome contributions from everyone. Here's how you can help: ## How to Contribute @@ -23,57 +23,124 @@ We love new ideas! If you have a feature request, follow these steps: ### Submitting Pull Requests 1. **Fork the repository**: Create your own fork of the repository by clicking the "Fork" button in the top right of our [GitHub repository](https://github.com/pteroca-com/panel). -2. **Create a new branch**: Use a descriptive name for your branch. For example: `feature/add-payment-integration` or `bugfix/fix-user-auth`. +2. **Create a new branch**: Use a descriptive name for your branch. See [Branch Naming](#branch-naming) below. 3. **Make changes**: Add your code, following our coding standards: - Follow PSR-12 for PHP. - Write clear, concise code with comments where necessary. - Write tests for your code whenever possible. -4. **Commit your changes**: Write meaningful and descriptive commit messages. +4. **Commit your changes**: Write meaningful and descriptive commit messages. See [Commit Messages](#commit-messages) below. 5. **Push to your fork**: Push the changes from your local repository to your fork on GitHub. -6. **Submit a pull request**: From your forked repository, click the “New Pull Request” button. Ensure that your pull request is well-documented and references any issues it resolves. +6. **Submit a pull request**: From your forked repository, click the "New Pull Request" button. Make sure your PR targets the `main` branch. -### Code Review and Feedback +## Branch Naming -- **Be patient**: Our maintainers will review your pull request as soon as possible. We may ask you to make additional changes. -- **Tests**: Ensure your pull request passes all tests before submission. Use PHPUnit for testing the PHP code. -- **Constructive Feedback**: If your pull request is rejected, don’t be discouraged. We will provide constructive feedback to help you improve. +Use the following naming conventions for your branches: -## Community Guidelines +- `feature/+ {{ 'pteroca.email.admin_server_created.note'|trans }} +
+{% endblock %} diff --git a/themes/default/email/components/alert.html.twig b/themes/default/email/components/alert.html.twig index dbe3d364..f8ecb366 100644 --- a/themes/default/email/components/alert.html.twig +++ b/themes/default/email/components/alert.html.twig @@ -43,11 +43,11 @@- {{ title }} + {{ title }}
{% endif %}- {{ message|raw }} + {{ message|raw }}
{{ product.description|length > 200 ? product.description|slice(0, 200) ~ '...' : product.description }}
+ {% if product.shortDescription %} +{{ product.shortDescription|nl2br|safe_html }}
+ {% elseif product.description %} + {% set plainDescription = product.description|striptags %} +{{ plainDescription|length > 150 ? plainDescription|slice(0, 150) ~ '...' : plainDescription }}
{% else %}{{ 'pteroca.landing.products.view_details'|trans }}
{% endif %} diff --git a/themes/default/landing/layout/base.html.twig b/themes/default/landing/layout/base.html.twig index 75d17ae1..ddec304b 100644 --- a/themes/default/landing/layout/base.html.twig +++ b/themes/default/landing/layout/base.html.twig @@ -16,6 +16,10 @@ {% endblock %} + + {% block head_custom_scripts %} + {% include 'components/custom_head_scripts.html.twig' %} + {% endblock %} {% block navigation %} diff --git a/themes/default/landing/store.html.twig b/themes/default/landing/store.html.twig index 4617156e..942c0aa3 100644 --- a/themes/default/landing/store.html.twig +++ b/themes/default/landing/store.html.twig @@ -33,18 +33,21 @@{{ product.description|slice(0, 100) }}...
+ {% if product.shortDescription %} +{{ product.shortDescription|nl2br|safe_html }}
+ {% elseif product.description %} + {% set plainDescription = product.description|striptags %} +{{ plainDescription|length > 150 ? plainDescription|slice(0, 150) ~ '...' : plainDescription }}
{% endif %}+ + {{ 'pteroca.cart_configuration.user_required_variables_description'|trans }} +
+ +| {{ 'pteroca.crud.plugin.name'|trans }} | -{{ 'pteroca.crud.plugin.display_name'|trans }} | -{{ 'pteroca.crud.plugin.version'|trans }} | -{{ 'pteroca.crud.plugin.author'|trans }} | -{{ 'pteroca.crud.plugin.state'|trans }} | -{{ 'pteroca.crud.plugin.actions'|trans }} | -||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ plugin.name }} | -{{ plugin.displayName }} | -{{ plugin.version }} | -{{ plugin.author }} | -- - {{ plugin.state.label|trans }} - - | -- {# Detail button - always visible #} - - - - - {# Dynamic actions from controller #} - {% if plugin_actions[plugin.name] is defined %} - {% for action in plugin_actions[plugin.name] %} - - - - {% endfor %} - {% endif %} - | -||||||
| - {{ 'pteroca.crud.plugin.no_plugins_found'|trans }} - | +{{ 'pteroca.crud.plugin.name'|trans }} | +{{ 'pteroca.crud.plugin.display_name'|trans }} | +{{ 'pteroca.crud.plugin.version'|trans }} | +{{ 'pteroca.crud.plugin.author'|trans }} | +{{ 'pteroca.crud.plugin.state'|trans }} | +{{ 'pteroca.crud.plugin.actions'|trans }} | |||||
|---|---|---|---|---|---|---|---|---|---|---|---|
{{ 'pteroca.plugin.upload.filesystem_warning_body'|trans }}
+{{ path }}sudo chown -R www-data:www-data var/ plugins/ public/plugins/
+ | {{ 'pteroca.crud.theme.name'|trans }} | -{{ 'pteroca.crud.theme.version'|trans }} | -{{ 'pteroca.crud.theme.author'|trans }} | -{{ 'pteroca.crud.theme.contexts'|trans }} | -{{ 'pteroca.crud.theme.status'|trans }} | -{{ 'pteroca.crud.theme.actions'|trans }} | -|||||
|---|---|---|---|---|---|---|---|---|---|---|
| {{ theme.displayName }} | -{{ theme.version }} | -{{ theme.author }} | -- {% if theme.contexts is defined and theme.contexts|length > 0 %} - {% for context in theme.contexts %} - {{ context|capitalize }} - {% endfor %} - {% else %} - - - {% endif %} - | -
- {% if theme.activeContexts|length > 0 %}
-
- {% for activeContext in theme.activeContexts %}
-
- {{ 'pteroca.crud.theme.active'|trans }}: {{ activeContext|capitalize }}
-
+ {{ 'pteroca.crud.theme.name'|trans }} |
+ {{ 'pteroca.crud.theme.version'|trans }} |
+ {{ 'pteroca.crud.theme.author'|trans }} |
+ {{ 'pteroca.crud.theme.contexts'|trans }} |
+ {{ 'pteroca.crud.theme.status'|trans }} |
+ {{ 'pteroca.crud.theme.actions'|trans }} |
+ |
| {{ theme.displayName }} | +{{ theme.version }} | +{{ theme.author }} | ++ {% if theme.contexts is defined and theme.contexts|length > 0 %} + {% for context in theme.contexts %} + {{ context|capitalize }} {% endfor %} - - {% else %} - - {{ 'pteroca.crud.theme.inactive'|trans }} - - {% endif %} - | -
- {# Dropdown menu with actions #}
- {% if theme_actions[theme.name] is defined and theme_actions[theme.name]|length > 0 %}
-
-
-
-
- |
+
+ {% if theme.activeContexts|length > 0 %}
+
+ {% for activeContext in theme.activeContexts %}
+
+ {{ 'pteroca.crud.theme.active'|trans }}: {{ activeContext|capitalize }}
+
{% endfor %}
-
-
- {% endif %}
- |
- |||||
| - {{ 'pteroca.crud.theme.no_themes_found_unified'|trans }} - | -||||||||||
{{ 'pteroca.theme.upload.filesystem_warning_body'|trans }}
+{{ path }}sudo chown -R www-data:www-data var/ themes/ public/assets/theme/
+ {{ serverData.pterodactylServer.description }}
{% endif %}{% if backup.checksum is defined %}{{ backup.checksum }}{% else %}-{% endif %}
- {{ 'pteroca.server.rules'|trans }}:
+
+ {{ 'pteroca.server.rules'|trans }}:
{% for rule in serverVariable.rules %}
- {{ rule }}
+ {{ rule }}
{% endfor %}
-
+
{{ product.description }}
+{{ product.description }}
+