on main help sign in
more ui fixes
commit0119107b1eff1ea38cf0771f80f79999d24994a1 authorJohn Hyde <johnhydefour@gmail.com> dateTue 21 Jun 2022, 17:33 (4 years ago) parent1e1b178
5 files changed+151−54
desk/desk.docket-0+1−1 ui/src/App.svelte+12−3 ui/src/components/SearchBar.svelte+13−10 ui/src/components/SearchResults.svelte+25−11 ui/src/routes/Home.svelte+100−29
desk/desk.docket-0+1−1
@@ -4,7 +4,7 @@
44 image+'https://raw.githubusercontent.com/johnhyde/astrolabe/main/ui/src/assets/astrolabe-tile.svg'
55 glob-ames+[~dister-midlev-mindyr 0v0]
66 base+'astrolabe'
7− version+[0 1 2]
7+ version+[0 1 4]
88 website+'https://github.com/johnhyde/astrolabe'
99 license+'MIT'
1010==
ui/src/App.svelte+12−3
@@ -5,13 +5,22 @@
55 import HelpModal from './components/HelpModal.svelte';
66 import "./styles/styles.scss";
77
8+ // const routes = {
9+ // '/help/:path?': HelpPage,
10+ // // '/:patp?': Home,
11+ // '/ship/:patp?': Home,
12+ // '/search/:search?': Home,
13+ // '*': Home,
14+ // }
15+
816 const routes = {
917 '/help/:path?': HelpPage,
1018 // '/:patp?': Home,
11− '/ship/:patp?': Home,
12− '/search/:search?': Home,
13− '*': Home,
19+ // '/ship/:patp?': Home,
20+ // '/search/:search?': Home,
21+ '/:mode?/:arg?': Home,
1422 }
23+
1524 import pageName from './stores/pageName';
1625
1726 $: title = $pageName ? `Astrolabe - ${$pageName}` : 'Astrolabe';
ui/src/components/SearchBar.svelte+13−10
@@ -6,21 +6,24 @@
66 export let searchQuery: RegExp = /~der/;
77 export let analysis: SearchAnalysis = new SearchAnalysis();
88 export let search = '';
9+ export let pauseAnalysis: boolean = false;
910 let debouncedSearch = search;
1011
1112 const placeholderText = "Search by @p or #. '*' matches any character";
1213
1314 $: {
14− analysis = new SearchAnalysis(debouncedSearch);
15− if (analysis.queryIsValid) {
16− searchQuery = analysis.query;
17− } else {
18− searchQuery = undefined;
19− }
20− if (analysis.patpIsValid) {
21− patp = analysis.patp;
22− } else {
23− patp = undefined;
15+ if (!pauseAnalysis) {
16+ analysis = new SearchAnalysis(debouncedSearch);
17+ if (analysis.queryIsValid) {
18+ searchQuery = analysis.query;
19+ } else {
20+ searchQuery = undefined;
21+ }
22+ if (analysis.patpIsValid) {
23+ patp = analysis.patp;
24+ } else {
25+ patp = undefined;
26+ }
2427 }
2528 }
2629
ui/src/components/SearchResults.svelte+25−11
@@ -11,12 +11,14 @@
1111 export let search: string;
1212 // export let patp: string;
1313 let combinedSearchResults = [];
14+ let searchedPointsP: Promise<any>;
1415 let searchedPoints: Patp[] = [];
1516 let selectedShipIndex: number;
1617 let page: number = 0;
1718 let pageSize: number = 50;
1819 let totalPages, firstItemOnPage;
19− let searchStatus: ('init' | 'prog' | 'done' | 'fail') = 'init';
20+ type status = ('init' | 'prog' | 'done' | 'fail');
21+ let searchStatus: status = 'init';
2022 let notification: string = null;
2123
2224 let timer;
@@ -26,17 +28,27 @@
2628 searchedContacts.search(query);
2729 }, 1000);
2830 }
29− $: searchedPointsP = searchPoints(search);
30− $: {
31+ function doSearch() {
32+ const searchSnap = search;
3133 searchStatus = 'prog';
34+ console.log(`starting search for "${searchSnap}"`);
35+ searchedPointsP = searchPoints(searchSnap);
3236 searchedPointsP.then((points) => {
33− searchedPoints = points;
34− searchStatus = 'done';
37+ if (search === searchSnap) {
38+ searchedPoints = points;
39+ searchStatus = 'done';
40+ console.log(`done searching for "${searchSnap}"`);
41+ } else {
42+ console.log(`throwing out results for outdated search "${searchSnap}" (currently on ${search})`);
43+ }
3544 }).catch((err) => {
36− searchedPoints = [];
37− searchStatus = 'fail';
45+ if (search === searchSnap) {
46+ searchedPoints = [];
47+ searchStatus = 'fail';
48+ }
3849 });
3950 }
51+ $: search, doSearch();
4052
4153 $: {
4254 const contactSearchResults: Rolodex = JSON.parse(JSON.stringify($searchedContacts));
@@ -67,10 +79,12 @@
6779 $: {
6880 totalPages = Math.ceil(combinedSearchResults.length / pageSize);
6981 firstItemOnPage = page * pageSize;
70− if (firstItemOnPage >= combinedSearchResults.length) {
71− page = totalPages - 1;
72− } else if (firstItemOnPage < 0) {
73− page = 0;
82+ if (combinedSearchResults.length > 0) {
83+ if (firstItemOnPage >= combinedSearchResults.length) {
84+ page = totalPages - 1;
85+ } else if (firstItemOnPage < 0) {
86+ page = 0;
87+ }
7488 }
7589 }
7690 $: pageResults = combinedSearchResults.slice(firstItemOnPage, (page + 1) * pageSize);
ui/src/routes/Home.svelte+100−29
@@ -1,5 +1,6 @@
11<script lang="ts">
2− import { link, push, replace, querystring } from 'svelte-spa-router'
2+ import Router from 'svelte-spa-router';
3+ import { link, push, replace, location, querystring } from 'svelte-spa-router'
34 import pageName from '../stores/pageName';
45 import { SearchAnalysis } from '../lib/id';
56 import { linkToShip } from '../lib/link';
@@ -10,41 +11,107 @@
1011 import HomeScreenTiles from '../components/HomeScreenTiles.svelte';
1112 export let params: any = {};
1213 let analysis: SearchAnalysis = new SearchAnalysis();
14+ let navigating = false;
1315
14− $: querySearch = (new URLSearchParams($querystring)).get('search');
15− function getSearch() {
16− return querySearch || params.search || params.patp || '';
16+ let search: string = (new URLSearchParams($querystring)).get('search') || params.arg || '';
17+ let urlSearch = search;
18+ // let urlChanged;
19+ let urlChangedSinceAnalysisPatp = false;
20+ $: {
21+ const potentialUrlSearch = (new URLSearchParams($querystring)).get('search') || params.arg || '';
22+ if (($location + $querystring).includes(potentialUrlSearch)) {
23+ urlSearch = potentialUrlSearch;
24+ // urlChanged = Date.now();
25+ urlChangedSinceAnalysisPatp = true;
26+ navigating = false;
27+ }
1728 }
18− $: urlSearch = querySearch || params.search || params.patp || '';
19− let search: string = getSearch();
20− $: urlChanged = (urlSearch || true) && Date.now();
21− $: analysisPatpChanged = (analysis.patp || true) && Date.now();
22− $: urlChangedSinceAnalysisPatp = (urlChanged - analysisPatpChanged) > 1000;
2329 $: {
30+ // analysisPatpChanged = (analysis.patp || true) && Date.now();
31+ urlChangedSinceAnalysisPatp = (analysis.patp || true) && false;
32+ }
33+ function nav(path, addToHistory = false) {
34+ (addToHistory ? push : replace)(path);
35+ }
36+ function navHome(addToHistory = false) {
37+ params.mode = null;
38+ params.arg = null;
39+ nav('/', addToHistory);
40+ }
41+ function navToShipView(addToHistory = false) {
42+ params.mode = 'ship';
43+ params.arg = analysis.patp;
44+ if (analysis.patp === search) {
45+ nav(linkToShip(analysis.patp), addToHistory);
46+ } else {
47+ nav(linkToShip(analysis.patp, { search }), addToHistory);
48+ }
49+ }
50+ function navToSearch(addToHistory = false) {
51+ if (!search) {
52+ navHome(addToHistory);
53+ } else if (analysis.queryIsValid) {
54+ params.mode = 'search';
55+ params.arg = search;
56+ nav(`/search/${search}`, addToHistory);
57+ }
58+ }
59+
60+ function navToMode(mode, addToHistory = false) {
61+ switch (mode) {
62+ case 'ship':
63+ navToShipView(addToHistory);
64+ break;
65+ case 'search':
66+ navToSearch(addToHistory);
67+ break;
68+ default:
69+ navHome(addToHistory);
70+ }
71+ }
72+ // $: urlChangedSinceAnalysisPatp = (urlChanged - analysisPatpChanged) > 1000;
73+ function doStuff() {
2474 if (search !== urlSearch) {
2575 if (urlChangedSinceAnalysisPatp) {
2676 search = urlSearch;
2777 } else if (analysis.search === search) {
78+ navigating = true;
2879 if (analysis.patpIsValid) {
29− if (analysis.patp === search) {
30− push(linkToShip(analysis.patp));
31− } else {
32− push(linkToShip(analysis.patp, { search }));
33− }
80+ navToShipView(true);
3481 } else {
35− const nav = params.patp !== undefined ? push : replace;
36− if (!search) {
37− nav('/');
38− } else if (analysis.queryIsValid) {
39− nav(`/search/${search}`);
40− }
82+ navToSearch(params.mode === 'ship');
4183 }
4284 }
4385 }
4486 }
87+ $: urlSearch, analysis, doStuff();
88+ $: {
89+ if (analysis.search === search) {
90+ let properMode = null;
91+ if (analysis.patpIsValid) {
92+ properMode = 'ship';
93+ } else if (analysis.search.length > 0) {
94+ properMode = 'search';
95+ }
96+ if (params.mode !== properMode) {
97+ navToMode(properMode, false);
98+ }
99+ }
100+ }
45101
46102 $: {
47− $pageName = params.patp !== undefined ? params.patp : (search ? 'Search' : null);
103+ if (analysis.search === urlSearch) {
104+ switch (params.mode) {
105+ case 'ship':
106+ $pageName = params.arg;
107+ break;
108+ case 'search':
109+ $pageName = 'Search';
110+ break;
111+ default:
112+ $pageName = null;
113+ }
114+ }
48115 }
49116
50117
@@ -52,13 +119,17 @@
52119
53120<div class="m-4 flex flex-col items-center space-y-8 2xs:m-8">
54121 <SearchBar bind:analysis bind:search />
122+ <!-- <p class="bg-white">navigating</p> -->
55123 {#if analysis.patpIsValid}
56− <ShipView patp={analysis.patp} />
57− {:else if (analysis.queryIsValid)}
58− <SearchResults query={analysis.query} search={analysis.search} />
59− {:else if (analysis.search.length > 0)}
60− <ValidationProblems problems={analysis.queryProblems} />
61− {:else}
62− <HomeScreenTiles />
63− {/if}
124+ <!-- {#if analysis.search === urlSearch} -->
125+ <ShipView patp={analysis.patp} />
126+ <!-- {/if} -->
127+ {:else if (analysis.queryIsValid)}
128+ <SearchResults query={analysis.query} search={analysis.search} />
129+ {:else if (analysis.search.length > 0)}
130+ <ValidationProblems problems={analysis.queryProblems} />
131+ {:else}
132+ <HomeScreenTiles />
133+ {/if}
134+ <!-- {/if} -->
64135</div>