@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.
- package/components/prose.editable.p.svelte +55 -0
- package/components/prose.editable.p.svelte.d.ts +48 -0
- package/components/prose.editable.span.svelte +114 -0
- package/components/prose.editable.span.svelte.d.ts +51 -0
- package/components/tags.palette.svelte +2 -1
- package/console.svelte +4 -1
- package/index.d.ts +4 -1
- package/index.js +4 -1
- package/package.json +5 -1
- package/page.svelte +1 -0
- package/page.svelte.d.ts +2 -0
- package/paper.svelte +11 -0
- package/paper.svelte.d.ts +27 -0
- package/tenant.members.invite.svelte +492 -0
- package/tenant.members.invite.svelte.d.ts +34 -0
- package/tenant.members.svelte +142 -144
- package/tenant.members.svelte.d.ts +2 -2
- package/utils.d.ts +1 -0
- package/utils.js +55 -5
package/tenant.members.svelte
CHANGED
|
@@ -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: '
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
|
|
300
|
-
|
|
301
|
-
create_new_user_enabled = true;
|
|
302
|
-
|
|
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
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
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
|
-
|
|
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
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
new_user.accepted = true;
|
|
686
|
+
let email = user[emailAttrib];
|
|
687
|
+
let name = user[nameAttrib] ?? '';
|
|
688
|
+
let idempotencyToken = randomString(8)
|
|
741
689
|
|
|
742
|
-
|
|
743
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
400
|
-
|
|
416
|
+
|
|
417
|
+
if(enterAsNewLine)
|
|
418
|
+
{
|
|
419
|
+
await putNewLine(e);
|
|
420
|
+
}
|
|
401
421
|
else
|
|
402
|
-
|
|
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
|
+
}
|