@znap/components-vue2 1.1.8 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/components/buttons/ClearFilterButton.vue","../src/components/buttons/CloseTableButton.vue","../src/components/buttons/RefreshButton.vue","../src/components/buttons/FiltersButton.vue","../src/components/buttons/ExportFileButton.vue","../src/components/buttons/ImportFileButton.vue","../src/components/buttons/NewItemButton.vue","../src/components/buttons/SaveButton.vue","../src/components/buttons/ConsolidateButton.vue","../src/components/buttons/DeleteItemButton.vue","../src/components/buttons/TextButton.vue","../src/components/buttons/DuplicatedItemButton.vue","../src/components/buttons/EditItemButton.vue","../src/components/buttons/UndoChangesButton.vue","../src/components/views/ViewHeader.vue","../src/components/views/BaseViewLayout.vue","../src/components/views/RequiredFilterMessage.vue","../src/components/forms/FormTitle.vue","../src/components/forms/RequiredFieldsIndicator.vue","../src/components/forms/FormFooter.vue","../src/components/forms/LoadingIndicator.vue","../src/components/forms/BaseFormLayout.vue","../src/components/forms/UnsavedChangesDialog.vue","../src/components/forms/ConfirmDeleteDialog.vue","../src/components/date-pickers/DatePicker.vue","../src/components/forms/BaseCrudForm.vue","../src/components/drawers/BaseCrudSecondaryFiltersDrawer.vue","../src/components/views/BaseCrudView.vue","../src/components/tables/HandsOnTable.vue","../src/components/selectors/MonthSelector.vue","../src/components/selectors/QuarterSelector.vue","../src/components/selectors/SemesterSelector.vue","../src/components/selectors/YearSelector.vue","../src/components/selectors/PeriodSelector.vue","../src/components/selectors/YearPeriodSelector.vue","../src/utils/views/generateCrudViewConfigs.ts","../src/index.ts"],"sourcesContent":["<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi-cancel</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Limpar filtros\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"secondary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi-close</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Fechar\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi-refresh</v-icon>\n </v-btn>\n </template>\n\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Atualizar\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi-filter</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Filtros\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"secondary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>{{ icon }}</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n icon: {\n default: \"mdi-microsoft-excel\",\n required: false,\n type: String,\n },\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Exportar Excel\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>{{ icon }}</v-icon>\n </v-btn>\n\n <input ref=\"uploader\" class=\"d-none\" type=\"file\" @change=\"onChangeFile\" />\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n icon: {\n default: \"mdi-file-excel\",\n required: false,\n type: String,\n },\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Importar excel\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n },\n emits: [\"getFileUploaderRef\", \"changeFile\"],\n mounted() {\n this.$emit(\"getFileUploaderRef\", this.$refs.uploader);\n },\n methods: {\n onChangeFile(e) {\n this.$emit(\"changeFile\", e);\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi-plus</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Adicionar nova linha\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n :disabled=\"disabled\"\n >\n <v-icon>{{ icon }}</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n inheritAttrs: false,\n props: {\n icon: {\n default: \"mdi-content-save\",\n required: false,\n type: String,\n },\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Salvar\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n disabled: {\n required: false,\n default: false,\n type: Boolean,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n :class=\"buttonClass\"\n :min-width=\"minWidth\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :disabled=\"disabled\"\n >\n <v-icon>mdi-calculator-variant</v-icon>\n </v-btn>\n </template>\n <span>{{ text }}</span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Consolidar valores\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"secondary\",\n type: String,\n },\n disabled: {\n required: false,\n default: false,\n type: Boolean,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n :class=\"buttonClass\"\n :min-width=\"minWidth\"\n v-on=\"{ ...on, ...$listeners }\"\n v-bind=\"$attrs\"\n :disabled=\"disabled\"\n >\n <v-icon>mdi-delete-sweep</v-icon>\n </v-btn>\n </template>\n <span>{{ text }}</span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Remover linha(s) selecionada(s)\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n disabled: {\n required: false,\n default: false,\n type: Boolean,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-btn\n :color=\"color\"\n text\n v-bind=\"$attrs\"\n v-on=\"{ ...$listeners }\"\n :class=\"buttonClass\"\n >\n {{ text }}\n </v-btn>\n</template>\n\n<script>\nexport default {\n props: {\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"primary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi-content-duplicate</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Duplicar item selecionado\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"secondary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi-pencil</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Editar item selecionado\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"secondary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n :color=\"color\"\n v-bind=\"$attrs\"\n v-on=\"{ ...on, ...$listeners }\"\n :min-width=\"minWidth\"\n :class=\"buttonClass\"\n >\n <v-icon>mdi mdi-undo-variant</v-icon>\n </v-btn>\n </template>\n <span>\n {{ text }}\n </span>\n </v-tooltip>\n</template>\n\n<script>\nexport default {\n props: {\n minWidth: {\n default: \"48px\",\n required: false,\n type: String,\n },\n buttonClass: {\n default: \"\",\n required: false,\n type: String,\n },\n text: {\n default: \"Desfazer alterações\",\n required: false,\n type: String,\n },\n size: {\n required: false,\n default: \"small\",\n type: String,\n },\n color: {\n required: false,\n default: \"secondary\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <section ref=\"cardHeaderRef\">\n <div class=\"d-flex align-center pt-2 pb-4\">\n <div class=\"d-flex align-start mr-4\">\n <v-icon x-large color=\"primary\">{{ tableIcon }}</v-icon>\n </div>\n\n <span\n class=\"text-h6 font-weight-regular\"\n style=\"\n display: inline-block;\n white-space: nowrap;\n overflow: hidden !important;\n text-overflow: ellipsis;\n \"\n >\n {{ tableName }}\n </span>\n\n <v-spacer></v-spacer>\n\n <slot />\n </div>\n </section>\n</template>\n\n<script lang=\"ts\">\nexport default {\n props: {\n tableIcon: {\n required: true,\n default: \"\",\n type: String,\n },\n tableName: {\n required: true,\n default: \"\",\n type: String,\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-container fluid fill-height app class=\"znap-crud-full-height-container\">\n <v-card\n color=\"white\"\n class=\"px-4 rounded-t d-flex flex-column\"\n style=\"width: 100%; height: 100%\"\n >\n <ViewHeader :tableIcon=\"tableIcon\" :tableName=\"tableName\">\n <slot name=\"action-buttons\" />\n\n <CloseTableButton\n v-if=\"closeTableButton.show\"\n :color=\"closeTableButton.color\"\n :min-width=\"closeTableButton.minWidth\"\n :text=\"closeTableButton.text\"\n buttonClass=\"pa-0\"\n @click=\"closeTable\"\n />\n </ViewHeader>\n\n <v-divider class=\"mb-2\"></v-divider>\n\n <section ref=\"filtersRef\" v-if=\"showPrimaryFilters\">\n <slot name=\"primary-filters\" />\n </section>\n\n <section\n class=\"w-100 flex-grow-1 d-flex flex-column\"\n ref=\"default-container\"\n >\n <slot />\n </section>\n </v-card>\n </v-container>\n</template>\n\n<script>\nimport { CloseTableButton } from \"../buttons\";\n\nimport ViewHeader from \"./ViewHeader.vue\";\n\nexport default {\n props: {\n tableIcon: {\n required: true,\n default: \"\",\n type: String,\n },\n tableName: {\n required: true,\n default: \"\",\n type: String,\n },\n showPrimaryFilters: {\n require: false,\n default: true,\n type: Boolean,\n },\n closeTableButton: {\n require: false,\n default: () => ({\n show: true,\n text: undefined,\n minWidth: undefined,\n color: undefined,\n }),\n },\n },\n components: {\n CloseTableButton,\n ViewHeader,\n },\n\n data() {\n return {\n isComponentMounted: false,\n };\n },\n\n emits: [\"closeTable\"],\n\n mounted() {\n window.addEventListener(\"resize\", this.adjustComponentLayout);\n\n this.isComponentMounted = true;\n\n this.$nextTick(() => {\n this.adjustComponentLayout();\n });\n },\n beforeDestroy() {\n this.isComponentMounted = false;\n window.removeEventListener(\"resize\", this.adjustComponentLayout);\n },\n methods: {\n closeTable() {\n this.$emit(\"closeTable\");\n },\n adjustComponentLayout() {\n if (!this.isComponentMounted || !this.$el) return;\n\n const appBar = document.querySelector(\".v-app-bar\");\n const appBarHeight = appBar ? appBar.offsetHeight : 64;\n\n const availableHeight = `calc(100vh - ${appBarHeight}px)`;\n\n const container = this.$el;\n if (container) {\n container.style.height = availableHeight;\n container.style.maxHeight = availableHeight;\n container.style.overflow = \"hidden\";\n }\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.znap-crud-full-height-container {\n height: calc(100vh - 64px);\n max-height: calc(100vh - 64px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.znap-crud-full-height-container :deep(.v-container) {\n height: 100%;\n max-height: 100%;\n padding: 16px;\n margin: 0;\n overflow: hidden;\n}\n\n.znap-crud-full-height-container :deep(.v-card) {\n height: 100%;\n max-height: 100%;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n border-radius: 4px;\n margin: 0;\n}\n\n.znap-crud-full-height-container :deep(.flex-grow-1) {\n flex: 1 1 auto;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.znap-crud-full-height-container :deep(.v-layout) {\n height: 100%;\n flex: 1 1 auto;\n overflow: hidden;\n}\n\n.znap-crud-full-height-container :deep(.v-data-table) {\n height: 100%;\n max-height: none;\n display: flex;\n flex-direction: column;\n}\n\n.znap-crud-full-height-container :deep(.v-data-table__wrapper) {\n flex: 1 1 auto;\n overflow: auto;\n min-height: 0;\n}\n\n.znap-crud-full-height-container :deep(.v-data-table__header) {\n flex-shrink: 0;\n}\n\n.znap-crud-full-height-container :deep(.v-data-footer) {\n flex-shrink: 0;\n}\n\n.znap-crud-full-height-container :deep(.v-toolbar) {\n flex-shrink: 0;\n}\n</style>\n","<template>\n <v-row\n class=\"justify-center mb-5 mt-3 text-h6 primary--text\"\n style=\"color: #e71b7b; font-size: 1.25rem\"\n >\n {{ message }}\n </v-row>\n</template>\n\n<script lang=\"ts\">\nexport default {\n props: {\n message: {\n required: true,\n default: \"\",\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-card-title\n class=\"light--text\"\n :style=\"`background: linear-gradient(90deg, ${$vuetify.theme.themes.light.primary} 0%, ${$vuetify.theme.themes.light.secondary} 100%)`\"\n >\n <span ref=\"formTitle\" class=\"headline\">\n {{ formAction }} {{ formSubject }}\n </span>\n\n <v-spacer></v-spacer>\n\n <slot />\n\n <v-tooltip top v-if=\"showCloseButton\">\n <template v-slot:activator=\"{ on }\">\n <v-btn\n v-on=\"on\"\n class=\"pa-0\"\n @click=\"$emit('close')\"\n min-width=\"48px\"\n text\n dark\n >\n <v-icon color=\"light\">mdi-close</v-icon>\n </v-btn>\n </template>\n <span>Fechar</span>\n </v-tooltip>\n </v-card-title>\n</template>\n\n<script>\nexport default {\n props: {\n formAction: {\n default: \"\",\n },\n formSubject: {\n default: \"\",\n },\n showCloseButton: {\n default: true,\n },\n },\n emits: [\"close\"],\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <span class=\"text-caption primary--text ml-3\">* Campos obrigatórios</span>\n</template>\n\n<script>\nexport default {};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <div class=\"light\">\n <v-divider class=\"mx-4\"></v-divider>\n\n <v-card-actions class=\"px-6 py-6\">\n <RequiredFieldsIndicator v-if=\"showRequiredFieldsIndicator\" />\n\n <v-spacer></v-spacer>\n\n <v-btn\n v-if=\"showCancelButton\"\n color=\"primary\"\n text\n @click=\"$emit('close')\"\n class=\"mr-4\"\n >\n {{ cancelButtonText }}\n </v-btn>\n\n <v-btn\n v-if=\"showSubmitButton || readOnly\"\n color=\"primary\"\n @click=\"$emit('submit')\"\n :disabled=\"disableSubmitButton\"\n :loading=\"loading\"\n >\n {{ loading ? submitButtonLoadingText : submitButtonText }}\n </v-btn>\n </v-card-actions>\n </div>\n</template>\n\n<script>\nimport RequiredFieldsIndicator from \"./RequiredFieldsIndicator.vue\";\n\nexport default {\n props: {\n showRequiredFieldsIndicator: {\n default: true,\n },\n showCancelButton: {\n default: true,\n },\n cancelButtonText: {\n default: \"Cancelar\",\n },\n showSubmitButton: {\n default: true,\n },\n submitButtonText: {\n default: \"Salvar\",\n },\n submitButtonLoadingText: {\n default: \"Carregando...\",\n },\n disableSubmitButton: {\n default: false,\n },\n loading: {\n default: false,\n },\n readOnly: {\n default: false,\n },\n },\n components: {\n RequiredFieldsIndicator,\n },\n emits: [\"close\", \"submit\"],\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <section class=\"text-center\">\n <v-progress-circular\n color=\"primary\"\n indeterminate\n size=\"50\"\n ></v-progress-circular>\n </section>\n</template>\n\n<script>\nexport default {};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-dialog v-model=\"showModal\" :max-width=\"maxWidth\" :scrollable=\"scrollable\">\n <v-form\n @submit.prevent\n :lazy-validation=\"true\"\n ref=\"formRef\"\n :readonly=\"readOnly\"\n >\n <v-card>\n <FormTitle\n :form-action=\"formAction\"\n :form-subject=\"formSubject\"\n :show-close-button=\"showCloseButton\"\n @close=\"close\"\n />\n\n <v-card-text>\n <LoadingIndicator v-if=\"isLoadingData\" class=\"mt-3\" />\n\n <section v-else class=\"pa-5\">\n <slot />\n </section>\n </v-card-text>\n\n <FormFooter\n :loading=\"loading\"\n :read-only=\"readOnly\"\n :submit-button-loading-text=\"submitButtonLoadingText\"\n :submit-button-text=\"submitButtonText\"\n :show-submit-button=\"showSubmitButton\"\n :cancel-button-text=\"cancelButtonText\"\n :disable-submit-button=\"disableSubmitButton && !isLoadingData\"\n :show-cancel-button=\"showCancelButton\"\n @close=\"close\"\n @submit=\"submit\"\n />\n </v-card>\n </v-form>\n </v-dialog>\n</template>\n\n<script>\nimport FormFooter from \"./FormFooter.vue\";\nimport FormTitle from \"./FormTitle.vue\";\nimport LoadingIndicator from \"./LoadingIndicator.vue\";\n\nexport default {\n props: {\n formAction: {\n default: \"\",\n },\n formSubject: {\n default: \"\",\n },\n showCloseButton: {\n default: true,\n },\n isLoadingData: {\n default: false,\n },\n disableSubmitButton: {\n default: false,\n },\n loading: {\n default: false,\n },\n readOnly: {\n default: true,\n },\n submitButtonLoadingText: {\n required: false,\n },\n submitButtonText: {\n required: false,\n },\n showSubmitButton: {\n default: true,\n },\n cancelButtonText: {\n required: false,\n },\n showCancelButton: {\n default: true,\n },\n maxWidth: {\n default: \"80%\",\n },\n scrollable: {\n default: true,\n },\n validateOn: {\n default: \"submit\",\n },\n },\n data() {\n return {\n showModal: false,\n };\n },\n components: { FormTitle, FormFooter, LoadingIndicator },\n emits: [\"close\", \"submit\"],\n methods: {\n show() {\n this.showModal = true;\n this.resetFormValidation();\n },\n\n close() {\n this.$emit(\"close\");\n },\n\n hidden() {\n this.showModal = false;\n this.resetFormValidation();\n },\n\n submit() {\n this.$emit(\"submit\");\n },\n async validateForm() {\n const valid = await this.$refs?.formRef?.validate();\n\n return valid;\n },\n resetFormValidation() {\n this.$refs?.formRef?.resetValidation();\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-dialog v-model=\"showModal\" max-width=\"850px\">\n <v-card>\n <div class=\"d-flex justify-center\">\n <v-card-title class=\"headline\">\n Você possui edições não salvas. Tem certeza de que deseja continuar?\n </v-card-title>\n </div>\n\n <v-card-actions class=\"px-6 pb-6\">\n <v-spacer></v-spacer>\n <TextButton\n color=\"primary\"\n text=\"Cancelar\"\n buttonClass=\"mr-4\"\n @click=\"close\"\n />\n\n <TextButton\n color=\"secondary\"\n text=\"Continuar sem salvar\"\n buttonClass=\"mr-4\"\n @click=\"submit({ save: false })\"\n />\n\n <v-btn color=\"primary\" @click=\"submit({ save: true })\">\n Salvar e continuar\n </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { TextButton } from \"../buttons\";\n\nexport default {\n components: {\n TextButton,\n },\n data() {\n return {\n showModal: false,\n onSave: () => {},\n onWithoutSave: () => {},\n };\n },\n emits: [\"hidden\"],\n methods: {\n show({ onSave = () => {}, onWithoutSave = () => {} } = {}) {\n this.onSave = onSave;\n this.onWithoutSave = onWithoutSave;\n\n this.showModal = true;\n },\n close() {\n this.$emit(\"hidden\");\n },\n hidden() {\n this.onSave = () => {};\n this.onWithoutSave = () => {};\n\n this.showModal = false;\n },\n submit({ save = true }) {\n const handlerFunction = save ? this.onSave : this.onWithoutSave;\n\n this.hidden();\n handlerFunction();\n },\n },\n destroyed() {\n this.onSave = () => {};\n this.onWithoutSave = () => {};\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-dialog v-model=\"showModal\" max-width=\"850px\">\n <v-card>\n <div class=\"d-flex justify-center\">\n <v-card-title class=\"headline\">\n Tem certeza de que deseja excluir esta(s) linha(s)?\n </v-card-title>\n </div>\n\n <v-card-actions class=\"px-6 pb-6\">\n <v-spacer></v-spacer>\n <TextButton\n color=\"primary\"\n text=\"Cancelar\"\n buttonClass=\"mr-4\"\n @click=\"close\"\n />\n\n <v-btn color=\"primary\" @click=\"submit()\"> Confirmar </v-btn>\n </v-card-actions>\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { TextButton } from \"../buttons\";\n\nexport default {\n components: {\n TextButton,\n },\n data() {\n return {\n showModal: false,\n };\n },\n emits: [\"hidden\", \"submit\"],\n methods: {\n show() {\n this.showModal = true;\n },\n close() {\n this.$emit(\"hidden\");\n },\n hidden() {\n this.showModal = false;\n },\n submit() {\n this.hidden();\n this.$emit(\"submit\");\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-menu\n ref=\"menu\"\n v-model=\"menu\"\n :close-on-content-click=\"closeMenuOnContentClick\"\n transition=\"scale-transition\"\n offset-y\n min-width=\"auto\"\n >\n <template v-slot:activator=\"{ on }\">\n <v-text-field\n :value=\"formattedDates()\"\n :label=\"label\"\n append-icon=\"mdi-calendar\"\n readonly\n v-on=\"on\"\n :clearable=\"clearable\"\n @click:clear=\"clearSelectedFilter()\"\n hide-details=\"auto\"\n class=\"pb-2\"\n :disabled=\"disabled\"\n ></v-text-field>\n </template>\n\n <v-date-picker\n color=\"primary\"\n v-model=\"dates\"\n no-title\n scrollable\n :range=\"range\"\n @input=\"handleDateChange\"\n :disabled=\"disabled\"\n >\n </v-date-picker>\n </v-menu>\n</template>\n\n<script>\nimport moment from \"moment\";\n\nexport default {\n props: {\n label: { type: String, required: true },\n clearable: { type: Boolean, default: true },\n disabled: { type: Boolean, required: false },\n range: { type: Boolean, default: false },\n initialValue: { default: null },\n },\n\n data() {\n return {\n dates: \"\",\n menu: false,\n };\n },\n\n mounted() {\n this.dates = this.initialValue;\n },\n computed: {\n closeMenuOnContentClick() {\n return this.range ? false : true;\n },\n },\n methods: {\n handleDateChange(value) {\n this.dates = value;\n this.setDatepickerValue();\n },\n\n formattedDates() {\n if (!this.dates || this.dates.length === 0) return null;\n\n if (this.range) {\n return this.dates.length === 2\n ? `${moment(this.dates[0]).format(\"DD/MM/YYYY\")} - ${moment(\n this.dates[1]\n ).format(\"DD/MM/YYYY\")}`\n : moment(this.dates[0]).format(\"DD/MM/YYYY\");\n }\n\n return moment(this.dates).format(\"DD/MM/YYYY\");\n },\n\n setDatepickerValue() {\n let value = \"\";\n\n if (!this.range) {\n value = moment(this.dates).format(\"YYYY-MM-DD\");\n }\n\n if (this.range) {\n value =\n this.dates.length === 2\n ? [\n moment(this.dates[0]).format(\"YYYY-MM-DD\"),\n moment(this.dates[1]).format(\"YYYY-MM-DD\"),\n ]\n : [moment(this.dates[0]).format(\"YYYY-MM-DD\")];\n }\n\n this.$emit(\"setDatepickerValue\", value);\n },\n\n clearSelectedFilter() {\n this.dates = this.range ? [] : null;\n\n this.$emit(\"setDatepickerValue\", null);\n },\n },\n};\n</script>\n\n<style></style>\n","<template>\n <BaseFormLayout\n ref=\"formRef\"\n :form-action=\"formAction\"\n form-subject=\"item\"\n @close=\"close\"\n @submit=\"submit\"\n :read-only=\"false\"\n :is-loading-data=\"loadingData\"\n :loading=\"formSettings.loading\"\n >\n <template v-for=\"header in headers\">\n <v-row v-if=\"!header.hideInForm && header.type\" :key=\"header.value\">\n <v-col cols=\"12\">\n <v-autocomplete\n v-if=\"header.options && header.columnType !== 'radio'\"\n :label=\"getLabel(header)\"\n v-model=\"item[header.value]\"\n :items=\"getOptions(header, item)\"\n :clearable=\"!isRequired(header)\"\n item-label=\"text\"\n return-object\n :disabled=\"isDependentFieldEmpty(item, header)\"\n :messages=\"getDependentFieldMessage(item, header)\"\n :rules=\"getFieldValidations(item, header)\"\n @change=\"\n setSelectedOption(item, header.columnId, header.value, $event)\n \"\n hide-details=\"auto\"\n />\n\n <v-radio-group\n v-else-if=\"\n header.options &&\n header.columnType === 'radio' &&\n header.type === 'VARCHAR'\n \"\n class=\"mt-0 py-2\"\n v-model=\"item[header.value]\"\n :rules=\"getFieldValidations(item, header)\"\n hide-details=\"auto\"\n >\n <template v-slot:label>\n <span class=\"text-subtitle-1\">\n {{ getLabel(header) }}\n </span>\n </template>\n\n <template class=\"d-flex\">\n <v-radio\n v-for=\"option in getOptions(header, item)\"\n :key=\"option.id\"\n class=\"d-flex align-center\"\n :ripple=\"false\"\n :value=\"option.text\"\n >\n <template v-slot:label>\n <span class=\"mr-4\">{{ option.text }}</span>\n <span class=\"text-caption\">({{ option.description }})</span>\n </template>\n </v-radio>\n </template>\n </v-radio-group>\n\n <v-switch\n v-else-if=\"header.type === 'INT' && header.columnType === 'check'\"\n :label=\"getLabel(header)\"\n v-model=\"item[header.value]\"\n :rules=\"getFieldValidations(item, header)\"\n hide-details=\"auto\"\n />\n\n <v-text-field\n v-else-if=\"header.type === 'INT' && header.columnType !== 'check'\"\n v-model.number=\"item[header.value]\"\n :label=\"getLabel(header)\"\n type=\"number\"\n :counter=\"header.length\"\n :maxlength=\"header.length\"\n :rules=\"getFieldValidations(item, header)\"\n hide-details=\"auto\"\n />\n\n <v-text-field\n v-else-if=\"header.type === 'DECIMAL'\"\n v-model.number=\"item[header.value]\"\n @change=\"formatFloat(item[header.value])\"\n :label=\"getLabel(header)\"\n type=\"number\"\n :counter=\"header.length\"\n :maxlength=\"header.length\"\n :rules=\"getFieldValidations(item, header)\"\n hide-details=\"auto\"\n />\n\n <v-text-field\n v-else-if=\"header.type === 'VARCHAR' || header.type === 'TEXT'\"\n v-model=\"item[header.value]\"\n :label=\"getLabel(header)\"\n type=\"text\"\n :counter=\"header.length\"\n :maxlength=\"header.length\"\n :rules=\"getFieldValidations(item, header)\"\n hide-details=\"auto\"\n />\n\n <DatePicker\n v-else-if=\"header.type === 'DATE' || header.type === 'DATETIME'\"\n :label=\"header.text\"\n :initial-value=\"item[header.value]\"\n @setDatepickerValue=\"item[header.value] = $event\"\n :rules=\"getFieldValidations(item, header)\"\n hide-details=\"auto\"\n />\n </v-col>\n </v-row>\n </template>\n </BaseFormLayout>\n</template>\n\n<script>\nimport BaseFormLayout from \"./BaseFormLayout.vue\";\nimport { DatePicker } from \"../date-pickers\";\n\nexport default {\n components: {\n BaseFormLayout,\n DatePicker,\n },\n props: {\n headers: {\n type: Array,\n required: true,\n },\n primaryKey: {\n type: String,\n required: true,\n },\n formSettings: {\n type: Object,\n required: true,\n },\n },\n data() {\n return {\n formAction: \"Novo\",\n loadingData: false,\n item: {},\n };\n },\n emits: [\"hidden\", \"submit\"],\n created() {\n this.item = { ...(this.formSettings.baseModel ?? {}) };\n },\n\n computed: {\n formOptionsByColumnMap() {\n const optionsMap = new Map();\n\n if (!this.formSettings?.formOptions?.length) return optionsMap;\n\n for (const option of this.formSettings?.formOptions) {\n optionsMap.set(option.column, option);\n }\n\n return optionsMap;\n },\n headersByValueMap() {\n const headersMap = new Map();\n\n if (!this.headers.length) return headersMap;\n\n for (const header of this.headers) {\n headersMap.set(header.value, header);\n }\n\n return headersMap;\n },\n },\n\n methods: {\n async show(item = null) {\n try {\n this.loadingData = true;\n this.item = { ...(this.formSettings.baseModel ?? {}) };\n\n if (item) {\n this.formAction = item[this.primaryKey] ? \"Editar\" : \"Criar\";\n\n if (this?.formSettings?.hooks?.beforeSetItem)\n await this?.formSettings?.hooks?.beforeSetItem(item);\n\n this.item = { ...item };\n\n if (this?.formSettings?.hooks?.afterSetItem)\n await this?.formSettings?.hooks?.afterSetItem(this.item);\n }\n\n this.$refs?.formRef?.show();\n } catch (error) {\n this.$fnError(error);\n } finally {\n this.loadingData = false;\n }\n },\n close() {\n this.$emit(\"hidden\");\n },\n hidden() {\n this.$refs?.formRef?.hidden();\n this.formAction = \"Novo\";\n },\n async submit() {\n const isFormValid = await this.$refs.formRef?.validateForm();\n\n if (!isFormValid) return;\n\n this.$emit(\"submit\", { ...this.item });\n },\n getDependentFieldMessage(item, header) {\n const option = this.formOptionsByColumnMap.get(header.value);\n\n const dependsOnField = option?.dependsOn;\n\n if (!dependsOnField) return;\n\n if (!this.isDependentFieldEmpty(item, header)) return;\n\n const dependentFieldHeader = this.headersByValueMap.get(dependsOnField);\n\n if (!dependentFieldHeader) return;\n\n return `O campo ${header.text?.toLowerCase()} depende do campo ${dependentFieldHeader.text?.toLowerCase()}.`;\n },\n isDependentFieldEmpty(item, header) {\n const option = this.formOptionsByColumnMap.get(header.value);\n\n const dependsOnField = option?.dependsOn;\n\n if (!dependsOnField) return false;\n\n const isFieldEmpty =\n item[dependsOnField] === null ||\n item[dependsOnField] === undefined ||\n item[dependsOnField] === \"\";\n\n if (isFieldEmpty) return true;\n\n return false;\n },\n getOptions(header, item) {\n const option = this.formOptionsByColumnMap.get(header.value);\n\n if (!option) return [];\n\n if (!option.dependsOn) return option.items;\n\n const dependsOnField = option.dependsOn;\n const dependsOnItemField = item[dependsOnField];\n\n const fieldEmpty =\n dependsOnItemField === null ||\n dependsOnItemField === undefined ||\n dependsOnItemField === \"\";\n\n if (dependsOnField && fieldEmpty) {\n return [];\n }\n\n return option.items;\n },\n getRequiredFieldMessage(field) {\n return `O campo ${field} é obrigatorio!`;\n },\n getFieldValidations(item, header) {\n const field = header.value;\n const fieldValue = item[field];\n const validations = [];\n\n const isRequired = this.isRequired(header);\n const isFieldEmpty = [null, undefined, \"\"].includes(fieldValue);\n\n if (isRequired && isFieldEmpty) {\n validations.push(\n this.getRequiredFieldMessage(header?.text?.toLowerCase() ?? \"\")\n );\n }\n\n return validations;\n },\n formatFloat(float) {\n if (float === undefined || float === null) return \"\";\n\n return this?.$options?.filters?.floatFilter(float);\n },\n isRequired(header) {\n if (!header.rules) return false;\n return header.rules?.includes(\"required\");\n },\n getLabel(header) {\n const isRequired = this.isRequired(header);\n\n if (!isRequired) return header.text;\n\n return `${header.text} *`;\n },\n formatCheckboxValue(check) {\n if (!check) return false;\n\n return true;\n },\n setSelectedOption(item, columnId, column, option) {\n const formOption = this.formOptionsByColumnMap.get(column);\n\n if (formOption.hooks?.beforeChange) formOption.hooks?.beforeChange(item);\n\n const columnIdValue = option ? option.id : null;\n const columnValue = option ? option.text : null;\n\n item[columnId] = columnIdValue;\n item[column] = columnValue;\n\n if (formOption.hooks?.afterChange) formOption.hooks?.afterChange(item);\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <v-navigation-drawer\n temporary\n hide-overlay\n absolute\n right\n v-model=\"showDrawer\"\n width=\"500\"\n >\n <section class=\"d-flex justify-end mt-3 w-100 mb-2\">\n <ClearFilterButton\n button-class=\"mr-4\"\n min-width=\"48px\"\n @click=\"$emit('clear:filters')\"\n />\n <RefreshButton\n button-class=\"mr-4\"\n min-width=\"48px\"\n @click=\"$emit('refresh')\"\n />\n <CloseTableButton button-class=\"mr-3\" @click=\"close\" />\n </section>\n\n <section\n class=\"h-100 d-flex justify-center align-center\"\n v-if=\"isLoadingData\"\n >\n <LoadingIndicator class=\"mt-4\" />\n </section>\n\n <section v-else class=\"mx-3 mt-4\">\n <section v-if=\"filters?.length\">\n <v-tabs v-model=\"tabIndex\" height=\"30\">\n <v-tab v-for=\"[tabIndex, tab] in filters.entries()\" :key=\"tabIndex\">\n {{ tab.title }}\n </v-tab>\n </v-tabs>\n\n <v-tabs-items v-model=\"tabIndex\" class=\"mt-3\">\n <v-tab-item\n v-for=\"[tabIndex, tab] in filters.entries()\"\n :key=\"tabIndex\"\n >\n <v-row\n no-gutters\n v-for=\"filter of tab.filters\"\n :key=\"`${filter.column}-${filter.type}`\"\n >\n <v-col>\n <v-autocomplete\n v-if=\"filter.component === 'v-autocomplete'\"\n v-model=\"filter.value\"\n :items=\"filter.items\"\n item-text=\"text\"\n item-value=\"id\"\n :return-object=\"false\"\n v-bind=\"filter.componentProps\"\n @change=\"changeFilterValue($event, filter)\"\n :disabled=\"isFieldDependentFieldEmpty(filter)\"\n />\n\n <v-checkbox\n v-else-if=\"filter.component === 'v-checkbox'\"\n v-model=\"filter.value\"\n hide-details\n style=\"\n display: inline-block;\n white-space: nowrap;\n overflow: hidden !important;\n text-overflow: ellipsis;\n \"\n v-bind=\"filter.componentProps\"\n @change=\"changeFilterValue($event, filter)\"\n :disabled=\"isFieldDependentFieldEmpty(filter)\"\n />\n\n <DatePicker\n v-else-if=\"filter.component === 'date-picker'\"\n :initial-value=\"filter.value\"\n :label=\"filter.componentProps?.label\"\n v-bind=\"filter.componentProps\"\n @setDatepickerValue=\"changeFilterValue($event, filter)\"\n :disabled=\"isFieldDependentFieldEmpty(filter)\"\n />\n\n <v-text-field\n v-else-if=\"filter.component === 'v-text-field'\"\n v-model=\"filter.value\"\n type=\"text\"\n v-bind=\"filter.componentProps\"\n v-maska=\"filter.componentProps?.mask\"\n @change=\"changeFilterValue($event, filter)\"\n :disabled=\"isFieldDependentFieldEmpty(filter)\"\n />\n </v-col>\n </v-row>\n </v-tab-item>\n </v-tabs-items>\n </section>\n </section>\n </v-navigation-drawer>\n</template>\n\n<script>\nimport { ClearFilterButton, CloseTableButton, RefreshButton } from \"../buttons\";\nimport { DatePicker } from \"../date-pickers\";\nimport { LoadingIndicator } from \"../forms\";\n\nexport default {\n props: {\n filters: {\n type: Array,\n required: true,\n default: () => [],\n },\n },\n\n emits: [\"refresh\", \"hidden\", \"update:filter\", \"clear:filters\"],\n components: {\n LoadingIndicator,\n RefreshButton,\n CloseTableButton,\n ClearFilterButton,\n DatePicker,\n },\n data() {\n return {\n showDrawer: false,\n isLoadingData: false,\n tabIndex: 0,\n };\n },\n computed: {\n filterOptionIndexByColumnMap() {\n const filtersMap = new Map();\n\n if (!this.filters?.length) return filtersMap;\n\n for (const [tabIndex, tab] of this.filters.entries()) {\n for (const [filterIndex, primaryFilter] of tab?.filters.entries()) {\n filtersMap.set(primaryFilter.column, [tabIndex, filterIndex]);\n }\n }\n\n return filtersMap;\n },\n },\n methods: {\n show() {\n this.showDrawer = true;\n },\n close() {\n this.$emit(\"hidden\");\n },\n hidden() {\n this.showDrawer = false;\n },\n setFilter(value, key) {\n this.$emit(\"update:filter\", key, value);\n },\n isFieldDependentFieldEmpty(filter) {\n const dependsOnField = filter?.dependsOn;\n\n if (!dependsOnField) return false;\n\n const filterIndex = this.filterOptionIndexByColumnMap.get(dependsOnField);\n\n if (isNaN(filterIndex)) return true;\n\n const dependentFilter =\n this.filters[filterIndex[0]].filters[filterIndex[1]];\n\n const isFieldEmpty = !dependentFilter.value;\n\n if (isFieldEmpty) return true;\n\n return false;\n },\n changeFilterValue(value, filter) {\n filter.value = value;\n if (filter?.hooks.afterChange) filter?.hooks.afterChange(value);\n },\n },\n watch: {},\n created() {},\n destroyed() {},\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.h-100 {\n height: 100%;\n}\n</style>\n","<template>\n <BaseViewLayout\n ref=\"baseViewLayoutRef\"\n :table-icon=\"tableIcon\"\n :table-name=\"tableName\"\n @closeTable=\"closeTable\"\n >\n <template #action-buttons>\n <v-text-field\n append-icon=\"mdi-magnify\"\n label=\"Pesquisar\"\n hide-details\n single-line\n dense\n clearable\n class=\"mr-3\"\n :loading=\"loading\"\n @input=\"updateSearchFilter\"\n />\n\n <DuplicatedItemButton\n v-if=\"hasOnlyOneRowSelected\"\n buttonClass=\"mr-3 pa-0\"\n @click=\"duplicateSelectedItem(selectedRows[0])\"\n />\n\n <EditItemButton\n v-if=\"hasOnlyOneRowSelected\"\n buttonClass=\"mr-3 pa-0\"\n @click=\"showBaseCrudForm(selectedRows[0])\"\n />\n\n <UndoChangesButton\n v-if=\"hasOnlyOneRowSelected && selectedRowIsEdited\"\n @click=\"undoSelectedItemModification(selectedRows[0])\"\n buttonClass=\"mr-3 pa-0\"\n />\n\n <DeleteItemButton\n v-if=\"hasRowsSelected\"\n color=\"secondary\"\n buttonClass=\"mr-3 pa-0\"\n :loading=\"loadingDelete\"\n @click=\"showConfirmDeleteDialog()\"\n />\n\n <FiltersButton\n v-if=\"hasSecondaryFilters\"\n @click=\"showSecondaryFilters\"\n buttonClass=\"mr-4 pa-0\"\n />\n\n <NewItemButton\n :disabled=\"!hasFetch || !headers?.length\"\n buttonClass=\"mr-3 pa-0\"\n @click=\"showBaseCrudForm()\"\n />\n\n <RefreshButton\n :disabled=\"!allRequiredFilterAreFilled\"\n @click=\"handleReload\"\n :loading=\"loading\"\n buttonClass=\"mr-3 pa-0\"\n />\n\n <SaveButton\n :disabled=\"!rowsChanged.size\"\n @click=\"handleSave\"\n :loading=\"loadingSave\"\n buttonClass=\"mr-3 pa-0\"\n />\n\n <ImportFileButton\n @click=\"importFile\"\n @changeFile=\"handleImport\"\n @getFileUploaderRef=\"getFileUploaderRef\"\n :loading=\"loadingImport\"\n :disabled=\"!allRequiredFilterAreFilled\"\n buttonClass=\"mr-3 pa-0\"\n />\n\n <ExportFileButton\n @click=\"handleExport\"\n buttonClass=\"mr-3 pa-0\"\n :loading=\"loadingExport\"\n :disabled=\"!allRequiredFilterAreFilled\"\n />\n </template>\n\n <template #primary-filters>\n <section v-if=\"hasPrimaryFilters\">\n <v-tabs v-model=\"primaryFilterTab\" height=\"30\">\n <v-tab\n v-for=\"[tabIndex, tab] in filters.primary.entries()\"\n :key=\"tabIndex\"\n >\n {{ tab.title }}\n </v-tab>\n </v-tabs>\n\n <v-tabs-items v-model=\"primaryFilterTab\" class=\"mt-3\">\n <v-tab-item\n v-for=\"[tabIndex, tab] in filters.primary.entries()\"\n :key=\"tabIndex\"\n >\n <v-row>\n <v-col\n v-for=\"primaryFilter of tab.filters\"\n :key=\"primaryFilter.column\"\n class=\"flex-grow-1\"\n :cols=\"primaryFilter.componentProps?.cols || 'auto'\"\n :md=\"primaryFilter.componentProps?.md || undefined\"\n :sm=\"primaryFilter.componentProps?.sm || undefined\"\n :lg=\"primaryFilter.componentProps?.lg || undefined\"\n :xl=\"primaryFilter.componentProps?.xl || undefined\"\n >\n <v-autocomplete\n v-if=\"primaryFilter.component === 'v-autocomplete'\"\n v-model=\"primaryFilter.value\"\n :items=\"primaryFilter.items\"\n v-bind=\"{\n 'item-value':\n primaryFilter.componentProps?.itemValue ?? 'id',\n 'item-text':\n primaryFilter.componentProps?.itemText ?? 'text',\n ...primaryFilter.componentProps,\n }\"\n @change=\"changeFilterValue($event, primaryFilter)\"\n :disabled=\"isFieldDependentFieldEmpty(primaryFilter)\"\n />\n\n <v-checkbox\n v-else-if=\"primaryFilter.component === 'v-checkbox'\"\n v-model=\"primaryFilter.value\"\n hide-details\n style=\"\n display: inline-block;\n white-space: nowrap;\n overflow: hidden !important;\n text-overflow: ellipsis;\n \"\n v-bind=\"primaryFilter.componentProps\"\n @change=\"changeFilterValue($event, primaryFilter)\"\n :disabled=\"isFieldDependentFieldEmpty(primaryFilter)\"\n />\n\n <DatePicker\n v-else-if=\"primaryFilter.component === 'date-picker'\"\n :initial-value=\"primaryFilter.value\"\n @setDatepickerValue=\"changeFilterValue($event, primaryFilter)\"\n :label=\"primaryFilter.componentProps?.label\"\n v-bind=\"primaryFilter.componentProps\"\n />\n\n <v-text-field\n v-else-if=\"primaryFilter.component === 'v-text-field'\"\n v-model=\"primaryFilter.value\"\n v-bind=\"{\n type: 'text',\n ...primaryFilter.componentProps,\n }\"\n @change=\"changeFilterValue($event, primaryFilter)\"\n :disabled=\"isFieldDependentFieldEmpty(primaryFilter)\"\n v-maska=\"primaryFilter.componentProps?.mask\"\n />\n </v-col>\n </v-row>\n </v-tab-item>\n </v-tabs-items>\n </section>\n </template>\n\n <RequiredFilterMessage\n v-if=\"!allRequiredFilterAreFilled\"\n :message=\"requiredFilterMessage\"\n />\n\n <LoadingIndicator v-else-if=\"loading\" class=\"mt-4\" />\n\n <section\n v-else-if=\"!loading && !apiData.length && hasFetch\"\n class=\"d-flex justify-center align-center text-h6 primary--text\"\n >\n Não há dados disponíveis\n </section>\n\n <section v-else-if=\"!loading && !apiData.length && !hasFetch\"></section>\n\n <section v-else class=\"mt-4 flex-grow-1 d-flex flex-column\">\n <v-data-table\n :show-select=\"readOnly ? false : true\"\n v-model=\"selectedRows\"\n :headers=\"tableHeaders\"\n :items=\"apiData\"\n :loading=\"loading\"\n fixed-header\n class=\"text-no-wrap d-flex flex-column\"\n :item-key=\"primaryKey\"\n :options.sync=\"paginationOptions\"\n v-bind=\"{\n serverItemsLength: useServerSidePagination\n ? paginationSettings.serverItemsLength\n : undefined,\n search: !useServerSideSearch ? filters?.search : undefined,\n }\"\n :footer-props=\"{\n itemsPerPageOptions: paginationSettings.itemsPerPageOptions,\n }\"\n >\n <template v-slot:item=\"{ item, select, isSelected }\">\n <tr\n :class=\"{\n 'selected-row': isSelected,\n 'edited-row': itemHasBeenEdited(item),\n }\"\n class=\"table-row\"\n >\n <td>\n <v-simple-checkbox\n color=\"secondary\"\n :value=\"isSelected\"\n @input=\"select($event)\"\n :ripple=\"false\"\n />\n </td>\n\n <template v-for=\"(header, headerIndex) in tableHeaders\">\n <td\n :key=\"headerIndex\"\n :class=\"{\n 'actions-column text-end': header.value === 'actions',\n }\"\n >\n <template v-if=\"header.value === 'actions'\">\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn icon v-on=\"on\" @click=\"showBaseCrudForm(item)\">\n <v-icon> mdi-pencil </v-icon>\n </v-btn>\n </template>\n <span>Editar item</span>\n </v-tooltip>\n\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-btn\n icon\n v-on=\"on\"\n @click=\"showConfirmDeleteDialog(item)\"\n >\n <v-icon> mdi-delete </v-icon>\n </v-btn>\n </template>\n <span>Deletar item</span>\n </v-tooltip>\n </template>\n\n <div\n v-else-if=\"\n header.type === 'INT' && header.columnType === 'check'\n \"\n style=\"width: 100%\"\n class=\"d-flex justify-center align-center\"\n >\n <v-simple-checkbox\n color=\"primary\"\n :value=\"formatCheckboxValue(item[header.value])\"\n @input=\"setCheckboxValue($event, item, header.value)\"\n :ripple=\"false\"\n :disabled=\"header.editable\"\n >\n </v-simple-checkbox>\n </div>\n\n <div v-else-if=\"header.img\" class=\"d-flex justify-center\">\n <v-avatar v-if=\"item[header.value]\" class=\"my-1\" size=\"54\">\n <v-img :src=\"item[header.value]\">\n <template v-slot:placeholder>\n <v-skeleton-loader type=\"avatar\"></v-skeleton-loader>\n </template>\n </v-img>\n </v-avatar>\n\n <v-avatar v-else class=\"my-1\" size=\"54\">\n <v-sheet>\n <v-icon color=\"primary\" size=\"62\">\n mdi-account-circle\n </v-icon>\n </v-sheet>\n </v-avatar>\n </div>\n\n <v-edit-dialog\n v-else-if=\"header.options\"\n :return-value.sync=\"item[header.value]\"\n large\n cancel-text=\"Cancelar\"\n save-text=\"Alterar\"\n persistent\n @cancel=\"cancelItemEditDialog(header, item)\"\n @open=\"setBackupEditedItem(item)\"\n @save=\"saveItemEditDialog(item)\"\n >\n <template v-slot:input>\n <v-autocomplete\n v-if=\"header.columnType !== 'radio'\"\n :label=\"header.text\"\n v-model=\"item[header.value]\"\n :items=\"getOptions(header, item)\"\n item-label=\"text\"\n return-object\n :clearable=\"!isRequired(header)\"\n @change=\"\n setSelectedOption(\n item,\n header.columnId,\n header.value,\n $event\n )\n \"\n />\n\n <v-select\n v-else\n :label=\"header.text\"\n :items=\"header.options\"\n item-value=\"text\"\n v-model=\"item[header.value]\"\n :clearable=\"!isRequired(header)\"\n />\n </template>\n\n {{ getFormatedItemValue(header, item[header.value]) }}\n </v-edit-dialog>\n\n <v-edit-dialog\n v-else-if=\"!header.options && header.editable\"\n :return-value.sync=\"item[header.value]\"\n large\n cancel-text=\"Cancelar\"\n save-text=\"Alterar\"\n persistent\n @cancel=\"cancelItemEditDialog(header, item)\"\n @open=\"setBackupEditedItem(item)\"\n @save=\"saveItemEditDialog(item)\"\n >\n <template v-slot:input>\n <v-text-field\n v-if=\"header.type === 'VARCHAR' || header.type === 'TEXT'\"\n v-model=\"item[header.value]\"\n :label=\"header.text\"\n type=\"text\"\n single-line\n :counter=\"header.length\"\n :maxlength=\"header.length\"\n />\n\n <v-text-field\n v-if=\"\n header.type === 'INT' && header.columnType !== 'check'\n \"\n v-model.number=\"item[header.value]\"\n :label=\"header.text\"\n type=\"number\"\n single-line\n :counter=\"header.length\"\n :maxlength=\"header.length\"\n />\n\n <v-text-field\n v-if=\"header.type === 'DECIMAL'\"\n v-model.number=\"item[header.value]\"\n @change=\"formatFloat(item[header.value])\"\n :label=\"header.text\"\n type=\"number\"\n single-line\n :counter=\"header.length\"\n :maxlength=\"header.length\"\n />\n\n <DatePicker\n v-if=\"\n header.type === 'DATETIME' || header.type === 'DATE'\n \"\n :initial-value=\"item[header.value]\"\n :label=\"header.text\"\n @setDatepickerValue=\"item[header.value] = $event\"\n />\n </template>\n\n <span\n class=\"d-flex\"\n :class=\"\n header.align === 'center'\n ? ' justify-center'\n : 'justify-start'\n \"\n >\n {{ getFormatedItemValue(header, item[header.value]) }}\n </span>\n </v-edit-dialog>\n\n <div\n v-else\n class=\"d-flex\"\n :class=\"\n header.align === 'center'\n ? ' justify-center'\n : 'justify-start'\n \"\n >\n {{ getFormatedItemValue(header, item[header.value]) }}\n </div>\n </td>\n </template>\n </tr>\n </template>\n\n <template v-slot:footer.prepend>\n <slot name=\"footer-prepend\"></slot>\n </template>\n </v-data-table>\n </section>\n\n <UnsavedChangesDialog\n ref=\"unsavedChangesDialogRef\"\n @hidden=\"closeUnsavedChangesDialog\"\n />\n <ConfirmDeleteDialog\n ref=\"confirmDeleteDialogRef\"\n @submit=\"deleteSelectedRows\"\n @hidden=\"closeConfirmDeleteDialog\"\n />\n\n <BaseCrudForm\n ref=\"baseCrudFormRef\"\n @hidden=\"closeBaseCrudForm\"\n @submit=\"handleSubmit\"\n :headers=\"headers\"\n :primary-key=\"primaryKey\"\n :formSettings=\"formSettings\"\n />\n\n <BaseCrudSecondaryFiltersDrawer\n ref=\"baseCrudSecondaryFiltersDrawerRef\"\n :filters=\"filters?.secondary\"\n @hidden=\"closeSecondaryFilters\"\n @refresh=\"handleReload\"\n @clear:filters=\"clearSecondaryFilters\"\n />\n </BaseViewLayout>\n</template>\n\n<script>\nimport BaseViewLayout from \"./BaseViewLayout.vue\";\nimport {\n ImportFileButton,\n ExportFileButton,\n RefreshButton,\n DeleteItemButton,\n NewItemButton,\n DuplicatedItemButton,\n EditItemButton,\n SaveButton,\n UndoChangesButton,\n FiltersButton,\n} from \"../buttons\";\nimport {\n ConfirmDeleteDialog,\n LoadingIndicator,\n UnsavedChangesDialog,\n BaseCrudForm,\n} from \"../forms\";\nimport RequiredFilterMessage from \"./RequiredFilterMessage.vue\";\nimport { DatePicker } from \"../date-pickers\";\nimport { BaseCrudSecondaryFiltersDrawer } from \"../drawers\";\n\nexport default {\n props: {\n tableIcon: {\n type: String,\n required: true,\n },\n tableName: {\n type: String,\n required: true,\n },\n endpoint: {\n type: Array,\n required: true,\n },\n filters: {\n type: Object,\n required: false,\n },\n tableOptions: {\n type: Array,\n },\n formOptions: {\n type: Array,\n required: false,\n default: () => [],\n },\n apiData: {\n type: Array,\n required: true,\n default: () => [],\n },\n headers: {\n type: Array,\n required: true,\n default: () => [],\n },\n loading: {\n type: Boolean,\n required: true,\n default: false,\n },\n hasFetch: {\n type: Boolean,\n required: true,\n default: false,\n },\n paginationSettings: {\n type: Object,\n required: true,\n },\n useServerSidePagination: {\n type: Boolean,\n required: false,\n default: false,\n },\n useServerSideSearch: {\n type: Boolean,\n required: false,\n default: false,\n },\n primaryKey: {\n type: String,\n required: true,\n },\n rowsChanged: {\n type: Set,\n required: true,\n },\n onReload: {\n type: Function,\n required: true,\n },\n onExport: {\n type: Function,\n required: true,\n },\n onImport: {\n type: Function,\n required: true,\n },\n onSave: {\n type: Function,\n required: true,\n },\n onDelete: {\n type: Function,\n required: true,\n },\n formSettings: {\n type: Object,\n required: true,\n },\n \"update:rows-changed\": {\n type: Function,\n required: false,\n },\n \"update:row\": {\n type: Function,\n required: false,\n },\n },\n\n components: {\n BaseViewLayout,\n ImportFileButton,\n ExportFileButton,\n RefreshButton,\n DeleteItemButton,\n NewItemButton,\n DuplicatedItemButton,\n EditItemButton,\n UnsavedChangesDialog,\n RequiredFilterMessage,\n LoadingIndicator,\n DatePicker,\n SaveButton,\n ConfirmDeleteDialog,\n UndoChangesButton,\n BaseCrudForm,\n BaseCrudSecondaryFiltersDrawer,\n FiltersButton,\n },\n data() {\n return {\n selectedRows: [],\n selected: [],\n readOnly: false,\n fileUploaderRef: null,\n loadingExport: false,\n loadingImport: false,\n loadingSave: false,\n loadingDelete: false,\n backupEditedItemsMap: new Map(),\n tableMaxHeigth: 0,\n alreadySetTableHeigth: false,\n primaryFilterTab: 0,\n isComponentMounted: false,\n };\n },\n\n computed: {\n paginationOptions: {\n get() {\n return this.paginationSettings;\n },\n set(newValue) {\n const oldValue = this.paginationSettings;\n const isEqual =\n newValue.page === oldValue.page &&\n newValue.itemsPerPage === oldValue.itemsPerPage;\n\n if (isEqual) return;\n\n const paginationSettings = this.paginationSettings;\n\n paginationSettings.page = newValue.page;\n paginationSettings.itemsPerPage = newValue.itemsPerPage;\n paginationSettings.sortBy = newValue.sortBy;\n paginationSettings.sortDesc = newValue.sortDesc;\n\n if (this.useServerSidePagination) this.handleReload();\n },\n },\n itemsIndexByPrimaryKey() {\n const itemsMap = new Map();\n\n for (const [index, item] of this.apiData.entries()) {\n const itemPrimaryKey = item[this.primaryKey];\n\n itemsMap.set(itemPrimaryKey, index);\n }\n\n return itemsMap;\n },\n tableOptionsByColumnMap() {\n const tableOptionsMap = new Map();\n\n if (!this.tableOptions?.length) return tableOptionsMap;\n\n for (const tableOption of this.tableOptions) {\n tableOptionsMap.set(tableOption.column, tableOption);\n }\n\n return tableOptionsMap;\n },\n primaryFilterOptionIndexByColumnMap() {\n const primaryFiltersMap = new Map();\n\n if (!this.filters?.primary?.length) return primaryFiltersMap;\n\n for (const [tabIndex, tab] of this.filters?.primary.entries()) {\n for (const [filterIndex, primaryFilter] of tab?.filters.entries()) {\n primaryFiltersMap.set(primaryFilter.column, [tabIndex, filterIndex]);\n }\n }\n\n return primaryFiltersMap;\n },\n hasRowsSelected() {\n return this.selectedRows.length;\n },\n\n hasOnlyOneRowSelected() {\n return this.selectedRows.length === 1;\n },\n selectedRowIsEdited() {\n if (!this.hasOnlyOneRowSelected) return false;\n\n const itemPrimaryKey = this.selectedRows[0][this.primaryKey];\n\n if (!itemPrimaryKey) return false;\n\n const itemIndex = this.itemsIndexByPrimaryKey.get(itemPrimaryKey);\n\n if (isNaN(itemIndex)) return false;\n\n return this.rowsChanged.has(itemIndex);\n },\n requiredFilterMessage() {\n if (!this.filters?.primary?.length) return \"\";\n\n for (const tab of this?.filters?.primary) {\n for (const filter of tab.filters) {\n if (!filter?.componentProps?.required) continue;\n\n if (filter.value) continue;\n\n return this.getRequiredFilterMessage(filter?.componentProps?.label);\n }\n }\n\n return \"\";\n },\n allRequiredFilterAreFilled() {\n if (!this.filters?.primary?.length) return true;\n\n const requiredFilters = [];\n\n for (const tab of this?.filters?.primary) {\n requiredFilters.push(\n ...tab.filters.filter((filter) => filter?.componentProps?.required)\n );\n }\n\n if (!requiredFilters.length) return true;\n\n return requiredFilters.every((filter) => filter.value);\n },\n tableHeaders() {\n const headersArray = [];\n\n for (const header of this.headers) {\n if (header?.hideInTable) continue;\n\n headersArray.push(header);\n }\n\n return headersArray;\n },\n hasPrimaryFilters() {\n return this.filters?.primary.some((tab) => tab.filters.length);\n },\n hasSecondaryFilters() {\n return this.filters?.secondary.some((tab) => tab.filters.length);\n },\n },\n methods: {\n getOptions(header, item) {\n const tableOption = this.tableOptionsByColumnMap.get(header.value);\n\n if (tableOption?.filterFunction) {\n return tableOption.filterFunction(item) ?? [];\n }\n\n return tableOption?.items ?? [];\n },\n getFormatedItemValue(header, value) {\n const tableOption = this.tableOptionsByColumnMap.get(header.value);\n\n if (!tableOption) return value;\n\n if (tableOption?.formatter) return tableOption.formatter(value);\n\n return value;\n },\n changeFilterValue(value, filter) {\n filter.value = value;\n if (filter?.hooks.afterChange) filter?.hooks.afterChange(value);\n },\n isFieldDependentFieldEmpty(filter) {\n if (!this.filters?.primary.length) return false;\n\n const dependsOnField = filter?.dependsOn;\n\n if (!dependsOnField) return false;\n\n const filterIndex =\n this.primaryFilterOptionIndexByColumnMap.get(dependsOnField);\n\n if (isNaN(filterIndex)) return true;\n\n const dependentFilter =\n this.filters.primary[filterIndex[0]].filters[filterIndex[1]];\n\n const isFieldEmpty = !dependentFilter.value;\n\n if (isFieldEmpty) return true;\n\n return false;\n },\n setSelectedOption(item, columnId, column, option) {\n if (!option) {\n item[columnId] = null;\n item[column] = null;\n return;\n }\n\n item[columnId] = option.id;\n item[column] = option.text;\n },\n formatFloat(float) {\n if (float === undefined || float === null) return \"\";\n\n return this?.$options?.filters?.floatFilter(float);\n },\n isRequired(header) {\n if (!header.rules) return false;\n return header.rules?.includes(\"required\");\n },\n formatCheckboxValue(check) {\n if (!check) return false;\n\n return true;\n },\n setCheckboxValue(value, item, headerValue) {\n this.setBackupEditedItem(item);\n\n const itemPrimaryKey = item[this.primaryKey];\n\n if (!itemPrimaryKey) return;\n\n const itemIndex = this.itemsIndexByPrimaryKey.get(itemPrimaryKey);\n\n if (isNaN(itemIndex)) return;\n\n this.rowsChanged.add(itemIndex);\n this.$emit(\"update:rows-changed\");\n\n if (value) return (item[headerValue] = 1);\n item[headerValue] = 0;\n },\n getFileUploaderRef(e) {\n this.fileUploaderRef = e;\n },\n\n closeTable() {\n if (this.rowsChanged.size) {\n return this.showUnsavedChangesDialog({\n onSave: async () => {\n const res = await this.handleSave({ reload: false });\n\n if (res?.error) return;\n\n this.$router.push(\"/\");\n },\n onWithoutSave: () => {\n this.$router.push(\"/\");\n },\n });\n }\n\n this.$router.push(\"/\");\n },\n async handleSave({ reload = true, itemData = null } = {}) {\n try {\n this.loadingSave = true;\n await this.onSave({ reload, itemData });\n\n if (itemData) this.closeBaseCrudForm();\n } catch (error) {\n this.$fnError(error);\n return { error: true };\n } finally {\n this.loadingSave = false;\n }\n },\n async handleReload() {\n if (this.rowsChanged.size) {\n return this.showUnsavedChangesDialog({\n onSave: async () => {\n const res = await this.handleSave({ reload: false });\n\n if (res?.error) return;\n\n this.reload();\n },\n onWithoutSave: () => {\n this.reload();\n },\n });\n }\n\n this.reload();\n },\n showUnsavedChangesDialog({\n onSave = () => {},\n onWithoutSave = () => {},\n } = {}) {\n this.$refs.unsavedChangesDialogRef?.show({\n onSave,\n onWithoutSave,\n });\n },\n closeUnsavedChangesDialog() {\n this.$refs.unsavedChangesDialogRef?.hidden();\n },\n async reload() {\n if (!this.allRequiredFilterAreFilled) return;\n\n try {\n this.alreadySetTableHeigth = false;\n await this.onReload();\n } catch (error) {\n this.$fnError(error);\n }\n },\n getRequiredFilterMessage(requiredFilter) {\n return `Selecione o filtro obrigatório ${requiredFilter} e atualize para exibir dados`;\n },\n importFile() {\n this.fileUploaderRef?.click();\n },\n async handleImport(event) {\n try {\n this.loadingImport = true;\n\n await this.onImport(event);\n } catch (error) {\n this.$fnError(error);\n } finally {\n event.target.value = \"\";\n this.loadingImport = false;\n }\n },\n async handleExport() {\n try {\n this.loadingExport = true;\n await this.onExport();\n } catch (error) {\n this.$fnError(error);\n } finally {\n this.loadingExport = false;\n }\n },\n async deleteSelectedRows() {\n try {\n this.loadingDelete = true;\n\n await this.onDelete(this.selectedRows);\n\n this.selectedRows = [];\n } catch (error) {\n this.$fnError(error);\n } finally {\n this.loadingDelete = false;\n }\n },\n async showConfirmDeleteDialog(row = null) {\n if (row) this.selectedRows.push(row);\n\n this.$refs.confirmDeleteDialogRef?.show();\n },\n closeConfirmDeleteDialog() {\n this.$refs.confirmDeleteDialogRef?.hidden();\n },\n itemHasBeenEdited(item) {\n const itemPrimaryKey = item[this.primaryKey];\n\n if (!itemPrimaryKey) return;\n\n const itemIndex = this.itemsIndexByPrimaryKey.get(itemPrimaryKey);\n\n if (isNaN(itemIndex)) return;\n\n return this.rowsChanged.has(itemIndex);\n },\n setBackupEditedItem(item) {\n const itemPrimaryKey = item[this.primaryKey];\n\n if (!itemPrimaryKey) return;\n\n if (this.backupEditedItemsMap.has(itemPrimaryKey)) return;\n\n this.backupEditedItemsMap.set(itemPrimaryKey, { ...item });\n },\n cancelItemEditDialog(header, item) {\n const itemPrimaryKey = item[this.primaryKey];\n\n if (!itemPrimaryKey) return;\n\n if (!this.backupEditedItemsMap.has(itemPrimaryKey)) return;\n\n const itemBackup = this.backupEditedItemsMap.get(itemPrimaryKey);\n\n item[header.value] = itemBackup[header.value];\n\n if (header.columnId) {\n item[header.columnId] = itemBackup[header.columnId];\n }\n },\n saveItemEditDialog(item) {\n const itemPrimaryKey = item[this.primaryKey];\n\n if (!itemPrimaryKey) return;\n\n const itemIndex = this.itemsIndexByPrimaryKey.get(itemPrimaryKey);\n\n if (isNaN(itemIndex)) return;\n\n this.rowsChanged.add(itemIndex);\n this.$emit(\"update:rows-changed\");\n },\n undoSelectedItemModification(row) {\n if (!row) return;\n\n const itemPrimaryKey = row[this.primaryKey];\n\n if (!itemPrimaryKey) return;\n\n const backupItem = this.backupEditedItemsMap.get(itemPrimaryKey);\n\n if (!backupItem) return;\n\n const itemIndex = this.itemsIndexByPrimaryKey.get(itemPrimaryKey);\n\n if (isNaN(itemIndex)) return;\n\n this.$emit(\"update:row\", itemIndex, backupItem);\n this.rowsChanged.delete(itemIndex);\n this.$emit(\"update:rows-changed\");\n },\n showBaseCrudForm(row = null) {\n this.$refs.baseCrudFormRef?.show(row);\n },\n closeBaseCrudForm() {\n this.$refs.baseCrudFormRef?.hidden();\n },\n async handleSubmit(data) {\n try {\n await this.handleSave({ itemData: data });\n } catch (error) {\n this.$fnError(error);\n }\n },\n duplicateSelectedItem(row) {\n const duplicatedRowData = { ...row };\n\n delete duplicatedRowData[this.primaryKey];\n\n this.showBaseCrudForm(duplicatedRowData);\n },\n\n updateSearchFilter(value) {\n if (!this.filters) return;\n\n const filters = this.filters;\n\n filters.search = value;\n },\n\n showSecondaryFilters() {\n this.$refs.baseCrudSecondaryFiltersDrawerRef?.show();\n },\n closeSecondaryFilters() {\n this.$refs.baseCrudSecondaryFiltersDrawerRef?.hidden();\n },\n clearSecondaryFilters() {\n if (!this.filters?.secondary?.length) return;\n\n for (const tab of this?.filters?.secondary) {\n for (const filter of tab.filters) {\n if (filter.type !== \"filter\") continue;\n\n filter.value = null;\n }\n }\n },\n },\n created() {\n this.paginationOptions = this.paginationSettings;\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n.edited-row {\n background-color: #fdebb9b6;\n}\n\n.edited-row:hover {\n background-color: #fad777b6 !important;\n}\n\n.sum-row {\n background-color: #ddd;\n font-weight: bold;\n}\n\n.sum-row:hover {\n background-color: #ddd !important;\n}\n\n.selected-row {\n background-color: #eee !important;\n}\n\n.selected-row:hover {\n background-color: #ddd !important;\n}\n</style>\n","<template>\n <HotTable\n ref=\"hotTable\"\n v-bind=\"$attrs\"\n v-on=\"$listeners\"\n :licenseKey=\"licenseKey\"\n language=\"pt-BR\"\n >\n <slot />\n </HotTable>\n</template>\n\n<script>\nimport { HotTable } from \"@handsontable/vue\";\nimport \"../../../public/styles/handsontable/custom-handsontable.css\";\nimport \"handsontable/dist/handsontable.full.min.css\";\n\nexport default {\n components: {\n HotTable,\n },\n computed: {\n licenseKey() {\n if (!this.$configs.licenseKey) return \"\";\n\n return this.$configs.licenseKey;\n },\n hotInstance() {\n return this.$refs.hotTable.hotInstance;\n },\n hotTableRef() {\n return this.$refs.hotTable;\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped></style>\n","<template>\n <div class=\"month-selector d-flex align-center\">\n <!-- Checkbox com Label -->\n <v-checkbox\n label=\"Mês\"\n v-model=\"showMonths\"\n :disabled=\"disabled\"\n dense\n hide-details\n class=\"pa-0 ma-0\"\n @change=\"onCheckboxChange\"\n />\n\n <!-- Botão de menu -->\n <v-menu bottom left :close-on-content-click=\"false\">\n <template v-slot:activator=\"{ on }\">\n <v-btn icon v-on=\"on\" x-small class=\"ma-0 pa-0\" :disabled=\"disabled\">\n <v-icon>mdi-dots-vertical</v-icon>\n </v-btn>\n </template>\n\n <v-sheet class=\"px-4 py-2\" max-width=\"260px\">\n <v-select\n v-model=\"selectedMonths\"\n :items=\"months\"\n label=\"Escolha os meses\"\n multiple\n return-object\n @change=\"updateSelection\"\n >\n <template v-slot:selection=\"{ item, index }\">\n <span v-if=\"index === 0\">{{ item.text }}</span>\n <span v-if=\"index === 1\">, {{ item.text }}</span>\n <template v-if=\"index === 2\">\n <span>...</span>\n <span class=\"grey--text text-caption pa-1\">\n +{{ selectedMonths.length - 2 }}\n </span>\n </template>\n </template>\n </v-select>\n\n <div class=\"d-flex justify-end\">\n <v-btn\n small\n color=\"primary\"\n class=\"ma-0 mb-2\"\n @click=\"selectAll\"\n :disabled=\"selectedMonths.length === 12\"\n >\n Selecionar todos\n </v-btn>\n </div>\n </v-sheet>\n </v-menu>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n isYear2: {\n type: Boolean,\n default: false,\n },\n value: {\n type: Array,\n required: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n const months = [\n { text: \"Janeiro\", value: 1 },\n { text: \"Fevereiro\", value: 2 },\n { text: \"Março\", value: 3 },\n { text: \"Abril\", value: 4 },\n { text: \"Maio\", value: 5 },\n { text: \"Junho\", value: 6 },\n { text: \"Julho\", value: 7 },\n { text: \"Agosto\", value: 8 },\n { text: \"Setembro\", value: 9 },\n { text: \"Outubro\", value: 10 },\n { text: \"Novembro\", value: 11 },\n { text: \"Dezembro\", value: 12 },\n ];\n\n return {\n months,\n selectedMonths: this.value.length ? this.value : [...months],\n showMonths: !this.isYear2,\n };\n },\n\n watch: {\n value(newValue) {\n this.selectedMonths = newValue.length ? newValue : [...this.months];\n },\n },\n\n methods: {\n selectAll() {\n this.selectedMonths = [...this.months];\n this.$emit(\"input\", this.selectedMonths);\n },\n\n onCheckboxChange() {\n if (this.showMonths) {\n this.selectedMonths = [...this.months];\n } else {\n this.selectedMonths = [];\n }\n this.$emit(\"input\", this.selectedMonths);\n },\n\n updateSelection() {\n this.$emit(\"input\", this.selectedMonths);\n },\n },\n};\n</script>\n","<template>\n <div class=\"quarter-selector d-flex align-center\">\n <!-- Checkbox com Label -->\n <v-checkbox\n label=\"Tri\"\n v-model=\"showQuarters\"\n :disabled=\"disabled\"\n dense\n hide-details\n class=\"pa-0 ma-0\"\n @change=\"onCheckboxChange\"\n />\n\n <v-menu bottom left :close-on-content-click=\"false\">\n <template v-slot:activator=\"{ on }\">\n <v-btn icon v-on=\"on\" x-small class=\"ma-0 pa-0\" :disabled=\"disabled\">\n <v-icon>mdi-dots-vertical</v-icon>\n </v-btn>\n </template>\n\n <v-sheet class=\"px-4 py-2\" max-width=\"260px\">\n <v-select\n v-model=\"selectedQuarters\"\n :items=\"quarters\"\n label=\"Escolha os trimestres\"\n multiple\n return-object\n @change=\"updateSelection\"\n >\n <template v-slot:selection=\"{ item, index }\">\n <span v-if=\"index === 0\">{{ item.text }}</span>\n <span v-if=\"index === 1\">, {{ item.text }}</span>\n <template v-if=\"index === 2\">\n <span>...</span>\n <span class=\"grey--text text-caption pa-1\">\n +{{ selectedQuarters.length - 2 }}\n </span>\n </template>\n </template>\n </v-select>\n\n <div class=\"d-flex justify-end\">\n <v-btn\n small\n color=\"primary\"\n class=\"ma-0 mb-2\"\n @click=\"selectAll\"\n :disabled=\"selectedQuarters.length === 12\"\n >\n Selecionar todos\n </v-btn>\n </div>\n </v-sheet>\n </v-menu>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n value: {\n type: Array,\n required: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n const quarters = [\n { text: \"1º Trimestre\", value: 1 },\n { text: \"2º Trimestre\", value: 2 },\n { text: \"3º Trimestre\", value: 3 },\n { text: \"4º Trimestre\", value: 4 },\n ];\n return {\n quarters,\n selectedQuarters: this.value.length ? this.value : [...quarters],\n showQuarters: false,\n };\n },\n\n watch: {\n value(newValue) {\n this.selectedQuarters = newValue;\n },\n },\n\n methods: {\n selectAll() {\n this.selectedQuarters = [...this.quarters];\n this.$emit(\"input\", this.selectedQuarters);\n },\n\n onCheckboxChange() {\n if (this.showQuarters) {\n this.selectedQuarters = [...this.quarters];\n } else {\n this.selectedQuarters = [];\n }\n this.$emit(\"input\", this.selectedQuarters, this.showQuarters);\n },\n\n updateSelection() {\n this.$emit(\"input\", this.selectedQuarters, this.showQuarters);\n },\n },\n};\n</script>\n","<template>\n <div class=\"semester-selector d-flex align-center\">\n <v-checkbox\n label=\"Sem\"\n v-model=\"showSemesters\"\n :disabled=\"disabled\"\n dense\n hide-details\n class=\"pa-0 ma-0\"\n @change=\"onCheckboxChange\"\n />\n\n <v-menu bottom left :close-on-content-click=\"false\">\n <template v-slot:activator=\"{ on }\">\n <v-btn icon v-on=\"on\" x-small class=\"ma-0 pa-0\" :disabled=\"disabled\">\n <v-icon>mdi-dots-vertical</v-icon>\n </v-btn>\n </template>\n\n <v-sheet class=\"px-4 py-2\" max-width=\"260px\">\n <v-select\n v-model=\"selectedSemesters\"\n :items=\"semesters\"\n label=\"Escolha os semestres\"\n multiple\n return-object\n @change=\"updateSelection\"\n >\n <template v-slot:selection=\"{ item, index }\">\n <span v-if=\"index === 0\">{{ item.text }}</span>\n <span v-if=\"index === 1\">, {{ item.text }}</span>\n </template>\n </v-select>\n\n <div class=\"d-flex justify-end\">\n <v-btn\n small\n color=\"primary\"\n class=\"ma-0 mb-2\"\n @click=\"selectAll\"\n :disabled=\"selectedSemesters.length === 2\"\n >\n Selecionar todos\n </v-btn>\n </div>\n </v-sheet>\n </v-menu>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n value: {\n type: Array,\n required: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n const semesters = [\n { text: \"1º Semestre\", value: 1 },\n { text: \"2º Semestre\", value: 2 },\n ];\n return {\n semesters,\n selectedSemesters: this.value.length ? this.value : [...semesters],\n showSemesters: false,\n };\n },\n\n watch: {\n value(newValue) {\n this.selectedSemesters = newValue;\n },\n },\n\n methods: {\n selectAll() {\n this.selectedSemesters = [...this.semesters];\n this.$emit(\"input\", this.selectedSemesters);\n },\n\n onCheckboxChange() {\n if (this.showSemesters) {\n this.selectedSemesters = [...this.semesters];\n } else {\n this.selectedSemesters = [];\n }\n this.$emit(\"input\", this.selectedSemesters);\n },\n\n updateSelection() {\n this.$emit(\"input\", this.selectedSemesters);\n },\n },\n};\n</script>\n","<template>\n <div class=\"year-selector d-flex align-center\">\n <v-checkbox\n v-model=\"yearSelected\"\n label=\"Ano\"\n :disabled=\"disabled\"\n :input-value=\"yearSelected\"\n dense\n hide-details\n class=\"pa-0 ma-0\"\n @change=\"updateSelection\"\n />\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n value: {\n type: Boolean,\n default: true,\n },\n disabled: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n return {\n yearSelected: this.value,\n };\n },\n\n watch: {\n value(newValue) {\n this.yearSelected = newValue;\n },\n },\n\n methods: {\n updateSelection() {\n this.$emit(\"input\", this.yearSelected);\n },\n },\n};\n</script>\n","<template>\n <div class=\"period-selector\">\n <span class=\"text-h6 mr-4\">{{ yearLabel }}</span>\n <div class=\"d-flex mt-1\">\n <MonthSelector\n :isYear2=\"isYear2\"\n :value=\"selectedMonths\"\n :disabled=\"disableActionButtons\"\n @input=\"updateMonths\"\n />\n\n <QuarterSelector\n :value=\"selectedQuarters\"\n :disabled=\"disableActionButtons\"\n @input=\"updateQuarters\"\n />\n\n <SemesterSelector\n :value=\"selectedSemesters\"\n :disabled=\"disableActionButtons\"\n @input=\"updateSemesters\"\n />\n\n <YearSelector\n :value=\"yearSelected\"\n :disabled=\"disableActionButtons\"\n @input=\"updateYear\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport MonthSelector from \"./MonthSelector.vue\";\nimport QuarterSelector from \"./QuarterSelector.vue\";\nimport SemesterSelector from \"./SemesterSelector.vue\";\nimport YearSelector from \"./YearSelector.vue\";\n\nexport default {\n components: {\n MonthSelector,\n QuarterSelector,\n SemesterSelector,\n YearSelector,\n },\n\n props: {\n year: {\n type: Number,\n required: true,\n },\n isYear2: {\n type: Boolean,\n default: false,\n },\n disableActionButtons: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n const months = [\n { text: \"Janeiro\", value: 1 },\n { text: \"Fevereiro\", value: 2 },\n { text: \"Março\", value: 3 },\n { text: \"Abril\", value: 4 },\n { text: \"Maio\", value: 5 },\n { text: \"Junho\", value: 6 },\n { text: \"Julho\", value: 7 },\n { text: \"Agosto\", value: 8 },\n { text: \"Setembro\", value: 9 },\n { text: \"Outubro\", value: 10 },\n { text: \"Novembro\", value: 11 },\n { text: \"Dezembro\", value: 12 },\n ];\n return {\n selectedMonths: this.isYear2 ? [] : months,\n selectedQuarters: [],\n selectedSemesters: [],\n yearSelected: !this.isYear2,\n };\n },\n\n computed: {\n yearLabel() {\n return this.year.toString();\n },\n },\n\n methods: {\n updateMonths(value) {\n this.selectedMonths = value;\n this.updateSelection();\n },\n\n updateQuarters(value) {\n this.selectedQuarters = value;\n this.updateSelection();\n },\n\n updateSemesters(value) {\n this.selectedSemesters = value;\n this.updateSelection();\n },\n\n updateYear(value) {\n this.yearSelected = value;\n this.updateSelection();\n },\n\n updateSelection() {\n this.$emit(\"update:selection\", {\n months: this.selectedMonths,\n quarters: this.selectedQuarters,\n semesters: this.selectedSemesters,\n yearSelected: this.yearSelected,\n });\n },\n },\n};\n</script>\n\n<style scoped>\n.period-selector {\n display: flex;\n align-items: center;\n}\n</style>\n","<template>\n <div class=\"view\">\n <v-row align=\"center\" no-gutters>\n <div class=\"d-flex justify-start\">\n <PeriodSelector\n :isYear2=\"false\"\n :year=\"year1\"\n :disable-action-buttons=\"disableActionButtons\"\n @update:selection=\"updateYear1Selection\"\n />\n\n <v-divider vertical v-if=\"year2\" class=\"mx-4\" />\n\n <PeriodSelector\n v-if=\"year2\"\n isYear2\n :year=\"year2\"\n :disable-action-buttons=\"disableActionButtons\"\n @update:selection=\"updateYear2Selection\"\n />\n </div>\n </v-row>\n </div>\n</template>\n\n<script>\nimport PeriodSelector from \"./PeriodSelector.vue\";\n\nexport default {\n components: {\n PeriodSelector,\n },\n\n props: {\n year1: {\n type: Number,\n required: true,\n },\n year2: {\n type: Number,\n default: null,\n },\n disableActionButtons: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n return {\n year1Selection: {},\n year2Selection: {},\n };\n },\n\n methods: {\n updateYear1Selection(selection) {\n this.year1Selection = selection;\n this.$emit(\"update:year1\", selection);\n },\n\n updateYear2Selection(selection) {\n this.year2Selection = selection;\n this.$emit(\"update:year2\", selection);\n },\n },\n};\n</script>\n","import {\n Column,\n CreateFilterTab,\n CrudViewConfigsParams,\n CurrentFiltersOptions,\n Endpoint,\n Filter,\n FiltersOptions,\n FilterTab,\n FormHooks,\n FormOption,\n FormSettings,\n Header,\n PaginationSettings,\n TableOption,\n} from \"./types\";\n\nexport class CrudViewConfigs {\n tableName = \"\";\n tableIcon = \"\";\n hasFetch = false;\n readOnly = false;\n allowExport = false;\n allowImport = false;\n baseTransaction = \"\";\n useServerSidePagination = false;\n useServerSideSearch = false;\n primaryKey = \"\";\n endpoint: Endpoint;\n paginationSettings: PaginationSettings = {\n page: 1,\n itemsPerPage: 15,\n serverItemsLength: null,\n sortBy: [],\n sortDesc: [],\n itemsPerPageOptions: [5, 10, 15, 25, 50, 100, -1],\n };\n headers: Header[] = [];\n columns: Column[] = [];\n apiData: any[] = [];\n searchColums: string[] = [];\n rowsChanged = new Set<number>();\n filters: FiltersOptions = {\n primary: [\n {\n filters: [],\n title: \"Filtros Principais\",\n },\n ],\n secondary: [{ filters: [], title: \"Filtros Secundários\" }],\n search: \"\",\n };\n currentFilters: CurrentFiltersOptions = {\n primary: [],\n secondary: [],\n search: \"\",\n };\n loading = false;\n tableOptions: TableOption[] = [];\n formSettings: FormSettings = {\n baseModel: {},\n formOptions: [],\n hooks: {},\n loading: false,\n };\n\n private avalibleFilterComponents = new Set([\n \"v-autocomplete\",\n \"v-checkbox\",\n \"date-picker\",\n \"v-text-field\",\n ]);\n private avalibleFormOptionHooks = new Set([\"afterChange\", \"beforeChange\"]);\n private avalibleFilterOptionHooks = new Set([\"afterChange\"]);\n private avalibleFormHooks = new Set([\"beforeSetItem\", \"afterSetItem\"]);\n\n constructor({\n viewTitle,\n viewIcon,\n primaryKey,\n endpoint,\n baseTransaction,\n readOnly = false,\n allowExport = true,\n allowImport = true,\n useServerSidePagination = false,\n useServerSideSearch = false,\n }: CrudViewConfigsParams) {\n this.tableName = viewTitle;\n this.tableIcon = viewIcon;\n this.primaryKey = primaryKey;\n this.readOnly = readOnly;\n this.allowExport = allowExport;\n this.allowImport = allowImport;\n this.baseTransaction = baseTransaction;\n this.endpoint = this.isValidEndpoint(endpoint)\n ? (endpoint as Endpoint)\n : CrudViewConfigs.generateEndpoint();\n\n this.useServerSidePagination = useServerSidePagination;\n if (useServerSidePagination) useServerSideSearch = true;\n\n this.useServerSideSearch = useServerSideSearch;\n }\n\n get viewConfigs() {\n return {\n tableName: this.tableName,\n tableIcon: this.tableIcon,\n headers: this.headers,\n columns: this.columns,\n apiData: this.apiData,\n useServerSidePagination: this.useServerSidePagination,\n useServerSideSearch: this.useServerSideSearch,\n paginationSettings: this.paginationSettings,\n searchColums: this.searchColums,\n primaryKey: this.primaryKey,\n loading: this.loading,\n rowsChanged: this.rowsChanged,\n filters: this.filters,\n currentFilters: this.currentFilters,\n tableOptions: this.tableOptions,\n formSettings: this.formSettings,\n endpoint: this.endpoint,\n hasFetch: this.hasFetch,\n };\n }\n\n get viewMethods() {\n return {\n getFilters: this.getFilters.bind(this),\n getDisplayFilters: this.getDisplayFilters.bind(this),\n fetchTableOptionsData: this.fetchTableOptionsData.bind(this),\n fetchFormOptionsData: this.fetchFormOptionsData.bind(this),\n fetchFiltersData: this.fetchFiltersData.bind(this),\n setCurrentFilters: this.setCurrentFilters.bind(this),\n validateFiltersKeyHaveChange:\n this.validateFiltersKeyHaveChange.bind(this),\n };\n }\n\n private validateFiltersKeyHaveChange(\n filters: FiltersOptions,\n currentFilters: CurrentFiltersOptions,\n keysToValidate = [\"search\", \"primary\", \"secondary\"]\n ) {\n const filtersToCheck = this.getCurrentFilters(filters);\n\n return keysToValidate.some((key) => {\n if (Array.isArray(filters[key])) {\n return filtersToCheck[key].some(\n (filterValue: any, index: number) =>\n filterValue !== currentFilters[key][index]\n );\n }\n\n return filters[key] !== currentFilters[key];\n });\n }\n\n private getSearchFilters(searchValue: string, searchColums: string[]) {\n return searchColums.map((column) => ({\n AndOr: \"OR\",\n column,\n operator: \"CONTAINS\",\n value: searchValue,\n type: \"search\",\n }));\n }\n\n private getFilters(filters: FiltersOptions, searchColums: string[]) {\n const conditions: any[] = [];\n\n filters?.primary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type === \"display\") return;\n\n if ([null, undefined].includes(filter.value)) return;\n\n const isDateFilter = filter.component === \"date-picker\";\n\n if (isDateFilter) {\n const isRange = filter.componentProps?.range;\n return conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: isRange ? \"BETWEEN\" : \"=\",\n value: isRange ? filter.value[0] : filter.value,\n value2: isRange ? filter.value[1] : null,\n });\n }\n\n const isCheckBoxFilter = filter.component === \"v-checkbox\";\n\n if (isCheckBoxFilter) {\n return conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: \"=\",\n value: filter.value ? 1 : 0,\n });\n }\n\n if (!filter.componentProps?.multiple) {\n return conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: \"=\",\n value: filter.value,\n });\n }\n\n if (!filter.value.length) return;\n\n conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: \"IN\",\n value: filter.value,\n });\n });\n });\n\n filters?.secondary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type === \"display\") return;\n if ([null, undefined].includes(filter.value)) return;\n\n const isDateInput = filter.component === \"date-picker\";\n\n if (isDateInput) {\n const isRange = filter.componentProps?.range;\n\n return conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: isRange ? \"BETWEEN\" : \"=\",\n value: isRange ? filter.value[0] : filter.value,\n value2: isRange ? filter.value[2] : null,\n });\n }\n\n const isCheckBoxFilter = filter.component === \"v-checkbox\";\n\n if (isCheckBoxFilter) {\n return conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: \"=\",\n value: filter.value ? 1 : 0,\n });\n }\n\n if (!filter.componentProps?.multiple) {\n return conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: \"=\",\n value: filter.value,\n });\n }\n\n if (!filter.value.length) return;\n\n conditions.push({\n AndOr: \"AND\",\n column: filter.column,\n operator: \"IN\",\n value: filter.value,\n });\n });\n });\n\n if (filters?.search && searchColums?.length) {\n const searchConditions = this.getSearchFilters(\n filters.search,\n searchColums\n );\n\n conditions.push(...searchConditions);\n }\n\n return conditions;\n }\n\n private getDisplayFilters(filters: FiltersOptions) {\n const displayFilters: [string, boolean | number][] = [];\n\n filters?.primary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type !== \"display\") return;\n\n displayFilters.push([filter.column, filter.value]);\n });\n });\n\n filters?.secondary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type !== \"display\") return;\n\n displayFilters.push([filter.column, filter.value]);\n });\n });\n\n return displayFilters;\n }\n\n private setCurrentFilters(filters: FiltersOptions) {\n this.currentFilters.primary = [];\n this.currentFilters.secondary = [];\n this.currentFilters.search = \"\";\n\n filters?.primary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type === \"display\") return;\n\n this.currentFilters.primary.push(filter.value);\n });\n });\n\n filters?.secondary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type === \"display\") return;\n this.currentFilters.secondary.push(filter.value);\n });\n });\n\n this.currentFilters.search = filters.search;\n\n return this.currentFilters;\n }\n\n getCurrentFilters(filters: FiltersOptions) {\n const currentFilters: CurrentFiltersOptions = {\n primary: [],\n secondary: [],\n search: \"\",\n };\n\n filters?.primary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type === \"display\") return;\n\n currentFilters.primary.push(filter.value);\n });\n });\n\n filters?.secondary?.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter?.type === \"display\") return;\n currentFilters.secondary.push(filter.value);\n });\n });\n\n currentFilters.search = filters.search;\n\n return currentFilters;\n }\n\n async fetchTableOption(tableOption: TableOption, httpFetcher: any) {\n if (!tableOption.endpoint?.length || !tableOption?.endpoint[0]) return;\n\n try {\n const response = await httpFetcher.post(\n tableOption.endpoint[0],\n tableOption.endpoint[1] ?? {}\n );\n tableOption.items = response?.data?.rows ?? [];\n } catch (error) {\n console.error(error);\n }\n }\n\n private async fetchTableOptionsData(\n tableOptions: TableOption[],\n httpFetcher: any\n ) {\n const optionsPromises: any[] = [];\n\n tableOptions.forEach((option: any) => {\n if (option?.ignoreOnFetchFunction) return optionsPromises.push(null);\n\n optionsPromises.push(this.fetchTableOption(option, httpFetcher));\n });\n\n await Promise.all(optionsPromises);\n }\n\n async fetchFormOption(formOption: FormOption, httpFetcher: any) {\n if (!formOption.endpoint?.length || !formOption?.endpoint[0]) return;\n\n try {\n formOption.loading = true;\n\n const response = await httpFetcher.post(\n formOption.endpoint[0],\n formOption.endpoint[1] ?? {}\n );\n\n formOption.items = response?.data?.rows ?? [];\n } catch (error) {\n console.error(error);\n } finally {\n formOption.loading = false;\n }\n }\n\n private async fetchFormOptionsData(\n formOptions: FormOption[],\n httpFetcher: any\n ) {\n const optionsPromises: any[] = [];\n\n formOptions.forEach((option: any) => {\n if (option.ignoreOnFetchFunction) return;\n\n optionsPromises.push(this.fetchFormOption(option, httpFetcher));\n });\n\n await Promise.all(optionsPromises);\n }\n\n async fetchFilter(filter: Filter, httpFetcher: any): Promise<void> {\n if (!filter.endpoint?.length || !filter.endpoint[0]) return;\n\n try {\n filter.componentProps.loading = true;\n\n const response = await httpFetcher.post(\n filter.endpoint[0],\n filter.endpoint[1] ?? {}\n );\n\n filter.items = response?.data?.rows ?? [];\n } catch (error) {\n console.error(error);\n } finally {\n filter.componentProps.loading = false;\n }\n }\n\n private async fetchFiltersData(filters: FiltersOptions, httpFetcher: any) {\n const filterPromises: Promise<any>[] = [];\n\n filters.primary.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter.ignoreOnFetchFunction) return;\n\n filterPromises.push(this.fetchFilter(filter, httpFetcher));\n });\n });\n\n filters.secondary.forEach((tab) => {\n tab.filters.forEach((filter) => {\n if (filter.ignoreOnFetchFunction) return;\n\n filterPromises.push(this.fetchFilter(filter, httpFetcher));\n });\n });\n\n await Promise.all([filterPromises]);\n }\n\n static generateEndpoint(\n url = \"\",\n params = { conditions: [] as any[] }\n ): Endpoint {\n if (!url) return [\"\", params];\n\n return [url, params];\n }\n\n private isValidEndpoint(endpoint: any) {\n if (!Array.isArray(endpoint)) return false;\n\n if (!endpoint?.length) return false;\n\n if (typeof endpoint[0] !== \"string\") return false;\n\n return true;\n }\n\n private isValidColumn(column: any) {\n if (typeof column !== \"string\") return false;\n\n return true;\n }\n\n private isValidItemsArray(column: any) {\n if (!Array.isArray(column)) return false;\n\n return true;\n }\n\n createFilterTab(title: string): CreateFilterTab {\n const tab = { title, filters: [] } as FilterTab;\n\n const builder = {\n addFilter: (filterData: Filter) => {\n tab.filters.push(this.generateFilter(filterData));\n return builder;\n },\n build: () => tab,\n } as CreateFilterTab;\n\n return builder;\n }\n\n addNewPrimaryFilterTab(tab: FilterTab) {\n this.filters.primary.push(tab);\n return this;\n }\n\n addPrimaryFilter(filterData: Filter) {\n this.filters.primary[0].filters.push(this.generateFilter(filterData));\n return this;\n }\n\n addNewSecondaryFilterTab(tab: FilterTab) {\n this.filters.secondary.push(tab);\n return this;\n }\n\n addSecondaryFilter(filterData: Filter) {\n this.filters.secondary[0].filters.push(this.generateFilter(filterData));\n return this;\n }\n\n generateFilter({\n column = \"\",\n component,\n items = [],\n value = null,\n endpoint = CrudViewConfigs.generateEndpoint(),\n componentProps = {},\n hooks = {},\n dependsOn = \"\",\n ignoreOnFetchFunction = false,\n type = \"filter\",\n }: Filter) {\n if (!this.avalibleFilterComponents.has(component))\n throw new Error(\n `O componente: ${component} escolhido para o filtro do tipo: ${type} não é um componente valido!`\n );\n\n const hooksKeys = Object.keys(hooks);\n\n for (const hookKey of hooksKeys) {\n if (this.avalibleFilterOptionHooks.has(hookKey)) continue;\n\n throw new Error(\n `O hook ${hookKey}, não esta disponivel para o filtro: ${column} do tipo: ${type} do componente: ${component}!`\n );\n }\n\n return {\n column: this.isValidColumn(column) ? column : \"\",\n component,\n items: this.isValidItemsArray(items) ? items : [],\n value: value ?? null,\n endpoint: this.isValidEndpoint(endpoint)\n ? endpoint\n : CrudViewConfigs.generateEndpoint(),\n componentProps: {\n loading: false,\n returnObject: false,\n ...componentProps,\n },\n dependsOn,\n hooks,\n ignoreOnFetchFunction,\n type,\n };\n }\n\n setTableOptions(tableOptions: TableOption[] = []) {\n this.tableOptions = tableOptions;\n\n return this;\n }\n\n addTableOption({\n column = \"\",\n items = [],\n endpoint,\n formatter,\n filterFunction,\n ignoreOnFetchFunction = false,\n }: TableOption) {\n this.tableOptions.push({\n column: this.isValidColumn(column) ? column : \"\",\n endpoint: this.isValidEndpoint(endpoint)\n ? endpoint\n : CrudViewConfigs.generateEndpoint(),\n items: this.isValidItemsArray(items) ? items : [],\n formatter,\n filterFunction,\n ignoreOnFetchFunction,\n });\n\n return this;\n }\n\n setFormSettings({\n baseModel = {},\n formOptions = [],\n hooks = {},\n loading = false,\n }: FormSettings) {\n this.formSettings = {\n baseModel,\n formOptions,\n hooks,\n loading,\n };\n\n return this;\n }\n\n setFormModel(model: Record<PropertyKey, any>) {\n this.formSettings.baseModel = model;\n return this;\n }\n\n setFormOptions(formOptions: FormOption[]) {\n this.formSettings.formOptions = formOptions;\n return this;\n }\n\n addFormOption({\n column = \"\",\n items = [],\n dependsOn = \"\",\n endpoint,\n hooks,\n ignoreOnFetchFunction = false,\n componentProps,\n component,\n loading = false,\n }: FormOption) {\n if (hooks) {\n const hooksKeys = Object.keys(hooks);\n\n for (const hookKey of hooksKeys) {\n if (this.avalibleFormOptionHooks.has(hookKey)) continue;\n\n throw new Error(\n `O hook ${hookKey}, não esta disponivel para o form option: ${column}!`\n );\n }\n }\n\n this.formSettings.formOptions.push({\n column: this.isValidColumn(column) ? column : \"\",\n items: this.isValidItemsArray(items) ? items : [],\n loading,\n endpoint: this.isValidEndpoint(endpoint)\n ? (endpoint as Endpoint)\n : CrudViewConfigs.generateEndpoint(),\n dependsOn,\n hooks,\n ignoreOnFetchFunction,\n componentProps,\n component,\n });\n\n return this;\n }\n\n setFormHooks(hooks: FormHooks = {}) {\n const hooksKeys = Object.keys(hooks);\n\n for (const hookKey of hooksKeys) {\n if (this.avalibleFormHooks.has(hookKey)) continue;\n\n throw new Error(`O hook ${hookKey}, não esta disponivel como form hook!`);\n }\n\n this.formSettings.hooks = hooks;\n\n return this;\n }\n\n setPaginationSettings({\n page = 1,\n itemsPerPage = 15,\n itemsPerPageOptions = [],\n serverItemsLength = 0,\n sortBy = [],\n sortDesc = [],\n }: PaginationSettings) {\n this.paginationSettings.page = page;\n this.paginationSettings.itemsPerPage = itemsPerPage;\n this.paginationSettings.serverItemsLength = serverItemsLength;\n\n if (itemsPerPageOptions?.length)\n this.paginationSettings.itemsPerPageOptions = itemsPerPageOptions;\n if (sortBy.length) this.paginationSettings.sortBy = sortBy;\n if (sortDesc.length) this.paginationSettings.sortDesc = sortDesc;\n\n return this;\n }\n}\n","import * as components from \"./components\";\n\nexport const plugin = {\n install(Vue, options = {}) {\n Vue.prototype.$configs = options;\n\n Object.entries(components).forEach(([name, component]: [string, any]) => {\n Vue.component(name, component);\n });\n },\n};\n\nexport * as components from \"./components\";\nexport * as utils from \"./utils\";\n"],"names":["_sfc_main","e","_sfc_main$k","CloseTableButton","ViewHeader","appBar","availableHeight","container","_sfc_main$i","RequiredFieldsIndicator","FormTitle","FormFooter","LoadingIndicator","_b","_a","TextButton","onSave","onWithoutSave","save","handlerFunction","value","moment","BaseFormLayout","DatePicker","optionsMap","option","_c","headersMap","header","item","_d","_f","_e","_h","_g","_j","_i","error","dependsOnField","dependentFieldHeader","dependsOnItemField","fieldEmpty","field","fieldValue","validations","isRequired","isFieldEmpty","float","check","columnId","column","formOption","columnIdValue","columnValue","RefreshButton","ClearFilterButton","filtersMap","tabIndex","tab","filterIndex","primaryFilter","key","filter","BaseViewLayout","ImportFileButton","ExportFileButton","DeleteItemButton","NewItemButton","DuplicatedItemButton","EditItemButton","UnsavedChangesDialog","RequiredFilterMessage","SaveButton","ConfirmDeleteDialog","UndoChangesButton","BaseCrudForm","BaseCrudSecondaryFiltersDrawer","FiltersButton","newValue","oldValue","paginationSettings","itemsMap","index","itemPrimaryKey","tableOptionsMap","tableOption","primaryFiltersMap","itemIndex","requiredFilters","headersArray","headerValue","res","reload","itemData","requiredFilter","event","row","itemBackup","backupItem","data","duplicatedRowData","filters","HotTable","months","quarters","semesters","MonthSelector","QuarterSelector","SemesterSelector","YearSelector","PeriodSelector","selection","CrudViewConfigs","viewTitle","viewIcon","primaryKey","endpoint","baseTransaction","readOnly","allowExport","allowImport","useServerSidePagination","useServerSideSearch","__publicField","currentFilters","keysToValidate","filtersToCheck","filterValue","searchValue","searchColums","conditions","isRange","searchConditions","displayFilters","httpFetcher","response","tableOptions","optionsPromises","formOptions","filterPromises","url","params","title","builder","filterData","component","items","componentProps","hooks","dependsOn","ignoreOnFetchFunction","type","hooksKeys","hookKey","formatter","filterFunction","baseModel","loading","model","page","itemsPerPage","itemsPerPageOptions","serverItemsLength","sortBy","sortDesc","plugin","Vue","options","components","name"],"mappings":"mhBAoBA,MAAAA,EAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,iBACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,YACA,KAAA,MACA,CACA,CACA,gaC5BAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,SACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,CACA,CACA,oaC3BAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,YACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,CACA,CACA,saC7BAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,UACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,YACA,KAAA,MACA,CACA,CACA,qaC5BAA,GAAA,CACA,MAAA,CACA,KAAA,CACA,QAAA,sBACA,SAAA,GACA,KAAA,MACA,EACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,iBACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,CACA,CACA,qaC/BAA,GAAA,CACA,MAAA,CACA,KAAA,CACA,QAAA,iBACA,SAAA,GACA,KAAA,MACA,EACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,iBACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,CACA,EACA,MAAA,CAAA,qBAAA,YAAA,EACA,SAAA,CACA,KAAA,MAAA,qBAAA,KAAA,MAAA,QAAA,CACA,EACA,QAAA,CACA,aAAAC,EAAA,CACA,KAAA,MAAA,aAAAA,CAAA,CACA,CACA,CACA,qgBC5CAD,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,uBACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,CACA,CACA,maC3BAA,GAAA,CACA,aAAA,GACA,MAAA,CACA,KAAA,CACA,QAAA,mBACA,SAAA,GACA,KAAA,MACA,EACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,SACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,EACA,SAAA,CACA,SAAA,GACA,QAAA,GACA,KAAA,OACA,CACA,CACA,ybCzCAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,qBACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,YACA,KAAA,MACA,EACA,SAAA,CACA,SAAA,GACA,QAAA,GACA,KAAA,OACA,CACA,CACA,8bCjCAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,kCACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,EACA,SAAA,CACA,SAAA,GACA,QAAA,GACA,KAAA,OACA,CACA,CACA,ubCvCAA,GAAA,CACA,MAAA,CACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,UACA,KAAA,MACA,CACA,CACA,6PChBAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,4BACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,YACA,KAAA,MACA,CACA,CACA,gbC5BAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,0BACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,YACA,KAAA,MACA,CACA,CACA,qaC5BAA,GAAA,CACA,MAAA,CACA,SAAA,CACA,QAAA,OACA,SAAA,GACA,KAAA,MACA,EACA,YAAA,CACA,QAAA,GACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,QAAA,sBACA,SAAA,GACA,KAAA,MACA,EACA,KAAA,CACA,SAAA,GACA,QAAA,QACA,KAAA,MACA,EACA,MAAA,CACA,SAAA,GACA,QAAA,YACA,KAAA,MACA,CACA,CACA,+aCrBAE,GAAA,CACA,MAAA,CACA,UAAA,CACA,SAAA,GACA,QAAA,GACA,KAAA,MAAA,EAEA,UAAA,CACA,SAAA,GACA,QAAA,GACA,KAAA,MAAA,CACA,CAEA,2jBCCAF,GAAA,CACA,MAAA,CACA,UAAA,CACA,SAAA,GACA,QAAA,GACA,KAAA,MACA,EACA,UAAA,CACA,SAAA,GACA,QAAA,GACA,KAAA,MACA,EACA,mBAAA,CACA,QAAA,GACA,QAAA,GACA,KAAA,OACA,EACA,iBAAA,CACA,QAAA,GACA,QAAA,KAAA,CACA,KAAA,GACA,KAAA,OACA,SAAA,OACA,MAAA,MACA,EACA,CACA,EACA,WAAA,CACA,iBAAAG,EACA,WAAAC,CACA,EAEA,MAAA,CACA,MAAA,CACA,mBAAA,EACA,CACA,EAEA,MAAA,CAAA,YAAA,EAEA,SAAA,CACA,OAAA,iBAAA,SAAA,KAAA,qBAAA,EAEA,KAAA,mBAAA,GAEA,KAAA,UAAA,IAAA,CACA,KAAA,sBAAA,CACA,CAAA,CACA,EACA,eAAA,CACA,KAAA,mBAAA,GACA,OAAA,oBAAA,SAAA,KAAA,qBAAA,CACA,EACA,QAAA,CACA,YAAA,CACA,KAAA,MAAA,YAAA,CACA,EACA,uBAAA,CACA,GAAA,CAAA,KAAA,oBAAA,CAAA,KAAA,IAAA,OAEA,MAAAC,EAAA,SAAA,cAAA,YAAA,EAGAC,EAAA,gBAFAD,EAAAA,EAAA,aAAA,EAEA,MAEAE,EAAA,KAAA,IACAA,IACAA,EAAA,MAAA,OAAAD,EACAC,EAAA,MAAA,UAAAD,EACAC,EAAA,MAAA,SAAA,SAEA,CACA,CACA,u3BCxGAC,GAAA,CACA,MAAA,CACA,QAAA,CACA,SAAA,GACA,QAAA,EAAA,CACA,CAEA,6QCeAR,GAAA,CACA,MAAA,CACA,WAAA,CACA,QAAA,EACA,EACA,YAAA,CACA,QAAA,EACA,EACA,gBAAA,CACA,QAAA,EACA,CACA,EACA,MAAA,CAAA,OAAA,CACA,gyBCxCAA,GAAA,CAAA,yMC8BAA,GAAA,CACA,MAAA,CACA,4BAAA,CACA,QAAA,EACA,EACA,iBAAA,CACA,QAAA,EACA,EACA,iBAAA,CACA,QAAA,UACA,EACA,iBAAA,CACA,QAAA,EACA,EACA,iBAAA,CACA,QAAA,QACA,EACA,wBAAA,CACA,QAAA,eACA,EACA,oBAAA,CACA,QAAA,EACA,EACA,QAAA,CACA,QAAA,EACA,EACA,SAAA,CACA,QAAA,EACA,CACA,EACA,WAAA,CACA,wBAAAS,CACA,EACA,MAAA,CAAA,QAAA,QAAA,CACA,quBC1DAT,GAAA,CAAA,0OCmCAA,GAAA,CACA,MAAA,CACA,WAAA,CACA,QAAA,EACA,EACA,YAAA,CACA,QAAA,EACA,EACA,gBAAA,CACA,QAAA,EACA,EACA,cAAA,CACA,QAAA,EACA,EACA,oBAAA,CACA,QAAA,EACA,EACA,QAAA,CACA,QAAA,EACA,EACA,SAAA,CACA,QAAA,EACA,EACA,wBAAA,CACA,SAAA,EACA,EACA,iBAAA,CACA,SAAA,EACA,EACA,iBAAA,CACA,QAAA,EACA,EACA,iBAAA,CACA,SAAA,EACA,EACA,iBAAA,CACA,QAAA,EACA,EACA,SAAA,CACA,QAAA,KACA,EACA,WAAA,CACA,QAAA,EACA,EACA,WAAA,CACA,QAAA,QACA,CACA,EACA,MAAA,CACA,MAAA,CACA,UAAA,EACA,CACA,EACA,WAAA,CAAA,UAAAU,EAAA,WAAAC,EAAA,iBAAAC,CAAA,EACA,MAAA,CAAA,QAAA,QAAA,EACA,Q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"}