@humandialog/forms.svelte 1.6.9 → 1.7.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.
@@ -48,6 +48,8 @@ export declare class rList_definition {
48
48
  onInsert: Function | undefined;
49
49
  inserter_icon: boolean;
50
50
  onOpen: Function | undefined;
51
+ downloadable: boolean;
52
+ downloadableFunc: Function | undefined;
51
53
  properties: rList_property[];
52
54
  tags: rList_property_tags | null;
53
55
  }
@@ -56,6 +56,8 @@ export class rList_definition {
56
56
  onInsert = undefined;
57
57
  inserter_icon = false;
58
58
  onOpen = undefined;
59
+ downloadable = false;
60
+ downloadableFunc = undefined;
59
61
  properties = [];
60
62
  tags = null;
61
63
  }
@@ -16,6 +16,7 @@ import Summary from "./list.element.summary.svelte";
16
16
  import Properties from "./list.element.props.svelte";
17
17
  import { isDeviceSmallerThan } from "../../../utils";
18
18
  import Icon from "../../icon.svelte";
19
+ import Spinner from "../../delayed.spinner.svelte";
19
20
  import { rList_definition, rList_property_type } from "../List";
20
21
  import { push, link } from "svelte-spa-router";
21
22
  import { FaExternalLinkAlt, FaRegSquare, FaRegCheckSquare } from "svelte-icons/fa/";
@@ -44,7 +45,9 @@ $:
44
45
  $:
45
46
  focused_class = is_row_active ? "bg-stone-200 dark:bg-stone-700" : "";
46
47
  $:
47
- is_link_like = is_row_active && (!!definition.title_href || !!definition.title_href_func);
48
+ download = is_row_active && (definition.downloadable || (definition.downloadableFunc ? definition.downloadableFunc(item) : false));
49
+ $:
50
+ is_link_like = is_row_active && (!!definition.title_href || !!definition.title_href_func || download);
48
51
  if (!typename) {
49
52
  if (item.$type)
50
53
  typename = item.$type;
@@ -272,6 +275,15 @@ function onToggleMultiSelect(e) {
272
275
  if (e)
273
276
  e.stopPropagation();
274
277
  }
278
+ let isDownloading = false;
279
+ async function onDownloadFile(e) {
280
+ isDownloading = true;
281
+ e.preventDefault();
282
+ e.stopPropagation();
283
+ if (definition.onOpen)
284
+ await definition.onOpen(item);
285
+ isDownloading = false;
286
+ }
275
287
  </script>
276
288
 
277
289
  <!-- svelte-ignore a11y-click-events-have-key-events -->
@@ -290,7 +302,11 @@ function onToggleMultiSelect(e) {
290
302
  on:click={onToggleMultiSelect}/>
291
303
  {/if}
292
304
 
293
- <slot name="left" element={item}/>
305
+ {#if isDownloading}
306
+ <Spinner class="mt-0.5 ml-2 mr-1" size={5} delay={0}/>
307
+ {:else}
308
+ <slot name="left" element={item}/>
309
+ {/if}
294
310
 
295
311
  <i class="hidden sm:w-1/2 sm:w-2/3 sm:w-1/3"></i> <!-- just to force tailwind classes including -->
296
312
 
@@ -315,10 +331,19 @@ function onToggleMultiSelect(e) {
315
331
  onSoftEnter: (text) => {change_name(text); editProperty('Summary')}
316
332
  }}
317
333
  > <!--on:click|stopPropagation={followDefinedHRef}-->
318
- <a class="sm:hover:cursor-pointer underline"
319
- href={getHRef()} use:link>
320
- {element_title}
321
- </a>
334
+ {#if download}
335
+ <a class="sm:hover:cursor-pointer underline"
336
+ download
337
+ href={getHRef()}
338
+ on:click={onDownloadFile}>
339
+ {element_title}
340
+ </a>
341
+ {:else}
342
+ <a class="sm:hover:cursor-pointer underline"
343
+ href={getHRef()} use:link>
344
+ {element_title}
345
+ </a>
346
+ {/if}
322
347
  </p>
323
348
  {:else}
324
349
  <p class=" text-base font-semibold
@@ -252,34 +252,40 @@ function reorderElements(items2, from = null) {
252
252
  }
253
253
  pushChanges();
254
254
  }
255
- async function insert(title2, summary, after) {
256
- let newElement = {
257
- [definition.title]: title2,
258
- [definition.summary]: summary
259
- };
260
- if (after && orderAttrib) {
255
+ export function assignOrder(after) {
256
+ if (!orderAttrib)
257
+ return 0;
258
+ if (after) {
261
259
  const leftElement = after;
262
260
  const leftOrder = leftElement[orderAttrib];
263
261
  const rightElement = getNext(items, leftElement);
264
262
  if (rightElement) {
265
263
  let rightOrder = rightElement[orderAttrib];
266
264
  if (rightOrder - leftOrder >= 2)
267
- newElement[orderAttrib] = leftOrder + Math.floor((rightOrder - leftOrder) / 2);
265
+ return leftOrder + Math.floor((rightOrder - leftOrder) / 2);
268
266
  else {
269
267
  reorderElements(items, leftElement);
270
268
  rightOrder = rightElement[orderAttrib];
271
- newElement[orderAttrib] = leftOrder + Math.floor((rightOrder - leftOrder) / 2);
269
+ return leftOrder + Math.floor((rightOrder - leftOrder) / 2);
272
270
  }
273
271
  } else
274
- newElement[orderAttrib] = leftOrder + ORDER_STEP;
275
- } else if (orderAttrib) {
272
+ return leftOrder + ORDER_STEP;
273
+ } else {
276
274
  const lastElement = getLast(items);
277
275
  if (lastElement) {
278
276
  const lastOrder = lastElement[orderAttrib];
279
- newElement[orderAttrib] = lastOrder + ORDER_STEP;
277
+ return lastOrder + ORDER_STEP;
280
278
  } else
281
- newElement[orderAttrib] = MIN_ORDER;
279
+ return MIN_ORDER;
282
280
  }
281
+ }
282
+ async function insert(title2, summary, after) {
283
+ let newElement = {
284
+ [definition.title]: title2,
285
+ [definition.summary]: summary
286
+ };
287
+ if (orderAttrib)
288
+ newElement[orderAttrib] = assignOrder(after);
283
289
  await definition.onInsert(newElement);
284
290
  return;
285
291
  let insertedElement = await definition.onInsert(newElement);
@@ -30,6 +30,7 @@ declare const __propDef: {
30
30
  remove?: ((element: object) => void) | undefined;
31
31
  edit?: ((element: object, property_name: string) => void) | undefined;
32
32
  toggleMultiselection?: (() => void) | undefined;
33
+ assignOrder?: ((after: object | null) => number) | undefined;
33
34
  };
34
35
  events: {
35
36
  [evt: string]: CustomEvent<any>;
@@ -60,5 +61,6 @@ export default class List extends SvelteComponentTyped<ListProps, ListEvents, Li
60
61
  get remove(): (element: object) => void;
61
62
  get edit(): (element: object, property_name: string) => void;
62
63
  get toggleMultiselection(): () => void;
64
+ get assignOrder(): (after: object | null) => number;
63
65
  }
64
66
  export {};
@@ -6,6 +6,8 @@ export let onOpen = void 0;
6
6
  export let readonly = false;
7
7
  export let href = void 0;
8
8
  export let hrefFunc = void 0;
9
+ export let downloadable = false;
10
+ export let downloadableFunc = void 0;
9
11
  let definition = getContext("rList-definition");
10
12
  definition.title = a;
11
13
  definition.title_editable = editable;
@@ -14,4 +16,6 @@ definition.title_readonly = readonly;
14
16
  definition.title_href = href;
15
17
  definition.title_href_func = hrefFunc;
16
18
  definition.onOpen = onOpen;
19
+ definition.downloadable = downloadable;
20
+ definition.downloadableFunc = downloadableFunc;
17
21
  </script>
@@ -8,6 +8,8 @@ declare const __propDef: {
8
8
  readonly?: boolean | undefined;
9
9
  href?: string | undefined;
10
10
  hrefFunc?: Function | undefined;
11
+ downloadable?: boolean | undefined;
12
+ downloadableFunc?: Function | undefined;
11
13
  };
12
14
  events: {
13
15
  [evt: string]: CustomEvent<any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@humandialog/forms.svelte",
3
- "version": "1.6.9",
3
+ "version": "1.7.0",
4
4
  "description": "Basic Svelte UI components for Object Reef applications",
5
5
  "devDependencies": {
6
6
  "@playwright/test": "^1.28.1",