edvoyui-component-library-test-flight 0.0.21 → 0.0.23

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 (125) hide show
  1. package/dist/EUIButton.vue.d.ts.map +1 -0
  2. package/dist/library-vue-ts.cjs.js +4 -3
  3. package/dist/library-vue-ts.es.js +3 -8
  4. package/dist/library-vue-ts.umd.js +4 -3
  5. package/dist/select/EUISelect.vue.d.ts.map +1 -0
  6. package/package.json +4 -2
  7. package/src/App.vue +16 -0
  8. package/src/assets/fonts/gilroy/GilroyBold/font.woff +0 -0
  9. package/src/assets/fonts/gilroy/GilroyBold/font.woff2 +0 -0
  10. package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff +0 -0
  11. package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff2 +0 -0
  12. package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff +0 -0
  13. package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff2 +0 -0
  14. package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff +0 -0
  15. package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff2 +0 -0
  16. package/src/assets/fonts/gilroy/GilroyMedium/font.woff +0 -0
  17. package/src/assets/fonts/gilroy/GilroyMedium/font.woff2 +0 -0
  18. package/src/assets/fonts/gilroy/GilroyRegular/font.woff +0 -0
  19. package/src/assets/fonts/gilroy/GilroyRegular/font.woff2 +0 -0
  20. package/src/assets/fonts/gilroy/GilroySemiBold/font.woff +0 -0
  21. package/src/assets/fonts/gilroy/GilroySemiBold/font.woff2 +0 -0
  22. package/src/assets/fonts/inter/Inter-Bold.woff +0 -0
  23. package/src/assets/fonts/inter/Inter-Bold.woff2 +0 -0
  24. package/src/assets/fonts/inter/Inter-Italic.woff +0 -0
  25. package/src/assets/fonts/inter/Inter-Italic.woff2 +0 -0
  26. package/src/assets/fonts/inter/Inter-Medium.woff +0 -0
  27. package/src/assets/fonts/inter/Inter-Medium.woff2 +0 -0
  28. package/src/assets/fonts/inter/Inter-MediumItalic.woff +0 -0
  29. package/src/assets/fonts/inter/Inter-MediumItalic.woff2 +0 -0
  30. package/src/assets/fonts/inter/Inter-Regular.woff +0 -0
  31. package/src/assets/fonts/inter/Inter-Regular.woff2 +0 -0
  32. package/src/assets/fonts/inter/Inter-SemiBold.woff +0 -0
  33. package/src/assets/fonts/inter/Inter-SemiBold.woff2 +0 -0
  34. package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
  35. package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
  36. package/src/assets/scss/body.scss +15 -0
  37. package/src/assets/svg/ChevronDownSolid.vue +19 -0
  38. package/src/assets/svg/ChevronDownStroke.vue +22 -0
  39. package/src/assets/svg/SortArrow.vue +24 -0
  40. package/src/assets/svg/Student.vue +30 -0
  41. package/src/assets/svg/partner.vue +33 -0
  42. package/src/assets/svg/people.vue +25 -0
  43. package/src/assets/vue.svg +1 -0
  44. package/src/components/HelloWorld.vue +999 -0
  45. package/src/components/accordion/EUIAccordion.stories.ts +157 -0
  46. package/src/components/accordion/EUIAccordion.vue +90 -0
  47. package/src/components/avatar/EUIAvatar.stories.ts +157 -0
  48. package/src/components/avatar/EUIAvatar.vue +96 -0
  49. package/src/components/button/EUIButton.stories.ts +252 -0
  50. package/src/components/button/EUIButton.vue +151 -0
  51. package/src/components/checkbox/EUICheckbox.stories.ts +58 -0
  52. package/src/components/checkbox/EUICheckbox.vue +103 -0
  53. package/src/components/datepicker/EUIDatepicker.stories.ts +236 -0
  54. package/src/components/datepicker/EUIDatepicker.vue +185 -0
  55. package/src/components/delete.vue +108 -0
  56. package/src/components/dropdown/EUIMultiDropdown.stories.ts +187 -0
  57. package/src/components/dropdown/EUIMultiDropdown.vue +129 -0
  58. package/src/components/errorMessage/EUIErrorMessage.scss +0 -0
  59. package/src/components/errorMessage/EUIErrorMessage.stories.ts +41 -0
  60. package/src/components/errorMessage/EUIErrorMessage.vue +25 -0
  61. package/src/components/index.ts +46 -0
  62. package/src/components/input/EUIInput.stories.ts +174 -0
  63. package/src/components/input/EUIInput.vue +169 -0
  64. package/src/components/inputNormal/EUIInputNormal.stories.ts +164 -0
  65. package/src/components/inputNormal/EUIInputNormal.vue +161 -0
  66. package/src/components/loader/EUICircleLoader.vue +31 -0
  67. package/src/components/loader/EUICubeLoader.vue +237 -0
  68. package/src/components/loader/EUILoader.stories.ts +99 -0
  69. package/src/components/loader/EUILoader.vue +17 -0
  70. package/src/components/loader/EUISquareLoader.vue +47 -0
  71. package/src/components/modal/EUIModal.stories.ts +372 -0
  72. package/src/components/modal/EUIModal.vue +163 -0
  73. package/src/components/pillSelect/EUIPillSelect.stories.ts +74 -0
  74. package/src/components/pillSelect/EUIPillSelect.vue +149 -0
  75. package/src/components/popover/EUIPopover.stories.ts +247 -0
  76. package/src/components/popover/EUIPopover.vue +159 -0
  77. package/src/components/radio/EUIRadio.stories.ts +54 -0
  78. package/src/components/radio/EUIRadio.vue +78 -0
  79. package/src/components/searchInput/EUISearch.stories.ts +24 -0
  80. package/src/components/searchInput/EUISearch.vue +215 -0
  81. package/src/components/select/EUISelect.scss +0 -0
  82. package/src/components/select/EUISelect.stories.ts +49 -0
  83. package/src/components/select/EUISelect.vue +682 -0
  84. package/src/components/selectSearch/EUISelectSearch.vue +23 -0
  85. package/src/components/slideover/EUISlideover.stories.ts +318 -0
  86. package/src/components/slideover/EUISlideover.vue +207 -0
  87. package/src/components/stepperTimeline/EUIStepperHorizontal.vue +112 -0
  88. package/src/components/stepperTimeline/EUIStepperTimeline.stories.ts +54 -0
  89. package/src/components/stepperTimeline/EUIStepperTimeline.vue +16 -0
  90. package/src/components/stepperTimeline/EUIStepperVertical.vue +112 -0
  91. package/src/components/table/EUIDashboardTable.vue +482 -0
  92. package/src/components/table/EUIPageLimit.vue +66 -0
  93. package/src/components/table/EUIPagination.vue +175 -0
  94. package/src/components/table/EUIStudentPagination.vue +172 -0
  95. package/src/components/table/EUITable.stories.ts +190 -0
  96. package/src/components/table/EUITable.vue +508 -0
  97. package/src/components/table/EUITableCheckbox.vue +97 -0
  98. package/src/components/tabs/EUITabs.vue +128 -0
  99. package/src/components/tabs/EUItabs.stories.ts +123 -0
  100. package/src/components/tag/EUITag.stories.ts +46 -0
  101. package/src/components/tag/EUITag.vue +46 -0
  102. package/src/components/telephone/EUITelephone.stories.ts +202 -0
  103. package/src/components/telephone/EUITelephone.vue +280 -0
  104. package/src/components/textArea/EUITextArea.stories.ts +82 -0
  105. package/src/components/textArea/EUITextArea.vue +122 -0
  106. package/src/components/timeLine/EUITimeLine.stories.ts +247 -0
  107. package/src/components/timeLine/EUITimeLine.vue +43 -0
  108. package/src/components/timeLine/EUITimeLineItem.vue +124 -0
  109. package/src/components/toggle/EUIToggle.stories.ts +63 -0
  110. package/src/components/toggle/EUIToggle.vue +99 -0
  111. package/src/components/tooltip/EUITooltip.stories.ts +53 -0
  112. package/src/components/tooltip/EUITooltip.vue +108 -0
  113. package/src/data/books.ts +163 -0
  114. package/src/data/tab.ts +33 -0
  115. package/src/data/table.ts +5392 -0
  116. package/src/main.ts +5 -0
  117. package/src/utils/lodash.ts +9 -0
  118. package/src/utils/types.ts +9 -0
  119. package/src/vite-env.d.ts +5 -0
  120. package/dist/EUISelect.vue.d.ts.map +0 -1
  121. package/dist/button/EUIButton.vue.d.ts.map +0 -1
  122. package/dist/library-vue-ts.css +0 -1
  123. package/dist/style.scss +0 -118
  124. /package/dist/{button/EUIButton.vue.d.ts → EUIButton.vue.d.ts} +0 -0
  125. /package/dist/{EUISelect.vue.d.ts → select/EUISelect.vue.d.ts} +0 -0
@@ -0,0 +1,175 @@
1
+ <template>
2
+
3
+ <div
4
+ class="inline-flex flex-row items-center gap-2 overflow-hidden border-gray-100 rounded"
5
+ >
6
+ <div>
7
+ <button
8
+ :class="[
9
+ 'rounded-md capitalize box-border border-none focus:outline-none inline-flex flex-row gap-x-2 items-center transition duration-150 ease-in-out bg-white text-black cursor-pointer text-sm font-medium px-3 py-2',
10
+ currentPage === 1 && 'opacity-50 pointer-events-none',
11
+ ]"
12
+ :disabled="currentPage === 1 ? true : false"
13
+ @click="prev()"
14
+ >
15
+ <ChevronDownStroke class="text-current transform rotate-90 size-6" />
16
+ <span class="hidden md:block">Back</span>
17
+ </button>
18
+ </div>
19
+ <div v-for="i in displayedPages" :key="i">
20
+ <button
21
+ :class="[
22
+ 'rounded-md capitalize box-border border-none focus:outline-none inline-flex flex-row gap-x-2 items-center transition duration-150 ease-in-out cursor-pointer text-sm font-medium px-3 py-2',
23
+ i == '…'
24
+ ? 'select-none pointer-events-none'
25
+ : currentPage == i
26
+ ? 'text-white bg-violet-600'
27
+ : 'bg-white text-black',
28
+ ]"
29
+ @click="typeof i === 'number' && changePage(i - 1)"
30
+ >
31
+ {{ i }}
32
+ </button>
33
+ </div>
34
+ <div>
35
+ <button
36
+ :class="[
37
+ 'rounded-md capitalize box-border border-none focus:outline-none inline-flex flex-row gap-x-2 items-center transition duration-150 ease-in-out bg-white text-black cursor-pointer text-sm font-medium px-3 py-2',
38
+ totalPages === currentPage && 'opacity-50 pointer-events-none',
39
+ ]"
40
+ :disabled="totalPages === currentPage ? true : false"
41
+ @click="next()"
42
+ >
43
+ <span class="hidden md:block">Next</span>
44
+ <ChevronDownStroke class="text-current transform -rotate-90 size-6" />
45
+ </button>
46
+ </div>
47
+ </div>
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import { computed } from 'vue';
52
+ import ChevronDownStroke from '../../assets/svg/ChevronDownStroke.vue';
53
+
54
+ const props = defineProps({
55
+ totalCount: {
56
+ type: Number, default: 0, required: true
57
+ },
58
+ pageLimit: {
59
+ type: Number, default: 0, required: true
60
+ },
61
+ activePage: {
62
+ type: Number, default: 0
63
+ },
64
+ divider: {
65
+ type: String, default: '…'
66
+ },
67
+ max: {
68
+ type: Number, default: 7,
69
+ validate (value:number) {
70
+ return value >= 5 && value < Number.MAX_VALUE
71
+ }
72
+ }
73
+ })
74
+
75
+ const emit = defineEmits(['changePage'])
76
+ const currentPage = computed(() => props.activePage + 1);
77
+ const totalPages = computed(() => {
78
+ return props.pageLimit > 0 ? Math.ceil(props.totalCount / props.pageLimit) : 1
79
+ });
80
+
81
+ const prev = () => {
82
+ if (props.activePage > 0) {
83
+ const prevPage = props.activePage - 1
84
+ changePage(prevPage)
85
+ }
86
+ }
87
+
88
+ const next = () => {
89
+ if (props.activePage < totalPages.value - 1) {
90
+ const nextPage = props.activePage + 1
91
+ changePage(nextPage)
92
+ }
93
+ }
94
+
95
+ const changePage = (page: Number) => {
96
+ emit('changePage', page)
97
+ }
98
+
99
+ // new pagination count
100
+ const pages = computed(() => Array.from({ length: Math.ceil(props.totalCount / props.pageLimit) },(_, i) => i + 1))
101
+
102
+ const displayedPages = computed(() => {
103
+ const totalPages = pages.value.length
104
+ const current = currentPage.value
105
+ const maxDisplayedPages = Math.max(props.max, 12)
106
+
107
+ const r = Math.floor((Math.min(maxDisplayedPages, totalPages) - 7) / 2)
108
+ const r1 = current - r
109
+ const r2 = current + r
110
+
111
+ const beforeWrapped = r1 - 1 > 1
112
+ const afterWrapped = r2 + 1 < totalPages
113
+
114
+ const items: Array<number | string> = []
115
+
116
+ if (totalPages <= maxDisplayedPages) {
117
+ for (let i = 1; i <= totalPages; i++) {
118
+ items.push(i)
119
+ }
120
+ return items
121
+ }
122
+
123
+ items.push(1)
124
+
125
+ if (beforeWrapped) {
126
+ items.push(props.divider)
127
+ }
128
+
129
+ if (!afterWrapped) {
130
+ const addedItems = current + r + 2 - totalPages
131
+ for (let i = current - r - addedItems; i <= current - r - 1; i++) {
132
+ items.push(i)
133
+ }
134
+ }
135
+
136
+ for (let i = Math.max(2, r1); i <= Math.min(totalPages, r2); i++) {
137
+ items.push(i)
138
+ }
139
+
140
+ if (!beforeWrapped) {
141
+ const addedItems = 1 - (current - r - 2)
142
+ for (let i = current + r + 1; i <= current + r + addedItems; i++) {
143
+ items.push(i)
144
+ }
145
+ }
146
+
147
+ if (afterWrapped) {
148
+ items.push(props.divider)
149
+ }
150
+
151
+ if (r2 < totalPages) {
152
+ items.push(totalPages)
153
+ }
154
+
155
+ // Replace divider by number on start edge case [1, '…', 3, ...]
156
+ if (items.length >= 3 && items[1] === props.divider && items[2] === 3) {
157
+ items[1] = 2
158
+ }
159
+
160
+ // Replace divider by number on end edge case [..., 48, '…', 50]
161
+ if (
162
+ items.length >= 3 &&
163
+ items[items.length - 2] === props.divider &&
164
+ items[items.length - 1] === items.length
165
+ ) {
166
+ items[items.length - 2] = items.length - 1
167
+ }
168
+
169
+ return items
170
+ })
171
+ </script>
172
+
173
+ <style scoped>
174
+
175
+ </style>
@@ -0,0 +1,172 @@
1
+ <template>
2
+ <div class="inline-flex flex-row items-center overflow-hidden gap-x-1">
3
+ <div>
4
+ <button
5
+ :class="[
6
+ 'rounded-md capitalize box-border border-none focus:outline-none inline-flex flex-row gap-x-2 items-center transition duration-150 ease-in-out bg-white text-black cursor-pointer text-sm font-medium px-3 py-1 leading-6',
7
+ currentPage === 1 && 'opacity-50 pointer-events-none',
8
+ ]"
9
+ :disabled="currentPage === 1 ? true : false"
10
+ @click="prev()"
11
+ >
12
+ <ChevronDownStroke class="text-current transform rotate-90 size-6" />
13
+ <span class="hidden md:block">Prev</span>
14
+ </button>
15
+ </div>
16
+ <div v-for="i in displayedPages" :key="i">
17
+ <button
18
+ :class="[
19
+ 'rounded-md capitalize box-border border-none focus:outline-none inline-flex flex-row gap-x-1 items-center transition-transform duration-100 ease-in-out cursor-pointer text-sm font-medium leading-6 px-3 py-1',
20
+ i === '…'
21
+ ? 'select-none pointer-events-none'
22
+ : currentPage === i
23
+ ? 'text-black bg-blue-50 ring-2 ring-inset ring-blue-600'
24
+ : 'bg-white text-black',
25
+ ]"
26
+ @click="typeof i === 'number' && changePage(i - 1)"
27
+ >
28
+ {{ i }}
29
+ </button>
30
+ </div>
31
+ <div>
32
+ <button
33
+ :class="[
34
+ 'rounded-md capitalize box-border border-none focus:outline-none inline-flex flex-row gap-x-2 items-center transition duration-150 ease-in-out bg-white text-black cursor-pointer text-sm font-medium px-3 py-1 leading-6',
35
+ totalPages === currentPage && 'opacity-50 pointer-events-none',
36
+ ]"
37
+ :disabled="totalPages === currentPage ? true : false"
38
+ @click="next()"
39
+ >
40
+ <span class="hidden md:block">Next</span>
41
+ <ChevronDownStroke class="text-current transform -rotate-90 size-6" />
42
+ </button>
43
+ </div>
44
+ </div>
45
+ </template>
46
+
47
+ <script setup lang="ts">
48
+ import { computed } from 'vue';
49
+ import ChevronDownStroke from '../../assets/svg/ChevronDownStroke.vue';
50
+
51
+ const props = defineProps({
52
+ totalCount: {
53
+ type: Number, default: 0, required: true
54
+ },
55
+ pageLimit: {
56
+ type: Number, default: 0, required: true
57
+ },
58
+ activePage: {
59
+ type: Number, default: 0
60
+ },
61
+ divider: {
62
+ type: String, default: '…'
63
+ },
64
+ max: {
65
+ type: Number, default: 7,
66
+ validate (value:number) {
67
+ return value >= 5 && value < Number.MAX_VALUE
68
+ }
69
+ }
70
+ })
71
+
72
+ const emit = defineEmits(['changePage'])
73
+ const currentPage = computed(() => props.activePage + 1);
74
+
75
+ const totalPages = computed(() => {
76
+ return props.pageLimit > 0 ? Math.ceil(props.totalCount / props.pageLimit) : 1
77
+ });
78
+
79
+ const prev = () => {
80
+ if (props.activePage > 0) {
81
+ const prevPage = props.activePage - 1
82
+ changePage(prevPage)
83
+ }
84
+ }
85
+
86
+ const next = () => {
87
+ if (props.activePage < totalPages.value - 1) {
88
+ const nextPage = props.activePage + 1
89
+ changePage(nextPage)
90
+ }
91
+ }
92
+
93
+ const changePage = (page: Number) => {
94
+ emit('changePage', page)
95
+ }
96
+
97
+ // new pagination count
98
+ const pages = computed(() => Array.from({ length: Math.ceil(props.totalCount / props.pageLimit) },(_, i) => i + 1))
99
+
100
+ const displayedPages = computed(() => {
101
+ const totalPages = pages.value.length
102
+ const current = currentPage.value
103
+ const maxDisplayedPages = Math.max(props.max, 5)
104
+
105
+ const r = Math.floor((Math.min(maxDisplayedPages, totalPages) - 5) / 2)
106
+ const r1 = current - r
107
+ const r2 = current + r
108
+
109
+ const beforeWrapped = r1 - 1 > 1
110
+ const afterWrapped = r2 + 1 < totalPages
111
+
112
+ const items: Array<number | string> = []
113
+
114
+ if (totalPages <= maxDisplayedPages) {
115
+ for (let i = 1; i <= totalPages; i++) {
116
+ items.push(i)
117
+ }
118
+ return items
119
+ }
120
+
121
+ items.push(1)
122
+
123
+ if (beforeWrapped) {
124
+ items.push(props.divider)
125
+ }
126
+
127
+ if (!afterWrapped) {
128
+ const addedItems = current + r + 2 - totalPages
129
+ for (let i = current - r - addedItems; i <= current - r - 1; i++) {
130
+ items.push(i)
131
+ }
132
+ }
133
+
134
+ for (let i = Math.max(2, r1); i <= Math.min(totalPages, r2); i++) {
135
+ items.push(i)
136
+ }
137
+
138
+ if (!beforeWrapped) {
139
+ const addedItems = 1 - (current - r - 2)
140
+ for (let i = current + r + 1; i <= current + r + addedItems; i++) {
141
+ items.push(i)
142
+ }
143
+ }
144
+
145
+ if (afterWrapped) {
146
+ items.push(props.divider)
147
+ }
148
+
149
+ if (r2 < totalPages) {
150
+ items.push(totalPages)
151
+ }
152
+
153
+ // Replace divider by number on start edge case [1, '…', 3, ...]
154
+ if (items.length >= 3 && items[1] === props.divider && items[2] === 3) {
155
+ items[1] = 2
156
+ }
157
+
158
+ // Replace divider by number on end edge case [..., 48, '…', 50]
159
+ if (
160
+ items.length >= 3 &&
161
+ items[items.length - 2] === props.divider &&
162
+ items[items.length - 1] === items.length
163
+ ) {
164
+ items[items.length - 2] = items.length - 1
165
+ }
166
+
167
+ return items
168
+ })
169
+ </script>
170
+
171
+ <style scoped>
172
+ </style>
@@ -0,0 +1,190 @@
1
+ import type { Meta, StoryObj } from "@storybook/vue3";
2
+ import {
3
+ EUITable,
4
+ EUITableCheckbox,
5
+ EUIPageLimit,
6
+ EUIStudentPagination,
7
+ EUIDashboardTable,
8
+ EUIPagination,
9
+ } from "..";
10
+ import {
11
+ studentData,
12
+ studentHeader,
13
+ tableData,
14
+ tableHeaders,
15
+ } from "../../data/table";
16
+
17
+ // Meta configuration for the EUItabs stories
18
+ const meta = {
19
+ title: "Component/Table",
20
+ component: EUITable,
21
+ tags: ["autodocs"],
22
+ argTypes: {
23
+ headers: {
24
+ control: "object",
25
+ description: "Array of header objects to define table columns",
26
+ defaultValue: () => [
27
+ { text: "ID", value: "id", sortable: true, width: 50 },
28
+ { text: "Name", value: "name", sortable: true },
29
+ { text: "Age", value: "age", sortable: true },
30
+ { text: "Grade", value: "grade", sortable: true },
31
+ ],
32
+ },
33
+ items: {
34
+ control: "object",
35
+ description: "Array of table row data",
36
+ defaultValue: () => [
37
+ { id: 1, name: "John Doe", age: 20, grade: "A" },
38
+ { id: 2, name: "Jane Smith", age: 22, grade: "B" },
39
+ { id: 3, name: "Alice Johnson", age: 21, grade: "A" },
40
+ { id: 4, name: "Robert Brown", age: 23, grade: "C" },
41
+ ],
42
+ },
43
+ checkable: {
44
+ control: "boolean",
45
+ description: "Toggle to enable checkboxes for rows",
46
+ },
47
+ paginated: {
48
+ control: "boolean",
49
+ description: "Toggle pagination for the table",
50
+ },
51
+ total: {
52
+ control: "number",
53
+ description: "Total number of items for pagination",
54
+ },
55
+ perPage: {
56
+ control: "number",
57
+ description: "Number of items to show per page",
58
+ },
59
+ currentPage: {
60
+ control: "number",
61
+ description: "Current page number in paginated view",
62
+ },
63
+ search: {
64
+ control: "text",
65
+ description: "Search text for filtering rows",
66
+ },
67
+ tableExpanded: {
68
+ control: "boolean",
69
+ description: "Indicates if the table rows should be expanded by default",
70
+ },
71
+ tableHeight: {
72
+ control: "text",
73
+ description:
74
+ "CSS height of the table (e.g., 'h-[calc(100svh-20rem)] max-h-[calc(100svh-20rem)]')",
75
+ },
76
+ },
77
+ } satisfies Meta<typeof EUITable>;
78
+
79
+ export default meta;
80
+ type Story = StoryObj<typeof meta>;
81
+
82
+ export const Default: Story = {
83
+ args: {
84
+ headers: [
85
+ { text: "ID", value: "id", sortable: true, width: 50 },
86
+ { text: "Name", value: "name", sortable: true },
87
+ { text: "Age", value: "age", sortable: true },
88
+ { text: "Grade", value: "grade", sortable: true },
89
+ ],
90
+ items: [
91
+ { id: 1, name: "John Doe", age: 20, grade: "A" },
92
+ { id: 2, name: "Jane Smith", age: 22, grade: "B" },
93
+ { id: 3, name: "Alice Johnson", age: 21, grade: "A" },
94
+ { id: 4, name: "Robert Brown", age: 23, grade: "C" },
95
+ ],
96
+ paginated: true,
97
+ perPage: 2,
98
+ total: 4,
99
+ currentPage: 1,
100
+ },
101
+ render: (args) => ({
102
+ components: {
103
+ EUITable,
104
+ EUIPageLimit,
105
+ EUIStudentPagination,
106
+ },
107
+ setup() {
108
+ return { args };
109
+ },
110
+ template: `<EUITable v-bind="args"></EUITable>`,
111
+ }),
112
+ };
113
+
114
+ export const StudentTable: Story = {
115
+ args: {
116
+ headers: studentHeader,
117
+ items: studentData,
118
+ checkable: true,
119
+ paginated: true,
120
+ perPage: 10,
121
+ total: studentData.length,
122
+ currentPage: 1,
123
+ },
124
+ render: (args) => ({
125
+ components: {
126
+ EUITable,
127
+ EUITableCheckbox,
128
+ EUIPageLimit,
129
+ EUIStudentPagination,
130
+ },
131
+ setup() {
132
+ return { args };
133
+ },
134
+ template: `<EUITable v-bind="args">
135
+ <template #item.firstName="{ row, rowIndex }">
136
+ <div class="space-y-0.5">
137
+ <div class="block text-sm font-medium leading-snug">
138
+ {{row?.firstName + " " + row?.lastName }}
139
+ </div>
140
+ <div class="text-xs font-medium text-gray-900 leading-[normal]">
141
+ {{ row?.referenceId }}
142
+ </div>
143
+ </div>
144
+ </template>
145
+ <template #item.activeUser="{ row, rowIndex }">
146
+ {{ row?.activeUser?.user?.firstName }}
147
+ {{ row?.activeUser?.user?.lastName }}
148
+ </template>
149
+ </EUITable>`,
150
+ }),
151
+ };
152
+
153
+ export const DashboardTable: Story = {
154
+ args: {
155
+ headers: tableHeaders,
156
+ items: tableData,
157
+ checkable: true,
158
+ paginated: true,
159
+ perPage: 5,
160
+ total: tableData.length,
161
+ currentPage: 1,
162
+ },
163
+ render: (args) => ({
164
+ components: {
165
+ EUIDashboardTable,
166
+ EUITableCheckbox,
167
+ EUIPageLimit,
168
+ EUIPagination,
169
+ },
170
+ setup() {
171
+ return { args };
172
+ },
173
+ template: `<EUIDashboardTable v-bind="args">
174
+ <template #item.introducer_details="{ row, rowIndex }">
175
+ <div class="flex flex-row items-center gap-2">
176
+ <div
177
+ class="flex items-center justify-center text-sm font-bold text-gray-900 bg-gray-100 rounded-full size-8"
178
+ >
179
+ <img
180
+ :src="row?.introducer_details?.url"
181
+ class="size-8 rounded-3xl"
182
+ alt=""
183
+ />
184
+ </div>
185
+ <div class="text-sm">{{ row?.introducer_details?.name }}</div>
186
+ </div>
187
+ </template>
188
+ </EUIDashboardTable>`,
189
+ }),
190
+ };