Add options for the cards #93
|
@ -7,6 +7,9 @@
|
||||||
"": {
|
"": {
|
||||||
"name": "m-labs-zola",
|
"name": "m-labs-zola",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
"json-logic-js": "^2.0.2"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/cli": "^7.22.6",
|
"@babel/cli": "^7.22.6",
|
||||||
"@babel/core": "^7.22.8",
|
"@babel/core": "^7.22.8",
|
||||||
|
@ -3655,6 +3658,11 @@
|
||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/json-logic-js": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/json-logic-js/-/json-logic-js-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-ZBtBdMJieqQcH7IX/LaBsr5pX+Y5JIW+EhejtM3Ffg2jdN9Iwf+Ht6TbHnvAZ/YtwyuhPaCBlnvzrwVeWdvGDQ=="
|
||||||
|
},
|
||||||
"node_modules/json-parse-even-better-errors": {
|
"node_modules/json-parse-even-better-errors": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
|
||||||
|
|
|
@ -706,7 +706,16 @@ class ProductCartItem extends React.PureComponent {
|
||||||
style={{'display': (model.showOverlayRemove && options) ? 'flex' : 'none'}}
|
style={{'display': (model.showOverlayRemove && options) ? 'flex' : 'none'}}
|
||||||
className="overlayVariant">
|
className="overlayVariant">
|
||||||
|
|
||||||
{ProcessOptions({options: options, data: options_data, target: options_data})}
|
<ProcessOptions
|
||||||
|
options={options}
|
||||||
|
data={options_data}
|
||||||
|
key={"processed_options" + index}
|
||||||
|
id={"processed_options" + index}
|
||||||
|
target={((outvar, value) => {
|
||||||
|
options_data[outvar] = value;
|
||||||
|
this.setState(options_data);
|
||||||
|
})}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
) : null }
|
) : null }
|
||||||
|
|
||||||
|
@ -867,6 +876,7 @@ class Cart extends React.PureComponent {
|
||||||
isTouch={isTouch}
|
isTouch={isTouch}
|
||||||
hovered={item.id === itemHovered}
|
hovered={item.id === itemHovered}
|
||||||
key={item.id}
|
key={item.id}
|
||||||
|
id={item.id}
|
||||||
index={index}
|
index={index}
|
||||||
data={itemData}
|
data={itemData}
|
||||||
onToggleOverlayRemove={onToggleOverlayRemove}
|
onToggleOverlayRemove={onToggleOverlayRemove}
|
||||||
|
|
|
@ -1,60 +1,92 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import React, {useState} from "react";
|
import React, {Component} from "react";
|
||||||
import jsonLogic from 'json-logic-js';
|
import jsonLogic from 'json-logic-js';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import {v4 as uuidv4} from 'uuid';
|
||||||
|
|
||||||
// https://stackoverflow.com/a/70511311
|
// https://stackoverflow.com/a/70511311
|
||||||
const trueTypeOf = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
|
const trueTypeOf = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
|
||||||
|
|
||||||
function Radio(target, {title, variants, outvar}) {
|
class Radio extends Component {
|
||||||
console.log(target)
|
constructor(props) {
|
||||||
function handleClick(variant) {
|
super(props);
|
||||||
console.log(variant)
|
// Initialize the state object with the initial values from the props
|
||||||
target[outvar] = variant;
|
this.state = {
|
||||||
//this.setState()
|
target: props.target,
|
||||||
|
outvar: props.outvar,
|
||||||
|
variants: props.variants,
|
||||||
|
variant: props.variants[0],
|
||||||
|
id: props.id
|
||||||
|
};
|
||||||
|
|
||||||
|
// Bind the event handler to this
|
||||||
|
this.handleClick = this.handleClick.bind(this);
|
||||||
|
this.state.target(this.state.outvar, this.state.variant);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
handleClick(variant) {
|
||||||
<div className="shop-radio" key={uuidv4()}>
|
console.log(variant);
|
||||||
{title}
|
// Update the state object with the new value for outvar
|
||||||
{variants.map((variant, _) => (
|
this.setState({
|
||||||
<div className="form-check" key={outvar + variant}>
|
...this.state,
|
||||||
<input
|
variant: variant
|
||||||
className="form-check-input"
|
});
|
||||||
type="radio"
|
this.state.target(this.state.outvar, variant);
|
||||||
name={outvar}
|
}
|
||||||
id={outvar + variant}
|
|
||||||
checked={target[outvar] === variant}
|
render() {
|
||||||
onClick={() => handleClick(variant)}
|
let key = this.state.id + this.state.outvar;
|
||||||
onChange={() => handleClick(variant)}
|
return (
|
||||||
/>
|
<div className="shop-radio" key={this.state.id}>
|
||||||
<label className="form-check-label" htmlFor={outvar + variant}>
|
{this.props.title}
|
||||||
{variant}
|
{this.props.variants.map((variant, _) => (
|
||||||
</label>
|
<div className="form-check" key={key + variant}>
|
||||||
</div>
|
<input
|
||||||
))}
|
className="form-check-input"
|
||||||
</div>
|
type="radio"
|
||||||
);
|
name={key}
|
||||||
|
id={key + variant}
|
||||||
|
checked={this.state.variant === variant}
|
||||||
|
onClick={() => this.handleClick(variant)}
|
||||||
|
onChange={() => this.handleClick(variant)}
|
||||||
|
/>
|
||||||
|
<label className="form-check-label" htmlFor={key + variant}>
|
||||||
|
{variant}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function MissingComponent(...args) {
|
function RadioWrapper(target, id, {title, variants, outvar}) {
|
||||||
console.error("Missing component with args:", args)
|
return <Radio target={target} title={title} variants={variants} outvar={outvar} key={id} id={id}/>;
|
||||||
return <label style={{background: "red"}}>MISSING</label>
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function MissingComponent(type, id) {
|
||||||
|
//console.error("Missing component with type:", type)
|
||||||
|
return <div key={type + id} style={{background: "red"}}>MISSING</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
const componentsList = {
|
const componentsList = {
|
||||||
"Radio": Radio,
|
"Radio": RadioWrapper,
|
||||||
"Default": MissingComponent,
|
"Default": MissingComponent,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
export default function ProcessOptions({options, data, target}) {
|
export default function ProcessOptions({options, data, target, id}) {
|
||||||
let options_t = trueTypeOf(options);
|
let options_t = trueTypeOf(options);
|
||||||
|
|
||||||
if (options_t === "array") {
|
if (options_t === "array") {
|
||||||
return Array.from(
|
return Array.from(
|
||||||
options.map((option_item, _) => ProcessOptions({options: option_item, data: data, target: target}))
|
options.map((option_item, i) => ProcessOptions({
|
||||||
|
options: option_item,
|
||||||
|
data: data,
|
||||||
|
target: target,
|
||||||
|
id: id + i
|
||||||
|
}))
|
||||||
);
|
);
|
||||||
} else if (options_t === "object") {
|
} else if (options_t === "object") {
|
||||||
if (
|
if (
|
||||||
|
@ -62,12 +94,12 @@ export default function ProcessOptions({options, data, target}) {
|
||||||
trueTypeOf(options.args) === "object"
|
trueTypeOf(options.args) === "object"
|
||||||
) {
|
) {
|
||||||
if (options.type in componentsList) {
|
if (options.type in componentsList) {
|
||||||
return componentsList[options.type](target, options.args);
|
return componentsList[options.type](target, id + options.type, options.args);
|
||||||
}else {
|
} else {
|
||||||
return componentsList["Default"](target, options.args);
|
return componentsList["Default"](options.type, id + "missing");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return ProcessOptions({options: jsonLogic.apply(options, data), data: data, target: target});
|
return ProcessOptions({options: jsonLogic.apply(options, data), data: data, target: target, id: id});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue