UNPKG

aura-glass

Version:

A comprehensive glassmorphism design system for React applications with 142+ production-ready components

166 lines (163 loc) 5.1 kB
'use client'; import { jsx, jsxs } from 'react/jsx-runtime'; import { GlassButton } from '../button/GlassButton.js'; import { cn } from '../../lib/utilsComprehensive.js'; import { GlassSelect, GlassSelectTrigger, GlassSelectValue, GlassSelectContent, GlassSelectItem } from '../input/GlassSelectCompound.js'; function isGroup(x) { return x && Array.isArray(x.rules); } function GlassQueryBuilder({ fields, value, onChange, className }) { const update = group => onChange({ ...group }); const renderRule = (rule, idx, parent) => { const field = fields.find(f => f.id === rule.field) || fields[0]; return jsxs("div", { "data-glass-component": true, className: "glass-flex glass-items-center glass-gap-2", children: [jsxs(GlassSelect, { value: rule.field, onValueChange: v => { rule.field = v; update(value); }, children: [jsx(GlassSelectTrigger, { className: 'w-40 h-8 glass-text-sm', children: jsx(GlassSelectValue, { placeholder: "Field" }) }), jsx(GlassSelectContent, { children: fields.map(f => jsx(GlassSelectItem, { value: f.id, children: f.label }, f.id)) })] }), jsxs(GlassSelect, { value: rule.op, onValueChange: v => { rule.op = v; update(value); }, children: [jsx(GlassSelectTrigger, { className: 'w-28 h-8 glass-text-sm', children: jsx(GlassSelectValue, { placeholder: "Op" }) }), jsx(GlassSelectContent, { children: ["=", "!=", ">", ">=", "<", "<=", "contains"].map(op => jsx(GlassSelectItem, { value: op, children: op }, op)) })] }), field.type === "select" ? jsxs(GlassSelect, { value: rule.value ?? "", onValueChange: v => { const next = v === "__clear__" ? "" : v; rule.value = next; update(value); }, children: [jsx(GlassSelectTrigger, { className: 'w-48 h-8 glass-text-sm', children: jsx(GlassSelectValue, { placeholder: "Value" }) }), jsxs(GlassSelectContent, { children: [jsx(GlassSelectItem, { value: "__clear__", children: "\u2014" }), field.options?.map(o => jsx(GlassSelectItem, { value: o.value, children: o.label }, o.value))] })] }) : jsx("input", { value: rule.value ?? "", onChange: e => { rule.value = e.target.value; update(value); }, className: 'bg-transparent glass-border glass-border-white/20 glass-radius-md glass-px-2 glass-py-1 glass-text-sm glass-focus glass-touch-target glass-contrast-guard' }), jsx(GlassButton, { size: "sm", variant: "ghost", onClick: e => { parent.rules.splice(idx, 1); update(value); }, children: "Remove" })] }, idx); }; const renderGroup = (group, parent) => jsxs("div", { className: "glass-radius-xl glass-border glass-border-white/20 glass-p-3 glass-gap-2", children: [jsxs("div", { className: "glass-flex glass-items-center glass-gap-2", children: [jsxs(GlassSelect, { value: group.combinator, onValueChange: v => { group.combinator = v; update(value); }, children: [jsx(GlassSelectTrigger, { className: 'w-24 h-8 glass-text-sm', children: jsx(GlassSelectValue, {}) }), jsxs(GlassSelectContent, { children: [jsx(GlassSelectItem, { value: "AND", children: "AND" }), jsx(GlassSelectItem, { value: "OR", children: "OR" })] })] }), jsx(GlassButton, { size: "sm", variant: "secondary", onClick: e => { group.rules.push({ field: fields[0].id, op: "=", value: "" }); update(value); }, children: "+ Rule" }), jsx(GlassButton, { size: "sm", variant: "ghost", onClick: e => { group.rules.push({ combinator: "AND", rules: [] }); update(value); }, children: "+ Group" }), parent && jsx(GlassButton, { size: "sm", variant: "ghost", onClick: e => { parent.rules.splice(parent.rules.indexOf(group), 1); update(value); }, children: "Remove" })] }), jsx("div", { className: "glass-gap-2", children: group.rules.map((r, i) => isGroup(r) ? jsx("div", { children: renderGroup(r, group) }, i) : renderRule(r, i, group)) })] }); return jsx("div", { className: cn("glass-gap-2", className), children: renderGroup(value) }); } export { GlassQueryBuilder, GlassQueryBuilder as default }; //# sourceMappingURL=GlassQueryBuilder.js.map