Make the home page remember what tab you were on
This commit is contained in:
		
							parent
							
								
									4ae8f2c7b9
								
							
						
					
					
						commit
						ba86da3374
					
				|  | @ -1,24 +1,38 @@ | ||||||
| function initTabs(container, initialTab = null) { | function initTabs(container, { | ||||||
|  |     initialTab = null, | ||||||
|  |     onSelect = (name) => {}, | ||||||
|  | }) { | ||||||
|     const buttons = Array.from(container.querySelectorAll("[data-tab-button]")); |     const buttons = Array.from(container.querySelectorAll("[data-tab-button]")); | ||||||
|     const tabs = Array.from(container.querySelectorAll("[data-tab]")); |     const tabs = Array.from(container.querySelectorAll("[data-tab]")); | ||||||
| 
 | 
 | ||||||
|     if (!initialTab) { |     const firstTab = tabs[0].getAttribute("data-tab"); | ||||||
|         initialTab = tabs[0].getAttribute("data-tab"); | 
 | ||||||
|  |     function selectTab(name, { sendEvent = true } = {}) { | ||||||
|  |         if (!document.querySelector(`[data-tab="${name}"]`)) { | ||||||
|  |             console.warn("no tab found with name", name); | ||||||
|  |             return selectTab(firstTab, initial); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|     function switchTo(name) { |  | ||||||
|         for (const tab of tabs) { |         for (const tab of tabs) { | ||||||
|             tab.hidden = tab.getAttribute("data-tab") !== name; |             tab.hidden = tab.getAttribute("data-tab") !== name; | ||||||
|         } |         } | ||||||
|         for (const button of buttons) { |         for (const button of buttons) { | ||||||
|             button.classList.toggle("tab-button-active", button.getAttribute("data-tab-button") === name); |             button.classList.toggle("tab-button-active", button.getAttribute("data-tab-button") === name); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         if (sendEvent) { | ||||||
|  |             onSelect(name); | ||||||
|         } |         } | ||||||
|     switchTo(initialTab); |     } | ||||||
|  |     selectTab(initialTab || firstTab, { sendEvent: false }); | ||||||
| 
 | 
 | ||||||
|     for (const button of buttons) { |     for (const button of buttons) { | ||||||
|         button.addEventListener("click", () => { |         button.addEventListener("click", () => { | ||||||
|             switchTo(button.getAttribute("data-tab-button")); |             selectTab(button.getAttribute("data-tab-button")); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     return { | ||||||
|  |         selectTab, | ||||||
|  |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -154,29 +154,34 @@ | ||||||
| 						<div data-tab="following" class="timeline"> | 						<div data-tab="following" class="timeline"> | ||||||
| 							{{ range .FollowingItems }} | 							{{ range .FollowingItems }} | ||||||
| 								{{ template "timeline_item.html" . }} | 								{{ template "timeline_item.html" . }} | ||||||
|  | 							{{ else }} | ||||||
|  | 								<div class="pv4 f6 tc">You are not following anything. Follow users and projects to see their posts here.</div> | ||||||
| 							{{ end }} | 							{{ end }} | ||||||
|  | 							TODO: READ MORE LINK | ||||||
| 						</div> | 						</div> | ||||||
| 					{{ end }} | 					{{ end }} | ||||||
| 					<div data-tab="featured" class="timeline"> | 					<div data-tab="featured" class="timeline"> | ||||||
| 						{{ range .FeaturedItems }} | 						{{ range .FeaturedItems }} | ||||||
| 							{{ template "timeline_item.html" . }} | 							{{ template "timeline_item.html" . }} | ||||||
| 						{{ end }} | 						{{ end }} | ||||||
|  | 						TODO: READ MORE LINK | ||||||
| 					</div> | 					</div> | ||||||
| 					<div data-tab="recent" class="timeline"> | 					<div data-tab="recent" class="timeline"> | ||||||
| 						{{ range .RecentItems }} | 						{{ range .RecentItems }} | ||||||
| 							{{ template "timeline_item.html" . }} | 							{{ template "timeline_item.html" . }} | ||||||
| 						{{ end }} | 						{{ end }} | ||||||
|  | 						TODO: READ MORE LINK | ||||||
| 					</div> | 					</div> | ||||||
| 					<div data-tab="news" class="timeline"> | 					<div data-tab="news" class="timeline"> | ||||||
| 						{{ range .NewsItems }} | 						{{ range .NewsItems }} | ||||||
| 							{{ template "timeline_item.html" . }} | 							{{ template "timeline_item.html" . }} | ||||||
| 						{{ end }} | 						{{ end }} | ||||||
| 					</div> |  | ||||||
| 						TODO: READ MORE LINK | 						TODO: READ MORE LINK | ||||||
| 					</div> | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
|  | 	</div> | ||||||
| </div> | </div> | ||||||
| 
 | 
 | ||||||
| <script> | <script> | ||||||
|  | @ -191,7 +196,19 @@ | ||||||
| 		chevron.classList.toggle("rot-180", !hide); | 		chevron.classList.toggle("rot-180", !hide); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	initTabs(document.querySelector("#landing-tabs")); | 	const noFollowing = document.querySelectorAll("[data-tab='following'] .timeline-item").length === 0; | ||||||
|  | 	const { selectTab } = initTabs(document.querySelector("#landing-tabs"), { | ||||||
|  | 		initialTab: document.location.hash.substring(1) || (noFollowing && "featured"), | ||||||
|  | 		onSelect(name) { | ||||||
|  | 			document.location.hash = `#${name}`; | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | 	window.addEventListener("hashchange", e => { | ||||||
|  | 		const tab = new URL(e.newURL).hash.substring(1); | ||||||
|  | 		if (tab) { | ||||||
|  | 			selectTab(tab, { sendEvent: false }); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| {{ end }} | {{ end }} | ||||||
|  |  | ||||||
|  | @ -12,6 +12,8 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func Index(c *RequestContext) ResponseData { | func Index(c *RequestContext) ResponseData { | ||||||
|  | 	const maxPostsPerTab = 60 | ||||||
|  | 
 | ||||||
| 	c.Perf.StartBlock("SQL", "Fetch subforum tree") | 	c.Perf.StartBlock("SQL", "Fetch subforum tree") | ||||||
| 	subforumTree := models.GetFullSubforumTree(c, c.Conn) | 	subforumTree := models.GetFullSubforumTree(c, c.Conn) | ||||||
| 	lineageBuilder := models.MakeSubforumLineageBuilder(subforumTree) | 	lineageBuilder := models.MakeSubforumLineageBuilder(subforumTree) | ||||||
|  | @ -67,14 +69,14 @@ func Index(c *RequestContext) ResponseData { | ||||||
| 	} | 	} | ||||||
| 	featuredItems, err = FetchTimeline(c, c.Conn, c.CurrentUser, lineageBuilder, hmndata.TimelineQuery{ | 	featuredItems, err = FetchTimeline(c, c.Conn, c.CurrentUser, lineageBuilder, hmndata.TimelineQuery{ | ||||||
| 		ProjectIDs: featuredProjectIDs, | 		ProjectIDs: featuredProjectIDs, | ||||||
| 		Limit:      100, | 		Limit:      maxPostsPerTab, | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		c.Logger.Warn().Err(err).Msg("failed to fetch featured feed") | 		c.Logger.Warn().Err(err).Msg("failed to fetch featured feed") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	recentItems, err = FetchTimeline(c, c.Conn, c.CurrentUser, lineageBuilder, hmndata.TimelineQuery{ | 	recentItems, err = FetchTimeline(c, c.Conn, c.CurrentUser, lineageBuilder, hmndata.TimelineQuery{ | ||||||
| 		Limit: 100, | 		Limit: maxPostsPerTab, | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		c.Logger.Warn().Err(err).Msg("failed to fetch recent feed") | 		c.Logger.Warn().Err(err).Msg("failed to fetch recent feed") | ||||||
|  | @ -83,7 +85,7 @@ func Index(c *RequestContext) ResponseData { | ||||||
| 	newsThreads, err := hmndata.FetchThreads(c, c.Conn, c.CurrentUser, hmndata.ThreadsQuery{ | 	newsThreads, err := hmndata.FetchThreads(c, c.Conn, c.CurrentUser, hmndata.ThreadsQuery{ | ||||||
| 		ProjectIDs:     []int{models.HMNProjectID}, | 		ProjectIDs:     []int{models.HMNProjectID}, | ||||||
| 		ThreadTypes:    []models.ThreadType{models.ThreadTypeProjectBlogPost}, | 		ThreadTypes:    []models.ThreadType{models.ThreadTypeProjectBlogPost}, | ||||||
| 		Limit:          100, | 		Limit:          maxPostsPerTab, | ||||||
| 		OrderByCreated: true, | 		OrderByCreated: true, | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  |  | ||||||
|  | @ -3,7 +3,8 @@ | ||||||
| - [ ] Fix spacing of podcast episodes (used to use p-spaced) | - [ ] Fix spacing of podcast episodes (used to use p-spaced) | ||||||
| - [x] Audit uses of tables across the site to see where we might actually need to apply table-layout: fixed and border-collapse: collapse | - [x] Audit uses of tables across the site to see where we might actually need to apply table-layout: fixed and border-collapse: collapse | ||||||
|     - There are zero tables on the site except one used for Asaf's debugging. |     - There are zero tables on the site except one used for Asaf's debugging. | ||||||
| - [ ] Recover <hr> styles and use them only in post-content | - [x] Recover <hr> styles and use them only in post-content | ||||||
|  |     - hr's are fine outside of post-content now too. | ||||||
| - [ ] Audit and fix all uses of: | - [ ] Audit and fix all uses of: | ||||||
|     - [ ] big |     - [ ] big | ||||||
|     - [ ] title |     - [ ] title | ||||||
|  | @ -15,23 +16,23 @@ | ||||||
|     - [ ] content |     - [ ] content | ||||||
|     - [ ] description |     - [ ] description | ||||||
|     - [ ] c--dim and friends |     - [ ] c--dim and friends | ||||||
| - [ ] Re-evaluate form styles | - [x] Re-evaluate form styles | ||||||
|     - [ ] theme-color-light is used only for buttons |     - [x] theme-color-light is used only for buttons | ||||||
| - [x] center-layout vs. margin-center | - [x] center-layout vs. margin-center | ||||||
| - [ ] Make sure old projects look ok (background images are gone) | - [x] Make sure old projects look ok (background images are gone) | ||||||
| - [ ] Audit or delete whenisit | - [ ] Audit or delete whenisit | ||||||
| - optionbar fixes | - [ ] optionbar fixes | ||||||
|     - [ ] Remove "external" styles (width, padding, etc.) |     - [ ] Remove "external" styles (width, padding, etc.) | ||||||
|     - [ ] Fix options (no more "buttons") |     - [ ] Fix options (no more "buttons") | ||||||
|     - [ ] Convert all buttons to links |     - [ ] Convert all buttons to links | ||||||
|     - [ ] Generally audit visuals |     - [ ] Generally audit visuals | ||||||
|     - [ ] Find that thing and kill it? |     - [ ] Find that thing and kill it? | ||||||
| - [ ] Probably remove uses of .tab | - [x] Probably remove uses of .tab | ||||||
| - [ ] everything in _content.scss, ugh | - [x] everything in _content.scss, ugh | ||||||
| - [ ] Reduce saturation of --background-even-background | - [-] Reduce saturation of --background-even-background | ||||||
| - [ ] Update blog styles to not use `post` and other garbage | - [ ] Update blog styles to not use `post` and other garbage | ||||||
|     - [ ] Remove from forum.css |     - [ ] Remove from forum.css | ||||||
| - [ ] Remove all uses of .content-block | - [x] Remove all uses of .content-block | ||||||
| - [ ] Figure out what's up with the projects on the jam pages | - [ ] Figure out what's up with the projects on the jam pages | ||||||
| - [ ] Determine if we actually need .project-carousel, or if our general carousel styles (?) are sufficient | - [ ] Determine if we actually need .project-carousel, or if our general carousel styles (?) are sufficient | ||||||
| - [ ] Rename `-2024` files | - [ ] Rename `-2024` files | ||||||
|  | @ -57,7 +58,7 @@ | ||||||
| - [ ] Handle empty avatar URLs correctly in various places (render as theme-dependent default) | - [ ] Handle empty avatar URLs correctly in various places (render as theme-dependent default) | ||||||
| - [x] Convert to new color vars | - [x] Convert to new color vars | ||||||
| - [ ] Make snippet descriptions partially collapse by default | - [ ] Make snippet descriptions partially collapse by default | ||||||
| - [ ] Make the home page remember which tab you were on | - [x] Make the home page remember which tab you were on | ||||||
| - [ ] Convert any plain TODOs introduced in this massive branch into TODO(redesign) | - [ ] Convert any plain TODOs introduced in this massive branch into TODO(redesign) | ||||||
| - [ ] Resolve TODO(redesign) comments | - [ ] Resolve TODO(redesign) comments | ||||||
| - [ ] Audit all project lifecycles on HMN - probably remove "complete", replace with stuff like "alpha", "beta", maybe other stuff that makes sense for other types of projects. | - [ ] Audit all project lifecycles on HMN - probably remove "complete", replace with stuff like "alpha", "beta", maybe other stuff that makes sense for other types of projects. | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue