@bit.rhplus/ui2.module-dropdown-list 0.1.110 → 0.1.112

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.
@@ -1,171 +0,0 @@
1
- // shared/hooks/useModuleInput.js
2
- import React, { useState, useEffect, useCallback } from 'react';
3
- import { useQuery } from '@tanstack/react-query';
4
- import message from 'antd/es/message';
5
- import useData from '@bit.rhplus/data'; // Upravte cestu podle skutečného umístění
6
- export const useModuleDropdownList = ({ moduleDefinition, value, displayMode = 'recent' }) => {
7
- const [modalOpen, setModalOpen] = useState(false);
8
- const [searchQuery, setSearchQuery] = useState('');
9
- const [dropdownSearchQuery, setDropdownSearchQuery] = useState('');
10
- const [selectedItem, setSelectedItem] = useState(null);
11
- // const [moduleDefinition, setModuleDefinition] = useState(null);
12
- // Získání fetchDataUIAsync z vašeho custom hooku
13
- const { fetchDataUIAsync } = useData();
14
- // Vytvoření stabilních verzí funkcí pro načítání dat pomocí useCallback
15
- const fetchData = useCallback(async (query) => {
16
- if (moduleDefinition?.fetchData) {
17
- return moduleDefinition.fetchData(query, fetchDataUIAsync);
18
- }
19
- return [];
20
- }, [moduleDefinition, fetchDataUIAsync]);
21
- const fetchById = useCallback(async (id) => {
22
- if (moduleDefinition?.fetchById) {
23
- return moduleDefinition.fetchById(id, fetchDataUIAsync);
24
- }
25
- return null;
26
- }, [moduleDefinition, fetchDataUIAsync]);
27
- // Použití React Query pro načtení dat seznamu v modálním okně (načte všechna data jednou)
28
- const moduleListQuery = useQuery({
29
- queryKey: [moduleDefinition.moduleName, 'list'],
30
- queryFn: () => fetchData(''),
31
- enabled: !!moduleDefinition && modalOpen,
32
- staleTime: 1000 * 60 * 5, // 5 minut
33
- onError: (error) => {
34
- message.error(`Chyba při načítání dat: ${error.message}`);
35
- }
36
- });
37
- // Použití React Query pro načtení kompletního seznamu v dropdown (full mode)
38
- // Nenačítá data podle dropdownSearchQuery - to je pouze pro client-side filtraci
39
- const moduleFullListQuery = useQuery({
40
- queryKey: [moduleDefinition.moduleName, 'fullList'],
41
- queryFn: () => fetchData(''),
42
- enabled: !!moduleDefinition && displayMode === 'full',
43
- staleTime: 1000 * 60 * 5, // 5 minut
44
- onError: (error) => {
45
- message.error(`Chyba při načítání dat: ${error.message}`);
46
- }
47
- });
48
- // Použití React Query pro načtení jednoho záznamu podle ID
49
- const moduleDetailQuery = useQuery({
50
- queryKey: [moduleDefinition.moduleName, 'detail', value],
51
- queryFn: () => fetchById(value),
52
- // Opraveno: načítat jen když máme ID a definici modulu, bez ohledu na selectedItem
53
- enabled: !!moduleDefinition && !!value && value !== '',
54
- staleTime: 1000 * 60 * 5, // 5 minut
55
- onSuccess: (data) => {
56
- if (data)
57
- setSelectedItem(data);
58
- },
59
- onError: (error) => {
60
- message.error(`Chyba při načítání detailu: ${error.message}`);
61
- }
62
- });
63
- // Funkce pro otevření modálního okna
64
- const openModal = () => {
65
- setModalOpen(true);
66
- };
67
- // Funkce pro zavření modálního okna
68
- const closeModal = () => setModalOpen(false);
69
- // Funkce pro změnu vyhledávacího dotazu v modálním okně
70
- const handleSearchChange = (query) => setSearchQuery(query);
71
- // Funkce pro změnu vyhledávacího dotazu v dropdownu
72
- const handleDropdownSearchChange = (query) => setDropdownSearchQuery(query);
73
- // Funkce pro výběr položky
74
- const handleItemSelect = (item) => {
75
- if (item) {
76
- setSelectedItem(item);
77
- closeModal();
78
- return item;
79
- }
80
- return null;
81
- };
82
- // Funkce pro vymazání výběru
83
- const clearSelection = () => {
84
- setSelectedItem(null);
85
- };
86
- // Vylepšená funkce pro získání zobrazované hodnoty
87
- const getDisplayValue = () => {
88
- if (!value || !moduleDefinition)
89
- return '';
90
- // Pokud máme vybranou položku, použijeme ji
91
- if (selectedItem && selectedItem[moduleDefinition.valueField] === value) {
92
- return moduleDefinition.getDisplayValue(selectedItem);
93
- }
94
- // Pokud nemáme vybranou položku, ale máme načtenou položku z React Query
95
- if (moduleDetailQuery.data) {
96
- return moduleDefinition.getDisplayValue(moduleDetailQuery.data);
97
- }
98
- // Pokud se data načítají
99
- if (moduleDetailQuery.isLoading) {
100
- return "Načítání...";
101
- }
102
- // Pokud došlo k chybě nebo data nejsou dostupná
103
- return `${value} (nenačteno)`;
104
- };
105
- // Reset selectedItem když se změní value prop
106
- useEffect(() => {
107
- if (value !== selectedItem?.[moduleDefinition?.valueField]) {
108
- // Pokud selectedItem neodpovídá aktuálnímu value, resetujeme ho
109
- setSelectedItem(null);
110
- }
111
- }, [value, selectedItem, moduleDefinition]);
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
- // Client-side filtrace fullListData podle dropdownSearchQuery
119
- const filteredFullListData = React.useMemo(() => {
120
- const rawData = moduleFullListQuery.data || [];
121
- if (!dropdownSearchQuery || dropdownSearchQuery.trim() === '') {
122
- return rawData;
123
- }
124
- const searchLower = dropdownSearchQuery.toLowerCase();
125
- return rawData.filter(item => {
126
- // Filtrujeme podle zobrazené hodnoty
127
- const displayValue = moduleDefinition?.getDisplayValue?.(item) || item.name || String(item.id || '');
128
- return displayValue.toLowerCase().includes(searchLower);
129
- });
130
- }, [moduleFullListQuery.data, dropdownSearchQuery, moduleDefinition]);
131
- // Client-side filtrace rowData (modální okno) podle searchQuery
132
- const filteredRowData = React.useMemo(() => {
133
- const rawData = moduleListQuery.data || [];
134
- if (!searchQuery || searchQuery.trim() === '') {
135
- return rawData;
136
- }
137
- const searchLower = searchQuery.toLowerCase();
138
- return rawData.filter(item => {
139
- // Filtrujeme podle zobrazené hodnoty
140
- const displayValue = moduleDefinition?.getDisplayValue?.(item) || item.name || String(item.id || '');
141
- return displayValue.toLowerCase().includes(searchLower);
142
- });
143
- }, [moduleListQuery.data, searchQuery, moduleDefinition]);
144
- // Vrácení všech potřebných stavů a funkcí
145
- return {
146
- // Stavy
147
- moduleDefinition,
148
- modalOpen,
149
- searchQuery,
150
- dropdownSearchQuery,
151
- selectedItem,
152
- rowData: filteredRowData,
153
- fullListData: filteredFullListData,
154
- isLoading: moduleListQuery.isLoading,
155
- isFullListLoading: moduleFullListQuery.isLoading,
156
- isDetailLoading: moduleDetailQuery.isLoading,
157
- // Funkce
158
- openModal,
159
- closeModal,
160
- handleSearchChange,
161
- handleDropdownSearchChange,
162
- handleItemSelect,
163
- clearSelection,
164
- getDisplayValue,
165
- // Query objekty pro pokročilé použití
166
- moduleListQuery,
167
- moduleFullListQuery,
168
- moduleDetailQuery
169
- };
170
- };
171
- //# sourceMappingURL=useModuleDropdownList.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useModuleDropdownList.js","sourceRoot":"","sources":["../useModuleDropdownList.js"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- import { atom } from 'jotai';
2
- import { atomFamily, atomWithStorage } from 'jotai/utils';
3
-
4
- /**
5
- * Atom family pro uchovávání posledních vybraných položek pro každý typ modulu
6
- * Používá localStorage pro persistenci dat mezi reloady stránky
7
- */
8
- export const recentItemsAtomFamily = atomFamily(
9
- (moduleType) => atomWithStorage(`recent-items-${moduleType}`, []),
10
- (a, b) => a === b
11
- );
12
-
13
- /**
14
- * Helper funkce pro vymazání všech uložených posledních položek
15
- * pro konkrétní modul
16
- *
17
- * @param {string} moduleType - Typ modulu
18
- * @param {Function} setAtom - Setter funkce pro daný atom
19
- */
20
- export const clearRecentItems = (moduleType, setAtom) => {
21
- setAtom(recentItemsAtomFamily(moduleType), []);
22
- };
23
-
24
- /**
25
- * Helper atom pro vývojářské účely - seznam všech typů modulů,
26
- * které mají uložené nedávné položky
27
- */
28
- export const moduleTypesWithRecentItemsAtom = atom((get) => {
29
- // Tato funkce by v produkční verzi potřebovala skutečný seznam
30
- // všech modulů, což by bylo potřeba implementovat dle
31
- // konkrétních požadavků aplikace
32
- const moduleTypes = ['products', 'contracts'];
33
-
34
- return moduleTypes.filter(moduleType =>
35
- get(recentItemsAtomFamily(moduleType)).length > 0
36
- );
37
- });
@@ -1,198 +0,0 @@
1
- // shared/hooks/useModuleInput.js
2
- import React, { useState, useEffect, useCallback } from 'react';
3
- import { useQuery } from '@tanstack/react-query';
4
- import message from 'antd/es/message';
5
- import useData from '@bit.rhplus/data'; // Upravte cestu podle skutečného umístění
6
-
7
- export const useModuleDropdownList = ({ moduleDefinition, value, displayMode = 'recent' }) => {
8
- const [modalOpen, setModalOpen] = useState(false);
9
- const [searchQuery, setSearchQuery] = useState('');
10
- const [dropdownSearchQuery, setDropdownSearchQuery] = 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 v modálním okně (načte všechna data jednou)
32
- const moduleListQuery = useQuery({
33
- queryKey: [moduleDefinition.moduleName, 'list'],
34
- queryFn: () => fetchData(''),
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í kompletního seznamu v dropdown (full mode)
43
- // Nenačítá data podle dropdownSearchQuery - to je pouze pro client-side filtraci
44
- const moduleFullListQuery = useQuery({
45
- queryKey: [moduleDefinition.moduleName, 'fullList'],
46
- queryFn: () => fetchData(''),
47
- enabled: !!moduleDefinition && displayMode === 'full',
48
- staleTime: 1000 * 60 * 5, // 5 minut
49
- onError: (error) => {
50
- message.error(`Chyba při načítání dat: ${error.message}`);
51
- }
52
- });
53
-
54
- // Použití React Query pro načtení jednoho záznamu podle ID
55
- const moduleDetailQuery = useQuery({
56
- queryKey: [moduleDefinition.moduleName, 'detail', value],
57
- queryFn: () => fetchById(value),
58
- // Opraveno: načítat jen když máme ID a definici modulu, bez ohledu na selectedItem
59
- enabled: !!moduleDefinition && !!value && value !== '',
60
- staleTime: 1000 * 60 * 5, // 5 minut
61
- onSuccess: (data) => {
62
- if (data) setSelectedItem(data);
63
- },
64
- onError: (error) => {
65
- message.error(`Chyba při načítání detailu: ${error.message}`);
66
- }
67
- });
68
-
69
- // Funkce pro otevření modálního okna
70
- const openModal = () => {
71
- setModalOpen(true);
72
- };
73
-
74
- // Funkce pro zavření modálního okna
75
- const closeModal = () => setModalOpen(false);
76
-
77
- // Funkce pro změnu vyhledávacího dotazu v modálním okně
78
- const handleSearchChange = (query) => setSearchQuery(query);
79
-
80
- // Funkce pro změnu vyhledávacího dotazu v dropdownu
81
- const handleDropdownSearchChange = (query) => setDropdownSearchQuery(query);
82
-
83
- // Funkce pro výběr položky
84
- const handleItemSelect = (item) => {
85
- if (item) {
86
- setSelectedItem(item);
87
- closeModal();
88
- return item;
89
- }
90
- return null;
91
- };
92
-
93
- // Funkce pro vymazání výběru
94
- const clearSelection = () => {
95
- setSelectedItem(null);
96
- };
97
-
98
- // Vylepšená funkce pro získání zobrazované hodnoty
99
- const getDisplayValue = () => {
100
- if (!value || !moduleDefinition) return '';
101
-
102
- // Pokud máme vybranou položku, použijeme ji
103
- if (selectedItem && selectedItem[moduleDefinition.valueField] === value) {
104
- return moduleDefinition.getDisplayValue(selectedItem);
105
- }
106
-
107
- // Pokud nemáme vybranou položku, ale máme načtenou položku z React Query
108
- if (moduleDetailQuery.data) {
109
- return moduleDefinition.getDisplayValue(moduleDetailQuery.data);
110
- }
111
-
112
- // Pokud se data načítají
113
- if (moduleDetailQuery.isLoading) {
114
- return "Načítání...";
115
- }
116
-
117
- // Pokud došlo k chybě nebo data nejsou dostupná
118
- return `${value} (nenačteno)`;
119
- };
120
-
121
- // Reset selectedItem když se změní value prop
122
- useEffect(() => {
123
- if (value !== selectedItem?.[moduleDefinition?.valueField]) {
124
- // Pokud selectedItem neodpovídá aktuálnímu value, resetujeme ho
125
- setSelectedItem(null);
126
- }
127
- }, [value, selectedItem, moduleDefinition]);
128
-
129
- // Při otevření modálního okna zajistíme načerstvení dat
130
- useEffect(() => {
131
- if (modalOpen && moduleDefinition) {
132
- moduleListQuery.refetch();
133
- }
134
- }, [modalOpen, searchQuery, moduleDefinition, moduleListQuery]);
135
-
136
- // Client-side filtrace fullListData podle dropdownSearchQuery
137
- const filteredFullListData = React.useMemo(() => {
138
- const rawData = moduleFullListQuery.data || [];
139
-
140
- if (!dropdownSearchQuery || dropdownSearchQuery.trim() === '') {
141
- return rawData;
142
- }
143
-
144
- const searchLower = dropdownSearchQuery.toLowerCase();
145
-
146
- return rawData.filter(item => {
147
- // Filtrujeme podle zobrazené hodnoty
148
- const displayValue = moduleDefinition?.getDisplayValue?.(item) || item.name || String(item.id || '');
149
- return displayValue.toLowerCase().includes(searchLower);
150
- });
151
- }, [moduleFullListQuery.data, dropdownSearchQuery, moduleDefinition]);
152
-
153
- // Client-side filtrace rowData (modální okno) podle searchQuery
154
- const filteredRowData = React.useMemo(() => {
155
- const rawData = moduleListQuery.data || [];
156
-
157
- if (!searchQuery || searchQuery.trim() === '') {
158
- return rawData;
159
- }
160
-
161
- const searchLower = searchQuery.toLowerCase();
162
-
163
- return rawData.filter(item => {
164
- // Filtrujeme podle zobrazené hodnoty
165
- const displayValue = moduleDefinition?.getDisplayValue?.(item) || item.name || String(item.id || '');
166
- return displayValue.toLowerCase().includes(searchLower);
167
- });
168
- }, [moduleListQuery.data, searchQuery, moduleDefinition]);
169
-
170
- // Vrácení všech potřebných stavů a funkcí
171
- return {
172
- // Stavy
173
- moduleDefinition,
174
- modalOpen,
175
- searchQuery,
176
- dropdownSearchQuery,
177
- selectedItem,
178
- rowData: filteredRowData,
179
- fullListData: filteredFullListData,
180
- isLoading: moduleListQuery.isLoading,
181
- isFullListLoading: moduleFullListQuery.isLoading,
182
- isDetailLoading: moduleDetailQuery.isLoading,
183
-
184
- // Funkce
185
- openModal,
186
- closeModal,
187
- handleSearchChange,
188
- handleDropdownSearchChange,
189
- handleItemSelect,
190
- clearSelection,
191
- getDisplayValue,
192
-
193
- // Query objekty pro pokročilé použití
194
- moduleListQuery,
195
- moduleFullListQuery,
196
- moduleDetailQuery
197
- };
198
- };