diff options
author | John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> | 2020-07-07 15:55:07 +0200 |
---|---|---|
committer | John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> | 2020-08-21 10:11:38 +0200 |
commit | aaa23c19c054e01f9f173272988b7f2635d1d3fc (patch) | |
tree | 0ff5480652f9ae06a3ffd348ab31750471412b09 | |
parent | 87615fb6549c884aa9891666748170aea27e89e5 (diff) |
Import vcf from files
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
-rw-r--r-- | img/app.png | bin | 689 -> 0 bytes | |||
-rw-r--r-- | img/contacts.svg | 4 | ||||
-rw-r--r-- | img/favicon-mask.svg | 2 | ||||
-rw-r--r-- | img/favicon-touch.png | bin | 4127 -> 0 bytes | |||
-rw-r--r-- | img/favicon-touch.svg | 2 | ||||
-rw-r--r-- | img/favicon.ico | bin | 4286 -> 0 bytes | |||
-rw-r--r-- | img/favicon.png | bin | 1095 -> 0 bytes | |||
-rw-r--r-- | img/favicon.svg | 2 | ||||
-rw-r--r-- | lib/AppInfo/Application.php | 5 | ||||
-rw-r--r-- | lib/Dav/PatchPlugin.php | 1 | ||||
-rw-r--r-- | lib/Listener/LoadContactsFilesActions.php | 44 | ||||
-rw-r--r-- | src/components/ContactDetails.vue | 4 | ||||
-rw-r--r-- | src/components/ProcessingScreen.vue | 2 | ||||
-rw-r--r-- | src/components/Properties/PropertyGroups.vue | 2 | ||||
-rw-r--r-- | src/components/Settings/SettingsImportContacts.vue | 52 | ||||
-rw-r--r-- | src/files_action.js | 38 | ||||
-rw-r--r-- | src/router/index.js | 5 | ||||
-rw-r--r-- | templates/main.php | 2 | ||||
-rw-r--r-- | webpack.common.js | 24 |
19 files changed, 155 insertions, 34 deletions
diff --git a/img/app.png b/img/app.png Binary files differdeleted file mode 100644 index 8efed047..00000000 --- a/img/app.png +++ /dev/null diff --git a/img/contacts.svg b/img/contacts.svg new file mode 100644 index 00000000..b3cf71b8 --- /dev/null +++ b/img/contacts.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.1" viewBox="0 0 32 32"> + <path style="block-progression:tb;color:#000000;text-transform:none;text-indent:0" d="m8.24 4.42c-2.2265 0-4.1153 1.6283-4.1153 3.7296 0.0158 0.66417 0.0752 1.4832 0.47155 3.2152v0.0429l0.0429 0.0429c0.12723 0.36445 0.31239 0.57294 0.55728 0.85739 0.24489 0.28444 0.53685 0.61924 0.81448 0.90025 0.0327 0.0331 0.0536 0.0535 0.0857 0.0858 0.0551 0.23961 0.12176 0.49747 0.17147 0.72878 0.13227 0.61541 0.11871 1.0512 0.0857 1.2003-0.95674 0.33594-2.147 0.73601-3.2151 1.2003-0.59962 0.26069-1.1422 0.49348-1.5861 0.77165-0.44388 0.27818-0.88534 0.48834-1.0288 1.1146-0.002 0.0285-0.002 0.0572 0 0.0858-0.1402 1.2874-0.35229 3.1806-0.51441 4.4584-0.035 0.26898 0.10676 0.55252 0.34294 0.68591 1.9392 1.0475 4.9181 1.4691 7.8876 1.4576 2.9695-0.0116 5.9247-0.45797 7.8019-1.4576 0.23617-0.13338 0.37794-0.41693 0.34294-0.68591-0.0518-0.39943-0.11534-1.3001-0.17147-2.1863-0.0561-0.88623-0.10486-1.758-0.17147-2.2721-0.0232-0.12744-0.0835-0.2479-0.17147-0.34295-0.59633-0.71211-1.4873-1.1474-2.5292-1.5862-0.95121-0.40054-2.0664-0.81649-3.1722-1.2861-0.0619-0.13788-0.12337-0.53903 0-1.1575 0.0331-0.16606 0.085-0.34392 0.12861-0.51443 0.10392-0.1164 0.18492-0.21152 0.30007-0.34296 0.2456-0.28032 0.50949-0.57438 0.72875-0.85738 0.21926-0.28301 0.39864-0.52579 0.51441-0.85739l0.0429-0.0429c0.44807-1.8085 0.44831-2.5631 0.47155-3.2152v-0.0429c0-2.1013-1.8888-3.7296-4.1153-3.7296zm11.772-3.4224c-3.2461 0-5.9999 2.3739-5.9999 5.4374 0.023 0.9683 0.10964 2.1624 0.68749 4.6874v0.0625l0.0625 0.0625c0.1855 0.53134 0.45545 0.83529 0.81249 1.25 0.35704 0.4147 0.7827 0.90279 1.1875 1.3125 0.0476 0.0482 0.0781 0.0781 0.12499 0.12502 0.0803 0.34932 0.17752 0.72527 0.25 1.0625 0.19284 0.8972 0.17306 1.5326 0.12501 1.75-1.3949 0.48977-3.1303 1.073-4.6874 1.75-0.87422 0.38005-1.6653 0.71943-2.3125 1.125-0.64717 0.40555-1.2908 0.71195-1.5 1.625-0.003 0.0416-0.003 0.0834 0 0.12502-0.20442 1.8769-0.51363 4.637-0.74999 6.4999-0.051 0.39215 0.15566 0.80553 0.49999 0.99999 2.8273 1.5272 7.1704 2.1419 11.5 2.125 4.3294-0.0168 8.6379-0.66766 11.375-2.125 0.34433-0.19446 0.55102-0.60784 0.49999-0.99999-0.0755-0.58232-0.16816-1.8954-0.25-3.1875-0.0818-1.292-0.15288-2.563-0.24998-3.3125-0.0339-0.18578-0.12172-0.36141-0.25-0.49999-0.86942-1.0382-2.1684-1.6728-3.6875-2.3125-1.3868-0.58395-3.0127-1.1904-4.6249-1.875-0.0902-0.20102-0.17988-0.78586 0-1.6875 0.0483-0.2421 0.12394-0.50141 0.1875-0.74999 0.15152-0.1697 0.26961-0.30838 0.4375-0.5 0.35807-0.40868 0.74281-0.83739 1.0625-1.25 0.31967-0.41259 0.58121-0.76654 0.74999-1.25l0.0625-0.0625c0.65328-2.6366 0.65362-3.7367 0.6875-4.6874v-0.0625c0-3.0635-2.7538-5.4374-5.9999-5.4374z" fill="#FFF"/> +</svg> diff --git a/img/favicon-mask.svg b/img/favicon-mask.svg deleted file mode 100644 index dc63f91b..00000000 --- a/img/favicon-mask.svg +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xml:space="preserve" height="16" width="16" enable-background="new 0 0 595.275 311.111" y="0px" x="0px" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 16 16"><path d="m2.5-0.000002c-1.385 0-2.5 1.115-2.5 2.5v11c0 1.385 1.115 2.5 2.5 2.5h11c1.385 0 2.5-1.115 2.5-2.5v-11c0-1.385-1.115-2.5-2.5-2.5h-11zm7.127 1.5654c1.3996 0 2.5869 1.0229 2.5869 2.3438v0.02734c-0.01461 0.4099-0.01521 0.88469-0.29688 2.0215l-0.02637 0.02637c-0.07277 0.20845-0.18541 0.36117-0.32324 0.53906-0.13784 0.1779-0.3046 0.36286-0.45898 0.53906-0.07239 0.08262-0.12315 0.14265-0.18848 0.21582-0.0274 0.10718-0.06023 0.21886-0.08105 0.32324-0.07756 0.38875-0.03889 0.64087 0 0.72754 0.69512 0.29517 1.3962 0.55682 1.9941 0.80859 0.65497 0.27581 1.215 0.54944 1.5898 0.99707 0.05531 0.05975 0.09378 0.13474 0.1084 0.21484 0.04186 0.32315 0.07215 0.87165 0.10742 1.4287 0.03529 0.5571 0.07585 1.123 0.1084 1.374 0.022 0.16908-0.06736 0.3478-0.21582 0.43164-1.1801 0.62834-3.0376 0.90876-4.9043 0.91602-1.867 0.007-3.7402-0.258-4.9592-0.916-0.1485-0.084-0.2369-0.263-0.2149-0.432 0.0452-0.355 0.0928-0.8 0.1436-1.241-0.015427 0.000115-0.030469 0.0019-0.045898 0.002-1.2803 0.005-2.5643-0.17727-3.4004-0.62891-0.10183-0.05751-0.16353-0.17992-0.14844-0.2959 0.0699-0.55094 0.16123-1.3668 0.22168-1.9219-0.00085-0.01233-0.00085-0.02482 0-0.03711 0.0618-0.2699 0.2529-0.3604 0.4443-0.4803 0.1914-0.12 0.425-0.2206 0.6836-0.333 0.4605-0.2002 0.9732-0.3728 1.3857-0.5176 0.0142-0.0643 0.0209-0.2523-0.0361-0.5176-0.0215-0.0997-0.0505-0.2102-0.0742-0.3135-0.0139-0.0139-0.0231-0.0228-0.0372-0.0371-0.1197-0.1212-0.2459-0.2661-0.3515-0.3887s-0.1854-0.212-0.2403-0.3691l-0.018555-0.01855v-0.01856c-0.17089-0.74677-0.19631-1.1004-0.20312-1.3867 0-0.906 0.81444-1.6074 1.7744-1.6074 0.95998 0 1.7744 0.70143 1.7744 1.6074v0.01855c-0.01002 0.28116-0.00994 0.60697-0.20312 1.3867l-0.018555 0.01855c-0.0498 0.143-0.127 0.2472-0.2216 0.3692-0.0945 0.122-0.2085 0.2493-0.3144 0.3701-0.0497 0.0567-0.0841 0.0973-0.1289 0.1475-0.018801 0.07352-0.041394 0.15008-0.055664 0.22168-0.053192 0.26666-0.02669 0.43958 0 0.49902 0.4768 0.2025 0.9571 0.382 1.3672 0.5547 0.3097 0.1304 0.585 0.263 0.8125 0.4316 0.3071-0.1103 0.6104-0.2163 0.8789-0.3105 0.0207-0.0938 0.0285-0.3671-0.0547-0.7539-0.0312-0.1454-0.0728-0.3074-0.1074-0.458-0.0202-0.0203-0.0332-0.034-0.0537-0.0547-0.1745-0.1767-0.3588-0.3867-0.5127-0.5655-0.154-0.1788-0.2696-0.3099-0.3496-0.539l-0.027343-0.02637v-0.02734c-0.2492-1.0887-0.286-1.604-0.296-2.0215 0-1.3209 1.1873-2.3438 2.5869-2.3438z"/></svg> diff --git a/img/favicon-touch.png b/img/favicon-touch.png Binary files differdeleted file mode 100644 index 51dad72b..00000000 --- a/img/favicon-touch.png +++ /dev/null diff --git a/img/favicon-touch.svg b/img/favicon-touch.svg deleted file mode 100644 index ba2b004f..00000000 --- a/img/favicon-touch.svg +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xml:space="preserve" height="128" width="128" enable-background="new 0 0 595.275 311.111" y="0px" x="0px" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 128 128"><rect rx="20" ry="20" height="128" width="128" y="-.0000015" x="0" fill="#0082c9"/><path style="color:#000000;block-progression:tb;text-transform:none;text-indent:0" fill="#fff" d="m36.408 24.326c-7.6798 0-14.195 5.6165-14.195 12.864 0.0545 2.2909 0.25939 5.116 1.6265 11.09v0.14797l0.14797 0.14797c0.43885 1.2571 1.0775 1.9762 1.9222 2.9574 0.84469 0.98111 1.8517 2.1359 2.8094 3.1052 0.11279 0.11417 0.18488 0.18454 0.2956 0.29595 0.19006 0.82648 0.41998 1.7159 0.59145 2.5138 0.45624 2.1227 0.40946 3.6259 0.2956 4.1402-3.3001 1.1587-7.4056 2.5387-11.09 4.1402-2.0683 0.89919-3.9398 1.7021-5.4709 2.6616-1.5311 0.95952-3.0538 1.6844-3.5486 3.8446-0.0069 0.0983-0.0069 0.1973 0 0.29595-0.48359 4.4406-1.2151 10.971-1.7743 15.378-0.12072 0.92779 0.36824 1.9058 1.1829 2.3659 6.6888 3.6131 16.964 5.0673 27.206 5.0277 10.243-0.04001 20.436-1.5797 26.911-5.0277 0.81462-0.46006 1.3036-1.4381 1.1829-2.3659-0.17867-1.3777-0.39784-4.4844-0.59145-7.5411-0.1935-3.0568-0.36169-6.0638-0.59145-7.8371-0.08002-0.43958-0.28801-0.85508-0.59145-1.1829-2.0569-2.4563-5.1301-3.9577-8.7239-5.4712-3.281-1.3816-7.1276-2.8163-10.942-4.4361-0.21351-0.47558-0.42554-1.8593 0-3.9925 0.11417-0.57279 0.29319-1.1863 0.44361-1.7744 0.35845-0.4015 0.63784-0.72959 1.035-1.183 0.84714-0.9669 1.7574-1.9812 2.5137-2.9573 0.75629-0.97618 1.375-1.8136 1.7743-2.9574l0.14797-0.14797c1.5455-6.238 1.5463-8.8408 1.6265-11.09v-0.14797c0-7.248-6.515-12.864-14.195-12.864zm40.605-11.805c-11.197 0-20.695 8.1882-20.695 18.755 0.07933 3.3399 0.37818 7.4587 2.3713 16.168v0.21558l0.21558 0.21558c0.63984 1.8327 1.571 2.8811 2.8025 4.3116 1.2315 1.4304 2.6997 3.114 4.096 4.5272 0.16418 0.16626 0.26939 0.26939 0.43112 0.43123 0.27698 1.2049 0.61232 2.5017 0.86232 3.6649 0.66516 3.0947 0.59693 5.2864 0.43119 6.0362-4.8114 1.6894-10.797 3.7011-16.168 6.0362-3.0154 1.3109-5.7441 2.4815-7.9764 3.8804s-4.4523 2.4557-5.1739 5.6051c-0.01035 0.14349-0.01035 0.28767 0 0.43123-0.7051 6.4739-1.7716 15.994-2.5869 22.42-0.17591 1.3526 0.53691 2.7785 1.7246 3.4492 9.7521 5.2677 24.733 7.388 39.667 7.3297 14.933-0.058 29.794-2.3029 39.235-7.3297 1.1877-0.67075 1.9006-2.0966 1.7246-3.4492-0.26042-2.0086-0.58003-6.5378-0.86231-10.995-0.28216-4.4565-0.52733-8.8405-0.86225-11.426-0.11693-0.64081-0.41985-1.2466-0.86232-1.7246-2.9989-3.581-7.4794-5.7699-12.719-7.9764-4.7834-2.0142-10.392-4.106-15.953-6.4674-0.31112-0.69337-0.62046-2.7106 0-5.8206 0.1666-0.83507 0.4275-1.7295 0.64674-2.5869 0.52263-0.58534 0.92996-1.0637 1.5091-1.7246 1.2351-1.4096 2.5622-2.8884 3.6649-4.3116 1.1026-1.4231 2.0048-2.644 2.5869-4.3116l0.21558-0.21558c2.2533-9.0944 2.2545-12.889 2.3714-16.168v-0.21558c0-10.567-9.4986-18.755-20.695-18.755z"/></svg> diff --git a/img/favicon.ico b/img/favicon.ico Binary files differdeleted file mode 100644 index 90b18c15..00000000 --- a/img/favicon.ico +++ /dev/null diff --git a/img/favicon.png b/img/favicon.png Binary files differdeleted file mode 100644 index c90bad40..00000000 --- a/img/favicon.png +++ /dev/null diff --git a/img/favicon.svg b/img/favicon.svg deleted file mode 100644 index 009bec74..00000000 --- a/img/favicon.svg +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xml:space="preserve" height="32" width="32" enable-background="new 0 0 595.275 311.111" y="0px" x="0px" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 32 32"><rect rx="5" ry="5" height="32" width="32" y="-.0000052588" x="0" fill="#0082c9"/><path style="color:#000000;block-progression:tb;text-transform:none;text-indent:0" fill="#fff" d="m9.102 6.0816c-1.92 0-3.5487 1.4041-3.5487 3.2161 0.01363 0.57273 0.06485 1.279 0.40663 2.7725v0.03699l0.03699 0.03699c0.10971 0.31427 0.26938 0.49406 0.48055 0.73934s0.46294 0.53398 0.70234 0.7763c0.0282 0.02854 0.04622 0.04613 0.0739 0.07399 0.04751 0.20662 0.105 0.42898 0.14786 0.62844 0.11406 0.53068 0.10236 0.90647 0.0739 1.035-0.82501 0.28969-1.8514 0.63468-2.7724 1.035-0.51706 0.2248-0.98494 0.42554-1.3677 0.66541-0.38277 0.23988-0.76344 0.4211-0.88715 0.96114-0.0017 0.02457-0.0017 0.04932 0 0.07399-0.1209 1.1101-0.30379 2.7427-0.44359 3.8446-0.03018 0.23195 0.09206 0.47645 0.29572 0.59147 1.6722 0.90328 4.241 1.2668 6.8016 1.2569 2.5607-0.01 5.109-0.39492 6.7277-1.2569 0.20365-0.11502 0.3259-0.35953 0.29572-0.59147-0.04467-0.34444-0.09946-1.1211-0.14786-1.8853-0.04838-0.76421-0.09042-1.516-0.14786-1.9593-0.02-0.10989-0.072-0.21377-0.14786-0.29573-0.51423-0.61407-1.2825-0.98942-2.181-1.3678-0.82024-0.34539-1.7819-0.70407-2.7354-1.109-0.05338-0.1189-0.10638-0.46482 0-0.99813 0.02854-0.1432 0.0733-0.29657 0.1109-0.4436 0.08961-0.10037 0.15946-0.1824 0.25876-0.29574 0.21178-0.24172 0.43934-0.4953 0.62841-0.73934s0.34376-0.4534 0.44359-0.73934l0.03699-0.03699c0.38638-1.5595 0.38659-2.2102 0.40663-2.7725v-0.03699c0-1.812-1.6287-3.2161-3.5487-3.2161zm10.151-2.9512c-2.7992 0-5.1738 2.0471-5.1738 4.6888 0.01983 0.83498 0.09454 1.8647 0.59284 4.042v0.05389l0.05389 0.0539c0.15996 0.45818 0.39274 0.72029 0.70062 1.0779 0.30788 0.3576 0.67494 0.77849 1.024 1.1318 0.04105 0.04156 0.06735 0.06735 0.10778 0.10781 0.06925 0.30122 0.15308 0.62541 0.21558 0.91621 0.16629 0.77367 0.14923 1.3216 0.1078 1.5091-1.2028 0.42234-2.6993 0.92527-4.042 1.5091-0.75386 0.32772-1.436 0.62038-1.9941 0.97011-0.55807 0.34971-1.1131 0.61393-1.2935 1.4013-0.0026 0.03587-0.0026 0.07192 0 0.10781-0.17628 1.6185-0.44291 3.9986-0.64673 5.605-0.04398 0.33816 0.13423 0.69462 0.43115 0.86231 2.438 1.3169 6.1832 1.847 9.9167 1.8324 3.7333-0.0145 7.4486-0.57574 9.8089-1.8324 0.29692-0.16769 0.47516-0.52415 0.43115-0.86231-0.0651-0.50214-0.14501-1.6344-0.21558-2.7486-0.07054-1.1141-0.13183-2.2101-0.21556-2.8564-0.02923-0.1602-0.10496-0.31165-0.21558-0.43115-0.74972-0.89526-1.8699-1.4425-3.1798-1.9941-1.1959-0.50355-2.5979-1.0265-3.9881-1.6168-0.07778-0.17334-0.15511-0.67766 0-1.4552 0.04165-0.20877 0.10688-0.43238 0.16168-0.64673 0.13066-0.14634 0.23249-0.26592 0.37726-0.43116 0.30877-0.35241 0.64054-0.7221 0.91621-1.0779 0.27566-0.35578 0.50119-0.661 0.64673-1.0779l0.0539-0.05389c0.565-2.2735 0.565-3.2222 0.594-4.042v-0.05389c0-2.6417-2.3747-4.6888-5.1738-4.6888z"/></svg> diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index a2f3a396..67ef5121 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -23,6 +23,8 @@ namespace OCA\Contacts\AppInfo; use OCA\Contacts\Dav\PatchPlugin; +use OCA\Contacts\Listener\LoadContactsFilesActions; +use OCA\Files\Event\LoadAdditionalScriptsEvent; use OCP\AppFramework\App; use OCP\EventDispatcher\IEventDispatcher; use OCP\SabrePluginEvent; @@ -53,5 +55,8 @@ class Application extends App { $server->addPlugin($this->getContainer()->query(PatchPlugin::class)); } }); + + // Register files action + $eventDispatcher->addServiceListener(LoadAdditionalScriptsEvent::class, LoadContactsFilesActions::class); } } diff --git a/lib/Dav/PatchPlugin.php b/lib/Dav/PatchPlugin.php index 61f36b7a..6ef5fb4d 100644 --- a/lib/Dav/PatchPlugin.php +++ b/lib/Dav/PatchPlugin.php @@ -34,7 +34,6 @@ use Sabre\DAV\Server; use Sabre\DAV\ServerPlugin; use Sabre\HTTP\RequestInterface; use Sabre\HTTP\ResponseInterface; -use Sabre\VObject\Component\VCard; use Sabre\VObject\Reader; class PatchPlugin extends ServerPlugin { diff --git a/lib/Listener/LoadContactsFilesActions.php b/lib/Listener/LoadContactsFilesActions.php new file mode 100644 index 00000000..b60a525c --- /dev/null +++ b/lib/Listener/LoadContactsFilesActions.php @@ -0,0 +1,44 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2020, John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Contacts\Listener; + +use OCA\Contacts\AppInfo\Application; +use OCA\Files\Event\LoadAdditionalScriptsEvent; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\Util; + +class LoadContactsFilesActions implements IEventListener { + public function handle(Event $event): void { + if (!($event instanceof LoadAdditionalScriptsEvent)) { + return; + } + + Util::addStyle(Application::APP_ID, 'icons'); + Util::addScript(Application::APP_ID, 'contacts-files-action'); + } +} diff --git a/src/components/ContactDetails.vue b/src/components/ContactDetails.vue index 0735a3d0..58d68ff6 100644 --- a/src/components/ContactDetails.vue +++ b/src/components/ContactDetails.vue @@ -23,7 +23,7 @@ <template> <div id="contact-details" class="app-content-details"> <!-- nothing selected or contact not found --> - <EmptyContent v-if="!contact && !loading" icon="icon-contacts-dark"> + <EmptyContent v-if="!contact && !loading" icon="icon-contacts"> {{ t('contacts', 'No contact selected') }} <template #desc> {{ t('contacts', 'Select a contact on the list to begin') }} @@ -31,7 +31,7 @@ </EmptyContent> <!-- loading --> - <EmptyContent v-else-if="loading" icon="icon-contacts-dark"> + <EmptyContent v-else-if="loading" icon="icon-contacts"> {{ t('contacts', 'Loading contacts …') }} </EmptyContent> diff --git a/src/components/ProcessingScreen.vue b/src/components/ProcessingScreen.vue index ab1d0844..9a666732 100644 --- a/src/components/ProcessingScreen.vue +++ b/src/components/ProcessingScreen.vue @@ -1,5 +1,5 @@ <template> - <EmptyContent class="processing-screen__wrapper" icon="icon-contacts-dark"> + <EmptyContent class="processing-screen__wrapper" icon="icon-contacts"> <slot /> <template #desc> <div class="processing-screen__progress"> diff --git a/src/components/Properties/PropertyGroups.vue b/src/components/Properties/PropertyGroups.vue index 63990e08..bb1b03f2 100644 --- a/src/components/Properties/PropertyGroups.vue +++ b/src/components/Properties/PropertyGroups.vue @@ -23,7 +23,7 @@ <template> <div v-if="propModel" class="grid-span-2 property property--without-actions"> <PropertyTitle - icon="icon-contacts-dark" + icon="icon-contacts" :readable-name="t('contacts', 'Groups')" /> <div class="property__row"> diff --git a/src/components/Settings/SettingsImportContacts.vue b/src/components/Settings/SettingsImportContacts.vue index db53be5f..b399ce41 100644 --- a/src/components/Settings/SettingsImportContacts.vue +++ b/src/components/Settings/SettingsImportContacts.vue @@ -170,6 +170,20 @@ export default { return this.importState.stage !== 'default' }, }, + + async mounted() { + // Direct import check + if (this.$route.name === 'import') { + const path = this.$route.query.file + this.processLocalFile(path) + + this.$router.push({ + name: 'group', + params: { selectedGroup: t('contacts', 'All contacts') }, + }) + } + }, + methods: { /** * Process input type file change @@ -196,6 +210,27 @@ export default { reader.readAsText(file) }, + async processLocalFile(path) { + try { + // prepare cancel token for axios request + const source = CancelToken.source() + this.cancelRequest = source.cancel + + const file = await axios.get(generateRemoteUrl(`dav/files/${getCurrentUser().uid}`) + encodePath(path), { + cancelToken: source.token, + }) + + this.$store.dispatch('changeStage', 'parsing') + this.$store.dispatch('setAddressbook', this.selectedAddressbook.displayName) + + if (file.data) { + await this.$store.dispatch('importContactsIntoAddressbook', { vcf: file.data, addressbook: this.selectedAddressbook }) + } + } catch (error) { + console.error('Something wrong happened while processing local file', error) + } + }, + toggleModal() { this.isOpened = !this.isOpened // cancel any ongoing request if closed @@ -217,22 +252,9 @@ export default { // unlikely, but let's cancel any previous request this.cancelRequest() - // prepare cancel token for axios request - const source = CancelToken.source() - this.cancelRequest = source.cancel - - // pick and retrieve file + // pick, retrieve & process file const path = await picker.pick() - const file = await axios.get(generateRemoteUrl(`dav/files/${getCurrentUser().uid}`) + encodePath(path), { - cancelToken: source.token, - }) - - this.$store.dispatch('changeStage', 'parsing') - this.$store.dispatch('setAddressbook', this.selectedAddressbook.displayName) - - if (file.data) { - await this.$store.dispatch('importContactsIntoAddressbook', { vcf: file.data, addressbook: this.selectedAddressbook }) - } + await this.processLocalFile(path) } catch (error) { console.error('Something wrong happened while picking a file', error) } finally { diff --git a/src/files_action.js b/src/files_action.js new file mode 100644 index 00000000..67de8f46 --- /dev/null +++ b/src/files_action.js @@ -0,0 +1,38 @@ +/** + * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +import { generateUrl } from '@nextcloud/router' + +window.addEventListener('DOMContentLoaded', () => { + if (OCA.Files && OCA.Files.fileActions) { + OCA.Files.fileActions.registerAction({ + name: 'contacts_import', + displayName: t('contacts', 'Import'), + mime: 'text/vcard', + permissions: OC.PERMISSION_READ, + iconClass: 'icon-contacts', + actionHandler: function(fileName, context) { + const absPath = `${context.dir === '/' ? '' : context.dir}/${fileName}` + window.location = generateUrl(`/apps/contacts/import?file=${absPath}`) + }, + }) + } +}) diff --git a/src/router/index.js b/src/router/index.js index eb2c9758..5f6c31b6 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -46,6 +46,11 @@ export default new Router({ }, children: [ { + path: 'import', + name: 'import', + component: Contacts, + }, + { path: ':selectedGroup', name: 'group', component: Contacts, diff --git a/templates/main.php b/templates/main.php index c6f17ca5..13478097 100644 --- a/templates/main.php +++ b/templates/main.php @@ -3,7 +3,7 @@ if (\OCP\Util::isIe()) { ?> <div id="app-content"> <div class="emptycontent"> - <div class="icon-contacts-dark"></div> + <div class="icon-contacts"></div> <h2><?php p($l->t('Your web browser is out of date')); ?></h2> <p><?php p($l->t('This application is not compatible with Internet Explorer')); ?></p> </div> diff --git a/webpack.common.js b/webpack.common.js index 94dca3a8..040ea064 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -7,39 +7,49 @@ const appVersion = JSON.stringify(packageJson.version) module.exports = { entry: { +<<<<<<< HEAD adminSettings: path.join(__dirname, 'src', 'adminSettings.js'), contacts: path.join(__dirname, 'src', 'main.js'), +======= + [appName]: path.join(__dirname, 'src', 'main.js'), + 'contacts-files-action': path.join(__dirname, 'src', 'files_action.js'), +>>>>>>> fa9c8847... Import vcf from files }, output: { path: path.resolve(__dirname, './js'), publicPath: '/js/', +<<<<<<< HEAD chunkFilename: 'chunks/[name]-[hash].js' +======= + filename: '[name].js', + chunkFilename: 'chunks/[name]-[hash].js', +>>>>>>> fa9c8847... Import vcf from files }, module: { rules: [ { test: /\.css$/, - use: ['vue-style-loader', 'css-loader'] + use: ['vue-style-loader', 'css-loader'], }, { test: /\.scss$/, - use: ['vue-style-loader', 'css-loader', 'sass-loader'] + use: ['vue-style-loader', 'css-loader', 'sass-loader'], }, { test: /\.(js|vue)$/, use: 'eslint-loader', exclude: /node_modules/, - enforce: 'pre' + enforce: 'pre', }, { test: /\.vue$/, loader: 'vue-loader', - exclude: /node_modules/ + exclude: /node_modules/, }, { test: /\.js$/, loader: 'babel-loader', - exclude: /node_modules/ + exclude: /node_modules/, } ] }, @@ -47,10 +57,10 @@ module.exports = { new VueLoaderPlugin(), new StyleLintPlugin(), new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), - new webpack.DefinePlugin({ appVersion }) + new webpack.DefinePlugin({ appVersion }), ], resolve: { extensions: ['*', '.js', '.vue'], symlinks: false, - } + }, } |