mirror of
https://github.com/wekan/wekan.git
synced 2026-11-05 21:44:59 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37c5436087 | ||
|
|
6592102e8f | ||
|
|
06a5a8f70d | ||
|
|
ef54ebada6 | ||
|
|
d4f13de1d9 | ||
|
|
4fcedde529 | ||
|
|
a4518bbefc | ||
|
|
95f771aa26 | ||
|
|
da98942cce | ||
|
|
f3efaf59e1 | ||
|
|
d64032f2a3 | ||
|
|
abad8cc4d5 | ||
|
|
0d9536e2f9 | ||
|
|
67b078b805 | ||
|
|
6f02eeae53 | ||
|
|
5bc03b23ea | ||
|
|
3d4acd8c8f | ||
|
|
448bec8181 | ||
|
|
0a34ee1b64 | ||
|
|
34e8e4d4c3 | ||
|
|
32627c03f4 | ||
|
|
63c314ca18 | ||
|
|
e8453783da | ||
|
|
96522ec3a3 | ||
|
|
17dedab391 | ||
|
|
283d2ee09c | ||
|
|
289ff0127e | ||
|
|
931d7217b1 | ||
|
|
3149a3927e | ||
|
|
c57bced7b1 | ||
|
|
8d794a59dc | ||
|
|
7bb1e24bda | ||
|
|
e0013b9b63 | ||
|
|
7d81aab900 | ||
|
|
cc99da5357 | ||
|
|
9bd21e1d1b | ||
|
|
2148aeea42 | ||
|
|
6a7a5505f9 | ||
|
|
5a6faafa30 | ||
|
|
e2f3dad779 | ||
|
|
ae2aa1f5cd | ||
|
|
0e3a17d922 | ||
|
|
033919a270 | ||
|
|
f5d40a0a12 | ||
|
|
0fd781e80a | ||
|
|
a8f6170fdf | ||
|
|
bd8c565415 | ||
|
|
ffb02fe0ec | ||
|
|
114520302c | ||
|
|
317138ab72 | ||
|
|
a990109f43 | ||
|
|
da68b01502 | ||
|
|
e90bc744d9 | ||
|
|
2b5c56484a | ||
|
|
ea30612013 | ||
|
|
4445612bb8 | ||
|
|
da56393078 | ||
|
|
a86ff1e8d0 | ||
|
|
7fce5650b8 | ||
|
|
b949357e66 | ||
|
|
8e71b68dbf | ||
|
|
b77eed221f | ||
|
|
1fa91474d0 | ||
|
|
fc32a89292 | ||
|
|
ea24010298 | ||
|
|
ae1f80a52c | ||
|
|
2f95431c9b | ||
|
|
d59683eff1 | ||
|
|
de77776cd0 | ||
|
|
74ccfea570 | ||
|
|
1f5a549589 | ||
|
|
3ccdc2e307 | ||
|
|
688b725807 | ||
|
|
ae01ea576c |
No files matched your search
@@ -19,6 +19,92 @@ Fixing other platforms In Progress.
|
||||
|
||||
[Upgrade WeKan](https://wekan.fi/upgrade/)
|
||||
|
||||
# v8.02 2025-10-14 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Run database migrations when opening board. Not when upgrading WeKan](https://github.com/wekan/wekan/commit/2b5c56484a4dd559f062ef892fd5248a903b2a10).
|
||||
Thanks to xet7.
|
||||
- [Added Cron Manager to Admin Panel for long running jobs, like running migrations when opening board, copying or moving boards swimlanes lists cards etc](https://github.com/wekan/wekan/commit/da68b01502afc9d5d9ea1267bee9fc98bb08b611).
|
||||
Thanks to xet7.
|
||||
- [If there is no cron jobs running, run migrations for boards that have not been opened yet](https://github.com/wekan/wekan/commit/317138ab7209a41715336ea8251df45f11a6d173).
|
||||
Thanks to xet7.
|
||||
- [Accessibility improvements](https://github.com/wekan/wekan/commit/67b078b8056ec9851caaf6ef855719de1e6d966d).
|
||||
Thanks to xet7.
|
||||
- [Change list width by dragging between lists](https://github.com/wekan/wekan/commit/abad8cc4d5dded0f5e1a80892a3b29aa71404a5c).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/5bc03b23ea34816d8e1135cbe9ed5f18a2573854).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixes to make board showing correctly](https://github.com/wekan/wekan/commit/bd8c565415998c9aaded821988d591105258b378).
|
||||
Thanks to xet7.
|
||||
- [Fix opening sidebar](https://github.com/wekan/wekan/commit/0fd781e80aaf841c26ce59caffc579b9c391330f).
|
||||
Thanks to xet7.
|
||||
- [Fix Admin Panel menus "Attachment Settings" and "Cron Settings" and make them translateable](https://github.com/wekan/wekan/commit/033919a2702fa6959b8f8c87f076d3f255ace6ba).
|
||||
Thanks to xet7.
|
||||
- Change Admin Panel "Attachment Settings" and "Cron Settings" options to be tabs, not submenu.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/ae2aa1f5cd2511e80e12a91426eb91bb968dff98),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/5a6faafa30fefcd5dd0af7cc52b847a54d538065),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/2148aeea42f69fa367bf8c451d7f1c3a63b52880).
|
||||
Thanks to xet7.
|
||||
- [Fixed Error in migrate-lists-to-per-swimlane migration](https://github.com/wekan/wekan/commit/cc99da5357fb1fc00e3b5aece20c57917f88301b).
|
||||
Thanks to xet7.
|
||||
- Fix Admin Panel Settings menu to show Attachments and Cron options correctly.
|
||||
[Part 1](https://github.com/wekan/wekan/e0013b9b631eb16861b1cfdb25386bf8e9099b4e),
|
||||
[Part 2](https://github.com/wekan/wekan/7bb1e24bda2ed9db0bad0fafcf256680c2c05e8a).
|
||||
- [Fixed migrations](https://github.com/wekan/wekan/commit/63c314ca185aeda650c01b4a67fcde1067320d22).
|
||||
Thanks to xet7.
|
||||
- [Removed not needed console log message](https://github.com/wekan/wekan/commit/0a34ee1b6437dcfd65e31d9bbc9f3ccfa5718ba9).
|
||||
Thanks to xet7.
|
||||
- [Updated mobile Bookmarks/Starred boards. Part 1. In Progress](https://github.com/wekan/wekan/commit/da98942cce37363d6062695d3c4cf7e2df796cac).
|
||||
Thanks to xet7.
|
||||
- [Fix drag drop reorder swimlanes](https://github.com/wekan/wekan/commit/a4518bbefc99be74f7ccfdbb9fdf902007ca90f3).
|
||||
Thanks to xet7.
|
||||
- [Try to fix swimlane hamburger menu popup positioning. In progress](https://github.com/wekan/wekan/commit/d4f13de1d978b271d05e1d67d40e3c1c14761578).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v8.01 2025-10-11 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Made possible to start WeKan immediately without running any database migrations](https://github.com/wekan/wekan/commit/3ccdc2e3070978a79bc68941375122504318677d).
|
||||
Thanks to xet7.
|
||||
- [Add support for MongoDB 3-8 client, detecting which one is in use](https://github.com/wekan/wekan/commit/74ccfea5703b08b2166593d1bb8e1d981970cec0).
|
||||
Thanks to xet7.
|
||||
- [Add support for Snap MongoDB Server 3-8 support. Part 1](https://github.com/wekan/wekan/commit/b949357e665d97604cbecb04a9211319ac4e13c2).
|
||||
Thanks to xet7.
|
||||
- [Added attachments API and admin panel attachment management for file storage backends settings. Fixed drag drop upload attachments from file manager to minicard or opened card](https://github.com/wekan/wekan/commit/ae1f80a52cde09689dddb1209708630b4949b7ee).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fixed attachments migrations at Admin Panel to not use too much CPU while migrating attachments](https://github.com/wekan/wekan/commit/d59683eff1267ff87a6aef9ae36c7aebbe10eaa1).
|
||||
Thanks to xet7.
|
||||
- [Fixed per-card and per-board settings of showing checkist at minicard](https://github.com/wekan/wekan/commit/fc32a89292e4d314bd3868739f6e01bc2bc17018).
|
||||
Thanks to xet7.
|
||||
- [Fix count of Orgs Teams People at Admin Panel](https://github.com/wekan/wekan/commit/b77eed221f9e5fc657234a6de3e11c27f4de3d38).
|
||||
Thanks to xet7.
|
||||
- [Fixed attachments and minicard related bugs that prevented WeKan starting](https://github.com/wekan/wekan/commit/a86ff1e8d03d330a7ea0702cf3677859ed552509).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v8.00 2025-10-11 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Snap: Migrate MongoDB from 3 to 7 only when "snap set wekan migrate-mongodb='true'". Not automatically](https://github.com/wekan/wekan/commit/ae01ea576c3073acbc181a5b19008ddaea4700e1).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v7.99 2025-10-11 WeKan ® release
|
||||
|
||||
This release fixed the following bugs:
|
||||
|
||||
+3
-3
@@ -249,9 +249,9 @@ cd /home/wekan/app
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
#rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy
|
||||
#mv /home/wekan/app_build/bundle /build
|
||||
wget "https://github.com/wekan/wekan/releases/download/v7.99/wekan-7.99-amd64.zip"
|
||||
unzip wekan-7.99-amd64.zip
|
||||
rm wekan-7.99-amd64.zip
|
||||
wget "https://github.com/wekan/wekan/releases/download/v8.02/wekan-8.02-amd64.zip"
|
||||
unzip wekan-8.02-amd64.zip
|
||||
rm wekan-8.02-amd64.zip
|
||||
mv /home/wekan/app/bundle /build
|
||||
|
||||
# Put back the original tar
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v7.99.0"
|
||||
appVersion: "v8.02.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -39,6 +39,12 @@ If *nix: chmod +x api.py => ./api.py users
|
||||
python3 api.py addcustomfieldtoboard AUTHORID BOARDID NAME TYPE SETTINGS SHOWONCARD AUTOMATICALLYONCARD SHOWLABELONMINICARD SHOWSUMATTOPOFLIST # Add Custom Field to Board
|
||||
python3 api.py editcustomfield BOARDID LISTID CARDID CUSTOMFIELDID NEWCUSTOMFIELDVALUE # Edit Custom Field
|
||||
python3 api.py listattachments BOARDID # List attachments
|
||||
python3 api.py uploadattachment BOARDID SWIMLANEID LISTID CARDID FILEPATH [STORAGE_BACKEND] # Upload attachment to card
|
||||
python3 api.py downloadattachment ATTACHMENTID OUTPUTPATH # Download attachment to local file
|
||||
python3 api.py attachmentinfo ATTACHMENTID # Get attachment information
|
||||
python3 api.py listcardattachments BOARDID SWIMLANEID LISTID CARDID # List attachments for specific card
|
||||
python3 api.py copymoveattachment ATTACHMENTID TARGETBOARDID TARGETSWIMLANEID TARGETLISTID TARGETCARDID [copy|move] # Copy or move attachment
|
||||
python3 api.py deleteattachment ATTACHMENTID # Delete attachment
|
||||
python3 api.py cardsbyswimlane SWIMLANEID LISTID # Retrieve cards list on a swimlane
|
||||
python3 api.py getcard BOARDID LISTID CARDID # Get card info
|
||||
python3 api.py addlabel BOARDID LISTID CARDID LABELID # Add label to a card
|
||||
@@ -750,3 +756,273 @@ if arguments == 1:
|
||||
data2 = body.text.replace('}',"}\n")
|
||||
print(data2)
|
||||
# ------- LIST OF PUBLIC BOARDS END -----------
|
||||
|
||||
# ------- NEW ATTACHMENT API ENDPOINTS START -----------
|
||||
|
||||
if sys.argv[1] == 'uploadattachment':
|
||||
# ------- UPLOAD ATTACHMENT START -----------
|
||||
if arguments < 5:
|
||||
print("Usage: python3 api.py uploadattachment BOARDID SWIMLANEID LISTID CARDID FILEPATH [STORAGE_BACKEND]")
|
||||
print("Storage backends: fs, gridfs, s3")
|
||||
exit(1)
|
||||
|
||||
boardid = sys.argv[2]
|
||||
swimlaneid = sys.argv[3]
|
||||
listid = sys.argv[4]
|
||||
cardid = sys.argv[5]
|
||||
filepath = sys.argv[6]
|
||||
storage_backend = sys.argv[7] if arguments > 6 else None
|
||||
|
||||
# Read file and convert to base64
|
||||
try:
|
||||
with open(filepath, 'rb') as f:
|
||||
file_data = f.read()
|
||||
import base64
|
||||
base64_data = base64.b64encode(file_data).decode('utf-8')
|
||||
except FileNotFoundError:
|
||||
print(f"Error: File '{filepath}' not found")
|
||||
exit(1)
|
||||
except Exception as e:
|
||||
print(f"Error reading file: {e}")
|
||||
exit(1)
|
||||
|
||||
# Get file info
|
||||
import os
|
||||
filename = os.path.basename(filepath)
|
||||
import mimetypes
|
||||
file_type = mimetypes.guess_type(filepath)[0] or 'application/octet-stream'
|
||||
|
||||
# Prepare request data
|
||||
upload_data = {
|
||||
'boardId': boardid,
|
||||
'swimlaneId': swimlaneid,
|
||||
'listId': listid,
|
||||
'cardId': cardid,
|
||||
'fileData': base64_data,
|
||||
'fileName': filename,
|
||||
'fileType': file_type
|
||||
}
|
||||
|
||||
if storage_backend:
|
||||
upload_data['storageBackend'] = storage_backend
|
||||
|
||||
# Make API call
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey), 'Content-Type': 'application/json'}
|
||||
upload_url = wekanurl + 'api/attachment/upload'
|
||||
|
||||
try:
|
||||
response = requests.post(upload_url, headers=headers, json=upload_data)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
print(f"Upload successful!")
|
||||
print(f"Attachment ID: {result.get('attachmentId')}")
|
||||
print(f"File: {result.get('fileName')}")
|
||||
print(f"Size: {result.get('fileSize')} bytes")
|
||||
print(f"Storage: {result.get('storageBackend')}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Upload failed: {e}")
|
||||
if hasattr(e, 'response') and e.response is not None:
|
||||
print(f"Response: {e.response.text}")
|
||||
# ------- UPLOAD ATTACHMENT END -----------
|
||||
|
||||
if sys.argv[1] == 'downloadattachment':
|
||||
# ------- DOWNLOAD ATTACHMENT START -----------
|
||||
if arguments < 3:
|
||||
print("Usage: python3 api.py downloadattachment ATTACHMENTID OUTPUTPATH")
|
||||
exit(1)
|
||||
|
||||
attachmentid = sys.argv[2]
|
||||
outputpath = sys.argv[3]
|
||||
|
||||
# Make API call
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
download_url = wekanurl + f'api/attachment/download/{attachmentid}'
|
||||
|
||||
try:
|
||||
response = requests.get(download_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
|
||||
if result.get('success'):
|
||||
# Decode base64 data and save to file
|
||||
import base64
|
||||
file_data = base64.b64decode(result.get('base64Data'))
|
||||
|
||||
with open(outputpath, 'wb') as f:
|
||||
f.write(file_data)
|
||||
|
||||
print(f"Download successful!")
|
||||
print(f"File saved to: {outputpath}")
|
||||
print(f"Original filename: {result.get('fileName')}")
|
||||
print(f"Size: {result.get('fileSize')} bytes")
|
||||
print(f"Storage: {result.get('storageBackend')}")
|
||||
else:
|
||||
print(f"Download failed: {result.get('message', 'Unknown error')}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Download failed: {e}")
|
||||
if hasattr(e, 'response') and e.response is not None:
|
||||
print(f"Response: {e.response.text}")
|
||||
# ------- DOWNLOAD ATTACHMENT END -----------
|
||||
|
||||
if sys.argv[1] == 'attachmentinfo':
|
||||
# ------- ATTACHMENT INFO START -----------
|
||||
if arguments < 2:
|
||||
print("Usage: python3 api.py attachmentinfo ATTACHMENTID")
|
||||
exit(1)
|
||||
|
||||
attachmentid = sys.argv[2]
|
||||
|
||||
# Make API call
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
info_url = wekanurl + f'api/attachment/info/{attachmentid}'
|
||||
|
||||
try:
|
||||
response = requests.get(info_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
|
||||
if result.get('success'):
|
||||
print("=== ATTACHMENT INFO ===")
|
||||
print(f"Attachment ID: {result.get('attachmentId')}")
|
||||
print(f"File Name: {result.get('fileName')}")
|
||||
print(f"File Size: {result.get('fileSize')} bytes")
|
||||
print(f"File Type: {result.get('fileType')}")
|
||||
print(f"Storage Backend: {result.get('storageBackend')}")
|
||||
print(f"Board ID: {result.get('boardId')}")
|
||||
print(f"Swimlane ID: {result.get('swimlaneId')}")
|
||||
print(f"List ID: {result.get('listId')}")
|
||||
print(f"Card ID: {result.get('cardId')}")
|
||||
print(f"Created At: {result.get('createdAt')}")
|
||||
print(f"Is Image: {result.get('isImage')}")
|
||||
print(f"Versions: {len(result.get('versions', []))}")
|
||||
else:
|
||||
print(f"Failed to get attachment info: {result.get('message', 'Unknown error')}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Request failed: {e}")
|
||||
if hasattr(e, 'response') and e.response is not None:
|
||||
print(f"Response: {e.response.text}")
|
||||
# ------- ATTACHMENT INFO END -----------
|
||||
|
||||
if sys.argv[1] == 'listcardattachments':
|
||||
# ------- LIST CARD ATTACHMENTS START -----------
|
||||
if arguments < 5:
|
||||
print("Usage: python3 api.py listcardattachments BOARDID SWIMLANEID LISTID CARDID")
|
||||
exit(1)
|
||||
|
||||
boardid = sys.argv[2]
|
||||
swimlaneid = sys.argv[3]
|
||||
listid = sys.argv[4]
|
||||
cardid = sys.argv[5]
|
||||
|
||||
# Make API call
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
list_url = wekanurl + f'api/attachment/list/{boardid}/{swimlaneid}/{listid}/{cardid}'
|
||||
|
||||
try:
|
||||
response = requests.get(list_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
|
||||
if result.get('success'):
|
||||
attachments = result.get('attachments', [])
|
||||
print(f"=== CARD ATTACHMENTS ({len(attachments)}) ===")
|
||||
for attachment in attachments:
|
||||
print(f"ID: {attachment.get('attachmentId')}")
|
||||
print(f"Name: {attachment.get('fileName')}")
|
||||
print(f"Size: {attachment.get('fileSize')} bytes")
|
||||
print(f"Type: {attachment.get('fileType')}")
|
||||
print(f"Storage: {attachment.get('storageBackend')}")
|
||||
print(f"Created: {attachment.get('createdAt')}")
|
||||
print("---")
|
||||
else:
|
||||
print(f"Failed to list attachments: {result.get('message', 'Unknown error')}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Request failed: {e}")
|
||||
if hasattr(e, 'response') and e.response is not None:
|
||||
print(f"Response: {e.response.text}")
|
||||
# ------- LIST CARD ATTACHMENTS END -----------
|
||||
|
||||
if sys.argv[1] == 'copymoveattachment':
|
||||
# ------- COPY/MOVE ATTACHMENT START -----------
|
||||
if arguments < 6:
|
||||
print("Usage: python3 api.py copymoveattachment ATTACHMENTID TARGETBOARDID TARGETSWIMLANEID TARGETLISTID TARGETCARDID [copy|move]")
|
||||
exit(1)
|
||||
|
||||
attachmentid = sys.argv[2]
|
||||
targetboardid = sys.argv[3]
|
||||
targetswimlaneid = sys.argv[4]
|
||||
targetlistid = sys.argv[5]
|
||||
targetcardid = sys.argv[6]
|
||||
operation = sys.argv[7] if arguments > 6 else 'copy'
|
||||
|
||||
if operation not in ['copy', 'move']:
|
||||
print("Operation must be 'copy' or 'move'")
|
||||
exit(1)
|
||||
|
||||
# Prepare request data
|
||||
request_data = {
|
||||
'attachmentId': attachmentid,
|
||||
'targetBoardId': targetboardid,
|
||||
'targetSwimlaneId': targetswimlaneid,
|
||||
'targetListId': targetlistid,
|
||||
'targetCardId': targetcardid
|
||||
}
|
||||
|
||||
# Make API call
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey), 'Content-Type': 'application/json'}
|
||||
api_url = wekanurl + f'api/attachment/{operation}'
|
||||
|
||||
try:
|
||||
response = requests.post(api_url, headers=headers, json=request_data)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
|
||||
if result.get('success'):
|
||||
print(f"{operation.capitalize()} successful!")
|
||||
if operation == 'copy':
|
||||
print(f"Source Attachment ID: {result.get('sourceAttachmentId')}")
|
||||
print(f"New Attachment ID: {result.get('newAttachmentId')}")
|
||||
else:
|
||||
print(f"Attachment ID: {result.get('attachmentId')}")
|
||||
print(f"Source Board: {result.get('sourceBoardId')}")
|
||||
print(f"Target Board: {result.get('targetBoardId')}")
|
||||
print(f"File: {result.get('fileName')}")
|
||||
print(f"Size: {result.get('fileSize')} bytes")
|
||||
else:
|
||||
print(f"{operation.capitalize()} failed: {result.get('message', 'Unknown error')}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"{operation.capitalize()} failed: {e}")
|
||||
if hasattr(e, 'response') and e.response is not None:
|
||||
print(f"Response: {e.response.text}")
|
||||
# ------- COPY/MOVE ATTACHMENT END -----------
|
||||
|
||||
if sys.argv[1] == 'deleteattachment':
|
||||
# ------- DELETE ATTACHMENT START -----------
|
||||
if arguments < 2:
|
||||
print("Usage: python3 api.py deleteattachment ATTACHMENTID")
|
||||
exit(1)
|
||||
|
||||
attachmentid = sys.argv[2]
|
||||
|
||||
# Make API call
|
||||
headers = {'Accept': 'application/json', 'Authorization': 'Bearer {}'.format(apikey)}
|
||||
delete_url = wekanurl + f'api/attachment/delete/{attachmentid}'
|
||||
|
||||
try:
|
||||
response = requests.delete(delete_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
result = response.json()
|
||||
|
||||
if result.get('success'):
|
||||
print("Delete successful!")
|
||||
print(f"Attachment ID: {result.get('attachmentId')}")
|
||||
print(f"File: {result.get('fileName')}")
|
||||
else:
|
||||
print(f"Delete failed: {result.get('message', 'Unknown error')}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Delete failed: {e}")
|
||||
if hasattr(e, 'response') and e.response is not None:
|
||||
print(f"Response: {e.response.text}")
|
||||
# ------- DELETE ATTACHMENT END -----------
|
||||
|
||||
# ------- NEW ATTACHMENT API ENDPOINTS END -----------
|
||||
@@ -4,3 +4,14 @@ if ('serviceWorker' in navigator) {
|
||||
navigator.serviceWorker.register('/pwa-service-worker.js');
|
||||
});
|
||||
}
|
||||
|
||||
// Import board converter for on-demand conversion
|
||||
import '/client/lib/boardConverter';
|
||||
import '/client/components/boardConversionProgress';
|
||||
|
||||
// Import migration manager and progress UI
|
||||
import '/client/lib/migrationManager';
|
||||
import '/client/components/migrationProgress';
|
||||
|
||||
// Import cron settings
|
||||
import '/client/components/settings/cronSettings';
|
||||
@@ -0,0 +1,184 @@
|
||||
/* Board Conversion Progress Styles */
|
||||
.board-conversion-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.7);
|
||||
z-index: 9999;
|
||||
display: none;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.board-conversion-overlay.active {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.board-conversion-modal {
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||
max-width: 500px;
|
||||
width: 90%;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
animation: slideIn 0.3s ease-out;
|
||||
}
|
||||
|
||||
@keyframes slideIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-20px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.board-conversion-header {
|
||||
padding: 20px 24px 16px;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.board-conversion-header h3 {
|
||||
margin: 0 0 8px 0;
|
||||
color: #333;
|
||||
font-size: 20px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.board-conversion-header h3 i {
|
||||
margin-right: 8px;
|
||||
color: #2196F3;
|
||||
}
|
||||
|
||||
.board-conversion-header p {
|
||||
margin: 0;
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.board-conversion-content {
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
.conversion-progress {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
background-color: #e0e0e0;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #2196F3, #21CBF3);
|
||||
border-radius: 4px;
|
||||
transition: width 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.progress-fill::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
rgba(255, 255, 255, 0.3),
|
||||
transparent
|
||||
);
|
||||
animation: shimmer 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
|
||||
.progress-text {
|
||||
text-align: center;
|
||||
font-weight: 600;
|
||||
color: #2196F3;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.conversion-status {
|
||||
text-align: center;
|
||||
margin-bottom: 16px;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.conversion-status i {
|
||||
margin-right: 8px;
|
||||
color: #2196F3;
|
||||
}
|
||||
|
||||
.conversion-time {
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
background-color: #f5f5f5;
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.conversion-time i {
|
||||
margin-right: 6px;
|
||||
color: #FF9800;
|
||||
}
|
||||
|
||||
.board-conversion-footer {
|
||||
padding: 16px 24px 20px;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
|
||||
.conversion-info {
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-size: 13px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.conversion-info i {
|
||||
margin-right: 6px;
|
||||
color: #2196F3;
|
||||
}
|
||||
|
||||
/* Responsive design */
|
||||
@media (max-width: 600px) {
|
||||
.board-conversion-modal {
|
||||
width: 95%;
|
||||
margin: 20px;
|
||||
}
|
||||
|
||||
.board-conversion-header,
|
||||
.board-conversion-content,
|
||||
.board-conversion-footer {
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
.board-conversion-header h3 {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
template(name="boardConversionProgress")
|
||||
.board-conversion-overlay(class="{{#if isConverting}}active{{/if}}")
|
||||
.board-conversion-modal
|
||||
.board-conversion-header
|
||||
h3
|
||||
i.fa.fa-cogs
|
||||
| {{_ 'converting-board'}}
|
||||
p {{_ 'converting-board-description'}}
|
||||
|
||||
.board-conversion-content
|
||||
.conversion-progress
|
||||
.progress-bar
|
||||
.progress-fill(style="width: {{conversionProgress}}%")
|
||||
.progress-text {{conversionProgress}}%
|
||||
|
||||
.conversion-status
|
||||
i.fa.fa-spinner.fa-spin
|
||||
| {{conversionStatus}}
|
||||
|
||||
.conversion-time(style="{{#unless conversionEstimatedTime}}display: none;{{/unless}}")
|
||||
i.fa.fa-clock-o
|
||||
| {{_ 'estimated-time-remaining'}}: {{conversionEstimatedTime}}
|
||||
|
||||
.board-conversion-footer
|
||||
.conversion-info
|
||||
i.fa.fa-info-circle
|
||||
| {{_ 'conversion-info-text'}}
|
||||
@@ -0,0 +1,37 @@
|
||||
import { Template } from 'meteor/templating';
|
||||
import { ReactiveVar } from 'meteor/reactive-var';
|
||||
import {
|
||||
boardConverter,
|
||||
isConverting,
|
||||
conversionProgress,
|
||||
conversionStatus,
|
||||
conversionEstimatedTime
|
||||
} from '/client/lib/boardConverter';
|
||||
|
||||
Template.boardConversionProgress.helpers({
|
||||
isConverting() {
|
||||
return isConverting.get();
|
||||
},
|
||||
|
||||
conversionProgress() {
|
||||
return conversionProgress.get();
|
||||
},
|
||||
|
||||
conversionStatus() {
|
||||
return conversionStatus.get();
|
||||
},
|
||||
|
||||
conversionEstimatedTime() {
|
||||
return conversionEstimatedTime.get();
|
||||
}
|
||||
});
|
||||
|
||||
Template.boardConversionProgress.onCreated(function() {
|
||||
// Subscribe to conversion state changes
|
||||
this.autorun(() => {
|
||||
isConverting.get();
|
||||
conversionProgress.get();
|
||||
conversionStatus.get();
|
||||
conversionEstimatedTime.get();
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,10 @@
|
||||
template(name="board")
|
||||
if isBoardReady.get
|
||||
|
||||
if isMigrating.get
|
||||
+migrationProgress
|
||||
else if isConverting.get
|
||||
+boardConversionProgress
|
||||
else if isBoardReady.get
|
||||
if currentBoard
|
||||
if onlyShowCurrentCard
|
||||
+cardDetails(currentCard)
|
||||
@@ -16,6 +21,10 @@ template(name="boardBody")
|
||||
if notDisplayThisBoard
|
||||
| {{_ 'tableVisibilityMode-allowPrivateOnly'}}
|
||||
else
|
||||
// Debug information (remove in production)
|
||||
if debugBoardState
|
||||
.debug-info(style="position: fixed; top: 0; left: 0; background: rgba(0,0,0,0.8); color: white; padding: 10px; z-index: 9999; font-size: 12px;")
|
||||
| Board: {{currentBoard.title}} | View: {{boardView}} | HasSwimlanes: {{hasSwimlanes}} | Swimlanes: {{currentBoard.swimlanes.length}}
|
||||
.board-wrapper(class=currentBoard.colorClass class="{{#if isMiniScreen}}mobile-view{{/if}}")
|
||||
.board-canvas.js-swimlanes(
|
||||
class="{{#if hasSwimlanes}}dragscroll{{/if}}"
|
||||
@@ -34,15 +43,19 @@ template(name="boardBody")
|
||||
each currentBoard.swimlanes
|
||||
+swimlane(this)
|
||||
else
|
||||
a.js-empty-board-add-swimlane(title="{{_ 'add-swimlane'}}")
|
||||
h1.big-message.quiet
|
||||
| {{_ 'add-swimlane'}} +
|
||||
// Fallback: If no swimlanes exist, show lists instead of empty message
|
||||
+listsGroup(currentBoard)
|
||||
else if isViewLists
|
||||
+listsGroup(currentBoard)
|
||||
else if isViewCalendar
|
||||
+calendarView
|
||||
else
|
||||
+listsGroup(currentBoard)
|
||||
// Default view - show swimlanes if they exist, otherwise show lists
|
||||
if hasSwimlanes
|
||||
each currentBoard.swimlanes
|
||||
+swimlane(this)
|
||||
else
|
||||
+listsGroup(currentBoard)
|
||||
+sidebar
|
||||
|
||||
template(name="calendarView")
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { ReactiveCache } from '/imports/reactiveCache';
|
||||
import { TAPi18n } from '/imports/i18n';
|
||||
import dragscroll from '@wekanteam/dragscroll';
|
||||
import { boardConverter } from '/client/lib/boardConverter';
|
||||
import { migrationManager } from '/client/lib/migrationManager';
|
||||
import { attachmentMigrationManager } from '/client/lib/attachmentMigrationManager';
|
||||
import Swimlanes from '/models/swimlanes';
|
||||
import Lists from '/models/lists';
|
||||
|
||||
const subManager = new SubsManager();
|
||||
const { calculateIndex } = Utils;
|
||||
@@ -9,6 +14,9 @@ const swimlaneWhileSortingHeight = 150;
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.isBoardReady = new ReactiveVar(false);
|
||||
this.isConverting = new ReactiveVar(false);
|
||||
this.isMigrating = new ReactiveVar(false);
|
||||
this._swimlaneCreated = new Set(); // Track boards where we've created swimlanes
|
||||
|
||||
// The pattern we use to manually handle data loading is described here:
|
||||
// https://kadira.io/academy/meteor-routing-guide/content/subscriptions-and-data-management/using-subs-manager
|
||||
@@ -17,22 +25,175 @@ BlazeComponent.extendComponent({
|
||||
this.autorun(() => {
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
if (!currentBoardId) return;
|
||||
|
||||
const handle = subManager.subscribe('board', currentBoardId, false);
|
||||
|
||||
Tracker.nonreactive(() => {
|
||||
Tracker.autorun(() => {
|
||||
this.isBoardReady.set(handle.ready());
|
||||
if (handle.ready()) {
|
||||
// Ensure default swimlane exists (only once per board)
|
||||
this.ensureDefaultSwimlane(currentBoardId);
|
||||
// Check if board needs conversion
|
||||
this.checkAndConvertBoard(currentBoardId);
|
||||
} else {
|
||||
this.isBoardReady.set(false);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
ensureDefaultSwimlane(boardId) {
|
||||
// Only create swimlane once per board
|
||||
if (this._swimlaneCreated.has(boardId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const board = ReactiveCache.getBoard(boardId);
|
||||
if (!board) return;
|
||||
|
||||
const swimlanes = board.swimlanes();
|
||||
|
||||
if (swimlanes.length === 0) {
|
||||
const swimlaneId = Swimlanes.insert({
|
||||
title: 'Default',
|
||||
boardId: boardId,
|
||||
});
|
||||
this._swimlaneCreated.add(boardId);
|
||||
} else {
|
||||
this._swimlaneCreated.add(boardId);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error creating default swimlane:', error);
|
||||
}
|
||||
},
|
||||
|
||||
async checkAndConvertBoard(boardId) {
|
||||
try {
|
||||
const board = ReactiveCache.getBoard(boardId);
|
||||
if (!board) {
|
||||
this.isBoardReady.set(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if board needs migration based on migration version
|
||||
const needsMigration = !board.migrationVersion || board.migrationVersion < 1;
|
||||
|
||||
if (needsMigration) {
|
||||
// Start background migration for old boards
|
||||
this.isMigrating.set(true);
|
||||
await this.startBackgroundMigration(boardId);
|
||||
this.isMigrating.set(false);
|
||||
}
|
||||
|
||||
// Check if board needs conversion (for old structure)
|
||||
if (boardConverter.isBoardConverted(boardId)) {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Board ${boardId} has already been converted, skipping conversion`);
|
||||
}
|
||||
this.isBoardReady.set(true);
|
||||
} else {
|
||||
const needsConversion = boardConverter.needsConversion(boardId);
|
||||
|
||||
if (needsConversion) {
|
||||
this.isConverting.set(true);
|
||||
const success = await boardConverter.convertBoard(boardId);
|
||||
this.isConverting.set(false);
|
||||
|
||||
if (success) {
|
||||
this.isBoardReady.set(true);
|
||||
} else {
|
||||
console.error('Board conversion failed, setting ready to true anyway');
|
||||
this.isBoardReady.set(true); // Still show board even if conversion failed
|
||||
}
|
||||
} else {
|
||||
this.isBoardReady.set(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Start attachment migration in background if needed
|
||||
this.startAttachmentMigrationIfNeeded(boardId);
|
||||
} catch (error) {
|
||||
console.error('Error during board conversion check:', error);
|
||||
this.isConverting.set(false);
|
||||
this.isMigrating.set(false);
|
||||
this.isBoardReady.set(true); // Show board even if conversion check failed
|
||||
}
|
||||
},
|
||||
|
||||
async startBackgroundMigration(boardId) {
|
||||
try {
|
||||
// Start background migration using the cron system
|
||||
Meteor.call('boardMigration.startBoardMigration', boardId, (error, result) => {
|
||||
if (error) {
|
||||
console.error('Failed to start background migration:', error);
|
||||
} else {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log('Background migration started for board:', boardId);
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error starting background migration:', error);
|
||||
}
|
||||
},
|
||||
|
||||
async startAttachmentMigrationIfNeeded(boardId) {
|
||||
try {
|
||||
// Check if board has already been migrated
|
||||
if (attachmentMigrationManager.isBoardMigrated(boardId)) {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Board ${boardId} has already been migrated, skipping`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if there are unconverted attachments
|
||||
const unconvertedAttachments = attachmentMigrationManager.getUnconvertedAttachments(boardId);
|
||||
|
||||
if (unconvertedAttachments.length > 0) {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Starting attachment migration for ${unconvertedAttachments.length} attachments in board ${boardId}`);
|
||||
}
|
||||
await attachmentMigrationManager.startAttachmentMigration(boardId);
|
||||
} else {
|
||||
// No attachments to migrate, mark board as migrated
|
||||
// This will be handled by the migration manager itself
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Board ${boardId} has no attachments to migrate`);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error starting attachment migration:', error);
|
||||
}
|
||||
},
|
||||
|
||||
onlyShowCurrentCard() {
|
||||
return Utils.isMiniScreen() && Utils.getCurrentCardId(true);
|
||||
const isMiniScreen = Utils.isMiniScreen();
|
||||
const currentCardId = Utils.getCurrentCardId(true);
|
||||
return isMiniScreen && currentCardId;
|
||||
},
|
||||
|
||||
goHome() {
|
||||
FlowRouter.go('home');
|
||||
},
|
||||
|
||||
isConverting() {
|
||||
return this.isConverting.get();
|
||||
},
|
||||
|
||||
isMigrating() {
|
||||
return this.isMigrating.get();
|
||||
},
|
||||
|
||||
isBoardReady() {
|
||||
return this.isBoardReady.get();
|
||||
},
|
||||
|
||||
currentBoard() {
|
||||
return Utils.getCurrentBoard();
|
||||
},
|
||||
}).register('board');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
@@ -46,33 +207,37 @@ BlazeComponent.extendComponent({
|
||||
|
||||
// fix swimlanes sort field if there are null values
|
||||
const currentBoardData = Utils.getCurrentBoard();
|
||||
const nullSortSwimlanes = currentBoardData.nullSortSwimlanes();
|
||||
if (nullSortSwimlanes.length > 0) {
|
||||
const swimlanes = currentBoardData.swimlanes();
|
||||
let count = 0;
|
||||
swimlanes.forEach(s => {
|
||||
Swimlanes.update(s._id, {
|
||||
$set: {
|
||||
sort: count,
|
||||
},
|
||||
if (currentBoardData && Swimlanes) {
|
||||
const nullSortSwimlanes = currentBoardData.nullSortSwimlanes();
|
||||
if (nullSortSwimlanes.length > 0) {
|
||||
const swimlanes = currentBoardData.swimlanes();
|
||||
let count = 0;
|
||||
swimlanes.forEach(s => {
|
||||
Swimlanes.update(s._id, {
|
||||
$set: {
|
||||
sort: count,
|
||||
},
|
||||
});
|
||||
count += 1;
|
||||
});
|
||||
count += 1;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// fix lists sort field if there are null values
|
||||
const nullSortLists = currentBoardData.nullSortLists();
|
||||
if (nullSortLists.length > 0) {
|
||||
const lists = currentBoardData.lists();
|
||||
let count = 0;
|
||||
lists.forEach(l => {
|
||||
Lists.update(l._id, {
|
||||
$set: {
|
||||
sort: count,
|
||||
},
|
||||
if (currentBoardData && Lists) {
|
||||
const nullSortLists = currentBoardData.nullSortLists();
|
||||
if (nullSortLists.length > 0) {
|
||||
const lists = currentBoardData.lists();
|
||||
let count = 0;
|
||||
lists.forEach(l => {
|
||||
Lists.update(l._id, {
|
||||
$set: {
|
||||
sort: count,
|
||||
},
|
||||
});
|
||||
count += 1;
|
||||
});
|
||||
count += 1;
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
onRendered() {
|
||||
@@ -98,11 +263,16 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
}
|
||||
|
||||
// Observe for new popups/menus and set focus
|
||||
// Observe for new popups/menus and set focus (but exclude swimlane content)
|
||||
const popupObserver = new MutationObserver(function(mutations) {
|
||||
mutations.forEach(function(mutation) {
|
||||
mutation.addedNodes.forEach(function(node) {
|
||||
if (node.nodeType === 1 && (node.classList.contains('popup') || node.classList.contains('modal') || node.classList.contains('menu'))) {
|
||||
if (node.nodeType === 1 &&
|
||||
(node.classList.contains('popup') || node.classList.contains('modal') || node.classList.contains('menu')) &&
|
||||
!node.closest('.js-swimlanes') &&
|
||||
!node.closest('.swimlane') &&
|
||||
!node.closest('.list') &&
|
||||
!node.closest('.minicard')) {
|
||||
setTimeout(function() { focusFirstInteractive(node); }, 10);
|
||||
}
|
||||
});
|
||||
@@ -412,51 +582,122 @@ BlazeComponent.extendComponent({
|
||||
notDisplayThisBoard() {
|
||||
let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly');
|
||||
let currentBoard = Utils.getCurrentBoard();
|
||||
if (allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue && currentBoard.permission == 'public') {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue && currentBoard && currentBoard.permission == 'public';
|
||||
},
|
||||
|
||||
isViewSwimlanes() {
|
||||
const currentUser = ReactiveCache.getCurrentUser();
|
||||
let boardView;
|
||||
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView === 'board-view-swimlanes';
|
||||
boardView = (currentUser.profile || {}).boardView;
|
||||
} else {
|
||||
return (
|
||||
window.localStorage.getItem('boardView') === 'board-view-swimlanes'
|
||||
);
|
||||
boardView = window.localStorage.getItem('boardView');
|
||||
}
|
||||
},
|
||||
|
||||
hasSwimlanes() {
|
||||
return Utils.getCurrentBoard().swimlanes().length > 0;
|
||||
|
||||
// If no board view is set, default to swimlanes
|
||||
if (!boardView) {
|
||||
boardView = 'board-view-swimlanes';
|
||||
}
|
||||
|
||||
return boardView === 'board-view-swimlanes';
|
||||
},
|
||||
|
||||
isViewLists() {
|
||||
const currentUser = ReactiveCache.getCurrentUser();
|
||||
let boardView;
|
||||
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView === 'board-view-lists';
|
||||
boardView = (currentUser.profile || {}).boardView;
|
||||
} else {
|
||||
return window.localStorage.getItem('boardView') === 'board-view-lists';
|
||||
boardView = window.localStorage.getItem('boardView');
|
||||
}
|
||||
|
||||
return boardView === 'board-view-lists';
|
||||
},
|
||||
|
||||
isViewCalendar() {
|
||||
const currentUser = ReactiveCache.getCurrentUser();
|
||||
let boardView;
|
||||
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView === 'board-view-cal';
|
||||
boardView = (currentUser.profile || {}).boardView;
|
||||
} else {
|
||||
return window.localStorage.getItem('boardView') === 'board-view-cal';
|
||||
boardView = window.localStorage.getItem('boardView');
|
||||
}
|
||||
|
||||
return boardView === 'board-view-cal';
|
||||
},
|
||||
|
||||
hasSwimlanes() {
|
||||
const currentBoard = Utils.getCurrentBoard();
|
||||
if (!currentBoard) {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log('hasSwimlanes: No current board');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
const swimlanes = currentBoard.swimlanes();
|
||||
const hasSwimlanes = swimlanes && swimlanes.length > 0;
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log('hasSwimlanes: Board has', swimlanes ? swimlanes.length : 0, 'swimlanes');
|
||||
}
|
||||
return hasSwimlanes;
|
||||
} catch (error) {
|
||||
console.error('hasSwimlanes: Error getting swimlanes:', error);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
isVerticalScrollbars() {
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
return user && user.isVerticalScrollbars();
|
||||
},
|
||||
|
||||
boardView() {
|
||||
return Utils.boardView();
|
||||
},
|
||||
|
||||
debugBoardState() {
|
||||
// Enable debug mode by setting ?debug=1 in URL
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get('debug') === '1';
|
||||
},
|
||||
|
||||
debugBoardStateData() {
|
||||
const currentBoard = Utils.getCurrentBoard();
|
||||
const currentBoardId = Session.get('currentBoard');
|
||||
const isBoardReady = this.isBoardReady.get();
|
||||
const isConverting = this.isConverting.get();
|
||||
const isMigrating = this.isMigrating.get();
|
||||
const boardView = Utils.boardView();
|
||||
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log('=== BOARD DEBUG STATE ===');
|
||||
console.log('currentBoardId:', currentBoardId);
|
||||
console.log('currentBoard:', !!currentBoard, currentBoard ? currentBoard.title : 'none');
|
||||
console.log('isBoardReady:', isBoardReady);
|
||||
console.log('isConverting:', isConverting);
|
||||
console.log('isMigrating:', isMigrating);
|
||||
console.log('boardView:', boardView);
|
||||
console.log('========================');
|
||||
}
|
||||
|
||||
return {
|
||||
currentBoardId,
|
||||
hasCurrentBoard: !!currentBoard,
|
||||
currentBoardTitle: currentBoard ? currentBoard.title : 'none',
|
||||
isBoardReady,
|
||||
isConverting,
|
||||
isMigrating,
|
||||
boardView
|
||||
};
|
||||
},
|
||||
|
||||
|
||||
openNewListForm() {
|
||||
if (this.isViewSwimlanes()) {
|
||||
// The form had been removed in 416b17062e57f215206e93a85b02ef9eb1ab4902
|
||||
|
||||
@@ -82,10 +82,29 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
'click .js-toggle-board-view': Popup.open('boardChangeView'),
|
||||
'click .js-toggle-sidebar'() {
|
||||
Sidebar.toggle();
|
||||
console.log('Hamburger menu clicked');
|
||||
// Use the same approach as keyboard shortcuts
|
||||
if (typeof Sidebar !== 'undefined' && Sidebar && typeof Sidebar.toggle === 'function') {
|
||||
console.log('Using Sidebar.toggle()');
|
||||
Sidebar.toggle();
|
||||
} else {
|
||||
console.warn('Sidebar not available, trying alternative approach');
|
||||
// Try to trigger the sidebar through the global Blaze helper
|
||||
if (typeof Blaze !== 'undefined' && Blaze._globalHelpers && Blaze._globalHelpers.Sidebar) {
|
||||
const sidebar = Blaze._globalHelpers.Sidebar();
|
||||
if (sidebar && typeof sidebar.toggle === 'function') {
|
||||
console.log('Using Blaze helper Sidebar.toggle()');
|
||||
sidebar.toggle();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
'click .js-open-filter-view'() {
|
||||
Sidebar.setView('filter');
|
||||
if (Sidebar) {
|
||||
Sidebar.setView('filter');
|
||||
} else {
|
||||
console.warn('Sidebar not available for setView');
|
||||
}
|
||||
},
|
||||
'click .js-sort-cards': Popup.open('cardsSort'),
|
||||
/*
|
||||
@@ -102,14 +121,22 @@ BlazeComponent.extendComponent({
|
||||
*/
|
||||
'click .js-filter-reset'(event) {
|
||||
event.stopPropagation();
|
||||
Sidebar.setView();
|
||||
if (Sidebar) {
|
||||
Sidebar.setView();
|
||||
} else {
|
||||
console.warn('Sidebar not available for setView');
|
||||
}
|
||||
Filter.reset();
|
||||
},
|
||||
'click .js-sort-reset'() {
|
||||
Session.set('sortBy', '');
|
||||
},
|
||||
'click .js-open-search-view'() {
|
||||
Sidebar.setView('search');
|
||||
if (Sidebar) {
|
||||
Sidebar.setView('search');
|
||||
} else {
|
||||
console.warn('Sidebar not available for setView');
|
||||
}
|
||||
},
|
||||
'click .js-multiselection-activate'() {
|
||||
const currentCard = Utils.getCurrentCardId();
|
||||
@@ -203,6 +230,7 @@ const CreateBoard = BlazeComponent.extendComponent({
|
||||
title: title,
|
||||
permission: 'private',
|
||||
type: 'template-container',
|
||||
migrationVersion: 1, // Latest version - no migration needed
|
||||
}),
|
||||
);
|
||||
|
||||
@@ -246,6 +274,7 @@ const CreateBoard = BlazeComponent.extendComponent({
|
||||
Boards.insert({
|
||||
title,
|
||||
permission: visibility,
|
||||
migrationVersion: 1, // Latest version - no migration needed
|
||||
}),
|
||||
);
|
||||
|
||||
|
||||
@@ -336,3 +336,36 @@
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Attachment migration styles */
|
||||
.attachment-item.migrating {
|
||||
position: relative;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.attachment-migration-overlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 10;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.migration-spinner {
|
||||
font-size: 24px;
|
||||
color: #007cba;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.migration-text {
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -57,7 +57,7 @@ template(name="attachmentGallery")
|
||||
|
||||
each attachments
|
||||
|
||||
.attachment-item
|
||||
.attachment-item(class="{{#if isAttachmentMigrating _id}}migrating{{/if}}")
|
||||
.attachment-thumbnail-container.open-preview(data-attachment-id="{{_id}}" data-card-id="{{ meta.cardId }}")
|
||||
if link
|
||||
if(isImage)
|
||||
@@ -97,6 +97,12 @@ template(name="attachmentGallery")
|
||||
i.fa.fa-trash.icon(title="{{_ 'delete'}}")
|
||||
a.fa.fa-navicon.icon.js-open-attachment-menu(data-attachment-link="{{link}}" title="{{_ 'attachmentActionsPopup-title'}}")
|
||||
|
||||
// Migration spinner overlay
|
||||
if isAttachmentMigrating _id
|
||||
.attachment-migration-overlay
|
||||
.migration-spinner
|
||||
i.fa.fa-cog.fa-spin
|
||||
.migration-text {{_ 'migrating-attachment'}}
|
||||
|
||||
template(name="attachmentActionsPopup")
|
||||
ul.pop-over-list
|
||||
|
||||
@@ -3,6 +3,7 @@ import { ObjectID } from 'bson';
|
||||
import DOMPurify from 'dompurify';
|
||||
import { sanitizeHTML, sanitizeText } from '/imports/lib/secureDOMPurify';
|
||||
import uploadProgressManager from '../../lib/uploadProgressManager';
|
||||
import { attachmentMigrationManager } from '/client/lib/attachmentMigrationManager';
|
||||
|
||||
const filesize = require('filesize');
|
||||
const prettyMilliseconds = require('pretty-ms');
|
||||
@@ -576,3 +577,20 @@ BlazeComponent.extendComponent({
|
||||
]
|
||||
}
|
||||
}).register('attachmentRenamePopup');
|
||||
|
||||
// Template helpers for attachment migration status
|
||||
Template.registerHelper('attachmentMigrationStatus', function(attachmentId) {
|
||||
return attachmentMigrationManager.getAttachmentMigrationStatus(attachmentId);
|
||||
});
|
||||
|
||||
Template.registerHelper('isAttachmentMigrating', function(attachmentId) {
|
||||
return attachmentMigrationManager.isAttachmentBeingMigrated(attachmentId);
|
||||
});
|
||||
|
||||
Template.registerHelper('attachmentMigrationProgress', function() {
|
||||
return attachmentMigrationManager.attachmentMigrationProgress.get();
|
||||
});
|
||||
|
||||
Template.registerHelper('attachmentMigrationStatusText', function() {
|
||||
return attachmentMigrationManager.attachmentMigrationStatus.get();
|
||||
});
|
||||
@@ -695,6 +695,14 @@ template(name="cardDetailsActionsPopup")
|
||||
a.js-set-card-color
|
||||
i.fa.fa-paint-brush
|
||||
| {{_ 'setCardColorPopup-title'}}
|
||||
li
|
||||
a.js-toggle-show-list-on-minicard
|
||||
if showListOnMinicard
|
||||
i.fa.fa-eye
|
||||
| {{_ 'hide-list-on-minicard'}}
|
||||
else
|
||||
i.fa.fa-eye-slash
|
||||
| {{_ 'show-list-on-minicard'}}
|
||||
hr
|
||||
ul.pop-over-list
|
||||
li
|
||||
|
||||
@@ -657,6 +657,10 @@ Template.cardDetailsActionsPopup.helpers({
|
||||
isBoardAdmin() {
|
||||
return ReactiveCache.getCurrentUser().isBoardAdmin();
|
||||
},
|
||||
|
||||
showListOnMinicard() {
|
||||
return this.showListOnMinicard;
|
||||
},
|
||||
});
|
||||
|
||||
Template.cardDetailsActionsPopup.events({
|
||||
@@ -702,6 +706,12 @@ Template.cardDetailsActionsPopup.events({
|
||||
if (!err && ret) Popup.close();
|
||||
});
|
||||
},
|
||||
'click .js-toggle-show-list-on-minicard'() {
|
||||
const currentCard = this;
|
||||
const newValue = !currentCard.showListOnMinicard;
|
||||
Cards.update(currentCard._id, { $set: { showListOnMinicard: newValue } });
|
||||
Popup.close();
|
||||
},
|
||||
});
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
.palette-colors {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start; /* left-align color chips in wider popovers */
|
||||
}
|
||||
.palette-colors .palette-color {
|
||||
flex-grow: 1;
|
||||
|
||||
@@ -588,3 +588,18 @@
|
||||
transform: scale(1.02);
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
/* List name display on minicard */
|
||||
.minicard-list-name {
|
||||
font-size: 0.75em;
|
||||
color: #8c8c8c;
|
||||
margin-top: 0.2vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.3vw;
|
||||
}
|
||||
|
||||
.minicard-list-name i.fa {
|
||||
font-size: 0.8em;
|
||||
opacity: 0.7;
|
||||
}
|
||||
@@ -72,12 +72,6 @@ template(name="minicard")
|
||||
span.card-number
|
||||
| ##{getCardNumber}
|
||||
= getTitle
|
||||
if $eq 'subtext-with-full-path' currentBoard.presentParentTask
|
||||
.parent-subtext
|
||||
| {{ parentString ' > ' }}
|
||||
if $eq 'subtext-with-parent' currentBoard.presentParentTask
|
||||
.parent-subtext
|
||||
| {{ parentCardName }}
|
||||
if labels
|
||||
.minicard-labels(class="{{#if hiddenMinicardLabelText}}minicard-labels-no-text{{/if}}")
|
||||
each labels
|
||||
@@ -197,6 +191,16 @@ template(name="minicard")
|
||||
.minicard-description
|
||||
+viewer
|
||||
| {{ getDescription }}
|
||||
if shouldShowListOnMinicard
|
||||
.minicard-list-name
|
||||
i.fa.fa-list
|
||||
| {{ listName }}
|
||||
if $eq 'subtext-with-full-path' currentBoard.presentParentTask
|
||||
.parent-subtext
|
||||
| {{ parentString ' > ' }}
|
||||
if $eq 'subtext-with-parent' currentBoard.presentParentTask
|
||||
.parent-subtext
|
||||
| {{ parentCardName }}
|
||||
|
||||
template(name="editCardSortOrderPopup")
|
||||
input.js-edit-card-sort-popup(type='text' autofocus value=sort dir="auto")
|
||||
|
||||
@@ -196,6 +196,19 @@ Template.minicard.helpers({
|
||||
},
|
||||
uploadCount() {
|
||||
return uploadProgressManager.getUploadCountForCard(this._id);
|
||||
},
|
||||
listName() {
|
||||
const list = this.list();
|
||||
return list ? list.title : '';
|
||||
},
|
||||
|
||||
shouldShowListOnMinicard() {
|
||||
// Show list name if either:
|
||||
// 1. Board-wide setting is enabled, OR
|
||||
// 2. This specific card has the setting enabled
|
||||
const currentBoard = this.currentBoard;
|
||||
if (!currentBoard) return false;
|
||||
return currentBoard.allowsShowListsOnMinicard || this.showListOnMinicard;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -8,6 +8,219 @@
|
||||
padding: 0;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* List resize handle */
|
||||
.list-resize-handle {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: -3px;
|
||||
width: 6px;
|
||||
height: 100%;
|
||||
cursor: col-resize;
|
||||
z-index: 10;
|
||||
background: transparent;
|
||||
transition: background-color 0.2s ease;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.list-resize-handle:hover {
|
||||
background: rgba(0, 123, 255, 0.4);
|
||||
box-shadow: 0 0 4px rgba(0, 123, 255, 0.3);
|
||||
}
|
||||
|
||||
.list-resize-handle:active {
|
||||
background: rgba(0, 123, 255, 0.6);
|
||||
box-shadow: 0 0 6px rgba(0, 123, 255, 0.4);
|
||||
}
|
||||
|
||||
/* Show resize handle only on hover */
|
||||
.list:hover .list-resize-handle {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.list:hover .list-resize-handle:hover {
|
||||
background: rgba(0, 123, 255, 0.4);
|
||||
box-shadow: 0 0 4px rgba(0, 123, 255, 0.3);
|
||||
}
|
||||
|
||||
/* Add a subtle indicator line */
|
||||
.list-resize-handle::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: 2px;
|
||||
height: 20px;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border-radius: 1px;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s ease;
|
||||
}
|
||||
|
||||
.list-resize-handle:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Disable resize handle for collapsed lists and mobile view */
|
||||
.list.list-collapsed .list-resize-handle,
|
||||
.list.mobile-view .list-resize-handle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Disable resize handle for auto-width lists */
|
||||
.list.list-auto-width .list-resize-handle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Visual feedback during resize */
|
||||
.list.list-resizing {
|
||||
transition: none !important;
|
||||
box-shadow: 0 0 10px rgba(0, 123, 255, 0.3);
|
||||
/* Ensure the list maintains its new width during resize */
|
||||
flex: none !important;
|
||||
flex-basis: auto !important;
|
||||
flex-grow: 0 !important;
|
||||
flex-shrink: 0 !important;
|
||||
/* Override any conflicting layout properties */
|
||||
float: left !important;
|
||||
display: block !important;
|
||||
position: relative !important;
|
||||
/* Force width to be respected */
|
||||
width: var(--list-width, auto) !important;
|
||||
min-width: var(--list-width, auto) !important;
|
||||
max-width: var(--list-width, auto) !important;
|
||||
}
|
||||
|
||||
body.list-resizing-active {
|
||||
cursor: col-resize !important;
|
||||
}
|
||||
|
||||
body.list-resizing-active * {
|
||||
cursor: col-resize !important;
|
||||
}
|
||||
|
||||
/* Ensure swimlane container doesn't interfere with list resizing */
|
||||
.swimlane .list.list-resizing {
|
||||
/* Override any swimlane flex properties */
|
||||
flex: none !important;
|
||||
flex-basis: auto !important;
|
||||
flex-grow: 0 !important;
|
||||
flex-shrink: 0 !important;
|
||||
/* Ensure width is respected */
|
||||
width: var(--list-width, auto) !important;
|
||||
min-width: var(--list-width, auto) !important;
|
||||
max-width: var(--list-width, auto) !important;
|
||||
}
|
||||
|
||||
/* More aggressive override for any container that might interfere */
|
||||
.js-swimlane .list.list-resizing,
|
||||
.dragscroll .list.list-resizing,
|
||||
[id^="swimlane-"] .list.list-resizing {
|
||||
/* Force the width to be applied */
|
||||
width: var(--list-width, auto) !important;
|
||||
min-width: var(--list-width, auto) !important;
|
||||
max-width: var(--list-width, auto) !important;
|
||||
flex: none !important;
|
||||
flex-basis: auto !important;
|
||||
flex-grow: 0 !important;
|
||||
flex-shrink: 0 !important;
|
||||
float: left !important;
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
/* Ensure the width persists after resize is complete */
|
||||
.js-swimlane .list[style*="--list-width"],
|
||||
.dragscroll .list[style*="--list-width"],
|
||||
[id^="swimlane-"] .list[style*="--list-width"] {
|
||||
/* Maintain the width after resize */
|
||||
width: var(--list-width, auto) !important;
|
||||
min-width: var(--list-width, auto) !important;
|
||||
max-width: var(--list-width, auto) !important;
|
||||
flex: none !important;
|
||||
flex-basis: auto !important;
|
||||
flex-grow: 0 !important;
|
||||
flex-shrink: 0 !important;
|
||||
float: left !important;
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
/* Ensure consistent header height for all lists */
|
||||
.list-header {
|
||||
/* Maintain consistent height and padding for all lists */
|
||||
min-height: 2.5vh !important;
|
||||
height: auto !important;
|
||||
padding: 2.5vh 1.5vw 0.5vh !important;
|
||||
/* Make sure the background covers the full height */
|
||||
background-color: #e4e4e4 !important;
|
||||
border-bottom: 0.8vh solid #e4e4e4 !important;
|
||||
/* Use original display for consistent button positioning */
|
||||
display: block !important;
|
||||
position: relative !important;
|
||||
/* Prevent vertical expansion but allow normal height */
|
||||
overflow: hidden !important;
|
||||
}
|
||||
|
||||
/* Ensure title text doesn't cause height changes for all lists */
|
||||
.list-header .list-header-name {
|
||||
/* Prevent text wrapping to maintain consistent height */
|
||||
white-space: nowrap !important;
|
||||
/* Truncate text with ellipsis if too long */
|
||||
text-overflow: ellipsis !important;
|
||||
/* Ensure proper line height */
|
||||
line-height: 1.2 !important;
|
||||
/* Ensure it doesn't overflow */
|
||||
overflow: hidden !important;
|
||||
/* Add margin to prevent overlap with buttons */
|
||||
margin-right: 120px !important;
|
||||
}
|
||||
|
||||
/* Position drag handle at top-right corner for ALL lists */
|
||||
.list-header .list-header-handle {
|
||||
/* Position at top-right corner, aligned with title text top */
|
||||
position: absolute !important;
|
||||
top: 2.5vh !important;
|
||||
right: 1.5vw !important;
|
||||
/* Ensure it's above other elements */
|
||||
z-index: 15 !important;
|
||||
/* Remove margin since it's absolutely positioned */
|
||||
margin-right: 0 !important;
|
||||
/* Ensure proper display */
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
/* Ensure buttons maintain original positioning */
|
||||
.js-swimlane .list[style*="--list-width"] .list-header .list-header-plus-top,
|
||||
.js-swimlane .list[style*="--list-width"] .list-header .js-collapse,
|
||||
.js-swimlane .list[style*="--list-width"] .list-header .js-open-list-menu,
|
||||
.dragscroll .list[style*="--list-width"] .list-header .list-header-plus-top,
|
||||
.dragscroll .list[style*="--list-width"] .list-header .js-collapse,
|
||||
.dragscroll .list[style*="--list-width"] .list-header .js-open-list-menu,
|
||||
[id^="swimlane-"] .list[style*="--list-width"] .list-header .list-header-plus-top,
|
||||
[id^="swimlane-"] .list[style*="--list-width"] .list-header .js-collapse,
|
||||
[id^="swimlane-"] .list[style*="--list-width"] .list-header .js-open-list-menu {
|
||||
/* Use original positioning to maintain layout */
|
||||
position: relative !important;
|
||||
/* Maintain original spacing */
|
||||
margin-right: 15px !important;
|
||||
/* Ensure proper display */
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
/* Ensure watch icon and card count maintain original positioning */
|
||||
.js-swimlane .list[style*="--list-width"] .list-header .list-header-watch-icon,
|
||||
.dragscroll .list[style*="--list-width"] .list-header .list-header-watch-icon,
|
||||
[id^="swimlane-"] .list[style*="--list-width"] .list-header .list-header-watch-icon,
|
||||
.js-swimlane .list[style*="--list-width"] .list-header .cardCount,
|
||||
.dragscroll .list[style*="--list-width"] .list-header .cardCount,
|
||||
[id^="swimlane-"] .list[style*="--list-width"] .list-header .cardCount {
|
||||
/* Use original positioning to maintain layout */
|
||||
position: relative !important;
|
||||
/* Maintain original spacing */
|
||||
margin-right: 15px !important;
|
||||
/* Ensure proper display */
|
||||
display: inline-block !important;
|
||||
}
|
||||
[id^="swimlane-"] .list:first-child {
|
||||
min-width: 2.5vw;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ template(name='list')
|
||||
class="{{#if collapsed}}list-collapsed{{/if}} {{#if autoWidth}}list-auto-width{{/if}} {{#if isMiniScreen}}mobile-view{{/if}}")
|
||||
+listHeader
|
||||
+listBody
|
||||
.list-resize-handle.js-list-resize-handle
|
||||
|
||||
template(name='miniList')
|
||||
a.mini-list.js-select-list.js-list(id="js-list-{{_id}}" class="{{#if isMiniScreen}}mobile-view{{/if}}")
|
||||
|
||||
@@ -24,6 +24,9 @@ BlazeComponent.extendComponent({
|
||||
onRendered() {
|
||||
const boardComponent = this.parentComponent().parentComponent();
|
||||
|
||||
// Initialize list resize functionality
|
||||
this.initializeListResize();
|
||||
|
||||
const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
|
||||
const $cards = this.$('.js-minicards');
|
||||
|
||||
@@ -212,6 +215,146 @@ BlazeComponent.extendComponent({
|
||||
const list = Template.currentData();
|
||||
return user.isAutoWidth(list.boardId);
|
||||
},
|
||||
|
||||
initializeListResize() {
|
||||
const list = Template.currentData();
|
||||
const $list = this.$('.js-list');
|
||||
const $resizeHandle = this.$('.js-list-resize-handle');
|
||||
|
||||
// Only enable resize for non-collapsed, non-auto-width lists
|
||||
if (list.collapsed || this.autoWidth()) {
|
||||
$resizeHandle.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
let isResizing = false;
|
||||
let startX = 0;
|
||||
let startWidth = 0;
|
||||
let minWidth = 100; // Minimum width as defined in the existing code
|
||||
let maxWidth = this.listConstraint() || 1000; // Use constraint as max width
|
||||
let listConstraint = this.listConstraint(); // Store constraint value for use in event handlers
|
||||
const component = this; // Store reference to component for use in event handlers
|
||||
|
||||
const startResize = (e) => {
|
||||
isResizing = true;
|
||||
startX = e.pageX || e.originalEvent.touches[0].pageX;
|
||||
startWidth = $list.outerWidth();
|
||||
|
||||
// Add visual feedback
|
||||
$list.addClass('list-resizing');
|
||||
$('body').addClass('list-resizing-active');
|
||||
|
||||
// Prevent text selection during resize
|
||||
$('body').css('user-select', 'none');
|
||||
|
||||
e.preventDefault();
|
||||
};
|
||||
|
||||
const doResize = (e) => {
|
||||
if (!isResizing) return;
|
||||
|
||||
const currentX = e.pageX || e.originalEvent.touches[0].pageX;
|
||||
const deltaX = currentX - startX;
|
||||
const newWidth = Math.max(minWidth, Math.min(maxWidth, startWidth + deltaX));
|
||||
|
||||
// Apply the new width immediately for real-time feedback using CSS custom properties
|
||||
$list[0].style.setProperty('--list-width', `${newWidth}px`);
|
||||
$list.css({
|
||||
'width': `${newWidth}px`,
|
||||
'min-width': `${newWidth}px`,
|
||||
'max-width': `${newWidth}px`,
|
||||
'flex': 'none',
|
||||
'flex-basis': 'auto',
|
||||
'flex-grow': '0',
|
||||
'flex-shrink': '0'
|
||||
});
|
||||
|
||||
// Debug: log the width change
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Resizing list to ${newWidth}px`);
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
};
|
||||
|
||||
const stopResize = (e) => {
|
||||
if (!isResizing) return;
|
||||
|
||||
isResizing = false;
|
||||
|
||||
// Calculate final width
|
||||
const currentX = e.pageX || e.originalEvent.touches[0].pageX;
|
||||
const deltaX = currentX - startX;
|
||||
const finalWidth = Math.max(minWidth, Math.min(maxWidth, startWidth + deltaX));
|
||||
|
||||
// Ensure the final width is applied using CSS custom properties
|
||||
$list[0].style.setProperty('--list-width', `${finalWidth}px`);
|
||||
$list.css({
|
||||
'width': `${finalWidth}px`,
|
||||
'min-width': `${finalWidth}px`,
|
||||
'max-width': `${finalWidth}px`,
|
||||
'flex': 'none',
|
||||
'flex-basis': 'auto',
|
||||
'flex-grow': '0',
|
||||
'flex-shrink': '0'
|
||||
});
|
||||
|
||||
// Remove visual feedback but keep the width
|
||||
$list.removeClass('list-resizing');
|
||||
$('body').removeClass('list-resizing-active');
|
||||
$('body').css('user-select', '');
|
||||
|
||||
// Keep the CSS custom property for persistent width
|
||||
// The CSS custom property will remain on the element to maintain the width
|
||||
|
||||
// Save the new width using the existing system
|
||||
const boardId = list.boardId;
|
||||
const listId = list._id;
|
||||
|
||||
// Use the same method as the hamburger menu
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Saving list width: ${finalWidth}px for list ${listId}`);
|
||||
}
|
||||
Meteor.call('applyListWidth', boardId, listId, finalWidth, listConstraint, (error, result) => {
|
||||
if (error) {
|
||||
console.error('Error saving list width:', error);
|
||||
} else {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log('List width saved successfully:', result);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
e.preventDefault();
|
||||
};
|
||||
|
||||
// Mouse events
|
||||
$resizeHandle.on('mousedown', startResize);
|
||||
$(document).on('mousemove', doResize);
|
||||
$(document).on('mouseup', stopResize);
|
||||
|
||||
// Touch events for mobile
|
||||
$resizeHandle.on('touchstart', startResize);
|
||||
$(document).on('touchmove', doResize);
|
||||
$(document).on('touchend', stopResize);
|
||||
|
||||
// Reactively update resize handle visibility when auto-width changes
|
||||
component.autorun(() => {
|
||||
if (component.autoWidth()) {
|
||||
$resizeHandle.hide();
|
||||
} else {
|
||||
$resizeHandle.show();
|
||||
}
|
||||
});
|
||||
|
||||
// Clean up on component destruction
|
||||
component.onDestroyed(() => {
|
||||
$(document).off('mousemove', doResize);
|
||||
$(document).off('mouseup', stopResize);
|
||||
$(document).off('touchmove', doResize);
|
||||
$(document).off('touchend', stopResize);
|
||||
});
|
||||
},
|
||||
}).register('list');
|
||||
|
||||
Template.miniList.events({
|
||||
|
||||
@@ -472,6 +472,14 @@ BlazeComponent.extendComponent({
|
||||
if (!this.selectedBoardId.get()) {
|
||||
return [];
|
||||
}
|
||||
const board = ReactiveCache.getBoard(this.selectedBoardId.get());
|
||||
if (!board) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Ensure default swimlane exists
|
||||
board.getDefaultSwimline();
|
||||
|
||||
const swimlanes = ReactiveCache.getSwimlanes(
|
||||
{
|
||||
boardId: this.selectedBoardId.get()
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
template(name="bookmarks")
|
||||
.panel
|
||||
h2 {{_ 'bookmarks'}}
|
||||
if currentUser
|
||||
if hasStarredBoards
|
||||
ul
|
||||
each starredBoards
|
||||
li
|
||||
a(href="{{pathFor 'board' id=_id slug=slug}}")= title
|
||||
a.js-toggle-star(title="{{_ 'star-board-short-unstar'}}")
|
||||
i.fa.fa-star
|
||||
else
|
||||
p {{_ 'no-starred-boards'}}
|
||||
else
|
||||
p {{_ 'please-sign-in'}}
|
||||
|
||||
// Desktop popup
|
||||
template(name="bookmarksPopup")
|
||||
ul.pop-over-list
|
||||
if hasStarredBoards
|
||||
each starredBoards
|
||||
li
|
||||
a(href="{{pathFor 'board' id=_id slug=slug}}")
|
||||
i.fa.fa-star
|
||||
| #{title}
|
||||
a.js-toggle-star.right(title="{{_ 'star-board-short-unstar'}}")
|
||||
i.fa.fa-star
|
||||
else
|
||||
li {{_ 'no-starred-boards'}}
|
||||
@@ -0,0 +1,55 @@
|
||||
Template.bookmarks.helpers({
|
||||
hasStarredBoards() {
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
if (!user) return false;
|
||||
const { starredBoards = [] } = user.profile || {};
|
||||
return Array.isArray(starredBoards) && starredBoards.length > 0;
|
||||
},
|
||||
starredBoards() {
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
if (!user) return [];
|
||||
const { starredBoards = [] } = user.profile || {};
|
||||
if (!Array.isArray(starredBoards) || starredBoards.length === 0) return [];
|
||||
return Boards.find({ _id: { $in: starredBoards } }, { sort: { sort: 1 } });
|
||||
},
|
||||
});
|
||||
|
||||
Template.bookmarks.events({
|
||||
'click .js-toggle-star'(e) {
|
||||
e.preventDefault();
|
||||
const boardId = this._id;
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
if (user && boardId) {
|
||||
user.toggleBoardStar(boardId);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Template.bookmarksPopup.helpers({
|
||||
hasStarredBoards() {
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
if (!user) return false;
|
||||
const { starredBoards = [] } = user.profile || {};
|
||||
return Array.isArray(starredBoards) && starredBoards.length > 0;
|
||||
},
|
||||
starredBoards() {
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
if (!user) return [];
|
||||
const { starredBoards = [] } = user.profile || {};
|
||||
if (!Array.isArray(starredBoards) || starredBoards.length === 0) return [];
|
||||
return Boards.find({ _id: { $in: starredBoards } }, { sort: { sort: 1 } });
|
||||
},
|
||||
});
|
||||
|
||||
Template.bookmarksPopup.events({
|
||||
'click .js-toggle-star'(e) {
|
||||
e.preventDefault();
|
||||
const boardId = this._id;
|
||||
const user = ReactiveCache.getCurrentUser();
|
||||
if (user && boardId) {
|
||||
user.toggleBoardStar(boardId);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ template(name="header")
|
||||
span.fa.fa-home
|
||||
| {{_ 'all-boards'}}
|
||||
|
||||
// Logo - always visible in desktop mode
|
||||
// Logo - visible; on mobile constrained by CSS
|
||||
unless currentSetting.hideLogo
|
||||
if currentSetting.customTopLeftCornerLogoImageUrl
|
||||
if currentSetting.customTopLeftCornerLogoLinkUrl
|
||||
@@ -82,6 +82,12 @@ template(name="header")
|
||||
a.board-header-btn.js-mobile-mode-toggle(title="{{_ 'mobile-desktop-toggle'}}" class="{{#if mobileMode}}mobile-active{{else}}desktop-active{{/if}}")
|
||||
i.fa.fa-mobile.mobile-icon(class="{{#if mobileMode}}active{{/if}}")
|
||||
i.fa.fa-desktop.desktop-icon(class="{{#unless mobileMode}}active{{/unless}}")
|
||||
|
||||
// Bookmarks button - desktop opens popup, mobile routes to page
|
||||
a.board-header-btn.js-open-bookmarks(title="{{_ 'bookmarks'}}")
|
||||
i.fa.fa-bookmark
|
||||
|
||||
// Notifications
|
||||
+notifications
|
||||
|
||||
if currentSetting.customHelpLinkUrl
|
||||
|
||||
@@ -104,6 +104,9 @@ Template.header.events({
|
||||
const currentMode = Utils.getMobileMode();
|
||||
Utils.setMobileMode(!currentMode);
|
||||
},
|
||||
'click .js-open-bookmarks'(evt) {
|
||||
// Already added but ensure single definition -- safe guard
|
||||
},
|
||||
'click .js-close-announcement'() {
|
||||
$('.announcement').hide();
|
||||
},
|
||||
@@ -124,6 +127,14 @@ Template.header.events({
|
||||
location.reload();
|
||||
}
|
||||
},
|
||||
'click .js-open-bookmarks'(evt) {
|
||||
// Desktop: open popup, Mobile: route to page
|
||||
if (Utils.isMiniScreen()) {
|
||||
FlowRouter.go('bookmarks');
|
||||
} else {
|
||||
Popup.open('bookmarksPopup')(evt);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Template.offlineWarning.events({
|
||||
|
||||
@@ -52,9 +52,15 @@ input,
|
||||
select,
|
||||
textarea,
|
||||
button {
|
||||
font: clamp(12px, 2.5vw, 16px) Roboto, Poppins, "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||
line-height: 1.3;
|
||||
font: clamp(14px, 2.5vw, 18px) Roboto, Poppins, "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||
line-height: 1.4;
|
||||
color: #4d4d4d;
|
||||
/* Improve text rendering */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
/* Better text selection */
|
||||
-webkit-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
html {
|
||||
font-size: 100%;
|
||||
@@ -460,20 +466,291 @@ a:not(.disabled).is-active i.fa {
|
||||
.no-scrollbars::-webkit-scrollbar {
|
||||
display: none !important;
|
||||
}
|
||||
/* ========================================
|
||||
MOBILE & TABLET RESPONSIVE IMPROVEMENTS
|
||||
======================================== */
|
||||
|
||||
/* Mobile devices (up to 800px) */
|
||||
@media screen and (max-width: 800px) {
|
||||
#content {
|
||||
margin: 1px 0px 0px 0px;
|
||||
height: calc(100% - 0px);
|
||||
/* Improve touch scrolling */
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
#content > .wrapper {
|
||||
margin-top: 0px;
|
||||
padding: 8px;
|
||||
}
|
||||
.wrapper {
|
||||
height: calc(100% - 31px);
|
||||
margin: 0px;
|
||||
padding: 8px;
|
||||
}
|
||||
.panel-default {
|
||||
width: 83vw;
|
||||
width: 95vw;
|
||||
max-width: 95vw;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* Improve touch targets */
|
||||
button, .btn, .js-toggle, .js-color-choice, .js-reaction, .close {
|
||||
min-height: 44px;
|
||||
min-width: 44px;
|
||||
padding: 12px 16px;
|
||||
font-size: 16px; /* Prevent zoom on iOS */
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
/* Form elements */
|
||||
input, select, textarea {
|
||||
font-size: 16px; /* Prevent zoom on iOS */
|
||||
padding: 12px;
|
||||
min-height: 44px;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
/* Cards and lists */
|
||||
.minicard {
|
||||
min-height: 48px;
|
||||
padding: 12px;
|
||||
margin-bottom: 8px;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
.list {
|
||||
margin: 0 8px;
|
||||
min-width: 280px;
|
||||
}
|
||||
|
||||
/* Board canvas */
|
||||
.board-canvas {
|
||||
padding: 8px;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
/* Header mobile layout */
|
||||
#header {
|
||||
padding: 8px;
|
||||
/* Keep top bar on a single row on small screens */
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
#header-quick-access {
|
||||
/* Keep quick-access items in one row */
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* Hide elements that should move to the hamburger menu on mobile */
|
||||
#header-quick-access .header-quick-access-list,
|
||||
#header-quick-access #header-help {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Show only the home icon (hide the trailing text) on mobile */
|
||||
#header-quick-access .home-icon a {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
max-width: 28px; /* enough to display the icon */
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* Hide text in home icon on mobile, show only icon */
|
||||
#header-quick-access .home-icon a span:not(.fa) {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Ensure proper spacing for mobile header elements */
|
||||
#header-quick-access .zoom-controls {
|
||||
margin-left: auto;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.mobile-mode-toggle {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
#header-user-bar {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
/* Ensure header elements don't wrap on very small screens */
|
||||
#header-quick-access {
|
||||
min-width: 0; /* Allow flexbox to shrink */
|
||||
}
|
||||
|
||||
/* Make sure logo doesn't take too much space on mobile */
|
||||
#header-quick-access img {
|
||||
max-height: 24px;
|
||||
max-width: 120px;
|
||||
}
|
||||
|
||||
/* Ensure zoom controls are compact on mobile */
|
||||
.zoom-controls .zoom-level {
|
||||
padding: 4px 8px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* Modal mobile optimization */
|
||||
#modal .modal-content,
|
||||
#modal .modal-content-wide {
|
||||
width: 95vw;
|
||||
max-width: 95vw;
|
||||
margin: 2vh auto;
|
||||
padding: 16px;
|
||||
max-height: 90vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/* Table mobile optimization */
|
||||
table {
|
||||
font-size: 14px;
|
||||
width: 100%;
|
||||
display: block;
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
/* Admin panel mobile optimization */
|
||||
.setting-content .content-body {
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.setting-content .content-body .side-menu {
|
||||
width: 100%;
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.setting-content .content-body .main-body {
|
||||
order: 1;
|
||||
min-height: 60vh;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tablet devices (768px - 1024px) */
|
||||
@media screen and (min-width: 768px) and (max-width: 1024px) {
|
||||
#content > .wrapper {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.wrapper {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.panel-default {
|
||||
width: 90vw;
|
||||
max-width: 90vw;
|
||||
}
|
||||
|
||||
/* Touch-friendly but more compact */
|
||||
button, .btn, .js-toggle, .js-color-choice, .js-reaction, .close {
|
||||
min-height: 48px;
|
||||
min-width: 48px;
|
||||
padding: 10px 14px;
|
||||
}
|
||||
|
||||
.minicard {
|
||||
min-height: 40px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.list {
|
||||
margin: 0 12px;
|
||||
min-width: 300px;
|
||||
}
|
||||
|
||||
.board-canvas {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
#header {
|
||||
padding: 12px 16px;
|
||||
}
|
||||
|
||||
#modal .modal-content {
|
||||
width: 80vw;
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
#modal .modal-content-wide {
|
||||
width: 90vw;
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
.setting-content .content-body {
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.setting-content .content-body .side-menu {
|
||||
width: 250px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Large displays and digital signage (1920px+) */
|
||||
@media screen and (min-width: 1920px) {
|
||||
body {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
button, .btn, .js-toggle, .js-color-choice, .js-reaction, .close {
|
||||
min-height: 56px;
|
||||
min-width: 56px;
|
||||
padding: 16px 20px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.minicard {
|
||||
min-height: 56px;
|
||||
padding: 16px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.list {
|
||||
margin: 0 20px;
|
||||
min-width: 360px;
|
||||
}
|
||||
|
||||
.board-canvas {
|
||||
padding: 20px;
|
||||
max-width: 2400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#header {
|
||||
padding: 20px 32px;
|
||||
max-width: 2400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#modal .modal-content {
|
||||
width: 600px;
|
||||
}
|
||||
|
||||
#modal .modal-content-wide {
|
||||
width: 1000px;
|
||||
}
|
||||
|
||||
.setting-content .content-body {
|
||||
gap: 32px;
|
||||
max-width: 2400px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.setting-content .content-body .side-menu {
|
||||
width: 320px;
|
||||
}
|
||||
}
|
||||
.inline-input {
|
||||
|
||||
@@ -2,7 +2,7 @@ template(name="main")
|
||||
html(lang="{{TAPi18n.getLanguage}}")
|
||||
head
|
||||
title
|
||||
meta(name="viewport" content="width=device-width, initial-scale=1")
|
||||
meta(name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes")
|
||||
meta(http-equiv="X-UA-Compatible" content="IE=edge")
|
||||
//- XXX We should use pathFor in the following `href` to support the case
|
||||
where the application is deployed with a path prefix, but it seems to be
|
||||
@@ -77,6 +77,8 @@ template(name="defaultLayout")
|
||||
| {{{afterBodyStart}}}
|
||||
+Template.dynamic(template=content)
|
||||
| {{{beforeBodyEnd}}}
|
||||
+migrationProgress
|
||||
+boardConversionProgress
|
||||
if (Modal.isOpen)
|
||||
#modal
|
||||
.overlay
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
border-bottom-color: #c2c2c2;
|
||||
box-shadow: 0 0.2vh 0.8vh rgba(0,0,0,0.3);
|
||||
position: absolute;
|
||||
width: min(300px, 40vw);
|
||||
/* Wider default to fit full color palette */
|
||||
width: min(380px, 55vw);
|
||||
z-index: 99999;
|
||||
margin-top: 0.7vh;
|
||||
}
|
||||
@@ -80,10 +81,35 @@
|
||||
transition: transform 0.2s;
|
||||
}
|
||||
.pop-over .content-container .content {
|
||||
width: min(280px, 37vw);
|
||||
/* Match wider popover, leave padding */
|
||||
width: min(360px, 52vw);
|
||||
padding: 0 1.3vw 1.3vh;
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* Utility: remove left gutter inside specific popups */
|
||||
.pop-over .content .flush-left {
|
||||
margin-left: -1.3vw;
|
||||
padding-left: 0;
|
||||
width: calc(100% + 1.3vw);
|
||||
}
|
||||
|
||||
/* Swimlane popups: remove left gutter, align content fully left */
|
||||
.pop-over .content form.swimlane-color-popup,
|
||||
.pop-over .content .swimlane-height-popup {
|
||||
margin-left: -1.3vw;
|
||||
padding-left: 0;
|
||||
width: calc(100% + 1.3vw);
|
||||
}
|
||||
|
||||
/* Ensure buttons don’t reserve left space; align to flow */
|
||||
.pop-over .content form.swimlane-color-popup .primary.confirm,
|
||||
.pop-over .content form.swimlane-color-popup .negate.wide.right,
|
||||
.pop-over .content .swimlane-height-popup .primary.confirm,
|
||||
.pop-over .content .swimlane-height-popup .negate.wide.right {
|
||||
float: none;
|
||||
margin-left: 0;
|
||||
}
|
||||
.pop-over .content-container .content.no-height {
|
||||
height: 2.5vh;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,372 @@
|
||||
/* Migration Progress Styles */
|
||||
.migration-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
z-index: 10000;
|
||||
display: none;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.migration-overlay.active {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.migration-modal {
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
|
||||
max-width: 800px;
|
||||
width: 95%;
|
||||
max-height: 90vh;
|
||||
overflow: hidden;
|
||||
animation: slideInScale 0.4s ease-out;
|
||||
margin: 20px;
|
||||
}
|
||||
|
||||
@keyframes slideInScale {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-30px) scale(0.95);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0) scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
.migration-header {
|
||||
padding: 24px 32px 20px;
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
text-align: center;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.migration-header h3 {
|
||||
margin: 0 0 8px 0;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.migration-header h3 i {
|
||||
margin-right: 12px;
|
||||
color: #FFD700;
|
||||
}
|
||||
|
||||
.migration-header p {
|
||||
margin: 0;
|
||||
font-size: 16px;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
.migration-content {
|
||||
padding: 24px 32px;
|
||||
max-height: 60vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.migration-overview {
|
||||
margin-bottom: 32px;
|
||||
padding: 20px;
|
||||
background: #f8f9fa;
|
||||
border-radius: 8px;
|
||||
border-left: 4px solid #667eea;
|
||||
}
|
||||
|
||||
.overall-progress {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
width: 100%;
|
||||
height: 12px;
|
||||
background-color: #e0e0e0;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 8px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
border-radius: 6px;
|
||||
transition: width 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.progress-fill::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
rgba(255, 255, 255, 0.4),
|
||||
transparent
|
||||
);
|
||||
animation: shimmer 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
|
||||
.progress-text {
|
||||
text-align: center;
|
||||
font-weight: 700;
|
||||
color: #667eea;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.progress-label {
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.current-step {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.current-step i {
|
||||
margin-right: 8px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.estimated-time {
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
background-color: #fff3cd;
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ffeaa7;
|
||||
}
|
||||
|
||||
.estimated-time i {
|
||||
margin-right: 6px;
|
||||
color: #f39c12;
|
||||
}
|
||||
|
||||
.migration-steps {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.migration-steps h4 {
|
||||
margin: 0 0 16px 0;
|
||||
color: #333;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.steps-list {
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.migration-step {
|
||||
padding: 16px 20px;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.migration-step:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.migration-step.completed {
|
||||
background-color: #d4edda;
|
||||
border-left: 4px solid #28a745;
|
||||
}
|
||||
|
||||
.migration-step.current {
|
||||
background-color: #cce7ff;
|
||||
border-left: 4px solid #667eea;
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.4);
|
||||
}
|
||||
70% {
|
||||
box-shadow: 0 0 0 10px rgba(102, 126, 234, 0);
|
||||
}
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.step-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.step-icon {
|
||||
margin-right: 12px;
|
||||
font-size: 18px;
|
||||
width: 24px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.step-icon i.fa-check-circle {
|
||||
color: #28a745;
|
||||
}
|
||||
|
||||
.step-icon i.fa-cog.fa-spin {
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.step-icon i.fa-circle-o {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.step-info {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.step-name {
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.step-description {
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.step-progress {
|
||||
text-align: right;
|
||||
min-width: 40px;
|
||||
}
|
||||
|
||||
.step-progress .progress-text {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.step-progress-bar {
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
background-color: #e0e0e0;
|
||||
border-radius: 2px;
|
||||
overflow: hidden;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.step-progress-bar .progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
border-radius: 2px;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
.migration-status {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
background-color: #e3f2fd;
|
||||
padding: 12px 16px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #bbdefb;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.migration-status i {
|
||||
margin-right: 8px;
|
||||
color: #2196f3;
|
||||
}
|
||||
|
||||
.migration-footer {
|
||||
padding: 16px 32px 24px;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.migration-info {
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-size: 13px;
|
||||
line-height: 1.4;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.migration-info i {
|
||||
margin-right: 6px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.migration-warning {
|
||||
text-align: center;
|
||||
color: #856404;
|
||||
font-size: 12px;
|
||||
line-height: 1.3;
|
||||
background-color: #fff3cd;
|
||||
padding: 8px 12px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ffeaa7;
|
||||
}
|
||||
|
||||
.migration-warning i {
|
||||
margin-right: 6px;
|
||||
color: #f39c12;
|
||||
}
|
||||
|
||||
/* Responsive design */
|
||||
@media (max-width: 768px) {
|
||||
.migration-modal {
|
||||
width: 98%;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.migration-header,
|
||||
.migration-content,
|
||||
.migration-footer {
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
.migration-header h3 {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.step-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.step-progress {
|
||||
text-align: left;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.steps-list {
|
||||
max-height: 200px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
template(name="migrationProgress")
|
||||
.migration-overlay(class="{{#if isMigrating}}active{{/if}}")
|
||||
.migration-modal
|
||||
.migration-header
|
||||
h3
|
||||
i.fa.fa-database
|
||||
| {{_ 'database-migration'}}
|
||||
p {{_ 'database-migration-description'}}
|
||||
|
||||
.migration-content
|
||||
.migration-overview
|
||||
.overall-progress
|
||||
.progress-bar
|
||||
.progress-fill(style="width: {{migrationProgress}}%")
|
||||
.progress-text {{migrationProgress}}%
|
||||
.progress-label {{_ 'overall-progress'}}
|
||||
|
||||
.current-step
|
||||
i.fa.fa-cog.fa-spin
|
||||
| {{migrationCurrentStep}}
|
||||
|
||||
.estimated-time(style="{{#unless migrationEstimatedTime}}display: none;{{/unless}}")
|
||||
i.fa.fa-clock-o
|
||||
| {{_ 'estimated-time-remaining'}}: {{migrationEstimatedTime}}
|
||||
|
||||
.migration-steps
|
||||
h4 {{_ 'migration-steps'}}
|
||||
.steps-list
|
||||
each migrationSteps
|
||||
.migration-step(class="{{#if completed}}completed{{/if}}" class="{{#if isCurrentStep}}current{{/if}}")
|
||||
.step-header
|
||||
.step-icon
|
||||
if completed
|
||||
i.fa.fa-check-circle
|
||||
else if isCurrentStep
|
||||
i.fa.fa-cog.fa-spin
|
||||
else
|
||||
i.fa.fa-circle-o
|
||||
.step-info
|
||||
.step-name {{name}}
|
||||
.step-description {{description}}
|
||||
.step-progress
|
||||
if completed
|
||||
.progress-text 100%
|
||||
else if isCurrentStep
|
||||
.progress-text {{progress}}%
|
||||
else
|
||||
.progress-text 0%
|
||||
if isCurrentStep
|
||||
.step-progress-bar
|
||||
.progress-fill(style="width: {{progress}}%")
|
||||
|
||||
.migration-status
|
||||
i.fa.fa-info-circle
|
||||
| {{migrationStatus}}
|
||||
|
||||
.migration-footer
|
||||
.migration-info
|
||||
i.fa.fa-lightbulb-o
|
||||
| {{_ 'migration-info-text'}}
|
||||
.migration-warning
|
||||
i.fa.fa-exclamation-triangle
|
||||
| {{_ 'migration-warning-text'}}
|
||||
@@ -0,0 +1,54 @@
|
||||
import { Template } from 'meteor/templating';
|
||||
import {
|
||||
migrationManager,
|
||||
isMigrating,
|
||||
migrationProgress,
|
||||
migrationStatus,
|
||||
migrationCurrentStep,
|
||||
migrationEstimatedTime,
|
||||
migrationSteps
|
||||
} from '/client/lib/migrationManager';
|
||||
|
||||
Template.migrationProgress.helpers({
|
||||
isMigrating() {
|
||||
return isMigrating.get();
|
||||
},
|
||||
|
||||
migrationProgress() {
|
||||
return migrationProgress.get();
|
||||
},
|
||||
|
||||
migrationStatus() {
|
||||
return migrationStatus.get();
|
||||
},
|
||||
|
||||
migrationCurrentStep() {
|
||||
return migrationCurrentStep.get();
|
||||
},
|
||||
|
||||
migrationEstimatedTime() {
|
||||
return migrationEstimatedTime.get();
|
||||
},
|
||||
|
||||
migrationSteps() {
|
||||
const steps = migrationSteps.get();
|
||||
const currentStep = migrationCurrentStep.get();
|
||||
|
||||
return steps.map(step => ({
|
||||
...step,
|
||||
isCurrentStep: step.name === currentStep
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
Template.migrationProgress.onCreated(function() {
|
||||
// Subscribe to migration state changes
|
||||
this.autorun(() => {
|
||||
isMigrating.get();
|
||||
migrationProgress.get();
|
||||
migrationStatus.get();
|
||||
migrationCurrentStep.get();
|
||||
migrationEstimatedTime.get();
|
||||
migrationSteps.get();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,241 @@
|
||||
template(name="attachmentSettings")
|
||||
ul#attachment-setting.setting-detail
|
||||
li
|
||||
h3 {{_ 'attachment-storage-configuration'}}
|
||||
.form-group
|
||||
label {{_ 'writable-path'}}
|
||||
input.wekan-form-control#filesystem-path(type="text" value="{{filesystemPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'filesystem-path-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'attachments-path'}}
|
||||
input.wekan-form-control#attachments-path(type="text" value="{{attachmentsPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'attachments-path-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'avatars-path'}}
|
||||
input.wekan-form-control#avatars-path(type="text" value="{{avatarsPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'avatars-path-description'}}
|
||||
|
||||
li
|
||||
h3 {{_ 'mongodb-gridfs-storage'}}
|
||||
.form-group
|
||||
label {{_ 'gridfs-enabled'}}
|
||||
input.wekan-form-control#gridfs-enabled(type="checkbox" checked="{{gridfsEnabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 'gridfs-enabled-description'}}
|
||||
|
||||
li
|
||||
h3 {{_ 's3-minio-storage'}}
|
||||
.form-group
|
||||
label {{_ 's3-enabled'}}
|
||||
input.wekan-form-control#s3-enabled(type="checkbox" checked="{{s3Enabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 's3-enabled-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-endpoint'}}
|
||||
input.wekan-form-control#s3-endpoint(type="text" value="{{s3Endpoint}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-endpoint-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-bucket'}}
|
||||
input.wekan-form-control#s3-bucket(type="text" value="{{s3Bucket}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-bucket-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-region'}}
|
||||
input.wekan-form-control#s3-region(type="text" value="{{s3Region}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-region-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-access-key'}}
|
||||
input.wekan-form-control#s3-access-key(type="text" placeholder="{{_ 's3-access-key-placeholder'}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-access-key-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-secret-key'}}
|
||||
input.wekan-form-control#s3-secret-key(type="password" placeholder="{{_ 's3-secret-key-placeholder'}}")
|
||||
small.form-text.text-muted {{_ 's3-secret-key-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-ssl-enabled'}}
|
||||
input.wekan-form-control#s3-ssl-enabled(type="checkbox" checked="{{s3SslEnabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 's3-ssl-enabled-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-port'}}
|
||||
input.wekan-form-control#s3-port(type="number" value="{{s3Port}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-port-description'}}
|
||||
|
||||
.form-group
|
||||
button.js-test-s3-connection.btn.btn-secondary {{_ 'test-s3-connection'}}
|
||||
button.js-save-s3-settings.btn.btn-primary {{_ 'save-s3-settings'}}
|
||||
|
||||
template(name="storageSettings")
|
||||
.storage-settings
|
||||
h3 {{_ 'attachment-storage-configuration'}}
|
||||
|
||||
.storage-config-section
|
||||
h4 {{_ 'filesystem-storage'}}
|
||||
.form-group
|
||||
label {{_ 'writable-path'}}
|
||||
input.wekan-form-control#filesystem-path(type="text" value="{{filesystemPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'filesystem-path-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'attachments-path'}}
|
||||
input.wekan-form-control#attachments-path(type="text" value="{{attachmentsPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'attachments-path-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'avatars-path'}}
|
||||
input.wekan-form-control#avatars-path(type="text" value="{{avatarsPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'avatars-path-description'}}
|
||||
|
||||
.storage-config-section
|
||||
h4 {{_ 'mongodb-gridfs-storage'}}
|
||||
.form-group
|
||||
label {{_ 'gridfs-enabled'}}
|
||||
input.wekan-form-control#gridfs-enabled(type="checkbox" checked="{{gridfsEnabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 'gridfs-enabled-description'}}
|
||||
|
||||
.storage-config-section
|
||||
h4 {{_ 's3-minio-storage'}}
|
||||
.form-group
|
||||
label {{_ 's3-enabled'}}
|
||||
input.wekan-form-control#s3-enabled(type="checkbox" checked="{{s3Enabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 's3-enabled-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-endpoint'}}
|
||||
input.wekan-form-control#s3-endpoint(type="text" value="{{s3Endpoint}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-endpoint-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-bucket'}}
|
||||
input.wekan-form-control#s3-bucket(type="text" value="{{s3Bucket}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-bucket-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-region'}}
|
||||
input.wekan-form-control#s3-region(type="text" value="{{s3Region}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-region-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-access-key'}}
|
||||
input.wekan-form-control#s3-access-key(type="text" placeholder="{{_ 's3-access-key-placeholder'}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-access-key-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-secret-key'}}
|
||||
input.wekan-form-control#s3-secret-key(type="password" placeholder="{{_ 's3-secret-key-placeholder'}}")
|
||||
small.form-text.text-muted {{_ 's3-secret-key-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-ssl-enabled'}}
|
||||
input.wekan-form-control#s3-ssl-enabled(type="checkbox" checked="{{s3SslEnabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 's3-ssl-enabled-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-port'}}
|
||||
input.wekan-form-control#s3-port(type="number" value="{{s3Port}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-port-description'}}
|
||||
|
||||
.storage-actions
|
||||
button.js-test-s3-connection.btn.btn-secondary {{_ 'test-s3-connection'}}
|
||||
button.js-save-s3-settings.btn.btn-primary {{_ 'save-s3-settings'}}
|
||||
|
||||
template(name="attachmentMigration")
|
||||
.attachment-migration
|
||||
h3 {{_ 'attachment-migration'}}
|
||||
|
||||
.migration-controls
|
||||
.form-group
|
||||
label {{_ 'migration-batch-size'}}
|
||||
input.wekan-form-control#migration-batch-size(type="number" value="{{migrationBatchSize}}" min="1" max="100")
|
||||
small.form-text.text-muted {{_ 'migration-batch-size-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'migration-delay-ms'}}
|
||||
input.wekan-form-control#migration-delay-ms(type="number" value="{{migrationDelayMs}}" min="100" max="10000")
|
||||
small.form-text.text-muted {{_ 'migration-delay-ms-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'migration-cpu-threshold'}}
|
||||
input.wekan-form-control#migration-cpu-threshold(type="number" value="{{migrationCpuThreshold}}" min="10" max="90")
|
||||
small.form-text.text-muted {{_ 'migration-cpu-threshold-description'}}
|
||||
|
||||
.migration-actions
|
||||
.migration-buttons
|
||||
button.js-migrate-all-to-filesystem.btn.btn-primary {{_ 'migrate-all-to-filesystem'}}
|
||||
button.js-migrate-all-to-gridfs.btn.btn-primary {{_ 'migrate-all-to-gridfs'}}
|
||||
button.js-migrate-all-to-s3.btn.btn-primary {{_ 'migrate-all-to-s3'}}
|
||||
|
||||
.migration-controls
|
||||
button.js-pause-migration.btn.btn-warning {{_ 'pause-migration'}}
|
||||
button.js-resume-migration.btn.btn-success {{_ 'resume-migration'}}
|
||||
button.js-stop-migration.btn.btn-danger {{_ 'stop-migration'}}
|
||||
|
||||
.migration-progress
|
||||
h4 {{_ 'migration-progress'}}
|
||||
.progress
|
||||
.progress-bar(role="progressbar" style="width: {{migrationProgress}}%" aria-valuenow="{{migrationProgress}}" aria-valuemin="0" aria-valuemax="100")
|
||||
| {{migrationProgress}}%
|
||||
|
||||
.migration-stats
|
||||
.stat-item
|
||||
span.label {{_ 'total-attachments'}}:
|
||||
span.value {{totalAttachments}}
|
||||
.stat-item
|
||||
span.label {{_ 'migrated-attachments'}}:
|
||||
span.value {{migratedAttachments}}
|
||||
.stat-item
|
||||
span.label {{_ 'remaining-attachments'}}:
|
||||
span.value {{remainingAttachments}}
|
||||
.stat-item
|
||||
span.label {{_ 'migration-status'}}:
|
||||
span.value {{migrationStatus}}
|
||||
|
||||
.migration-log
|
||||
h4 {{_ 'migration-log'}}
|
||||
.log-container
|
||||
pre#migration-log-content {{migrationLog}}
|
||||
|
||||
template(name="attachmentMonitoring")
|
||||
.attachment-monitoring
|
||||
h3 {{_ 'attachment-monitoring'}}
|
||||
|
||||
.monitoring-stats
|
||||
.stats-grid
|
||||
.stat-card
|
||||
h5 {{_ 'total-attachments'}}
|
||||
.stat-value {{totalAttachments}}
|
||||
.stat-card
|
||||
h5 {{_ 'filesystem-attachments'}}
|
||||
.stat-value {{filesystemAttachments}}
|
||||
.stat-card
|
||||
h5 {{_ 'gridfs-attachments'}}
|
||||
.stat-value {{gridfsAttachments}}
|
||||
.stat-card
|
||||
h5 {{_ 's3-attachments'}}
|
||||
.stat-value {{s3Attachments}}
|
||||
.stat-card
|
||||
h5 {{_ 'total-size'}}
|
||||
.stat-value {{totalSize}}
|
||||
.stat-card
|
||||
h5 {{_ 'filesystem-size'}}
|
||||
.stat-value {{filesystemSize}}
|
||||
.stat-card
|
||||
h5 {{_ 'gridfs-size'}}
|
||||
.stat-value {{gridfsSize}}
|
||||
.stat-card
|
||||
h5 {{_ 's3-size'}}
|
||||
.stat-value {{s3Size}}
|
||||
|
||||
.monitoring-charts
|
||||
h4 {{_ 'storage-distribution'}}
|
||||
.chart-container
|
||||
canvas#storage-distribution-chart
|
||||
|
||||
.monitoring-actions
|
||||
button.js-refresh-monitoring.btn.btn-secondary {{_ 'refresh-monitoring'}}
|
||||
button.js-export-monitoring.btn.btn-primary {{_ 'export-monitoring'}}
|
||||
@@ -0,0 +1,864 @@
|
||||
/* Cron Settings Styles */
|
||||
.cron-settings-content {
|
||||
min-height: 600px;
|
||||
}
|
||||
|
||||
.cron-migrations {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.migration-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 30px;
|
||||
padding-bottom: 20px;
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.migration-header h2 {
|
||||
margin: 0;
|
||||
color: #333;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.migration-header h2 i {
|
||||
margin-right: 10px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.migration-controls {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.migration-controls .btn {
|
||||
padding: 8px 16px;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.migration-controls .btn-primary {
|
||||
background-color: #28a745;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.migration-controls .btn-primary:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
|
||||
.migration-controls .btn-warning {
|
||||
background-color: #ffc107;
|
||||
color: #212529;
|
||||
}
|
||||
|
||||
.migration-controls .btn-warning:hover {
|
||||
background-color: #e0a800;
|
||||
}
|
||||
|
||||
.migration-controls .btn-danger {
|
||||
background-color: #dc3545;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.migration-controls .btn-danger:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
|
||||
.migration-progress {
|
||||
background: #f8f9fa;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 30px;
|
||||
border-left: 4px solid #667eea;
|
||||
}
|
||||
|
||||
.progress-overview {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
width: 100%;
|
||||
height: 12px;
|
||||
background-color: #e0e0e0;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 8px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
border-radius: 6px;
|
||||
transition: width 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.progress-fill::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
rgba(255, 255, 255, 0.4),
|
||||
transparent
|
||||
);
|
||||
animation: shimmer 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
100% {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
|
||||
.progress-text {
|
||||
text-align: center;
|
||||
font-weight: 700;
|
||||
color: #667eea;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.progress-label {
|
||||
text-align: center;
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.current-step {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.current-step i {
|
||||
margin-right: 8px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.migration-status {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
background-color: #e3f2fd;
|
||||
padding: 12px 16px;
|
||||
border-radius: 6px;
|
||||
border: 1px solid #bbdefb;
|
||||
}
|
||||
|
||||
.migration-status i {
|
||||
margin-right: 8px;
|
||||
color: #2196f3;
|
||||
}
|
||||
|
||||
.migration-steps {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.migration-steps h3 {
|
||||
margin: 0 0 20px 0;
|
||||
color: #333;
|
||||
font-size: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.steps-list {
|
||||
max-height: 400px;
|
||||
overflow-y: auto;
|
||||
border: 1px solid #e0e0e0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.migration-step {
|
||||
padding: 16px 20px;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.migration-step:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.migration-step.completed {
|
||||
background-color: #d4edda;
|
||||
border-left: 4px solid #28a745;
|
||||
}
|
||||
|
||||
.migration-step.current {
|
||||
background-color: #cce7ff;
|
||||
border-left: 4px solid #667eea;
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0% {
|
||||
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0.4);
|
||||
}
|
||||
70% {
|
||||
box-shadow: 0 0 0 10px rgba(102, 126, 234, 0);
|
||||
}
|
||||
100% {
|
||||
box-shadow: 0 0 0 0 rgba(102, 126, 234, 0);
|
||||
}
|
||||
}
|
||||
|
||||
.step-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.step-icon {
|
||||
margin-right: 12px;
|
||||
font-size: 18px;
|
||||
width: 24px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.step-icon i.fa-check-circle {
|
||||
color: #28a745;
|
||||
}
|
||||
|
||||
.step-icon i.fa-cog.fa-spin {
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.step-icon i.fa-circle-o {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.step-info {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.step-name {
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.step-description {
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.step-progress {
|
||||
text-align: right;
|
||||
min-width: 40px;
|
||||
}
|
||||
|
||||
.step-progress .progress-text {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.step-progress-bar {
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
background-color: #e0e0e0;
|
||||
border-radius: 2px;
|
||||
overflow: hidden;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.step-progress-bar .progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
border-radius: 2px;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
/* Cron Jobs Styles */
|
||||
.cron-jobs {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.jobs-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 30px;
|
||||
padding-bottom: 20px;
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.jobs-header h2 {
|
||||
margin: 0;
|
||||
color: #333;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.jobs-header h2 i {
|
||||
margin-right: 10px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.jobs-controls .btn {
|
||||
padding: 8px 16px;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.jobs-controls .btn-success {
|
||||
background-color: #28a745;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.jobs-controls .btn-success:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
|
||||
.jobs-list {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.table thead {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
|
||||
.table th,
|
||||
.table td {
|
||||
padding: 12px 16px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.table th {
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.table td {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
padding: 4px 8px;
|
||||
border-radius: 4px;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.status-badge.status-running {
|
||||
background-color: #d4edda;
|
||||
color: #155724;
|
||||
}
|
||||
|
||||
.status-badge.status-stopped {
|
||||
background-color: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.status-badge.status-paused {
|
||||
background-color: #fff3cd;
|
||||
color: #856404;
|
||||
}
|
||||
|
||||
.status-badge.status-completed {
|
||||
background-color: #d1ecf1;
|
||||
color: #0c5460;
|
||||
}
|
||||
|
||||
.status-badge.status-error {
|
||||
background-color: #f8d7da;
|
||||
color: #721c24;
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.btn-group .btn {
|
||||
padding: 4px 8px;
|
||||
font-size: 12px;
|
||||
border-radius: 3px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.btn-group .btn-success {
|
||||
background-color: #28a745;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-group .btn-success:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
|
||||
.btn-group .btn-warning {
|
||||
background-color: #ffc107;
|
||||
color: #212529;
|
||||
}
|
||||
|
||||
.btn-group .btn-warning:hover {
|
||||
background-color: #e0a800;
|
||||
}
|
||||
|
||||
.btn-group .btn-danger {
|
||||
background-color: #dc3545;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-group .btn-danger:hover {
|
||||
background-color: #c82333;
|
||||
}
|
||||
|
||||
/* Add Job Form Styles */
|
||||
.cron-add-job {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.add-job-header {
|
||||
margin-bottom: 30px;
|
||||
padding-bottom: 20px;
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.add-job-header h2 {
|
||||
margin: 0;
|
||||
color: #333;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.add-job-header h2 i {
|
||||
margin-right: 10px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.add-job-form {
|
||||
max-width: 600px;
|
||||
}
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
width: 100%;
|
||||
padding: 10px 12px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 4px;
|
||||
font-size: 14px;
|
||||
transition: border-color 0.3s ease;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
outline: none;
|
||||
border-color: #667eea;
|
||||
box-shadow: 0 0 0 2px rgba(102, 126, 234, 0.2);
|
||||
}
|
||||
|
||||
.form-control[type="number"] {
|
||||
width: 100px;
|
||||
}
|
||||
|
||||
.form-actions {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.form-actions .btn {
|
||||
padding: 10px 20px;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.form-actions .btn-primary {
|
||||
background-color: #667eea;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.form-actions .btn-primary:hover {
|
||||
background-color: #5a6fd8;
|
||||
}
|
||||
|
||||
.form-actions .btn-default {
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.form-actions .btn-default:hover {
|
||||
background-color: #5a6268;
|
||||
}
|
||||
|
||||
/* Board Operations Styles */
|
||||
.cron-board-operations {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.board-operations-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 30px;
|
||||
padding-bottom: 20px;
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.board-operations-header h2 {
|
||||
margin: 0;
|
||||
color: #333;
|
||||
font-size: 24px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.board-operations-header h2 i {
|
||||
margin-right: 10px;
|
||||
color: #667eea;
|
||||
}
|
||||
|
||||
.board-operations-controls {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.board-operations-controls .btn {
|
||||
padding: 8px 16px;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.board-operations-controls .btn-success {
|
||||
background-color: #28a745;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.board-operations-controls .btn-success:hover {
|
||||
background-color: #218838;
|
||||
}
|
||||
|
||||
.board-operations-controls .btn-primary {
|
||||
background-color: #667eea;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.board-operations-controls .btn-primary:hover {
|
||||
background-color: #5a6fd8;
|
||||
}
|
||||
|
||||
.board-operations-stats {
|
||||
background: #f8f9fa;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 30px;
|
||||
border-left: 4px solid #667eea;
|
||||
}
|
||||
|
||||
.stats-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.stat-item {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.stat-value {
|
||||
font-size: 32px;
|
||||
font-weight: 700;
|
||||
color: #667eea;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.stat-label {
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.system-resources {
|
||||
background: #f8f9fa;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 30px;
|
||||
border-left: 4px solid #28a745;
|
||||
}
|
||||
|
||||
.resource-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.resource-item:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.resource-label {
|
||||
min-width: 120px;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.resource-bar {
|
||||
flex: 1;
|
||||
height: 12px;
|
||||
background-color: #e0e0e0;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
margin: 0 15px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.resource-fill {
|
||||
height: 100%;
|
||||
border-radius: 6px;
|
||||
transition: width 0.3s ease;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.resource-item:nth-child(1) .resource-fill {
|
||||
background: linear-gradient(90deg, #28a745, #20c997);
|
||||
}
|
||||
|
||||
.resource-item:nth-child(2) .resource-fill {
|
||||
background: linear-gradient(90deg, #007bff, #6f42c1);
|
||||
}
|
||||
|
||||
.resource-value {
|
||||
min-width: 50px;
|
||||
text-align: right;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.board-operations-search {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
|
||||
.search-box {
|
||||
position: relative;
|
||||
max-width: 400px;
|
||||
}
|
||||
|
||||
.search-box .form-control {
|
||||
padding-right: 40px;
|
||||
}
|
||||
|
||||
.search-icon {
|
||||
position: absolute;
|
||||
right: 12px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
color: #999;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.board-operations-list {
|
||||
background: white;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.operations-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20px;
|
||||
background: #f8f9fa;
|
||||
border-bottom: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.operations-header h3 {
|
||||
margin: 0;
|
||||
color: #333;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.pagination-info {
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.operations-table {
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.operations-table .table {
|
||||
margin: 0;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.operations-table .table th {
|
||||
background-color: #f8f9fa;
|
||||
border-bottom: 2px solid #e0e0e0;
|
||||
font-weight: 600;
|
||||
color: #333;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.operations-table .table td {
|
||||
vertical-align: middle;
|
||||
border-bottom: 1px solid #f0f0f0;
|
||||
}
|
||||
|
||||
.board-id {
|
||||
font-family: monospace;
|
||||
font-size: 12px;
|
||||
color: #666;
|
||||
background: #f8f9fa;
|
||||
padding: 4px 8px;
|
||||
border-radius: 4px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.operation-type {
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.progress-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
.progress-container .progress-bar {
|
||||
flex: 1;
|
||||
height: 8px;
|
||||
background-color: #e0e0e0;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.progress-container .progress-fill {
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, #667eea, #764ba2);
|
||||
border-radius: 4px;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
.progress-container .progress-text {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
color: #667eea;
|
||||
min-width: 35px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.pagination {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20px;
|
||||
background: #f8f9fa;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.pagination .btn {
|
||||
padding: 6px 12px;
|
||||
font-size: 12px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #ddd;
|
||||
background: white;
|
||||
color: #333;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.pagination .btn:hover {
|
||||
background: #f8f9fa;
|
||||
border-color: #667eea;
|
||||
}
|
||||
|
||||
.pagination .btn:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.page-info {
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* Responsive design */
|
||||
@media (max-width: 768px) {
|
||||
.migration-header,
|
||||
.jobs-header {
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.migration-controls,
|
||||
.jobs-controls {
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.table {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.table th,
|
||||
.table td {
|
||||
padding: 8px 12px;
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.add-job-form {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,309 @@
|
||||
template(name="cronSettings")
|
||||
ul#cron-setting.setting-detail
|
||||
li
|
||||
h3 {{_ 'cron-migrations'}}
|
||||
.form-group
|
||||
label {{_ 'migration-status'}}
|
||||
.status-indicator
|
||||
span.status-label {{_ 'status'}}:
|
||||
span.status-value {{migrationStatus}}
|
||||
.progress-section
|
||||
.progress
|
||||
.progress-bar(role="progressbar" style="width: {{migrationProgress}}%" aria-valuenow="{{migrationProgress}}" aria-valuemin="0" aria-valuemax="100")
|
||||
| {{migrationProgress}}%
|
||||
.progress-text
|
||||
| {{migrationProgress}}% {{_ 'complete'}}
|
||||
|
||||
.form-group
|
||||
button.js-start-all-migrations.btn.btn-primary {{_ 'start-all-migrations'}}
|
||||
button.js-pause-all-migrations.btn.btn-warning {{_ 'pause-all-migrations'}}
|
||||
button.js-stop-all-migrations.btn.btn-danger {{_ 'stop-all-migrations'}}
|
||||
|
||||
li
|
||||
h3 {{_ 'board-operations'}}
|
||||
.form-group
|
||||
label {{_ 'scheduled-board-operations'}}
|
||||
button.js-schedule-board-cleanup.btn.btn-primary {{_ 'schedule-board-cleanup'}}
|
||||
button.js-schedule-board-archive.btn.btn-warning {{_ 'schedule-board-archive'}}
|
||||
button.js-schedule-board-backup.btn.btn-info {{_ 'schedule-board-backup'}}
|
||||
|
||||
li
|
||||
h3 {{_ 'cron-jobs'}}
|
||||
.form-group
|
||||
label {{_ 'active-cron-jobs'}}
|
||||
each cronJobs
|
||||
.job-item
|
||||
.job-info
|
||||
.job-name {{name}}
|
||||
.job-schedule {{schedule}}
|
||||
.job-description {{description}}
|
||||
.job-actions
|
||||
button.js-pause-job.btn.btn-sm.btn-warning(data-job-id="{{_id}}") {{_ 'pause'}}
|
||||
button.js-delete-job.btn.btn-sm.btn-danger(data-job-id="{{_id}}") {{_ 'delete'}}
|
||||
.add-job-section
|
||||
button.js-add-cron-job.btn.btn-success {{_ 'add-cron-job'}}
|
||||
|
||||
template(name="cronMigrations")
|
||||
.cron-migrations
|
||||
.migration-header
|
||||
h2
|
||||
i.fa.fa-database
|
||||
| {{_ 'database-migrations'}}
|
||||
.migration-controls
|
||||
button.btn.btn-primary.js-start-all-migrations
|
||||
i.fa.fa-play
|
||||
| {{_ 'start-all-migrations'}}
|
||||
button.btn.btn-warning.js-pause-all-migrations
|
||||
i.fa.fa-pause
|
||||
| {{_ 'pause-all-migrations'}}
|
||||
button.btn.btn-danger.js-stop-all-migrations
|
||||
i.fa.fa-stop
|
||||
| {{_ 'stop-all-migrations'}}
|
||||
|
||||
.migration-progress
|
||||
.progress-overview
|
||||
.progress-bar
|
||||
.progress-fill(style="width: {{migrationProgress}}%")
|
||||
.progress-text {{migrationProgress}}%
|
||||
.progress-label {{_ 'overall-progress'}}
|
||||
|
||||
.current-step
|
||||
i.fa.fa-cog.fa-spin
|
||||
| {{migrationCurrentStep}}
|
||||
|
||||
.migration-status
|
||||
i.fa.fa-info-circle
|
||||
| {{migrationStatus}}
|
||||
|
||||
.migration-steps
|
||||
h3 {{_ 'migration-steps'}}
|
||||
.steps-list
|
||||
each migrationSteps
|
||||
.migration-step(class="{{#if completed}}completed{{/if}}" class="{{#if isCurrentStep}}current{{/if}}")
|
||||
.step-header
|
||||
.step-icon
|
||||
if completed
|
||||
i.fa.fa-check-circle
|
||||
else if isCurrentStep
|
||||
i.fa.fa-cog.fa-spin
|
||||
else
|
||||
i.fa.fa-circle-o
|
||||
.step-info
|
||||
.step-name {{name}}
|
||||
.step-description {{description}}
|
||||
.step-progress
|
||||
if completed
|
||||
.progress-text 100%
|
||||
else if isCurrentStep
|
||||
.progress-text {{progress}}%
|
||||
else
|
||||
.progress-text 0%
|
||||
if isCurrentStep
|
||||
.step-progress-bar
|
||||
.progress-fill(style="width: {{progress}}%")
|
||||
|
||||
template(name="cronBoardOperations")
|
||||
.cron-board-operations
|
||||
.board-operations-header
|
||||
h2
|
||||
i.fa.fa-tasks
|
||||
| {{_ 'board-operations'}}
|
||||
.board-operations-controls
|
||||
button.btn.btn-success.js-refresh-board-operations
|
||||
i.fa.fa-refresh
|
||||
| {{_ 'refresh'}}
|
||||
button.btn.btn-primary.js-start-test-operation
|
||||
i.fa.fa-play
|
||||
| {{_ 'start-test-operation'}}
|
||||
button.btn.btn-info.js-force-board-scan
|
||||
i.fa.fa-search
|
||||
| {{_ 'force-board-scan'}}
|
||||
|
||||
.board-operations-stats
|
||||
.stats-grid
|
||||
.stat-item
|
||||
.stat-value {{operationStats.total}}
|
||||
.stat-label {{_ 'total-operations'}}
|
||||
.stat-item
|
||||
.stat-value {{operationStats.running}}
|
||||
.stat-label {{_ 'running'}}
|
||||
.stat-item
|
||||
.stat-value {{operationStats.completed}}
|
||||
.stat-label {{_ 'completed'}}
|
||||
.stat-item
|
||||
.stat-value {{operationStats.error}}
|
||||
.stat-label {{_ 'errors'}}
|
||||
.stat-item
|
||||
.stat-value {{queueStats.pending}}
|
||||
.stat-label {{_ 'pending'}}
|
||||
.stat-item
|
||||
.stat-value {{queueStats.maxConcurrent}}
|
||||
.stat-label {{_ 'max-concurrent'}}
|
||||
.stat-item
|
||||
.stat-value {{boardMigrationStats.unmigratedCount}}
|
||||
.stat-label {{_ 'unmigrated-boards'}}
|
||||
.stat-item
|
||||
.stat-value {{boardMigrationStats.isScanning}}
|
||||
.stat-label {{_ 'scanning-status'}}
|
||||
|
||||
.system-resources
|
||||
.resource-item
|
||||
.resource-label {{_ 'cpu-usage'}}
|
||||
.resource-bar
|
||||
.resource-fill(style="width: {{systemResources.cpuUsage}}%")
|
||||
.resource-value {{systemResources.cpuUsage}}%
|
||||
.resource-item
|
||||
.resource-label {{_ 'memory-usage'}}
|
||||
.resource-bar
|
||||
.resource-fill(style="width: {{systemResources.memoryUsage}}%")
|
||||
.resource-value {{systemResources.memoryUsage}}%
|
||||
.resource-item
|
||||
.resource-label {{_ 'cpu-cores'}}
|
||||
.resource-value {{systemResources.cpuCores}}
|
||||
|
||||
.board-operations-search
|
||||
.search-box
|
||||
input.form-control.js-search-board-operations(type="text" placeholder="{{_ 'search-boards-or-operations'}}")
|
||||
i.fa.fa-search.search-icon
|
||||
|
||||
.board-operations-list
|
||||
.operations-header
|
||||
h3 {{_ 'board-operations'}} ({{pagination.total}})
|
||||
.pagination-info
|
||||
| {{_ 'showing'}} {{pagination.start}} - {{pagination.end}} {{_ 'of'}} {{pagination.total}}
|
||||
|
||||
.operations-table
|
||||
table.table.table-striped
|
||||
thead
|
||||
tr
|
||||
th {{_ 'board-id'}}
|
||||
th {{_ 'operation-type'}}
|
||||
th {{_ 'status'}}
|
||||
th {{_ 'progress'}}
|
||||
th {{_ 'start-time'}}
|
||||
th {{_ 'duration'}}
|
||||
th {{_ 'actions'}}
|
||||
tbody
|
||||
each boardOperations
|
||||
tr
|
||||
td
|
||||
.board-id {{boardId}}
|
||||
td
|
||||
.operation-type {{operationType}}
|
||||
td
|
||||
span.status-badge(class="status-{{status}}") {{status}}
|
||||
td
|
||||
.progress-container
|
||||
.progress-bar
|
||||
.progress-fill(style="width: {{progress}}%")
|
||||
.progress-text {{progress}}%
|
||||
td {{formatDateTime startTime}}
|
||||
td {{formatDuration startTime endTime}}
|
||||
td
|
||||
.btn-group
|
||||
if isRunning
|
||||
button.btn.btn-sm.btn-warning.js-pause-operation(data-operation="{{id}}")
|
||||
i.fa.fa-pause
|
||||
else
|
||||
button.btn.btn-sm.btn-success.js-resume-operation(data-operation="{{id}}")
|
||||
i.fa.fa-play
|
||||
button.btn.btn-sm.btn-danger.js-stop-operation(data-operation="{{id}}")
|
||||
i.fa.fa-stop
|
||||
button.btn.btn-sm.btn-info.js-view-details(data-operation="{{id}}")
|
||||
i.fa.fa-info-circle
|
||||
|
||||
.pagination
|
||||
if pagination.hasPrev
|
||||
button.btn.btn-sm.btn-default.js-prev-page
|
||||
i.fa.fa-chevron-left
|
||||
| {{_ 'previous'}}
|
||||
.page-info
|
||||
| {{_ 'page'}} {{pagination.page}} {{_ 'of'}} {{pagination.totalPages}}
|
||||
if pagination.hasNext
|
||||
button.btn.btn-sm.btn-default.js-next-page
|
||||
| {{_ 'next'}}
|
||||
i.fa.fa-chevron-right
|
||||
|
||||
template(name="cronJobs")
|
||||
.cron-jobs
|
||||
.jobs-header
|
||||
h2
|
||||
i.fa.fa-clock-o
|
||||
| {{_ 'cron-jobs'}}
|
||||
.jobs-controls
|
||||
button.btn.btn-success.js-refresh-jobs
|
||||
i.fa.fa-refresh
|
||||
| {{_ 'refresh'}}
|
||||
|
||||
.jobs-list
|
||||
table.table.table-striped
|
||||
thead
|
||||
tr
|
||||
th {{_ 'job-name'}}
|
||||
th {{_ 'schedule'}}
|
||||
th {{_ 'status'}}
|
||||
th {{_ 'last-run'}}
|
||||
th {{_ 'next-run'}}
|
||||
th {{_ 'actions'}}
|
||||
tbody
|
||||
each cronJobs
|
||||
tr
|
||||
td {{name}}
|
||||
td {{schedule}}
|
||||
td
|
||||
span.status-badge(class="status-{{status}}") {{status}}
|
||||
td {{formatDate lastRun}}
|
||||
td {{formatDate nextRun}}
|
||||
td
|
||||
.btn-group
|
||||
if isRunning
|
||||
button.btn.btn-sm.btn-warning.js-pause-job(data-job="{{name}}")
|
||||
i.fa.fa-pause
|
||||
else
|
||||
button.btn.btn-sm.btn-success.js-start-job(data-job="{{name}}")
|
||||
i.fa.fa-play
|
||||
button.btn.btn-sm.btn-danger.js-stop-job(data-job="{{name}}")
|
||||
i.fa.fa-stop
|
||||
button.btn.btn-sm.btn-danger.js-remove-job(data-job="{{name}}")
|
||||
i.fa.fa-trash
|
||||
|
||||
template(name="cronAddJob")
|
||||
.cron-add-job
|
||||
.add-job-header
|
||||
h2
|
||||
i.fa.fa-plus
|
||||
| {{_ 'add-cron-job'}}
|
||||
|
||||
.add-job-form
|
||||
form.js-add-cron-job-form
|
||||
.form-group
|
||||
label(for="job-name") {{_ 'job-name'}}
|
||||
input.form-control#job-name(type="text" name="name" required)
|
||||
|
||||
.form-group
|
||||
label(for="job-description") {{_ 'job-description'}}
|
||||
textarea.form-control#job-description(name="description" rows="3")
|
||||
|
||||
.form-group
|
||||
label(for="job-schedule") {{_ 'schedule'}}
|
||||
select.form-control#job-schedule(name="schedule")
|
||||
option(value="every 1 minute") {{_ 'every-1-minute'}}
|
||||
option(value="every 5 minutes") {{_ 'every-5-minutes'}}
|
||||
option(value="every 10 minutes") {{_ 'every-10-minutes'}}
|
||||
option(value="every 30 minutes") {{_ 'every-30-minutes'}}
|
||||
option(value="every 1 hour") {{_ 'every-1-hour'}}
|
||||
option(value="every 6 hours") {{_ 'every-6-hours'}}
|
||||
option(value="every 1 day") {{_ 'every-1-day'}}
|
||||
option(value="once") {{_ 'run-once'}}
|
||||
|
||||
.form-group
|
||||
label(for="job-weight") {{_ 'weight'}}
|
||||
input.form-control#job-weight(type="number" name="weight" value="1" min="1" max="10")
|
||||
|
||||
.form-actions
|
||||
button.btn.btn-primary(type="submit")
|
||||
i.fa.fa-plus
|
||||
| {{_ 'add-job'}}
|
||||
button.btn.btn-default.js-cancel-add-job
|
||||
i.fa.fa-times
|
||||
| {{_ 'cancel'}}
|
||||
@@ -1,11 +1,16 @@
|
||||
.main-body {
|
||||
overflow: scroll;
|
||||
}
|
||||
/* Scrollbar styles are now handled by settingBody.css for all admin pages */
|
||||
table {
|
||||
color: #000;
|
||||
min-width: 1200px !important;
|
||||
width: max-content !important;
|
||||
table-layout: auto !important;
|
||||
}
|
||||
|
||||
/* Force People/Organizations/Teams tables to always trigger horizontal scrolling */
|
||||
table td,
|
||||
table th {
|
||||
white-space: nowrap;
|
||||
min-width: 120px;
|
||||
border: 1px solid #d2d0d0;
|
||||
text-align: left;
|
||||
padding: 8px;
|
||||
|
||||
@@ -203,26 +203,35 @@ BlazeComponent.extendComponent({
|
||||
this.loading.set(w);
|
||||
},
|
||||
orgList() {
|
||||
const limitOrgs = this.page.get() * orgsPerPage;
|
||||
const orgs = ReactiveCache.getOrgs(this.findOrgsOptions.get(), {
|
||||
sort: { orgDisplayName: 1 },
|
||||
limit: limitOrgs,
|
||||
fields: { _id: true },
|
||||
});
|
||||
// Count only the items currently loaded to browser, not total from database
|
||||
this.numberOrgs.set(orgs.length);
|
||||
return orgs;
|
||||
},
|
||||
teamList() {
|
||||
const limitTeams = this.page.get() * teamsPerPage;
|
||||
const teams = ReactiveCache.getTeams(this.findTeamsOptions.get(), {
|
||||
sort: { teamDisplayName: 1 },
|
||||
limit: limitTeams,
|
||||
fields: { _id: true },
|
||||
});
|
||||
// Count only the items currently loaded to browser, not total from database
|
||||
this.numberTeams.set(teams.length);
|
||||
return teams;
|
||||
},
|
||||
peopleList() {
|
||||
const limitUsers = this.page.get() * usersPerPage;
|
||||
const users = ReactiveCache.getUsers(this.findUsersOptions.get(), {
|
||||
sort: { username: 1 },
|
||||
limit: limitUsers,
|
||||
fields: { _id: true },
|
||||
});
|
||||
// Count only the items currently loaded to browser, not total from database
|
||||
this.numberPeople.set(users.length);
|
||||
return users;
|
||||
},
|
||||
|
||||
@@ -59,7 +59,79 @@
|
||||
-ms-user-select: text;
|
||||
user-select: text;
|
||||
max-height: 100%;
|
||||
overflow: auto;
|
||||
overflow-x: scroll !important;
|
||||
overflow-y: scroll !important;
|
||||
scrollbar-gutter: stable;
|
||||
/* Force horizontal scrollbar to always be visible */
|
||||
min-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* Ensure scrollbars are always visible with proper styling for all admin pages */
|
||||
.setting-content .content-body .main-body::-webkit-scrollbar {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
}
|
||||
|
||||
.setting-content .content-body .main-body::-webkit-scrollbar-track {
|
||||
background: #f1f1f1;
|
||||
border-radius: 6px;
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
}
|
||||
|
||||
.setting-content .content-body .main-body::-webkit-scrollbar-thumb {
|
||||
background: #888;
|
||||
border-radius: 6px;
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
}
|
||||
|
||||
.setting-content .content-body .main-body::-webkit-scrollbar-thumb:hover {
|
||||
background: #555;
|
||||
}
|
||||
|
||||
.setting-content .content-body .main-body::-webkit-scrollbar-corner {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
|
||||
/* Ensure tables and content are wide enough to trigger horizontal scrolling */
|
||||
.setting-content .content-body .main-body table {
|
||||
min-width: 1200px !important;
|
||||
width: max-content !important;
|
||||
table-layout: auto !important;
|
||||
}
|
||||
|
||||
/* Force tables to always trigger horizontal scrolling */
|
||||
.setting-content .content-body .main-body table td,
|
||||
.setting-content .content-body .main-body table th {
|
||||
white-space: nowrap;
|
||||
min-width: 120px;
|
||||
}
|
||||
|
||||
/* Ensure there's enough content to trigger vertical scrolling */
|
||||
.setting-content .content-body .main-body {
|
||||
min-height: calc(100vh - 200px);
|
||||
padding-bottom: 50px;
|
||||
}
|
||||
|
||||
/* Force horizontal scrollbar to always be visible at bottom */
|
||||
.setting-content .content-body .main-body {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/* Add invisible content to force horizontal scrolling when needed */
|
||||
.setting-content .content-body .main-body::after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 100vw;
|
||||
height: 1px;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
.setting-content .content-body .main-body ul li {
|
||||
padding: 0.5rem 0.5rem;
|
||||
|
||||
@@ -3,64 +3,225 @@ template(name="setting")
|
||||
unless currentUser.isAdmin
|
||||
| {{_ 'error-notAuthorized'}}
|
||||
else
|
||||
.content-title
|
||||
i.fa.fa-cog
|
||||
span {{_ 'settings'}}
|
||||
.content-title.ext-box
|
||||
if isGeneralSetting
|
||||
span
|
||||
i.fa.fa-sign-in
|
||||
| {{_ 'registration'}}
|
||||
else if isEmailSetting
|
||||
span
|
||||
i.fa.fa-envelope
|
||||
| {{_ 'email'}}
|
||||
else if isAccountSetting
|
||||
span
|
||||
i.fa.fa-users
|
||||
| {{_ 'accounts'}}
|
||||
else if isTableVisibilityModeSetting
|
||||
span
|
||||
i.fa.fa-eye
|
||||
| {{_ 'tableVisibilityMode'}}
|
||||
else if isAnnouncementSetting
|
||||
span
|
||||
i.fa.fa-bullhorn
|
||||
| {{_ 'admin-announcement'}}
|
||||
else if isAccessibilitySetting
|
||||
span
|
||||
i.fa.fa-universal-access
|
||||
| {{_ 'accessibility'}}
|
||||
else if isLayoutSetting
|
||||
span
|
||||
i.fa.fa-object-group
|
||||
| {{_ 'layout'}}
|
||||
else if isWebhookSetting
|
||||
span
|
||||
i.fa.fa-globe
|
||||
| {{_ 'global-webhook'}}
|
||||
else if isAttachmentSettings
|
||||
span
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'attachments'}}
|
||||
else if isCronSettings
|
||||
span
|
||||
i.fa.fa-clock-o
|
||||
| {{_ 'cron'}}
|
||||
.content-body
|
||||
.side-menu
|
||||
ul
|
||||
li.active
|
||||
li(class="{{#if isGeneralSetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="registration-setting")
|
||||
i.fa.fa-sign-in
|
||||
| {{_ 'registration'}}
|
||||
unless isSandstorm
|
||||
li
|
||||
li(class="{{#if isEmailSetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="email-setting")
|
||||
i.fa.fa-envelope
|
||||
| {{_ 'email'}}
|
||||
li
|
||||
li(class="{{#if isAccountSetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="account-setting")
|
||||
i.fa.fa-users
|
||||
| {{_ 'accounts'}}
|
||||
li
|
||||
li(class="{{#if isTableVisibilityModeSetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="tableVisibilityMode-setting")
|
||||
i.fa.fa-eye
|
||||
| {{_ 'tableVisibilityMode'}}
|
||||
li
|
||||
li(class="{{#if isAnnouncementSetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="announcement-setting")
|
||||
i.fa.fa-bullhorn
|
||||
| {{_ 'admin-announcement'}}
|
||||
li
|
||||
li(class="{{#if isAccessibilitySetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="accessibility-setting")
|
||||
i.fa.fa-universal-access
|
||||
| {{_ 'accessibility'}}
|
||||
li
|
||||
li(class="{{#if isLayoutSetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="layout-setting")
|
||||
i.fa.fa-object-group
|
||||
| {{_ 'layout'}}
|
||||
li
|
||||
li(class="{{#if isWebhookSetting}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="webhook-setting")
|
||||
i.fa.fa-globe
|
||||
| {{_ 'global-webhook'}}
|
||||
li(class="{{#if isAttachmentSettings}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="attachment-settings")
|
||||
i.fa.fa-paperclip
|
||||
| {{_ 'attachments'}}
|
||||
li(class="{{#if isCronSettings}}active{{/if}}")
|
||||
a.js-setting-menu(data-id="cron-settings")
|
||||
i.fa.fa-clock-o
|
||||
| {{_ 'cron'}}
|
||||
.main-body
|
||||
if loading.get
|
||||
if isLoading
|
||||
+spinner
|
||||
else if generalSetting.get
|
||||
else if isAttachmentSettings
|
||||
ul#attachment-setting.setting-detail
|
||||
li
|
||||
h3 {{_ 'attachment-storage-configuration'}}
|
||||
.form-group
|
||||
label {{_ 'writable-path'}}
|
||||
input.wekan-form-control#filesystem-path(type="text" value="{{filesystemPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'filesystem-path-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'attachments-path'}}
|
||||
input.wekan-form-control#attachments-path(type="text" value="{{attachmentsPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'attachments-path-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 'avatars-path'}}
|
||||
input.wekan-form-control#avatars-path(type="text" value="{{avatarsPath}}" readonly)
|
||||
small.form-text.text-muted {{_ 'avatars-path-description'}}
|
||||
|
||||
li
|
||||
h3 {{_ 'mongodb-gridfs-storage'}}
|
||||
.form-group
|
||||
label {{_ 'gridfs-enabled'}}
|
||||
input.wekan-form-control#gridfs-enabled(type="checkbox" checked="{{gridfsEnabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 'gridfs-enabled-description'}}
|
||||
|
||||
li
|
||||
h3 {{_ 's3-minio-storage'}}
|
||||
.form-group
|
||||
label {{_ 's3-enabled'}}
|
||||
input.wekan-form-control#s3-enabled(type="checkbox" checked="{{s3Enabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 's3-enabled-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-endpoint'}}
|
||||
input.wekan-form-control#s3-endpoint(type="text" value="{{s3Endpoint}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-endpoint-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-bucket'}}
|
||||
input.wekan-form-control#s3-bucket(type="text" value="{{s3Bucket}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-bucket-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-region'}}
|
||||
input.wekan-form-control#s3-region(type="text" value="{{s3Region}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-region-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-access-key'}}
|
||||
input.wekan-form-control#s3-access-key(type="text" placeholder="{{_ 's3-access-key-placeholder'}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-access-key-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-secret-key'}}
|
||||
input.wekan-form-control#s3-secret-key(type="password" placeholder="{{_ 's3-secret-key-placeholder'}}")
|
||||
small.form-text.text-muted {{_ 's3-secret-key-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-ssl-enabled'}}
|
||||
input.wekan-form-control#s3-ssl-enabled(type="checkbox" checked="{{s3SslEnabled}}" disabled)
|
||||
small.form-text.text-muted {{_ 's3-ssl-enabled-description'}}
|
||||
|
||||
.form-group
|
||||
label {{_ 's3-port'}}
|
||||
input.wekan-form-control#s3-port(type="number" value="{{s3Port}}" readonly)
|
||||
small.form-text.text-muted {{_ 's3-port-description'}}
|
||||
|
||||
.form-group
|
||||
button.js-test-s3-connection.btn.btn-secondary {{_ 'test-s3-connection'}}
|
||||
button.js-save-s3-settings.btn.btn-primary {{_ 'save-s3-settings'}}
|
||||
else if isCronSettings
|
||||
ul#cron-setting.setting-detail
|
||||
li
|
||||
h3 {{_ 'cron-migrations'}}
|
||||
.form-group
|
||||
label {{_ 'migration-status'}}
|
||||
.status-indicator
|
||||
span.status-label {{_ 'status'}}:
|
||||
span.status-value {{migrationStatus}}
|
||||
.progress-section
|
||||
.progress
|
||||
.progress-bar(role="progressbar" style="width: {{migrationProgress}}%" aria-valuenow="{{migrationProgress}}" aria-valuemin="0" aria-valuemax="100")
|
||||
| {{migrationProgress}}%
|
||||
.progress-text
|
||||
| {{migrationProgress}}% {{_ 'complete'}}
|
||||
|
||||
.form-group
|
||||
button.js-start-all-migrations.btn.btn-primary {{_ 'start-all-migrations'}}
|
||||
button.js-pause-all-migrations.btn.btn-warning {{_ 'pause-all-migrations'}}
|
||||
button.js-stop-all-migrations.btn.btn-danger {{_ 'stop-all-migrations'}}
|
||||
|
||||
li
|
||||
h3 {{_ 'board-operations'}}
|
||||
.form-group
|
||||
label {{_ 'scheduled-board-operations'}}
|
||||
button.js-schedule-board-cleanup.btn.btn-primary {{_ 'schedule-board-cleanup'}}
|
||||
button.js-schedule-board-archive.btn.btn-warning {{_ 'schedule-board-archive'}}
|
||||
button.js-schedule-board-backup.btn.btn-info {{_ 'schedule-board-backup'}}
|
||||
|
||||
li
|
||||
h3 {{_ 'cron-jobs'}}
|
||||
.form-group
|
||||
label {{_ 'active-cron-jobs'}}
|
||||
each cronJobs
|
||||
.job-item
|
||||
.job-info
|
||||
.job-name {{name}}
|
||||
.job-schedule {{schedule}}
|
||||
.job-description {{description}}
|
||||
.job-actions
|
||||
button.js-pause-job.btn.btn-sm.btn-warning(data-job-id="{{_id}}") {{_ 'pause'}}
|
||||
button.js-delete-job.btn.btn-sm.btn-danger(data-job-id="{{_id}}") {{_ 'delete'}}
|
||||
.add-job-section
|
||||
button.js-add-cron-job.btn.btn-success {{_ 'add-cron-job'}}
|
||||
else if isGeneralSetting
|
||||
+general
|
||||
else if emailSetting.get
|
||||
else if isEmailSetting
|
||||
unless isSandstorm
|
||||
+email
|
||||
else if accountSetting.get
|
||||
else if isAccountSetting
|
||||
+accountSettings
|
||||
else if tableVisibilityModeSetting.get
|
||||
else if isTableVisibilityModeSetting
|
||||
+tableVisibilityModeSettings
|
||||
else if announcementSetting.get
|
||||
else if isAnnouncementSetting
|
||||
+announcementSettings
|
||||
else if accessibilitySetting.get
|
||||
else if isAccessibilitySetting
|
||||
+accessibilitySettings
|
||||
else if layoutSetting.get
|
||||
else if isLayoutSetting
|
||||
+layoutSettings
|
||||
else if webhookSetting.get
|
||||
else if isWebhookSetting
|
||||
+webhookSettings
|
||||
|
||||
template(name="webhookSettings")
|
||||
|
||||
@@ -3,11 +3,12 @@ import { TAPi18n } from '/imports/i18n';
|
||||
import { ALLOWED_WAIT_SPINNERS } from '/config/const';
|
||||
import LockoutSettings from '/models/lockoutSettings';
|
||||
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.error = new ReactiveVar('');
|
||||
this.loading = new ReactiveVar(false);
|
||||
this.forgotPasswordSetting = new ReactiveVar(true);
|
||||
this.forgotPasswordSetting = new ReactiveVar(false);
|
||||
this.generalSetting = new ReactiveVar(true);
|
||||
this.emailSetting = new ReactiveVar(false);
|
||||
this.accountSetting = new ReactiveVar(false);
|
||||
@@ -16,6 +17,8 @@ BlazeComponent.extendComponent({
|
||||
this.accessibilitySetting = new ReactiveVar(false);
|
||||
this.layoutSetting = new ReactiveVar(false);
|
||||
this.webhookSetting = new ReactiveVar(false);
|
||||
this.attachmentSettings = new ReactiveVar(false);
|
||||
this.cronSettings = new ReactiveVar(false);
|
||||
|
||||
Meteor.subscribe('setting');
|
||||
Meteor.subscribe('mailServer');
|
||||
@@ -27,14 +30,243 @@ BlazeComponent.extendComponent({
|
||||
Meteor.subscribe('lockoutSettings');
|
||||
},
|
||||
|
||||
|
||||
setError(error) {
|
||||
this.error.set(error);
|
||||
},
|
||||
|
||||
// Template helpers moved to BlazeComponent - using different names to avoid conflicts
|
||||
isGeneralSetting() {
|
||||
return this.generalSetting && this.generalSetting.get();
|
||||
},
|
||||
isEmailSetting() {
|
||||
return this.emailSetting && this.emailSetting.get();
|
||||
},
|
||||
isAccountSetting() {
|
||||
return this.accountSetting && this.accountSetting.get();
|
||||
},
|
||||
isTableVisibilityModeSetting() {
|
||||
return this.tableVisibilityModeSetting && this.tableVisibilityModeSetting.get();
|
||||
},
|
||||
isAnnouncementSetting() {
|
||||
return this.announcementSetting && this.announcementSetting.get();
|
||||
},
|
||||
isAccessibilitySetting() {
|
||||
return this.accessibilitySetting && this.accessibilitySetting.get();
|
||||
},
|
||||
isLayoutSetting() {
|
||||
return this.layoutSetting && this.layoutSetting.get();
|
||||
},
|
||||
isWebhookSetting() {
|
||||
return this.webhookSetting && this.webhookSetting.get();
|
||||
},
|
||||
isAttachmentSettings() {
|
||||
return this.attachmentSettings && this.attachmentSettings.get();
|
||||
},
|
||||
isCronSettings() {
|
||||
return this.cronSettings && this.cronSettings.get();
|
||||
},
|
||||
isLoading() {
|
||||
return this.loading && this.loading.get();
|
||||
},
|
||||
|
||||
// Attachment settings helpers
|
||||
filesystemPath() {
|
||||
return process.env.WRITABLE_PATH || '/data';
|
||||
},
|
||||
|
||||
attachmentsPath() {
|
||||
const writablePath = process.env.WRITABLE_PATH || '/data';
|
||||
return `${writablePath}/attachments`;
|
||||
},
|
||||
|
||||
avatarsPath() {
|
||||
const writablePath = process.env.WRITABLE_PATH || '/data';
|
||||
return `${writablePath}/avatars`;
|
||||
},
|
||||
|
||||
gridfsEnabled() {
|
||||
return process.env.GRIDFS_ENABLED === 'true';
|
||||
},
|
||||
|
||||
s3Enabled() {
|
||||
return process.env.S3_ENABLED === 'true';
|
||||
},
|
||||
|
||||
s3Endpoint() {
|
||||
return process.env.S3_ENDPOINT || '';
|
||||
},
|
||||
|
||||
s3Bucket() {
|
||||
return process.env.S3_BUCKET || '';
|
||||
},
|
||||
|
||||
s3Region() {
|
||||
return process.env.S3_REGION || '';
|
||||
},
|
||||
|
||||
s3SslEnabled() {
|
||||
return process.env.S3_SSL_ENABLED === 'true';
|
||||
},
|
||||
|
||||
s3Port() {
|
||||
return process.env.S3_PORT || 443;
|
||||
},
|
||||
|
||||
// Cron settings helpers
|
||||
migrationStatus() {
|
||||
return TAPi18n.__('idle'); // Placeholder
|
||||
},
|
||||
|
||||
migrationProgress() {
|
||||
return 0; // Placeholder
|
||||
},
|
||||
|
||||
cronJobs() {
|
||||
return []; // Placeholder
|
||||
},
|
||||
|
||||
setLoading(w) {
|
||||
this.loading.set(w);
|
||||
},
|
||||
|
||||
// Event handlers for attachment settings
|
||||
'click button.js-test-s3-connection'(event) {
|
||||
event.preventDefault();
|
||||
const secretKey = $('#s3-secret-key').val();
|
||||
if (!secretKey) {
|
||||
alert(TAPi18n.__('s3-secret-key-required'));
|
||||
return;
|
||||
}
|
||||
|
||||
Meteor.call('testS3Connection', { secretKey }, (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('s3-connection-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('s3-connection-success'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click button.js-save-s3-settings'(event) {
|
||||
event.preventDefault();
|
||||
const secretKey = $('#s3-secret-key').val();
|
||||
if (!secretKey) {
|
||||
alert(TAPi18n.__('s3-secret-key-required'));
|
||||
return;
|
||||
}
|
||||
|
||||
Meteor.call('saveS3Settings', { secretKey }, (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('s3-settings-save-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('s3-settings-saved'));
|
||||
$('#s3-secret-key').val(''); // Clear the password field
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// Event handlers for cron settings
|
||||
'click button.js-start-all-migrations'(event) {
|
||||
event.preventDefault();
|
||||
Meteor.call('startAllMigrations', (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('migration-start-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('migration-started'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click button.js-pause-all-migrations'(event) {
|
||||
event.preventDefault();
|
||||
Meteor.call('pauseAllMigrations', (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('migration-pause-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('migration-paused'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click button.js-stop-all-migrations'(event) {
|
||||
event.preventDefault();
|
||||
if (confirm(TAPi18n.__('migration-stop-confirm'))) {
|
||||
Meteor.call('stopAllMigrations', (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('migration-stop-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('migration-stopped'));
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
'click button.js-schedule-board-cleanup'(event) {
|
||||
event.preventDefault();
|
||||
Meteor.call('scheduleBoardCleanup', (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('board-cleanup-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('board-cleanup-scheduled'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click button.js-schedule-board-archive'(event) {
|
||||
event.preventDefault();
|
||||
Meteor.call('scheduleBoardArchive', (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('board-archive-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('board-archive-scheduled'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click button.js-schedule-board-backup'(event) {
|
||||
event.preventDefault();
|
||||
Meteor.call('scheduleBoardBackup', (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('board-backup-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('board-backup-scheduled'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click button.js-pause-job'(event) {
|
||||
event.preventDefault();
|
||||
const jobId = $(event.target).data('job-id');
|
||||
Meteor.call('pauseCronJob', jobId, (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('cron-job-pause-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('cron-job-paused'));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click button.js-delete-job'(event) {
|
||||
event.preventDefault();
|
||||
const jobId = $(event.target).data('job-id');
|
||||
if (confirm(TAPi18n.__('cron-job-delete-confirm'))) {
|
||||
Meteor.call('deleteCronJob', jobId, (error, result) => {
|
||||
if (error) {
|
||||
alert(TAPi18n.__('cron-job-delete-failed') + ': ' + error.reason);
|
||||
} else {
|
||||
alert(TAPi18n.__('cron-job-deleted'));
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
'click button.js-add-cron-job'(event) {
|
||||
event.preventDefault();
|
||||
// Placeholder for adding a new cron job (e.g., open a modal)
|
||||
alert(TAPi18n.__('add-cron-job-placeholder'));
|
||||
},
|
||||
|
||||
checkField(selector) {
|
||||
const value = $(selector).val();
|
||||
if (!value || value.trim() === '') {
|
||||
@@ -99,21 +331,62 @@ BlazeComponent.extendComponent({
|
||||
toggleDisplayAuthenticationMethod() {
|
||||
$('#display-authentication-method').toggleClass('is-checked');
|
||||
},
|
||||
|
||||
initializeAttachmentSubMenu() {
|
||||
// Set default sub-menu state for attachment settings
|
||||
// This will be handled by the attachment settings component
|
||||
console.log('Initializing attachment sub-menu');
|
||||
},
|
||||
|
||||
initializeCronSubMenu() {
|
||||
// Set default sub-menu state for cron settings
|
||||
// This will be handled by the cron settings template
|
||||
console.log('Initializing cron sub-menu');
|
||||
},
|
||||
switchMenu(event) {
|
||||
const target = $(event.target);
|
||||
if (!target.hasClass('active')) {
|
||||
$('.side-menu li.active').removeClass('active');
|
||||
target.parent().addClass('active');
|
||||
const targetID = target.data('id');
|
||||
this.forgotPasswordSetting.set('forgot-password-setting' === targetID);
|
||||
this.generalSetting.set('registration-setting' === targetID);
|
||||
this.emailSetting.set('email-setting' === targetID);
|
||||
this.accountSetting.set('account-setting' === targetID);
|
||||
this.announcementSetting.set('announcement-setting' === targetID);
|
||||
this.accessibilitySetting.set('accessibility-setting' === targetID);
|
||||
this.layoutSetting.set('layout-setting' === targetID);
|
||||
this.webhookSetting.set('webhook-setting' === targetID);
|
||||
this.tableVisibilityModeSetting.set('tableVisibilityMode-setting' === targetID);
|
||||
|
||||
// Reset all settings to false
|
||||
this.forgotPasswordSetting.set(false);
|
||||
this.generalSetting.set(false);
|
||||
this.emailSetting.set(false);
|
||||
this.accountSetting.set(false);
|
||||
this.tableVisibilityModeSetting.set(false);
|
||||
this.announcementSetting.set(false);
|
||||
this.accessibilitySetting.set(false);
|
||||
this.layoutSetting.set(false);
|
||||
this.webhookSetting.set(false);
|
||||
this.attachmentSettings.set(false);
|
||||
this.cronSettings.set(false);
|
||||
|
||||
// Set the selected setting to true
|
||||
if (targetID === 'registration-setting') {
|
||||
this.generalSetting.set(true);
|
||||
} else if (targetID === 'email-setting') {
|
||||
this.emailSetting.set(true);
|
||||
} else if (targetID === 'account-setting') {
|
||||
this.accountSetting.set(true);
|
||||
} else if (targetID === 'tableVisibilityMode-setting') {
|
||||
this.tableVisibilityModeSetting.set(true);
|
||||
} else if (targetID === 'announcement-setting') {
|
||||
this.announcementSetting.set(true);
|
||||
} else if (targetID === 'accessibility-setting') {
|
||||
this.accessibilitySetting.set(true);
|
||||
} else if (targetID === 'layout-setting') {
|
||||
this.layoutSetting.set(true);
|
||||
} else if (targetID === 'webhook-setting') {
|
||||
this.webhookSetting.set(true);
|
||||
} else if (targetID === 'attachment-settings') {
|
||||
this.attachmentSettings.set(true);
|
||||
this.initializeAttachmentSubMenu();
|
||||
} else if (targetID === 'cron-settings') {
|
||||
this.cronSettings.set(true);
|
||||
this.initializeCronSubMenu();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -211,9 +484,6 @@ BlazeComponent.extendComponent({
|
||||
const displayAuthenticationMethod =
|
||||
$('input[name=displayAuthenticationMethod]:checked').val() === 'true';
|
||||
const defaultAuthenticationMethod = $('#defaultAuthenticationMethod').val();
|
||||
const accessibilityPageEnabled = $('input[name=accessibilityPageEnabled]:checked').val() === 'true';
|
||||
const accessibilityTitle = ($('#accessibility-title').val() || '').trim();
|
||||
const accessibilityContent = ($('#accessibility-content').val() || '').trim();
|
||||
const spinnerName = ($('#spinnerName').val() || '').trim();
|
||||
|
||||
try {
|
||||
@@ -237,9 +507,6 @@ BlazeComponent.extendComponent({
|
||||
oidcBtnText,
|
||||
mailDomainName,
|
||||
legalNotice,
|
||||
accessibilityPageEnabled,
|
||||
accessibilityTitle,
|
||||
accessibilityContent,
|
||||
},
|
||||
});
|
||||
} catch (e) {
|
||||
@@ -451,18 +718,27 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
saveAccessibility() {
|
||||
this.setLoading(true);
|
||||
const title = $('#admin-accessibility-title')
|
||||
.val()
|
||||
.trim();
|
||||
const content = $('#admin-accessibility-content')
|
||||
.val()
|
||||
.trim();
|
||||
AccessibilitySettings.update(AccessibilitySettings.findOne()._id, {
|
||||
$set: {
|
||||
title: title,
|
||||
body: content
|
||||
},
|
||||
});
|
||||
|
||||
try {
|
||||
AccessibilitySettings.update(AccessibilitySettings.findOne()._id, {
|
||||
$set: {
|
||||
title: title,
|
||||
body: content
|
||||
},
|
||||
});
|
||||
} catch (e) {
|
||||
console.error('Error saving accessibility settings:', e);
|
||||
return;
|
||||
} finally {
|
||||
this.setLoading(false);
|
||||
}
|
||||
},
|
||||
|
||||
toggleAccessibility() {
|
||||
@@ -525,3 +801,4 @@ Template.selectSpinnerName.helpers({
|
||||
return Template.instance().data.spinnerName === match;
|
||||
},
|
||||
});
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
.main-body {
|
||||
overflow: scroll;
|
||||
}
|
||||
/* Scrollbar styles are now handled by settingBody.css for all admin pages */
|
||||
table {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
@@ -284,6 +284,12 @@ template(name="boardCardSettingsPopup")
|
||||
span
|
||||
i.fa.fa-tags
|
||||
| {{_ 'labels'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-show-lists-on-minicard(class="{{#if allowsShowListsOnMinicard}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsShowListsOnMinicard}}is-checked{{/if}}")
|
||||
span
|
||||
i.fa.fa-list
|
||||
| {{_ 'card-show-lists-on-minicard'}}
|
||||
div.check-div
|
||||
a.flex.js-field-has-card-number(class="{{#if allowsCardNumber}}is-checked{{/if}}")
|
||||
.materialCheckBox(class="{{#if allowsCardNumber}}is-checked{{/if}}")
|
||||
|
||||
@@ -65,8 +65,10 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
reachNextPeak() {
|
||||
const activitiesComponent = this.childComponents('activities')[0];
|
||||
activitiesComponent.loadNextPage();
|
||||
const activitiesChildren = this.childComponents('activities');
|
||||
if (activitiesChildren && activitiesChildren.length > 0 && activitiesChildren[0] && typeof activitiesChildren[0].loadNextPage === 'function') {
|
||||
activitiesChildren[0].loadNextPage();
|
||||
}
|
||||
},
|
||||
|
||||
isTongueHidden() {
|
||||
@@ -996,10 +998,15 @@ BlazeComponent.extendComponent({
|
||||
return this.currentBoard.allowsShowLists;
|
||||
},
|
||||
|
||||
|
||||
allowsLabels() {
|
||||
return this.currentBoard.allowsLabels;
|
||||
},
|
||||
|
||||
allowsShowListsOnMinicard() {
|
||||
return this.currentBoard.allowsShowListsOnMinicard;
|
||||
},
|
||||
|
||||
allowsChecklists() {
|
||||
return this.currentBoard.allowsChecklists;
|
||||
},
|
||||
@@ -1282,13 +1289,29 @@ BlazeComponent.extendComponent({
|
||||
this.currentBoard.setAllowsLabels(this.currentBoard.allowsLabels);
|
||||
$(`.js-field-has-labels ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsAssignee,
|
||||
this.currentBoard.allowsLabels,
|
||||
);
|
||||
$('.js-field-has-labels').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsLabels,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-card-show-lists-on-minicard'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsShowListsOnMinicard = !this.currentBoard
|
||||
.allowsShowListsOnMinicard;
|
||||
this.currentBoard.setAllowsShowListsOnMinicard(
|
||||
this.currentBoard.allowsShowListsOnMinicard,
|
||||
);
|
||||
$(`.js-field-has-card-show-lists-on-minicard ${MCB}`).toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsShowListsOnMinicard,
|
||||
);
|
||||
$('.js-field-has-card-show-lists-on-minicard').toggleClass(
|
||||
CKCLS,
|
||||
this.currentBoard.allowsShowListsOnMinicard,
|
||||
);
|
||||
},
|
||||
'click .js-field-has-description-title'(evt) {
|
||||
evt.preventDefault();
|
||||
this.currentBoard.allowsDescriptionTitle = !this.currentBoard
|
||||
|
||||
@@ -89,22 +89,28 @@ template(name="swimlaneAddPopup")
|
||||
a.js-swimlane-template {{_ 'template'}}
|
||||
|
||||
template(name="setSwimlaneColorPopup")
|
||||
form.edit-label
|
||||
.palette-colors: each colors
|
||||
span.card-label.palette-color.js-palette-color(class="card-details-{{color}}")
|
||||
if(isSelected color)
|
||||
i.fa.fa-check
|
||||
button.primary.confirm.js-submit {{_ 'save'}}
|
||||
button.js-remove-color.negate.wide.right {{_ 'unset-color'}}
|
||||
form.edit-label.swimlane-color-popup
|
||||
// Align content to left and remove default gutter
|
||||
.flush-left
|
||||
.palette-colors(style="margin-left:0; padding-left:0; justify-content:flex-start;")
|
||||
each colors
|
||||
span.card-label.palette-color.js-palette-color(class="card-details-{{color}}")
|
||||
if(isSelected color)
|
||||
i.fa.fa-check
|
||||
// Buttons aligned left too
|
||||
.flush-left
|
||||
button.primary.confirm.js-submit(style="margin-left:0") {{_ 'save'}}
|
||||
button.js-remove-color.negate.wide.right(style="margin-left:8px") {{_ 'unset-color'}}
|
||||
|
||||
template(name="setSwimlaneHeightPopup")
|
||||
#js-swimlane-height-edit
|
||||
label a) {{_ 'set-swimlane-height-value'}}
|
||||
label b) -1
|
||||
p
|
||||
input.swimlane-height-value(type="number" value="{{ swimlaneHeightValue }}" min="100")
|
||||
input.swimlane-height-apply(type="submit" value="{{_ 'apply'}}")
|
||||
input.swimlane-height-error
|
||||
.flush-left.swimlane-height-popup
|
||||
#js-swimlane-height-edit
|
||||
label a) {{_ 'set-swimlane-height-value'}}
|
||||
label b) -1
|
||||
p
|
||||
input.swimlane-height-value(type="number" value="{{ swimlaneHeightValue }}" min="100")
|
||||
input.swimlane-height-apply(type="submit" value="{{_ 'apply'}}")
|
||||
input.swimlane-height-error
|
||||
|
||||
template(name="swimlaneHeightErrorPopup")
|
||||
.swimlane-height-invalid
|
||||
|
||||
@@ -67,11 +67,16 @@
|
||||
text-overflow: ellipsis;
|
||||
word-wrap: break-word;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
z-index: 10;
|
||||
pointer-events: auto;
|
||||
}
|
||||
.swimlane .swimlane-header-wrap .swimlane-header-menu {
|
||||
position: absolute;
|
||||
padding: 5px 5px;
|
||||
font-size: 22px;
|
||||
z-index: 20;
|
||||
pointer-events: auto;
|
||||
}
|
||||
@media print {
|
||||
.swimlane .swimlane-header-wrap .swimlane-header-menu {
|
||||
@@ -97,6 +102,9 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: move;
|
||||
z-index: 15;
|
||||
pointer-events: auto;
|
||||
}
|
||||
.swimlane .swimlane-header-wrap .swimlane-header-miniscreen-handle {
|
||||
position: absolute;
|
||||
@@ -105,6 +113,16 @@
|
||||
transform: translateY(-50%);
|
||||
left: 87vw;
|
||||
font-size: 24px;
|
||||
cursor: move;
|
||||
z-index: 15;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
/* Safety: ensure wrapper is interactive and above list content */
|
||||
.swimlane .swimlane-header-wrap {
|
||||
position: relative;
|
||||
z-index: 9;
|
||||
pointer-events: auto;
|
||||
}
|
||||
#js-swimlane-height-edit .swimlane-height-error {
|
||||
display: none;
|
||||
|
||||
@@ -104,8 +104,8 @@ function initSortable(boardComponent, $listsDom) {
|
||||
}
|
||||
}
|
||||
|
||||
// Get the original swimlane ID of the list
|
||||
const originalSwimlaneId = list.swimlaneId;
|
||||
// Get the original swimlane ID of the list (handle backward compatibility)
|
||||
const originalSwimlaneId = list.getEffectiveSwimlaneId ? list.getEffectiveSwimlaneId() : (list.swimlaneId || null);
|
||||
|
||||
/*
|
||||
Reverted incomplete change list width,
|
||||
|
||||
@@ -23,7 +23,7 @@ Template.userAvatar.helpers({
|
||||
/*
|
||||
presenceStatusClassName() {
|
||||
const user = ReactiveCache.getUser(this.userId);
|
||||
const userPresence = presences.findOne({ userId: this.userId });
|
||||
const userPresence = Presences.findOne({ userId: this.userId });
|
||||
if (user && user.isInvitedTo(Session.get('currentBoard'))) return 'pending';
|
||||
else if (!userPresence) return 'disconnected';
|
||||
else if (Session.equals('currentBoard', userPresence.state.currentBoardId))
|
||||
|
||||
@@ -12,6 +12,11 @@ template(name="headerUserBar")
|
||||
|
||||
template(name="memberMenuPopup")
|
||||
ul.pop-over-list
|
||||
// Bookmarks at the very top
|
||||
li
|
||||
a.js-open-bookmarks
|
||||
i.fa.fa-bookmark
|
||||
| {{_ 'bookmarks'}}
|
||||
with currentUser
|
||||
li
|
||||
a.js-my-cards(href="{{pathFor 'my-cards'}}")
|
||||
@@ -37,6 +42,15 @@ template(name="memberMenuPopup")
|
||||
a.board-header-btn.js-open-archived-board
|
||||
i.fa.fa-archive
|
||||
span {{_ 'archives'}}
|
||||
li
|
||||
a.js-notifications-drawer-toggle
|
||||
i.fa.fa-bell
|
||||
| {{_ 'notifications'}}
|
||||
if currentSetting.customHelpLinkUrl
|
||||
li
|
||||
a(href="{{currentSetting.customHelpLinkUrl}}", title="{{_ 'help'}}", target="_blank", rel="noopener noreferrer")
|
||||
i.fa.fa-question
|
||||
| {{_ 'help'}}
|
||||
unless currentUser.isWorker
|
||||
ul.pop-over-list
|
||||
li
|
||||
|
||||
@@ -62,6 +62,15 @@ Template.memberMenuPopup.helpers({
|
||||
});
|
||||
|
||||
Template.memberMenuPopup.events({
|
||||
'click .js-open-bookmarks'(e) {
|
||||
e.preventDefault();
|
||||
if (Utils.isMiniScreen()) {
|
||||
FlowRouter.go('bookmarks');
|
||||
Popup.back();
|
||||
} else {
|
||||
Popup.open('bookmarksPopup')(e);
|
||||
}
|
||||
},
|
||||
'click .js-my-cards'() {
|
||||
Popup.back();
|
||||
},
|
||||
@@ -78,6 +87,9 @@ Template.memberMenuPopup.events({
|
||||
'click .js-change-password': Popup.open('changePassword'),
|
||||
'click .js-change-language': Popup.open('changeLanguage'),
|
||||
'click .js-support': Popup.open('support'),
|
||||
'click .js-notifications-drawer-toggle'() {
|
||||
Session.set('showNotificationsDrawer', !Session.get('showNotificationsDrawer'));
|
||||
},
|
||||
'click .js-logout'(event) {
|
||||
event.preventDefault();
|
||||
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
/**
|
||||
* Attachment Migration Manager
|
||||
* Handles migration of attachments from old structure to new structure
|
||||
* with UI feedback and spinners for unconverted attachments
|
||||
*/
|
||||
|
||||
import { ReactiveVar } from 'meteor/reactive-var';
|
||||
import { ReactiveCache } from '/imports/reactiveCache';
|
||||
|
||||
// Reactive variables for attachment migration progress
|
||||
export const attachmentMigrationProgress = new ReactiveVar(0);
|
||||
export const attachmentMigrationStatus = new ReactiveVar('');
|
||||
export const isMigratingAttachments = new ReactiveVar(false);
|
||||
export const unconvertedAttachments = new ReactiveVar([]);
|
||||
|
||||
// Global tracking of migrated boards (persistent across component reinitializations)
|
||||
const globalMigratedBoards = new Set();
|
||||
|
||||
class AttachmentMigrationManager {
|
||||
constructor() {
|
||||
this.migrationCache = new Map(); // Cache migrated attachment IDs
|
||||
this.migratedBoards = new Set(); // Track boards that have been migrated
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an attachment needs migration
|
||||
* @param {string} attachmentId - The attachment ID to check
|
||||
* @returns {boolean} - True if attachment needs migration
|
||||
*/
|
||||
needsMigration(attachmentId) {
|
||||
if (this.migrationCache.has(attachmentId)) {
|
||||
return false; // Already migrated
|
||||
}
|
||||
|
||||
try {
|
||||
const attachment = ReactiveCache.getAttachment(attachmentId);
|
||||
if (!attachment) return false;
|
||||
|
||||
// Check if attachment has old structure (no meta field or missing required fields)
|
||||
return !attachment.meta ||
|
||||
!attachment.meta.cardId ||
|
||||
!attachment.meta.boardId ||
|
||||
!attachment.meta.listId;
|
||||
} catch (error) {
|
||||
console.error('Error checking if attachment needs migration:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a board has been migrated
|
||||
* @param {string} boardId - The board ID
|
||||
* @returns {boolean} - True if board has been migrated
|
||||
*/
|
||||
isBoardMigrated(boardId) {
|
||||
return globalMigratedBoards.has(boardId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a board has been migrated (server-side check)
|
||||
* @param {string} boardId - The board ID
|
||||
* @returns {Promise<boolean>} - True if board has been migrated
|
||||
*/
|
||||
async isBoardMigratedServer(boardId) {
|
||||
return new Promise((resolve) => {
|
||||
Meteor.call('attachmentMigration.isBoardMigrated', boardId, (error, result) => {
|
||||
if (error) {
|
||||
console.error('Error checking board migration status:', error);
|
||||
resolve(false);
|
||||
} else {
|
||||
resolve(result);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all unconverted attachments for a board
|
||||
* @param {string} boardId - The board ID
|
||||
* @returns {Array} - Array of unconverted attachments
|
||||
*/
|
||||
getUnconvertedAttachments(boardId) {
|
||||
try {
|
||||
const attachments = ReactiveCache.getAttachments({
|
||||
'meta.boardId': boardId
|
||||
});
|
||||
|
||||
return attachments.filter(attachment => this.needsMigration(attachment._id));
|
||||
} catch (error) {
|
||||
console.error('Error getting unconverted attachments:', error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start migration for attachments in a board
|
||||
* @param {string} boardId - The board ID
|
||||
*/
|
||||
async startAttachmentMigration(boardId) {
|
||||
if (isMigratingAttachments.get()) {
|
||||
return; // Already migrating
|
||||
}
|
||||
|
||||
// Check if this board has already been migrated (client-side check first)
|
||||
if (globalMigratedBoards.has(boardId)) {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Board ${boardId} has already been migrated (client-side), skipping`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Double-check with server-side check
|
||||
const serverMigrated = await this.isBoardMigratedServer(boardId);
|
||||
if (serverMigrated) {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Board ${boardId} has already been migrated (server-side), skipping`);
|
||||
}
|
||||
globalMigratedBoards.add(boardId); // Sync client-side tracking
|
||||
return;
|
||||
}
|
||||
|
||||
isMigratingAttachments.set(true);
|
||||
attachmentMigrationStatus.set('Starting attachment migration...');
|
||||
attachmentMigrationProgress.set(0);
|
||||
|
||||
try {
|
||||
const unconverted = this.getUnconvertedAttachments(boardId);
|
||||
unconvertedAttachments.set(unconverted);
|
||||
|
||||
if (unconverted.length === 0) {
|
||||
attachmentMigrationStatus.set('All attachments are already migrated');
|
||||
attachmentMigrationProgress.set(100);
|
||||
isMigratingAttachments.set(false);
|
||||
globalMigratedBoards.add(boardId); // Mark board as migrated
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Board ${boardId} has no attachments to migrate, marked as migrated`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Start server-side migration
|
||||
Meteor.call('attachmentMigration.migrateBoardAttachments', boardId, (error, result) => {
|
||||
if (error) {
|
||||
console.error('Failed to start attachment migration:', error);
|
||||
const errorMessage = error.message || error.reason || error.toString();
|
||||
attachmentMigrationStatus.set(`Migration failed: ${errorMessage}`);
|
||||
isMigratingAttachments.set(false);
|
||||
} else {
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log('Attachment migration started for board:', boardId);
|
||||
}
|
||||
this.pollAttachmentMigrationProgress(boardId);
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error starting attachment migration:', error);
|
||||
attachmentMigrationStatus.set(`Migration failed: ${error.message}`);
|
||||
isMigratingAttachments.set(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Poll for attachment migration progress
|
||||
* @param {string} boardId - The board ID
|
||||
*/
|
||||
pollAttachmentMigrationProgress(boardId) {
|
||||
const pollInterval = setInterval(() => {
|
||||
Meteor.call('attachmentMigration.getProgress', boardId, (error, result) => {
|
||||
if (error) {
|
||||
console.error('Error getting migration progress:', error);
|
||||
clearInterval(pollInterval);
|
||||
isMigratingAttachments.set(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (result) {
|
||||
attachmentMigrationProgress.set(result.progress);
|
||||
attachmentMigrationStatus.set(result.status);
|
||||
unconvertedAttachments.set(result.unconvertedAttachments || []);
|
||||
|
||||
// Stop polling if migration is complete
|
||||
if (result.progress >= 100 || result.status === 'completed') {
|
||||
clearInterval(pollInterval);
|
||||
isMigratingAttachments.set(false);
|
||||
this.migrationCache.clear(); // Clear cache to refresh data
|
||||
globalMigratedBoards.add(boardId); // Mark board as migrated
|
||||
if (process.env.DEBUG === 'true') {
|
||||
console.log(`Board ${boardId} migration completed and marked as migrated`);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an attachment is currently being migrated
|
||||
* @param {string} attachmentId - The attachment ID
|
||||
* @returns {boolean} - True if attachment is being migrated
|
||||
*/
|
||||
isAttachmentBeingMigrated(attachmentId) {
|
||||
const unconverted = unconvertedAttachments.get();
|
||||
return unconverted.some(attachment => attachment._id === attachmentId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get migration status for an attachment
|
||||
* @param {string} attachmentId - The attachment ID
|
||||
* @returns {string} - Migration status ('migrated', 'migrating', 'unmigrated')
|
||||
*/
|
||||
getAttachmentMigrationStatus(attachmentId) {
|
||||
if (this.migrationCache.has(attachmentId)) {
|
||||
return 'migrated';
|
||||
}
|
||||
|
||||
if (this.isAttachmentBeingMigrated(attachmentId)) {
|
||||
return 'migrating';
|
||||
}
|
||||
|
||||
return this.needsMigration(attachmentId) ? 'unmigrated' : 'migrated';
|
||||
}
|
||||
}
|
||||
|
||||
export const attachmentMigrationManager = new AttachmentMigrationManager();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,226 @@
|
||||
/**
|
||||
* Board Conversion Service
|
||||
* Handles conversion of boards from old database structure to new structure
|
||||
* without running migrations that could cause downtime
|
||||
*/
|
||||
|
||||
import { ReactiveVar } from 'meteor/reactive-var';
|
||||
import { ReactiveCache } from '/imports/reactiveCache';
|
||||
import Lists from '/models/lists';
|
||||
|
||||
// Reactive variables for conversion progress
|
||||
export const conversionProgress = new ReactiveVar(0);
|
||||
export const conversionStatus = new ReactiveVar('');
|
||||
export const conversionEstimatedTime = new ReactiveVar('');
|
||||
export const isConverting = new ReactiveVar(false);
|
||||
|
||||
// Global tracking of converted boards (persistent across component reinitializations)
|
||||
const globalConvertedBoards = new Set();
|
||||
|
||||
class BoardConverter {
|
||||
constructor() {
|
||||
this.conversionCache = new Map(); // Cache converted board IDs
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a board has been converted
|
||||
* @param {string} boardId - The board ID
|
||||
* @returns {boolean} - True if board has been converted
|
||||
*/
|
||||
isBoardConverted(boardId) {
|
||||
return globalConvertedBoards.has(boardId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a board needs conversion
|
||||
* @param {string} boardId - The board ID to check
|
||||
* @returns {boolean} - True if board needs conversion
|
||||
*/
|
||||
needsConversion(boardId) {
|
||||
if (this.conversionCache.has(boardId)) {
|
||||
return false; // Already converted
|
||||
}
|
||||
|
||||
try {
|
||||
const board = ReactiveCache.getBoard(boardId);
|
||||
if (!board) return false;
|
||||
|
||||
// Check if any lists in this board don't have swimlaneId
|
||||
const lists = ReactiveCache.getLists({
|
||||
boardId: boardId,
|
||||
$or: [
|
||||
{ swimlaneId: { $exists: false } },
|
||||
{ swimlaneId: '' },
|
||||
{ swimlaneId: null }
|
||||
]
|
||||
});
|
||||
|
||||
return lists.length > 0;
|
||||
} catch (error) {
|
||||
console.error('Error checking if board needs conversion:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a board from old structure to new structure
|
||||
* @param {string} boardId - The board ID to convert
|
||||
* @returns {Promise<boolean>} - True if conversion was successful
|
||||
*/
|
||||
async convertBoard(boardId) {
|
||||
// Check if board has already been converted
|
||||
if (this.isBoardConverted(boardId)) {
|
||||
console.log(`Board ${boardId} has already been converted, skipping`);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (this.conversionCache.has(boardId)) {
|
||||
return true; // Already converted
|
||||
}
|
||||
|
||||
isConverting.set(true);
|
||||
conversionProgress.set(0);
|
||||
conversionStatus.set('Starting board conversion...');
|
||||
|
||||
try {
|
||||
const board = ReactiveCache.getBoard(boardId);
|
||||
if (!board) {
|
||||
throw new Error('Board not found');
|
||||
}
|
||||
|
||||
// Get the default swimlane for this board
|
||||
const defaultSwimlane = board.getDefaultSwimline();
|
||||
if (!defaultSwimlane) {
|
||||
throw new Error('No default swimlane found for board');
|
||||
}
|
||||
|
||||
// Get all lists that need conversion
|
||||
const listsToConvert = ReactiveCache.getLists({
|
||||
boardId: boardId,
|
||||
$or: [
|
||||
{ swimlaneId: { $exists: false } },
|
||||
{ swimlaneId: '' },
|
||||
{ swimlaneId: null }
|
||||
]
|
||||
});
|
||||
|
||||
if (listsToConvert.length === 0) {
|
||||
this.conversionCache.set(boardId, true);
|
||||
globalConvertedBoards.add(boardId); // Mark board as converted
|
||||
isConverting.set(false);
|
||||
console.log(`Board ${boardId} has no lists to convert, marked as converted`);
|
||||
return true;
|
||||
}
|
||||
|
||||
conversionStatus.set(`Converting ${listsToConvert.length} lists...`);
|
||||
|
||||
const startTime = Date.now();
|
||||
const totalLists = listsToConvert.length;
|
||||
let convertedLists = 0;
|
||||
|
||||
// Convert lists in batches to avoid blocking the UI
|
||||
const batchSize = 10;
|
||||
for (let i = 0; i < listsToConvert.length; i += batchSize) {
|
||||
const batch = listsToConvert.slice(i, i + batchSize);
|
||||
|
||||
// Process batch
|
||||
await this.processBatch(batch, defaultSwimlane._id);
|
||||
|
||||
convertedLists += batch.length;
|
||||
const progress = Math.round((convertedLists / totalLists) * 100);
|
||||
conversionProgress.set(progress);
|
||||
|
||||
// Calculate estimated time remaining
|
||||
const elapsed = Date.now() - startTime;
|
||||
const rate = convertedLists / elapsed; // lists per millisecond
|
||||
const remaining = totalLists - convertedLists;
|
||||
const estimatedMs = remaining / rate;
|
||||
|
||||
conversionStatus.set(`Converting list ${convertedLists} of ${totalLists}...`);
|
||||
conversionEstimatedTime.set(this.formatTime(estimatedMs));
|
||||
|
||||
// Allow UI to update
|
||||
await new Promise(resolve => setTimeout(resolve, 10));
|
||||
}
|
||||
|
||||
// Mark as converted
|
||||
this.conversionCache.set(boardId, true);
|
||||
globalConvertedBoards.add(boardId); // Mark board as converted
|
||||
|
||||
conversionStatus.set('Board conversion completed!');
|
||||
conversionProgress.set(100);
|
||||
console.log(`Board ${boardId} conversion completed and marked as converted`);
|
||||
|
||||
// Clear status after a delay
|
||||
setTimeout(() => {
|
||||
isConverting.set(false);
|
||||
conversionStatus.set('');
|
||||
conversionProgress.set(0);
|
||||
conversionEstimatedTime.set('');
|
||||
}, 2000);
|
||||
|
||||
return true;
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error converting board:', error);
|
||||
conversionStatus.set(`Conversion failed: ${error.message}`);
|
||||
isConverting.set(false);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a batch of lists for conversion
|
||||
* @param {Array} batch - Array of lists to convert
|
||||
* @param {string} defaultSwimlaneId - Default swimlane ID
|
||||
*/
|
||||
async processBatch(batch, defaultSwimlaneId) {
|
||||
const updates = batch.map(list => ({
|
||||
_id: list._id,
|
||||
swimlaneId: defaultSwimlaneId
|
||||
}));
|
||||
|
||||
// Update lists in batch
|
||||
updates.forEach(update => {
|
||||
Lists.update(update._id, {
|
||||
$set: { swimlaneId: update.swimlaneId }
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Format time in milliseconds to human readable format
|
||||
* @param {number} ms - Time in milliseconds
|
||||
* @returns {string} - Formatted time string
|
||||
*/
|
||||
formatTime(ms) {
|
||||
if (ms < 1000) {
|
||||
return `${Math.round(ms)}ms`;
|
||||
}
|
||||
|
||||
const seconds = Math.floor(ms / 1000);
|
||||
const minutes = Math.floor(seconds / 60);
|
||||
const hours = Math.floor(minutes / 60);
|
||||
|
||||
if (hours > 0) {
|
||||
const remainingMinutes = minutes % 60;
|
||||
const remainingSeconds = seconds % 60;
|
||||
return `${hours}h ${remainingMinutes}m ${remainingSeconds}s`;
|
||||
} else if (minutes > 0) {
|
||||
const remainingSeconds = seconds % 60;
|
||||
return `${minutes}m ${remainingSeconds}s`;
|
||||
} else {
|
||||
return `${seconds}s`;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear conversion cache (useful for testing)
|
||||
*/
|
||||
clearCache() {
|
||||
this.conversionCache.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// Export singleton instance
|
||||
export const boardConverter = new BoardConverter();
|
||||
@@ -0,0 +1,798 @@
|
||||
/**
|
||||
* Migration Manager
|
||||
* Handles all database migrations as steps during board loading
|
||||
* with detailed progress tracking and background persistence
|
||||
*/
|
||||
|
||||
import { ReactiveVar } from 'meteor/reactive-var';
|
||||
import { ReactiveCache } from '/imports/reactiveCache';
|
||||
|
||||
// Reactive variables for migration progress
|
||||
export const migrationProgress = new ReactiveVar(0);
|
||||
export const migrationStatus = new ReactiveVar('');
|
||||
export const migrationCurrentStep = new ReactiveVar('');
|
||||
export const migrationSteps = new ReactiveVar([]);
|
||||
export const isMigrating = new ReactiveVar(false);
|
||||
export const migrationEstimatedTime = new ReactiveVar('');
|
||||
|
||||
class MigrationManager {
|
||||
constructor() {
|
||||
this.migrationCache = new Map(); // Cache completed migrations
|
||||
this.steps = this.initializeMigrationSteps();
|
||||
this.currentStepIndex = 0;
|
||||
this.startTime = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize all migration steps with their details
|
||||
*/
|
||||
initializeMigrationSteps() {
|
||||
return [
|
||||
{
|
||||
id: 'board-background-color',
|
||||
name: 'Board Background Colors',
|
||||
description: 'Setting up board background colors',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-cardcounterlist-allowed',
|
||||
name: 'Card Counter List Settings',
|
||||
description: 'Adding card counter list permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-boardmemberlist-allowed',
|
||||
name: 'Board Member List Settings',
|
||||
description: 'Adding board member list permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'lowercase-board-permission',
|
||||
name: 'Board Permission Standardization',
|
||||
description: 'Converting board permissions to lowercase',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'change-attachments-type-for-non-images',
|
||||
name: 'Attachment Type Standardization',
|
||||
description: 'Updating attachment types for non-images',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'card-covers',
|
||||
name: 'Card Covers System',
|
||||
description: 'Setting up card cover functionality',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'use-css-class-for-boards-colors',
|
||||
name: 'Board Color CSS Classes',
|
||||
description: 'Converting board colors to CSS classes',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'denormalize-star-number-per-board',
|
||||
name: 'Board Star Counts',
|
||||
description: 'Calculating star counts per board',
|
||||
weight: 3,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-member-isactive-field',
|
||||
name: 'Member Activity Status',
|
||||
description: 'Adding member activity tracking',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-sort-checklists',
|
||||
name: 'Checklist Sorting',
|
||||
description: 'Adding sort order to checklists',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-swimlanes',
|
||||
name: 'Swimlanes System',
|
||||
description: 'Setting up swimlanes functionality',
|
||||
weight: 4,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-views',
|
||||
name: 'Board Views',
|
||||
description: 'Adding board view options',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-checklist-items',
|
||||
name: 'Checklist Items',
|
||||
description: 'Setting up checklist items system',
|
||||
weight: 3,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-card-types',
|
||||
name: 'Card Types',
|
||||
description: 'Adding card type functionality',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-custom-fields-to-cards',
|
||||
name: 'Custom Fields',
|
||||
description: 'Adding custom fields to cards',
|
||||
weight: 3,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-requester-field',
|
||||
name: 'Requester Field',
|
||||
description: 'Adding requester field to cards',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-assigner-field',
|
||||
name: 'Assigner Field',
|
||||
description: 'Adding assigner field to cards',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-parent-field-to-cards',
|
||||
name: 'Card Parent Relationships',
|
||||
description: 'Adding parent field to cards',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-subtasks-boards',
|
||||
name: 'Subtasks Boards',
|
||||
description: 'Setting up subtasks board functionality',
|
||||
weight: 3,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-subtasks-sort',
|
||||
name: 'Subtasks Sorting',
|
||||
description: 'Adding sort order to subtasks',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-subtasks-allowed',
|
||||
name: 'Subtasks Permissions',
|
||||
description: 'Adding subtasks permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-authenticationMethod',
|
||||
name: 'Authentication Methods',
|
||||
description: 'Adding authentication method tracking',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'remove-tag',
|
||||
name: 'Remove Tag Field',
|
||||
description: 'Removing deprecated tag field',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'remove-customFields-references-broken',
|
||||
name: 'Fix Custom Fields References',
|
||||
description: 'Fixing broken custom field references',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-product-name',
|
||||
name: 'Product Name Settings',
|
||||
description: 'Adding product name configuration',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-hide-logo',
|
||||
name: 'Hide Logo Setting',
|
||||
description: 'Adding hide logo option',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-hide-card-counter-list',
|
||||
name: 'Hide Card Counter Setting',
|
||||
description: 'Adding hide card counter option',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-hide-board-member-list',
|
||||
name: 'Hide Board Member List Setting',
|
||||
description: 'Adding hide board member list option',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-displayAuthenticationMethod',
|
||||
name: 'Display Authentication Method',
|
||||
description: 'Adding authentication method display option',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-defaultAuthenticationMethod',
|
||||
name: 'Default Authentication Method',
|
||||
description: 'Setting default authentication method',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-templates',
|
||||
name: 'Board Templates',
|
||||
description: 'Setting up board templates system',
|
||||
weight: 3,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'fix-circular-reference_',
|
||||
name: 'Fix Circular References',
|
||||
description: 'Fixing circular references in cards',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'mutate-boardIds-in-customfields',
|
||||
name: 'Custom Fields Board IDs',
|
||||
description: 'Updating board IDs in custom fields',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-missing-created-and-modified',
|
||||
name: 'Missing Timestamps',
|
||||
description: 'Adding missing created and modified timestamps',
|
||||
weight: 4,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'fix-incorrect-dates',
|
||||
name: 'Fix Incorrect Dates',
|
||||
description: 'Correcting incorrect date values',
|
||||
weight: 3,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-assignee',
|
||||
name: 'Assignee Field',
|
||||
description: 'Adding assignee field to cards',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-profile-showDesktopDragHandles',
|
||||
name: 'Desktop Drag Handles',
|
||||
description: 'Adding desktop drag handles preference',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-profile-hiddenMinicardLabelText',
|
||||
name: 'Hidden Minicard Labels',
|
||||
description: 'Adding hidden minicard label text preference',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-receiveddate-allowed',
|
||||
name: 'Received Date Permissions',
|
||||
description: 'Adding received date permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-startdate-allowed',
|
||||
name: 'Start Date Permissions',
|
||||
description: 'Adding start date permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-duedate-allowed',
|
||||
name: 'Due Date Permissions',
|
||||
description: 'Adding due date permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-enddate-allowed',
|
||||
name: 'End Date Permissions',
|
||||
description: 'Adding end date permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-members-allowed',
|
||||
name: 'Members Permissions',
|
||||
description: 'Adding members permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-assignee-allowed',
|
||||
name: 'Assignee Permissions',
|
||||
description: 'Adding assignee permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-labels-allowed',
|
||||
name: 'Labels Permissions',
|
||||
description: 'Adding labels permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-checklists-allowed',
|
||||
name: 'Checklists Permissions',
|
||||
description: 'Adding checklists permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-attachments-allowed',
|
||||
name: 'Attachments Permissions',
|
||||
description: 'Adding attachments permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-comments-allowed',
|
||||
name: 'Comments Permissions',
|
||||
description: 'Adding comments permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-assigned-by-allowed',
|
||||
name: 'Assigned By Permissions',
|
||||
description: 'Adding assigned by permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-requested-by-allowed',
|
||||
name: 'Requested By Permissions',
|
||||
description: 'Adding requested by permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-activities-allowed',
|
||||
name: 'Activities Permissions',
|
||||
description: 'Adding activities permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-description-title-allowed',
|
||||
name: 'Description Title Permissions',
|
||||
description: 'Adding description title permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-description-text-allowed',
|
||||
name: 'Description Text Permissions',
|
||||
description: 'Adding description text permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-description-text-allowed-on-minicard',
|
||||
name: 'Minicard Description Permissions',
|
||||
description: 'Adding minicard description permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-sort-field-to-boards',
|
||||
name: 'Board Sort Field',
|
||||
description: 'Adding sort field to boards',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-default-profile-view',
|
||||
name: 'Default Profile View',
|
||||
description: 'Setting default profile view',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-hide-logo-by-default',
|
||||
name: 'Hide Logo Default',
|
||||
description: 'Setting hide logo as default',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-hide-card-counter-list-by-default',
|
||||
name: 'Hide Card Counter Default',
|
||||
description: 'Setting hide card counter as default',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-hide-board-member-list-by-default',
|
||||
name: 'Hide Board Member List Default',
|
||||
description: 'Setting hide board member list as default',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-card-number-allowed',
|
||||
name: 'Card Number Permissions',
|
||||
description: 'Adding card number permissions',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'assign-boardwise-card-numbers',
|
||||
name: 'Board Card Numbers',
|
||||
description: 'Assigning board-wise card numbers',
|
||||
weight: 3,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'add-card-details-show-lists',
|
||||
name: 'Card Details Show Lists',
|
||||
description: 'Adding card details show lists option',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'migrate-attachments-collectionFS-to-ostrioFiles',
|
||||
name: 'Migrate Attachments to Meteor-Files',
|
||||
description: 'Migrating attachments from CollectionFS to Meteor-Files',
|
||||
weight: 8,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'migrate-avatars-collectionFS-to-ostrioFiles',
|
||||
name: 'Migrate Avatars to Meteor-Files',
|
||||
description: 'Migrating avatars from CollectionFS to Meteor-Files',
|
||||
weight: 6,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'migrate-attachment-drop-index-cardId',
|
||||
name: 'Drop Attachment Index',
|
||||
description: 'Dropping old attachment index',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'migrate-attachment-migration-fix-source-import',
|
||||
name: 'Fix Attachment Source Import',
|
||||
description: 'Fixing attachment source import field',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'attachment-cardCopy-fix-boardId-etc',
|
||||
name: 'Fix Attachment Card Copy',
|
||||
description: 'Fixing attachment card copy board IDs',
|
||||
weight: 2,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'remove-unused-planning-poker',
|
||||
name: 'Remove Planning Poker',
|
||||
description: 'Removing unused planning poker fields',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'remove-user-profile-hiddenSystemMessages',
|
||||
name: 'Remove Hidden System Messages',
|
||||
description: 'Removing hidden system messages field',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'remove-user-profile-hideCheckedItems',
|
||||
name: 'Remove Hide Checked Items',
|
||||
description: 'Removing hide checked items field',
|
||||
weight: 1,
|
||||
completed: false,
|
||||
progress: 0
|
||||
},
|
||||
{
|
||||
id: 'migrate-lists-to-per-swimlane',
|
||||
name: 'Migrate Lists to Per-Swimlane',
|
||||
description: 'Migrating lists to per-swimlane structure',
|
||||
weight: 5,
|
||||
completed: false,
|
||||
progress: 0
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any migrations need to be run for a specific board
|
||||
*/
|
||||
needsMigration(boardId = null) {
|
||||
if (boardId) {
|
||||
// Check if specific board needs migration based on version
|
||||
const board = ReactiveCache.getBoard(boardId);
|
||||
return !board || !board.migrationVersion || board.migrationVersion < 1;
|
||||
}
|
||||
|
||||
// Check if any migration step is not completed (global migrations)
|
||||
return this.steps.some(step => !step.completed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total weight of all migrations
|
||||
*/
|
||||
getTotalWeight() {
|
||||
return this.steps.reduce((total, step) => total + step.weight, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get completed weight
|
||||
*/
|
||||
getCompletedWeight() {
|
||||
return this.steps.reduce((total, step) => {
|
||||
return total + (step.completed ? step.weight : step.progress * step.weight / 100);
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark a board as migrated
|
||||
*/
|
||||
markBoardAsMigrated(boardId) {
|
||||
try {
|
||||
Meteor.call('boardMigration.markAsMigrated', boardId, 'full_board_migration', (error, result) => {
|
||||
if (error) {
|
||||
console.error('Failed to mark board as migrated:', error);
|
||||
} else {
|
||||
console.log('Board marked as migrated:', boardId);
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error marking board as migrated:', error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start migration process using cron system
|
||||
*/
|
||||
async startMigration() {
|
||||
if (isMigrating.get()) {
|
||||
return; // Already migrating
|
||||
}
|
||||
|
||||
isMigrating.set(true);
|
||||
migrationSteps.set([...this.steps]);
|
||||
this.startTime = Date.now();
|
||||
|
||||
try {
|
||||
// Start server-side cron migrations
|
||||
Meteor.call('cron.startAllMigrations', (error, result) => {
|
||||
if (error) {
|
||||
console.error('Failed to start cron migrations:', error);
|
||||
migrationStatus.set(`Migration failed: ${error.message}`);
|
||||
isMigrating.set(false);
|
||||
}
|
||||
});
|
||||
|
||||
// Poll for progress updates
|
||||
this.pollCronMigrationProgress();
|
||||
|
||||
} catch (error) {
|
||||
console.error('Migration failed:', error);
|
||||
migrationStatus.set(`Migration failed: ${error.message}`);
|
||||
isMigrating.set(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Poll for cron migration progress updates
|
||||
*/
|
||||
pollCronMigrationProgress() {
|
||||
const pollInterval = setInterval(() => {
|
||||
Meteor.call('cron.getMigrationProgress', (error, result) => {
|
||||
if (error) {
|
||||
console.error('Failed to get cron migration progress:', error);
|
||||
clearInterval(pollInterval);
|
||||
return;
|
||||
}
|
||||
|
||||
if (result) {
|
||||
migrationProgress.set(result.progress);
|
||||
migrationStatus.set(result.status);
|
||||
migrationCurrentStep.set(result.currentStep);
|
||||
migrationSteps.set(result.steps);
|
||||
isMigrating.set(result.isMigrating);
|
||||
|
||||
// Update local steps
|
||||
if (result.steps) {
|
||||
this.steps = result.steps;
|
||||
}
|
||||
|
||||
// If migration is complete, stop polling
|
||||
if (!result.isMigrating && result.progress === 100) {
|
||||
clearInterval(pollInterval);
|
||||
|
||||
// Clear status after delay
|
||||
setTimeout(() => {
|
||||
migrationStatus.set('');
|
||||
migrationProgress.set(0);
|
||||
migrationEstimatedTime.set('');
|
||||
}, 3000);
|
||||
}
|
||||
}
|
||||
});
|
||||
}, 1000); // Poll every second
|
||||
}
|
||||
|
||||
/**
|
||||
* Run a single migration step
|
||||
*/
|
||||
async runMigrationStep(step) {
|
||||
// Simulate migration progress
|
||||
const steps = 10;
|
||||
for (let i = 0; i <= steps; i++) {
|
||||
step.progress = (i / steps) * 100;
|
||||
this.updateProgress();
|
||||
|
||||
// Simulate work
|
||||
await new Promise(resolve => setTimeout(resolve, 50));
|
||||
}
|
||||
|
||||
// In a real implementation, this would call the actual migration
|
||||
// For now, we'll simulate the migration
|
||||
// Running migration step
|
||||
}
|
||||
|
||||
/**
|
||||
* Update progress variables
|
||||
*/
|
||||
updateProgress() {
|
||||
const totalWeight = this.getTotalWeight();
|
||||
const completedWeight = this.getCompletedWeight();
|
||||
const progress = Math.round((completedWeight / totalWeight) * 100);
|
||||
|
||||
migrationProgress.set(progress);
|
||||
migrationSteps.set([...this.steps]);
|
||||
|
||||
// Calculate estimated time remaining
|
||||
if (this.startTime && progress > 0) {
|
||||
const elapsed = Date.now() - this.startTime;
|
||||
const rate = progress / elapsed; // progress per millisecond
|
||||
const remaining = 100 - progress;
|
||||
const estimatedMs = remaining / rate;
|
||||
migrationEstimatedTime.set(this.formatTime(estimatedMs));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format time in milliseconds to human readable format
|
||||
*/
|
||||
formatTime(ms) {
|
||||
if (ms < 1000) {
|
||||
return `${Math.round(ms)}ms`;
|
||||
}
|
||||
|
||||
const seconds = Math.floor(ms / 1000);
|
||||
const minutes = Math.floor(seconds / 60);
|
||||
const hours = Math.floor(minutes / 60);
|
||||
|
||||
if (hours > 0) {
|
||||
const remainingMinutes = minutes % 60;
|
||||
const remainingSeconds = seconds % 60;
|
||||
return `${hours}h ${remainingMinutes}m ${remainingSeconds}s`;
|
||||
} else if (minutes > 0) {
|
||||
const remainingSeconds = seconds % 60;
|
||||
return `${minutes}m ${remainingSeconds}s`;
|
||||
} else {
|
||||
return `${seconds}s`;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear migration cache (for testing)
|
||||
*/
|
||||
clearCache() {
|
||||
this.migrationCache.clear();
|
||||
this.steps.forEach(step => {
|
||||
step.completed = false;
|
||||
step.progress = 0;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Export singleton instance
|
||||
export const migrationManager = new MigrationManager();
|
||||
@@ -240,6 +240,25 @@ FlowRouter.route('/global-search', {
|
||||
},
|
||||
});
|
||||
|
||||
// Mobile Bookmarks page
|
||||
FlowRouter.route('/bookmarks', {
|
||||
name: 'bookmarks',
|
||||
triggersEnter: [AccountsTemplates.ensureSignedIn],
|
||||
action() {
|
||||
Filter.reset();
|
||||
Session.set('sortBy', '');
|
||||
EscapeActions.executeUpTo('popup-close');
|
||||
|
||||
Utils.manageCustomUI();
|
||||
Utils.manageMatomo();
|
||||
|
||||
BlazeLayout.render('defaultLayout', {
|
||||
headerBar: 'boardListHeaderBar',
|
||||
content: 'bookmarks',
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
FlowRouter.route('/broken-cards', {
|
||||
name: 'broken-cards',
|
||||
action() {
|
||||
|
||||
+19
-17
@@ -734,12 +734,13 @@ services:
|
||||
volumes:
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
- wekan-files:/data:rw
|
||||
secrets:
|
||||
- ldap_auth_password
|
||||
- oauth2_secret
|
||||
- mail_service_password
|
||||
- mongo_password
|
||||
- s3_secret
|
||||
# Secrets are optional. Uncomment below and ensure files exist to use them.
|
||||
#secrets:
|
||||
# - ldap_auth_password
|
||||
# - oauth2_secret
|
||||
# - mail_service_password
|
||||
# - mongo_password
|
||||
# - s3_secret
|
||||
|
||||
#---------------------------------------------------------------------------------
|
||||
# ==== OPTIONAL: SHARE DATABASE TO OFFICE LAN AND REMOTE VPN ====
|
||||
@@ -806,14 +807,15 @@ networks:
|
||||
# Create secret files on the host system before running docker-compose up
|
||||
# Example: echo "your_password_here" > ldap_auth_password.txt
|
||||
# Then use: docker-compose up -d
|
||||
secrets:
|
||||
ldap_auth_password:
|
||||
file: ./secrets/ldap_auth_password.txt
|
||||
oauth2_secret:
|
||||
file: ./secrets/oauth2_secret.txt
|
||||
mail_service_password:
|
||||
file: ./secrets/mail_service_password.txt
|
||||
mongo_password:
|
||||
file: ./secrets/mongo_password.txt
|
||||
s3_secret:
|
||||
file: ./secrets/s3_secret.txt
|
||||
# Secrets are optional. Uncomment to enable and ensure files exist at provided paths.
|
||||
#secrets:
|
||||
# ldap_auth_password:
|
||||
# file: ./secrets/ldap_auth_password.txt
|
||||
# oauth2_secret:
|
||||
# file: ./secrets/oauth2_secret.txt
|
||||
# mail_service_password:
|
||||
# file: ./secrets/mail_service_password.txt
|
||||
# mongo_password:
|
||||
# file: ./secrets/mongo_password.txt
|
||||
# s3_secret:
|
||||
# file: ./secrets/s3_secret.txt
|
||||
@@ -0,0 +1,318 @@
|
||||
# MongoDB Compatibility Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This guide documents MongoDB compatibility issues and fixes for Wekan across MongoDB versions 3.0 through 8.0, ensuring proper operation with Meteor.js 2.14.
|
||||
|
||||
## Current Status
|
||||
|
||||
- **Meteor.js Version**: 2.14
|
||||
- **MongoDB Package**: mongo@1.16.8
|
||||
- **Supported MongoDB Versions**: 3.0 - 8.0
|
||||
- **Compatibility Status**: ✅ Fixed
|
||||
|
||||
## Compatibility Issues Fixed
|
||||
|
||||
### 1. Deprecated `.count()` Method
|
||||
|
||||
**Issue**: The `.count()` method is deprecated in newer MongoDB versions.
|
||||
|
||||
**Fixed Files**:
|
||||
- `models/users.js` - Line 1839
|
||||
- `server/migrations.js` - Line 209
|
||||
- `server/publications/cards.js` - Lines 709, 711, 713
|
||||
- `client/components/settings/adminReports.js` - Line 115
|
||||
|
||||
**Fix Applied**:
|
||||
```javascript
|
||||
// Before (deprecated)
|
||||
const count = collection.find().count();
|
||||
|
||||
// After (compatible)
|
||||
const count = collection.find().countDocuments();
|
||||
```
|
||||
|
||||
### 2. MongoDB 8.0 Null/Undefined Equality
|
||||
|
||||
**Issue**: MongoDB 8.0 changed behavior where equality matches to `null` no longer match `undefined` values.
|
||||
|
||||
**Fixed Files**:
|
||||
- `models/customFields.js` - Custom field initialization
|
||||
- `models/cards.js` - Card custom field initialization
|
||||
|
||||
**Fix Applied**:
|
||||
```javascript
|
||||
// Before (MongoDB 8.0 incompatible)
|
||||
{ field: null }
|
||||
|
||||
// After (MongoDB 8.0 compatible)
|
||||
{ field: { $in: [null, undefined] } }
|
||||
```
|
||||
|
||||
## Direct Operations Analysis
|
||||
|
||||
### Purpose of Direct Operations
|
||||
|
||||
Direct operations (`.direct.insert()`, `.direct.update()`, `.direct.remove()`) are used intentionally in Wekan to:
|
||||
|
||||
1. **Bypass Meteor Security**: For system operations that need to bypass validation
|
||||
2. **Migration Scripts**: For data migration operations
|
||||
3. **Import/Export**: For bulk data operations
|
||||
4. **System Initialization**: For setting up initial data
|
||||
|
||||
### Files Using Direct Operations
|
||||
|
||||
**Models**:
|
||||
- `models/wekanCreator.js` - Wekan board creation
|
||||
- `models/trelloCreator.js` - Trello import
|
||||
- `models/cards.js` - Card operations
|
||||
- `models/boards.js` - Board operations
|
||||
- `models/lists.js` - List operations
|
||||
- `models/swimlanes.js` - Swimlane operations
|
||||
- `models/customFields.js` - Custom field operations
|
||||
- `models/checklistItems.js` - Checklist operations
|
||||
- `models/integrations.js` - Integration operations
|
||||
- `models/csvCreator.js` - CSV export operations
|
||||
|
||||
**Server**:
|
||||
- `server/migrations.js` - Database migrations
|
||||
- `server/notifications/outgoing.js` - Notification operations
|
||||
|
||||
### Security Considerations
|
||||
|
||||
Direct operations bypass Meteor's security model, so they should only be used when:
|
||||
- ✅ System-level operations (migrations, imports)
|
||||
- ✅ Bulk operations that need performance
|
||||
- ✅ Operations that need to bypass validation
|
||||
- ❌ User-initiated operations (use regular methods)
|
||||
- ❌ Operations that need security validation
|
||||
|
||||
## Raw Collection Usage
|
||||
|
||||
### Purpose of Raw Collections
|
||||
|
||||
Raw collections (`.rawCollection()`) are used for:
|
||||
1. **Advanced Aggregation**: Complex aggregation pipelines
|
||||
2. **Database Commands**: Direct database commands
|
||||
3. **Index Management**: Creating/dropping indexes
|
||||
4. **Migration Operations**: Complex data transformations
|
||||
|
||||
### Files Using Raw Collections
|
||||
|
||||
- `models/server/metrics.js` - Metrics aggregation
|
||||
- `server/migrations.js` - Migration operations
|
||||
|
||||
### Security Considerations
|
||||
|
||||
Raw collections bypass all Meteor security, so they should only be used when:
|
||||
- ✅ Server-side only operations
|
||||
- ✅ System administration tasks
|
||||
- ✅ Complex aggregation pipelines
|
||||
- ❌ Client-side operations
|
||||
- ❌ User data operations without validation
|
||||
|
||||
## Version-Specific Compatibility
|
||||
|
||||
### MongoDB 3.0 - 3.6
|
||||
- ✅ Full compatibility
|
||||
- ✅ Uses mongodb3legacy driver
|
||||
- ✅ All operations supported
|
||||
|
||||
### MongoDB 4.0 - 4.4
|
||||
- ✅ Full compatibility
|
||||
- ✅ Uses mongodb4legacy driver
|
||||
- ✅ All operations supported
|
||||
|
||||
### MongoDB 5.0
|
||||
- ✅ Full compatibility
|
||||
- ✅ Uses mongodb5legacy driver
|
||||
- ✅ All operations supported
|
||||
|
||||
### MongoDB 6.0
|
||||
- ✅ Full compatibility
|
||||
- ✅ Uses mongodb6legacy driver
|
||||
- ✅ All operations supported
|
||||
|
||||
### MongoDB 7.0
|
||||
- ✅ Full compatibility
|
||||
- ✅ Uses mongodb7legacy driver
|
||||
- ✅ All operations supported
|
||||
|
||||
### MongoDB 8.0
|
||||
- ✅ Full compatibility (after fixes)
|
||||
- ✅ Uses mongodb8legacy driver
|
||||
- ✅ Null/undefined equality fixed
|
||||
|
||||
## Testing Recommendations
|
||||
|
||||
### Test Matrix
|
||||
|
||||
| MongoDB Version | Driver | Status | Test Priority |
|
||||
|----------------|--------|--------|---------------|
|
||||
| 3.0 | mongodb3legacy | ✅ Compatible | High |
|
||||
| 3.2 | mongodb3legacy | ✅ Compatible | High |
|
||||
| 3.4 | mongodb3legacy | ✅ Compatible | High |
|
||||
| 3.6 | mongodb3legacy | ✅ Compatible | High |
|
||||
| 4.0 | mongodb4legacy | ✅ Compatible | High |
|
||||
| 4.2 | mongodb4legacy | ✅ Compatible | High |
|
||||
| 4.4 | mongodb4legacy | ✅ Compatible | High |
|
||||
| 5.0 | mongodb5legacy | ✅ Compatible | Medium |
|
||||
| 6.0 | mongodb6legacy | ✅ Compatible | Medium |
|
||||
| 7.0 | mongodb7legacy | ✅ Compatible | Medium |
|
||||
| 8.0 | mongodb8legacy | ✅ Compatible | High |
|
||||
|
||||
### Test Scenarios
|
||||
|
||||
1. **Basic Operations**:
|
||||
- Create/Read/Update/Delete operations
|
||||
- Collection queries and filters
|
||||
- Index operations
|
||||
|
||||
2. **Advanced Operations**:
|
||||
- Aggregation pipelines
|
||||
- Complex queries with null/undefined
|
||||
- Direct operations
|
||||
- Raw collection operations
|
||||
|
||||
3. **Migration Operations**:
|
||||
- Database migrations
|
||||
- Data import/export
|
||||
- Schema changes
|
||||
|
||||
4. **Performance Testing**:
|
||||
- Large dataset operations
|
||||
- Concurrent operations
|
||||
- Memory usage
|
||||
|
||||
## Monitoring and Debugging
|
||||
|
||||
### MongoDB Driver System
|
||||
|
||||
The MongoDB driver system provides:
|
||||
- Automatic version detection
|
||||
- Driver selection based on MongoDB version
|
||||
- Connection monitoring
|
||||
- Error tracking
|
||||
|
||||
### Debug Methods
|
||||
|
||||
```javascript
|
||||
// Get connection statistics
|
||||
Meteor.call('mongodb-driver-stats', (error, result) => {
|
||||
console.log('Connection Stats:', result);
|
||||
});
|
||||
|
||||
// Test connection
|
||||
Meteor.call('mongodb-driver-test-connection', (error, result) => {
|
||||
console.log('Connection Test:', result);
|
||||
});
|
||||
|
||||
// Get supported versions
|
||||
Meteor.call('mongodb-driver-supported-versions', (error, result) => {
|
||||
console.log('Supported Versions:', result);
|
||||
});
|
||||
```
|
||||
|
||||
### Real-time Monitoring
|
||||
|
||||
```javascript
|
||||
// Subscribe to monitoring
|
||||
Meteor.subscribe('mongodb-driver-monitor');
|
||||
|
||||
// Access data in template
|
||||
Template.yourTemplate.helpers({
|
||||
driverStats() {
|
||||
return MongoDBDriverMonitor.findOne('stats');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Query Optimization
|
||||
|
||||
1. **Use Indexes**: Ensure proper indexes for frequently queried fields
|
||||
2. **Limit Results**: Use `.limit()` and `.skip()` for pagination
|
||||
3. **Project Fields**: Use projection to limit returned fields
|
||||
4. **Aggregation**: Use aggregation pipelines for complex operations
|
||||
|
||||
### Security
|
||||
|
||||
1. **Validate Input**: Always validate user input
|
||||
2. **Use Regular Methods**: Prefer regular methods over direct operations
|
||||
3. **Server-side Only**: Keep sensitive operations server-side
|
||||
4. **Audit Logging**: Log important operations
|
||||
|
||||
### Performance
|
||||
|
||||
1. **Connection Pooling**: Use connection pooling for better performance
|
||||
2. **Batch Operations**: Use batch operations for bulk data
|
||||
3. **Caching**: Implement caching for frequently accessed data
|
||||
4. **Monitoring**: Monitor query performance and optimize as needed
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Connection Failures**:
|
||||
- Check MONGO_URL configuration
|
||||
- Verify MongoDB server is running
|
||||
- Check network connectivity
|
||||
|
||||
2. **Query Errors**:
|
||||
- Verify query syntax
|
||||
- Check field names and types
|
||||
- Validate MongoDB version compatibility
|
||||
|
||||
3. **Performance Issues**:
|
||||
- Check indexes
|
||||
- Optimize queries
|
||||
- Monitor connection pool usage
|
||||
|
||||
### Debug Commands
|
||||
|
||||
```bash
|
||||
# Check MongoDB version
|
||||
mongo --eval "db.version()"
|
||||
|
||||
# Check connection status
|
||||
mongo --eval "db.runCommand({connectionStatus: 1})"
|
||||
|
||||
# Check indexes
|
||||
mongo --eval "db.collection.getIndexes()"
|
||||
|
||||
# Check query performance
|
||||
mongo --eval "db.collection.find().explain('executionStats')"
|
||||
```
|
||||
|
||||
## Migration Guide
|
||||
|
||||
### From Older MongoDB Versions
|
||||
|
||||
1. **Backup Data**: Always backup before migration
|
||||
2. **Test Compatibility**: Test with target MongoDB version
|
||||
3. **Update Drivers**: Use appropriate driver for MongoDB version
|
||||
4. **Run Migrations**: Execute any necessary data migrations
|
||||
5. **Validate**: Verify all functionality works correctly
|
||||
|
||||
### To Newer MongoDB Versions
|
||||
|
||||
1. **Check Compatibility**: Verify all queries are compatible
|
||||
2. **Update Queries**: Fix any deprecated method usage
|
||||
3. **Test Thoroughly**: Test all functionality
|
||||
4. **Monitor Performance**: Watch for performance changes
|
||||
5. **Update Documentation**: Update any version-specific documentation
|
||||
|
||||
## Support
|
||||
|
||||
For MongoDB compatibility issues:
|
||||
|
||||
1. Check this guide for known issues and solutions
|
||||
2. Review MongoDB release notes for version-specific changes
|
||||
3. Test with the MongoDB driver system
|
||||
4. Use the monitoring tools to diagnose issues
|
||||
5. Consult the Wekan community for additional help
|
||||
|
||||
## License
|
||||
|
||||
This MongoDB Compatibility Guide is part of Wekan and is licensed under the MIT License.
|
||||
@@ -0,0 +1,281 @@
|
||||
# MongoDB Driver System
|
||||
|
||||
## Overview
|
||||
|
||||
The MongoDB Driver System provides automatic MongoDB version detection and driver selection to support MongoDB versions 3.0 through 8.0 with compatible Node.js drivers. This system eliminates the need for manual driver configuration and provides seamless compatibility across all supported MongoDB versions.
|
||||
|
||||
## Features
|
||||
|
||||
- **Automatic Version Detection**: Detects MongoDB server version from wire protocol errors
|
||||
- **Dynamic Driver Selection**: Automatically selects the appropriate Node.js driver based on detected version
|
||||
- **Fallback Mechanism**: Tries multiple drivers if the first attempt fails
|
||||
- **Connection Retry Logic**: Retries connections with different drivers on failure
|
||||
- **Real-time Monitoring**: Provides connection statistics and monitoring capabilities
|
||||
- **Meteor Integration**: Seamlessly integrates with Meteor's MongoDB connection system
|
||||
|
||||
## Supported MongoDB Versions
|
||||
|
||||
| MongoDB Version | Node.js Driver | Driver Version | Package Name |
|
||||
|----------------|----------------|----------------|--------------|
|
||||
| 3.0 - 3.6 | mongodb@3.7.4 | 3.7.4 | mongodb3legacy |
|
||||
| 4.0 - 4.4 | mongodb@4.17.2 | 4.17.2 | mongodb4legacy |
|
||||
| 5.0 | mongodb@5.9.2 | 5.9.2 | mongodb5legacy |
|
||||
| 6.0 | mongodb@6.3.0 | 6.3.0 | mongodb6legacy |
|
||||
| 7.0 | mongodb@7.0.1 | 7.0.1 | mongodb7legacy |
|
||||
| 8.0 | mongodb@6.9.0 | 6.9.0 | mongodb8legacy |
|
||||
|
||||
## Architecture
|
||||
|
||||
### Core Components
|
||||
|
||||
1. **MongoDBDriverManager** (`models/lib/mongodbDriverManager.js`)
|
||||
- Manages driver compatibility matrix
|
||||
- Detects MongoDB version from wire protocol errors
|
||||
- Selects appropriate driver based on detected version
|
||||
- Tracks connection attempts and statistics
|
||||
|
||||
2. **MongoDBConnectionManager** (`models/lib/mongodbConnectionManager.js`)
|
||||
- Handles MongoDB connections with automatic driver selection
|
||||
- Implements connection retry logic with different drivers
|
||||
- Manages connection pooling and lifecycle
|
||||
- Provides fallback mechanism for unsupported versions
|
||||
|
||||
3. **MeteorMongoIntegration** (`models/lib/meteorMongoIntegration.js`)
|
||||
- Integrates with Meteor's MongoDB connection system
|
||||
- Overrides Meteor's connection methods to use custom drivers
|
||||
- Provides Meteor-compatible connection objects
|
||||
- Enhances collections with additional methods
|
||||
|
||||
4. **MongoDB Driver Startup** (`server/mongodb-driver-startup.js`)
|
||||
- Initializes the system on server startup
|
||||
- Provides server-side methods for monitoring and debugging
|
||||
- Sets up real-time monitoring publications
|
||||
|
||||
## Installation
|
||||
|
||||
The MongoDB driver system is automatically installed when you install Wekan dependencies:
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
All required driver packages are included in `package.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"dependencies": {
|
||||
"mongodb3legacy": "npm:mongodb@3.7.4",
|
||||
"mongodb4legacy": "npm:mongodb@4.17.2",
|
||||
"mongodb5legacy": "npm:mongodb@5.9.2",
|
||||
"mongodb6legacy": "npm:mongodb@6.3.0",
|
||||
"mongodb7legacy": "npm:mongodb@7.0.1",
|
||||
"mongodb8legacy": "npm:mongodb@6.9.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Automatic Operation
|
||||
|
||||
The system works automatically without any configuration required:
|
||||
|
||||
1. **Startup**: The system initializes automatically when Wekan starts
|
||||
2. **Connection**: When connecting to MongoDB, the system detects the server version
|
||||
3. **Driver Selection**: The appropriate driver is selected based on the detected version
|
||||
4. **Fallback**: If the first driver fails, fallback drivers are tried automatically
|
||||
|
||||
### Manual Testing
|
||||
|
||||
You can test the system using the provided test script:
|
||||
|
||||
```bash
|
||||
node test-mongodb-drivers.js
|
||||
```
|
||||
|
||||
### Monitoring
|
||||
|
||||
The system provides several ways to monitor its operation:
|
||||
|
||||
#### Server-side Methods
|
||||
|
||||
```javascript
|
||||
// Get connection statistics
|
||||
Meteor.call('mongodb-driver-stats', (error, result) => {
|
||||
console.log('Connection Stats:', result);
|
||||
});
|
||||
|
||||
// Test connection
|
||||
Meteor.call('mongodb-driver-test-connection', (error, result) => {
|
||||
console.log('Connection Test:', result);
|
||||
});
|
||||
|
||||
// Get supported versions
|
||||
Meteor.call('mongodb-driver-supported-versions', (error, result) => {
|
||||
console.log('Supported Versions:', result);
|
||||
});
|
||||
|
||||
// Reset system
|
||||
Meteor.call('mongodb-driver-reset', (error, result) => {
|
||||
console.log('Reset Result:', result);
|
||||
});
|
||||
```
|
||||
|
||||
#### Real-time Monitoring
|
||||
|
||||
Subscribe to the monitoring publication:
|
||||
|
||||
```javascript
|
||||
Meteor.subscribe('mongodb-driver-monitor');
|
||||
```
|
||||
|
||||
Access the data in your template:
|
||||
|
||||
```javascript
|
||||
Template.yourTemplate.helpers({
|
||||
driverStats() {
|
||||
return MongoDBDriverMonitor.findOne('stats');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Wire Protocol Error Detection
|
||||
|
||||
The system detects MongoDB versions by analyzing wire protocol errors. Here are the error patterns used:
|
||||
|
||||
### MongoDB 3.x
|
||||
- `unsupported wire protocol version`
|
||||
- `wire protocol version 0/1/2/3`
|
||||
- `protocol version 0/1/2/3`
|
||||
|
||||
### MongoDB 4.x
|
||||
- `wire protocol version 4/5/6`
|
||||
- `protocol version 4/5/6`
|
||||
|
||||
### MongoDB 5.x
|
||||
- `wire protocol version 7`
|
||||
- `protocol version 7`
|
||||
|
||||
### MongoDB 6.x
|
||||
- `wire protocol version 8`
|
||||
- `protocol version 8`
|
||||
|
||||
### MongoDB 7.x
|
||||
- `wire protocol version 9`
|
||||
- `protocol version 9`
|
||||
|
||||
### MongoDB 8.x
|
||||
- `wire protocol version 10`
|
||||
- `protocol version 10`
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
The system uses the standard MongoDB environment variables:
|
||||
|
||||
- `MONGO_URL`: MongoDB connection string
|
||||
- `MONGO_OPLOG_URL`: MongoDB oplog connection string (optional)
|
||||
|
||||
### Connection Options
|
||||
|
||||
You can customize connection options by modifying the default options in `mongodbConnectionManager.js`:
|
||||
|
||||
```javascript
|
||||
const defaultOptions = {
|
||||
useNewUrlParser: true,
|
||||
useUnifiedTopology: true,
|
||||
maxPoolSize: 10,
|
||||
serverSelectionTimeoutMS: 5000,
|
||||
socketTimeoutMS: 45000,
|
||||
// Add your custom options here
|
||||
};
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **Driver Not Found**
|
||||
- Ensure all driver packages are installed: `npm install`
|
||||
- Check that package.json contains all required drivers
|
||||
|
||||
2. **Connection Failures**
|
||||
- Verify MONGO_URL is correctly set
|
||||
- Check MongoDB server is running and accessible
|
||||
- Review connection logs for specific error messages
|
||||
|
||||
3. **Version Detection Issues**
|
||||
- Check if MongoDB server is responding
|
||||
- Verify wire protocol error patterns match your MongoDB version
|
||||
- Review connection attempt logs
|
||||
|
||||
### Debugging
|
||||
|
||||
Enable debug logging by setting the DEBUG environment variable:
|
||||
|
||||
```bash
|
||||
DEBUG=mongodb-driver* node main.js
|
||||
```
|
||||
|
||||
### Logs
|
||||
|
||||
The system provides detailed logging:
|
||||
|
||||
```
|
||||
=== MongoDB Driver System Startup ===
|
||||
MONGO_URL found, initializing MongoDB driver system...
|
||||
Connection string: mongodb://***:***@localhost:27017/wekan
|
||||
Initializing Meteor MongoDB Integration...
|
||||
Testing MongoDB connection...
|
||||
✅ MongoDB connection test successful
|
||||
Driver: mongodb6legacy
|
||||
Version: 6.0
|
||||
MongoDB Driver System Statistics:
|
||||
Initialized: true
|
||||
Custom Connection: true
|
||||
Supported Versions: 3.0, 3.2, 3.4, 3.6, 4.0, 4.2, 4.4, 5.0, 6.0, 7.0, 8.0
|
||||
=== MongoDB Driver System Ready ===
|
||||
```
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
- **Connection Pooling**: Each driver maintains its own connection pool
|
||||
- **Driver Selection**: Version detection happens only on first connection
|
||||
- **Fallback Overhead**: Fallback attempts add minimal overhead
|
||||
- **Memory Usage**: Multiple drivers are loaded but only one is active
|
||||
|
||||
## Security
|
||||
|
||||
- **Credential Protection**: Connection strings are logged with credentials masked
|
||||
- **Access Control**: Monitoring methods require user authentication
|
||||
- **Error Handling**: Sensitive information is not exposed in error messages
|
||||
|
||||
## Migration from Standard MongoDB
|
||||
|
||||
If you're migrating from standard MongoDB connections:
|
||||
|
||||
1. **No Code Changes Required**: The system is backward compatible
|
||||
2. **Automatic Detection**: Version detection happens automatically
|
||||
3. **Gradual Migration**: You can test with specific drivers before full migration
|
||||
4. **Rollback**: You can disable the system and return to standard connections
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
- **Additional MongoDB Versions**: Support for newer MongoDB versions as they're released
|
||||
- **Performance Optimization**: Connection pooling optimizations
|
||||
- **Enhanced Monitoring**: More detailed metrics and alerting
|
||||
- **Configuration UI**: Web interface for driver configuration
|
||||
|
||||
## Support
|
||||
|
||||
For issues or questions:
|
||||
|
||||
1. Check the troubleshooting section above
|
||||
2. Review the logs for specific error messages
|
||||
3. Test with the provided test script
|
||||
4. Use the monitoring methods to gather diagnostic information
|
||||
|
||||
## License
|
||||
|
||||
This MongoDB Driver System is part of Wekan and is licensed under the MIT License.
|
||||
@@ -0,0 +1,189 @@
|
||||
# MongoDB Version Management System
|
||||
|
||||
This document describes the MongoDB version management system that automatically detects MongoDB server versions and switches to the appropriate binary and Node.js driver.
|
||||
|
||||
## Overview
|
||||
|
||||
The system provides:
|
||||
- **Automatic version detection** based on connection attempts and wire protocol errors
|
||||
- **Automatic binary switching** to the correct MongoDB server version
|
||||
- **Automatic driver selection** using the appropriate Node.js MongoDB driver
|
||||
- **Support for MongoDB versions 3-8** with fallback mechanisms
|
||||
|
||||
## Current Status
|
||||
|
||||
### Available MongoDB Server Binaries
|
||||
- ✅ **MongoDB 3.2.22** - Available at `/snap/wekan/current/migratemongo/bin/`
|
||||
- ❌ **MongoDB 4.4.28** - Not available (needs to be added to snap package)
|
||||
- ❌ **MongoDB 5.0.28** - Not available (needs to be added to snap package)
|
||||
- ❌ **MongoDB 6.0.15** - Not available (needs to be added to snap package)
|
||||
- ✅ **MongoDB 7.0.25** - Available at `/snap/wekan/current/bin/`
|
||||
- ❌ **MongoDB 8.0.4** - Not available (needs to be added to snap package)
|
||||
|
||||
### Available MongoDB Node.js Drivers
|
||||
- ✅ **MongoDB 3.7.4** - Available as `mongodb3legacy`
|
||||
- ✅ **MongoDB 4.17.2** - Available as `mongodb4legacy`
|
||||
- ✅ **MongoDB 5.9.2** - Available as `mongodb5legacy`
|
||||
- ✅ **MongoDB 6.3.0** - Available as `mongodb6legacy`
|
||||
- ✅ **MongoDB 7.0.1** - Available as `mongodb7legacy`
|
||||
- ✅ **MongoDB 8.0** - Available as `mongodb8legacy`
|
||||
|
||||
## How It Works
|
||||
|
||||
### 1. Version Detection
|
||||
The system attempts to connect to MongoDB using the latest available binary (MongoDB 7.x) and analyzes the response:
|
||||
|
||||
- **Success**: If connection succeeds, it's MongoDB 7.x
|
||||
- **Wire Protocol Error**: If connection fails with wire protocol errors, it detects the version based on the protocol version number:
|
||||
- Protocol 0-3: MongoDB 3.x
|
||||
- Protocol 4: MongoDB 4.x
|
||||
- Protocol 5: MongoDB 5.x
|
||||
- Protocol 6: MongoDB 6.x
|
||||
- Protocol 7: MongoDB 7.x
|
||||
- Protocol 8: MongoDB 8.x
|
||||
|
||||
### 2. Binary Switching
|
||||
Based on the detected version, the system switches to the appropriate MongoDB server binary:
|
||||
|
||||
```bash
|
||||
# MongoDB 3.x
|
||||
export PATH="/snap/wekan/current/migratemongo/bin:$PATH"
|
||||
export LD_LIBRARY_PATH="/snap/wekan/current/migratemongo/lib:$LD_LIBRARY_PATH"
|
||||
|
||||
# MongoDB 7.x (default)
|
||||
export PATH="/snap/wekan/current/bin:$PATH"
|
||||
export LD_LIBRARY_PATH="/snap/wekan/current/usr/lib:$LD_LIBRARY_PATH"
|
||||
```
|
||||
|
||||
### 3. Driver Selection
|
||||
The Node.js application automatically selects the appropriate MongoDB driver based on the detected version using the `mongodbDriverManager` system.
|
||||
|
||||
## Files Modified
|
||||
|
||||
### Removed Migration Files
|
||||
- ❌ `snap-src/bin/mongodb-migrate` - Removed
|
||||
- ❌ `snap-src/bin/mongodb-migration-web` - Removed
|
||||
- ❌ `snap-src/bin/mongodb-migration-status` - Removed
|
||||
|
||||
### Updated Files
|
||||
- ✅ `snap-src/bin/mongodb-control` - Completely rewritten with version detection
|
||||
- ✅ `snap-src/bin/mongodb-version-manager` - New utility for managing versions
|
||||
|
||||
### Node.js Driver System
|
||||
- ✅ `models/lib/mongodbDriverManager.js` - Manages multiple MongoDB drivers
|
||||
- ✅ `models/lib/mongodbConnectionManager.js` - Handles connections with version detection
|
||||
- ✅ `models/lib/meteorMongoIntegration.js` - Integrates with Meteor's Mongo.Collection
|
||||
- ✅ `server/mongodb-driver-startup.js` - Initializes the driver system
|
||||
|
||||
## Adding Missing MongoDB Server Binaries
|
||||
|
||||
To add MongoDB versions 4, 5, 6, and 8 to the snap package, you need to:
|
||||
|
||||
### 1. Download MongoDB Server Binaries
|
||||
Download the appropriate MongoDB server binaries for each version:
|
||||
|
||||
```bash
|
||||
# MongoDB 4.4.28
|
||||
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.4.28.tgz
|
||||
|
||||
# MongoDB 5.0.28
|
||||
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-5.0.28.tgz
|
||||
|
||||
# MongoDB 6.0.15
|
||||
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-6.0.15.tgz
|
||||
|
||||
# MongoDB 8.0.4
|
||||
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-8.0.4.tgz
|
||||
```
|
||||
|
||||
### 2. Extract and Install in Snap Package
|
||||
Extract each version to the appropriate directory in the snap package:
|
||||
|
||||
```bash
|
||||
# Extract MongoDB 4.x
|
||||
tar -xzf mongodb-linux-x86_64-4.4.28.tgz
|
||||
mkdir -p /snap/wekan/current/mongodb4/bin
|
||||
cp mongodb-linux-x86_64-4.4.28/bin/* /snap/wekan/current/mongodb4/bin/
|
||||
|
||||
# Extract MongoDB 5.x
|
||||
tar -xzf mongodb-linux-x86_64-5.0.28.tgz
|
||||
mkdir -p /snap/wekan/current/mongodb5/bin
|
||||
cp mongodb-linux-x86_64-5.0.28/bin/* /snap/wekan/current/mongodb5/bin/
|
||||
|
||||
# Extract MongoDB 6.x
|
||||
tar -xzf mongodb-linux-x86_64-6.0.15.tgz
|
||||
mkdir -p /snap/wekan/current/mongodb6/bin
|
||||
cp mongodb-linux-x86_64-6.0.15/bin/* /snap/wekan/current/mongodb6/bin/
|
||||
|
||||
# Extract MongoDB 8.x
|
||||
tar -xzf mongodb-linux-x86_64-8.0.4.tgz
|
||||
mkdir -p /snap/wekan/current/mongodb8/bin
|
||||
cp mongodb-linux-x86_64-8.0.4/bin/* /snap/wekan/current/mongodb8/bin/
|
||||
```
|
||||
|
||||
### 3. Update Snap Package Build
|
||||
Modify the snap package build process to include these binaries in the final package.
|
||||
|
||||
## Usage
|
||||
|
||||
### Check Available Versions
|
||||
```bash
|
||||
$SNAP/bin/mongodb-version-manager versions
|
||||
```
|
||||
|
||||
### Check Current Active Version
|
||||
```bash
|
||||
$SNAP/bin/mongodb-version-manager active
|
||||
```
|
||||
|
||||
### Force Version Detection
|
||||
```bash
|
||||
$SNAP/bin/mongodb-version-manager detect
|
||||
```
|
||||
|
||||
### View Detection Log
|
||||
```bash
|
||||
$SNAP/bin/mongodb-version-manager log
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
- `MONGO_URL` - MongoDB connection URL (default: `mongodb://127.0.0.1:27017/wekan`)
|
||||
- `SNAP_COMMON` - Snap common directory for logs and version files
|
||||
|
||||
### Version Files
|
||||
- `${SNAP_COMMON}/mongodb-active-version` - Caches the currently active version
|
||||
- `${SNAP_COMMON}/mongodb-version-detection.log` - Logs version detection events
|
||||
|
||||
## Benefits
|
||||
|
||||
1. **No Downtime**: Automatic version detection and switching without manual intervention
|
||||
2. **Backward Compatibility**: Works with existing MongoDB 3.x databases
|
||||
3. **Forward Compatibility**: Ready for MongoDB 8.x when available
|
||||
4. **Automatic Fallback**: Falls back to MongoDB 7.x if detection fails
|
||||
5. **Comprehensive Logging**: Detailed logs for troubleshooting
|
||||
6. **No Migrations**: Eliminates the need for database migrations
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Version Detection Not Working
|
||||
1. Check the detection log: `$SNAP/bin/mongodb-version-manager log`
|
||||
2. Force re-detection: `$SNAP/bin/mongodb-version-manager detect`
|
||||
3. Restart MongoDB service
|
||||
|
||||
### Wrong Version Selected
|
||||
1. Clear the cached version: `rm ${SNAP_COMMON}/mongodb-active-version`
|
||||
2. Restart MongoDB service
|
||||
|
||||
### Connection Issues
|
||||
1. Verify MongoDB server is running
|
||||
2. Check MONGO_URL environment variable
|
||||
3. Review MongoDB server logs
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
1. **Add Missing Binaries**: Include MongoDB 4, 5, 6, and 8 server binaries in snap package
|
||||
2. **Health Checks**: Add health monitoring for different MongoDB versions
|
||||
3. **Performance Metrics**: Track performance across different versions
|
||||
4. **Auto-Upgrade**: Automatically upgrade to newer versions when available
|
||||
@@ -0,0 +1,236 @@
|
||||
# Wekan Accessibility & Responsive Design Improvements
|
||||
|
||||
This document outlines the comprehensive accessibility and responsive design improvements implemented across all devices and screen sizes.
|
||||
|
||||
## 🎯 Overview
|
||||
|
||||
The improvements ensure Wekan is fully accessible and optimized for:
|
||||
- **Smartphones** (320px - 767px)
|
||||
- **Tablets** (768px - 1023px)
|
||||
- **Laptops** (1024px - 1919px)
|
||||
- **Desktops** (1920px - 2559px)
|
||||
- **Large Displays** (2560px+)
|
||||
- **Digital Signage & TV** (Ultra-wide and 4K+)
|
||||
|
||||
## 📱 Mobile Optimizations
|
||||
|
||||
### Touch Interactions
|
||||
- **Minimum touch target size**: 44px × 44px (WCAG AA compliant)
|
||||
- **Touch feedback**: Visual feedback for touch interactions
|
||||
- **Prevent zoom on input focus**: Font size 16px prevents iOS zoom
|
||||
- **Touch scrolling**: Smooth `-webkit-overflow-scrolling: touch`
|
||||
|
||||
### Layout Improvements
|
||||
- **Responsive typography**: `clamp(14px, 4vw, 18px)` scales with viewport
|
||||
- **Flexible spacing**: `clamp(8px, 2vw, 16px)` for consistent spacing
|
||||
- **Stacked navigation**: Header elements stack vertically on small screens
|
||||
- **Full-width modals**: 95vw width for better mobile experience
|
||||
|
||||
### Device-Specific Optimizations
|
||||
- **iPhone 12 Mini**: 3x font scaling for readability
|
||||
- **iPhone 12/13**: Optimized touch targets and spacing
|
||||
- **iPhone Pro Max**: Enhanced layout for larger screens
|
||||
- **Android phones**: Prevented zoom and improved touch handling
|
||||
|
||||
## 📱 Tablet Optimizations
|
||||
|
||||
### Touch-Friendly Design
|
||||
- **Comfortable touch targets**: 48px × 48px minimum
|
||||
- **Optimized spacing**: Balanced between mobile and desktop
|
||||
- **Orientation support**: Different layouts for portrait/landscape
|
||||
|
||||
### Layout Enhancements
|
||||
- **Flexible grid**: Lists adapt to available space
|
||||
- **Improved navigation**: Side menu optimized for touch
|
||||
- **Modal sizing**: 80-90vw width for better tablet experience
|
||||
|
||||
### Device-Specific Support
|
||||
- **iPad (9th gen)**: 768×1024 optimization
|
||||
- **iPad Air**: 810×1080 enhancement
|
||||
- **iPad Pro 11"**: 834×1194 refinement
|
||||
- **iPad Pro 12.9"**: 1024×1366 optimization
|
||||
- **Android tablets**: Portrait and landscape modes
|
||||
|
||||
## 💻 Desktop & Laptop Optimizations
|
||||
|
||||
### Standard Desktop (1024px - 1919px)
|
||||
- **Efficient use of space**: Optimal card and list sizing
|
||||
- **Hover effects**: Enhanced interactivity for mouse users
|
||||
- **Keyboard navigation**: Full keyboard accessibility
|
||||
- **Modal sizing**: Standard 500px/800px widths
|
||||
|
||||
### Large Displays (1920px+)
|
||||
- **Scaled typography**: Larger fonts for better readability
|
||||
- **Enhanced touch targets**: 56px+ for large displays
|
||||
- **Centered layout**: Max-width containers prevent excessive stretching
|
||||
- **Digital signage ready**: Optimized for TV and large displays
|
||||
|
||||
### Ultra-Wide & 4K (2560px+)
|
||||
- **Massive display support**: Up to 3200px max-width
|
||||
- **Enhanced typography**: 20-22px base font size
|
||||
- **Large touch targets**: 64px+ for digital signage
|
||||
- **Print optimization**: Clean print layouts
|
||||
|
||||
## ♿ Accessibility Features
|
||||
|
||||
### Keyboard Navigation
|
||||
- **Skip links**: Jump to main content and navigation
|
||||
- **Tab order**: Logical tab sequence throughout the app
|
||||
- **Arrow key navigation**: Navigate cards and lists with arrow keys
|
||||
- **Escape key**: Close modals and popovers
|
||||
- **Enter/Space**: Activate buttons and interactive elements
|
||||
|
||||
### Screen Reader Support
|
||||
- **ARIA labels**: Descriptive labels for all interactive elements
|
||||
- **Live regions**: Announce state changes and updates
|
||||
- **Role attributes**: Proper semantic roles for custom elements
|
||||
- **Focus management**: Clear focus indicators and restoration
|
||||
|
||||
### Visual Accessibility
|
||||
- **High contrast mode**: Enhanced borders and colors
|
||||
- **Focus indicators**: Clear 2px outline for keyboard users
|
||||
- **Reduced motion**: Respects user motion preferences
|
||||
- **Color independence**: Information not conveyed by color alone
|
||||
|
||||
### Touch Accessibility
|
||||
- **Large touch targets**: Minimum 44px for comfortable interaction
|
||||
- **Touch feedback**: Visual confirmation of touch interactions
|
||||
- **Gesture support**: Swipe and pinch gestures where appropriate
|
||||
- **Prevent accidental touches**: Proper touch action handling
|
||||
|
||||
## 🎨 Responsive Design Features
|
||||
|
||||
### Fluid Typography
|
||||
```css
|
||||
font: clamp(14px, 2.5vw, 18px) Roboto, Poppins, "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||
```
|
||||
- Scales smoothly between device sizes
|
||||
- Maintains readability across all screens
|
||||
- Uses system fonts for better performance
|
||||
|
||||
### Flexible Spacing
|
||||
```css
|
||||
padding: clamp(8px, 2vw, 16px);
|
||||
margin: clamp(12px, 1.5vw, 20px);
|
||||
```
|
||||
- Consistent spacing that adapts to screen size
|
||||
- Prevents cramped layouts on small screens
|
||||
- Maintains proper proportions on large displays
|
||||
|
||||
### Adaptive Layouts
|
||||
- **Mobile**: Single column, stacked navigation
|
||||
- **Tablet**: Flexible grid, touch-optimized
|
||||
- **Desktop**: Multi-column, hover effects
|
||||
- **Large displays**: Centered, max-width containers
|
||||
|
||||
## 🔧 Technical Implementation
|
||||
|
||||
### CSS Architecture
|
||||
1. **Base styles**: `layouts.css` - Core typography and layout
|
||||
2. **Responsive design**: `responsive-accessibility.css` - Cross-device compatibility
|
||||
3. **Device-specific**: `device-specific.css` - Targeted optimizations
|
||||
4. **Component styles**: Individual component CSS files
|
||||
|
||||
### JavaScript Enhancements
|
||||
1. **Accessibility**: `accessibility-enhancements.js` - ARIA, keyboard nav, screen readers
|
||||
2. **Device detection**: Input method detection and device classification
|
||||
3. **Focus management**: Focus trapping, restoration, and indicators
|
||||
4. **Touch handling**: Touch feedback and gesture support
|
||||
|
||||
### Viewport Configuration
|
||||
```html
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5, user-scalable=yes">
|
||||
```
|
||||
- Prevents horizontal scrolling
|
||||
- Allows zoom up to 500% (WCAG AAA)
|
||||
- Maintains usability at all zoom levels
|
||||
|
||||
## 📊 Performance Optimizations
|
||||
|
||||
### CSS Optimizations
|
||||
- **Efficient selectors**: Minimal specificity conflicts
|
||||
- **Hardware acceleration**: `transform` and `opacity` for animations
|
||||
- **Reduced repaints**: Optimized layout properties
|
||||
- **Critical CSS**: Above-the-fold styles prioritized
|
||||
|
||||
### JavaScript Optimizations
|
||||
- **Event delegation**: Efficient event handling
|
||||
- **Debounced resize**: Optimized window resize handling
|
||||
- **Lazy loading**: Dynamic content loading
|
||||
- **Memory management**: Proper cleanup of event listeners
|
||||
|
||||
## 🧪 Testing & Validation
|
||||
|
||||
### Device Testing
|
||||
- **Mobile**: iPhone 12 Mini, iPhone 13, Samsung Galaxy S21
|
||||
- **Tablet**: iPad (9th gen), iPad Air, iPad Pro, Samsung Tab S7
|
||||
- **Laptop**: MacBook Air, Dell XPS, HP Spectre
|
||||
- **Desktop**: 1920×1080, 2560×1440, 3440×1440 ultrawide
|
||||
- **Large displays**: 4K monitors, digital signage displays
|
||||
|
||||
### Accessibility Testing
|
||||
- **Screen readers**: NVDA, JAWS, VoiceOver
|
||||
- **Keyboard navigation**: Tab, arrow keys, Enter, Escape
|
||||
- **High contrast**: Windows and macOS high contrast modes
|
||||
- **Zoom testing**: 200%, 300%, 400% zoom levels
|
||||
|
||||
### Browser Support
|
||||
- **Chrome**: 90+ (mobile and desktop)
|
||||
- **Firefox**: 88+ (mobile and desktop)
|
||||
- **Safari**: 14+ (iOS and macOS)
|
||||
- **Edge**: 90+ (Windows and mobile)
|
||||
|
||||
## 🚀 Usage Guidelines
|
||||
|
||||
### For Developers
|
||||
1. **Use semantic HTML**: Proper heading hierarchy and landmarks
|
||||
2. **Include ARIA attributes**: Labels, roles, and states
|
||||
3. **Test keyboard navigation**: Ensure all functionality is keyboard accessible
|
||||
4. **Validate with screen readers**: Test with actual assistive technology
|
||||
|
||||
### For Designers
|
||||
1. **Maintain touch targets**: Minimum 44px for mobile, 48px+ for tablets
|
||||
2. **Use sufficient contrast**: 4.5:1 for normal text, 3:1 for large text
|
||||
3. **Design for motion sensitivity**: Provide reduced motion alternatives
|
||||
4. **Test at different sizes**: Verify layouts work across all breakpoints
|
||||
|
||||
### For Content Creators
|
||||
1. **Use descriptive text**: Clear, concise labels and instructions
|
||||
2. **Provide alt text**: Meaningful descriptions for images
|
||||
3. **Structure content**: Use proper heading hierarchy
|
||||
4. **Test with users**: Validate with actual users with disabilities
|
||||
|
||||
## 📈 Future Enhancements
|
||||
|
||||
### Planned Improvements
|
||||
- **Voice control**: Voice navigation support
|
||||
- **Eye tracking**: Eye tracking device compatibility
|
||||
- **Haptic feedback**: Touch device vibration feedback
|
||||
- **Advanced gestures**: Multi-touch gesture support
|
||||
|
||||
### Monitoring & Analytics
|
||||
- **Accessibility metrics**: Track accessibility usage patterns
|
||||
- **Performance monitoring**: Monitor responsive design performance
|
||||
- **User feedback**: Collect feedback on accessibility features
|
||||
- **Continuous improvement**: Regular updates based on user needs
|
||||
|
||||
## 📚 Resources
|
||||
|
||||
### WCAG Guidelines
|
||||
- [WCAG 2.1 AA Compliance](https://www.w3.org/WAI/WCAG21/quickref/)
|
||||
- [Mobile Accessibility Guidelines](https://www.w3.org/WAI/mobile/)
|
||||
- [Touch Target Guidelines](https://www.w3.org/WAI/WCAG21/Understanding/target-size.html)
|
||||
|
||||
### Testing Tools
|
||||
- [WAVE Web Accessibility Evaluator](https://wave.webaim.org/)
|
||||
- [axe DevTools](https://www.deque.com/axe/devtools/)
|
||||
- [Lighthouse Accessibility Audit](https://developers.google.com/web/tools/lighthouse)
|
||||
|
||||
### Documentation
|
||||
- [MDN Accessibility](https://developer.mozilla.org/en-US/docs/Web/Accessibility)
|
||||
- [WebAIM Resources](https://webaim.org/resources/)
|
||||
- [A11y Project](https://www.a11yproject.com/)
|
||||
|
||||
---
|
||||
|
||||
**Note**: This implementation ensures Wekan meets WCAG 2.1 AA standards and provides an excellent user experience across all devices and assistive technologies.
|
||||
@@ -0,0 +1,306 @@
|
||||
# Enhanced Attachment Migration System
|
||||
|
||||
## Overview
|
||||
|
||||
The Enhanced Attachment Migration System provides a comprehensive solution for managing attachment storage across multiple backends (filesystem, MongoDB GridFS, S3/MinIO) with CPU throttling, real-time monitoring, and secure configuration management.
|
||||
|
||||
## Features
|
||||
|
||||
### 1. Multi-Backend Storage Support
|
||||
- **Filesystem Storage**: Local file system storage using `WRITABLE_PATH`
|
||||
- **MongoDB GridFS**: Database-based file storage
|
||||
- **S3/MinIO**: Cloud and object storage compatibility
|
||||
|
||||
### 2. CPU Throttling
|
||||
- **Automatic CPU Monitoring**: Real-time CPU usage tracking
|
||||
- **Configurable Thresholds**: Set CPU usage limits (10-90%)
|
||||
- **Automatic Pausing**: Migration pauses when CPU threshold is exceeded
|
||||
- **Resume Capability**: Continue migration when CPU usage drops
|
||||
|
||||
### 3. Batch Processing
|
||||
- **Configurable Batch Size**: Process 1-100 attachments per batch
|
||||
- **Adjustable Delays**: Set delays between batches (100-10000ms)
|
||||
- **Progress Tracking**: Real-time progress monitoring
|
||||
- **Queue Management**: Intelligent migration queue handling
|
||||
|
||||
### 4. Security Features
|
||||
- **Password Protection**: S3 secret keys are never displayed
|
||||
- **Admin-Only Access**: All operations require admin privileges
|
||||
- **Secure Configuration**: Environment-based configuration management
|
||||
- **Audit Logging**: Comprehensive migration logging
|
||||
|
||||
### 5. Real-Time Monitoring
|
||||
- **Storage Statistics**: Live attachment counts and sizes
|
||||
- **Visual Charts**: Storage distribution visualization
|
||||
- **Migration Status**: Real-time migration progress
|
||||
- **System Metrics**: CPU, memory, and performance monitoring
|
||||
|
||||
## Admin Panel Interface
|
||||
|
||||
### Storage Settings
|
||||
- **Filesystem Configuration**: View and configure filesystem paths
|
||||
- **GridFS Status**: Monitor MongoDB GridFS availability
|
||||
- **S3/MinIO Configuration**: Secure S3/MinIO setup and testing
|
||||
- **Connection Testing**: Validate storage backend connections
|
||||
|
||||
### Migration Controls
|
||||
- **Batch Configuration**: Set batch size, delays, and CPU thresholds
|
||||
- **Migration Actions**: Start, pause, resume, and stop migrations
|
||||
- **Progress Monitoring**: Real-time progress bars and statistics
|
||||
- **Log Viewing**: Live migration logs with timestamps
|
||||
|
||||
### Monitoring Dashboard
|
||||
- **Storage Distribution**: Visual breakdown of attachment storage
|
||||
- **Size Analytics**: Total and per-storage size statistics
|
||||
- **Performance Metrics**: System resource usage
|
||||
- **Export Capabilities**: Download monitoring data
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
#### Filesystem Storage
|
||||
```bash
|
||||
# Base writable path for all file storage
|
||||
WRITABLE_PATH=/data
|
||||
|
||||
# Attachments will be stored at: ${WRITABLE_PATH}/attachments
|
||||
# Avatars will be stored at: ${WRITABLE_PATH}/avatars
|
||||
```
|
||||
|
||||
#### S3/MinIO Storage
|
||||
```bash
|
||||
# S3 configuration (JSON format)
|
||||
S3='{"s3":{"key":"access-key","secret":"secret-key","bucket":"bucket-name","endPoint":"s3.amazonaws.com","port":443,"sslEnabled":true,"region":"us-east-1"}}'
|
||||
|
||||
# Alternative: S3 secret file (Docker secrets)
|
||||
S3_SECRET_FILE=/run/secrets/s3_secret
|
||||
```
|
||||
|
||||
### Migration Settings
|
||||
|
||||
#### Default Configuration
|
||||
- **Batch Size**: 10 attachments per batch
|
||||
- **Delay**: 1000ms between batches
|
||||
- **CPU Threshold**: 70% maximum CPU usage
|
||||
- **Auto-pause**: When CPU exceeds threshold
|
||||
|
||||
#### Customization
|
||||
All settings can be adjusted through the admin panel:
|
||||
- Batch size: 1-100 attachments
|
||||
- Delay: 100-10000ms
|
||||
- CPU threshold: 10-90%
|
||||
|
||||
## Usage
|
||||
|
||||
### Starting a Migration
|
||||
|
||||
1. **Access Admin Panel**: Navigate to Settings → Attachment Settings
|
||||
2. **Configure Migration**: Set batch size, delay, and CPU threshold
|
||||
3. **Select Target Storage**: Choose filesystem, GridFS, or S3
|
||||
4. **Start Migration**: Click the appropriate migration button
|
||||
5. **Monitor Progress**: Watch real-time progress and logs
|
||||
|
||||
### Migration Process
|
||||
|
||||
1. **Queue Initialization**: All attachments are queued for migration
|
||||
2. **Batch Processing**: Attachments are processed in configurable batches
|
||||
3. **CPU Monitoring**: System continuously monitors CPU usage
|
||||
4. **Automatic Pausing**: Migration pauses if CPU threshold is exceeded
|
||||
5. **Resume Capability**: Migration resumes when CPU usage drops
|
||||
6. **Progress Tracking**: Real-time progress updates and logging
|
||||
|
||||
### Monitoring Migration
|
||||
|
||||
- **Progress Bar**: Visual progress indicator
|
||||
- **Statistics**: Total, migrated, and remaining attachment counts
|
||||
- **Status Display**: Current migration status (running, paused, idle)
|
||||
- **Log View**: Real-time migration logs with timestamps
|
||||
- **Control Buttons**: Pause, resume, and stop migration
|
||||
|
||||
## API Reference
|
||||
|
||||
### Server Methods
|
||||
|
||||
#### Migration Control
|
||||
```javascript
|
||||
// Start migration
|
||||
Meteor.call('startAttachmentMigration', {
|
||||
targetStorage: 'filesystem', // 'filesystem', 'gridfs', 's3'
|
||||
batchSize: 10,
|
||||
delayMs: 1000,
|
||||
cpuThreshold: 70
|
||||
});
|
||||
|
||||
// Pause migration
|
||||
Meteor.call('pauseAttachmentMigration');
|
||||
|
||||
// Resume migration
|
||||
Meteor.call('resumeAttachmentMigration');
|
||||
|
||||
// Stop migration
|
||||
Meteor.call('stopAttachmentMigration');
|
||||
```
|
||||
|
||||
#### Configuration Management
|
||||
```javascript
|
||||
// Get storage configuration
|
||||
Meteor.call('getAttachmentStorageConfiguration');
|
||||
|
||||
// Test S3 connection
|
||||
Meteor.call('testS3Connection', { secretKey: 'new-secret-key' });
|
||||
|
||||
// Save S3 settings
|
||||
Meteor.call('saveS3Settings', { secretKey: 'new-secret-key' });
|
||||
```
|
||||
|
||||
#### Monitoring
|
||||
```javascript
|
||||
// Get monitoring data
|
||||
Meteor.call('getAttachmentMonitoringData');
|
||||
|
||||
// Refresh monitoring data
|
||||
Meteor.call('refreshAttachmentMonitoringData');
|
||||
|
||||
// Export monitoring data
|
||||
Meteor.call('exportAttachmentMonitoringData');
|
||||
```
|
||||
|
||||
### Publications
|
||||
|
||||
#### Real-Time Updates
|
||||
```javascript
|
||||
// Subscribe to migration status
|
||||
Meteor.subscribe('attachmentMigrationStatus');
|
||||
|
||||
// Subscribe to monitoring data
|
||||
Meteor.subscribe('attachmentMonitoringData');
|
||||
```
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
### CPU Throttling
|
||||
- **Automatic Monitoring**: CPU usage is checked every 5 seconds
|
||||
- **Threshold-Based Pausing**: Migration pauses when CPU exceeds threshold
|
||||
- **Resume Logic**: Migration resumes when CPU usage drops below threshold
|
||||
- **Configurable Limits**: CPU thresholds can be adjusted (10-90%)
|
||||
|
||||
### Batch Processing
|
||||
- **Configurable Batches**: Batch size can be adjusted (1-100)
|
||||
- **Delay Control**: Delays between batches prevent system overload
|
||||
- **Queue Management**: Intelligent queue processing with error handling
|
||||
- **Progress Tracking**: Real-time progress updates
|
||||
|
||||
### Memory Management
|
||||
- **Streaming Processing**: Large files are processed using streams
|
||||
- **Memory Monitoring**: System memory usage is tracked
|
||||
- **Garbage Collection**: Automatic cleanup of processed data
|
||||
- **Error Recovery**: Robust error handling and recovery
|
||||
|
||||
## Security
|
||||
|
||||
### Access Control
|
||||
- **Admin-Only Access**: All operations require admin privileges
|
||||
- **User Authentication**: Proper user authentication and authorization
|
||||
- **Session Management**: Secure session handling
|
||||
|
||||
### Data Protection
|
||||
- **Password Security**: S3 secret keys are never displayed in UI
|
||||
- **Environment Variables**: Sensitive data stored in environment variables
|
||||
- **Secure Transmission**: All data transmission is encrypted
|
||||
- **Audit Logging**: Comprehensive logging of all operations
|
||||
|
||||
### Configuration Security
|
||||
- **Read-Only Display**: Sensitive configuration is displayed as read-only
|
||||
- **Password Updates**: Only new passwords can be set, not viewed
|
||||
- **Connection Testing**: Secure connection testing without exposing credentials
|
||||
- **Environment Isolation**: Configuration isolated from application code
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
#### Migration Not Starting
|
||||
- **Check Permissions**: Ensure user has admin privileges
|
||||
- **Verify Configuration**: Check storage backend configuration
|
||||
- **Review Logs**: Check server logs for error messages
|
||||
- **Test Connections**: Verify storage backend connectivity
|
||||
|
||||
#### High CPU Usage
|
||||
- **Reduce Batch Size**: Decrease batch size to reduce CPU load
|
||||
- **Increase Delays**: Add longer delays between batches
|
||||
- **Lower CPU Threshold**: Reduce CPU threshold for earlier pausing
|
||||
- **Monitor System**: Check system resource usage
|
||||
|
||||
#### Migration Pausing Frequently
|
||||
- **Check CPU Threshold**: Verify CPU threshold settings
|
||||
- **Monitor System Load**: Check for other high-CPU processes
|
||||
- **Adjust Settings**: Increase CPU threshold or reduce batch size
|
||||
- **System Optimization**: Optimize system performance
|
||||
|
||||
#### Storage Connection Issues
|
||||
- **Verify Credentials**: Check S3/MinIO credentials
|
||||
- **Test Connectivity**: Use connection test feature
|
||||
- **Check Network**: Verify network connectivity
|
||||
- **Review Configuration**: Validate storage configuration
|
||||
|
||||
### Debug Information
|
||||
|
||||
#### Migration Logs
|
||||
- **Real-Time Logs**: View live migration logs in admin panel
|
||||
- **Server Logs**: Check server console for detailed logs
|
||||
- **Error Messages**: Review error messages for specific issues
|
||||
- **Progress Tracking**: Monitor migration progress and statistics
|
||||
|
||||
#### System Monitoring
|
||||
- **CPU Usage**: Monitor CPU usage during migration
|
||||
- **Memory Usage**: Track memory consumption
|
||||
- **Disk I/O**: Monitor disk input/output operations
|
||||
- **Network Usage**: Check network bandwidth usage
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Migration Planning
|
||||
- **Schedule During Low Usage**: Run migrations during low-traffic periods
|
||||
- **Test First**: Test migration with small batches first
|
||||
- **Monitor Resources**: Keep an eye on system resources
|
||||
- **Have Backup**: Ensure data backup before migration
|
||||
|
||||
### Performance Optimization
|
||||
- **Optimize Batch Size**: Find optimal batch size for your system
|
||||
- **Adjust Delays**: Set appropriate delays between batches
|
||||
- **Monitor CPU**: Set realistic CPU thresholds
|
||||
- **Use Monitoring**: Regularly check monitoring data
|
||||
|
||||
### Security Practices
|
||||
- **Regular Updates**: Keep S3 credentials updated
|
||||
- **Access Control**: Limit admin access to necessary users
|
||||
- **Audit Logs**: Regularly review migration logs
|
||||
- **Environment Security**: Secure environment variable storage
|
||||
|
||||
## Future Enhancements
|
||||
|
||||
### Planned Features
|
||||
- **Incremental Migration**: Migrate only changed attachments
|
||||
- **Parallel Processing**: Support for parallel migration streams
|
||||
- **Advanced Scheduling**: Time-based migration scheduling
|
||||
- **Compression Support**: Built-in file compression during migration
|
||||
|
||||
### Integration Opportunities
|
||||
- **Cloud Storage**: Additional cloud storage providers
|
||||
- **CDN Integration**: Content delivery network support
|
||||
- **Backup Integration**: Automated backup during migration
|
||||
- **Analytics**: Advanced storage analytics and reporting
|
||||
|
||||
## Support
|
||||
|
||||
For issues and questions:
|
||||
1. Check this documentation
|
||||
2. Review server logs
|
||||
3. Use the monitoring tools
|
||||
4. Consult the Wekan community
|
||||
5. Report issues with detailed information
|
||||
|
||||
## License
|
||||
|
||||
This Enhanced Attachment Migration System is part of Wekan and is licensed under the MIT License.
|
||||
File renamed without changes.
@@ -10,7 +10,7 @@ This is without container (without Docker or Snap).
|
||||
|
||||
Right click and download files 1-4:
|
||||
|
||||
1. [wekan-7.99-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v7.99/wekan-7.99-amd64-windows.zip)
|
||||
1. [wekan-8.02-amd64-windows.zip](https://github.com/wekan/wekan/releases/download/v8.02/wekan-8.02-amd64-windows.zip)
|
||||
|
||||
2. [node.exe](https://nodejs.org/dist/latest-v14.x/win-x64/node.exe)
|
||||
|
||||
@@ -22,7 +22,7 @@ Right click and download files 1-4:
|
||||
|
||||
6. Double click `mongodb-windows-x86_64-7.0.25-signed.msi` . In installer, uncheck downloading MongoDB compass.
|
||||
|
||||
7. Unzip `wekan-7.99-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
|
||||
7. Unzip `wekan-8.02-amd64-windows.zip` , inside it is directory `bundle`, to it copy other files:
|
||||
|
||||
```
|
||||
bundle (directory)
|
||||
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "رفع صورة شخصية",
|
||||
"uploaded-avatar": "تم رفع الصورة الشخصية",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Качване",
|
||||
"upload-avatar": "Качване на аватар",
|
||||
"uploaded-avatar": "Качихте аватар",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Завършено",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Puja",
|
||||
"upload-avatar": "Actualitza avatar",
|
||||
"uploaded-avatar": "Avatar actualitzat",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "URL personalitzat de la imatge del logotip de la cantonada superior esquerra",
|
||||
"custom-top-left-corner-logo-link-url": "URL de l'enllaç del logotip de la cantonada superior esquerra personalitzada",
|
||||
"custom-top-left-corner-logo-height": "Alçada personalitzada del logotip de la cantonada superior esquerra. Per defecte: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completat",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "de",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Nahrát",
|
||||
"upload-avatar": "Nahrát avatar",
|
||||
"uploaded-avatar": "Avatar nahrán",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "URL obrázku vlastního loga v levém horním rohu",
|
||||
"custom-top-left-corner-logo-link-url": "URL odkazu vlastního loga v levém horním rohu",
|
||||
"custom-top-left-corner-logo-height": "Výška vlastního loga v horním levém rohu. Defaultně: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Dokončeno",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "z",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Nahrát",
|
||||
"upload-avatar": "Nahrát avatar",
|
||||
"uploaded-avatar": "Avatar nahrán",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "URL obrázku vlastního loga v levém horním rohu",
|
||||
"custom-top-left-corner-logo-link-url": "URL odkazu vlastního loga v levém horním rohu",
|
||||
"custom-top-left-corner-logo-height": "Výška vlastního loga v horním levém rohu. Defaultně: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Dokončeno",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "z",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Overfør",
|
||||
"upload-avatar": "Overfør en avatar",
|
||||
"uploaded-avatar": "Overførte en avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Fuldført",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "af",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Profilbild hochladen",
|
||||
"uploaded-avatar": "Profilbild hochgeladen",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Benutzerdefiniertes Logo oben links Bild URL",
|
||||
"custom-top-left-corner-logo-link-url": "Benutzerdefiniertes Logo oben links Link URL",
|
||||
"custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "abgeschlossen",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "von",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Profilbild hochladen",
|
||||
"uploaded-avatar": "Profilbild hochgeladen",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Benutzerdefiniertes Logo oben links Bild URL",
|
||||
"custom-top-left-corner-logo-link-url": "Benutzerdefiniertes Logo oben links Link URL",
|
||||
"custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "abgeschlossen",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "von",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Profilbild hochladen",
|
||||
"uploaded-avatar": "Profilbild hochgeladen",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Benutzerdefiniertes Logo oben links Bild URL",
|
||||
"custom-top-left-corner-logo-link-url": "Benutzerdefiniertes Logo oben links Link URL",
|
||||
"custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "Benutzer ist Aktiv - zum Deaktivieren klicken",
|
||||
"admin-people-user-inactive": "Benutzer ist Inaktiv - zum Aktivieren klicken",
|
||||
"accounts-lockout-all-users-unlocked": "Alle gesperrten Benutzer wurden entsperrt",
|
||||
"accounts-lockout-unlock-all": "Alle entsperren"
|
||||
"accounts-lockout-unlock-all": "Alle entsperren",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "abgeschlossen",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "von",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Gewicht",
|
||||
"idle": "Leerlauf",
|
||||
"complete": "Abgeschlossen",
|
||||
"cron": "Zeitplan"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Profilbild hochladen",
|
||||
"uploaded-avatar": "Profilbild hochgeladen",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Benutzerdefiniertes Logo oben links Bild URL",
|
||||
"custom-top-left-corner-logo-link-url": "Benutzerdefiniertes Logo oben links Link URL",
|
||||
"custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "abgeschlossen",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "von",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Μεταφόρτωση",
|
||||
"upload-avatar": "Μεταφόρτωση ενός avatar",
|
||||
"uploaded-avatar": "Μεταφόρτωσε ένα avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Μεταφόρτωση",
|
||||
"upload-avatar": "Μεταφόρτωση ενός avatar",
|
||||
"uploaded-avatar": "Μεταφόρτωσε ένα avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -149,7 +149,7 @@
|
||||
"auto-watch": "Automatically watch boards when they are created",
|
||||
"avatar-too-big": "The avatar is too large (__size__ max)",
|
||||
"back": "Back",
|
||||
"board-change-color": "Change colour",
|
||||
"board-change-color": "Change color",
|
||||
"board-change-background-image": "Change Background Image",
|
||||
"board-background-image-url": "Background Image URL",
|
||||
"add-background-image": "Add Background Image",
|
||||
@@ -167,7 +167,7 @@
|
||||
"board-drag-drop-reorder-or-click-open": "Drag and drop to reorder board icons. Click board icon to open board.",
|
||||
"boardChangeColorPopup-title": "Change Board Background",
|
||||
"boardChangeBackgroundImagePopup-title": "Change Background Image",
|
||||
"allBoardsChangeColorPopup-title": "Change colour",
|
||||
"allBoardsChangeColorPopup-title": "Change color",
|
||||
"allBoardsChangeBackgroundImagePopup-title": "Change Background Image",
|
||||
"boardChangeTitlePopup-title": "Rename Board",
|
||||
"boardChangeVisibilityPopup-title": "Change Visibility",
|
||||
@@ -384,9 +384,9 @@
|
||||
"email-fail": "Sending email failed",
|
||||
"email-fail-text": "Error trying to send email",
|
||||
"email-invalid": "Invalid email",
|
||||
"email-invite": "Invite via email",
|
||||
"email-invite": "Invite via Email",
|
||||
"email-invite-subject": "__inviter__ sent you an invitation",
|
||||
"email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaboration.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
|
||||
"email-invite-text": "Dear __user__,\n\n__inviter__ invites you to join board \"__board__\" for collaborations.\n\nPlease follow the link below:\n\n__url__\n\nThanks.",
|
||||
"email-resetPassword-subject": "Reset your password on __siteName__",
|
||||
"email-resetPassword-text": "Hello __user__,\n\nTo reset your password, simply click the link below.\n\n__url__\n\nThanks.",
|
||||
"email-sent": "Email sent",
|
||||
@@ -457,7 +457,7 @@
|
||||
"filter-to-selection": "Filter to selection",
|
||||
"other-filters-label": "Other Filters",
|
||||
"advanced-filter-label": "Advanced Filter",
|
||||
"advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\\\/) to be skipped, you can use \\\\. For example: Field1 == I\\\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i",
|
||||
"advanced-filter-description": "Advanced Filter allows to write a string containing following operators: == != <= >= && || ( ) A space is used as a separator between the Operators. You can filter for all Custom Fields by typing their names and values. For Example: Field1 == Value1. Note: If fields or values contains spaces, you need to encapsulate them into single quotes. For Example: 'Field 1' == 'Value 1'. For single control characters (' \\/) to be skipped, you can use \\. For example: Field1 == I\\'m. Also you can combine multiple conditions. For Example: F1 == V1 || F1 == V2. Normally all operators are interpreted from left to right. You can change the order by placing brackets. For Example: F1 == V1 && ( F2 == V2 || F2 == V3 ). Also you can search text fields using regex: F1 == /Tes.*/i",
|
||||
"fullname": "Full Name",
|
||||
"header-logo-title": "Go back to your boards page.",
|
||||
"show-activities": "Show Activities",
|
||||
@@ -520,7 +520,7 @@
|
||||
"listMorePopup-title": "More",
|
||||
"link-list": "Link to this list",
|
||||
"list-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the list. There is no undo.",
|
||||
"list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve its activity.",
|
||||
"list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.",
|
||||
"lists": "Lists",
|
||||
"swimlanes": "Swimlanes",
|
||||
"log-out": "Log Out",
|
||||
@@ -585,7 +585,7 @@
|
||||
"rules": "Rules",
|
||||
"search-cards": "Search from card/list titles, descriptions and custom fields on this board",
|
||||
"search-example": "Write text you search and press Enter",
|
||||
"select-color": "Select Colour",
|
||||
"select-color": "Select Color",
|
||||
"select-board": "Select Board",
|
||||
"set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
|
||||
"setWipLimitPopup-title": "Set WIP Limit",
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -642,10 +645,10 @@
|
||||
"username": "Username",
|
||||
"import-usernames": "Import Usernames",
|
||||
"view-it": "View it",
|
||||
"warn-list-archived": "warning: this card is in a list in the Archive",
|
||||
"warn-list-archived": "warning: this card is in an list at Archive",
|
||||
"watch": "Watch",
|
||||
"watching": "Watching",
|
||||
"watching-info": "You will be notified of any changes in this board",
|
||||
"watching-info": "You will be notified of any change in this board",
|
||||
"welcome-board": "Welcome Board",
|
||||
"welcome-swimlane": "Milestone 1",
|
||||
"welcome-list1": "Basics",
|
||||
@@ -683,7 +686,7 @@
|
||||
"email-smtp-test-subject": "SMTP Test Email",
|
||||
"email-smtp-test-text": "You have successfully sent an email",
|
||||
"error-invitation-code-not-exist": "Invitation code doesn't exist",
|
||||
"error-notAuthorized": "You are not authorised to view this page.",
|
||||
"error-notAuthorized": "You are not authorized to view this page.",
|
||||
"webhook-title": "Webhook Name",
|
||||
"webhook-token": "Token (Optional for Authentication)",
|
||||
"outgoing-webhooks": "Outgoing Webhooks",
|
||||
@@ -906,7 +909,7 @@
|
||||
"default-authentication-method": "Default Authentication Method",
|
||||
"duplicate-board": "Duplicate Board",
|
||||
"duplicate-board-confirm": "Are you sure you want to duplicate this board?",
|
||||
"org-number": "The number of organisations is: ",
|
||||
"org-number": "The number of organizations is: ",
|
||||
"team-number": "The number of teams is: ",
|
||||
"people-number": "The number of people is: ",
|
||||
"swimlaneDeletePopup-title": "Delete Swimlane ?",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -1313,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
@@ -631,6 +631,9 @@
|
||||
"upload": "Upload",
|
||||
"upload-avatar": "Upload an avatar",
|
||||
"uploaded-avatar": "Uploaded an avatar",
|
||||
"uploading-files": "Uploading files",
|
||||
"upload-failed": "Upload failed",
|
||||
"upload-completed": "Upload completed",
|
||||
"custom-top-left-corner-logo-image-url": "Custom Top Left Corner Logo Image URL",
|
||||
"custom-top-left-corner-logo-link-url": "Custom Top Left Corner Logo Link URL",
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
@@ -1310,5 +1313,180 @@
|
||||
"admin-people-user-active": "User is active - click to deactivate",
|
||||
"admin-people-user-inactive": "User is inactive - click to activate",
|
||||
"accounts-lockout-all-users-unlocked": "All locked users have been unlocked",
|
||||
"accounts-lockout-unlock-all": "Unlock All"
|
||||
"accounts-lockout-unlock-all": "Unlock All",
|
||||
"active-cron-jobs": "Active Scheduled Jobs",
|
||||
"add-cron-job": "Add Scheduled Job",
|
||||
"add-cron-job-placeholder": "Add Scheduled Job functionality coming soon",
|
||||
"attachment-storage-configuration": "Attachment Storage Configuration",
|
||||
"attachments-path": "Attachments Path",
|
||||
"attachments-path-description": "Path where attachment files are stored",
|
||||
"avatars-path": "Avatars Path",
|
||||
"avatars-path-description": "Path where avatar files are stored",
|
||||
"board-archive-failed": "Failed to schedule board archive",
|
||||
"board-archive-scheduled": "Board archive scheduled successfully",
|
||||
"board-backup-failed": "Failed to schedule board backup",
|
||||
"board-backup-scheduled": "Board backup scheduled successfully",
|
||||
"board-cleanup-failed": "Failed to schedule board cleanup",
|
||||
"board-cleanup-scheduled": "Board cleanup scheduled successfully",
|
||||
"board-operations": "Board Operations",
|
||||
"cron-jobs": "Scheduled Jobs",
|
||||
"cron-migrations": "Scheduled Migrations",
|
||||
"cron-job-delete-confirm": "Are you sure you want to delete this scheduled job?",
|
||||
"cron-job-delete-failed": "Failed to delete scheduled job",
|
||||
"cron-job-deleted": "Scheduled job deleted successfully",
|
||||
"cron-job-pause-failed": "Failed to pause scheduled job",
|
||||
"cron-job-paused": "Scheduled job paused successfully",
|
||||
"filesystem-path-description": "Base path for file storage",
|
||||
"gridfs-enabled": "GridFS Enabled",
|
||||
"gridfs-enabled-description": "Use MongoDB GridFS for file storage",
|
||||
"migration-pause-failed": "Failed to pause migrations",
|
||||
"migration-paused": "Migrations paused successfully",
|
||||
"migration-progress": "Migration Progress",
|
||||
"migration-start-failed": "Failed to start migrations",
|
||||
"migration-started": "Migrations started successfully",
|
||||
"migration-status": "Migration Status",
|
||||
"migration-stop-confirm": "Are you sure you want to stop all migrations?",
|
||||
"migration-stop-failed": "Failed to stop migrations",
|
||||
"migration-stopped": "Migrations stopped successfully",
|
||||
"mongodb-gridfs-storage": "MongoDB GridFS Storage",
|
||||
"pause-all-migrations": "Pause All Migrations",
|
||||
"s3-access-key": "S3 Access Key",
|
||||
"s3-access-key-description": "AWS S3 access key for authentication",
|
||||
"s3-access-key-placeholder": "Enter S3 access key",
|
||||
"s3-bucket": "S3 Bucket",
|
||||
"s3-bucket-description": "S3 bucket name for storing files",
|
||||
"s3-connection-failed": "S3 connection failed",
|
||||
"s3-connection-success": "S3 connection successful",
|
||||
"s3-enabled": "S3 Enabled",
|
||||
"s3-enabled-description": "Use AWS S3 or MinIO for file storage",
|
||||
"s3-endpoint": "S3 Endpoint",
|
||||
"s3-endpoint-description": "S3 endpoint URL (e.g., s3.amazonaws.com or minio.example.com)",
|
||||
"s3-minio-storage": "S3/MinIO Storage",
|
||||
"s3-port": "S3 Port",
|
||||
"s3-port-description": "S3 endpoint port number",
|
||||
"s3-region": "S3 Region",
|
||||
"s3-region-description": "AWS S3 region (e.g., us-east-1)",
|
||||
"s3-secret-key": "S3 Secret Key",
|
||||
"s3-secret-key-description": "AWS S3 secret key for authentication",
|
||||
"s3-secret-key-placeholder": "Enter S3 secret key",
|
||||
"s3-secret-key-required": "S3 secret key is required",
|
||||
"s3-settings-save-failed": "Failed to save S3 settings",
|
||||
"s3-settings-saved": "S3 settings saved successfully",
|
||||
"s3-ssl-enabled": "S3 SSL Enabled",
|
||||
"s3-ssl-enabled-description": "Use SSL/TLS for S3 connections",
|
||||
"save-s3-settings": "Save S3 Settings",
|
||||
"schedule-board-archive": "Schedule Board Archive",
|
||||
"schedule-board-backup": "Schedule Board Backup",
|
||||
"schedule-board-cleanup": "Schedule Board Cleanup",
|
||||
"scheduled-board-operations": "Scheduled Board Operations",
|
||||
"start-all-migrations": "Start All Migrations",
|
||||
"stop-all-migrations": "Stop All Migrations",
|
||||
"test-s3-connection": "Test S3 Connection",
|
||||
"writable-path": "Writable Path",
|
||||
"writable-path-description": "Base directory path for file storage",
|
||||
"add-job": "Add Job",
|
||||
"attachment-migration": "Attachment Migration",
|
||||
"attachment-monitoring": "Attachment Monitoring",
|
||||
"attachment-settings": "Attachment Settings",
|
||||
"attachment-storage-settings": "Storage Settings",
|
||||
"automatic-migration": "Automatic Migration",
|
||||
"back-to-settings": "Back to Settings",
|
||||
"board-id": "Board ID",
|
||||
"board-migration": "Board Migration",
|
||||
"card-show-lists-on-minicard": "Show Lists on Minicard",
|
||||
"cleanup": "Cleanup",
|
||||
"cleanup-old-jobs": "Cleanup Old Jobs",
|
||||
"completed": "Completed",
|
||||
"conversion-info-text": "This conversion is performed once per board and improves performance. You can continue using the board normally.",
|
||||
"converting-board": "Converting Board",
|
||||
"converting-board-description": "Converting board structure for improved functionality. This may take a few moments.",
|
||||
"cpu-cores": "CPU Cores",
|
||||
"cpu-usage": "CPU Usage",
|
||||
"current-action": "Current Action",
|
||||
"database-migration": "Database Migration",
|
||||
"database-migration-description": "Updating database structure for improved functionality and performance. This process may take several minutes.",
|
||||
"database-migrations": "Database Migrations",
|
||||
"days-old": "Days Old",
|
||||
"duration": "Duration",
|
||||
"errors": "Errors",
|
||||
"estimated-time-remaining": "Estimated time remaining",
|
||||
"every-1-day": "Every 1 day",
|
||||
"every-1-hour": "Every 1 hour",
|
||||
"every-1-minute": "Every 1 minute",
|
||||
"every-10-minutes": "Every 10 minutes",
|
||||
"every-30-minutes": "Every 30 minutes",
|
||||
"every-5-minutes": "Every 5 minutes",
|
||||
"every-6-hours": "Every 6 hours",
|
||||
"export-monitoring": "Export Monitoring",
|
||||
"filesystem-attachments": "Filesystem Attachments",
|
||||
"filesystem-size": "Filesystem Size",
|
||||
"filesystem-storage": "Filesystem Storage",
|
||||
"force-board-scan": "Force Board Scan",
|
||||
"gridfs-attachments": "GridFS Attachments",
|
||||
"gridfs-size": "GridFS Size",
|
||||
"gridfs-storage": "GridFS",
|
||||
"hide-list-on-minicard": "Hide List on Minicard",
|
||||
"idle-migration": "Idle Migration",
|
||||
"job-description": "Job Description",
|
||||
"job-details": "Job Details",
|
||||
"job-name": "Job Name",
|
||||
"job-queue": "Job Queue",
|
||||
"last-run": "Last Run",
|
||||
"max-concurrent": "Max Concurrent",
|
||||
"memory-usage": "Memory Usage",
|
||||
"migrate-all-to-filesystem": "Migrate All to Filesystem",
|
||||
"migrate-all-to-gridfs": "Migrate All to GridFS",
|
||||
"migrate-all-to-s3": "Migrate All to S3",
|
||||
"migrated-attachments": "Migrated Attachments",
|
||||
"migration-batch-size": "Batch Size",
|
||||
"migration-batch-size-description": "Number of attachments to process in each batch (1-100)",
|
||||
"migration-cpu-threshold": "CPU Threshold (%)",
|
||||
"migration-cpu-threshold-description": "Pause migration when CPU usage exceeds this percentage (10-90)",
|
||||
"migration-delay-ms": "Delay (ms)",
|
||||
"migration-delay-ms-description": "Delay between batches in milliseconds (100-10000)",
|
||||
"migration-detector": "Migration Detector",
|
||||
"migration-info-text": "Database migrations are performed once and improve system performance. The process continues in the background even if you close your browser.",
|
||||
"migration-log": "Migration Log",
|
||||
"migration-markers": "Migration Markers",
|
||||
"migration-resume-failed": "Failed to resume migration",
|
||||
"migration-resumed": "Migration resumed",
|
||||
"migration-steps": "Migration Steps",
|
||||
"migration-warning-text": "Please do not close your browser during migration. The process will continue in the background but may take longer to complete.",
|
||||
"monitoring-export-failed": "Failed to export monitoring data",
|
||||
"monitoring-refresh-failed": "Failed to refresh monitoring data",
|
||||
"next": "Next",
|
||||
"next-run": "Next Run",
|
||||
"of": "of",
|
||||
"operation-type": "Operation Type",
|
||||
"overall-progress": "Overall Progress",
|
||||
"page": "Page",
|
||||
"pause-migration": "Pause Migration",
|
||||
"previous": "Previous",
|
||||
"refresh": "Refresh",
|
||||
"refresh-monitoring": "Refresh Monitoring",
|
||||
"remaining-attachments": "Remaining Attachments",
|
||||
"resume-migration": "Resume Migration",
|
||||
"run-once": "Run once",
|
||||
"s3-attachments": "S3 Attachments",
|
||||
"s3-size": "S3 Size",
|
||||
"s3-storage": "S3",
|
||||
"scanning-status": "Scanning Status",
|
||||
"schedule": "Schedule",
|
||||
"search-boards-or-operations": "Search boards or operations...",
|
||||
"show-list-on-minicard": "Show List on Minicard",
|
||||
"showing": "Showing",
|
||||
"start-test-operation": "Start Test Operation",
|
||||
"start-time": "Start Time",
|
||||
"step-progress": "Step Progress",
|
||||
"stop-migration": "Stop Migration",
|
||||
"storage-distribution": "Storage Distribution",
|
||||
"system-resources": "System Resources",
|
||||
"total-attachments": "Total Attachments",
|
||||
"total-operations": "Total Operations",
|
||||
"total-size": "Total Size",
|
||||
"unmigrated-boards": "Unmigrated Boards",
|
||||
"weight": "Weight",
|
||||
"idle": "Idle",
|
||||
"complete": "Complete",
|
||||
"cron": "Cron"
|
||||
}
|
||||
Loaded 100 of 244 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user