From d5d38fe8f0517d3ab6f84c4ece4e7d370fa0507a Mon Sep 17 00:00:00 2001 From: Marcel Oomens Date: Sat, 3 Apr 2021 16:12:29 +0200 Subject: [PATCH 1/8] Initial commit Signed-off-by: Marcel Oomens --- src/components/cart.js | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/components/cart.js diff --git a/src/components/cart.js b/src/components/cart.js new file mode 100644 index 0000000..4d82bf3 --- /dev/null +++ b/src/components/cart.js @@ -0,0 +1,48 @@ +import { writable } from 'svelte/store' + +const DEFAULT = 0; + +const stores = new Map(); + +function createStore( identifier ) { + + const value = localStorage.getItem( identifier ); + const { subscribe, set, update } = writable( value || DEFAULT ); + + subscribe(v => { + localStorage.setItem( identifier, v ) + }); + + function add( n ) { + update(v => v + n); + } + + function remove( n ) { + update(v => v < n ? 0 : v - n); + } + + return { + subscribe, + add, + remove + }; +} + +export function getCart( a, b ) { + + if ( typeof a === "undefined" ) + throw new Error( "(cart.js) `getCart( a, b )` requires at least one parameter." ); + const product = b ?? a; + const variant = b ? a : "default"; + + const identifier = `cart/${product}/${variant}`; + + if ( stores.has(identifier) ) { + return stores.get(identifier); + } + + const store = createStore( identifier ); + stores.set( identifier, store ) + + return store; +} From 10ce959fa373cdb38fb4f862806e1a62788fcdc8 Mon Sep 17 00:00:00 2001 From: Marcel Oomens Date: Sun, 4 Apr 2021 13:05:52 +0200 Subject: [PATCH 2/8] Basic architecture in place Signed-off-by: Marcel Oomens --- src/components/CartDetail.svelte | 21 +++++++++++++++++++++ src/components/Tile.svelte | 31 ++++++++++++++----------------- src/components/cart.js | 2 +- src/layouts/Layout.svelte | 4 ++-- src/routes/home/Home.svelte | 2 +- 5 files changed, 39 insertions(+), 21 deletions(-) create mode 100644 src/components/CartDetail.svelte diff --git a/src/components/CartDetail.svelte b/src/components/CartDetail.svelte new file mode 100644 index 0000000..1970b8f --- /dev/null +++ b/src/components/CartDetail.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/src/components/Tile.svelte b/src/components/Tile.svelte index f7d1469..6f73224 100644 --- a/src/components/Tile.svelte +++ b/src/components/Tile.svelte @@ -1,9 +1,10 @@ + + + + + + + + + + + + + {#each products as {name, slug}} + + + + + + + {/each} + + + + + + + + + +
Shopping cart
ProductUnit priceUnitsTotal
{name}
Grand total
diff --git a/src/components/CartDetail.svelte b/src/components/CartDetail.svelte index 1970b8f..f21acda 100644 --- a/src/components/CartDetail.svelte +++ b/src/components/CartDetail.svelte @@ -1,12 +1,10 @@ - + +{$cart} + - diff --git a/src/components/Tile.svelte b/src/components/Tile.svelte index 6f73224..bde658c 100644 --- a/src/components/Tile.svelte +++ b/src/components/Tile.svelte @@ -1,10 +1,9 @@ @@ -32,7 +34,9 @@ section {
-{#each products as product, i} - +{#each products as product, id} + {/each}
+ + From e3969d7af350738f6807adb8a1f6545481ba03b4 Mon Sep 17 00:00:00 2001 From: Marcel Oomens Date: Sun, 4 Apr 2021 17:59:08 +0200 Subject: [PATCH 4/8] Add variations Add cake variations to the Netlify CMS config Signed-off-by: Marcel Oomens --- assets/editor/config.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/assets/editor/config.yml b/assets/editor/config.yml index cafed7f..c6b6e10 100644 --- a/assets/editor/config.yml +++ b/assets/editor/config.yml @@ -47,6 +47,20 @@ collections: - {label: "Slug", name: "slug", widget: "string"} - {label: "Description", name: "description", widget: "string"} - {label: "Image", name: "image", widget: "image", allow_multiple: false} + - label: Variations + name: variations + widget: list + allow_add: true + collapsed: false + summary: "{{fields.description}} (€ {{fields.price}})" + minimize_collapsed: false + label_singular: Variation + fields: + - {label: "Description", name: "description", widget: "string", default: "Regular"} + - {label: "Price", name: "price", widget: "number", value_type: "float", default: 35.0, min: 0.0, step: 1.0} + # max: + min: 1 + add_to_top: false - {label: "Available", name: "available", widget: "boolean", default: true, hint: "Products on sale can be ordered. Products not on sale cannot."} - {label: "Promoted", name: "promoted", widget: "boolean", default: true, hint: "Promoted products are displayed on the home page."} - {label: "Order", name: "order", widget: "number", value_type: "int", default: 10, min: 1, max: 100, step: 1} From f3b7546ef18f307cce7d27f060d944bab07b3118 Mon Sep 17 00:00:00 2001 From: Marcel Oomens Date: Mon, 5 Apr 2021 10:31:25 +0200 Subject: [PATCH 5/8] WIP: refactor [skip ci] Signed-off-by: Marcel Oomens --- src/components/Cart.svelte | 22 ++++++++++++++++------ src/components/CartDetail.svelte | 6 +----- src/components/Tile.svelte | 2 +- src/routes/home/Home.svelte | 13 ++----------- src/routes/home/route.js | 12 ++++++++++++ 5 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/components/Cart.svelte b/src/components/Cart.svelte index 4882d78..5a6884e 100644 --- a/src/components/Cart.svelte +++ b/src/components/Cart.svelte @@ -1,15 +1,21 @@ +{#if products.length > 0} - + {#if caption}{/if} + {#if header} @@ -18,16 +24,18 @@ + {/if} - {#each products as {name, slug}} + {#each products as product} - + - + {/each} + {#if footer} @@ -36,4 +44,6 @@ + {/if}
Shopping cartShopping cart
ProductTotal
{name}{product.name}
Grand total
+{/if} diff --git a/src/components/CartDetail.svelte b/src/components/CartDetail.svelte index f21acda..a8c13ae 100644 --- a/src/components/CartDetail.svelte +++ b/src/components/CartDetail.svelte @@ -6,13 +6,9 @@ var cart; - onMount(() => { - cart = getCart( slug ); - }); - + onMount(() => cart = getCart( slug ) ); {$cart} - diff --git a/src/components/Tile.svelte b/src/components/Tile.svelte index bde658c..4f2bc24 100644 --- a/src/components/Tile.svelte +++ b/src/components/Tile.svelte @@ -5,8 +5,8 @@ export let image; export let available; + // Could be a nice piece of code to move to a filter const ASSETS_BASE = /^https:\/\/res.cloudinary.com\/jflower\/image\/upload\//; - if (image) { image = image // Remove Cloudinary base url diff --git a/src/routes/home/Home.svelte b/src/routes/home/Home.svelte index 9ace96e..07fc819 100644 --- a/src/routes/home/Home.svelte +++ b/src/routes/home/Home.svelte @@ -3,15 +3,6 @@ import Cart from '../../components/Cart.svelte'; export let data; - - const products = (data.markdown.products) - .map(p => p.frontmatter); - products.filter( a => a.promoted ); - products.sort( (a, b) => { - if (a.order > b.order ) { return 1; } - else if (a.order < b.order ) { return -1; } - else { return 0; } - } );
-{#each products as product, id} +{#each data.products as product, id} {/each}
- + diff --git a/src/routes/home/route.js b/src/routes/home/route.js index 8509119..ced60c3 100644 --- a/src/routes/home/route.js +++ b/src/routes/home/route.js @@ -4,6 +4,18 @@ module.exports = { // the permalink function takes a 'request' object and returns a relative permalink. In this case "/" permalink: ({ request }) => request.slug, data: ({ data }) => { + + const products = (data.markdown.products) + .map(p => p.frontmatter); + products.filter( a => a.promoted ); + products.sort( (a, b) => { + if (a.order > b.order ) { return 1; } + else if (a.order < b.order ) { return -1; } + else { return 0; } + } ); + + data.products = products; + return data }, // template: 'Home.svelte' // this is auto-detected. From a565dbdec7b940576724652e525b13d94e02d5f3 Mon Sep 17 00:00:00 2001 From: Marcel Oomens Date: Mon, 5 Apr 2021 20:28:41 +0200 Subject: [PATCH 6/8] store.js refactor Signed-off-by: Marcel Oomens --- src/components/Cart.svelte | 17 ++++++++-- src/components/CartDetail.svelte | 14 --------- src/components/cart.js | 48 ---------------------------- src/components/store.js | 54 ++++++++++++++++++++++++++++++++ src/routes/home/Home.svelte | 2 +- 5 files changed, 70 insertions(+), 65 deletions(-) delete mode 100644 src/components/CartDetail.svelte delete mode 100644 src/components/cart.js create mode 100644 src/components/store.js diff --git a/src/components/Cart.svelte b/src/components/Cart.svelte index 5a6884e..97cad83 100644 --- a/src/components/Cart.svelte +++ b/src/components/Cart.svelte @@ -5,7 +5,14 @@ export let footer = true; export let caption = ""; - import CartDetail from './CartDetail.svelte'; + import { onMount } from 'svelte/'; + import { getStore } from './store.js'; + + let store = getStore(); + + onMount(() => { + store.persist(); + });