react-antd-admin-panel
Version:
Modern TypeScript-first React admin panel builder with Ant Design 6
1 lines • 7.57 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../src/formula/Formula.ts"],"sourcesContent":["import type { Post } from '../http/Post';\r\nimport type { Action } from '../action/Action';\r\n\r\n/**\r\n * Value entry tracked by Formula\r\n */\r\nexport interface FormulaValue<T = unknown> {\r\n /** Current value */\r\n value: T;\r\n /** Reset callback to clear the field */\r\n reset?: () => void;\r\n}\r\n\r\n/**\r\n * Callbacks for Formula lifecycle\r\n */\r\nexport interface FormulaCallbacks<R = unknown> {\r\n /** Called when submission completes successfully */\r\n onComplete?: (result: R) => void;\r\n /** Called when submission fails */\r\n onError?: (error: Error) => void;\r\n /** Called after submission finishes (success or error) */\r\n onFinally?: () => void;\r\n}\r\n\r\n/**\r\n * Formula - Form value collection and submission manager\r\n * \r\n * Collects values from form controls registered via `value()` method,\r\n * and submits them via a Post model when `submit()` is called.\r\n * \r\n * @typeParam T - Type of the collected form data\r\n * @typeParam R - Type of the response from Post\r\n * \r\n * @example\r\n * ```typescript\r\n * const formula = new Formula<UserInput, User>(\r\n * new Post<UserInput, User>()\r\n * .target('/api/users')\r\n * .onThen((user) => console.log('Created:', user.id))\r\n * );\r\n * \r\n * // Register values from form controls\r\n * formula.value('name', 'John');\r\n * formula.value('email', 'john@example.com');\r\n * \r\n * // Get all collected values\r\n * const data = formula.params(); // { name: 'John', email: 'john@example.com' }\r\n * \r\n * // Submit the form\r\n * await formula.submit();\r\n * ```\r\n */\r\nexport class Formula<T extends Record<string, unknown> = Record<string, unknown>, R = unknown> {\r\n private _values: Map<string, FormulaValue> = new Map();\r\n private _post: Post<T, R>;\r\n private _action: Action | null = null;\r\n private _callbacks: FormulaCallbacks<R> = {};\r\n private _isSubmitting = false;\r\n\r\n constructor(post: Post<T, R>) {\r\n this._post = post;\r\n }\r\n\r\n /**\r\n * Register or update a value in the formula\r\n * @param key - Field key\r\n * @param value - Field value\r\n * @param reset - Optional reset callback\r\n */\r\n value<K extends keyof T>(key: K, value: T[K], reset?: () => void): this {\r\n this._values.set(key as string, { value, reset });\r\n return this;\r\n }\r\n\r\n /**\r\n * Get a single value by key\r\n */\r\n get<K extends keyof T>(key: K): T[K] | undefined {\r\n return this._values.get(key as string)?.value as T[K] | undefined;\r\n }\r\n\r\n /**\r\n * Check if a value is registered\r\n */\r\n has(key: keyof T): boolean {\r\n return this._values.has(key as string);\r\n }\r\n\r\n /**\r\n * Remove a value from the formula\r\n */\r\n remove(key: keyof T): this {\r\n this._values.delete(key as string);\r\n return this;\r\n }\r\n\r\n /**\r\n * Get all collected values as an object\r\n */\r\n params(): Partial<T> {\r\n const result: Record<string, unknown> = {};\r\n this._values.forEach((entry, key) => {\r\n result[key] = entry.value;\r\n });\r\n return result as Partial<T>;\r\n }\r\n\r\n /**\r\n * Reset all registered values\r\n */\r\n reset(): this {\r\n this._values.forEach((entry) => {\r\n entry.reset?.();\r\n });\r\n this._values.clear();\r\n return this;\r\n }\r\n\r\n /**\r\n * Link an action to this formula\r\n */\r\n action(action: Action): this {\r\n this._action = action;\r\n return this;\r\n }\r\n\r\n /**\r\n * Get the linked action\r\n */\r\n getAction(): Action | null {\r\n return this._action;\r\n }\r\n\r\n /**\r\n * Get the Post model\r\n */\r\n getPost(): Post<T, R> {\r\n return this._post;\r\n }\r\n\r\n /**\r\n * Set callback for successful completion\r\n */\r\n onComplete(callback: (result: R) => void): this {\r\n this._callbacks.onComplete = callback;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set callback for errors\r\n */\r\n onError(callback: (error: Error) => void): this {\r\n this._callbacks.onError = callback;\r\n return this;\r\n }\r\n\r\n /**\r\n * Set callback for finally (always runs)\r\n */\r\n onFinally(callback: () => void): this {\r\n this._callbacks.onFinally = callback;\r\n return this;\r\n }\r\n\r\n /**\r\n * Check if formula is currently submitting\r\n */\r\n isSubmitting(): boolean {\r\n return this._isSubmitting;\r\n }\r\n\r\n /**\r\n * Submit the formula via Post\r\n * @param additionalData - Additional data to merge with form values\r\n */\r\n async submit(additionalData?: Partial<T>): Promise<R | undefined> {\r\n if (this._isSubmitting) {\r\n return undefined;\r\n }\r\n\r\n this._isSubmitting = true;\r\n\r\n try {\r\n // Merge form values with additional data\r\n const body = {\r\n ...this.params(),\r\n ...additionalData,\r\n } as T;\r\n\r\n // Set body on Post and execute\r\n this._post.body(body);\r\n const result = await this._post.execute();\r\n\r\n // Call success callbacks\r\n this._callbacks.onComplete?.(result);\r\n this._action?.callComplete?.(result);\r\n\r\n return result;\r\n } catch (error) {\r\n const err = error instanceof Error ? error : new Error(String(error));\r\n \r\n // Call error callbacks\r\n this._callbacks.onError?.(err);\r\n this._action?.callError?.(err);\r\n\r\n throw err;\r\n } finally {\r\n this._isSubmitting = false;\r\n this._callbacks.onFinally?.();\r\n }\r\n }\r\n}\r\n\r\nexport default Formula;"],"names":[],"mappings":";;;;;AAqDO,MAAM,QAAkF;AAAA,EAO7F,YAAY,MAAkB;AANtB,uDAAyC,IAAA;AACzC;AACA,mCAAyB;AACzB,sCAAkC,CAAA;AAClC,yCAAgB;AAGtB,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAyB,KAAQ,OAAa,OAA0B;AACtE,SAAK,QAAQ,IAAI,KAAe,EAAE,OAAO,OAAO;AAChD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,IAAuB,KAA0B;;AAC/C,YAAO,UAAK,QAAQ,IAAI,GAAa,MAA9B,mBAAiC;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAuB;AACzB,WAAO,KAAK,QAAQ,IAAI,GAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAoB;AACzB,SAAK,QAAQ,OAAO,GAAa;AACjC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAqB;AACnB,UAAM,SAAkC,CAAA;AACxC,SAAK,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AACnC,aAAO,GAAG,IAAI,MAAM;AAAA,IACtB,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,QAAQ,QAAQ,CAAC,UAAU;;AAC9B,kBAAM,UAAN;AAAA,IACF,CAAC;AACD,SAAK,QAAQ,MAAA;AACb,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAsB;AAC3B,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAqC;AAC9C,SAAK,WAAW,aAAa;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAAwC;AAC9C,SAAK,WAAW,UAAU;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,UAA4B;AACpC,SAAK,WAAW,YAAY;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,gBAAqD;;AAChE,QAAI,KAAK,eAAe;AACtB,aAAO;AAAA,IACT;AAEA,SAAK,gBAAgB;AAErB,QAAI;AAEF,YAAM,OAAO;AAAA,QACX,GAAG,KAAK,OAAA;AAAA,QACR,GAAG;AAAA,MAAA;AAIL,WAAK,MAAM,KAAK,IAAI;AACpB,YAAM,SAAS,MAAM,KAAK,MAAM,QAAA;AAGhC,uBAAK,YAAW,eAAhB,4BAA6B;AAC7B,uBAAK,YAAL,mBAAc,iBAAd,4BAA6B;AAE7B,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAGpE,uBAAK,YAAW,YAAhB,4BAA0B;AAC1B,uBAAK,YAAL,mBAAc,cAAd,4BAA0B;AAE1B,YAAM;AAAA,IACR,UAAA;AACE,WAAK,gBAAgB;AACrB,uBAAK,YAAW,cAAhB;AAAA,IACF;AAAA,EACF;AACF;;"}