@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.
Files changed (48) hide show
  1. package/README.md +21 -0
  2. package/dist/components/file/FileUploader.svelte +1 -1
  3. package/dist/components/form/DropdownKvP.svelte +17 -2
  4. package/dist/components/form/DropdownKvP.svelte.d.ts +2 -0
  5. package/dist/components/form/MultiSelect.svelte +91 -91
  6. package/dist/components/form/NumberInput.svelte +2 -0
  7. package/dist/components/form/NumberInput.svelte.d.ts +1 -0
  8. package/dist/components/form/TextArea.svelte +2 -0
  9. package/dist/components/form/TextArea.svelte.d.ts +1 -0
  10. package/dist/components/form/TextInput.svelte +2 -0
  11. package/dist/components/form/TextInput.svelte.d.ts +1 -0
  12. package/dist/components/page/Page.svelte +13 -2
  13. package/dist/components/page/Page.svelte.d.ts +2 -0
  14. package/dist/components/page/menu/Menu.svelte +36 -0
  15. package/dist/components/page/menu/Menu.svelte.d.ts +14 -0
  16. package/dist/components/page/menu/MenuBar.svelte +21 -0
  17. package/dist/components/page/menu/MenuBar.svelte.d.ts +17 -0
  18. package/dist/components/page/menu/MenuDataCaller.d.ts +1 -0
  19. package/dist/components/page/menu/MenuDataCaller.js +11 -0
  20. package/dist/components/page/menu/MenuItem.svelte +36 -0
  21. package/dist/components/page/menu/MenuItem.svelte.d.ts +17 -0
  22. package/dist/components/page/menu/SettingsBar.svelte +46 -0
  23. package/dist/components/page/menu/SettingsBar.svelte.d.ts +17 -0
  24. package/dist/components/page/menu/menu.d.ts +21 -0
  25. package/dist/components/page/menu/menu.js +1 -0
  26. package/dist/index.d.ts +3 -2
  27. package/dist/index.js +3 -1
  28. package/dist/models/Models.d.ts +10 -0
  29. package/package.json +1 -1
  30. package/src/lib/components/file/FileUploader.svelte +1 -1
  31. package/src/lib/components/form/DropdownKvP.svelte +17 -2
  32. package/src/lib/components/form/MultiSelect.svelte +91 -91
  33. package/src/lib/components/form/NumberInput.svelte +2 -0
  34. package/src/lib/components/form/TextArea.svelte +2 -0
  35. package/src/lib/components/form/TextInput.svelte +3 -0
  36. package/src/lib/components/page/Alert.svelte +0 -1
  37. package/src/lib/components/page/Page.svelte +15 -1
  38. package/src/lib/components/page/menu/Menu.svelte +53 -0
  39. package/src/lib/components/page/menu/MenuBar.svelte +30 -0
  40. package/src/lib/components/page/menu/MenuDataCaller.js +11 -0
  41. package/src/lib/components/page/menu/MenuItem.svelte +43 -0
  42. package/src/lib/components/page/menu/SettingsBar.svelte +61 -0
  43. package/src/lib/components/page/menu/menu.ts +23 -0
  44. package/src/lib/index.ts +8 -3
  45. package/src/lib/models/Models.ts +14 -0
  46. /package/dist/components/{spinner → page}/Spinner.svelte +0 -0
  47. /package/dist/components/{spinner → page}/Spinner.svelte.d.ts +0 -0
  48. /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/spinner/Spinner.svelte';
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 };
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bexis2/bexis2-core-ui",
3
- "version": "0.0.31",
3
+ "version": "0.1.1",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "dev": "vite dev",
@@ -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 '../spinner/Spinner.svelte';
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
- selected = selection.id;
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
- target = source.find((opt) => opt.id === id);
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>
@@ -13,7 +13,6 @@
13
13
 
14
14
  $:show = true;
15
15
 
16
-
17
16
  </script>
18
17
  {#if show}
19
18
 
@@ -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
- <div class="px-5 grid gap-5" >
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,11 @@
1
+ import {Api} from "$lib/services/Api";
2
+
3
+
4
+ export const getMenuItems = async () => {
5
+ try {
6
+ const response = await Api.get('/menu');
7
+ return response.data;
8
+ } catch (error) {
9
+ console.error(error);
10
+ }
11
+ };
@@ -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/spinner/Spinner.svelte';
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
- } from './models/Models.js';
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 };
@@ -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
+ }