diff --git a/src/assets/icons/download.svg b/src/assets/icons/download.svg
new file mode 100644
index 0000000..5aeb996
--- /dev/null
+++ b/src/assets/icons/download.svg
@@ -0,0 +1,5 @@
+
+
diff --git a/src/assets/sass/variables.sass b/src/assets/sass/variables.sass
index 5e6a4ec..6d60274 100644
--- a/src/assets/sass/variables.sass
+++ b/src/assets/sass/variables.sass
@@ -11,6 +11,7 @@
--btn-blue-color-2: rgba(65, 105, 225, 0.5)
--btn-blue-color-3: rgba(65, 105, 225, 0.2)
--btn-blue-color-4: rgba(65, 105, 225, 0.8)
+ --bg-btn-icons-color: rgba(215, 217, 255, 0.6)
--font-grey-color: #9294a7
--border-light-grey-color: #d3d4dc
--default-shadow: 4px 4px 8px rgba(9, 10, 21, 0.1), -4px -4px 8px rgba(9, 10, 21, 0.1)
@@ -18,3 +19,4 @@
--default-white: #fff
--btn-red-color: #ff6f6f
--time-indicator-color: #e93131
+ --font-obligatory-color: #ff0000
diff --git a/src/components/base/BaseInput.vue b/src/components/base/BaseInput.vue
index 44b2fc0..a353b87 100644
--- a/src/components/base/BaseInput.vue
+++ b/src/components/base/BaseInput.vue
@@ -1,17 +1,25 @@
- .input-wrapper.flex.gap-x-2.px-4.box-border(class="py-2.5")
+ .input-wrapper.flex.gap-x-2.px-4.box-border(class="py-2.5" :style="{ minWidth: widthInput + 'px' }")
img.cursor-pointer( v-if="withIcon" :class="position" src="@/assets/icons/search-black.svg" alt="SearchTable")
- input.input-search.outline-0.text-base.not-italic(placeholder="Искать")
+ input.w-full.outline-0.text-base.not-italic(:value="value" :type="type" @input="$emit('update:value', $event.target.value)" :placeholder="placeholder")
@@ -28,6 +45,9 @@ export default {
border-radius: 4px
width: fit-content
background-color: var(--bg-ligth-blue-color)
+ &.border
+ background-color: rgba(255, 255, 255, 0)
+ border: 2px solid var(--border-light-grey-color)
.select
appearance: none
border: none
diff --git a/src/components/base/buttons/BaseCreateButton.vue b/src/components/base/buttons/BaseCreateButton.vue
index 9b62519..1efd708 100644
--- a/src/components/base/buttons/BaseCreateButton.vue
+++ b/src/components/base/buttons/BaseCreateButton.vue
@@ -1,5 +1,5 @@
- button.button.flex.gap-x-2.text-base.pt-3.pb-2.px-6
+ button.button.flex.w-fit.gap-x-2.text-base.pt-3.pb-2.px-6
.flex.text-xs.w-fit.pt-1(v-if="withIcon")
span.icon-plus
span.text-base.font-semibold {{text}}
diff --git a/src/pages/clients/components/ClientsFormCreate.vue b/src/pages/clients/components/ClientsFormCreate.vue
new file mode 100644
index 0000000..e524284
--- /dev/null
+++ b/src/pages/clients/components/ClientsFormCreate.vue
@@ -0,0 +1,195 @@
+
+ .wrapper.flex.flex-col.absolute.top-28.right-0.px-8.py-7.gap-y-8
+ .icon-cancel.close.absolute.top-5.right-5.cursor-pointer(@click="closeForm")
+ span.title.text-xl.font-bold Создание клиента
+ .flex.gap-x-4.h-fit
+ .flex.gap-x-3.w-full
+ .export-avatar.cursor-pointer.flex.justify-center.items-center
+ img.icon-download(src="@/assets/icons/download.svg" alt="Download")
+ base-input(v-model:value="infoClient.fullName" placeholder="ФИО*" :width-input="326" )
+ base-select(:list-data="priorityList" :option-data="priorityOption" :width-select="176" :style-border="true" :choose-option="chooseOptionSelect")
+ .flex.flex-col.flex-auto.l.gap-y-8
+ .flex
+ button.title-info.px-6.py-2.cursor-pointer(v-for="(info, index) in infoTitleArray" @click="(e) => selectTab(e)" :class="{active:info.active}" :key="index" :id="info.title") {{info.title}}
+ .flex(:style="{display :'block'}" ref="basic")
+ form-create-basic-info( :basic-info="infoClient.basicInfo" :add-network="addNewNetwork" :save-client="saveClient")
+ .flex(:style="{display :'none'}" ref="secondary")
+ form-create-secondary-info(:secondary-info="infoClient.secondaryInfo" :save-client="saveClient")
+ .flex(:style="{display :'none'}" ref="doc")
+ form-create-doc(:doc="infoClient.doc" :save-file="saveDocFile" :save-client="saveClient")
+ .flex(:style="{display :'none'}" ref="additional")
+ form-create-additional(:additional-info="infoClient.additional" :add-new-additional="addNewAdditionalInfo" :save-file="saveAdditionalFiles" :save-client="saveClient")
+
+
+
+
+
diff --git a/src/pages/clients/components/ClientsTable.vue b/src/pages/clients/components/ClientsTable.vue
index e1cbd53..6e07ed3 100644
--- a/src/pages/clients/components/ClientsTable.vue
+++ b/src/pages/clients/components/ClientsTable.vue
@@ -1,6 +1,6 @@
.wrapper.flex.flex-col.gap-y-8.px-6.pt-6.h-full.w-full.min-w-fit
- clients-table-header(:is-open-actions="marked.length")
+ clients-table-header(:is-open-actions="marked.length" :open-form-create="openFormCreate" )
table.w-full
thead.head-table
tr.head-row
@@ -62,6 +62,9 @@ import ClientsTableCheckbox from "@/pages/clients/components/ClientsTableCheckbo
export default {
name: "ClientsTable",
components: { ClientsTableCheckbox, ClientsTableRow, ClientsTableHeader },
+ props: {
+ openFormCreate: Function,
+ },
data() {
return {
selectAll: false,
diff --git a/src/pages/clients/components/ClientsTableHeader.vue b/src/pages/clients/components/ClientsTableHeader.vue
index 128c08b..40f4c1e 100644
--- a/src/pages/clients/components/ClientsTableHeader.vue
+++ b/src/pages/clients/components/ClientsTableHeader.vue
@@ -1,13 +1,14 @@
.flex.justify-between.w-full.h-fit
.flex.gap-2.w-fit.h-fit
- base-input(:with-icon="true")
+ .input
+ base-input(:with-icon="true")
button.filter-button.flex.items-center.justify-center.box-border(class="px-2.5")
.icon-filter.text-xl.leading-4
clients-table-header-actions(v-if="!!isOpenActions" :is-selected-one="isOpenActions===1")
.flex.w-fit.h-fit.gap-x-2
bass-export-button(:only-icon="true")
- base-create-button(:with-icon="true")
+ base-create-button(@click="openFormCreate" :with-icon="true")
@@ -25,12 +26,16 @@ export default {
ClientsTableHeaderActions,
},
props: {
+ openFormCreate: Function,
isOpenActions: Number,
},
};
diff --git a/src/pages/clients/components/FormCreateBasicInfo.vue b/src/pages/clients/components/FormCreateBasicInfo.vue
new file mode 100644
index 0000000..ccda080
--- /dev/null
+++ b/src/pages/clients/components/FormCreateBasicInfo.vue
@@ -0,0 +1,69 @@
+
+ .wrapper-info.flex.flex-col.flex-auto.h-full.gap-y-8.justify-between
+ .grid.grid-cols-2.gap-x-4.gap-y-6
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Возраст
+ span.obligatory *
+ base-input.input-info(v-model:value="basicInfo.age" placeholder="Колличество полных лет" :width-input="277")
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Должность
+ base-input.input-info(v-model:value="basicInfo.jobTitle" placeholder="Должность клиента" :width-input="277")
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Номер телефона
+ span.obligatory *
+ base-input.input-info(v-model:value="basicInfo.number" placeholder="+7 (915) 644–92–23" :width-input="277")
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Email
+ span.obligatory *
+ base-input.input-info(v-model:value="basicInfo.email" placeholder="user@yandex.ru" :width-input="277")
+ .flex.flex-col.col-start-1.col-end-3(class="gap-y-1.5")
+ span.text-sm Ссылки на соцсети
+ .flex(class="gap-x-1.5" v-for="network in basicInfo.networks" :key="network.id")
+ .icon.flex.justify-center.items-center
+ span.icon-telegram.leading-2.text-lg
+ base-input.input-info.w-full(v-model:value="network.network" :id="network.id" placeholder="Ссылкa")
+ span.add-network.cursor-pointer(@click="addNetwork") Добавить соцсеть
+ base-create-button(text="Создать клиента" @click="saveClient")
+
+
+
+
+
diff --git a/src/pages/clients/components/FormCreateDoc.vue b/src/pages/clients/components/FormCreateDoc.vue
new file mode 100644
index 0000000..9711a08
--- /dev/null
+++ b/src/pages/clients/components/FormCreateDoc.vue
@@ -0,0 +1,40 @@
+
+ .wrapper-doc.flex.flex-col.justify-between
+ .upload-wrapper.flex.flex-col.justify-center.items-center
+ .upload-text.text-center.flex.w-fit
+ input.hidden(@change="(e) => saveFile(e)" type="file" id="file-upload")
+ span Загрузите элемент
+ label.label.cursor-pointer(for="file-upload") с комьютера
+ span или перетащите их сюда
+ base-create-button(@click="saveClient" text="Создать клиента")
+
+
+
+
+
diff --git a/src/pages/clients/components/FormCreateSecondaryInfo.vue b/src/pages/clients/components/FormCreateSecondaryInfo.vue
new file mode 100644
index 0000000..610794c
--- /dev/null
+++ b/src/pages/clients/components/FormCreateSecondaryInfo.vue
@@ -0,0 +1,76 @@
+
+ .wrapper-secondary.flex.flex-col.gap-y-8
+ .flex.flex-col.gap-y-6
+ span.title-info.text-base.font-bold Паспортные данные
+ .grid.grid-cols-2.gap-x-4.gap-y-6
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Серия и номер
+ base-input.input-info(v-model:value="secondaryInfo.pass.number" placeholder="0000 000000" :width-input="277")
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Кем и когда выдан
+ base-input.input-info(v-model:value="secondaryInfo.pass.issuedBy" placeholder="Точно как в паспорте" :width-input="277")
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Код подразделения
+ base-input.input-info(v-model:value="secondaryInfo.pass.divisionCode" placeholder="000–000" :width-input="277")
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Дата выдачи
+ base-input.input-info(type="date" v-model:value="secondaryInfo.pass.dateIssue" placeholder="Дата" :width-input="277")
+ .flex.flex-col.gap-y-6
+ span.title-info.text-base.font-bold СНИЛС и ИНН
+ .grid.grid-cols-2.gap-x-4.gap-y-6
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Номер СНИЛС
+ base-input.input-info(v-model:value="secondaryInfo.snilsInn.snils" placeholder="000–000–000 00" :width-input="277")
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Номер ИНН
+ base-input.input-info(v-model:value="secondaryInfo.snilsInn.inn" placeholder="000000000000" :width-input="277")
+ .flex.flex-col.gap-y-6
+ span.title-info.text-base.font-bold Даты
+ .grid.grid-cols-2.gap-x-4.gap-y-6
+ .flex.flex-col(class="gap-y-1.5")
+ span.text-sm Дата рождения
+ base-input.input-info(type="date" v-model:value="secondaryInfo.dates.birthday" placeholder="00,00,0000" :width-input="277")
+ .flex.flex-col.gap-y-6
+ span.title-info.text-base.font-bold Адреса
+ .grid.grid-cols-2.gap-x-4.gap-y-6
+ .flex.flex-col.col-start-1.col-end-3(class="gap-y-1.5")
+ span.text-sm Адрес постоянной регистрации
+ base-input.input-info(v-model:value="secondaryInfo.addresses.actualPlace" placeholder="Место регистрации (в паспорте)")
+ .flex.flex-col.col-start-1.col-end-3(class="gap-y-1.5")
+ span.text-sm Адрес фактического проживания
+ base-input.input-info(v-model:value="secondaryInfo.addresses.registrationPlace" placeholder="Место проживания на данный момент")
+ base-create-button(text="Создать клиента" @click="saveClient")
+
+
+
+
+