@bexis2/bexis2-core-ui 0.0.30 → 0.0.31

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.
@@ -1,94 +1,141 @@
1
- import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
2
- import type { TableFilterFn } from 'svelte-headless-table/lib/plugins/addTableFilter';
3
-
4
- const textFilter = (filterOption, filterValue, value) => {
5
- switch (filterOption) {
6
- case 'isequal':
7
- return value.toLowerCase() === filterValue.toLowerCase();
8
- case 'isnotequal':
9
- return value.toLowerCase() !== filterValue.toLowerCase();
10
- case 'starts':
11
- return value.toLowerCase().startsWith(filterValue.toLowerCase());
12
- case 'ends':
13
- return value.toLowerCase().endsWith(filterValue.toLowerCase());
14
- case 'contains':
15
- return value.toLowerCase().includes(filterValue.toLowerCase());
16
- case 'notcontains':
17
- return !value.toLowerCase().includes(filterValue.toLowerCase());
18
- default:
19
- return false;
20
- }
21
- };
22
-
23
- const numberFilter = (filterOption, filterValue, value) => {
24
- switch (filterOption) {
25
- case 'isequal':
26
- return value === filterValue;
27
- case 'isnotequal':
28
- return value !== filterValue;
29
- case 'isgreater':
30
- return value > filterValue;
31
- case 'isless':
32
- return value < filterValue;
33
- case 'isgreaterorequal':
34
- return value >= filterValue;
35
- case 'islessorequal':
36
- return value <= filterValue;
37
- default:
38
- return false;
39
- }
40
- };
41
-
42
- const numericFilter: ColumnFilterFn = ({ filterValue, value }) => {
43
- const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
44
- if (!firstFilterValue && !secondFilterValue) {
45
- return true;
46
- } else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
47
- return numberFilter(secondFilterOption, secondFilterValue, value);
48
- } else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
49
- return numberFilter(firstFilterOption, firstFilterValue, value);
50
- }
51
- return (
52
- numberFilter(firstFilterOption, firstFilterValue, value) &&
53
- numberFilter(secondFilterOption, secondFilterValue, value)
54
- );
55
- };
56
-
57
- const stringFilter: ColumnFilterFn = ({ filterValue, value }) => {
58
- const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
59
- if (!firstFilterValue?.length && !secondFilterValue?.length) {
60
- return true;
61
- } else if (
62
- (!firstFilterOption || !firstFilterValue) &&
63
- secondFilterOption &&
64
- secondFilterValue?.length
65
- ) {
66
- return textFilter(secondFilterOption, secondFilterValue, value);
67
- } else if (
68
- (!secondFilterOption || !secondFilterValue?.length) &&
69
- firstFilterOption &&
70
- firstFilterValue?.length
71
- ) {
72
- return textFilter(firstFilterOption, firstFilterValue, value);
73
- }
74
- return (
75
- textFilter(firstFilterOption, firstFilterValue, value) &&
76
- textFilter(secondFilterOption, secondFilterValue, value)
77
- );
78
- };
79
-
80
- export const columnFilter: ColumnFilterFn = ({ filterValue, value }) => {
81
- if (typeof value === 'string') {
82
- return stringFilter({ filterValue, value });
83
- } else if (typeof value === 'number') {
84
- return numericFilter({ filterValue, value });
85
- }
86
- return false;
87
- };
88
-
89
- export const searchFilter: TableFilterFn = ({ filterValue, value }) => {
90
- if (value.toLowerCase().includes(filterValue.toLowerCase())) {
91
- return true;
92
- }
93
- return false;
94
- };
1
+ import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
2
+ import type { TableFilterFn } from 'svelte-headless-table/lib/plugins/addTableFilter';
3
+
4
+ const textFilter = (filterOption, filterValue, value) => {
5
+ switch (filterOption) {
6
+ case 'isequal':
7
+ return value.toLowerCase() === filterValue.toLowerCase();
8
+ case 'isnotequal':
9
+ return value.toLowerCase() !== filterValue.toLowerCase();
10
+ case 'starts':
11
+ return value.toLowerCase().startsWith(filterValue.toLowerCase());
12
+ case 'ends':
13
+ return value.toLowerCase().endsWith(filterValue.toLowerCase());
14
+ case 'contains':
15
+ return value.toLowerCase().includes(filterValue.toLowerCase());
16
+ case 'notcontains':
17
+ return !value.toLowerCase().includes(filterValue.toLowerCase());
18
+ default:
19
+ return false;
20
+ }
21
+ };
22
+
23
+ const numberFilter = (filterOption, filterValue, value) => {
24
+ switch (filterOption) {
25
+ case 'isequal':
26
+ return value === filterValue;
27
+ case 'isnotequal':
28
+ return value !== filterValue;
29
+ case 'isgreater':
30
+ return value > filterValue;
31
+ case 'isless':
32
+ return value < filterValue;
33
+ case 'isgreaterorequal':
34
+ return value >= filterValue;
35
+ case 'islessorequal':
36
+ return value <= filterValue;
37
+ default:
38
+ return false;
39
+ }
40
+ };
41
+
42
+ const dateFilter = (filterOption, filterValue, value) => {
43
+ const filter = new Date(filterValue);
44
+
45
+ switch (filterOption) {
46
+ case 'ison':
47
+ return value === filter;
48
+ case 'isstartingfrom':
49
+ return value >= filter;
50
+ case 'isafter':
51
+ return value > filter;
52
+ case 'isuntil':
53
+ return value <= filter;
54
+ case 'isbefore':
55
+ return value < filter;
56
+ case 'isnoton':
57
+ return value !== filter;
58
+ default:
59
+ return false;
60
+ }
61
+ };
62
+
63
+ const numericFilter: ColumnFilterFn = ({ filterValue, value }) => {
64
+ const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
65
+ if (firstFilterValue == null && !secondFilterValue == null) {
66
+ return true;
67
+ } else if (
68
+ (firstFilterOption == null || firstFilterValue == null) &&
69
+ secondFilterOption != null &&
70
+ secondFilterValue != null
71
+ ) {
72
+ return numberFilter(secondFilterOption, secondFilterValue, value);
73
+ } else if (
74
+ (secondFilterOption == null || secondFilterValue == null) &&
75
+ firstFilterOption != null &&
76
+ firstFilterValue != null
77
+ ) {
78
+ return numberFilter(firstFilterOption, firstFilterValue, value);
79
+ }
80
+ return (
81
+ numberFilter(firstFilterOption, firstFilterValue, value) &&
82
+ numberFilter(secondFilterOption, secondFilterValue, value)
83
+ );
84
+ };
85
+
86
+ const stringFilter: ColumnFilterFn = ({ filterValue, value }) => {
87
+ const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
88
+ if (!firstFilterValue?.length && !secondFilterValue?.length) {
89
+ return true;
90
+ } else if (
91
+ (!firstFilterOption || !firstFilterValue) &&
92
+ secondFilterOption &&
93
+ secondFilterValue?.length
94
+ ) {
95
+ return textFilter(secondFilterOption, secondFilterValue, value);
96
+ } else if (
97
+ (!secondFilterOption || !secondFilterValue?.length) &&
98
+ firstFilterOption &&
99
+ firstFilterValue?.length
100
+ ) {
101
+ return textFilter(firstFilterOption, firstFilterValue, value);
102
+ }
103
+ return (
104
+ textFilter(firstFilterOption, firstFilterValue, value) &&
105
+ textFilter(secondFilterOption, secondFilterValue, value)
106
+ );
107
+ };
108
+
109
+ const dateTypeFilter: ColumnFilterFn = ({ filterValue, value }) => {
110
+ const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
111
+ if (!firstFilterValue && !secondFilterValue) {
112
+ return true;
113
+ } else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
114
+ return dateFilter(secondFilterOption, secondFilterValue, value);
115
+ } else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
116
+ return dateFilter(firstFilterOption, firstFilterValue, value);
117
+ }
118
+
119
+ return (
120
+ dateFilter(firstFilterOption, firstFilterValue, value) &&
121
+ dateFilter(secondFilterOption, secondFilterValue, value)
122
+ );
123
+ };
124
+
125
+ export const columnFilter: ColumnFilterFn = ({ filterValue, value }) => {
126
+ if (typeof value === 'string') {
127
+ return stringFilter({ filterValue, value });
128
+ } else if (typeof value === 'number') {
129
+ return numericFilter({ filterValue, value });
130
+ } else if (typeof value === 'object' && value instanceof Date) {
131
+ return dateTypeFilter({ filterValue, value });
132
+ }
133
+ return false;
134
+ };
135
+
136
+ export const searchFilter: TableFilterFn = ({ filterValue, value }) => {
137
+ if (value.toLowerCase().includes(filterValue.toLowerCase())) {
138
+ return true;
139
+ }
140
+ return false;
141
+ };
@@ -0,0 +1,46 @@
1
+ <script lang="ts">
2
+
3
+ import Fa from 'svelte-fa';
4
+
5
+ import { faXmark } from '@fortawesome/free-solid-svg-icons';
6
+
7
+ import {fade} from 'svelte/transition'
8
+
9
+ export let title:string = "";
10
+ export let message:string = "";
11
+ export let cssClass:string= "";
12
+ export let deleteBtn:boolean = true;
13
+
14
+ $:show = true;
15
+
16
+
17
+ </script>
18
+ {#if show}
19
+
20
+ <aside class="alert {cssClass}" transition:fade|local={{ duration: 100 }}>
21
+ <!-- Icon -->
22
+ <!-- <div>(icon)</div> -->
23
+ <!-- Message -->
24
+ <div class="alert-message">
25
+
26
+ {#if title}
27
+ <h3 class="h3">{title}</h3>
28
+ {/if}
29
+ <p>{message}
30
+ <slot></slot>
31
+ </p>
32
+ </div>
33
+ <!-- Actions -->
34
+ <div class="alert-actions">
35
+ <slot name="actions"/>
36
+
37
+ {#if deleteBtn}
38
+ <button class="btn hover:text-primary-100" on:click={()=>show = false}>
39
+ <Fa icon={faXmark} />
40
+ </button>
41
+ {/if}
42
+
43
+ </div>
44
+ </aside>
45
+
46
+ {/if}
@@ -1,5 +1,15 @@
1
+ <script lang="ts">
2
+ import { Position } from "$lib/models/Enums";
3
+
4
+ export let textCss = "text-secundary-500"
5
+ export let label = "";
6
+ export let position:Position = Position.start
7
+
8
+ </script>
9
+
10
+ <div class="flex justify-{position} items-{position} h-full w-full gap-5 pt-2">
1
11
  <div
2
- class="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite] text-secundary-500"
12
+ class="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite] {textCss}"
3
13
  role="status"
4
14
  >
5
15
  <span
@@ -7,3 +17,6 @@
7
17
  >Loading...</span
8
18
  >
9
19
  </div>
20
+ <span>{label}</span>
21
+ </div>
22
+
@@ -8,10 +8,10 @@
8
8
  --theme-rounded-container: 4px;
9
9
  --theme-border-base: 1px;
10
10
  /* =~= Theme On-X Colors =~= */
11
- --on-primary: 0 0 0;
12
- --on-secondary: 0 0 0;
11
+ --on-primary: 255 255 255;
12
+ --on-secondary: 255 255 255;
13
13
  --on-tertiary: 0 0 0;
14
- --on-success: 0 0 0;
14
+ --on-success: 255 255 255;
15
15
  --on-warning: 255 255 255;
16
16
  --on-error: 255 255 255;
17
17
  --on-surface: 0 0 0;
package/src/lib/index.ts CHANGED
@@ -9,6 +9,7 @@ import FileUploader from './components/file/FileUploader.svelte';
9
9
  //page
10
10
  import Spinner from './components/spinner/Spinner.svelte';
11
11
  import Page from './components/page/Page.svelte';
12
+ import Alert from './components/page/Alert.svelte';
12
13
 
13
14
  // input
14
15
  import Checkbox from './components/form/Checkbox.svelte';
@@ -43,7 +44,7 @@ export {
43
44
  export { FileInfo, FileIcon, FileUploader };
44
45
 
45
46
  //others
46
- export { ListView, TableView, Spinner, Page };
47
+ export { ListView, TableView, Spinner, Page, Alert };
47
48
 
48
49
  //Api
49
50
  export { Api } from './services/Api.js';
@@ -0,0 +1,6 @@
1
+
2
+ export enum Position {
3
+ start = "start",
4
+ end = "end",
5
+ center = "center"
6
+ }
@@ -1,78 +1,88 @@
1
- import type { SvelteComponent } from 'svelte';
2
- import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
3
- import type { Writable } from 'svelte/store';
4
-
5
- // page
6
- export interface Link
7
- {
8
- label:string,
9
- url:string
10
- }
11
-
12
- // Form
13
- export interface Input {
14
- id: string;
15
- label: string;
16
- feedback: string[];
17
- invalid: boolean;
18
- valid: boolean;
19
- required: boolean;
20
- }
21
-
22
- export interface FileInfo {
23
- name: string;
24
- type: string;
25
- length: number;
26
- description: string;
27
- validationHash: string;
28
- }
29
-
30
- export interface FileUploaderModel {
31
- accept: string[];
32
- existingFiles: FileInfo[];
33
- descriptionType: number;
34
- multiple: boolean;
35
- maxSize: number;
36
- lastModification: Date;
37
- }
38
-
39
- export interface Files {
40
- accepted: Blob[];
41
- rejected: Blob[];
42
- }
43
-
44
- export type user = {
45
- name: string;
46
- };
47
-
48
- export interface FileObj {
49
- path: string;
50
- lastModified: number;
51
- lastModifiedDate: Date;
52
- name: string;
53
- size: number;
54
- type: string;
55
- webkitRelativePath: string;
56
- }
57
-
58
- // Table column type
59
- export interface Column {
60
- header?: string;
61
- exclude?: boolean;
62
- colFilterFn?: ColumnFilterFn;
63
- colFilterComponent?: typeof SvelteComponent;
64
- }
65
-
66
- export interface Columns {
67
- [key: string]: Column;
68
- }
69
-
70
- // Table config type
71
- export interface TableConfig<T> {
72
- id: string;
73
- data: Writable<T[]>;
74
- columns?: Columns;
75
- pageSizes?: number[];
76
- defaultPageSize?: number;
77
- optionsComponent?: typeof SvelteComponent;
78
- }
1
+ import type { SvelteComponent } from 'svelte';
2
+ import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
3
+ import type { Writable } from 'svelte/store';
4
+
5
+ // page
6
+ export interface Link
7
+ {
8
+ label:string,
9
+ url:string
10
+ }
11
+
12
+
13
+ // Form
14
+ export interface Input {
15
+ id: string;
16
+ label: string;
17
+ feedback: string[];
18
+ invalid: boolean;
19
+ valid: boolean;
20
+ required: boolean;
21
+ }
22
+
23
+ export interface FileInfo {
24
+ name: string;
25
+ type: string;
26
+ length: number;
27
+ description: string;
28
+ validationHash: string;
29
+ }
30
+
31
+ export interface FileUploaderModel {
32
+ accept: string[];
33
+ existingFiles: FileInfo[];
34
+ descriptionType: number;
35
+ multiple: boolean;
36
+ maxSize: number;
37
+ lastModification: Date;
38
+ }
39
+
40
+ export interface Files {
41
+ accepted: Blob[];
42
+ rejected: Blob[];
43
+ }
44
+
45
+ export type user = {
46
+ name: string;
47
+ };
48
+
49
+ export interface FileObj {
50
+ path: string;
51
+ lastModified: number;
52
+ lastModifiedDate: Date;
53
+ name: string;
54
+ size: number;
55
+ type: string;
56
+ webkitRelativePath: string;
57
+ }
58
+
59
+ export interface ColumnInstructions {
60
+ toStringFn?: (value: any) => string;
61
+ toSortableValueFn?: (value: any) => string | number;
62
+ toFilterableValueFn?: (value: any) => string | number | Date;
63
+ }
64
+
65
+ // Table column type
66
+ export interface Column {
67
+ header?: string;
68
+ exclude?: boolean; // false by default
69
+ instructions?: ColumnInstructions;
70
+ disableFiltering?: boolean; // false by default
71
+ disableSorting?: boolean; // false by default
72
+ colFilterFn?: ColumnFilterFn;
73
+ colFilterComponent?: typeof SvelteComponent;
74
+ }
75
+
76
+ export interface Columns {
77
+ [key: string]: Column;
78
+ }
79
+
80
+ // Table config type
81
+ export interface TableConfig<T> {
82
+ id: string;
83
+ data: Writable<T[]>;
84
+ columns?: Columns;
85
+ pageSizes?: number[];
86
+ defaultPageSize?: number;
87
+ optionsComponent?: typeof SvelteComponent;
88
+ }