mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-13 09:20:29 +00:00
Refactor SAR marker handling and add template management
- Updated CompassSarList and DetailedCompassDialog to use marker.displayName instead of marker.type.displayName. - Enhanced DrawingLayer and DrawingMarkersLayer to support simple mode for drawing visibility and interaction. - Added toggle switches in DrawingToolbar for showing/hiding received drawings and SAR markers. - Modified MapMarkers to utilize custom emojis and display names for markers. - Introduced RecipientSelectorSheet for selecting message recipients with search functionality. - Refactored SarUpdateSheet to use SAR templates instead of marker types, allowing for emoji and name customization. - Created SarTemplateEditDialog for adding and editing SAR templates with color selection and preview.
This commit is contained in:
@@ -207,6 +207,16 @@
|
||||
"description": "Description for RX/TX indicators setting"
|
||||
},
|
||||
|
||||
"simpleMode": "Simple Mode",
|
||||
"@simpleMode": {
|
||||
"description": "Setting to enable simple mode"
|
||||
},
|
||||
|
||||
"simpleModeDescription": "Hide non-essential information in messages and contacts",
|
||||
"@simpleModeDescription": {
|
||||
"description": "Description for simple mode setting"
|
||||
},
|
||||
|
||||
"language": "Language",
|
||||
"@language": {
|
||||
"description": "Language setting label"
|
||||
@@ -514,7 +524,7 @@
|
||||
"description": "Refresh button label"
|
||||
},
|
||||
|
||||
"sendDirectMessage": "Send Direct Message",
|
||||
"sendDirectMessage": "Send",
|
||||
"@sendDirectMessage": {
|
||||
"description": "Action to send direct message to contact"
|
||||
},
|
||||
@@ -634,6 +644,36 @@
|
||||
"description": "Action to clear all local drawings"
|
||||
},
|
||||
|
||||
"showReceivedDrawings": "Show Received Drawings",
|
||||
"@showReceivedDrawings": {
|
||||
"description": "Toggle to show/hide received drawings from other team members"
|
||||
},
|
||||
|
||||
"showingAllDrawings": "Showing all drawings",
|
||||
"@showingAllDrawings": {
|
||||
"description": "Subtitle when received drawings are visible"
|
||||
},
|
||||
|
||||
"showingOnlyYourDrawings": "Showing only your drawings",
|
||||
"@showingOnlyYourDrawings": {
|
||||
"description": "Subtitle when received drawings are hidden"
|
||||
},
|
||||
|
||||
"showSarMarkers": "Show SAR Markers",
|
||||
"@showSarMarkers": {
|
||||
"description": "Toggle to show/hide SAR markers on map"
|
||||
},
|
||||
|
||||
"showingSarMarkers": "Showing SAR markers",
|
||||
"@showingSarMarkers": {
|
||||
"description": "Subtitle when SAR markers are visible"
|
||||
},
|
||||
|
||||
"hidingSarMarkers": "Hiding SAR markers",
|
||||
"@hidingSarMarkers": {
|
||||
"description": "Subtitle when SAR markers are hidden"
|
||||
},
|
||||
|
||||
"clearAll": "Clear All",
|
||||
"@clearAll": {
|
||||
"description": "Clear all button label"
|
||||
@@ -762,6 +802,11 @@
|
||||
"description": "Label for location section"
|
||||
},
|
||||
|
||||
"myLocation": "My Location",
|
||||
"@myLocation": {
|
||||
"description": "Button label to insert current GPS location"
|
||||
},
|
||||
|
||||
"fromMap": "From Map",
|
||||
"@fromMap": {
|
||||
"description": "Badge showing location is from map tap"
|
||||
@@ -1125,6 +1170,21 @@
|
||||
"description": "GPS accuracy label"
|
||||
},
|
||||
|
||||
"distance": "Distance",
|
||||
"@distance": {
|
||||
"description": "Distance label in compass"
|
||||
},
|
||||
|
||||
"bearing": "Bearing",
|
||||
"@bearing": {
|
||||
"description": "Bearing label in compass"
|
||||
},
|
||||
|
||||
"direction": "Direction",
|
||||
"@direction": {
|
||||
"description": "Direction label in compass"
|
||||
},
|
||||
|
||||
"filterMarkers": "Filter Markers",
|
||||
"@filterMarkers": {
|
||||
"description": "Title for filter markers dialog"
|
||||
@@ -1538,6 +1598,21 @@
|
||||
"description": "ESRI Satellite imagery layer name"
|
||||
},
|
||||
|
||||
"googleHybrid": "Google Hybrid",
|
||||
"@googleHybrid": {
|
||||
"description": "Google Hybrid layer name (satellite + labels)"
|
||||
},
|
||||
|
||||
"googleRoadmap": "Google Roadmap",
|
||||
"@googleRoadmap": {
|
||||
"description": "Google Roadmap layer name (street map)"
|
||||
},
|
||||
|
||||
"googleTerrain": "Google Terrain",
|
||||
"@googleTerrain": {
|
||||
"description": "Google Terrain layer name (topographic)"
|
||||
},
|
||||
|
||||
"downloadVisibleArea": "Download visible area",
|
||||
"@downloadVisibleArea": {
|
||||
"description": "Tooltip for download visible area button"
|
||||
@@ -1673,6 +1748,26 @@
|
||||
"description": "Info message when message is deleted"
|
||||
},
|
||||
|
||||
"copyText": "Copy text",
|
||||
"@copyText": {
|
||||
"description": "Option to copy message text to clipboard"
|
||||
},
|
||||
|
||||
"textCopiedToClipboard": "Text copied to clipboard",
|
||||
"@textCopiedToClipboard": {
|
||||
"description": "Success message when text is copied"
|
||||
},
|
||||
|
||||
"deleteMessage": "Delete message",
|
||||
"@deleteMessage": {
|
||||
"description": "Dialog title for deleting a message"
|
||||
},
|
||||
|
||||
"deleteMessageConfirmation": "Are you sure you want to delete this message?",
|
||||
"@deleteMessageConfirmation": {
|
||||
"description": "Confirmation text for message deletion"
|
||||
},
|
||||
|
||||
"refreshedContacts": "Refreshed contacts",
|
||||
"@refreshedContacts": {
|
||||
"description": "Success message when contacts are refreshed"
|
||||
@@ -1901,6 +1996,111 @@
|
||||
"description": "Error message when MBTiles deletion fails"
|
||||
},
|
||||
|
||||
"importExportCachedTiles": "Import/Export Cached Tiles",
|
||||
"@importExportCachedTiles": {
|
||||
"description": "Title for import/export section"
|
||||
},
|
||||
|
||||
"importExportDescription": "Backup, share, and restore downloaded map tiles between devices",
|
||||
"@importExportDescription": {
|
||||
"description": "Description for import/export functionality"
|
||||
},
|
||||
|
||||
"exportTilesToFile": "Export Tiles to File",
|
||||
"@exportTilesToFile": {
|
||||
"description": "Button to export tiles to archive file"
|
||||
},
|
||||
|
||||
"importTilesFromFile": "Import Tiles from File",
|
||||
"@importTilesFromFile": {
|
||||
"description": "Button to import tiles from archive file"
|
||||
},
|
||||
|
||||
"selectExportLocation": "Select Export Location",
|
||||
"@selectExportLocation": {
|
||||
"description": "Title for export file picker"
|
||||
},
|
||||
|
||||
"selectImportFile": "Select Tile Archive",
|
||||
"@selectImportFile": {
|
||||
"description": "Title for import file picker"
|
||||
},
|
||||
|
||||
"exportingTiles": "Exporting tiles...",
|
||||
"@exportingTiles": {
|
||||
"description": "Status message during export"
|
||||
},
|
||||
|
||||
"importingTiles": "Importing tiles...",
|
||||
"@importingTiles": {
|
||||
"description": "Status message during import"
|
||||
},
|
||||
|
||||
"exportSuccess": "Exported {count} tiles successfully",
|
||||
"@exportSuccess": {
|
||||
"description": "Success message after export",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"importSuccess": "Imported {count} stores successfully",
|
||||
"@importSuccess": {
|
||||
"description": "Success message after import",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"exportFailed": "Export failed: {error}",
|
||||
"@exportFailed": {
|
||||
"description": "Error message when export fails",
|
||||
"placeholders": {
|
||||
"error": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"importFailed": "Import failed: {error}",
|
||||
"@importFailed": {
|
||||
"description": "Error message when import fails",
|
||||
"placeholders": {
|
||||
"error": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"exportNote": "Creates a compressed archive (.fmtc) file that can be shared and imported on other devices.",
|
||||
"@exportNote": {
|
||||
"description": "Note about export functionality"
|
||||
},
|
||||
|
||||
"importNote": "Imports map tiles from a previously exported archive file. Tiles will be merged with existing cache.",
|
||||
"@importNote": {
|
||||
"description": "Note about import functionality"
|
||||
},
|
||||
|
||||
"noTilesToExport": "No tiles available to export",
|
||||
"@noTilesToExport": {
|
||||
"description": "Message when cache is empty"
|
||||
},
|
||||
|
||||
"archiveContainsStores": "Archive contains {count} stores",
|
||||
"@archiveContainsStores": {
|
||||
"description": "Information about archive contents",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"vectorTiles": "Vector Tiles",
|
||||
"@vectorTiles": {
|
||||
"description": "Label for vector tile type"
|
||||
@@ -2139,5 +2339,305 @@
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"sarTemplates": "SAR Templates",
|
||||
"@sarTemplates": {
|
||||
"description": "SAR templates menu title"
|
||||
},
|
||||
|
||||
"manageSarTemplates": "Manage cursor on target templates",
|
||||
"@manageSarTemplates": {
|
||||
"description": "Subtitle for SAR templates settings"
|
||||
},
|
||||
|
||||
"addTemplate": "Add Template",
|
||||
"@addTemplate": {
|
||||
"description": "Button to add new SAR template"
|
||||
},
|
||||
|
||||
"editTemplate": "Edit Template",
|
||||
"@editTemplate": {
|
||||
"description": "Dialog title for editing template"
|
||||
},
|
||||
|
||||
"deleteTemplate": "Delete Template",
|
||||
"@deleteTemplate": {
|
||||
"description": "Action to delete template"
|
||||
},
|
||||
|
||||
"templateName": "Template Name",
|
||||
"@templateName": {
|
||||
"description": "Label for template name field"
|
||||
},
|
||||
|
||||
"templateNameHint": "e.g. Found Person",
|
||||
"@templateNameHint": {
|
||||
"description": "Hint text for template name"
|
||||
},
|
||||
|
||||
"templateEmoji": "Emoji",
|
||||
"@templateEmoji": {
|
||||
"description": "Label for template emoji field"
|
||||
},
|
||||
|
||||
"emojiRequired": "Emoji is required",
|
||||
"@emojiRequired": {
|
||||
"description": "Validation error when emoji field is empty"
|
||||
},
|
||||
|
||||
"nameRequired": "Name is required",
|
||||
"@nameRequired": {
|
||||
"description": "Validation error when name field is empty"
|
||||
},
|
||||
|
||||
"templateDescription": "Description (Optional)",
|
||||
"@templateDescription": {
|
||||
"description": "Label for template description field"
|
||||
},
|
||||
|
||||
"templateDescriptionHint": "Add additional context...",
|
||||
"@templateDescriptionHint": {
|
||||
"description": "Hint text for template description"
|
||||
},
|
||||
|
||||
"templateColor": "Color",
|
||||
"@templateColor": {
|
||||
"description": "Label for template color picker"
|
||||
},
|
||||
|
||||
"previewFormat": "Preview (SAR Message Format)",
|
||||
"@previewFormat": {
|
||||
"description": "Label for format preview"
|
||||
},
|
||||
|
||||
"importFromClipboard": "Import",
|
||||
"@importFromClipboard": {
|
||||
"description": "Button to import templates from clipboard"
|
||||
},
|
||||
|
||||
"exportToClipboard": "Export",
|
||||
"@exportToClipboard": {
|
||||
"description": "Button to export templates to clipboard"
|
||||
},
|
||||
|
||||
"deleteTemplateConfirmation": "Delete template '{name}'?",
|
||||
"@deleteTemplateConfirmation": {
|
||||
"description": "Confirmation message for template deletion",
|
||||
"placeholders": {
|
||||
"name": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"templateAdded": "Template added",
|
||||
"@templateAdded": {
|
||||
"description": "Success message when template is added"
|
||||
},
|
||||
|
||||
"templateUpdated": "Template updated",
|
||||
"@templateUpdated": {
|
||||
"description": "Success message when template is updated"
|
||||
},
|
||||
|
||||
"templateDeleted": "Template deleted",
|
||||
"@templateDeleted": {
|
||||
"description": "Success message when template is deleted"
|
||||
},
|
||||
|
||||
"templatesImported": "{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}",
|
||||
"@templatesImported": {
|
||||
"description": "Success message after importing templates",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"templatesExported": "{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}",
|
||||
"@templatesExported": {
|
||||
"description": "Success message after exporting templates",
|
||||
"placeholders": {
|
||||
"count": {
|
||||
"type": "int"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"importFailed": "Import failed: {error}",
|
||||
"@importFailed": {
|
||||
"description": "Error message when import fails",
|
||||
"placeholders": {
|
||||
"error": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"exportFailed": "Export failed: {error}",
|
||||
"@exportFailed": {
|
||||
"description": "Error message when export fails",
|
||||
"placeholders": {
|
||||
"error": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"resetToDefaults": "Reset to Defaults",
|
||||
"@resetToDefaults": {
|
||||
"description": "Action to reset templates to defaults"
|
||||
},
|
||||
|
||||
"resetToDefaultsConfirmation": "This will delete all custom templates and restore the 4 default templates. Continue?",
|
||||
"@resetToDefaultsConfirmation": {
|
||||
"description": "Confirmation message for reset to defaults"
|
||||
},
|
||||
|
||||
"reset": "Reset",
|
||||
"@reset": {
|
||||
"description": "Reset button label"
|
||||
},
|
||||
|
||||
"resetComplete": "Templates reset to defaults",
|
||||
"@resetComplete": {
|
||||
"description": "Success message after reset"
|
||||
},
|
||||
|
||||
"noTemplates": "No templates available",
|
||||
"@noTemplates": {
|
||||
"description": "Message when no templates exist"
|
||||
},
|
||||
|
||||
"tapAddToCreate": "Tap + to create your first template",
|
||||
"@tapAddToCreate": {
|
||||
"description": "Helper text when no templates exist"
|
||||
},
|
||||
|
||||
"ok": "OK",
|
||||
"@ok": {
|
||||
"description": "OK button label"
|
||||
},
|
||||
|
||||
"delete": "Delete",
|
||||
"@delete": {
|
||||
"description": "Delete button label"
|
||||
},
|
||||
|
||||
"permissionsSection": "Permissions",
|
||||
"@permissionsSection": {
|
||||
"description": "Permissions section header"
|
||||
},
|
||||
|
||||
"locationPermission": "Location Permission",
|
||||
"@locationPermission": {
|
||||
"description": "Location permission label"
|
||||
},
|
||||
|
||||
"checking": "Checking...",
|
||||
"@checking": {
|
||||
"description": "Loading state indicator"
|
||||
},
|
||||
|
||||
"locationPermissionGrantedAlways": "Granted (Always)",
|
||||
"@locationPermissionGrantedAlways": {
|
||||
"description": "Location permission status: granted always"
|
||||
},
|
||||
|
||||
"locationPermissionGrantedWhileInUse": "Granted (While In Use)",
|
||||
"@locationPermissionGrantedWhileInUse": {
|
||||
"description": "Location permission status: granted while in use"
|
||||
},
|
||||
|
||||
"locationPermissionDeniedTapToRequest": "Denied - Tap to request",
|
||||
"@locationPermissionDeniedTapToRequest": {
|
||||
"description": "Location permission status: denied, user can request"
|
||||
},
|
||||
|
||||
"locationPermissionPermanentlyDeniedOpenSettings": "Permanently Denied - Open Settings",
|
||||
"@locationPermissionPermanentlyDeniedOpenSettings": {
|
||||
"description": "Location permission status: permanently denied"
|
||||
},
|
||||
|
||||
"locationPermissionDialogContent": "Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.",
|
||||
"@locationPermissionDialogContent": {
|
||||
"description": "Content for location permission dialog when permanently denied"
|
||||
},
|
||||
|
||||
"openSettings": "Open Settings",
|
||||
"@openSettings": {
|
||||
"description": "Button to open device settings"
|
||||
},
|
||||
|
||||
"locationPermissionGranted": "Location permission granted!",
|
||||
"@locationPermissionGranted": {
|
||||
"description": "Success message when location permission is granted"
|
||||
},
|
||||
|
||||
"locationPermissionRequiredForGps": "Location permission is required for GPS tracking and location sharing.",
|
||||
"@locationPermissionRequiredForGps": {
|
||||
"description": "Info message about location permission requirement"
|
||||
},
|
||||
|
||||
"locationPermissionAlreadyGranted": "Location permission is already granted.",
|
||||
"@locationPermissionAlreadyGranted": {
|
||||
"description": "Info message when permission is already granted"
|
||||
},
|
||||
|
||||
"sarNavyBlue": "SAR Navy Blue",
|
||||
"@sarNavyBlue": {
|
||||
"description": "SAR Navy Blue theme name"
|
||||
},
|
||||
|
||||
"sarNavyBlueDescription": "Professional/Operations Mode",
|
||||
"@sarNavyBlueDescription": {
|
||||
"description": "Description for SAR Navy Blue theme"
|
||||
},
|
||||
|
||||
"selectRecipient": "Select Recipient",
|
||||
"@selectRecipient": {
|
||||
"description": "Title for recipient selector sheet"
|
||||
},
|
||||
|
||||
"broadcastToAllNearby": "Broadcast to all nearby",
|
||||
"@broadcastToAllNearby": {
|
||||
"description": "Subtitle for public channel option"
|
||||
},
|
||||
|
||||
"searchRecipients": "Search recipients...",
|
||||
"@searchRecipients": {
|
||||
"description": "Placeholder text for recipient search field"
|
||||
},
|
||||
|
||||
"noContactsFound": "No contacts found",
|
||||
"@noContactsFound": {
|
||||
"description": "Message when no contacts match search"
|
||||
},
|
||||
|
||||
"noRoomsFound": "No rooms found",
|
||||
"@noRoomsFound": {
|
||||
"description": "Message when no rooms match search"
|
||||
},
|
||||
|
||||
"noContactsOrRoomsAvailable": "No contacts or rooms available",
|
||||
"@noContactsOrRoomsAvailable": {
|
||||
"description": "Message when no contacts or rooms exist"
|
||||
},
|
||||
|
||||
"messagesWillBeSentToPublicChannel": "Messages will be sent to public channel",
|
||||
"@messagesWillBeSentToPublicChannel": {
|
||||
"description": "Info message when only public channel is available"
|
||||
},
|
||||
|
||||
"newMessage": "New message",
|
||||
"@newMessage": {
|
||||
"description": "Notification title for new message"
|
||||
},
|
||||
|
||||
"channel": "Channel",
|
||||
"@channel": {
|
||||
"description": "Channel label in notifications"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user