@humandialog/forms.svelte 1.7.17 → 1.7.19

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.
@@ -25,6 +25,8 @@
25
25
  import {showMenu} from './components/menu'
26
26
  import {onErrorShowAlert} from './stores'
27
27
  import {randomString} from './utils'
28
+
29
+ import InviteUser from './tenant.members.invite.svelte'
28
30
 
29
31
 
30
32
  // ==============================================================================
@@ -46,11 +48,12 @@
46
48
 
47
49
  let list;
48
50
 
49
- let create_new_user_enabled = false;
51
+ //let create_new_user_enabled = false;
50
52
 
51
53
  let reef_users = [];
52
54
  let new_reef_user_id = 1;
53
55
  let access_roles = [];
56
+ let invitationDialog;
54
57
 
55
58
  let fake_users;
56
59
 
@@ -60,7 +63,7 @@
60
63
  { name: i18n({en: 'Can only read permissions', es: 'Solo puede leer permisos', pl: 'Może tylko czytać uprawnienia'}),
61
64
  key: 1 },
62
65
  //{ name: 'Can invite others', key: 3 },
63
- { name: i18n({en: 'Full access to permissions', es: 'Acceso completo a los permisos', pl: 'Pełny dostęp do uprawnień'}),
66
+ { name: i18n({en: 'Can change permissions', es: 'Puede cambiar los permisos', pl: 'Może zmieniać uprawnienia'}),
64
67
  key: 7 },
65
68
  ]
66
69
 
@@ -183,18 +186,18 @@
183
186
  )
184
187
  */
185
188
 
186
- let new_user = {
187
- name: '',
188
- email: '',
189
- auth_group: 0,
190
- files_group: 0,
191
- acc_role: '',
192
- silently: false,
193
- accepted: false
194
- }
195
-
196
- let name_input;
197
- let email_input;
189
+ //let new_user = {
190
+ // name: '',
191
+ // email: '',
192
+ // auth_group: 0,
193
+ // files_group: 0,
194
+ // acc_role: '',
195
+ // silently: false,
196
+ // accepted: false
197
+ //}
198
+
199
+ //let name_input;
200
+ //let email_input;
198
201
 
199
202
  async function on_name_changed(user, name, property)
200
203
  {
@@ -292,14 +295,22 @@
292
295
  return false;
293
296
  }
294
297
 
295
- let inviteUserIdempotencyToken = ''
296
- function create_new_user()
298
+ //let inviteUserIdempotencyToken = ''
299
+ function create_new_user(email='', name='', silently=false, accepted=false)
297
300
  {
298
- if(showAccessRoles && access_roles.length > 0)
299
- new_user.acc_role = access_roles[0].name ?? ""
300
-
301
- create_new_user_enabled = true;
302
- inviteUserIdempotencyToken = randomString(8);
301
+ //if(showAccessRoles && access_roles.length > 0)
302
+ // new_user.acc_role = access_roles[0].name ?? ""
303
+
304
+ //create_new_user_enabled = true;
305
+ invitationDialog.show({
306
+ authAccessKinds: authAccessKinds(),
307
+ appRoles: showAccessRoles ? access_roles : [],
308
+ email: email,
309
+ name: name,
310
+ silently: silently,
311
+ accepted: accepted
312
+ })
313
+ //inviteUserIdempotencyToken = randomString(8);
303
314
 
304
315
  }
305
316
 
@@ -466,101 +477,36 @@
466
477
 
467
478
  }
468
479
 
469
- function is_valid_email_address(e)
470
- {
471
- //let pattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
472
- //return (e.match(pattern) != null);
473
-
474
- var at_idx = e.indexOf("@");
475
- var dot_idx = e.lastIndexOf(".");
476
- var space_idx = e.indexOf(" ");
477
-
478
- if ((at_idx != -1) &&
479
- (at_idx != 0) &&
480
- (dot_idx != -1) &&
481
- (dot_idx != 0) &&
482
- (dot_idx > at_idx + 1) &&
483
- (e.length > dot_idx + 1) &&
484
- (space_idx == -1))
485
- {
486
- return true;
487
- }
488
- else
489
- {
490
- return false;
491
- }
492
-
493
- }
480
+ //function is_valid_email_address(e)
481
+ //{
482
+ // //let pattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
483
+ // //return (e.match(pattern) != null);
484
+ //
485
+ // var at_idx = e.indexOf("@");
486
+ // var dot_idx = e.lastIndexOf(".");
487
+ // var space_idx = e.indexOf(" ");
488
+ //
489
+ // if ((at_idx != -1) &&
490
+ // (at_idx != 0) &&
491
+ // (dot_idx != -1) &&
492
+ // (dot_idx != 0) &&
493
+ // (dot_idx > at_idx + 1) &&
494
+ // (e.length > dot_idx + 1) &&
495
+ // (space_idx == -1))
496
+ // {
497
+ // return true;
498
+ // }
499
+ // else
500
+ // {
501
+ // return false;
502
+ // }
503
+ //
504
+ //}
494
505
 
495
506
 
496
- function add_fake_users(reef_users)
497
- {
498
- const names = [
499
- "Evangeline Burnett",
500
- "Veronica Shaffer",
501
- "Evan Moyer",
502
- "Maisey Knox",
503
- "Princess Taylor",
504
- "Lilli Brown",
505
- "Celine Terrell",
506
- "Alexander Simmons",
507
- "Leslie Rowland",
508
- "Amira Reeves",
509
- "Remi Parks",
510
- "Daniela Holder",
511
- "Sonny Watkins",
512
- "Kiran Patton",
513
- "Nadia O'Brien",
514
- "Aine Lyons",
515
- "Arran Mccoy",
516
- "Aliya Hart",
517
- "Zara Ross",
518
- "Chad Ramirez",
519
- "Aron Briggs",
520
- "Nicole Hall",
521
- "Mitchell Hendricks",
522
- "Lila Chandler",
523
- "Carter Padilla",
524
- "Christian Thompson",
525
- "Ishaq Smith",
526
- "Sofia Blanchard",
527
- "Taha Kelly",
528
- "Jensen Huber",
529
- "Jaya Hewitt",
530
- "Hari Nielsen",
531
- "Celeste Higgins",
532
- "Soraya Farrell",
533
- "Jacob Copeland",
534
- "Robbie Soto",
535
- "Krishan Kelley",
536
- "Erica Ferrell",
537
- "Moshe Valenzuela",
538
- "Ahmed Mathews",
539
- "Emilie Moore",
540
- "Anisa Gamble",
541
- "Esmee Haines",
542
- "Francesca Fischer",
543
- "Md Mcdaniel",
544
- "Saarah Zamora",
545
- "Tomos Ponce",
546
- "Sonia Barrera",
547
- "Pedro Hogan",
548
- "Connie Weeks"
549
- ]
550
- const how_many = 50
551
- for(let i=0; i<how_many; i++)
552
- {
553
- reef_users.push(
554
- {
555
- Id: 1000+i,
556
- [nameAttrib]: names[i],
557
- [emailAttrib]: 'u@fake.com',
558
- [refAttrib]: `./User/${1000+i}`
559
- }
560
- )
561
- }
562
- }
507
+
563
508
 
509
+ /*
564
510
  async function on_new_user_requested()
565
511
  {
566
512
  if(!name_input?.validate())
@@ -637,7 +583,8 @@
637
583
  new_user.silently = false;
638
584
  new_user.accepted = false;
639
585
 
640
- create_new_user_enabled = false;
586
+ //create_new_user_enabled = false;
587
+ invitationDialog.hide()
641
588
  }
642
589
 
643
590
  function on_new_user_canceled()
@@ -650,8 +597,10 @@
650
597
  new_user.silently = false;
651
598
  new_user.accepted = false;
652
599
 
653
- create_new_user_enabled = false;
600
+ //create_new_user_enabled = false;
601
+ invitationDialog.hide()
654
602
  }
603
+ */
655
604
 
656
605
  let removeModal;
657
606
  let userToRemove;
@@ -732,17 +681,54 @@
732
681
  }
733
682
  }
734
683
 
735
- function askToAddAgain(user)
684
+ async function askToAddAgain(user)
736
685
  {
737
- new_user.email = user[emailAttrib];
738
- new_user.name = user[nameAttrib];
739
- new_user.silently = true;
740
- new_user.accepted = true;
686
+ let email = user[emailAttrib];
687
+ let name = user[nameAttrib] ?? '';
688
+ let idempotencyToken = randomString(8)
741
689
 
742
- //name_input?.setReadonly(true)
743
- //email_input?.setReadonly(true)
690
+ let accRole = ''
691
+ if(showAccessRoles && access_roles.length > 0)
692
+ accRole = access_roles[0].name ?? ""
693
+
694
+ try {
695
+ const res = await reef.fetch('/json/anyv/sys/invite_user', {
696
+ method: 'POST',
697
+ body: JSON.stringify({
698
+ email: email,
699
+ auth_group: 0,
700
+ files_group: 0,
701
+ role: accRole,
702
+ client_id: $session.configuration.client_id,
703
+ redirect_uri: `${window.location.origin}/#/auth/cb`,
704
+ state: `${window.location.origin}/#/auth/signin`,
705
+ idempotency_token: idempotencyToken,
706
+ silently: true,
707
+ accepted: true,
708
+ set:
709
+ {
710
+ [nameAttrib]: name,
711
+ [emailAttrib]: email
712
+ }
713
+ })
714
+ })
744
715
 
745
- create_new_user();
716
+ if(res.ok)
717
+ {
718
+ const result = await res.json();
719
+ let created_user = result.User;
720
+ await onNewUserAdded(created_user)
721
+ }
722
+ else
723
+ {
724
+ const err_msg = await res.text();
725
+ onErrorShowAlert(err_msg);
726
+ }
727
+ }
728
+ catch (err)
729
+ {
730
+ onErrorShowAlert(err);
731
+ }
746
732
  }
747
733
 
748
734
  function getHRefFunc()
@@ -752,6 +738,32 @@
752
738
  else
753
739
  return (user) => { return user[hrefAttrib]}
754
740
  }
741
+
742
+ async function onNewUserAdded(created_user)
743
+ {
744
+ let new_reef_user = {
745
+ [nameAttrib]: created_user[nameAttrib],
746
+ [emailAttrib]: created_user[emailAttrib],
747
+ [refAttrib]: created_user[refAttrib]
748
+ }
749
+
750
+ let details = await reef.get(`/sys/user_details?email=${new_reef_user[emailAttrib]}`)
751
+ set_user_info(new_reef_user, details);
752
+
753
+ let sameUserIdx = reef_users.findIndex(ru => ru[refAttrib] == new_reef_user[refAttrib])
754
+ if(sameUserIdx >= 0)
755
+ {
756
+ reef_users[sameUserIdx] = new_reef_user;
757
+ reef_users = [... reef_users];
758
+ }
759
+ else
760
+ {
761
+ reef_users = [...reef_users, new_reef_user]
762
+ }
763
+
764
+
765
+ list?.reload(reef_users);
766
+ }
755
767
 
756
768
  </script>
757
769
 
@@ -803,7 +815,7 @@
803
815
 
804
816
  </Page>
805
817
 
806
- <Modal bind:open={create_new_user_enabled}
818
+ <!--Modal bind:open={create_new_user_enabled}
807
819
  title={i18n({en: 'Invite someone', es: 'Invitar a alguien', pl: 'Zaproś kogoś'})}
808
820
  okCaption={i18n({en: 'Invite', es: 'Invitar', pl: 'Zaproś'})}
809
821
  onOkCallback={on_new_user_requested}
@@ -825,28 +837,10 @@
825
837
  bind:this={name_input}
826
838
  readonly={new_user.accepted}/>
827
839
 
828
- <!--Checkbox class="mt-2 text-xs font-normal" self={new_user} a="maintainer">
829
- <div class="flex flex-row items-center">
830
- <span class="">Maintainer</span>
831
- <Icon id="b1" s="md" component={FaInfoCircle} class="text-stone-400 ml-5 pt-0 mt-1"/>
832
- <Popover class="w-64 text-sm font-light text-stone-500 bg-white dark:bg-stone-800 dark:border-stone-600 dark:text-stone-400" triggeredBy="#b1" color="dropdown">
833
- Means that the invited user will be able to add/remove others and manage permissions in this organization.
834
- </Popover>
835
- </div>
836
- </Checkbox-->
837
-
838
840
  <Checkbox class="mt-2 text-xs font-normal" self={new_user} a="silently">
839
841
  {i18n({en: 'Add user without sending an email', es: 'Añadir usuario sin enviar correo electrónico', pl: 'Dodaj użytkownika bez wysyłania e-maila'})}
840
842
  </Checkbox>
841
843
 
842
- <!-- There is problem with dropdown/combo on dialogs (nested fixed stacks) -->
843
- <!--Combo class="mt-2" label='Privileges' a='auth_group' self={new_user} >
844
- <ComboItem name='No auth access' key={0} />
845
- <ComboItem name='Read auth access' key={1} />
846
- <ComboItem name='Can invite others' key={3} />
847
- <ComboItem name='Full auth access' key={7} />
848
- </Combo-->
849
-
850
844
  <section class="mt-2 grid grid-cols-2 gap-2">
851
845
  <div class="flex flex-col">
852
846
  <label for="new_user_auth_group"
@@ -962,7 +956,7 @@
962
956
  </div>
963
957
  {/if}
964
958
  </section>
965
- </Modal>
959
+ </Modal-->
966
960
 
967
961
  <Modal title={i18n({en: 'User removal', es: 'Eliminar usuario', pl: 'Usuwanie użytkownika'})}
968
962
  content={i18n({en: `Are you sure you want to remove ${userToRemove ? userToRemove[nameAttrib] : 'user'}?`, es: `¿Estás seguro de que deseas eliminar al ${userToRemove ? userToRemove[nameAttrib] : 'usuario'}?`, pl: `Czy na pewno chcesz usunąć ${userToRemove ? userToRemove[nameAttrib] : 'użytkownika'}?`})}
@@ -978,4 +972,8 @@
978
972
  okCaption={i18n({en: 'Delete', es: 'Eliminar', pl: 'Usuń'})}
979
973
  onOkCallback={deleteApplicationAccount}
980
974
  bind:this={deleteAccountModal}
981
- />
975
+ />
976
+
977
+ <InviteUser bind:this={invitationDialog}
978
+ {nameAttrib} {emailAttrib} {refAttrib} {hrefAttrib}
979
+ {onNewUserAdded}/>
@@ -2,11 +2,11 @@
2
2
  /** @typedef {typeof __propDef.events} TenantEvents */
3
3
  /** @typedef {typeof __propDef.slots} TenantSlots */
4
4
  export default class Tenant extends SvelteComponentTyped<{
5
- users?: any;
6
5
  nameAttrib?: string | undefined;
7
6
  emailAttrib?: string | undefined;
8
7
  refAttrib?: string | undefined;
9
8
  hrefAttrib?: string | undefined;
9
+ users?: any;
10
10
  showFiles?: boolean | undefined;
11
11
  showAccessRoles?: boolean | undefined;
12
12
  }, {
@@ -19,11 +19,11 @@ export type TenantSlots = typeof __propDef.slots;
19
19
  import { SvelteComponentTyped } from "svelte";
20
20
  declare const __propDef: {
21
21
  props: {
22
- users?: any;
23
22
  nameAttrib?: string | undefined;
24
23
  emailAttrib?: string | undefined;
25
24
  refAttrib?: string | undefined;
26
25
  hrefAttrib?: string | undefined;
26
+ users?: any;
27
27
  showFiles?: boolean | undefined;
28
28
  showAccessRoles?: boolean | undefined;
29
29
  };
package/utils.d.ts CHANGED
@@ -46,6 +46,7 @@ export function navHide(): void;
46
46
  export function navToggle(key: any): void;
47
47
  export function navPrevVisibleKey(): string | undefined;
48
48
  export function navAutoHide(): void;
49
+ export function isValidEmail(e: any): boolean;
49
50
  export namespace icons {
50
51
  const symbols: null;
51
52
  }
package/utils.js CHANGED
@@ -345,6 +345,7 @@ export function editable(node, params)
345
345
  let onFinish = undefined;
346
346
  let onSoftEnter = undefined;
347
347
  let onSingleChange = undefined
348
+ let enterAsNewLine = false
348
349
  if(params instanceof Object)
349
350
  {
350
351
  action = params.action ?? params;
@@ -353,7 +354,8 @@ export function editable(node, params)
353
354
  onFinish = params.onFinish ?? undefined
354
355
  onSoftEnter = params.onSoftEnter ?? undefined;
355
356
  onSingleChange = params.onSingleChange ?? undefined
356
-
357
+ enterAsNewLine = params.enterAsNewLine ?? false
358
+
357
359
  if(params.readonly)
358
360
  return;
359
361
  }
@@ -376,6 +378,22 @@ export function editable(node, params)
376
378
  await finish_editing({cancel: cancel});
377
379
  }
378
380
 
381
+ const putNewLine = async (e) =>
382
+ {
383
+ const sel = window.getSelection()
384
+
385
+ let selNode = sel?.focusNode
386
+ let selOffset = sel?.focusOffset
387
+ let text = selNode?.textContent
388
+ const left = text?.substring(0, selOffset)
389
+ const right = text?.substring(selOffset)
390
+ text = left + '\n' + right
391
+ node.textContent = text
392
+
393
+ await tick()
394
+ window.getSelection()?.setPosition(node.firstChild, selOffset+1)
395
+ }
396
+
379
397
  const key_listener = async (e) =>
380
398
  {
381
399
  //e.ctrlKey
@@ -395,11 +413,18 @@ export function editable(node, params)
395
413
  case 'Enter':
396
414
  e.stopPropagation();
397
415
  e.preventDefault();
398
-
399
- if(e.shiftKey && onSoftEnter)
400
- await finish_editing({ softEnter: true});
416
+
417
+ if(enterAsNewLine)
418
+ {
419
+ await putNewLine(e);
420
+ }
401
421
  else
402
- await finish_editing({ incremental: true});
422
+ {
423
+ if(e.shiftKey && onSoftEnter)
424
+ await finish_editing({ softEnter: true});
425
+ else
426
+ await finish_editing({ incremental: true});
427
+ }
403
428
  break;
404
429
 
405
430
  case 'Backspace':
@@ -1040,3 +1065,28 @@ export function navAutoHide()
1040
1065
  }
1041
1066
 
1042
1067
 
1068
+ export function isValidEmail(e)
1069
+ {
1070
+ //let pattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
1071
+ //return (e.match(pattern) != null);
1072
+
1073
+ var at_idx = e.indexOf("@");
1074
+ var dot_idx = e.lastIndexOf(".");
1075
+ var space_idx = e.indexOf(" ");
1076
+
1077
+ if ((at_idx != -1) &&
1078
+ (at_idx != 0) &&
1079
+ (dot_idx != -1) &&
1080
+ (dot_idx != 0) &&
1081
+ (dot_idx > at_idx + 1) &&
1082
+ (e.length > dot_idx + 1) &&
1083
+ (space_idx == -1))
1084
+ {
1085
+ return true;
1086
+ }
1087
+ else
1088
+ {
1089
+ return false;
1090
+ }
1091
+
1092
+ }