Skip to content

Commit e40c949

Browse files
committed
Fix glossary dialog: use component instead of broken inline dialog
- GlossaryTermDialog now supports both organization and project glossaries - Added ProjectId, ShowCaseSensitive parameters - Fixed checkbox label visibility issue - Project glossary uses component dialog for proper state updates - Add/delete translation buttons now work correctly
1 parent d870b3b commit e40c949

2 files changed

Lines changed: 51 additions & 127 deletions

File tree

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@
3333
</ChildContent>
3434
</RadzenFormField>
3535

36+
@if (ShowCaseSensitive)
37+
{
38+
<RadzenStack Orientation="Radzen.Orientation.Horizontal" AlignItems="Radzen.AlignItems.Center" Gap="0.5rem">
39+
<RadzenCheckBox @bind-Value="_caseSensitive" TValue="bool" />
40+
<RadzenText>Case-sensitive matching</RadzenText>
41+
</RadzenStack>
42+
}
43+
3644
<hr />
3745

3846
<RadzenStack Orientation="Radzen.Orientation.Horizontal" JustifyContent="JustifyContent.SpaceBetween" AlignItems="Radzen.AlignItems.Center">
@@ -82,18 +90,26 @@
8290

8391
@code {
8492
[Parameter]
85-
public int OrganizationId { get; set; }
93+
public int? OrganizationId { get; set; }
94+
95+
[Parameter]
96+
public int? ProjectId { get; set; }
8697

8798
[Parameter]
8899
public List<string> AvailableLanguages { get; set; } = new();
89100

90101
[Parameter]
91102
public GlossaryTermDto? EditingTerm { get; set; }
92103

104+
[Parameter]
105+
public bool ShowCaseSensitive { get; set; } = false;
106+
93107
private bool _isEditing => EditingTerm != null;
108+
private bool _isProjectGlossary => ProjectId.HasValue;
94109
private string _sourceTerm = "";
95110
private string _sourceLanguage = "en";
96111
private string? _description;
112+
private bool _caseSensitive;
97113
private List<TranslationEntry> _translations = new();
98114
private bool _saving;
99115
private string? _errorMessage;
@@ -111,6 +127,7 @@
111127
_sourceTerm = EditingTerm.SourceTerm;
112128
_sourceLanguage = EditingTerm.SourceLanguage;
113129
_description = EditingTerm.Description;
130+
_caseSensitive = EditingTerm.CaseSensitive;
114131
_translations = EditingTerm.Translations
115132
.Select(kv => new TranslationEntry { Language = kv.Key, Value = kv.Value })
116133
.ToList();
@@ -162,10 +179,15 @@
162179
SourceTerm = _sourceTerm,
163180
SourceLanguage = _sourceLanguage,
164181
Description = _description,
182+
CaseSensitive = _caseSensitive,
165183
Translations = translations
166184
};
167185

168-
await GlossaryService.UpdateOrganizationTermAsync(OrganizationId, EditingTerm!.Id, request);
186+
if (_isProjectGlossary)
187+
await GlossaryService.UpdateProjectTermAsync(ProjectId!.Value, EditingTerm!.Id, request);
188+
else
189+
await GlossaryService.UpdateOrganizationTermAsync(OrganizationId!.Value, EditingTerm!.Id, request);
190+
169191
NotificationService.Notify(NotificationSeverity.Success, "Success", "Glossary term updated");
170192
}
171193
else
@@ -175,10 +197,15 @@
175197
SourceTerm = _sourceTerm,
176198
SourceLanguage = _sourceLanguage,
177199
Description = _description,
200+
CaseSensitive = _caseSensitive,
178201
Translations = translations
179202
};
180203

181-
await GlossaryService.CreateOrganizationTermAsync(OrganizationId, request);
204+
if (_isProjectGlossary)
205+
await GlossaryService.CreateProjectTermAsync(ProjectId!.Value, request);
206+
else
207+
await GlossaryService.CreateOrganizationTermAsync(OrganizationId!.Value, request);
208+
182209
NotificationService.Notify(NotificationSeverity.Success, "Success", "Glossary term added");
183210
}
184211

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

Lines changed: 21 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -216,12 +216,6 @@ else
216216
private bool _isSavingInheritance;
217217

218218
// Dialog state
219-
private GlossaryTermDto? _editingTerm;
220-
private string _formSourceTerm = "";
221-
private string _formSourceLanguage = "en";
222-
private string _formDescription = "";
223-
private bool _formCaseSensitive;
224-
private Dictionary<string, string> _formTranslations = new();
225219
private List<string> _availableLanguages = new() { "en", "fr", "de", "es", "it", "el", "pt", "nl", "pl", "ru", "ja", "zh", "ko" };
226220

227221
private string _projectName = "";
@@ -329,135 +323,38 @@ else
329323

330324
private async Task OpenAddDialog()
331325
{
332-
_editingTerm = null;
333-
_formSourceTerm = "";
334-
_formSourceLanguage = "en";
335-
_formDescription = "";
336-
_formCaseSensitive = false;
337-
_formTranslations = new Dictionary<string, string>();
338-
foreach (var lang in _availableLanguages.Where(l => l != "en"))
339-
{
340-
_formTranslations[lang] = "";
341-
}
342-
343-
await ShowTermDialog("Add Glossary Term");
344-
}
345-
346-
private async Task OpenEditDialog(GlossaryTermDto term)
347-
{
348-
_editingTerm = term;
349-
_formSourceTerm = term.SourceTerm;
350-
_formSourceLanguage = term.SourceLanguage;
351-
_formDescription = term.Description ?? "";
352-
_formCaseSensitive = term.CaseSensitive;
353-
_formTranslations = new Dictionary<string, string>(term.Translations);
354-
355-
foreach (var lang in _availableLanguages.Where(l => l != term.SourceLanguage))
356-
{
357-
if (!_formTranslations.ContainsKey(lang))
358-
_formTranslations[lang] = "";
359-
}
360-
361-
await ShowTermDialog("Edit Glossary Term");
362-
}
363-
364-
private async Task ShowTermDialog(string title)
365-
{
366-
var result = await DialogService.OpenAsync(title, ds =>
367-
@<RadzenStack Gap="1rem">
368-
<RadzenFormField Text="Source Term" Variant="Radzen.Variant.Outlined" Style="width: 100%;">
369-
<RadzenTextBox @bind-Value="_formSourceTerm" Placeholder="e.g., Dashboard" Style="width: 100%;" />
370-
</RadzenFormField>
371-
372-
<RadzenFormField Text="Source Language" Variant="Radzen.Variant.Outlined" Style="width: 100%;">
373-
<RadzenDropDown @bind-Value="_formSourceLanguage" Data="@_availableLanguages" Style="width: 100%;">
374-
<Template Context="lang">@lang.ToUpperInvariant()</Template>
375-
</RadzenDropDown>
376-
</RadzenFormField>
377-
378-
<RadzenFormField Text="Description (optional)" Variant="Radzen.Variant.Outlined" Style="width: 100%;">
379-
<RadzenTextArea @bind-Value="_formDescription" Rows="2" Placeholder="Context or usage notes" Style="width: 100%;" />
380-
</RadzenFormField>
381-
382-
<RadzenCheckBox @bind-Value="_formCaseSensitive" TValue="bool">
383-
<Template>Case-sensitive matching</Template>
384-
</RadzenCheckBox>
385-
386-
<hr />
387-
388-
<RadzenText TextStyle="TextStyle.Subtitle1">Translations</RadzenText>
389-
@foreach (var lang in _availableLanguages.Where(l => l != _formSourceLanguage))
390-
{
391-
<RadzenFormField Text="@($"Translation ({lang.ToUpperInvariant()})")" Variant="Radzen.Variant.Outlined" Style="width: 100%;">
392-
<RadzenTextBox Value="@GetTranslation(lang)" ValueChanged="@(v => SetTranslation(lang, v))" Placeholder="@($"Enter translation in {lang.ToUpperInvariant()}")" Style="width: 100%;" />
393-
</RadzenFormField>
394-
}
395-
396-
<RadzenStack Orientation="Radzen.Orientation.Horizontal" JustifyContent="JustifyContent.End" Gap="0.5rem" class="rz-mt-4">
397-
<RadzenButton Variant="Radzen.Variant.Text" Text="Cancel" Click="@(() => ds.Close(false))" />
398-
<RadzenButton Variant="Radzen.Variant.Filled" ButtonStyle="ButtonStyle.Primary"
399-
Text="@(_editingTerm == null ? "Add" : "Save")"
400-
Click="@(() => ds.Close(true))"
401-
Disabled="@(string.IsNullOrWhiteSpace(_formSourceTerm) || string.IsNullOrWhiteSpace(_formSourceLanguage))" />
402-
</RadzenStack>
403-
</RadzenStack>,
326+
var result = await DialogService.OpenAsync<GlossaryTermDialog>(
327+
"Add Glossary Term",
328+
new Dictionary<string, object>
329+
{
330+
{ "ProjectId", ProjectId },
331+
{ "AvailableLanguages", _availableLanguages },
332+
{ "ShowCaseSensitive", true }
333+
},
404334
new Radzen.DialogOptions { Width = "500px" });
405335

406336
if (result == true)
407337
{
408-
await SaveTerm();
338+
await LoadGlossaryAsync();
409339
}
410340
}
411341

412-
private string GetTranslation(string lang) => _formTranslations.TryGetValue(lang, out var val) ? val : "";
413-
414-
private void SetTranslation(string lang, string value) => _formTranslations[lang] = value;
415-
416-
private async Task SaveTerm()
342+
private async Task OpenEditDialog(GlossaryTermDto term)
417343
{
418-
if (string.IsNullOrWhiteSpace(_formSourceTerm) || string.IsNullOrWhiteSpace(_formSourceLanguage))
419-
return;
420-
421-
try
422-
{
423-
var translations = _formTranslations
424-
.Where(kv => !string.IsNullOrWhiteSpace(kv.Value))
425-
.ToDictionary(kv => kv.Key, kv => kv.Value);
426-
427-
if (_editingTerm == null)
344+
var result = await DialogService.OpenAsync<GlossaryTermDialog>(
345+
"Edit Glossary Term",
346+
new Dictionary<string, object>
428347
{
429-
var request = new CreateGlossaryTermRequest
430-
{
431-
SourceTerm = _formSourceTerm,
432-
SourceLanguage = _formSourceLanguage,
433-
Description = string.IsNullOrWhiteSpace(_formDescription) ? null : _formDescription,
434-
CaseSensitive = _formCaseSensitive,
435-
Translations = translations
436-
};
437-
438-
await GlossaryService.CreateProjectTermAsync(ProjectId, request);
439-
NotificationService.Notify(NotificationSeverity.Success, "Success", "Term added successfully");
440-
}
441-
else
442-
{
443-
var request = new UpdateGlossaryTermRequest
444-
{
445-
SourceTerm = _formSourceTerm,
446-
SourceLanguage = _formSourceLanguage,
447-
Description = string.IsNullOrWhiteSpace(_formDescription) ? null : _formDescription,
448-
CaseSensitive = _formCaseSensitive,
449-
Translations = translations
450-
};
451-
452-
await GlossaryService.UpdateProjectTermAsync(ProjectId, _editingTerm.Id, request);
453-
NotificationService.Notify(NotificationSeverity.Success, "Success", "Term updated successfully");
454-
}
348+
{ "ProjectId", ProjectId },
349+
{ "AvailableLanguages", _availableLanguages },
350+
{ "EditingTerm", term },
351+
{ "ShowCaseSensitive", true }
352+
},
353+
new Radzen.DialogOptions { Width = "500px" });
455354

456-
await LoadGlossaryAsync();
457-
}
458-
catch (Exception ex)
355+
if (result == true)
459356
{
460-
NotificationService.Notify(NotificationSeverity.Error, "Error", ex.Message);
357+
await LoadGlossaryAsync();
461358
}
462359
}
463360

0 commit comments

Comments
 (0)