@mui/material#CardActions JavaScript Examples
The following examples show how to use
@mui/material#CardActions.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: DashboardApp.js From Django-REST-Framework-React-BoilerPlate with MIT License | 5 votes |
// ----------------------------------------------------------------------
export default function DashboardApp() {
return (
<Page title="Dashboard">
<Container maxWidth="xl">
<Typography variant="h4" sx={{ mb: 5 }}>
Hi, Welcome ?
</Typography>
<Grid container spacing={3}>
<Grid item xs={12} md={6} lg={8}>
<Card>
<Box sx={{ p: 3, pb: 1 }} dir="ltr">
<Typography variant="p" sx={{ mb: 5 }}>
Kick start your project ?
</Typography>
All the best for your new project
<Typography>
Please make sure to{' '}
<Link
href="https://github.com/faisalnazik/Django-REST-Framework-React-BoilerPlate/blob/master/README.md"
target="_blank"
>
README
</Link>
to understand where to go from here to use this BoilerPlate
</Typography>
<Box m={2} pt={3}>
<Button
href="https://github.com/faisalnazik/Django-REST-Framework-React-BoilerPlate"
target="_blank"
variant="outlined"
>
Get more information
</Button>
</Box>
</Box>
</Card>
</Grid>
<Grid item xs={12} md={6} lg={4}>
<Card>
{' '}
<CardContent>
<Typography sx={{ fontSize: 14 }} color="text.secondary" gutterBottom>
@faisalnazik
</Typography>
<Typography variant="h5" component="div">
Give a ⭐️ if this project helped you!
</Typography>
<Typography variant="body2">
If you have find any type of Bug, Raise an Issue So we can fix it
</Typography>
</CardContent>
<CardActions>
<Box m={2} pt={2}>
<Button
href="https://github.com/faisalnazik/Django-REST-Framework-React-BoilerPlate"
target="_blank"
variant="outlined"
>
Github
</Button>
</Box>
</CardActions>
</Card>
</Grid>
</Grid>
</Container>
</Page>
);
}
Example #2
Source File: OutfitCard.jsx From hr-atx58-fec-havarti with Mozilla Public License 2.0 | 4 votes |
export default function OutfitCard({ OutfitObj, remove }) {
const classes = useStyles();
//useContext
const {
overviewProduct,
clickedComponent,
clickedElement,
clickTracker,
selectedStyleState,
} = useContext(ProductsContext);
const [overviewProductState, setOverviewProductState] = overviewProduct;
const [selectedStyle, setSelectedStyle] = selectedStyleState;
const [clickTrackerFunc] = clickTracker;
return (
<Card
onClick={() =>
clickTrackerFunc.clickTrackerFunc("Outfit List Item", event.target)
}
className={classes.root}
>
<CardMedia
className={classes.media}
image={
OutfitObj.photos[0].thumbnail_url
? OutfitObj.photos[0].thumbnail_url
: noImage
}
title={OutfitObj.name}
>
<Grid container direction="column" alignItems="flex-end">
<Grid item>
<HighlightOffIcon
style={{ fill: "black", fontSize: 45 }}
onClick={() => {
remove(OutfitObj);
}}
/>
</Grid>
</Grid>
</CardMedia>
<CardActionArea>
<CardContent
onClick={() => {
setOverviewProductState(OutfitObj.overviewProduct);
setSelectedStyle(OutfitObj.selectedStyleObj);
}}
>
<Typography gutterBottom variant="body1" component="h2">
{OutfitObj.name}
</Typography>
<Typography gutterBottom variant="caption" component="h2">
{OutfitObj.category}
</Typography>
{OutfitObj.sale_price ? (
<>
<strike>
<Typography
className={{ textDecoration: "line-through" }}
variant="body2"
color="textSecondary"
component="p"
>
${OutfitObj.original_price}
</Typography>
</strike>
<Typography
variant="body2"
style={{ color: "red" }}
component="div"
>
On sale!! ${OutfitObj.sale_price}{" "}
</Typography>
</>
) : (
<Typography variant="body2" color="textSecondary" component="p">
${OutfitObj.original_price}
</Typography>
)}
<Typography variant="body2" color="textSecondary" component="p">
{OutfitObj.description}
</Typography>
{/* <StarRatings
rating={3.75}
starDimension={"15px"}
starSpacing={"1px"}
/> */}
</CardContent>
</CardActionArea>
<CardActions></CardActions>
</Card>
);
}
Example #3
Source File: RelatedProductCard.jsx From hr-atx58-fec-havarti with Mozilla Public License 2.0 | 4 votes |
export default function RelatedProductCard({ RelatedObj, updatedWardrobe }) {
//useContext
const { overviewProduct, clickTracker } = useContext(ProductsContext);
const [overviewProductState, setOverviewProductState] = overviewProduct;
const [clickTrackerFunc] = clickTracker;
//State
const [open, setOpen] = React.useState(false);
const [currentItem, setCurrentItem] = useState({});
const [compareFeatures, setCompareFeatures] = useState([]);
const [clickedStar, setClickedStar] = useState(false);
const [relatedProductName, updateRelatedProductName] = useState("");
const [relatedProductFeatures, setRelatedProductFeatures] = useState({});
const [overviewProductFeatures, setOverviewProductFeatures] = useState({});
const isInitialMount = useRef(true);
//Component Updates
useEffect(() => {
if (isInitialMount.current) {
isInitialMount.current = false;
} else {
if (Object.values(currentItem).length > 0) {
setCurrentItem({});
updatedWardrobe(currentItem, clickedStar);
}
}
});
//Functions
const handleStarClick = (relatedProduct) => {
let relatedProductFeaturesObj = {};
let overviewProductFeaturesObj = {};
let combinedFeatures = [];
relatedProduct.features.forEach((feature) => {
combinedFeatures.push(feature.feature);
relatedProductFeaturesObj[feature.feature] = feature.value;
});
overviewProductState.features.forEach((feature) => {
combinedFeatures.push(feature.feature);
overviewProductFeaturesObj[feature.feature] = feature.value;
});
updateRelatedProductName(relatedProduct.name);
setOverviewProductFeatures(overviewProductFeaturesObj);
setRelatedProductFeatures(relatedProductFeaturesObj);
setCompareFeatures(combinedFeatures);
setClickedStar(true);
handleClickOpen();
};
const handleClickOpen = () => {
setOpen(true);
};
const handleClose = () => {
setClickedStar(false);
setOpen(false);
};
//Styling
const useStyles = makeStyles({
root: {
maxWidth: 500,
},
media: {
height: 250,
},
iconDepth: {
zIndex: 1,
marginLeft: "auto",
},
});
const classes = useStyles();
return (
<Card
onClick={() =>
clickTrackerFunc.clickTrackerFunc("Related Products", event.target)
}
className={classes.root}
>
<CardMedia
className={classes.media}
image={RelatedObj.url ? RelatedObj.url : noImage}
>
<Grid container direction="column" alignItems="flex-end">
<Grid id="starClick" item>
{clickedStar ? (
<StarBorderIcon
className={classes.iconDepth}
onClick={() => {
handleStarClick(RelatedObj);
}}
color="primary"
style={{ fontSize: 45, color: "rgb(73, 137, 199)" }}
/>
) : (
<StarIcon
className={classes.iconDepth}
onClick={() => {
handleStarClick(RelatedObj);
}}
color="primary"
style={{ fontSize: 45, color: "rgb(73, 137, 199)" }}
/>
)}
</Grid>
</Grid>
</CardMedia>
<CardActionArea>
<CardContent
onClick={() => {
setOverviewProductState(RelatedObj);
}}
>
<Typography gutterBottom variant="body1" component="h2">
{RelatedObj.name}
</Typography>
<Typography gutterBottom variant="caption" component="h2">
{RelatedObj.category}
</Typography>
<Typography variant="body2" color="textSecondary" component="p">
${RelatedObj.default_price}
</Typography>
<Typography variant="body2" color="textSecondary" component="p">
{RelatedObj.description}
</Typography>
{/* <StarRatings rating={2} starDimension={"15px"} starSpacing={"1px"} /> */}
</CardContent>
</CardActionArea>
<CardActions>
<ModalPopup
maxWidth={"lg"}
compareFeatures={compareFeatures}
relatedProductName={relatedProductName}
relatedProductFeatures={relatedProductFeatures}
overviewProductFeatures={overviewProductFeatures}
open={open}
onClose={handleClose}
/>
</CardActions>
</Card>
);
}
Example #4
Source File: index.js From fireact with MIT License | 4 votes |
Home = () => {
const title = 'My Accounts';
const history = useHistory();
const { setBreadcrumb } = useContext(BreadcrumbContext);
const [loading, setLoading] = useState(true);
const [accounts, setAccounts] = useState([]);
const mountedRef = useRef(true);
const getAccounts = () => {
setLoading(true);
let records = [];
const accountsRef = FirebaseAuth.firestore().collection('accounts');
let query = accountsRef.where('access', 'array-contains', FirebaseAuth.auth().currentUser.uid);
query.get().then(accountSnapshots => {
if (!mountedRef.current) return null
accountSnapshots.forEach(account => {
records.push({
'id': account.id,
'name': account.data().name,
'subscriptionStatus': account.data().subscriptionStatus
});
});
setAccounts(records);
setLoading(false);
});
}
useEffect(() => {
setBreadcrumb([
{
to: "/",
text: "Home",
active: false
},
{
to: null,
text: title,
active: true
}
]);
getAccounts();
},[setBreadcrumb]);
useEffect(() => {
return () => {
mountedRef.current = false
}
},[]);
return (
<>
{accounts.length > 0 ? (
<>
<div style={{marginTop: '20px', marginBottom: '20px', textAlign: 'right'}}>
<Button onClick={() => history.push('/new-account')} color="primary" variant="contained"><i className="fa fa-plus"></i> Add Account</Button>
</div>
<Grid container spacing={3}>
{accounts.map((account, i) =>
<Grid container item xs={12} md={3} key={i}>
<Card key={account.id} style={{width: '100%'}}>
<CardHeader title={account.name}/>
<CardActions>
{account.subscriptionStatus?(
<Button size="small" color="primary" onClick={() => history.push('/account/'+account.id+'/')}>Account Overview</Button>
):(
<Button size="small" color="warning" onClick={() => history.push('/account/'+account.id+'/billing/plan')}>Activate the account</Button>
)}
</CardActions>
</Card>
</Grid>
)}
</Grid>
</>
) : (
<>
{(loading) ? (
<Loader text="loading accounts..."></Loader>
):(
<Redirect to="/new-account"></Redirect>
)}
</>
)}
</>
)
}
Example #5
Source File: index.js From fireact with MIT License | 4 votes |
Plans = () => {
const title = 'Select a Plan';
const countries = countryJSON.countries;
const { userData, authUser } = useContext(AuthContext);
const stripe = useStripe();
const elements = useElements();
const mountedRef = useRef(true);
const { setBreadcrumb } = useContext(BreadcrumbContext);
const CARD_ELEMENT_OPTIONS = {
style: {
base: {
color: '#32325d',
fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
fontSmoothing: 'antialiased',
fontSize: '16px',
'::placeholder': {
color: '#aab7c4'
}
},
invalid: {
color: '#fa755a',
iconColor: '#fa755a'
}
},
hidePostalCode: true
};
const [loading, setLoading] = useState(true);
const [processing, setProcessing] = useState(false);
const [plans, setPlans] = useState([]);
const [selectedPlan, setSelectedPlan] = useState({id: 0});
const [cardError, setCardError] = useState(null);
const [errorMessage, setErrorMessage] = useState(null);
const [country, setCountry] = useState("");
const [countryError, setCountryError] = useState(null);
const [state, setState] = useState("");
const [states, setStates] = useState([]);
const [stateError, setStateError] = useState(null);
useEffect(() => {
setBreadcrumb([
{
to: "/",
text: "Home",
active: false
},
{
to: "/account/"+userData.currentAccount.id+"/",
text: userData.currentAccount.name,
active: false
},
{
to: null,
text: title,
active: true
}
]);
setLoading(true);
const plansQuery = FirebaseAuth.firestore().collection('plans').orderBy('price', 'asc');
plansQuery.get().then(planSnapShots => {
if (!mountedRef.current) return null
let p = [];
planSnapShots.forEach(doc => {
p.push({
'id': doc.id,
'name': doc.data().name,
'price': doc.data().price,
'currency': doc.data().currency,
'paymentCycle': doc.data().paymentCycle,
'features': doc.data().features,
'stripePriceId': doc.data().stripePriceId,
'current': (userData.currentAccount.planId===doc.id)?true:false
});
});
if(p.length > 0){
const ascendingOrderPlans = p.sort((a, b) => parseFloat(a.price) - parseFloat(b.price));
setPlans(ascendingOrderPlans);
}
setLoading(false);
});
},[userData, setBreadcrumb, title]);
useEffect(() => {
return () => {
mountedRef.current = false
}
},[]);
const subscribe = async(event) => {
event.preventDefault();
setProcessing(true);
setErrorMessage(null);
let hasError = false;
let paymentMethodId = '';
if(selectedPlan.price !== 0){
if(country === ''){
setCountryError('Please select a country.');
hasError = true;
}
if(state === '' && countries[country] && countries[country].states){
setStateError('Please select a state.');
hasError = true;
}
setCardError(null);
if (!stripe || !elements) {
// Stripe.js has not loaded yet. Make sure to disable
// form submission until Stripe.js has loaded.
return;
}
// Get a reference to a mounted CardElement. Elements knows how
// to find your CardElement because there can only ever be one of
// each type of element.
const cardElement = elements.getElement(CardElement);
// Use your card Element with other Stripe.js APIs
const {error, paymentMethod} = await stripe.createPaymentMethod({
type: 'card',
card: cardElement
});
if (error) {
setCardError(error.message);
hasError = true;
} else {
paymentMethodId = paymentMethod.id;
}
}
if(!hasError){
const createSubscription = CloudFunctions.httpsCallable('createSubscription');
createSubscription({
planId: selectedPlan.id,
accountId: userData.currentAccount.id,
paymentMethodId: paymentMethodId,
billing: {
country: country,
state: state
}
}).then(res => {
// physical page load to reload the account data
if (!mountedRef.current) return null
document.location = '/account/'+userData.currentAccount.id+'/';
}).catch(err => {
if (!mountedRef.current) return null
setProcessing(false);
setErrorMessage(err.message);
});
}else{
setProcessing(false);
}
}
return (
<>
{(!loading)?(
<>{(userData.currentAccount.owner === authUser.user.uid)?(
<>{plans.length > 0 ? (
<Paper>
<Box p={3} style={{textAlign: 'center'}} >
<h2>{title}</h2>
<Grid container spacing={3}>
<>
{plans.map((plan,i) =>
<Grid container item xs={12} md={4} key={i} >
<Card style={{
width: '100%',
display: 'flex',
flexDirection: 'column',
paddingBottom: '20px',
}}>
<CardHeader title={plan.name} subheader={"$"+plan.price+"/"+plan.paymentCycle} />
<CardContent>
<Divider />
<ul style={{listStyleType: 'none', paddingLeft: '0px'}}>
{plan.features.map((feature, i) =>
<li key={i}>
<i className="fa fa-check" style={{color: "#2e7d32"}} /> {feature}
</li>
)}
</ul>
</CardContent>
<CardActions style={{
marginTop: 'auto',
justifyContent: 'center',
}}>
{plan.current?(
<Button color="success" variant="contained" disabled={true}>Current Plan</Button>
):(
<Button color="success" variant={(plan.id!==selectedPlan.id)?"outlined":"contained"} onClick={() => {
for(let i=0; i<plans.length; i++){
if(plans[i].id === plan.id){
setSelectedPlan(plan);
}
}
}}>{plan.id===selectedPlan.id && <><i className="fa fa-check" /> </>}{(plan.id!==selectedPlan.id)?"Select":"Selected"}</Button>
)}
</CardActions>
</Card>
</Grid>
)}
</>
</Grid>
{selectedPlan.id !== 0 && selectedPlan.price > 0 &&
<div style={{justifyContent: 'center', marginTop: '50px'}}>
<h2>Billing Details</h2>
<Grid container spacing={3}>
<Grid container item xs={12}>
<Card style={{
width: '100%',
paddingBottom: '20px',
}}>
<CardContent>
<Container maxWidth="sm">
<Stack spacing={3}>
{countryError !== null &&
<Alert severity="error" onClose={() => setCountryError(null)}>{countryError}</Alert>
}
<Autocomplete
value={(country !== '')?(countries.find(obj =>{
return obj.code === country
})):(null)}
options={countries}
autoHighlight
getOptionLabel={(option) => option.label}
renderOption={(props, option) => (
<Box component="li" sx={{ '& > img': { mr: 2, flexShrink: 0 } }} {...props}>
<img
loading="lazy"
width="20"
src={`https://flagcdn.com/w20/${option.code.toLowerCase()}.png`}
srcSet={`https://flagcdn.com/w40/${option.code.toLowerCase()}.png 2x`}
alt=""
/>
{option.label}
</Box>
)}
renderInput={(params) => (
<TextField
{...params}
label="Country"
inputProps={{
...params.inputProps,
autoComplete: 'new-password',
}}
/>
)}
onChange={(event, newValue) => {
if(newValue && newValue.code){
setCountry(newValue.code);
setState("");
if(newValue.states){
setStates(newValue.states);
}else{
setStates([]);
}
setCountryError(null);
}
}}
/>
{states.length > 0 &&
<>
{stateError !== null &&
<Alert severity="error" onClose={() => setStateError(null)}>{stateError}</Alert>
}
<Autocomplete
value={(state !== '')?(states.find(obj =>{
return obj.code === state
})):(null)}
options={states}
autoHighlight
getOptionLabel={(option) => option.label}
renderOption={(props, option) => (
<Box component="li" {...props}>
{option.label}
</Box>
)}
renderInput={(params) => (
<TextField
{...params}
label="State"
inputProps={{
...params.inputProps,
autoComplete: 'new-password',
}}
/>
)}
onChange={(event, newValue) => {
if(newValue && newValue.code){
setState(newValue.code);
setStateError(null);
}
}}
/>
</>
}
{cardError !== null &&
<Alert severity="error" onClose={() => setCardError(null)}>{cardError}</Alert>
}
<div style={{position: "relative", minHeight: '56px', padding: '15px'}}>
<CardElement options={CARD_ELEMENT_OPTIONS}></CardElement>
<fieldset style={{
borderColor: 'rgba(0, 0, 0, 0.23)',
borderStyle: 'solid',
borderWidth: '1px',
borderRadius: '4px',
position: 'absolute',
top: '-5px',
left: '0',
right: '0',
bottom: '0',
margin: '0',
padding: '0 8px',
overflow: 'hidden',
pointerEvents: 'none'
}}></fieldset>
</div>
</Stack>
</Container>
</CardContent>
</Card>
</Grid>
</Grid>
</div>
}
{selectedPlan.id!==0 &&
<div style={{marginTop: '50px'}}>
<Container maxWidth="sm">
<Stack spacing={3}>
{errorMessage !== null &&
<Alert severity="error" onClose={() => setErrorMessage(null)}>{errorMessage}</Alert>
}
<Button color="success" size="large" variant="contained" disabled={selectedPlan.id===0||processing?true:false} onClick={e => {
subscribe(e);
}}>{processing?(<><Loader /> Processing...</>):(<>Subscribe Now</>)}</Button>
</Stack>
</Container>
</div>
}
</Box>
</Paper>
):(
<Alert severity="warning">No plan is found.</Alert>
)}</>
):(
<Alert severity="error" >Access Denied.</Alert>
)}</>
):(
<Loader text="loading plans..." />
)}
</>
)
}