edvoyui-component-library-test-flight 0.0.141 → 0.0.143

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.
@@ -1,5 +1,5 @@
1
1
  export * from "/Volumes/work/repos/edvoy-ui-v2/src/components/tabs/EUITabs.vue?vue&type=script&setup=true&lang.ts";
2
- import "/Volumes/work/repos/edvoy-ui-v2/src/components/tabs/EUITabs.vue?vue&type=style&index=0&scoped=5c1fa5b2&lang.css";
2
+ import "/Volumes/work/repos/edvoy-ui-v2/src/components/tabs/EUITabs.vue?vue&type=style&index=0&scoped=4e9b0366&lang.css";
3
3
  declare const _default: any;
4
4
  export default _default;
5
5
  //# sourceMappingURL=EUITabs.vue.d.ts.map
@@ -1,5 +1,5 @@
1
1
  export * from "/Volumes/work/repos/edvoy-ui-v2/src/components/tooltip/EUITooltip.vue?vue&type=script&setup=true&lang.ts";
2
- import "/Volumes/work/repos/edvoy-ui-v2/src/components/tooltip/EUITooltip.vue?vue&type=style&index=0&scoped=45d5b869&lang.scss";
2
+ import "/Volumes/work/repos/edvoy-ui-v2/src/components/tooltip/EUITooltip.vue?vue&type=style&index=0&scoped=1916fad7&lang.scss";
3
3
  declare const _default: any;
4
4
  export default _default;
5
5
  //# sourceMappingURL=EUITooltip.vue.d.ts.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "edvoyui-component-library-test-flight",
3
3
  "private": false,
4
- "version": "0.0.141",
4
+ "version": "0.0.143",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist/",
@@ -13,7 +13,8 @@
13
13
 
14
14
  <!-- Development code here -->
15
15
 
16
- <!-- <template>
16
+ <!--
17
+ <template>
17
18
  <div class="h-[clac(100svh-64px)] w-full px-10 py-8 max-w-screen-xl mx-auto">
18
19
  <h1 class="mb-2 font-semibold text-gray-900 tetx-lg">Edvoy UI Componnet</h1>
19
20
 
@@ -639,8 +640,18 @@
639
640
  >
640
641
  <code>&lt;EUISelect label="Firstname" placeholder="Enter your name" :items="datas" /&gt;</code>
641
642
  </pre>
642
-
643
643
  <div class="grid grid-cols-3 gap-4">
644
+ <EUISelect
645
+ v-model="checkboxData"
646
+ search-label="name"
647
+ placeholder="Placeholder"
648
+ :items="datas"
649
+ :selected-count="true"
650
+ selectedCountLabel="Checkbox"
651
+ :multiple="true"
652
+ :is-checkbox="true"
653
+ />
654
+
644
655
  <EUISelect
645
656
  search-label="name"
646
657
  label="Select Label"
@@ -1413,6 +1424,8 @@ import EUISearchExpand from "./searchexpand/EUISearchExpand.vue";
1413
1424
  import EUITabOutline from "./tabs/EUITabOutline.vue";
1414
1425
  import EUIPopover from "./popover/EUIPopover.vue";
1415
1426
 
1427
+ const checkboxData = ref([])
1428
+
1416
1429
  // TODO: Popover
1417
1430
  const isLoading = ref(false);
1418
1431
  const popoverVisible = ref(false);
@@ -1551,25 +1564,55 @@ const handleActiveItem = (activeItems: number) => {
1551
1564
  //TODO: Select Data
1552
1565
  const datas = ref([
1553
1566
  {
1567
+ value:'ShawnBurke',
1554
1568
  name: "Shawn Burke",
1555
1569
  age: 6,
1556
1570
  },
1557
1571
  {
1572
+ value: 'EmeryNolan',
1558
1573
  name: "Emery Nolan",
1559
1574
  age: 4,
1560
1575
  },
1561
1576
  {
1577
+ value: 'EmbryGrant',
1562
1578
  name: "Embry Grant",
1563
1579
  age: 3,
1564
1580
  },
1565
1581
  {
1582
+ value: 'JesseAustin',
1566
1583
  name: "Jesse Austin",
1567
1584
  age: 9,
1568
1585
  },
1569
1586
  {
1587
+ value: 'TandyChristensen',
1570
1588
  name: "Tandy Christensen",
1571
1589
  age: 7,
1572
1590
  },
1591
+ {
1592
+ value:'ShawnBurkeNew',
1593
+ name: "Shawn Burke New",
1594
+ age: 6,
1595
+ },
1596
+ {
1597
+ value: 'EmeryNolanNew',
1598
+ name: "Emery Nolan New",
1599
+ age: 4,
1600
+ },
1601
+ {
1602
+ value: 'EmbryGrantNew',
1603
+ name: "Embry Grant New",
1604
+ age: 3,
1605
+ },
1606
+ {
1607
+ value: 'JesseAustinNew',
1608
+ name: "Jesse Austin New",
1609
+ age: 9,
1610
+ },
1611
+ {
1612
+ value: 'TandyChristensenNew',
1613
+ name: "Tandy Christensen New",
1614
+ age: 7,
1615
+ },
1573
1616
  ]);
1574
1617
  //TODO: Timeline
1575
1618
 
@@ -1741,4 +1784,4 @@ const accordionData = ref([
1741
1784
  ]);
1742
1785
  </script>
1743
1786
 
1744
- <style lang="scss" scoped></style>-->
1787
+ <style lang="scss" scoped></style> -->
@@ -93,7 +93,9 @@
93
93
  @blur="hasFocus = false"
94
94
  />
95
95
  </div>
96
- <EUIErrorMessage :errors="errors" :name="name" />
96
+ <template v-if="errors && errors.length">
97
+ <EUIErrorMessage :errors="errors" :name="name" />
98
+ </template>
97
99
  </div>
98
100
  </template>
99
101
 
@@ -39,6 +39,7 @@
39
39
  ]"
40
40
  :clearable="clearable"
41
41
  :no-drop="nodropDown"
42
+ :components="customComponents"
42
43
  @search="search($event)"
43
44
  @option:selected="change($event)"
44
45
  @option:deselected="deselected($event)"
@@ -65,6 +66,14 @@
65
66
  </div>
66
67
  </template>
67
68
 
69
+ <!-- option, deselect, multiple, disabled -->
70
+ <template
71
+ v-if="selectedCount && multiple"
72
+ #selected-option-container="{}"
73
+ >
74
+ <div class="vs__selected_count">{{ selectedCountLabel }} <span>{{ selected?.length }}</span></div>
75
+ </template>
76
+
68
77
 
69
78
  <!-- Allow parent to override selected-option slot -->
70
79
  <template v-if="$slots['selected-option']" #selected-option="slotProps">
@@ -100,14 +109,23 @@
100
109
  <slot name="option" v-bind="option as Record<string, any>"></slot> <!-- Passing the 'option' data -->
101
110
  </template>
102
111
  <template v-else #option="item">
103
- <div class="flex items-center">
112
+ <div class="flex items-center gap-2">
104
113
  <img
105
114
  v-if="(item as any).iconlink"
106
- class="w-6 mr-2"
115
+ class="flex-shrink-0 size-6"
107
116
  :src="(item as any).iconlink"
108
117
  :alt="item[fieldName]"
109
118
  />
110
119
 
120
+ <span v-if="isCheckbox" class="flex-shrink-0">
121
+ <input
122
+ :id="`checkbox-${item[fieldName]}`"
123
+ type="checkbox"
124
+ :checked="isChecked(item)"
125
+ class="selectall__input"
126
+ @change="(e) => onCheckBoxChange(item, e)"
127
+ >
128
+ </span>
111
129
  {{
112
130
  isStartCaseText ? startCaseText(item[fieldName]) : item[fieldName]
113
131
  }}
@@ -131,15 +149,41 @@
131
149
  <slot name="list-header"></slot>
132
150
  </template>
133
151
 
134
- <template v-else-if="isSelectAll" #list-header>
135
- <div v-if="items.length !== selected?.length">
152
+ <template v-else-if="isSelectAll || isCheckbox" #list-header>
153
+ <div v-if="isCheckbox" class="flex flex-row items-center justify-between gap-2 px-3 py-2 border-b border-gray-200 border-solid">
154
+ <h3 class="text-sm font-semibold text-black">
155
+ All values
156
+ </h3>
157
+
158
+ <div class="flex items-center gap-1 whitespace-nowrap">
159
+ <button
160
+ class="w-full px-2 py-1 text-xs font-medium transition duration-75 text-start"
161
+ :class="[items?.length !== selected?.length ? 'text-gray-600 hover:text-gray-900': 'pointer-events-none opacity-50 cursor-default text-gray-400']"
162
+ :disabled="items?.length === selected?.length"
163
+ @click.prevent="isCheckedAll"
164
+ >
165
+ Select All
166
+ </button>
167
+ <button
168
+ class="w-full px-2 py-1 text-xs font-medium transition duration-75 text-start"
169
+ :class="[(selected?.length ?? 0) > 0 ? 'text-gray-600 hover:text-gray-900': 'pointer-events-none opacity-50 cursor-default text-gray-400']"
170
+ :disabled="(selected?.length ?? 0) === 0"
171
+ @click.prevent="clearAll"
172
+ >
173
+ Clear all
174
+ </button>
175
+ </div>
176
+ </div>
177
+
178
+ <template v-else>
136
179
  <button
180
+ v-if="items.length !== selected?.length"
137
181
  class="w-full px-6 py-2 text-sm font-medium text-gray-600 transition duration-75 hover:font-bold hover:text-gray-900 text-start"
138
182
  @click.prevent="selectAll"
139
183
  >
140
184
  Select All
141
185
  </button>
142
- </div>
186
+ </template>
143
187
  </template>
144
188
 
145
189
  <!-- Allow parent to override open-indicator slot -->
@@ -148,12 +192,15 @@
148
192
  </template>
149
193
 
150
194
  <template v-else #open-indicator="{ attributes }">
151
- <span v-bind="attributes as Record<string, any>"
152
- ><ChevronBigDown class="text-current size-6"
153
- /></span>
195
+ <span v-bind="attributes as Record<string, any>">
196
+ <ChevronDownSolid class="text-current size-6" />
197
+ </span>
154
198
  </template>
155
199
  </vSelect>
156
- <EUIErrorMessage :errors="errors" :name="name" class="mt-2" />
200
+
201
+ <template v-if="errors && errors.length">
202
+ <EUIErrorMessage :errors="errors" :name="name" class="mt-2" />
203
+ </template>
157
204
  </div>
158
205
  </template>
159
206
 
@@ -172,9 +219,25 @@ import {
172
219
  ref,
173
220
  toRefs,
174
221
  watch,
222
+ h
175
223
  } from "vue";
176
224
  import { ValidationErrors } from "../../utils/types";
177
- import ChevronBigDown from "../../assets/svg/ChevronBigDown.vue";
225
+ import { XMarkIcon } from "@heroicons/vue/20/solid";
226
+ import ChevronDownSolid from "../../assets/svg/ChevronDownStroke.vue";
227
+
228
+
229
+ const customComponents = {
230
+ Deselect: {
231
+ render () {
232
+ return h(XMarkIcon, { class: 'w-4 h-4 text-current' })
233
+ }
234
+ },
235
+ OpenIndicator: {
236
+ render () {
237
+ return h(ChevronDownSolid, { class: 'w-6 h-6 text-gray-800' })
238
+ }
239
+ }
240
+ }
178
241
 
179
242
  type VirtualElement = {
180
243
  getBoundingClientRect: () => ClientRect | DOMRect;
@@ -191,7 +254,7 @@ const startCaseText = (x: string) => {
191
254
  return startCase(x);
192
255
  };
193
256
 
194
- const selected = ref<any>([]);
257
+ const selected = ref<any[] | null>([]);
195
258
  const nodropDown = ref(false);
196
259
  const props = defineProps({
197
260
  clearable: {
@@ -263,12 +326,11 @@ const props = defineProps({
263
326
  multiple: {
264
327
  type: Boolean,
265
328
  required: false,
266
- default: false,
329
+ default: true,
267
330
  },
268
331
  multipleLimit: {
269
332
  type: Number,
270
333
  required: false,
271
- default: false,
272
334
  },
273
335
  disabled: {
274
336
  type: Boolean as PropType<boolean>,
@@ -297,7 +359,6 @@ const props = defineProps({
297
359
  },
298
360
  isSelectAll: {
299
361
  type: Boolean,
300
- required: false,
301
362
  default: false,
302
363
  },
303
364
  taggable: {
@@ -327,6 +388,18 @@ const props = defineProps({
327
388
  type: String,
328
389
  default: "name",
329
390
  },
391
+ selectedCount: {
392
+ type: Boolean,
393
+ default: false
394
+ },
395
+ selectedCountLabel: {
396
+ type: String,
397
+ default: "Selected",
398
+ },
399
+ isCheckbox: {
400
+ type: Boolean,
401
+ default: false,
402
+ },
330
403
  });
331
404
 
332
405
  const {
@@ -353,6 +426,46 @@ const emit = defineEmits([
353
426
  "open",
354
427
  ]);
355
428
 
429
+ const isCheckedAll =(e: Event) => {
430
+ if (e.target) {
431
+ selected.value = [...props.items]
432
+ }
433
+ };
434
+
435
+ const isChecked = (item: any) => {
436
+ const sel = selected.value
437
+ if (Array.isArray(sel)) {
438
+ return sel.some((s:any) => s?.value === item.value)
439
+ }
440
+ if (sel && typeof sel === 'object') {
441
+ return (sel as any).value === item.value;
442
+ }
443
+ return false
444
+ }
445
+
446
+ const clearAll = (e:Event) => {
447
+ if (e.target) {
448
+ selected.value = []
449
+ nodropDown.value = false;
450
+ }
451
+ }
452
+
453
+ const onCheckBoxChange = (item: any, event: Event) => {
454
+ const target = event.target as HTMLInputElement
455
+
456
+ if (!Array.isArray(selected.value)) {
457
+ selected.value = []
458
+ }
459
+
460
+ if (target.checked) {
461
+ if (!selected.value?.some(s => s?.value === item?.value)) {
462
+ selected.value?.push(item)
463
+ }
464
+ } else {
465
+ selected.value = selected.value?.filter(s => s?.value !== item?.value)
466
+ }
467
+ }
468
+
356
469
  const selectAll = (e: Event) => {
357
470
  if (e.target) {
358
471
  selected.value = [{ _id: "6565d869eb1b7cf8745d6beb", name: "All" }];
@@ -432,13 +545,23 @@ const fuseSearch = (
432
545
  };
433
546
 
434
547
  onMounted(() => {
435
- selected.value = props.value;
548
+ if (Array.isArray(props.value)) {
549
+ selected.value = props.value;
550
+ } else if (props.value) {
551
+ selected.value = [props.value];
552
+ } else {
553
+ selected.value = [];
554
+ }
436
555
  });
437
556
 
438
557
  onBeforeUnmount(() => {
439
558
  selected.value = null;
440
559
  });
441
560
 
561
+ onBeforeUnmount(() => {
562
+ selected.value = [];
563
+ });
564
+
442
565
  const slectedChipbg = computed(() => (props.multiple ? "#f3e8ff" : ""));
443
566
  const slectedChiptextColor = computed(() => (props.multiple ? "#7e22ce" : ""));
444
567
  const slectedChipHeight = computed(() =>
@@ -479,9 +602,7 @@ const selectedMultiple = computed(() => {
479
602
  if (selected.value?.length === 0 || _.isEmpty(selected.value)) {
480
603
  return "0px";
481
604
  }
482
-
483
605
  let heightValue;
484
-
485
606
  if (isUseCustomSelect.value || props.multiple) {
486
607
  heightValue = props.inputFilled ? "24px" : "4px";
487
608
  } else {
@@ -629,6 +750,18 @@ const open = () => {
629
750
  @apply py-3 font-medium text-base;
630
751
  }
631
752
 
753
+ .vs__actions {
754
+ .vs__clear {
755
+ @apply mr-0.5 scale-95 transform transition-all duration-300 ease-out text-gray-400;
756
+ &:hover {
757
+ @apply scale-125 text-red-600;
758
+ }
759
+ }
760
+ .vs__open-indicator {
761
+ fill: var(--vs-controls-color);
762
+ }
763
+ }
764
+
632
765
  .vs__selected-options {
633
766
  @apply group-focus:bg-transparent focus-within:bg-transparent border-transparent;
634
767
  background-color: v-bind(selectBG);
@@ -638,10 +771,10 @@ const open = () => {
638
771
  background: v-bind(slectedChipbg) !important;
639
772
  color: v-bind(slectedChiptextColor) !important;
640
773
  height: v-bind(slectedChipHeight) !important;
641
- @apply rounded-sm pl-2 text-sm font-medium bg-gray-200 border-transparent;
774
+ @apply rounded-md pl-2 text-sm font-medium bg-gray-200 border-transparent;
642
775
 
643
776
  button.vs__deselect {
644
- @apply p-1;
777
+ @apply p-1 text-gray-400;
645
778
  }
646
779
  &:hover button.vs__deselect svg {
647
780
  @apply fill-current text-red-600;
@@ -652,6 +785,9 @@ const open = () => {
652
785
  .v-select.vs--multiple {
653
786
  .vs__selected-options {
654
787
  margin-top: v-bind(selectedMultiple);
788
+ .vs__selected {
789
+ @apply mt-px;
790
+ }
655
791
  }
656
792
  }
657
793
 
@@ -695,6 +831,13 @@ const open = () => {
695
831
  @apply appearance-none;
696
832
  }
697
833
 
834
+ .v-select .vs__selected-options .vs__selected_count {
835
+ @apply text-gray-600 first:flex items-center justify-start gap-2 hidden text-sm font-medium leading-snug px-2 py-1;
836
+ span {
837
+ @apply flex items-center justify-center h-5 text-xs text-gray-800 bg-gray-200 rounded-3xl shrink-0 min-w-5;
838
+ }
839
+ }
840
+
698
841
  .isUseCustomSelect {
699
842
  .v-select.customselect {
700
843
  .vs__search:focus {
@@ -787,4 +930,45 @@ const open = () => {
787
930
  -webkit-text-fill-color: transparent;
788
931
  }
789
932
  }
933
+
934
+ .selectall__input {
935
+ @apply size-4 flex-shrink-0 border border-solid border-gray-200 bg-white appearance-none inline-block select-none cursor-pointer align-middle rounded relative before:content-[''] before:transform before:translate-x-1/2 before:-translate-y-1/2 before:z-[-1] before:absolute before:top-1/2 before:right-1/2 before:block before:size-9 before:rounded-full before:bg-violet-100 before:opacity-0 before:transition-opacity hover:before:opacity-75;
936
+ &::after {
937
+ @apply absolute hidden border-solid inset-0 -ml-px -mt-px size-4 scale-90;
938
+ content: "";
939
+ background-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%2012.7132L10.0168%2017.7247L10.4177%2017.0238C12.5668%2013.2658%2015.541%2010.0448%2019.1161%207.60354L20%207%22%20stroke%3D%22%23ffffff%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E);
940
+ background-size: contain;
941
+ transition: all 0.2s ease;
942
+ }
943
+ &:hover {
944
+ @apply bg-violet-100 border-violet-500;
945
+ }
946
+ &:checked {
947
+ transition: all 0.3s ease;
948
+ transform: translate3d(0, 1, 0);
949
+ @apply bg-violet-700 border-violet-700;
950
+ &::after {
951
+ @apply block border-white;
952
+ }
953
+ &:focus {
954
+ @apply bg-violet-700;
955
+ }
956
+ }
957
+ &:focus {
958
+ @apply outline-none border border-violet-700 bg-violet-200;
959
+ }
960
+ &:disabled {
961
+ @apply bg-gray-300 border-gray-100 cursor-not-allowed;
962
+ & ~ span {
963
+ @apply cursor-not-allowed;
964
+ }
965
+ &:checked {
966
+ @apply bg-white border-white;
967
+ &::after {
968
+ @apply block border-gray-100;
969
+ }
970
+ }
971
+ }
972
+ }
973
+
790
974
  </style>
@@ -71,7 +71,8 @@
71
71
  >
72
72
  <div class="relative z-0 w-full">
73
73
  <div
74
- class="w-full text-sm font-bold text-current truncate font-inter"
74
+ class="w-full text-sm font-bold text-current font-inter"
75
+ :class="{'truncate':!header?.showHeaderInfoText}"
75
76
  >
76
77
  <slot name="header" :header="header">
77
78
  {{ capitalizeText(header?.text ?? header?.name ?? "") }}
@@ -80,6 +81,14 @@
80
81
  v-if="headerOptional"
81
82
  name="headerOptionalItem"
82
83
  ></slot>
84
+ <EUITooltip v-if="header?.showInfoText" placement="top" class="inline-block ms-0.5">
85
+ <template v-slot:default>
86
+ <InformationCircleIcon class="inline-block text-gray-500 size-4" />
87
+ </template>
88
+ <template v-slot:tooltip>
89
+ <div class="z-50 max-w-xs break-words whitespace-normal min-w-max">{{ header?.showHeaderInfoText }}</div>
90
+ </template>
91
+ </EUITooltip>
83
92
  </div>
84
93
  <div
85
94
  v-if="header?.sortable"
@@ -182,7 +191,7 @@
182
191
  <InformationCircleIcon class="inline-block text-gray-500 size-4" />
183
192
  </template>
184
193
  <template v-slot:tooltip>
185
- <div class="z-50 max-w-xs break-words whitespace-normal min-w-max">{{ header.showInfoText }}</div>
194
+ <div class="z-50 max-w-xs break-words whitespace-normal min-w-max">{{ header?.showInfoText }}</div>
186
195
  </template>
187
196
  </EUITooltip>
188
197
  </span>
@@ -297,6 +306,7 @@ interface Header {
297
306
  width?: number;
298
307
  color?: string;
299
308
  showInfoText?: string;
309
+ showHeaderInfoText?: string;
300
310
  }
301
311
 
302
312
  interface Item {
@@ -1,10 +1,8 @@
1
1
  <template>
2
2
  <div>
3
-
4
- <div class=" overflow-hidden overflow-x-scroll">
5
3
  <div
6
4
  v-if="tabStyle === 'design'"
7
- class="inline-flex flex-row items-center justify-start px-[0.25rem] min-h-[34px] mb-0.5 bg-gray-100 rounded-[0.625rem] ring-1 ring-gray-200/75 gap-2"
5
+ class="inline-flex flex-row items-center justify-start px-[0.25rem] min-h-[34px] mb-0.5 bg-gray-100 rounded-[0.625rem] ring-1 ring-gray-200/75 gap-2 overflow-x-auto scrollbar--hide whitespace-nowrap max-w-full w-full"
8
6
  >
9
7
  <template v-for="(tab, tabindex) in tabs" :key="tabindex">
10
8
  <button
@@ -163,9 +161,6 @@
163
161
  </slot>
164
162
  </button>
165
163
  </div>
166
- </div>
167
-
168
-
169
164
  <slot name="content" :active-tab="tabs[activeTabIndex]">
170
165
  <div
171
166
  :class="[
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div ref="tooltipContainer" class="relative cursor-default size-max">
2
+ <div ref="tooltipContainer" class="relative cursor-default">
3
3
  <div @mouseover="showTooltip" @mouseleave="hideTooltip">
4
4
  <slot>
5
5
  <InformationCircleIcon class="text-current size-5" />
package/src/data/table.ts CHANGED
@@ -573,8 +573,8 @@ export const studentHeader = [
573
573
  name: "Country of Residence",
574
574
  width: 250,
575
575
  sortable: true,
576
- showInfoText: "This is helper text for First Name",
577
-
576
+ showInfoText: "This is helper text for First Name",
577
+ showHeaderInfoText: "This is helper text for Header",
578
578
  },
579
579
  {
580
580
  value: "nationality.name",