UNPKG

react-antd-admin-panel

Version:

Modern TypeScript-first React admin panel builder with Ant Design 6

1 lines 7.3 kB
{"version":3,"file":"index.cjs","sources":["../src/conditional/Condition.tsx"],"sourcesContent":["import React from 'react';\nimport { BaseBuilder } from '../base/BaseBuilder';\nimport type { ComponentConfig } from '../types';\n\nexport interface ConditionConfig extends ComponentConfig {\n condition?: (data?: any) => boolean;\n fallback?: React.ReactNode;\n}\n\nexport interface ConditionItem {\n key?: string;\n condition: (data?: any) => boolean;\n content: React.ReactNode | (() => React.ReactNode);\n}\n\n/**\n * Condition - Conditional rendering builder\n * Renders content based on boolean conditions\n * \n * @example\n * // Simple condition\n * const cond = new Condition()\n * .when(() => user.isAdmin, <AdminPanel />)\n * .otherwise(<AccessDenied />);\n * \n * // Multiple conditions (switch-like)\n * const cond = new Condition()\n * .add('admin', (data) => data.role === 'admin', <AdminView />)\n * .add('user', (data) => data.role === 'user', <UserView />)\n * .default(<GuestView />);\n */\nexport class Condition extends BaseBuilder<ConditionConfig> {\n private _items: ConditionItem[] = [];\n private _default?: React.ReactNode | (() => React.ReactNode);\n private _data?: any;\n\n /**\n * Add a conditional item\n */\n add(\n key: string,\n condition: (data?: any) => boolean,\n content: React.ReactNode | (() => React.ReactNode)\n ): this {\n this._items.push({ key, condition, content });\n return this;\n }\n\n /**\n * Add a condition with content (fluent API)\n */\n when(\n condition: (data?: any) => boolean,\n content: React.ReactNode | (() => React.ReactNode)\n ): this {\n this._items.push({ condition, content });\n return this;\n }\n\n /**\n * Set default content when no conditions match\n */\n default(content: React.ReactNode | (() => React.ReactNode)): this {\n this._default = content;\n return this;\n }\n\n /**\n * Alias for default()\n */\n otherwise(content: React.ReactNode | (() => React.ReactNode)): this {\n return this.default(content);\n }\n\n /**\n * Set data to evaluate conditions against\n */\n data(value: any): this {\n this._data = value;\n return this;\n }\n\n /**\n * Check which condition matches and return its content\n */\n private _resolveContent(): React.ReactNode {\n // Find first matching condition\n for (const item of this._items) {\n if (item.condition(this._data)) {\n return typeof item.content === 'function' \n ? (item.content as () => React.ReactNode)() \n : item.content;\n }\n }\n\n // No match, return default\n if (this._default) {\n return typeof this._default === 'function'\n ? (this._default as () => React.ReactNode)()\n : this._default;\n }\n\n return null;\n }\n\n /**\n * Clear all conditions\n */\n clear(): this {\n this._items = [];\n this._default = undefined;\n return this;\n }\n\n /**\n * Get count of conditions\n */\n count(): number {\n return this._items.length;\n }\n\n /**\n * Render the matching content\n */\n render(): React.ReactNode {\n if (this._config.hidden) {\n return null;\n }\n\n return this._resolveContent();\n }\n}\n\n/**\n * ConditionGroup - Manage multiple conditions that can dynamically update\n * Useful for form-driven UIs where different sections appear based on user input\n * \n * @example\n * const group = new ConditionGroup()\n * .add('basic', (data) => data.type === 'basic', basicSection)\n * .add('advanced', (data) => data.type === 'advanced', advancedSection)\n * .checkCondition(formData); // Updates active conditions\n */\nexport class ConditionGroup extends BaseBuilder<ConditionConfig> {\n private _conditions: Map<string, ConditionItem> = new Map();\n private _activeKeys: string[] = [];\n\n /**\n * Add a named condition\n */\n add(\n key: string,\n condition: (data?: any) => boolean,\n content: React.ReactNode | (() => React.ReactNode)\n ): this {\n this._conditions.set(key, { key, condition, content });\n return this;\n }\n\n /**\n * Check conditions and update active items\n */\n checkCondition(data?: any): this {\n this._activeKeys = [];\n\n for (const [key, item] of this._conditions.entries()) {\n if (item.condition(data)) {\n this._activeKeys.push(key);\n }\n }\n\n return this;\n }\n\n /**\n * Get currently active condition keys\n */\n getActiveKeys(): string[] {\n return [...this._activeKeys];\n }\n\n /**\n * Clear all conditions\n */\n clear(): this {\n this._conditions.clear();\n this._activeKeys = [];\n return this;\n }\n\n /**\n * Render all matching conditions\n */\n render(): React.ReactNode {\n if (this._config.hidden) {\n return null;\n }\n\n return (\n <>\n {this._activeKeys.map((key, index) => {\n const item = this._conditions.get(key);\n if (!item) return null;\n\n const content = typeof item.content === 'function'\n ? (item.content as () => React.ReactNode)()\n : item.content;\n\n return <React.Fragment key={key || index}>{content}</React.Fragment>;\n })}\n </>\n );\n }\n}\n"],"names":["BaseBuilder"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+BO,MAAM,kBAAkBA,YAAAA,YAA6B;AAAA,EAArD;AAAA;AACG,kCAA0B,CAAA;AAC1B;AACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKR,IACE,KACA,WACA,SACM;AACN,SAAK,OAAO,KAAK,EAAE,KAAK,WAAW,SAAS;AAC5C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KACE,WACA,SACM;AACN,SAAK,OAAO,KAAK,EAAE,WAAW,SAAS;AACvC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAA0D;AAChE,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,SAA0D;AAClE,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAkB;AACrB,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAmC;AAEzC,eAAW,QAAQ,KAAK,QAAQ;AAC9B,UAAI,KAAK,UAAU,KAAK,KAAK,GAAG;AAC9B,eAAO,OAAO,KAAK,YAAY,aAC1B,KAAK,QAAA,IACN,KAAK;AAAA,MACX;AAAA,IACF;AAGA,QAAI,KAAK,UAAU;AACjB,aAAO,OAAO,KAAK,aAAa,aAC3B,KAAK,SAAA,IACN,KAAK;AAAA,IACX;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,CAAA;AACd,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAgB;AACd,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,SAA0B;AACxB,QAAI,KAAK,QAAQ,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,gBAAA;AAAA,EACd;AACF;AAYO,MAAM,uBAAuBA,YAAAA,YAA6B;AAAA,EAA1D;AAAA;AACG,2DAA8C,IAAA;AAC9C,uCAAwB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,IACE,KACA,WACA,SACM;AACN,SAAK,YAAY,IAAI,KAAK,EAAE,KAAK,WAAW,SAAS;AACrD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,MAAkB;AAC/B,SAAK,cAAc,CAAA;AAEnB,eAAW,CAAC,KAAK,IAAI,KAAK,KAAK,YAAY,WAAW;AACpD,UAAI,KAAK,UAAU,IAAI,GAAG;AACxB,aAAK,YAAY,KAAK,GAAG;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAA0B;AACxB,WAAO,CAAC,GAAG,KAAK,WAAW;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,YAAY,MAAA;AACjB,SAAK,cAAc,CAAA;AACnB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAA0B;AACxB,QAAI,KAAK,QAAQ,QAAQ;AACvB,aAAO;AAAA,IACT;AAEA,iEAEK,UAAA,KAAK,YAAY,IAAI,CAAC,KAAK,UAAU;AACpC,YAAM,OAAO,KAAK,YAAY,IAAI,GAAG;AACrC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,UAAU,OAAO,KAAK,YAAY,aACnC,KAAK,YACN,KAAK;AAET,4CAAQ,MAAM,UAAN,EAAmC,UAAA,QAAA,GAAf,OAAO,KAAgB;AAAA,IACrD,CAAC,EAAA,CACH;AAAA,EAEJ;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}