Browse Source
			
			
			
			
				
		Reviewed-on: https://gitea.anomalistdesign.com/trent_larson/crowd-funder-for-time-pwa/pulls/113feat/vitejs-trent
				 16 changed files with 690 additions and 101 deletions
			
			
		@ -1,3 +1,4 @@ | 
				
			|||||
module.exports = { | 
					module.exports = { | 
				
			||||
 | 
					  plugins: ["@babel/plugin-transform-private-methods"], | 
				
			||||
  presets: ["@vue/cli-plugin-babel/preset"], | 
					  presets: ["@vue/cli-plugin-babel/preset"], | 
				
			||||
}; | 
					}; | 
				
			||||
 | 
				
			|||||
@ -0,0 +1,219 @@ | 
				
			|||||
 | 
					<template> | 
				
			||||
 | 
					  <div v-if="visible" id="dialogFeedFilters" class="dialog-overlay"> | 
				
			||||
 | 
					    <div class="dialog"> | 
				
			||||
 | 
					      <h1 class="text-xl font-bold text-center mb-4">Feed Filters</h1> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					      <p class="mb-4 font-bold">Show only activities that…</p> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					      <div class="grid grid-cols-1 gap-2"> | 
				
			||||
 | 
					        <div | 
				
			||||
 | 
					          class="flex items-center justify-between cursor-pointer" | 
				
			||||
 | 
					          @click="toggleHasVisibleDid()" | 
				
			||||
 | 
					        > | 
				
			||||
 | 
					          <!-- label --> | 
				
			||||
 | 
					          <div>Include someone visible to me</div> | 
				
			||||
 | 
					          <!-- toggle --> | 
				
			||||
 | 
					          <div class="relative ml-2"> | 
				
			||||
 | 
					            <!-- input --> | 
				
			||||
 | 
					            <input | 
				
			||||
 | 
					              type="checkbox" | 
				
			||||
 | 
					              v-model="hasVisibleDid" | 
				
			||||
 | 
					              name="toggleFilterFromMyContacts" | 
				
			||||
 | 
					              class="sr-only" | 
				
			||||
 | 
					            /> | 
				
			||||
 | 
					            <!-- line --> | 
				
			||||
 | 
					            <div class="block bg-slate-500 w-14 h-8 rounded-full"></div> | 
				
			||||
 | 
					            <!-- dot --> | 
				
			||||
 | 
					            <div | 
				
			||||
 | 
					              class="dot absolute left-1 top-1 bg-slate-400 w-6 h-6 rounded-full transition" | 
				
			||||
 | 
					            ></div> | 
				
			||||
 | 
					          </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <em>or</em> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        <div | 
				
			||||
 | 
					          class="flex items-center justify-between cursor-pointer" | 
				
			||||
 | 
					          @click=" | 
				
			||||
 | 
					            hasSearchBox | 
				
			||||
 | 
					              ? toggleNearby() | 
				
			||||
 | 
					              : $router.push({ name: 'search-area' }) | 
				
			||||
 | 
					          " | 
				
			||||
 | 
					        > | 
				
			||||
 | 
					          <!-- label --> | 
				
			||||
 | 
					          <div>Are nearby</div> | 
				
			||||
 | 
					          <!-- toggle --> | 
				
			||||
 | 
					          <div v-if="hasSearchBox" class="relative ml-2"> | 
				
			||||
 | 
					            <!-- input --> | 
				
			||||
 | 
					            <input | 
				
			||||
 | 
					              type="checkbox" | 
				
			||||
 | 
					              v-model="isNearby" | 
				
			||||
 | 
					              name="toggleFilterNearby" | 
				
			||||
 | 
					              class="sr-only" | 
				
			||||
 | 
					            /> | 
				
			||||
 | 
					            <!-- line --> | 
				
			||||
 | 
					            <div class="block bg-slate-500 w-14 h-8 rounded-full"></div> | 
				
			||||
 | 
					            <!-- dot --> | 
				
			||||
 | 
					            <div | 
				
			||||
 | 
					              class="dot absolute left-1 top-1 bg-slate-400 w-6 h-6 rounded-full transition" | 
				
			||||
 | 
					            ></div> | 
				
			||||
 | 
					          </div> | 
				
			||||
 | 
					          <div v-else class="relative ml-2"> | 
				
			||||
 | 
					            <button class="ml-2 px-4 py-2 rounded-md bg-blue-200 text-blue-500"> | 
				
			||||
 | 
					              Select Location | 
				
			||||
 | 
					            </button> | 
				
			||||
 | 
					          </div> | 
				
			||||
 | 
					        </div> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					      <div class="grid grid-cols-1 sm:grid-cols-3 gap-2 mt-4"> | 
				
			||||
 | 
					        <button | 
				
			||||
 | 
					          class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md" | 
				
			||||
 | 
					          @click="setAll()" | 
				
			||||
 | 
					        > | 
				
			||||
 | 
					          Set All | 
				
			||||
 | 
					        </button> | 
				
			||||
 | 
					        <button | 
				
			||||
 | 
					          class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md" | 
				
			||||
 | 
					          @click="clearAll()" | 
				
			||||
 | 
					        > | 
				
			||||
 | 
					          Clear All | 
				
			||||
 | 
					        </button> | 
				
			||||
 | 
					        <button | 
				
			||||
 | 
					          class="block w-full text-center text-md uppercase bg-gradient-to-b from-slate-400 to-slate-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-1.5 py-2 rounded-md" | 
				
			||||
 | 
					          @click="done()" | 
				
			||||
 | 
					        > | 
				
			||||
 | 
					          Done | 
				
			||||
 | 
					        </button> | 
				
			||||
 | 
					      </div> | 
				
			||||
 | 
					    </div> | 
				
			||||
 | 
					  </div> | 
				
			||||
 | 
					</template> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<script lang="ts"> | 
				
			||||
 | 
					import { Vue, Component } from "vue-facing-decorator"; | 
				
			||||
 | 
					import { | 
				
			||||
 | 
					  LMap, | 
				
			||||
 | 
					  LMarker, | 
				
			||||
 | 
					  LRectangle, | 
				
			||||
 | 
					  LTileLayer, | 
				
			||||
 | 
					} from "@vue-leaflet/vue-leaflet"; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import { MASTER_SETTINGS_KEY } from "@/db/tables/settings"; | 
				
			||||
 | 
					import { db } from "@/db/index"; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					@Component({ | 
				
			||||
 | 
					  components: { | 
				
			||||
 | 
					    LRectangle, | 
				
			||||
 | 
					    LMap, | 
				
			||||
 | 
					    LMarker, | 
				
			||||
 | 
					    LTileLayer, | 
				
			||||
 | 
					  }, | 
				
			||||
 | 
					}) | 
				
			||||
 | 
					export default class FeedFilters extends Vue { | 
				
			||||
 | 
					  onCloseIfChanged = () => {}; | 
				
			||||
 | 
					  hasSearchBox = false; | 
				
			||||
 | 
					  hasVisibleDid = false; | 
				
			||||
 | 
					  isNearby = false; | 
				
			||||
 | 
					  settingChanged = false; | 
				
			||||
 | 
					  visible = false; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  async open(onCloseIfChanged: () => void) { | 
				
			||||
 | 
					    this.onCloseIfChanged = onCloseIfChanged; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    await db.open(); | 
				
			||||
 | 
					    const settings = await db.settings.get(MASTER_SETTINGS_KEY); | 
				
			||||
 | 
					    this.hasVisibleDid = !!settings?.filterFeedByVisible; | 
				
			||||
 | 
					    this.isNearby = !!settings?.filterFeedByNearby; | 
				
			||||
 | 
					    if (settings?.searchBoxes && settings.searchBoxes.length > 0) { | 
				
			||||
 | 
					      this.hasSearchBox = true; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    this.settingChanged = false; | 
				
			||||
 | 
					    this.visible = true; | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  toggleHasVisibleDid() { | 
				
			||||
 | 
					    this.settingChanged = true; | 
				
			||||
 | 
					    this.hasVisibleDid = !this.hasVisibleDid; | 
				
			||||
 | 
					    db.settings.update(MASTER_SETTINGS_KEY, { | 
				
			||||
 | 
					      filterFeedByVisible: this.hasVisibleDid, | 
				
			||||
 | 
					    }); | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  toggleNearby() { | 
				
			||||
 | 
					    this.settingChanged = true; | 
				
			||||
 | 
					    this.isNearby = !this.isNearby; | 
				
			||||
 | 
					    db.settings.update(MASTER_SETTINGS_KEY, { | 
				
			||||
 | 
					      filterFeedByNearby: this.isNearby, | 
				
			||||
 | 
					    }); | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  async clearAll() { | 
				
			||||
 | 
					    if (this.hasVisibleDid || this.isNearby) { | 
				
			||||
 | 
					      this.settingChanged = true; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    db.settings.update(MASTER_SETTINGS_KEY, { | 
				
			||||
 | 
					      filterFeedByNearby: false, | 
				
			||||
 | 
					      filterFeedByVisible: false, | 
				
			||||
 | 
					    }); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    this.hasVisibleDid = false; | 
				
			||||
 | 
					    this.isNearby = false; | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  async setAll() { | 
				
			||||
 | 
					    if (!this.hasVisibleDid || !this.isNearby) { | 
				
			||||
 | 
					      this.settingChanged = true; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    db.settings.update(MASTER_SETTINGS_KEY, { | 
				
			||||
 | 
					      filterFeedByNearby: true, | 
				
			||||
 | 
					      filterFeedByVisible: true, | 
				
			||||
 | 
					    }); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    this.hasVisibleDid = true; | 
				
			||||
 | 
					    this.isNearby = true; | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  close() { | 
				
			||||
 | 
					    if (this.settingChanged) { | 
				
			||||
 | 
					      this.onCloseIfChanged(); | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					    this.visible = false; | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					  done() { | 
				
			||||
 | 
					    this.close(); | 
				
			||||
 | 
					  } | 
				
			||||
 | 
					} | 
				
			||||
 | 
					</script> | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					<style> | 
				
			||||
 | 
					.dialog-overlay { | 
				
			||||
 | 
					  position: fixed; | 
				
			||||
 | 
					  top: 0; | 
				
			||||
 | 
					  left: 0; | 
				
			||||
 | 
					  right: 0; | 
				
			||||
 | 
					  bottom: 0; | 
				
			||||
 | 
					  background-color: rgba(0, 0, 0, 0.5); | 
				
			||||
 | 
					  display: flex; | 
				
			||||
 | 
					  justify-content: center; | 
				
			||||
 | 
					  align-items: center; | 
				
			||||
 | 
					  padding: 1.5rem; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					#dialogFeedFilters.dialog-overlay { | 
				
			||||
 | 
					  z-index: 99999; | 
				
			||||
 | 
					  overflow: scroll; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					.dialog { | 
				
			||||
 | 
					  background-color: white; | 
				
			||||
 | 
					  padding: 1rem; | 
				
			||||
 | 
					  border-radius: 0.5rem; | 
				
			||||
 | 
					  width: 100%; | 
				
			||||
 | 
					  max-width: 500px; | 
				
			||||
 | 
					} | 
				
			||||
 | 
					</style> | 
				
			||||
					Loading…
					
					
				
		Reference in new issue