@lavalogic/scoria 0.32.0 → 0.33.0

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.
@@ -0,0 +1,104 @@
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="CommonDenominator"
6
+ >
7
+ import AccordionGroupButton from './AccordionGroupButton.svelte';
8
+
9
+ import { cubicInOut, linear } from 'svelte/easing';
10
+ import type { AccordionGroupProps } from './AccordionGroupProps.js';
11
+
12
+ let {
13
+ // name: _name, //FIXME why is this not implemented?
14
+ tabs,
15
+ selected,
16
+ noRadius = false,
17
+ grow = false,
18
+ }: AccordionGroupProps<CommonDenominator> = $props();
19
+
20
+ /**
21
+ * Animates the opacity and scale of an element. `in` transitions animate from the provided values, passed as parameters, to an element's current (default) values. `out` transitions animate from an element's default values to the provided values.
22
+ *
23
+ * @param {Element} node
24
+ * @param {ScaleParams} [params]
25
+ * @returns {TransitionConfig}
26
+ */
27
+ export function scale(_node: Element, { delay = 0, duration = 400, easing = cubicInOut } = {}) {
28
+ // const transform = style.transform === 'none' ? '' : style.transform;
29
+
30
+ return {
31
+ delay,
32
+ duration,
33
+ easing,
34
+ css: (t: number, _u: number) => {
35
+ return `max-height: ${t * 100}%;
36
+ opacity: ${t}`;
37
+ },
38
+ };
39
+ }
40
+ </script>
41
+
42
+ <div
43
+ class="wrapper"
44
+ class:no-radius={noRadius}
45
+ class:grow
46
+ >
47
+ {#each tabs as option (option)}
48
+ {@const isSelected = selected === option}
49
+ <AccordionGroupButton
50
+ {option}
51
+ {noRadius}
52
+ selected={isSelected}
53
+ />
54
+ {#if isSelected}
55
+ <div transition:scale={{ duration: 300, easing: linear }}>
56
+ {@render selected.content(selected.args)}
57
+ </div>
58
+ {/if}
59
+ {/each}
60
+ </div>
61
+
62
+ <style>.wrapper {
63
+ box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.1333333333);
64
+ border-radius: 4px;
65
+ display: flex;
66
+ flex-flow: column nowrap;
67
+ overflow: auto;
68
+ }
69
+ .wrapper.no-radius {
70
+ border-radius: 0;
71
+ }
72
+ .wrapper.no-radius .tabs {
73
+ border-radius: 0;
74
+ }
75
+ .wrapper.no-radius .content {
76
+ border-radius: 0;
77
+ }
78
+ .wrapper.grow {
79
+ flex-grow: 1;
80
+ }
81
+ .wrapper:not(.grow) .tabs {
82
+ padding-top: 1px;
83
+ }
84
+ .wrapper .sticky {
85
+ position: sticky;
86
+ top: 0;
87
+ z-index: 2;
88
+ }
89
+ .wrapper .tabs {
90
+ border-radius: 4px 0 0 4px;
91
+ display: flex;
92
+ flex-flow: column nowrap;
93
+ gap: 1px;
94
+ min-width: 10rem;
95
+ background-color: #e9ecf1;
96
+ border-right: solid 1px #cbd4da;
97
+ overflow: auto;
98
+ flex-shrink: 0;
99
+ }
100
+ .wrapper .content {
101
+ flex-grow: 1;
102
+ overflow: visible;
103
+ border-radius: 0 4px 0 4px;
104
+ }</style>
@@ -0,0 +1,48 @@
1
+ import { cubicInOut } from 'svelte/easing';
2
+ import type { AccordionGroupProps } from './AccordionGroupProps.js';
3
+ declare function $$render<CommonDenominator>(): {
4
+ props: AccordionGroupProps<CommonDenominator>;
5
+ exports: {
6
+ scale: (_node: Element, { delay, duration, easing }?: {
7
+ delay?: number | undefined;
8
+ duration?: number | undefined;
9
+ easing?: typeof cubicInOut | undefined;
10
+ }) => {
11
+ delay: number;
12
+ duration: number;
13
+ easing: typeof cubicInOut;
14
+ css: (t: number, _u: number) => string;
15
+ };
16
+ };
17
+ bindings: "";
18
+ slots: {};
19
+ events: {};
20
+ };
21
+ declare class __sveltets_Render<CommonDenominator> {
22
+ props(): ReturnType<typeof $$render<CommonDenominator>>['props'];
23
+ events(): ReturnType<typeof $$render<CommonDenominator>>['events'];
24
+ slots(): ReturnType<typeof $$render<CommonDenominator>>['slots'];
25
+ bindings(): "";
26
+ exports(): {
27
+ scale: (_node: Element, { delay, duration, easing }?: {
28
+ delay?: number | undefined;
29
+ duration?: number | undefined;
30
+ easing?: typeof cubicInOut | undefined;
31
+ }) => {
32
+ delay: number;
33
+ duration: number;
34
+ easing: typeof cubicInOut;
35
+ css: (t: number, _u: number) => string;
36
+ };
37
+ };
38
+ }
39
+ interface $$IsomorphicComponent {
40
+ new <CommonDenominator>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<CommonDenominator>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<CommonDenominator>['props']>, ReturnType<__sveltets_Render<CommonDenominator>['events']>, ReturnType<__sveltets_Render<CommonDenominator>['slots']>> & {
41
+ $$bindings?: ReturnType<__sveltets_Render<CommonDenominator>['bindings']>;
42
+ } & ReturnType<__sveltets_Render<CommonDenominator>['exports']>;
43
+ <CommonDenominator>(internal: unknown, props: ReturnType<__sveltets_Render<CommonDenominator>['props']> & {}): ReturnType<__sveltets_Render<CommonDenominator>['exports']>;
44
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
45
+ }
46
+ declare const AccordionGroup: $$IsomorphicComponent;
47
+ type AccordionGroup<CommonDenominator> = InstanceType<typeof AccordionGroup<CommonDenominator>>;
48
+ export default AccordionGroup;
@@ -0,0 +1,130 @@
1
+ <svelte:options runes />
2
+
3
+ <script
4
+ lang="ts"
5
+ generics="Args"
6
+ >
7
+ import { devCatch } from '../Helpers/Helpers.svelte.js';
8
+ import { Colour } from '../scss/colours.js';
9
+ import { Size } from '../Types/Internal/Size.js';
10
+ import Icon from './Icon.svelte';
11
+ import type { TabGroupButtonProps } from './TabGroupButtonProps.js';
12
+
13
+ let { option, selected, noRadius = false }: TabGroupButtonProps<Args> = $props();
14
+
15
+ let disabled = $state(true);
16
+ let visible = $state(true);
17
+ let isValid = $state(true);
18
+
19
+ $effect(() => {
20
+ if (typeof option.isValid === 'boolean') {
21
+ isValid = option.isValid;
22
+ } else {
23
+ option.isValid
24
+ ?.then((v) => {
25
+ isValid = v;
26
+ })
27
+ .catch(devCatch);
28
+ }
29
+ });
30
+ $effect(() => {
31
+ if (typeof option.disabled === 'boolean') {
32
+ disabled = option.disabled;
33
+ } else if (option.disabled == undefined) {
34
+ disabled = false;
35
+ } else {
36
+ option.disabled
37
+ .then((v) => {
38
+ disabled = v;
39
+ })
40
+ .catch(devCatch);
41
+ }
42
+ });
43
+
44
+ $effect(() => {
45
+ if (typeof option.visible === 'boolean') {
46
+ visible = option.visible;
47
+ } else if (option.visible == undefined) {
48
+ visible = true;
49
+ } else {
50
+ option.visible
51
+ .then((v) => {
52
+ visible = v;
53
+ })
54
+ .catch(devCatch);
55
+ }
56
+ });
57
+ </script>
58
+
59
+ <button
60
+ class:selected
61
+ onclick={() => {
62
+ option.onclick();
63
+ }}
64
+ type="button"
65
+ class="tab"
66
+ class:invalid={!isValid}
67
+ {disabled}
68
+ class:hidden={!visible}
69
+ class:no-radius={noRadius}
70
+ >
71
+ <div class="selected-marker"></div>
72
+ <!-- <Icon
73
+ name="nothing"
74
+ colour={Colour['$brand-primary']}
75
+ size={Size.Small}
76
+ {...option.iconLeft}
77
+ /> -->
78
+
79
+ {option.label}
80
+ {#if !isValid}
81
+ <Icon
82
+ name="error"
83
+ colour={Colour['$error-border']}
84
+ size={Size.Small}
85
+ />
86
+ <!-- {:else}
87
+ <Icon
88
+ name="nothing"
89
+ colour={Colour['$brand-primary']}
90
+ size={Size.Small}
91
+ {...option.iconRight}
92
+ /> -->
93
+ {/if}
94
+ </button>
95
+
96
+ <style>button.tab.hidden {
97
+ display: none !important;
98
+ }
99
+
100
+ .tab {
101
+ color: #3a4952;
102
+ cursor: pointer;
103
+ font-size: 1rem;
104
+ font-weight: 500;
105
+ padding: 1rem;
106
+ background-color: #ffffff;
107
+ border: none;
108
+ text-align: start;
109
+ display: flex;
110
+ flex-flow: row nowrap;
111
+ flex-shrink: 1;
112
+ align-items: center;
113
+ width: 100%;
114
+ gap: 0.5rem;
115
+ position: relative;
116
+ transition: border-color ease-out 0.15s 0s, background-color ease-out 0.15s 0s, color ease-out 0.15s 0s, fill ease-out 0.15s 0s;
117
+ }
118
+ .tab.selected {
119
+ color: #259fc7;
120
+ }
121
+ .tab:hover, .tab.selected:hover {
122
+ color: #49b8dc;
123
+ background-color: #f4f7f9;
124
+ }
125
+ .tab:not(.no-radius):first-child {
126
+ border-radius: 4px 0 0 0;
127
+ }
128
+ .tab:hover, .tab.selected:hover, .tab.invalid:hover {
129
+ background-color: #f4f7f9;
130
+ }</style>
@@ -0,0 +1,25 @@
1
+ import type { TabGroupButtonProps } from './TabGroupButtonProps.js';
2
+ declare function $$render<Args>(): {
3
+ props: TabGroupButtonProps<Args>;
4
+ exports: {};
5
+ bindings: "";
6
+ slots: {};
7
+ events: {};
8
+ };
9
+ declare class __sveltets_Render<Args> {
10
+ props(): ReturnType<typeof $$render<Args>>['props'];
11
+ events(): ReturnType<typeof $$render<Args>>['events'];
12
+ slots(): ReturnType<typeof $$render<Args>>['slots'];
13
+ bindings(): "";
14
+ exports(): {};
15
+ }
16
+ interface $$IsomorphicComponent {
17
+ new <Args>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Args>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Args>['props']>, ReturnType<__sveltets_Render<Args>['events']>, ReturnType<__sveltets_Render<Args>['slots']>> & {
18
+ $$bindings?: ReturnType<__sveltets_Render<Args>['bindings']>;
19
+ } & ReturnType<__sveltets_Render<Args>['exports']>;
20
+ <Args>(internal: unknown, props: ReturnType<__sveltets_Render<Args>['props']> & {}): ReturnType<__sveltets_Render<Args>['exports']>;
21
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
22
+ }
23
+ declare const AccordionGroupButton: $$IsomorphicComponent;
24
+ type AccordionGroupButton<Args> = InstanceType<typeof AccordionGroupButton<Args>>;
25
+ export default AccordionGroupButton;
@@ -0,0 +1,8 @@
1
+ import type { TabOption } from '../Types/Internal/TabOption.js';
2
+ export interface AccordionGroupProps<CommonDenominator> {
3
+ name?: string;
4
+ noRadius?: boolean;
5
+ grow?: boolean;
6
+ tabs: Array<TabOption<CommonDenominator>>;
7
+ selected: TabOption<CommonDenominator> | undefined;
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -78,10 +78,9 @@ export function generateExampleItemColumnDefs(modal) {
78
78
  id: 'orderLineStatus',
79
79
  header: 'Order Line Status',
80
80
  allowSorting: true,
81
- debug: true,
82
81
  accessorFn: statusAccessorFn,
83
82
  filterValueType: 'Select',
84
- getOptions: async () => {
83
+ getOptions: () => {
85
84
  void uuidByIndex.size;
86
85
  const mapped = [
87
86
  { label: 'Pending', value: 'Pending' },
@@ -127,6 +126,10 @@ export function generateExampleItemColumnDefs(modal) {
127
126
  : [];
128
127
  },
129
128
  isValid,
129
+ filterFn: (row, index, value) => {
130
+ console.log(value);
131
+ return false;
132
+ },
130
133
  }),
131
134
  new TextInputDef({
132
135
  header: 'Name',
@@ -9,7 +9,7 @@ export interface QueryDefProps<T extends object, in FilterValueType = unknown, o
9
9
  export declare class QueryDef<T extends object, FilterValueType = unknown, out FilterOptionsType = unknown> extends AccessorDef<T, FilterValueType, FilterOptionsType> {
10
10
  readonly accessorType: "Query";
11
11
  constructor(props: QueryDefProps<T, FilterValueType, FilterOptionsType>);
12
- filterFn: FilterFn<T, FilterValueType> | undefined;
12
+ readonly filterFn: FilterFn<T, FilterValueType> | undefined;
13
13
  getDisplayValue: (item: T, index: number) => string | null | Promise<string | null>;
14
14
  readonly query: (queryString: string, item: T, index: number) => Promise<Array<SelectOption<unknown>>>;
15
15
  readonly clearable: boolean;
@@ -5,8 +5,10 @@ export class QueryDef extends AccessorDef {
5
5
  constructor(props) {
6
6
  super(props);
7
7
  this.query = $derived(props.query);
8
+ this.filterFn = $derived(props.filterFn);
8
9
  this.clearable = $derived(props.clearable ?? true);
9
10
  }
11
+ filterFn;
10
12
  query;
11
13
  clearable;
12
14
  }
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export { default as AccordionGroup } from './Components/AccordionGroup.svelte';
2
+ export type { AccordionGroupProps } from './Components/AccordionGroupProps.js';
1
3
  export { default as Action } from './Components/Action.svelte';
2
4
  export { default as AlertModal } from './Components/AlertModal.svelte';
3
5
  export { default as ContextWrapper } from './Components/Base/ContextWrapper.svelte';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { default as AccordionGroup } from './Components/AccordionGroup.svelte';
1
2
  export { default as Action } from './Components/Action.svelte';
2
3
  export { default as AlertModal } from './Components/AlertModal.svelte';
3
4
  export { default as ContextWrapper } from './Components/Base/ContextWrapper.svelte';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@lavalogic/scoria",
3
3
  "description": "Svelte components used for the FloWMS Web Frontend",
4
- "version": "0.32.0",
4
+ "version": "0.33.0",
5
5
  "publishConfig": {
6
6
  "access": "restricted"
7
7
  },