mirror of
https://git.meshkee.com/cssd/cssd-back.git
synced 2026-10-13 03:11:06 +03:30
419 lines
13 KiB
Vue
419 lines
13 KiB
Vue
<template>
|
|
<v-form ref="form">
|
|
<v-container grid-list-xs>
|
|
<material-card color="black" title="Add a New Test" class>
|
|
<v-layout row wrap class="ma-2">
|
|
<v-flex xs12 md3 sm3>
|
|
<v-text-field
|
|
name="name"
|
|
v-model="form.name"
|
|
label="Name"
|
|
color="black"
|
|
class="pa-2"
|
|
:rules="[rules.required]"
|
|
></v-text-field>
|
|
</v-flex>
|
|
<v-flex xs12 md3 sm3>
|
|
<v-text-field
|
|
:rules="[rules.required]"
|
|
name="uniquecode"
|
|
v-model="form.unique_code"
|
|
label="Unique Code"
|
|
color="black"
|
|
class="pa-2"
|
|
></v-text-field>
|
|
</v-flex>
|
|
</v-layout>
|
|
<v-layout
|
|
row
|
|
wrap
|
|
class="pb-4 ma-2 WM-Border WM-Border-Gray WM-BG-White WM-Relative"
|
|
:key="keyForm"
|
|
v-for="(info, keyForm) in form.info"
|
|
>
|
|
<v-layout row wrap class="ma-2">
|
|
<v-flex xs12 md3 sm3>
|
|
<v-text-field
|
|
name="inputname"
|
|
v-model="info.name"
|
|
label="Input Name"
|
|
color="black"
|
|
class="pa-2"
|
|
:rules="[rules.required]"
|
|
></v-text-field>
|
|
</v-flex>
|
|
<v-flex xs12 md3 sm3>
|
|
<v-select
|
|
:items="type"
|
|
item-text="state"
|
|
item-value="abbr"
|
|
label="Type"
|
|
v-model="info.type"
|
|
single-line
|
|
color="black"
|
|
class="pa-2"
|
|
@change="changeType(keyForm, info.type)"
|
|
></v-select>
|
|
</v-flex>
|
|
<!-- Text Input Section -->
|
|
<v-flex xs12 md3 sm3>
|
|
<v-select
|
|
:items="size"
|
|
item-text="state"
|
|
item-value="abbr"
|
|
label="Type"
|
|
v-model="info.size"
|
|
single-line
|
|
color="black"
|
|
class="pa-2"
|
|
></v-select>
|
|
</v-flex>
|
|
</v-layout>
|
|
<!-- SelectBox Section -->
|
|
<v-layout
|
|
class="ma-3 pa-3 WM-Border WM-Border-Black WM-Relative WM-Width-Full"
|
|
row
|
|
wrap
|
|
v-if="info.type === 'Select' || info.type === 'Checkbox'"
|
|
>
|
|
<v-layout row wrap class="WM-Relative WM-Width-Full" v-if="info['options'].length > 0">
|
|
<v-flex
|
|
xs12
|
|
md3
|
|
sm3
|
|
v-for="(selectbox , keySelect) in info['options']"
|
|
:key="keySelect"
|
|
class="pb-4 ma-2 WM-Border WM-Border-Gray WM-BG-White WM-Width-Full WM-Relative"
|
|
>
|
|
<v-text-field
|
|
:rules="[rules.required]"
|
|
name="title"
|
|
label="Title"
|
|
color="black"
|
|
class="pa-2 Input"
|
|
v-model="selectbox.title"
|
|
></v-text-field>
|
|
<v-btn
|
|
absolute
|
|
small
|
|
right
|
|
bottom
|
|
color="pink"
|
|
v-if="keySelect >= 1"
|
|
@click="removeSelectbox(keyForm, keySelect)"
|
|
>
|
|
<v-icon class="white--text mr-2 caption">fas fa-times</v-icon>REMOVE
|
|
</v-btn>
|
|
</v-flex>
|
|
</v-layout>
|
|
<v-btn
|
|
absolute
|
|
right
|
|
bottom
|
|
small
|
|
@click="addSelectbox(keyForm)"
|
|
color="black"
|
|
class="mb-2"
|
|
>
|
|
<v-icon class="white--text mr-2 caption">fas fa-plus</v-icon>
|
|
<span class="white--text">Add</span>
|
|
</v-btn>
|
|
</v-layout>
|
|
<!-- Form Section -->
|
|
<v-layout
|
|
row
|
|
wrap
|
|
v-if="info.type === 'Form'"
|
|
class="pa-3 my-4 mx-3 WM-Border WM-Border-Black WM-Relative"
|
|
>
|
|
<v-layout
|
|
row
|
|
wrap
|
|
v-for="(children , keychildren) in info.children"
|
|
:key="keychildren"
|
|
class="pa-3 my-4 mx-3 WM-Border WM-Border-Gray WM-Color-LightGrey WM-Width-Full WM-Relative Form"
|
|
>
|
|
<v-flex xs12 md3 sm3>
|
|
<v-text-field
|
|
:rules="[rules.required]"
|
|
name="name"
|
|
v-model="children.name"
|
|
label="Input Name"
|
|
color="black"
|
|
class="pa-2"
|
|
></v-text-field>
|
|
</v-flex>
|
|
<v-flex xs12 md3 sm3>
|
|
<v-select
|
|
:items="type"
|
|
item-text="state"
|
|
item-value="abbr"
|
|
label="Type"
|
|
v-model="children.type"
|
|
single-line
|
|
color="black"
|
|
class="pa-2"
|
|
@change="changeTypeForm(keyForm, children.type, keychildren)"
|
|
></v-select>
|
|
</v-flex>
|
|
<v-flex xs12 md3 sm3>
|
|
<v-select
|
|
:items="size"
|
|
item-text="state"
|
|
item-value="abbr"
|
|
label="Type"
|
|
v-model="children.size"
|
|
single-line
|
|
color="black"
|
|
class="pa-2"
|
|
></v-select>
|
|
</v-flex>
|
|
<!-- Inner Form Selectbox Section -->
|
|
<v-layout
|
|
row
|
|
wrap
|
|
class="pa-3 mb-3 WM-Border WM-Border-Black WM-Relative WM-Width-Full"
|
|
v-if="children.type === 'Select' || children.type === 'Checkbox'"
|
|
>
|
|
<v-layout
|
|
row
|
|
wrap
|
|
class="WM-Relative WM-Width-Full"
|
|
v-if="children['options'].length > 0"
|
|
>
|
|
<v-flex
|
|
xs12
|
|
md3
|
|
sm3
|
|
v-for="(selectbox , keySelect) in children['options']"
|
|
:key="keySelect"
|
|
class="pb-4 ma-2 WM-Border WM-Border-Gray WM-BG-White WM-Width-Full WM-Relative"
|
|
>
|
|
<v-text-field
|
|
name="title"
|
|
label="Title"
|
|
color="black"
|
|
class="pa-2 Input"
|
|
v-model="selectbox.title"
|
|
:rules="[rules.required]"
|
|
></v-text-field>
|
|
<v-btn
|
|
absolute
|
|
small
|
|
right
|
|
bottom
|
|
color="pink"
|
|
@click="removeSelectboxForm(keyForm, keySelect, keychildren)"
|
|
v-if="keySelect >= 1"
|
|
>
|
|
<v-icon class="white--text mr-2 caption">fas fa-times</v-icon>REMOVE
|
|
</v-btn>
|
|
</v-flex>
|
|
</v-layout>
|
|
<v-btn
|
|
absolute
|
|
right
|
|
bottom
|
|
small
|
|
@click="addSelectboxForm(keyForm, keychildren)"
|
|
color="black"
|
|
>
|
|
<v-icon class="white--text mr-2 caption">fas fa-plus</v-icon>
|
|
<span class="white--text">Add</span>
|
|
</v-btn>
|
|
</v-layout>
|
|
<v-btn
|
|
absolute
|
|
small
|
|
right
|
|
top
|
|
color="pink"
|
|
@click="removeForm(keyForm, keychildren)"
|
|
>
|
|
<v-icon class="white--text mr-2 caption">fas fa-times</v-icon>REMOVE
|
|
</v-btn>
|
|
</v-layout>
|
|
<v-btn absolute small right bottom color="cyan" @click="duplicateForm(keyForm)">
|
|
<v-icon class="white--text mr-2 caption">fas fa-plus</v-icon>ADD
|
|
</v-btn>
|
|
</v-layout>
|
|
<v-btn v-if="keyForm > 0" absolute small right top color="pink" @click="removeInput(keyForm)">
|
|
<v-icon class="white--text mr-2 caption">fas fa-times</v-icon>REMOVE
|
|
</v-btn>
|
|
<v-layout
|
|
row
|
|
wrap
|
|
align-center
|
|
justify-center
|
|
class="mt-4"
|
|
v-if="(form.info.length -1) == keyForm"
|
|
>
|
|
<v-btn absolute right bottom small @click="addInput" color="pink" class="mb-2">
|
|
<v-icon class="white--text mr-2 caption">fas fa-plus</v-icon>
|
|
<span class="white--text">Add</span>
|
|
</v-btn>
|
|
</v-layout>
|
|
</v-layout>
|
|
|
|
<v-layout row wrap align-center justify-center class="mt-4">
|
|
<v-btn class="WM-CyanBlueGradient-BG" style="padding:10px 60px" @click="registerForm">
|
|
<v-icon class="white--text mr-2 caption">fas fa-check</v-icon>
|
|
<span class="white--text">Generate Form</span>
|
|
</v-btn>
|
|
<router-link to="/dashboard">
|
|
<v-btn class="WM-NoShadow WM-Outline-Btn WM-Border WM-Border-Black ml-5">
|
|
<v-icon class="black--text mr-2 caption">fas fa-chevron-left</v-icon>
|
|
<span class="black--text">Back</span>
|
|
</v-btn>
|
|
</router-link>
|
|
</v-layout>
|
|
</material-card>
|
|
</v-container>
|
|
</v-form>
|
|
</template>
|
|
<script>
|
|
import { ApiService } from "@/services";
|
|
export default {
|
|
data() {
|
|
return {
|
|
form: {
|
|
name: "",
|
|
unique_code: "",
|
|
info: [
|
|
{
|
|
id: 0,
|
|
name: "",
|
|
type: "",
|
|
size: ""
|
|
}
|
|
]
|
|
},
|
|
type: [
|
|
{ state: "Text", abbr: "Text" },
|
|
{ state: "Checkbox", abbr: "Checkbox" },
|
|
{ state: "Select", abbr: "Select" },
|
|
{ state: "Form", abbr: "Form" }
|
|
],
|
|
size: [
|
|
{ state: "not Selected", abbr: "" },
|
|
{ state: "2 as 12", abbr: "col-md-2" },
|
|
{ state: "3 as 12", abbr: "col-md-3" },
|
|
{ state: "4 as 12", abbr: "col-md-4" },
|
|
{ state: "6 as 12", abbr: "col-md-6" },
|
|
{ state: "8 as 12", abbr: "col-md-8" },
|
|
{ state: "10 as 12", abbr: "col-md-10" }
|
|
],
|
|
rules: {
|
|
required: value => !!value || "Required."
|
|
}
|
|
};
|
|
},
|
|
methods: {
|
|
changeType(infoIndex, selectedboxType) {
|
|
if (selectedboxType == "Select" || selectedboxType == "Checkbox") {
|
|
this.form.info[infoIndex]["options"] = [{ title: "" }];
|
|
} else {
|
|
this.form.info[infoIndex]["options"] = [];
|
|
}
|
|
if (selectedboxType == "Form") {
|
|
this.form.info[infoIndex]["children"] = [
|
|
{ id: 0, name: "", type: "", size: "" }
|
|
];
|
|
}
|
|
},
|
|
removeSelectbox(infoIndex, selectboxOptions) {
|
|
let form = this.form;
|
|
this.form = [];
|
|
form.info[infoIndex]["options"].splice(selectboxOptions, 1);
|
|
this.form = form;
|
|
},
|
|
addSelectbox(infoIndex) {
|
|
let form = this.form;
|
|
this.form = [];
|
|
form.info[infoIndex]["options"].push({ title: "" });
|
|
this.form = form;
|
|
},
|
|
addInput() {
|
|
this.form.info.push({ id: 0, name: "", type: "", size: "" });
|
|
},
|
|
changeTypeForm(infoIndex, type, formLevel) {
|
|
if (type == "Select" || type == "Checkbox") {
|
|
let form = this.form;
|
|
this.form = "";
|
|
form.info[infoIndex]["children"][formLevel]["options"] = [
|
|
{ title: "" }
|
|
];
|
|
this.form = form;
|
|
} else {
|
|
let form = this.form;
|
|
this.form = "";
|
|
form.info[infoIndex]["children"][formLevel]["options"] = [];
|
|
this.form = form;
|
|
}
|
|
},
|
|
removeSelectboxForm(infoIndex, selectboxOptions, formLevel) {
|
|
let form = this.form;
|
|
this.form = [];
|
|
form.info[infoIndex]["children"][formLevel]["options"].splice(
|
|
selectboxOptions,
|
|
1
|
|
);
|
|
this.form = form;
|
|
},
|
|
addSelectboxForm(infoIndex, formLevel) {
|
|
let form = this.form;
|
|
this.form = [];
|
|
form.info[infoIndex]["children"][formLevel]["options"].push({
|
|
title: ""
|
|
});
|
|
this.form = form;
|
|
},
|
|
duplicateForm(infoIndex) {
|
|
let form = this.form;
|
|
this.form = [];
|
|
form.info[infoIndex]["children"].push({
|
|
id: 0,
|
|
name: "",
|
|
type: "",
|
|
size: ""
|
|
});
|
|
this.form = form;
|
|
},
|
|
removeForm(infoIndex, formLevel) {
|
|
let form = this.form;
|
|
this.form = [];
|
|
form.info[infoIndex]["children"].splice(formLevel, 1);
|
|
this.form = form;
|
|
},
|
|
removeInput(infoIndex) {
|
|
let form = this.form;
|
|
this.form = [];
|
|
form.info.splice(infoIndex, 1);
|
|
this.form = form;
|
|
},
|
|
async registerForm() {
|
|
if (this.$refs.form.validate()) {
|
|
const result = await ApiService.post("TestTypes", this.form);
|
|
if (result && result.status == 200) {
|
|
this.$router.push({ name: `Dashboard` });
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
<style lang="css" scoped>
|
|
.WM-Border-Gray {
|
|
border-color: #aaa !important;
|
|
}
|
|
.WM-Color-LightGrey {
|
|
background-color: #f5f5f5;
|
|
}
|
|
.v-btn--top.v-btn--absolute.v-btn--small {
|
|
top: -25px !important;
|
|
}
|
|
.v-btn--bottom.v-btn--absolute.v-btn--small {
|
|
bottom: -24px !important;
|
|
}
|
|
</style>
|