@bexis2/bexis2-core-ui 0.0.31 → 0.1.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.
- package/README.md +21 -0
- package/dist/components/file/FileUploader.svelte +1 -1
- package/dist/components/form/DropdownKvP.svelte +17 -2
- package/dist/components/form/DropdownKvP.svelte.d.ts +2 -0
- package/dist/components/form/MultiSelect.svelte +91 -91
- package/dist/components/form/NumberInput.svelte +2 -0
- package/dist/components/form/NumberInput.svelte.d.ts +1 -0
- package/dist/components/form/TextArea.svelte +2 -0
- package/dist/components/form/TextArea.svelte.d.ts +1 -0
- package/dist/components/form/TextInput.svelte +2 -0
- package/dist/components/form/TextInput.svelte.d.ts +1 -0
- package/dist/components/page/Page.svelte +13 -2
- package/dist/components/page/Page.svelte.d.ts +2 -0
- package/dist/components/page/menu/Menu.svelte +36 -0
- package/dist/components/page/menu/Menu.svelte.d.ts +14 -0
- package/dist/components/page/menu/MenuBar.svelte +21 -0
- package/dist/components/page/menu/MenuBar.svelte.d.ts +17 -0
- package/dist/components/page/menu/MenuDataCaller.d.ts +1 -0
- package/dist/components/page/menu/MenuDataCaller.js +11 -0
- package/dist/components/page/menu/MenuItem.svelte +36 -0
- package/dist/components/page/menu/MenuItem.svelte.d.ts +17 -0
- package/dist/components/page/menu/SettingsBar.svelte +46 -0
- package/dist/components/page/menu/SettingsBar.svelte.d.ts +17 -0
- package/dist/components/page/menu/menu.d.ts +21 -0
- package/dist/components/page/menu/menu.js +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -1
- package/dist/models/Models.d.ts +10 -0
- package/package.json +1 -1
- package/src/lib/components/file/FileUploader.svelte +1 -1
- package/src/lib/components/form/DropdownKvP.svelte +17 -2
- package/src/lib/components/form/MultiSelect.svelte +91 -91
- package/src/lib/components/form/NumberInput.svelte +2 -0
- package/src/lib/components/form/TextArea.svelte +2 -0
- package/src/lib/components/form/TextInput.svelte +3 -0
- package/src/lib/components/page/Alert.svelte +0 -1
- package/src/lib/components/page/Page.svelte +15 -1
- package/src/lib/components/page/menu/Menu.svelte +53 -0
- package/src/lib/components/page/menu/MenuBar.svelte +30 -0
- package/src/lib/components/page/menu/MenuDataCaller.js +11 -0
- package/src/lib/components/page/menu/MenuItem.svelte +43 -0
- package/src/lib/components/page/menu/SettingsBar.svelte +61 -0
- package/src/lib/components/page/menu/menu.ts +23 -0
- package/src/lib/index.ts +8 -3
- package/src/lib/models/Models.ts +14 -0
- /package/dist/components/{spinner → page}/Spinner.svelte +0 -0
- /package/dist/components/{spinner → page}/Spinner.svelte.d.ts +0 -0
- /package/src/lib/components/{spinner → page}/Spinner.svelte +0 -0
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import FileIcon from './components/file/FileIcon.svelte';
|
|
|
5
5
|
import FileInfo from './components/file/FileInfo.svelte';
|
|
6
6
|
import FileUploader from './components/file/FileUploader.svelte';
|
|
7
7
|
//page
|
|
8
|
-
import Spinner from './components/
|
|
8
|
+
import Spinner from './components/page/Spinner.svelte';
|
|
9
9
|
import Page from './components/page/Page.svelte';
|
|
10
10
|
import Alert from './components/page/Alert.svelte';
|
|
11
11
|
// input
|
|
@@ -30,5 +30,7 @@ export { ListView, TableView, Spinner, Page, Alert };
|
|
|
30
30
|
//Api
|
|
31
31
|
export { Api } from './services/Api.js';
|
|
32
32
|
export { host, username, password, setApiConfig } from './stores/apistore.js';
|
|
33
|
+
//enum
|
|
34
|
+
export { Position } from './models/Enums';
|
|
33
35
|
// Table
|
|
34
36
|
export { Table, TableFilter, columnFilter, searchFilter };
|
package/dist/models/Models.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export interface Input {
|
|
|
12
12
|
invalid: boolean;
|
|
13
13
|
valid: boolean;
|
|
14
14
|
required: boolean;
|
|
15
|
+
placeholder: string;
|
|
15
16
|
}
|
|
16
17
|
export interface FileInfo {
|
|
17
18
|
name: string;
|
|
@@ -69,3 +70,12 @@ export interface TableConfig<T> {
|
|
|
69
70
|
defaultPageSize?: number;
|
|
70
71
|
optionsComponent?: typeof SvelteComponent;
|
|
71
72
|
}
|
|
73
|
+
export interface KvP {
|
|
74
|
+
id: number;
|
|
75
|
+
text: string;
|
|
76
|
+
}
|
|
77
|
+
export interface ListItem {
|
|
78
|
+
id: number;
|
|
79
|
+
text: string;
|
|
80
|
+
group: string;
|
|
81
|
+
}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import DropZone from 'svelte-file-dropzone/Dropzone.svelte';
|
|
5
5
|
import Fa from 'svelte-fa/src/fa.svelte';
|
|
6
6
|
|
|
7
|
-
import Spinner from '../
|
|
7
|
+
import Spinner from '../page/Spinner.svelte';
|
|
8
8
|
import { createEventDispatcher } from 'svelte';
|
|
9
9
|
import { faTrash } from '@fortawesome/free-solid-svg-icons';
|
|
10
10
|
import { faSave } from '@fortawesome/free-regular-svg-icons';
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
export let invalid = false;
|
|
10
10
|
export let feedback = [''];
|
|
11
11
|
export let required = false;
|
|
12
|
+
export let targetIsComplex = false;
|
|
12
13
|
|
|
13
14
|
$: selected = null;
|
|
14
15
|
|
|
@@ -17,12 +18,26 @@
|
|
|
17
18
|
|
|
18
19
|
function updatedSelectedValue(selection) {
|
|
19
20
|
if (selection != null) {
|
|
20
|
-
|
|
21
|
+
if(targetIsComplex)
|
|
22
|
+
{
|
|
23
|
+
selected = selection.id;
|
|
24
|
+
}
|
|
25
|
+
else
|
|
26
|
+
{
|
|
27
|
+
selected = selection
|
|
28
|
+
}
|
|
21
29
|
}
|
|
22
30
|
}
|
|
23
31
|
|
|
24
32
|
function updatedTarget(id) {
|
|
25
|
-
|
|
33
|
+
if(targetIsComplex)
|
|
34
|
+
{
|
|
35
|
+
target = source.find((opt) => opt.id === id);
|
|
36
|
+
}
|
|
37
|
+
else
|
|
38
|
+
{
|
|
39
|
+
target = id;
|
|
40
|
+
}
|
|
26
41
|
}
|
|
27
42
|
</script>
|
|
28
43
|
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import InputContainer from './InputContainer.svelte';
|
|
3
|
-
|
|
4
|
-
import Select from 'svelte-select';
|
|
5
|
-
import { onMount } from 'svelte';
|
|
6
|
-
|
|
7
|
-
export let source;
|
|
8
|
-
export let target;
|
|
9
|
-
export let title;
|
|
10
|
-
export let itemId = 'value';
|
|
11
|
-
export let label = 'label';
|
|
12
|
-
export let isMulti = true;
|
|
13
|
-
export let isComplex = false;
|
|
14
|
-
export let isTargetComplex = false;
|
|
15
|
-
export let required = false;
|
|
16
|
-
export let feedback = [];
|
|
17
|
-
|
|
18
|
-
let isLoaded = false;
|
|
19
|
-
|
|
20
|
-
$: value = null;
|
|
21
|
-
$: updateTarget(value);
|
|
22
|
-
|
|
23
|
-
function updateTarget(selection) {
|
|
24
|
-
//diffrent cases
|
|
25
|
-
console.log('------');
|
|
26
|
-
|
|
27
|
-
//a) source is complex model is simple
|
|
28
|
-
if (isComplex && !isTargetComplex && isLoaded) {
|
|
29
|
-
console.log('a) source is complex model is simple');
|
|
30
|
-
|
|
31
|
-
target = [];
|
|
32
|
-
for (let i in selection) {
|
|
33
|
-
let item = selection[i];
|
|
34
|
-
target.push(item[itemId]);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (!isComplex && !isTargetComplex && isLoaded) {
|
|
39
|
-
target = [];
|
|
40
|
-
for (let i in selection) {
|
|
41
|
-
target.push(selection[i].value);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
console.log('selection ' + title, selection);
|
|
45
|
-
console.log('target ' + title, target);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
onMount(async () => {
|
|
49
|
-
//console.log("on mount multiselect");
|
|
50
|
-
//console.log(source);
|
|
51
|
-
|
|
52
|
-
//a) source is complex model is simple
|
|
53
|
-
if (isComplex && !isTargetComplex) {
|
|
54
|
-
let items = [];
|
|
55
|
-
// event.detail will be null unless isMulti is true and user has removed a single item
|
|
56
|
-
for (let i in target) {
|
|
57
|
-
let t = target[i];
|
|
58
|
-
items.push(source.find((item) => item.key === t));
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
isLoaded = true;
|
|
62
|
-
if (items.length > 0) {
|
|
63
|
-
value = items;
|
|
64
|
-
}
|
|
65
|
-
//console.log(value);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
//b) simple liust and simple model
|
|
69
|
-
if (!isComplex && !isTargetComplex) {
|
|
70
|
-
//console.log("source", source);
|
|
71
|
-
//console.log("target",target);
|
|
72
|
-
isLoaded = true;
|
|
73
|
-
//set target only if its nit empty
|
|
74
|
-
if (target != null && target !== undefined && target != '') {
|
|
75
|
-
value = target;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
</script>
|
|
80
|
-
|
|
81
|
-
<InputContainer label={title} {feedback} {required}>
|
|
82
|
-
<Select
|
|
83
|
-
class="select variant-form-material"
|
|
84
|
-
items={source}
|
|
85
|
-
{itemId}
|
|
86
|
-
{label}
|
|
87
|
-
multiple={isMulti}
|
|
88
|
-
bind:value
|
|
89
|
-
placeholder="-- Please select --"
|
|
90
|
-
/>
|
|
91
|
-
</InputContainer>
|
|
1
|
+
<script>
|
|
2
|
+
import InputContainer from './InputContainer.svelte';
|
|
3
|
+
|
|
4
|
+
import Select from 'svelte-select';
|
|
5
|
+
import { onMount } from 'svelte';
|
|
6
|
+
|
|
7
|
+
export let source;
|
|
8
|
+
export let target;
|
|
9
|
+
export let title;
|
|
10
|
+
export let itemId = 'value';
|
|
11
|
+
export let label = 'label';
|
|
12
|
+
export let isMulti = true;
|
|
13
|
+
export let isComplex = false;
|
|
14
|
+
export let isTargetComplex = false;
|
|
15
|
+
export let required = false;
|
|
16
|
+
export let feedback = [];
|
|
17
|
+
|
|
18
|
+
let isLoaded = false;
|
|
19
|
+
|
|
20
|
+
$: value = null;
|
|
21
|
+
$: updateTarget(value);
|
|
22
|
+
|
|
23
|
+
function updateTarget(selection) {
|
|
24
|
+
//diffrent cases
|
|
25
|
+
console.log('------');
|
|
26
|
+
|
|
27
|
+
//a) source is complex model is simple
|
|
28
|
+
if (isComplex && !isTargetComplex && isLoaded) {
|
|
29
|
+
console.log('a) source is complex model is simple');
|
|
30
|
+
|
|
31
|
+
target = [];
|
|
32
|
+
for (let i in selection) {
|
|
33
|
+
let item = selection[i];
|
|
34
|
+
target.push(item[itemId]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (!isComplex && !isTargetComplex && isLoaded) {
|
|
39
|
+
target = [];
|
|
40
|
+
for (let i in selection) {
|
|
41
|
+
target.push(selection[i].value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
console.log('selection ' + title, selection);
|
|
45
|
+
console.log('target ' + title, target);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
onMount(async () => {
|
|
49
|
+
//console.log("on mount multiselect");
|
|
50
|
+
//console.log(source);
|
|
51
|
+
|
|
52
|
+
//a) source is complex model is simple
|
|
53
|
+
if (isComplex && !isTargetComplex) {
|
|
54
|
+
let items = [];
|
|
55
|
+
// event.detail will be null unless isMulti is true and user has removed a single item
|
|
56
|
+
for (let i in target) {
|
|
57
|
+
let t = target[i];
|
|
58
|
+
items.push(source.find((item) => item.key === t));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
isLoaded = true;
|
|
62
|
+
if (items.length > 0) {
|
|
63
|
+
value = items;
|
|
64
|
+
}
|
|
65
|
+
//console.log(value);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
//b) simple liust and simple model
|
|
69
|
+
if (!isComplex && !isTargetComplex) {
|
|
70
|
+
//console.log("source", source);
|
|
71
|
+
//console.log("target",target);
|
|
72
|
+
isLoaded = true;
|
|
73
|
+
//set target only if its nit empty
|
|
74
|
+
if (target != null && target !== undefined && target != '') {
|
|
75
|
+
value = target;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<InputContainer label={title} {feedback} {required}>
|
|
82
|
+
<Select
|
|
83
|
+
class="select variant-form-material"
|
|
84
|
+
items={source}
|
|
85
|
+
{itemId}
|
|
86
|
+
{label}
|
|
87
|
+
multiple={isMulti}
|
|
88
|
+
bind:value
|
|
89
|
+
placeholder="-- Please select --"
|
|
90
|
+
/>
|
|
91
|
+
</InputContainer>
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
export let invalid: boolean = false;
|
|
10
10
|
export let required: boolean = false;
|
|
11
11
|
export let feedback: string[] = [''];
|
|
12
|
+
export let placeholder: string = "";
|
|
12
13
|
</script>
|
|
13
14
|
|
|
14
15
|
<InputContainer {label} {feedback} {required}>
|
|
@@ -20,5 +21,6 @@
|
|
|
20
21
|
class:input-error={invalid}
|
|
21
22
|
bind:value
|
|
22
23
|
on:input
|
|
24
|
+
{placeholder}
|
|
23
25
|
/>
|
|
24
26
|
</InputContainer>
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
export let invalid: boolean = false;
|
|
10
10
|
export let required: boolean = false;
|
|
11
11
|
export let feedback: string[] = [''];
|
|
12
|
+
export let placeholder: string = "";
|
|
12
13
|
</script>
|
|
13
14
|
|
|
14
15
|
<InputContainer {label} {feedback} {required}>
|
|
@@ -19,5 +20,6 @@
|
|
|
19
20
|
class:input-error={invalid}
|
|
20
21
|
bind:value
|
|
21
22
|
on:input
|
|
23
|
+
{placeholder}
|
|
22
24
|
/>
|
|
23
25
|
</InputContainer>
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
export let invalid: boolean = false;
|
|
10
10
|
export let required: boolean = false;
|
|
11
11
|
export let feedback: string[] = [''];
|
|
12
|
+
export let placeholder: string ="";
|
|
13
|
+
|
|
12
14
|
</script>
|
|
13
15
|
|
|
14
16
|
<InputContainer {label} {feedback} {required}>
|
|
@@ -20,5 +22,6 @@
|
|
|
20
22
|
class:input-error={invalid}
|
|
21
23
|
bind:value
|
|
22
24
|
on:input
|
|
25
|
+
{placeholder}
|
|
23
26
|
/>
|
|
24
27
|
</InputContainer>
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
|
|
3
3
|
import type { Link } from "$lib/models/Models";
|
|
4
|
+
|
|
5
|
+
import Menu from './menu/Menu.svelte'
|
|
4
6
|
|
|
5
7
|
export let title = "";
|
|
6
8
|
export let note = "";
|
|
7
9
|
export let links:Link[]=[];
|
|
10
|
+
|
|
11
|
+
// active or hide menu
|
|
12
|
+
export let menu:boolean = true;
|
|
13
|
+
export let footer:boolean = true;
|
|
8
14
|
|
|
9
15
|
</script>
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
{#if menu}
|
|
18
|
+
<Menu/>
|
|
19
|
+
{/if}
|
|
20
|
+
|
|
21
|
+
<div class="px-5 grid gap-5 content-center" >
|
|
12
22
|
<h1 class="h1">{title}</h1>
|
|
13
23
|
{#if note}
|
|
14
24
|
<blockquote class="blockquote">{note}</blockquote>
|
|
@@ -25,4 +35,8 @@
|
|
|
25
35
|
{/if}
|
|
26
36
|
<slot/>
|
|
27
37
|
</div>
|
|
38
|
+
|
|
39
|
+
{#if menu}
|
|
40
|
+
<!-- footer -->
|
|
41
|
+
{/if}
|
|
28
42
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
//
|
|
3
|
+
import Fa from 'svelte-fa/src/fa.svelte'
|
|
4
|
+
import { faCog } from '@fortawesome/free-solid-svg-icons'
|
|
5
|
+
|
|
6
|
+
import { onMount } from 'svelte';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
import { setApiConfig } from '../../../stores/apistore';
|
|
10
|
+
import { getMenuItems} from './MenuDataCaller';
|
|
11
|
+
|
|
12
|
+
import type { Menu } from "./menu";
|
|
13
|
+
|
|
14
|
+
import MenuBar from './MenuBar.svelte';
|
|
15
|
+
import SettingsBar from './SettingsBar.svelte';
|
|
16
|
+
|
|
17
|
+
let menu:Menu;
|
|
18
|
+
|
|
19
|
+
onMount(async () => {
|
|
20
|
+
|
|
21
|
+
setApiConfig("https://localhost:44345","david","123456");
|
|
22
|
+
|
|
23
|
+
menu = await getMenuItems();
|
|
24
|
+
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
</script>
|
|
31
|
+
|
|
32
|
+
{#if menu}
|
|
33
|
+
|
|
34
|
+
<div class="flex flex-row md:flex px-3 py-2">
|
|
35
|
+
<div class="basis-2/3">
|
|
36
|
+
{#if menu.Logo}
|
|
37
|
+
<img src='data:{menu.Logo.Mime};charset=utf-8;base64, {menu.Logo.Data}' alt='{menu.Logo.Name}' style='height:40px;' />
|
|
38
|
+
{/if}
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<div class="flex-auto w-64 flex items-center md:space-x-3 justify-end">
|
|
42
|
+
|
|
43
|
+
<MenuBar menuBar={menu.AccountBar} />
|
|
44
|
+
<MenuBar menuBar={menu.LaunchBar} />
|
|
45
|
+
<SettingsBar menuBar={menu.Settings} />
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
</div>
|
|
49
|
+
<div class="flex items-center md:space-x-5 px-3 text-lg">
|
|
50
|
+
<MenuBar menuBar={menu.MenuBar} />
|
|
51
|
+
<MenuBar menuBar={menu.Extended} />
|
|
52
|
+
</div>
|
|
53
|
+
{/if}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
<script lang="ts">
|
|
3
|
+
|
|
4
|
+
import { computePosition, autoUpdate, offset, shift, flip, arrow } from '@floating-ui/dom';
|
|
5
|
+
import { storePopup } from '@skeletonlabs/skeleton';
|
|
6
|
+
storePopup.set({ computePosition, autoUpdate, offset, shift, flip, arrow });
|
|
7
|
+
|
|
8
|
+
import type { MenuItem } from "../../models/menu";
|
|
9
|
+
import Item from "./MenuItem.svelte";
|
|
10
|
+
|
|
11
|
+
export let menuBar:MenuItem [];
|
|
12
|
+
|
|
13
|
+
let comboboxValue: string;
|
|
14
|
+
|
|
15
|
+
let radomNumber = Math.floor(Math.random() * 100);
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
{#if menuBar}
|
|
22
|
+
{#each menuBar as menubarItem}
|
|
23
|
+
|
|
24
|
+
<Item {menubarItem}{comboboxValue}/>
|
|
25
|
+
|
|
26
|
+
{/each}
|
|
27
|
+
{/if}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { popup } from '@skeletonlabs/skeleton';
|
|
3
|
+
import { ListBox, ListBoxItem } from '@skeletonlabs/skeleton';
|
|
4
|
+
|
|
5
|
+
import type { PopupSettings } from '@skeletonlabs/skeleton';
|
|
6
|
+
|
|
7
|
+
export let menubarItem;
|
|
8
|
+
export let comboboxValue;
|
|
9
|
+
|
|
10
|
+
let radomNumber = Math.floor(Math.random() * 100).toString();
|
|
11
|
+
|
|
12
|
+
let popupCombobox: PopupSettings = {
|
|
13
|
+
event: 'click',
|
|
14
|
+
target: radomNumber,
|
|
15
|
+
placement: 'bottom',
|
|
16
|
+
// Close the popup when the item is clicked
|
|
17
|
+
closeQuery: '.listbox-item'
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
</script>
|
|
21
|
+
{#if menubarItem.Items.length<1}
|
|
22
|
+
|
|
23
|
+
<button class="flex items-center gap-x-1 text-xl font-semibold leading-6 text-gray-500" use:popup={popupCombobox}>
|
|
24
|
+
<span class="capitalize">{comboboxValue ?? menubarItem.Title}</span>
|
|
25
|
+
|
|
26
|
+
</button>
|
|
27
|
+
|
|
28
|
+
{:else}
|
|
29
|
+
<button class="flex items-center gap-x-1 text-xl font-semibold leading-6 text-gray-00" use:popup={popupCombobox}>
|
|
30
|
+
<span class="capitalize">{menubarItem.Title}</span>
|
|
31
|
+
<div class="before:content-['▾']"></div>
|
|
32
|
+
</button>
|
|
33
|
+
<div class="card w-48 shadow-xl py-2" data-popup={radomNumber}>
|
|
34
|
+
|
|
35
|
+
<ListBox rounded="rounded-none">
|
|
36
|
+
{#each menubarItem.Items as item}
|
|
37
|
+
|
|
38
|
+
<ListBoxItem class="bg-white text-gray-900 py-1 text-sm" bind:group={menubarItem.Title} name="medium" value={item.Title}>{item.Title}</ListBoxItem>
|
|
39
|
+
{/each}
|
|
40
|
+
</ListBox>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
{/if}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { popup } from '@skeletonlabs/skeleton';
|
|
3
|
+
import { ListBox, ListBoxItem } from '@skeletonlabs/skeleton';
|
|
4
|
+
|
|
5
|
+
import type { PopupSettings } from '@skeletonlabs/skeleton';
|
|
6
|
+
import type { MenuItem } from "../../models/menu";
|
|
7
|
+
import Fa from 'svelte-fa/src/fa.svelte'
|
|
8
|
+
import { faCog } from '@fortawesome/free-solid-svg-icons'
|
|
9
|
+
|
|
10
|
+
export let menuBar:MenuItem [];
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
let lastModule = "";
|
|
14
|
+
let first = true;
|
|
15
|
+
|
|
16
|
+
function isNewModule(module)
|
|
17
|
+
{
|
|
18
|
+
if(module === lastModule ){
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
else
|
|
22
|
+
{
|
|
23
|
+
lastModule = module;
|
|
24
|
+
if(first)
|
|
25
|
+
{
|
|
26
|
+
first = false;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let popupCombobox: PopupSettings = {
|
|
35
|
+
event: 'click',
|
|
36
|
+
target: 'popupCombobox',
|
|
37
|
+
placement: 'bottom',
|
|
38
|
+
// Close the popup when the item is clicked
|
|
39
|
+
closeQuery: '.listbox-item'
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
{#if menuBar}
|
|
45
|
+
<button class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900" use:popup={popupCombobox}>
|
|
46
|
+
<span class="capitalize"><Fa icon={faCog} /></span>
|
|
47
|
+
|
|
48
|
+
</button>
|
|
49
|
+
<div class="card w-48 shadow-xl py-2" data-popup="popupCombobox">
|
|
50
|
+
<ListBox rounded="rounded-none bg-white">
|
|
51
|
+
{#each menuBar as menubarItem}
|
|
52
|
+
{#if isNewModule(menubarItem.Module) }<hr class="bg-gray-900">{/if}
|
|
53
|
+
<ListBoxItem class="bg-white text-gray-900 py-1" bind:group={menubarItem.Title} name="medium" value={menubarItem.Title}>{menubarItem.Title}</ListBoxItem>
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
{/each}
|
|
58
|
+
</ListBox>
|
|
59
|
+
</div>
|
|
60
|
+
{/if}
|
|
61
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface Menu {
|
|
2
|
+
Logo: Logo;
|
|
3
|
+
LaunchBar: MenuItem[];
|
|
4
|
+
MenuBar: MenuItem[];
|
|
5
|
+
AccountBar: MenuItem[];
|
|
6
|
+
Settings: MenuItem[];
|
|
7
|
+
Extended: MenuItem[];
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface MenuItem {
|
|
11
|
+
Title: string;
|
|
12
|
+
Url: string;
|
|
13
|
+
Target: string;
|
|
14
|
+
Module: string;
|
|
15
|
+
Items: MenuItem[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface Logo {
|
|
19
|
+
Mime: string;
|
|
20
|
+
Name: string;
|
|
21
|
+
Data: string;
|
|
22
|
+
Height: number;
|
|
23
|
+
}
|
package/src/lib/index.ts
CHANGED
|
@@ -7,7 +7,7 @@ import FileInfo from './components/file/FileInfo.svelte';
|
|
|
7
7
|
import FileUploader from './components/file/FileUploader.svelte';
|
|
8
8
|
|
|
9
9
|
//page
|
|
10
|
-
import Spinner from './components/
|
|
10
|
+
import Spinner from './components/page/Spinner.svelte';
|
|
11
11
|
import Page from './components/page/Page.svelte';
|
|
12
12
|
import Alert from './components/page/Alert.svelte';
|
|
13
13
|
|
|
@@ -55,8 +55,13 @@ export type {
|
|
|
55
55
|
user,
|
|
56
56
|
Input,
|
|
57
57
|
FileUploaderModel,
|
|
58
|
-
Link
|
|
59
|
-
|
|
58
|
+
Link,
|
|
59
|
+
ListItem,
|
|
60
|
+
KvP
|
|
61
|
+
} from './models/Models.js';
|
|
62
|
+
|
|
63
|
+
//enum
|
|
64
|
+
export { Position } from './models/Enums';
|
|
60
65
|
|
|
61
66
|
// Table
|
|
62
67
|
export { Table, TableFilter, columnFilter, searchFilter };
|
package/src/lib/models/Models.ts
CHANGED
|
@@ -18,6 +18,7 @@ export interface Input {
|
|
|
18
18
|
invalid: boolean;
|
|
19
19
|
valid: boolean;
|
|
20
20
|
required: boolean;
|
|
21
|
+
placeholder:string;
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
export interface FileInfo {
|
|
@@ -86,3 +87,16 @@ export interface TableConfig<T> {
|
|
|
86
87
|
defaultPageSize?: number;
|
|
87
88
|
optionsComponent?: typeof SvelteComponent;
|
|
88
89
|
}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
// lists
|
|
93
|
+
export interface KvP {
|
|
94
|
+
id: number;
|
|
95
|
+
text: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface ListItem {
|
|
99
|
+
id: number;
|
|
100
|
+
text: string;
|
|
101
|
+
group: string;
|
|
102
|
+
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|