Display price

This commit is contained in:
eraden 2022-07-21 06:35:15 +02:00
parent de9f1742d1
commit fa38a41044
6 changed files with 51 additions and 16 deletions

View File

@ -8,6 +8,15 @@
offer-id="{{offer.id}}"
description="{{offer.description}}"
picture-url="{{offer.picture_url}}"
{% match offer.price_range %}
{% when PriceRange::Free %}
price-range="free"
{% when PriceRange::Fixed with { value } %}
price-range="{{value}}"
{% when PriceRange::Range with { min, max } %}
price-range-min="{{min}}"
price-range-max="{{max}}"
{% endmatch %}
></marketplace-offer>
{% endfor %}
</marketplace-offers>

View File

@ -84,14 +84,18 @@ customElements.define('marketplace-offer', class extends Component {
}
set price_range(v) {
if (v instanceof PriceRange) return;
v = v + '';
if (!v.match(/free|(\d+([,.]\d{2})?)(,(\d+([,.]\d{2})?))?/i))
return;
if (!v.match(/free|(\d+([,.]\d{2})?)(\|(\d+([,.]\d{2})?))?/i))
return console.warn('malformed price range');
if (v === 'free') return this.#price_range = new PriceRange(v, 0);
if (v.includes(',')) {
if (v === 'free')
this.#price_range = new PriceRange(v, 0);
else if (v.includes(',')) {
const [min, max, ...r] = v.split(',');
this.#price_range = new PriceRange(parseInt(min), parseInt(max));
} else {
this.#price_range.min = parseInt(v);
}
this.#displayPrice();
}

View File

@ -221,6 +221,16 @@ export class PriceRange {
set max(v) {
this.#max = v;
}
[Symbol.toStringTag]() {
return this.toString()
}
toString() {
if (this.isFixed) return this.min.toString()
if (this.isFree) return 'free';
return `${this.min}|${this.max}`;
}
}
export const fireFbReady = () => {

View File

@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize};
use crate::model::db;
#[derive(Debug, Default)]
#[derive(Debug, Default, Serialize)]
pub enum Page {
#[default]
LocalBusinesses,

View File

@ -1,26 +1,28 @@
use actix_web::web::{self, Data, ServiceConfig};
use actix_web::{get, HttpResponse};
use actix_web::{get, HttpRequest, HttpResponse};
use askama::*;
use serde::Serialize;
use sqlx::PgPool;
use crate::model::db;
use crate::model::db::{self, PriceRange};
use crate::model::view::Page;
use crate::queries;
use crate::routes::{Identity, Result};
use crate::view::Helper;
#[derive(Default, Template)]
#[derive(Default, Serialize, Template)]
#[template(path = "./marketplace/index.html")]
struct MarketplaceTemplate {
account: Option<db::Account>,
error: Option<String>,
page: Page,
#[serde(skip)]
h: Helper,
offers: Vec<db::Offer>,
}
#[get("")]
async fn marketplace(db: Data<PgPool>, id: Identity) -> Result<HttpResponse> {
async fn marketplace(req: HttpRequest, db: Data<PgPool>, id: Identity) -> Result<HttpResponse> {
let pool = db.into_inner();
let mut t = crate::ok_or_internal!(pool.begin().await);
let account = match id.identity() {
@ -32,16 +34,24 @@ async fn marketplace(db: Data<PgPool>, id: Identity) -> Result<HttpResponse> {
t.commit().await.ok();
Ok(HttpResponse::Ok().body(
MarketplaceTemplate {
match req.headers().get("accept").and_then(|h| h.to_str().ok()) {
Some("application/json") => Ok(HttpResponse::Ok().json(MarketplaceTemplate {
page: Page::Marketplace,
account,
offers,
..Default::default()
}
.render()
.unwrap(),
))
})),
_ => Ok(HttpResponse::Ok().content_type("text/html").body(
MarketplaceTemplate {
page: Page::Marketplace,
account,
offers,
..Default::default()
}
.render()
.unwrap(),
)),
}
}
pub fn configure(config: &mut ServiceConfig) {

View File

@ -1,3 +1,5 @@
use serde::Serialize;
use crate::model::db::AccountType;
pub mod filters {
@ -9,7 +11,7 @@ pub mod filters {
}
}
#[derive(Default, Debug)]
#[derive(Default, Debug, Serialize)]
pub struct Helper;
impl Helper {