@pattern-stack/frontend-patterns 0.2.0-alpha.18 → 0.2.0-alpha.20
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/frontend-patterns.css +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +163 -35
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +163 -35
- package/dist/index.js.map +1 -1
- package/dist/swebrain/SweBrainShowcase.d.ts +8 -0
- package/dist/swebrain/SweBrainShowcase.d.ts.map +1 -0
- package/dist/swebrain/atoms/Card.d.ts +15 -0
- package/dist/swebrain/atoms/Card.d.ts.map +1 -0
- package/dist/swebrain/atoms/Chip.d.ts +17 -0
- package/dist/swebrain/atoms/Chip.d.ts.map +1 -0
- package/dist/swebrain/atoms/Duration.d.ts +7 -0
- package/dist/swebrain/atoms/Duration.d.ts.map +1 -0
- package/dist/swebrain/atoms/EmptyCell.d.ts +5 -0
- package/dist/swebrain/atoms/EmptyCell.d.ts.map +1 -0
- package/dist/swebrain/atoms/Hand.d.ts +8 -0
- package/dist/swebrain/atoms/Hand.d.ts.map +1 -0
- package/dist/swebrain/atoms/ID.d.ts +9 -0
- package/dist/swebrain/atoms/ID.d.ts.map +1 -0
- package/dist/swebrain/atoms/IdTag.d.ts +9 -0
- package/dist/swebrain/atoms/IdTag.d.ts.map +1 -0
- package/dist/swebrain/atoms/KV.d.ts +7 -0
- package/dist/swebrain/atoms/KV.d.ts.map +1 -0
- package/dist/swebrain/atoms/LiveIndicator.d.ts +7 -0
- package/dist/swebrain/atoms/LiveIndicator.d.ts.map +1 -0
- package/dist/swebrain/atoms/PoolChip.d.ts +14 -0
- package/dist/swebrain/atoms/PoolChip.d.ts.map +1 -0
- package/dist/swebrain/atoms/Row.d.ts +10 -0
- package/dist/swebrain/atoms/Row.d.ts.map +1 -0
- package/dist/swebrain/atoms/Sparkline.d.ts +11 -0
- package/dist/swebrain/atoms/Sparkline.d.ts.map +1 -0
- package/dist/swebrain/atoms/StatusBadge.d.ts +11 -0
- package/dist/swebrain/atoms/StatusBadge.d.ts.map +1 -0
- package/dist/swebrain/atoms/StatusDot.d.ts +11 -0
- package/dist/swebrain/atoms/StatusDot.d.ts.map +1 -0
- package/dist/swebrain/atoms/Timestamp.d.ts +8 -0
- package/dist/swebrain/atoms/Timestamp.d.ts.map +1 -0
- package/dist/swebrain/atoms/index.d.ts +34 -0
- package/dist/swebrain/atoms/index.d.ts.map +1 -0
- package/dist/swebrain/atoms/pool-tokens.d.ts +14 -0
- package/dist/swebrain/atoms/pool-tokens.d.ts.map +1 -0
- package/dist/swebrain/atoms/tokens.d.ts +96 -0
- package/dist/swebrain/atoms/tokens.d.ts.map +1 -0
- package/dist/swebrain/index.d.ts +4 -0
- package/dist/swebrain/index.d.ts.map +1 -0
- package/dist/swebrain/lib/favs.d.ts +5 -0
- package/dist/swebrain/lib/favs.d.ts.map +1 -0
- package/dist/swebrain/lib/vendors.d.ts +14 -0
- package/dist/swebrain/lib/vendors.d.ts.map +1 -0
- package/dist/swebrain/molecules/PoolLegend.d.ts +8 -0
- package/dist/swebrain/molecules/PoolLegend.d.ts.map +1 -0
- package/dist/swebrain/molecules/SearchInput.d.ts +17 -0
- package/dist/swebrain/molecules/SearchInput.d.ts.map +1 -0
- package/dist/swebrain/molecules/StatCard.d.ts +11 -0
- package/dist/swebrain/molecules/StatCard.d.ts.map +1 -0
- package/dist/swebrain/molecules/TimeRangePicker.d.ts +18 -0
- package/dist/swebrain/molecules/TimeRangePicker.d.ts.map +1 -0
- package/dist/swebrain/molecules/index.d.ts +9 -0
- package/dist/swebrain/molecules/index.d.ts.map +1 -0
- package/dist/sync/createEntityHooks.d.ts.map +1 -1
- package/dist/sync/createStore.d.ts +78 -15
- package/dist/sync/createStore.d.ts.map +1 -1
- package/dist/sync/index.d.ts +2 -2
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/types.d.ts +216 -23
- package/dist/sync/types.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -19090,20 +19090,50 @@ function createEntityHooks(config) {
|
|
|
19090
19090
|
/** Key for a specific entity detail query */
|
|
19091
19091
|
detail: (id) => [...keys.details(), id]
|
|
19092
19092
|
};
|
|
19093
|
-
|
|
19093
|
+
const DEFAULT_PAGE_SIZE = 50;
|
|
19094
|
+
function toPage(raw, requestedPage, requestedPageSize) {
|
|
19095
|
+
if (Array.isArray(raw)) {
|
|
19096
|
+
const items2 = raw;
|
|
19097
|
+
return {
|
|
19098
|
+
items: items2,
|
|
19099
|
+
page: requestedPage,
|
|
19100
|
+
pageCount: 1,
|
|
19101
|
+
total: items2.length,
|
|
19102
|
+
pageSize: requestedPageSize || items2.length || DEFAULT_PAGE_SIZE,
|
|
19103
|
+
nextCursor: null
|
|
19104
|
+
};
|
|
19105
|
+
}
|
|
19106
|
+
const env2 = raw ?? {};
|
|
19107
|
+
const items = Array.isArray(env2.items) ? env2.items : [];
|
|
19108
|
+
const pageSize = typeof env2.pageSize === "number" && env2.pageSize > 0 ? env2.pageSize : requestedPageSize || DEFAULT_PAGE_SIZE;
|
|
19109
|
+
const total = typeof env2.total === "number" ? env2.total : items.length;
|
|
19110
|
+
const pageCount = typeof env2.pageCount === "number" ? env2.pageCount : Math.max(1, Math.ceil(total / Math.max(1, pageSize)));
|
|
19111
|
+
return {
|
|
19112
|
+
items,
|
|
19113
|
+
page: typeof env2.page === "number" ? env2.page : requestedPage,
|
|
19114
|
+
pageCount,
|
|
19115
|
+
total,
|
|
19116
|
+
pageSize,
|
|
19117
|
+
nextCursor: env2.nextCursor ?? null
|
|
19118
|
+
};
|
|
19119
|
+
}
|
|
19120
|
+
function useListSync(params, requestedPage, requestedPageSize) {
|
|
19094
19121
|
const query = reactQuery.useQuery({
|
|
19095
|
-
queryKey: keys.list(
|
|
19096
|
-
queryFn: () => api.list(
|
|
19122
|
+
queryKey: keys.list(params),
|
|
19123
|
+
queryFn: () => api.list(params),
|
|
19097
19124
|
staleTime
|
|
19098
19125
|
});
|
|
19126
|
+
const pageEnvelope = React.useMemo(
|
|
19127
|
+
() => query.data === void 0 ? void 0 : toPage(query.data, requestedPage, requestedPageSize),
|
|
19128
|
+
[query.data, requestedPage, requestedPageSize]
|
|
19129
|
+
);
|
|
19099
19130
|
React.useEffect(() => {
|
|
19100
19131
|
var _a, _b;
|
|
19101
|
-
if (
|
|
19102
|
-
|
|
19103
|
-
(_b = (_a = collection.utils) == null ? void 0 : _a.writeUpsert) == null ? void 0 : _b.call(_a, items);
|
|
19132
|
+
if (pageEnvelope) {
|
|
19133
|
+
(_b = (_a = collection.utils) == null ? void 0 : _a.writeUpsert) == null ? void 0 : _b.call(_a, pageEnvelope.items);
|
|
19104
19134
|
}
|
|
19105
|
-
}, [
|
|
19106
|
-
return query;
|
|
19135
|
+
}, [pageEnvelope]);
|
|
19136
|
+
return { query, pageEnvelope };
|
|
19107
19137
|
}
|
|
19108
19138
|
function useGetSync(id) {
|
|
19109
19139
|
const query = reactQuery.useQuery({
|
|
@@ -19121,41 +19151,71 @@ function createEntityHooks(config) {
|
|
|
19121
19151
|
return query;
|
|
19122
19152
|
}
|
|
19123
19153
|
function useList(options = {}) {
|
|
19124
|
-
const { where, orderBy, enabled = true } = options;
|
|
19125
|
-
const
|
|
19154
|
+
const { where, orderBy, enabled = true, pageSize, cursor } = options;
|
|
19155
|
+
const [page, setPageState] = React.useState(() => Math.max(1, options.page ?? 1));
|
|
19156
|
+
const params = React.useMemo(() => {
|
|
19157
|
+
if (!enabled) return void 0;
|
|
19158
|
+
const p = { page };
|
|
19159
|
+
if (pageSize !== void 0) p.pageSize = pageSize;
|
|
19160
|
+
if (cursor !== void 0) p.cursor = cursor;
|
|
19161
|
+
if (orderBy) {
|
|
19162
|
+
p.sort_by = orderBy.field;
|
|
19163
|
+
p.sort_order = orderBy.direction;
|
|
19164
|
+
}
|
|
19165
|
+
if (where) Object.assign(p, where);
|
|
19166
|
+
return p;
|
|
19167
|
+
}, [enabled, page, pageSize, cursor, orderBy, where]);
|
|
19168
|
+
const { query: sync, pageEnvelope } = useListSync(params, page, pageSize ?? DEFAULT_PAGE_SIZE);
|
|
19169
|
+
const pageIds = React.useMemo(() => {
|
|
19170
|
+
if (!pageEnvelope) return [];
|
|
19171
|
+
return pageEnvelope.items.map((item) => item.id).filter((id) => typeof id === "string");
|
|
19172
|
+
}, [pageEnvelope]);
|
|
19126
19173
|
const liveResult = reactDb.useLiveQuery(collection);
|
|
19127
19174
|
const data = React.useMemo(() => {
|
|
19128
|
-
|
|
19129
|
-
|
|
19130
|
-
|
|
19131
|
-
|
|
19132
|
-
|
|
19133
|
-
|
|
19134
|
-
if (Array.isArray(value)) {
|
|
19135
|
-
return value.includes(itemValue);
|
|
19136
|
-
}
|
|
19137
|
-
return itemValue === value;
|
|
19138
|
-
});
|
|
19139
|
-
});
|
|
19175
|
+
var _a, _b;
|
|
19176
|
+
const live = liveResult.data ?? [];
|
|
19177
|
+
const byId = /* @__PURE__ */ new Map();
|
|
19178
|
+
for (const row of live) {
|
|
19179
|
+
const id = row.id;
|
|
19180
|
+
if (typeof id === "string") byId.set(id, row);
|
|
19140
19181
|
}
|
|
19141
|
-
|
|
19142
|
-
|
|
19143
|
-
|
|
19144
|
-
|
|
19145
|
-
|
|
19146
|
-
if (aVal > bVal) return orderBy.direction === "asc" ? 1 : -1;
|
|
19147
|
-
return 0;
|
|
19148
|
-
});
|
|
19182
|
+
const rows = [];
|
|
19183
|
+
for (const id of pageIds) {
|
|
19184
|
+
const row = byId.get(id) ?? // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19185
|
+
((_b = (_a = collection.state) == null ? void 0 : _a.get) == null ? void 0 : _b.call(_a, id));
|
|
19186
|
+
if (row !== void 0) rows.push(row);
|
|
19149
19187
|
}
|
|
19150
|
-
return
|
|
19151
|
-
}, [liveResult.data,
|
|
19188
|
+
return rows;
|
|
19189
|
+
}, [liveResult.data, pageIds]);
|
|
19190
|
+
const pageCount = (pageEnvelope == null ? void 0 : pageEnvelope.pageCount) ?? 1;
|
|
19191
|
+
const total = (pageEnvelope == null ? void 0 : pageEnvelope.total) ?? data.length;
|
|
19192
|
+
const resolvedPageSize = (pageEnvelope == null ? void 0 : pageEnvelope.pageSize) ?? pageSize ?? DEFAULT_PAGE_SIZE;
|
|
19193
|
+
const currentPage = (pageEnvelope == null ? void 0 : pageEnvelope.page) ?? page;
|
|
19194
|
+
const setPage = React.useCallback(
|
|
19195
|
+
(next2) => {
|
|
19196
|
+
const clamped = Math.max(1, pageCount > 0 ? Math.min(next2, pageCount) : next2);
|
|
19197
|
+
setPageState(clamped);
|
|
19198
|
+
},
|
|
19199
|
+
[pageCount]
|
|
19200
|
+
);
|
|
19201
|
+
const next = React.useCallback(() => setPage(page + 1), [setPage, page]);
|
|
19202
|
+
const prev = React.useCallback(() => setPage(page - 1), [setPage, page]);
|
|
19152
19203
|
return {
|
|
19153
19204
|
data,
|
|
19154
19205
|
isLoading: sync.isLoading || liveResult.isLoading,
|
|
19155
19206
|
isError: sync.isError,
|
|
19156
19207
|
error: sync.error,
|
|
19157
19208
|
refetch: sync.refetch,
|
|
19158
|
-
collection
|
|
19209
|
+
collection,
|
|
19210
|
+
page: currentPage,
|
|
19211
|
+
pageCount,
|
|
19212
|
+
total,
|
|
19213
|
+
pageSize: resolvedPageSize,
|
|
19214
|
+
setPage,
|
|
19215
|
+
next,
|
|
19216
|
+
prev,
|
|
19217
|
+
hasNext: currentPage < pageCount,
|
|
19218
|
+
hasPrev: currentPage > 1
|
|
19159
19219
|
};
|
|
19160
19220
|
}
|
|
19161
19221
|
function useGet(id, options = {}) {
|
|
@@ -19280,7 +19340,8 @@ function createEntityHooks(config) {
|
|
|
19280
19340
|
};
|
|
19281
19341
|
}
|
|
19282
19342
|
function createStore(config) {
|
|
19283
|
-
const { entities, collections } = config;
|
|
19343
|
+
const { entities, collections, fields, lookups: lookupsEngine } = config;
|
|
19344
|
+
const defaultGetRowId = (row) => String(row.id);
|
|
19284
19345
|
const resolve = {};
|
|
19285
19346
|
for (const [name, collection] of Object.entries(collections)) {
|
|
19286
19347
|
const singular = name.endsWith("ies") ? name.slice(0, -3) + "y" : name.endsWith("s") ? name.slice(0, -1) : name;
|
|
@@ -19310,8 +19371,75 @@ function createStore(config) {
|
|
|
19310
19371
|
lookupCache = null;
|
|
19311
19372
|
}
|
|
19312
19373
|
};
|
|
19374
|
+
function makeUseData(entityName, entity) {
|
|
19375
|
+
const meta = fields ? fields[entityName] : void 0;
|
|
19376
|
+
return function useData(opts = {}) {
|
|
19377
|
+
const { pageSize } = opts;
|
|
19378
|
+
const list = entity.useList({ pageSize });
|
|
19379
|
+
React.useEffect(() => {
|
|
19380
|
+
if (lookupsEngine) {
|
|
19381
|
+
void lookupsEngine.hydrate().catch(() => {
|
|
19382
|
+
});
|
|
19383
|
+
}
|
|
19384
|
+
}, []);
|
|
19385
|
+
const hydratedLookups = lookupsEngine ? lookupsEngine.current : null;
|
|
19386
|
+
const result = React.useMemo(
|
|
19387
|
+
() => ({
|
|
19388
|
+
rows: list.data,
|
|
19389
|
+
isLoading: list.isLoading,
|
|
19390
|
+
isError: list.isError,
|
|
19391
|
+
error: list.error,
|
|
19392
|
+
refetch: list.refetch,
|
|
19393
|
+
page: list.page,
|
|
19394
|
+
pageCount: list.pageCount,
|
|
19395
|
+
total: list.total,
|
|
19396
|
+
pageSize: list.pageSize,
|
|
19397
|
+
setPage: list.setPage,
|
|
19398
|
+
next: list.next,
|
|
19399
|
+
prev: list.prev,
|
|
19400
|
+
hasNext: list.hasNext,
|
|
19401
|
+
hasPrev: list.hasPrev,
|
|
19402
|
+
getRowId: defaultGetRowId,
|
|
19403
|
+
meta,
|
|
19404
|
+
lookups: hydratedLookups,
|
|
19405
|
+
// Reserved (inert):
|
|
19406
|
+
sort: null,
|
|
19407
|
+
setSort: () => {
|
|
19408
|
+
},
|
|
19409
|
+
filter: null,
|
|
19410
|
+
setFilter: () => {
|
|
19411
|
+
}
|
|
19412
|
+
}),
|
|
19413
|
+
[
|
|
19414
|
+
list.data,
|
|
19415
|
+
list.isLoading,
|
|
19416
|
+
list.isError,
|
|
19417
|
+
list.error,
|
|
19418
|
+
list.refetch,
|
|
19419
|
+
list.page,
|
|
19420
|
+
list.pageCount,
|
|
19421
|
+
list.total,
|
|
19422
|
+
list.pageSize,
|
|
19423
|
+
list.setPage,
|
|
19424
|
+
list.next,
|
|
19425
|
+
list.prev,
|
|
19426
|
+
list.hasNext,
|
|
19427
|
+
list.hasPrev,
|
|
19428
|
+
hydratedLookups
|
|
19429
|
+
]
|
|
19430
|
+
);
|
|
19431
|
+
return result;
|
|
19432
|
+
};
|
|
19433
|
+
}
|
|
19434
|
+
const augmentedEntities = {};
|
|
19435
|
+
for (const [name, entity] of Object.entries(entities)) {
|
|
19436
|
+
augmentedEntities[name] = {
|
|
19437
|
+
...entity,
|
|
19438
|
+
useData: makeUseData(name, entity)
|
|
19439
|
+
};
|
|
19440
|
+
}
|
|
19313
19441
|
return {
|
|
19314
|
-
...
|
|
19442
|
+
...augmentedEntities,
|
|
19315
19443
|
collections,
|
|
19316
19444
|
resolve,
|
|
19317
19445
|
lookups
|