@abpjs/language-management 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,1186 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ LANGUAGE_MANAGEMENT_ROUTES: () => LANGUAGE_MANAGEMENT_ROUTES,
24
+ LanguageManagementService: () => LanguageManagementService,
25
+ LanguageTextsComponent: () => LanguageTextsComponent,
26
+ LanguagesComponent: () => LanguagesComponent,
27
+ useLanguageTexts: () => useLanguageTexts,
28
+ useLanguages: () => useLanguages
29
+ });
30
+ module.exports = __toCommonJS(index_exports);
31
+
32
+ // src/constants/routes.ts
33
+ var LANGUAGE_MANAGEMENT_ROUTES = {
34
+ routes: [
35
+ {
36
+ name: "Languages",
37
+ path: "language-management",
38
+ layout: "application",
39
+ order: 101,
40
+ children: [
41
+ {
42
+ name: "Languages",
43
+ path: "languages",
44
+ order: 1
45
+ },
46
+ {
47
+ name: "Language Texts",
48
+ path: "texts",
49
+ order: 2
50
+ }
51
+ ]
52
+ }
53
+ ]
54
+ };
55
+
56
+ // src/services/language-management.service.ts
57
+ var LanguageManagementService = class {
58
+ constructor(rest) {
59
+ this.rest = rest;
60
+ }
61
+ // ========================
62
+ // Language Operations
63
+ // ========================
64
+ /**
65
+ * Get all languages with optional pagination
66
+ * @param params - Optional query parameters for pagination and filtering
67
+ * @returns Promise with paginated language response
68
+ */
69
+ getLanguages(params = {}) {
70
+ return this.rest.request({
71
+ method: "GET",
72
+ url: "/api/language-management/languages",
73
+ params
74
+ });
75
+ }
76
+ /**
77
+ * Get a language by ID
78
+ * @param id - The language ID
79
+ * @returns Promise with the language
80
+ */
81
+ getLanguageById(id) {
82
+ return this.rest.request({
83
+ method: "GET",
84
+ url: `/api/language-management/languages/${id}`
85
+ });
86
+ }
87
+ /**
88
+ * Create a new language
89
+ * @param body - The language data to create
90
+ * @returns Promise with the created language
91
+ */
92
+ createLanguage(body) {
93
+ return this.rest.request({
94
+ method: "POST",
95
+ url: "/api/language-management/languages",
96
+ body
97
+ });
98
+ }
99
+ /**
100
+ * Update an existing language
101
+ * @param id - The language ID to update
102
+ * @param body - The updated language data
103
+ * @returns Promise with the updated language
104
+ */
105
+ updateLanguage(id, body) {
106
+ return this.rest.request({
107
+ method: "PUT",
108
+ url: `/api/language-management/languages/${id}`,
109
+ body
110
+ });
111
+ }
112
+ /**
113
+ * Delete a language
114
+ * @param id - The language ID to delete
115
+ * @returns Promise resolving when complete
116
+ */
117
+ deleteLanguage(id) {
118
+ return this.rest.request({
119
+ method: "DELETE",
120
+ url: `/api/language-management/languages/${id}`
121
+ });
122
+ }
123
+ /**
124
+ * Set a language as the default language
125
+ * @param id - The language ID to set as default
126
+ * @returns Promise resolving when complete
127
+ */
128
+ setAsDefaultLanguage(id) {
129
+ return this.rest.request({
130
+ method: "PUT",
131
+ url: `/api/language-management/languages/${id}/set-as-default`
132
+ });
133
+ }
134
+ // ========================
135
+ // Culture Operations
136
+ // ========================
137
+ /**
138
+ * Get all available cultures
139
+ * @returns Promise with list of cultures
140
+ */
141
+ getCultures() {
142
+ return this.rest.request({
143
+ method: "GET",
144
+ url: "/api/language-management/languages/culture-list"
145
+ });
146
+ }
147
+ // ========================
148
+ // Resource Operations
149
+ // ========================
150
+ /**
151
+ * Get all available localization resources
152
+ * @returns Promise with list of resources
153
+ */
154
+ getResources() {
155
+ return this.rest.request({
156
+ method: "GET",
157
+ url: "/api/language-management/languages/resources"
158
+ });
159
+ }
160
+ // ========================
161
+ // Language Text Operations
162
+ // ========================
163
+ /**
164
+ * Get language texts with pagination and filtering
165
+ * @param params - Query parameters including resource name, cultures, and filter options
166
+ * @returns Promise with paginated language text response
167
+ */
168
+ getLanguageTexts(params) {
169
+ return this.rest.request({
170
+ method: "GET",
171
+ url: "/api/language-management/language-texts",
172
+ params
173
+ });
174
+ }
175
+ /**
176
+ * Get a language text by name
177
+ * @param params - Parameters identifying the language text
178
+ * @returns Promise with the language text
179
+ */
180
+ getLanguageTextByName(params) {
181
+ return this.rest.request({
182
+ method: "GET",
183
+ url: "/api/language-management/language-texts",
184
+ params
185
+ });
186
+ }
187
+ /**
188
+ * Update a language text by name
189
+ * @param params - Parameters including the new value
190
+ * @returns Promise with the updated language text
191
+ */
192
+ updateLanguageTextByName(params) {
193
+ const { resourceName, cultureName, name, value } = params;
194
+ return this.rest.request({
195
+ method: "PUT",
196
+ url: `/api/language-management/language-texts/${resourceName}/${cultureName}/${name}`,
197
+ body: { value }
198
+ });
199
+ }
200
+ /**
201
+ * Restore a language text to its default value
202
+ * @param params - Parameters identifying the language text
203
+ * @returns Promise resolving when complete
204
+ */
205
+ restoreLanguageTextByName(params) {
206
+ const { resourceName, cultureName, name } = params;
207
+ return this.rest.request({
208
+ method: "PUT",
209
+ url: `/api/language-management/language-texts/${resourceName}/${cultureName}/${name}/restore`
210
+ });
211
+ }
212
+ };
213
+
214
+ // src/hooks/useLanguages.ts
215
+ var import_react = require("react");
216
+ var import_core = require("@abpjs/core");
217
+ function useLanguages() {
218
+ const restService = (0, import_core.useRestService)();
219
+ const service = (0, import_react.useMemo)(() => new LanguageManagementService(restService), [restService]);
220
+ const [languages, setLanguages] = (0, import_react.useState)([]);
221
+ const [totalCount, setTotalCount] = (0, import_react.useState)(0);
222
+ const [cultures, setCultures] = (0, import_react.useState)([]);
223
+ const [selectedLanguage, setSelectedLanguage] = (0, import_react.useState)(
224
+ null
225
+ );
226
+ const [isLoading, setIsLoading] = (0, import_react.useState)(false);
227
+ const [error, setError] = (0, import_react.useState)(null);
228
+ const [sortKey, setSortKey] = (0, import_react.useState)("displayName");
229
+ const [sortOrder, setSortOrder] = (0, import_react.useState)("");
230
+ const fetchLanguages = (0, import_react.useCallback)(
231
+ async (params) => {
232
+ setIsLoading(true);
233
+ setError(null);
234
+ try {
235
+ const response = await service.getLanguages(params);
236
+ setLanguages(response.items || []);
237
+ setTotalCount(response.totalCount || 0);
238
+ setIsLoading(false);
239
+ return { success: true };
240
+ } catch (err) {
241
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch languages";
242
+ setError(errorMessage);
243
+ setIsLoading(false);
244
+ return { success: false, error: errorMessage };
245
+ }
246
+ },
247
+ [service]
248
+ );
249
+ const fetchCultures = (0, import_react.useCallback)(async () => {
250
+ setIsLoading(true);
251
+ setError(null);
252
+ try {
253
+ const response = await service.getCultures();
254
+ setCultures(response || []);
255
+ setIsLoading(false);
256
+ return { success: true };
257
+ } catch (err) {
258
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch cultures";
259
+ setError(errorMessage);
260
+ setIsLoading(false);
261
+ return { success: false, error: errorMessage };
262
+ }
263
+ }, [service]);
264
+ const getLanguageById = (0, import_react.useCallback)(
265
+ async (id) => {
266
+ setIsLoading(true);
267
+ setError(null);
268
+ try {
269
+ const language = await service.getLanguageById(id);
270
+ setSelectedLanguage(language);
271
+ setIsLoading(false);
272
+ return { success: true };
273
+ } catch (err) {
274
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch language";
275
+ setError(errorMessage);
276
+ setIsLoading(false);
277
+ return { success: false, error: errorMessage };
278
+ }
279
+ },
280
+ [service]
281
+ );
282
+ const createLanguage = (0, import_react.useCallback)(
283
+ async (language) => {
284
+ setIsLoading(true);
285
+ setError(null);
286
+ try {
287
+ await service.createLanguage(language);
288
+ await fetchLanguages();
289
+ return { success: true };
290
+ } catch (err) {
291
+ const errorMessage = err instanceof Error ? err.message : "Failed to create language";
292
+ setError(errorMessage);
293
+ setIsLoading(false);
294
+ return { success: false, error: errorMessage };
295
+ }
296
+ },
297
+ [service, fetchLanguages]
298
+ );
299
+ const updateLanguage = (0, import_react.useCallback)(
300
+ async (id, language) => {
301
+ setIsLoading(true);
302
+ setError(null);
303
+ try {
304
+ await service.updateLanguage(id, language);
305
+ await fetchLanguages();
306
+ return { success: true };
307
+ } catch (err) {
308
+ const errorMessage = err instanceof Error ? err.message : "Failed to update language";
309
+ setError(errorMessage);
310
+ setIsLoading(false);
311
+ return { success: false, error: errorMessage };
312
+ }
313
+ },
314
+ [service, fetchLanguages]
315
+ );
316
+ const deleteLanguage = (0, import_react.useCallback)(
317
+ async (id) => {
318
+ setIsLoading(true);
319
+ setError(null);
320
+ try {
321
+ await service.deleteLanguage(id);
322
+ await fetchLanguages();
323
+ return { success: true };
324
+ } catch (err) {
325
+ const errorMessage = err instanceof Error ? err.message : "Failed to delete language";
326
+ setError(errorMessage);
327
+ setIsLoading(false);
328
+ return { success: false, error: errorMessage };
329
+ }
330
+ },
331
+ [service, fetchLanguages]
332
+ );
333
+ const setAsDefaultLanguage = (0, import_react.useCallback)(
334
+ async (id) => {
335
+ setIsLoading(true);
336
+ setError(null);
337
+ try {
338
+ await service.setAsDefaultLanguage(id);
339
+ await fetchLanguages();
340
+ return { success: true };
341
+ } catch (err) {
342
+ const errorMessage = err instanceof Error ? err.message : "Failed to set language as default";
343
+ setError(errorMessage);
344
+ setIsLoading(false);
345
+ return { success: false, error: errorMessage };
346
+ }
347
+ },
348
+ [service, fetchLanguages]
349
+ );
350
+ const reset = (0, import_react.useCallback)(() => {
351
+ setLanguages([]);
352
+ setTotalCount(0);
353
+ setCultures([]);
354
+ setSelectedLanguage(null);
355
+ setIsLoading(false);
356
+ setError(null);
357
+ }, []);
358
+ return {
359
+ languages,
360
+ totalCount,
361
+ cultures,
362
+ selectedLanguage,
363
+ isLoading,
364
+ error,
365
+ sortKey,
366
+ sortOrder,
367
+ fetchLanguages,
368
+ fetchCultures,
369
+ getLanguageById,
370
+ createLanguage,
371
+ updateLanguage,
372
+ deleteLanguage,
373
+ setAsDefaultLanguage,
374
+ setSelectedLanguage,
375
+ setSortKey,
376
+ setSortOrder,
377
+ reset
378
+ };
379
+ }
380
+
381
+ // src/hooks/useLanguageTexts.ts
382
+ var import_react2 = require("react");
383
+ var import_core2 = require("@abpjs/core");
384
+ function useLanguageTexts() {
385
+ const restService = (0, import_core2.useRestService)();
386
+ const service = (0, import_react2.useMemo)(() => new LanguageManagementService(restService), [restService]);
387
+ const [languageTexts, setLanguageTexts] = (0, import_react2.useState)([]);
388
+ const [totalCount, setTotalCount] = (0, import_react2.useState)(0);
389
+ const [resources, setResources] = (0, import_react2.useState)([]);
390
+ const [selectedLanguageText, setSelectedLanguageText] = (0, import_react2.useState)(null);
391
+ const [isLoading, setIsLoading] = (0, import_react2.useState)(false);
392
+ const [error, setError] = (0, import_react2.useState)(null);
393
+ const [sortKey, setSortKey] = (0, import_react2.useState)("name");
394
+ const [sortOrder, setSortOrder] = (0, import_react2.useState)("");
395
+ const [lastQueryParams, setLastQueryParams] = (0, import_react2.useState)(null);
396
+ const fetchLanguageTexts = (0, import_react2.useCallback)(
397
+ async (params) => {
398
+ setIsLoading(true);
399
+ setError(null);
400
+ setLastQueryParams(params);
401
+ try {
402
+ const response = await service.getLanguageTexts(params);
403
+ setLanguageTexts(response.items || []);
404
+ setTotalCount(response.totalCount || 0);
405
+ setIsLoading(false);
406
+ return { success: true };
407
+ } catch (err) {
408
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch language texts";
409
+ setError(errorMessage);
410
+ setIsLoading(false);
411
+ return { success: false, error: errorMessage };
412
+ }
413
+ },
414
+ [service]
415
+ );
416
+ const fetchResources = (0, import_react2.useCallback)(async () => {
417
+ setIsLoading(true);
418
+ setError(null);
419
+ try {
420
+ const response = await service.getResources();
421
+ setResources(response || []);
422
+ setIsLoading(false);
423
+ return { success: true };
424
+ } catch (err) {
425
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch resources";
426
+ setError(errorMessage);
427
+ setIsLoading(false);
428
+ return { success: false, error: errorMessage };
429
+ }
430
+ }, [service]);
431
+ const getLanguageTextByName = (0, import_react2.useCallback)(
432
+ async (params) => {
433
+ setIsLoading(true);
434
+ setError(null);
435
+ try {
436
+ const languageText = await service.getLanguageTextByName(params);
437
+ setSelectedLanguageText(languageText);
438
+ setIsLoading(false);
439
+ return { success: true };
440
+ } catch (err) {
441
+ const errorMessage = err instanceof Error ? err.message : "Failed to fetch language text";
442
+ setError(errorMessage);
443
+ setIsLoading(false);
444
+ return { success: false, error: errorMessage };
445
+ }
446
+ },
447
+ [service]
448
+ );
449
+ const updateLanguageTextByName = (0, import_react2.useCallback)(
450
+ async (params) => {
451
+ setIsLoading(true);
452
+ setError(null);
453
+ try {
454
+ await service.updateLanguageTextByName(params);
455
+ if (lastQueryParams) {
456
+ await fetchLanguageTexts(lastQueryParams);
457
+ } else {
458
+ setIsLoading(false);
459
+ }
460
+ return { success: true };
461
+ } catch (err) {
462
+ const errorMessage = err instanceof Error ? err.message : "Failed to update language text";
463
+ setError(errorMessage);
464
+ setIsLoading(false);
465
+ return { success: false, error: errorMessage };
466
+ }
467
+ },
468
+ [service, lastQueryParams, fetchLanguageTexts]
469
+ );
470
+ const restoreLanguageTextByName = (0, import_react2.useCallback)(
471
+ async (params) => {
472
+ setIsLoading(true);
473
+ setError(null);
474
+ try {
475
+ await service.restoreLanguageTextByName(params);
476
+ if (lastQueryParams) {
477
+ await fetchLanguageTexts(lastQueryParams);
478
+ } else {
479
+ setIsLoading(false);
480
+ }
481
+ return { success: true };
482
+ } catch (err) {
483
+ const errorMessage = err instanceof Error ? err.message : "Failed to restore language text";
484
+ setError(errorMessage);
485
+ setIsLoading(false);
486
+ return { success: false, error: errorMessage };
487
+ }
488
+ },
489
+ [service, lastQueryParams, fetchLanguageTexts]
490
+ );
491
+ const reset = (0, import_react2.useCallback)(() => {
492
+ setLanguageTexts([]);
493
+ setTotalCount(0);
494
+ setResources([]);
495
+ setSelectedLanguageText(null);
496
+ setIsLoading(false);
497
+ setError(null);
498
+ setLastQueryParams(null);
499
+ }, []);
500
+ return {
501
+ languageTexts,
502
+ totalCount,
503
+ resources,
504
+ selectedLanguageText,
505
+ isLoading,
506
+ error,
507
+ sortKey,
508
+ sortOrder,
509
+ fetchLanguageTexts,
510
+ fetchResources,
511
+ getLanguageTextByName,
512
+ updateLanguageTextByName,
513
+ restoreLanguageTextByName,
514
+ setSelectedLanguageText,
515
+ setSortKey,
516
+ setSortOrder,
517
+ reset
518
+ };
519
+ }
520
+
521
+ // src/components/Languages/LanguagesComponent.tsx
522
+ var import_react3 = require("react");
523
+ var import_core3 = require("@abpjs/core");
524
+ var import_theme_shared = require("@abpjs/theme-shared");
525
+ var import_react4 = require("@chakra-ui/react");
526
+ var import_react5 = require("@chakra-ui/react");
527
+ var import_react6 = require("@chakra-ui/react");
528
+ var import_jsx_runtime = require("react/jsx-runtime");
529
+ var DEFAULT_FORM_STATE = {
530
+ cultureName: "",
531
+ uiCultureName: "",
532
+ displayName: "",
533
+ flagIcon: "",
534
+ isEnabled: true
535
+ };
536
+ function LanguagesComponent({
537
+ onLanguageCreated,
538
+ onLanguageUpdated,
539
+ onLanguageDeleted
540
+ }) {
541
+ const { t } = (0, import_core3.useLocalization)();
542
+ const confirmation = (0, import_theme_shared.useConfirmation)();
543
+ const {
544
+ languages,
545
+ cultures,
546
+ selectedLanguage,
547
+ isLoading,
548
+ error,
549
+ fetchLanguages,
550
+ fetchCultures,
551
+ getLanguageById,
552
+ createLanguage,
553
+ updateLanguage,
554
+ deleteLanguage,
555
+ setAsDefaultLanguage,
556
+ setSelectedLanguage
557
+ } = useLanguages();
558
+ const [isModalOpen, setIsModalOpen] = (0, import_react3.useState)(false);
559
+ const [formState, setFormState] = (0, import_react3.useState)(DEFAULT_FORM_STATE);
560
+ const [isSubmitting, setIsSubmitting] = (0, import_react3.useState)(false);
561
+ const [isEditing, setIsEditing] = (0, import_react3.useState)(false);
562
+ const [searchTerm, setSearchTerm] = (0, import_react3.useState)("");
563
+ (0, import_react3.useEffect)(() => {
564
+ fetchLanguages();
565
+ fetchCultures();
566
+ }, [fetchLanguages, fetchCultures]);
567
+ const filteredLanguages = languages.filter(
568
+ (lang) => !searchTerm || lang.displayName.toLowerCase().includes(searchTerm.toLowerCase()) || lang.cultureName.toLowerCase().includes(searchTerm.toLowerCase())
569
+ );
570
+ const handleAdd = (0, import_react3.useCallback)(() => {
571
+ setSelectedLanguage(null);
572
+ setFormState(DEFAULT_FORM_STATE);
573
+ setIsEditing(false);
574
+ setIsModalOpen(true);
575
+ }, [setSelectedLanguage]);
576
+ const handleEdit = (0, import_react3.useCallback)(
577
+ async (id) => {
578
+ const result = await getLanguageById(id);
579
+ if (result.success) {
580
+ setIsEditing(true);
581
+ setIsModalOpen(true);
582
+ }
583
+ },
584
+ [getLanguageById]
585
+ );
586
+ (0, import_react3.useEffect)(() => {
587
+ if (selectedLanguage && isEditing) {
588
+ setFormState({
589
+ cultureName: selectedLanguage.cultureName || "",
590
+ uiCultureName: selectedLanguage.uiCultureName || "",
591
+ displayName: selectedLanguage.displayName || "",
592
+ flagIcon: selectedLanguage.flagIcon || "",
593
+ isEnabled: selectedLanguage.isEnabled ?? true
594
+ });
595
+ }
596
+ }, [selectedLanguage, isEditing]);
597
+ const handleDelete = (0, import_react3.useCallback)(
598
+ async (id, displayName) => {
599
+ const status = await confirmation.warn(
600
+ t("AbpLanguageManagement::LanguageDeletionConfirmationMessage", displayName) || `Are you sure you want to delete the language '${displayName}'?`,
601
+ t("AbpLanguageManagement::AreYouSure") || "Are you sure?"
602
+ );
603
+ if (status === import_theme_shared.Toaster.Status.confirm) {
604
+ const result = await deleteLanguage(id);
605
+ if (result.success) {
606
+ onLanguageDeleted?.(id);
607
+ }
608
+ }
609
+ },
610
+ [confirmation, t, deleteLanguage, onLanguageDeleted]
611
+ );
612
+ const handleSetAsDefault = (0, import_react3.useCallback)(
613
+ async (id) => {
614
+ const status = await confirmation.info(
615
+ t("AbpLanguageManagement::SetAsDefaultLanguageConfirmationMessage") || "Are you sure you want to set this language as the default?",
616
+ t("AbpLanguageManagement::AreYouSure") || "Are you sure?"
617
+ );
618
+ if (status === import_theme_shared.Toaster.Status.confirm) {
619
+ await setAsDefaultLanguage(id);
620
+ }
621
+ },
622
+ [confirmation, t, setAsDefaultLanguage]
623
+ );
624
+ const handleSubmit = (0, import_react3.useCallback)(async () => {
625
+ if (!isEditing && !formState.cultureName) return;
626
+ if (!formState.displayName.trim()) return;
627
+ setIsSubmitting(true);
628
+ let result;
629
+ if (isEditing && selectedLanguage?.id) {
630
+ const updateData = {
631
+ displayName: formState.displayName.trim(),
632
+ flagIcon: formState.flagIcon,
633
+ isEnabled: formState.isEnabled
634
+ };
635
+ result = await updateLanguage(selectedLanguage.id, updateData);
636
+ if (result.success) {
637
+ onLanguageUpdated?.({
638
+ ...selectedLanguage,
639
+ ...updateData
640
+ });
641
+ }
642
+ } else {
643
+ const createData = {
644
+ cultureName: formState.cultureName,
645
+ uiCultureName: formState.uiCultureName || formState.cultureName,
646
+ displayName: formState.displayName.trim(),
647
+ flagIcon: formState.flagIcon,
648
+ isEnabled: formState.isEnabled
649
+ };
650
+ result = await createLanguage(createData);
651
+ if (result.success) {
652
+ onLanguageCreated?.({
653
+ id: "",
654
+ creationTime: (/* @__PURE__ */ new Date()).toISOString(),
655
+ creatorId: "",
656
+ isDefaultLanguage: false,
657
+ ...createData
658
+ });
659
+ }
660
+ }
661
+ setIsSubmitting(false);
662
+ if (result.success) {
663
+ setIsModalOpen(false);
664
+ setFormState(DEFAULT_FORM_STATE);
665
+ setSelectedLanguage(null);
666
+ setIsEditing(false);
667
+ }
668
+ }, [
669
+ formState,
670
+ isEditing,
671
+ selectedLanguage,
672
+ updateLanguage,
673
+ createLanguage,
674
+ onLanguageCreated,
675
+ onLanguageUpdated,
676
+ setSelectedLanguage
677
+ ]);
678
+ const handleModalClose = (0, import_react3.useCallback)(() => {
679
+ setIsModalOpen(false);
680
+ setFormState(DEFAULT_FORM_STATE);
681
+ setSelectedLanguage(null);
682
+ setIsEditing(false);
683
+ }, [setSelectedLanguage]);
684
+ const handleInputChange = (0, import_react3.useCallback)(
685
+ (field, value) => {
686
+ setFormState((prev) => ({ ...prev, [field]: value }));
687
+ },
688
+ []
689
+ );
690
+ const handleCultureChange = (0, import_react3.useCallback)(
691
+ (cultureName) => {
692
+ setFormState((prev) => ({
693
+ ...prev,
694
+ cultureName,
695
+ uiCultureName: cultureName
696
+ }));
697
+ const culture = cultures.find((c) => c.name === cultureName);
698
+ if (culture) {
699
+ setFormState((prev) => ({
700
+ ...prev,
701
+ displayName: culture.displayName
702
+ }));
703
+ }
704
+ },
705
+ [cultures]
706
+ );
707
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Box, { id: "language-management-languages-wrapper", className: "card", p: 4, children: [
708
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Flex, { justify: "space-between", align: "center", mb: 4, children: [
709
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Text, { fontSize: "xl", fontWeight: "bold", children: t("AbpLanguageManagement::Languages") || "Languages" }),
710
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Button, { colorPalette: "blue", onClick: handleAdd, children: t("AbpLanguageManagement::NewLanguage") || "New Language" })
711
+ ] }),
712
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Box, { mb: 4, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
713
+ import_react4.Input,
714
+ {
715
+ placeholder: t("AbpLanguageManagement::Search") || "Search...",
716
+ value: searchTerm,
717
+ onChange: (e) => setSearchTerm(e.target.value),
718
+ maxW: "300px"
719
+ }
720
+ ) }),
721
+ error && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Alert, { status: "error", mb: 4, children: error }),
722
+ isLoading && languages.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Flex, { justify: "center", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Spinner, { size: "lg" }) }),
723
+ languages.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Table.Root, { variant: "outline", children: [
724
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Table.Row, { children: [
725
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.ColumnHeader, { children: t("AbpLanguageManagement::Actions") || "Actions" }),
726
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.ColumnHeader, { children: t("AbpLanguageManagement::DisplayName") || "Display Name" }),
727
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.ColumnHeader, { children: t("AbpLanguageManagement::CultureName") || "Culture Name" }),
728
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.ColumnHeader, { children: t("AbpLanguageManagement::UiCultureName") || "UI Culture Name" }),
729
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.ColumnHeader, { children: t("AbpLanguageManagement::IsEnabled") || "Enabled" }),
730
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.ColumnHeader, { children: t("AbpLanguageManagement::IsDefaultLanguage") || "Default" })
731
+ ] }) }),
732
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Body, { children: filteredLanguages.map((language) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Table.Row, { children: [
733
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Menu.Root, { children: [
734
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Menu.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Button, { size: "sm", colorPalette: "blue", children: t("AbpLanguageManagement::Actions") || "Actions" }) }),
735
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Menu.Positioner, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Menu.Content, { children: [
736
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Menu.Item, { value: "edit", onClick: () => handleEdit(language.id), children: t("AbpLanguageManagement::Edit") || "Edit" }),
737
+ !language.isDefaultLanguage && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
738
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
739
+ import_react4.Menu.Item,
740
+ {
741
+ value: "setDefault",
742
+ onClick: () => handleSetAsDefault(language.id),
743
+ children: t("AbpLanguageManagement::SetAsDefaultLanguage") || "Set as Default"
744
+ }
745
+ ),
746
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
747
+ import_react4.Menu.Item,
748
+ {
749
+ value: "delete",
750
+ color: "red.500",
751
+ onClick: () => handleDelete(language.id, language.displayName),
752
+ children: t("AbpLanguageManagement::Delete") || "Delete"
753
+ }
754
+ )
755
+ ] })
756
+ ] }) })
757
+ ] }) }),
758
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.Flex, { align: "center", gap: 2, children: [
759
+ language.flagIcon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Text, { children: language.flagIcon }),
760
+ language.displayName
761
+ ] }) }),
762
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Cell, { children: language.cultureName }),
763
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Cell, { children: language.uiCultureName }),
764
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Badge, { colorPalette: language.isEnabled ? "green" : "red", children: language.isEnabled ? t("AbpLanguageManagement::Yes") || "Yes" : t("AbpLanguageManagement::No") || "No" }) }),
765
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Table.Cell, { children: language.isDefaultLanguage && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Badge, { colorPalette: "blue", children: t("AbpLanguageManagement::Default") || "Default" }) })
766
+ ] }, language.id)) })
767
+ ] }),
768
+ !isLoading && languages.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Text, { textAlign: "center", color: "gray.500", py: 8, children: t("AbpLanguageManagement::NoLanguagesFound") || "No languages found" }),
769
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
770
+ import_theme_shared.Modal,
771
+ {
772
+ visible: isModalOpen,
773
+ onVisibleChange: setIsModalOpen,
774
+ header: isEditing ? t("AbpLanguageManagement::Edit") || "Edit" : t("AbpLanguageManagement::NewLanguage") || "New Language",
775
+ footer: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
776
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.Button, { variant: "outline", onClick: handleModalClose, disabled: isSubmitting, children: t("AbpLanguageManagement::Cancel") || "Cancel" }),
777
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
778
+ import_theme_shared.Button,
779
+ {
780
+ colorPalette: "blue",
781
+ onClick: handleSubmit,
782
+ loading: isSubmitting,
783
+ disabled: !formState.displayName.trim() || !isEditing && !formState.cultureName,
784
+ children: t("AbpLanguageManagement::Save") || "Save"
785
+ }
786
+ )
787
+ ] }),
788
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react4.VStack, { gap: 4, align: "stretch", children: [
789
+ !isEditing && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.FormField, { label: t("AbpLanguageManagement::CultureName") || "Culture", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.NativeSelectRoot, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
790
+ import_react5.NativeSelectField,
791
+ {
792
+ value: formState.cultureName,
793
+ onChange: (e) => handleCultureChange(e.target.value),
794
+ children: [
795
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "", children: t("AbpLanguageManagement::SelectCulture") || "Select a culture..." }),
796
+ cultures.map((culture) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: culture.name, children: [
797
+ culture.displayName,
798
+ " (",
799
+ culture.name,
800
+ ")"
801
+ ] }, culture.name))
802
+ ]
803
+ }
804
+ ) }) }),
805
+ !isEditing && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.FormField, { label: t("AbpLanguageManagement::UiCultureName") || "UI Culture", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react5.NativeSelectRoot, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
806
+ import_react5.NativeSelectField,
807
+ {
808
+ value: formState.uiCultureName,
809
+ onChange: (e) => handleInputChange("uiCultureName", e.target.value),
810
+ children: [
811
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "", children: t("AbpLanguageManagement::SameAsCulture") || "Same as culture" }),
812
+ cultures.map((culture) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", { value: culture.name, children: [
813
+ culture.displayName,
814
+ " (",
815
+ culture.name,
816
+ ")"
817
+ ] }, culture.name))
818
+ ]
819
+ }
820
+ ) }) }),
821
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.FormField, { label: t("AbpLanguageManagement::DisplayName") || "Display Name", required: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
822
+ import_react4.Input,
823
+ {
824
+ value: formState.displayName,
825
+ onChange: (e) => handleInputChange("displayName", e.target.value),
826
+ maxLength: 128,
827
+ placeholder: t("AbpLanguageManagement::DisplayName") || "Display Name"
828
+ }
829
+ ) }),
830
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_theme_shared.FormField, { label: t("AbpLanguageManagement::FlagIcon") || "Flag Icon", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
831
+ import_react4.Input,
832
+ {
833
+ value: formState.flagIcon,
834
+ onChange: (e) => handleInputChange("flagIcon", e.target.value),
835
+ maxLength: 48,
836
+ placeholder: t("AbpLanguageManagement::FlagIcon") || "Flag icon (e.g., emoji)"
837
+ }
838
+ ) }),
839
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react4.Box, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
840
+ import_react6.Checkbox.Root,
841
+ {
842
+ checked: formState.isEnabled,
843
+ onCheckedChange: (e) => handleInputChange("isEnabled", !!e.checked),
844
+ children: [
845
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react6.Checkbox.HiddenInput, {}),
846
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react6.Checkbox.Control, {}),
847
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react6.Checkbox.Label, { children: t("AbpLanguageManagement::IsEnabled") || "Enabled" })
848
+ ]
849
+ }
850
+ ) })
851
+ ] })
852
+ }
853
+ )
854
+ ] });
855
+ }
856
+
857
+ // src/components/LanguageTexts/LanguageTextsComponent.tsx
858
+ var import_react7 = require("react");
859
+ var import_core4 = require("@abpjs/core");
860
+ var import_theme_shared2 = require("@abpjs/theme-shared");
861
+ var import_react8 = require("@chakra-ui/react");
862
+ var import_react9 = require("@chakra-ui/react");
863
+ var import_react10 = require("@chakra-ui/react");
864
+ var import_jsx_runtime2 = require("react/jsx-runtime");
865
+ var DEFAULT_FILTER_STATE = {
866
+ resourceName: "",
867
+ baseCultureName: "",
868
+ targetCultureName: "",
869
+ filter: "",
870
+ getOnlyEmptyValues: false
871
+ };
872
+ function LanguageTextsComponent({
873
+ onLanguageTextUpdated,
874
+ onLanguageTextRestored
875
+ }) {
876
+ const { t } = (0, import_core4.useLocalization)();
877
+ const confirmation = (0, import_theme_shared2.useConfirmation)();
878
+ const { languages, fetchLanguages } = useLanguages();
879
+ const {
880
+ languageTexts,
881
+ totalCount,
882
+ resources,
883
+ selectedLanguageText,
884
+ isLoading,
885
+ error,
886
+ fetchLanguageTexts,
887
+ fetchResources,
888
+ updateLanguageTextByName,
889
+ restoreLanguageTextByName,
890
+ setSelectedLanguageText
891
+ } = useLanguageTexts();
892
+ const [filterState, setFilterState] = (0, import_react7.useState)(DEFAULT_FILTER_STATE);
893
+ const [isModalOpen, setIsModalOpen] = (0, import_react7.useState)(false);
894
+ const [editValue, setEditValue] = (0, import_react7.useState)("");
895
+ const [isSubmitting, setIsSubmitting] = (0, import_react7.useState)(false);
896
+ const [currentPage, setCurrentPage] = (0, import_react7.useState)(0);
897
+ const [pageSize] = (0, import_react7.useState)(10);
898
+ (0, import_react7.useEffect)(() => {
899
+ fetchLanguages();
900
+ fetchResources();
901
+ }, [fetchLanguages, fetchResources]);
902
+ (0, import_react7.useEffect)(() => {
903
+ if (languages.length > 0 && !filterState.baseCultureName) {
904
+ const defaultLanguage = languages.find((l) => l.isDefaultLanguage);
905
+ const baseCulture = defaultLanguage?.cultureName || languages[0]?.cultureName || "en";
906
+ const targetCulture = languages.find((l) => !l.isDefaultLanguage)?.cultureName || baseCulture;
907
+ setFilterState((prev) => ({
908
+ ...prev,
909
+ baseCultureName: baseCulture,
910
+ targetCultureName: targetCulture
911
+ }));
912
+ }
913
+ }, [languages, filterState.baseCultureName]);
914
+ const loadLanguageTexts = (0, import_react7.useCallback)(
915
+ async (page = currentPage) => {
916
+ if (!filterState.baseCultureName || !filterState.targetCultureName) return;
917
+ await fetchLanguageTexts({
918
+ resourceName: filterState.resourceName || void 0,
919
+ baseCultureName: filterState.baseCultureName,
920
+ targetCultureName: filterState.targetCultureName,
921
+ getOnlyEmptyValues: filterState.getOnlyEmptyValues,
922
+ filter: filterState.filter || void 0,
923
+ skipCount: page * pageSize,
924
+ maxResultCount: pageSize
925
+ });
926
+ },
927
+ [filterState, currentPage, pageSize, fetchLanguageTexts]
928
+ );
929
+ (0, import_react7.useEffect)(() => {
930
+ if (filterState.baseCultureName && filterState.targetCultureName) {
931
+ setCurrentPage(0);
932
+ loadLanguageTexts(0);
933
+ }
934
+ }, [
935
+ filterState.baseCultureName,
936
+ filterState.targetCultureName,
937
+ filterState.resourceName,
938
+ filterState.getOnlyEmptyValues
939
+ ]);
940
+ const handleSearch = (0, import_react7.useCallback)(() => {
941
+ setCurrentPage(0);
942
+ loadLanguageTexts(0);
943
+ }, [loadLanguageTexts]);
944
+ const handleEdit = (0, import_react7.useCallback)(
945
+ (languageText) => {
946
+ setSelectedLanguageText(languageText);
947
+ setEditValue(languageText.value || "");
948
+ setIsModalOpen(true);
949
+ },
950
+ [setSelectedLanguageText]
951
+ );
952
+ const handleRestore = (0, import_react7.useCallback)(
953
+ async (languageText) => {
954
+ const status = await confirmation.warn(
955
+ t("AbpLanguageManagement::RestoreToDefaultConfirmationMessage") || "Are you sure you want to restore this text to its default value?",
956
+ t("AbpLanguageManagement::AreYouSure") || "Are you sure?"
957
+ );
958
+ if (status === import_theme_shared2.Toaster.Status.confirm) {
959
+ const params = {
960
+ resourceName: languageText.resourceName,
961
+ cultureName: languageText.cultureName,
962
+ name: languageText.name
963
+ };
964
+ const result = await restoreLanguageTextByName(params);
965
+ if (result.success) {
966
+ onLanguageTextRestored?.(params);
967
+ }
968
+ }
969
+ },
970
+ [confirmation, t, restoreLanguageTextByName, onLanguageTextRestored]
971
+ );
972
+ const handleSubmit = (0, import_react7.useCallback)(async () => {
973
+ if (!selectedLanguageText) return;
974
+ setIsSubmitting(true);
975
+ const params = {
976
+ resourceName: selectedLanguageText.resourceName,
977
+ cultureName: selectedLanguageText.cultureName,
978
+ name: selectedLanguageText.name,
979
+ value: editValue
980
+ };
981
+ const result = await updateLanguageTextByName(params);
982
+ setIsSubmitting(false);
983
+ if (result.success) {
984
+ onLanguageTextUpdated?.(params);
985
+ setIsModalOpen(false);
986
+ setSelectedLanguageText(null);
987
+ setEditValue("");
988
+ }
989
+ }, [selectedLanguageText, editValue, updateLanguageTextByName, onLanguageTextUpdated, setSelectedLanguageText]);
990
+ const handleModalClose = (0, import_react7.useCallback)(() => {
991
+ setIsModalOpen(false);
992
+ setSelectedLanguageText(null);
993
+ setEditValue("");
994
+ }, [setSelectedLanguageText]);
995
+ const handleFilterChange = (0, import_react7.useCallback)(
996
+ (field, value) => {
997
+ setFilterState((prev) => ({ ...prev, [field]: value }));
998
+ },
999
+ []
1000
+ );
1001
+ const handlePageChange = (0, import_react7.useCallback)(
1002
+ (newPage) => {
1003
+ setCurrentPage(newPage);
1004
+ loadLanguageTexts(newPage);
1005
+ },
1006
+ [loadLanguageTexts]
1007
+ );
1008
+ const totalPages = Math.ceil(totalCount / pageSize);
1009
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Box, { id: "language-management-texts-wrapper", className: "card", p: 4, children: [
1010
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Flex, { justify: "space-between", align: "center", mb: 4, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { fontSize: "xl", fontWeight: "bold", children: t("AbpLanguageManagement::LanguageTexts") || "Language Texts" }) }),
1011
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.VStack, { gap: 4, align: "stretch", mb: 4, children: [
1012
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.HStack, { gap: 4, flexWrap: "wrap", children: [
1013
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Box, { flex: "1", minW: "200px", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpLanguageManagement::Resource") || "Resource", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react9.NativeSelectRoot, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1014
+ import_react9.NativeSelectField,
1015
+ {
1016
+ value: filterState.resourceName,
1017
+ onChange: (e) => handleFilterChange("resourceName", e.target.value),
1018
+ children: [
1019
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: "", children: t("AbpLanguageManagement::AllResources") || "All Resources" }),
1020
+ resources.map((resource) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("option", { value: resource.name, children: resource.name }, resource.name))
1021
+ ]
1022
+ }
1023
+ ) }) }) }),
1024
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Box, { flex: "1", minW: "200px", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpLanguageManagement::BaseCulture") || "Base Culture", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react9.NativeSelectRoot, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1025
+ import_react9.NativeSelectField,
1026
+ {
1027
+ value: filterState.baseCultureName,
1028
+ onChange: (e) => handleFilterChange("baseCultureName", e.target.value),
1029
+ children: languages.map((lang) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: lang.cultureName, children: [
1030
+ lang.displayName,
1031
+ " (",
1032
+ lang.cultureName,
1033
+ ")"
1034
+ ] }, lang.cultureName))
1035
+ }
1036
+ ) }) }) }),
1037
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Box, { flex: "1", minW: "200px", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpLanguageManagement::TargetCulture") || "Target Culture", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react9.NativeSelectRoot, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1038
+ import_react9.NativeSelectField,
1039
+ {
1040
+ value: filterState.targetCultureName,
1041
+ onChange: (e) => handleFilterChange("targetCultureName", e.target.value),
1042
+ children: languages.map((lang) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("option", { value: lang.cultureName, children: [
1043
+ lang.displayName,
1044
+ " (",
1045
+ lang.cultureName,
1046
+ ")"
1047
+ ] }, lang.cultureName))
1048
+ }
1049
+ ) }) }) })
1050
+ ] }),
1051
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.HStack, { gap: 4, children: [
1052
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1053
+ import_react8.Input,
1054
+ {
1055
+ placeholder: t("AbpLanguageManagement::Filter") || "Filter by key or value...",
1056
+ value: filterState.filter,
1057
+ onChange: (e) => handleFilterChange("filter", e.target.value),
1058
+ onKeyDown: (e) => e.key === "Enter" && handleSearch(),
1059
+ flex: "1"
1060
+ }
1061
+ ),
1062
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
1063
+ import_react10.Checkbox.Root,
1064
+ {
1065
+ checked: filterState.getOnlyEmptyValues,
1066
+ onCheckedChange: (e) => handleFilterChange("getOnlyEmptyValues", !!e.checked),
1067
+ children: [
1068
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react10.Checkbox.HiddenInput, {}),
1069
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react10.Checkbox.Control, {}),
1070
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react10.Checkbox.Label, { children: t("AbpLanguageManagement::OnlyEmptyValues") || "Only empty values" })
1071
+ ]
1072
+ }
1073
+ ),
1074
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Button, { colorPalette: "blue", onClick: handleSearch, children: t("AbpLanguageManagement::Search") || "Search" })
1075
+ ] })
1076
+ ] }),
1077
+ error && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Alert, { status: "error", mb: 4, children: error }),
1078
+ isLoading && languageTexts.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Flex, { justify: "center", py: 8, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Spinner, { size: "lg" }) }),
1079
+ languageTexts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
1080
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Table.Root, { variant: "outline", children: [
1081
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Table.Row, { children: [
1082
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.ColumnHeader, { children: t("AbpLanguageManagement::Actions") || "Actions" }),
1083
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.ColumnHeader, { children: t("AbpLanguageManagement::Key") || "Key" }),
1084
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.ColumnHeader, { children: t("AbpLanguageManagement::BaseValue") || "Base Value" }),
1085
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.ColumnHeader, { children: t("AbpLanguageManagement::TargetValue") || "Target Value" }),
1086
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.ColumnHeader, { children: t("AbpLanguageManagement::Resource") || "Resource" })
1087
+ ] }) }),
1088
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.Body, { children: languageTexts.map((text, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Table.Row, { children: [
1089
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Menu.Root, { children: [
1090
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Menu.Trigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Button, { size: "sm", colorPalette: "blue", children: t("AbpLanguageManagement::Actions") || "Actions" }) }),
1091
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Menu.Positioner, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Menu.Content, { children: [
1092
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Menu.Item, { value: "edit", onClick: () => handleEdit(text), children: t("AbpLanguageManagement::Edit") || "Edit" }),
1093
+ text.value !== text.baseValue && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1094
+ import_react8.Menu.Item,
1095
+ {
1096
+ value: "restore",
1097
+ color: "orange.500",
1098
+ onClick: () => handleRestore(text),
1099
+ children: t("AbpLanguageManagement::RestoreToDefault") || "Restore to Default"
1100
+ }
1101
+ )
1102
+ ] }) })
1103
+ ] }) }),
1104
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { fontSize: "sm", fontFamily: "mono", children: text.name }) }),
1105
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { fontSize: "sm", color: "gray.600", children: text.baseValue }) }),
1106
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1107
+ import_react8.Text,
1108
+ {
1109
+ fontSize: "sm",
1110
+ color: text.value ? "inherit" : "red.500",
1111
+ fontStyle: text.value ? "normal" : "italic",
1112
+ children: text.value || t("AbpLanguageManagement::NotTranslated") || "(Not translated)"
1113
+ }
1114
+ ) }),
1115
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Table.Cell, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { fontSize: "sm", color: "gray.500", children: text.resourceName }) })
1116
+ ] }, `${text.resourceName}-${text.name}-${index}`)) })
1117
+ ] }),
1118
+ totalPages > 1 && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Flex, { justify: "space-between", align: "center", mt: 4, children: [
1119
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { fontSize: "sm", color: "gray.500", children: t("AbpLanguageManagement::ShowingXofY", (currentPage * pageSize + 1).toString(), Math.min((currentPage + 1) * pageSize, totalCount).toString(), totalCount.toString()) || `Showing ${currentPage * pageSize + 1}-${Math.min((currentPage + 1) * pageSize, totalCount)} of ${totalCount}` }),
1120
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.HStack, { gap: 2, children: [
1121
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1122
+ import_theme_shared2.Button,
1123
+ {
1124
+ size: "sm",
1125
+ variant: "outline",
1126
+ onClick: () => handlePageChange(currentPage - 1),
1127
+ disabled: currentPage === 0,
1128
+ children: t("AbpLanguageManagement::Previous") || "Previous"
1129
+ }
1130
+ ),
1131
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_react8.Text, { fontSize: "sm", children: [
1132
+ currentPage + 1,
1133
+ " / ",
1134
+ totalPages
1135
+ ] }),
1136
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1137
+ import_theme_shared2.Button,
1138
+ {
1139
+ size: "sm",
1140
+ variant: "outline",
1141
+ onClick: () => handlePageChange(currentPage + 1),
1142
+ disabled: currentPage >= totalPages - 1,
1143
+ children: t("AbpLanguageManagement::Next") || "Next"
1144
+ }
1145
+ )
1146
+ ] })
1147
+ ] })
1148
+ ] }),
1149
+ !isLoading && languageTexts.length === 0 && filterState.baseCultureName && filterState.targetCultureName && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { textAlign: "center", color: "gray.500", py: 8, children: t("AbpLanguageManagement::NoLanguageTextsFound") || "No language texts found" }),
1150
+ !filterState.baseCultureName || !filterState.targetCultureName ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { textAlign: "center", color: "gray.500", py: 8, children: t("AbpLanguageManagement::SelectCulturesToViewTexts") || "Select base and target cultures to view language texts" }) : null,
1151
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1152
+ import_theme_shared2.Modal,
1153
+ {
1154
+ visible: isModalOpen,
1155
+ onVisibleChange: setIsModalOpen,
1156
+ header: t("AbpLanguageManagement::EditLanguageText") || "Edit Language Text",
1157
+ footer: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
1158
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Button, { variant: "outline", onClick: handleModalClose, disabled: isSubmitting, children: t("AbpLanguageManagement::Cancel") || "Cancel" }),
1159
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.Button, { colorPalette: "blue", onClick: handleSubmit, loading: isSubmitting, children: t("AbpLanguageManagement::Save") || "Save" })
1160
+ ] }),
1161
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.VStack, { gap: 4, align: "stretch", children: selectedLanguageText && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
1162
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpLanguageManagement::Key") || "Key", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { fontFamily: "mono", p: 2, bg: "gray.100", borderRadius: "md", children: selectedLanguageText.name }) }),
1163
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpLanguageManagement::BaseValue") || "Base Value", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react8.Text, { p: 2, bg: "gray.100", borderRadius: "md", color: "gray.600", children: selectedLanguageText.baseValue }) }),
1164
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_theme_shared2.FormField, { label: t("AbpLanguageManagement::TargetValue") || "Target Value", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
1165
+ import_react8.Textarea,
1166
+ {
1167
+ value: editValue,
1168
+ onChange: (e) => setEditValue(e.target.value),
1169
+ placeholder: t("AbpLanguageManagement::EnterTranslation") || "Enter translation...",
1170
+ rows: 4
1171
+ }
1172
+ ) })
1173
+ ] }) })
1174
+ }
1175
+ )
1176
+ ] });
1177
+ }
1178
+ // Annotate the CommonJS export names for ESM import in node:
1179
+ 0 && (module.exports = {
1180
+ LANGUAGE_MANAGEMENT_ROUTES,
1181
+ LanguageManagementService,
1182
+ LanguageTextsComponent,
1183
+ LanguagesComponent,
1184
+ useLanguageTexts,
1185
+ useLanguages
1186
+ });