@bit.rhplus/ui2.module-dropdown-list 0.0.1

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.
@@ -0,0 +1,142 @@
1
+ // shared/hooks/useModuleInput.js
2
+ import { useState, useEffect, useCallback } from 'react';
3
+ import { useQuery } from '@tanstack/react-query';
4
+ import { message } from 'antd';
5
+ import useData from '@bit.rhplus/data'; // Upravte cestu podle skutečného umístění
6
+
7
+ export const useModuleDropdownList = ({ moduleDefinition, value }) => {
8
+ // Základní stav
9
+ const [modalOpen, setModalOpen] = useState(false);
10
+ const [searchQuery, setSearchQuery] = useState('');
11
+ const [selectedItem, setSelectedItem] = useState(null);
12
+ // const [moduleDefinition, setModuleDefinition] = useState(null);
13
+ // Získání fetchDataUIAsync z vašeho custom hooku
14
+ const { fetchDataUIAsync } = useData();
15
+
16
+ // Vytvoření stabilních verzí funkcí pro načítání dat pomocí useCallback
17
+ const fetchData = useCallback(async (query) => {
18
+ if (moduleDefinition?.fetchData) {
19
+ return moduleDefinition.fetchData(query, fetchDataUIAsync);
20
+ }
21
+ return [];
22
+ }, [moduleDefinition, fetchDataUIAsync]);
23
+
24
+ const fetchById = useCallback(async (id) => {
25
+ if (moduleDefinition?.fetchById) {
26
+ return moduleDefinition.fetchById(id, fetchDataUIAsync);
27
+ }
28
+ return null;
29
+ }, [moduleDefinition, fetchDataUIAsync]);
30
+
31
+ // Použití React Query pro načtení dat seznamu
32
+ const moduleListQuery = useQuery({
33
+ queryKey: [moduleDefinition.moduleName, 'list', searchQuery],
34
+ queryFn: () => fetchData(searchQuery),
35
+ enabled: !!moduleDefinition && modalOpen,
36
+ staleTime: 1000 * 60 * 5, // 5 minut
37
+ onError: (error) => {
38
+ message.error(`Chyba při načítání dat: ${error.message}`);
39
+ }
40
+ });
41
+
42
+ // Použití React Query pro načtení jednoho záznamu podle ID
43
+ const moduleDetailQuery = useQuery({
44
+ queryKey: [moduleDefinition.moduleName, 'detail', value],
45
+ queryFn: () => fetchById(value),
46
+ // Opraveno: načítat jen když máme ID a definici modulu, bez ohledu na selectedItem
47
+ enabled: !!moduleDefinition && !!value && value !== '',
48
+ staleTime: 1000 * 60 * 5, // 5 minut
49
+ onSuccess: (data) => {
50
+ if (data) setSelectedItem(data);
51
+ },
52
+ onError: (error) => {
53
+ message.error(`Chyba při načítání detailu: ${error.message}`);
54
+ }
55
+ });
56
+
57
+ // Funkce pro otevření modálního okna
58
+ const openModal = () => setModalOpen(true);
59
+
60
+ // Funkce pro zavření modálního okna
61
+ const closeModal = () => setModalOpen(false);
62
+
63
+ // Funkce pro změnu vyhledávacího dotazu
64
+ const handleSearchChange = (query) => setSearchQuery(query);
65
+
66
+ // Funkce pro výběr položky
67
+ const handleItemSelect = (item) => {
68
+ if (item) {
69
+ setSelectedItem(item);
70
+ closeModal();
71
+ return item;
72
+ }
73
+ return null;
74
+ };
75
+
76
+ // Funkce pro vymazání výběru
77
+ const clearSelection = () => {
78
+ setSelectedItem(null);
79
+ };
80
+
81
+ // Vylepšená funkce pro získání zobrazované hodnoty
82
+ const getDisplayValue = () => {
83
+ if (!value || !moduleDefinition) return '';
84
+
85
+ // Pokud máme vybranou položku, použijeme ji
86
+ if (selectedItem && selectedItem[moduleDefinition.valueField] === value) {
87
+ return moduleDefinition.getDisplayValue(selectedItem);
88
+ }
89
+
90
+ // Pokud nemáme vybranou položku, ale máme načtenou položku z React Query
91
+ if (moduleDetailQuery.data) {
92
+ return moduleDefinition.getDisplayValue(moduleDetailQuery.data);
93
+ }
94
+
95
+ // Pokud se data načítají
96
+ if (moduleDetailQuery.isLoading) {
97
+ return "Načítání...";
98
+ }
99
+
100
+ // Pokud došlo k chybě nebo data nejsou dostupná
101
+ return `${value} (nenačteno)`;
102
+ };
103
+
104
+ // Reset selectedItem když se změní value prop
105
+ useEffect(() => {
106
+ if (value !== selectedItem?.[moduleDefinition?.valueField]) {
107
+ // Pokud selectedItem neodpovídá aktuálnímu value, resetujeme ho
108
+ setSelectedItem(null);
109
+ }
110
+ }, [value, selectedItem, moduleDefinition]);
111
+
112
+ // Při otevření modálního okna zajistíme načerstvení dat
113
+ useEffect(() => {
114
+ if (modalOpen && moduleDefinition) {
115
+ moduleListQuery.refetch();
116
+ }
117
+ }, [modalOpen, searchQuery, moduleDefinition, moduleListQuery]);
118
+
119
+ // Vrácení všech potřebných stavů a funkcí
120
+ return {
121
+ // Stavy
122
+ moduleDefinition,
123
+ modalOpen,
124
+ searchQuery,
125
+ selectedItem,
126
+ rowData: moduleListQuery.data || [],
127
+ isLoading: moduleListQuery.isLoading,
128
+ isDetailLoading: moduleDetailQuery.isLoading,
129
+
130
+ // Funkce
131
+ openModal,
132
+ closeModal,
133
+ handleSearchChange,
134
+ handleItemSelect,
135
+ clearSelection,
136
+ getDisplayValue,
137
+
138
+ // Query objekty pro pokročilé použití
139
+ moduleListQuery,
140
+ moduleDetailQuery
141
+ };
142
+ };