1 | import {
|
2 | VRow, VCol, VTextField, VTextarea, VSheet, VTab, VTabItem, VIcon,
|
3 | VWindowItem,
|
4 | } from 'vuetify/lib/components';
|
5 | import {
|
6 | NumberField, IntegerField, PasswordField, PhoneField, EmailField,
|
7 | SelectField, AutocompleteField, SwitchField, CheckBoxField,
|
8 | RadioGroupField, DateField, DateTimeField, SlugField,
|
9 | HtmlField, HasuraFileField, HasuraFilesField, ApolloRemoteAutocomplete,
|
10 | ArrayField, MaskedInput, ComboboxField, BottomNavigation, TabsContainer,
|
11 | } from './components';
|
12 |
|
13 | export default {
|
14 | row: {
|
15 | component: VRow,
|
16 | childResolver: (child) => {
|
17 | const { props: childProps = {} } = child;
|
18 | const allProps = ['align-self', 'cols', 'lg', 'md', 'offset', 'offset-lg', 'offset-md', 'offset-sm', 'offset-xl', 'order', 'order-lg', 'order-md', 'order-sm', 'order-xl', 'sm', 'xl'];
|
19 | const keys = Object.keys(childProps).filter((key) => allProps.includes(key));
|
20 | const props = Object.assign({ cols: 12 }, ...keys.map((key) => ({ [key]: childProps[key] })));
|
21 |
|
22 | return !child
|
23 | ? []
|
24 | : [{
|
25 | component: VCol, type: 'col', props, children: [child],
|
26 | }];
|
27 | },
|
28 | postProcessProps: ({ props, item }) => ({ props: { ...props, item } }),
|
29 | },
|
30 | text: { component: VTextField },
|
31 | mask: {
|
32 | component: MaskedInput,
|
33 | postProcessProps: ({ props }) => ({ props, attrs: props }),
|
34 | },
|
35 | sheet: { component: VSheet },
|
36 | textArea: { component: VTextarea },
|
37 | number: { component: NumberField, postProcess: (val) => parseFloat(val) },
|
38 | int: { component: IntegerField, postProcess: (val) => parseInt(val, 10) },
|
39 | password: { component: PasswordField },
|
40 | phone: {
|
41 | component: PhoneField,
|
42 | postProcessProps: ({ props }) => ({ props, attrs: props }),
|
43 | },
|
44 | email: { component: EmailField },
|
45 | select: { component: SelectField },
|
46 | combobox: { component: ComboboxField },
|
47 | autocomplete: { component: AutocompleteField },
|
48 | switch: { component: SwitchField },
|
49 | checkbox: { component: CheckBoxField },
|
50 | radio: { component: RadioGroupField },
|
51 | date: { component: DateField, postProcessProps: ({ props }) => ({ props, attrs: props }) },
|
52 | datetime: {
|
53 | component: DateTimeField, postProcessProps: ({ props }) => ({ props, attrs: props }),
|
54 | },
|
55 | slug: {
|
56 | component: SlugField,
|
57 | postProcessProps: ({ props, item }) => ({ props: { ...props, item } }),
|
58 | },
|
59 | html: { component: HtmlField },
|
60 | file: { component: HasuraFileField },
|
61 | files: { component: HasuraFilesField },
|
62 | remote: {
|
63 | component: ApolloRemoteAutocomplete,
|
64 | methods: ['onResponse', 'onFetched'],
|
65 | postProcessProps: ({ props }) => ({ props, attrs: props }),
|
66 | },
|
67 | array: {
|
68 | component: ArrayField,
|
69 | postProcessProps: ({ props, options }) => ({ props: { ...props, $options: options } }),
|
70 | },
|
71 | tabs: {
|
72 | component: TabsContainer,
|
73 | postProcessProps: ({ props }) => ({ props, attrs: props }),
|
74 | childResolver: (child) => {
|
75 | const { props = {} } = child;
|
76 | const key = props.key || `${props.label}_${props.icon}`;
|
77 | const { tab = { class: 'pt-3' } } = props;
|
78 |
|
79 | return [
|
80 | {
|
81 | component: VTab,
|
82 | props: { key, ...props },
|
83 | children: [
|
84 | props.icon && { component: VIcon, class: { 'mr-2': true }, children: [props.icon] },
|
85 | props.label,
|
86 | ].filter((x) => !!x),
|
87 | },
|
88 | {
|
89 | component: VTabItem,
|
90 | ...tab,
|
91 | props: { key, ...tab.props },
|
92 | children: [child],
|
93 | }];
|
94 | },
|
95 | },
|
96 | bottomTabs: {
|
97 | component: BottomNavigation,
|
98 | postProcessProps: ({ props }, { renderedChildren, children }) => ({
|
99 | props: {
|
100 | ...props,
|
101 | tabs: renderedChildren.map((x, i) => !!x && children[i].children[0].props).filter((x) => !!x),
|
102 | },
|
103 | }),
|
104 | childResolver: (child) => {
|
105 | const { props = {} } = child;
|
106 | const key = props.key || `${props.label}_${props.icon}`;
|
107 | const { tab = { class: 'pt-3' } } = props;
|
108 |
|
109 | return [{
|
110 | component: VWindowItem,
|
111 | ...tab,
|
112 | props: { key, ...tab.props },
|
113 | children: [child],
|
114 | }];
|
115 | },
|
116 | },
|
117 | };
|