2024-04-15 09:17:29 +00:00
|
|
|
import Base from 'primevue/base';
|
2023-10-02 10:46:09 +00:00
|
|
|
import BaseStyle from 'primevue/base/style';
|
2024-05-08 15:58:22 +00:00
|
|
|
import PrimeVueService from 'primevue/service';
|
2024-05-13 21:57:53 +00:00
|
|
|
import { Theme, ThemeService } from 'primevue/themes';
|
2024-04-01 15:03:24 +00:00
|
|
|
import { ObjectUtils, UniqueComponentId } from 'primevue/utils';
|
2023-07-03 22:20:35 +00:00
|
|
|
import { mergeProps } from 'vue';
|
|
|
|
|
|
|
|
const BaseDirective = {
|
|
|
|
_getMeta: (...args) => [ObjectUtils.isObject(args[0]) ? undefined : args[0], ObjectUtils.getItemValue(ObjectUtils.isObject(args[0]) ? args[0] : args[1])],
|
2023-10-10 15:37:42 +00:00
|
|
|
_getConfig: (binding, vnode) => (binding?.instance?.$primevue || vnode?.ctx?.appContext?.config?.globalProperties?.$primevue)?.config,
|
2023-07-03 22:20:35 +00:00
|
|
|
_getOptionValue: (options, key = '', params = {}) => {
|
2023-07-10 09:34:48 +00:00
|
|
|
const fKeys = ObjectUtils.toFlatCase(key).split('.');
|
2023-07-03 22:20:35 +00:00
|
|
|
const fKey = fKeys.shift();
|
|
|
|
|
|
|
|
return fKey
|
|
|
|
? ObjectUtils.isObject(options)
|
2023-07-10 09:34:48 +00:00
|
|
|
? BaseDirective._getOptionValue(ObjectUtils.getItemValue(options[Object.keys(options).find((k) => ObjectUtils.toFlatCase(k) === fKey) || ''], params), fKeys.join('.'), params)
|
2023-07-03 22:20:35 +00:00
|
|
|
: undefined
|
|
|
|
: ObjectUtils.getItemValue(options, params);
|
|
|
|
},
|
|
|
|
_getPTValue: (instance = {}, obj = {}, key = '', params = {}, searchInDefaultPT = true) => {
|
2023-07-11 22:42:43 +00:00
|
|
|
const getValue = (...args) => {
|
|
|
|
const value = BaseDirective._getOptionValue(...args);
|
|
|
|
|
2023-07-17 12:31:09 +00:00
|
|
|
return ObjectUtils.isString(value) || ObjectUtils.isArray(value) ? { class: value } : value;
|
2023-07-11 22:42:43 +00:00
|
|
|
};
|
|
|
|
|
2023-09-20 11:25:33 +00:00
|
|
|
const { mergeSections = true, mergeProps: useMergeProps = false } = instance.binding?.value?.ptOptions || instance.$config?.ptOptions || {};
|
2023-10-10 15:37:42 +00:00
|
|
|
const global = searchInDefaultPT ? BaseDirective._useDefaultPT(instance, instance.defaultPT(), getValue, key, params) : undefined;
|
2023-09-05 10:18:36 +00:00
|
|
|
const self = BaseDirective._usePT(instance, BaseDirective._getPT(obj, instance.$name), getValue, key, { ...params, global: global || {} });
|
2024-01-30 14:35:32 +00:00
|
|
|
const datasets = BaseDirective._getPTDatasets(instance, key);
|
|
|
|
|
|
|
|
return mergeSections || (!mergeSections && self) ? (useMergeProps ? BaseDirective._mergeProps(instance, useMergeProps, global, self, datasets) : { ...global, ...self, ...datasets }) : { ...self, ...datasets };
|
|
|
|
},
|
|
|
|
_getPTDatasets(instance = {}, key = '') {
|
|
|
|
const datasetPrefix = 'data-pc-';
|
|
|
|
|
|
|
|
return {
|
2023-07-10 09:34:48 +00:00
|
|
|
...(key === 'root' && { [`${datasetPrefix}name`]: ObjectUtils.toFlatCase(instance.$name) }),
|
|
|
|
[`${datasetPrefix}section`]: ObjectUtils.toFlatCase(key)
|
2023-09-04 21:36:12 +00:00
|
|
|
};
|
2023-07-03 22:20:35 +00:00
|
|
|
},
|
2023-09-04 21:36:12 +00:00
|
|
|
_getPT: (pt, key = '', callback) => {
|
2023-08-17 23:51:01 +00:00
|
|
|
const getValue = (value) => {
|
|
|
|
const computedValue = callback ? callback(value) : value;
|
2023-09-05 10:18:36 +00:00
|
|
|
const _key = ObjectUtils.toFlatCase(key);
|
2023-08-17 23:51:01 +00:00
|
|
|
|
2023-09-05 10:18:36 +00:00
|
|
|
return computedValue?.[_key] ?? computedValue;
|
2023-08-17 23:51:01 +00:00
|
|
|
};
|
|
|
|
|
2023-09-20 11:48:21 +00:00
|
|
|
return pt?.hasOwnProperty('_usept')
|
2023-08-17 23:51:01 +00:00
|
|
|
? {
|
2023-09-20 11:48:21 +00:00
|
|
|
_usept: pt['_usept'],
|
2023-08-17 23:51:01 +00:00
|
|
|
originalValue: getValue(pt.originalValue),
|
|
|
|
value: getValue(pt.value)
|
|
|
|
}
|
|
|
|
: getValue(pt);
|
|
|
|
},
|
2023-09-04 23:50:32 +00:00
|
|
|
_usePT: (instance = {}, pt, callback, key, params) => {
|
2023-08-17 23:51:01 +00:00
|
|
|
const fn = (value) => callback(value, key, params);
|
|
|
|
|
|
|
|
if (pt?.hasOwnProperty('_usept')) {
|
2023-09-20 11:25:33 +00:00
|
|
|
const { mergeSections = true, mergeProps: useMergeProps = false } = pt['_usept'] || instance.$config?.ptOptions || {};
|
2023-08-17 23:51:01 +00:00
|
|
|
const originalValue = fn(pt.originalValue);
|
|
|
|
const value = fn(pt.value);
|
|
|
|
|
|
|
|
if (originalValue === undefined && value === undefined) return undefined;
|
|
|
|
else if (ObjectUtils.isString(value)) return value;
|
|
|
|
else if (ObjectUtils.isString(originalValue)) return originalValue;
|
|
|
|
|
2024-01-29 12:35:09 +00:00
|
|
|
return mergeSections || (!mergeSections && value) ? (useMergeProps ? BaseDirective._mergeProps(instance, useMergeProps, originalValue, value) : { ...originalValue, ...value }) : value;
|
2023-08-17 23:51:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return fn(pt);
|
|
|
|
},
|
2023-09-04 23:50:32 +00:00
|
|
|
_useDefaultPT: (instance = {}, defaultPT = {}, callback, key, params) => {
|
|
|
|
return BaseDirective._usePT(instance, defaultPT, callback, key, params);
|
2023-08-17 23:51:01 +00:00
|
|
|
},
|
2024-03-13 12:05:23 +00:00
|
|
|
_loadStyles: (el, binding, vnode) => {
|
|
|
|
const config = BaseDirective._getConfig(binding, vnode);
|
2024-04-15 09:17:29 +00:00
|
|
|
const useStyleOptions = { nonce: config?.csp?.nonce };
|
2024-02-19 22:53:42 +00:00
|
|
|
|
2024-04-15 09:17:29 +00:00
|
|
|
BaseDirective._loadCoreStyles(el.$instance, useStyleOptions);
|
|
|
|
BaseDirective._loadThemeStyles(el.$instance, useStyleOptions);
|
|
|
|
BaseDirective._loadScopedThemeStyles(el.$instance, useStyleOptions);
|
2024-02-19 22:53:42 +00:00
|
|
|
|
2024-04-15 09:17:29 +00:00
|
|
|
BaseDirective._themeChangeListener(() => BaseDirective._loadThemeStyles(el.$instance, useStyleOptions));
|
|
|
|
},
|
|
|
|
_loadCoreStyles(instance = {}, useStyleOptions) {
|
|
|
|
if (!Base.isStyleNameLoaded(instance.$style?.name) && instance.$style?.name) {
|
2024-05-02 22:12:36 +00:00
|
|
|
BaseStyle.loadCSS(useStyleOptions);
|
|
|
|
instance.isUnstyled() && instance.$style?.loadCSS(useStyleOptions);
|
2024-04-01 15:03:24 +00:00
|
|
|
|
2024-04-15 09:17:29 +00:00
|
|
|
Base.setLoadedStyleName(instance.$style.name);
|
|
|
|
}
|
2024-03-13 12:05:23 +00:00
|
|
|
},
|
|
|
|
_loadThemeStyles: (instance = {}, useStyleOptions) => {
|
2024-04-01 07:43:06 +00:00
|
|
|
if (instance?.isUnstyled()) return;
|
|
|
|
|
2024-03-13 12:05:23 +00:00
|
|
|
// common
|
2024-03-31 04:44:48 +00:00
|
|
|
if (!Theme.isStyleNameLoaded('common')) {
|
2024-05-14 08:35:40 +00:00
|
|
|
const { primitive, semantic } = instance.$style?.getCommonTheme?.() || {};
|
2024-03-31 04:44:48 +00:00
|
|
|
|
2024-05-14 08:35:40 +00:00
|
|
|
BaseStyle.load(primitive?.css, { name: 'primitive-variables', ...useStyleOptions });
|
|
|
|
BaseStyle.load(semantic?.css, { name: 'semantic-variables', ...useStyleOptions });
|
2024-05-02 22:12:36 +00:00
|
|
|
BaseStyle.loadTheme({ name: 'global-style', ...useStyleOptions });
|
2024-03-13 12:05:23 +00:00
|
|
|
|
2024-03-31 04:44:48 +00:00
|
|
|
Theme.setLoadedStyleName('common');
|
|
|
|
}
|
2024-03-13 12:05:23 +00:00
|
|
|
|
2024-03-31 04:44:48 +00:00
|
|
|
// directive
|
|
|
|
if (!Theme.isStyleNameLoaded(instance.$style?.name) && instance.$style?.name) {
|
2024-05-14 08:35:40 +00:00
|
|
|
const { css } = instance.$style?.getDirectiveTheme?.() || {};
|
2024-03-13 12:05:23 +00:00
|
|
|
|
2024-05-14 08:35:40 +00:00
|
|
|
instance.$style?.load(css, { name: `${instance.$style.name}-variables`, ...useStyleOptions });
|
2024-05-02 22:12:36 +00:00
|
|
|
instance.$style?.loadTheme({ name: `${instance.$style.name}-style`, ...useStyleOptions });
|
2024-03-31 04:44:48 +00:00
|
|
|
|
|
|
|
Theme.setLoadedStyleName(instance.$style.name);
|
|
|
|
}
|
2024-03-18 12:23:53 +00:00
|
|
|
|
|
|
|
// layer order
|
2024-03-31 04:44:48 +00:00
|
|
|
if (!Theme.isStyleNameLoaded('layer-order')) {
|
|
|
|
const layerOrder = instance.$style?.getLayerOrderThemeCSS?.();
|
|
|
|
|
2024-05-02 22:12:36 +00:00
|
|
|
BaseStyle.load(layerOrder, { name: 'layer-order', first: true, ...useStyleOptions });
|
2024-03-18 12:23:53 +00:00
|
|
|
|
2024-03-31 04:44:48 +00:00
|
|
|
Theme.setLoadedStyleName('layer-order');
|
|
|
|
}
|
2024-02-13 09:36:36 +00:00
|
|
|
},
|
2024-04-01 15:03:24 +00:00
|
|
|
_loadScopedThemeStyles(instance = {}, useStyleOptions) {
|
|
|
|
const preset = instance.preset();
|
|
|
|
|
|
|
|
if (preset && instance.$attrSelector) {
|
2024-05-14 08:35:40 +00:00
|
|
|
const { css } = instance.$style?.getPresetTheme?.(preset, `[${instance.$attrSelector}]`) || {};
|
|
|
|
const scopedStyle = instance.$style?.load(css, { name: `${instance.$attrSelector}-${instance.$style.name}`, ...useStyleOptions });
|
2024-04-01 15:03:24 +00:00
|
|
|
|
|
|
|
instance.scopedStyleEl = scopedStyle.el;
|
|
|
|
}
|
|
|
|
},
|
2024-04-15 09:17:29 +00:00
|
|
|
_themeChangeListener(callback = () => {}) {
|
|
|
|
Base.clearLoadedStyleNames();
|
|
|
|
ThemeService.on('theme:change', callback);
|
|
|
|
},
|
2023-07-03 22:20:35 +00:00
|
|
|
_hook: (directiveName, hookName, el, binding, vnode, prevVnode) => {
|
2023-07-10 09:34:48 +00:00
|
|
|
const name = `on${ObjectUtils.toCapitalCase(hookName)}`;
|
2023-10-10 15:37:42 +00:00
|
|
|
const config = BaseDirective._getConfig(binding, vnode);
|
2023-09-04 23:50:32 +00:00
|
|
|
const instance = el?.$instance;
|
|
|
|
const selfHook = BaseDirective._usePT(instance, BaseDirective._getPT(binding?.value?.pt, directiveName), BaseDirective._getOptionValue, `hooks.${name}`);
|
|
|
|
const defaultHook = BaseDirective._useDefaultPT(instance, config?.pt?.directives?.[directiveName], BaseDirective._getOptionValue, `hooks.${name}`);
|
2023-07-10 09:34:48 +00:00
|
|
|
const options = { el, binding, vnode, prevVnode };
|
2023-07-03 22:20:35 +00:00
|
|
|
|
2023-09-04 23:50:32 +00:00
|
|
|
selfHook?.(instance, options);
|
|
|
|
defaultHook?.(instance, options);
|
2023-07-03 22:20:35 +00:00
|
|
|
},
|
2024-01-29 12:35:09 +00:00
|
|
|
_mergeProps(instance = {}, fn, ...args) {
|
|
|
|
return ObjectUtils.isFunction(fn) ? fn(...args) : mergeProps(...args);
|
|
|
|
},
|
2023-07-03 22:20:35 +00:00
|
|
|
_extend: (name, options = {}) => {
|
|
|
|
const handleHook = (hook, el, binding, vnode, prevVnode) => {
|
2023-07-03 23:12:09 +00:00
|
|
|
el._$instances = el._$instances || {};
|
2023-07-03 22:20:35 +00:00
|
|
|
|
2023-10-10 15:37:42 +00:00
|
|
|
const config = BaseDirective._getConfig(binding, vnode);
|
2023-07-06 12:43:23 +00:00
|
|
|
const $prevInstance = el._$instances[name] || {};
|
|
|
|
const $options = ObjectUtils.isEmpty($prevInstance) ? { ...options, ...options?.methods } : {};
|
2023-07-03 22:20:35 +00:00
|
|
|
|
2023-07-03 23:12:09 +00:00
|
|
|
el._$instances[name] = {
|
2023-07-06 12:43:23 +00:00
|
|
|
...$prevInstance,
|
2023-07-03 22:20:35 +00:00
|
|
|
/* new instance variables to pass in directive methods */
|
|
|
|
$name: name,
|
|
|
|
$host: el,
|
|
|
|
$binding: binding,
|
2023-10-26 00:54:11 +00:00
|
|
|
$modifiers: binding?.modifiers,
|
|
|
|
$value: binding?.value,
|
|
|
|
$el: $prevInstance['$el'] || el || undefined,
|
2024-05-02 22:12:36 +00:00
|
|
|
$style: { classes: undefined, inlineStyles: undefined, load: () => {}, loadCSS: () => {}, loadTheme: () => {}, ...options?.style },
|
2023-08-11 01:34:02 +00:00
|
|
|
$config: config,
|
2024-04-01 15:03:24 +00:00
|
|
|
$attrSelector: el.$attrSelector,
|
2023-07-03 22:20:35 +00:00
|
|
|
/* computed instance variables */
|
2023-10-10 15:37:42 +00:00
|
|
|
defaultPT: () => BaseDirective._getPT(config?.pt, undefined, (value) => value?.directives?.[name]),
|
|
|
|
isUnstyled: () => (el.$instance?.$binding?.value?.unstyled !== undefined ? el.$instance?.$binding?.value?.unstyled : config?.unstyled),
|
2024-03-31 04:44:48 +00:00
|
|
|
theme: () => el.$instance?.$config?.theme,
|
2024-04-01 15:03:24 +00:00
|
|
|
preset: () => el.$instance?.$binding?.value?.dt,
|
2023-07-03 22:20:35 +00:00
|
|
|
/* instance's methods */
|
2023-07-06 12:43:23 +00:00
|
|
|
ptm: (key = '', params = {}) => BaseDirective._getPTValue(el.$instance, el.$instance?.$binding?.value?.pt, key, { ...params }),
|
|
|
|
ptmo: (obj = {}, key = '', params = {}) => BaseDirective._getPTValue(el.$instance, obj, key, params, false),
|
2023-10-10 15:37:42 +00:00
|
|
|
cx: (key = '', params = {}) => (!el.$instance?.isUnstyled() ? BaseDirective._getOptionValue(el.$instance?.$style?.classes, key, { ...params }) : undefined),
|
2023-10-02 10:46:09 +00:00
|
|
|
sx: (key = '', when = true, params = {}) => (when ? BaseDirective._getOptionValue(el.$instance?.$style?.inlineStyles, key, { ...params }) : undefined),
|
2023-07-03 22:20:35 +00:00
|
|
|
...$options
|
|
|
|
};
|
|
|
|
|
2023-07-06 12:43:23 +00:00
|
|
|
el.$instance = el._$instances[name]; // pass instance data to hooks
|
|
|
|
el.$instance[hook]?.(el, binding, vnode, prevVnode); // handle hook in directive implementation
|
2024-01-21 11:56:17 +00:00
|
|
|
el[`$${name}`] = el.$instance; // expose all options with $<directive_name>
|
2023-07-03 22:20:35 +00:00
|
|
|
BaseDirective._hook(name, hook, el, binding, vnode, prevVnode); // handle hooks during directive uses (global and self-definition)
|
2024-05-14 08:35:40 +00:00
|
|
|
|
|
|
|
el.$pd ||= {};
|
|
|
|
el.$pd[name] = { ...el.$pd?.[name], name, instance: el.$instance };
|
2023-07-03 22:20:35 +00:00
|
|
|
};
|
2023-06-21 13:48:00 +00:00
|
|
|
|
2024-05-08 15:58:22 +00:00
|
|
|
const handleWatch = (el) => {
|
|
|
|
const watchers = el.$instance?.watch;
|
|
|
|
|
|
|
|
// for 'config'
|
|
|
|
watchers?.['config']?.call(el.$instance, el.$instance?.$config);
|
|
|
|
PrimeVueService.on('config:change', ({ newValue, oldValue }) => watchers?.['config']?.call(el.$instance, newValue, oldValue));
|
|
|
|
|
|
|
|
// for 'config.ripple'
|
|
|
|
watchers?.['config.ripple']?.call(el.$instance, el.$instance?.$config?.ripple);
|
|
|
|
PrimeVueService.on('config:ripple:change', ({ newValue, oldValue }) => watchers?.['config.ripple']?.call(el.$instance, newValue, oldValue));
|
|
|
|
};
|
|
|
|
|
2023-06-21 13:48:00 +00:00
|
|
|
return {
|
|
|
|
created: (el, binding, vnode, prevVnode) => {
|
2023-07-03 22:20:35 +00:00
|
|
|
handleHook('created', el, binding, vnode, prevVnode);
|
2023-06-21 13:48:00 +00:00
|
|
|
},
|
|
|
|
beforeMount: (el, binding, vnode, prevVnode) => {
|
2024-04-01 15:03:24 +00:00
|
|
|
el.$attrSelector = UniqueComponentId('pd');
|
2024-03-13 12:05:23 +00:00
|
|
|
BaseDirective._loadStyles(el, binding, vnode);
|
2023-07-03 22:20:35 +00:00
|
|
|
handleHook('beforeMount', el, binding, vnode, prevVnode);
|
2024-05-08 15:58:22 +00:00
|
|
|
handleWatch(el);
|
2023-06-21 13:48:00 +00:00
|
|
|
},
|
|
|
|
mounted: (el, binding, vnode, prevVnode) => {
|
2024-03-13 12:05:23 +00:00
|
|
|
BaseDirective._loadStyles(el, binding, vnode);
|
2023-07-03 22:20:35 +00:00
|
|
|
handleHook('mounted', el, binding, vnode, prevVnode);
|
2023-06-21 13:48:00 +00:00
|
|
|
},
|
|
|
|
beforeUpdate: (el, binding, vnode, prevVnode) => {
|
2023-07-03 22:20:35 +00:00
|
|
|
handleHook('beforeUpdate', el, binding, vnode, prevVnode);
|
2023-06-21 13:48:00 +00:00
|
|
|
},
|
|
|
|
updated: (el, binding, vnode, prevVnode) => {
|
2024-04-01 07:43:06 +00:00
|
|
|
BaseDirective._loadStyles(el, binding, vnode);
|
2023-07-03 22:20:35 +00:00
|
|
|
handleHook('updated', el, binding, vnode, prevVnode);
|
2023-06-21 13:48:00 +00:00
|
|
|
},
|
|
|
|
beforeUnmount: (el, binding, vnode, prevVnode) => {
|
2023-07-03 22:20:35 +00:00
|
|
|
handleHook('beforeUnmount', el, binding, vnode, prevVnode);
|
2023-06-21 13:48:00 +00:00
|
|
|
},
|
|
|
|
unmounted: (el, binding, vnode, prevVnode) => {
|
2024-04-01 15:03:24 +00:00
|
|
|
el.$instance?.scopedStyleEl?.value?.remove();
|
2023-07-03 22:20:35 +00:00
|
|
|
handleHook('unmounted', el, binding, vnode, prevVnode);
|
2023-06-21 13:48:00 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
},
|
2023-07-03 22:20:35 +00:00
|
|
|
extend: (...args) => {
|
|
|
|
const [name, options] = BaseDirective._getMeta(...args);
|
2023-06-21 13:48:00 +00:00
|
|
|
|
2023-07-03 22:20:35 +00:00
|
|
|
return {
|
|
|
|
extend: (..._args) => {
|
|
|
|
const [_name, _options] = BaseDirective._getMeta(..._args);
|
2023-06-21 13:48:00 +00:00
|
|
|
|
2023-07-03 22:20:35 +00:00
|
|
|
return BaseDirective.extend(_name, { ...options, ...options?.methods, ..._options });
|
|
|
|
},
|
|
|
|
...BaseDirective._extend(name, options)
|
|
|
|
};
|
2023-06-21 13:48:00 +00:00
|
|
|
}
|
|
|
|
};
|
2023-07-03 22:20:35 +00:00
|
|
|
|
|
|
|
export default BaseDirective;
|