Add Path Mapping UI with Simple Mapping and Regex Rules modes
- Updated frontend/types.ts with new types: ReplacementRule, PathMappingRules, PathMappingMode, PathMappingConfig - Replaced StrategySelector.tsx with new UI featuring: - Simple Mapping tab for local/cloud path pairs - Regex Rules tab with 4 rule groups (localPre, localPost, remotePre, remotePost) - MappingGroupEditor sub-component for editing rule lists - Updated App.tsx to use PathMappingConfig state instead of RegexReplacement[] - Updated api.ts to handle new PathMappingConfig structure - Updated backend config.py with path_mapping field support - Added /api/settings/path-mapping endpoint in main.py Co-authored-by: Koha9 <36852125+Koha9@users.noreply.github.com>
This commit is contained in:
+48
-1
@@ -3,6 +3,16 @@ import os
|
||||
from app.utils.logger import logger
|
||||
|
||||
DEFAULT_SYNC_MODE = "merge_local_primary"
|
||||
DEFAULT_PATH_MAPPING = {
|
||||
"mode": "SIMPLE",
|
||||
"simple": [],
|
||||
"regex": {
|
||||
"local_pre": [],
|
||||
"local_post": [],
|
||||
"remote_pre": [],
|
||||
"remote_post": []
|
||||
}
|
||||
}
|
||||
|
||||
CONFIG_PATH = os.path.abspath(
|
||||
os.path.join(os.path.dirname(__file__), "..", "config.json")
|
||||
@@ -21,7 +31,8 @@ class ServerConfig:
|
||||
self.library_name = ""
|
||||
self.sync_mode = DEFAULT_SYNC_MODE
|
||||
self.local_path = "playlist"
|
||||
self.path_rules: list[dict[str, str]] = []
|
||||
self.path_rules: list[dict[str, str]] = [] # Legacy field for backward compatibility
|
||||
self.path_mapping: dict = DEFAULT_PATH_MAPPING.copy()
|
||||
self.schedule_mode = "DISABLED"
|
||||
self.schedule_cron = ""
|
||||
self.schedule_daily_time = "02:00"
|
||||
@@ -55,6 +66,23 @@ class ServerConfig:
|
||||
self.sync_mode = config.get("sync_mode", DEFAULT_SYNC_MODE)
|
||||
self.local_path = config.get("local_path", "playlist")
|
||||
self.path_rules = config.get("path_rules", []) or []
|
||||
|
||||
# Load path_mapping with default fallback
|
||||
path_mapping_config = config.get("path_mapping")
|
||||
if path_mapping_config:
|
||||
self.path_mapping = {
|
||||
"mode": path_mapping_config.get("mode", "SIMPLE"),
|
||||
"simple": path_mapping_config.get("simple", []),
|
||||
"regex": {
|
||||
"local_pre": path_mapping_config.get("regex", {}).get("local_pre", []),
|
||||
"local_post": path_mapping_config.get("regex", {}).get("local_post", []),
|
||||
"remote_pre": path_mapping_config.get("regex", {}).get("remote_pre", []),
|
||||
"remote_post": path_mapping_config.get("regex", {}).get("remote_post", [])
|
||||
}
|
||||
}
|
||||
else:
|
||||
self.path_mapping = DEFAULT_PATH_MAPPING.copy()
|
||||
|
||||
self.schedule_mode = config.get("schedule_mode", "DISABLED")
|
||||
self.schedule_cron = config.get("schedule_cron", "")
|
||||
self.schedule_daily_time = config.get("schedule_daily_time", "02:00")
|
||||
@@ -75,6 +103,7 @@ class ServerConfig:
|
||||
"sync_mode": self.sync_mode,
|
||||
"local_path": self.local_path,
|
||||
"path_rules": self.path_rules,
|
||||
"path_mapping": self.path_mapping,
|
||||
"schedule_mode": self.schedule_mode,
|
||||
"schedule_cron": self.schedule_cron,
|
||||
"schedule_daily_time": self.schedule_daily_time,
|
||||
@@ -120,6 +149,21 @@ class ServerConfig:
|
||||
def set_path_rules(self, path_rules: list[dict[str, str]]) -> None:
|
||||
self.path_rules = path_rules or []
|
||||
|
||||
def set_path_mapping(self, path_mapping: dict) -> None:
|
||||
if path_mapping:
|
||||
self.path_mapping = {
|
||||
"mode": path_mapping.get("mode", "SIMPLE"),
|
||||
"simple": path_mapping.get("simple", []),
|
||||
"regex": {
|
||||
"local_pre": path_mapping.get("regex", {}).get("local_pre", []),
|
||||
"local_post": path_mapping.get("regex", {}).get("local_post", []),
|
||||
"remote_pre": path_mapping.get("regex", {}).get("remote_pre", []),
|
||||
"remote_post": path_mapping.get("regex", {}).get("remote_post", [])
|
||||
}
|
||||
}
|
||||
else:
|
||||
self.path_mapping = DEFAULT_PATH_MAPPING.copy()
|
||||
|
||||
def set_schedule(
|
||||
self,
|
||||
mode: str,
|
||||
@@ -149,6 +193,7 @@ class ServerConfig:
|
||||
sync_mode: str | None = None,
|
||||
local_path: str | None = None,
|
||||
path_rules: list[dict[str, str]] | None = None,
|
||||
path_mapping: dict | None = None,
|
||||
) -> None:
|
||||
if theme is not None:
|
||||
self.set_theme(theme)
|
||||
@@ -170,6 +215,8 @@ class ServerConfig:
|
||||
self.set_local_path(local_path)
|
||||
if path_rules is not None:
|
||||
self.set_path_rules(path_rules)
|
||||
if path_mapping is not None:
|
||||
self.set_path_mapping(path_mapping)
|
||||
self.save()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user