Skip to content

Commit fcbb997

Browse files
committed
Add Project Settings page and persist translation provider selection
- Create dedicated Project Settings page with tabs: General, Languages, GitHub, Translation, Danger Zone - Update Detail page to navigate to Settings page instead of opening dialog - Add localStorage persistence for translation provider selection in TranslateDialog
1 parent 079b489 commit fcbb997

3 files changed

Lines changed: 805 additions & 23 deletions

File tree

cloud/src/LrmCloud.Web/Components/TranslateDialog.razor

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
@inject TranslationService TranslationService
44
@inject LimitsService LimitsService
55
@inject ISnackbar Snackbar
6+
@inject IJSRuntime JSRuntime
67

78
<MudDialog>
89
<TitleContent>
@@ -189,6 +190,8 @@
189190
private string? _usageWarning;
190191
private bool _usageBlocked;
191192

193+
private const string ProviderStorageKey = "lrm_translate_provider";
194+
192195
private bool CanTranslate => !_isLoadingProviders &&
193196
!_isTranslating &&
194197
!string.IsNullOrEmpty(_selectedProvider) &&
@@ -224,9 +227,27 @@
224227
{
225228
_providers = await TranslationService.GetProvidersAsync(ProjectId);
226229

227-
// Select first configured provider
228-
_selectedProvider = _providers
229-
.FirstOrDefault(p => p.IsConfigured)?.Name;
230+
// Try to restore previously selected provider from localStorage
231+
string? savedProvider = null;
232+
try
233+
{
234+
savedProvider = await JSRuntime.InvokeAsync<string?>("localStorage.getItem", ProviderStorageKey);
235+
}
236+
catch
237+
{
238+
// localStorage may not be available (SSR prerender)
239+
}
240+
241+
// Use saved provider if it's still configured, otherwise fall back to first configured
242+
var configuredProviders = _providers.Where(p => p.IsConfigured).ToList();
243+
if (!string.IsNullOrEmpty(savedProvider) && configuredProviders.Any(p => p.Name == savedProvider))
244+
{
245+
_selectedProvider = savedProvider;
246+
}
247+
else
248+
{
249+
_selectedProvider = configuredProviders.FirstOrDefault()?.Name;
250+
}
230251
}
231252
catch (Exception ex)
232253
{
@@ -253,6 +274,19 @@
253274

254275
try
255276
{
277+
// Save selected provider to localStorage for next time
278+
if (!string.IsNullOrEmpty(_selectedProvider))
279+
{
280+
try
281+
{
282+
await JSRuntime.InvokeVoidAsync("localStorage.setItem", ProviderStorageKey, _selectedProvider);
283+
}
284+
catch
285+
{
286+
// Ignore localStorage errors
287+
}
288+
}
289+
256290
var request = new TranslateRequestDto
257291
{
258292
Keys = _keysToTranslate,

cloud/src/LrmCloud.Web/Pages/Projects/Detail.razor

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ else
3636
<MudButton Variant="Variant.Outlined"
3737
Color="Color.Secondary"
3838
StartIcon="@Icons.Material.Filled.Settings"
39-
OnClick="@OpenEditDialog">
39+
OnClick="@(() => Navigation.NavigateTo($"projects/{ProjectId}/settings"))">
4040
Settings
4141
</MudButton>
4242
<MudButton Variant="Variant.Filled"
@@ -202,7 +202,6 @@ else
202202
</MudStack>
203203
}
204204

205-
<EditProjectDialog @ref="_editDialog" OnProjectUpdated="OnProjectUpdated" OnProjectDeleted="OnProjectDeleted" />
206205

207206
@code {
208207
[Parameter]
@@ -211,7 +210,6 @@ else
211210
private ProjectDto? _project;
212211
private ProjectStatsDto? _stats;
213212
private bool _isLoading = true;
214-
private EditProjectDialog? _editDialog;
215213

216214
protected override async Task OnInitializedAsync()
217215
{
@@ -239,23 +237,6 @@ else
239237
}
240238
}
241239

242-
private void OpenEditDialog()
243-
{
244-
if (_project != null)
245-
_editDialog?.Open(_project);
246-
}
247-
248-
private async Task OnProjectUpdated(ProjectDto project)
249-
{
250-
_project = project;
251-
StateHasChanged();
252-
}
253-
254-
private void OnProjectDeleted(int projectId)
255-
{
256-
Navigation.NavigateTo("");
257-
}
258-
259240
private void TranslateAll()
260241
{
261242
Snackbar.Add("Translate all missing - coming soon!", Severity.Info);

0 commit comments

Comments
 (0)