Skip to content

Commit eb054e5

Browse files
committed
feat: Add QFileControlRenderer component for handling file inputs
1 parent cf4031d commit eb054e5

File tree

2 files changed

+112
-1
lines changed

2 files changed

+112
-1
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<template lang="pug">
2+
//control-wrapper(v-bind="controlWrapper" :styles="styles" :isFocused="isFocused" :appliedOptions="appliedOptions")
3+
div(style="cursor: pointer")
4+
q-input(
5+
:id="control.id + '-input'"
6+
:disable="!control.enabled"
7+
:placeholder="appliedOptions.placeholder"
8+
:label="computedLabel"
9+
:model-value="control.data"
10+
:clearable="true"
11+
readonly
12+
@click="open"
13+
@update:model-value="onChangeControl"
14+
@focus="isFocused = true"
15+
@blur="isFocused = false"
16+
:style="{paddingBottom: control.errors !== '' ? 'revert-layer' : 0}"
17+
filled
18+
)
19+
template(v-slot:prepend)
20+
q-icon(name="mdi-paperclip")
21+
q-card(style="border-radius: 0")
22+
img(:src="baseUrl + '/management/identities/photo/raw?' + photoUrlQuery.params")
23+
</template>
24+
25+
<script lang="ts">
26+
import { defineComponent } from 'vue';
27+
import { useFileDialog } from '@vueuse/core'
28+
import { rendererProps, useJsonFormsControl } from '@jsonforms/vue';
29+
import { isArray, isObject, isString, iterate } from 'radash';
30+
import type { RendererProps } from '@jsonforms/vue';
31+
import type { ControlElement } from '@jsonforms/core';
32+
import { useQuasarControl } from '../util';
33+
import { ControlWrapper } from '@jsonforms/vue-vanilla';
34+
35+
const QStringControlRenderer = defineComponent({
36+
name: 'q-string-control-renderer',
37+
components: {
38+
ControlWrapper,
39+
},
40+
props: {
41+
...rendererProps<ControlElement>(),
42+
},
43+
inject: ['jsonforms'],
44+
setup(props: RendererProps<ControlElement>) {
45+
const { files, open, reset, onChange: onChangeFile } = useFileDialog({
46+
accept: 'image/*',
47+
multiple: false,
48+
directory: false,
49+
})
50+
const config = useAppConfig();
51+
52+
return {
53+
open,
54+
onChangeFile,
55+
photo: null,
56+
baseUrl: config.baseUrl,
57+
...useQuasarControl(
58+
useJsonFormsControl(props),
59+
(value) => isObject(value) ? (value as any).value : value || undefined,
60+
)
61+
}
62+
},
63+
methods: {
64+
onChangeControl(val) {
65+
console.log('val', val)
66+
debugger
67+
this.onChange([
68+
this.control?.uischema.options?.storage || 'data',
69+
val.name,
70+
].join(':'));
71+
},
72+
},
73+
async mounted() {
74+
this.onChangeFile((files) => {
75+
this.onChangeControl(files?.length ? files[0] : null);
76+
});
77+
},
78+
computed: {
79+
computedLabel() {
80+
return this.control.label === undefined ? this.control.schema.title : this.control.label;
81+
},
82+
photoUrlQuery() {
83+
const query = new URLSearchParams();
84+
const employeeNumber = (this.jsonforms as any)?.core?.data?.employeeNumber;
85+
const employeeType = (this.jsonforms as any)?.core?.data?.employeeType;
86+
87+
query.append('filters[:inetOrgPerson.employeeNumber]', employeeNumber);
88+
query.append('filters[:inetOrgPerson.employeeType]', employeeType);
89+
90+
return {
91+
params: query.toString(),
92+
employeeNumber,
93+
employeeType,
94+
};
95+
},
96+
},
97+
});
98+
export default QStringControlRenderer;
99+
100+
</script>

src/components/quasar-jsonform/controls/index.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import QArrayControlRenderer from "./QArrayControlRenderer.vue";
33
import QDateControlRenderer from "./QDateControlRenderer.vue";
44
import QNumberControlRenderer from "./QNumberControlRenderer.vue";
55
import QPasswordControlRenderer from "./QPasswordControlRenderer.vue";
6-
import { and, formatIs, isControl, isDateControl, isNumberControl, isPrimitiveArrayControl, or, rankWith, scopeEndsWith, type JsonFormsRendererRegistryEntry } from "@jsonforms/core";
6+
import QFileControlRenderer from "./QFileControlRenderer.vue";
7+
import { and, formatIs, isControl, isDateControl, isNumberControl, isPrimitiveArrayControl, optionIs, or, rankWith, scopeEndsWith, uiTypeIs, type JsonFormsRendererRegistryEntry } from "@jsonforms/core";
78

89
const QDateControlRendererEntry: JsonFormsRendererRegistryEntry = {
910
renderer: QDateControlRenderer,
@@ -30,10 +31,20 @@ export const QPasswordControlRendererEntry: JsonFormsRendererRegistryEntry = {
3031
tester: rankWith(2, or(and(isControl, formatIs('password')), scopeEndsWith('password'))),
3132
};
3233

34+
35+
export const QFileControlRendererEntry: JsonFormsRendererRegistryEntry = {
36+
renderer: QFileControlRenderer,
37+
tester: rankWith(2, or(
38+
and(isControl, optionIs('format', 'file')),
39+
and(scopeEndsWith('file')),
40+
)),
41+
};
42+
3343
export const ControlsRenderer = [
3444
QDateControlRendererEntry,
3545
QNumberControlRendererEntry,
3646
QStringControlRendererEntry,
3747
QArrayControlRendererEntry,
3848
QPasswordControlRendererEntry,
49+
QFileControlRendererEntry,
3950
];

0 commit comments

Comments
 (0)