mirror of
https://github.com/Dvorinka/Primora.git
synced 2026-10-28 15:51:23 +00:00
fix: QA hardening across desktop connect, CLI, setup, and PWA update flow (#52)
CI / Backend Tests (push) Canceled after 0s
CI / Frontend Tests (push) Canceled after 0s
CI / Build All Services (push) Canceled after 0s
CI / Docker Build (auth) (push) Canceled after 0s
CI / Docker Build (backend) (push) Canceled after 0s
CI / Docker Build (frontend) (push) Canceled after 0s
CI / Publish edge images (auth) (push) Canceled after 0s
CI / Publish edge images (backend) (push) Canceled after 0s
CI / Publish edge images (frontend) (push) Canceled after 0s
CI / Migration Up/Down (push) Canceled after 0s
CI / Compose E2E Smoke (push) Canceled after 0s
CI / Lint (push) Canceled after 0s
CI / Backend Tests (push) Canceled after 0s
CI / Frontend Tests (push) Canceled after 0s
CI / Build All Services (push) Canceled after 0s
CI / Docker Build (auth) (push) Canceled after 0s
CI / Docker Build (backend) (push) Canceled after 0s
CI / Docker Build (frontend) (push) Canceled after 0s
CI / Publish edge images (auth) (push) Canceled after 0s
CI / Publish edge images (backend) (push) Canceled after 0s
CI / Publish edge images (frontend) (push) Canceled after 0s
CI / Migration Up/Down (push) Canceled after 0s
CI / Compose E2E Smoke (push) Canceled after 0s
CI / Lint (push) Canceled after 0s
- desktop: probe-then-persist server URL — scheme-less input tries https then http; a failed probe no longer saves a dead URL that would trap the next launch in a redirect to a broken address - frontend: close the create-collection modal on successful submit (backdrop stayed mounted and intercepted navigation) - frontend: reload once on service-worker controllerchange so returning users don't run a stale cached shell after a deploy - frontend: gate dashboard empty states on resource loading to stop the "No project selected" / "Create your workspace" flash - cli: resolve scheduled-job refs by name or id for jobs:run, jobs:runs, and jobs:rm, matching bucket/org resolution - cli: correct stale pk_live_/pk_test_ help text to the real prm_ format; align README command spellings and demo seed prefixes - setup: rewrite all public URL vars (auth, vite, backend) and cookie domain for the entered host — https for domains, http for IPs — with anchored full-line substitutions so stale ports/paths can't survive - docs: VITE_* vars never reach the frontend image build; the app resolves API/auth URLs same-origin at runtime, so host changes need no rebuild — noted HTTPS requirement for PWA/secure-context features Generated with [Devin](https://devin.ai) Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
56c63d43cd
commit
d44bbcceda
12 files changed
+138
-33
No files matched your search
@@ -1637,7 +1637,7 @@ export default function App() {
|
||||
<PwaInstallBanner />
|
||||
|
||||
<Show
|
||||
when={platform() || isDemo}
|
||||
when={platform()}
|
||||
fallback={
|
||||
<div class="page">
|
||||
<div class="skeleton" style="height:2rem;width:12rem;border-radius:8px" />
|
||||
@@ -1656,6 +1656,14 @@ export default function App() {
|
||||
when={activeProject()}
|
||||
fallback={
|
||||
<div class="page">
|
||||
<Show
|
||||
when={!organizationProjects.loading}
|
||||
fallback={
|
||||
<div class="card" style="min-height:20rem">
|
||||
<div class="skeleton" style="height:100%;min-height:20rem;border-radius:12px" />
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<Show
|
||||
when={(platform()?.organizations ?? []).length > 0}
|
||||
fallback={
|
||||
@@ -1702,6 +1710,7 @@ export default function App() {
|
||||
</button>
|
||||
</div>
|
||||
</Show>
|
||||
</Show>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { render } from 'solid-js/web';
|
||||
import { createSignal } from 'solid-js';
|
||||
import { applySlugField } from '../slug';
|
||||
import { Input } from '../../components/Input';
|
||||
|
||||
describe('slug auto-derive in DOM', () => {
|
||||
it('typing name fills the slug input', async () => {
|
||||
const host = document.createElement('div');
|
||||
document.body.appendChild(host);
|
||||
const [input, setInput] = createSignal({ name: '', slug: '' });
|
||||
const dispose = render(() => (
|
||||
<form>
|
||||
<Input label="Name" value={input().name}
|
||||
onInput={(e) => setInput((c) => applySlugField(c, 'name', e.currentTarget.value))} />
|
||||
<Input label="Slug" value={input().slug}
|
||||
onInput={(e) => setInput((c) => applySlugField(c, 'slug', e.currentTarget.value))} />
|
||||
</form>
|
||||
), host);
|
||||
const [name, slug] = Array.from(host.querySelectorAll('input'));
|
||||
name.value = 'Acme Corp';
|
||||
name.dispatchEvent(new Event('input', { bubbles: true }));
|
||||
await new Promise((r) => setTimeout(r, 0));
|
||||
expect(slug.value).toBe('acme-corp');
|
||||
dispose();
|
||||
host.remove();
|
||||
});
|
||||
});
|
||||
@@ -216,7 +216,7 @@ let apiKeys: ApiKey[] = [
|
||||
id: "key-1",
|
||||
project_id: "proj-1",
|
||||
name: "Production key",
|
||||
prefix: "pk_live_7f2a",
|
||||
prefix: "prm_7f2a9c",
|
||||
last_used_at: ago(0.2),
|
||||
revoked_at: null,
|
||||
},
|
||||
@@ -224,7 +224,7 @@ let apiKeys: ApiKey[] = [
|
||||
id: "key-2",
|
||||
project_id: "proj-1",
|
||||
name: "CI deploy",
|
||||
prefix: "pk_test_9c41",
|
||||
prefix: "prm_9c41de",
|
||||
last_used_at: ago(2),
|
||||
revoked_at: null,
|
||||
},
|
||||
|
||||
@@ -3,4 +3,17 @@ import { render } from "solid-js/web";
|
||||
import App from "./App";
|
||||
import "./index.css";
|
||||
|
||||
// Reload once when an updated service worker takes control. Without this the
|
||||
// precached shell keeps serving the previous release until a manual refresh.
|
||||
// Skipped when the page has no controller yet (first SW install) so first-time
|
||||
// visitors don't get an extra reload.
|
||||
if ("serviceWorker" in navigator && navigator.serviceWorker.controller) {
|
||||
let refreshing = false;
|
||||
navigator.serviceWorker.addEventListener("controllerchange", () => {
|
||||
if (refreshing) return;
|
||||
refreshing = true;
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
|
||||
render(() => <App />, document.getElementById("root")!);
|
||||
@@ -253,7 +253,13 @@ export function CollectionsPage(props: CollectionsPageProps) {
|
||||
title="Create collection"
|
||||
description="Collections store JSON documents scoped to a project."
|
||||
>
|
||||
<form onSubmit={props.onCreateCollection} class="space-y-4">
|
||||
<form
|
||||
onSubmit={(e) => {
|
||||
props.onCreateCollection(e);
|
||||
setCreateOpen(false);
|
||||
}}
|
||||
class="space-y-4"
|
||||
>
|
||||
<Input
|
||||
label="Collection name"
|
||||
placeholder="Posts"
|
||||
|
||||
Reference in new issue
Block a user