edvoyui-component-library-test-flight 0.0.252 → 0.0.254

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.
@@ -10,11 +10,11 @@ declare const _default: import('../../../node_modules/vue').DefineComponent<impo
10
10
  };
11
11
  maxDate: {
12
12
  type: any;
13
- default: string;
13
+ default: undefined;
14
14
  };
15
15
  minDate: {
16
16
  type: any;
17
- default: string;
17
+ default: undefined;
18
18
  };
19
19
  name: {
20
20
  type: StringConstructor;
@@ -86,11 +86,11 @@ declare const _default: import('../../../node_modules/vue').DefineComponent<impo
86
86
  };
87
87
  maxDate: {
88
88
  type: any;
89
- default: string;
89
+ default: undefined;
90
90
  };
91
91
  minDate: {
92
92
  type: any;
93
- default: string;
93
+ default: undefined;
94
94
  };
95
95
  name: {
96
96
  type: StringConstructor;
@@ -113,11 +113,11 @@ const props = defineProps({
113
113
  },
114
114
  maxDate: {
115
115
  type: Date as any,
116
- default: '',
116
+ default: undefined,
117
117
  },
118
118
  minDate: {
119
119
  type: Date as any,
120
- default: '',
120
+ default: undefined,
121
121
  },
122
122
  name: {
123
123
  type: String,
@@ -36,6 +36,8 @@ interface Props {
36
36
  /** Maximum selected tags shown before the More/Less control; 0 shows all. */
37
37
  maxVisibleTags?: number;
38
38
  tagSize?: "sm" | "md" | "lg";
39
+ /** Hide options until the user has entered this many non-whitespace characters. */
40
+ minimumSearchLength?: number;
39
41
  dropdownWidth?: string;
40
42
  /** Render the menu at body level to escape clipping scroll containers. */
41
43
  teleported?: boolean;
@@ -254,6 +256,7 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
254
256
  selectAllLabel: string;
255
257
  maxVisibleTags: number;
256
258
  tagSize: "sm" | "md" | "lg";
259
+ minimumSearchLength: number;
257
260
  dropdownWidth: string;
258
261
  }, {}, {}, {}, string, import('../../../node_modules/vue').ComponentProvideOptions, false, {
259
262
  componentRef: HTMLDivElement;
@@ -159,6 +159,9 @@
159
159
  <template v-if="internalSearch?.trim()">
160
160
  No results found for "<strong>{{ internalSearch }}</strong>"
161
161
  </template>
162
+ <template v-else-if="minimumSearchLength > 0">
163
+ Type at least {{ minimumSearchLength }} character<span v-if="minimumSearchLength !== 1">s</span> to search
164
+ </template>
162
165
  <template v-else-if="backendPagination">
163
166
  Type in the search box to see results
164
167
  </template>
@@ -403,6 +406,8 @@ interface Props {
403
406
  /** Maximum selected tags shown before the More/Less control; 0 shows all. */
404
407
  maxVisibleTags?: number;
405
408
  tagSize?: "sm" | "md" | "lg";
409
+ /** Hide options until the user has entered this many non-whitespace characters. */
410
+ minimumSearchLength?: number;
406
411
  dropdownWidth?: string,
407
412
  /** Render the menu at body level to escape clipping scroll containers. */
408
413
  teleported?: boolean;
@@ -437,6 +442,7 @@ const props = withDefaults(defineProps<Props>(), {
437
442
  selectAllLabel: "All",
438
443
  maxVisibleTags: 0,
439
444
  tagSize: "md",
445
+ minimumSearchLength: 0,
440
446
  dropdownWidth: '',
441
447
  teleported: false,
442
448
  });
@@ -594,6 +600,8 @@ const filteredItems = computed(() => {
594
600
  const searchValue = String(internalSearch.value ?? "");
595
601
  const search = searchValue.trim().toLowerCase();
596
602
 
603
+ if (search.length < props.minimumSearchLength) return [];
604
+
597
605
  if (searchValue !== "") {
598
606
  if (search === "") return [];
599
607
  if (props.backendPagination) return props.items;
@@ -60,7 +60,7 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
60
60
  checkedRows: {
61
61
  type: ArrayConstructor;
62
62
  default: () => never[];
63
- required: true;
63
+ required: false;
64
64
  };
65
65
  headers: {
66
66
  type: PropType<Header[]>;
@@ -152,7 +152,7 @@ declare const __VLS_component: import('../../../node_modules/vue').DefineCompone
152
152
  checkedRows: {
153
153
  type: ArrayConstructor;
154
154
  default: () => never[];
155
- required: true;
155
+ required: false;
156
156
  };
157
157
  headers: {
158
158
  type: PropType<Header[]>;
@@ -21,7 +21,7 @@
21
21
  </div>
22
22
  </Transition>
23
23
 
24
- <div class="relative w-full mx-auto overflow-hidden">
24
+ <div class="overflow-hidden relative mx-auto w-full">
25
25
  <div
26
26
  id="student-table"
27
27
  :class="[
@@ -67,7 +67,7 @@
67
67
  @click="sortBy(header, $event)"
68
68
  >
69
69
  <div
70
- class="flex items-center justify-between gap-2 text-sm font-medium text-current font-inter"
70
+ class="flex gap-2 justify-between items-center text-sm font-medium text-current font-inter"
71
71
  >
72
72
  <slot name="header" :header="header" :index="headerIndex">
73
73
  {{ capitalizeText(header?.text ?? header?.name ?? "") }}
@@ -122,11 +122,10 @@
122
122
  >
123
123
  <tr
124
124
  :id="`row-${rowIndex}`"
125
- :class="
126
- activeRowIndex == rowIndex
127
- ? '!bg-violet-50 !ring-1 !ring-violet-100 !ring-inset'
128
- : ''
129
- "
125
+ :class="{
126
+ 'is-active-row':
127
+ activeRowIndex != null && activeRowIndex === rowIndex,
128
+ }"
130
129
  @mouseenter="
131
130
  $attrs.mouseenter
132
131
  ? $emit('mouseenter', row, rowIndex)
@@ -139,14 +138,7 @@
139
138
  "
140
139
  >
141
140
  <template v-if="checkable">
142
- <td
143
- class="checkable"
144
- :class="
145
- activeRowIndex == rowIndex
146
- ? '!bg-violet-50 !ring-1 !ring-violet-100 !ring-inset'
147
- : ''
148
- "
149
- >
141
+ <td class="checkable">
150
142
  <EUITableCheckbox
151
143
  :disabled="!isRowCheckable(row)"
152
144
  :checked="isRowChecked(row)"
@@ -161,9 +153,6 @@
161
153
  :key="headerIndex"
162
154
  :class="[
163
155
  isScrolled && headerIndex === 0 ? stickyClass.body : '',
164
- activeRowIndex == rowIndex
165
- ? '!bg-violet-50 !ring-1 !ring-violet-100 !ring-inset'
166
- : '',
167
156
  ]"
168
157
  >
169
158
  <slot
@@ -204,7 +193,7 @@
204
193
  class="sticky bottom-0 left-0 z-50 flex items-center justify-between px-2 py-1 bg-white shadow-[0_-6px_24px_-6px_#0c0c0d1c]"
205
194
  >
206
195
  <slot name="tableCount">
207
- <div class="inline-flex items-center gap-x-2">
196
+ <div class="inline-flex gap-x-2 items-center">
208
197
  <div class="text-sm font-medium text-gray-900">
209
198
  Total {{ total }}
210
199
  </div>
@@ -271,7 +260,7 @@ const props = defineProps({
271
260
  paginated: { type: Boolean, default: false },
272
261
  tableExpanded: { type: Boolean, default: false },
273
262
  backendPagination: { type: Boolean, default: false },
274
- checkedRows: { type: Array, default: () => [], required: true },
263
+ checkedRows: { type: Array, default: () => [], required: false },
275
264
  headers: {
276
265
  type: Array as PropType<Header[]>,
277
266
  default: () => ({}),
@@ -548,26 +537,39 @@ watch(() => tableContainer.value?.clientWidth, checkOverflow);
548
537
  }
549
538
 
550
539
  tbody {
551
- @apply snap-y snap-mandatory snap-always;
540
+ @apply snap-y snap-mandatory snap-always;
552
541
  tr:not(.norecords) {
553
- @apply text-gray-600 transition-colors duration-100 bg-white snap-start ease-in-out snap-x snap-mandatory rounded-sm h-12;
542
+ @apply text-gray-600 bg-white snap-mandatory snap-start rounded-sm h-12;
543
+
554
544
  td {
555
- @apply px-3 py-1 text-sm font-normal transition-colors duration-100 ease-in-out snap-start snap-always border-solid border-gray-100 border-b;
545
+ // Keep border widths stable in every state. Changing border width on
546
+ // hover causes table row geometry to shift and produces a jump.
547
+ @apply box-border px-3 py-1 text-sm font-normal snap-start snap-always border-solid border-b border-t border-gray-100 border-t-transparent;
548
+
549
+ &:first-child {
550
+ @apply border-l border-l-transparent;
551
+ }
552
+
553
+ &:last-child {
554
+ @apply border-r border-r-transparent;
555
+ }
556
+
556
557
  &:first-of-type.checkable {
557
558
  @apply w-12 text-center sticky left-0 top-0 z-[11] bg-white;
558
559
  }
559
560
  }
560
561
 
561
- &:hover td {
562
- @apply font-medium text-gray-900 bg-violet-50 border-violet-200 first-of-type:rounded-s-sm last-of-type:rounded-e-sm border-b border-t first:border-l last:border-r;
562
+ // Do not transition background/border colors between rows. When the
563
+ // pointer moves quickly, the previous row would otherwise fade out while
564
+ // the next row fades in, making two rows look highlighted at once.
565
+ &:hover td,
566
+ &.is-active-row td {
567
+ @apply text-gray-900 bg-violet-50 border-violet-200 first-of-type:rounded-s-sm last-of-type:rounded-e-sm;
568
+
563
569
  &:first-of-type.checkable {
564
570
  @apply bg-violet-50;
565
571
  }
566
572
  }
567
-
568
- &:has(+ tr:hover) td {
569
- @apply border-b-0;
570
- }
571
573
  }
572
574
  }
573
575
  }
@@ -20,7 +20,7 @@
20
20
  </slot>
21
21
  </div>
22
22
  </Transition>
23
- <div class="relative max-w-full mx-auto overflow-hidden">
23
+ <div class="overflow-hidden relative mx-auto max-w-full">
24
24
  <div
25
25
  :class="[
26
26
  'ui-table scrollbar--auto',
@@ -67,7 +67,7 @@
67
67
  { '!bg-gray-200': currentSort === header.value },
68
68
  ]"
69
69
  :style="
70
- headers.length > 6
70
+ headers.length > 5
71
71
  ? headerStyle(header)
72
72
  : 'width: 100%;min-width: 250px;background-color: rgb(243 244 246);'
73
73
  "
@@ -97,7 +97,7 @@
97
97
  </template>
98
98
  <template v-slot:tooltip>
99
99
  <div
100
- class="z-50 max-w-xs break-words whitespace-normal min-w-max"
100
+ class="z-50 min-w-max max-w-xs whitespace-normal break-words"
101
101
  >
102
102
  {{ header?.showHeaderInfoText }}
103
103
  </div>
@@ -106,7 +106,7 @@
106
106
  </div>
107
107
  <div
108
108
  v-if="header?.sortable"
109
- class="absolute -top-0.5 -right-6 size-6 z-10"
109
+ class="absolute -top-0.5 -right-6 z-10 size-6"
110
110
  >
111
111
  <svg
112
112
  width="24"
@@ -215,7 +215,7 @@
215
215
  </template>
216
216
  <template v-slot:tooltip>
217
217
  <div
218
- class="z-50 max-w-xs break-words whitespace-normal min-w-max"
218
+ class="z-50 min-w-max max-w-xs whitespace-normal break-words"
219
219
  >
220
220
  {{ header?.showInfoText }}
221
221
  </div>
@@ -252,12 +252,12 @@
252
252
  >
253
253
  <div class="text-center">
254
254
  <div
255
- class="mx-auto overflow-hidden rounded-md size-56"
255
+ class="overflow-hidden mx-auto rounded-md size-56"
256
256
  >
257
257
  <img
258
258
  src="@/assets/images/search-nodata.png"
259
259
  alt=""
260
- class="block object-contain object-center h-auto max-w-full opacity-90"
260
+ class="block object-contain object-center max-w-full h-auto opacity-90"
261
261
  />
262
262
  </div>
263
263
  <div class="my-2 text-xl font-medium text-gray-500">
@@ -274,7 +274,7 @@
274
274
  </div>
275
275
  <div
276
276
  v-if="stickyFooter"
277
- class="sticky bottom-0 left-0 z-50 flex items-center justify-between px-2 py-1 bg-white border-t border-gray-300"
277
+ class="flex sticky bottom-0 left-0 z-50 justify-between items-center px-2 py-1 bg-white border-t border-gray-300"
278
278
  >
279
279
  <slot
280
280
  name="tableCount"
@@ -282,12 +282,12 @@
282
282
  :from="rangeFrom"
283
283
  :to="rangeTo"
284
284
  >
285
- <div class="inline-flex items-center self-stretch gap-x-3">
285
+ <div class="inline-flex gap-x-3 items-center self-stretch">
286
286
  <div class="text-sm font-normal text-gray-600">
287
287
  {{ rangeFrom }} - {{ rangeTo }} of {{ total }}
288
288
  </div>
289
- <div class="self-stretch w-px h-4 my-auto bg-gray-300"></div>
290
- <div class="inline-flex items-center gap-0">
289
+ <div class="self-stretch my-auto w-px h-4 bg-gray-300"></div>
290
+ <div class="inline-flex gap-0 items-center">
291
291
  <span class="text-sm font-normal text-gray-600"
292
292
  > Items per page:</span>
293
293
  <EUIPageLimit