iconograph-ui 1.4.9 → 1.4.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.
@@ -29,6 +29,12 @@
29
29
  { field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
30
30
  { field: "type", label: "Type", component: CustomLabel, props: {}, width: 120, sort: (a, b) => null, filterOptions: enumType},
31
31
  { field: "status", label: "Statut", component: null, props: {}, width: 120, sort: (a, b) => null, filterOptions: false},
32
+ { field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
33
+ { field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
34
+ { field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
35
+ { field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
36
+ { field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
37
+ { field: "city", label: "Ville", component: null, props: {}, width: 200, sort: (a, b) => a.name.localeCompare(b.name)},
32
38
  ]
33
39
 
34
40
  let uri = "/example?"
@@ -12,6 +12,7 @@
12
12
  import Editor from "$lib/iconograph-ui/inputs/Editor.svelte";
13
13
  import SegmentedSwitchInput from "$lib/iconograph-ui/form/SegmentedSwitchInput.svelte"
14
14
  import Link from "$lib/iconograph-ui/display/Link.svelte";
15
+ import SelectUserInput from "$lib/iconograph-ui/user/SelectUserInput.svelte";
15
16
 
16
17
  let options = [{ key: "Value" }]
17
18
  let inputs = [
@@ -67,6 +68,12 @@
67
68
  <Card padding={'0px'}>
68
69
  <Editor on:change={onEditorChange}></Editor>
69
70
  </Card>
71
+
72
+ <Card>
73
+
74
+ <SelectUserInput multiple={true}></SelectUserInput>
75
+
76
+ </Card>
70
77
  </BodySection>
71
78
 
72
79
  <Modal bind:open={open}>
@@ -8,6 +8,7 @@
8
8
  import UserSelect from "$lib/iconograph-ui/user/UserSelect.svelte";
9
9
 
10
10
  import Form from "$lib/iconograph-ui/form/Form.svelte";
11
+ import ActionButton from "$lib/iconograph-ui/form/ActionButton.svelte";
11
12
  import Input from "$lib/iconograph-ui/form/Input.svelte";
12
13
  import SexeChoiceInput from "$lib/iconograph-ui/form/SexeChoiceInput.svelte";
13
14
  import CustomInput from "$lib/components/CustomInput.svelte";
@@ -59,6 +60,9 @@
59
60
  </div>
60
61
  <span class="margin-l-s" style="text-transform: uppercase; color: #888; font-weight: 600;"></span>
61
62
  </div>
63
+ <div style="margin-right: 60px;">
64
+ <ActionButton options={[{label: "Supprimer les derniers", action: () => {alert();}}]}></ActionButton>
65
+ </div>
62
66
  </div>
63
67
  </div>
64
68
  </div>
package/index.js CHANGED
@@ -22,6 +22,7 @@ import SegmentedSwitchInput from "./lib/form/SegmentedSwitchInput.svelte"
22
22
  import DateStr from "./lib/display/DateStr.svelte";
23
23
  import Field from "./lib/display/Field.svelte";
24
24
  import Link from "./lib/display/Link.svelte";
25
+ import ActionButton from "./lib/form/ActionButton.svelte";
25
26
 
26
27
  export {
27
28
  Button,
@@ -47,5 +48,6 @@ export {
47
48
  DateStr,
48
49
  Field,
49
50
  Link,
51
+ ActionButton,
50
52
  addNotification,
51
53
  };
@@ -0,0 +1,69 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ viewBox="0,0,256,256"
4
+ width="52px"
5
+ height="52px"
6
+ version="1.1"
7
+ id="svg2"
8
+ sodipodi:docname="icon-details.svg"
9
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
10
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ xmlns:svg="http://www.w3.org/2000/svg">
14
+ <defs
15
+ id="defs2" />
16
+ <sodipodi:namedview
17
+ id="namedview2"
18
+ pagecolor="#505050"
19
+ bordercolor="#ffffff"
20
+ borderopacity="1"
21
+ inkscape:showpageshadow="0"
22
+ inkscape:pageopacity="0"
23
+ inkscape:pagecheckerboard="1"
24
+ inkscape:deskcolor="#505050"
25
+ inkscape:zoom="5.639423"
26
+ inkscape:cx="34.134698"
27
+ inkscape:cy="24.913896"
28
+ inkscape:window-width="1366"
29
+ inkscape:window-height="697"
30
+ inkscape:window-x="1724"
31
+ inkscape:window-y="1432"
32
+ inkscape:window-maximized="1"
33
+ inkscape:current-layer="g2" />
34
+ <g
35
+ fill="#ffffff"
36
+ fill-rule="nonzero"
37
+ stroke="none"
38
+ stroke-width="1"
39
+ stroke-linecap="butt"
40
+ stroke-linejoin="miter"
41
+ stroke-miterlimit="10"
42
+ stroke-dasharray=""
43
+ stroke-dashoffset="0"
44
+ font-family="none"
45
+ font-weight="none"
46
+ font-size="none"
47
+ text-anchor="none"
48
+ style="mix-blend-mode: normal"
49
+ id="g2">
50
+ <circle
51
+ style="fill:#353435;fill-opacity:1;stroke-width:58.4123;paint-order:stroke markers fill"
52
+ id="path1"
53
+ cx="128"
54
+ cy="33.164097"
55
+ r="30.319672" />
56
+ <circle
57
+ style="mix-blend-mode:normal;fill:#353435;fill-opacity:1;stroke-width:58.4123;paint-order:stroke markers fill"
58
+ id="path1-1"
59
+ cx="128"
60
+ cy="129.33942"
61
+ r="30.319672" />
62
+ <circle
63
+ style="mix-blend-mode:normal;fill:#353435;fill-opacity:1;stroke-width:58.4123;paint-order:stroke markers fill"
64
+ id="path1-2"
65
+ cx="128"
66
+ cy="225.51472"
67
+ r="30.319672" />
68
+ </g>
69
+ </svg>
@@ -0,0 +1,42 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <svg
3
+ viewBox="0 0 24 24"
4
+ width="96px"
5
+ height="96px"
6
+ version="1.1"
7
+ id="svg1"
8
+ sodipodi:docname="icon-next-w.svg"
9
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
10
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ xmlns:svg="http://www.w3.org/2000/svg">
14
+ <defs
15
+ id="defs1" />
16
+ <sodipodi:namedview
17
+ id="namedview1"
18
+ pagecolor="#505050"
19
+ bordercolor="#ffffff"
20
+ borderopacity="1"
21
+ inkscape:showpageshadow="0"
22
+ inkscape:pageopacity="0"
23
+ inkscape:pagecheckerboard="1"
24
+ inkscape:deskcolor="#505050"
25
+ inkscape:zoom="3.6902135"
26
+ inkscape:cx="34.279859"
27
+ inkscape:cy="51.081055"
28
+ inkscape:window-width="1366"
29
+ inkscape:window-height="697"
30
+ inkscape:window-x="296"
31
+ inkscape:window-y="1072"
32
+ inkscape:window-maximized="1"
33
+ inkscape:current-layer="svg1" />
34
+ <path
35
+ style="color:#000000;fill:#ffffff;stroke-linecap:square;-inkscape-stroke:none"
36
+ d="M 8.7481553,4.4712861 15.251845,10.974975"
37
+ id="path7" />
38
+ <path
39
+ id="path8"
40
+ style="color:#000000;fill:#ffffff;stroke-width:1.19665;stroke-linecap:square;-inkscape-stroke:none"
41
+ d="M 8.0956441,2.2032465 5.980469,4.3184215 7.0392251,5.3771777 13.762794,12.1025 7.0392251,18.828406 5.980469,19.884825 8.0956441,22 9.1544,20.94358 l 7.780572,-7.782908 1.058756,-1.058756 v -5.85e-4 L 17.729039,11.837226 15.878553,9.98674 15.877969,9.987324 9.1544,3.2620026 Z" />
42
+ </svg>
@@ -0,0 +1,109 @@
1
+ <script>
2
+ // @ts-nocheck
3
+ import { onMount } from 'svelte';
4
+ import Portal from 'svelte-portal';
5
+ import { clickOutside } from './../utils/clickOutside.js';
6
+ import detailsIcon from '../assets/icons/icon-details.svg?url';
7
+
8
+ export let options = [];
9
+
10
+ let open = false;
11
+ let dropdownEl;
12
+ let coords = { top: 0, left: 0, width: 0 };
13
+
14
+ function openDropdown() {
15
+ const rect = dropdownEl.getBoundingClientRect();
16
+ coords = { top: rect.bottom, left: rect.left, width: rect.width };
17
+ open = !open;
18
+ }
19
+
20
+ </script>
21
+
22
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
23
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
24
+ <div class="dropdown {open ? 'open' : ''}" bind:this={dropdownEl} use:clickOutside on:click_outside={() => {open = false}}
25
+ on:click|preventDefault|stopPropagation={openDropdown}>
26
+ <div style:background-image={`url("${detailsIcon}")`}>Actions</div>
27
+
28
+ <!-- Liste déroulante -->
29
+ {#if open}
30
+ <Portal target="body" >
31
+ <div class="list" style="position: absolute; top:{coords.top + 2}px; left:{coords.left + coords.width - 200}px; width: {coords.width}px;" >
32
+ <!-- Options -->
33
+ {#each options as opt}
34
+ <div class="option" on:click={opt.action}>
35
+ <span>{opt.label}</span>
36
+ </div>
37
+ {/each}
38
+ </div>
39
+ </Portal>
40
+ {/if}
41
+
42
+ </div>
43
+
44
+ <style>
45
+ .dropdown {
46
+ position: relative;
47
+ display: flex;
48
+ height: var(--theme-input-height, 40px);
49
+ flex: 1;
50
+ }
51
+ .dropdown.open {
52
+ border-bottom-left-radius: 0px;
53
+ border-bottom-right-radius: 0px;
54
+ }
55
+ .dropdown > div:first-of-type {
56
+ background-color: #ebebed;
57
+ height: 40px;
58
+ border: none;
59
+ border-radius: 8px;
60
+ cursor: pointer;
61
+ padding: 0px 16px;
62
+ font-size: 14px;
63
+ line-height: 40px;
64
+ font-weight: 600;
65
+ font-family: var(--theme-text-font);
66
+ color: #333;
67
+ flex: 1;
68
+ min-width: 76px;
69
+ background-size: 16px auto;
70
+ background-repeat: no-repeat;
71
+ background-position: center right 16px;
72
+ padding-left: 24px;
73
+ }
74
+ .dropdown > div:first-of-type:hover {
75
+ background-color: #ddd;
76
+ }
77
+ .list {
78
+ position: absolute;
79
+ top: 100%;
80
+ right: 0px;
81
+ background: var(--theme-input-bg-highlight, #ebebed);
82
+ border-radius: 8px;
83
+ padding: 8px 0px;
84
+ max-height: 220px;
85
+ overflow-y: auto;
86
+ z-index: 9999;
87
+ min-width: 200px;
88
+ }
89
+ .option {
90
+ display: flex;
91
+ align-items: center;
92
+ padding: 8px 24px;
93
+ gap: 8px;
94
+ cursor: pointer;
95
+ }
96
+ .option > span {
97
+ font-size: 14px;
98
+ line-height: 16px;
99
+ font-weight: 400;
100
+ font-family: var(--theme-text-font);
101
+ color: var(--theme-input-text-color);
102
+ overflow: hidden;
103
+ white-space: nowrap;
104
+ text-overflow: ellipsis;
105
+ }
106
+ .option:hover {
107
+ background: var(--theme-input-bg-hover);
108
+ }
109
+ </style>
@@ -23,6 +23,9 @@
23
23
 
24
24
  let data = [];
25
25
 
26
+ let els = [];
27
+ let actualWidths = columns.map(c => c.width);
28
+
26
29
  /*
27
30
  function handleSort(sname) {
28
31
  settings.forEach(e => {
@@ -82,13 +85,28 @@
82
85
 
83
86
  onMount(() => {
84
87
  resetAndGetData()
88
+ const observers = [];
89
+
90
+ columns.forEach((_, i) => {
91
+ const ob = new ResizeObserver(() => {
92
+ actualWidths[i] = els[i].offsetWidth;
93
+ //columns[i].width = actualWidths[i];
94
+
95
+ actualWidths = [...actualWidths];
96
+ });
97
+
98
+ ob.observe(els[i]);
99
+ observers.push(ob);
100
+ });
101
+
102
+ return () => observers.forEach(o => o.disconnect());
85
103
  });
86
104
 
87
105
  </script>
88
106
 
89
107
  <div class="table-wrapper">
90
108
  <div>
91
- <div >
109
+ <div>
92
110
  <div>
93
111
  {#if header}
94
112
  <div class="hd-actions" >
@@ -107,14 +125,16 @@
107
125
  </div>
108
126
  </div>
109
127
 
128
+ <div>
110
129
  {#if filtering}
111
130
  <TableFilter columns={columns} on:filter={(e) => resetAndGetData(e.detail)}></TableFilter>
112
131
  {/if}
132
+ </div>
113
133
 
114
134
  <div class="table-header">
115
135
  <div><div>
116
- {#each columns as c}
117
- <div style="min-width: {c.width}px; width: {c.width}px;">
136
+ {#each columns as c, i}
137
+ <div bind:this={els[i]} style="min-width: {c.width}px; width: {c.width}px;" class="col-h">
118
138
  {c.label}
119
139
  {#if c.sort != null }
120
140
  <!-- svelte-ignore a11y_click_events_have_key_events -->
@@ -190,6 +210,9 @@
190
210
  padding-right: 24px;
191
211
  display: flex;
192
212
  gap: 8px;
213
+ /*border-right: 1px red solid;
214
+ resize: horizontal;
215
+ overflow: hidden;*/
193
216
  }
194
217
  .table-body {
195
218
  width: 100%;
@@ -31,7 +31,9 @@
31
31
  <div>
32
32
  <div class="user-label">
33
33
  <UserPicture size={24} user={v}></UserPicture>
34
- <span>{v.firstname} {v.lastname}</span>
34
+ <a href={`/user/${v.id}`}>
35
+ <span>{v.firstname} {v.lastname}</span>
36
+ </a>
35
37
  <!-- svelte-ignore a11y_click_events_have_key_events -->
36
38
  <!-- svelte-ignore a11y_no_static_element_interactions -->
37
39
  <div on:click={() => handleRemove(v.id)}>+</div>
@@ -49,7 +51,9 @@
49
51
  {:else}
50
52
  <div class="user-label">
51
53
  <UserPicture size={24} user={value}></UserPicture>
52
- <span>{value.firstname} {value.lastname}</span>
54
+ <a href={`/user/${value.id}`}>
55
+ <span>{value.firstname} {value.lastname}</span>
56
+ </a>
53
57
  <!-- svelte-ignore a11y_click_events_have_key_events -->
54
58
  <!-- svelte-ignore a11y_no_static_element_interactions -->
55
59
  <div on:click={handleRemove}>+</div>
@@ -76,7 +80,7 @@
76
80
  display: flex;
77
81
  align-items: center;
78
82
  background-color: #ffffff;
79
- height: var(--theme-input-height, 40px);
83
+ height: calc(var(--theme-input-height, 40px) - 2px);
80
84
  border: 1px solid #e4e4e4;
81
85
  border-radius: 8px;
82
86
  padding: 0px 16px;
@@ -87,7 +91,7 @@
87
91
  color: var(--theme-input-text-font);
88
92
  flex: 1;
89
93
  }
90
- .user-label > span {
94
+ .user-label span {
91
95
  font-size: 14px;
92
96
  line-height: 16px;
93
97
  font-weight: 400;
@@ -99,6 +103,9 @@
99
103
  margin-left: 8px;
100
104
  flex: 1;
101
105
  }
106
+ .user-label a, .user-label span {
107
+ flex: 1;
108
+ }
102
109
  .user-label > div:nth-of-type(2) {
103
110
  cursor: pointer;
104
111
  margin-left: 8px;
@@ -16,6 +16,7 @@
16
16
  let open = false;
17
17
  let search = "";
18
18
 
19
+ let y = 0;
19
20
  let dropdownEl;
20
21
  let coords = { top: 0, left: 0, width: 0 };
21
22
 
@@ -48,6 +49,8 @@
48
49
 
49
50
  </script>
50
51
 
52
+ <svelte:window bind:scrollY={y} />
53
+
51
54
  <!-- svelte-ignore a11y_click_events_have_key_events -->
52
55
  <!-- svelte-ignore a11y_no_static_element_interactions -->
53
56
  <div class="dropdown {open ? 'open' : ''}" bind:this={dropdownEl} use:clickOutside on:click_outside={() => {open = false}}
@@ -58,7 +61,7 @@
58
61
  <!-- Liste déroulante -->
59
62
  {#if open}
60
63
  <Portal target="body" >
61
- <div class="list" style="position: absolute; top:{coords.top}px; left:{coords.left}px; width: {coords.width}px;" >
64
+ <div class="list" style="position: absolute; top:{coords.top + y}px; left:{coords.left}px; width: {coords.width}px;" >
62
65
  <!-- Options -->
63
66
  {#each users as user}
64
67
  <div class="option" on:click={() => selectUser(user)}>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iconograph-ui",
3
- "version": "1.4.9",
3
+ "version": "1.4.12",
4
4
  "description": "A Svelte Kit components library",
5
5
  "main": "./index.js",
6
6
  "svelte": "./index.js",