@humandialog/forms.svelte 1.4.11 → 1.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.
@@ -3,6 +3,7 @@
3
3
  import { breadcrumbParse, breadcrumbStringify } from './breadcrumb_utils';
4
4
 
5
5
  export let path;
6
+ export let collapseLonger = false
6
7
 
7
8
  let segments = []
8
9
  let userClass = $$props.class ?? ''
@@ -34,24 +35,39 @@
34
35
  {#each segments as segment, idx (segment.href)}
35
36
  {@const isFirst = idx == 0}
36
37
  {@const isLast = idx == segments.length-1}
37
- <li>
38
- <div class="flex items-center">
39
- {#if !isFirst}
40
- <svg class="rtl:rotate-180 w-3 h-3 text-stone-400 mx-1" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 6 10">
41
- <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 9 4-4-4-4"/>
42
- </svg>
43
- {/if}
44
- {#if isLast}
45
- <span class="ms-1 text-sm md:ms-2 font-semibold text-stone-900 dark:text-stone-100 whitespace-nowrap">
46
- {segment.name}
47
- </span>
48
- {:else}
49
- <a href={getSegmentHRef(segment.href, idx)} use:link class="ms-1 text-sm font-medium md:ms-2 text-stone-700 hover:text-stone-900 dark:text-stone-400 dark:hover:text-white whitespace-nowrap">
50
- {segment.name}
51
- </a>
52
- {/if}
53
- </div>
54
- </li>
38
+ {@const collapsable = collapseLonger && segments.length > 5}
39
+ {@const isCollapsed = collapsable && idx > 0 && idx < segments.length-3}
40
+ {@const isFirstCollapsed = isCollapsed && idx == 1}
41
+
42
+ {#if isCollapsed}
43
+ {#if isFirstCollapsed}
44
+ <svg class="rtl:rotate-180 w-3 h-3 text-stone-400 mx-1" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 6 10">
45
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 9 4-4-4-4"/>
46
+ </svg>
47
+ <span class="ms-1 text-sm md:ms-2 font-semibold text-stone-900 dark:text-stone-100 whitespace-nowrap">
48
+ ...
49
+ </span>
50
+ {/if}
51
+ {:else}
52
+ <li>
53
+ <div class="flex items-center">
54
+ {#if !isFirst}
55
+ <svg class="rtl:rotate-180 w-3 h-3 text-stone-400 mx-1" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 6 10">
56
+ <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m1 9 4-4-4-4"/>
57
+ </svg>
58
+ {/if}
59
+ {#if isLast}
60
+ <span class="ms-1 text-sm md:ms-2 font-semibold text-stone-900 dark:text-stone-100 whitespace-nowrap">
61
+ {segment.name}
62
+ </span>
63
+ {:else}
64
+ <a href={getSegmentHRef(segment.href, idx)} use:link class="ms-1 text-sm font-medium md:ms-2 text-stone-700 hover:text-stone-900 dark:text-stone-400 dark:hover:text-white whitespace-nowrap">
65
+ {segment.name}
66
+ </a>
67
+ {/if}
68
+ </div>
69
+ </li>
70
+ {/if}
55
71
  {/each}
56
72
  {/if}
57
73
 
@@ -4,6 +4,7 @@
4
4
  export default class Breadcrumb extends SvelteComponentTyped<{
5
5
  [x: string]: any;
6
6
  path: any;
7
+ collapseLonger?: boolean | undefined;
7
8
  }, {
8
9
  [evt: string]: CustomEvent<any>;
9
10
  }, {}> {
@@ -16,6 +17,7 @@ declare const __propDef: {
16
17
  props: {
17
18
  [x: string]: any;
18
19
  path: any;
20
+ collapseLonger?: boolean | undefined;
19
21
  };
20
22
  events: {
21
23
  [evt: string]: CustomEvent<any>;
@@ -262,7 +262,7 @@ async function dblclick(e) {
262
262
  </button-->
263
263
  </h2>
264
264
  </header>
265
- <ul class="w-full border-stone-700 pb-20" bind:this={column_element}>
265
+ <ul class="w-full border-stone-400 dark:border-stone-700 pb-20" bind:this={column_element}>
266
266
  {#if showInserterAfterId === KanbanColumnTop}
267
267
  <Inserter onInsert={async (title, summary) => {await onInsert(currentColumnIdx, title, summary, KanbanColumnTop)}}
268
268
  bind:this={inserter} />
package/index.d.ts CHANGED
@@ -71,3 +71,4 @@ export { default as IcH1 } from './components/document/internal/h1.icon.svelte';
71
71
  export { default as IcH2 } from './components/document/internal/h2.icon.svelte';
72
72
  export { default as IcH3 } from './components/document/internal/h3.icon.svelte';
73
73
  export { default as IcH4 } from './components/document/internal/h4.icon.svelte';
74
+ export { registerKicksObserver, unregisterKicksObserver, forceKicksChecking } from './kicks.js';
package/index.js CHANGED
@@ -77,3 +77,4 @@ export { default as IcH1 } from './components/document/internal/h1.icon.svelte';
77
77
  export { default as IcH2 } from './components/document/internal/h2.icon.svelte';
78
78
  export { default as IcH3 } from './components/document/internal/h3.icon.svelte';
79
79
  export { default as IcH4 } from './components/document/internal/h4.icon.svelte';
80
+ export { registerKicksObserver, unregisterKicksObserver, forceKicksChecking } from './kicks.js';
package/kicks.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export function registerKicksObserver(labels: any, interval: any, callback: any): number;
2
+ export function unregisterKicksObserver(regId: any): void;
3
+ export function forceKicksChecking(): void;
package/kicks.js ADDED
@@ -0,0 +1,155 @@
1
+ import {reef, session} from '@humandialog/auth.svelte'
2
+ import {get} from 'svelte/store'
3
+
4
+ let nextObserverId = 1000
5
+ let registeredObservers = []
6
+ let minInterval = 0
7
+ let lastCheckAt = 0
8
+ let timerId = 0;
9
+
10
+ let lastKicks = new Map();
11
+
12
+ export function registerKicksObserver(labels, interval, callback)
13
+ {
14
+ let lbs = []
15
+ if(labels && Array.isArray(labels))
16
+ lbs = labels
17
+ else
18
+ lbs = [labels]
19
+
20
+ registeredObservers.push( {
21
+ labels: lbs,
22
+ interval: interval,
23
+ callback: callback,
24
+ id: nextObserverId
25
+ })
26
+
27
+ const res = nextObserverId;
28
+ nextObserverId++;
29
+
30
+ updateTimer()
31
+ return res
32
+ }
33
+
34
+ export function unregisterKicksObserver(regId)
35
+ {
36
+ const fIdx = registeredObservers.findIndex( (o) => o.id == regId)
37
+ if(fIdx >=0)
38
+ registeredObservers.splice(fIdx, 1)
39
+
40
+ updateTimer()
41
+ }
42
+
43
+ export function forceKicksChecking()
44
+ {
45
+ checkKicks();
46
+
47
+
48
+ if(timerId > 0)
49
+ {
50
+ clearTimeout(timerId)
51
+ timerId = 0
52
+ }
53
+
54
+ if(minInterval > 0)
55
+ timerId = setTimeout(timerHandler, minInterval*1000)
56
+ }
57
+
58
+ function getMinInterval()
59
+ {
60
+ if(registeredObservers.length == 0)
61
+ return 0;
62
+
63
+ let minInterval = Number.MAX_SAFE_INTEGER;
64
+ registeredObservers.forEach((o) => {
65
+ if(o.interval < minInterval)
66
+ minInterval = o.interval
67
+ })
68
+
69
+ return minInterval;
70
+ }
71
+
72
+ function timerHandler()
73
+ {
74
+ checkKicks();
75
+ timerId = setTimeout(timerHandler, minInterval*1000)
76
+ }
77
+
78
+ function updateTimer()
79
+ {
80
+ const newInterval = getMinInterval()
81
+
82
+ let isFirstTimeLaunch = (timerId == 0) && (newInterval > 0)
83
+
84
+ if(timerId > 0)
85
+ {
86
+ clearTimeout(timerId)
87
+ timerId = 0
88
+ }
89
+
90
+ if(newInterval > 0)
91
+ timerId = setTimeout(timerHandler, newInterval*1000)
92
+
93
+ minInterval = newInterval
94
+
95
+ if(isFirstTimeLaunch)
96
+ checkKicks(false)
97
+ }
98
+
99
+ function checkKicks(informObservers=true)
100
+ {
101
+ const s = get(session)
102
+ const appId = s.appId ? s.appId : 'octopus'
103
+ const tid = s.tid ? s.tid : 'octopus/15'
104
+ console.log(s.isActive, appId, tid)
105
+ if(s.isActive && appId && tid)
106
+ {
107
+ reef.fetch(`/dev/kicks?app_id=${appId}&tenant_id=${encodeURIComponent(tid)}&last_check=${lastCheckAt}`).then(res => {
108
+ if(res.ok)
109
+ {
110
+ res.json().then( result =>
111
+ {
112
+ // todo
113
+ //console.log('kicks:', result)
114
+
115
+
116
+ let changedLabels = []
117
+ result.allKicks.forEach(current => {
118
+
119
+ if(lastKicks.has(current.label))
120
+ {
121
+ let storedKick = lastKicks.get(current.label)
122
+ if(storedKick.kick != current.kick)
123
+ {
124
+ lastKicks.set(current.label, {...current})
125
+ changedLabels.push(current.label)
126
+ }
127
+ }
128
+ else
129
+ {
130
+ lastKicks.set(current.label, {...current})
131
+ changedLabels.push(current.label)
132
+ }
133
+ })
134
+
135
+ if(informObservers && changedLabels.length > 0)
136
+ {
137
+ registeredObservers.forEach(ob => {
138
+ const changedLabelsPerObserver = ob.labels.filter(label => changedLabels.includes(label))
139
+ if(changedLabelsPerObserver.length > 0)
140
+ {
141
+ if(ob.callback)
142
+ ob.callback(changedLabelsPerObserver)
143
+ }
144
+ })
145
+ }
146
+ }
147
+ ).catch(err => console.error(err))
148
+ }
149
+ }).catch(err => {
150
+ console.error(err)
151
+ })
152
+ }
153
+
154
+ lastCheckAt = Date.now() / 1000;
155
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humandialog/forms.svelte",
3
- "version": "1.4.11",
3
+ "version": "1.5.1",
4
4
  "description": "Basic Svelte UI components for Object Reef applications",
5
5
  "devDependencies": {
6
6
  "@playwright/test": "^1.28.1",
@@ -46,7 +46,8 @@
46
46
  "qs": "^6.14.0",
47
47
  "svelte-icons": "^2.1.0",
48
48
  "svelte-share-buttons-component": "^3.0.0",
49
- "svelte-spa-router": "^4.0.1"
49
+ "svelte-spa-router": "^4.0.1",
50
+ "swagger-ui-dist": "^5.27.0"
50
51
  },
51
52
  "keywords": [
52
53
  "svelte",
@@ -158,6 +159,7 @@
158
159
  ".": "./index.js",
159
160
  "./internal/configurable.content.svelte": "./internal/configurable.content.svelte",
160
161
  "./internal/loading.svelte": "./internal/loading.svelte",
162
+ "./kicks": "./kicks.js",
161
163
  "./modal.svelte": "./modal.svelte",
162
164
  "./operations.svelte": "./operations.svelte",
163
165
  "./page.row.svelte": "./page.row.svelte",