@humandialog/forms.svelte 0.4.45 → 0.5.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/components/Fab.svelte +60 -48
- package/components/Floating_container.svelte +5 -4
- package/components/Floating_container.svelte.d.ts +2 -2
- package/components/Grid.menu.svelte +13 -9
- package/components/Grid.menu.svelte.d.ts +2 -2
- package/components/button.svelte +4 -4
- package/components/checkbox.svelte +12 -10
- package/components/checkbox.svelte.d.ts +1 -0
- package/components/combo/combo.d.ts +1 -1
- package/components/combo/combo.js +1 -1
- package/components/combo/combo.source.svelte +2 -2
- package/components/combo/combo.source.svelte.d.ts +1 -1
- package/components/combo/combo.svelte +92 -61
- package/components/combo/combo.svelte.d.ts +7 -4
- package/components/contextmenu.svelte +20 -19
- package/components/contextmenu.svelte.d.ts +5 -5
- package/components/date.svelte +40 -25
- package/components/date.svelte.d.ts +3 -2
- package/components/delayed.spinner.svelte +2 -2
- package/components/document/internal/palette.row.svelte +3 -3
- package/components/document/internal/palette.svelte +2 -2
- package/components/document/internal/palette.svelte.d.ts +1 -1
- package/components/document/rich.edit.svelte +307 -35
- package/components/document/rich.edit.svelte.d.ts +9 -0
- package/components/edit.field.svelte +17 -15
- package/components/edit.field.svelte.d.ts +2 -1
- package/components/file.loader.svelte +6 -6
- package/components/file.loader.svelte.d.ts +10 -10
- package/components/icon.svelte +2 -2
- package/components/icon.svelte.d.ts +3 -3
- package/components/input.text.svelte +3 -3
- package/components/inputbox.ltop.svelte +19 -17
- package/components/inputbox.ltop.svelte.d.ts +4 -2
- package/components/kanban/Kanban.d.ts +23 -0
- package/components/kanban/Kanban.js +23 -0
- package/components/kanban/internal/kanban.card.svelte +158 -0
- package/components/kanban/internal/kanban.card.svelte.d.ts +35 -0
- package/components/kanban/internal/kanban.column.svelte +181 -0
- package/components/kanban/internal/kanban.column.svelte.d.ts +51 -0
- package/components/kanban/internal/kanban.inserter.svelte +24 -0
- package/components/kanban/internal/kanban.inserter.svelte.d.ts +18 -0
- package/components/kanban/internal/kanban.move.menu.svelte +146 -0
- package/components/kanban/internal/kanban.move.menu.svelte.d.ts +19 -0
- package/components/kanban/kanban.callbacks.svelte +15 -0
- package/components/kanban/kanban.callbacks.svelte.d.ts +21 -0
- package/components/kanban/kanban.column.svelte +20 -0
- package/components/kanban/kanban.column.svelte.d.ts +21 -0
- package/components/kanban/kanban.summary.svelte +5 -0
- package/components/kanban/kanban.summary.svelte.d.ts +16 -0
- package/components/kanban/kanban.svelte +156 -0
- package/components/kanban/kanban.svelte.d.ts +43 -0
- package/components/kanban/kanban.title.svelte +8 -0
- package/components/kanban/kanban.title.svelte.d.ts +17 -0
- package/components/list/List.d.ts +4 -2
- package/components/list/List.js +4 -2
- package/components/list/internal/list.element.props.svelte +7 -8
- package/components/list/internal/list.element.props.svelte.d.ts +2 -2
- package/components/list/internal/list.element.summary.svelte +4 -4
- package/components/list/internal/list.element.summary.svelte.d.ts +1 -1
- package/components/list/internal/list.element.svelte +61 -49
- package/components/list/internal/list.element.svelte.d.ts +4 -4
- package/components/list/internal/list.inserter.svelte +9 -6
- package/components/list/internal/list.inserter.svelte.d.ts +1 -1
- package/components/list/list.combo.svelte +2 -2
- package/components/list/list.combo.svelte.d.ts +1 -1
- package/components/list/list.date.svelte +2 -2
- package/components/list/list.date.svelte.d.ts +1 -1
- package/components/list/list.inserter.svelte +1 -1
- package/components/list/list.summary.svelte +2 -2
- package/components/list/list.summary.svelte.d.ts +1 -1
- package/components/list/list.svelte +173 -35
- package/components/list/list.svelte.d.ts +27 -10
- package/components/list/list.title.svelte +6 -2
- package/components/list/list.title.svelte.d.ts +3 -1
- package/components/menu.d.ts +4 -4
- package/components/menu.js +15 -13
- package/components/radio.svelte +12 -10
- package/components/radio.svelte.d.ts +1 -0
- package/components/sidebar/sidebar.group.svelte +1 -13
- package/components/sidebar/sidebar.group.svelte.d.ts +0 -4
- package/components/sidebar/sidebar.item.svelte +13 -13
- package/components/sidebar/sidebar.list.svelte +68 -0
- package/components/sidebar/sidebar.list.svelte.d.ts +33 -0
- package/components/sidebar/sidebar.svelte +1 -1
- package/components/simple.table.svelte +15 -15
- package/components/simple.table.svelte.d.ts +2 -2
- package/components/table/_template.table.svelte +17 -17
- package/components/table/_template.table.svelte.d.ts +2 -2
- package/components/table/table.svelte +31 -31
- package/components/table/table.svelte.d.ts +8 -8
- package/components/textarea.ltop.svelte +4 -4
- package/components/tile.title.svelte +6 -6
- package/desk.svelte +13 -13
- package/form.box.svelte +2 -2
- package/horizontal.toolbar.svelte +24 -15
- package/horizontal.toolbar.svelte.d.ts +2 -2
- package/index.d.ts +14 -5
- package/index.js +14 -5
- package/modal.svelte +17 -17
- package/modal.svelte.d.ts +4 -4
- package/operations.svelte +42 -27
- package/package.json +12 -1
- package/page.svelte +115 -124
- package/page.svelte.d.ts +4 -4
- package/stores.d.ts +9 -7
- package/stores.js +17 -9
- package/tenant.members.svelte +44 -44
- package/tenant.members.svelte.d.ts +10 -10
- package/tile.svelte +3 -3
- package/tiles.vertical.row.svelte +1 -1
- package/updates.d.ts +3 -3
- package/updates.js +35 -3
- package/utils.d.ts +22 -13
- package/utils.js +198 -50
- package/vertical.toolbar.svelte +22 -13
- package/vertical.toolbar.svelte.d.ts +2 -2
package/components/icon.svelte
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<svelte:options accessors={true}/>
|
|
2
2
|
<script>import { icons } from "../utils.js";
|
|
3
3
|
export let component = null;
|
|
4
|
-
export let
|
|
4
|
+
export let moduleName = "fa/FaQuestion";
|
|
5
5
|
export let img = "";
|
|
6
6
|
export let label = "";
|
|
7
7
|
export let symbol = "";
|
|
@@ -89,7 +89,7 @@ $: {
|
|
|
89
89
|
{#if component != null}
|
|
90
90
|
<svelte:component this={component} />
|
|
91
91
|
{:else if txt}
|
|
92
|
-
<div class="m-0 p-0 font-sans font-bold flex flex-col justify-center text-center w-full h-full text-
|
|
92
|
+
<div class="m-0 p-0 font-sans font-bold flex flex-col justify-center text-center w-full h-full text-stone-900"
|
|
93
93
|
style:font-size={`${size/8}rem`}
|
|
94
94
|
>
|
|
95
95
|
<div>{txt}</div>
|
|
@@ -3,7 +3,7 @@ declare const __propDef: {
|
|
|
3
3
|
props: {
|
|
4
4
|
[x: string]: any;
|
|
5
5
|
component?: null | undefined;
|
|
6
|
-
|
|
6
|
+
moduleName?: string | undefined;
|
|
7
7
|
img?: string | undefined;
|
|
8
8
|
label?: string | undefined;
|
|
9
9
|
symbol?: string | undefined;
|
|
@@ -34,9 +34,9 @@ export default class Icon extends SvelteComponentTyped<IconProps, IconEvents, Ic
|
|
|
34
34
|
get component(): null | undefined;
|
|
35
35
|
/**accessor*/
|
|
36
36
|
set component(_: null | undefined);
|
|
37
|
-
get
|
|
37
|
+
get moduleName(): string | undefined;
|
|
38
38
|
/**accessor*/
|
|
39
|
-
set
|
|
39
|
+
set moduleName(_: string | undefined);
|
|
40
40
|
get img(): string | undefined;
|
|
41
41
|
/**accessor*/
|
|
42
42
|
set img(_: string | undefined);
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
|
|
31
31
|
{#if i!= null}
|
|
32
32
|
<input type=text value={value} on:input={()=> ($data_tick_store = $data_tick_store + 1)}
|
|
33
|
-
class="bg-
|
|
34
|
-
focus:ring-primary-600 focus:border-primary-600 block w-full {input_pb} {input_pt} px-2.5 dark:bg-
|
|
35
|
-
dark:border-
|
|
33
|
+
class="bg-stone-50 border border-stone-300 text-stone-900 text-sm rounded-lg
|
|
34
|
+
focus:ring-primary-600 focus:border-primary-600 block w-full {input_pb} {input_pt} px-2.5 dark:bg-stone-700
|
|
35
|
+
dark:border-stone-600 dark:placeholder-stone-400 dark:text-white dark:focus:ring-primary-500 dark:focus:border-primary-500"
|
|
36
36
|
placeholder={placeholder}>
|
|
37
37
|
{/if}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import {data_tick_store,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import {data_tick_store, contextItemsStore, contextTypesStore} from '../stores.js'
|
|
3
|
+
import {informModification, pushChanges} from '../updates.js'
|
|
4
|
+
import {parseWidthDirective} from '../utils.js'
|
|
5
5
|
import {getContext} from 'svelte';
|
|
6
6
|
import Rich_edit from './document/rich.edit.svelte'
|
|
7
7
|
|
|
@@ -18,19 +18,20 @@
|
|
|
18
18
|
export let val = ''
|
|
19
19
|
|
|
20
20
|
export let placeholder = 'pl'
|
|
21
|
+
export let pushChangesImmediately = true;
|
|
21
22
|
|
|
22
23
|
export let s = 'sm'
|
|
23
24
|
export let c = ''
|
|
24
|
-
export let
|
|
25
|
+
export let validateCb = undefined;
|
|
25
26
|
export function validate()
|
|
26
27
|
{
|
|
27
|
-
if(!
|
|
28
|
+
if(!validateCb)
|
|
28
29
|
{
|
|
29
30
|
invalid = false;
|
|
30
31
|
return true;
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
invalid = !
|
|
34
|
+
invalid = !validateCb(val);
|
|
34
35
|
return !invalid;
|
|
35
36
|
}
|
|
36
37
|
|
|
@@ -50,11 +51,11 @@
|
|
|
50
51
|
break;
|
|
51
52
|
}
|
|
52
53
|
|
|
53
|
-
let cs = c ?
|
|
54
|
+
let cs = c ? parseWidthDirective(c) : 'col-span-1';
|
|
54
55
|
let ctx = context ? context : getContext('ctx');
|
|
55
56
|
|
|
56
57
|
let last_tick = -1
|
|
57
|
-
let border_style = "border-
|
|
58
|
+
let border_style = "border-stone-300 dark:border-stone-600"
|
|
58
59
|
|
|
59
60
|
$:{
|
|
60
61
|
if($data_tick_store > last_tick)
|
|
@@ -64,10 +65,10 @@
|
|
|
64
65
|
function setup()
|
|
65
66
|
{
|
|
66
67
|
last_tick = $data_tick_store;
|
|
67
|
-
item = self ?? $
|
|
68
|
+
item = self ?? $contextItemsStore[ctx];
|
|
68
69
|
|
|
69
70
|
if(!typename)
|
|
70
|
-
typename = $
|
|
71
|
+
typename = $contextTypesStore[ctx];
|
|
71
72
|
|
|
72
73
|
if(item && a)
|
|
73
74
|
val = item[a]
|
|
@@ -86,14 +87,15 @@
|
|
|
86
87
|
item[a] = val
|
|
87
88
|
|
|
88
89
|
if(typename)
|
|
89
|
-
|
|
90
|
+
informModification(item, a, typename);
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
function accept_change()
|
|
94
95
|
{
|
|
95
96
|
$data_tick_store = $data_tick_store + 1;
|
|
96
|
-
|
|
97
|
+
if(pushChangesImmediately)
|
|
98
|
+
pushChanges();
|
|
97
99
|
|
|
98
100
|
}
|
|
99
101
|
|
|
@@ -107,9 +109,9 @@
|
|
|
107
109
|
</script>
|
|
108
110
|
|
|
109
111
|
{#if itype == 'text'}
|
|
110
|
-
{@const border_style = invalid ? "border-red-300 dark:border-red-600" : "border-
|
|
112
|
+
{@const border_style = invalid ? "border-red-300 dark:border-red-600" : "border-stone-300 dark:border-stone-600" }
|
|
111
113
|
<div class={cs}>
|
|
112
|
-
<label for="name" class="block {label_mb} text-xs font-small text-
|
|
114
|
+
<label for="name" class="block {label_mb} text-xs font-small text-stone-900 dark:text-white">{label}</label>
|
|
113
115
|
|
|
114
116
|
<input type=text name="name" id="name"
|
|
115
117
|
bind:value={val}
|
|
@@ -117,12 +119,12 @@
|
|
|
117
119
|
on:blur={() => { accept_change();} }
|
|
118
120
|
on:keydown={(e)=>{check_validity();}}
|
|
119
121
|
|
|
120
|
-
class=" bg-
|
|
122
|
+
class=" bg-stone-50 dark:bg-stone-700
|
|
121
123
|
border {border_style} rounded-lg
|
|
122
124
|
focus:ring-primary-600 focus:border-primary-600 dark:focus:ring-primary-500 dark:focus:border-primary-500
|
|
123
|
-
text-
|
|
125
|
+
text-stone-900 dark:text-white text-sm
|
|
124
126
|
block w-full {input_pb} {input_pt} px-2.5
|
|
125
|
-
dark:placeholder-
|
|
127
|
+
dark:placeholder-stone-400"
|
|
126
128
|
|
|
127
129
|
placeholder={placeholder}>
|
|
128
130
|
</div>
|
|
@@ -10,11 +10,12 @@ export default class Inputbox extends SvelteComponentTyped<{
|
|
|
10
10
|
c?: string | undefined;
|
|
11
11
|
typename?: string | undefined;
|
|
12
12
|
a?: string | undefined;
|
|
13
|
+
pushChangesImmediately?: boolean | undefined;
|
|
13
14
|
s?: string | undefined;
|
|
14
15
|
placeholder?: string | undefined;
|
|
15
16
|
itype?: string | undefined;
|
|
16
17
|
val?: string | undefined;
|
|
17
|
-
|
|
18
|
+
validateCb?: any;
|
|
18
19
|
validate?: (() => boolean) | undefined;
|
|
19
20
|
}, {
|
|
20
21
|
[evt: string]: CustomEvent<any>;
|
|
@@ -35,11 +36,12 @@ declare const __propDef: {
|
|
|
35
36
|
c?: string | undefined;
|
|
36
37
|
typename?: string | undefined;
|
|
37
38
|
a?: string | undefined;
|
|
39
|
+
pushChangesImmediately?: boolean | undefined;
|
|
38
40
|
s?: string | undefined;
|
|
39
41
|
placeholder?: string | undefined;
|
|
40
42
|
itype?: string | undefined;
|
|
41
43
|
val?: string | undefined;
|
|
42
|
-
|
|
44
|
+
validateCb?: any;
|
|
43
45
|
validate?: (() => boolean) | undefined;
|
|
44
46
|
};
|
|
45
47
|
events: {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class rKanban_column {
|
|
2
|
+
id: number;
|
|
3
|
+
title: string;
|
|
4
|
+
width: string;
|
|
5
|
+
self: object | undefined;
|
|
6
|
+
a: string;
|
|
7
|
+
objects: object[] | undefined;
|
|
8
|
+
context: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class rKanban_definition {
|
|
11
|
+
columns: rKanban_column[];
|
|
12
|
+
titleAttrib: string;
|
|
13
|
+
titleOnChange: Function | undefined;
|
|
14
|
+
summaryAttrib: string;
|
|
15
|
+
onUp: Function | undefined;
|
|
16
|
+
onDown: Function | undefined;
|
|
17
|
+
onAdd: Function | undefined;
|
|
18
|
+
onRemove: Function | undefined;
|
|
19
|
+
onReplace: Function | undefined;
|
|
20
|
+
onOpen: Function | undefined;
|
|
21
|
+
}
|
|
22
|
+
export declare const KanbanColumnTop = -1;
|
|
23
|
+
export declare const KanbanColumnBottom = -2;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class rKanban_column {
|
|
2
|
+
id;
|
|
3
|
+
title = '';
|
|
4
|
+
width = 'w-[240px]';
|
|
5
|
+
self = undefined;
|
|
6
|
+
a = '';
|
|
7
|
+
objects = undefined;
|
|
8
|
+
context = '';
|
|
9
|
+
}
|
|
10
|
+
export class rKanban_definition {
|
|
11
|
+
columns = [];
|
|
12
|
+
titleAttrib = '';
|
|
13
|
+
titleOnChange = undefined;
|
|
14
|
+
summaryAttrib = '';
|
|
15
|
+
onUp = undefined;
|
|
16
|
+
onDown = undefined;
|
|
17
|
+
onAdd = undefined;
|
|
18
|
+
onRemove = undefined;
|
|
19
|
+
onReplace = undefined;
|
|
20
|
+
onOpen = undefined;
|
|
21
|
+
}
|
|
22
|
+
export const KanbanColumnTop = -1;
|
|
23
|
+
export const KanbanColumnBottom = -2;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
<script>import { getContext } from "svelte";
|
|
2
|
+
import {
|
|
3
|
+
contextItemsStore,
|
|
4
|
+
isActive,
|
|
5
|
+
isSelected,
|
|
6
|
+
activateItem,
|
|
7
|
+
selectable,
|
|
8
|
+
editable,
|
|
9
|
+
showFloatingToolbar
|
|
10
|
+
} from "../../..";
|
|
11
|
+
import { FaArrowsAlt, FaTrash, FaPlus, FaAlignLeft } from "svelte-icons/fa";
|
|
12
|
+
import MoveOperations from "./kanban.move.menu.svelte";
|
|
13
|
+
export let item;
|
|
14
|
+
export let showMoveOperationsForItem = void 0;
|
|
15
|
+
export let scrollViewToCard = void 0;
|
|
16
|
+
export let runInserter = void 0;
|
|
17
|
+
let definition = getContext("rKanban-definition");
|
|
18
|
+
$:
|
|
19
|
+
is_row_active = calculate_active(item, $contextItemsStore);
|
|
20
|
+
$:
|
|
21
|
+
is_row_selected = selected(item, $contextItemsStore);
|
|
22
|
+
$:
|
|
23
|
+
selected_class = is_row_selected ? "!border-blue-300" : "";
|
|
24
|
+
$:
|
|
25
|
+
focused_class = is_row_active ? "bg-stone-100 dark:bg-stone-700" : "";
|
|
26
|
+
function calculate_active(...args) {
|
|
27
|
+
return isActive("props", item);
|
|
28
|
+
}
|
|
29
|
+
function selected(...args) {
|
|
30
|
+
return isSelected(item);
|
|
31
|
+
}
|
|
32
|
+
export function activate(e) {
|
|
33
|
+
if (e)
|
|
34
|
+
e.stopPropagation();
|
|
35
|
+
if (isActive("props", item)) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
activateItem("props", item, operations);
|
|
39
|
+
}
|
|
40
|
+
let operations = [
|
|
41
|
+
{
|
|
42
|
+
caption: "",
|
|
43
|
+
icon: FaPlus,
|
|
44
|
+
action: (f) => {
|
|
45
|
+
if (runInserter)
|
|
46
|
+
runInserter(item);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
caption: "",
|
|
51
|
+
icon: FaArrowsAlt,
|
|
52
|
+
toolbar: MoveOperations,
|
|
53
|
+
props: {
|
|
54
|
+
definition,
|
|
55
|
+
item,
|
|
56
|
+
afterActionOperation: scrollViewToCard
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
caption: "",
|
|
61
|
+
icon: FaTrash,
|
|
62
|
+
action: (f) => definition.onRemove(item)
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
let moveButton;
|
|
66
|
+
let card;
|
|
67
|
+
export function showMoveOperations() {
|
|
68
|
+
let rect = moveButton.getBoundingClientRect();
|
|
69
|
+
showFloatingToolbar(
|
|
70
|
+
rect,
|
|
71
|
+
MoveOperations,
|
|
72
|
+
{
|
|
73
|
+
definition,
|
|
74
|
+
item,
|
|
75
|
+
afterActionOperation: showMoveOperationsForItem
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
export function _scrollViewToCard() {
|
|
80
|
+
card?.scrollIntoView(
|
|
81
|
+
{
|
|
82
|
+
behavior: "smooth",
|
|
83
|
+
block: "start",
|
|
84
|
+
inline: "center"
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
</script>
|
|
89
|
+
|
|
90
|
+
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
91
|
+
|
|
92
|
+
<li class="mx-2 pt-2 pb-4 px-1 rounded-md border border-transparent {selected_class} {focused_class}"
|
|
93
|
+
class:cursor-pointer={!is_row_active}
|
|
94
|
+
on:click={activate}
|
|
95
|
+
use:selectable={item}
|
|
96
|
+
bind:this={card}>
|
|
97
|
+
|
|
98
|
+
<!-- -->
|
|
99
|
+
<!--section class="h-6 w-full flex flex-row ">
|
|
100
|
+
<button class="h-3 w-3"
|
|
101
|
+
class:hidden={!is_row_active}
|
|
102
|
+
on:click={(e) => showMoveOperations()}
|
|
103
|
+
bind:this={moveButton}>
|
|
104
|
+
<FaArrowsAlt/>
|
|
105
|
+
</button>
|
|
106
|
+
|
|
107
|
+
{#if $$slots.kanbanCardTopProps}
|
|
108
|
+
<div class="ml-auto flex flex-row gap-2">
|
|
109
|
+
<slot name="kanbanCardTopProps" element={item}/>
|
|
110
|
+
</div>
|
|
111
|
+
{/if}
|
|
112
|
+
</section-->
|
|
113
|
+
|
|
114
|
+
{#if $$slots.kanbanCardTopProps}
|
|
115
|
+
<section class="flex flex-row justify-between">
|
|
116
|
+
<slot name="kanbanCardTopProps" element={item}/>
|
|
117
|
+
</section>
|
|
118
|
+
{/if}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
<h3 class=" text-lg font-semibold min-h-[1.75rem]
|
|
122
|
+
sm:text-sm sm:font-semibold sm:min-h-[1.25rem]
|
|
123
|
+
whitespace-nowrap overflow-clip truncate w-full sm:flex-none
|
|
124
|
+
relative"
|
|
125
|
+
use:editable={{
|
|
126
|
+
action: (text) => definition.titleOnChange(text, item),
|
|
127
|
+
active: true}}>
|
|
128
|
+
{item[definition.titleAttrib]}
|
|
129
|
+
|
|
130
|
+
{#if definition.onOpen}
|
|
131
|
+
<button class="absolute top-1 right-0 w-5 h-5 sm:w-3 sm:h-3"
|
|
132
|
+
class:hidden={!is_row_active}
|
|
133
|
+
on:click={(e) => definition.onOpen(item)}>
|
|
134
|
+
<FaAlignLeft/>
|
|
135
|
+
</button>
|
|
136
|
+
{/if}
|
|
137
|
+
</h3>
|
|
138
|
+
|
|
139
|
+
{#if $$slots.kanbanCardMiddleProps}
|
|
140
|
+
<section class="w-full flex flex-row">
|
|
141
|
+
<slot name="kanbanCardMiddleProps" element={item} />
|
|
142
|
+
</section>
|
|
143
|
+
{/if}
|
|
144
|
+
|
|
145
|
+
{#if item[definition.summaryAttrib]}
|
|
146
|
+
<summary class=" sm:text-xs sm:min-h-[1rem]
|
|
147
|
+
text-base min-h-[1.5rem]
|
|
148
|
+
text-stone-400
|
|
149
|
+
max-h-[75px] sm:max-h-[64px]
|
|
150
|
+
text-ellipsis overflow-hidden">
|
|
151
|
+
{item[definition.summaryAttrib]}
|
|
152
|
+
</summary>
|
|
153
|
+
{/if}
|
|
154
|
+
|
|
155
|
+
{#if $$slots.kanbanCardBottomProps}
|
|
156
|
+
<slot name="kanbanCardBottomProps" element={item} />
|
|
157
|
+
{/if}
|
|
158
|
+
</li>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
item: object;
|
|
5
|
+
showMoveOperationsForItem?: Function | undefined;
|
|
6
|
+
scrollViewToCard?: Function | undefined;
|
|
7
|
+
runInserter?: Function | undefined;
|
|
8
|
+
activate?: ((e: any) => void) | undefined;
|
|
9
|
+
showMoveOperations?: (() => void) | undefined;
|
|
10
|
+
_scrollViewToCard?: (() => void) | undefined;
|
|
11
|
+
};
|
|
12
|
+
events: {
|
|
13
|
+
[evt: string]: CustomEvent<any>;
|
|
14
|
+
};
|
|
15
|
+
slots: {
|
|
16
|
+
kanbanCardTopProps: {
|
|
17
|
+
element: object;
|
|
18
|
+
};
|
|
19
|
+
kanbanCardMiddleProps: {
|
|
20
|
+
element: object;
|
|
21
|
+
};
|
|
22
|
+
kanbanCardBottomProps: {
|
|
23
|
+
element: object;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export type KanbanProps = typeof __propDef.props;
|
|
28
|
+
export type KanbanEvents = typeof __propDef.events;
|
|
29
|
+
export type KanbanSlots = typeof __propDef.slots;
|
|
30
|
+
export default class Kanban extends SvelteComponentTyped<KanbanProps, KanbanEvents, KanbanSlots> {
|
|
31
|
+
get activate(): (e: any) => void;
|
|
32
|
+
get showMoveOperations(): () => void;
|
|
33
|
+
get _scrollViewToCard(): () => void;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
<script>import { getContext, afterUpdate, tick } from "svelte";
|
|
2
|
+
import { data_tick_store, contextItemsStore, contextTypesStore } from "../../../stores";
|
|
3
|
+
import { getActive, activateItem } from "../../../utils.js";
|
|
4
|
+
import Card from "./kanban.card.svelte";
|
|
5
|
+
import { KanbanColumnTop, KanbanColumnBottom } from "../Kanban";
|
|
6
|
+
import Inserter from "./kanban.inserter.svelte";
|
|
7
|
+
import { FaPlus } from "svelte-icons/fa";
|
|
8
|
+
export let title = "";
|
|
9
|
+
export let width = "w-[240px]";
|
|
10
|
+
export let self = void 0;
|
|
11
|
+
export let a = "";
|
|
12
|
+
export let objects = void 0;
|
|
13
|
+
export let context = "";
|
|
14
|
+
export let key = "";
|
|
15
|
+
export let currentColumnIdx;
|
|
16
|
+
export let showMoveOperationsForItem = void 0;
|
|
17
|
+
export let scrollViewToCard = void 0;
|
|
18
|
+
let column_element;
|
|
19
|
+
export function getHeight() {
|
|
20
|
+
return column_element.getBoundingClientRect().height;
|
|
21
|
+
}
|
|
22
|
+
export const SET_LEFT = 0;
|
|
23
|
+
export const SET_RIGHT = 1;
|
|
24
|
+
export const CLEAR_LEFT = 2;
|
|
25
|
+
export const CLEAR_RIGHT = 3;
|
|
26
|
+
export function setBorder(what_to_do) {
|
|
27
|
+
switch (what_to_do) {
|
|
28
|
+
case SET_LEFT:
|
|
29
|
+
column_element.classList.add("border-l");
|
|
30
|
+
break;
|
|
31
|
+
case SET_RIGHT:
|
|
32
|
+
column_element.classList.add("border-r");
|
|
33
|
+
break;
|
|
34
|
+
case CLEAR_LEFT:
|
|
35
|
+
column_element.classList.remove("border-l");
|
|
36
|
+
break;
|
|
37
|
+
case CLEAR_RIGHT:
|
|
38
|
+
column_element.classList.remove("border-r");
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
let definition = getContext("rKanban-definition");
|
|
43
|
+
let item = null;
|
|
44
|
+
let items = void 0;
|
|
45
|
+
let ctx = context ? context : getContext("ctx");
|
|
46
|
+
let last_tick = -1;
|
|
47
|
+
let item_key = "";
|
|
48
|
+
let width_class = width ? `w-11/12 sm:${width}` : "w-11/12 sm:w-[240px]";
|
|
49
|
+
$:
|
|
50
|
+
setup($data_tick_store, $contextItemsStore);
|
|
51
|
+
function setup(...args) {
|
|
52
|
+
last_tick = $data_tick_store;
|
|
53
|
+
item = self ?? $contextItemsStore[ctx];
|
|
54
|
+
items = void 0;
|
|
55
|
+
if (objects) {
|
|
56
|
+
items = objects;
|
|
57
|
+
} else if (item && a)
|
|
58
|
+
items = item[a];
|
|
59
|
+
if (items == void 0)
|
|
60
|
+
items = [];
|
|
61
|
+
if (items.length > 0) {
|
|
62
|
+
let first_element = items[0];
|
|
63
|
+
let keys = Object.keys(first_element);
|
|
64
|
+
if (key)
|
|
65
|
+
item_key = key;
|
|
66
|
+
else if (keys.includes("Id"))
|
|
67
|
+
item_key = "Id";
|
|
68
|
+
else if (keys.includes("$ref"))
|
|
69
|
+
item_key = "$ref";
|
|
70
|
+
else if (keys.length > 0)
|
|
71
|
+
item_key = keys[0];
|
|
72
|
+
else
|
|
73
|
+
item_key = "";
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
let cards = [];
|
|
77
|
+
export function findCardByItem(item2) {
|
|
78
|
+
if (!cards)
|
|
79
|
+
return null;
|
|
80
|
+
const item_idx = items?.findIndex((i) => i == item2);
|
|
81
|
+
if (item_idx >= 0) {
|
|
82
|
+
return cards[item_idx];
|
|
83
|
+
} else
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
let inserter;
|
|
87
|
+
const None = 0;
|
|
88
|
+
let showInserterAfter = None;
|
|
89
|
+
let activateAfterDomUpdate = null;
|
|
90
|
+
let lastActivatedElement = null;
|
|
91
|
+
export async function add(after = KanbanColumnTop) {
|
|
92
|
+
if (!definition.onAdd)
|
|
93
|
+
return;
|
|
94
|
+
showInserterAfter = after ?? KanbanColumnTop;
|
|
95
|
+
if (activateAfterDomUpdate)
|
|
96
|
+
activateAfterDomUpdate = null;
|
|
97
|
+
lastActivatedElement = getActive("props");
|
|
98
|
+
let fakeItem = {};
|
|
99
|
+
activateItem("props", fakeItem);
|
|
100
|
+
await tick();
|
|
101
|
+
if (!inserter)
|
|
102
|
+
return;
|
|
103
|
+
inserter.run(async (detail) => {
|
|
104
|
+
showInserterAfter = None;
|
|
105
|
+
if (detail.cancel)
|
|
106
|
+
activateAfterDomUpdate = lastActivatedElement;
|
|
107
|
+
else {
|
|
108
|
+
if (detail.incremental) {
|
|
109
|
+
let currentActive = activateAfterDomUpdate ?? getActive("props");
|
|
110
|
+
await add(currentActive);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async function insert(title2, after) {
|
|
116
|
+
let newElement = await definition.onAdd(title2, currentColumnIdx, after);
|
|
117
|
+
if (!newElement)
|
|
118
|
+
return;
|
|
119
|
+
activateAfterDomUpdate = newElement;
|
|
120
|
+
}
|
|
121
|
+
afterUpdate(() => {
|
|
122
|
+
if (activateAfterDomUpdate) {
|
|
123
|
+
let activateAfterDomUpdateIdx = items.findIndex((e) => e == activateAfterDomUpdate);
|
|
124
|
+
activateAfterDomUpdate = null;
|
|
125
|
+
if (activateAfterDomUpdateIdx >= 0) {
|
|
126
|
+
cards[activateAfterDomUpdateIdx].activate();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
<section class="flex-none sm:flex-1 sm:min-w-[180px] sm:max-w-[240px] {width_class}">
|
|
134
|
+
<header>
|
|
135
|
+
<h2 class="mb-2 text-lg sm:text-xs uppercase w-full text-center whitespace-nowrap relative">{title}
|
|
136
|
+
<button class="absolute right-2 w-4 sm:w-2.5"
|
|
137
|
+
on:click={(e) => add(KanbanColumnTop)}>
|
|
138
|
+
<FaPlus/>
|
|
139
|
+
</button>
|
|
140
|
+
</h2>
|
|
141
|
+
</header>
|
|
142
|
+
<ul class="w-full border-stone-700" bind:this={column_element}>
|
|
143
|
+
{#if showInserterAfter === KanbanColumnTop}
|
|
144
|
+
<Inserter onInsert={async (text) => {await insert(text, KanbanColumnTop)}}
|
|
145
|
+
bind:this={inserter} />
|
|
146
|
+
{/if}
|
|
147
|
+
|
|
148
|
+
{#if items && items.length > 0}
|
|
149
|
+
{#each items as element, item_idx (element[item_key])}
|
|
150
|
+
<Card item={element}
|
|
151
|
+
{showMoveOperationsForItem}
|
|
152
|
+
{scrollViewToCard}
|
|
153
|
+
runInserter={add}
|
|
154
|
+
bind:this={cards[item_idx]}>
|
|
155
|
+
<svelte:fragment slot="kanbanCardTopProps" let:element>
|
|
156
|
+
<slot name="kanbanCardTopProps" {element}/>
|
|
157
|
+
</svelte:fragment>
|
|
158
|
+
|
|
159
|
+
<svelte:fragment slot="kanbanCardMiddleProps" let:element>
|
|
160
|
+
<slot name="kanbanCardMiddleProps" {element}/>
|
|
161
|
+
</svelte:fragment>
|
|
162
|
+
|
|
163
|
+
<svelte:fragment slot="kanbanCardBottomProps" let:element>
|
|
164
|
+
<slot name="kanbanCardBottomProps" {element}/>
|
|
165
|
+
</svelte:fragment>
|
|
166
|
+
</Card>
|
|
167
|
+
|
|
168
|
+
{#if showInserterAfter == element}
|
|
169
|
+
<Inserter onInsert={async (text) => {await insert(text, showInserterAfter)}}
|
|
170
|
+
bind:this={inserter} />
|
|
171
|
+
{/if}
|
|
172
|
+
{/each}
|
|
173
|
+
{/if}
|
|
174
|
+
|
|
175
|
+
{#if showInserterAfter === KanbanColumnBottom}
|
|
176
|
+
<Inserter onInsert={async (text) => {await insert(text, KanbanColumnBottom)}}
|
|
177
|
+
bind:this={inserter} />
|
|
178
|
+
{/if}
|
|
179
|
+
|
|
180
|
+
</ul>
|
|
181
|
+
</section>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
title?: string | undefined;
|
|
5
|
+
width?: string | undefined;
|
|
6
|
+
self?: object | undefined;
|
|
7
|
+
a?: string | undefined;
|
|
8
|
+
objects?: object[] | undefined;
|
|
9
|
+
context?: string | undefined;
|
|
10
|
+
key?: string | undefined;
|
|
11
|
+
currentColumnIdx: number;
|
|
12
|
+
showMoveOperationsForItem?: Function | undefined;
|
|
13
|
+
scrollViewToCard?: Function | undefined;
|
|
14
|
+
getHeight?: (() => number) | undefined;
|
|
15
|
+
SET_LEFT?: 0 | undefined;
|
|
16
|
+
SET_RIGHT?: 1 | undefined;
|
|
17
|
+
CLEAR_LEFT?: 2 | undefined;
|
|
18
|
+
CLEAR_RIGHT?: 3 | undefined;
|
|
19
|
+
setBorder?: ((what_to_do: number) => void) | undefined;
|
|
20
|
+
findCardByItem?: ((item: object) => any) | undefined;
|
|
21
|
+
add?: ((after?: object | number) => Promise<void>) | undefined;
|
|
22
|
+
};
|
|
23
|
+
events: {
|
|
24
|
+
[evt: string]: CustomEvent<any>;
|
|
25
|
+
};
|
|
26
|
+
slots: {
|
|
27
|
+
kanbanCardTopProps: {
|
|
28
|
+
element: object;
|
|
29
|
+
};
|
|
30
|
+
kanbanCardMiddleProps: {
|
|
31
|
+
element: object;
|
|
32
|
+
};
|
|
33
|
+
kanbanCardBottomProps: {
|
|
34
|
+
element: object;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export type KanbanProps = typeof __propDef.props;
|
|
39
|
+
export type KanbanEvents = typeof __propDef.events;
|
|
40
|
+
export type KanbanSlots = typeof __propDef.slots;
|
|
41
|
+
export default class Kanban extends SvelteComponentTyped<KanbanProps, KanbanEvents, KanbanSlots> {
|
|
42
|
+
get getHeight(): () => number;
|
|
43
|
+
get SET_LEFT(): 0;
|
|
44
|
+
get SET_RIGHT(): 1;
|
|
45
|
+
get CLEAR_LEFT(): 2;
|
|
46
|
+
get CLEAR_RIGHT(): 3;
|
|
47
|
+
get setBorder(): (what_to_do: number) => void;
|
|
48
|
+
get findCardByItem(): (item: object) => any;
|
|
49
|
+
get add(): (after?: number | object) => Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script>import {
|
|
2
|
+
startEditing,
|
|
3
|
+
editable
|
|
4
|
+
} from "../../..";
|
|
5
|
+
export let onInsert;
|
|
6
|
+
export function run(onclose) {
|
|
7
|
+
startEditing(insertion_paragraph, onclose);
|
|
8
|
+
}
|
|
9
|
+
let insertion_paragraph;
|
|
10
|
+
</script>
|
|
11
|
+
|
|
12
|
+
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
13
|
+
|
|
14
|
+
<li class=" mx-2 pt-2 pb-4 px-1 rounded-md border border-transparent
|
|
15
|
+
bg-stone-100 dark:bg-stone-700">
|
|
16
|
+
|
|
17
|
+
<h3 class=" text-lg font-semibold min-h-[1.75rem]
|
|
18
|
+
sm:text-sm sm:font-semibold sm:min-h-[1.25rem]
|
|
19
|
+
whitespace-nowrap overflow-clip w-full sm:flex-none sm:w-2/3"
|
|
20
|
+
use:editable={onInsert}
|
|
21
|
+
bind:this={insertion_paragraph}>
|
|
22
|
+
|
|
23
|
+
</h3>
|
|
24
|
+
</li>
|