@likable-hair/svelte 3.0.71 → 3.0.73

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.
@@ -6,7 +6,9 @@ import TreeEditorItem from "./TreeEditorItem.svelte";
6
6
  import { createId } from "@paralleldrive/cuid2";
7
7
  import lodash from "lodash";
8
8
  let dispatch = createEventDispatcher();
9
- export let items = [], groupName = createId(), cleanItems = convertItemsInClean(items);
9
+ export let items = [], groupName = createId(), cleanItems = convertItemsInClean(items), collapsable = true, editable = true, updateItem = ({ item }) => {
10
+ return item;
11
+ };
10
12
  let itemList, sortable = void 0, rerender = true, mounted = false;
11
13
  onMount(() => {
12
14
  mounted = true;
@@ -109,11 +111,31 @@ $:
109
111
  title={item.title}
110
112
  id={item.id}
111
113
  group={groupName}
114
+ data={item.data}
115
+ bind:updateItem
116
+ bind:collapsable
117
+ bind:editable
112
118
  bind:subItems={item.children}
113
119
  bind:expanded={item.expanded}
114
120
  bind:sortable={item.sortable}
115
121
  on:end={handleEnd}
116
- ></TreeEditorItem>
122
+ on:input={(e) => {
123
+ if(e.detail.item.id == item.id) {
124
+ item = e.detail.item
125
+ if(!!updateItem) item = updateItem({ item: e.detail.item, inputData: e.detail.inputData })
126
+ }
127
+
128
+ dispatch('input', {
129
+ item
130
+ })
131
+ }}
132
+ on:click
133
+ >
134
+ <svelte:fragment slot="append" let:item let:doUpdateItem >
135
+ <slot name="append" item={item} {doUpdateItem}>
136
+ </slot>
137
+ </svelte:fragment>
138
+ </TreeEditorItem>
117
139
  {/each}
118
140
  </ul>
119
141
  {/key}
@@ -15,20 +15,36 @@ export type CleanItem = {
15
15
  data?: any;
16
16
  };
17
17
  import Sortable from 'sortablejs';
18
+ import { type ComponentProps } from 'svelte';
19
+ import TreeEditorItem from './TreeEditorItem.svelte';
18
20
  declare const __propDef: {
19
21
  props: {
20
22
  items?: Item[] | undefined;
21
23
  groupName?: string | undefined;
22
24
  cleanItems?: CleanItem[] | undefined;
25
+ collapsable?: boolean | undefined;
26
+ editable?: boolean | undefined;
27
+ updateItem?: ComponentProps<TreeEditorItem>['updateItem'];
23
28
  };
24
29
  events: {
30
+ click: CustomEvent<{
31
+ item: Item;
32
+ }>;
25
33
  change: CustomEvent<{
26
34
  items: Item[];
27
35
  }>;
36
+ input: CustomEvent<{
37
+ item: Item;
38
+ }>;
28
39
  } & {
29
40
  [evt: string]: CustomEvent<any>;
30
41
  };
31
- slots: {};
42
+ slots: {
43
+ append: {
44
+ item: Item;
45
+ doUpdateItem: (item: Item, inputData: any) => void;
46
+ };
47
+ };
32
48
  };
33
49
  export type TreeEditorProps = typeof __propDef.props;
34
50
  export type TreeEditorEvents = typeof __propDef.events;
@@ -5,7 +5,7 @@ import Button from "../buttons/Button.svelte";
5
5
  import { slide } from "svelte/transition";
6
6
  import { createEventDispatcher } from "svelte";
7
7
  let dispatch = createEventDispatcher();
8
- export let title, id, subtitle = void 0, group, animationDuration = 150, expanded = true, subItems = [], sortable = void 0;
8
+ export let title, id, subtitle = void 0, group, animationDuration = 150, expanded = true, subItems = [], sortable = void 0, collapsable = true, editable = true, data = void 0, updateItem = void 0;
9
9
  let subItemList, mounted = false;
10
10
  onMount(() => {
11
11
  mounted = true;
@@ -29,9 +29,25 @@ function initSortable() {
29
29
  }
30
30
  });
31
31
  }
32
+ let currentItem;
33
+ $:
34
+ currentItem = {
35
+ id,
36
+ title,
37
+ expanded,
38
+ sortable,
39
+ children: subItems,
40
+ data
41
+ };
32
42
  $:
33
43
  if (!!subItems)
34
44
  initSortable();
45
+ function doUpdateItem(item, inputData) {
46
+ if (!updateItem)
47
+ return;
48
+ let newItem = updateItem({ item, inputData });
49
+ dispatch("input", { item: newItem });
50
+ }
35
51
  </script>
36
52
 
37
53
  <li
@@ -45,17 +61,32 @@ $:
45
61
  name="mdi-dots-grid"
46
62
  ></Icon>
47
63
  </div>
48
- <div class="button-container" class:reversed={expanded}>
49
- <Button
50
- buttonType="text"
51
- on:click={() => expanded = !expanded}
52
- >
53
- <Icon
54
- name="mdi-chevron-down"
55
- ></Icon>
56
- </Button>
57
- </div>
58
- {title}
64
+ {#if collapsable}
65
+ <div class="button-container" class:reversed={expanded}>
66
+ <Button
67
+ buttonType="text"
68
+ on:click={() => expanded = !expanded}
69
+ >
70
+ <Icon
71
+ name="mdi-chevron-down"
72
+ ></Icon>
73
+ </Button>
74
+ </div>
75
+ {/if}
76
+ {#if editable}
77
+ <input
78
+ bind:value={title}
79
+ on:input|stopPropagation={(e) => {
80
+ dispatch('input', {
81
+ item: currentItem
82
+ })
83
+ }}
84
+ />
85
+ {:else}
86
+ {title}
87
+ {/if}
88
+ <slot name="append" item={currentItem} {doUpdateItem}>
89
+ </slot>
59
90
  </div>
60
91
  <ul
61
92
  class="list-container"
@@ -68,8 +99,23 @@ $:
68
99
  title={subItem.title}
69
100
  group={group}
70
101
  animationDuration={animationDuration}
102
+ data={subItem.data}
103
+ bind:collapsable
71
104
  bind:subItems={subItem.children}
72
105
  bind:sortable={subItem.sortable}
106
+ on:input={(e) => {
107
+ if(e.detail.item.id == subItem.id) {
108
+ subItem = e.detail.item
109
+ if(!!updateItem) subItem = updateItem({ item: e.detail.item, inputData: e.detail.inputData })
110
+ }
111
+
112
+ dispatch('input', {
113
+ item: subItem,
114
+ inputData: e.detail.inputData
115
+ })
116
+ }}
117
+ on:input
118
+ on:click
73
119
  ></svelte:self>
74
120
  {/each}
75
121
  {/if}
@@ -117,4 +163,13 @@ $:
117
163
  .button-container.reversed {
118
164
  transform: rotate(-90deg);
119
165
  }
166
+
167
+ input {
168
+ outline: none;
169
+ background-color: transparent;
170
+ font-size: inherit;
171
+ font-weight: inherit;
172
+ color: inherit;
173
+ border: none
174
+ }
120
175
  </style>
@@ -11,6 +11,13 @@ declare const __propDef: {
11
11
  expanded?: boolean | undefined;
12
12
  subItems?: Item[] | undefined;
13
13
  sortable?: Sortable | undefined;
14
+ collapsable?: boolean | undefined;
15
+ editable?: boolean | undefined;
16
+ data?: any;
17
+ updateItem?: ((params: {
18
+ item: Item;
19
+ inputData?: any;
20
+ }) => Item) | undefined;
14
21
  };
15
22
  events: {
16
23
  change: CustomEvent<{
@@ -19,10 +26,22 @@ declare const __propDef: {
19
26
  end: CustomEvent<{
20
27
  ev: Sortable.SortableEvent;
21
28
  }>;
29
+ input: CustomEvent<{
30
+ item: Item;
31
+ inputData?: any;
32
+ }>;
33
+ click: CustomEvent<{
34
+ item: Item;
35
+ }>;
22
36
  } & {
23
37
  [evt: string]: CustomEvent<any>;
24
38
  };
25
- slots: {};
39
+ slots: {
40
+ append: {
41
+ item: Item;
42
+ doUpdateItem: (item: Item, inputData: any) => void;
43
+ };
44
+ };
26
45
  };
27
46
  export type TreeEditorItemProps = typeof __propDef.props;
28
47
  export type TreeEditorItemEvents = typeof __propDef.events;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@likable-hair/svelte",
3
3
  "description": "A Svelte component for likablehair",
4
- "version": "3.0.71",
4
+ "version": "3.0.73",
5
5
  "scripts": {
6
6
  "host": "vite --host",
7
7
  "dev": "vite dev",