una-nuxt-module 2.1.0 → 2.1.2

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.
Files changed (73) hide show
  1. package/.nuxt/unaxt/button.ts +36 -0
  2. package/.nuxt/unaxt.css +3 -0
  3. package/dist/module.json +4 -4
  4. package/dist/module.mjs +145 -48
  5. package/dist/runtime/components/ui/button/Button.vue +23 -0
  6. package/dist/runtime/components/ui/button/Button.vue.d.ts +47 -0
  7. package/dist/runtime/components/ui/button/index.d.ts +7 -0
  8. package/dist/runtime/components/ui/button/index.js +27 -0
  9. package/dist/runtime/enums/index.d.ts +0 -1
  10. package/dist/runtime/enums/index.js +0 -1
  11. package/dist/runtime/index.css +1 -0
  12. package/dist/runtime/lib/utils.d.ts +2 -0
  13. package/dist/runtime/lib/utils.js +5 -0
  14. package/dist/runtime/pages/401.vue +2 -3
  15. package/dist/runtime/pages/401.vue.d.ts +2 -0
  16. package/dist/runtime/pages/403.vue +2 -3
  17. package/dist/runtime/pages/403.vue.d.ts +2 -0
  18. package/dist/runtime/pages/ssoCallback.vue +5 -5
  19. package/dist/runtime/pages/ssoCallback.vue.d.ts +2 -0
  20. package/dist/runtime/types/index.d.ts +9 -38
  21. package/dist/types.d.mts +2 -2
  22. package/package.json +59 -24
  23. package/dist/module.cjs +0 -5
  24. package/dist/module.d.ts +0 -14
  25. package/dist/runtime/assets/scss/styles.css +0 -1016
  26. package/dist/runtime/components/layout/footer/Footer.vue +0 -16
  27. package/dist/runtime/components/layout/header/BtnExtendMenu.vue +0 -29
  28. package/dist/runtime/components/layout/header/Header.vue +0 -7
  29. package/dist/runtime/components/layout/header/HeaderMenu.vue +0 -41
  30. package/dist/runtime/components/layout/header/HeaderMenuTabs.vue +0 -102
  31. package/dist/runtime/components/layout/sidebar/NavCollapse.vue +0 -38
  32. package/dist/runtime/components/layout/sidebar/NavGroup.vue +0 -9
  33. package/dist/runtime/components/layout/sidebar/NavItem.vue +0 -25
  34. package/dist/runtime/components/layout/sidebar/SideBar.vue +0 -74
  35. package/dist/runtime/components/layout/sidebar/SideBarFooter.vue +0 -69
  36. package/dist/runtime/components/layout/sidebar/TopSideBarLogo.vue +0 -25
  37. package/dist/runtime/components/shared/authorization/AuthorizedRenderer.vue +0 -43
  38. package/dist/runtime/components/shared/buttons/BtnBack.vue +0 -19
  39. package/dist/runtime/components/shared/buttons/BtnCancel.vue +0 -13
  40. package/dist/runtime/components/shared/buttons/BtnConfirm.vue +0 -14
  41. package/dist/runtime/components/shared/containers/JsonViewer.vue +0 -13
  42. package/dist/runtime/components/shared/dates/DatePicker.vue +0 -91
  43. package/dist/runtime/components/shared/dialogs/DialogConfirmDelete.vue +0 -32
  44. package/dist/runtime/components/shared/dialogs/DialogExportTable.vue +0 -44
  45. package/dist/runtime/components/shared/feedback/LoadingSession.vue +0 -17
  46. package/dist/runtime/components/shared/feedback/SnackBar.vue +0 -40
  47. package/dist/runtime/components/shared/forms/FormBuilder/FieldBuilder.vue +0 -251
  48. package/dist/runtime/components/shared/forms/FormBuilder/FieldSlotMissed.vue +0 -20
  49. package/dist/runtime/components/shared/forms/FormBuilder/FormBuilder.vue +0 -213
  50. package/dist/runtime/components/shared/forms/FormBuilder/SteppersBuilder.vue +0 -32
  51. package/dist/runtime/components/shared/forms/FormBuilder/TabsBuilder.vue +0 -30
  52. package/dist/runtime/components/shared/forms/FormDialogWrapper.vue +0 -48
  53. package/dist/runtime/components/shared/forms/FormPageWrapper.vue +0 -19
  54. package/dist/runtime/components/shared/forms/FormSubmitSection.vue +0 -48
  55. package/dist/runtime/components/shared/navigation/BreadCrumbs.vue +0 -21
  56. package/dist/runtime/components/shared/tables/CustomTable.vue +0 -261
  57. package/dist/runtime/components/shared/tables/CustomTableHeader.vue +0 -25
  58. package/dist/runtime/components/shared/tables/NoDataMessage.vue +0 -12
  59. package/dist/runtime/components/shared/tables/TableSearchBar.vue +0 -22
  60. package/dist/runtime/components/shared/tables/buttons/BtnAdd.vue +0 -25
  61. package/dist/runtime/components/shared/tables/buttons/BtnDelete.vue +0 -32
  62. package/dist/runtime/components/shared/tables/buttons/BtnEdit.vue +0 -30
  63. package/dist/runtime/components/shared/tables/buttons/BtnExport.vue +0 -17
  64. package/dist/runtime/components/shared/tables/buttons/BtnFilter.vue +0 -21
  65. package/dist/runtime/components/shared/tables/pagination/ItemsPerPageCombo.vue +0 -24
  66. package/dist/runtime/components/shared/tables/pagination/ItemsPerPageLabel.vue +0 -5
  67. package/dist/runtime/components/shared/tables/pagination/PageSelector.vue +0 -16
  68. package/dist/runtime/components/shared/tables/pagination/PaginationInfo.vue +0 -31
  69. package/dist/runtime/enums/EVuetifyDateFormats.d.ts +0 -32
  70. package/dist/runtime/enums/EVuetifyDateFormats.js +0 -30
  71. package/dist/runtime/layouts/default.vue +0 -31
  72. package/dist/runtime/layouts/empty.vue +0 -12
  73. package/dist/types.d.ts +0 -7
@@ -1,16 +0,0 @@
1
- <template>
2
- <div>
3
- <v-footer color="gray100" rounded class="mx-12">
4
- <v-row justify="center">
5
- <v-col cols="6">
6
- <p class="text-caption text-center">
7
- {{ $t("Components.Footer.Info[0]") }}
8
- </p>
9
- <p class="text-caption text-center">
10
- {{ $t("Components.Footer.Info[1]") }}
11
- </p>
12
- </v-col>
13
- </v-row>
14
- </v-footer>
15
- </div>
16
- </template>
@@ -1,29 +0,0 @@
1
- <template>
2
- <v-btn
3
- :icon="extendMenuIcon"
4
- @click.stop="handleClick"
5
- class="btnExtendMenu"
6
- density="compact"
7
- rounded="lg"
8
- size="large"
9
- />
10
- </template>
11
-
12
- <script lang="ts" setup>
13
- import { computed } from "vue";
14
- import { useUiCustomizerStore } from "../../../stores/UiCustomizer";
15
-
16
- const uiCustomizer = useUiCustomizerStore();
17
-
18
- const extendMenuIcon = computed(() => {
19
- return uiCustomizer.isSidebarMinimized ? "mdi-menu-close" : "mdi-menu-open";
20
- });
21
-
22
- const handleClick = () => {
23
- uiCustomizer.toggleSidebar();
24
- };
25
- </script>
26
-
27
- <style>
28
- .btnExtendMenu{color:rgb(var(--v-theme-darkText),.75)}
29
- </style>
@@ -1,7 +0,0 @@
1
- <template>
2
- <v-app-bar elevation="0" height="60" color="containerBg">
3
- <BtnExtendMenu />
4
- <v-spacer />
5
- <HeaderMenu />
6
- </v-app-bar>
7
- </template>
@@ -1,41 +0,0 @@
1
- <template>
2
- <v-menu :close-on-content-click="false" offset="8, 0">
3
- <template v-slot:activator="{ props }">
4
- <v-btn
5
- append-icon="mdi-chevron-down"
6
- class="profileBtn"
7
- color="secondary"
8
- rounded="lg"
9
- v-bind="props"
10
- variant="tonal"
11
- >
12
- <div class="d-flex align-center">
13
- <v-avatar class="mr-sm-2 mr-0 py-2">
14
- <img :src="photoUrl" />
15
- </v-avatar>
16
- <span class="text-subtitle-1 mb-0 d-sm-block d-none">
17
- {{ fullName }}
18
- </span>
19
- </div>
20
- </v-btn>
21
- </template>
22
- <v-sheet rounded="md" width="340">
23
- <HeaderMenuTabs />
24
- </v-sheet>
25
- </v-menu>
26
- </template>
27
-
28
- <script lang="ts" setup>
29
- import { ref, onMounted } from "vue";
30
- import { useAuthStore } from "#imports";
31
-
32
- const authStore = useAuthStore();
33
-
34
- const photoUrl = ref("");
35
- const fullName = ref("");
36
-
37
- onMounted(() => {
38
- photoUrl.value = authStore.user?.photoUrl as string;
39
- fullName.value = authStore.user?.fullName as string;
40
- });
41
- </script>
@@ -1,102 +0,0 @@
1
- <template>
2
- <div>
3
- <div class="d-flex align-center pa-5">
4
- <v-avatar size="50" class="mr-4">
5
- <img :src="photoUrl" width="50" alt="User" />
6
- </v-avatar>
7
- <div>
8
- <span class="text-h6 mb-0">{{ fullName }}</span>
9
- <p class="text-caption mb-0">{{ email }}</p>
10
- <p class="text-caption mb-0">{{ role }}</p>
11
- </div>
12
- </div>
13
- <v-tabs v-model="tabSelected" color="primary" grow>
14
- <v-tab value="tabProfile" prepend-icon="mdi-account" class="v-text-field">
15
- Perfil
16
- </v-tab>
17
- <v-tab value="tabConfig" prepend-icon="mdi-cog" class="v-text-field">
18
- Configuración
19
- </v-tab>
20
- </v-tabs>
21
- <perfect-scrollbar>
22
- <v-window v-model="tabSelected">
23
- <v-window-item value="tabProfile">
24
- <v-list class="py-0" aria-label="profile list" aria-busy="true">
25
- <v-list-item
26
- @click.stop="navigateTo('/profile')"
27
- color="primary"
28
- prepend-icon="mdi-account"
29
- rounded="0"
30
- value="View Profile"
31
- >
32
- <v-list-item-title class="text-subtitle-2">
33
- Ver Perfil
34
- </v-list-item-title>
35
- </v-list-item>
36
-
37
- <v-list-item
38
- @click.stop="authStore.logout()"
39
- color="primary"
40
- prepend-icon="mdi-logout"
41
- rounded="0"
42
- >
43
- <v-list-item-title class="text-subtitle-2">
44
- {{ $t("Actions.CloseSession") }}
45
- </v-list-item-title>
46
- </v-list-item>
47
- </v-list>
48
- </v-window-item>
49
-
50
- <v-window-item value="tabConfig">
51
- <v-list class="py-0" aria-label="profile list" aria-busy="true">
52
- <v-list-item
53
- @click.stop="navigateTo('/configuration/preferences')"
54
- color="primary"
55
- prepend-icon="mdi-account-cog"
56
- rounded="0"
57
- value="Preferencias"
58
- >
59
- <v-list-item-title class="text-subtitle-2">
60
- Preferencias de la cuenta
61
- </v-list-item-title>
62
- </v-list-item>
63
-
64
- <v-list-item
65
- @click.stop="navigateTo('/configuration/support')"
66
- color="primary"
67
- prepend-icon="mdi-help-circle"
68
- rounded="0"
69
- value="Soporte"
70
- >
71
- <v-list-item-title class="text-subtitle-2">
72
- Soporte
73
- </v-list-item-title>
74
- </v-list-item>
75
- </v-list>
76
- </v-window-item>
77
- </v-window>
78
- </perfect-scrollbar>
79
- </div>
80
- </template>
81
-
82
- <script lang="ts" setup>
83
- import { navigateTo } from "#imports";
84
- import { ref, onMounted } from "vue";
85
- import { useAuthStore } from "#imports";
86
-
87
- const authStore = useAuthStore();
88
-
89
- const tabSelected = ref(null);
90
-
91
- const photoUrl = ref("");
92
- const fullName = ref("");
93
- const email = ref("");
94
- const role = ref("");
95
-
96
- onMounted(() => {
97
- photoUrl.value = authStore.user?.photoUrl as string;
98
- fullName.value = authStore.user?.fullName as string;
99
- email.value = authStore.user?.email as string;
100
- role.value = authStore.user?.mainRole as string;
101
- });
102
- </script>
@@ -1,38 +0,0 @@
1
- <template>
2
- <v-list-group no-action>
3
- <!-- El combo padre -->
4
- <template v-slot:activator="{ props }">
5
- <v-list-item
6
- v-bind="props"
7
- :value="item?.title"
8
- rounded
9
- class="mb-1"
10
- color="primary"
11
- :prepend-icon="item?.icon"
12
- >
13
- <v-list-item-title class="mr-auto">{{ item?.title }}</v-list-item-title>
14
-
15
- <v-list-item-subtitle
16
- v-if="item?.description"
17
- class="text-caption mt-n1 hide-menu"
18
- >
19
- {{ item.description }}
20
- </v-list-item-subtitle>
21
- </v-list-item>
22
- </template>
23
-
24
- <!-- Se renderizan los elementos hijos -->
25
- <template v-for="(subitem, i) in item?.children" :key="i">
26
- <NavCollapse
27
- v-if="subitem.children"
28
- :item="subitem"
29
- :level="(props?.level) as number + 1"
30
- />
31
- <NavItem v-else :item="subitem" :level="(props?.level) as number + 1" />
32
- </template>
33
- </v-list-group>
34
- </template>
35
-
36
- <script lang="ts" setup>
37
- const props = defineProps({ item: Object, level: Number });
38
- </script>
@@ -1,9 +0,0 @@
1
- <template>
2
- <v-list-subheader color="lightText" class="smallCap text-subtitle-2">
3
- {{ props.item?.header }}
4
- </v-list-subheader>
5
- </template>
6
-
7
- <script lang="ts" setup>
8
- const props = defineProps({ item: Object });
9
- </script>
@@ -1,25 +0,0 @@
1
- <template>
2
- <v-list-item
3
- :to="item?.to"
4
- rounded
5
- color="primary"
6
- :disabled="item?.disabled"
7
- >
8
- <template v-slot:prepend>
9
- <v-icon v-if="props.item?.icon" :icon="props.item.icon" />
10
- </template>
11
-
12
- <v-list-item-title>{{ item?.title }}</v-list-item-title>
13
-
14
- <v-list-item-subtitle
15
- v-if="item?.description"
16
- class="text-caption mt-n1 hide-menu"
17
- >
18
- {{ item.description }}
19
- </v-list-item-subtitle>
20
- </v-list-item>
21
- </template>
22
-
23
- <script lang="ts" setup>
24
- const props = defineProps({ item: Object, level: Number });
25
- </script>
@@ -1,74 +0,0 @@
1
- <template>
2
- <div>
3
- <v-navigation-drawer
4
- :rail="uiCustomizer.isSidebarMinimized"
5
- @mouseleave="isHoveringSideBar = false"
6
- @mouseover="isHoveringSideBar = true"
7
- app
8
- border="darkText"
9
- class="leftSidebar"
10
- color="containerBg"
11
- elevation="0"
12
- expand-on-hover
13
- left
14
- mobile-breakpoint="lg"
15
- rail-width="60"
16
- v-model="uiCustomizer.drawSidebar"
17
- >
18
- <template v-slot:prepend>
19
- <div class="d-flex align-center justify-center" style="height: 60px">
20
- <TopSideBarLogo v-model:open-sidebar="isHoveringSideBar" />
21
- </div>
22
- <v-divider :thickness="1" />
23
- </template>
24
-
25
- <perfect-scrollbar class="scrollnavbar">
26
- <v-list
27
- aria-busy="true"
28
- aria-label="menu list"
29
- v-model:opened="openedMenus"
30
- >
31
- <template v-for="(item, i) in menuItems" :key="i">
32
- <NavGroup :item v-if="item?.header" :key="item.title" />
33
-
34
- <v-divider class="my-3" v-else-if="item?.divider" />
35
-
36
- <NavCollapse
37
- :item
38
- :level="0"
39
- class="leftPadding"
40
- v-else-if="item?.children"
41
- />
42
-
43
- <NavItem :item v-else />
44
- </template>
45
- </v-list>
46
- </perfect-scrollbar>
47
-
48
- <template v-slot:append>
49
- <SideBarFooter v-model:open-sidebar="isHoveringSideBar" />
50
- </template>
51
- </v-navigation-drawer>
52
- </div>
53
- </template>
54
-
55
- <script lang="ts" setup>
56
- import { ref, shallowRef, watch } from "vue";
57
- import { storeToRefs } from "pinia";
58
- import { useAuthorization } from "../../../composables/useAuthorization";
59
- import { useUiCustomizerStore } from "../../../stores/UiCustomizer";
60
-
61
- const authorization = useAuthorization();
62
- const uiCustomizer = useUiCustomizerStore();
63
-
64
- const isHoveringSideBar = ref(false);
65
- const openedMenus = ref([]);
66
-
67
- const menuItems = shallowRef(authorization.getAuthorizedPaths());
68
-
69
- const uiCustomizerRef = storeToRefs(uiCustomizer);
70
-
71
- watch(uiCustomizerRef.isSidebarMinimized, (newValue, oldValue) => {
72
- if (newValue) openedMenus.value = [];
73
- });
74
- </script>
@@ -1,69 +0,0 @@
1
- <template>
2
- <div class="SideBarFooter pb-4">
3
- <v-spacer />
4
-
5
- <v-divider :thickness="1" />
6
-
7
- <v-list aria-busy="true" aria-label="sidebar footer">
8
- <!-- Toogle Theme Switcher -->
9
- <v-list-item rounded>
10
- <template v-slot:prepend>
11
- <v-icon :icon="toggleThemeIcon" />
12
- </template>
13
- <template v-slot:append>
14
- <v-switch
15
- :false-value="ETheme.LIGHT"
16
- :true-value="ETheme.DARK"
17
- color="primary"
18
- hide-details
19
- v-if="!uiCustomizer.isSidebarMinimized || openSidebar"
20
- v-model="currentTheme"
21
- />
22
- </template>
23
- <v-list-item-title>{{ toggleThemeTitle }}</v-list-item-title>
24
- </v-list-item>
25
-
26
- <!-- Close Session Button -->
27
- <v-list-item rounded @click="authStore.logout()">
28
- <template v-slot:prepend>
29
- <v-icon icon="mdi-logout" />
30
- </template>
31
- <v-list-item-title> {{ $t("Actions.CloseSession") }}</v-list-item-title>
32
- </v-list-item>
33
- </v-list>
34
- </div>
35
- </template>
36
-
37
- <script lang="ts" setup>
38
- import { computed, ref, watch } from "vue";
39
- import { ETheme } from "../../../enums";
40
- import { useAuthStore, useI18n } from "#imports";
41
- import { useUiCustomizerStore } from "../../../stores/UiCustomizer";
42
-
43
- import { useTheme } from "vuetify";
44
-
45
- const { t } = useI18n();
46
- const theme = useTheme();
47
- const authStore = useAuthStore();
48
- const uiCustomizer = useUiCustomizerStore();
49
-
50
- const openSidebar = defineModel<boolean>("openSidebar", { required: true });
51
-
52
- const currentTheme = ref(ETheme.LIGHT);
53
-
54
- const toggleThemeTitle = computed(() => {
55
- return currentTheme.value == ETheme.DARK
56
- ? t("Components.SideBar.SideBarFooter.DarkTheme")
57
- : t("Components.SideBar.SideBarFooter.LightTheme");
58
- });
59
-
60
- const toggleThemeIcon = computed(() => {
61
- return currentTheme.value == ETheme.DARK
62
- ? "mdi-moon-waning-crescent"
63
- : "mdi-white-balance-sunny";
64
- });
65
-
66
- watch(currentTheme, (newValue, oldValue) => {
67
- theme.global.name.value = newValue;
68
- });
69
- </script>
@@ -1,25 +0,0 @@
1
- <template>
2
- <div class="d-flex justify-center">
3
- <NuxtLink to="/" style="text-decoration: none; color: inherit">
4
- <img
5
- v-if="!uiCustomizer.isSidebarMinimized || openSidebar"
6
- alt=""
7
- height="40"
8
- src="/images/logos/UNA_LogoType_LogoMark_Red.png"
9
- />
10
- <img
11
- v-else
12
- alt=""
13
- height="25"
14
- src="/images/logos/UNA_LogoMark_Black.png"
15
- />
16
- </NuxtLink>
17
- </div>
18
- </template>
19
-
20
- <script lang="ts" setup>
21
- import { useUiCustomizerStore } from "../../../stores/UiCustomizer";
22
-
23
- const uiCustomizer = useUiCustomizerStore();
24
- const openSidebar = defineModel<boolean>("openSidebar", { required: true });
25
- </script>
@@ -1,43 +0,0 @@
1
- <template>
2
- <template v-if="renderContent()">
3
- <slot />
4
- <div>{{ props }}</div>
5
- </template>
6
- </template>
7
-
8
- <script lang="ts" setup>
9
- import type { PropType } from "vue";
10
- import { useAuthorization } from "../../../composables/useAuthorization";
11
- import type { TAuthorization } from "../../../types";
12
-
13
- const props = defineProps({
14
- /** Renderiza si el usuario no tiene la autorización en el recurso. */
15
- renderIfUnauthorized: { type: Boolean, required: false, default: false },
16
- /** Autorización a validar en el recurso. */
17
- authorization: { type: String as PropType<TAuthorization>, required: true },
18
- /** Recurso a validar. */
19
- resource: { type: String, required: false },
20
- });
21
-
22
- /**
23
- * Método que valida si el contenido se debe renderizar.
24
- */
25
- const renderContent = (): boolean => {
26
- const authorization = useAuthorization();
27
-
28
- // Si el recurso no esta definido por props toma la ruta actual como recurso
29
- const resource = props.resource ?? authorization.currentResource.value;
30
-
31
- // Valida si el usuario tiene la autorización en el recurso
32
- const hasAuthorization = authorization.hasAuthorizationIn({
33
- authorization: props.authorization,
34
- resource,
35
- });
36
-
37
- if (props.renderIfUnauthorized) {
38
- return !hasAuthorization;
39
- }
40
-
41
- return hasAuthorization;
42
- };
43
- </script>
@@ -1,19 +0,0 @@
1
- <template>
2
- <v-btn
3
- :text="$t('Actions.Back')"
4
- :to="props.to"
5
- class="text-none text-subtitle-1"
6
- color="primary"
7
- variant="outlined"
8
- >
9
- <template v-slot:prepend>
10
- <v-icon icon="mdi-arrow-left" start size="x-large" class="mx-0" />
11
- </template>
12
- </v-btn>
13
- </template>
14
-
15
- <script lang="ts" setup>
16
- const props = defineProps({
17
- to: { type: String, required: true },
18
- });
19
- </script>
@@ -1,13 +0,0 @@
1
- <template>
2
- <v-btn
3
- :text="$t('Actions.Cancel')"
4
- @click="emit('on-cancel')"
5
- color="primary"
6
- elevation="0"
7
- variant="text"
8
- />
9
- </template>
10
-
11
- <script lang="ts" setup>
12
- const emit = defineEmits(["on-cancel"]);
13
- </script>
@@ -1,14 +0,0 @@
1
- <template>
2
- <v-btn
3
- :text="$t('Actions.Confirm')"
4
- @click="emit('on-confirm')"
5
- color="primary"
6
- elevation="1"
7
- prepend-icon="mdi-check"
8
- variant="flat"
9
- />
10
- </template>
11
-
12
- <script lang="ts" setup>
13
- const emit = defineEmits(["on-confirm"]);
14
- </script>
@@ -1,13 +0,0 @@
1
- <template>
2
- <div class="json-container-view">
3
- <h5>{{ props.title }}:</h5>
4
- <VueJsonPretty :data />
5
- </div>
6
- </template>
7
-
8
- <script lang="ts" setup>
9
- const props = defineProps({
10
- data: { type: Object, default: {} },
11
- title: { type: String, default: "Data" },
12
- });
13
- </script>
@@ -1,91 +0,0 @@
1
- <template>
2
- <v-menu v-model="openCalendar" :close-on-content-click="false">
3
- <template v-slot:activator="{ props }">
4
- <v-text-field
5
- :aria-label="label"
6
- :disabled="disabled"
7
- :label="label"
8
- :readonly="true"
9
- :required="required"
10
- :rules="rules"
11
- :title="title"
12
- color="primary"
13
- persistent-placeholder
14
- v-bind="props"
15
- v-model="formattedDate"
16
- variant="outlined"
17
- />
18
- </template>
19
-
20
- <v-date-picker
21
- color="primary"
22
- elevation="4"
23
- hide-actions
24
- title=""
25
- v-model="date"
26
- >
27
- <template v-slot:header>
28
- <div />
29
- </template>
30
-
31
- <template v-slot:actions>
32
- <div class="mt-n10 d-flex justify-space-between w-100">
33
- <v-btn
34
- @click="date = null"
35
- color="primary"
36
- density="compact"
37
- text="Borrar"
38
- />
39
- <v-btn
40
- @click="openCalendar = false"
41
- color="primary"
42
- density="compact"
43
- text="Cerrar"
44
- />
45
- </div>
46
- </template>
47
- </v-date-picker>
48
- </v-menu>
49
- </template>
50
-
51
- <script lang="ts" setup>
52
- import { computed, ref, watch, type PropType } from "vue";
53
- import { useDate } from "vuetify";
54
- import type { TVuetifyDateFormat } from "../../../types";
55
- import { EVuetifyDateFormats } from "../../../enums";
56
-
57
- const dateFormatter = useDate();
58
-
59
- const openCalendar = ref(false);
60
-
61
- const date = defineModel<Date | null>("date", { required: true });
62
-
63
- const props = defineProps({
64
- disabled: { type: Boolean, default: false },
65
- displayFormat: {
66
- type: String as PropType<TVuetifyDateFormat>,
67
- required: false,
68
- default: EVuetifyDateFormats.fullDateWithWeekday,
69
- },
70
- label: { type: String, required: true },
71
- readonly: { type: Boolean, required: false, default: false },
72
- required: { type: Boolean, required: false, default: false },
73
- rules: { type: Array as PropType<Array<any>>, required: false, default: [] },
74
- title: { type: String, required: true },
75
- });
76
-
77
- const formattedDate = computed(() => {
78
- if (date.value) {
79
- return dateFormatter.format(date.value, props.displayFormat);
80
- }
81
- return props.required ? "Seleccione una fecha..." : "";
82
- });
83
-
84
- watch(date, () => {
85
- openCalendar.value = false;
86
- });
87
- </script>
88
-
89
- <style>
90
- .v-overlay__content:has(>.v-date-picker){min-width:auto!important}.v-picker-title{padding:0!important}
91
- </style>
@@ -1,32 +0,0 @@
1
- <template>
2
- <v-dialog
3
- v-model="appStatusStore.openDialogDelete"
4
- persistent
5
- max-width="500"
6
- >
7
- <v-card :title="$t('Components.Dialogs.Delete.Title')" class="py-2">
8
- <template v-slot:prepend>
9
- <v-icon icon="mdi-delete" color="error" />
10
- </template>
11
-
12
- <template v-slot:actions>
13
- <div class="d-flex justify-space-between w-100 px-2 pt-4">
14
- <BtnCancel @on-cancel="handleCancel" />
15
- <BtnConfirm @on-confirm="emit('on-delete')" />
16
- </div>
17
- </template>
18
- </v-card>
19
- </v-dialog>
20
- </template>
21
-
22
- <script lang="ts" setup>
23
- import { useAppStatusStore } from "#imports";
24
-
25
- const appStatusStore = useAppStatusStore();
26
-
27
- const emit = defineEmits(["on-delete"]);
28
-
29
- const handleCancel = () => {
30
- appStatusStore.setOpenDialogDelete(false);
31
- };
32
- </script>