summaryrefslogtreecommitdiff
path: root/iridescence/src
diff options
context:
space:
mode:
authorAdam T. Carpenter <atc@53hor.net>2022-10-26 21:02:31 -0400
committerAdam T. Carpenter <atc@53hor.net>2022-10-26 21:02:31 -0400
commit9f3098e80c6b6c87e9bfbfe36239a39e5cafb29f (patch)
treedb9ca419266117facecdff6d30460669f3148efb /iridescence/src
parentf243a3b7341012227d6e8342a65f9c5d7784256f (diff)
downloadtheglassyladies-9f3098e80c6b6c87e9bfbfe36239a39e5cafb29f.tar.xz
theglassyladies-9f3098e80c6b6c87e9bfbfe36239a39e5cafb29f.zip
init: add some stories and personas and begin layout out domain
Diffstat (limited to 'iridescence/src')
-rw-r--r--iridescence/src/App.vue102
-rw-r--r--iridescence/src/api/dichroism.js81
-rw-r--r--iridescence/src/api/error.js6
-rw-r--r--iridescence/src/assets/logo.pngbin603239 -> 0 bytes
-rw-r--r--iridescence/src/assets/logo_sm.pngbin98670 -> 0 bytes
-rw-r--r--iridescence/src/components/BusyBar.vue20
-rw-r--r--iridescence/src/components/CartCheckout.vue38
-rw-r--r--iridescence/src/components/Footer.vue53
-rw-r--r--iridescence/src/components/Navbar.vue114
-rw-r--r--iridescence/src/components/ProductCard.vue74
-rw-r--r--iridescence/src/components/ProductDetail.vue135
-rw-r--r--iridescence/src/components/ProductFilter.vue52
-rw-r--r--iridescence/src/components/ProductList.vue32
-rw-r--r--iridescence/src/components/ProductSearch.vue88
-rw-r--r--iridescence/src/components/admin/NewProduct.vue58
-rw-r--r--iridescence/src/components/admin/ProductEditCard.vue282
-rw-r--r--iridescence/src/components/admin/ProductEditList.vue32
-rw-r--r--iridescence/src/components/cart/CartItem.vue89
-rw-r--r--iridescence/src/components/cart/Totals.vue28
-rw-r--r--iridescence/src/components/checkout/CheckoutForm.vue301
-rw-r--r--iridescence/src/main.js13
-rw-r--r--iridescence/src/models/photo_set.js10
-rw-r--r--iridescence/src/models/product.js16
-rw-r--r--iridescence/src/router/index.js58
-rw-r--r--iridescence/src/store/index.js118
-rw-r--r--iridescence/src/views/About.vue9
-rw-r--r--iridescence/src/views/Admin.vue48
-rw-r--r--iridescence/src/views/Care.vue10
-rw-r--r--iridescence/src/views/Cart.vue48
-rw-r--r--iridescence/src/views/Checkout.vue13
-rw-r--r--iridescence/src/views/Faq.vue9
-rw-r--r--iridescence/src/views/Home.vue39
-rw-r--r--iridescence/src/views/Privacy.vue401
33 files changed, 0 insertions, 2377 deletions
diff --git a/iridescence/src/App.vue b/iridescence/src/App.vue
deleted file mode 100644
index 5cd436c..0000000
--- a/iridescence/src/App.vue
+++ /dev/null
@@ -1,102 +0,0 @@
-<template>
- <div id="app">
- <div id="main">
- <Navbar></Navbar>
- <BusyBar></BusyBar>
- <transition
- mode="out-in"
- enter-active-class="animate__animated animate__fadeIn animate__faster"
- leave-active-class="animate__animated animate__fadeOut animate__faster"
- >
- <router-view />
- </transition>
- </div>
- <Footer></Footer>
- </div>
-</template>
-
-<script>
-import BusyBar from "@/components/BusyBar.vue";
-import Navbar from "@/components/Navbar.vue";
-import Footer from "@/components/Footer.vue";
-
-export default {
- name: "App",
- components: {
- BusyBar,
- Navbar,
- Footer
- }
-};
-</script>
-
-<style lang="scss">
-@charset "utf-8";
-
-/* Fonts */
-@import url("https://fonts.googleapis.com/css2?family=Oxygen&display=swap");
-$family-sans-serif: "Oxygen", sans-serif;
-
-/* Custom colors */
-$viridian-green: #2b9292ff;
-$cultured: #f4f6f6ff;
-$gainsboro: #dee5e5ff;
-$queen-blue: #41668cff;
-$madder-lake: #cc2936ff;
-$rich-black-fogra-29: #001011ff;
-
-/* Color overrides */
-$primary: $viridian-green;
-$danger: $madder-lake;
-$info: $queen-blue;
-$link: $queen-blue;
-$black: $rich-black-fogra-29;
-$scheme-main: $cultured;
-$scheme-main-bis: $gainsboro;
-
-/* Resizing */
-$modal-content-width: 50em;
-
-/* Import only what you need from Bulma */
-@import "../node_modules/bulma/sass/utilities/_all.sass";
-@import "../node_modules/bulma/sass/base/generic.sass";
-@import "../node_modules/bulma/sass/base/minireset.sass";
-@import "../node_modules/bulma/sass/elements/box.sass";
-@import "../node_modules/bulma/sass/elements/other.sass";
-@import "../node_modules/bulma/sass/elements/icon.sass";
-@import "../node_modules/bulma/sass/elements/button.sass";
-@import "../node_modules/bulma/sass/elements/container.sass";
-@import "../node_modules/bulma/sass/elements/content.sass";
-@import "../node_modules/bulma/sass/elements/image.sass";
-@import "../node_modules/bulma/sass/elements/progress.sass";
-@import "../node_modules/bulma/sass/elements/title.sass";
-@import "../node_modules/bulma/sass/form/shared.sass";
-@import "../node_modules/bulma/sass/form/shared.sass";
-@import "../node_modules/bulma/sass/form/input-textarea.sass";
-@import "../node_modules/bulma/sass/form/select.sass";
-@import "../node_modules/bulma/sass/form/file.sass";
-@import "../node_modules/bulma/sass/form/tools.sass";
-@import "../node_modules/bulma/sass/components/card.sass";
-@import "../node_modules/bulma/sass/components/dropdown.sass";
-@import "../node_modules/bulma/sass/components/level.sass";
-@import "../node_modules/bulma/sass/components/modal.sass";
-@import "../node_modules/bulma/sass/components/navbar.sass";
-@import "../node_modules/bulma/sass/components/breadcrumb.sass";
-@import "../node_modules/bulma/sass/grid/columns.sass";
-@import "../node_modules/bulma/sass/helpers/color.sass";
-@import "../node_modules/bulma/sass/helpers/flexbox.sass";
-@import "../node_modules/bulma/sass/helpers/typography.sass";
-@import "../node_modules/bulma/sass/helpers/visibility.sass";
-@import "../node_modules/bulma/sass/layout/section.sass";
-@import "../node_modules/bulma/sass/layout/footer.sass";
-
-/* Force footer to bottom of page */
-#app {
- display: flex;
- min-height: 100vh;
- flex-direction: column;
-}
-#main {
- flex: 1;
-}
-</style>
diff --git a/iridescence/src/api/dichroism.js b/iridescence/src/api/dichroism.js
deleted file mode 100644
index 93989c5..0000000
--- a/iridescence/src/api/dichroism.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import Product from "../models/product";
-import PhotoSet from "../models/photo_set";
-import ApiError from "./error";
-
-export default class Dichroism {
- _base_addr = process.env.VUE_APP_API_BASE_ADDR;
-
- async createPhoto(file) {
- const fd = new FormData();
- fd.append(file.name, file);
-
- const options = {
- method: "POST",
- body: fd
- };
-
- try {
- const photos = await this._sendRequest("photos", options);
- return photos.map(p => new PhotoSet(p));
- } catch (err) {
- console.error("Dichroism: " + err.message);
- return null;
- }
- }
-
- async getProducts() {
- try {
- const products = await this._sendRequest("products", null);
- return products.map(p => new Product(p));
- } catch (err) {
- console.error("Dichroism: " + err.message);
- return [];
- }
- }
-
- async updateProduct(fieldDiff) {
- const options = {
- method: "PATCH",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify(fieldDiff)
- };
-
- try {
- const product = await this._sendRequest("products", options);
- return new Product(product);
- } catch (err) {
- console.error("Dichroism: " + err.message);
- return null;
- }
- }
-
- async createProduct(newProduct) {
- const options = {
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify(newProduct)
- };
-
- try {
- const product = await this._sendRequest("products", options);
- return new Product(product);
- } catch (err) {
- console.error("Dichroism: " + err.message);
- return null;
- }
- }
-
- async _sendRequest(endpoint, options) {
- const response = await fetch(this._base_addr + endpoint, options);
-
- if (response.ok) {
- return await response.json();
- } else {
- throw new ApiError(await response.text());
- }
- }
-}
diff --git a/iridescence/src/api/error.js b/iridescence/src/api/error.js
deleted file mode 100644
index 7c9320d..0000000
--- a/iridescence/src/api/error.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export default class ApiError extends Error {
- constructor(message) {
- super(message);
- this.name = "ApiError";
- }
-}
diff --git a/iridescence/src/assets/logo.png b/iridescence/src/assets/logo.png
deleted file mode 100644
index 892376b..0000000
--- a/iridescence/src/assets/logo.png
+++ /dev/null
Binary files differ
diff --git a/iridescence/src/assets/logo_sm.png b/iridescence/src/assets/logo_sm.png
deleted file mode 100644
index b74ccfd..0000000
--- a/iridescence/src/assets/logo_sm.png
+++ /dev/null
Binary files differ
diff --git a/iridescence/src/components/BusyBar.vue b/iridescence/src/components/BusyBar.vue
deleted file mode 100644
index a38cefa..0000000
--- a/iridescence/src/components/BusyBar.vue
+++ /dev/null
@@ -1,20 +0,0 @@
-<template>
- <div id="busyBar">
- <progress
- class="progress is-small is-primary"
- max="100"
- v-if="isBusy"
- ></progress>
- </div>
-</template>
-
-<script>
-export default {
- name: "BusyBar",
- computed: {
- isBusy() {
- return this.$store.state.busy;
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/CartCheckout.vue b/iridescence/src/components/CartCheckout.vue
deleted file mode 100644
index 1b327b2..0000000
--- a/iridescence/src/components/CartCheckout.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-<template>
- <div id="cartCheckout">
- <div class="buttons has-addons">
- <router-link
- v-if="inCart"
- to="/cart"
- class="button is-success is-rounded"
- >
- <span class="iconify-inline" data-icon="mdi-cart"></span>
- <span>Checkout</span></router-link
- >
- <a v-else class="button is-static is-rounded">
- <span class="iconify-inline" data-icon="mdi-cart"></span>
- </a>
- <button class="button is-static">x{{ inCart }}</button>
- <button class="button is-static is-rounded">
- {{ cartTotal }}
- </button>
- </div>
- </div>
-</template>
-
-<script>
-export default {
- name: "CartCheckout",
- computed: {
- inCart() {
- return Object.values(this.$store.state.cart).reduce(
- (acc, cur) => acc + cur,
- 0
- );
- },
- cartTotal() {
- return this.$store.getters.cartTotal;
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/Footer.vue b/iridescence/src/components/Footer.vue
deleted file mode 100644
index 8210c62..0000000
--- a/iridescence/src/components/Footer.vue
+++ /dev/null
@@ -1,53 +0,0 @@
-<template>
- <div id="footer">
- <footer class="footer">
- <nav class="level">
- <div class="level-item has-text-centered">
- <ul>
- <li>
- <a
- class="navbar-item"
- target="_blank"
- href="https://www.facebook.com/glassyladiesart"
- >
- <span class="iconify-inline" data-icon="mdi-facebook"></span>
- <span>Like Us on Facebook</span>
- </a>
- </li>
- <li>
- <a
- class="navbar-item"
- target="_blank"
- href="mailto:liz@theglassyladies.com"
- >
- <span class="iconify-inline" data-icon="mdi-email"></span>
- <span>Write to Us</span>
- </a>
- </li>
- </ul>
- </div>
-
- <div class="level-item has-text-centered">
- <ul>
- <li>&copy; {{ year }} The Glassy Ladies, LLC</li>
- <li>
- Experiencing issues?
- <a href="mailto:webmaster@theglassyladies.com">Let us know.</a>
- </li>
- </ul>
- </div>
- </nav>
- </footer>
- </div>
-</template>
-
-<script>
-export default {
- name: "Footer",
- data() {
- return {
- year: new Date().getFullYear()
- };
- }
-};
-</script>
diff --git a/iridescence/src/components/Navbar.vue b/iridescence/src/components/Navbar.vue
deleted file mode 100644
index 3a3390c..0000000
--- a/iridescence/src/components/Navbar.vue
+++ /dev/null
@@ -1,114 +0,0 @@
-<template>
- <div id="navbar">
- <nav class="navbar is-fixed-top is-primary">
- <div class="navbar-brand">
- <router-link to="/" class="navbar-item">
- <img src="@/assets/logo_sm.png" />
- <div class="navbar-item">
- <span style="color: white">
- The Glassy Ladies
- </span>
- </div>
- </router-link>
- <a class="navbar-burger burger" v-on:click="toggleNavMenu">
- <span></span>
- <span></span>
- <span></span>
- </a>
- </div>
- <div :class="navMenu">
- <div class="navbar-start">
- <router-link to="/faq" class="navbar-item">
- F.A.Q.
- </router-link>
- <router-link to="/about" class="navbar-item">
- About Us
- </router-link>
- <router-link to="/care" class="navbar-item">
- Care & Handling
- </router-link>
- <router-link to="/privacy" class="navbar-item">
- Privacy Policy
- </router-link>
- <router-link to="/admin" class="navbar-item">
- Inventory
- </router-link>
- </div>
-
- <transition
- mode="out-in"
- enter-active-class="animate__animated animate__flipInX"
- leave-active-class="animate__animated animate__flipOutX"
- >
- <div
- class="navbar-end"
- v-if="routeName != 'Administration'"
- key="cartCheckout"
- >
- <div
- class="navbar-item has-dropdown is-active"
- v-for="category in categories"
- :key="category"
- >
- <div class="navbar-link">
- {{ category }}
- </div>
- </div>
-
- <div class="navbar-item">
- <CartCheckout></CartCheckout>
- </div>
- </div>
- </transition>
- </div>
- </nav>
- </div>
-</template>
-
-<script>
-import CartCheckout from "@/components/CartCheckout.vue";
-
-export default {
- name: "Navbar",
- components: {
- CartCheckout
- },
- data() {
- return {
- isMenuActive: false
- };
- },
- computed: {
- navMenu() {
- if (this.isMenuActive) {
- return "navbar-menu is-active";
- } else {
- return "navbar-menu";
- }
- },
- categories() {
- //const raw = this.$store.getters.products.map(p => p.category.split("/"));
- //const raw = [
- // [1, 2, 3],
- // [1, 2, 4],
- // [1, 5],
- // [6, 7]
- //];
- return [];
- },
- routeName() {
- return this.$route.name;
- }
- },
- methods: {
- generateCategories() {
- let results = [];
-
- return results;
- },
- toggleNavMenu() {
- this.isMenuActive = !this.isMenuActive;
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/ProductCard.vue b/iridescence/src/components/ProductCard.vue
deleted file mode 100644
index 144dd9e..0000000
--- a/iridescence/src/components/ProductCard.vue
+++ /dev/null
@@ -1,74 +0,0 @@
-<template>
- <div id="productCard">
- <div class="card">
- <div class="card-image">
- <figure class="image is-square">
- <a @click="setDetailId">
- <img :src="thumbnail" :alt="name" title="Click to expand." />
- </a>
- </figure>
- </div>
- <div class="card-content">
- <div class="content">
- <p class="title is-4">
- <a @click="setDetailId">
- {{ name }}
- </a>
- </p>
- <p class="subtitle is-4">
- {{ dollars }}
- </p>
- <p class="subtitle is-6">{{ stock }}</p>
- </div>
-
- <div class="content">
- {{ shortDescription }}
- </div>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-export default {
- name: "ProductCard",
- props: {
- id: Number,
- name: String,
- quantity: Number,
- cents: Number,
- photo_thumbnail: String,
- photo_base: String,
- photo_fullsize: String,
- description: String
- },
- computed: {
- stock() {
- if (this.quantity == 0) {
- return "Made to order";
- } else {
- return [this.quantity, "in stock"].join(" ");
- }
- },
- dollars() {
- return "$ " + (this.cents / 100).toFixed(2);
- },
- thumbnail() {
- return process.env.VUE_APP_IMAGE_ROOT + this.photo_thumbnail;
- },
- shortDescription() {
- let description = this.description.split(" ");
- if (description.length < 10) {
- return this.description;
- } else {
- return description.splice(0, 10).join(" ") + "…";
- }
- }
- },
- methods: {
- setDetailId() {
- this.$store.commit("productDetailId", this.id);
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/ProductDetail.vue b/iridescence/src/components/ProductDetail.vue
deleted file mode 100644
index a67e39f..0000000
--- a/iridescence/src/components/ProductDetail.vue
+++ /dev/null
@@ -1,135 +0,0 @@
-<template>
- <div id="productDetail">
- <div v-if="product" class="modal is-active">
- <div @click="clearDetailId" class="modal-background"></div>
- <div class="modal-content">
- <div class="card">
- <div class="card-image">
- <figure class="image ">
- <a target="_blank" :href="fullsize">
- <img
- :src="base"
- :alt="product.name"
- title="Click for fullsize"
- />
- </a>
- </figure>
- </div>
-
- <div class="card-content">
- <div class="columns">
- <div class="column">
- <p class="title">
- {{ product.name }}
- </p>
- <nav class="breadcrumb">
- <ul>
- <li v-for="category in categories" :key="category">
- {{ category }}
- </li>
- </ul>
- </nav>
- <p>
- {{ product.description }}
- </p>
- </div>
- <div class="column is-one-third">
- <p class="subtitle">{{ dollars }}</p>
- <p class="subtitle">{{ stock }}</p>
- <div v-if="inCart" class="field has-addons">
- <p class="control is-expanded">
- <a
- class="button is-static is-fullwidth is-rounded is-medium"
- >
- {{ inCart }} in cart
- </a>
- </p>
- <div class="control">
- <a
- @click="incrementCartQuantity(-1)"
- class="button is-info is-medium"
- >
- <span
- class="iconify-inline"
- data-icon="mdi-cart-minus"
- ></span>
- </a>
- </div>
- <div class="control">
- <a
- @click="incrementCartQuantity(1)"
- class="button is-info is-rounded is-medium"
- >
- <span
- class="iconify-inline"
- data-icon="mdi-cart-plus"
- ></span>
- </a>
- </div>
- </div>
- <button
- v-else
- @click="incrementCartQuantity(1)"
- class="button is-success is-fullwidth is-rounded is-medium"
- >
- <span
- class="iconify-inline"
- data-icon="mdi-cart-arrow-down"
- ></span>
- </button>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div @click="clearDetailId" class="modal-close is-large"></div>
- </div>
- </div>
-</template>
-
-<script>
-export default {
- name: "ProductDetail",
- computed: {
- inCart() {
- return this.$store.state.cart[this.product.id];
- },
- product() {
- return this.$store.getters.products.find(
- p => p.id == this.$store.state.productDetailId
- );
- },
- stock() {
- if (this.product.quantity == 0) {
- return "Made to order";
- } else {
- return [this.product.quantity, "in stock"].join(" ");
- }
- },
- dollars() {
- return "$ " + (this.product.cents / 100).toFixed(2);
- },
- base() {
- return [process.env.VUE_APP_IMAGE_ROOT, this.product.photo_base].join("");
- },
- fullsize() {
- return [process.env.VUE_APP_IMAGE_ROOT, this.product.photo_fullsize].join(
- ""
- );
- },
- categories() {
- let categories = this.product.category.split("/");
- categories.splice(0, 1, "All");
- return categories;
- }
- },
- methods: {
- clearDetailId() {
- this.$store.commit("productDetailId", 0);
- },
- incrementCartQuantity(by) {
- this.$store.commit("cartItem", { id: this.product.id, by });
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/ProductFilter.vue b/iridescence/src/components/ProductFilter.vue
deleted file mode 100644
index 6fdd461..0000000
--- a/iridescence/src/components/ProductFilter.vue
+++ /dev/null
@@ -1,52 +0,0 @@
-<template>
- <div id="productFilter">
- <aside class="menu">
- <p class="menu-label">
- Availability
- </p>
- <ul class="menu-list">
- <li>
- <label class="radio">
- <input type="radio" name="availability" />
- In stock
- </label>
- </li>
- <li>
- <label class="radio">
- <input type="radio" name="availability" />
- Made to order
- </label>
- </li>
- </ul>
- <p class="menu-label">
- Category
- </p>
- <ul class="menu-list">
- <li>
- <label class="radio">
- <input type="radio" name="category" />
- Garden
- </label>
- </li>
- <li>
- <label class="radio">
- <input type="radio" name="category" />
- Beach
- </label>
- </li>
- <li>
- <label class="radio">
- <input type="radio" name="category" />
- Pets
- </label>
- </li>
- </ul>
- </aside>
- </div>
-</template>
-
-<script>
-export default {
- name: "ProductFilter"
-};
-</script>
diff --git a/iridescence/src/components/ProductList.vue b/iridescence/src/components/ProductList.vue
deleted file mode 100644
index bed37b3..0000000
--- a/iridescence/src/components/ProductList.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-<template>
- <div id="productsList">
- <div class="columns is-multiline is-variable is-7-desktop">
- <div
- class="column is-one-quarter"
- v-for="product in products"
- :key="product.id"
- >
- <ProductCard v-bind="product"></ProductCard>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-import ProductCard from "@/components/ProductCard.vue";
-
-export default {
- name: "ProductsList",
- components: {
- ProductCard
- },
- computed: {
- products() {
- return this.$store.getters.products;
- }
- },
- created() {
- this.$store.dispatch("refreshProducts");
- }
-};
-</script>
diff --git a/iridescence/src/components/ProductSearch.vue b/iridescence/src/components/ProductSearch.vue
deleted file mode 100644
index f60931c..0000000
--- a/iridescence/src/components/ProductSearch.vue
+++ /dev/null
@@ -1,88 +0,0 @@
-<template>
- <div id="productSearch">
- <div class="field is-grouped is-grouped-multiline">
- <div class="control is-expanded has-icons-left">
- <input
- class="input is-medium is-primary is-rounded"
- type="search"
- placeholder="Find something in particular..."
- v-model.trim="term"
- @input="updateSearch"
- autofocus
- />
- <span class="icon is-left">
- <span class="iconify-inline" data-icon="mdi-magnify"></span>
- </span>
- </div>
- <div class="control has-icons-left">
- <div class="select is-medium is-primary is-rounded">
- <select v-model="sortOptionName" @change="updateSort">
- <option v-for="name in sortOptionNames" :key="name" :value="name">
- {{ name }}
- </option>
- </select>
- </div>
- <span class="icon is-left">
- <span class="iconify-inline" data-icon="mdi-sort"></span>
- </span>
- </div>
- </div>
- <content class="has-text-centered" v-if="noResults">
- <p>
- Couldn't find what you're looking for?
- <a
- href="mailto:liz@theglassyladies.com?subject=Custom Order Request&body=Please describe what you are looking for and we will be in touch."
- >We do custom orders too!</a
- >
- </p>
- </content>
- </div>
-</template>
-
-<script>
-export default {
- name: "ProductSearch",
- data() {
- return {
- term: "",
- searchTimer: function() {},
- sortOptions: {
- "Featured Items": a => (a.featured ? -1 : 1),
- "In Stock": (a, b) => a.quantity < b.quantity,
- "Made to Order": (a, b) => a.quantity > b.quantity,
- "A to Z": (a, b) => a.name > b.name,
- "Z to A": (a, b) => a.name < b.name,
- "Newest to Oldest": (a, b) => a.id < b.id,
- "Oldest to Newest": (a, b) => a.id > b.id,
- "Price (Low to High)": (a, b) => a.cents > b.cents,
- "Price (High to Low)": (a, b) => a.cents < b.cents
- },
- sortOptionName: String
- };
- },
- created: function() {
- this.sortOptionName = this.sortOptionNames[0];
- },
- computed: {
- sortOptionNames() {
- return Object.keys(this.sortOptions);
- },
- noResults() {
- return !this.$store.getters.products.length && !this.$store.getters.busy;
- }
- },
- methods: {
- updateSearch() {
- clearTimeout(this.searchTimer);
- this.timeout = setTimeout(() => {
- this.$store.commit("searchTerm", this.term);
- }, 1000);
- },
- updateSort() {
- this.$store.commit("compare", this.sortOptions[this.sortOptionName]);
- }
- }
-};
-</script>
-
-
diff --git a/iridescence/src/components/admin/NewProduct.vue b/iridescence/src/components/admin/NewProduct.vue
deleted file mode 100644
index a1d3304..0000000
--- a/iridescence/src/components/admin/NewProduct.vue
+++ /dev/null
@@ -1,58 +0,0 @@
-<template>
- <div id="addNewProduct">
- <button class="button is-primary is-medium is-rounded" @click="toggleModal">
- + Add New
- </button>
- <transition
- enter-active-class="animate__animated animate__fadeIn animate__faster"
- leave-active-class="animate__animated animate__fadeOut animate__faster"
- >
- <div class="modal is-active" v-if="modalEnabled">
- <div class="modal-background"></div>
- <div
- class="modal-card animate__animated animate__slideInDown animate__faster"
- >
- <header class="modal-card-head">
- <p class="modal-card-title">Add a new product</p>
- <button class="delete" @click="toggleModal"></button>
- </header>
- <section class="modal-card-body">
- <ProductEditCard v-bind:oldid="-1"></ProductEditCard>
- </section>
- <footer class="modal-card-foot"></footer>
- </div>
- </div>
- </transition>
- </div>
-</template>
-
-<script>
-import ProductEditCard from "@/components/admin/ProductEditCard";
-
-export default {
- name: "NewProduct",
- components: {
- ProductEditCard
- },
- data: function() {
- return {
- modalEnabled: false
- };
- },
- computed: {
- numProducts: function() {
- return this.$store.getters.products.length;
- }
- },
- watch: {
- numProducts: function() {
- this.modalEnabled = false;
- }
- },
- methods: {
- toggleModal() {
- this.modalEnabled = !this.modalEnabled;
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/admin/ProductEditCard.vue b/iridescence/src/components/admin/ProductEditCard.vue
deleted file mode 100644
index 603cb4f..0000000
--- a/iridescence/src/components/admin/ProductEditCard.vue
+++ /dev/null
@@ -1,282 +0,0 @@
-<template>
- <div id="productEditCard">
- <div class="card">
- <div class="card-header">
- <p class="card-header-title" v-if="old.id">
- {{ old.id }}: {{ old.name }}
- </p>
- </div>
- <div class="card-image">
- <figure v-if="old.id" class="image is-square">
- <img :src="thumbnail" :alt="name" />
- </figure>
- </div>
- <div class="card-content">
- <div class="field">
- <div class="file has-name is-boxed is-centered is-fullwidth ">
- <label class="file-label">
- <input
- class="file-input"
- type="file"
- name="image"
- accept=".jpg,.jpeg,.JPG,.JPEG"
- @change="changePhotoSet"
- />
- <span class="file-cta">
- <span class="file-label has-text-centered">
- <p v-if="old.photo_thumbnail">
- Replace Photo
- </p>
- <p v-else>
- Upload Photo
- </p>
- </span>
- </span>
- <span v-if="filename" class="file-name">
- {{ filename }}
- </span>
- <span v-else class="file-name">
- {{ old.photo_thumbnail }}
- </span>
- </label>
- </div>
- </div>
- <div class="field">
- <input
- class="input"
- type="text"
- placeholder="(product name)"
- v-model="name"
- />
- </div>
- <div class="field">
- <input
- class="input"
- type="text"
- placeholder="(product category)"
- v-model="category"
- />
- </div>
- <div class="field has-addons">
- <p class="control">
- <a class="button is-static">
- #
- </a>
- </p>
- <p class="control is-expanded">
- <input
- class="input"
- type="text"
- placeholder="inventory (quantity)"
- v-model="quantity"
- />
- </p>
- <div class="control">
- <a
- class="button is-info is-outlined"
- @click="incrementQuantity(-1)"
- >
- ▼
- </a>
- </div>
- <div class="control">
- <a class="button is-info is-outlined" @click="incrementQuantity(1)">
- ▲
- </a>
- </div>
- </div>
- <div class="field has-addons">
- <p class="control">
- <a class="button is-static">
- $
- </a>
- </p>
- <p class="control is-expanded">
- <input
- class="input"
- type="text"
- placeholder="price"
- v-model="price"
- />
- </p>
- </div>
- <div class="field">
- <textarea
- class="textarea"
- type="text"
- placeholder="(product description)"
- v-model="description"
- >
- </textarea>
- </div>
- <div class="field">
- <label class="checkbox">
- <input type="checkbox" v-model="featured" />
- Featured?
- </label>
- </div>
- </div>
- <div class="card-footer" v-if="isValidPost || isValidPatch">
- <div class="card-footer-item">
- <button class="button is-primary is-fullwidth" @click="saveProduct">
- Save
- </button>
- </div>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-export default {
- name: "ProductEditCard",
- data: function() {
- return {
- filename: "",
- diff: {}
- };
- },
- props: {
- oldid: {
- type: Number,
- required: true
- }
- },
- created() {
- this.diff = {
- id: (this.old && this.old.id) || null,
- name: null,
- description: null,
- cents: null,
- quantity: (this.old && this.old.quantity) || 0,
- category_path: null,
- featured:
- this.old && typeof this.old.featured === "boolean"
- ? this.old.featured
- : false,
- photo_set: null
- };
- },
- computed: {
- thumbnail: function() {
- return process.env.VUE_APP_IMAGE_ROOT + this.old.photo_thumbnail;
- },
- old: function() {
- return this.$store.getters.products.find(p => p.id == this.oldid) || {};
- },
- id: function() {
- return this.diff.id || this.old.id;
- },
- name: {
- get: function() {
- return this.diff.name || this.old.name;
- },
- set: function(name) {
- this.diff.name = name;
- }
- },
- description: {
- get: function() {
- return this.diff.description || this.old.description;
- },
- set: function(description) {
- this.diff.description = description;
- }
- },
- category: {
- get: function() {
- return this.diff.category_path || this.old.category;
- },
- set: function(category) {
- this.diff.category_path = category;
- }
- },
- featured: {
- get: function() {
- return this.diff.featured;
- },
- set: function(featured) {
- this.diff.featured = featured;
- }
- },
- price: {
- get: function() {
- const cents = this.diff.cents || this.old.cents || 0;
- return (cents / 100).toFixed(0);
- },
- set: function(dollars) {
- const cents = dollars * 100;
- if (isFinite(cents)) {
- this.diff.cents = cents;
- }
- }
- },
- quantity: {
- get: function() {
- return this.diff.quantity || this.old.quantity || 0;
- },
- set: function(quantity) {
- if (Number.isFinite(quantity)) {
- this.diff.quantity = quantity;
- }
- }
- },
- isValidPost: function() {
- return (
- !this.diff.id &&
- this.diff.name &&
- this.diff.description &&
- Number.isFinite(this.diff.cents) &&
- Number.isFinite(this.diff.quantity) &&
- this.diff.photo_set &&
- this.diff.category_path &&
- typeof this.featured === "boolean"
- );
- },
- isValidPatch: function() {
- return (
- this.diff.id &&
- (this.diff.photo_set ||
- (this.diff.name && this.diff.name != this.old.name) ||
- (Number.isFinite(this.diff.cents) &&
- this.diff.cents != this.old.cents) ||
- (this.diff.category_path &&
- this.diff.category_path != this.old.category) ||
- (Number.isFinite(this.diff.quantity) &&
- this.diff.quantity != this.old.quantity) ||
- (this.diff.description &&
- this.diff.description != this.old.description) ||
- this.diff.featured != this.old.featured)
- );
- }
- },
- methods: {
- incrementQuantity(by) {
- if (this.quantity + by >= 0) {
- this.diff.quantity += by;
- }
- },
- saveProduct() {
- if (this.id) {
- // update existing
- this.$store.dispatch("updateProduct", this.diff);
- } else {
- // new product
- this.$store.dispatch("createProduct", this.diff);
- }
-
- this.diff.photo_set = null;
- },
- changePhotoSet(event) {
- const file = event.target.files[0];
- if (!file) {
- return;
- }
- this.$store.dispatch("createPhotoSet", file).then(r => {
- this.filename = file.name;
- this.diff.photo_set = r[0].id;
- });
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/admin/ProductEditList.vue b/iridescence/src/components/admin/ProductEditList.vue
deleted file mode 100644
index 91c0929..0000000
--- a/iridescence/src/components/admin/ProductEditList.vue
+++ /dev/null
@@ -1,32 +0,0 @@
-<template>
- <div id="productEditList">
- <div class="columns is-multiline is-variable is-desktop">
- <div
- class="column is-one-third-desktop"
- v-for="product in products"
- :key="product.id"
- >
- <ProductEditCard v-bind:oldid="product.id"></ProductEditCard>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-import ProductEditCard from "@/components/admin/ProductEditCard.vue";
-
-export default {
- name: "ProductsList",
- components: {
- ProductEditCard
- },
- computed: {
- products() {
- return this.$store.getters.products;
- }
- },
- created() {
- this.$store.dispatch("refreshProducts");
- }
-};
-</script>
diff --git a/iridescence/src/components/cart/CartItem.vue b/iridescence/src/components/cart/CartItem.vue
deleted file mode 100644
index 20ddec8..0000000
--- a/iridescence/src/components/cart/CartItem.vue
+++ /dev/null
@@ -1,89 +0,0 @@
-<template>
- <div>
- <hr />
- <nav class="level">
- <div class="level-left">
- <div class="level-item">
- <p class="image is-64x64">
- <img :src="thumbnail" :title="product.name" />
- </p>
- </div>
- <div class="level-item">
- <div class="content">
- <strong>
- <p>
- {{ product.name }}
- </p>
- </strong>
- </div>
- </div>
- </div>
- <div class="level-right">
- <div class="level-item">Subtotal: {{ dollars }}</div>
- <div class="level-item">
- <div class="field has-addons">
- <p class="control is-expanded">
- <a class="button is-static is-fullwidth is-rounded">
- {{ inCart }} in cart
- </a>
- </p>
- <div class="control">
- <a
- @click="incrementCartQuantity(-1)"
- class="button is-info is-rounded"
- >
- <span class="iconify-inline" data-icon="mdi-cart-minus"></span>
- </a>
- </div>
- <div class="control">
- <a
- @click="incrementCartQuantity(1)"
- class="button is-info is-rounded"
- >
- <span class="iconify-inline" data-icon="mdi-cart-plus"></span>
- </a>
- </div>
- </div>
- </div>
-
- <div class="level-item">
- <button class="button is-danger is-rounded" @click="removeAll">
- <span class="iconify-inline" data-icon="mdi-cart-remove"></span>
- <span>Remove</span>
- </button>
- </div>
- </div>
- </nav>
- </div>
-</template>
-
-<script>
-export default {
- name: "CartItem",
- props: {
- id: Number,
- inCart: Number
- },
- computed: {
- product() {
- return this.$store.state.products.find(p => p.id == this.id);
- },
- dollars() {
- return "$ " + ((this.product.cents * this.inCart) / 100).toFixed(2);
- },
- thumbnail() {
- return (
- process.env.VUE_APP_IMAGE_ROOT + "/" + this.product.photo_thumbnail
- );
- }
- },
- methods: {
- incrementCartQuantity(by) {
- this.$store.commit("cartItem", { id: this.id, by });
- },
- removeAll() {
- this.$store.commit("removeItemFromCart", this.id);
- }
- }
-};
-</script>
diff --git a/iridescence/src/components/cart/Totals.vue b/iridescence/src/components/cart/Totals.vue
deleted file mode 100644
index 36c9e77..0000000
--- a/iridescence/src/components/cart/Totals.vue
+++ /dev/null
@@ -1,28 +0,0 @@
-<template>
- <div>
- <h1 class="subtitle has-text-centered">
- Total
- </h1>
- <hr />
-
- <h1 class="title has-text-centered">{{ cartTotal }}</h1>
- <router-link
- to="/checkout"
- class="button is-success is-fullwidth is-rounded is-medium"
- >
- Continue to Checkout
- </router-link>
- </div>
-</template>
-
-<script>
-export default {
- name: "Totals",
- computed: {
- cartTotal() {
- return this.$store.getters.cartTotal;
- }
- },
- methods: {}
-};
-</script>
diff --git a/iridescence/src/components/checkout/CheckoutForm.vue b/iridescence/src/components/checkout/CheckoutForm.vue
deleted file mode 100644
index 482baec..0000000
--- a/iridescence/src/components/checkout/CheckoutForm.vue
+++ /dev/null
@@ -1,301 +0,0 @@
-<template>
- <div class="container">
- <form action="#">
- <section class="section">
- <h1 class="title">Customer Info</h1>
- <hr />
-
- <div class="columns">
- <div class="column">
- <div class="field">
- <label for="firstName" class="label">First Name</label>
-
- <div class="control has-icons-left">
- <input
- v-model="formData.firstName"
- id="firstName"
- class="input is-rounded"
- type="text"
- required
- />
- <span class="icon is-left">
- <span
- class="iconify-inline"
- data-icon="mdi-card-account-details"
- ></span>
- </span>
- </div>
- </div>
- <div class="field">
- <label class="label">Last Name</label>
-
- <div class="control has-icons-left">
- <input
- v-model="formData.lastName"
- class="input is-rounded"
- type="text"
- required
- />
- <span class="icon is-left">
- <span
- class="iconify-inline"
- data-icon="mdi-card-account-details"
- ></span>
- </span>
- </div>
- </div>
-
- <div class="field">
- <label class="label">Email Address</label>
-
- <div class="control has-icons-left">
- <input
- v-model="formData.email"
- class="input is-rounded"
- type="email"
- required
- />
- <span class="icon is-left">
- <span class="iconify-inline" data-icon="mdi-email"></span>
- </span>
- </div>
- <p class="help">Example: you@example.com</p>
- </div>
-
- <div class="field">
- <label class="label">Phone Number</label>
- <div class="control has-icons-left">
- <input
- v-model="formData.phone"
- class="input is-rounded"
- type="tel"
- pattern="[0-9]{10}"
- required
- />
- <span class="icon is-left">
- <span
- class="iconify-inline"
- data-icon="mdi-phone-classic"
- ></span>
- </span>
- </div>
- <p class="help">Example: 7571234567</p>
- </div>
-
- <label class="checkbox">
- <input v-model="formData.sms" type="checkbox" />
- <span class="iconify" data-icon="mdi-cellphone-android"></span>
- May we text order updates and questions to this number?
- </label>
- </div>
- <div class="column">
- <label class="label">Location</label>
- <div class="field has-addons">
- <div class="control has-icons-left">
- <div class="select is-rounded">
- <select required>
- <option selected>USA</option>
- </select>
- </div>
- <span class="icon is-left">
- <span
- class="iconify-inline"
- data-icon="mdi-flag-variant"
- ></span>
- </span>
- </div>
-
- <div class="control has-icons-left">
- <div class="select is-rounded">
- <select v-model="formData.state" required>
- <option v-for="state in states" :key="state">{{
- state
- }}</option>
- </select>
- </div>
- <span class="icon is-left">
- <span class="iconify-inline" data-icon="mdi-map"></span>
- </span>
- </div>
- </div>
- <p class="help">
- If you are located outside of the United States, please
- <a href="mailto:liz@theglassyladies.com"
- >contact us directly regarding your order</a
- >
- </p>
-
- <div class="field">
- <label class="label">Address</label>
-
- <div class="control has-icons-left">
- <input
- v-model="formData.address1"
- class="input is-rounded"
- type="text"
- required
- />
- <span class="icon is-left">
- <span
- class="iconify-inline"
- data-icon="mdi-road-variant"
- ></span>
- </span>
- </div>
- </div>
- <div class="field">
- <label class="label">Address 2 (Optional)</label>
-
- <div class="control has-icons-left">
- <input
- v-model="formData.address2"
- class="input is-rounded"
- type="text"
- />
- <span class="icon is-left">
- <span
- class="iconify-inline"
- data-icon="mdi-format-list-numbered"
- ></span>
- </span>
- </div>
- </div>
-
- <div class="field">
- <label class="label">City</label>
- <div class="control has-icons-left">
- <input
- v-model="formData.city"
- class="input is-rounded"
- type="text"
- required
- />
- <span class="icon is-left">
- <span class="iconify-inline" data-icon="mdi-city"></span>
- </span>
- </div>
- </div>
-
- <div class="field">
- <label class="label">Zip Code</label>
-
- <div class="control has-icons-left">
- <input
- v-model="formData.zip"
- class="input is-rounded"
- type="text"
- pattern="[0-9]{5}"
- required
- />
- <span class="icon is-left">
- <span class="iconify-inline" data-icon="mdi-mailbox"></span>
- </span>
- </div>
- </div>
- </div>
- </div>
- </section>
-
- <section class="section">
- <h1 class="title">Payment & Delivery</h1>
- <hr />
-
- <div class="content">
- <p>
- You will be contacted directly regarding payment and delivery
- options.
- </p>
- </div>
- </section>
-
- <section class="section">
- <h1 class="title">Finish</h1>
- <hr />
- <h1 class="subtitle">Confirm your order of {{ cartTotal }}?</h1>
- <button class="button is-success is-rounded is-medium">
- Place Order
- </button>
- </section>
- </form>
- </div>
-</template>
-
-<script>
-export default {
- name: "CheckoutForm",
- data() {
- return {
- states: [
- "Virginia",
- "Alabama",
- "Alaska",
- "Arizona",
- "Arkansas",
- "California",
- "Colorado",
- "Connecticut",
- "Delaware",
- "Florida",
- "Georgia",
- "Hawaii",
- "Idaho",
- "Illinois",
- "Indiana",
- "Iowa",
- "Kansas",
- "Kentucky",
- "Louisiana",
- "Maine",
- "Maryland",
- "Massachusetts",
- "Michigan",
- "Minnesota",
- "Mississippi",
- "Missouri",
- "Montana",
- "Nebraska",
- "Nevada",
- "New Hampshire",
- "New Jersey",
- "New Mexico",
- "New York",
- "North Carolina",
- "North Dakota",
- "Ohio",
- "Oklahoma",
- "Oregon",
- "Pennsylvania",
- "Rhode Island",
- "South Carolina",
- "South Dakota",
- "Tennessee",
- "Texas",
- "Utah",
- "Vermont",
- "Washington",
- "West Virginia",
- "Wisconsin",
- "Wyoming"
- ],
- formData: {
- firstName: "",
- lastName: "",
- email: "",
- phone: "",
- address1: "",
- address2: "",
- city: "",
- state: "Virginia",
- country: "USA",
- zip: "",
- sms: false
- }
- };
- },
- computed: {
- cartTotal() {
- return this.$store.getters.cartTotal;
- }
- }
-};
-</script>
diff --git a/iridescence/src/main.js b/iridescence/src/main.js
deleted file mode 100644
index 62e6485..0000000
--- a/iridescence/src/main.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import Vue from "vue";
-import App from "./App.vue";
-import router from "./router";
-import store from "./store";
-import "animate.css";
-
-Vue.config.productionTip = false;
-
-new Vue({
- router,
- store,
- render: h => h(App)
-}).$mount("#app");
diff --git a/iridescence/src/models/photo_set.js b/iridescence/src/models/photo_set.js
deleted file mode 100644
index 7d7213c..0000000
--- a/iridescence/src/models/photo_set.js
+++ /dev/null
@@ -1,10 +0,0 @@
-export default class PhotoSet {
- id = 0;
- fullsize = "";
- thumbnail = "";
- base = "";
-
- constructor(json) {
- Object.assign(this, json);
- }
-}
diff --git a/iridescence/src/models/product.js b/iridescence/src/models/product.js
deleted file mode 100644
index ded5434..0000000
--- a/iridescence/src/models/product.js
+++ /dev/null
@@ -1,16 +0,0 @@
-export default class Product {
- constructor(json) {
- if (json) {
- this.id = json.id ? json.id : null;
- this.name = json.name ? json.name : null;
- this.description = json.description ? json.description : null;
- this.cents = Number.isFinite(json.cents) ? json.cents : null;
- this.quantity = Number.isFinite(json.quantity) ? json.quantity : null;
- this.featured = json.featured ? json.featured : false;
- this.category = json.category ? json.category : null;
- this.photo_base = json.photo_base ? json.photo_base : null;
- this.photo_thumbnail = json.photo_thumbnail ? json.photo_thumbnail : null;
- this.photo_fullsize = json.photo_fullsize ? json.photo_fullsize : null;
- }
- }
-}
diff --git a/iridescence/src/router/index.js b/iridescence/src/router/index.js
deleted file mode 100644
index 1dc6e63..0000000
--- a/iridescence/src/router/index.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import Vue from "vue";
-import VueRouter from "vue-router";
-import Home from "../views/Home.vue";
-import Care from "../views/Care.vue";
-import Faq from "../views/Faq.vue";
-import Admin from "../views/Admin.vue";
-import Cart from "../views/Cart.vue";
-import Checkout from "../views/Checkout.vue";
-import Privacy from "../views/Privacy.vue";
-
-Vue.use(VueRouter);
-
-const routes = [
- {
- path: "/",
- name: "Home",
- component: Home
- },
- {
- path: "/admin",
- name: "Administration",
- component: Admin
- },
- {
- path: "/cart",
- name: "Cart",
- component: Cart
- },
- {
- path: "/checkout",
- name: "Checkout",
- component: Checkout
- },
- {
- path: "/faq",
- name: "F.A.Q.",
- component: Faq
- },
- {
- path: "/care",
- name: "Care & Handling",
- component: Care
- },
- {
- path: "/privacy",
- name: "Privacy",
- component: Privacy
- }
-];
-
-const router = new VueRouter({
- mode: "history",
- base: process.env.BASE_URL,
- routes,
- linkExactActiveClass: "is-active"
-});
-
-export default router;
diff --git a/iridescence/src/store/index.js b/iridescence/src/store/index.js
deleted file mode 100644
index 709dc79..0000000
--- a/iridescence/src/store/index.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import Vue from "vue";
-import Vuex from "vuex";
-import Dichroism from "@/api/dichroism.js";
-
-Vue.use(Vuex);
-
-let dichroism = new Dichroism();
-
-export default new Vuex.Store({
- state: {
- searchTerm: "",
- products: [],
- cart: {},
- busy: false,
- compare: a => (a.featured ? -1 : 1),
- productDetailId: 0
- },
- getters: {
- products(state) {
- let term = state.searchTerm.toLowerCase();
- return state.products
- .filter(item => {
- return [item.id, item.name, item.description, item.category]
- .join("")
- .toLowerCase()
- .includes(term);
- })
- .sort(state.compare);
- },
- cartTotal(state) {
- let cents = state.products
- .filter(p => state.cart[p.id])
- .map(p => p.cents * state.cart[p.id])
- .reduce((acc, cur) => acc + cur, 0);
- return "$ " + (cents / 100).toFixed(2);
- }
- },
- mutations: {
- toggleBusy(state) {
- state.busy = !state.busy;
- },
- productDetailId(state, id) {
- state.productDetailId = id;
- },
- cartItem(state, { id, by }) {
- let newCount = 1;
- if (state.cart[id]) {
- newCount = state.cart[id] += by;
- //if (newCount <= 0) {
- // // remove from cart entirely
- // delete state.cart[id];
- // return;
- //}
- //state.cart = {
- // ...state.cart,
- // [id]: newCount
- }
-
- let cart = {
- ...state.cart
- };
-
- if (newCount) {
- cart[id] = newCount;
- } else {
- // remove entirely
- delete cart[id];
- }
- state.cart = cart;
- },
- removeItemFromCart(state, id) {
- if (state.cart[id]) {
- let cart = {
- ...state.cart
- };
- delete cart[id];
- state.cart = cart;
- }
- },
- compare(state, compare) {
- state.compare = compare;
- },
- searchTerm(state, term) {
- state.searchTerm = term;
- },
- setProducts(state, products) {
- if (products) {
- state.products = products;
- }
- }
- },
- actions: {
- async refreshProducts({ commit }) {
- commit("toggleBusy");
- const products = await dichroism.getProducts();
- commit("setProducts", products);
- commit("toggleBusy");
- },
- async updateProduct({ commit, dispatch }, product) {
- commit("toggleBusy");
- await dichroism.updateProduct(product);
- dispatch("refreshProducts");
- commit("toggleBusy");
- },
- async createProduct({ commit, dispatch }, product) {
- commit("toggleBusy");
- await dichroism.createProduct(product);
- dispatch("refreshProducts");
- commit("toggleBusy");
- },
- async createPhotoSet({ commit }, file) {
- commit("toggleBusy");
- const photoSet = await dichroism.createPhoto(file);
- commit("toggleBusy");
- return photoSet;
- }
- }
-});
diff --git a/iridescence/src/views/About.vue b/iridescence/src/views/About.vue
deleted file mode 100644
index 87c483a..0000000
--- a/iridescence/src/views/About.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <div id="about" class="container">
- <section class="section">
- <article class="content">
- <h1>This is an about page</h1>
- </article>
- </section>
- </div>
-</template>
diff --git a/iridescence/src/views/Admin.vue b/iridescence/src/views/Admin.vue
deleted file mode 100644
index eedafc7..0000000
--- a/iridescence/src/views/Admin.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<template>
- <div id="admin">
- <div class="container">
- <section class="section">
- <div class="columns">
- <div class="column is-narrow">
- <NewProduct></NewProduct>
- </div>
- <div class="column">
- <ProductSearch></ProductSearch>
- </div>
- </div>
- <ProductEditList></ProductEditList>
- </section>
- </div>
- </div>
-</template>
-
-<script>
-import NewProduct from "@/components/admin/NewProduct.vue";
-import ProductSearch from "@/components/ProductSearch.vue";
-import ProductEditList from "@/components/admin/ProductEditList.vue";
-
-export default {
- name: "Admin",
- components: {
- ProductEditList,
- NewProduct,
- ProductSearch
- },
- beforeRouteEnter: (to, from, next) => {
- if (!process.env.VUE_APP_LOGIN_URL) {
- next();
- } else {
- fetch(process.env.VUE_APP_LOGIN_URL).then(res => {
- if (res.status == 401) {
- next(false);
- } else {
- next();
- }
- });
- }
- },
- mounted() {
- window.scrollTo(0, 0);
- }
-};
-</script>
diff --git a/iridescence/src/views/Care.vue b/iridescence/src/views/Care.vue
deleted file mode 100644
index ba49786..0000000
--- a/iridescence/src/views/Care.vue
+++ /dev/null
@@ -1,10 +0,0 @@
-
-<template>
- <div id="care" class="container">
- <section class="section">
- <article class="content">
- <h1>This is care and handling page</h1>
- </article>
- </section>
- </div>
-</template>
diff --git a/iridescence/src/views/Cart.vue b/iridescence/src/views/Cart.vue
deleted file mode 100644
index 26949f5..0000000
--- a/iridescence/src/views/Cart.vue
+++ /dev/null
@@ -1,48 +0,0 @@
-<template>
- <div id="cart">
- <div class="container">
- <div v-if="items.length" class="section">
- <div class="columns">
- <div class="column is-one-third">
- <Totals></Totals>
- </div>
- <div class="column">
- <h1 class="subtitle">Your Shopping Cart</h1>
- <CartItem
- v-for="item in items"
- :key="item[0]"
- v-bind:id="item[0] * 1"
- v-bind:in-cart="item[1]"
- ></CartItem>
- </div>
- </div>
- </div>
- <div v-else class="section">
- <div class="content">
- <p class="has-text-centered">
- There's nothing in your cart.
- <a> <router-link to="/">Start shopping!</router-link></a>
- </p>
- </div>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-import CartItem from "@/components/cart/CartItem.vue";
-import Totals from "@/components/cart/Totals.vue";
-
-export default {
- name: "Cart",
- computed: {
- items() {
- return Object.entries(this.$store.state.cart);
- }
- },
- components: {
- CartItem,
- Totals
- }
-};
-</script>
diff --git a/iridescence/src/views/Checkout.vue b/iridescence/src/views/Checkout.vue
deleted file mode 100644
index 01519ee..0000000
--- a/iridescence/src/views/Checkout.vue
+++ /dev/null
@@ -1,13 +0,0 @@
-<template>
- <div id="checkout">
- <CheckoutForm></CheckoutForm>
- </div>
-</template>
-
-<script>
-import CheckoutForm from "@/components/checkout/CheckoutForm.vue";
-export default {
- name: "Checkout",
- components: { CheckoutForm }
-};
-</script>
diff --git a/iridescence/src/views/Faq.vue b/iridescence/src/views/Faq.vue
deleted file mode 100644
index 0497393..0000000
--- a/iridescence/src/views/Faq.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <div id="Faq" class="container">
- <section class="section">
- <article class="content">
- <h1>This is an F.A.Q. page</h1>
- </article>
- </section>
- </div>
-</template>
diff --git a/iridescence/src/views/Home.vue b/iridescence/src/views/Home.vue
deleted file mode 100644
index b63f16f..0000000
--- a/iridescence/src/views/Home.vue
+++ /dev/null
@@ -1,39 +0,0 @@
-<template>
- <!-- Home is a view for browsing through the primary inventory. It should
- allow users to sort, filter, and search for items and add them to their
- cart. -->
-
- <div id="home">
- <ProductDetail></ProductDetail>
- <div class="columns">
- <div class="column">
- <div class="container">
- <section class="section">
- <ProductSearch></ProductSearch>
- </section>
- <section class="section">
- <ProductList></ProductList>
- </section>
- </div>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-import ProductList from "@/components/ProductList.vue";
-import ProductSearch from "@/components/ProductSearch.vue";
-import ProductDetail from "@/components/ProductDetail.vue";
-
-export default {
- name: "Home",
- components: {
- ProductList,
- ProductDetail,
- ProductSearch
- },
- mounted() {
- window.scrollTo(0, 0);
- }
-};
-</script>
diff --git a/iridescence/src/views/Privacy.vue b/iridescence/src/views/Privacy.vue
deleted file mode 100644
index 61b0269..0000000
--- a/iridescence/src/views/Privacy.vue
+++ /dev/null
@@ -1,401 +0,0 @@
-<template>
- <div id="privacy" class="container">
- <section class="section">
- <article class="content">
- <h1>Privacy Policy</h1>
- <p>Last updated: December 21, 2020</p>
- <p>
- This Privacy Policy describes Our policies and procedures on the
- collection, use and disclosure of Your information when You use the
- Service and tells You about Your privacy rights and how the law
- protects You.
- </p>
- <p>
- We use Your Personal data to provide and improve the Service. By using
- the Service, You agree to the collection and use of information in
- accordance with this Privacy Policy. This Privacy Policy has been
- created with the help of the
- <a
- href="https://www.privacypolicies.com/privacy-policy-generator/"
- target="_blank"
- >Privacy Policy Generator</a
- >.
- </p>
- <h1>Interpretation and Definitions</h1>
- <h2>Interpretation</h2>
- <p>
- The words of which the initial letter is capitalized have meanings
- defined under the following conditions. The following definitions
- shall have the same meaning regardless of whether they appear in
- singular or in plural.
- </p>
- <h2>Definitions</h2>
- <p>For the purposes of this Privacy Policy:</p>
- <ul>
- <li>
- <p>
- <strong>Account</strong> means a unique account created for You to
- access our Service or parts of our Service.
- </p>
- </li>
- <li>
- <p>
- <strong>Company</strong> (referred to as either &quot;the
- Company&quot;, &quot;We&quot;, &quot;Us&quot; or &quot;Our&quot;
- in this Agreement) refers to The Glassy Ladies LLC, 4201 Munford
- Ln, Chesapeake, VA 23321.
- </p>
- </li>
- <li>
- <p>
- <strong>Cookies</strong> are small files that are placed on Your
- computer, mobile device or any other device by a website,
- containing the details of Your browsing history on that website
- among its many uses.
- </p>
- </li>
- <li>
- <p><strong>Country</strong> refers to: Virginia, United States</p>
- </li>
- <li>
- <p>
- <strong>Device</strong> means any device that can access the
- Service such as a computer, a cellphone or a digital tablet.
- </p>
- </li>
- <li>
- <p>
- <strong>Personal Data</strong> is any information that relates to
- an identified or identifiable individual.
- </p>
- </li>
- <li>
- <p><strong>Service</strong> refers to the Website.</p>
- </li>
- <li>
- <p>
- <strong>Service Provider</strong> means any natural or legal
- person who processes the data on behalf of the Company. It refers
- to third-party companies or individuals employed by the Company to
- facilitate the Service, to provide the Service on behalf of the
- Company, to perform services related to the Service or to assist
- the Company in analyzing how the Service is used.
- </p>
- </li>
- <li>
- <p>
- <strong>Third-party Social Media Service</strong> refers to any
- website or any social network website through which a User can log
- in or create an account to use the Service.
- </p>
- </li>
- <li>
- <p>
- <strong>Usage Data</strong> refers to data collected
- automatically, either generated by the use of the Service or from
- the Service infrastructure itself (for example, the duration of a
- page visit).
- </p>
- </li>
- <li>
- <p>
- <strong>Website</strong> refers to The Glassy Ladies, accessible
- from
- <a
- href="https://theglassyladies.com"
- rel="external nofollow noopener"
- target="_blank"
- >https://theglassyladies.com</a
- >
- </p>
- </li>
- <li>
- <p>
- <strong>You</strong> means the individual accessing or using the
- Service, or the company, or other legal entity on behalf of which
- such individual is accessing or using the Service, as applicable.
- </p>
- </li>
- </ul>
- <h1>Collecting and Using Your Personal Data</h1>
- <h2>Types of Data Collected</h2>
- <h3>Personal Data</h3>
- <p>
- While using Our Service, We may ask You to provide Us with certain
- personally identifiable information that can be used to contact or
- identify You. Personally identifiable information may include, but is
- not limited to:
- </p>
- <ul>
- <li>
- <p>Email address</p>
- </li>
- <li>
- <p>First name and last name</p>
- </li>
- <li>
- <p>Phone number</p>
- </li>
- <li>
- <p>Address, State, Province, ZIP/Postal code, City</p>
- </li>
- <li>
- <p>Usage Data</p>
- </li>
- </ul>
- <h3>Usage Data</h3>
- <p>Usage Data is collected automatically when using the Service.</p>
- <p>
- Usage Data may include information such as Your Device's Internet
- Protocol address (e.g. IP address), browser type, browser version, the
- pages of our Service that You visit, the time and date of Your visit,
- the time spent on those pages, unique device identifiers and other
- diagnostic data.
- </p>
- <p>
- When You access the Service by or through a mobile device, We may
- collect certain information automatically, including, but not limited
- to, the type of mobile device You use, Your mobile device unique ID,
- the IP address of Your mobile device, Your mobile operating system,
- the type of mobile Internet browser You use, unique device identifiers
- and other diagnostic data.
- </p>
- <p>
- We may also collect information that Your browser sends whenever You
- visit our Service or when You access the Service by or through a
- mobile device.
- </p>
- <h3>Tracking Technologies and Cookies</h3>
- <p>
- We do <em>not</em> use Cookies or similar tracking technologies to
- track the activity on Our Service and store information.
- </p>
- <h2>Use of Your Personal Data</h2>
- <p>The Company may use Personal Data for the following purposes:</p>
- <ul>
- <li>
- <p>
- <strong>To provide and maintain our Service</strong>, including to
- monitor the usage of our Service.
- </p>
- </li>
- <li>
- <p>
- <strong>To manage Your Account:</strong> to manage Your
- registration as a user of the Service. The Personal Data You
- provide can give You access to different functionalities of the
- Service that are available to You as a registered user.
- </p>
- </li>
- <li>
- <p>
- <strong>For the performance of a contract:</strong> the
- development, compliance and undertaking of the purchase contract
- for the products, items or services You have purchased or of any
- other contract with Us through the Service.
- </p>
- </li>
- <li>
- <p>
- <strong>To contact You:</strong> To contact You by email,
- telephone calls, SMS, or other equivalent forms of electronic
- communication, such as a mobile application's push notifications
- regarding updates or informative communications related to the
- functionalities, products or contracted services, including the
- security updates, when necessary or reasonable for their
- implementation.
- </p>
- </li>
- <li>
- <p>
- <strong>To provide You</strong> with news, special offers and
- general information about other goods, services and events which
- we offer that are similar to those that you have already purchased
- or enquired about unless You have opted not to receive such
- information.
- </p>
- </li>
- <li>
- <p>
- <strong>To manage Your requests:</strong> To attend and manage
- Your requests to Us.
- </p>
- </li>
- <li>
- <p>
- <strong>For business transfers:</strong> We may use Your
- information to evaluate or conduct a merger, divestiture,
- restructuring, reorganization, dissolution, or other sale or
- transfer of some or all of Our assets, whether as a going concern
- or as part of bankruptcy, liquidation, or similar proceeding, in
- which Personal Data held by Us about our Service users is among
- the assets transferred.
- </p>
- </li>
- <li>
- <p>
- <strong>For other purposes</strong>: We may use Your information
- for other purposes, such as data analysis, identifying usage
- trends, determining the effectiveness of our promotional campaigns
- and to evaluate and improve our Service, products, services,
- marketing and your experience.
- </p>
- </li>
- </ul>
- <p>
- We may share Your personal information in the following situations:
- </p>
- <ul>
- <li>
- <strong>With Service Providers:</strong> We may share Your personal
- information with Service Providers to monitor and analyze the use of
- our Service, to contact You.
- </li>
- <li>
- <strong>For business transfers:</strong> We may share or transfer
- Your personal information in connection with, or during negotiations
- of, any merger, sale of Company assets, financing, or acquisition of
- all or a portion of Our business to another company.
- </li>
- <li>
- <strong>With Affiliates:</strong> We may share Your information with
- Our affiliates, in which case we will require those affiliates to
- honor this Privacy Policy. Affiliates include Our parent company and
- any other subsidiaries, joint venture partners or other companies
- that We control or that are under common control with Us.
- </li>
- <li>
- <strong>With business partners:</strong> We may share Your
- information with Our business partners to offer You certain
- products, services or promotions.
- </li>
- <li>
- <strong>With other users:</strong> when You share personal
- information or otherwise interact in the public areas with other
- users, such information may be viewed by all users and may be
- publicly distributed outside. If You interact with other users or
- register through a Third-Party Social Media Service, Your contacts
- on the Third-Party Social Media Service may see Your name, profile,
- pictures and description of Your activity. Similarly, other users
- will be able to view descriptions of Your activity, communicate with
- You and view Your profile.
- </li>
- <li>
- <strong>With Your consent</strong>: We may disclose Your personal
- information for any other purpose with Your consent.
- </li>
- </ul>
- <h2>Retention of Your Personal Data</h2>
- <p>
- The Company will retain Your Personal Data only for as long as is
- necessary for the purposes set out in this Privacy Policy. We will
- retain and use Your Personal Data to the extent necessary to comply
- with our legal obligations (for example, if we are required to retain
- your data to comply with applicable laws), resolve disputes, and
- enforce our legal agreements and policies.
- </p>
- <p>
- The Company will also retain Usage Data for internal analysis
- purposes. Usage Data is generally retained for a shorter period of
- time, except when this data is used to strengthen the security or to
- improve the functionality of Our Service, or We are legally obligated
- to retain this data for longer time periods.
- </p>
- <h2>Transfer of Your Personal Data</h2>
- <p>
- Your information, including Personal Data, is processed at the
- Company's operating offices and in any other places where the parties
- involved in the processing are located. It means that this information
- may be transferred to — and maintained on — computers located outside
- of Your state, province, country or other governmental jurisdiction
- where the data protection laws may differ than those from Your
- jurisdiction.
- </p>
- <p>
- Your consent to this Privacy Policy followed by Your submission of
- such information represents Your agreement to that transfer.
- </p>
- <p>
- The Company will take all steps reasonably necessary to ensure that
- Your data is treated securely and in accordance with this Privacy
- Policy and no transfer of Your Personal Data will take place to an
- organization or a country unless there are adequate controls in place
- including the security of Your data and other personal information.
- </p>
- <h2>Disclosure of Your Personal Data</h2>
- <h3>Business Transactions</h3>
- <p>
- If the Company is involved in a merger, acquisition or asset sale,
- Your Personal Data may be transferred. We will provide notice before
- Your Personal Data is transferred and becomes subject to a different
- Privacy Policy.
- </p>
- <h3>Law enforcement</h3>
- <p>
- Under certain circumstances, the Company may be required to disclose
- Your Personal Data if required to do so by law or in response to valid
- requests by public authorities (e.g. a court or a government agency).
- </p>
- <h3>Other legal requirements</h3>
- <p>
- The Company may disclose Your Personal Data in the good faith belief
- that such action is necessary to:
- </p>
- <ul>
- <li>Comply with a legal obligation</li>
- <li>Protect and defend the rights or property of the Company</li>
- <li>
- Prevent or investigate possible wrongdoing in connection with the
- Service
- </li>
- <li>
- Protect the personal safety of Users of the Service or the public
- </li>
- <li>Protect against legal liability</li>
- </ul>
- <h2>Security of Your Personal Data</h2>
- <p>
- The security of Your Personal Data is important to Us, but remember
- that no method of transmission over the Internet, or method of
- electronic storage is 100% secure. While We strive to use commercially
- acceptable means to protect Your Personal Data, We cannot guarantee
- its absolute security.
- </p>
- <h1>Links to Other Websites</h1>
- <p>
- Our Service may contain links to other websites that are not operated
- by Us. If You click on a third party link, You will be directed to
- that third party's site. We strongly advise You to review the Privacy
- Policy of every site You visit.
- </p>
- <p>
- We have no control over and assume no responsibility for the content,
- privacy policies or practices of any third party sites or services.
- </p>
- <h1>Changes to this Privacy Policy</h1>
- <p>
- We may update Our Privacy Policy from time to time. We will notify You
- of any changes by posting the new Privacy Policy on this page.
- </p>
- <p>
- We will let You know via email and/or a prominent notice on Our
- Service, prior to the change becoming effective and update the
- &quot;Last updated&quot; date at the top of this Privacy Policy.
- </p>
- <p>
- You are advised to review this Privacy Policy periodically for any
- changes. Changes to this Privacy Policy are effective when they are
- posted on this page.
- </p>
- <h1>Contact Us</h1>
- <p>
- If you have any questions about this Privacy Policy, You can contact
- us:
- </p>
- <ul>
- <li>By email: privacy@theglassyladies.com</li>
- </ul>
- </article>
- </section>
- </div>
-</template>