primeng-tri-state-checkbox
Version:
A TypeScript utility library for tri-state checkbox functionality in Angular applications
1 lines • 10.4 kB
Source Map (JSON)
{"version":3,"sources":["../src/tri-state.ts","../src/primeng-utils.ts"],"sourcesContent":["/**\n * Utility function to cycle through tri-state values: null -> true -> false -> null\n * @param currentValue - The current boolean or null value\n * @returns The next value in the tri-state cycle\n */\nexport function cycleTriState(currentValue: boolean | null): boolean | null {\n if (currentValue === null) return true;\n if (currentValue === true) return false;\n return null;\n}\n\n/**\n * Type definition for Angular FormControl with tri-state boolean values\n */\nexport interface TriStateFormControl {\n value: boolean | null;\n setValue(value: boolean | null): void;\n}\n\n/**\n * Universal tri-state function that can cycle values or update FormControls\n * @param input - Either a FormControl to update or a boolean/null value to cycle\n * @returns If input is a value, returns the next tri-state value. If input is FormControl, updates it and returns void.\n * \n * @example\n * ```typescript\n * onTriStateChange(control: any): void {\n * turnToTriState(control);\n * }\n * ```\n *\n * ```html\n * <p-checkbox\n * [value]=\"form.controls.isActive.value\"\n * inputId=\"isActive\"\n * name=\"isActive\"\n * [indeterminate]=\"form.controls.isActive.value === null\"\n * [binary]=\"true\"\n * (onChange)=\"onTriStateChange(form.controls.isActive)\" />\n * ```\n */\nexport function turnToTriState<T extends TriStateFormControl | boolean | null>(\n input: T\n): T extends TriStateFormControl ? void : boolean | null {\n // Check if input has setValue method (FormControl)\n if (input && typeof input === 'object' && 'setValue' in input && 'value' in input) {\n const formControl = input as TriStateFormControl;\n formControl.setValue(cycleTriState(formControl.value));\n return undefined as T extends TriStateFormControl ? void : boolean | null;\n }\n \n // Otherwise treat as a direct value\n return cycleTriState(input as boolean | null) as T extends TriStateFormControl ? void : boolean | null;\n}\n\n/**\n * Returns the display state for PrimeNG tri-state checkbox\n * @param value - The current tri-state value\n * @returns Object with value and indeterminate properties for PrimeNG p-checkbox\n */\nexport function getPrimeNGTriStateProps(value: boolean | null): { \n value: boolean | null; \n indeterminate: boolean;\n binary: boolean;\n} {\n return {\n value: value,\n indeterminate: value === null,\n binary: true\n };\n}\n\n/**\n * Returns the display state for tri-state checkbox\n * @param value - The current tri-state value\n * @returns Object with checked and indeterminate properties\n */\nexport function getTriStateDisplay(value: boolean | null): { checked: boolean; indeterminate: boolean } {\n return {\n checked: value === true,\n indeterminate: value === null\n };\n}\n\n/**\n * Converts a tri-state value to a string representation\n * @param value - The tri-state value\n * @returns String representation of the state\n */\nexport function triStateToString(value: boolean | null): 'true' | 'false' | 'null' {\n if (value === null) return 'null';\n return value ? 'true' : 'false';\n}\n\n/**\n * Parses a string to tri-state value\n * @param value - String representation of tri-state\n * @returns The tri-state boolean value\n */\nexport function stringToTriState(value: string): boolean | null {\n if (value === 'null' || value === '') return null;\n if (value === 'true') return true;\n if (value === 'false') return false;\n return null;\n}\n\n/**\n * Gets Tailwind CSS classes for tri-state visual feedback\n * @param value - The current tri-state value\n * @param customClasses - Optional custom classes for each state\n * @returns CSS classes string\n */\nexport function getTriStateTailwindClasses(\n value: boolean | null,\n customClasses?: {\n null?: string;\n true?: string;\n false?: string;\n }\n): string {\n const defaultClasses = {\n null: 'text-yellow-600 bg-yellow-50 border-yellow-300',\n true: 'text-green-600 bg-green-50 border-green-300',\n false: 'text-red-600 bg-red-50 border-red-300'\n };\n\n const classes = { ...defaultClasses, ...customClasses };\n\n if (value === null) return classes.null || '';\n if (value === true) return classes.true || '';\n return classes.false || '';\n}\n\n/**\n * Returns an icon class name based on tri-state value (for use with PrimeNG icons)\n * @param value - The current tri-state value\n * @param iconSet - Icon set to use ('pi' for PrimeIcons, 'fa' for FontAwesome)\n * @returns Icon class string\n */\nexport function getTriStateIcon(\n value: boolean | null,\n iconSet: 'pi' | 'fa' = 'pi'\n): string {\n if (iconSet === 'pi') {\n if (value === null) return 'pi pi-minus';\n if (value === true) return 'pi pi-check';\n return 'pi pi-times';\n } else {\n if (value === null) return 'fa fa-minus';\n if (value === true) return 'fa fa-check';\n return 'fa fa-times';\n }\n}\n","import { cycleTriState, TriStateFormControl } from './tri-state';\n\n/**\n * PrimeNG-specific tri-state checkbox utilities\n */\n\n/**\n * Event handler for PrimeNG p-checkbox onChange event\n * @param event - The PrimeNG checkbox change event\n * @param formControl - The FormControl to update\n */\nexport function handlePrimeNGTriStateChange(\n event: any,\n formControl: TriStateFormControl\n): void {\n // PrimeNG checkbox onChange event provides the new value\n const newValue = event.checked;\n \n // If it's a tri-state checkbox, we need to cycle through the states\n if (formControl.value === null && newValue === true) {\n formControl.setValue(true);\n } else if (formControl.value === true && newValue === false) {\n formControl.setValue(false);\n } else if (formControl.value === false && newValue === false) {\n formControl.setValue(null);\n } else {\n // Fallback to cycling\n formControl.setValue(cycleTriState(formControl.value));\n }\n}\n\n/**\n * Returns PrimeNG template configuration for tri-state checkbox\n * @param value - Current tri-state value\n * @param inputId - HTML input ID\n * @param name - Input name attribute\n * @returns Configuration object for PrimeNG p-checkbox\n */\nexport function getPrimeNGTriStateConfig(\n value: boolean | null,\n inputId: string,\n name: string\n) {\n return {\n value: value,\n inputId: inputId,\n name: name,\n indeterminate: value === null,\n binary: true\n };\n}\n\n/**\n * Returns the label text based on tri-state value\n * @param value - Current tri-state value\n * @param labels - Custom labels for each state\n * @returns Label text\n */\nexport function getTriStateLabel(\n value: boolean | null,\n labels?: {\n null?: string;\n true?: string;\n false?: string;\n }\n): string {\n const defaultLabels = {\n null: 'Unknown',\n true: 'Yes',\n false: 'No'\n };\n\n const finalLabels = { ...defaultLabels, ...labels };\n\n if (value === null) return finalLabels.null || '';\n if (value === true) return finalLabels.true || '';\n return finalLabels.false || '';\n}\n\n/**\n * Generates a complete PrimeNG checkbox template string\n * @param fieldName - Form control field name\n * @param config - Configuration options\n * @returns HTML template string for PrimeNG checkbox\n */\nexport function generatePrimeNGTriStateTemplate(\n fieldName: string,\n config: {\n label?: string;\n inputId?: string;\n name?: string;\n containerClasses?: string;\n labelClasses?: string;\n } = {}\n): string {\n const inputId = config.inputId || fieldName;\n const name = config.name || fieldName;\n const label = config.label || `Has ${fieldName}?`;\n const containerClasses = config.containerClasses || 'flex items-center gap-2';\n const labelClasses = config.labelClasses || 'whitespace-nowrap text-sm';\n\n return `\n<div class=\"${containerClasses}\">\n <p-checkbox\n [value]=\"form.controls.${fieldName}.value\"\n inputId=\"${inputId}\"\n name=\"${name}\"\n [indeterminate]=\"form.controls.${fieldName}.value === null\"\n [binary]=\"true\"\n (onChange)=\"turnToTriState(form.controls.${fieldName})\" />\n <label class=\"${labelClasses}\" for=\"${inputId}\">\n ${label}\n </label>\n</div>`.trim();\n}\n"],"mappings":"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","names":[]}