@likable-hair/svelte 4.3.0 → 4.3.1

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.
@@ -18,14 +18,16 @@
18
18
  ]>
19
19
  }
20
20
 
21
- let {
21
+ let {
22
22
  open = $bindable(),
23
23
  drawerProps,
24
- menuProps,
24
+ menuProps = $bindable(),
25
25
  children,
26
26
  }: Props = $props();
27
27
 
28
- const menuPropsDefaultValue = {
28
+ if (!menuProps) menuProps = {}
29
+
30
+ const menuPropsDefaultValue: Omit<ComponentProps<typeof Menu>, 'open'> = {
29
31
  closeOnClickOutside: true,
30
32
  _boxShadow: "rgb(var(--global-color-grey-900), .5) 0px 2px 4px",
31
33
  _height: "fit-content",
@@ -37,31 +39,37 @@
37
39
  }
38
40
 
39
41
  let finalMenuProps = $derived(
40
- lodash.clone(lodash.merge(menuPropsDefaultValue, menuProps))
42
+ lodash.merge({}, menuPropsDefaultValue, menuProps)
41
43
  )
42
44
 
43
- const drawerPropsDefaultValue = {
45
+ const drawerPropsDefaultValue: Omit<ComponentProps<typeof Drawer>, 'open'> = {
44
46
  position: 'bottom'
45
47
  }
46
48
 
47
49
  let finalDrawerProps = $derived(
48
- lodash.clone(lodash.merge(drawerPropsDefaultValue, drawerProps))
50
+ lodash.merge({}, drawerPropsDefaultValue, drawerProps)
49
51
  )
50
52
  </script>
51
53
 
52
54
  <MediaQuery>
53
- {#snippet defaultSnippet({ mAndDown})}
55
+ {#snippet defaultSnippet({ mAndDown })}
54
56
  {#if mAndDown}
55
57
  <Drawer
56
- bind:open={open}
57
58
  {...finalDrawerProps}
59
+ bind:open={open}
58
60
  >
59
61
  {@render children?.({ isDrawer: true, isMenu: false })}
60
62
  </Drawer>
61
63
  {:else}
62
64
  <Menu
63
- bind:open={open}
64
65
  {...finalMenuProps}
66
+ bind:open
67
+ bind:flipOnOverflow={menuProps.flipOnOverflow}
68
+ bind:refreshPosition={menuProps.refreshPosition}
69
+ bind:stayInViewport={menuProps.stayInViewport}
70
+ bind:activator={menuProps.activator}
71
+ bind:menuElement={menuProps.menuElement}
72
+ bind:openingId={menuProps.openingId}
65
73
  >
66
74
  {@render children?.({ isDrawer: false, isMenu: true })}
67
75
  </Menu>
@@ -13,6 +13,6 @@ export interface Props {
13
13
  }
14
14
  ]>;
15
15
  }
16
- declare const MenuOrDrawer: import("svelte").Component<Props, {}, "open">;
16
+ declare const MenuOrDrawer: import("svelte").Component<Props, {}, "open" | "menuProps">;
17
17
  type MenuOrDrawer = ReturnType<typeof MenuOrDrawer>;
18
18
  export default MenuOrDrawer;
@@ -12,7 +12,7 @@
12
12
 
13
13
  <script lang="ts">
14
14
  import { Button, Icon, mediaQuery, ToolTip } from "../../..";
15
- import type { ComponentProps } from "svelte";
15
+ import type { ComponentProps, Snippet } from "svelte";
16
16
  import { fly } from "svelte/transition";
17
17
  import { cubicIn } from "svelte/easing";
18
18
  import MenuOrDrawer from "./MenuOrDrawer.svelte";
@@ -25,6 +25,7 @@
25
25
  position?: 'top' | 'bottom';
26
26
  lang?: 'it' | 'en';
27
27
  onClose?: () => void
28
+ selectedItemsTextSnippet?: Snippet<[]>
28
29
  }
29
30
 
30
31
  let {
@@ -34,6 +35,7 @@
34
35
  position = 'top',
35
36
  lang = 'en',
36
37
  onClose,
38
+ selectedItemsTextSnippet,
37
39
  }: Props = $props();
38
40
 
39
41
  let actions: Action[] = $state([]),
@@ -110,8 +112,10 @@
110
112
  if(onClose) onClose()
111
113
  }}
112
114
  >
113
- {selectedItems} {lang == 'en' ? 'items selected' : 'righe selezionate'}
114
- <Icon name="mdi-close" />
115
+ {#if selectedItemsTextSnippet}{@render selectedItemsTextSnippet()}{:else}
116
+ {selectedItems} {lang == 'en' ? 'items selected' : 'righe selezionate'}
117
+ <Icon name="mdi-close" />
118
+ {/if}
115
119
  </button>
116
120
  </div>
117
121
  <div class="select-actions-container">
@@ -8,7 +8,7 @@ export type Action = {
8
8
  onClick: NonNullable<ComponentProps<typeof Button>['onclick']>;
9
9
  };
10
10
  import { Button } from "../../..";
11
- import type { ComponentProps } from "svelte";
11
+ import type { ComponentProps, Snippet } from "svelte";
12
12
  import './QuickActions.css';
13
13
  interface Props {
14
14
  selectedItems: number;
@@ -17,6 +17,7 @@ interface Props {
17
17
  position?: 'top' | 'bottom';
18
18
  lang?: 'it' | 'en';
19
19
  onClose?: () => void;
20
+ selectedItemsTextSnippet?: Snippet<[]>;
20
21
  }
21
22
  declare const QuickActions: import("svelte").Component<Props, {}, "">;
22
23
  type QuickActions = ReturnType<typeof QuickActions>;
@@ -272,16 +272,7 @@
272
272
  }
273
273
 
274
274
  function calculateWidgetsFromLocalWidgets() {
275
- widgets = widgetCells?.map((lWidget) => {
276
- return {
277
- id: lWidget.widget.id,
278
- name: lWidget.widget.name,
279
- height: lWidget.widget.height,
280
- width: lWidget.widget.width,
281
- left: lWidget.widget.left,
282
- top: lWidget.widget.top,
283
- }
284
- })
275
+ widgets = widgetCells?.map((lWidget) => lWidget.widget)
285
276
  }
286
277
 
287
278
  function closeAddWidgetDialog() {
@@ -23,6 +23,7 @@
23
23
  height?: string;
24
24
  minWidth?: string;
25
25
  menuWidth?: string;
26
+ menuAnchor?: ComponentProps<typeof Autocomplete>['menuAnchor'];
26
27
  mobileDrawer?: boolean;
27
28
  disabled?: boolean;
28
29
  onchange?: (event: {
@@ -61,6 +62,7 @@
61
62
  height,
62
63
  minWidth = 'none',
63
64
  menuWidth = width,
65
+ menuAnchor,
64
66
  mobileDrawer = false,
65
67
  disabled = false,
66
68
  onchange,
@@ -108,6 +110,7 @@
108
110
  {height}
109
111
  {menuWidth}
110
112
  {itemLabelSnippet}
113
+ {menuAnchor}
111
114
  >
112
115
  {#snippet selectionContainerSnippet({ openMenu, handleKeyDown })}
113
116
  <Button
@@ -19,6 +19,7 @@ declare function $$render<Data>(): {
19
19
  height?: string;
20
20
  minWidth?: string;
21
21
  menuWidth?: string;
22
+ menuAnchor?: ComponentProps<typeof Autocomplete>["menuAnchor"];
22
23
  mobileDrawer?: boolean;
23
24
  disabled?: boolean;
24
25
  onchange?: (event: {
@@ -83,7 +83,7 @@
83
83
 
84
84
  const dirLabel = dir === 'next'
85
85
  ? (lang == 'en' ? 'Next' : unit == 'weeks' ? 'Prossime' : 'Prossimi')
86
- : (lang == 'en' ? 'Last' : unit == 'weeks' ? 'Ultime' : 'Ultimi');
86
+ : (lang == 'en' ? 'Last' : unit == 'weeks' ? 'Scorse' : 'Scorsi');
87
87
 
88
88
  return `${dirLabel} ${num} ${unitLabel}`;
89
89
  }
@@ -570,6 +570,7 @@
570
570
  mobileDrawer
571
571
  clearable={false}
572
572
  menuWidth='fit-content'
573
+ menuAnchor='bottom'
573
574
  openingId='rolling-direction'
574
575
  ></Dropdown>
575
576
  </div>
@@ -581,6 +582,7 @@
581
582
  oninput={() => handleRollingInput()}
582
583
  --simple-textfield-width="100%"
583
584
  --simple-textfield-margin-bottom="0px"
585
+ --simple-textfield-border-radius="4px"
584
586
  ></SimpleTextField>
585
587
  </div>
586
588
 
@@ -146,6 +146,7 @@ declare function $$render<Item extends {
146
146
  rowsPerPage: number;
147
147
  }]> | undefined;
148
148
  totalsSnippet?: import("svelte").Snippet<[]>;
149
+ selectedItemsTextSnippet?: ComponentProps<typeof import("../../..").QuickActions>["selectedItemsTextSnippet"];
149
150
  } & {
150
151
  headersToShowInTable: ComponentProps<typeof PaginatedTable<Item, Data>>["headers"];
151
152
  pinnableColumns?: boolean;
@@ -105,6 +105,7 @@
105
105
  ]
106
106
  >;
107
107
  totalsSnippet?: Snippet<[]>
108
+ selectedItemsTextSnippet?: ComponentProps<typeof QuickActions>['selectedItemsTextSnippet']
108
109
  }
109
110
 
110
111
  let {
@@ -172,6 +173,7 @@
172
173
  totalsSnippet,
173
174
  oncolumnResize,
174
175
  prependSnippet: prependSnippetInternal,
176
+ selectedItemsTextSnippet,
175
177
  ...rest
176
178
  }: Props = $props();
177
179
 
@@ -374,6 +376,7 @@
374
376
  selectedAll = false
375
377
  selectedItems = []
376
378
  }}
379
+ {selectedItemsTextSnippet}
377
380
  />
378
381
  {/if}
379
382
 
@@ -5,6 +5,7 @@ import { type ComponentProps, type Snippet } from "svelte";
5
5
  import Filters from "../search/Filters.svelte";
6
6
  import type Builder from "../../../utils/filters/builder";
7
7
  import QuickFilters from "../search/QuickFilters.svelte";
8
+ import { QuickActions } from "../../..";
8
9
  import type { Action } from "../common/QuickActions.svelte";
9
10
  declare function $$render<Item extends {
10
11
  [key: string]: any;
@@ -145,6 +146,7 @@ declare function $$render<Item extends {
145
146
  rowsPerPage: number;
146
147
  }]>;
147
148
  totalsSnippet?: Snippet<[]>;
149
+ selectedItemsTextSnippet?: ComponentProps<typeof QuickActions>["selectedItemsTextSnippet"];
148
150
  };
149
151
  exports: {};
150
152
  bindings: "page" | "sortedBy" | "sortDirection" | "resizedColumnSizeWithPadding" | "filters" | "selectedItems" | "rowsPerPage" | "quickFilters" | "selectedAll";
@@ -56,7 +56,7 @@
56
56
  _width = 'auto',
57
57
  anchor = 'bottom',
58
58
  closeOnClickOutside = false,
59
- flipOnOverflow = $bindable(false),
59
+ flipOnOverflow = $bindable(),
60
60
  inAnimation = fly,
61
61
  inAnimationConfig = {
62
62
  duration: 100,
@@ -68,8 +68,8 @@
68
68
  duration: 100,
69
69
  y: 10,
70
70
  },
71
- refreshPosition = $bindable(false),
72
- stayInViewport = $bindable(false),
71
+ refreshPosition = $bindable(),
72
+ stayInViewport = $bindable(),
73
73
  _borderRadius = undefined,
74
74
  _boxShadow = undefined,
75
75
  _left = undefined,
@@ -11,6 +11,13 @@
11
11
  import "../../../css/main.css";
12
12
  import "./Autocomplete.css";
13
13
  import { scrollInMenu } from "../common/scroller";
14
+ import Chip from "../navigation/Chip.svelte";
15
+ import Menu from "../common/Menu.svelte";
16
+ import { type ComponentProps, type Snippet } from "svelte";
17
+ import SimpleTextField from "./SimpleTextField.svelte";
18
+ import MenuOrDrawer from "../../composed/common/MenuOrDrawer.svelte";
19
+ import Drawer from "../navigation/Drawer.svelte";
20
+ import Icon from "../media/Icon.svelte";
14
21
 
15
22
  type ItemData = Item<Data>;
16
23
  interface Props {
@@ -166,9 +173,35 @@
166
173
  onclose,
167
174
  }: Props = $props();
168
175
 
169
- let notVisibleChipNumber = $derived(
170
- Math.max(((values || []).length || 0) - (maxVisibleChips || 0), 0),
171
- );
176
+ let focusedIndex: number | undefined = $state(undefined),
177
+ input: HTMLElement | undefined = $state(),
178
+ filteredItems: ItemData[] = $state(items),
179
+ notVisibleChipNumber = $derived(
180
+ Math.max(((values || []).length || 0) - (maxVisibleChips || 0), 0),
181
+ ),
182
+ menuProps: NonNullable<ComponentProps<typeof MenuOrDrawer>['menuProps']> = $state({
183
+ _width: "",
184
+ _height: "auto",
185
+ _maxHeight: menuMaxHeight,
186
+ _boxShadow: menuBoxShadow,
187
+ _borderRadius: menuBorderRadius,
188
+ anchor: menuAnchor,
189
+ closeOnClickOutside: true,
190
+ stayInViewport: menuStayInViewport,
191
+ flipOnOverflow: menuFlipOnOverflow,
192
+ refreshPosition: false,
193
+ openingId: "autocomplete-menu",
194
+ menuElement: undefined,
195
+ })
196
+
197
+ $effect(() => {
198
+ menuProps._maxHeight = menuMaxHeight
199
+ menuProps._boxShadow = menuBoxShadow
200
+ menuProps._borderRadius = menuBorderRadius
201
+ menuProps.anchor = menuAnchor
202
+ menuProps.stayInViewport = menuStayInViewport
203
+ menuProps.flipOnOverflow = menuFlipOnOverflow
204
+ })
172
205
 
173
206
  function select(item: ItemData) {
174
207
  if (disabled) return;
@@ -238,10 +271,6 @@
238
271
  else select(item);
239
272
  }
240
273
 
241
- let localMenuWidth: string | undefined | null = $state(undefined),
242
- menuHeight = "auto",
243
- refreshPosition = $state(false);
244
-
245
274
  function openMenu() {
246
275
  refreshMenuWidth();
247
276
  menuOpened = true;
@@ -249,17 +278,15 @@
249
278
 
250
279
  function refreshMenuWidth() {
251
280
  setTimeout(() => {
252
- if (menuWidth !== undefined) localMenuWidth = menuWidth;
253
- else if (!!activator) localMenuWidth = activator.offsetWidth + "px";
281
+ if (menuWidth !== undefined && menuWidth != null) menuProps._width = menuWidth;
282
+ else if (!!menuProps.activator) menuProps._width = menuProps.activator.offsetWidth + "px";
254
283
 
255
284
  setTimeout(() => {
256
- refreshPosition = true;
285
+ menuProps.refreshPosition = true;
257
286
  }, 1);
258
287
  }, 1);
259
288
  }
260
289
 
261
- let activator: HTMLElement | undefined = $state(),
262
- focusedIndex: number | undefined = $state(undefined);
263
290
  function handleTextFieldFocus() {
264
291
  if (onfocus) {
265
292
  onfocus();
@@ -277,7 +304,6 @@
277
304
  // closeMenu()
278
305
  }
279
306
 
280
- let menuElement: HTMLElement | undefined = $state();
281
307
  function handleKeyDown(event: KeyboardEvent) {
282
308
  if (onkeydown) {
283
309
  onkeydown(event);
@@ -307,16 +333,15 @@
307
333
  menuOpened = false;
308
334
  }
309
335
 
310
- if (focusedIndex !== undefined && !!menuElement) {
311
- let child = menuElement.querySelector<HTMLElement>(
336
+ if (focusedIndex !== undefined && !!menuProps.menuElement) {
337
+ let child = menuProps.menuElement.querySelector<HTMLElement>(
312
338
  ".item-" + focusedIndex,
313
339
  );
314
340
 
315
- if (!!child) scrollInMenu(menuElement, child, "instant");
341
+ if (!!child) scrollInMenu(menuProps.menuElement, child, "instant");
316
342
  }
317
343
  }
318
344
 
319
- let input: HTMLElement | undefined = $state();
320
345
  function handleContainerClick() {
321
346
  if (disabled) return;
322
347
 
@@ -330,7 +355,6 @@
330
355
  }
331
356
  }
332
357
 
333
- let filteredItems: ItemData[] = $state(items);
334
358
  $effect(() => {
335
359
  if (searchText) {
336
360
  focusedIndex = undefined;
@@ -368,20 +392,12 @@
368
392
  }
369
393
  }
370
394
  });
371
-
372
- import Chip from "../navigation/Chip.svelte";
373
- import Menu from "../common/Menu.svelte";
374
- import { type ComponentProps, type Snippet } from "svelte";
375
- import SimpleTextField from "./SimpleTextField.svelte";
376
- import MenuOrDrawer from "../../composed/common/MenuOrDrawer.svelte";
377
- import Drawer from "../navigation/Drawer.svelte";
378
- import Icon from "../media/Icon.svelte";
379
395
  </script>
380
396
 
381
397
  <svelte:window />
382
398
 
383
399
  <div
384
- bind:this={activator}
400
+ bind:this={menuProps.activator}
385
401
  style:width
386
402
  style:max-width={maxWidth}
387
403
  style:min-width={minWidth}
@@ -470,20 +486,11 @@
470
486
  {@render menuSnippet()}
471
487
  {:else if !mobileDrawer}
472
488
  <Menu
473
- {activator}
474
- _width={localMenuWidth || ""}
475
- _height={menuHeight}
476
- _maxHeight={menuMaxHeight}
477
- _boxShadow={menuBoxShadow}
478
- _borderRadius={menuBorderRadius}
489
+ {...menuProps}
479
490
  bind:open={menuOpened}
480
- anchor={menuAnchor}
481
- closeOnClickOutside
482
- stayInViewport={menuStayInViewport}
483
- flipOnOverflow={menuFlipOnOverflow}
484
- bind:refreshPosition
485
- bind:menuElement
486
- bind:openingId
491
+ bind:refreshPosition={menuProps.refreshPosition}
492
+ bind:menuElement={menuProps.menuElement}
493
+ bind:openingId={menuProps.openingId}
487
494
  >
488
495
  <ul
489
496
  class={clazz.menu || ""}
@@ -528,14 +535,7 @@
528
535
  </Menu>
529
536
  {:else}
530
537
  <MenuOrDrawer
531
- menuProps={{
532
- activator,
533
- _width: localMenuWidth || "",
534
- _height: menuHeight,
535
- _maxHeight: "300px",
536
- _boxShadow: menuBoxShadow,
537
- _borderRadius: menuBorderRadius,
538
- }}
538
+ bind:menuProps
539
539
  drawerProps={{
540
540
  onclose
541
541
  }}
@@ -6,7 +6,7 @@
6
6
  import type { Snippet } from 'svelte';
7
7
 
8
8
  interface Props extends HTMLInputAttributes{
9
- value?: string | number;
9
+ value?: string | number | null;
10
10
  valueTo?: string | number;
11
11
  type?: "text" | "password" | "number" | "time" | "date";
12
12
  range?: boolean
@@ -3,7 +3,7 @@ import './SimpleTextField.css';
3
3
  import type { HTMLInputAttributes } from 'svelte/elements';
4
4
  import type { Snippet } from 'svelte';
5
5
  interface Props extends HTMLInputAttributes {
6
- value?: string | number;
6
+ value?: string | number | null;
7
7
  valueTo?: string | number;
8
8
  type?: "text" | "password" | "number" | "time" | "date";
9
9
  range?: boolean;
@@ -98,7 +98,12 @@ export default class Converter {
98
98
  }
99
99
  applyDateFilter(params) {
100
100
  if (params.filter.mode == 'equal' && !!params.filter.value) {
101
- params.builder.where(params.filter.column, '=', params.filter.value);
101
+ const startOfDay = new Date(params.filter.value);
102
+ startOfDay.setHours(0, 0, 0, 0);
103
+ const endOfDay = new Date(params.filter.value);
104
+ endOfDay.setHours(23, 59, 59, 999);
105
+ params.builder.where(params.filter.column, '>=', startOfDay);
106
+ params.builder.where(params.filter.column, '<=', endOfDay);
102
107
  }
103
108
  else if (params.filter.mode == 'greater' && !!params.filter.value) {
104
109
  params.builder.where(params.filter.column, '>', params.filter.value);
@@ -108,10 +113,14 @@ export default class Converter {
108
113
  }
109
114
  else if (params.filter.mode == 'between') {
110
115
  if (!!params.filter.from) {
111
- params.builder.where(params.filter.column, '>=', params.filter.from);
116
+ const from = new Date(params.filter.from);
117
+ from.setHours(0, 0, 0, 0);
118
+ params.builder.where(params.filter.column, '>=', from);
112
119
  }
113
120
  if (!!params.filter.to) {
114
- params.builder.where(params.filter.column, '<=', params.filter.to);
121
+ const to = new Date(params.filter.to);
122
+ to.setHours(23, 59, 59, 999);
123
+ params.builder.where(params.filter.column, '<=', to);
115
124
  }
116
125
  }
117
126
  return params.builder;
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.3.0",
4
+ "version": "4.3.1",
5
5
  "scripts": {
6
6
  "host": "vite --host",
7
7
  "dev": "vite dev",