Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8f772c2364 | |||
| 166e48f442 | |||
| eec0b12154 | |||
| 3e290d7cb5 | |||
| 3304a55fd4 | |||
| 7cdc6bdd8f | |||
| 1fb305e7a1 | |||
| 7f81de31ab | |||
| bcfb10a6c7 |
+367
-352
@@ -1,396 +1,411 @@
|
||||
<a name="readme-top"></a>
|
||||
# Changelog
|
||||
|
||||
## [1.1.1](https://github.com/perfect-panel/ppanel-web/compare/v1.1.0...v1.1.1) (2025-07-20)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
* **node-table**: Update translations for headers and no data display ([eec0b12](https://github.com/perfect-panel/ppanel-web/commit/eec0b12))
|
||||
* **rules**: Change rule type from 'auto' to 'default' and update ([3e290d7](https://github.com/perfect-panel/ppanel-web/commit/3e290d7))
|
||||
* **rules**: Update rule settings ([3304a55](https://github.com/perfect-panel/ppanel-web/commit/3304a55))
|
||||
* **subscribe-form**: Optimize discount calculation logic and debounce updates ([166e48f](https://github.com/perfect-panel/ppanel-web/commit/166e48f))
|
||||
* **tutorial**: Comment out unused getVersion function and simplify getVersionPath ([7cdc6bd](https://github.com/perfect-panel/ppanel-web/commit/7cdc6bd))
|
||||
* **tutorial**: Return latest version in case of fetch error ([1fb305e](https://github.com/perfect-panel/ppanel-web/commit/1fb305e))
|
||||
|
||||
<a name="readme-top"></a>
|
||||
|
||||
# Changelog
|
||||
|
||||
# [1.1.0](https://github.com/perfect-panel/ppanel-web/compare/v1.0.2...v1.1.0) (2025-07-06)
|
||||
|
||||
### ✨ Features
|
||||
|
||||
- **view**: Add AnyTLS protocol support and enhance node configuration options ([bcfb10a](https://github.com/perfect-panel/ppanel-web/commit/bcfb10a))
|
||||
|
||||
<a name="readme-top"></a>
|
||||
|
||||
# Changelog
|
||||
|
||||
## [1.0.2](https://github.com/perfect-panel/ppanel-web/compare/v1.0.1...v1.0.2) (2025-06-29)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
* **subscription**: User subscription information ([7d18ff6](https://github.com/perfect-panel/ppanel-web/commit/7d18ff6))
|
||||
- **subscription**: User subscription information ([7d18ff6](https://github.com/perfect-panel/ppanel-web/commit/7d18ff6))
|
||||
|
||||
## [1.0.1](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0...v1.0.1) (2025-04-28)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
* **payment**: Disable webhook_secret field in PaymentForm component ([d323af8](https://github.com/perfect-panel/ppanel-web/commit/d323af8))
|
||||
* **recharge**: Set balance prop to false in PaymentMethods component ([356ae5b](https://github.com/perfect-panel/ppanel-web/commit/356ae5b))
|
||||
- **payment**: Disable webhook_secret field in PaymentForm component ([d323af8](https://github.com/perfect-panel/ppanel-web/commit/d323af8))
|
||||
- **recharge**: Set balance prop to false in PaymentMethods component ([356ae5b](https://github.com/perfect-panel/ppanel-web/commit/356ae5b))
|
||||
|
||||
# 1.0.0 (2025-04-24)
|
||||
|
||||
|
||||
### ♻ Code Refactoring
|
||||
|
||||
* **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616))
|
||||
* **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))
|
||||
* **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
|
||||
* **config**: Simplify environment variable handling and improve build script ([cf54d0f](https://github.com/perfect-panel/ppanel-web/commit/cf54d0f))
|
||||
* **config**: Viewport ([24b8601](https://github.com/perfect-panel/ppanel-web/commit/24b8601))
|
||||
* **core**: Restructure project for better module separation ([9d0cb8b](https://github.com/perfect-panel/ppanel-web/commit/9d0cb8b))
|
||||
* **deps**: Update ([19837a1](https://github.com/perfect-panel/ppanel-web/commit/19837a1))
|
||||
* **empty**: Content ([aa4c667](https://github.com/perfect-panel/ppanel-web/commit/aa4c667))
|
||||
* **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
|
||||
* **sbscribe**: Rename and reorganize components for better structure and clarity ([5e5e4ed](https://github.com/perfect-panel/ppanel-web/commit/5e5e4ed))
|
||||
* **ui**: Dependencies ([727d779](https://github.com/perfect-panel/ppanel-web/commit/727d779))
|
||||
* **ui**: Layout ([9262d7d](https://github.com/perfect-panel/ppanel-web/commit/9262d7d))
|
||||
* **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
|
||||
* Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))
|
||||
* Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
|
||||
|
||||
- **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616))
|
||||
- **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))
|
||||
- **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
|
||||
- **config**: Simplify environment variable handling and improve build script ([cf54d0f](https://github.com/perfect-panel/ppanel-web/commit/cf54d0f))
|
||||
- **config**: Viewport ([24b8601](https://github.com/perfect-panel/ppanel-web/commit/24b8601))
|
||||
- **core**: Restructure project for better module separation ([9d0cb8b](https://github.com/perfect-panel/ppanel-web/commit/9d0cb8b))
|
||||
- **deps**: Update ([19837a1](https://github.com/perfect-panel/ppanel-web/commit/19837a1))
|
||||
- **empty**: Content ([aa4c667](https://github.com/perfect-panel/ppanel-web/commit/aa4c667))
|
||||
- **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
|
||||
- **sbscribe**: Rename and reorganize components for better structure and clarity ([5e5e4ed](https://github.com/perfect-panel/ppanel-web/commit/5e5e4ed))
|
||||
- **ui**: Dependencies ([727d779](https://github.com/perfect-panel/ppanel-web/commit/727d779))
|
||||
- **ui**: Layout ([9262d7d](https://github.com/perfect-panel/ppanel-web/commit/9262d7d))
|
||||
- **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
|
||||
- Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))
|
||||
- Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
|
||||
|
||||
### ⚡ Performance Improvements
|
||||
|
||||
* **subscribe**: Form discount price ([059a892](https://github.com/perfect-panel/ppanel-web/commit/059a892))
|
||||
|
||||
- **subscribe**: Form discount price ([059a892](https://github.com/perfect-panel/ppanel-web/commit/059a892))
|
||||
|
||||
### ✨ Features
|
||||
|
||||
* **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
|
||||
* **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd))
|
||||
* **admin**: Add application and rule management entries to localization files ([8b43e69](https://github.com/perfect-panel/ppanel-web/commit/8b43e69))
|
||||
* **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
|
||||
* **affiliate**: Affiliate Detail ([a782c17](https://github.com/perfect-panel/ppanel-web/commit/a782c17))
|
||||
* **affiliate**: Commission Rate ([5eec430](https://github.com/perfect-panel/ppanel-web/commit/5eec430))
|
||||
* **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
|
||||
* **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7))
|
||||
* **api**: Add an interface to obtain user subscription details, update related type definitions and localized text ([cf5c39c](https://github.com/perfect-panel/ppanel-web/commit/cf5c39c))
|
||||
* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
|
||||
* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([dddc21c](https://github.com/perfect-panel/ppanel-web/commit/dddc21c))
|
||||
* **api**: Add new subscription properties and locale support for deduction ratios and reset cycles ([fec80f5](https://github.com/perfect-panel/ppanel-web/commit/fec80f5))
|
||||
* **api**: Add Time Period Configuration ([837157c](https://github.com/perfect-panel/ppanel-web/commit/837157c))
|
||||
* **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a))
|
||||
* **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
|
||||
* **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
|
||||
* **auth**: Add email and SMS code sending functionality with localization updates ([57eaa55](https://github.com/perfect-panel/ppanel-web/commit/57eaa55))
|
||||
* **auth**: Add Oauth configuration for Telegram, Facebook, Google, Github, and Apple ([18ee600](https://github.com/perfect-panel/ppanel-web/commit/18ee600))
|
||||
* **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))
|
||||
* **auth**: Add SMS and email configuration options to global store and update localization ([4acf7b1](https://github.com/perfect-panel/ppanel-web/commit/4acf7b1))
|
||||
* **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
|
||||
* **auth**: Enhance user registration with invite handling and logo display ([207bc24](https://github.com/perfect-panel/ppanel-web/commit/207bc24))
|
||||
* **auth**: Redirect user after OAuth login and add logos icon collection ([aa6dda8](https://github.com/perfect-panel/ppanel-web/commit/aa6dda8))
|
||||
* **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
|
||||
* **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d))
|
||||
* **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
|
||||
* **config**: Add application selection and encryption settings to configuration form ([88b3504](https://github.com/perfect-panel/ppanel-web/commit/88b3504))
|
||||
* **config**: FormatBytes ([9251a09](https://github.com/perfect-panel/ppanel-web/commit/9251a09))
|
||||
* **config**: Protocol type ([a3b45b4](https://github.com/perfect-panel/ppanel-web/commit/a3b45b4))
|
||||
* **config**: Update encryption fields in configuration form and refactor OAuth callback parameters ([652e032](https://github.com/perfect-panel/ppanel-web/commit/652e032))
|
||||
* **config**: Webhook Domain ([01e06c6](https://github.com/perfect-panel/ppanel-web/commit/01e06c6))
|
||||
* **dashboard**: Optimization ([5b3f4b4](https://github.com/perfect-panel/ppanel-web/commit/5b3f4b4))
|
||||
* **dashboard**: Statistics ([2926abc](https://github.com/perfect-panel/ppanel-web/commit/2926abc))
|
||||
* **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
|
||||
* **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
|
||||
* **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
|
||||
* **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
|
||||
* **form**: Make version field optional and set default value; update site domain placeholder for clarity ([42ba9e8](https://github.com/perfect-panel/ppanel-web/commit/42ba9e8))
|
||||
* **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
|
||||
* **global**: Add SMS configuration options to global store ([39a9ce6](https://github.com/perfect-panel/ppanel-web/commit/39a9ce6))
|
||||
* **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27))
|
||||
* **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
|
||||
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
|
||||
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
|
||||
* **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
|
||||
* **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
|
||||
* **loading**: Replace loading animation with a simpler spinner and loading text ([b8316bb](https://github.com/perfect-panel/ppanel-web/commit/b8316bb))
|
||||
* **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88))
|
||||
* **locales**: Add area code and telephone fields to user forms in multiple languages ([9b8258c](https://github.com/perfect-panel/ppanel-web/commit/9b8258c))
|
||||
* **locales**: Add description information of communication keys and encryption methods to enhance client configuration capabilities ([d1f5a9b](https://github.com/perfect-panel/ppanel-web/commit/d1f5a9b))
|
||||
* **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
|
||||
* **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9))
|
||||
* **locales**: Replace 'nodeGroupId' with 'groupId' in multiple language files for consistency ([a4e9d5d](https://github.com/perfect-panel/ppanel-web/commit/a4e9d5d))
|
||||
* **locales**: Update 'deductBalance' to 'giftAmount' across multiple languages and fix newline in announcement.json ([70497af](https://github.com/perfect-panel/ppanel-web/commit/70497af))
|
||||
* **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
|
||||
* **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
|
||||
* **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
|
||||
* **node-subscription**: Add copy functionality for columns ([3a81e37](https://github.com/perfect-panel/ppanel-web/commit/3a81e37))
|
||||
* **node**: Add NodeStatus ([c712624](https://github.com/perfect-panel/ppanel-web/commit/c712624))
|
||||
* **node**: Add protocol ([301b635](https://github.com/perfect-panel/ppanel-web/commit/301b635))
|
||||
* **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
|
||||
* **node**: Add status ([c06372b](https://github.com/perfect-panel/ppanel-web/commit/c06372b))
|
||||
* **node**: Add tags ([f408fdf](https://github.com/perfect-panel/ppanel-web/commit/f408fdf))
|
||||
* **node**: Move the node configuration to the server module ([7f0f5ce](https://github.com/perfect-panel/ppanel-web/commit/7f0f5ce))
|
||||
* **oauth**: Add certification component for handling OAuth login callbacks and improve user authentication flow ([5ed04c0](https://github.com/perfect-panel/ppanel-web/commit/5ed04c0))
|
||||
* **oauth**: Implement OAuth token retrieval and refactor login callback handling ([40a6f7c](https://github.com/perfect-panel/ppanel-web/commit/40a6f7c))
|
||||
* **oauth**: Refactor platform parameter handling and improve logout redirection logic ([8346c85](https://github.com/perfect-panel/ppanel-web/commit/8346c85))
|
||||
* **oauth**: Update OAuth login handling to use callback parameter and improve URL parameter retrieval ([9227411](https://github.com/perfect-panel/ppanel-web/commit/9227411))
|
||||
* **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
|
||||
* **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
|
||||
* **platform**: Update platform naming and add keywords and custom HTML fields ([6384237](https://github.com/perfect-panel/ppanel-web/commit/6384237))
|
||||
* **privacy-policy**: Add privacy policy related text and links ([baa68f0](https://github.com/perfect-panel/ppanel-web/commit/baa68f0))
|
||||
* **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
|
||||
* **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
|
||||
* **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
|
||||
* **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
|
||||
* **site**: Added localization support for custom HTML and keyword fields ([f9d7736](https://github.com/perfect-panel/ppanel-web/commit/f9d7736))
|
||||
* **sms**: Update locales ([938363b](https://github.com/perfect-panel/ppanel-web/commit/938363b))
|
||||
* **stats**: Replace dynamic stat fetching with environment constants for user, server, and location counts ([46ae166](https://github.com/perfect-panel/ppanel-web/commit/46ae166))
|
||||
* **subscribe**: Add 'sold' column to SubscribeTable and update inventory terminology ([19619fd](https://github.com/perfect-panel/ppanel-web/commit/19619fd))
|
||||
* **subscribe**: Add reset_time to API typings and update unsubscribe logic ([eeea165](https://github.com/perfect-panel/ppanel-web/commit/eeea165))
|
||||
* **subscribe**: Add subscribe_discount type ([f99c604](https://github.com/perfect-panel/ppanel-web/commit/f99c604))
|
||||
* **subscribe**: Add subscription credits ([5bc7905](https://github.com/perfect-panel/ppanel-web/commit/5bc7905))
|
||||
* **subscribe**: Add unit time ([39d07ec](https://github.com/perfect-panel/ppanel-web/commit/39d07ec))
|
||||
* **subscribe**: Add unsubscribe functionality with confirmation messages and localized strings ([b2a2f42](https://github.com/perfect-panel/ppanel-web/commit/b2a2f42))
|
||||
* **subscribe**: Improve error handling in subscription forms and update component props ([d28a10b](https://github.com/perfect-panel/ppanel-web/commit/d28a10b))
|
||||
* **subscribe**: Improve layout and styling in subscription components ([5766376](https://github.com/perfect-panel/ppanel-web/commit/5766376))
|
||||
* **subscribe**: Move subscription configuration and application to subscription module ([f90d4d2](https://github.com/perfect-panel/ppanel-web/commit/f90d4d2))
|
||||
* **subscribe**: Update SubscribeTable component to use API.SubscribeItem type and ensure proper type casting ([f26f1c2](https://github.com/perfect-panel/ppanel-web/commit/f26f1c2))
|
||||
* **subscribe**: Update suffix from 'MB' to 'Mbps' and enhance speed limit display logic ([3547bb1](https://github.com/perfect-panel/ppanel-web/commit/3547bb1))
|
||||
* **subscription**: Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
|
||||
* **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
|
||||
* **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))
|
||||
* **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))
|
||||
* **table**: Add sorting support for Node and subscription columns ([27924b0](https://github.com/perfect-panel/ppanel-web/commit/27924b0))
|
||||
* **table**: Supports drag and drop sorting ([2f56ef5](https://github.com/perfect-panel/ppanel-web/commit/2f56ef5))
|
||||
* **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
|
||||
* **tos**: Display data ([6024454](https://github.com/perfect-panel/ppanel-web/commit/6024454))
|
||||
* **tutorial**: Add common tutorial list ([872252c](https://github.com/perfect-panel/ppanel-web/commit/872252c))
|
||||
* **tutorial**: Fetch the latest tutorial version from GitHub API for dynamic URL generation ([28f8c78](https://github.com/perfect-panel/ppanel-web/commit/28f8c78))
|
||||
* **ui**: System Tool ([1836980](https://github.com/perfect-panel/ppanel-web/commit/1836980))
|
||||
* **ui**: Update homepage data ([8425b13](https://github.com/perfect-panel/ppanel-web/commit/8425b13))
|
||||
* **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
|
||||
* **user**: Add 'gift_amount' field and update related references in user services and components ([b13c77e](https://github.com/perfect-panel/ppanel-web/commit/b13c77e))
|
||||
* **user**: Add telephone input with area code selection and update localization ([585b99c](https://github.com/perfect-panel/ppanel-web/commit/585b99c))
|
||||
* **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
|
||||
* **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
|
||||
* **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac))
|
||||
* Update Auth Control ([c59742a](https://github.com/perfect-panel/ppanel-web/commit/c59742a))
|
||||
|
||||
- **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
|
||||
- **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd))
|
||||
- **admin**: Add application and rule management entries to localization files ([8b43e69](https://github.com/perfect-panel/ppanel-web/commit/8b43e69))
|
||||
- **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
|
||||
- **affiliate**: Affiliate Detail ([a782c17](https://github.com/perfect-panel/ppanel-web/commit/a782c17))
|
||||
- **affiliate**: Commission Rate ([5eec430](https://github.com/perfect-panel/ppanel-web/commit/5eec430))
|
||||
- **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
|
||||
- **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7))
|
||||
- **api**: Add an interface to obtain user subscription details, update related type definitions and localized text ([cf5c39c](https://github.com/perfect-panel/ppanel-web/commit/cf5c39c))
|
||||
- **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
|
||||
- **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([dddc21c](https://github.com/perfect-panel/ppanel-web/commit/dddc21c))
|
||||
- **api**: Add new subscription properties and locale support for deduction ratios and reset cycles ([fec80f5](https://github.com/perfect-panel/ppanel-web/commit/fec80f5))
|
||||
- **api**: Add Time Period Configuration ([837157c](https://github.com/perfect-panel/ppanel-web/commit/837157c))
|
||||
- **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a))
|
||||
- **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
|
||||
- **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
|
||||
- **auth**: Add email and SMS code sending functionality with localization updates ([57eaa55](https://github.com/perfect-panel/ppanel-web/commit/57eaa55))
|
||||
- **auth**: Add Oauth configuration for Telegram, Facebook, Google, Github, and Apple ([18ee600](https://github.com/perfect-panel/ppanel-web/commit/18ee600))
|
||||
- **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))
|
||||
- **auth**: Add SMS and email configuration options to global store and update localization ([4acf7b1](https://github.com/perfect-panel/ppanel-web/commit/4acf7b1))
|
||||
- **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
|
||||
- **auth**: Enhance user registration with invite handling and logo display ([207bc24](https://github.com/perfect-panel/ppanel-web/commit/207bc24))
|
||||
- **auth**: Redirect user after OAuth login and add logos icon collection ([aa6dda8](https://github.com/perfect-panel/ppanel-web/commit/aa6dda8))
|
||||
- **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
|
||||
- **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d))
|
||||
- **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
|
||||
- **config**: Add application selection and encryption settings to configuration form ([88b3504](https://github.com/perfect-panel/ppanel-web/commit/88b3504))
|
||||
- **config**: FormatBytes ([9251a09](https://github.com/perfect-panel/ppanel-web/commit/9251a09))
|
||||
- **config**: Protocol type ([a3b45b4](https://github.com/perfect-panel/ppanel-web/commit/a3b45b4))
|
||||
- **config**: Update encryption fields in configuration form and refactor OAuth callback parameters ([652e032](https://github.com/perfect-panel/ppanel-web/commit/652e032))
|
||||
- **config**: Webhook Domain ([01e06c6](https://github.com/perfect-panel/ppanel-web/commit/01e06c6))
|
||||
- **dashboard**: Optimization ([5b3f4b4](https://github.com/perfect-panel/ppanel-web/commit/5b3f4b4))
|
||||
- **dashboard**: Statistics ([2926abc](https://github.com/perfect-panel/ppanel-web/commit/2926abc))
|
||||
- **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
|
||||
- **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
|
||||
- **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
|
||||
- **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
|
||||
- **form**: Make version field optional and set default value; update site domain placeholder for clarity ([42ba9e8](https://github.com/perfect-panel/ppanel-web/commit/42ba9e8))
|
||||
- **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
|
||||
- **global**: Add SMS configuration options to global store ([39a9ce6](https://github.com/perfect-panel/ppanel-web/commit/39a9ce6))
|
||||
- **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27))
|
||||
- **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
|
||||
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
|
||||
- **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
|
||||
- **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
|
||||
- **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
|
||||
- **loading**: Replace loading animation with a simpler spinner and loading text ([b8316bb](https://github.com/perfect-panel/ppanel-web/commit/b8316bb))
|
||||
- **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88))
|
||||
- **locales**: Add area code and telephone fields to user forms in multiple languages ([9b8258c](https://github.com/perfect-panel/ppanel-web/commit/9b8258c))
|
||||
- **locales**: Add description information of communication keys and encryption methods to enhance client configuration capabilities ([d1f5a9b](https://github.com/perfect-panel/ppanel-web/commit/d1f5a9b))
|
||||
- **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
|
||||
- **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9))
|
||||
- **locales**: Replace 'nodeGroupId' with 'groupId' in multiple language files for consistency ([a4e9d5d](https://github.com/perfect-panel/ppanel-web/commit/a4e9d5d))
|
||||
- **locales**: Update 'deductBalance' to 'giftAmount' across multiple languages and fix newline in announcement.json ([70497af](https://github.com/perfect-panel/ppanel-web/commit/70497af))
|
||||
- **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
|
||||
- **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
|
||||
- **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
|
||||
- **node-subscription**: Add copy functionality for columns ([3a81e37](https://github.com/perfect-panel/ppanel-web/commit/3a81e37))
|
||||
- **node**: Add NodeStatus ([c712624](https://github.com/perfect-panel/ppanel-web/commit/c712624))
|
||||
- **node**: Add protocol ([301b635](https://github.com/perfect-panel/ppanel-web/commit/301b635))
|
||||
- **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
|
||||
- **node**: Add status ([c06372b](https://github.com/perfect-panel/ppanel-web/commit/c06372b))
|
||||
- **node**: Add tags ([f408fdf](https://github.com/perfect-panel/ppanel-web/commit/f408fdf))
|
||||
- **node**: Move the node configuration to the server module ([7f0f5ce](https://github.com/perfect-panel/ppanel-web/commit/7f0f5ce))
|
||||
- **oauth**: Add certification component for handling OAuth login callbacks and improve user authentication flow ([5ed04c0](https://github.com/perfect-panel/ppanel-web/commit/5ed04c0))
|
||||
- **oauth**: Implement OAuth token retrieval and refactor login callback handling ([40a6f7c](https://github.com/perfect-panel/ppanel-web/commit/40a6f7c))
|
||||
- **oauth**: Refactor platform parameter handling and improve logout redirection logic ([8346c85](https://github.com/perfect-panel/ppanel-web/commit/8346c85))
|
||||
- **oauth**: Update OAuth login handling to use callback parameter and improve URL parameter retrieval ([9227411](https://github.com/perfect-panel/ppanel-web/commit/9227411))
|
||||
- **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
|
||||
- **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
|
||||
- **platform**: Update platform naming and add keywords and custom HTML fields ([6384237](https://github.com/perfect-panel/ppanel-web/commit/6384237))
|
||||
- **privacy-policy**: Add privacy policy related text and links ([baa68f0](https://github.com/perfect-panel/ppanel-web/commit/baa68f0))
|
||||
- **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
|
||||
- **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
|
||||
- **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
|
||||
- **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
|
||||
- **site**: Added localization support for custom HTML and keyword fields ([f9d7736](https://github.com/perfect-panel/ppanel-web/commit/f9d7736))
|
||||
- **sms**: Update locales ([938363b](https://github.com/perfect-panel/ppanel-web/commit/938363b))
|
||||
- **stats**: Replace dynamic stat fetching with environment constants for user, server, and location counts ([46ae166](https://github.com/perfect-panel/ppanel-web/commit/46ae166))
|
||||
- **subscribe**: Add 'sold' column to SubscribeTable and update inventory terminology ([19619fd](https://github.com/perfect-panel/ppanel-web/commit/19619fd))
|
||||
- **subscribe**: Add reset_time to API typings and update unsubscribe logic ([eeea165](https://github.com/perfect-panel/ppanel-web/commit/eeea165))
|
||||
- **subscribe**: Add subscribe_discount type ([f99c604](https://github.com/perfect-panel/ppanel-web/commit/f99c604))
|
||||
- **subscribe**: Add subscription credits ([5bc7905](https://github.com/perfect-panel/ppanel-web/commit/5bc7905))
|
||||
- **subscribe**: Add unit time ([39d07ec](https://github.com/perfect-panel/ppanel-web/commit/39d07ec))
|
||||
- **subscribe**: Add unsubscribe functionality with confirmation messages and localized strings ([b2a2f42](https://github.com/perfect-panel/ppanel-web/commit/b2a2f42))
|
||||
- **subscribe**: Improve error handling in subscription forms and update component props ([d28a10b](https://github.com/perfect-panel/ppanel-web/commit/d28a10b))
|
||||
- **subscribe**: Improve layout and styling in subscription components ([5766376](https://github.com/perfect-panel/ppanel-web/commit/5766376))
|
||||
- **subscribe**: Move subscription configuration and application to subscription module ([f90d4d2](https://github.com/perfect-panel/ppanel-web/commit/f90d4d2))
|
||||
- **subscribe**: Update SubscribeTable component to use API.SubscribeItem type and ensure proper type casting ([f26f1c2](https://github.com/perfect-panel/ppanel-web/commit/f26f1c2))
|
||||
- **subscribe**: Update suffix from 'MB' to 'Mbps' and enhance speed limit display logic ([3547bb1](https://github.com/perfect-panel/ppanel-web/commit/3547bb1))
|
||||
- **subscription**: Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
|
||||
- **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
|
||||
- **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))
|
||||
- **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))
|
||||
- **table**: Add sorting support for Node and subscription columns ([27924b0](https://github.com/perfect-panel/ppanel-web/commit/27924b0))
|
||||
- **table**: Supports drag and drop sorting ([2f56ef5](https://github.com/perfect-panel/ppanel-web/commit/2f56ef5))
|
||||
- **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
|
||||
- **tos**: Display data ([6024454](https://github.com/perfect-panel/ppanel-web/commit/6024454))
|
||||
- **tutorial**: Add common tutorial list ([872252c](https://github.com/perfect-panel/ppanel-web/commit/872252c))
|
||||
- **tutorial**: Fetch the latest tutorial version from GitHub API for dynamic URL generation ([28f8c78](https://github.com/perfect-panel/ppanel-web/commit/28f8c78))
|
||||
- **ui**: System Tool ([1836980](https://github.com/perfect-panel/ppanel-web/commit/1836980))
|
||||
- **ui**: Update homepage data ([8425b13](https://github.com/perfect-panel/ppanel-web/commit/8425b13))
|
||||
- **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
|
||||
- **user**: Add 'gift_amount' field and update related references in user services and components ([b13c77e](https://github.com/perfect-panel/ppanel-web/commit/b13c77e))
|
||||
- **user**: Add telephone input with area code selection and update localization ([585b99c](https://github.com/perfect-panel/ppanel-web/commit/585b99c))
|
||||
- **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
|
||||
- **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
|
||||
- **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac))
|
||||
- Update Auth Control ([c59742a](https://github.com/perfect-panel/ppanel-web/commit/c59742a))
|
||||
|
||||
### 🎫 Chores
|
||||
|
||||
* **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331))
|
||||
* **deps**: Update package dependencies across multiple projects for improved stability and performance ([b01a5bc](https://github.com/perfect-panel/ppanel-web/commit/b01a5bc))
|
||||
* **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
|
||||
* **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
|
||||
* **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))
|
||||
* **release**: V1.0.0-beta.1 [skip ci] ([7284d1c](https://github.com/perfect-panel/ppanel-web/commit/7284d1c))
|
||||
* **release**: V1.0.0-beta.10 [skip ci] ([5cf573a](https://github.com/perfect-panel/ppanel-web/commit/5cf573a))
|
||||
* **release**: V1.0.0-beta.11 [skip ci] ([1f29506](https://github.com/perfect-panel/ppanel-web/commit/1f29506))
|
||||
* **release**: V1.0.0-beta.12 [skip ci] ([4418c47](https://github.com/perfect-panel/ppanel-web/commit/4418c47))
|
||||
* **release**: V1.0.0-beta.13 [skip ci] ([23c974a](https://github.com/perfect-panel/ppanel-web/commit/23c974a))
|
||||
* **release**: V1.0.0-beta.14 [skip ci] ([0fb0d8b](https://github.com/perfect-panel/ppanel-web/commit/0fb0d8b))
|
||||
* **release**: V1.0.0-beta.15 [skip ci] ([b2e8fad](https://github.com/perfect-panel/ppanel-web/commit/b2e8fad))
|
||||
* **release**: V1.0.0-beta.16 [skip ci] ([c3eff0a](https://github.com/perfect-panel/ppanel-web/commit/c3eff0a))
|
||||
* **release**: V1.0.0-beta.17 [skip ci] ([5b64389](https://github.com/perfect-panel/ppanel-web/commit/5b64389))
|
||||
* **release**: V1.0.0-beta.18 [skip ci] ([4a00233](https://github.com/perfect-panel/ppanel-web/commit/4a00233))
|
||||
* **release**: V1.0.0-beta.19 [skip ci] ([0f15fb8](https://github.com/perfect-panel/ppanel-web/commit/0f15fb8))
|
||||
* **release**: V1.0.0-beta.2 [skip ci] ([087c36c](https://github.com/perfect-panel/ppanel-web/commit/087c36c))
|
||||
* **release**: V1.0.0-beta.20 [skip ci] ([bbd44f0](https://github.com/perfect-panel/ppanel-web/commit/bbd44f0))
|
||||
* **release**: V1.0.0-beta.21 [skip ci] ([ca642c2](https://github.com/perfect-panel/ppanel-web/commit/ca642c2))
|
||||
* **release**: V1.0.0-beta.22 [skip ci] ([c0fb34f](https://github.com/perfect-panel/ppanel-web/commit/c0fb34f))
|
||||
* **release**: V1.0.0-beta.23 [skip ci] ([cf1d66d](https://github.com/perfect-panel/ppanel-web/commit/cf1d66d))
|
||||
* **release**: V1.0.0-beta.24 [skip ci] ([01a3aa0](https://github.com/perfect-panel/ppanel-web/commit/01a3aa0))
|
||||
* **release**: V1.0.0-beta.25 [skip ci] ([047a698](https://github.com/perfect-panel/ppanel-web/commit/047a698))
|
||||
* **release**: V1.0.0-beta.26 [skip ci] ([79edea7](https://github.com/perfect-panel/ppanel-web/commit/79edea7))
|
||||
* **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
|
||||
* **release**: V1.0.0-beta.27 [skip ci] ([85fdc36](https://github.com/perfect-panel/ppanel-web/commit/85fdc36))
|
||||
* **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
|
||||
* **release**: V1.0.0-beta.28 [skip ci] ([d10ecc9](https://github.com/perfect-panel/ppanel-web/commit/d10ecc9))
|
||||
* **release**: V1.0.0-beta.29 [skip ci] ([29bc3c7](https://github.com/perfect-panel/ppanel-web/commit/29bc3c7))
|
||||
* **release**: V1.0.0-beta.3 [skip ci] ([cd49427](https://github.com/perfect-panel/ppanel-web/commit/cd49427))
|
||||
* **release**: V1.0.0-beta.30 [skip ci] ([db0d9e0](https://github.com/perfect-panel/ppanel-web/commit/db0d9e0))
|
||||
* **release**: V1.0.0-beta.31 [skip ci] ([aa1d426](https://github.com/perfect-panel/ppanel-web/commit/aa1d426))
|
||||
* **release**: V1.0.0-beta.32 [skip ci] ([fa56eb8](https://github.com/perfect-panel/ppanel-web/commit/fa56eb8))
|
||||
* **release**: V1.0.0-beta.33 [skip ci] ([383638f](https://github.com/perfect-panel/ppanel-web/commit/383638f))
|
||||
* **release**: V1.0.0-beta.34 [skip ci] ([7023875](https://github.com/perfect-panel/ppanel-web/commit/7023875))
|
||||
* **release**: V1.0.0-beta.4 [skip ci] ([10d322f](https://github.com/perfect-panel/ppanel-web/commit/10d322f))
|
||||
* **release**: V1.0.0-beta.5 [skip ci] ([f275f01](https://github.com/perfect-panel/ppanel-web/commit/f275f01))
|
||||
* **release**: V1.0.0-beta.6 [skip ci] ([dd23279](https://github.com/perfect-panel/ppanel-web/commit/dd23279))
|
||||
* **release**: V1.0.0-beta.7 [skip ci] ([f60d40c](https://github.com/perfect-panel/ppanel-web/commit/f60d40c))
|
||||
* **release**: V1.0.0-beta.8 [skip ci], closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([a593eac](https://github.com/perfect-panel/ppanel-web/commit/a593eac))
|
||||
* **release**: V1.0.0-beta.9 [skip ci] ([855d1b0](https://github.com/perfect-panel/ppanel-web/commit/855d1b0))
|
||||
* **ui**: Update package dependencies for improved stability and performance ([25da429](https://github.com/perfect-panel/ppanel-web/commit/25da429))
|
||||
* Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
|
||||
* Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))
|
||||
|
||||
- **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331))
|
||||
- **deps**: Update package dependencies across multiple projects for improved stability and performance ([b01a5bc](https://github.com/perfect-panel/ppanel-web/commit/b01a5bc))
|
||||
- **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
|
||||
- **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
|
||||
- **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))
|
||||
- **release**: V1.0.0-beta.1 [skip ci] ([7284d1c](https://github.com/perfect-panel/ppanel-web/commit/7284d1c))
|
||||
- **release**: V1.0.0-beta.10 [skip ci] ([5cf573a](https://github.com/perfect-panel/ppanel-web/commit/5cf573a))
|
||||
- **release**: V1.0.0-beta.11 [skip ci] ([1f29506](https://github.com/perfect-panel/ppanel-web/commit/1f29506))
|
||||
- **release**: V1.0.0-beta.12 [skip ci] ([4418c47](https://github.com/perfect-panel/ppanel-web/commit/4418c47))
|
||||
- **release**: V1.0.0-beta.13 [skip ci] ([23c974a](https://github.com/perfect-panel/ppanel-web/commit/23c974a))
|
||||
- **release**: V1.0.0-beta.14 [skip ci] ([0fb0d8b](https://github.com/perfect-panel/ppanel-web/commit/0fb0d8b))
|
||||
- **release**: V1.0.0-beta.15 [skip ci] ([b2e8fad](https://github.com/perfect-panel/ppanel-web/commit/b2e8fad))
|
||||
- **release**: V1.0.0-beta.16 [skip ci] ([c3eff0a](https://github.com/perfect-panel/ppanel-web/commit/c3eff0a))
|
||||
- **release**: V1.0.0-beta.17 [skip ci] ([5b64389](https://github.com/perfect-panel/ppanel-web/commit/5b64389))
|
||||
- **release**: V1.0.0-beta.18 [skip ci] ([4a00233](https://github.com/perfect-panel/ppanel-web/commit/4a00233))
|
||||
- **release**: V1.0.0-beta.19 [skip ci] ([0f15fb8](https://github.com/perfect-panel/ppanel-web/commit/0f15fb8))
|
||||
- **release**: V1.0.0-beta.2 [skip ci] ([087c36c](https://github.com/perfect-panel/ppanel-web/commit/087c36c))
|
||||
- **release**: V1.0.0-beta.20 [skip ci] ([bbd44f0](https://github.com/perfect-panel/ppanel-web/commit/bbd44f0))
|
||||
- **release**: V1.0.0-beta.21 [skip ci] ([ca642c2](https://github.com/perfect-panel/ppanel-web/commit/ca642c2))
|
||||
- **release**: V1.0.0-beta.22 [skip ci] ([c0fb34f](https://github.com/perfect-panel/ppanel-web/commit/c0fb34f))
|
||||
- **release**: V1.0.0-beta.23 [skip ci] ([cf1d66d](https://github.com/perfect-panel/ppanel-web/commit/cf1d66d))
|
||||
- **release**: V1.0.0-beta.24 [skip ci] ([01a3aa0](https://github.com/perfect-panel/ppanel-web/commit/01a3aa0))
|
||||
- **release**: V1.0.0-beta.25 [skip ci] ([047a698](https://github.com/perfect-panel/ppanel-web/commit/047a698))
|
||||
- **release**: V1.0.0-beta.26 [skip ci] ([79edea7](https://github.com/perfect-panel/ppanel-web/commit/79edea7))
|
||||
- **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
|
||||
- **release**: V1.0.0-beta.27 [skip ci] ([85fdc36](https://github.com/perfect-panel/ppanel-web/commit/85fdc36))
|
||||
- **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
|
||||
- **release**: V1.0.0-beta.28 [skip ci] ([d10ecc9](https://github.com/perfect-panel/ppanel-web/commit/d10ecc9))
|
||||
- **release**: V1.0.0-beta.29 [skip ci] ([29bc3c7](https://github.com/perfect-panel/ppanel-web/commit/29bc3c7))
|
||||
- **release**: V1.0.0-beta.3 [skip ci] ([cd49427](https://github.com/perfect-panel/ppanel-web/commit/cd49427))
|
||||
- **release**: V1.0.0-beta.30 [skip ci] ([db0d9e0](https://github.com/perfect-panel/ppanel-web/commit/db0d9e0))
|
||||
- **release**: V1.0.0-beta.31 [skip ci] ([aa1d426](https://github.com/perfect-panel/ppanel-web/commit/aa1d426))
|
||||
- **release**: V1.0.0-beta.32 [skip ci] ([fa56eb8](https://github.com/perfect-panel/ppanel-web/commit/fa56eb8))
|
||||
- **release**: V1.0.0-beta.33 [skip ci] ([383638f](https://github.com/perfect-panel/ppanel-web/commit/383638f))
|
||||
- **release**: V1.0.0-beta.34 [skip ci] ([7023875](https://github.com/perfect-panel/ppanel-web/commit/7023875))
|
||||
- **release**: V1.0.0-beta.4 [skip ci] ([10d322f](https://github.com/perfect-panel/ppanel-web/commit/10d322f))
|
||||
- **release**: V1.0.0-beta.5 [skip ci] ([f275f01](https://github.com/perfect-panel/ppanel-web/commit/f275f01))
|
||||
- **release**: V1.0.0-beta.6 [skip ci] ([dd23279](https://github.com/perfect-panel/ppanel-web/commit/dd23279))
|
||||
- **release**: V1.0.0-beta.7 [skip ci] ([f60d40c](https://github.com/perfect-panel/ppanel-web/commit/f60d40c))
|
||||
- **release**: V1.0.0-beta.8 [skip ci], closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([a593eac](https://github.com/perfect-panel/ppanel-web/commit/a593eac))
|
||||
- **release**: V1.0.0-beta.9 [skip ci] ([855d1b0](https://github.com/perfect-panel/ppanel-web/commit/855d1b0))
|
||||
- **ui**: Update package dependencies for improved stability and performance ([25da429](https://github.com/perfect-panel/ppanel-web/commit/25da429))
|
||||
- Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
|
||||
- Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
* **admin**: Hidden versions and system upgrades ([64cd842](https://github.com/perfect-panel/ppanel-web/commit/64cd842))
|
||||
* **admin**: Modify the label type in the rule form to a string array ([a7aa5fe](https://github.com/perfect-panel/ppanel-web/commit/a7aa5fe))
|
||||
* **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
|
||||
* **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
|
||||
* **api**: PreCreateOrder ([ca747f5](https://github.com/perfect-panel/ppanel-web/commit/ca747f5))
|
||||
* **api**: Purge ([98c1c30](https://github.com/perfect-panel/ppanel-web/commit/98c1c30))
|
||||
* **api**: Remove redundant requestType parameter in appleLoginCallback ([0aa5d5b](https://github.com/perfect-panel/ppanel-web/commit/0aa5d5b))
|
||||
* **api**: Rename app-related functions and types to application for consistency ([9d8b814](https://github.com/perfect-panel/ppanel-web/commit/9d8b814))
|
||||
* **api**: Replace 'deduction' with 'gift_amount' and add 'commission' field in type definitions ([77edf1d](https://github.com/perfect-panel/ppanel-web/commit/77edf1d))
|
||||
* **api**: Server and order ([255bd82](https://github.com/perfect-panel/ppanel-web/commit/255bd82))
|
||||
* **api**: Statistics ([7962162](https://github.com/perfect-panel/ppanel-web/commit/7962162))
|
||||
* **api**: Subscribe token ([1932ba7](https://github.com/perfect-panel/ppanel-web/commit/1932ba7))
|
||||
* **api**: Update API type definitions to replace 'deduction' with 'gift_amount' and make 'commission' field optional ([c2af060](https://github.com/perfect-panel/ppanel-web/commit/c2af060))
|
||||
* **api**: Update Model ([39aaa73](https://github.com/perfect-panel/ppanel-web/commit/39aaa73))
|
||||
* **api**: Update subscription_protocol to subscribe_type for consistency across services ([b6da51b](https://github.com/perfect-panel/ppanel-web/commit/b6da51b))
|
||||
* **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
|
||||
* **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
|
||||
* **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
|
||||
* **auth**: Add error handling to form submission and reset Turnstile on failure ([715d011](https://github.com/perfect-panel/ppanel-web/commit/715d011))
|
||||
* **auth**: Change Textarea value to defaultValue for client_secret in Apple auth page ([69fc670](https://github.com/perfect-panel/ppanel-web/commit/69fc670))
|
||||
* **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
|
||||
* **auth**: Refactor reset password form to simplify code input and update placeholder text ([23833b4](https://github.com/perfect-panel/ppanel-web/commit/23833b4))
|
||||
* **auth**: Refactor user authentication forms to remove global store dependency and improve type handling ([12026b0](https://github.com/perfect-panel/ppanel-web/commit/12026b0))
|
||||
* **auth**: Remove unused telephone code login function and update typings for telephone login requests ([7239685](https://github.com/perfect-panel/ppanel-web/commit/7239685))
|
||||
* **auth**: Require minimum length for invite string when forced invite is enabled ([a604f28](https://github.com/perfect-panel/ppanel-web/commit/a604f28))
|
||||
* **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
|
||||
* **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
|
||||
* **auth**: Update email verification logic to use domain suffix check ([62662bb](https://github.com/perfect-panel/ppanel-web/commit/62662bb))
|
||||
* **auth**: Update user authentication flow to include email and phone code verification ([5d078fd](https://github.com/perfect-panel/ppanel-web/commit/5d078fd))
|
||||
* **auth**: Update UserCheckForm to use setInitialValues and modify onSubmit type ([c984c0d](https://github.com/perfect-panel/ppanel-web/commit/c984c0d))
|
||||
* **billing**: ExpiryDate ([e85e545](https://github.com/perfect-panel/ppanel-web/commit/e85e545))
|
||||
* **billing**: I18n and styles ([81e0f21](https://github.com/perfect-panel/ppanel-web/commit/81e0f21))
|
||||
* **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
|
||||
* **config**: AlipayF2F ([6c07107](https://github.com/perfect-panel/ppanel-web/commit/6c07107))
|
||||
* **config**: Bugs ([f57e40c](https://github.com/perfect-panel/ppanel-web/commit/f57e40c))
|
||||
* **config**: Checkout Order ([a31e763](https://github.com/perfect-panel/ppanel-web/commit/a31e763))
|
||||
* **config**: FormatBytes ([bbc2da0](https://github.com/perfect-panel/ppanel-web/commit/bbc2da0))
|
||||
* **config**: NoStore ([2cc18cf](https://github.com/perfect-panel/ppanel-web/commit/2cc18cf))
|
||||
* **config**: Runtime env ([a1e4999](https://github.com/perfect-panel/ppanel-web/commit/a1e4999))
|
||||
* **config**: Status Percentag ([8f322fb](https://github.com/perfect-panel/ppanel-web/commit/8f322fb))
|
||||
* **config**: SubLink ([1c61966](https://github.com/perfect-panel/ppanel-web/commit/1c61966))
|
||||
* **config**: Subscribe Link ([11ea821](https://github.com/perfect-panel/ppanel-web/commit/11ea821))
|
||||
* **content**: Parse subscription description and display features with icons ([3c5542a](https://github.com/perfect-panel/ppanel-web/commit/3c5542a))
|
||||
* **controller**: Order status ([8c6a097](https://github.com/perfect-panel/ppanel-web/commit/8c6a097))
|
||||
* **coupon**: Rename 'server' field to 'subscribe' in coupon form and update coupon update request type ([f8b6d82](https://github.com/perfect-panel/ppanel-web/commit/f8b6d82))
|
||||
* **dashboard**: Improve URL encoding for subscription links and enhance success message handling ([4983c33](https://github.com/perfect-panel/ppanel-web/commit/4983c33))
|
||||
* **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
|
||||
* **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
|
||||
* **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
|
||||
* **dashboard**: Format Bytes ([d8b0bd9](https://github.com/perfect-panel/ppanel-web/commit/d8b0bd9))
|
||||
* **dashboard**: Update icon imports for platform consistency and adjust icon size ([3e8912e](https://github.com/perfect-panel/ppanel-web/commit/3e8912e))
|
||||
* **dashboard**: Update platform detection logic and improve layout responsiveness ([b0aa364](https://github.com/perfect-panel/ppanel-web/commit/b0aa364))
|
||||
* **deps**: Remove outdated @iconify/react dependency and add iconify-json packages ([d6fbc38](https://github.com/perfect-panel/ppanel-web/commit/d6fbc38))
|
||||
* **deps**: Typescript config ([34e24b8](https://github.com/perfect-panel/ppanel-web/commit/34e24b8))
|
||||
* **deps**: Update clipboard ([5572710](https://github.com/perfect-panel/ppanel-web/commit/5572710))
|
||||
* **editor**: Change value ([4fdfeb2](https://github.com/perfect-panel/ppanel-web/commit/4fdfeb2))
|
||||
* **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
|
||||
* **footer**: Email address ([a451f44](https://github.com/perfect-panel/ppanel-web/commit/a451f44))
|
||||
* **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
|
||||
* **icon**: Comment out unused icon collection imports ([f17bf8d](https://github.com/perfect-panel/ppanel-web/commit/f17bf8d))
|
||||
* **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
|
||||
* **locale**: Default value ([937408f](https://github.com/perfect-panel/ppanel-web/commit/937408f))
|
||||
* **locale**: Document ([6f0fa20](https://github.com/perfect-panel/ppanel-web/commit/6f0fa20))
|
||||
* **locale**: Empty ([3832d20](https://github.com/perfect-panel/ppanel-web/commit/3832d20))
|
||||
* **locale**: Input Placeholder Webhook Domain ([bca0935](https://github.com/perfect-panel/ppanel-web/commit/bca0935))
|
||||
* **locale**: Language Select ([0befdb0](https://github.com/perfect-panel/ppanel-web/commit/0befdb0))
|
||||
* **locales**: Add error message for incorrect user information ([52c1d1f](https://github.com/perfect-panel/ppanel-web/commit/52c1d1f))
|
||||
* **locales**: Add error message for incorrect user information ([3d92902](https://github.com/perfect-panel/ppanel-web/commit/3d92902))
|
||||
* **locales**: Add logout message to authentication localization files ([1d0d911](https://github.com/perfect-panel/ppanel-web/commit/1d0d911))
|
||||
* **locales**: Fixed description in multilingual files, updated text related to email registration functionality ([c356bc2](https://github.com/perfect-panel/ppanel-web/commit/c356bc2))
|
||||
* **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
|
||||
* **locales**: Removed language file import to clean up unnecessary language support ([68f6ab2](https://github.com/perfect-panel/ppanel-web/commit/68f6ab2))
|
||||
* **locales**: Removed multilingual files to clean up unnecessary language support ([5b151cd](https://github.com/perfect-panel/ppanel-web/commit/5b151cd))
|
||||
* **locale**: Subscription Path Description ([4c67387](https://github.com/perfect-panel/ppanel-web/commit/4c67387))
|
||||
* **locales**: Update custom HTML description for clarity across multiple languages ([557c5cd](https://github.com/perfect-panel/ppanel-web/commit/557c5cd))
|
||||
* **locales**: Update custom HTML description in language file, ([87381da](https://github.com/perfect-panel/ppanel-web/commit/87381da))
|
||||
* **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
|
||||
* **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
|
||||
* **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
|
||||
* **logs**: Update log display to render key-value pairs and remove badge ([5ea6489](https://github.com/perfect-panel/ppanel-web/commit/5ea6489))
|
||||
* **metadata**: Global metadata ([15d5ecf](https://github.com/perfect-panel/ppanel-web/commit/15d5ecf))
|
||||
* **nav**: Comment out unused social login options to simplify navigation configuration ([cefcb31](https://github.com/perfect-panel/ppanel-web/commit/cefcb31))
|
||||
* **node-config**: Add null checks for time slots and ensure proper handling of undefined values ([1cdb7e7](https://github.com/perfect-panel/ppanel-web/commit/1cdb7e7))
|
||||
* **node**: Add country and city fields to the form schema and localization files ([8775fb6](https://github.com/perfect-panel/ppanel-web/commit/8775fb6))
|
||||
* **node**: Handle potential null value for online users count ([fa2fb28](https://github.com/perfect-panel/ppanel-web/commit/fa2fb28))
|
||||
* **node**: Locale and form ([38be4d5](https://github.com/perfect-panel/ppanel-web/commit/38be4d5))
|
||||
* **node**: Port config ([a20834a](https://github.com/perfect-panel/ppanel-web/commit/a20834a))
|
||||
* **node**: Reality config ([fadd17f](https://github.com/perfect-panel/ppanel-web/commit/fadd17f))
|
||||
* **node**: Service Name config ([d0be685](https://github.com/perfect-panel/ppanel-web/commit/d0be685))
|
||||
* **node**: TLS config ([57fae12](https://github.com/perfect-panel/ppanel-web/commit/57fae12))
|
||||
* **node**: Trojan protocol config ([7e1eb90](https://github.com/perfect-panel/ppanel-web/commit/7e1eb90))
|
||||
* **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
|
||||
* **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
|
||||
* **oauth**: Refactor OAuth configuration types and update related API methods ([6227ba9](https://github.com/perfect-panel/ppanel-web/commit/6227ba9))
|
||||
* **oauth**: Remove redundant checks when updating configuration to simplify logic ([9140b8a](https://github.com/perfect-panel/ppanel-web/commit/9140b8a))
|
||||
* **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
|
||||
* **payment**: Config and types ([b0c87fb](https://github.com/perfect-panel/ppanel-web/commit/b0c87fb))
|
||||
* **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
|
||||
* **payment**: Qrcode ([a9a535b](https://github.com/perfect-panel/ppanel-web/commit/a9a535b))
|
||||
* **payment**: Refactor payment form placeholder and update localization files ([4a4d364](https://github.com/perfect-panel/ppanel-web/commit/4a4d364))
|
||||
* **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
|
||||
* **payment**: Replace window.open with window.location.href for checkout links ([1d8c765](https://github.com/perfect-panel/ppanel-web/commit/1d8c765))
|
||||
* **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
|
||||
* **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
|
||||
* **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
|
||||
* **phone**: Update SMS expiration time field to use 'sms_expire_time' with default value of 300 ([18b07c7](https://github.com/perfect-panel/ppanel-web/commit/18b07c7))
|
||||
* **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
|
||||
* **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
|
||||
* **redirect**: Simplify redirect URL logic by removing unnecessary condition for sessionStorage ([c53ac61](https://github.com/perfect-panel/ppanel-web/commit/c53ac61))
|
||||
* **redirect**: Update redirect URL logic to ensure proper handling of OAuth and auth paths ([7954762](https://github.com/perfect-panel/ppanel-web/commit/7954762))
|
||||
* **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
|
||||
* **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
|
||||
* **request**: Locale ([37d408f](https://github.com/perfect-panel/ppanel-web/commit/37d408f))
|
||||
* **rule-form**: Remove redundant rule set display ([6e0c9b6](https://github.com/perfect-panel/ppanel-web/commit/6e0c9b6))
|
||||
* **rules**: Remove unused MATCH rule ([674a01c](https://github.com/perfect-panel/ppanel-web/commit/674a01c))
|
||||
* **site**: Add image upload functionality for site logo configuration ([4ea6e4a](https://github.com/perfect-panel/ppanel-web/commit/4ea6e4a))
|
||||
* **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
|
||||
* **sort**: Refactor sorting logic in NodeTable and SubscribeTable components for improved clarity and performance ([331bbea](https://github.com/perfect-panel/ppanel-web/commit/331bbea))
|
||||
* **subscribe**: Add value prop to field in subscription form for proper state management ([328838d](https://github.com/perfect-panel/ppanel-web/commit/328838d))
|
||||
* **subscribe**: Discount ([35a9f69](https://github.com/perfect-panel/ppanel-web/commit/35a9f69))
|
||||
* **subscribe**: Extract Domain ([40d61a9](https://github.com/perfect-panel/ppanel-web/commit/40d61a9))
|
||||
* **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
|
||||
* **subscribe**: Jumps and internationalization ([13fdec3](https://github.com/perfect-panel/ppanel-web/commit/13fdec3))
|
||||
* **subscribe**: Refactor discount calculations and default selection logic in subscription forms ([423b240](https://github.com/perfect-panel/ppanel-web/commit/423b240))
|
||||
* **subscribe**: Server group id ([90e6764](https://github.com/perfect-panel/ppanel-web/commit/90e6764))
|
||||
* **subscribe**: Update default selection logic in subscription form to ensure proper state management ([ef15374](https://github.com/perfect-panel/ppanel-web/commit/ef15374))
|
||||
* **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
|
||||
* **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
|
||||
* **subscribe**: Update subscription domain placeholder to include examples; improve site name retrieval in global store ([c65a44c](https://github.com/perfect-panel/ppanel-web/commit/c65a44c))
|
||||
* **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))
|
||||
* **subscription**: Add reset functionality for user subscription token ([39e89bf](https://github.com/perfect-panel/ppanel-web/commit/39e89bf))
|
||||
* **table**: Update privacy policy tab translation key and remove unnecessary requestType from OAuth callback ([14b3af5](https://github.com/perfect-panel/ppanel-web/commit/14b3af5))
|
||||
* **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
|
||||
* **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
|
||||
* **turnstile**: Turnstile_site_key ([0327b73](https://github.com/perfect-panel/ppanel-web/commit/0327b73))
|
||||
* **type**: Fix ts type check error ([3cb0629](https://github.com/perfect-panel/ppanel-web/commit/3cb0629))
|
||||
* **types**: Add 'gift_amount' field to API type definitions ([8f8a12a](https://github.com/perfect-panel/ppanel-web/commit/8f8a12a))
|
||||
* **types**: Checking ([2992824](https://github.com/perfect-panel/ppanel-web/commit/2992824))
|
||||
* **types**: Order type ([c7e50a9](https://github.com/perfect-panel/ppanel-web/commit/c7e50a9))
|
||||
* **ui**: Bugs ([b023d0f](https://github.com/perfect-panel/ppanel-web/commit/b023d0f))
|
||||
* **ui**: Components ([a7927d7](https://github.com/perfect-panel/ppanel-web/commit/a7927d7))
|
||||
* **ui**: Fix json formatting ([e1ddd94](https://github.com/perfect-panel/ppanel-web/commit/e1ddd94))
|
||||
* **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
|
||||
* **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
|
||||
* **user-nav**: Update user avatar and label to display telephone if email is not available ([7b6bb7b](https://github.com/perfect-panel/ppanel-web/commit/7b6bb7b))
|
||||
* **user**: Add the 'gift_amount' field to the user service's type definition ([6301409](https://github.com/perfect-panel/ppanel-web/commit/6301409))
|
||||
* **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
|
||||
* **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
|
||||
* **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
|
||||
* **user**: Update user identifier field and localizations ([1b6befa](https://github.com/perfect-panel/ppanel-web/commit/1b6befa))
|
||||
* **user**: Update user subscribe display ([3bb714d](https://github.com/perfect-panel/ppanel-web/commit/3bb714d))
|
||||
* **utils**: Login redirect url ([cbe5f0d](https://github.com/perfect-panel/ppanel-web/commit/cbe5f0d))
|
||||
* More bugs ([2d88a3a](https://github.com/perfect-panel/ppanel-web/commit/2d88a3a))
|
||||
|
||||
- **admin**: Hidden versions and system upgrades ([64cd842](https://github.com/perfect-panel/ppanel-web/commit/64cd842))
|
||||
- **admin**: Modify the label type in the rule form to a string array ([a7aa5fe](https://github.com/perfect-panel/ppanel-web/commit/a7aa5fe))
|
||||
- **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
|
||||
- **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
|
||||
- **api**: PreCreateOrder ([ca747f5](https://github.com/perfect-panel/ppanel-web/commit/ca747f5))
|
||||
- **api**: Purge ([98c1c30](https://github.com/perfect-panel/ppanel-web/commit/98c1c30))
|
||||
- **api**: Remove redundant requestType parameter in appleLoginCallback ([0aa5d5b](https://github.com/perfect-panel/ppanel-web/commit/0aa5d5b))
|
||||
- **api**: Rename app-related functions and types to application for consistency ([9d8b814](https://github.com/perfect-panel/ppanel-web/commit/9d8b814))
|
||||
- **api**: Replace 'deduction' with 'gift_amount' and add 'commission' field in type definitions ([77edf1d](https://github.com/perfect-panel/ppanel-web/commit/77edf1d))
|
||||
- **api**: Server and order ([255bd82](https://github.com/perfect-panel/ppanel-web/commit/255bd82))
|
||||
- **api**: Statistics ([7962162](https://github.com/perfect-panel/ppanel-web/commit/7962162))
|
||||
- **api**: Subscribe token ([1932ba7](https://github.com/perfect-panel/ppanel-web/commit/1932ba7))
|
||||
- **api**: Update API type definitions to replace 'deduction' with 'gift_amount' and make 'commission' field optional ([c2af060](https://github.com/perfect-panel/ppanel-web/commit/c2af060))
|
||||
- **api**: Update Model ([39aaa73](https://github.com/perfect-panel/ppanel-web/commit/39aaa73))
|
||||
- **api**: Update subscription_protocol to subscribe_type for consistency across services ([b6da51b](https://github.com/perfect-panel/ppanel-web/commit/b6da51b))
|
||||
- **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
|
||||
- **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
|
||||
- **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
|
||||
- **auth**: Add error handling to form submission and reset Turnstile on failure ([715d011](https://github.com/perfect-panel/ppanel-web/commit/715d011))
|
||||
- **auth**: Change Textarea value to defaultValue for client_secret in Apple auth page ([69fc670](https://github.com/perfect-panel/ppanel-web/commit/69fc670))
|
||||
- **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
|
||||
- **auth**: Refactor reset password form to simplify code input and update placeholder text ([23833b4](https://github.com/perfect-panel/ppanel-web/commit/23833b4))
|
||||
- **auth**: Refactor user authentication forms to remove global store dependency and improve type handling ([12026b0](https://github.com/perfect-panel/ppanel-web/commit/12026b0))
|
||||
- **auth**: Remove unused telephone code login function and update typings for telephone login requests ([7239685](https://github.com/perfect-panel/ppanel-web/commit/7239685))
|
||||
- **auth**: Require minimum length for invite string when forced invite is enabled ([a604f28](https://github.com/perfect-panel/ppanel-web/commit/a604f28))
|
||||
- **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
|
||||
- **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
|
||||
- **auth**: Update email verification logic to use domain suffix check ([62662bb](https://github.com/perfect-panel/ppanel-web/commit/62662bb))
|
||||
- **auth**: Update user authentication flow to include email and phone code verification ([5d078fd](https://github.com/perfect-panel/ppanel-web/commit/5d078fd))
|
||||
- **auth**: Update UserCheckForm to use setInitialValues and modify onSubmit type ([c984c0d](https://github.com/perfect-panel/ppanel-web/commit/c984c0d))
|
||||
- **billing**: ExpiryDate ([e85e545](https://github.com/perfect-panel/ppanel-web/commit/e85e545))
|
||||
- **billing**: I18n and styles ([81e0f21](https://github.com/perfect-panel/ppanel-web/commit/81e0f21))
|
||||
- **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
|
||||
- **config**: AlipayF2F ([6c07107](https://github.com/perfect-panel/ppanel-web/commit/6c07107))
|
||||
- **config**: Bugs ([f57e40c](https://github.com/perfect-panel/ppanel-web/commit/f57e40c))
|
||||
- **config**: Checkout Order ([a31e763](https://github.com/perfect-panel/ppanel-web/commit/a31e763))
|
||||
- **config**: FormatBytes ([bbc2da0](https://github.com/perfect-panel/ppanel-web/commit/bbc2da0))
|
||||
- **config**: NoStore ([2cc18cf](https://github.com/perfect-panel/ppanel-web/commit/2cc18cf))
|
||||
- **config**: Runtime env ([a1e4999](https://github.com/perfect-panel/ppanel-web/commit/a1e4999))
|
||||
- **config**: Status Percentag ([8f322fb](https://github.com/perfect-panel/ppanel-web/commit/8f322fb))
|
||||
- **config**: SubLink ([1c61966](https://github.com/perfect-panel/ppanel-web/commit/1c61966))
|
||||
- **config**: Subscribe Link ([11ea821](https://github.com/perfect-panel/ppanel-web/commit/11ea821))
|
||||
- **content**: Parse subscription description and display features with icons ([3c5542a](https://github.com/perfect-panel/ppanel-web/commit/3c5542a))
|
||||
- **controller**: Order status ([8c6a097](https://github.com/perfect-panel/ppanel-web/commit/8c6a097))
|
||||
- **coupon**: Rename 'server' field to 'subscribe' in coupon form and update coupon update request type ([f8b6d82](https://github.com/perfect-panel/ppanel-web/commit/f8b6d82))
|
||||
- **dashboard**: Improve URL encoding for subscription links and enhance success message handling ([4983c33](https://github.com/perfect-panel/ppanel-web/commit/4983c33))
|
||||
- **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
|
||||
- **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
|
||||
- **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
|
||||
- **dashboard**: Format Bytes ([d8b0bd9](https://github.com/perfect-panel/ppanel-web/commit/d8b0bd9))
|
||||
- **dashboard**: Update icon imports for platform consistency and adjust icon size ([3e8912e](https://github.com/perfect-panel/ppanel-web/commit/3e8912e))
|
||||
- **dashboard**: Update platform detection logic and improve layout responsiveness ([b0aa364](https://github.com/perfect-panel/ppanel-web/commit/b0aa364))
|
||||
- **deps**: Remove outdated @iconify/react dependency and add iconify-json packages ([d6fbc38](https://github.com/perfect-panel/ppanel-web/commit/d6fbc38))
|
||||
- **deps**: Typescript config ([34e24b8](https://github.com/perfect-panel/ppanel-web/commit/34e24b8))
|
||||
- **deps**: Update clipboard ([5572710](https://github.com/perfect-panel/ppanel-web/commit/5572710))
|
||||
- **editor**: Change value ([4fdfeb2](https://github.com/perfect-panel/ppanel-web/commit/4fdfeb2))
|
||||
- **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
|
||||
- **footer**: Email address ([a451f44](https://github.com/perfect-panel/ppanel-web/commit/a451f44))
|
||||
- **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
|
||||
- **icon**: Comment out unused icon collection imports ([f17bf8d](https://github.com/perfect-panel/ppanel-web/commit/f17bf8d))
|
||||
- **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
|
||||
- **locale**: Default value ([937408f](https://github.com/perfect-panel/ppanel-web/commit/937408f))
|
||||
- **locale**: Document ([6f0fa20](https://github.com/perfect-panel/ppanel-web/commit/6f0fa20))
|
||||
- **locale**: Empty ([3832d20](https://github.com/perfect-panel/ppanel-web/commit/3832d20))
|
||||
- **locale**: Input Placeholder Webhook Domain ([bca0935](https://github.com/perfect-panel/ppanel-web/commit/bca0935))
|
||||
- **locale**: Language Select ([0befdb0](https://github.com/perfect-panel/ppanel-web/commit/0befdb0))
|
||||
- **locales**: Add error message for incorrect user information ([52c1d1f](https://github.com/perfect-panel/ppanel-web/commit/52c1d1f))
|
||||
- **locales**: Add error message for incorrect user information ([3d92902](https://github.com/perfect-panel/ppanel-web/commit/3d92902))
|
||||
- **locales**: Add logout message to authentication localization files ([1d0d911](https://github.com/perfect-panel/ppanel-web/commit/1d0d911))
|
||||
- **locales**: Fixed description in multilingual files, updated text related to email registration functionality ([c356bc2](https://github.com/perfect-panel/ppanel-web/commit/c356bc2))
|
||||
- **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
|
||||
- **locales**: Removed language file import to clean up unnecessary language support ([68f6ab2](https://github.com/perfect-panel/ppanel-web/commit/68f6ab2))
|
||||
- **locales**: Removed multilingual files to clean up unnecessary language support ([5b151cd](https://github.com/perfect-panel/ppanel-web/commit/5b151cd))
|
||||
- **locale**: Subscription Path Description ([4c67387](https://github.com/perfect-panel/ppanel-web/commit/4c67387))
|
||||
- **locales**: Update custom HTML description for clarity across multiple languages ([557c5cd](https://github.com/perfect-panel/ppanel-web/commit/557c5cd))
|
||||
- **locales**: Update custom HTML description in language file, ([87381da](https://github.com/perfect-panel/ppanel-web/commit/87381da))
|
||||
- **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
|
||||
- **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
|
||||
- **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
|
||||
- **logs**: Update log display to render key-value pairs and remove badge ([5ea6489](https://github.com/perfect-panel/ppanel-web/commit/5ea6489))
|
||||
- **metadata**: Global metadata ([15d5ecf](https://github.com/perfect-panel/ppanel-web/commit/15d5ecf))
|
||||
- **nav**: Comment out unused social login options to simplify navigation configuration ([cefcb31](https://github.com/perfect-panel/ppanel-web/commit/cefcb31))
|
||||
- **node-config**: Add null checks for time slots and ensure proper handling of undefined values ([1cdb7e7](https://github.com/perfect-panel/ppanel-web/commit/1cdb7e7))
|
||||
- **node**: Add country and city fields to the form schema and localization files ([8775fb6](https://github.com/perfect-panel/ppanel-web/commit/8775fb6))
|
||||
- **node**: Handle potential null value for online users count ([fa2fb28](https://github.com/perfect-panel/ppanel-web/commit/fa2fb28))
|
||||
- **node**: Locale and form ([38be4d5](https://github.com/perfect-panel/ppanel-web/commit/38be4d5))
|
||||
- **node**: Port config ([a20834a](https://github.com/perfect-panel/ppanel-web/commit/a20834a))
|
||||
- **node**: Reality config ([fadd17f](https://github.com/perfect-panel/ppanel-web/commit/fadd17f))
|
||||
- **node**: Service Name config ([d0be685](https://github.com/perfect-panel/ppanel-web/commit/d0be685))
|
||||
- **node**: TLS config ([57fae12](https://github.com/perfect-panel/ppanel-web/commit/57fae12))
|
||||
- **node**: Trojan protocol config ([7e1eb90](https://github.com/perfect-panel/ppanel-web/commit/7e1eb90))
|
||||
- **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
|
||||
- **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
|
||||
- **oauth**: Refactor OAuth configuration types and update related API methods ([6227ba9](https://github.com/perfect-panel/ppanel-web/commit/6227ba9))
|
||||
- **oauth**: Remove redundant checks when updating configuration to simplify logic ([9140b8a](https://github.com/perfect-panel/ppanel-web/commit/9140b8a))
|
||||
- **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
|
||||
- **payment**: Config and types ([b0c87fb](https://github.com/perfect-panel/ppanel-web/commit/b0c87fb))
|
||||
- **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
|
||||
- **payment**: Qrcode ([a9a535b](https://github.com/perfect-panel/ppanel-web/commit/a9a535b))
|
||||
- **payment**: Refactor payment form placeholder and update localization files ([4a4d364](https://github.com/perfect-panel/ppanel-web/commit/4a4d364))
|
||||
- **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
|
||||
- **payment**: Replace window.open with window.location.href for checkout links ([1d8c765](https://github.com/perfect-panel/ppanel-web/commit/1d8c765))
|
||||
- **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
|
||||
- **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
|
||||
- **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
|
||||
- **phone**: Update SMS expiration time field to use 'sms_expire_time' with default value of 300 ([18b07c7](https://github.com/perfect-panel/ppanel-web/commit/18b07c7))
|
||||
- **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
|
||||
- **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
|
||||
- **redirect**: Simplify redirect URL logic by removing unnecessary condition for sessionStorage ([c53ac61](https://github.com/perfect-panel/ppanel-web/commit/c53ac61))
|
||||
- **redirect**: Update redirect URL logic to ensure proper handling of OAuth and auth paths ([7954762](https://github.com/perfect-panel/ppanel-web/commit/7954762))
|
||||
- **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
|
||||
- **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
|
||||
- **request**: Locale ([37d408f](https://github.com/perfect-panel/ppanel-web/commit/37d408f))
|
||||
- **rule-form**: Remove redundant rule set display ([6e0c9b6](https://github.com/perfect-panel/ppanel-web/commit/6e0c9b6))
|
||||
- **rules**: Remove unused MATCH rule ([674a01c](https://github.com/perfect-panel/ppanel-web/commit/674a01c))
|
||||
- **site**: Add image upload functionality for site logo configuration ([4ea6e4a](https://github.com/perfect-panel/ppanel-web/commit/4ea6e4a))
|
||||
- **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
|
||||
- **sort**: Refactor sorting logic in NodeTable and SubscribeTable components for improved clarity and performance ([331bbea](https://github.com/perfect-panel/ppanel-web/commit/331bbea))
|
||||
- **subscribe**: Add value prop to field in subscription form for proper state management ([328838d](https://github.com/perfect-panel/ppanel-web/commit/328838d))
|
||||
- **subscribe**: Discount ([35a9f69](https://github.com/perfect-panel/ppanel-web/commit/35a9f69))
|
||||
- **subscribe**: Extract Domain ([40d61a9](https://github.com/perfect-panel/ppanel-web/commit/40d61a9))
|
||||
- **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
|
||||
- **subscribe**: Jumps and internationalization ([13fdec3](https://github.com/perfect-panel/ppanel-web/commit/13fdec3))
|
||||
- **subscribe**: Refactor discount calculations and default selection logic in subscription forms ([423b240](https://github.com/perfect-panel/ppanel-web/commit/423b240))
|
||||
- **subscribe**: Server group id ([90e6764](https://github.com/perfect-panel/ppanel-web/commit/90e6764))
|
||||
- **subscribe**: Update default selection logic in subscription form to ensure proper state management ([ef15374](https://github.com/perfect-panel/ppanel-web/commit/ef15374))
|
||||
- **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
|
||||
- **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
|
||||
- **subscribe**: Update subscription domain placeholder to include examples; improve site name retrieval in global store ([c65a44c](https://github.com/perfect-panel/ppanel-web/commit/c65a44c))
|
||||
- **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))
|
||||
- **subscription**: Add reset functionality for user subscription token ([39e89bf](https://github.com/perfect-panel/ppanel-web/commit/39e89bf))
|
||||
- **table**: Update privacy policy tab translation key and remove unnecessary requestType from OAuth callback ([14b3af5](https://github.com/perfect-panel/ppanel-web/commit/14b3af5))
|
||||
- **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
|
||||
- **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
|
||||
- **turnstile**: Turnstile_site_key ([0327b73](https://github.com/perfect-panel/ppanel-web/commit/0327b73))
|
||||
- **type**: Fix ts type check error ([3cb0629](https://github.com/perfect-panel/ppanel-web/commit/3cb0629))
|
||||
- **types**: Add 'gift_amount' field to API type definitions ([8f8a12a](https://github.com/perfect-panel/ppanel-web/commit/8f8a12a))
|
||||
- **types**: Checking ([2992824](https://github.com/perfect-panel/ppanel-web/commit/2992824))
|
||||
- **types**: Order type ([c7e50a9](https://github.com/perfect-panel/ppanel-web/commit/c7e50a9))
|
||||
- **ui**: Bugs ([b023d0f](https://github.com/perfect-panel/ppanel-web/commit/b023d0f))
|
||||
- **ui**: Components ([a7927d7](https://github.com/perfect-panel/ppanel-web/commit/a7927d7))
|
||||
- **ui**: Fix json formatting ([e1ddd94](https://github.com/perfect-panel/ppanel-web/commit/e1ddd94))
|
||||
- **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
|
||||
- **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
|
||||
- **user-nav**: Update user avatar and label to display telephone if email is not available ([7b6bb7b](https://github.com/perfect-panel/ppanel-web/commit/7b6bb7b))
|
||||
- **user**: Add the 'gift_amount' field to the user service's type definition ([6301409](https://github.com/perfect-panel/ppanel-web/commit/6301409))
|
||||
- **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
|
||||
- **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
|
||||
- **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
|
||||
- **user**: Update user identifier field and localizations ([1b6befa](https://github.com/perfect-panel/ppanel-web/commit/1b6befa))
|
||||
- **user**: Update user subscribe display ([3bb714d](https://github.com/perfect-panel/ppanel-web/commit/3bb714d))
|
||||
- **utils**: Login redirect url ([cbe5f0d](https://github.com/perfect-panel/ppanel-web/commit/cbe5f0d))
|
||||
- More bugs ([2d88a3a](https://github.com/perfect-panel/ppanel-web/commit/2d88a3a))
|
||||
|
||||
### 👷 Build System
|
||||
|
||||
* **config**: Update pm2 config ([d95b425](https://github.com/perfect-panel/ppanel-web/commit/d95b425))
|
||||
|
||||
- **config**: Update pm2 config ([d95b425](https://github.com/perfect-panel/ppanel-web/commit/d95b425))
|
||||
|
||||
### 💄 Styles
|
||||
|
||||
* **dashboard**: Adjust grid layout and update image dimensions in application display ([f3204b7](https://github.com/perfect-panel/ppanel-web/commit/f3204b7))
|
||||
* **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
|
||||
* **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b))
|
||||
* **globals**: Refactor delete confirmation button and update badge styles in node and subscribe tables ([30ae781](https://github.com/perfect-panel/ppanel-web/commit/30ae781))
|
||||
* **locales**: Remove unused subscription labels from multiple locale files ([fb0c510](https://github.com/perfect-panel/ppanel-web/commit/fb0c510))
|
||||
* **locales**: Update server.json to reorganize relay mode options and improve labels ([701cdee](https://github.com/perfect-panel/ppanel-web/commit/701cdee))
|
||||
* **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add))
|
||||
* **node**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
|
||||
* **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925))
|
||||
* **time-slot**: Add chart display ([c44ad47](https://github.com/perfect-panel/ppanel-web/commit/c44ad47))
|
||||
* **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc))
|
||||
* Update node secret UI and add telephone code field to authentication form ([770932e](https://github.com/perfect-panel/ppanel-web/commit/770932e))
|
||||
|
||||
- **dashboard**: Adjust grid layout and update image dimensions in application display ([f3204b7](https://github.com/perfect-panel/ppanel-web/commit/f3204b7))
|
||||
- **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
|
||||
- **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b))
|
||||
- **globals**: Refactor delete confirmation button and update badge styles in node and subscribe tables ([30ae781](https://github.com/perfect-panel/ppanel-web/commit/30ae781))
|
||||
- **locales**: Remove unused subscription labels from multiple locale files ([fb0c510](https://github.com/perfect-panel/ppanel-web/commit/fb0c510))
|
||||
- **locales**: Update server.json to reorganize relay mode options and improve labels ([701cdee](https://github.com/perfect-panel/ppanel-web/commit/701cdee))
|
||||
- **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add))
|
||||
- **node**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
|
||||
- **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925))
|
||||
- **time-slot**: Add chart display ([c44ad47](https://github.com/perfect-panel/ppanel-web/commit/c44ad47))
|
||||
- **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc))
|
||||
- Update node secret UI and add telephone code field to authentication form ([770932e](https://github.com/perfect-panel/ppanel-web/commit/770932e))
|
||||
|
||||
### 📝 Documentation
|
||||
|
||||
* **readme**: License name ([74cb16b](https://github.com/perfect-panel/ppanel-web/commit/74cb16b))
|
||||
|
||||
- **readme**: License name ([74cb16b](https://github.com/perfect-panel/ppanel-web/commit/74cb16b))
|
||||
|
||||
### 🔧 Continuous Integration
|
||||
|
||||
* **github**: Release docker ([5af60aa](https://github.com/perfect-panel/ppanel-web/commit/5af60aa))
|
||||
* **step**: Update step name ([9eca618](https://github.com/perfect-panel/ppanel-web/commit/9eca618))
|
||||
- **github**: Release docker ([5af60aa](https://github.com/perfect-panel/ppanel-web/commit/5af60aa))
|
||||
- **step**: Update step name ([9eca618](https://github.com/perfect-panel/ppanel-web/commit/9eca618))
|
||||
|
||||
<a name="readme-top"></a>
|
||||
|
||||
|
||||
@@ -136,14 +136,14 @@ export function Register() {
|
||||
/>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
<TableRow>
|
||||
<TableCell>
|
||||
<TableRow className='flex flex-col'>
|
||||
<TableCell className='w-full'>
|
||||
<Label>{t('trialSubscribePlan')}</Label>
|
||||
<p className='text-muted-foreground text-xs'>
|
||||
{t('trialSubscribePlanDescription')}
|
||||
</p>
|
||||
</TableCell>
|
||||
<TableCell className='text-right'>
|
||||
<TableCell className='max-w-96'>
|
||||
<EnhancedInput
|
||||
placeholder={t('trialDuration')}
|
||||
type='number'
|
||||
|
||||
@@ -88,12 +88,32 @@ export default function ImportYamlRules({ onImportSuccess }: ImportYamlRulesProp
|
||||
if (!groups[policyGroup]) {
|
||||
groups[policyGroup] = [];
|
||||
}
|
||||
|
||||
// 不插入 MATCH 规则,只用于标识默认规则组
|
||||
if (!rule.trim().startsWith('MATCH,')) {
|
||||
groups[policyGroup].push(cleanRule);
|
||||
}
|
||||
}
|
||||
|
||||
return groups;
|
||||
};
|
||||
|
||||
const checkIfDefaultRule = (originalRules: string[], groupName: string): boolean => {
|
||||
return originalRules.some((rule) => {
|
||||
const trimmedRule = rule.trim();
|
||||
if (!trimmedRule.startsWith('MATCH,')) return false;
|
||||
|
||||
// 检查 MATCH 规则是否属于当前组
|
||||
const parts = trimmedRule.split(',');
|
||||
if (parts.length >= 3) {
|
||||
const ruleGroup = parts[2]?.trim();
|
||||
return ruleGroup === groupName;
|
||||
}
|
||||
|
||||
return groupName === 'default';
|
||||
});
|
||||
};
|
||||
|
||||
const handleImport = async () => {
|
||||
if (!yamlContent) {
|
||||
toast.error(t('pleaseUploadFile'));
|
||||
@@ -130,12 +150,17 @@ export default function ImportYamlRules({ onImportSuccess }: ImportYamlRulesProp
|
||||
for (let i = 0; i < groups.length; i++) {
|
||||
const group = groups[i];
|
||||
if (!group?.name || !group?.rules.length) continue;
|
||||
|
||||
const isDefault = checkIfDefaultRule(allRules, group.name);
|
||||
|
||||
await createRuleGroup({
|
||||
name: group.name,
|
||||
rules: group?.rules.join('\n'),
|
||||
enable: false,
|
||||
tags: [],
|
||||
icon: '',
|
||||
type: 'default',
|
||||
default: isDefault,
|
||||
});
|
||||
setImportProgress(i + 1);
|
||||
}
|
||||
|
||||
@@ -50,6 +50,8 @@ export default function Page() {
|
||||
enable: false,
|
||||
tags: values.tags || [],
|
||||
icon: values.icon || '',
|
||||
type: values.type || 'default',
|
||||
default: false,
|
||||
});
|
||||
toast.success(t('createSuccess'));
|
||||
ref.current?.refresh();
|
||||
@@ -100,27 +102,55 @@ export default function Page() {
|
||||
},
|
||||
},
|
||||
{
|
||||
accessorKey: 'icon',
|
||||
header: t('appIcon'),
|
||||
cell: ({ row }) =>
|
||||
row.getValue('icon') ? (
|
||||
<Image
|
||||
src={row.getValue('icon')}
|
||||
alt={row.getValue('name')}
|
||||
className='h-8 w-8 rounded-md'
|
||||
width={32}
|
||||
height={32}
|
||||
accessorKey: 'default',
|
||||
header: t('defaultRule'),
|
||||
cell: ({ row }) => (
|
||||
<Switch
|
||||
defaultChecked={row.original.default}
|
||||
onCheckedChange={async (checked) => {
|
||||
await updateRuleGroup({
|
||||
...row.original,
|
||||
default: checked,
|
||||
} as API.UpdateRuleGroupRequest);
|
||||
ref.current?.refresh();
|
||||
}}
|
||||
/>
|
||||
) : (
|
||||
<div className='bg-muted flex h-8 w-8 items-center justify-center rounded-md'>
|
||||
{row.original.name?.slice(0, 2)}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
|
||||
{
|
||||
accessorKey: 'type',
|
||||
header: t('type'),
|
||||
cell: ({ row }) => {
|
||||
const type = row.original.type || 'default';
|
||||
if (type === 'default') {
|
||||
return <Badge variant='default'>{t('default')}</Badge>;
|
||||
}
|
||||
if (type === 'reject') {
|
||||
return <Badge variant='destructive'>{t('reject')}</Badge>;
|
||||
}
|
||||
if (type === 'direct') {
|
||||
return <Badge variant='secondary'>{t('direct')}</Badge>;
|
||||
}
|
||||
return <Badge variant='default'>{t('default')}</Badge>;
|
||||
},
|
||||
},
|
||||
{
|
||||
accessorKey: 'name',
|
||||
header: t('name'),
|
||||
cell: ({ row }) => (
|
||||
<div className='flex items-center gap-2'>
|
||||
{row.original.icon && (
|
||||
<Image
|
||||
src={row.original.icon}
|
||||
alt={row.original.name}
|
||||
className='h-6 w-6 rounded-md'
|
||||
width={24}
|
||||
height={24}
|
||||
/>
|
||||
)}
|
||||
<span>{row.original.name}</span>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
{
|
||||
accessorKey: 'tags',
|
||||
@@ -163,6 +193,8 @@ export default function Page() {
|
||||
rules: values.rules,
|
||||
enable: row.enable,
|
||||
icon: values.icon,
|
||||
type: values.type,
|
||||
default: row.default,
|
||||
});
|
||||
toast.success(t('updateSuccess'));
|
||||
ref.current?.refresh();
|
||||
|
||||
@@ -13,6 +13,13 @@ import {
|
||||
FormMessage,
|
||||
} from '@workspace/ui/components/form';
|
||||
import { ScrollArea } from '@workspace/ui/components/scroll-area';
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from '@workspace/ui/components/select';
|
||||
import {
|
||||
Sheet,
|
||||
SheetContent,
|
||||
@@ -36,6 +43,7 @@ const formSchema = z.object({
|
||||
tags: z.array(z.string()).default([]),
|
||||
rules: z.string().default(''),
|
||||
icon: z.string().default(''),
|
||||
type: z.string().default('default'),
|
||||
});
|
||||
|
||||
interface RuleFormProps<T> {
|
||||
@@ -147,6 +155,33 @@ export default function RuleForm<T extends Record<string, any>>({
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='type'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('type')}</FormLabel>
|
||||
<FormControl>
|
||||
<Select
|
||||
value={field.value}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
}}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={t('selectType')} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
<SelectItem value='default'>{t('default')}</SelectItem>
|
||||
<SelectItem value='reject'>{t('reject')}</SelectItem>
|
||||
<SelectItem value='direct'>{t('direct')}</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='tags'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const protocols = ['shadowsocks', 'vmess', 'vless', 'trojan', 'hysteria2', 'tuic'];
|
||||
export const protocols = ['shadowsocks', 'vmess', 'vless', 'trojan', 'hysteria2', 'tuic', 'anytls'];
|
||||
|
||||
const nullableString = z.string().nullish();
|
||||
const portSchema = z.number().max(65535).nullish();
|
||||
@@ -58,7 +58,15 @@ const hysteria2Schema = z.object({
|
||||
|
||||
const tuicSchema = z.object({
|
||||
port: portSchema,
|
||||
security: z.string(),
|
||||
disable_sni: z.boolean().default(false),
|
||||
reduce_rtt: z.boolean().default(false),
|
||||
udp_relay_mode: z.string().default('native'),
|
||||
congestion_controller: z.string().default('bbr'),
|
||||
security_config: securityConfigSchema,
|
||||
});
|
||||
|
||||
const anytlsSchema = z.object({
|
||||
port: portSchema,
|
||||
security_config: securityConfigSchema,
|
||||
});
|
||||
|
||||
@@ -87,6 +95,10 @@ const protocolConfigSchema = z.discriminatedUnion('protocol', [
|
||||
protocol: z.literal('tuic'),
|
||||
config: tuicSchema,
|
||||
}),
|
||||
z.object({
|
||||
protocol: z.literal('anytls'),
|
||||
config: anytlsSchema,
|
||||
}),
|
||||
]);
|
||||
|
||||
const baseFormSchema = z.object({
|
||||
|
||||
@@ -110,7 +110,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
{trigger}
|
||||
</Button>
|
||||
</SheetTrigger>
|
||||
<SheetContent className='w-[520px] max-w-full md:max-w-screen-md'>
|
||||
<SheetContent className='w-[580px] max-w-full md:max-w-screen-md'>
|
||||
<SheetHeader>
|
||||
<SheetTitle>{title}</SheetTitle>
|
||||
</SheetHeader>
|
||||
@@ -290,7 +290,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
value={field.value}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
if (['trojan', 'hysteria2', 'tuic'].includes(value)) {
|
||||
if (['trojan', 'hysteria2', 'tuic', 'anytls'].includes(value)) {
|
||||
form.setValue('config.security', 'tls');
|
||||
}
|
||||
}}
|
||||
@@ -402,11 +402,11 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
</div>
|
||||
)}
|
||||
|
||||
{['vmess', 'vless', 'trojan', 'hysteria2', 'tuic'].includes(protocol) && (
|
||||
{['vmess', 'vless', 'trojan', 'hysteria2', 'tuic', 'anytls'].includes(protocol) && (
|
||||
<div className='grid gap-4'>
|
||||
<div
|
||||
className={cn('flex gap-4 *:flex-1', {
|
||||
'grid grid-cols-2': ['hysteria2'].includes(protocol),
|
||||
'grid grid-cols-2': ['hysteria2', 'tuic'].includes(protocol),
|
||||
})}
|
||||
>
|
||||
<FormField
|
||||
@@ -524,6 +524,109 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
{protocol === 'tuic' && (
|
||||
<>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='config.udp_relay_mode'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('form.udpRelayMode')}</FormLabel>
|
||||
<FormControl>
|
||||
<Select
|
||||
value={field.value}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
}}
|
||||
>
|
||||
<FormControl>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={t('form.pleaseSelect')} />
|
||||
</SelectTrigger>
|
||||
</FormControl>
|
||||
<SelectContent>
|
||||
<SelectItem value='native'>Native</SelectItem>
|
||||
<SelectItem value='quic'>QUIC</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='config.congestion_controller'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('form.congestionController')}</FormLabel>
|
||||
<FormControl>
|
||||
<Select
|
||||
value={field.value}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
}}
|
||||
>
|
||||
<FormControl>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder={t('form.pleaseSelect')} />
|
||||
</SelectTrigger>
|
||||
</FormControl>
|
||||
<SelectContent>
|
||||
<SelectItem value='bbr'>BBR</SelectItem>
|
||||
<SelectItem value='cubic'>Cubic</SelectItem>
|
||||
<SelectItem value='reno'>Reno</SelectItem>
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<div className='flex gap-2'>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='config.disable_sni'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('form.disableSni')}</FormLabel>
|
||||
<FormControl>
|
||||
<div className='pt-2'>
|
||||
<Switch
|
||||
checked={field.value}
|
||||
onCheckedChange={(checked) => {
|
||||
form.setValue(field.name, checked);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='config.reduce_rtt'
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{t('form.reduceRtt')}</FormLabel>
|
||||
<FormControl>
|
||||
<div className='pt-2'>
|
||||
<Switch
|
||||
checked={field.value}
|
||||
onCheckedChange={(checked) => {
|
||||
form.setValue(field.name, checked);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
{['vmess', 'vless', 'trojan'].includes(protocol) && (
|
||||
<Card>
|
||||
@@ -630,9 +733,12 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
)}
|
||||
</Card>
|
||||
)}
|
||||
{(['vmess', 'vless', 'trojan'].includes(protocol) ||
|
||||
['anytls', 'tuic', 'hysteria2'].includes(protocol)) && (
|
||||
<Card>
|
||||
<CardHeader className='flex flex-row items-center justify-between p-3'>
|
||||
<CardTitle>{t('form.securityConfig')}</CardTitle>
|
||||
{['vmess', 'vless', 'trojan'].includes(protocol) && (
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='config.security'
|
||||
@@ -663,8 +769,11 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
</CardHeader>
|
||||
{security !== 'none' && (
|
||||
{(['anytls', 'tuic', 'hysteria2'].includes(protocol) ||
|
||||
(['vmess', 'vless', 'trojan'].includes(protocol) &&
|
||||
security !== 'none')) && (
|
||||
<CardContent className='grid grid-cols-2 gap-4 p-3'>
|
||||
<FormField
|
||||
control={form.control}
|
||||
@@ -684,6 +793,8 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
{/* Reality 特殊配置只在 vless + reality 时显示 */}
|
||||
{protocol === 'vless' && security === 'reality' && (
|
||||
<>
|
||||
<FormField
|
||||
@@ -719,7 +830,9 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
type='number'
|
||||
min={1}
|
||||
max={65535}
|
||||
placeholder={t('form.security_config.serverPortPlaceholder')}
|
||||
placeholder={t(
|
||||
'form.security_config.serverPortPlaceholder',
|
||||
)}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
}}
|
||||
@@ -738,7 +851,9 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
<FormControl>
|
||||
<EnhancedInput
|
||||
{...field}
|
||||
placeholder={t('form.security_config.privateKeyPlaceholder')}
|
||||
placeholder={t(
|
||||
'form.security_config.privateKeyPlaceholder',
|
||||
)}
|
||||
onValueChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
}}
|
||||
@@ -788,6 +903,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
|
||||
{protocol === 'vless' && (
|
||||
<FormField
|
||||
control={form.control}
|
||||
@@ -818,11 +934,11 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<FormMessage />
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
)}
|
||||
|
||||
<FormField
|
||||
control={form.control}
|
||||
name='config.security_config.allow_insecure'
|
||||
@@ -833,8 +949,8 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
<div className='pt-2'>
|
||||
<Switch
|
||||
checked={!!field.value}
|
||||
onCheckedChange={(value) => {
|
||||
form.setValue(field.name, value);
|
||||
onCheckedChange={(checked) => {
|
||||
form.setValue(field.name, checked);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
@@ -846,6 +962,7 @@ export default function NodeForm<T extends { [x: string]: any }>({
|
||||
</CardContent>
|
||||
)}
|
||||
</Card>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ export default function NodeTable() {
|
||||
columns={[
|
||||
{
|
||||
accessorKey: 'id',
|
||||
header: 'ID',
|
||||
header: t('id'),
|
||||
cell: ({ row }) => (
|
||||
<TooltipProvider>
|
||||
<Tooltip>
|
||||
@@ -87,6 +87,7 @@ export default function NodeTable() {
|
||||
'bg-yellow-500': row.original.protocol === 'trojan',
|
||||
'bg-purple-500': row.original.protocol === 'hysteria2',
|
||||
'bg-cyan-500': row.original.protocol === 'tuic',
|
||||
'bg-gray-500': row.original.protocol === 'anytls',
|
||||
})}
|
||||
>
|
||||
{row.getValue('id')}
|
||||
@@ -159,7 +160,7 @@ export default function NodeTable() {
|
||||
header: t('nodeGroup'),
|
||||
cell: ({ row }) => {
|
||||
const name = groups?.find((group) => group.id === row.getValue('group_id'))?.name;
|
||||
return name ? <Badge variant='outline'>{name}</Badge> : '--';
|
||||
return name ? <Badge variant='outline'>{name}</Badge> : t('noData');
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -176,7 +177,7 @@ export default function NodeTable() {
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
'--'
|
||||
t('noData')
|
||||
);
|
||||
},
|
||||
},
|
||||
@@ -272,17 +273,17 @@ export default function NodeTable() {
|
||||
<ConfirmButton
|
||||
key='delete'
|
||||
trigger={<Button variant='destructive'>{t('delete')}</Button>}
|
||||
title={t('group.confirmDelete')}
|
||||
description={t('group.deleteWarning')}
|
||||
title={t('confirmDelete')}
|
||||
description={t('deleteWarning')}
|
||||
onConfirm={async () => {
|
||||
await batchDeleteNode({
|
||||
ids: rows.map((item) => item.id),
|
||||
});
|
||||
toast.success(t('group.deleteSuccess'));
|
||||
toast.success(t('deleteSuccess'));
|
||||
ref.current?.refresh();
|
||||
}}
|
||||
cancelText={t('group.cancel')}
|
||||
confirmText={t('group.confirm')}
|
||||
cancelText={t('cancel')}
|
||||
confirmText={t('confirm')}
|
||||
/>,
|
||||
];
|
||||
},
|
||||
|
||||
@@ -42,7 +42,7 @@ import { evaluateWithPrecision, unitConversion } from '@workspace/ui/utils';
|
||||
import { CreditCard, Server, Settings } from 'lucide-react';
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { assign, shake } from 'radash';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useCallback, useEffect, useRef, useState } from 'react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { toast } from 'sonner';
|
||||
import { z } from 'zod';
|
||||
@@ -81,6 +81,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
}: Readonly<SubscribeFormProps<T>>) {
|
||||
const t = useTranslations('subscribe');
|
||||
const [open, setOpen] = useState(false);
|
||||
const updateTimeoutRef = useRef<NodeJS.Timeout | null>(null);
|
||||
|
||||
const formSchema = z.object({
|
||||
name: z.string(),
|
||||
@@ -118,12 +119,111 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
),
|
||||
});
|
||||
|
||||
const debouncedCalculateDiscount = useCallback(
|
||||
(values: any[], fieldName: string, lastChangedField?: string, changedIndex?: number) => {
|
||||
if (updateTimeoutRef.current) {
|
||||
clearTimeout(updateTimeoutRef.current);
|
||||
}
|
||||
|
||||
updateTimeoutRef.current = setTimeout(() => {
|
||||
const { unit_price } = form.getValues();
|
||||
if (!unit_price || !values?.length) return;
|
||||
|
||||
let hasChanges = false;
|
||||
const calculatedValues = values.map((item: any, index: number) => {
|
||||
const result = { ...item };
|
||||
|
||||
if (changedIndex !== undefined && index !== changedIndex) {
|
||||
return result;
|
||||
}
|
||||
|
||||
const quantity = Number(item.quantity) || 0;
|
||||
const discount = Number(item.discount) || 0;
|
||||
const price = Number(item.price) || 0;
|
||||
|
||||
switch (lastChangedField) {
|
||||
case 'quantity':
|
||||
case 'discount':
|
||||
if (quantity > 0 && discount > 0) {
|
||||
const newPrice = evaluateWithPrecision(
|
||||
`${unit_price} * ${quantity} * ${discount} / 100`,
|
||||
);
|
||||
if (Math.abs(newPrice - price) > 0.01) {
|
||||
result.price = newPrice;
|
||||
hasChanges = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'price':
|
||||
if (quantity > 0 && price > 0) {
|
||||
const newDiscount = evaluateWithPrecision(
|
||||
`${price} / ${quantity} / ${unit_price} * 100`,
|
||||
);
|
||||
if (Math.abs(newDiscount - discount) > 0.01) {
|
||||
result.discount = Math.min(100, Math.max(0, newDiscount));
|
||||
hasChanges = true;
|
||||
}
|
||||
} else if (discount > 0 && price > 0) {
|
||||
const newQuantity = evaluateWithPrecision(
|
||||
`${price} / ${unit_price} / ${discount} * 100`,
|
||||
);
|
||||
if (Math.abs(newQuantity - quantity) > 0.01 && newQuantity > 0) {
|
||||
result.quantity = Math.max(1, Math.round(newQuantity));
|
||||
hasChanges = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
if (quantity > 0 && discount > 0 && price === 0) {
|
||||
result.price = evaluateWithPrecision(
|
||||
`${unit_price} * ${quantity} * ${discount} / 100`,
|
||||
);
|
||||
hasChanges = true;
|
||||
} else if (quantity > 0 && price > 0 && discount === 0) {
|
||||
const newDiscount = evaluateWithPrecision(
|
||||
`${price} / ${quantity} / ${unit_price} * 100`,
|
||||
);
|
||||
result.discount = Math.min(100, Math.max(0, newDiscount));
|
||||
hasChanges = true;
|
||||
} else if (discount > 0 && price > 0 && quantity === 0) {
|
||||
const newQuantity = evaluateWithPrecision(
|
||||
`${price} / ${unit_price} / ${discount} * 100`,
|
||||
);
|
||||
if (newQuantity > 0) {
|
||||
result.quantity = Math.max(1, Math.round(newQuantity));
|
||||
hasChanges = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
if (hasChanges) {
|
||||
form.setValue(fieldName, calculatedValues, { shouldDirty: true });
|
||||
}
|
||||
}, 300);
|
||||
},
|
||||
[form],
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
form?.reset(
|
||||
assign(defaultValues, shake(initialValues, (value) => value === null) as Record<string, any>),
|
||||
);
|
||||
}, [form, initialValues]);
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
if (updateTimeoutRef.current) {
|
||||
clearTimeout(updateTimeoutRef.current);
|
||||
}
|
||||
};
|
||||
}, []);
|
||||
|
||||
async function handleSubmit(data: { [x: string]: any }) {
|
||||
const bool = await onSubmit(data as T);
|
||||
if (bool) setOpen(false);
|
||||
@@ -158,31 +258,6 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
|
||||
const unit_time = form.watch('unit_time');
|
||||
const unit_price = form.watch('unit_price');
|
||||
const discounts = form.watch('discount');
|
||||
|
||||
useEffect(() => {
|
||||
if (!discounts?.length || !unit_price) return;
|
||||
|
||||
const calculatedValues = discounts.map((item: any) => {
|
||||
const result = { ...item };
|
||||
|
||||
if (item.quantity && item.discount) {
|
||||
result.price = evaluateWithPrecision(
|
||||
`${unit_price || 0} * ${item.quantity} * ${item.discount} / 100`,
|
||||
);
|
||||
} else if (item.quantity && item.price && !item.discount) {
|
||||
result.discount = evaluateWithPrecision(
|
||||
`${item.price} / ${item.quantity} / ${unit_price} * 100`,
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
if (JSON.stringify(calculatedValues) !== JSON.stringify(discounts)) {
|
||||
form.setValue('discount', calculatedValues);
|
||||
}
|
||||
}, [unit_price, discounts, form]);
|
||||
|
||||
return (
|
||||
<Sheet open={open} onOpenChange={setOpen}>
|
||||
@@ -581,8 +656,9 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
{
|
||||
name: 'discount',
|
||||
type: 'number',
|
||||
min: 1,
|
||||
min: 0.01,
|
||||
max: 100,
|
||||
step: 0.01,
|
||||
placeholder: t('form.discountPercent'),
|
||||
suffix: '%',
|
||||
},
|
||||
@@ -590,51 +666,53 @@ export default function SubscribeForm<T extends Record<string, any>>({
|
||||
name: 'price',
|
||||
placeholder: t('form.discount_price'),
|
||||
type: 'number',
|
||||
min: 0,
|
||||
step: 0.01,
|
||||
formatInput: (value) => unitConversion('centsToDollars', value),
|
||||
formatOutput: (value) => unitConversion('dollarsToCents', value),
|
||||
},
|
||||
]}
|
||||
value={field.value}
|
||||
onChange={(newValues) => {
|
||||
onChange={(
|
||||
newValues: (API.SubscribeDiscount & { price?: number })[],
|
||||
) => {
|
||||
const oldValues = field.value || [];
|
||||
const { unit_price } = form.getValues();
|
||||
let lastChangedField: string | undefined;
|
||||
let changedIndex: number | undefined;
|
||||
|
||||
const calculatedValues = newValues.map((newItem, index) => {
|
||||
const oldItem = oldValues[index] || {};
|
||||
|
||||
const result = { ...newItem };
|
||||
|
||||
const quantityChanged = newItem.quantity !== oldItem.quantity;
|
||||
const discountChanged = newItem.discount !== oldItem.discount;
|
||||
const priceChanged = newItem.price !== oldItem.price;
|
||||
|
||||
if (
|
||||
(quantityChanged || discountChanged) &&
|
||||
!priceChanged &&
|
||||
newItem.quantity &&
|
||||
newItem.discount
|
||||
for (
|
||||
let i = 0;
|
||||
i < Math.max(newValues.length, oldValues.length);
|
||||
i++
|
||||
) {
|
||||
result.price = evaluateWithPrecision(
|
||||
`${unit_price || 0} * ${newItem.quantity} * ${newItem.discount} / 100`,
|
||||
const newItem = newValues[i] || {};
|
||||
const oldItem = oldValues[i] || {};
|
||||
|
||||
if ((newItem as any).quantity !== (oldItem as any).quantity) {
|
||||
lastChangedField = 'quantity';
|
||||
changedIndex = i;
|
||||
break;
|
||||
}
|
||||
if ((newItem as any).discount !== (oldItem as any).discount) {
|
||||
lastChangedField = 'discount';
|
||||
changedIndex = i;
|
||||
break;
|
||||
}
|
||||
if ((newItem as any).price !== (oldItem as any).price) {
|
||||
lastChangedField = 'price';
|
||||
changedIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
form.setValue(field.name, newValues, { shouldDirty: true });
|
||||
if (newValues?.length > 0) {
|
||||
debouncedCalculateDiscount(
|
||||
newValues,
|
||||
field.name,
|
||||
lastChangedField,
|
||||
changedIndex,
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
priceChanged &&
|
||||
!discountChanged &&
|
||||
newItem.price &&
|
||||
newItem.quantity &&
|
||||
unit_price
|
||||
) {
|
||||
result.discount = evaluateWithPrecision(
|
||||
`${newItem.price} / ${newItem.quantity} / ${unit_price} * 100`,
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
|
||||
form.setValue(field.name, calculatedValues);
|
||||
}}
|
||||
/>
|
||||
</FormControl>
|
||||
|
||||
+11
-10
@@ -9,20 +9,20 @@ import { NextIntlClientProvider } from 'next-intl';
|
||||
import { getLocale, getMessages } from 'next-intl/server';
|
||||
import { PublicEnvScript } from 'next-runtime-env';
|
||||
import { unstable_noStore as noStore } from 'next/cache';
|
||||
import { Geist, Geist_Mono } from 'next/font/google';
|
||||
// import { Geist, Geist_Mono } from 'next/font/google';
|
||||
import { cookies } from 'next/headers';
|
||||
import NextTopLoader from 'nextjs-toploader';
|
||||
import React from 'react';
|
||||
|
||||
const fontSans = Geist({
|
||||
subsets: ['latin'],
|
||||
variable: '--font-sans',
|
||||
});
|
||||
// const fontSans = Geist({
|
||||
// subsets: ['latin'],
|
||||
// variable: '--font-sans',
|
||||
// });
|
||||
|
||||
const fontMono = Geist_Mono({
|
||||
subsets: ['latin'],
|
||||
variable: '--font-mono',
|
||||
});
|
||||
// const fontMono = Geist_Mono({
|
||||
// subsets: ['latin'],
|
||||
// variable: '--font-mono',
|
||||
// });
|
||||
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
noStore();
|
||||
@@ -111,7 +111,8 @@ export default async function RootLayout({
|
||||
</head>
|
||||
<body
|
||||
suppressHydrationWarning
|
||||
className={`${fontSans.variable} ${fontMono.variable} size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
|
||||
// ${fontSans.variable} ${fontMono.variable}
|
||||
className={`size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
|
||||
>
|
||||
<NextIntlClientProvider messages={messages}>
|
||||
<NextTopLoader showSpinner={false} />
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Smazat",
|
||||
"deleteSuccess": "Pravidlo bylo úspěšně smazáno",
|
||||
"deleteWarning": "Opravdu chcete smazat toto pravidlo? Tato akce není vratná.",
|
||||
"description": "Popis pravidla",
|
||||
"downloadTemplate": "Stáhnout šablonu",
|
||||
"edit": "Upravit",
|
||||
"editRule": "Upravit pravidlo",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importovat",
|
||||
"importFailed": "Import se nezdařil",
|
||||
"importSuccess": "Import byl úspěšný",
|
||||
"importYaml": "Importovat YAML",
|
||||
"importYamlDescription": "Importujte pravidla ze souboru YAML, systém automaticky vytvoří skupiny pravidel na základě názvů skupin politiky",
|
||||
"importYamlRules": "Importovat YAML pravidla",
|
||||
"importing": "Importuji...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Nebyly nalezeny žádné platné pravidla",
|
||||
"pleaseUploadFile": "Prosím, nahrajte soubor YAML",
|
||||
"preview": "Náhled",
|
||||
"rules": "Obsah pravidla",
|
||||
"rulesFormat": "Formát pravidla: typ pravidla, obsah shody, [politika], kde politika je volitelná.\nPokud politika není specifikována, bude automaticky použito aktuální jméno skupiny pravidel. Příklady:",
|
||||
"rulesLabel": "Obsah pravidla",
|
||||
"searchRule": "Hledat název pravidla",
|
||||
"selectFile": "Vybrat soubor",
|
||||
"selectTags": "Vybrat značky uzlu",
|
||||
"tags": "Značky uzlu",
|
||||
"tagsLabel": "Značky uzlu",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Löschen",
|
||||
"deleteSuccess": "Regel erfolgreich gelöscht",
|
||||
"deleteWarning": "Sind Sie sicher, dass Sie diese Regel löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"description": "Regelbeschreibung",
|
||||
"downloadTemplate": "Vorlage herunterladen",
|
||||
"edit": "Bearbeiten",
|
||||
"editRule": "Regel bearbeiten",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importieren",
|
||||
"importFailed": "Import fehlgeschlagen",
|
||||
"importSuccess": "Import erfolgreich",
|
||||
"importYaml": "YAML importieren",
|
||||
"importYamlDescription": "Regeln aus einer YAML-Datei importieren, das System erstellt automatisch Regelgruppen basierend auf den Namen der Richtliniengruppen",
|
||||
"importYamlRules": "YAML-Regeln importieren",
|
||||
"importing": "Importiere...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Keine gültigen Regeln gefunden",
|
||||
"pleaseUploadFile": "Bitte laden Sie eine YAML-Datei hoch",
|
||||
"preview": "Vorschau",
|
||||
"rules": "Regelinhalt",
|
||||
"rulesFormat": "Regelformat: Regeltyp, Übereinstimmungsinhalt, [Richtlinie], wobei die Richtlinie optional ist.\nWenn keine Richtlinie angegeben ist, wird automatisch der aktuelle Regelgruppenname verwendet. Beispiele:",
|
||||
"rulesLabel": "Regelinhalt",
|
||||
"searchRule": "Regelname suchen",
|
||||
"selectFile": "Datei auswählen",
|
||||
"selectTags": "Knoten-Tags auswählen",
|
||||
"tags": "Knoten-Tags",
|
||||
"tagsLabel": "Knoten-Tags",
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
"createRule": "Add Rule",
|
||||
"createSuccess": "Rule created successfully",
|
||||
"createdAt": "Created At",
|
||||
"default": "Default",
|
||||
"defaultRule": "Default Rule",
|
||||
"delete": "Delete",
|
||||
"deleteSuccess": "Rule deleted successfully",
|
||||
"deleteWarning": "Are you sure you want to delete this rule? This action cannot be undone.",
|
||||
"description": "Rule Description",
|
||||
"direct": "Direct",
|
||||
"downloadTemplate": "Download Template",
|
||||
"edit": "Edit",
|
||||
"editRule": "Edit Rule",
|
||||
@@ -22,7 +24,6 @@
|
||||
"import": "Import",
|
||||
"importFailed": "Import failed",
|
||||
"importSuccess": "Import successful",
|
||||
"importYaml": "Import YAML",
|
||||
"importYamlDescription": "Import rules from YAML file, the system will automatically create rule groups based on policy group names",
|
||||
"importYamlRules": "Import YAML Rules",
|
||||
"importing": "Importing...",
|
||||
@@ -31,13 +32,14 @@
|
||||
"noValidRules": "No valid rules found",
|
||||
"pleaseUploadFile": "Please upload a YAML file",
|
||||
"preview": "Preview",
|
||||
"rules": "Rule Content",
|
||||
"reject": "Reject",
|
||||
"rulesFormat": "Rule format: rule type,match content,[policy], where policy is optional.\nIf policy is not specified, the current rule group name will be used automatically. Examples:",
|
||||
"rulesLabel": "Rule Content",
|
||||
"searchRule": "Search rule name",
|
||||
"selectFile": "Select File",
|
||||
"selectTags": "Select node tags",
|
||||
"selectType": "Select rule type",
|
||||
"tags": "Node Tags",
|
||||
"tagsLabel": "Node Tags",
|
||||
"type": "Rule Type",
|
||||
"updateSuccess": "Rule updated successfully"
|
||||
}
|
||||
|
||||
@@ -63,16 +63,20 @@
|
||||
"edit": "Edit",
|
||||
"editNode": "Edit Node",
|
||||
"enable": "Enable",
|
||||
"id": "ID",
|
||||
"form": {
|
||||
"allowInsecure": "Allow Insecure",
|
||||
"cancel": "Cancel",
|
||||
"city": "City",
|
||||
"confirm": "Confirm",
|
||||
"congestionController": "Congestion Controller",
|
||||
"country": "Country",
|
||||
"disableSni": "Disable SNI",
|
||||
"edit": "Edit",
|
||||
"editSecurity": "Edit Security Configuration",
|
||||
"enableTLS": "Enable TLS",
|
||||
"encryptionMethod": "Encryption Method",
|
||||
"fingerprint": "Fingerprint",
|
||||
"flow": "Flow Control Algorithm",
|
||||
"groupId": "Node Group",
|
||||
"hopInterval": "Hop Interval",
|
||||
@@ -85,6 +89,7 @@
|
||||
"pleaseSelect": "Please Select",
|
||||
"port": "Server Port",
|
||||
"protocol": "Protocol",
|
||||
"reduceRtt": "Reduce RTT",
|
||||
"relayHost": "Relay Host",
|
||||
"relayMode": "Relay Mode",
|
||||
"relayModeOptions": {
|
||||
@@ -128,6 +133,7 @@
|
||||
"transport": "Transport Protocol Configuration",
|
||||
"transportConfig": "Transport Protocol Configuration",
|
||||
"transportHost": "Transport Server Address",
|
||||
"udpRelayMode": "UDP Relay Mode",
|
||||
"transportPath": "Transport Path",
|
||||
"transportServerName": "Transport Server Name"
|
||||
},
|
||||
@@ -136,6 +142,7 @@
|
||||
"name": "Name",
|
||||
"node": "Node",
|
||||
"nodeGroup": "Node Group",
|
||||
"noData": "--",
|
||||
"normal": "Normal",
|
||||
"onlineCount": "Online users",
|
||||
"onlineUsers": "Online Users",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Eliminar",
|
||||
"deleteSuccess": "Regla eliminada con éxito",
|
||||
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.",
|
||||
"description": "Descripción de la Regla",
|
||||
"downloadTemplate": "Descargar Plantilla",
|
||||
"edit": "Editar",
|
||||
"editRule": "Editar Regla",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importar",
|
||||
"importFailed": "Importación fallida",
|
||||
"importSuccess": "Importación exitosa",
|
||||
"importYaml": "Importar YAML",
|
||||
"importYamlDescription": "Importar reglas desde un archivo YAML, el sistema creará automáticamente grupos de reglas basados en los nombres de los grupos de políticas",
|
||||
"importYamlRules": "Importar Reglas YAML",
|
||||
"importing": "Importando...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "No se encontraron reglas válidas",
|
||||
"pleaseUploadFile": "Por favor, suba un archivo YAML",
|
||||
"preview": "Vista Previa",
|
||||
"rules": "Contenido de la Regla",
|
||||
"rulesFormat": "Formato de regla: tipo de regla, contenido de coincidencia, [política], donde la política es opcional.\nSi no se especifica la política, se utilizará automáticamente el nombre del grupo de reglas actual. Ejemplos:",
|
||||
"rulesLabel": "Contenido de la Regla",
|
||||
"searchRule": "Buscar nombre de regla",
|
||||
"selectFile": "Seleccionar Archivo",
|
||||
"selectTags": "Seleccionar etiquetas de nodo",
|
||||
"tags": "Etiquetas de Nodo",
|
||||
"tagsLabel": "Etiquetas de Nodo",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Eliminar",
|
||||
"deleteSuccess": "Regla eliminada con éxito",
|
||||
"deleteWarning": "¿Está seguro de que desea eliminar esta regla? Esta acción no se puede deshacer.",
|
||||
"description": "Descripción de la Regla",
|
||||
"downloadTemplate": "Descargar Plantilla",
|
||||
"edit": "Editar",
|
||||
"editRule": "Editar Regla",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importar",
|
||||
"importFailed": "Importación fallida",
|
||||
"importSuccess": "Importación exitosa",
|
||||
"importYaml": "Importar YAML",
|
||||
"importYamlDescription": "Importar reglas desde un archivo YAML, el sistema creará automáticamente grupos de reglas basados en los nombres de los grupos de políticas",
|
||||
"importYamlRules": "Importar Reglas YAML",
|
||||
"importing": "Importando...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "No se encontraron reglas válidas",
|
||||
"pleaseUploadFile": "Por favor, suba un archivo YAML",
|
||||
"preview": "Vista Previa",
|
||||
"rules": "Contenido de la Regla",
|
||||
"rulesFormat": "Formato de regla: tipo de regla, contenido de coincidencia, [política], donde la política es opcional.\nSi no se especifica la política, se utilizará automáticamente el nombre del grupo de reglas actual. Ejemplos:",
|
||||
"rulesLabel": "Contenido de la Regla",
|
||||
"searchRule": "Buscar nombre de regla",
|
||||
"selectFile": "Seleccionar Archivo",
|
||||
"selectTags": "Seleccionar etiquetas de nodo",
|
||||
"tags": "Etiquetas de Nodo",
|
||||
"tagsLabel": "Etiquetas de Nodo",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "حذف",
|
||||
"deleteSuccess": "قانون با موفقیت حذف شد",
|
||||
"deleteWarning": "آیا مطمئن هستید که میخواهید این قانون را حذف کنید؟ این عمل قابل بازگشت نیست.",
|
||||
"description": "توضیحات قانون",
|
||||
"downloadTemplate": "دانلود الگو",
|
||||
"edit": "ویرایش",
|
||||
"editRule": "ویرایش قانون",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "وارد کردن",
|
||||
"importFailed": "وارد کردن ناموفق بود",
|
||||
"importSuccess": "وارد کردن با موفقیت انجام شد",
|
||||
"importYaml": "وارد کردن YAML",
|
||||
"importYamlDescription": "وارد کردن قوانین از فایل YAML، سیستم به طور خودکار گروههای قانونی را بر اساس نامهای گروه سیاست ایجاد خواهد کرد",
|
||||
"importYamlRules": "وارد کردن قوانین YAML",
|
||||
"importing": "در حال وارد کردن...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "هیچ قانونی یافت نشد",
|
||||
"pleaseUploadFile": "لطفاً یک فایل YAML بارگذاری کنید",
|
||||
"preview": "پیشنمایش",
|
||||
"rules": "محتوای قانون",
|
||||
"rulesFormat": "فرمت قانون: نوع قانون، محتوای تطابق، [سیاست]، که سیاست اختیاری است.\nاگر سیاست مشخص نشود، نام گروه قانونی فعلی به طور خودکار استفاده خواهد شد. مثالها:",
|
||||
"rulesLabel": "محتوای قانون",
|
||||
"searchRule": "جستجوی نام قانون",
|
||||
"selectFile": "انتخاب فایل",
|
||||
"selectTags": "انتخاب برچسبهای گره",
|
||||
"tags": "برچسبهای گره",
|
||||
"tagsLabel": "برچسبهای گره",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Poista",
|
||||
"deleteSuccess": "Sääntö poistettiin onnistuneesti",
|
||||
"deleteWarning": "Oletko varma, että haluat poistaa tämän säännön? Tätä toimintoa ei voi peruuttaa.",
|
||||
"description": "Säännön kuvaus",
|
||||
"downloadTemplate": "Lataa malli",
|
||||
"edit": "Muokkaa",
|
||||
"editRule": "Muokkaa sääntöä",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Tuoda",
|
||||
"importFailed": "Tuonti epäonnistui",
|
||||
"importSuccess": "Tuonti onnistui",
|
||||
"importYaml": "Tuo YAML",
|
||||
"importYamlDescription": "Tuo sääntöjä YAML-tiedostosta, järjestelmä luo automaattisesti sääntöryhmiä politiikkaryhmän nimien perusteella",
|
||||
"importYamlRules": "Tuo YAML-säännöt",
|
||||
"importing": "Tuodaan...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Ei voimassa olevia sääntöjä löytynyt",
|
||||
"pleaseUploadFile": "Lataa YAML-tiedosto",
|
||||
"preview": "Esikatselu",
|
||||
"rules": "Säännön sisältö",
|
||||
"rulesFormat": "Sääntömuoto: sääntötyyppi, vastaavuus, [politiikka], jossa politiikka on valinnainen.\nJos politiikkaa ei ole määritelty, nykyistä sääntöryhmän nimeä käytetään automaattisesti. Esimerkkejä:",
|
||||
"rulesLabel": "Säännön sisältö",
|
||||
"searchRule": "Etsi säännön nimeä",
|
||||
"selectFile": "Valitse tiedosto",
|
||||
"selectTags": "Valitse solmun tunnisteet",
|
||||
"tags": "Solmun tunnisteet",
|
||||
"tagsLabel": "Solmun tunnisteet",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Supprimer",
|
||||
"deleteSuccess": "Règle supprimée avec succès",
|
||||
"deleteWarning": "Êtes-vous sûr de vouloir supprimer cette règle ? Cette action ne peut pas être annulée.",
|
||||
"description": "Description de la règle",
|
||||
"downloadTemplate": "Télécharger le modèle",
|
||||
"edit": "Modifier",
|
||||
"editRule": "Modifier la règle",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importer",
|
||||
"importFailed": "Échec de l'importation",
|
||||
"importSuccess": "Importation réussie",
|
||||
"importYaml": "Importer YAML",
|
||||
"importYamlDescription": "Importer des règles à partir d'un fichier YAML, le système créera automatiquement des groupes de règles en fonction des noms de groupes de politiques",
|
||||
"importYamlRules": "Importer des règles YAML",
|
||||
"importing": "Importation en cours...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Aucune règle valide trouvée",
|
||||
"pleaseUploadFile": "Veuillez télécharger un fichier YAML",
|
||||
"preview": "Aperçu",
|
||||
"rules": "Contenu de la règle",
|
||||
"rulesFormat": "Format de la règle : type de règle, contenu de correspondance, [politique], où la politique est optionnelle.\nSi la politique n'est pas spécifiée, le nom du groupe de règles actuel sera utilisé automatiquement. Exemples :",
|
||||
"rulesLabel": "Contenu de la règle",
|
||||
"searchRule": "Rechercher le nom de la règle",
|
||||
"selectFile": "Sélectionner un fichier",
|
||||
"selectTags": "Sélectionner des balises de nœud",
|
||||
"tags": "Balises de nœud",
|
||||
"tagsLabel": "Balises de nœud",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "हटाएं",
|
||||
"deleteSuccess": "नियम सफलतापूर्वक हटाया गया",
|
||||
"deleteWarning": "क्या आप वाकई इस नियम को हटाना चाहते हैं? यह क्रिया पूर्ववत नहीं की जा सकती।",
|
||||
"description": "नियम विवरण",
|
||||
"downloadTemplate": "टेम्पलेट डाउनलोड करें",
|
||||
"edit": "संपादित करें",
|
||||
"editRule": "नियम संपादित करें",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "आयात करें",
|
||||
"importFailed": "आयात विफल",
|
||||
"importSuccess": "आयात सफल",
|
||||
"importYaml": "YAML आयात करें",
|
||||
"importYamlDescription": "YAML फ़ाइल से नियम आयात करें, प्रणाली स्वचालित रूप से नीति समूह नामों के आधार पर नियम समूह बनाएगी",
|
||||
"importYamlRules": "YAML नियम आयात करें",
|
||||
"importing": "आयात कर रहा है...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "कोई मान्य नियम नहीं मिला",
|
||||
"pleaseUploadFile": "कृपया एक YAML फ़ाइल अपलोड करें",
|
||||
"preview": "पूर्वावलोकन",
|
||||
"rules": "नियम सामग्री",
|
||||
"rulesFormat": "नियम प्रारूप: नियम प्रकार, मिलान सामग्री, [नीति], जहाँ नीति वैकल्पिक है।\nयदि नीति निर्दिष्ट नहीं की गई है, तो वर्तमान नियम समूह का नाम स्वचालित रूप से उपयोग किया जाएगा। उदाहरण:",
|
||||
"rulesLabel": "नियम सामग्री",
|
||||
"searchRule": "नियम नाम खोजें",
|
||||
"selectFile": "फ़ाइल चुनें",
|
||||
"selectTags": "नोड टैग चुनें",
|
||||
"tags": "नोड टैग",
|
||||
"tagsLabel": "नोड टैग",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Törlés",
|
||||
"deleteSuccess": "A szabály sikeresen törölve",
|
||||
"deleteWarning": "Biztosan törölni szeretné ezt a szabályt? Ez a művelet nem vonható vissza.",
|
||||
"description": "Szabály leírása",
|
||||
"downloadTemplate": "Sablon letöltése",
|
||||
"edit": "Szerkesztés",
|
||||
"editRule": "Szabály szerkesztése",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importálás",
|
||||
"importFailed": "Importálás sikertelen",
|
||||
"importSuccess": "Importálás sikeres",
|
||||
"importYaml": "YAML importálása",
|
||||
"importYamlDescription": "Szabályok importálása YAML fájlból, a rendszer automatikusan létrehozza a szabálycsoportokat a politikai csoportnevek alapján",
|
||||
"importYamlRules": "YAML szabályok importálása",
|
||||
"importing": "Importálás...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Nincsenek érvényes szabályok",
|
||||
"pleaseUploadFile": "Kérjük, töltsön fel egy YAML fájlt",
|
||||
"preview": "Előnézet",
|
||||
"rules": "Szabály tartalom",
|
||||
"rulesFormat": "Szabály formátum: szabály típusa, egyezési tartalom, [politika], ahol a politika opcionális.\nHa a politika nincs megadva, az aktuális szabálycsoport neve automatikusan felhasználásra kerül. Példák:",
|
||||
"rulesLabel": "Szabály tartalom",
|
||||
"searchRule": "Szabály név keresése",
|
||||
"selectFile": "Fájl kiválasztása",
|
||||
"selectTags": "Válassza ki a csomópont címkéket",
|
||||
"tags": "Csomópont címkék",
|
||||
"tagsLabel": "Csomópont címkék",
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
"createRule": "ルールを追加",
|
||||
"createSuccess": "ルールが正常に作成されました",
|
||||
"createdAt": "作成日時",
|
||||
"defaultRule": "デフォルトルール",
|
||||
"delete": "削除",
|
||||
"deleteSuccess": "ルールが正常に削除されました",
|
||||
"deleteWarning": "このルールを削除してもよろしいですか?この操作は元に戻せません。",
|
||||
"description": "ルールの説明",
|
||||
"downloadTemplate": "テンプレートをダウンロード",
|
||||
"edit": "編集",
|
||||
"editRule": "ルールを編集",
|
||||
@@ -22,7 +22,6 @@
|
||||
"import": "インポート",
|
||||
"importFailed": "インポートに失敗しました",
|
||||
"importSuccess": "インポートが成功しました",
|
||||
"importYaml": "YAMLをインポート",
|
||||
"importYamlDescription": "YAMLファイルからルールをインポートします。システムはポリシーグループ名に基づいてルールグループを自動的に作成します。",
|
||||
"importYamlRules": "YAMLルールをインポート",
|
||||
"importing": "インポート中...",
|
||||
@@ -31,13 +30,13 @@
|
||||
"noValidRules": "有効なルールが見つかりません",
|
||||
"pleaseUploadFile": "YAMLファイルをアップロードしてください",
|
||||
"preview": "プレビュー",
|
||||
"rules": "ルールの内容",
|
||||
"rulesFormat": "ルール形式: ルールタイプ, マッチ内容, [ポリシー](ポリシーはオプションです)。\nポリシーが指定されていない場合、現在のルールグループ名が自動的に使用されます。例:",
|
||||
"rulesLabel": "ルールの内容",
|
||||
"searchRule": "ルール名を検索",
|
||||
"selectFile": "ファイルを選択",
|
||||
"selectTags": "ノードタグを選択",
|
||||
"selectType": "ルールタイプを選択",
|
||||
"tags": "ノードタグ",
|
||||
"tagsLabel": "ノードタグ",
|
||||
"type": "ルールタイプ",
|
||||
"updateSuccess": "ルールが正常に更新されました"
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "삭제",
|
||||
"deleteSuccess": "규칙이 성공적으로 삭제되었습니다",
|
||||
"deleteWarning": "이 규칙을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.",
|
||||
"description": "규칙 설명",
|
||||
"downloadTemplate": "템플릿 다운로드",
|
||||
"edit": "편집",
|
||||
"editRule": "규칙 편집",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "가져오기",
|
||||
"importFailed": "가져오기에 실패했습니다",
|
||||
"importSuccess": "가져오기가 성공적으로 완료되었습니다",
|
||||
"importYaml": "YAML 가져오기",
|
||||
"importYamlDescription": "YAML 파일에서 규칙을 가져오며, 시스템이 정책 그룹 이름에 따라 규칙 그룹을 자동으로 생성합니다",
|
||||
"importYamlRules": "YAML 규칙 가져오기",
|
||||
"importing": "가져오는 중...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "유효한 규칙이 없습니다",
|
||||
"pleaseUploadFile": "YAML 파일을 업로드해 주세요",
|
||||
"preview": "미리보기",
|
||||
"rules": "규칙 내용",
|
||||
"rulesFormat": "규칙 형식: 규칙 유형, 일치하는 내용, [정책], 여기서 정책은 선택 사항입니다.\n정책이 지정되지 않으면 현재 규칙 그룹 이름이 자동으로 사용됩니다. 예시:",
|
||||
"rulesLabel": "규칙 내용",
|
||||
"searchRule": "규칙 이름 검색",
|
||||
"selectFile": "파일 선택",
|
||||
"selectTags": "노드 태그 선택",
|
||||
"tags": "노드 태그",
|
||||
"tagsLabel": "노드 태그",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Slett",
|
||||
"deleteSuccess": "Regel slettet med suksess",
|
||||
"deleteWarning": "Er du sikker på at du vil slette denne regelen? Denne handlingen kan ikke angres.",
|
||||
"description": "Regelbeskrivelse",
|
||||
"downloadTemplate": "Last ned mal",
|
||||
"edit": "Rediger",
|
||||
"editRule": "Rediger regel",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importer",
|
||||
"importFailed": "Import mislyktes",
|
||||
"importSuccess": "Import vellykket",
|
||||
"importYaml": "Importer YAML",
|
||||
"importYamlDescription": "Importer regler fra YAML-fil, systemet vil automatisk opprette regelgrupper basert på policygruppens navn",
|
||||
"importYamlRules": "Importer YAML-regler",
|
||||
"importing": "Importer...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Ingen gyldige regler funnet",
|
||||
"pleaseUploadFile": "Vennligst last opp en YAML-fil",
|
||||
"preview": "Forhåndsvisning",
|
||||
"rules": "Regelinnhold",
|
||||
"rulesFormat": "Regelformat: regeltype, matchinnhold, [policy], der policy er valgfritt.\nHvis policy ikke er spesifisert, vil det nåværende regelgruppens navn bli brukt automatisk. Eksempler:",
|
||||
"rulesLabel": "Regelinnhold",
|
||||
"searchRule": "Søk etter regelnavn",
|
||||
"selectFile": "Velg fil",
|
||||
"selectTags": "Velg nodetagger",
|
||||
"tags": "Nodetagger",
|
||||
"tagsLabel": "Nodetagger",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Usuń",
|
||||
"deleteSuccess": "Reguła została pomyślnie usunięta",
|
||||
"deleteWarning": "Czy na pewno chcesz usunąć tę regułę? Ta akcja nie może być cofnięta.",
|
||||
"description": "Opis Reguły",
|
||||
"downloadTemplate": "Pobierz Szablon",
|
||||
"edit": "Edytuj",
|
||||
"editRule": "Edytuj Regułę",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importuj",
|
||||
"importFailed": "Import nie powiódł się",
|
||||
"importSuccess": "Import zakończony sukcesem",
|
||||
"importYaml": "Importuj YAML",
|
||||
"importYamlDescription": "Importuj reguły z pliku YAML, system automatycznie utworzy grupy reguł na podstawie nazw grup polityk",
|
||||
"importYamlRules": "Importuj Reguły YAML",
|
||||
"importing": "Importowanie...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Nie znaleziono prawidłowych reguł",
|
||||
"pleaseUploadFile": "Proszę przesłać plik YAML",
|
||||
"preview": "Podgląd",
|
||||
"rules": "Treść Reguły",
|
||||
"rulesFormat": "Format reguły: typ reguły, treść dopasowania, [polityka], gdzie polityka jest opcjonalna.\nJeśli polityka nie jest określona, aktualna nazwa grupy reguł zostanie użyta automatycznie. Przykłady:",
|
||||
"rulesLabel": "Treść Reguły",
|
||||
"searchRule": "Szukaj nazwy reguły",
|
||||
"selectFile": "Wybierz Plik",
|
||||
"selectTags": "Wybierz tagi węzła",
|
||||
"tags": "Tagi Węzła",
|
||||
"tagsLabel": "Tagi Węzła",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Excluir",
|
||||
"deleteSuccess": "Regra excluída com sucesso",
|
||||
"deleteWarning": "Você tem certeza de que deseja excluir esta regra? Esta ação não pode ser desfeita.",
|
||||
"description": "Descrição da Regra",
|
||||
"downloadTemplate": "Baixar Modelo",
|
||||
"edit": "Editar",
|
||||
"editRule": "Editar Regra",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importar",
|
||||
"importFailed": "Falha na importação",
|
||||
"importSuccess": "Importação bem-sucedida",
|
||||
"importYaml": "Importar YAML",
|
||||
"importYamlDescription": "Importar regras de um arquivo YAML, o sistema criará automaticamente grupos de regras com base nos nomes dos grupos de políticas",
|
||||
"importYamlRules": "Importar Regras YAML",
|
||||
"importing": "Importando...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Nenhuma regra válida encontrada",
|
||||
"pleaseUploadFile": "Por favor, faça upload de um arquivo YAML",
|
||||
"preview": "Pré-visualização",
|
||||
"rules": "Conteúdo da Regra",
|
||||
"rulesFormat": "Formato da regra: tipo de regra, conteúdo de correspondência, [política], onde a política é opcional.\nSe a política não for especificada, o nome do grupo de regras atual será usado automaticamente. Exemplos:",
|
||||
"rulesLabel": "Conteúdo da Regra",
|
||||
"searchRule": "Pesquisar nome da regra",
|
||||
"selectFile": "Selecionar Arquivo",
|
||||
"selectTags": "Selecionar tags de nó",
|
||||
"tags": "Tags de Nó",
|
||||
"tagsLabel": "Tags de Nó",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Șterge",
|
||||
"deleteSuccess": "Regula a fost ștersă cu succes",
|
||||
"deleteWarning": "Ești sigur că vrei să ștergi această regulă? Această acțiune nu poate fi anulată.",
|
||||
"description": "Descrierea Regulii",
|
||||
"downloadTemplate": "Descarcă Șablon",
|
||||
"edit": "Editează",
|
||||
"editRule": "Editează Regulă",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Importă",
|
||||
"importFailed": "Importul a eșuat",
|
||||
"importSuccess": "Importul a fost realizat cu succes",
|
||||
"importYaml": "Importă YAML",
|
||||
"importYamlDescription": "Importă reguli din fișier YAML, sistemul va crea automat grupuri de reguli pe baza numelui grupului de politici",
|
||||
"importYamlRules": "Importă Reguli YAML",
|
||||
"importing": "Se importă...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Nu au fost găsite reguli valide",
|
||||
"pleaseUploadFile": "Te rugăm să încarci un fișier YAML",
|
||||
"preview": "Previzualizare",
|
||||
"rules": "Conținutul Regulii",
|
||||
"rulesFormat": "Formatul regulii: tip regulă, conținut de potrivire, [politică], unde politica este opțională.\nDacă politica nu este specificată, numele grupului de reguli curent va fi folosit automat. Exemple:",
|
||||
"rulesLabel": "Conținutul Regulii",
|
||||
"searchRule": "Caută numele regulii",
|
||||
"selectFile": "Selectează Fișier",
|
||||
"selectTags": "Selectează etichetele nodului",
|
||||
"tags": "Etichete Nod",
|
||||
"tagsLabel": "Etichete Nod",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Удалить",
|
||||
"deleteSuccess": "Правило успешно удалено",
|
||||
"deleteWarning": "Вы уверены, что хотите удалить это правило? Это действие нельзя отменить.",
|
||||
"description": "Описание правила",
|
||||
"downloadTemplate": "Скачать шаблон",
|
||||
"edit": "Редактировать",
|
||||
"editRule": "Редактировать правило",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Импортировать",
|
||||
"importFailed": "Ошибка импорта",
|
||||
"importSuccess": "Импорт успешен",
|
||||
"importYaml": "Импортировать YAML",
|
||||
"importYamlDescription": "Импорт правил из файла YAML, система автоматически создаст группы правил на основе имен групп политик",
|
||||
"importYamlRules": "Импортировать правила YAML",
|
||||
"importing": "Импортирую...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Не найдено действительных правил",
|
||||
"pleaseUploadFile": "Пожалуйста, загрузите файл YAML",
|
||||
"preview": "Предварительный просмотр",
|
||||
"rules": "Содержание правила",
|
||||
"rulesFormat": "Формат правила: тип правила, содержание совпадения, [политика], где политика является необязательной.\nЕсли политика не указана, будет автоматически использовано текущее имя группы правил. Примеры:",
|
||||
"rulesLabel": "Содержание правила",
|
||||
"searchRule": "Поиск имени правила",
|
||||
"selectFile": "Выбрать файл",
|
||||
"selectTags": "Выбрать теги узлов",
|
||||
"tags": "Теги узлов",
|
||||
"tagsLabel": "Теги узлов",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "ลบ",
|
||||
"deleteSuccess": "ลบกฎเรียบร้อยแล้ว",
|
||||
"deleteWarning": "คุณแน่ใจหรือว่าต้องการลบกฎนี้? การกระทำนี้ไม่สามารถย้อนกลับได้.",
|
||||
"description": "คำอธิบายกฎ",
|
||||
"downloadTemplate": "ดาวน์โหลดเทมเพลต",
|
||||
"edit": "แก้ไข",
|
||||
"editRule": "แก้ไขกฎ",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "นำเข้า",
|
||||
"importFailed": "นำเข้าล้มเหลว",
|
||||
"importSuccess": "นำเข้าสำเร็จ",
|
||||
"importYaml": "นำเข้า YAML",
|
||||
"importYamlDescription": "นำเข้ากฎจากไฟล์ YAML, ระบบจะสร้างกลุ่มกฎโดยอัตโนมัติตามชื่อกลุ่มนโยบาย",
|
||||
"importYamlRules": "นำเข้ากฎ YAML",
|
||||
"importing": "กำลังนำเข้า...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "ไม่พบกฎที่ถูกต้อง",
|
||||
"pleaseUploadFile": "กรุณาอัปโหลดไฟล์ YAML",
|
||||
"preview": "ตัวอย่าง",
|
||||
"rules": "เนื้อหากฎ",
|
||||
"rulesFormat": "รูปแบบกฎ: ประเภทกฎ, เนื้อหาที่ตรงกัน, [นโยบาย], โดยที่นโยบายเป็นทางเลือก.\nหากไม่ได้ระบุนโยบาย, ชื่อกลุ่มกฎปัจจุบันจะถูกใช้โดยอัตโนมัติ. ตัวอย่าง:",
|
||||
"rulesLabel": "เนื้อหากฎ",
|
||||
"searchRule": "ค้นหาชื่อกฎ",
|
||||
"selectFile": "เลือกไฟล์",
|
||||
"selectTags": "เลือกแท็กโหนด",
|
||||
"tags": "แท็กโหนด",
|
||||
"tagsLabel": "แท็กโหนด",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Sil",
|
||||
"deleteSuccess": "Kural başarıyla silindi",
|
||||
"deleteWarning": "Bu kuralı silmek istediğinize emin misiniz? Bu işlem geri alınamaz.",
|
||||
"description": "Kural Açıklaması",
|
||||
"downloadTemplate": "Şablonu İndir",
|
||||
"edit": "Düzenle",
|
||||
"editRule": "Kuralı Düzenle",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "İçe Aktar",
|
||||
"importFailed": "İçe aktarma başarısız oldu",
|
||||
"importSuccess": "İçe aktarma başarılı",
|
||||
"importYaml": "YAML İçe Aktar",
|
||||
"importYamlDescription": "YAML dosyasından kuralları içe aktarın, sistem otomatik olarak politika grup adlarına göre kural grupları oluşturacaktır",
|
||||
"importYamlRules": "YAML Kurallarını İçe Aktar",
|
||||
"importing": "İçe aktarılıyor...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Geçerli kural bulunamadı",
|
||||
"pleaseUploadFile": "Lütfen bir YAML dosyası yükleyin",
|
||||
"preview": "Önizleme",
|
||||
"rules": "Kural İçeriği",
|
||||
"rulesFormat": "Kural formatı: kural türü, eşleşme içeriği,[politika], burada politika isteğe bağlıdır.\nEğer politika belirtilmemişse, mevcut kural grup adı otomatik olarak kullanılacaktır. Örnekler:",
|
||||
"rulesLabel": "Kural İçeriği",
|
||||
"searchRule": "Kural adını ara",
|
||||
"selectFile": "Dosya Seç",
|
||||
"selectTags": "Düğüm etiketlerini seç",
|
||||
"tags": "Düğüm Etiketleri",
|
||||
"tagsLabel": "Düğüm Etiketleri",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Видалити",
|
||||
"deleteSuccess": "Правило успішно видалено",
|
||||
"deleteWarning": "Ви впевнені, що хочете видалити це правило? Цю дію не можна скасувати.",
|
||||
"description": "Опис правила",
|
||||
"downloadTemplate": "Завантажити шаблон",
|
||||
"edit": "Редагувати",
|
||||
"editRule": "Редагувати правило",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Імпортувати",
|
||||
"importFailed": "Імпорт не вдався",
|
||||
"importSuccess": "Імпорт успішний",
|
||||
"importYaml": "Імпортувати YAML",
|
||||
"importYamlDescription": "Імпортуйте правила з файлу YAML, система автоматично створить групи правил на основі назв груп політик",
|
||||
"importYamlRules": "Імпортувати правила YAML",
|
||||
"importing": "Імпортується...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Не знайдено дійсних правил",
|
||||
"pleaseUploadFile": "Будь ласка, завантажте файл YAML",
|
||||
"preview": "Попередній перегляд",
|
||||
"rules": "Вміст правила",
|
||||
"rulesFormat": "Формат правила: тип правила, вміст збігу, [політика], де політика є необов'язковою.\nЯкщо політика не вказана, автоматично буде використано назву поточної групи правил. Приклади:",
|
||||
"rulesLabel": "Вміст правила",
|
||||
"searchRule": "Шукати назву правила",
|
||||
"selectFile": "Вибрати файл",
|
||||
"selectTags": "Вибрати теги вузлів",
|
||||
"tags": "Теги вузлів",
|
||||
"tagsLabel": "Теги вузлів",
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
"delete": "Xóa",
|
||||
"deleteSuccess": "Quy tắc đã được xóa thành công",
|
||||
"deleteWarning": "Bạn có chắc chắn muốn xóa quy tắc này không? Hành động này không thể hoàn tác.",
|
||||
"description": "Mô tả Quy tắc",
|
||||
"downloadTemplate": "Tải Mẫu",
|
||||
"edit": "Chỉnh sửa",
|
||||
"editRule": "Chỉnh sửa Quy tắc",
|
||||
@@ -22,7 +21,6 @@
|
||||
"import": "Nhập khẩu",
|
||||
"importFailed": "Nhập khẩu không thành công",
|
||||
"importSuccess": "Nhập khẩu thành công",
|
||||
"importYaml": "Nhập YAML",
|
||||
"importYamlDescription": "Nhập quy tắc từ tệp YAML, hệ thống sẽ tự động tạo nhóm quy tắc dựa trên tên nhóm chính sách",
|
||||
"importYamlRules": "Nhập Quy tắc YAML",
|
||||
"importing": "Đang nhập khẩu...",
|
||||
@@ -31,11 +29,9 @@
|
||||
"noValidRules": "Không tìm thấy quy tắc hợp lệ",
|
||||
"pleaseUploadFile": "Vui lòng tải lên một tệp YAML",
|
||||
"preview": "Xem trước",
|
||||
"rules": "Nội dung Quy tắc",
|
||||
"rulesFormat": "Định dạng quy tắc: loại quy tắc, nội dung khớp, [chính sách], trong đó chính sách là tùy chọn.\nNếu không chỉ định chính sách, tên nhóm quy tắc hiện tại sẽ được sử dụng tự động. Ví dụ:",
|
||||
"rulesLabel": "Nội dung Quy tắc",
|
||||
"searchRule": "Tìm kiếm tên quy tắc",
|
||||
"selectFile": "Chọn Tệp",
|
||||
"selectTags": "Chọn thẻ nút",
|
||||
"tags": "Thẻ Nút",
|
||||
"tagsLabel": "Thẻ Nút",
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
"createRule": "添加规则",
|
||||
"createSuccess": "创建规则成功",
|
||||
"createdAt": "创建时间",
|
||||
"default": "默认",
|
||||
"defaultRule": "默认规则",
|
||||
"delete": "删除",
|
||||
"deleteSuccess": "删除规则成功",
|
||||
"deleteWarning": "确定要删除所选规则吗?此操作不可恢复。",
|
||||
"description": "规则描述",
|
||||
"direct": "直连",
|
||||
"downloadTemplate": "下载模板",
|
||||
"edit": "编辑",
|
||||
"editRule": "编辑规则",
|
||||
@@ -22,7 +24,6 @@
|
||||
"import": "导入",
|
||||
"importFailed": "导入失败",
|
||||
"importSuccess": "导入成功",
|
||||
"importYaml": "导入YAML",
|
||||
"importYamlDescription": "从YAML文件导入规则,系统将自动根据策略组名称分组创建规则",
|
||||
"importYamlRules": "导入YAML规则",
|
||||
"importing": "导入中...",
|
||||
@@ -31,13 +32,14 @@
|
||||
"noValidRules": "没有找到有效的规则",
|
||||
"pleaseUploadFile": "请上传YAML文件",
|
||||
"preview": "预览",
|
||||
"rules": "规则内容",
|
||||
"reject": "拒绝",
|
||||
"rulesFormat": "规则格式说明:规则类型,匹配内容,[策略], 其中策略为可选项。\n不指定策略时,将自动使用当前规则组名称, 示例:",
|
||||
"rulesLabel": "规则内容",
|
||||
"searchRule": "搜索规则名称",
|
||||
"selectFile": "选择文件",
|
||||
"selectTags": "选择节点标签",
|
||||
"selectType": "选择规则类型",
|
||||
"tags": "节点标签",
|
||||
"tagsLabel": "节点标签",
|
||||
"type": "规则类型",
|
||||
"updateSuccess": "更新规则成功"
|
||||
}
|
||||
|
||||
@@ -63,16 +63,20 @@
|
||||
"edit": "编辑",
|
||||
"editNode": "编辑节点",
|
||||
"enable": "启用",
|
||||
"id": "ID",
|
||||
"form": {
|
||||
"allowInsecure": "允许不安全",
|
||||
"cancel": "取消",
|
||||
"city": "城市",
|
||||
"confirm": "确认",
|
||||
"congestionController": "拥塞控制",
|
||||
"country": "国家",
|
||||
"disableSni": "禁用SNI",
|
||||
"edit": "编辑",
|
||||
"editSecurity": "编辑安全性配置",
|
||||
"enableTLS": "启用TLS",
|
||||
"encryptionMethod": "加密方法",
|
||||
"fingerprint": "指纹",
|
||||
"flow": "流控算法",
|
||||
"groupId": "节点组",
|
||||
"hopInterval": "跳跃间隔",
|
||||
@@ -85,6 +89,7 @@
|
||||
"pleaseSelect": "请选择",
|
||||
"port": "服务端口",
|
||||
"protocol": "协议",
|
||||
"reduceRtt": "减少RTT",
|
||||
"relayHost": "中转地址",
|
||||
"relayMode": "中转模式",
|
||||
"relayModeOptions": {
|
||||
@@ -128,6 +133,7 @@
|
||||
"transport": "传输协议",
|
||||
"transportConfig": "传输协议配置",
|
||||
"transportHost": "传输服务地址",
|
||||
"udpRelayMode": "UDP中继模式",
|
||||
"transportPath": "传输路径",
|
||||
"transportServerName": "传输服务名称"
|
||||
},
|
||||
@@ -136,6 +142,7 @@
|
||||
"name": "名称",
|
||||
"node": "节点",
|
||||
"nodeGroup": "节点组",
|
||||
"noData": "--",
|
||||
"normal": "正常",
|
||||
"onlineCount": "在线人数",
|
||||
"onlineUsers": "在线用户",
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
"createRule": "新增規則",
|
||||
"createSuccess": "規則創建成功",
|
||||
"createdAt": "創建於",
|
||||
"defaultRule": "默認規則",
|
||||
"delete": "刪除",
|
||||
"deleteSuccess": "規則刪除成功",
|
||||
"deleteWarning": "您確定要刪除這條規則嗎?此操作無法撤銷。",
|
||||
"description": "規則描述",
|
||||
"downloadTemplate": "下載模板",
|
||||
"edit": "編輯",
|
||||
"editRule": "編輯規則",
|
||||
@@ -22,7 +22,6 @@
|
||||
"import": "導入",
|
||||
"importFailed": "導入失敗",
|
||||
"importSuccess": "導入成功",
|
||||
"importYaml": "導入 YAML",
|
||||
"importYamlDescription": "從 YAML 文件導入規則,系統將根據策略組名稱自動創建規則組",
|
||||
"importYamlRules": "導入 YAML 規則",
|
||||
"importing": "導入中...",
|
||||
@@ -31,13 +30,13 @@
|
||||
"noValidRules": "未找到有效的規則",
|
||||
"pleaseUploadFile": "請上傳 YAML 文件",
|
||||
"preview": "預覽",
|
||||
"rules": "規則內容",
|
||||
"rulesFormat": "規則格式:規則類型,匹配內容,[策略],其中策略是可選的。\n如果未指定策略,將自動使用當前規則組名稱。示例:",
|
||||
"rulesLabel": "規則內容",
|
||||
"searchRule": "搜索規則名稱",
|
||||
"selectFile": "選擇文件",
|
||||
"selectTags": "選擇節點標籤",
|
||||
"selectType": "選擇規則類型",
|
||||
"tags": "節點標籤",
|
||||
"tagsLabel": "節點標籤",
|
||||
"type": "規則類型",
|
||||
"updateSuccess": "規則更新成功"
|
||||
}
|
||||
|
||||
@@ -9968,3 +9968,4 @@ rules:
|
||||
- PROCESS-NAME,Weiyun.exe,🎯 全球直连
|
||||
- PROCESS-NAME,baidunetdisk.exe,🎯 全球直连
|
||||
- GEOIP,CN,🎯 全球直连
|
||||
- MATCH,🚀 节点选择
|
||||
|
||||
+57
-3
@@ -28,6 +28,11 @@ declare namespace API {
|
||||
updated_at: number;
|
||||
};
|
||||
|
||||
type AnyTLS = {
|
||||
port: number;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
type Application = {
|
||||
id: number;
|
||||
icon: string;
|
||||
@@ -75,6 +80,40 @@ declare namespace API {
|
||||
is_default: boolean;
|
||||
};
|
||||
|
||||
type AppUserSubcbribe = {
|
||||
id: number;
|
||||
name: string;
|
||||
upload: number;
|
||||
traffic: number;
|
||||
download: number;
|
||||
device_limit: number;
|
||||
start_time: string;
|
||||
expire_time: string;
|
||||
list: AppUserSubscbribeNode[];
|
||||
};
|
||||
|
||||
type AppUserSubscbribeNode = {
|
||||
id: number;
|
||||
name: string;
|
||||
uuid: string;
|
||||
protocol: string;
|
||||
relay_mode: string;
|
||||
relay_node: string;
|
||||
server_addr: string;
|
||||
speed_limit: number;
|
||||
tags: string[];
|
||||
traffic: number;
|
||||
traffic_ratio: number;
|
||||
upload: number;
|
||||
config: string;
|
||||
country: string;
|
||||
city: string;
|
||||
latitude: string;
|
||||
longitude: string;
|
||||
created_at: number;
|
||||
download: number;
|
||||
};
|
||||
|
||||
type AuthConfig = {
|
||||
mobile: MobileAuthenticateConfig;
|
||||
email: EmailAuthticateConfig;
|
||||
@@ -257,8 +296,10 @@ declare namespace API {
|
||||
type CreateRuleGroupRequest = {
|
||||
name: string;
|
||||
icon: string;
|
||||
type: string;
|
||||
tags: string[];
|
||||
rules: string;
|
||||
default: boolean;
|
||||
enable: boolean;
|
||||
};
|
||||
|
||||
@@ -598,7 +639,7 @@ declare namespace API {
|
||||
type GetNodeListParams = {
|
||||
page: number;
|
||||
size: number;
|
||||
tag?: string;
|
||||
tags?: string;
|
||||
group_id?: number;
|
||||
search?: string;
|
||||
};
|
||||
@@ -610,7 +651,7 @@ declare namespace API {
|
||||
type GetNodeServerListRequest = {
|
||||
page: number;
|
||||
size: number;
|
||||
tag?: string;
|
||||
tags?: string;
|
||||
group_id?: number;
|
||||
search?: string;
|
||||
};
|
||||
@@ -1077,7 +1118,7 @@ declare namespace API {
|
||||
type PurchaseOrderRequest = {
|
||||
subscribe_id: number;
|
||||
quantity: number;
|
||||
payment: number;
|
||||
payment?: number;
|
||||
coupon?: string;
|
||||
};
|
||||
|
||||
@@ -1130,6 +1171,11 @@ declare namespace API {
|
||||
total: number;
|
||||
};
|
||||
|
||||
type QueryUserAffiliateCountResponse = {
|
||||
registers: number;
|
||||
total_commission: number;
|
||||
};
|
||||
|
||||
type QueryUserAffiliateListRequest = {
|
||||
page: number;
|
||||
size: number;
|
||||
@@ -1239,9 +1285,11 @@ declare namespace API {
|
||||
id: number;
|
||||
icon: string;
|
||||
name: string;
|
||||
type: string;
|
||||
tags: string[];
|
||||
rules: string;
|
||||
enable: boolean;
|
||||
default: boolean;
|
||||
created_at: number;
|
||||
updated_at: number;
|
||||
};
|
||||
@@ -1455,6 +1503,10 @@ declare namespace API {
|
||||
|
||||
type Tuic = {
|
||||
port: number;
|
||||
disable_sni: boolean;
|
||||
reduce_rtt: boolean;
|
||||
udp_relay_mode: string;
|
||||
congestion_controller: string;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
@@ -1581,9 +1633,11 @@ declare namespace API {
|
||||
type UpdateRuleGroupRequest = {
|
||||
id: number;
|
||||
icon: string;
|
||||
type: string;
|
||||
name: string;
|
||||
tags: string[];
|
||||
rules: string;
|
||||
default: boolean;
|
||||
enable: boolean;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// @ts-ignore
|
||||
/* eslint-disable */
|
||||
|
||||
import request from '@/utils/request';
|
||||
|
||||
/** Apple Login Callback POST /v1/auth/oauth/callback/apple */
|
||||
|
||||
+51
-1
@@ -28,6 +28,11 @@ declare namespace API {
|
||||
updated_at: number;
|
||||
};
|
||||
|
||||
type AnyTLS = {
|
||||
port: number;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
type AppleLoginCallbackRequest = {
|
||||
code: string;
|
||||
id_token: string;
|
||||
@@ -81,6 +86,40 @@ declare namespace API {
|
||||
is_default: boolean;
|
||||
};
|
||||
|
||||
type AppUserSubcbribe = {
|
||||
id: number;
|
||||
name: string;
|
||||
upload: number;
|
||||
traffic: number;
|
||||
download: number;
|
||||
device_limit: number;
|
||||
start_time: string;
|
||||
expire_time: string;
|
||||
list: AppUserSubscbribeNode[];
|
||||
};
|
||||
|
||||
type AppUserSubscbribeNode = {
|
||||
id: number;
|
||||
name: string;
|
||||
uuid: string;
|
||||
protocol: string;
|
||||
relay_mode: string;
|
||||
relay_node: string;
|
||||
server_addr: string;
|
||||
speed_limit: number;
|
||||
tags: string[];
|
||||
traffic: number;
|
||||
traffic_ratio: number;
|
||||
upload: number;
|
||||
config: string;
|
||||
country: string;
|
||||
city: string;
|
||||
latitude: string;
|
||||
longitude: string;
|
||||
created_at: number;
|
||||
download: number;
|
||||
};
|
||||
|
||||
type AuthConfig = {
|
||||
mobile: MobileAuthenticateConfig;
|
||||
email: EmailAuthticateConfig;
|
||||
@@ -473,7 +512,7 @@ declare namespace API {
|
||||
type PurchaseOrderRequest = {
|
||||
subscribe_id: number;
|
||||
quantity: number;
|
||||
payment: number;
|
||||
payment?: number;
|
||||
coupon?: string;
|
||||
};
|
||||
|
||||
@@ -526,6 +565,11 @@ declare namespace API {
|
||||
total: number;
|
||||
};
|
||||
|
||||
type QueryUserAffiliateCountResponse = {
|
||||
registers: number;
|
||||
total_commission: number;
|
||||
};
|
||||
|
||||
type QueryUserAffiliateListRequest = {
|
||||
page: number;
|
||||
size: number;
|
||||
@@ -652,9 +696,11 @@ declare namespace API {
|
||||
id: number;
|
||||
icon: string;
|
||||
name: string;
|
||||
type: string;
|
||||
tags: string[];
|
||||
rules: string;
|
||||
enable: boolean;
|
||||
default: boolean;
|
||||
created_at: number;
|
||||
updated_at: number;
|
||||
};
|
||||
@@ -830,6 +876,10 @@ declare namespace API {
|
||||
|
||||
type Tuic = {
|
||||
port: number;
|
||||
disable_sni: boolean;
|
||||
reduce_rtt: boolean;
|
||||
udp_relay_mode: string;
|
||||
congestion_controller: string;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
|
||||
+11
-10
@@ -8,21 +8,21 @@ import { NextIntlClientProvider } from 'next-intl';
|
||||
import { getLocale, getMessages } from 'next-intl/server';
|
||||
import { PublicEnvScript } from 'next-runtime-env';
|
||||
import { unstable_noStore as noStore } from 'next/cache';
|
||||
import { Geist, Geist_Mono } from 'next/font/google';
|
||||
// import { Geist, Geist_Mono } from 'next/font/google';
|
||||
import { cookies } from 'next/headers';
|
||||
import { Metadata, Viewport } from 'next/types';
|
||||
import NextTopLoader from 'nextjs-toploader';
|
||||
import React from 'react';
|
||||
|
||||
const fontSans = Geist({
|
||||
subsets: ['latin'],
|
||||
variable: '--font-sans',
|
||||
});
|
||||
// const fontSans = Geist({
|
||||
// subsets: ['latin'],
|
||||
// variable: '--font-sans',
|
||||
// });
|
||||
|
||||
const fontMono = Geist_Mono({
|
||||
subsets: ['latin'],
|
||||
variable: '--font-mono',
|
||||
});
|
||||
// const fontMono = Geist_Mono({
|
||||
// subsets: ['latin'],
|
||||
// variable: '--font-mono',
|
||||
// });
|
||||
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
noStore();
|
||||
@@ -106,7 +106,8 @@ export default async function RootLayout({
|
||||
</head>
|
||||
<body
|
||||
suppressHydrationWarning
|
||||
className={`${fontSans.variable} ${fontMono.variable} size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
|
||||
// ${fontSans.variable} ${fontMono.variable}
|
||||
className={`size-full min-h-[calc(100dvh-env(safe-area-inset-top))] font-sans antialiased`}
|
||||
>
|
||||
<NextIntlClientProvider messages={messages}>
|
||||
<NextTopLoader showSpinner={false} />
|
||||
|
||||
@@ -10,7 +10,7 @@ export const NEXT_PUBLIC_DEFAULT_LANGUAGE =
|
||||
export const NEXT_PUBLIC_SITE_URL = env('NEXT_PUBLIC_SITE_URL') ?? process.env.NEXT_PUBLIC_SITE_URL;
|
||||
export const NEXT_PUBLIC_API_URL = env('NEXT_PUBLIC_API_URL') ?? process.env.NEXT_PUBLIC_API_URL;
|
||||
export const NEXT_PUBLIC_CDN_URL =
|
||||
env('NEXT_PUBLIC_CDN_URL') || process.env.NEXT_PUBLIC_CDN_URL || 'https://fastly.jsdelivr.net';
|
||||
env('NEXT_PUBLIC_CDN_URL') || process.env.NEXT_PUBLIC_CDN_URL || 'https://cdn.jsdelivr.net';
|
||||
|
||||
export const NEXT_PUBLIC_DEFAULT_USER_EMAIL =
|
||||
env('NEXT_PUBLIC_DEFAULT_USER_EMAIL') ?? process.env.NEXT_PUBLIC_DEFAULT_USER_EMAIL;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// @ts-ignore
|
||||
/* eslint-disable */
|
||||
|
||||
import request from '@/utils/request';
|
||||
|
||||
/** Apple Login Callback POST /v1/auth/oauth/callback/apple */
|
||||
|
||||
+51
-1
@@ -28,6 +28,11 @@ declare namespace API {
|
||||
updated_at: number;
|
||||
};
|
||||
|
||||
type AnyTLS = {
|
||||
port: number;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
type AppleLoginCallbackRequest = {
|
||||
code: string;
|
||||
id_token: string;
|
||||
@@ -81,6 +86,40 @@ declare namespace API {
|
||||
is_default: boolean;
|
||||
};
|
||||
|
||||
type AppUserSubcbribe = {
|
||||
id: number;
|
||||
name: string;
|
||||
upload: number;
|
||||
traffic: number;
|
||||
download: number;
|
||||
device_limit: number;
|
||||
start_time: string;
|
||||
expire_time: string;
|
||||
list: AppUserSubscbribeNode[];
|
||||
};
|
||||
|
||||
type AppUserSubscbribeNode = {
|
||||
id: number;
|
||||
name: string;
|
||||
uuid: string;
|
||||
protocol: string;
|
||||
relay_mode: string;
|
||||
relay_node: string;
|
||||
server_addr: string;
|
||||
speed_limit: number;
|
||||
tags: string[];
|
||||
traffic: number;
|
||||
traffic_ratio: number;
|
||||
upload: number;
|
||||
config: string;
|
||||
country: string;
|
||||
city: string;
|
||||
latitude: string;
|
||||
longitude: string;
|
||||
created_at: number;
|
||||
download: number;
|
||||
};
|
||||
|
||||
type AuthConfig = {
|
||||
mobile: MobileAuthenticateConfig;
|
||||
email: EmailAuthticateConfig;
|
||||
@@ -473,7 +512,7 @@ declare namespace API {
|
||||
type PurchaseOrderRequest = {
|
||||
subscribe_id: number;
|
||||
quantity: number;
|
||||
payment: number;
|
||||
payment?: number;
|
||||
coupon?: string;
|
||||
};
|
||||
|
||||
@@ -526,6 +565,11 @@ declare namespace API {
|
||||
total: number;
|
||||
};
|
||||
|
||||
type QueryUserAffiliateCountResponse = {
|
||||
registers: number;
|
||||
total_commission: number;
|
||||
};
|
||||
|
||||
type QueryUserAffiliateListRequest = {
|
||||
page: number;
|
||||
size: number;
|
||||
@@ -652,9 +696,11 @@ declare namespace API {
|
||||
id: number;
|
||||
icon: string;
|
||||
name: string;
|
||||
type: string;
|
||||
tags: string[];
|
||||
rules: string;
|
||||
enable: boolean;
|
||||
default: boolean;
|
||||
created_at: number;
|
||||
updated_at: number;
|
||||
};
|
||||
@@ -830,6 +876,10 @@ declare namespace API {
|
||||
|
||||
type Tuic = {
|
||||
port: number;
|
||||
disable_sni: boolean;
|
||||
reduce_rtt: boolean;
|
||||
udp_relay_mode: string;
|
||||
congestion_controller: string;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
|
||||
Vendored
+48
-2
@@ -28,6 +28,11 @@ declare namespace API {
|
||||
updated_at: number;
|
||||
};
|
||||
|
||||
type AnyTLS = {
|
||||
port: number;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
type Application = {
|
||||
id: number;
|
||||
icon: string;
|
||||
@@ -75,6 +80,40 @@ declare namespace API {
|
||||
is_default: boolean;
|
||||
};
|
||||
|
||||
type AppUserSubcbribe = {
|
||||
id: number;
|
||||
name: string;
|
||||
upload: number;
|
||||
traffic: number;
|
||||
download: number;
|
||||
device_limit: number;
|
||||
start_time: string;
|
||||
expire_time: string;
|
||||
list: AppUserSubscbribeNode[];
|
||||
};
|
||||
|
||||
type AppUserSubscbribeNode = {
|
||||
id: number;
|
||||
name: string;
|
||||
uuid: string;
|
||||
protocol: string;
|
||||
relay_mode: string;
|
||||
relay_node: string;
|
||||
server_addr: string;
|
||||
speed_limit: number;
|
||||
tags: string[];
|
||||
traffic: number;
|
||||
traffic_ratio: number;
|
||||
upload: number;
|
||||
config: string;
|
||||
country: string;
|
||||
city: string;
|
||||
latitude: string;
|
||||
longitude: string;
|
||||
created_at: number;
|
||||
download: number;
|
||||
};
|
||||
|
||||
type AuthConfig = {
|
||||
mobile: MobileAuthenticateConfig;
|
||||
email: EmailAuthticateConfig;
|
||||
@@ -448,6 +487,7 @@ declare namespace API {
|
||||
subscribe_id: number;
|
||||
quantity: number;
|
||||
coupon?: string;
|
||||
invite_code?: string;
|
||||
turnstile_token?: string;
|
||||
};
|
||||
|
||||
@@ -466,7 +506,7 @@ declare namespace API {
|
||||
};
|
||||
|
||||
type PrePurchaseOrderRequest = {
|
||||
payment: number;
|
||||
payment?: number;
|
||||
subscribe_id: number;
|
||||
quantity: number;
|
||||
coupon?: string;
|
||||
@@ -511,7 +551,7 @@ declare namespace API {
|
||||
type PurchaseOrderRequest = {
|
||||
subscribe_id: number;
|
||||
quantity: number;
|
||||
payment: number;
|
||||
payment?: number;
|
||||
coupon?: string;
|
||||
};
|
||||
|
||||
@@ -754,9 +794,11 @@ declare namespace API {
|
||||
id: number;
|
||||
icon: string;
|
||||
name: string;
|
||||
type: string;
|
||||
tags: string[];
|
||||
rules: string;
|
||||
enable: boolean;
|
||||
default: boolean;
|
||||
created_at: number;
|
||||
updated_at: number;
|
||||
};
|
||||
@@ -899,6 +941,10 @@ declare namespace API {
|
||||
|
||||
type Tuic = {
|
||||
port: number;
|
||||
disable_sni: boolean;
|
||||
reduce_rtt: boolean;
|
||||
udp_relay_mode: string;
|
||||
congestion_controller: string;
|
||||
security_config: SecurityConfig;
|
||||
};
|
||||
|
||||
|
||||
+15
-14
@@ -3,22 +3,23 @@ import matter from 'gray-matter';
|
||||
|
||||
const BASE_URL = `${NEXT_PUBLIC_CDN_URL}/gh/perfect-panel/ppanel-tutorial`;
|
||||
|
||||
async function getVersion() {
|
||||
// API rate limit: 60 requests per hour
|
||||
const response = await fetch(
|
||||
'https://data.jsdelivr.com/v1/stats/packages/gh/perfect-panel/ppanel-tutorial/versions',
|
||||
);
|
||||
const json = await response.json();
|
||||
return json[0].version;
|
||||
}
|
||||
// async function getVersion() {
|
||||
// // API rate limit: 60 requests per hour
|
||||
// const response = await fetch(
|
||||
// 'https://data.jsdelivr.com/v1/stats/packages/gh/perfect-panel/ppanel-tutorial/versions',
|
||||
// );
|
||||
// const json = await response.json();
|
||||
// return json[0].version;
|
||||
// }
|
||||
|
||||
async function getVersionPath() {
|
||||
return getVersion()
|
||||
.then((version) => `${BASE_URL}@${version}`)
|
||||
.catch((error) => {
|
||||
console.warn('Error fetching the version:', error);
|
||||
return BASE_URL;
|
||||
});
|
||||
// return getVersion()
|
||||
// .then((version) => `${BASE_URL}@${version}`)
|
||||
// .catch((error) => {
|
||||
// console.warn('Error fetching the version:', error);
|
||||
// return `${BASE_URL}@latest`;
|
||||
// });
|
||||
return `${BASE_URL}@latest`;
|
||||
}
|
||||
|
||||
export async function getTutorial(path: string): Promise<{
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ppanel-web",
|
||||
"version": "1.0.2",
|
||||
"version": "1.1.1",
|
||||
"private": true,
|
||||
"homepage": "https://github.com/perfect-panel/ppanel-web",
|
||||
"bugs": {
|
||||
|
||||
Reference in New Issue
Block a user