mirror of
https://github.com/primefaces/primevue.git
synced 2025-05-09 00:42:36 +00:00
Fixed #4289 - Improve usePassThrough
method
This commit is contained in:
parent
e4651a9d0c
commit
4ecc86838f
100 changed files with 317 additions and 258 deletions
|
@ -1,46 +1,17 @@
|
|||
import { ObjectUtils } from 'primevue/utils';
|
||||
import { mergeProps } from 'vue';
|
||||
|
||||
export const usePassThrough = (pt1 = {}, pt2 = {}, { merge = true, useMergeProps = false, ignoredKeysOnMerge = [], customizer = undefined } = {}) => {
|
||||
const newPT = { ...pt1 };
|
||||
|
||||
if (merge) {
|
||||
const getPTClassValue = (value) => (ObjectUtils.isString(value) || ObjectUtils.isArray(value) ? { class: value } : value);
|
||||
|
||||
const setOptionValue = (to, from, nestedKey, ignoredKey) => {
|
||||
const keys = nestedKey.split('.');
|
||||
const key = keys.shift();
|
||||
const getValue = (value) => (ObjectUtils.isFunction(customizer) ? customizer({ key, to, from, value }) : value);
|
||||
|
||||
if (!!ignoredKey && ignoredKey.endsWith(key)) {
|
||||
!!key && (to[key] = getValue(from[key]));
|
||||
} else {
|
||||
const matched = [Object.keys(to[key] || {}), Object.keys(from[key] || {})].flat().some((k) => k.match(/^(class|style|on(.+))/));
|
||||
|
||||
if (matched) {
|
||||
to[key] = getValue(useMergeProps ? mergeProps(getPTClassValue(to[key]), getPTClassValue(from[key])) : { ...getPTClassValue(to[key]), ...getPTClassValue(from[key]) });
|
||||
} else if (ObjectUtils.isNotEmpty(from[key])) {
|
||||
to[key] = { ...to[key] };
|
||||
setOptionValue(to[key], from[key], keys.join('.'), ignoredKey);
|
||||
} else if (!!key) {
|
||||
to[key] = getValue(from[key]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const nestedKeys = ObjectUtils.nestedKeys(pt2);
|
||||
|
||||
nestedKeys.forEach((nestedKey) => {
|
||||
setOptionValue(
|
||||
newPT,
|
||||
pt2,
|
||||
nestedKey,
|
||||
ignoredKeysOnMerge.find((k) => (k.indexOf('.') > 0 ? nestedKey.startsWith(k) : nestedKey.split('.')[0] === k))
|
||||
);
|
||||
});
|
||||
} else {
|
||||
Object.keys(pt2).forEach((key) => (newPT[key] = pt2[key]));
|
||||
}
|
||||
|
||||
return newPT;
|
||||
/**
|
||||
* @todo: Add dynamic params support;
|
||||
*
|
||||
* Exp;
|
||||
* usePassThrough(pt1, pt2, pt3, pt*, { merge: true });
|
||||
* usePassThrough(pt1, { merge: true });
|
||||
*/
|
||||
export const usePassThrough = (pt1 = {}, pt2 = {}, { merge = true, useMergeProps = true } = {}) => {
|
||||
return {
|
||||
_usept: {
|
||||
merge,
|
||||
useMergeProps
|
||||
},
|
||||
originalValue: pt1,
|
||||
value: pt2
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue