@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.
- package/dist/index.d.ts +14 -1
- package/dist/index.js +403 -121
- package/dist/index.js.map +1 -1
- package/index.jsx +653 -351
- package/package.json +7 -8
- package/ModuleInput.css +0 -259
- package/dist/ModuleInput.css +0 -259
- package/dist/store/recentItemsStore.d.ts +0 -11
- package/dist/store/recentItemsStore.js +0 -29
- package/dist/store/recentItemsStore.js.map +0 -1
- package/dist/useModuleDropdownList.d.ts +0 -26
- package/dist/useModuleDropdownList.js +0 -171
- package/dist/useModuleDropdownList.js.map +0 -1
- package/store/recentItemsStore.js +0 -37
- package/useModuleDropdownList.js +0 -198
- /package/dist/{preview-1773828129212.js → preview-1774279607741.js} +0 -0
|
@@ -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
|
-
});
|
package/useModuleDropdownList.js
DELETED
|
@@ -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
|
-
};
|
|
File without changes
|