Skip to content

Commit 8b138b3

Browse files
Merge pull request #16 from webdevnerdstuff/dev
Dev
2 parents 217499d + d01effc commit 8b138b3

File tree

8 files changed

+213
-23
lines changed

8 files changed

+213
-23
lines changed

src/documentation/components/examples/ButtonsFieldExample.vue

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,18 @@ const buttonAlignOptions = [
211211
title: 'End',
212212
value: 'end',
213213
},
214+
{
215+
title: 'Space Between',
216+
value: 'space-between',
217+
},
218+
{
219+
title: 'Space Around',
220+
value: 'space-around',
221+
},
222+
{
223+
title: 'Space Evenly',
224+
value: 'space-evenly',
225+
},
214226
];
215227
const buttonBlock = ref(false);
216228
const buttonDensityModel = ref('default' as const);

src/plugin/VStepperForm.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ import {
174174
import {
175175
useBuildSettings,
176176
useColumnErrorCheck,
177-
useMergeProps,
177+
useDeepMerge,
178178
} from './composables/helpers';
179179
import componentEmits from './utils/emits';
180180
import { AllProps } from './utils/props';
@@ -190,7 +190,7 @@ const injectedOptions = inject(globalOptions, {});
190190
191191
// -------------------------------------------------- Props //
192192
const props = withDefaults(defineProps<Props>(), AllProps);
193-
let stepperProps: Settings = reactive<Settings>(useMergeProps(attrs, injectedOptions, props));
193+
let stepperProps: Settings = reactive<Settings>(useDeepMerge(attrs, injectedOptions, props));
194194
const { direction, title, width } = toRefs(props);
195195
const pages = reactive<Page[]>(props.pages);
196196
const originalPages = JSON.parse(JSON.stringify(pages));
@@ -208,7 +208,7 @@ const stepperSettings = computed(() => useBindingSettings(settings.value as Part
208208
]));
209209
210210
watch(props, () => {
211-
stepperProps = useMergeProps(attrs, injectedOptions, props);
211+
stepperProps = useDeepMerge(attrs, injectedOptions, props);
212212
settings.value = useBuildSettings(stepperProps);
213213
}, { deep: true });
214214

src/plugin/components/fields/VSFButtonField/VSFButtonField.vue

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@
3131
<v-item
3232
v-for="option, key in field?.options"
3333
:key="option.value"
34-
:class="{
35-
'vsf-button-field__stacked': field?.stacked,
36-
}"
3734
>
3835
<template #default>
3936
<v-btn
@@ -48,6 +45,7 @@
4845
[`${field.selectedClass}`]: isActive(option.value),
4946
}"
5047
:color="option?.color || field?.color || settings?.color"
48+
data-test-id="vsf-button-field"
5149
:density="fieldDensity"
5250
:height="getHeight(option)"
5351
:icon="getIcon(option, 'icon')"
@@ -360,7 +358,8 @@ const buttontextcolor = ref('rgb(var(--v-theme-on-surface))');
360358
// -------------------------------------------------- Classes //
361359
const itemGroupClass = computed(() => {
362360
return {
363-
[`align-${field?.align}`]: field?.align != null,
361+
[`align-${field?.align}`]: field?.align != null && field?.block,
362+
[`justify-${field?.align}`]: field?.align != null && !field?.block,
364363
'd-flex': true,
365364
'flex-column': field?.block,
366365
[`ga-${gap.value}`]: !containsSizeUnit(gap.value),
Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,46 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3-
exports[`Classes Composable > useContainerClasses > should return class object 1`] = `
3+
exports[`Classes Composable > useColumnClasses > should return column classes with fieldColumns being the higher priority 1`] = `
4+
{
5+
"v-col-12": true,
6+
"v-col-lg-6": true,
7+
"v-col-md-6": true,
8+
"v-col-sm-10": true,
9+
"v-col-xl-9": true,
10+
"v-cols": true,
11+
}
12+
`;
13+
14+
exports[`Classes Composable > useContainerClasses > should return class object with direction horizontal 1`] = `
15+
{
16+
"d-flex flex-column justify-center align-center": true,
17+
"v-stepper-form": true,
18+
"v-stepper-form--container": true,
19+
"v-stepper-form--container-horizontal": true,
20+
}
21+
`;
22+
23+
exports[`Classes Composable > useContainerClasses > should return class object with direction vertical 1`] = `
424
{
525
"d-flex flex-column justify-center align-center": false,
626
"v-stepper-form": true,
727
"v-stepper-form--container": true,
8-
"v-stepper-form--container-undefined": true,
28+
"v-stepper-form--container-vertical": true,
29+
}
30+
`;
31+
32+
exports[`Classes Composable > useStepperContainerClasses > should return class object with direction horizontal 1`] = `
33+
{
34+
"d-flex flex-column justify-center align-center": true,
35+
"v-stepper-form--container-stepper": true,
36+
"v-stepper-form--container-stepper-horizontal": true,
37+
}
38+
`;
39+
40+
exports[`Classes Composable > useStepperContainerClasses > should return class object with direction vertical 1`] = `
41+
{
42+
"d-flex flex-column justify-center align-center": false,
43+
"v-stepper-form--container-stepper": true,
44+
"v-stepper-form--container-stepper-vertical": true,
945
}
1046
`;

src/plugin/composables/__tests__/classes.test.ts

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,67 @@
11
import { describe, it, expect } from 'vitest';
22
import {
3-
useContainerClasses
3+
useColumnClasses,
4+
useContainerClasses,
5+
useStepperContainerClasses,
46
} from '../classes';
57

68

79
describe('Classes Composable', () => {
810

911
describe('useContainerClasses', () => {
10-
it('should return class object', () => {
12+
it('should return class object with direction horizontal', () => {
1113
const classes = useContainerClasses({
12-
isOption: true,
14+
direction: 'horizontal',
15+
});
16+
17+
expect(classes).toMatchSnapshot();
18+
});
19+
20+
it('should return class object with direction vertical', () => {
21+
const classes = useContainerClasses({
22+
direction: 'vertical',
23+
});
24+
25+
expect(classes).toMatchSnapshot();
26+
});
27+
});
28+
29+
describe('useStepperContainerClasses', () => {
30+
it('should return class object with direction horizontal', () => {
31+
const classes = useStepperContainerClasses({
32+
direction: 'horizontal',
33+
});
34+
35+
expect(classes).toMatchSnapshot();
36+
});
37+
38+
it('should return class object with direction vertical', () => {
39+
const classes = useStepperContainerClasses({
40+
direction: 'vertical',
41+
});
42+
43+
expect(classes).toMatchSnapshot();
44+
});
45+
});
46+
47+
describe('useColumnClasses', () => {
48+
it('should return column classes with fieldColumns being the higher priority', () => {
49+
const columnsMerged = {
50+
lg: 12,
51+
md: 12,
52+
sm: 10,
53+
xl: 9,
54+
};
55+
56+
const fieldColumns = {
57+
lg: 6,
58+
md: 6,
59+
};
60+
61+
const classes = useColumnClasses({
62+
columnsMerged,
63+
fieldColumns,
64+
propName: 'foo field',
1365
});
1466

1567
expect(classes).toMatchSnapshot();

src/plugin/composables/__tests__/helpers.test.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { describe, it, expect } from 'vitest';
22
import {
33
useColumnErrorCheck,
4+
useDeepMerge,
45
} from '../helpers';
56

67
describe('Helpers Composable', () => {
@@ -35,4 +36,79 @@ describe('Helpers Composable', () => {
3536
});
3637
});
3738
});
39+
40+
describe('useDeepMerge', () => {
41+
it('should deep merge 3 objects', () => {
42+
43+
const attrs = { class: 'foo-class' };
44+
45+
const injectedOptions = {
46+
autoPage: false,
47+
autoPageDelay: 1000,
48+
color: 'primary',
49+
density: 'compact',
50+
fieldColumns: {
51+
lg: 12,
52+
md: 12,
53+
sm: 6,
54+
},
55+
summaryColumns: {
56+
md: 12,
57+
sm: 6,
58+
},
59+
zed: {
60+
foo: {
61+
bar: 'baz',
62+
qux: 'qux',
63+
},
64+
},
65+
};
66+
67+
const props = {
68+
autoPage: true,
69+
autoPageDelay: 250,
70+
color: 'secondary',
71+
density: 'default',
72+
fieldColumns: {
73+
md: 6,
74+
sm: 12,
75+
},
76+
summaryColumns: {
77+
md: 6,
78+
sm: 12,
79+
},
80+
zed: {
81+
foo: {
82+
bar: 'biz',
83+
},
84+
},
85+
};
86+
87+
const mergedProps = useDeepMerge(attrs, injectedOptions, props);
88+
89+
expect(mergedProps)
90+
.toEqual({
91+
autoPage: true,
92+
autoPageDelay: 250,
93+
class: 'foo-class',
94+
color: 'secondary',
95+
density: 'default',
96+
fieldColumns: {
97+
lg: 12,
98+
md: 6,
99+
sm: 12,
100+
},
101+
summaryColumns: {
102+
md: 6,
103+
sm: 12,
104+
},
105+
zed: {
106+
foo: {
107+
bar: 'biz',
108+
qux: 'qux',
109+
},
110+
},
111+
});
112+
});
113+
});
38114
});

src/plugin/composables/helpers.ts

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,38 @@
1+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
12
import { watchDebounced } from '@vueuse/core';
23
import {
34
UseAutoPage,
45
UseBuildSettings,
56
UseColumnErrorCheck,
6-
UseMergeProps,
7+
UseDeepMerge,
78
} from '@/plugin/types';
89

910

1011
/**
1112
* Merges props from three objects.
1213
*/
13-
export const useMergeProps: UseMergeProps = (A, B, C) => {
14-
const res: Record<string, any> = {};
15-
16-
Object.keys({ ...A, ...B, ...C }).map(key => {
17-
res[key] = (C[key] ?? B[key] ?? A[key]) as any;
18-
});
14+
type AnyObject = Record<string, any>;
15+
16+
export const useDeepMerge: UseDeepMerge = (A, B, C) => {
17+
const deepMerge = (obj1: AnyObject, obj2: AnyObject): AnyObject => {
18+
const result: AnyObject = { ...obj1 };
19+
for (const key in obj2) {
20+
if (
21+
obj2[key] &&
22+
typeof obj2[key] === 'object' &&
23+
!Array.isArray(obj2[key])
24+
) {
25+
result[key] = deepMerge(result[key] ?? {}, obj2[key]);
26+
}
27+
else {
28+
result[key] = obj2[key];
29+
}
30+
}
31+
return result;
32+
};
1933

20-
return res;
34+
// Merge A, B, and C with priority order C > B > A
35+
return deepMerge(deepMerge(A, B), C);
2136
};
2237

2338

src/plugin/types/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,11 @@ export interface UseBuildSettings {
257257
): Settings;
258258
}
259259
// ------------------------- Helpers //
260-
export interface UseMergeProps {
260+
export interface UseDeepMerge {
261261
(
262262
A: Record<string, any>,
263-
B: PluginOptions,
264-
C: Props
263+
B: Record<string, any>,
264+
C: Record<string, any>
265265
): Record<string, any>;
266266
}
267267

0 commit comments

Comments
 (0)