A music player that connects to your cloud/distributed storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Closes #44

+98 -476
-8
Makefile
··· 14 14 15 15 16 16 # 17 - # Setup tasks 18 - # 19 - 20 - elm-install: 21 - $(NODE_BIN)/elm-install 22 - 23 - 24 - # 25 17 # Build tasks 26 18 # 27 19
-1
README.md
··· 24 24 brew install nodejs 25 25 26 26 npm install 27 - make elm-install 28 27 ``` 29 28 30 29
+1 -7
elm-package.json
··· 2 2 "version": "1.0.0", 3 3 "summary": "Ongaku Ryoho", 4 4 "repository": "https://github.com/icidasset/ongaku-ryoho.git", 5 - "license": "BSD3", 6 - "native-modules": true, 5 + "license": "MIT", 7 6 "source-directories": [ 8 7 "src/App", 9 8 "src/Css", ··· 28 27 "eskimoblood/elm-color-extra": "5.0.0 <= v < 6.0.0", 29 28 "etaque/elm-response": "3.0.0 <= v < 4.0.0", 30 29 "evancz/url-parser": "2.0.1 <= v < 3.0.0", 31 - "fredcy/localstorage": "1.0.0 <= v < 2.0.0", 32 30 "jinjor/elm-debounce": "2.1.0 <= v < 2.2.0", 33 31 "justinmimbs/elm-date-extra": "2.0.3 <= v < 3.0.0", 34 32 "lukewestby/elm-string-interpolate": "1.0.1 <= v < 2.0.0", ··· 36 34 "rtfeldman/elm-css-helpers": "2.1.0 <= v < 3.0.0", 37 35 "rtfeldman/elm-css-util": "1.0.2 <= v < 2.0.0", 38 36 "rtfeldman/hex": "1.0.0 <= v < 2.0.0", 39 - "simonh1000/file-reader": "1.0.0 <= v < 2.0.0", 40 37 "scottcorgan/elm-css-normalize": "1.1.9 <= v < 2.0.0", 41 38 "spisemisu/elm-sha": "1.0.5 <= v < 1.0.6", 42 39 "spisemisu/elm-utf8": "1.0.1 <= v < 1.0.2", 43 40 "truqu/elm-base64": "2.0.1 <= v < 3.0.0" 44 - }, 45 - "dependency-sources": { 46 - "simonh1000/file-reader": "git@github.com:simonh1000/file-reader" 47 41 }, 48 42 "elm-version": "0.18.0 <= v < 0.19.0" 49 43 }
+1 -420
package-lock.json
··· 23 23 "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", 24 24 "dev": true 25 25 }, 26 - "adm-zip": { 27 - "version": "0.4.7", 28 - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", 29 - "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", 30 - "dev": true 31 - }, 32 26 "ajv": { 33 27 "version": "4.11.8", 34 28 "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", ··· 168 162 "util": "0.10.3" 169 163 } 170 164 }, 171 - "assert-plus": { 172 - "version": "0.2.0", 173 - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 174 - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", 175 - "dev": true 176 - }, 177 165 "astw": { 178 166 "version": "2.2.0", 179 167 "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", ··· 211 199 "postcss": "6.0.11", 212 200 "postcss-value-parser": "3.3.0" 213 201 } 214 - }, 215 - "aws-sign2": { 216 - "version": "0.6.0", 217 - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 218 - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", 219 - "dev": true 220 202 }, 221 203 "aws4": { 222 204 "version": "1.6.0", ··· 290 272 "wif": "2.0.6" 291 273 } 292 274 }, 293 - "bl": { 294 - "version": "1.1.2", 295 - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", 296 - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", 297 - "dev": true, 298 - "requires": { 299 - "readable-stream": "2.0.6" 300 - }, 301 - "dependencies": { 302 - "readable-stream": { 303 - "version": "2.0.6", 304 - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 305 - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 306 - "dev": true, 307 - "requires": { 308 - "core-util-is": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 309 - "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 310 - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 311 - "process-nextick-args": "http://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 312 - "string_decoder": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 313 - "util-deprecate": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 314 - } 315 - } 316 - } 317 - }, 318 275 "block-stream": { 319 276 "version": "0.0.9", 320 277 "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", ··· 371 328 "version": "1.0.0", 372 329 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", 373 330 "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 374 - }, 375 - "boom": { 376 - "version": "2.10.1", 377 - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 378 - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 379 - "dev": true, 380 - "requires": { 381 - "hoek": "2.16.3" 382 - } 383 331 }, 384 332 "brace-expansion": { 385 333 "version": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", ··· 1351 1299 "which": "http://registry.npmjs.org/which/-/which-1.2.12.tgz" 1352 1300 } 1353 1301 }, 1354 - "cryptiles": { 1355 - "version": "2.0.5", 1356 - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 1357 - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 1358 - "dev": true, 1359 - "requires": { 1360 - "boom": "2.10.1" 1361 - } 1362 - }, 1363 1302 "crypto": { 1364 1303 "version": "0.0.3", 1365 1304 "resolved": "https://registry.npmjs.org/crypto/-/crypto-0.0.3.tgz", ··· 1647 1586 } 1648 1587 } 1649 1588 }, 1650 - "elm-github-install": { 1651 - "version": "1.6.1", 1652 - "resolved": "https://registry.npmjs.org/elm-github-install/-/elm-github-install-1.6.1.tgz", 1653 - "integrity": "sha1-vKmpHn3gl9DoL+TgCL4hY8LZddY=", 1654 - "dev": true, 1655 - "requires": { 1656 - "adm-zip": "0.4.7", 1657 - "progress": "2.0.0", 1658 - "request": "2.74.0", 1659 - "request-progress": "3.0.0", 1660 - "shelljs": "0.7.5", 1661 - "tar-fs": "1.15.0", 1662 - "tmp": "0.0.31" 1663 - }, 1664 - "dependencies": { 1665 - "ansi-regex": { 1666 - "version": "2.1.1", 1667 - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1668 - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1669 - "dev": true 1670 - }, 1671 - "ansi-styles": { 1672 - "version": "2.2.1", 1673 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 1674 - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 1675 - "dev": true 1676 - }, 1677 - "async": { 1678 - "version": "2.5.0", 1679 - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", 1680 - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", 1681 - "dev": true, 1682 - "requires": { 1683 - "lodash": "4.17.4" 1684 - } 1685 - }, 1686 - "caseless": { 1687 - "version": "0.11.0", 1688 - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", 1689 - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", 1690 - "dev": true 1691 - }, 1692 - "chalk": { 1693 - "version": "1.1.3", 1694 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1695 - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1696 - "dev": true, 1697 - "requires": { 1698 - "ansi-styles": "2.2.1", 1699 - "escape-string-regexp": "1.0.5", 1700 - "has-ansi": "2.0.0", 1701 - "strip-ansi": "3.0.1", 1702 - "supports-color": "2.0.0" 1703 - } 1704 - }, 1705 - "escape-string-regexp": { 1706 - "version": "1.0.5", 1707 - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1708 - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1709 - "dev": true 1710 - }, 1711 - "form-data": { 1712 - "version": "1.0.1", 1713 - "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.1.tgz", 1714 - "integrity": "sha1-rjFduaSQf6BlUCMEpm13M0de43w=", 1715 - "dev": true, 1716 - "requires": { 1717 - "async": "2.5.0", 1718 - "combined-stream": "1.0.5", 1719 - "mime-types": "2.1.16" 1720 - } 1721 - }, 1722 - "har-validator": { 1723 - "version": "2.0.6", 1724 - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", 1725 - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", 1726 - "dev": true, 1727 - "requires": { 1728 - "chalk": "1.1.3", 1729 - "commander": "2.9.0", 1730 - "is-my-json-valid": "2.16.1", 1731 - "pinkie-promise": "2.0.1" 1732 - } 1733 - }, 1734 - "has-ansi": { 1735 - "version": "2.0.0", 1736 - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1737 - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1738 - "dev": true, 1739 - "requires": { 1740 - "ansi-regex": "2.1.1" 1741 - } 1742 - }, 1743 - "lodash": { 1744 - "version": "4.17.4", 1745 - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 1746 - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 1747 - "dev": true 1748 - }, 1749 - "os-tmpdir": { 1750 - "version": "1.0.2", 1751 - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1752 - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1753 - "dev": true 1754 - }, 1755 - "pinkie": { 1756 - "version": "2.0.4", 1757 - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1758 - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1759 - "dev": true 1760 - }, 1761 - "pinkie-promise": { 1762 - "version": "2.0.1", 1763 - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1764 - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1765 - "dev": true, 1766 - "requires": { 1767 - "pinkie": "2.0.4" 1768 - } 1769 - }, 1770 - "progress": { 1771 - "version": "2.0.0", 1772 - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1773 - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", 1774 - "dev": true 1775 - }, 1776 - "qs": { 1777 - "version": "6.2.3", 1778 - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", 1779 - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", 1780 - "dev": true 1781 - }, 1782 - "request": { 1783 - "version": "2.74.0", 1784 - "resolved": "https://registry.npmjs.org/request/-/request-2.74.0.tgz", 1785 - "integrity": "sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs=", 1786 - "dev": true, 1787 - "requires": { 1788 - "aws-sign2": "0.6.0", 1789 - "aws4": "1.6.0", 1790 - "bl": "1.1.2", 1791 - "caseless": "0.11.0", 1792 - "combined-stream": "1.0.5", 1793 - "extend": "3.0.1", 1794 - "forever-agent": "0.6.1", 1795 - "form-data": "1.0.1", 1796 - "har-validator": "2.0.6", 1797 - "hawk": "3.1.3", 1798 - "http-signature": "1.1.1", 1799 - "is-typedarray": "1.0.0", 1800 - "isstream": "0.1.2", 1801 - "json-stringify-safe": "5.0.1", 1802 - "mime-types": "2.1.16", 1803 - "node-uuid": "1.4.8", 1804 - "oauth-sign": "0.8.2", 1805 - "qs": "6.2.3", 1806 - "stringstream": "0.0.5", 1807 - "tough-cookie": "2.3.2", 1808 - "tunnel-agent": "0.4.3" 1809 - } 1810 - }, 1811 - "strip-ansi": { 1812 - "version": "3.0.1", 1813 - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1814 - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1815 - "dev": true, 1816 - "requires": { 1817 - "ansi-regex": "2.1.1" 1818 - } 1819 - }, 1820 - "supports-color": { 1821 - "version": "2.0.0", 1822 - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1823 - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1824 - "dev": true 1825 - }, 1826 - "tmp": { 1827 - "version": "0.0.31", 1828 - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", 1829 - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", 1830 - "dev": true, 1831 - "requires": { 1832 - "os-tmpdir": "1.0.2" 1833 - } 1834 - }, 1835 - "tunnel-agent": { 1836 - "version": "0.4.3", 1837 - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", 1838 - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", 1839 - "dev": true 1840 - } 1841 - } 1842 - }, 1843 1589 "encoding": { 1844 1590 "version": "0.1.12", 1845 1591 "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 1846 1592 "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 1847 1593 "requires": { 1848 1594 "iconv-lite": "0.4.19" 1849 - } 1850 - }, 1851 - "end-of-stream": { 1852 - "version": "1.4.0", 1853 - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", 1854 - "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", 1855 - "dev": true, 1856 - "requires": { 1857 - "once": "http://registry.npmjs.org/once/-/once-1.4.0.tgz" 1858 1595 } 1859 1596 }, 1860 1597 "entities": { ··· 2850 2587 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 2851 2588 "dev": true 2852 2589 }, 2853 - "generate-function": { 2854 - "version": "2.0.0", 2855 - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", 2856 - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", 2857 - "dev": true 2858 - }, 2859 - "generate-object-property": { 2860 - "version": "1.2.0", 2861 - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 2862 - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 2863 - "dev": true, 2864 - "requires": { 2865 - "is-property": "1.0.2" 2866 - } 2867 - }, 2868 2590 "get-caller-file": { 2869 2591 "version": "http://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", 2870 2592 "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", ··· 3032 2754 "integrity": "sha1-mbJGuNF7l4NwY0ZdVRmB1j3J5ME=", 3033 2755 "requires": { 3034 2756 "tape": "3.6.1" 3035 - } 3036 - }, 3037 - "hawk": { 3038 - "version": "3.1.3", 3039 - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 3040 - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 3041 - "dev": true, 3042 - "requires": { 3043 - "boom": "2.10.1", 3044 - "cryptiles": "2.0.5", 3045 - "hoek": "2.16.3", 3046 - "sntp": "1.0.9" 3047 2757 } 3048 2758 }, 3049 2759 "hmac-drbg": { ··· 3055 2765 "minimalistic-crypto-utils": "http://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" 3056 2766 } 3057 2767 }, 3058 - "hoek": { 3059 - "version": "2.16.3", 3060 - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 3061 - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", 3062 - "dev": true 3063 - }, 3064 2768 "hosted-git-info": { 3065 2769 "version": "http://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.2.0.tgz", 3066 2770 "integrity": "sha1-eg0JeGPYhsD6u9zTe/F1jYvs+KU=", ··· 3085 2789 "readable-stream": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz" 3086 2790 } 3087 2791 }, 3088 - "http-signature": { 3089 - "version": "1.1.1", 3090 - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 3091 - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 3092 - "dev": true, 3093 - "requires": { 3094 - "assert-plus": "0.2.0", 3095 - "jsprim": "1.4.1", 3096 - "sshpk": "1.13.1" 3097 - } 3098 - }, 3099 2792 "https-browserify": { 3100 2793 "version": "1.0.0", 3101 2794 "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", ··· 3190 2883 } 3191 2884 } 3192 2885 }, 3193 - "interpret": { 3194 - "version": "1.0.3", 3195 - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", 3196 - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", 3197 - "dev": true 3198 - }, 3199 2886 "invert-kv": { 3200 2887 "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 3201 2888 "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", ··· 3278 2965 "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" 3279 2966 } 3280 2967 }, 3281 - "is-my-json-valid": { 3282 - "version": "2.16.1", 3283 - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", 3284 - "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", 3285 - "dev": true, 3286 - "requires": { 3287 - "generate-function": "2.0.0", 3288 - "generate-object-property": "1.2.0", 3289 - "jsonpointer": "4.0.1", 3290 - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" 3291 - } 3292 - }, 3293 2968 "is-number": { 3294 2969 "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", 3295 2970 "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", ··· 3306 2981 "is-primitive": { 3307 2982 "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", 3308 2983 "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", 3309 - "dev": true 3310 - }, 3311 - "is-property": { 3312 - "version": "1.0.2", 3313 - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 3314 - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 3315 2984 "dev": true 3316 2985 }, 3317 2986 "is-stream": { ··· 3411 3080 "version": "1.3.1", 3412 3081 "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 3413 3082 "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 3414 - "dev": true 3415 - }, 3416 - "jsonpointer": { 3417 - "version": "4.0.1", 3418 - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 3419 - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 3420 3083 "dev": true 3421 3084 }, 3422 3085 "jsontokens": { ··· 3878 3541 "encoding": "0.1.12", 3879 3542 "is-stream": "1.1.0" 3880 3543 } 3881 - }, 3882 - "node-uuid": { 3883 - "version": "1.4.8", 3884 - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", 3885 - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", 3886 - "dev": true 3887 3544 }, 3888 3545 "normalize-package-data": { 3889 3546 "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", ··· 5499 5156 "randombytes": "http://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz" 5500 5157 } 5501 5158 }, 5502 - "pump": { 5503 - "version": "1.0.2", 5504 - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", 5505 - "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", 5506 - "dev": true, 5507 - "requires": { 5508 - "end-of-stream": "1.4.0", 5509 - "once": "http://registry.npmjs.org/once/-/once-1.4.0.tgz" 5510 - } 5511 - }, 5512 5159 "punycode": { 5513 5160 "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 5514 5161 "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" ··· 5601 5248 "minimatch": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", 5602 5249 "readable-stream": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz", 5603 5250 "set-immediate-shim": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" 5604 - } 5605 - }, 5606 - "rechoir": { 5607 - "version": "0.6.2", 5608 - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 5609 - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 5610 - "dev": true, 5611 - "requires": { 5612 - "resolve": "http://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz" 5613 5251 } 5614 5252 }, 5615 5253 "regex-cache": { ··· 5758 5396 } 5759 5397 } 5760 5398 }, 5761 - "request-progress": { 5762 - "version": "3.0.0", 5763 - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", 5764 - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", 5765 - "dev": true, 5766 - "requires": { 5767 - "throttleit": "1.0.0" 5768 - } 5769 - }, 5770 5399 "require-directory": { 5771 5400 "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 5772 5401 "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", ··· 5896 5525 "jsonify": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" 5897 5526 } 5898 5527 }, 5899 - "shelljs": { 5900 - "version": "0.7.5", 5901 - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.5.tgz", 5902 - "integrity": "sha1-Lu96UKIeHM832gDfdn7GnjCtBnU=", 5903 - "dev": true, 5904 - "requires": { 5905 - "glob": "http://registry.npmjs.org/glob/-/glob-7.1.1.tgz", 5906 - "interpret": "1.0.3", 5907 - "rechoir": "0.6.2" 5908 - } 5909 - }, 5910 5528 "sigmund": { 5911 5529 "version": "1.0.1", 5912 5530 "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", ··· 5917 5535 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 5918 5536 "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 5919 5537 "dev": true 5920 - }, 5921 - "sntp": { 5922 - "version": "1.0.9", 5923 - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 5924 - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 5925 - "dev": true, 5926 - "requires": { 5927 - "hoek": "2.16.3" 5928 - } 5929 5538 }, 5930 5539 "source-map": { 5931 5540 "version": "0.5.7", ··· 6401 6010 "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 6402 6011 } 6403 6012 }, 6404 - "tar-fs": { 6405 - "version": "1.15.0", 6406 - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.0.tgz", 6407 - "integrity": "sha1-dMl9x3NzfCrqy//yRsZU1lKKUxU=", 6408 - "dev": true, 6409 - "requires": { 6410 - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 6411 - "pump": "1.0.2", 6412 - "tar-stream": "1.5.4" 6413 - } 6414 - }, 6415 - "tar-stream": { 6416 - "version": "1.5.4", 6417 - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", 6418 - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", 6419 - "dev": true, 6420 - "requires": { 6421 - "bl": "1.1.2", 6422 - "end-of-stream": "1.4.0", 6423 - "readable-stream": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.2.3.tgz", 6424 - "xtend": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" 6425 - } 6426 - }, 6427 6013 "tar.gz": { 6428 6014 "version": "0.1.1", 6429 6015 "resolved": "https://registry.npmjs.org/tar.gz/-/tar.gz-0.1.1.tgz", ··· 6487 6073 "rimraf": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" 6488 6074 } 6489 6075 }, 6490 - "throttleit": { 6491 - "version": "1.0.0", 6492 - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 6493 - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 6494 - "dev": true 6495 - }, 6496 6076 "through": { 6497 6077 "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 6498 6078 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" ··· 6541 6121 "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 6542 6122 "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", 6543 6123 "dev": true, 6124 + "optional": true, 6544 6125 "requires": { 6545 6126 "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" 6546 6127 }
-1
package.json
··· 4 4 "autoprefixer": "^7.1.4", 5 5 "browserify": "^14.4.0", 6 6 "elm-css": "^0.6.1", 7 - "elm-github-install": "^1.6.1", 8 7 "postcss-cli": "^4.1.1", 9 8 "surge": "^0.19.0" 10 9 },
+18
src/App/Abroad/Ports.elm
··· 1 + port module Abroad.Ports exposing (..) 2 + 3 + -- 💡 4 + 5 + 6 + importFileInputId : String 7 + importFileInputId = 8 + "importFileInput" 9 + 10 + 11 + port importData : String -> Cmd msg 12 + 13 + 14 + 15 + -- 🚽 16 + 17 + 18 + port importDataReady : (Maybe String -> msg) -> Sub msg
+25 -16
src/App/Abroad/State.elm
··· 1 1 module Abroad.State exposing (..) 2 2 3 + import Abroad.Ports as Ports 3 4 import Abroad.Types exposing (..) 4 - import FileReader exposing (readAsTextFile) 5 + import Base64 6 + import Json.Decode 5 7 import Response.Ext exposing (do) 6 8 import Task 7 9 import Types as TopLevel ··· 12 14 13 15 initialModel : Model 14 16 initialModel = 15 - { files = [] 17 + { fileContents = Nothing 18 + , fileSelected = False 16 19 , importMessage = Ok "" 17 20 } 18 21 ··· 24 27 update : Msg -> Model -> ( Model, Cmd TopLevel.Msg ) 25 28 update msg model = 26 29 case msg of 27 - SetFiles files -> 30 + FileSelectedForImport -> 28 31 (!) 29 - { model | files = files, importMessage = Ok "" } 32 + { model | fileSelected = True } 30 33 [] 31 34 32 - UploadFiles -> 33 - model.files 34 - |> List.map 35 - (.blob 36 - >> readAsTextFile 37 - >> Task.attempt (ReadFile >> TopLevel.AbroadMsg) 38 - ) 39 - |> (!) { model | importMessage = Ok "Importing ..." } 35 + Import -> 36 + (!) 37 + { model | importMessage = Ok "Importing ..." } 38 + [ Ports.importData Ports.importFileInputId ] 40 39 41 - ReadFile (Ok str) -> 40 + ImportFinished (Just json) -> 42 41 (!) 43 42 { model | importMessage = Ok "Imported data successfully" } 44 - [ do (TopLevel.ImportUserData str) ] 43 + [ do (TopLevel.ImportUserData json) ] 45 44 46 - ReadFile (Err err) -> 45 + ImportFinished Nothing -> 47 46 (!) 48 - { model | importMessage = Err (toString err) } 47 + { model | importMessage = Err "Import failed, could not read file" } 49 48 [] 49 + 50 + 51 + 52 + -- 🌱 53 + 54 + 55 + subscriptions : Model -> Sub Msg 56 + subscriptions _ = 57 + Sub.batch 58 + [ Ports.importDataReady ImportFinished ]
+5 -7
src/App/Abroad/Types.elm
··· 1 1 module Abroad.Types exposing (..) 2 2 3 - import FileReader 4 - 5 - 6 3 -- Messages 7 4 8 5 9 6 type Msg 10 - = UploadFiles 11 - | ReadFile (Result FileReader.Error String) 12 - | SetFiles (List FileReader.NativeFile) 7 + = FileSelectedForImport 8 + | Import 9 + | ImportFinished (Maybe String) 13 10 14 11 15 12 ··· 17 14 18 15 19 16 type alias Model = 20 - { files : List FileReader.NativeFile 17 + { fileContents : Maybe String 18 + , fileSelected : Bool 21 19 , importMessage : Result String String 22 20 }
+23 -13
src/App/Abroad/View.elm
··· 1 1 module Abroad.View exposing (..) 2 2 3 + import Abroad.Ports 3 4 import Abroad.Types exposing (Msg(..)) 4 5 import Authentication.UserData 5 6 import Color.Convert exposing (colorToCssRgb) 6 - import FileReader exposing (onFileChange) 7 7 import Html exposing (..) 8 8 import Html.Attributes exposing (..) 9 - import Html.Events exposing (onSubmit) 9 + import Html.Events exposing (on, onSubmit) 10 + import Json.Decode 10 11 import Material.Icons.Navigation as Icons 11 12 import Navigation.View as Navigation 12 13 import Routing.Types ··· 52 53 """ 53 54 ] 54 55 , Html.form 55 - [ onSubmit (AbroadMsg UploadFiles) 56 + [ onSubmit (AbroadMsg Import) 56 57 ] 57 58 [ importView model 58 59 , exportView model ··· 72 73 [ label 73 74 [] 74 75 [ text "Import" ] 76 + 77 + -- Input 78 + -- 75 79 , input 76 - [ type_ "file" 77 - , name "fileInput" 78 - , id "fileInput" 79 - , accept ".json" 80 - , onFileChange (SetFiles >> AbroadMsg) 80 + [ accept ".json" 81 + , id Abroad.Ports.importFileInputId 82 + , name Abroad.Ports.importFileInputId 83 + , on "change" (Json.Decode.succeed <| AbroadMsg FileSelectedForImport) 84 + , type_ "file" 81 85 ] 82 86 [] 87 + 88 + -- Label 89 + -- 83 90 , label 84 - [ for "fileInput" 91 + [ for Abroad.Ports.importFileInputId 85 92 , cssClasses [ Button, ButtonSubtle ] 86 93 ] 87 94 [ text "Choose file" ] 88 - , if List.isEmpty model.abroad.files then 89 - text "" 90 - else 95 + , if model.abroad.fileSelected then 91 96 button 92 97 [ cssClasses [ Button ] 93 98 , type_ "submit" 94 99 ] 95 100 [ text "Import" ] 101 + else 102 + text "" 103 + 104 + -- Message 105 + -- 96 106 , em 97 107 [ style 98 108 [ ( "display", "block" ) ··· 102 112 ] 103 113 [ case model.abroad.importMessage of 104 114 Ok "" -> 105 - if List.isEmpty model.abroad.files == False then 115 + if model.abroad.fileSelected then 106 116 span 107 117 [] 108 118 [ text "Click on the "
+1 -1
src/App/Authentication/Demo.elm
··· 3 3 import Base64 4 4 5 5 6 - {-| Demo user data which is used on first sign-in (encode as base64). 6 + {-| Demo user data which is used on first sign-in (encoded as base64). 7 7 -} 8 8 data : String 9 9 data =
+1 -2
src/App/Authentication/State.elm
··· 324 324 subscriptions : Model -> Sub Msg 325 325 subscriptions _ = 326 326 Sub.batch 327 - [ Ports.authenticationEventResult toMessage 328 - ] 327 + [ Ports.authenticationEventResult toMessage ] 329 328 330 329 331 330 toMessage : OutsideEvent -> Msg
+1
src/App/State.elm
··· 382 382 , Ports.setIsTouchDevice SetIsTouchDevice 383 383 384 384 -- Children 385 + , Sub.map AbroadMsg <| Abroad.subscriptions model.abroad 385 386 , Sub.map AuthenticationMsg <| Authentication.subscriptions model.authentication 386 387 , Sub.map ConsoleMsg <| Console.subscriptions model.console 387 388 , Sub.map EqualizerMsg <| Equalizer.subscriptions model.equalizer
+22
src/Js/elm-loader.js
··· 15 15 16 16 17 17 // 18 + // > Abroad 19 + 20 + app.ports.importData.subscribe(id => { 21 + const node = document.getElementById(id); 22 + if (node == null) return; 23 + 24 + const file = node.files[0]; 25 + const reader = new FileReader(); 26 + 27 + reader.onload = event => { 28 + const encodedJson = event.target.result.substr(29); 29 + const json = atob(encodedJson); 30 + 31 + app.ports.importDataReady.send(json); 32 + }; 33 + 34 + reader.readAsDataURL(file); 35 + }); 36 + 37 + 38 + 39 + // 18 40 // > Authentication 19 41 20 42 app.ports.authenticationEvent.subscribe(event => {