adminforth 1.6.2-next.1 → 1.6.2-next.3

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 (93) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +1 -0
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -4
  5. package/dist/spa/.eslintrc.cjs +0 -14
  6. package/dist/spa/README.md +0 -39
  7. package/dist/spa/env.d.ts +0 -1
  8. package/dist/spa/index.html +0 -23
  9. package/dist/spa/package-lock.json +0 -5062
  10. package/dist/spa/package.json +0 -58
  11. package/dist/spa/postcss.config.js +0 -6
  12. package/dist/spa/public/assets/favicon.png +0 -0
  13. package/dist/spa/src/App.vue +0 -432
  14. package/dist/spa/src/adminforth.ts +0 -160
  15. package/dist/spa/src/afcl/AreaChart.vue +0 -160
  16. package/dist/spa/src/afcl/BarChart.vue +0 -170
  17. package/dist/spa/src/afcl/Button.vue +0 -27
  18. package/dist/spa/src/afcl/Checkbox.vue +0 -24
  19. package/dist/spa/src/afcl/Dropzone.vue +0 -128
  20. package/dist/spa/src/afcl/Input.vue +0 -41
  21. package/dist/spa/src/afcl/Link.vue +0 -17
  22. package/dist/spa/src/afcl/LinkButton.vue +0 -25
  23. package/dist/spa/src/afcl/PieChart.vue +0 -175
  24. package/dist/spa/src/afcl/ProgressBar.vue +0 -57
  25. package/dist/spa/src/afcl/Select.vue +0 -246
  26. package/dist/spa/src/afcl/Skeleton.vue +0 -26
  27. package/dist/spa/src/afcl/Spinner.vue +0 -9
  28. package/dist/spa/src/afcl/Table.vue +0 -116
  29. package/dist/spa/src/afcl/Tooltip.vue +0 -43
  30. package/dist/spa/src/afcl/VerticalTabs.vue +0 -49
  31. package/dist/spa/src/afcl/index.ts +0 -20
  32. package/dist/spa/src/assets/base.css +0 -2
  33. package/dist/spa/src/assets/logo.svg +0 -19
  34. package/dist/spa/src/components/AcceptModal.vue +0 -44
  35. package/dist/spa/src/components/Breadcrumbs.vue +0 -41
  36. package/dist/spa/src/components/BreadcrumbsWithButtons.vue +0 -25
  37. package/dist/spa/src/components/CustomDatePicker.vue +0 -180
  38. package/dist/spa/src/components/CustomDateRangePicker.vue +0 -218
  39. package/dist/spa/src/components/CustomRangePicker.vue +0 -156
  40. package/dist/spa/src/components/Filters.vue +0 -232
  41. package/dist/spa/src/components/GroupsTable.vue +0 -218
  42. package/dist/spa/src/components/HelloWorld.vue +0 -17
  43. package/dist/spa/src/components/MenuLink.vue +0 -41
  44. package/dist/spa/src/components/ResourceForm.vue +0 -260
  45. package/dist/spa/src/components/ResourceListTable.vue +0 -486
  46. package/dist/spa/src/components/ShowTable.vue +0 -81
  47. package/dist/spa/src/components/SingleSkeletLoader.vue +0 -13
  48. package/dist/spa/src/components/SkeleteLoader.vue +0 -18
  49. package/dist/spa/src/components/ThreeDotsMenu.vue +0 -43
  50. package/dist/spa/src/components/Toast.vue +0 -78
  51. package/dist/spa/src/components/ValueRenderer.vue +0 -141
  52. package/dist/spa/src/components/icons/IconCalendar.vue +0 -5
  53. package/dist/spa/src/components/icons/IconCommunity.vue +0 -7
  54. package/dist/spa/src/components/icons/IconDocumentation.vue +0 -7
  55. package/dist/spa/src/components/icons/IconEcosystem.vue +0 -7
  56. package/dist/spa/src/components/icons/IconSupport.vue +0 -7
  57. package/dist/spa/src/components/icons/IconTime.vue +0 -5
  58. package/dist/spa/src/components/icons/IconTooling.vue +0 -19
  59. package/dist/spa/src/composables/useFrontendApi.ts +0 -28
  60. package/dist/spa/src/i18n.ts +0 -54
  61. package/dist/spa/src/index.scss +0 -34
  62. package/dist/spa/src/main.ts +0 -22
  63. package/dist/spa/src/renderers/CompactField.vue +0 -46
  64. package/dist/spa/src/renderers/CompactUUID.vue +0 -46
  65. package/dist/spa/src/renderers/CountryFlag.vue +0 -65
  66. package/dist/spa/src/renderers/HumanNumber.vue +0 -58
  67. package/dist/spa/src/renderers/RelativeTime.vue +0 -42
  68. package/dist/spa/src/renderers/URL.vue +0 -18
  69. package/dist/spa/src/router/index.ts +0 -70
  70. package/dist/spa/src/spa_types/core.ts +0 -51
  71. package/dist/spa/src/stores/core.ts +0 -228
  72. package/dist/spa/src/stores/filters.ts +0 -27
  73. package/dist/spa/src/stores/modal.ts +0 -48
  74. package/dist/spa/src/stores/toast.ts +0 -30
  75. package/dist/spa/src/stores/user.ts +0 -79
  76. package/dist/spa/src/types/Adapters.ts +0 -26
  77. package/dist/spa/src/types/Back.ts +0 -1344
  78. package/dist/spa/src/types/Common.ts +0 -940
  79. package/dist/spa/src/types/FrontendAPI.ts +0 -189
  80. package/dist/spa/src/utils.ts +0 -184
  81. package/dist/spa/src/views/CreateView.vue +0 -167
  82. package/dist/spa/src/views/EditView.vue +0 -171
  83. package/dist/spa/src/views/ListView.vue +0 -442
  84. package/dist/spa/src/views/LoginView.vue +0 -199
  85. package/dist/spa/src/views/PageNotFound.vue +0 -20
  86. package/dist/spa/src/views/ResourceParent.vue +0 -50
  87. package/dist/spa/src/views/ShowView.vue +0 -209
  88. package/dist/spa/src/websocket.ts +0 -129
  89. package/dist/spa/tailwind.config.js +0 -19
  90. package/dist/spa/tsconfig.app.json +0 -14
  91. package/dist/spa/tsconfig.json +0 -11
  92. package/dist/spa/tsconfig.node.json +0 -19
  93. package/dist/spa/vite.config.ts +0 -52
@@ -1,49 +0,0 @@
1
- <template>
2
- <div class="md:flex">
3
- <ul class="flex-column space-y space-y-4 text-sm font-medium text-gray-500 dark:text-gray-400 md:me-4 mb-4 md:mb-0">
4
- <li v-for="tab in tabs" :key="`${tab}-tab-controll`">
5
- <a
6
- href="#"
7
- @click="activeTab = tab"
8
- class="inline-flex items-center px-4 py-3 rounded-lg w-full"
9
- :class="tab === activeTab ? 'text-lightPrimaryContrast bg-lightPrimary active dark:bg-darkPrimary' : 'text-gray-500 dark:text-gray-400 hover:text-gray-700 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:hover:text-white'"
10
- aria-current="page"
11
- >
12
- <slot :name="`tab:${tab}`"></slot>
13
- </a>
14
- </li>
15
- </ul>
16
- <div class="ps-6 text-medium text-gray-500 dark:text-gray-400 w-full ">
17
- <slot :name="activeTab"></slot>
18
- </div>
19
- </div>
20
- </template>
21
-
22
- <script setup lang="ts">
23
- import { onMounted, useSlots, ref, type Ref } from 'vue';
24
- const tabs : Ref<string[]> = ref([]);
25
- const activeTab = ref('');
26
- const props = defineProps({
27
- activeTab: {
28
- type: String
29
- }
30
- });
31
- const emites = defineEmits([
32
- 'update:activeTab',
33
- ]);
34
- onMounted(() => {
35
- const slots = useSlots();
36
- tabs.value = Object.keys(slots).reduce((tbs: string[], tb: string) => {
37
- if (tb.startsWith('tab:')) {
38
- tbs.push(tb.replace('tab:', ''));
39
- }
40
- return tbs;
41
- }, []);
42
- if (tabs.value.length > 0) {
43
- activeTab.value = tabs.value[0];
44
- }
45
- });
46
-
47
-
48
-
49
- </script>
@@ -1,20 +0,0 @@
1
-
2
-
3
- export { default as Select } from './Select.vue';
4
- export { default as Link } from './Link.vue';
5
- export { default as Button } from './Button.vue';
6
- export { default as Input } from './Input.vue';
7
- export { default as Tooltip } from './Tooltip.vue';
8
- export { default as LinkButton } from './LinkButton.vue';
9
- export { default as VerticalTabs } from './VerticalTabs.vue';
10
- export { default as Checkbox } from './Checkbox.vue';
11
- export { default as Dropzone } from './Dropzone.vue';
12
- export { default as AreaChart } from './AreaChart.vue';
13
- export { default as BarChart } from './BarChart.vue';
14
- export { default as PieChart } from './PieChart.vue';
15
- export { default as Table } from './Table.vue';
16
- export { default as ProgressBar } from './ProgressBar.vue';
17
- export { default as Spinner } from './Spinner.vue';
18
- export { default as Skeleton } from './Skeleton.vue';
19
-
20
-
@@ -1,2 +0,0 @@
1
-
2
-
@@ -1,19 +0,0 @@
1
- <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <g clip-path="url(#clip0_1_8)">
3
- <path d="M8.034 6.006V13H6.097V12.194C5.59433 12.8007 4.86633 13.104 3.913 13.104C3.25433 13.104 2.65633 12.9567 2.119 12.662C1.59033 12.3673 1.17433 11.947 0.871 11.401C0.567667 10.855 0.416 10.2223 0.416 9.503C0.416 8.78367 0.567667 8.151 0.871 7.605C1.17433 7.059 1.59033 6.63867 2.119 6.344C2.65633 6.04933 3.25433 5.902 3.913 5.902C4.80567 5.902 5.50333 6.18367 6.006 6.747V6.006H8.034ZM4.264 11.44C4.77533 11.44 5.2 11.2667 5.538 10.92C5.876 10.5647 6.045 10.0923 6.045 9.503C6.045 8.91367 5.876 8.44567 5.538 8.099C5.2 7.74367 4.77533 7.566 4.264 7.566C3.744 7.566 3.315 7.74367 2.977 8.099C2.639 8.44567 2.47 8.91367 2.47 9.503C2.47 10.0923 2.639 10.5647 2.977 10.92C3.315 11.2667 3.744 11.44 4.264 11.44Z" fill="url(#paint0_linear_1_8)"/>
4
- <path d="M13.317 5.538C12.589 5.538 12.0387 5.69833 11.666 6.019C11.2933 6.331 11.107 6.80333 11.107 7.436V7.995H14.851V9.685H11.107V13H9.001V7.449C9.001 6.279 9.365 5.369 10.093 4.719C10.8297 4.069 11.8567 3.744 13.174 3.744C13.694 3.744 14.1837 3.80033 14.643 3.913C15.1023 4.017 15.501 4.173 15.839 4.381L15.189 6.045C14.669 5.707 14.045 5.538 13.317 5.538Z" fill="url(#paint1_linear_1_8)"/>
5
- </g>
6
- <defs>
7
- <linearGradient id="paint0_linear_1_8" x1="1.5" y1="6.93333" x2="7.31883" y2="11.8926" gradientUnits="userSpaceOnUse">
8
- <stop stop-color="#656E7A"/>
9
- <stop offset="1" stop-color="#99A6B8"/>
10
- </linearGradient>
11
- <linearGradient id="paint1_linear_1_8" x1="12.5" y1="3.73333" x2="9.68642" y2="12.7016" gradientUnits="userSpaceOnUse">
12
- <stop stop-color="#48C5FF"/>
13
- <stop offset="1" stop-color="#A1E1FF"/>
14
- </linearGradient>
15
- <clipPath id="clip0_1_8">
16
- <rect width="16" height="16" fill="white"/>
17
- </clipPath>
18
- </defs>
19
- </svg>
@@ -1,44 +0,0 @@
1
- <script setup lang="ts">
2
- import { useModalStore } from '@/stores/modal';
3
-
4
- const modalStore = useModalStore();
5
- </script>
6
-
7
- <template>
8
- <Teleport to="body">
9
- <div v-if="modalStore.isOpened" class="bg-gray-900/50 dark:bg-gray-900/80 overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-50 justify-center items-center w-full md:inset-0 h-full max-h-full">
10
- <div class="relative p-4 w-full max-w-md max-h-full top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 " >
11
- <div class="relative bg-white rounded-lg shadow dark:bg-gray-700 dark:shadow-black">
12
- <button type="button"@click="modalStore.togleModal" class="absolute top-3 end-2.5 text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white" >
13
- <svg class="w-3 h-3" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 14 14">
14
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"/>
15
- </svg>
16
- <span class="sr-only">{{ $t('Close modal') }}</span>
17
- </button>
18
- <div class="p-4 md:p-5 text-center">
19
- <svg class="mx-auto mb-4 text-gray-400 w-12 h-12 dark:text-gray-200" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
20
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 11V6m0 8h.01M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/>
21
- </svg>
22
- <h3 class="mb-5 text-lg font-normal text-gray-500 dark:text-gray-400">{{ modalStore?.modalContent?.content }}</h3>
23
- <button @click="()=>{ modalStore.onAcceptFunction(true);modalStore.togleModal()}" type="button" class="text-white bg-red-600 hover:bg-red-800 focus:ring-4 focus:outline-none focus:ring-red-300 dark:focus:ring-red-800 font-medium rounded-lg text-sm inline-flex items-center px-5 py-2.5 text-center">
24
- {{ modalStore?.modalContent?.acceptText }}
25
- </button>
26
- <button @click="()=>{modalStore.onAcceptFunction(false);modalStore.togleModal()}" type="button" class="py-2.5 px-5 ms-3 text-sm font-medium text-gray-900 focus:outline-none bg-white rounded-lg border border-gray-200 hover:bg-gray-100 hover:text-lightPrimary focus:z-10 focus:ring-4 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700">{{ modalStore?.modalContent?.cancelText }}</button>
27
- </div>
28
- </div>
29
- </div>
30
- </div>
31
-
32
- </Teleport>
33
- </template>
34
-
35
- <style scoped>
36
- .modal {
37
- position: fixed;
38
- z-index: 999;
39
- top: 20%;
40
- left: 50%;
41
- width: 300px;
42
- margin-left: -150px;
43
- }
44
- </style>
@@ -1,41 +0,0 @@
1
- <template>
2
- <nav class="flex" aria-label="Breadcrumb">
3
- <ol class="inline-flex items-center space-x-1 md:space-x-2 rtl:space-x-reverse flex-wrap">
4
- <li class="inline-flex items-center">
5
- <RouterLink :to="{name: 'home'}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-lightPrimary dark:text-gray-400 dark:hover:text-white">
6
- <svg class="w-3 h-3 me-2.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20">
7
- <path d="m19.707 9.293-2-2-7-7a1 1 0 0 0-1.414 0l-7 7-2 2a1 1 0 0 0 1.414 1.414L2 10.414V18a2 2 0 0 0 2 2h3a1 1 0 0 0 1-1v-4a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v4a1 1 0 0 0 1 1h3a2 2 0 0 0 2-2v-7.586l.293.293a1 1 0 0 0 1.414-1.414Z"/>
8
- </svg>
9
- {{ $t('Home') }}
10
- </RouterLink>
11
- </li>
12
- <li>
13
- <div class="flex items-center">
14
- <svg class="rtl:rotate-180 w-3 h-3 text-gray-400 mx-1" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 6 10">
15
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 9 4-4-4-4"/>
16
- </svg>
17
- <RouterLink :to="{name: 'resource-list', params: { resourceId: $route.params.resourceId }}" class="text-sm font-medium text-gray-500 md:ms-2 dark:text-gray-400">{{ coreStore.resourceById[$route.params.resourceId]?.label }}</RouterLink>
18
- </div>
19
- </li>
20
-
21
- <li v-if="$route.params.primaryKey">
22
- <div class="flex items-center">
23
- <svg class="rtl:rotate-180 w-3 h-3 text-gray-400 mx-1" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 6 10">
24
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 9 4-4-4-4"/>
25
- </svg>
26
- <span class="ms-1 text-sm font-medium text-gray-500 md:ms-2 dark:text-gray-400
27
- max-w-80 truncate">
28
- {{ $route.name === 'resource-edit' ? $t('Edit') : $t('Show') }} {{ coreStore.record?._label }}</span>
29
- </div>
30
- </li>
31
-
32
-
33
- </ol>
34
- </nav>
35
- </template>
36
-
37
- <script setup>
38
- import { useCoreStore } from '@/stores/core';
39
-
40
- const coreStore = useCoreStore()
41
- </script>
@@ -1,25 +0,0 @@
1
- <template>
2
- <div>
3
- <div class="flex items-center justify-between mb-3 flex-wrap gap-y-2 gap-2">
4
- <Breadcrumbs />
5
- <div class="flex items-center space-x-1 flex-wrap gap-y-1">
6
- <slot></slot>
7
- </div>
8
- </div>
9
- <div class="flex items-center justify-between mb-3 flex-wrap gap-y-2 gap-2" v-if="coreStore.resourceColumnsError">
10
- <div class="p-4 mb-4 text-sm text-red-800 rounded-lg bg-red-50 dark:bg-gray-800 dark:text-red-400" role="alert">
11
- <span class="font-medium">{{ $t('Error!')}}</span> {{ coreStore.resourceColumnsError }}
12
- </div>
13
- </div>
14
- </div>
15
-
16
- </template>
17
-
18
- <script setup>
19
- import Breadcrumbs from '@/components/Breadcrumbs.vue';
20
-
21
- import { useCoreStore } from '@/stores/core';
22
-
23
- const coreStore = useCoreStore();
24
-
25
- </script>
@@ -1,180 +0,0 @@
1
- <template>
2
- <div>
3
- <div class="grid w-40 gap-4 mb-2">
4
- <div>
5
- <label for="start-time" class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">{{ label }}</label>
6
-
7
- <div class="relative">
8
- <div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5 pointer-events-none">
9
- <IconCalendar class="w-4 h-4 text-gray-500 dark:text-gray-400"/>
10
- </div>
11
-
12
- <input ref="datepickerStartEl" type="text"
13
- class="bg-gray-50 border leading-none border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
14
- :placeholder="$t('Select date')" :disabled="isReadonly" />
15
-
16
- </div>
17
- </div>
18
- </div>
19
-
20
- <div>
21
- <div class="grid w-40 gap-4 mb-2" :class="{hidden: !showTimeInputs}">
22
- <div>
23
- <div class="relative">
24
- <div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5 pointer-events-none">
25
- <IconTime class="w-4 h-4 text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-700"/>
26
- </div>
27
-
28
- <input v-model="startTime" type="time" id="start-time" onfocus="this.showPicker()" onclick="this.showPicker()" step="1"
29
- class="bg-gray-50 border leading-none border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
30
- value="00:00" :disabled="isReadonly" required/>
31
- </div>
32
- </div>
33
- </div>
34
-
35
- <button type="button"
36
- class="text-lightPrimary dark:text-darkPrimary text-base font-medium hover:underline p-0 inline-flex items-center mb-2"
37
- @click="toggleTimeInputs">{{ showTimeInputs ? $t('Hide time') : $t('Show time') }}
38
- <svg class="w-8 h-8 ms-0.5" :class="{'rotate-180': showTimeInputs}" aria-hidden="true"
39
- xmlns="http://www.w3.org/2000/svg" width="24" height="24"
40
- fill="none" viewBox="0 0 24 24">
41
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
42
- d="m8 10 4 4 4-4"/>
43
- </svg>
44
- </button>
45
- </div>
46
- </div>
47
- </template>
48
- <script setup>
49
- import {ref, computed, onMounted, watch, onBeforeUnmount, nextTick} from 'vue';
50
- import dayjs from 'dayjs';
51
- import utc from 'dayjs/plugin/utc';
52
-
53
- import {useCoreStore} from '@/stores/core';
54
-
55
- import Datepicker from "flowbite-datepicker/Datepicker";
56
- import IconCalendar from "@/components/icons/IconCalendar.vue";
57
- import IconTime from "@/components/icons/IconTime.vue";
58
-
59
- const coreStore = useCoreStore();
60
- dayjs.extend(utc)
61
-
62
- const props = defineProps({
63
- valueStart: {
64
- default: undefined
65
- },
66
- column: {
67
- type: Object,
68
- },
69
- label: {
70
- type: String,
71
- },
72
- autoHide: {
73
- type: Boolean,
74
- },
75
- isReadonly: {
76
- type: Boolean,
77
- },
78
- });
79
-
80
- const emit = defineEmits(['update:valueStart']);
81
-
82
- const datepickerStartEl = ref();
83
-
84
- const showTimeInputs = ref(false);
85
-
86
- const startDate = ref('');
87
-
88
- const startTime = ref('');
89
-
90
- const datepickerObject = ref('')
91
-
92
- const start = computed(() => {
93
- if (!startDate.value) {
94
- return;
95
- }
96
-
97
- let date = dayjs(startDate.value);
98
-
99
- if (startTime.value) {
100
- date = addTimeToDate(formatTime(startTime.value), date)
101
- }
102
-
103
- return date.utc().toISOString();
104
- })
105
-
106
- async function updateFromProps() {
107
- if (!props.valueStart) {
108
- datepickerStartEl.value.value = '';
109
- startTime.value = '';
110
- } else {
111
- // wait ref to initialize
112
- await nextTick();
113
- datepickerObject.value.setDate(dayjs(props.valueStart).format('DD MMM YYYY'));
114
- startTime.value = dayjs(props.valueStart).format('HH:mm:ss')
115
- }
116
- }
117
-
118
- onMounted(() => {
119
- updateFromProps();
120
-
121
- watch(() => [props.valueStart], (value) => {
122
- updateFromProps();
123
- });
124
- })
125
-
126
- watch(start, () => {
127
- //console.log('⚡ emit', start.value)
128
- emit('update:valueStart', start.value)
129
- })
130
-
131
- function initDatepickers() {
132
- const options = {format: 'dd M yyyy'};
133
-
134
- if (props.autoHide) {
135
- options.autohide = true;
136
- }
137
-
138
- datepickerObject.value = new Datepicker(datepickerStartEl.value, options);
139
-
140
- addChangeDateListener();
141
- }
142
-
143
- function addChangeDateListener() {
144
- datepickerStartEl.value.addEventListener('changeDate', setStartDate)
145
- }
146
-
147
- function removeChangeDateListener() {
148
- datepickerStartEl.value.removeEventListener('changeDate', setStartDate);
149
- }
150
-
151
- function destroyDatepickerElement() {
152
- datepickerObject.value.destroy();
153
- }
154
-
155
- function setStartDate(event) {
156
- startDate.value = event.detail.date
157
- }
158
-
159
- function formatTime(time) {
160
- return time.split(':').map(Number).length === 2 ? time + ':00' : time;
161
- }
162
-
163
- function addTimeToDate(time, date) {
164
- const [hours, minutes, seconds] = time.split(':').map(Number)
165
- return date.hour(hours).minute(minutes).second(seconds)
166
- }
167
-
168
- const toggleTimeInputs = () => {
169
- showTimeInputs.value = !showTimeInputs.value
170
- }
171
-
172
- onMounted(() => {
173
- initDatepickers();
174
- });
175
-
176
- onBeforeUnmount(() => {
177
- removeChangeDateListener();
178
- destroyDatepickerElement();
179
- });
180
- </script>
@@ -1,218 +0,0 @@
1
- <template>
2
- <div>
3
- <div class="mx-auto grid grid-cols-2 gap-4 mb-2">
4
- <div class="relative">
5
- <div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5 pointer-events-none">
6
- <IconCalendar class="w-4 h-4 text-gray-500 dark:text-gray-400"/>
7
- </div>
8
-
9
- <input ref="datepickerStartEl" type="text"
10
- class="bg-gray-50 border leading-none border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
11
- :placeholder="$t('From')">
12
- </div>
13
-
14
- <div class="relative">
15
- <div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5 pointer-events-none">
16
- <IconCalendar class="w-4 h-4 text-gray-500 dark:text-gray-400"/>
17
- </div>
18
-
19
- <input ref="datepickerEndEl" type="text"
20
- class="bg-gray-50 border leading-none border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
21
- :placeholder="$t('To')">
22
- </div>
23
- </div>
24
-
25
- <div>
26
- <div class="mx-auto grid grid-cols-2 gap-4 mb-2" :class="{hidden: !showTimeInputs}">
27
- <div>
28
- <div class="relative">
29
- <div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5 pointer-events-none">
30
- <IconTime class="w-4 h-4 text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-700"/>
31
- </div>
32
-
33
- <input v-model="startTime" type="time" id="start-time"
34
- class="bg-gray-50 border leading-none border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
35
- value="00:00" required/>
36
- </div>
37
- </div>
38
-
39
- <div>
40
- <div class="relative">
41
- <div class="absolute inset-y-0 end-0 top-0 flex items-center pe-3.5 pointer-events-none">
42
- <IconTime class="w-4 h-4 text-gray-500 dark:text-gray-400 bg-white dark:bg-gray-700"/>
43
- </div>
44
-
45
- <input v-model="endTime" type="time" id="end-time"
46
- class="bg-gray-50 border leading-none border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
47
- value="00:00" required/>
48
- </div>
49
- </div>
50
- </div>
51
-
52
- <button type="button"
53
- class="text-lightPrimary dark:text-darkPrimary text-base font-medium hover:underline p-0 inline-flex items-center mb-2"
54
- @click="toggleTimeInputs">{{ showTimeInputs ? $t('Hide time') : $t('Show time') }}
55
- <svg class="w-8 h-8 ms-0.5 relative top-px" :class="{'rotate-180': showTimeInputs}" aria-hidden="true"
56
- xmlns="http://www.w3.org/2000/svg" width="24" height="24"
57
- fill="none" viewBox="0 0 24 24">
58
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
59
- d="m8 10 4 4 4-4"/>
60
- </svg>
61
- </button>
62
- </div>
63
- </div>
64
- </template>
65
- <script setup>
66
- import {ref, computed, onMounted, watch, onBeforeUnmount} from 'vue';
67
- import dayjs from 'dayjs';
68
- import utc from 'dayjs/plugin/utc';
69
-
70
- import {useCoreStore} from '@/stores/core';
71
-
72
- import Datepicker from "flowbite-datepicker/Datepicker";
73
- import IconCalendar from "@/components/icons/IconCalendar.vue";
74
- import IconTime from "@/components/icons/IconTime.vue";
75
-
76
- const coreStore = useCoreStore();
77
- dayjs.extend(utc)
78
-
79
- const props = defineProps({
80
- valueStart: {
81
- default: undefined
82
- },
83
- valueEnd: {
84
- default: undefined
85
- },
86
- column: {
87
- type: Object,
88
- },
89
- });
90
-
91
- const emit = defineEmits(['update:valueStart', 'update:valueEnd']);
92
-
93
- const datepickerStartEl = ref();
94
- const datepickerEndEl = ref();
95
-
96
- const showTimeInputs = ref(false);
97
-
98
- const startDate = ref('');
99
- const endDate = ref('');
100
-
101
- const startTime = ref('');
102
- const endTime = ref('');
103
-
104
- const datepickerStartObject = ref('')
105
- const datepickerEndObject = ref('')
106
-
107
- const start = computed(() => {
108
- if (!startDate.value) {
109
- return;
110
- }
111
-
112
- let date = dayjs(startDate.value);
113
-
114
- if (startTime.value) {
115
- date = addTimeToDate(formatTime(startTime.value), date)
116
- }
117
-
118
- return date.utc().toISOString();
119
- })
120
-
121
- const end = computed(() => {
122
- if (!endDate.value) {
123
- return;
124
- }
125
-
126
- let date = dayjs(endDate.value);
127
-
128
- if (endTime.value) {
129
- date = addTimeToDate(formatTime(endTime.value), date)
130
- } else {
131
- date = addTimeToDate('23:59:59', date)
132
- }
133
-
134
- return date.utc().toISOString();
135
- })
136
-
137
- function updateFromProps() {
138
- if (!props.valueStart) {
139
- datepickerStartEl.value.value = '';
140
- startTime.value = '';
141
- }
142
- if (!props.valueEnd) {
143
- datepickerEndEl.value.value = '';
144
- endTime.value = '';
145
- }
146
- }
147
-
148
- onMounted(() => {
149
- updateFromProps();
150
-
151
- watch(() => [props.valueStart, props.valueEnd], (value) => {
152
- updateFromProps();
153
- });
154
- })
155
-
156
- watch(start, () => {
157
- //console.log('⚡ emit', start.value)
158
- emit('update:valueStart', start.value)
159
- })
160
-
161
- watch(end, () => {
162
- //console.log('⚡ emit', end.value)
163
- emit('update:valueEnd', end.value)
164
- })
165
-
166
- function initDatepickers() {
167
-
168
- datepickerStartObject.value = new Datepicker(datepickerStartEl.value, {format: 'dd M yyyy'});
169
-
170
- datepickerEndObject.value = new Datepicker(datepickerEndEl.value, {format: 'dd M yyyy'});
171
- addChangeDateListener();
172
- }
173
-
174
- function addChangeDateListener() {
175
- datepickerStartEl.value.addEventListener('changeDate', setStartDate)
176
- datepickerEndEl.value.addEventListener('changeDate', setEndDate)
177
- }
178
-
179
- function removeChangeDateListener() {
180
- datepickerStartEl.value.removeEventListener('changeDate', setStartDate);
181
- datepickerEndEl.value.removeEventListener('changeDate', setEndDate);
182
- }
183
-
184
- function destroyDatepickerElement() {
185
- datepickerStartObject.value.destroy();
186
- datepickerEndObject.value.destroy();
187
- }
188
-
189
- function setStartDate(event) {
190
- startDate.value = event.detail.date
191
- }
192
-
193
- function setEndDate(event) {
194
- endDate.value = event.detail.date
195
- }
196
-
197
- function formatTime(time) {
198
- return time.split(':').map(Number).length === 2 ? time + ':00' : time;
199
- }
200
-
201
- function addTimeToDate(time, date) {
202
- const [hours, minutes, seconds] = time.split(':').map(Number)
203
- return date.hour(hours).minute(minutes).second(seconds)
204
- }
205
-
206
- const toggleTimeInputs = () => {
207
- showTimeInputs.value = !showTimeInputs.value
208
- }
209
-
210
- onMounted(() => {
211
- initDatepickers();
212
- });
213
-
214
- onBeforeUnmount(() => {
215
- removeChangeDateListener();
216
- destroyDatepickerElement();
217
- })
218
- </script>