@peers-app/peers-ui 0.25.18 → 0.25.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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IDoc, type IPackage } from "@peers-app/peers-sdk";
|
|
2
|
-
/** Lists package versions with activate, promote, pin,
|
|
2
|
+
/** Lists package versions with activate, promote, pin, and delete actions. */
|
|
3
3
|
export declare const PackageVersionsList: (props: {
|
|
4
4
|
pkg: IDoc<IPackage>;
|
|
5
5
|
}) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -39,7 +39,7 @@ function tagBadgeClass(tag) {
|
|
|
39
39
|
return "text-bg-success";
|
|
40
40
|
return "text-bg-secondary";
|
|
41
41
|
}
|
|
42
|
-
/** Lists package versions with activate, promote, pin,
|
|
42
|
+
/** Lists package versions with activate, promote, pin, and delete actions. */
|
|
43
43
|
const PackageVersionsList = (props) => {
|
|
44
44
|
const { pkg } = props;
|
|
45
45
|
const refreshKey = (0, hooks_1.useObservableState)(0);
|
|
@@ -157,35 +157,6 @@ const PackageVersionsList = (props) => {
|
|
|
157
157
|
alert(`Failed to promote version: ${err instanceof Error ? err.message : String(err)}`);
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
-
async function updateVersion(pv, newSemver) {
|
|
161
|
-
try {
|
|
162
|
-
const pvHash = (0, peers_sdk_1.computePackageVersionHash)(newSemver, pv.versionTag || "dev", pv.packageBundleFileHash, pv.routesBundleFileHash, pv.uiBundleFileHash);
|
|
163
|
-
// Semver is part of the author-signed payload — re-sign or clear the old signature.
|
|
164
|
-
const authorSig = await peers_sdk_1.rpcServerCalls.signPackageAuthorVersion({
|
|
165
|
-
packageId: pv.packageId,
|
|
166
|
-
packageVersionId: pv.packageVersionId,
|
|
167
|
-
version: newSemver,
|
|
168
|
-
versionTag: pv.versionTag,
|
|
169
|
-
packageBundleFileHash: pv.packageBundleFileHash,
|
|
170
|
-
routesBundleFileHash: pv.routesBundleFileHash,
|
|
171
|
-
uiBundleFileHash: pv.uiBundleFileHash,
|
|
172
|
-
appNavs: pv.appNavs,
|
|
173
|
-
createdBy: pv.createdBy,
|
|
174
|
-
createdAt: pv.createdAt,
|
|
175
|
-
});
|
|
176
|
-
const updated = {
|
|
177
|
-
...pv,
|
|
178
|
-
version: newSemver,
|
|
179
|
-
packageVersionHash: pvHash,
|
|
180
|
-
packageAuthorSignature: authorSig,
|
|
181
|
-
};
|
|
182
|
-
await (0, peers_sdk_1.PackageVersions)().signAndSave(updated, { saveAsSnapshot: true });
|
|
183
|
-
refreshKey(refreshKey() + 1);
|
|
184
|
-
}
|
|
185
|
-
catch (err) {
|
|
186
|
-
alert(`Failed to update version: ${err instanceof Error ? err.message : String(err)}`);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
160
|
async function pinVersion() {
|
|
190
161
|
setPinning(true);
|
|
191
162
|
try {
|
|
@@ -216,7 +187,7 @@ const PackageVersionsList = (props) => {
|
|
|
216
187
|
if (sorted.length === 0) {
|
|
217
188
|
return ((0, jsx_runtime_1.jsxs)("div", { className: "text-muted text-center p-4", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-tag me-1" }), "No versions found for this package."] }));
|
|
218
189
|
}
|
|
219
|
-
return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: [sorted.length, " version", sorted.length !== 1 ? "s" : ""] }), (0, jsx_runtime_1.jsx)("div", { className: "list-group mt-2", children: sorted.map((pv) => ((0, jsx_runtime_1.jsx)(VersionRow, { pv: pv, isActive: pv.packageVersionId === effectiveActiveVersionId, isPinned: isPinned, pinning: pinning, activating: activating, deleting: deleting, userMap: userMap, onActivate: activateVersion, onDelete: deleteVersion, onPin: pinVersion, onPromote: promoteVersion
|
|
190
|
+
return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: [sorted.length, " version", sorted.length !== 1 ? "s" : ""] }), (0, jsx_runtime_1.jsx)("div", { className: "list-group mt-2", children: sorted.map((pv) => ((0, jsx_runtime_1.jsx)(VersionRow, { pv: pv, isActive: pv.packageVersionId === effectiveActiveVersionId, isPinned: isPinned, pinning: pinning, activating: activating, deleting: deleting, userMap: userMap, onActivate: activateVersion, onDelete: deleteVersion, onPin: pinVersion, onPromote: promoteVersion }, pv.packageVersionId))) })] }));
|
|
220
191
|
};
|
|
221
192
|
exports.PackageVersionsList = PackageVersionsList;
|
|
222
193
|
/**
|
|
@@ -236,25 +207,7 @@ function getPromoteTargets(currentTag) {
|
|
|
236
207
|
function VersionRow(props) {
|
|
237
208
|
const { pv, isActive, isPinned, pinning, activating, deleting, userMap } = props;
|
|
238
209
|
const creatorName = userMap.get(pv.createdBy);
|
|
239
|
-
const [editingVersion, setEditingVersion] = (0, react_1.useState)(false);
|
|
240
|
-
const [versionDraft, setVersionDraft] = (0, react_1.useState)(pv.version);
|
|
241
|
-
function startEditing() {
|
|
242
|
-
setVersionDraft(pv.version);
|
|
243
|
-
setEditingVersion(true);
|
|
244
|
-
}
|
|
245
|
-
function commitVersion() {
|
|
246
|
-
const trimmed = versionDraft.trim();
|
|
247
|
-
if (trimmed && trimmed !== pv.version) {
|
|
248
|
-
props.onUpdateVersion(pv, trimmed);
|
|
249
|
-
}
|
|
250
|
-
setEditingVersion(false);
|
|
251
|
-
}
|
|
252
210
|
const currentTag = pv.versionTag || "dev";
|
|
253
211
|
const promoteTargets = getPromoteTargets(currentTag);
|
|
254
|
-
return ((0, jsx_runtime_1.jsx)("div", { className: `list-group-item ${isActive ? "list-group-item-success" : ""}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center justify-content-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center flex-wrap", children: [
|
|
255
|
-
if (e.key === "Enter")
|
|
256
|
-
commitVersion();
|
|
257
|
-
if (e.key === "Escape")
|
|
258
|
-
setEditingVersion(false);
|
|
259
|
-
} })) : ((0, jsx_runtime_1.jsxs)("strong", { className: "me-2", style: { cursor: "pointer" }, onClick: startEditing, title: "Click to edit version", children: ["v", pv.version] })), pv.versionTag && ((0, jsx_runtime_1.jsx)("span", { className: `badge ${tagBadgeClass(pv.versionTag)} me-2`, children: pv.versionTag })), (0, jsx_runtime_1.jsx)("code", { className: "text-muted small me-2", children: pv.packageVersionHash?.substring(0, 8) }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted me-2", children: formatDate(pv.createdAt) }), creatorName && (0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: ["by ", creatorName] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex gap-1 align-items-center", children: [promoteTargets.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "dropdown", children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-info dropdown-toggle", "data-bs-toggle": "dropdown", "data-bs-popper-config": '{"strategy":"fixed"}', title: "Change version tag", children: "Promote" }), (0, jsx_runtime_1.jsx)("ul", { className: "dropdown-menu dropdown-menu-end", children: promoteTargets.map((tag) => ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)("button", { className: "dropdown-item", onClick: () => props.onPromote(pv, tag), children: [currentTag, " \u2192 ", tag] }) }, tag))) })] })), isActive ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-secondary", disabled: isPinned || pinning, onClick: () => props.onPin(), title: isPinned ? "Already pinned" : "Pin to this version (disable auto-updates)", children: [pinning ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-pin-fill" })), isPinned ? " Pinned" : " Pin"] }), (0, jsx_runtime_1.jsx)("span", { className: "badge text-bg-info align-self-center", children: "active" })] })) : ((0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-primary", disabled: activating === pv.packageVersionId, onClick: () => props.onActivate(pv), children: [activating === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm me-1" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-check2-circle me-1" })), "Activate"] })), !isActive && ((0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-danger", disabled: deleting === pv.packageVersionId, onClick: () => props.onDelete(pv), children: deleting === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-trash" })) }))] })] }) }));
|
|
212
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `list-group-item ${isActive ? "list-group-item-success" : ""}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center justify-content-between", children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center flex-wrap", children: [(0, jsx_runtime_1.jsxs)("strong", { className: "me-2", children: ["v", pv.version] }), pv.versionTag && ((0, jsx_runtime_1.jsx)("span", { className: `badge ${tagBadgeClass(pv.versionTag)} me-2`, children: pv.versionTag })), (0, jsx_runtime_1.jsx)("code", { className: "text-muted small me-2", children: pv.packageVersionHash?.substring(0, 8) }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted me-2", children: formatDate(pv.createdAt) }), creatorName && (0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: ["by ", creatorName] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex gap-1 align-items-center", children: [promoteTargets.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "dropdown", children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-info dropdown-toggle", "data-bs-toggle": "dropdown", "data-bs-popper-config": '{"strategy":"fixed"}', title: "Change version tag", children: "Promote" }), (0, jsx_runtime_1.jsx)("ul", { className: "dropdown-menu dropdown-menu-end", children: promoteTargets.map((tag) => ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)("button", { className: "dropdown-item", onClick: () => props.onPromote(pv, tag), children: [currentTag, " \u2192 ", tag] }) }, tag))) })] })), isActive ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-secondary", disabled: isPinned || pinning, onClick: () => props.onPin(), title: isPinned ? "Already pinned" : "Pin to this version (disable auto-updates)", children: [pinning ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-pin-fill" })), isPinned ? " Pinned" : " Pin"] }), (0, jsx_runtime_1.jsx)("span", { className: "badge text-bg-info align-self-center", children: "active" })] })) : ((0, jsx_runtime_1.jsxs)("button", { className: "btn btn-sm btn-outline-primary", disabled: activating === pv.packageVersionId, onClick: () => props.onActivate(pv), children: [activating === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm me-1" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-check2-circle me-1" })), "Activate"] })), !isActive && ((0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-danger", disabled: deleting === pv.packageVersionId, onClick: () => props.onDelete(pv), children: deleting === pv.packageVersionId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsx)("i", { className: "bi bi-trash" })) }))] })] }) }));
|
|
260
213
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@peers-app/peers-ui",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.20",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/peers-app/peers-ui.git"
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"lint:fix": "biome check --write ."
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@peers-app/peers-sdk": "^0.25.
|
|
33
|
+
"@peers-app/peers-sdk": "^0.25.20",
|
|
34
34
|
"bootstrap": "^5.3.3",
|
|
35
35
|
"react": "^18.0.0",
|
|
36
36
|
"react-dom": "^18.0.0"
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"@babel/preset-react": "^7.24.1",
|
|
42
42
|
"@babel/preset-typescript": "^7.27.1",
|
|
43
43
|
"@biomejs/biome": "2.3.11",
|
|
44
|
-
"@peers-app/peers-sdk": "0.25.
|
|
44
|
+
"@peers-app/peers-sdk": "0.25.20",
|
|
45
45
|
"@testing-library/dom": "^10.4.0",
|
|
46
46
|
"@testing-library/jest-dom": "^6.6.3",
|
|
47
47
|
"@testing-library/react": "^16.3.0",
|
|
@@ -43,7 +43,7 @@ function tagBadgeClass(tag?: string): string {
|
|
|
43
43
|
return "text-bg-secondary";
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
/** Lists package versions with activate, promote, pin,
|
|
46
|
+
/** Lists package versions with activate, promote, pin, and delete actions. */
|
|
47
47
|
export const PackageVersionsList = (props: { pkg: IDoc<IPackage> }) => {
|
|
48
48
|
const { pkg } = props;
|
|
49
49
|
const refreshKey = useObservableState(0);
|
|
@@ -174,41 +174,6 @@ export const PackageVersionsList = (props: { pkg: IDoc<IPackage> }) => {
|
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
-
async function updateVersion(pv: IPackageVersion, newSemver: string) {
|
|
178
|
-
try {
|
|
179
|
-
const pvHash = computePackageVersionHash(
|
|
180
|
-
newSemver,
|
|
181
|
-
pv.versionTag || "dev",
|
|
182
|
-
pv.packageBundleFileHash,
|
|
183
|
-
pv.routesBundleFileHash,
|
|
184
|
-
pv.uiBundleFileHash,
|
|
185
|
-
);
|
|
186
|
-
// Semver is part of the author-signed payload — re-sign or clear the old signature.
|
|
187
|
-
const authorSig = await rpcServerCalls.signPackageAuthorVersion({
|
|
188
|
-
packageId: pv.packageId,
|
|
189
|
-
packageVersionId: pv.packageVersionId,
|
|
190
|
-
version: newSemver,
|
|
191
|
-
versionTag: pv.versionTag,
|
|
192
|
-
packageBundleFileHash: pv.packageBundleFileHash,
|
|
193
|
-
routesBundleFileHash: pv.routesBundleFileHash,
|
|
194
|
-
uiBundleFileHash: pv.uiBundleFileHash,
|
|
195
|
-
appNavs: pv.appNavs,
|
|
196
|
-
createdBy: pv.createdBy,
|
|
197
|
-
createdAt: pv.createdAt,
|
|
198
|
-
});
|
|
199
|
-
const updated: IPackageVersion = {
|
|
200
|
-
...pv,
|
|
201
|
-
version: newSemver,
|
|
202
|
-
packageVersionHash: pvHash,
|
|
203
|
-
packageAuthorSignature: authorSig,
|
|
204
|
-
};
|
|
205
|
-
await PackageVersions().signAndSave(updated, { saveAsSnapshot: true });
|
|
206
|
-
refreshKey(refreshKey() + 1);
|
|
207
|
-
} catch (err: unknown) {
|
|
208
|
-
alert(`Failed to update version: ${err instanceof Error ? err.message : String(err)}`);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
177
|
async function pinVersion() {
|
|
213
178
|
setPinning(true);
|
|
214
179
|
try {
|
|
@@ -270,7 +235,6 @@ export const PackageVersionsList = (props: { pkg: IDoc<IPackage> }) => {
|
|
|
270
235
|
onDelete={deleteVersion}
|
|
271
236
|
onPin={pinVersion}
|
|
272
237
|
onPromote={promoteVersion}
|
|
273
|
-
onUpdateVersion={updateVersion}
|
|
274
238
|
/>
|
|
275
239
|
))}
|
|
276
240
|
</div>
|
|
@@ -305,26 +269,9 @@ function VersionRow(props: {
|
|
|
305
269
|
onDelete: (pv: IPackageVersion) => void;
|
|
306
270
|
onPin: () => void;
|
|
307
271
|
onPromote: (pv: IPackageVersion, newTag: string) => void;
|
|
308
|
-
onUpdateVersion: (pv: IPackageVersion, newSemver: string) => void;
|
|
309
272
|
}) {
|
|
310
273
|
const { pv, isActive, isPinned, pinning, activating, deleting, userMap } = props;
|
|
311
274
|
const creatorName = userMap.get(pv.createdBy);
|
|
312
|
-
const [editingVersion, setEditingVersion] = useState(false);
|
|
313
|
-
const [versionDraft, setVersionDraft] = useState(pv.version);
|
|
314
|
-
|
|
315
|
-
function startEditing() {
|
|
316
|
-
setVersionDraft(pv.version);
|
|
317
|
-
setEditingVersion(true);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
function commitVersion() {
|
|
321
|
-
const trimmed = versionDraft.trim();
|
|
322
|
-
if (trimmed && trimmed !== pv.version) {
|
|
323
|
-
props.onUpdateVersion(pv, trimmed);
|
|
324
|
-
}
|
|
325
|
-
setEditingVersion(false);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
275
|
const currentTag = pv.versionTag || "dev";
|
|
329
276
|
const promoteTargets = getPromoteTargets(currentTag);
|
|
330
277
|
|
|
@@ -332,29 +279,8 @@ function VersionRow(props: {
|
|
|
332
279
|
<div className={`list-group-item ${isActive ? "list-group-item-success" : ""}`}>
|
|
333
280
|
<div className="d-flex align-items-center justify-content-between">
|
|
334
281
|
<div className="d-flex align-items-center flex-wrap">
|
|
335
|
-
{
|
|
336
|
-
|
|
337
|
-
type="text"
|
|
338
|
-
className="form-control form-control-sm me-2"
|
|
339
|
-
style={{ width: "7em" }}
|
|
340
|
-
value={versionDraft}
|
|
341
|
-
onChange={(e) => setVersionDraft(e.target.value)}
|
|
342
|
-
onBlur={commitVersion}
|
|
343
|
-
onKeyDown={(e) => {
|
|
344
|
-
if (e.key === "Enter") commitVersion();
|
|
345
|
-
if (e.key === "Escape") setEditingVersion(false);
|
|
346
|
-
}}
|
|
347
|
-
/>
|
|
348
|
-
) : (
|
|
349
|
-
<strong
|
|
350
|
-
className="me-2"
|
|
351
|
-
style={{ cursor: "pointer" }}
|
|
352
|
-
onClick={startEditing}
|
|
353
|
-
title="Click to edit version"
|
|
354
|
-
>
|
|
355
|
-
v{pv.version}
|
|
356
|
-
</strong>
|
|
357
|
-
)}
|
|
282
|
+
{/* The number is the version baked into the bundle. Relabeling it desyncs isolated packages. */}
|
|
283
|
+
<strong className="me-2">v{pv.version}</strong>
|
|
358
284
|
{pv.versionTag && (
|
|
359
285
|
<span className={`badge ${tagBadgeClass(pv.versionTag)} me-2`}>{pv.versionTag}</span>
|
|
360
286
|
)}
|