Skip to content

Commit

Permalink
Work for #2756 - Support Vue 3 in SurveyJS library - Added checkbox, …
Browse files Browse the repository at this point in the history
…radiogroup, signaturepad
  • Loading branch information
tsv2013 committed Dec 29, 2022
1 parent 285447d commit ef28fcf
Show file tree
Hide file tree
Showing 7 changed files with 386 additions and 1 deletion.
1 change: 0 additions & 1 deletion packages/survey-vue-ui/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -1064,7 +1064,6 @@ header {
@media (min-width: 1024px) {
header {
display: flex;
place-items: center;
padding-right: calc(var(--section-gap) / 2);
}
Expand Down
99 changes: 99 additions & 0 deletions packages/survey-vue-ui/src/Checkbox.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<template>
<fieldset :class="question.getSelectBaseRootCss()" role="presentation">
<legend role="presentation" class="sv-hidden"></legend>
<survey-checkbox-item
v-for="(item, index) in question.headItems"
v-if="question.hasHeadItems"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="'' + index"
></survey-checkbox-item>
<survey-checkbox-item
v-if="!question.hasColumns && !question.blockedRow"
v-for="(item, index) in question.bodyItems"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="index"
></survey-checkbox-item>
<div :class="question.cssClasses.rootRow" v-if="question.blockedRow">
<survey-checkbox-item
v-if="!question.hasColumns && question.blockedRow"
v-for="(item, index) in question.dataChoices"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="index"
></survey-checkbox-item>
</div>
<div
v-if="question.hasColumns"
:class="question.cssClasses.rootMultiColumn">

<div

v-for="(column, colIndex) in question.columns"
:class="question.getColumnClass()"
role="presentation"
>
<survey-checkbox-item
v-for="(item, index) in column"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="'' + colIndex + index"
></survey-checkbox-item>
</div>
</div>
<survey-checkbox-item
v-for="(item, index) in question.footItems"
v-if="question.hasFootItems"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="'' + index"
></survey-checkbox-item>
<survey-other-choice
v-if="
question.renderedValue && question.isOtherSelected
"
:question="question"
/>
</fieldset>
</template>

<script lang="ts">
import { QuestionCheckboxModel } from "survey-core";
import { defineSurveyComponent } from "./base";
export default defineSurveyComponent({
// eslint-disable-next-line
name: "survey-checkbox",
props: {
question: QuestionCheckboxModel,
css: Object,
},
data: (vm: any) => {
return {
getModel: () => { return vm.question; }
}
},
mounted() {
if (this.question) {
this.question.afterRenderQuestionElement(this.$el as HTMLElement);
}
},
unmounted() {
if (this.question) {
this.question.beforeDestroyQuestionElement(this.$el as HTMLElement);
}
}
});
</script>
52 changes: 52 additions & 0 deletions packages/survey-vue-ui/src/CheckboxItem.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<template>
<div role="presentation">
<label :class="question.getLabelClass(item)" :aria-label="question.getAriaItemLabel(item)">
<input v-if="item == question.selectAllItem" role="option" type="checkbox" :name="question.name"
:value="isAllSelected" v-model="isAllSelected" :id="question.getItemId(item)"
:disabled="!question.getItemEnabled(item)" :aria-describedby="question.ariaDescribedBy"
:class="question.cssClasses.itemControl" /><input v-if="item != question.selectAllItem" role="option"
type="checkbox" :name="question.name" :value="item.value" v-model="question.renderedValue"
:id="question.getItemId(item)" :disabled="!question.getItemEnabled(item)"
:aria-describedby="question.ariaDescribedBy" :class="question.cssClasses.itemControl" /><span
v-if="question.cssClasses.materialDecorator" :class="question.cssClasses.materialDecorator">
<svg v-if="question.itemSvgIcon" :class="question.cssClasses.itemDecorator">
<use :xlink:href="question.itemSvgIcon"></use>
</svg>
</span><span v-if="!hideLabel" :class="question.cssClasses.controlLabel">
<survey-string :locString="item.locText" />
</span>
</label>
</div>
</template>

<script lang="ts">
import { ItemValue, Base } from "survey-core";
import { defineSurveyComponent } from "./base";
export default defineSurveyComponent({
// eslint-disable-next-line
name: "survey-checkbox-item",
props: {
question: Object,
item: ItemValue,
index: Object,
hideLabel: Boolean,
},
data: (vm: any) => {
return {
getModel: () => { return vm.item; }
}
},
computed: {
isAllSelected: {
get () {
return this.question.isAllSelected || "";
},
set (val: boolean) {
this.question.isAllSelected = val;
}
}
}
});
</script>
99 changes: 99 additions & 0 deletions packages/survey-vue-ui/src/Radiogroup.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
<template>
<fieldset role="presentation" :class="question.getSelectBaseRootCss()">
<survey-radiogroup-item
v-if="!question.hasColumns && !question.blockedRow"
v-for="(item, index) in question.visibleChoices"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="index"
></survey-radiogroup-item>
<div :class="question.cssClasses.rootRow" v-if="question.blockedRow">
<survey-radiogroup-item
v-if="!question.hasColumns && question.blockedRow"
v-for="(item, index) in question.dataChoices"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="index"
></survey-radiogroup-item>
</div>
<div
v-if="question.hasColumns"
:class="question.cssClasses.rootMultiColumn">
<div
v-if="question.hasColumns"
v-for="(column, colIndex) in question.columns"
:class="question.getColumnClass()"
role="presentation"
>
<survey-radiogroup-item
v-for="(item, index) in column"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="'' + colIndex + index"
></survey-radiogroup-item>
</div>
</div>
<survey-radiogroup-item
v-for="(item, index) in question.footItems"
v-if="question.hasFootItems"
:key="item.value"
:class="question.getItemClass(item)"
:question="question"
:item="item"
:index="'' + index"
></survey-radiogroup-item>
<survey-other-choice
v-if="
question.renderedValue && question.isOtherSelected
"
:question="question"
/>
<div v-if="question.showClearButtonInContent">
<input
type="button"
:class="question.cssClasses.clearButton"
v-on:click="
() => {
question.clearValue();
}
"
:value="question.clearButtonCaption"
/></div>
</fieldset>
</template>

<script lang="ts">
import { QuestionRadiogroupModel } from "survey-core";
import { defineSurveyComponent } from "./base";
export default defineSurveyComponent({
// eslint-disable-next-line
name: "survey-radiogroup",
props: {
question: QuestionRadiogroupModel,
css: Object,
},
data: (vm: any) => {
return {
getModel: () => { return vm.question; },
}
},
mounted() {
if (this.question) {
this.question.afterRenderQuestionElement(this.$el as HTMLElement);
}
},
unmounted() {
if (this.question) {
this.question.beforeDestroyQuestionElement(this.$el as HTMLElement);
}
}
});
</script>
59 changes: 59 additions & 0 deletions packages/survey-vue-ui/src/RadiogroupItem.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<template>
<div role="presentation">
<label :class="getLabelClass(item)" :aria-label="question.getAriaItemLabel(item)">
<input
type="radio"
:name="question.questionName"
:value="item.value"
:id="question.getItemId(item)"
:aria-describedby="question.ariaDescribedBy"
v-model="question.renderedValue"
:disabled="!question.getItemEnabled(item)"
:class="question.cssClasses.itemControl"
/><span
v-if="question.cssClasses.materialDecorator"
:class="question.cssClasses.materialDecorator"
>
<svg
v-if="question.itemSvgIcon"
:class="question.cssClasses.itemDecorator"
>
<use :xlink:href="question.itemSvgIcon"></use>
</svg> </span
><span
v-if="!hideLabel"
:class="getControlLabelClass(item)"
>
<survey-string :locString="item.locText" />
</span> </label
>
</div>
</template>

<script lang="ts">
import { ItemValue, Base } from "survey-core";
import { defineSurveyComponent } from "./base";
export default defineSurveyComponent({
// eslint-disable-next-line
name: "survey-radiogroup-item",
props: {
question: Object,
item: ItemValue,
index: Object,
hideLabel: Boolean,
},
data: (vm: any) => {
return {
getModel: () => { return vm.item; },
getLabelClass: (item: any) => {
return vm.question.getLabelClass(item);
},
getControlLabelClass: (item: any) => {
return vm.question.getControlLabelClass(item);
}
}
},
});
</script>
67 changes: 67 additions & 0 deletions packages/survey-vue-ui/src/Signaturepad.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<template>
<div
:class="question.cssClasses.root"
v-bind:style="{
height: question.signatureHeight + 'px',
width: question.signatureWidth + 'px',
}"
>
<div :class="question.cssClasses.placeholder" v-show="question.needShowPlaceholder()">
{{ question.placeHolderText }}
</div>
<div>
<canvas tabindex="0"></canvas>
</div>
<div :class="question.cssClasses.controls" v-if="question.canShowClearButton">
<button
type="button"
:class="question.cssClasses.clearButton"
:title="question.clearButtonCaption"
v-on:click="
() => {
question.clearValue();
}
"
>
<span v-if="!question.cssClasses.clearButtonIconId">✖</span>
<sv-svg-icon
v-if="question.cssClasses.clearButtonIconId"
:iconName="question.cssClasses.clearButtonIconId"
:size="'auto'"
></sv-svg-icon>
</button>
</div>
</div>
</template>

<script lang="ts">
import { QuestionSignaturePadModel } from "survey-core";
import { defineSurveyComponent } from "./base";
export default defineSurveyComponent({
// eslint-disable-next-line
name: "survey-signaturepad",
props: {
question: QuestionSignaturePadModel,
css: Object,
},
data: (vm: any) => {
return {
getModel: () => { return vm.question; },
}
},
computed: {
},
mounted() {
if (this.question) {
this.question.afterRenderQuestionElement(this.$el as HTMLElement);
}
},
unmounted() {
if (this.question) {
this.question.beforeDestroyQuestionElement(this.$el as HTMLElement);
}
}
});
</script>
Loading

0 comments on commit ef28fcf

Please sign in to comment.