@@ -23,6 +23,30 @@ async function GetNews(token="", start = 0) { | |||
return res; | |||
} | |||
async function GetDetailNews(id, token="") { | |||
var res = await apollo.query( | |||
` | |||
query($input: ID!) { | |||
latestNews(where:{id:$input}) | |||
{ | |||
id | |||
title | |||
description | |||
img{ | |||
url | |||
} | |||
} | |||
} | |||
`, | |||
token, | |||
{ | |||
"input": id | |||
} | |||
); | |||
return res; | |||
} | |||
module.exports = { | |||
GetNews: GetNews, | |||
GetDetailNews: GetDetailNews, | |||
}; |
@@ -27,11 +27,11 @@ import apollo from "../../lib/apollo.js"; | |||
// return res; | |||
// } | |||
async function GetDetailProduct(token="") { | |||
async function GetDetailProduct(id, token="") { | |||
var res = await apollo.query( | |||
` | |||
query{ | |||
products | |||
query($input: ID!){ | |||
products(where:{id:$input}) | |||
{ | |||
name | |||
price | |||
@@ -49,9 +49,13 @@ async function GetDetailProduct(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
} `, | |||
token | |||
token, | |||
{ | |||
"input": id | |||
} | |||
); | |||
return res; | |||
} | |||
@@ -79,6 +83,7 @@ async function GetProductYamaha(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -109,6 +114,7 @@ async function GetProductSuzuki(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -139,6 +145,7 @@ async function GetProductHonda(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -169,6 +176,7 @@ async function GetProductHino(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -199,6 +207,7 @@ async function GetProductMercedes(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -229,6 +238,7 @@ async function GetProductBPR(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -259,6 +269,7 @@ async function GetProductEmilia(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -289,6 +300,7 @@ async function GetProductHomes(token="") { | |||
film{ | |||
url | |||
} | |||
stock | |||
} | |||
}`, | |||
token | |||
@@ -14,6 +14,7 @@ import Card from "components/Card/Card.js"; | |||
import CardBody from "components/Card/CardBody.js"; | |||
import Button from "components/CustomButtons/Button.js"; | |||
import Paginations from "components/Pagination/Pagination.js"; | |||
import Icon from "@material-ui/core/Icon"; | |||
const useStyles = makeStyles(styles); | |||
@@ -54,7 +55,9 @@ const DataLatestNews = function ({ backend, news, ...props }) { | |||
<CardBody> | |||
{/* <h4 className={classes.cardTitle}>{data.title}</h4> */} | |||
<p>{data.title}</p> | |||
<Button color="info" onclick="myFunction()" id="myBtn">Read More</Button> | |||
<Button color="info" round href={"/latestnews_details?s="+data.id}> | |||
<Icon className={classes.icons}>open_in_new</Icon>Read More | |||
</Button> | |||
</CardBody> | |||
</Card> | |||
</Grid> | |||
@@ -68,7 +71,6 @@ const DataLatestNews = function ({ backend, news, ...props }) { | |||
<div> | |||
<GridContainer justify="center"> | |||
{latnews} | |||
{latnews} | |||
</GridContainer> | |||
</div> | |||
<div align="center"> | |||
@@ -0,0 +1,61 @@ | |||
import React, { useState, useEffect } from 'react'; | |||
import Router, { withRouter } from 'next/router' | |||
// @material-ui/core components | |||
import { makeStyles } from "@material-ui/core/styles"; | |||
import ReactPaginate from 'react-paginate'; | |||
// component | |||
import styles from "assets/jss/nextjs-material-kit/pages/componentsSections/notificationsStyles.js"; | |||
import Paginations from "components/Pagination/Pagination.js"; | |||
const useStyles = makeStyles(styles); | |||
const DataLatestNews = function ({ backend, news, ...props }) { | |||
const [isLoading, setLoading] = useState(false); //State for the loading indicator | |||
const startLoading = () => setLoading(true); | |||
const stopLoading = () => setLoading(false); | |||
useEffect(() => { //After the component is mounted set router event handlers | |||
Router.events.on('routeChangeStart', startLoading); | |||
Router.events.on('routeChangeComplete', stopLoading); | |||
return () => { | |||
Router.events.off('routeChangeStart', startLoading); | |||
Router.events.off('routeChangeComplete', stopLoading); | |||
} | |||
}, []) | |||
const pagginationHandler = (page) => { | |||
const currentPath = props.router.pathname; | |||
const currentQuery = props.router.query; | |||
currentQuery.page = page.selected + 1; | |||
props.router.push({ | |||
pathname: currentPath, | |||
query: currentQuery, | |||
}); | |||
}; | |||
const classes = useStyles(); | |||
const latnews = news.map((data) => { | |||
return ( | |||
<div className={classes.section} style={{padding:"40px"}}> | |||
<div align="center" style={{marginTop:"-40px"}}> | |||
<h2>{data.title}</h2> | |||
</div><br></br><br></br> | |||
<div align="center"> | |||
<img src={`${backend}${data.img[0]["url"]}`} alt="First slide" className="slick-image" /> | |||
</div><br></br><br></br> | |||
<h5 align="justify"> | |||
{data.description} | |||
</h5> | |||
</div> | |||
); | |||
}) | |||
return ( | |||
<div> | |||
{latnews} | |||
</div> | |||
); | |||
} | |||
export default DataLatestNews; |
@@ -45,7 +45,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -67,7 +67,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -89,7 +89,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -111,7 +111,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -133,7 +133,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -155,7 +155,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -177,7 +177,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -199,7 +199,7 @@ const DataProduct = function ({ backend, yamaha, suzuki, honda, hino, mercedes, | |||
<h4>Rp.{data.price}</h4> | |||
<Button | |||
color="info" round | |||
href={"/product_detail?a="+data.id} | |||
href={"/product_detail?s="+data.id} | |||
> | |||
<Icon className={classes.icons}>open_in_new</Icon>Detail Product | |||
</Button> | |||
@@ -35,7 +35,6 @@ const DataProduct = function ({ backend, detailproduct, ...props }) { | |||
); | |||
const navImageClasses = classNames(classes.imgRounded, classes.imgGallery); | |||
const Productdetails = detailproduct.map((data) => { | |||
console.log(data); | |||
return ( | |||
<div> | |||
<GridContainer> | |||
@@ -54,7 +53,7 @@ const DataProduct = function ({ backend, detailproduct, ...props }) { | |||
<h3>{data.name}</h3> | |||
<h3>Rp.{data.price}</h3> | |||
<hr></hr> | |||
<p>{data.description}</p> | |||
<p>{data.description} ---- Stock Unit : {data.stock}</p> | |||
</Grid> | |||
</GridContainer> | |||
<GridContainer justify="center"> | |||
@@ -121,7 +120,7 @@ const DataProduct = function ({ backend, detailproduct, ...props }) { | |||
</div> | |||
<CardBody> | |||
<div> | |||
{Productdetails[0]} | |||
{Productdetails} | |||
</div> | |||
</CardBody> | |||
<CardFooter className={classes.textMuted} textAlign="center"> | |||
@@ -13,7 +13,7 @@ class MyDocument extends Document { | |||
content="width=device-width, initial-scale=1, shrink-to-fit=no" | |||
/> | |||
<meta name="theme-color" content="#000000" /> | |||
<link rel="shortcut icon" href={require("assets/img/favicon.png")} /> | |||
<link rel="shortcut icon" href={require("assets/img/favicons.png")} /> | |||
<link | |||
rel="apple-touch-icon" | |||
sizes="76x76" | |||
@@ -1,14 +1,10 @@ | |||
import DetailProduct from "../../../api/product/product"; | |||
export default async function handler(req, res) { | |||
console.log("masuk"); | |||
if (req.method == "POST") { | |||
var filterKey = req.body.filterKey; | |||
if (filterKey == "name") { | |||
var id = req.body.id; | |||
var name = req.body.name; | |||
var description = req.body.description; | |||
var price = req.body.price; | |||
var detailproduct = await DetailProduct.GetDetailProduct(id, name, description, price); | |||
var id = req.body.id; | |||
var detailproduct = await DetailProduct.GetDetailProduct(id); | |||
if (detailproduct["STATUS"] == 0) { | |||
res.status(200).json(detailproduct); | |||
} else if (detailproduct["DATA"]["products"] == null) { | |||
@@ -24,10 +20,8 @@ export default async function handler(req, res) { | |||
DATA: detailproduct["DATA"]["products"], | |||
}); | |||
} | |||
} else { | |||
res.status(200).send("NOT FOUND"); | |||
} | |||
} else { | |||
console.log("masukas"); | |||
res.status(200).send("NOT FOUND"); | |||
} | |||
} |
@@ -0,0 +1,76 @@ | |||
import React from "react"; | |||
// nodejs library that concatenates classes | |||
import classNames from "classnames"; | |||
// @material-ui/core components | |||
import { makeStyles } from "@material-ui/core/styles"; | |||
// core components | |||
import Header from "components/Header/Header.js"; | |||
import HeaderLinks from "components/Header/HeaderLinks.js"; | |||
import Footer from "components/Footer/Footer.js"; | |||
import GridContainer from "components/Grid/GridContainer.js"; | |||
import GridItem from "components/Grid/GridItem.js"; | |||
import Parallax from "components/Parallax/Parallax.js"; | |||
import styles from "assets/jss/nextjs-material-kit/pages/components.js"; | |||
import GetLatestNews from "../api/latest_news/news.js" | |||
import DataSnackbarContent from "../pages-sections/snackbar.js"; | |||
import DetailLatestNews from "../pages-sections/latest_news/news_details.js"; | |||
const useStyles = makeStyles(styles); | |||
const detailLatestNews = function ({ backend, news, ...props }) { | |||
const classes = useStyles(); | |||
const { ...rest } = props; | |||
<DetailLatestNews news={props.news}/> | |||
return ( | |||
<div> | |||
<Header | |||
rightLinks={<HeaderLinks />} | |||
fixed | |||
color="info" | |||
changeColorOnScroll={{ | |||
height: 400, | |||
color: "white" | |||
}} | |||
{...rest} | |||
/> | |||
<Parallax image={require("assets/img/simulasicicilan.jpg")} width="200px"> | |||
<div className={classes.container}> | |||
<GridContainer> | |||
<GridItem> | |||
{/* <div className={classes.brand}> | |||
<h1 className={classes.title}>NextJS Material Kit.</h1> | |||
<h3 className={classes.subtitle}> | |||
A Badass Material Kit based on Material-UI and NextJS. | |||
</h3> | |||
</div> */} | |||
</GridItem> | |||
</GridContainer> | |||
</div> | |||
</Parallax> | |||
<div className={classNames(classes.main, classes.mainRaised)}> | |||
<DataSnackbarContent/> | |||
<DetailLatestNews news={news} backend={backend}/> | |||
</div> | |||
<Footer /> | |||
</div> | |||
); | |||
} | |||
export default detailLatestNews; | |||
export async function getServerSideProps(context) { | |||
var {query} = context; | |||
var news = []; | |||
const backend = process.env.BACKEND_SERVER_URI; | |||
var res = await GetLatestNews.GetDetailNews(query.s||0); | |||
if (res["STATUS"] === 1) { | |||
news = res["DATA"]["latestNews"]; | |||
} | |||
return { | |||
props: { news, backend }, // will be passed to the page component as props | |||
}; | |||
} |
@@ -59,10 +59,11 @@ const ProductDetails = function ({ backend, detailproduct, ...props }) { | |||
export default ProductDetails; | |||
export async function getServerSideProps(context) { | |||
var {query} = context; | |||
var detailproduct = []; | |||
const backend = process.env.BACKEND_SERVER_URI; | |||
var res = await GetDetailproduct.GetDetailProduct(); | |||
var res = await GetDetailproduct.GetDetailProduct(query.s||0); | |||
if (res["STATUS"] === 1) { | |||
detailproduct = res["DATA"]["products"]; | |||
} | |||