@mgarlik/datastore 0.1.11 → 0.1.13

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 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
- }, [providerId, providerVersion, settings?.document, settings?.documentId, getExternalProviders, getExternalDocuments]);
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,