@mgarlik/datastore 0.1.11 → 0.1.12
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.cjs +190 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +38 -11
- package/dist/index.d.ts +38 -11
- package/dist/index.js +190 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2067,6 +2067,79 @@ var DataStoreProvider_default = DataStoreProvider;
|
|
|
2067
2067
|
|
|
2068
2068
|
// src/useDataProvider.tsx
|
|
2069
2069
|
var import_react2 = require("react");
|
|
2070
|
+
var getDynamicOptionsConfig = (schema) => {
|
|
2071
|
+
if (!schema) return [];
|
|
2072
|
+
const configs = [];
|
|
2073
|
+
Object.entries(schema).forEach(([fieldKey, schemaItem]) => {
|
|
2074
|
+
if (!schemaItem || typeof schemaItem !== "object") return;
|
|
2075
|
+
if (schemaItem.options && !Array.isArray(schemaItem.options) && typeof schemaItem.options === "object" && schemaItem.options.dataProvider) {
|
|
2076
|
+
configs.push({
|
|
2077
|
+
fieldKey,
|
|
2078
|
+
dataProvider: schemaItem.options.dataProvider,
|
|
2079
|
+
optionKeys: schemaItem.options.optionKeys,
|
|
2080
|
+
filter: schemaItem.options.filter
|
|
2081
|
+
});
|
|
2082
|
+
return;
|
|
2083
|
+
}
|
|
2084
|
+
if (schemaItem.dataSource?.dataProvider) {
|
|
2085
|
+
configs.push({
|
|
2086
|
+
fieldKey,
|
|
2087
|
+
dataProvider: schemaItem.dataSource.dataProvider,
|
|
2088
|
+
optionKeys: schemaItem.optionKeys,
|
|
2089
|
+
filter: schemaItem.filter
|
|
2090
|
+
});
|
|
2091
|
+
}
|
|
2092
|
+
});
|
|
2093
|
+
return configs;
|
|
2094
|
+
};
|
|
2095
|
+
var resolveProviderRef = (providerId, providers, presetProviders, params) => {
|
|
2096
|
+
if (providers[providerId]) {
|
|
2097
|
+
return {
|
|
2098
|
+
templateId: providerId,
|
|
2099
|
+
runtimeId: providerId
|
|
2100
|
+
};
|
|
2101
|
+
}
|
|
2102
|
+
if (presetProviders[providerId]) {
|
|
2103
|
+
const renderedProvider = renderJSONTemplate(presetProviders[providerId], params ?? void 0);
|
|
2104
|
+
return {
|
|
2105
|
+
templateId: providerId,
|
|
2106
|
+
runtimeId: renderedProvider.id
|
|
2107
|
+
};
|
|
2108
|
+
}
|
|
2109
|
+
return {
|
|
2110
|
+
templateId: providerId,
|
|
2111
|
+
runtimeId: providerId
|
|
2112
|
+
};
|
|
2113
|
+
};
|
|
2114
|
+
var createOptionFromDocument = (doc, optionKeys) => {
|
|
2115
|
+
const valuePath = optionKeys?.value || "id";
|
|
2116
|
+
const optionValue = getValueByDotPath(doc, valuePath, doc.id);
|
|
2117
|
+
const labelDefinition = optionKeys?.label;
|
|
2118
|
+
let optionLabel = "";
|
|
2119
|
+
let optionIcon;
|
|
2120
|
+
if (typeof labelDefinition === "string") {
|
|
2121
|
+
optionLabel = String(getValueByDotPath(doc, labelDefinition, optionValue ?? ""));
|
|
2122
|
+
} else if (labelDefinition && typeof labelDefinition === "object") {
|
|
2123
|
+
const labelPath = labelDefinition.title || "name";
|
|
2124
|
+
optionLabel = String(getValueByDotPath(doc, labelPath, optionValue ?? ""));
|
|
2125
|
+
if (labelDefinition.icon) {
|
|
2126
|
+
optionIcon = getValueByDotPath(doc, labelDefinition.icon);
|
|
2127
|
+
}
|
|
2128
|
+
} else {
|
|
2129
|
+
optionLabel = String(optionValue ?? "");
|
|
2130
|
+
}
|
|
2131
|
+
if (optionIcon) {
|
|
2132
|
+
return {
|
|
2133
|
+
value: optionValue,
|
|
2134
|
+
label: optionLabel,
|
|
2135
|
+
icon: optionIcon
|
|
2136
|
+
};
|
|
2137
|
+
}
|
|
2138
|
+
return {
|
|
2139
|
+
value: optionValue,
|
|
2140
|
+
label: optionLabel
|
|
2141
|
+
};
|
|
2142
|
+
};
|
|
2070
2143
|
var useDataProvider = (id, params, dataFilter, settings) => {
|
|
2071
2144
|
const [providerId, setProviderId] = (0, import_react2.useState)(null);
|
|
2072
2145
|
const [filter, setFilter] = (0, import_react2.useState)(null);
|
|
@@ -2094,6 +2167,37 @@ var useDataProvider = (id, params, dataFilter, settings) => {
|
|
|
2094
2167
|
}, [providerId, getProviderLastUpdate]),
|
|
2095
2168
|
() => null
|
|
2096
2169
|
);
|
|
2170
|
+
const dependentProviders = (0, import_react2.useMemo)(() => {
|
|
2171
|
+
const providers = getExternalProviders();
|
|
2172
|
+
if (!providerId || !providers[providerId]?.schema) return [];
|
|
2173
|
+
const schema = providers[providerId]?.schema;
|
|
2174
|
+
const optionConfigs = getDynamicOptionsConfig(schema);
|
|
2175
|
+
const uniqueProviders = {};
|
|
2176
|
+
optionConfigs.forEach((cfg) => {
|
|
2177
|
+
const resolved = resolveProviderRef(cfg.dataProvider, providers, presetProviders, params);
|
|
2178
|
+
if (resolved.runtimeId === providerId) return;
|
|
2179
|
+
uniqueProviders[resolved.runtimeId] = resolved;
|
|
2180
|
+
});
|
|
2181
|
+
return Object.values(uniqueProviders);
|
|
2182
|
+
}, [providerId, providerVersion, getExternalProviders, presetProviders, params]);
|
|
2183
|
+
const dependentProviderVersion = (0, import_react2.useSyncExternalStore)(
|
|
2184
|
+
(0, import_react2.useCallback)(
|
|
2185
|
+
(onStoreChange) => {
|
|
2186
|
+
if (dependentProviders.length === 0) return () => {
|
|
2187
|
+
};
|
|
2188
|
+
const unsubscribers = dependentProviders.map((providerRef) => subscribeToProvider(providerRef.runtimeId, onStoreChange));
|
|
2189
|
+
return () => {
|
|
2190
|
+
unsubscribers.forEach((unsubscribe) => unsubscribe?.());
|
|
2191
|
+
};
|
|
2192
|
+
},
|
|
2193
|
+
[dependentProviders, subscribeToProvider]
|
|
2194
|
+
),
|
|
2195
|
+
(0, import_react2.useCallback)(() => {
|
|
2196
|
+
if (dependentProviders.length === 0) return "";
|
|
2197
|
+
return dependentProviders.map((providerRef) => String(getProviderLastUpdate(providerRef.runtimeId) ?? "")).join("|");
|
|
2198
|
+
}, [dependentProviders, getProviderLastUpdate]),
|
|
2199
|
+
() => ""
|
|
2200
|
+
);
|
|
2097
2201
|
systemLog("usedp", `${id} - ${providerId}`);
|
|
2098
2202
|
(0, import_react2.useEffect)(() => {
|
|
2099
2203
|
if (id === void 0 || typeof id === "boolean" && id === false) return;
|
|
@@ -2133,6 +2237,45 @@ var useDataProvider = (id, params, dataFilter, settings) => {
|
|
|
2133
2237
|
}
|
|
2134
2238
|
};
|
|
2135
2239
|
}, []);
|
|
2240
|
+
(0, import_react2.useEffect)(() => {
|
|
2241
|
+
if (dependentProviders.length === 0) return;
|
|
2242
|
+
const currentProviders = getExternalProviders();
|
|
2243
|
+
const incrementedProviders = [];
|
|
2244
|
+
const createdProviders = [];
|
|
2245
|
+
dependentProviders.forEach((providerRef) => {
|
|
2246
|
+
if (providerRef.runtimeId === providerId) return;
|
|
2247
|
+
if (currentProviders[providerRef.runtimeId]) {
|
|
2248
|
+
if (!currentProviders[providerRef.runtimeId]?.isPermanent) {
|
|
2249
|
+
updateProviderListeners(providerRef.runtimeId, 1);
|
|
2250
|
+
incrementedProviders.push(providerRef.runtimeId);
|
|
2251
|
+
}
|
|
2252
|
+
return;
|
|
2253
|
+
}
|
|
2254
|
+
if (!presetProviders[providerRef.templateId]) {
|
|
2255
|
+
systemLog("usedp", "Neznamy provider v schema.options", providerRef.templateId);
|
|
2256
|
+
return;
|
|
2257
|
+
}
|
|
2258
|
+
const renderedProvider = renderJSONTemplate(presetProviders[providerRef.templateId], params ?? void 0);
|
|
2259
|
+
dispatch("registerProvider", renderedProvider);
|
|
2260
|
+
createdProviders.push({
|
|
2261
|
+
templateId: providerRef.templateId,
|
|
2262
|
+
runtimeId: renderedProvider.id
|
|
2263
|
+
});
|
|
2264
|
+
});
|
|
2265
|
+
return () => {
|
|
2266
|
+
incrementedProviders.forEach((id2) => {
|
|
2267
|
+
updateProviderListeners(id2, -1);
|
|
2268
|
+
});
|
|
2269
|
+
if (createdProviders.length === 0) return;
|
|
2270
|
+
const activeProviders = getExternalProviders();
|
|
2271
|
+
createdProviders.forEach((providerRef) => {
|
|
2272
|
+
const presetProvider = presetProviders[providerRef.templateId];
|
|
2273
|
+
if (!presetProvider?.isPermanent && !activeProviders[providerRef.runtimeId]?.isPermanent) {
|
|
2274
|
+
dispatch("unregisterProvider", providerRef.runtimeId);
|
|
2275
|
+
}
|
|
2276
|
+
});
|
|
2277
|
+
};
|
|
2278
|
+
}, [dependentProviders, providerId, getExternalProviders, updateProviderListeners, dispatch, presetProviders, params]);
|
|
2136
2279
|
const update = (val) => {
|
|
2137
2280
|
systemLog("usedp", "UPDATUJI: ", providerId, ", data: ", val);
|
|
2138
2281
|
dispatch("updateDataStore", { id: providerId, data: val });
|
|
@@ -2185,16 +2328,61 @@ var useDataProvider = (id, params, dataFilter, settings) => {
|
|
|
2185
2328
|
docs = filterDocuments(docs, filter);
|
|
2186
2329
|
systemLog("usedp", "Konec filteru: ");
|
|
2187
2330
|
}
|
|
2331
|
+
const schema = providers[providerId].schema;
|
|
2332
|
+
let resolvedSchema = schema;
|
|
2333
|
+
if (schema) {
|
|
2334
|
+
const optionConfigs = getDynamicOptionsConfig(schema);
|
|
2335
|
+
if (optionConfigs.length > 0) {
|
|
2336
|
+
resolvedSchema = { ...schema };
|
|
2337
|
+
optionConfigs.forEach((cfg) => {
|
|
2338
|
+
const providerRef = resolveProviderRef(cfg.dataProvider, providers, presetProviders, params);
|
|
2339
|
+
const optionProvider = providers[providerRef.runtimeId];
|
|
2340
|
+
if (!optionProvider) {
|
|
2341
|
+
systemLog("usedp", "Nenalezen provider pro schema.options", cfg.dataProvider);
|
|
2342
|
+
return;
|
|
2343
|
+
}
|
|
2344
|
+
let optionDocuments = (optionProvider.data || []).map((docId) => {
|
|
2345
|
+
const docData = documents[docId];
|
|
2346
|
+
if (!docData) return null;
|
|
2347
|
+
return {
|
|
2348
|
+
id: docId,
|
|
2349
|
+
...docData
|
|
2350
|
+
};
|
|
2351
|
+
}).filter((item) => !!item);
|
|
2352
|
+
if (cfg.filter) {
|
|
2353
|
+
optionDocuments = filterDocuments(optionDocuments, cfg.filter);
|
|
2354
|
+
}
|
|
2355
|
+
const computedOptions = optionDocuments.map((item) => createOptionFromDocument(item, cfg.optionKeys));
|
|
2356
|
+
const nextItem = {
|
|
2357
|
+
...resolvedSchema[cfg.fieldKey],
|
|
2358
|
+
options: computedOptions
|
|
2359
|
+
};
|
|
2360
|
+
resolvedSchema[cfg.fieldKey] = nextItem;
|
|
2361
|
+
});
|
|
2362
|
+
}
|
|
2363
|
+
}
|
|
2188
2364
|
return {
|
|
2189
2365
|
...providers[providerId],
|
|
2190
|
-
data: docs
|
|
2366
|
+
data: docs,
|
|
2367
|
+
schema: resolvedSchema
|
|
2191
2368
|
};
|
|
2192
|
-
}, [
|
|
2369
|
+
}, [
|
|
2370
|
+
providerId,
|
|
2371
|
+
providerVersion,
|
|
2372
|
+
dependentProviderVersion,
|
|
2373
|
+
settings?.document,
|
|
2374
|
+
settings?.documentId,
|
|
2375
|
+
getExternalProviders,
|
|
2376
|
+
getExternalDocuments,
|
|
2377
|
+
presetProviders,
|
|
2378
|
+
params
|
|
2379
|
+
]);
|
|
2193
2380
|
systemLog("usedp", `${providerId} END`);
|
|
2194
2381
|
return {
|
|
2195
2382
|
// provider,
|
|
2196
2383
|
documents: provider.data,
|
|
2197
2384
|
schema: provider.schema,
|
|
2385
|
+
layout: provider.layout,
|
|
2198
2386
|
// dispatch,
|
|
2199
2387
|
update,
|
|
2200
2388
|
updateItem,
|