@likable-hair/svelte 4.0.10 → 4.0.12

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.
@@ -4,7 +4,8 @@
4
4
  <script lang="ts" generics="Data">import Autocomplete from "../../../components/simple/forms/Autocomplete.svelte";
5
5
  import debounceStore from "../../../stores/debounce";
6
6
  import { writable } from 'svelte/store';
7
- let { items = [], values = [], multiple = false, searcher, placeholder, searchThreshold = 2, debounceTimeout = 500, searching = false, search = false, searchText, maxVisibleChips, menuOpened = false, mobileDrawer = false, closeOnSelect = false, disabled = false, chipLabelSnippet, itemLabelSnippet, onchange, } = $props();
7
+ import Menu from "../../simple/common/Menu.svelte";
8
+ let { items = [], values = [], multiple = false, searcher, placeholder, searchThreshold = 2, debounceTimeout = 500, searching = false, search = false, searchText, maxVisibleChips, menuOpened = false, mobileDrawer = false, closeOnSelect = false, disabled = false, menuAnchor, menuWidth, chipLabelSnippet, itemLabelSnippet, onchange, } = $props();
8
9
  const searchTextValue = writable(searchText);
9
10
  let searchTextDebounce = $derived(debounceStore(searchTextValue, debounceTimeout));
10
11
  $effect(() => {
@@ -44,6 +45,8 @@ $effect(() => {
44
45
  {placeholder}
45
46
  {closeOnSelect}
46
47
  {disabled}
48
+ {menuWidth}
49
+ {menuAnchor}
47
50
  searchFunction={() => true}
48
51
  {onchange}
49
52
  {chipLabelSnippet}
@@ -1,5 +1,7 @@
1
1
  import type { Item } from "../../../components/simple/forms/Autocomplete.svelte";
2
2
  export type { Item };
3
+ import type { ComponentProps } from "svelte";
4
+ import Menu from "../../simple/common/Menu.svelte";
3
5
  declare class __sveltets_Render<Data> {
4
6
  props(): {
5
7
  items: Item<Data>[];
@@ -19,6 +21,8 @@ declare class __sveltets_Render<Data> {
19
21
  mobileDrawer?: boolean;
20
22
  closeOnSelect?: boolean;
21
23
  disabled?: boolean;
24
+ menuWidth?: string;
25
+ menuAnchor?: ComponentProps<typeof Menu>["anchor"];
22
26
  chipLabelSnippet?: import("svelte").Snippet<[{
23
27
  selection: Item<Data>;
24
28
  }]> | undefined;
@@ -29,19 +29,12 @@ onMount(() => {
29
29
  hideScrollbar = tableContainer.scrollHeight > tableContainer.clientHeight;
30
30
  }
31
31
  for (const head of [...headers, { value: 'non-resizable', minWidth: DEFAULT_MIN_WIDTH_PX + 'px', maxWidth: DEFAULT_MAX_WIDTH_PX + 'px' }, { value: 'customize-headers', minWidth: DEFAULT_MIN_WIDTH_PX + 'px', maxWidth: DEFAULT_MAX_WIDTH_PX + 'px' }]) {
32
- let th;
33
- if (head.value == 'non-resizable' || head.value == 'customize-headers') {
34
- th = document.getElementsByClassName(head.value).item(0);
35
- }
36
- else {
37
- th = document.getElementById(head.value);
38
- }
32
+ let th = headersHTML[head.value];
39
33
  if (!!th) {
40
34
  resizeHeader(th, head);
41
35
  }
42
36
  }
43
- let table = document.getElementsByClassName('dynamic-table')[0];
44
- table.classList.add('dynamic-resizable');
37
+ tableHTML?.classList.add('dynamic-resizable');
45
38
  resizeObserver = new ResizeObserver(() => {
46
39
  updateRemainingWidth();
47
40
  updateHeaderHeight();
@@ -101,8 +94,8 @@ const [send, receive] = crossfade({
101
94
  };
102
95
  },
103
96
  });
104
- let { headers = [], headersToShowInTable = headers, subHeaders = [], customizeHeaders = false, rows = [], sortedBy = $bindable(), sortDirection = $bindable("asc"), cellEdit = false, lang = "en", dateLocale, noItemsText = lang == 'en' ? "No items to show" : 'Nessun elemento da visualizzare', showSelect = false, showActions = true, selectMode = "single", selectedItems = $bindable([]), unselectedItems = $bindable([]), selectedAll = $bindable(false), showExpand = false, loading = false, disabled = false, filters = $bindable([]), searchBarColumns, searchBarVisible = false, searchBarPlaceholder = lang == 'en' ? "Type to search..." : "Scrivi per cercare...", filtersVisible = false, quickFiltersVisible = false, editFilterMode = "one-edit", showActiveFilters = true, quickFilters = [], actionsForSelectedItems = [], quickActionsDisabled = false, totalRows = rows.length, searchText = $bindable(), renderedRowsNumber = 100, sectionRowsNumber = 20, sectionThreshold = 2, backwardThresholdPixel = 100, forwardThresholdPixel = 100, uniqueKey = 'id', numberOfResultsVisible = false, endLineVisible = false, resizableColumns = false, resizedColumnSizeWithPadding = {}, dynamicFilters = true, class: clazz = {}, onapplyCustomQuickFilter, oncellClick, onfetchData, onfiltersChange, onsort, onremoveAllFilters, onremoveCustomQuickFilter, onremoveFilter, onrowClick, onsaveCellEdit, onsaveHeadersToShow, oncolumnResize, searchBarSnippet, customFilterChipSnippet, customFilterSnippet, filterAppendSnippet, onscroll, selectionSnippet: selectionInternalSnippet, itemLabelSnippet: itemLabelInternalSnippet, chipLabelSnippet, headerSnippet, headerLabelSnippet, rowAppendSnippet, customRowSnippet, subRowAppendSnippet, subHeaderLabelSnippet, subHeaderSnippet, subRowActionsSnippet, customSubRowSnippet, customQuickFilterSnippet, appendSnippet, } = $props();
105
- let openCellEditor = $state(false), cellEditorActivator = $state(), cellEditorContainer = $state(), menuElementCellEditor = $state(), menuElementQuickFilters = $state(), cellEditorInfoActive = $state(), saveEditDisabled = $state(false), searchBarInput = $state(undefined), openQuickFilter = $state(false), quickFilterActivator = $state(), quickFilterActive = $state(), globalBuilder = new FilterBuilder(), calendarOpened = $state(false), calendarOpened2 = $state(false), selectedIndexes = [], cellEditorIndexRow = $state(), cellEditorIndexHeader = $state(), cellEditorSubItem = $state(), currentSectionNumber = $state(0), tableBody = $state(), tableContainer = $state(), userScrolling = $state(true), reachedBottom = $state(false), reachedTop = false, resizing = false, remainingWidth = $state(0), hideScrollbar = $state(false), sortModify, mainHeader = $state(), resizeObserver;
97
+ let { headers = [], headersToShowInTable = headers, subHeaders = [], customizeHeaders = false, rows = [], sortedBy = $bindable(), sortDirection = $bindable("asc"), cellEdit = false, lang = "en", dateLocale, noItemsText = lang == 'en' ? "No items to show" : 'Nessun elemento da visualizzare', showSelect = false, showActions = true, selectMode = "single", selectedItems = $bindable([]), unselectedItems = $bindable([]), selectedAll = $bindable(false), showExpand = false, loading = false, disabled = false, filters = $bindable([]), searchBarColumns, searchBarVisible = false, searchBarPlaceholder = lang == 'en' ? "Type to search..." : "Scrivi per cercare...", filtersVisible = false, quickFiltersVisible = false, editFilterMode = "one-edit", showActiveFilters = true, quickFilters = [], actionsForSelectedItems = [], quickActionsDisabled = false, totalRows = rows.length, searchText = $bindable(), renderedRowsNumber = 100, sectionRowsNumber = 20, sectionThreshold = 2, backwardThresholdPixel = 100, forwardThresholdPixel = 100, uniqueKey = 'id', numberOfResultsVisible = false, endLineVisible = false, resizableColumns = false, resizedColumnSizeWithPadding = {}, dynamicFilters = true, useSelectedItemsOnly = false, class: clazz = {}, onapplyCustomQuickFilter, oncellClick, onfetchData, onfiltersChange, onsort, onremoveAllFilters, onremoveCustomQuickFilter, onremoveFilter, onrowClick, onsaveCellEdit, onsaveHeadersToShow, oncolumnResize, searchBarSnippet, customFilterChipSnippet, customFilterSnippet, filterAppendSnippet, onscroll, selectionSnippet: selectionInternalSnippet, itemLabelSnippet: itemLabelInternalSnippet, chipLabelSnippet, headerSnippet, headerLabelSnippet, rowAppendSnippet, customRowSnippet, subRowAppendSnippet, subHeaderLabelSnippet, subHeaderSnippet, subRowActionsSnippet, customSubRowSnippet, customQuickFilterSnippet, appendSnippet, } = $props();
98
+ let openCellEditor = $state(false), cellEditorActivator = $state(), cellEditorContainer = $state(), menuElementCellEditor = $state(), menuElementQuickFilters = $state(), cellEditorInfoActive = $state(), saveEditDisabled = $state(false), searchBarInput = $state(undefined), openQuickFilter = $state(false), quickFilterActivator = $state(), quickFilterActive = $state(), globalBuilder = new FilterBuilder(), calendarOpened = $state(false), calendarOpened2 = $state(false), selectedIndexes = [], cellEditorIndexRow = $state(), cellEditorIndexHeader = $state(), cellEditorSubItem = $state(), currentSectionNumber = $state(0), tableBody = $state(), tableContainer = $state(), tableHTML = $state(), headersHTML = {}, userScrolling = $state(true), reachedBottom = $state(false), reachedTop = false, resizing = false, remainingWidth = $state(0), hideScrollbar = $state(false), sortModify, mainHeader = $state(), resizeObserver, ignoreSelectAll = rows.length == totalRows && useSelectedItemsOnly;
106
99
  const DEFAULT_MIN_WIDTH_PX = 100, DEFAULT_MAX_WIDTH_PX = 400;
107
100
  let totalSections = $derived((totalRows - renderedRowsNumber) / sectionRowsNumber);
108
101
  let hasMoreToRender = $derived(totalSections > currentSectionNumber);
@@ -240,7 +233,7 @@ function handleCancelClick() {
240
233
  }
241
234
  function handleSelect(item, shiftKeyPressed) {
242
235
  let index = -1;
243
- if (selectedAll) {
236
+ if (selectedAll && !ignoreSelectAll) {
244
237
  index = unselectedItems.findIndex((i) => i[uniqueKey] == item[uniqueKey]);
245
238
  }
246
239
  else {
@@ -262,7 +255,7 @@ function handleSelect(item, shiftKeyPressed) {
262
255
  selectedIndex = x;
263
256
  }
264
257
  for (let i = lastSelectedIndex + 1; i <= selectedIndex; i++) {
265
- if (selectedAll) {
258
+ if (selectedAll && !ignoreSelectAll) {
266
259
  if (!unselectedItems.find((unselectedItem) => unselectedItem[uniqueKey] == rows[i].item[uniqueKey])) {
267
260
  unselectedItems = [...unselectedItems, rows[i].item];
268
261
  }
@@ -276,7 +269,7 @@ function handleSelect(item, shiftKeyPressed) {
276
269
  }
277
270
  }
278
271
  else {
279
- if (selectedAll) {
272
+ if (selectedAll && !ignoreSelectAll) {
280
273
  unselectedItems = [...unselectedItems, item];
281
274
  }
282
275
  else {
@@ -287,7 +280,7 @@ function handleSelect(item, shiftKeyPressed) {
287
280
  }
288
281
  }
289
282
  else {
290
- if (selectedAll) {
283
+ if (selectedAll && !ignoreSelectAll) {
291
284
  unselectedItems = unselectedItems.filter((i) => i[uniqueKey] != item[uniqueKey]);
292
285
  }
293
286
  else {
@@ -298,7 +291,12 @@ function handleSelect(item, shiftKeyPressed) {
298
291
  }
299
292
  function handleSelectAll() {
300
293
  if (selectMode == "multiple") {
301
- selectedItems = [];
294
+ if (!selectedAll && ignoreSelectAll) {
295
+ selectedItems = rows.map(r => r.item);
296
+ }
297
+ else {
298
+ selectedItems = [];
299
+ }
302
300
  selectedIndexes = [];
303
301
  unselectedItems = [];
304
302
  selectedAll = !selectedAll;
@@ -855,14 +853,14 @@ async function updateRemainingWidth() {
855
853
  const containerWidth = tableContainer.getBoundingClientRect().width - 30;
856
854
  if (containerWidth) {
857
855
  const totalResizableWidth = headersToShowInTable.reduce((sum, head) => {
858
- let th = document.getElementById(head.value);
856
+ let th = headersHTML[head.value];
859
857
  if (!!th) {
860
858
  resizeHeader(th, head);
861
859
  }
862
860
  const width = th?.getBoundingClientRect().width || 0;
863
861
  return sum + width + 1;
864
862
  }, 0);
865
- const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.slot-append, th.customize-headers'))
863
+ const extraStaticWidth = Array.from(mainHeader.querySelectorAll('th.non-resizable, th.customize-headers'))
866
864
  .reduce((sum, th) => sum + th.getBoundingClientRect().width + 1, 0);
867
865
  remainingWidth = Math.max(0, containerWidth - totalResizableWidth - extraStaticWidth);
868
866
  }
@@ -1052,7 +1050,7 @@ function resizeHeader(th, header) {
1052
1050
  hasMore={currentSectionNumber > 0 && userScrolling}
1053
1051
  direction='backward'
1054
1052
  />
1055
- <table style="display: table;" class="dynamic-table">
1053
+ <table style="display: table;" class="dynamic-table" bind:this={tableHTML}>
1056
1054
  <thead class="table-header" bind:this={mainHeader}>
1057
1055
  <tr>
1058
1056
  {#if !!showSelect && !showExpand && rows.length > 0}
@@ -1061,6 +1059,7 @@ function resizeHeader(th, header) {
1061
1059
  style:min-width="30px"
1062
1060
  style:text-align="center"
1063
1061
  class="non-resizable"
1062
+ bind:this={headersHTML['non-resizable']}
1064
1063
  >
1065
1064
  {#if selectMode === "multiple"}
1066
1065
  <Checkbox
@@ -1078,6 +1077,7 @@ function resizeHeader(th, header) {
1078
1077
  style:max-width="60px"
1079
1078
  style:text-align="center"
1080
1079
  class="non-resizable"
1080
+ bind:this={headersHTML['non-resizable']}
1081
1081
  ></th>
1082
1082
  {/if}
1083
1083
  {#each headersToShowInTable as header, index}
@@ -1087,7 +1087,7 @@ function resizeHeader(th, header) {
1087
1087
  style:max-width={header.maxWidth}
1088
1088
  class:sortable={header.sortable}
1089
1089
  onclick={() => handleHeaderClick(header)}
1090
- id={header.value}
1090
+ bind:this={headersHTML[header.value]}
1091
1091
  >
1092
1092
  {#if resizableColumns}
1093
1093
  <div class="resizer" use:resize></div>
@@ -1139,7 +1139,7 @@ function resizeHeader(th, header) {
1139
1139
  {/if}
1140
1140
  </th>
1141
1141
  {/each}
1142
- {#if remainingWidth && (customizeHeaders || rowAppendSnippet || resizableColumns)}
1142
+ {#if remainingWidth}
1143
1143
  <th
1144
1144
  style:width={remainingWidth + 'px'}
1145
1145
  class="filler"
@@ -1150,6 +1150,7 @@ function resizeHeader(th, header) {
1150
1150
  <th
1151
1151
  style:text-align="center"
1152
1152
  class="customize-headers"
1153
+ bind:this={headersHTML['customize-headers']}
1153
1154
  >
1154
1155
  {#if customizeHeaders}
1155
1156
  <div style="display: flex; justify-content: center;">
@@ -1207,7 +1208,7 @@ function resizeHeader(th, header) {
1207
1208
  : 'var(--dynamic-table-row-disabled-background-color, var(--dynamic-table-default-row-disabled-background-color))'
1208
1209
  : expandedRows.findIndex(r => r.item[uniqueKey] == row.item[uniqueKey]) != -1
1209
1210
  ? 'var(--dynamic-table-expanded-row-background-color, var(--dynamic-table-default-expanded-row-background-color))'
1210
- : selectedAll
1211
+ : selectedAll && !ignoreSelectAll
1211
1212
  ? !unselectedItems.find(i => i[uniqueKey] == row.item[uniqueKey])
1212
1213
  ? 'var(--dynamic-table-selected-row-background-color, var(--dynamic-table-default-selected-row-background-color))'
1213
1214
  : ''
@@ -1223,7 +1224,7 @@ function resizeHeader(th, header) {
1223
1224
  <Checkbox
1224
1225
  id={row.item[uniqueKey]}
1225
1226
  value={
1226
- selectedAll ?
1227
+ selectedAll && !ignoreSelectAll ?
1227
1228
  unselectedItems.findIndex(
1228
1229
  (i) => i[uniqueKey] == row.item[uniqueKey]
1229
1230
  ) == -1 :
@@ -1292,7 +1293,7 @@ function resizeHeader(th, header) {
1292
1293
  {/if}
1293
1294
  </td>
1294
1295
  {/each}
1295
- {#if remainingWidth && (customizeHeaders || rowAppendSnippet || resizableColumns)}
1296
+ {#if remainingWidth}
1296
1297
  <td></td>
1297
1298
  {/if}
1298
1299
  {#if rowAppendSnippet}
@@ -1901,30 +1902,17 @@ function resizeHeader(th, header) {
1901
1902
  width: fit-content;
1902
1903
  }
1903
1904
 
1904
- .slot-append {
1905
- width: 1px;
1906
- min-width: unset;
1907
- box-sizing: content-box;
1908
- }
1909
-
1910
1905
  .table-header {
1911
1906
  position: sticky;
1912
1907
  top: 0;
1913
1908
  z-index: 2;
1909
+ top: -1px;
1914
1910
  height: var(
1915
1911
  --dynamic-table-header-height,
1916
1912
  var(--dynamic-table-default-header-height)
1917
1913
  );
1918
1914
  }
1919
1915
 
1920
- @media not all and (min-resolution:.001dpcm) {
1921
- .table-header {
1922
- position: sticky;
1923
- top: -2px;
1924
- z-index: 2;
1925
- }
1926
- }
1927
-
1928
1916
  .table-subheader {
1929
1917
  top: var(--main-header-height);
1930
1918
  z-index: 1;
@@ -169,6 +169,7 @@ declare class __sveltets_Render<Item extends {
169
169
  [value: string]: number;
170
170
  } | undefined;
171
171
  dynamicFilters?: boolean;
172
+ useSelectedItemsOnly?: boolean;
172
173
  class?: {
173
174
  container?: string;
174
175
  header?: string;
@@ -1,7 +1,4 @@
1
- <script lang="ts" module>export {};
2
- </script>
3
-
4
- <script lang="ts">import SimpleTable from "../../simple/lists/SimpleTable.svelte";
1
+ <script lang="ts" generics="Item extends {[key: string]: any}, Data">import SimpleTable, {} from "../../simple/lists/SimpleTable.svelte";
5
2
  import Paginator from "../../simple/lists/Paginator.svelte";
6
3
  import Dropdown from "../forms/Dropdown.svelte";
7
4
  import {} from "svelte";
@@ -1,144 +1,153 @@
1
- type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
2
- export type Header = ArrayElement<NonNullable<ComponentProps<typeof SimpleTable>["headers"]>>;
3
- import SimpleTable from "../../simple/lists/SimpleTable.svelte";
1
+ import { type Header } from "../../simple/lists/SimpleTable.svelte";
4
2
  import Paginator from "../../simple/lists/Paginator.svelte";
5
3
  import Dropdown from "../forms/Dropdown.svelte";
6
4
  import { type ComponentProps, type Snippet } from "svelte";
7
5
  import Filters from "../search/Filters.svelte";
8
6
  import type Builder from "../../../utils/filters/builder";
9
- declare const PaginatedTable: import("svelte").Component<Omit<{
10
- headers: import("../../simple/lists/SimpleTable.svelte").Header<unknown>[];
11
- items: {
12
- [key: string]: any;
13
- }[];
14
- sortedBy?: string;
15
- sortDirection?: "asc" | "desc";
16
- resizableColumns?: boolean;
17
- resizedColumnSizeWithPadding?: {
18
- [value: string]: number;
19
- } | undefined;
20
- pointerOnRowHover?: boolean;
21
- lang?: "it" | "en";
22
- doubleClickActive?: boolean;
23
- doubleClickDelay?: number;
24
- calculateRowStyles?: import("../../simple/lists/SimpleTable.svelte").CalculateRowStyles<{
25
- [key: string]: any;
26
- }> | undefined;
27
- calculateRowClasses?: import("../../simple/lists/SimpleTable.svelte").CalculateRowClasses<{
28
- [key: string]: any;
29
- }> | undefined;
30
- onsort?: ((event: {
31
- detail: {
32
- sortedBy: string | undefined;
33
- sortDirection: string;
34
- sortModify: import("../../simple/lists/SimpleTable.svelte").Header["sortModify"];
35
- };
36
- }) => void) | undefined;
37
- onrowClick?: ((event: {
38
- detail: {
39
- item: {
40
- [key: string]: any;
7
+ declare class __sveltets_Render<Item extends {
8
+ [key: string]: any;
9
+ }, Data> {
10
+ props(): Omit<{
11
+ headers: Header<Data>[];
12
+ items: Item[];
13
+ sortedBy?: string;
14
+ sortDirection?: "asc" | "desc";
15
+ resizableColumns?: boolean;
16
+ resizedColumnSizeWithPadding?: {
17
+ [value: string]: number;
18
+ } | undefined;
19
+ pointerOnRowHover?: boolean;
20
+ lang?: "it" | "en";
21
+ doubleClickActive?: boolean;
22
+ doubleClickDelay?: number;
23
+ calculateRowStyles?: import("../../simple/lists/SimpleTable.svelte").CalculateRowStyles<Item> | undefined;
24
+ calculateRowClasses?: import("../../simple/lists/SimpleTable.svelte").CalculateRowClasses<Item> | undefined;
25
+ onsort?: ((event: {
26
+ detail: {
27
+ sortedBy: string | undefined;
28
+ sortDirection: string;
29
+ sortModify: Header["sortModify"];
41
30
  };
42
- };
43
- }) => void) | undefined;
44
- onrowDoubleClick?: ((event: {
45
- detail: {
46
- item: {
47
- [key: string]: any;
31
+ }) => void) | undefined;
32
+ onrowClick?: ((event: {
33
+ detail: {
34
+ item: Item;
48
35
  };
49
- };
50
- }) => void) | undefined;
51
- oncolumnResize?: ((event: {
52
- detail: {
53
- id: string;
54
- newWidthPx: number;
55
- };
56
- }) => void) | undefined;
57
- headerSnippet?: Snippet<[{
58
- head: import("../../simple/lists/SimpleTable.svelte").Header<unknown>;
59
- }]> | undefined;
60
- headerLabelSnippet?: Snippet<[{
61
- head: import("../../simple/lists/SimpleTable.svelte").Header<unknown>;
62
- }]> | undefined;
63
- appendSnippet?: Snippet<[{
64
- index: number;
65
- item?: {
66
- [key: string]: any;
36
+ }) => void) | undefined;
37
+ onrowDoubleClick?: ((event: {
38
+ detail: {
39
+ item: Item;
40
+ };
41
+ }) => void) | undefined;
42
+ oncolumnResize?: ((event: {
43
+ detail: {
44
+ id: string;
45
+ newWidthPx: number;
46
+ };
47
+ }) => void) | undefined;
48
+ headerSnippet?: Snippet<[{
49
+ head: Header<Data>;
50
+ }]> | undefined;
51
+ headerLabelSnippet?: Snippet<[{
52
+ head: Header<Data>;
53
+ }]> | undefined;
54
+ appendSnippet?: Snippet<[{
55
+ index: number;
56
+ item?: Item | undefined;
57
+ }]> | undefined;
58
+ rowActionsSnippet?: Snippet<[{
59
+ index: number;
60
+ item: Item;
61
+ }]> | undefined;
62
+ customSnippet?: Snippet<[{
63
+ index: number;
64
+ columnIndex: number;
65
+ header: Header<Data>;
66
+ item: Item;
67
+ }]> | undefined;
68
+ noDataSnippet?: Snippet<[]>;
69
+ class?: {
70
+ container?: string;
71
+ header?: string;
72
+ row?: string;
73
+ cell?: string;
67
74
  } | undefined;
68
- }]> | undefined;
69
- rowActionsSnippet?: Snippet<[{
70
- index: number;
71
- item: {
72
- [key: string]: any;
73
- };
74
- }]> | undefined;
75
- customSnippet?: Snippet<[{
76
- index: number;
77
- columnIndex: number;
78
- header: import("../../simple/lists/SimpleTable.svelte").Header<unknown>;
79
- item: {
80
- [key: string]: any;
81
- };
82
- }]> | undefined;
83
- noDataSnippet?: Snippet<[]>;
84
- class?: {
85
- container?: string;
86
- header?: string;
87
- row?: string;
88
- cell?: string;
89
- } | undefined;
90
- }, "class"> & {
91
- page?: NonNullable<ComponentProps<typeof Paginator>["page"]>;
92
- maxPage?: ComponentProps<typeof Paginator>["maxPage"];
93
- rowsPerPageOptions?: ComponentProps<typeof Dropdown>["items"];
94
- hideRowsPerPage?: boolean;
95
- totalElements?: number;
96
- rowsPerPage?: number;
97
- filters?: ComponentProps<typeof Filters>["filters"];
98
- searchBarColumns?: string[];
99
- searchBarVisible?: boolean;
100
- searchBarPlaceholder?: string;
101
- editFilterMode?: "one-edit" | "multi-edit";
102
- showActiveFilters?: boolean;
103
- class?: {
104
- simpleTable?: ComponentProps<typeof SimpleTable>["class"];
105
- };
106
- onpaginationChange?: (event: {
107
- detail: {
75
+ }, "class"> & {
76
+ page?: NonNullable<ComponentProps<typeof Paginator>["page"]>;
77
+ maxPage?: ComponentProps<typeof Paginator>["maxPage"];
78
+ rowsPerPageOptions?: ComponentProps<typeof Dropdown>["items"];
79
+ hideRowsPerPage?: boolean;
80
+ totalElements?: number;
81
+ rowsPerPage?: number;
82
+ filters?: ComponentProps<typeof Filters>["filters"];
83
+ searchBarColumns?: string[];
84
+ searchBarVisible?: boolean;
85
+ searchBarPlaceholder?: string;
86
+ editFilterMode?: "one-edit" | "multi-edit";
87
+ showActiveFilters?: boolean;
88
+ class?: {
89
+ simpleTable?: {
90
+ container?: string;
91
+ header?: string;
92
+ row?: string;
93
+ cell?: string;
94
+ } | undefined;
95
+ } | undefined;
96
+ onpaginationChange?: ((event: {
97
+ detail: {
98
+ rowsPerPage: number;
99
+ page: number;
100
+ builder: Builder;
101
+ };
102
+ }) => void) | undefined;
103
+ onfiltersChange?: ((event: {
104
+ detail: {
105
+ builder: Builder;
106
+ };
107
+ }) => void) | undefined;
108
+ onremoveFilter?: ComponentProps<typeof Filters>["onremoveFilter"];
109
+ onremoveAllFilters?: ComponentProps<typeof Filters>["onremoveAllFilters"];
110
+ filterAppendSnippet?: ComponentProps<typeof Filters>["appendSnippet"];
111
+ customFilterChipSnippet?: ComponentProps<typeof Filters>["customChipSnippet"];
112
+ customFilterSnippet?: ComponentProps<typeof Filters>["customSnippet"];
113
+ searchBarSnippet?: Snippet<[{
114
+ handleSearchChange: (searchText: string | undefined) => void;
115
+ }]> | undefined;
116
+ footerSnippet?: Snippet<[{
117
+ hideRowsPerPage: boolean;
118
+ rowsPerPageOptions: import("../forms/AsyncAutocomplete.svelte").Item<unknown>[];
119
+ rowsPerPageSelection: import("../forms/AsyncAutocomplete.svelte").Item<unknown>[] | undefined;
120
+ totalElements: number | undefined;
121
+ page: number;
122
+ maxPage: number | undefined;
108
123
  rowsPerPage: number;
124
+ handlePaginationChange: () => void;
125
+ }]> | undefined;
126
+ rangeDescriptorSnippet?: Snippet<[{
127
+ totalElements: number | undefined;
109
128
  page: number;
110
- builder: Builder;
111
- };
112
- }) => void;
113
- onfiltersChange?: (event: {
114
- detail: {
115
- builder: Builder;
116
- };
117
- }) => void;
118
- onremoveFilter?: ComponentProps<typeof Filters>["onremoveFilter"];
119
- onremoveAllFilters?: ComponentProps<typeof Filters>["onremoveAllFilters"];
120
- filterAppendSnippet?: ComponentProps<typeof Filters>["appendSnippet"];
121
- customFilterChipSnippet?: ComponentProps<typeof Filters>["customChipSnippet"];
122
- customFilterSnippet?: ComponentProps<typeof Filters>["customSnippet"];
123
- searchBarSnippet?: Snippet<[{
124
- handleSearchChange: (searchText: string | undefined) => void;
125
- }]>;
126
- footerSnippet?: Snippet<[{
127
- hideRowsPerPage: boolean;
128
- rowsPerPageOptions: import("../forms/AsyncAutocomplete.svelte").Item<unknown>[];
129
- rowsPerPageSelection: import("../forms/AsyncAutocomplete.svelte").Item<unknown>[] | undefined;
130
- totalElements: number | undefined;
131
- page: number;
132
- maxPage: number | undefined;
133
- rowsPerPage: number;
134
- handlePaginationChange: () => void;
135
- }]>;
136
- rangeDescriptorSnippet?: Snippet<[{
137
- totalElements: number | undefined;
138
- page: number;
139
- maxPage: number | undefined;
140
- rowsPerPage: number;
141
- }]>;
142
- }, {}, "page" | "sortedBy" | "sortDirection" | "filters" | "rowsPerPage">;
143
- type PaginatedTable = ReturnType<typeof PaginatedTable>;
129
+ maxPage: number | undefined;
130
+ rowsPerPage: number;
131
+ }]> | undefined;
132
+ };
133
+ events(): {};
134
+ slots(): {};
135
+ bindings(): "page" | "sortedBy" | "sortDirection" | "filters" | "rowsPerPage";
136
+ exports(): {};
137
+ }
138
+ interface $$IsomorphicComponent {
139
+ new <Item extends {
140
+ [key: string]: any;
141
+ }, Data>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Item, Data>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Item, Data>['props']>, ReturnType<__sveltets_Render<Item, Data>['events']>, ReturnType<__sveltets_Render<Item, Data>['slots']>> & {
142
+ $$bindings?: ReturnType<__sveltets_Render<Item, Data>['bindings']>;
143
+ } & ReturnType<__sveltets_Render<Item, Data>['exports']>;
144
+ <Item extends {
145
+ [key: string]: any;
146
+ }, Data>(internal: unknown, props: ReturnType<__sveltets_Render<Item, Data>['props']> & {}): ReturnType<__sveltets_Render<Item, Data>['exports']>;
147
+ z_$$bindings?: ReturnType<__sveltets_Render<any, any>['bindings']>;
148
+ }
149
+ declare const PaginatedTable: $$IsomorphicComponent;
150
+ type PaginatedTable<Item extends {
151
+ [key: string]: any;
152
+ }, Data> = InstanceType<typeof PaginatedTable<Item, Data>>;
144
153
  export default PaginatedTable;
@@ -4,7 +4,7 @@
4
4
  <script lang="ts" generics="Data">import "../../../css/main.css";
5
5
  import "./Autocomplete.css";
6
6
  import { scrollInMenu } from "../common/scroller";
7
- let { values = $bindable(), items = [], searchFunction = undefined, multiple = false, disabled = false, mandatory = false, placeholder = "", width = "auto", height = "auto", maxWidth = undefined, minWidth = "200px", openingId = $bindable("autocomplete-menu"), searchText = $bindable(undefined), maxVisibleChips = undefined, menuOpened = $bindable(false), closeOnSelect = !multiple, emptySearchTextOnMenuClose = true, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px", mobileDrawer = false, menuWidth = undefined, class: clazz = {}, selectionContainerSnippet, selectionSnippet, chipLabelSnippet, exceedCounterSnippet, menuSnippet, itemLabelSnippet, itemSnippet, onchange, onfocus, onblur, onkeydown, onclose, } = $props();
7
+ let { values = $bindable(), items = [], searchFunction = undefined, multiple = false, disabled = false, mandatory = false, placeholder = "", width = "auto", height = "auto", maxWidth = undefined, minWidth = "200px", openingId = $bindable("autocomplete-menu"), searchText = $bindable(undefined), maxVisibleChips = undefined, menuOpened = $bindable(false), closeOnSelect = !multiple, emptySearchTextOnMenuClose = true, menuBoxShadow = "rgb(var(--global-color-background-300), .5) 0px 2px 4px", menuBorderRadius = "5px", mobileDrawer = false, menuWidth = undefined, menuAnchor = 'bottom-center', class: clazz = {}, selectionContainerSnippet, selectionSnippet, chipLabelSnippet, exceedCounterSnippet, menuSnippet, itemLabelSnippet, itemSnippet, onchange, onfocus, onblur, onkeydown, onclose, } = $props();
8
8
  let notVisibleChipNumber = $derived(Math.max((values?.length || 0) - (maxVisibleChips || 0), 0));
9
9
  function select(item) {
10
10
  if (disabled)
@@ -286,7 +286,7 @@ import MenuOrDrawer from "../../composed/common/MenuOrDrawer.svelte";
286
286
  _boxShadow={menuBoxShadow}
287
287
  _borderRadius={menuBorderRadius}
288
288
  bind:open={menuOpened}
289
- anchor="bottom-center"
289
+ anchor={menuAnchor}
290
290
  closeOnClickOutside
291
291
  bind:refreshPosition
292
292
  bind:menuElement
@@ -5,6 +5,7 @@ export type Item<Data = any> = {
5
5
  };
6
6
  import "../../../css/main.css";
7
7
  import "./Autocomplete.css";
8
+ import Menu from "../common/Menu.svelte";
8
9
  import { type ComponentProps, type Snippet } from "svelte";
9
10
  import SimpleTextField from "./SimpleTextField.svelte";
10
11
  import MenuOrDrawer from "../../composed/common/MenuOrDrawer.svelte";
@@ -31,6 +32,7 @@ declare class __sveltets_Render<Data> {
31
32
  menuBorderRadius?: string;
32
33
  mobileDrawer?: boolean;
33
34
  menuWidth?: string | null;
35
+ menuAnchor?: ComponentProps<typeof Menu>["anchor"];
34
36
  class?: {
35
37
  activator?: string;
36
38
  menu?: string;
@@ -3,24 +3,15 @@
3
3
 
4
4
  <script lang="ts">import { onMount } from "svelte";
5
5
  import './TabSwitcher.css';
6
- import { BROWSER } from 'esm-env';
7
6
  import Icon from "../media/Icon.svelte";
8
- let { tabs = [], selected = $bindable(undefined), mandatory = true, class: clazz = {}, ontabClick, ontabKeypress, appendSnippet, } = $props();
7
+ let { tabs = [], selected = $bindable(undefined), mandatory = true, class: clazz = {}, ontabClick, appendSnippet, } = $props();
9
8
  let tabButtons = {};
10
9
  onMount(() => {
11
10
  if (mandatory && !selected && tabs.length > 0)
12
11
  selected = tabs[0].name;
13
- if (selected) {
14
- setBookmarkPosition();
15
- }
16
- });
17
- $effect(() => {
18
- setBookmarkPosition();
19
12
  });
20
- let bookmarkWidth = $state(0), bookmarkLeft = $state(0);
21
13
  function handleTabClick(clickedTab, nativeEvent) {
22
14
  selected = clickedTab.name;
23
- setBookmarkPosition();
24
15
  if (ontabClick) {
25
16
  ontabClick({
26
17
  detail: {
@@ -30,50 +21,23 @@ function handleTabClick(clickedTab, nativeEvent) {
30
21
  });
31
22
  }
32
23
  }
33
- function handleTabKeypress(clickedTab, nativeEvent) {
34
- selected = clickedTab.name;
35
- setBookmarkPosition();
36
- if (ontabKeypress) {
37
- ontabKeypress({
38
- detail: {
39
- nativeEvent,
40
- tab: clickedTab
41
- }
42
- });
43
- }
44
- }
45
- function setBookmarkPosition() {
46
- if (BROWSER) {
47
- let tabButton = selected
48
- ? tabButtons[selected]
49
- : undefined;
50
- if (tabButton) {
51
- bookmarkWidth = tabButton.offsetWidth - 10;
52
- bookmarkLeft = tabButton.offsetLeft + 5;
53
- }
54
- }
55
- }
56
- $effect(() => { if (!!selected)
57
- setBookmarkPosition(); });
58
24
  </script>
59
25
 
60
26
  <div
61
27
  class="{clazz.container || ''} tabs-container"
62
28
  >
63
29
  {#each tabs as tab}
64
- <div
65
- role="presentation"
30
+ <button
66
31
  class:selected-tab={tab.name == selected}
67
32
  class="tab-label {clazz.tabs || ''} {tab.name == selected ? clazz.selected || '' : ''}"
68
33
  onclick={(event) => handleTabClick(tab, event)}
69
- onkeypress={(event) => handleTabKeypress(tab, event)}
70
34
  bind:this={tabButtons[tab.name]}
71
35
  >
72
36
  {#if !!tab.icon}
73
37
  <Icon name={tab.icon}></Icon>
74
38
  {/if}
75
39
  {tab.label}
76
- </div>
40
+ </button>
77
41
  {/each}
78
42
  {#if appendSnippet}
79
43
  <div
@@ -84,11 +48,6 @@ $effect(() => { if (!!selected)
84
48
  {@render appendSnippet()}
85
49
  </div>
86
50
  {/if}
87
- <span
88
- style:left={bookmarkLeft + "px"}
89
- style:width={bookmarkWidth + "px"}
90
- class="{clazz.bookmark || ''} bookmark"
91
- ></span>
92
51
  <span
93
52
  class="{clazz.guide || ''} horizontal-guide"
94
53
  ></span>
@@ -110,6 +69,21 @@ $effect(() => { if (!!selected)
110
69
  );
111
70
  }
112
71
 
72
+ button {
73
+ background: none;
74
+ border: none;
75
+ padding: 0;
76
+ margin: 0;
77
+ color: inherit;
78
+ font: inherit;
79
+ cursor: pointer;
80
+ outline: none;
81
+ }
82
+
83
+ button:focus {
84
+ outline: none;
85
+ }
86
+
113
87
  .selected-tab {
114
88
  color: var(
115
89
  --tab-switcher-selected-color,
@@ -117,9 +91,21 @@ $effect(() => { if (!!selected)
117
91
  );
118
92
  }
119
93
 
94
+ .selected-tab::after {
95
+ content: '';
96
+ position: absolute;
97
+ bottom: 0px;
98
+ left: 0px;
99
+ right: 0px;
100
+ height: 2px;
101
+ background-color: var(
102
+ --tab-switcher-bookmark-color,
103
+ var(--tab-switcher-default-bookmark-color)
104
+ );
105
+ }
106
+
120
107
  .horizontal-guide {
121
108
  position: absolute;
122
- z-index: 5;
123
109
  bottom: 0px;
124
110
  height: 1px;
125
111
  background-color: var(
@@ -139,18 +125,6 @@ $effect(() => { if (!!selected)
139
125
  -webkit-tap-highlight-color: rgba(0,0,0,0);
140
126
  cursor: pointer;
141
127
  padding: 8px;
142
- }
143
-
144
- .bookmark {
145
- position: absolute;
146
- bottom: 0px;
147
- height: 2px;
148
- border-radius: 0.125rem;
149
- z-index: 10;
150
- background-color: var(
151
- --tab-switcher-bookmark-color,
152
- var(--tab-switcher-default-bookmark-color)
153
- );
154
- transition: left 400ms, width 400ms;
128
+ position: relative;
155
129
  }
156
130
  </style>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@likable-hair/svelte",
3
3
  "description": "A Svelte component for likablehair and others",
4
- "version": "4.0.10",
4
+ "version": "4.0.12",
5
5
  "scripts": {
6
6
  "host": "vite --host",
7
7
  "dev": "vite dev",