diff --git a/.gitignore b/.gitignore index 90ceb143..f11c4ce0 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,5 @@ server/media/ # pyenv .python-version + +.coverage diff --git a/Pipfile b/Pipfile index 7f91aaaa..55793104 100644 --- a/Pipfile +++ b/Pipfile @@ -35,3 +35,5 @@ django-libsass = "*" bleach = "*" newrelic = "*" sentry-sdk = "==0.7.2" +"django-sendgrid-v5" = "*" +coverage = "*" diff --git a/Pipfile.lock b/Pipfile.lock index b30e0f53..3938e957 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "61e358e30d3f66b4b69ac4ad424c24401d367fc483aaffeac28d970a418066aa" + "sha256": "97ff5ca56ac835d40353e34e32ec8333ccb23822bcf971644b7641429d9774e1" }, "pipfile-spec": 6, "requires": { @@ -41,25 +41,25 @@ }, "boto3": { "hashes": [ - "sha256:0bed0db8c10b88b3daa042adaa1fb6c3262caed39d28086e8548015405c71744", - "sha256:70e71e0192a68f65754ab9d2a335be3c6856a1e8a15f3bd6263ea12e2f442bc7" + "sha256:3927beac97e5467f869d63d60920b83c2d39964f69fbf944bc1db724116bfe1a", + "sha256:be88cae6f16bb9fe3b850b6c8259b297f60b46855175cadae57594c9a403c582" ], "index": "pypi", - "version": "==1.9.93" + "version": "==1.9.124" }, "botocore": { "hashes": [ - "sha256:4df39ef9bcd7766e3a71a9e7f976ca6c9e926f451914a9c073aa50e9519436ca", - "sha256:d3cea95919892eac30e2ff8c5a8908022d5a93f917df3cff4ed06a6926dcc0e5" + "sha256:bb756a8da2c6e3ccf42dccb0ac71c1df2e07844db339183da06f4e0285b251d0", + "sha256:fc7560a2676df2f0bab4ef0638277b86e5a00944c2ce1c3bb124b3066e6d3d2a" ], - "version": "==1.12.93" + "version": "==1.12.124" }, "certifi": { "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" + "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", + "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" ], - "version": "==2018.11.29" + "version": "==2019.3.9" }, "chardet": { "hashes": [ @@ -75,6 +75,43 @@ ], "version": "==7.0" }, + "coverage": { + "hashes": [ + "sha256:3684fabf6b87a369017756b551cef29e505cb155ddb892a7a29277b978da88b9", + "sha256:39e088da9b284f1bd17c750ac672103779f7954ce6125fd4382134ac8d152d74", + "sha256:3c205bc11cc4fcc57b761c2da73b9b72a59f8d5ca89979afb0c1c6f9e53c7390", + "sha256:465ce53a8c0f3a7950dfb836438442f833cf6663d407f37d8c52fe7b6e56d7e8", + "sha256:48020e343fc40f72a442c8a1334284620f81295256a6b6ca6d8aa1350c763bbe", + "sha256:5296fc86ab612ec12394565c500b412a43b328b3907c0d14358950d06fd83baf", + "sha256:5f61bed2f7d9b6a9ab935150a6b23d7f84b8055524e7be7715b6513f3328138e", + "sha256:68a43a9f9f83693ce0414d17e019daee7ab3f7113a70c79a3dd4c2f704e4d741", + "sha256:6b8033d47fe22506856fe450470ccb1d8ba1ffb8463494a15cfc96392a288c09", + "sha256:7ad7536066b28863e5835e8cfeaa794b7fe352d99a8cded9f43d1161be8e9fbd", + "sha256:7bacb89ccf4bedb30b277e96e4cc68cd1369ca6841bde7b005191b54d3dd1034", + "sha256:839dc7c36501254e14331bcb98b27002aa415e4af7ea039d9009409b9d2d5420", + "sha256:8f9a95b66969cdea53ec992ecea5406c5bd99c9221f539bca1e8406b200ae98c", + "sha256:932c03d2d565f75961ba1d3cec41ddde00e162c5b46d03f7423edcb807734eab", + "sha256:988529edadc49039d205e0aa6ce049c5ccda4acb2d6c3c5c550c17e8c02c05ba", + "sha256:998d7e73548fe395eeb294495a04d38942edb66d1fa61eb70418871bc621227e", + "sha256:9de60893fb447d1e797f6bf08fdf0dbcda0c1e34c1b06c92bd3a363c0ea8c609", + "sha256:9e80d45d0c7fcee54e22771db7f1b0b126fb4a6c0a2e5afa72f66827207ff2f2", + "sha256:a545a3dfe5082dc8e8c3eb7f8a2cf4f2870902ff1860bd99b6198cfd1f9d1f49", + "sha256:a5d8f29e5ec661143621a8f4de51adfb300d7a476224156a39a392254f70687b", + "sha256:aca06bfba4759bbdb09bf52ebb15ae20268ee1f6747417837926fae990ebc41d", + "sha256:bb23b7a6fd666e551a3094ab896a57809e010059540ad20acbeec03a154224ce", + "sha256:bfd1d0ae7e292105f29d7deaa9d8f2916ed8553ab9d5f39ec65bcf5deadff3f9", + "sha256:c62ca0a38958f541a73cf86acdab020c2091631c137bd359c4f5bddde7b75fd4", + "sha256:c709d8bda72cf4cd348ccec2a4881f2c5848fd72903c185f363d361b2737f773", + "sha256:c968a6aa7e0b56ecbd28531ddf439c2ec103610d3e2bf3b75b813304f8cb7723", + "sha256:df785d8cb80539d0b55fd47183264b7002077859028dfe3070cf6359bf8b2d9c", + "sha256:f406628ca51e0ae90ae76ea8398677a921b36f0bd71aab2099dfed08abd0322f", + "sha256:f46087bbd95ebae244a0eda01a618aff11ec7a069b15a3ef8f6b520db523dcf1", + "sha256:f8019c5279eb32360ca03e9fac40a12667715546eed5c5eb59eb381f2f501260", + "sha256:fc5f4d209733750afd2714e9109816a29500718b32dd9a5db01c0cb3a019b96a" + ], + "index": "pypi", + "version": "==4.5.3" + }, "dj-database-url": { "hashes": [ "sha256:7f4c78d2a090df8dfaf56d5d3ff7bbee17360436e4879558317e2314424864cd" @@ -92,10 +129,10 @@ }, "django-appconf": { "hashes": [ - "sha256:6a4d9aea683b4c224d97ab8ee11ad2d29a37072c0c6c509896dd9857466fb261", - "sha256:ddab987d14b26731352c01ee69c090a4ebfc9141ed223bef039d79587f22acd9" + "sha256:35f13ca4d567f132b960e2cd4c832c2d03cb6543452d34e29b7ba10371ba80e3", + "sha256:c98a7af40062e996b921f5962a1c4f3f0c979fa7885f7be4710cceb90ebe13a6" ], - "version": "==1.0.2" + "version": "==1.0.3" }, "django-compressor": { "hashes": [ @@ -143,6 +180,14 @@ ], "version": "==4.3" }, + "django-sendgrid-v5": { + "hashes": [ + "sha256:471f718ae02c775f0f2ba8f901d5abb486b016805af8b2ac543ac9ff2f4164ec", + "sha256:c69ba0171b260c25def8048b69d931b46fbd8360b9aff4eb5477a284260fce0c" + ], + "index": "pypi", + "version": "==0.7.1" + }, "django-storages": { "hashes": [ "sha256:8e35d2c7baeda5dc6f0b4f9a0fc142d25f9a1bf72b8cebfcbc5db4863abc552d", @@ -153,10 +198,10 @@ }, "django-taggit": { "hashes": [ - "sha256:a21cbe7e0879f1364eef1c88a2eda89d593bf000ebf51c3f00423c6927075dce", - "sha256:db4430ec99265341e05d0274edb0279163bd74357241f7b4d9274bdcb3338b17" + "sha256:710b4d15ec1996550cc68a0abbc41903ca7d832540e52b1336e6858737e410d8", + "sha256:bb8f27684814cd1414b2af75b857b5e26a40912631904038a7ecacd2bfafc3ac" ], - "version": "==0.23.0" + "version": "==0.24.0" }, "django-treebeard": { "hashes": [ @@ -196,10 +241,16 @@ }, "faker": { "hashes": [ - "sha256:16342dca4d92bfc83bab6a7daf6650e0ab087605a66bc38f17523fdb01757910", - "sha256:d871ea315b2dcba9138b8344f2c131a76ac62d6227ca39f69b0c889fec97376c" + "sha256:00b7011757c4907546f17d0e47df098b542ea2b04c966ee0e80a493aae2c13c8", + "sha256:745ac8b9c9526e338696e07b7f2e206e5e317e5744e22fdd7c2894bf19af41f1" ], - "version": "==1.0.2" + "version": "==1.0.4" + }, + "future": { + "hashes": [ + "sha256:67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8" + ], + "version": "==0.17.1" }, "graphene": { "hashes": [ @@ -253,38 +304,38 @@ }, "jmespath": { "hashes": [ - "sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64", - "sha256:f11b4461f425740a1d908e9a3f7365c3d2e569f6ca68a2ff8bc5bcd9676edd63" + "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6", + "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c" ], - "version": "==0.9.3" + "version": "==0.9.4" }, "libsass": { "hashes": [ - "sha256:0da943e00e028211cb4bb91496a20becab9fe82407bb75266ec4212af04acb45", - "sha256:107591ba2c0d173bb1705bef0e9fd04a5b6f482f3584f4ea51b28ab8b137fbb2", - "sha256:1aeadc155594af23879e27792667dc06e7f248c2c599c40ff2a7335193abdf05", - "sha256:411833c623288138744865d882f5226f6db52afce1e19f42722c416df9d308dc", - "sha256:4bf7a80a956da9de9715436b85343a179da4ff399a6e9a1694e70bff93d43099", - "sha256:53be1c6cea9458fc0b59fafff5307d63cbde4d6f8a4413fb52ae467566273357", - "sha256:55b77204cfa363142ab02c49ee871321a396b8e51f6361ebc226c3953c780541", - "sha256:66e3062ff508c81928e35c66702f0cc4f70fb12eb76ba23eeb0ff87a6340cc13", - "sha256:747e1cb3624b25ce9104315cf98b080246c5112d008cba6536a7dd2edb16fcc2", - "sha256:75605a97f4b2f47fafc5a372f09efec210c7f33908c6de726362f85489fd53aa", - "sha256:7c7a531b8cd786c35170e97338be2e73a74806f95539366a8ee837df94b8a8cf", - "sha256:953ebe810f09d81b84ccafdca0fb6171d1b58c8f0147cb650184a41e124e296f", - "sha256:a19041e78d5bb7c5d72e010e893c29119693628b6ee06025503ab2584cf24edd", - "sha256:b3e4abf50ad3a6bec25acd0c67495301cab6137aa79b8640364276f7f3712586", - "sha256:bf6b7ad08f287695338f050c80f79d258a405e5c349cdaeb9be5d5376c09e37a", - "sha256:fcbc861a001ffd68c4df00164b41c6152d5451185d06c654ac240d811be9f7e2" + "sha256:2ae3b061a7d250fb47e5fdad1a8191600ca15dc604e76b109b6d3bf8e08fd2ed", + "sha256:2ee186aa682a035a53c557b7e61ce562a1114f1a1a992d0ba962cbc3e82c490c", + "sha256:366f4fd5a5eab4a519beb583e9fa78718cf2c0f40e92ed835d7ed23b82e5d954", + "sha256:5511b3c62e8d97daf929c63bd516b794f0a06acd09dd261445d864e48290551b", + "sha256:7462da168c8fb997b31cb4dc3ee5adb9af2d106f7b92c2d57a1c68a56ae5a3a0", + "sha256:84a16ec5cf7842ff5bc2caed2c032ed624d587699797bc2a4d4a8e41f579b6e7", + "sha256:8fc0360ee99224f7a3cb09987e641171d34180759f467ba3d15934102ade396f", + "sha256:a6c5535a21a07d769151453270bc6a8373b821d1d2fd9810d84fccfe315ab188", + "sha256:b375bfbf3c86ec0f4a27f266b44b2753a4b8cab7e73649eed7afcad84bc56257", + "sha256:b548af46c1a606aed93da2566901146005d6065f73fefc63d256ba62ba1f803d", + "sha256:bb30fc7125350c64925a98cb90da7979f76bb0ea1a0157e8aeb268f8da38e296", + "sha256:c2f386677514f9fc758631328bd318dd3e9d839ad7b6e248ec4535a191bfd271", + "sha256:d1f301637ad5768aecc81d17dcf40a68f2e11b7ca8b427dbb9f8972c150d303e", + "sha256:e0cf54dddf2cc6e373005bed6e46ccdce1f3a77bd169ab505c3a8ad9023eee5f", + "sha256:e8941881063691d50f9cc8b8d6d8fd7bec86a8c461b2a4fc87188a5fc44d6ba4", + "sha256:f4b29b0c70d753c754a58aaad7c31ad3309ca4a26f9aa64e695157251f6832ad" ], - "version": "==0.17.0" + "version": "==0.18.0" }, "newrelic": { "hashes": [ - "sha256:8fdc94350bfe69e4f70dc8a3e7ead6c6a1905e8f161ce24de7ee3de4f69196ad" + "sha256:1d08248dee0d33116a145de723a2ae86e57a10674145ce4c8af3c316423bd140" ], "index": "pypi", - "version": "==4.12.0.113" + "version": "==4.16.0.116" }, "pillow": { "hashes": [ @@ -377,6 +428,12 @@ "index": "pypi", "version": "==0.7.1" }, + "python-http-client": { + "hashes": [ + "sha256:7e430f4b9dd2b621b0051f6a362f103447ea8e267594c602a5c502a0c694ee38" + ], + "version": "==3.1.0" + }, "pytz": { "hashes": [ "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", @@ -425,6 +482,13 @@ ], "version": "==0.2.0" }, + "sendgrid": { + "hashes": [ + "sha256:97eb356ea44a18a03e6fe99f02b7942445be306a50f73a7dd35471fe15cc0094", + "sha256:9e9d3d75602b8853f174ec959d1af1ac168cd361cbcafc81285fa8c183f7a505" + ], + "version": "==5.6.0" + }, "sentry-sdk": { "hashes": [ "sha256:131e3b9ac11dffd86fe4f1f5d388d3dab372fc9e30d6611d1fc87096a1d67359", @@ -515,11 +579,11 @@ "develop": { "awscli": { "hashes": [ - "sha256:11a18d6f42469366920ad96d483a64804f17ea63e21e5f4a66d8492d7031aa14", - "sha256:21ad9141041834dfc135c731d32fdde674642f33d19b21e2ac9c696a8370d717" + "sha256:87258e4719978f51dae8c62e15cd0486a778ddcb530645f3bc035239b800f184", + "sha256:fbd9dc00ecd7060f36e5768122c9293672b82748fa224cb13e22e6322532d8db" ], "index": "pypi", - "version": "==1.16.103" + "version": "==1.16.134" }, "backcall": { "hashes": [ @@ -530,10 +594,10 @@ }, "botocore": { "hashes": [ - "sha256:4df39ef9bcd7766e3a71a9e7f976ca6c9e926f451914a9c073aa50e9519436ca", - "sha256:d3cea95919892eac30e2ff8c5a8908022d5a93f917df3cff4ed06a6926dcc0e5" + "sha256:bb756a8da2c6e3ccf42dccb0ac71c1df2e07844db339183da06f4e0285b251d0", + "sha256:fc7560a2676df2f0bab4ef0638277b86e5a00944c2ce1c3bb124b3066e6d3d2a" ], - "version": "==1.12.93" + "version": "==1.12.124" }, "colorama": { "hashes": [ @@ -544,47 +608,47 @@ }, "coverage": { "hashes": [ - "sha256:09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", - "sha256:0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", - "sha256:0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", - "sha256:10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", - "sha256:1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", - "sha256:1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", - "sha256:2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", - "sha256:447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", - "sha256:46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", - "sha256:4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", - "sha256:510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", - "sha256:5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", - "sha256:5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", - "sha256:5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", - "sha256:6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", - "sha256:6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", - "sha256:77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", - "sha256:828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", - "sha256:85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", - "sha256:8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", - "sha256:a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", - "sha256:aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", - "sha256:ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", - "sha256:b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", - "sha256:bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", - "sha256:c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", - "sha256:d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", - "sha256:d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", - "sha256:da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", - "sha256:ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", - "sha256:ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9" + "sha256:3684fabf6b87a369017756b551cef29e505cb155ddb892a7a29277b978da88b9", + "sha256:39e088da9b284f1bd17c750ac672103779f7954ce6125fd4382134ac8d152d74", + "sha256:3c205bc11cc4fcc57b761c2da73b9b72a59f8d5ca89979afb0c1c6f9e53c7390", + "sha256:465ce53a8c0f3a7950dfb836438442f833cf6663d407f37d8c52fe7b6e56d7e8", + "sha256:48020e343fc40f72a442c8a1334284620f81295256a6b6ca6d8aa1350c763bbe", + "sha256:5296fc86ab612ec12394565c500b412a43b328b3907c0d14358950d06fd83baf", + "sha256:5f61bed2f7d9b6a9ab935150a6b23d7f84b8055524e7be7715b6513f3328138e", + "sha256:68a43a9f9f83693ce0414d17e019daee7ab3f7113a70c79a3dd4c2f704e4d741", + "sha256:6b8033d47fe22506856fe450470ccb1d8ba1ffb8463494a15cfc96392a288c09", + "sha256:7ad7536066b28863e5835e8cfeaa794b7fe352d99a8cded9f43d1161be8e9fbd", + "sha256:7bacb89ccf4bedb30b277e96e4cc68cd1369ca6841bde7b005191b54d3dd1034", + "sha256:839dc7c36501254e14331bcb98b27002aa415e4af7ea039d9009409b9d2d5420", + "sha256:8f9a95b66969cdea53ec992ecea5406c5bd99c9221f539bca1e8406b200ae98c", + "sha256:932c03d2d565f75961ba1d3cec41ddde00e162c5b46d03f7423edcb807734eab", + "sha256:988529edadc49039d205e0aa6ce049c5ccda4acb2d6c3c5c550c17e8c02c05ba", + "sha256:998d7e73548fe395eeb294495a04d38942edb66d1fa61eb70418871bc621227e", + "sha256:9de60893fb447d1e797f6bf08fdf0dbcda0c1e34c1b06c92bd3a363c0ea8c609", + "sha256:9e80d45d0c7fcee54e22771db7f1b0b126fb4a6c0a2e5afa72f66827207ff2f2", + "sha256:a545a3dfe5082dc8e8c3eb7f8a2cf4f2870902ff1860bd99b6198cfd1f9d1f49", + "sha256:a5d8f29e5ec661143621a8f4de51adfb300d7a476224156a39a392254f70687b", + "sha256:aca06bfba4759bbdb09bf52ebb15ae20268ee1f6747417837926fae990ebc41d", + "sha256:bb23b7a6fd666e551a3094ab896a57809e010059540ad20acbeec03a154224ce", + "sha256:bfd1d0ae7e292105f29d7deaa9d8f2916ed8553ab9d5f39ec65bcf5deadff3f9", + "sha256:c62ca0a38958f541a73cf86acdab020c2091631c137bd359c4f5bddde7b75fd4", + "sha256:c709d8bda72cf4cd348ccec2a4881f2c5848fd72903c185f363d361b2737f773", + "sha256:c968a6aa7e0b56ecbd28531ddf439c2ec103610d3e2bf3b75b813304f8cb7723", + "sha256:df785d8cb80539d0b55fd47183264b7002077859028dfe3070cf6359bf8b2d9c", + "sha256:f406628ca51e0ae90ae76ea8398677a921b36f0bd71aab2099dfed08abd0322f", + "sha256:f46087bbd95ebae244a0eda01a618aff11ec7a069b15a3ef8f6b520db523dcf1", + "sha256:f8019c5279eb32360ca03e9fac40a12667715546eed5c5eb59eb381f2f501260", + "sha256:fc5f4d209733750afd2714e9109816a29500718b32dd9a5db01c0cb3a019b96a" ], "index": "pypi", - "version": "==4.5.2" + "version": "==4.5.3" }, "decorator": { "hashes": [ - "sha256:33cd704aea07b4c28b3eb2c97d288a06918275dac0ecebdaf1bc8a48d98adb9e", - "sha256:cabb249f4710888a2fc0e13e9a16c343d932033718ff62e1e9bc93a9d3a9122b" + "sha256:86156361c50488b84a3f148056ea716ca587df2f0de1d34750d35c21312725de", + "sha256:f069f3a01830ca754ba5258fde2278454a0b5b79e0d7f5c13b3b97e57d4acff6" ], - "version": "==4.3.2" + "version": "==4.4.0" }, "docutils": { "hashes": [ @@ -596,18 +660,17 @@ }, "ipdb": { "hashes": [ - "sha256:7081c65ed7bfe7737f83fa4213ca8afd9617b42ff6b3f1daf9a3419839a2a00a" + "sha256:dce2112557edfe759742ca2d0fee35c59c97b0cc7a05398b791079d78f1519ce" ], "index": "pypi", - "version": "==0.11" + "version": "==0.12" }, "ipython": { "hashes": [ - "sha256:6a9496209b76463f1dec126ab928919aaf1f55b38beb9219af3fe202f6bbdd12", - "sha256:f69932b1e806b38a7818d9a1e918e5821b685715040b48e59c657b3c7961b742" + "sha256:b038baa489c38f6d853a3cfc4c635b0cda66f2864d136fe8f40c1a6e334e2a6b", + "sha256:f5102c1cd67e399ec8ea66bcebe6e3968ea25a8977e53f012963e5affeb1fe38" ], - "markers": "python_version >= '3.3'", - "version": "==7.2.0" + "version": "==7.4.0" }, "ipython-genutils": { "hashes": [ @@ -618,17 +681,17 @@ }, "jedi": { "hashes": [ - "sha256:571702b5bd167911fe9036e5039ba67f820d6502832285cde8c881ab2b2149fd", - "sha256:c8481b5e59d34a5c7c42e98f6625e633f6ef59353abea6437472c7ec2093f191" + "sha256:2bb0603e3506f708e792c7f4ad8fc2a7a9d9c2d292a358fbbd58da531695595b", + "sha256:2c6bcd9545c7d6440951b12b44d373479bf18123a401a52025cf98563fbd826c" ], - "version": "==0.13.2" + "version": "==0.13.3" }, "jmespath": { "hashes": [ - "sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64", - "sha256:f11b4461f425740a1d908e9a3f7365c3d2e569f6ca68a2ff8bc5bcd9676edd63" + "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6", + "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c" ], - "version": "==0.9.3" + "version": "==0.9.4" }, "parso": { "hashes": [ @@ -654,11 +717,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:88002cc618cacfda8760c4539e76c3b3f148ecdb7035a3d422c7ecdc90c2a3ba", - "sha256:c6655a12e9b08edb8cf5aeab4815fd1e1bdea4ad73d3bbf269cf2e0c4eb75d5e", - "sha256:df5835fb8f417aa55e5cafadbaeb0cf630a1e824aad16989f9f0493e679ec010" + "sha256:11adf3389a996a6d45cc277580d0d53e8a5afd281d0c9ec71b28e6f121463780", + "sha256:2519ad1d8038fd5fc8e770362237ad0364d16a7650fb5724af6997ed5515e3c1", + "sha256:977c6583ae813a37dc1c2e1b715892461fcbdaa57f6fc62f33a528c4886c8f55" ], - "version": "==2.0.8" + "version": "==2.0.9" }, "ptyprocess": { "hashes": [ diff --git a/bitbucket-pipelines.yml b/bitbucket-pipelines.yml index 981aa2a1..561e7856 100644 --- a/bitbucket-pipelines.yml +++ b/bitbucket-pipelines.yml @@ -36,7 +36,7 @@ aliases: - echo "This pipeline rules!" - *setup-tests - npm install --prefix client -# - npm run "install:cypress" --prefix client + # - npm run "install:cypress" --prefix client - psql -U $DATABASE_USER -h $DATABASE_HOST -c "create database $DATABASE_NAME" - python server/manage.py dummy_data - python server/manage.py runserver & @@ -55,6 +55,7 @@ pipelines: branches: master: - step: *unittest-python + - step: *cypress-test develop: - step: *unittest-python @@ -67,4 +68,5 @@ pipelines: custom: prod: - step: *unittest-python + - step: *cypress-test - step: *deploy-prod diff --git a/client/cypress/integration/login-page-spec.js b/client/cypress/integration/login-page-spec.js index 83d50dcf..ee32a857 100644 --- a/client/cypress/integration/login-page-spec.js +++ b/client/cypress/integration/login-page-spec.js @@ -9,7 +9,7 @@ describe('The Login Page', () => { cy.get('#id_password').type(`${password}{enter}`); cy.getCookie('sessionid').should('exist'); - cy.get('.start-page__title').should('contain', 'skillbox') + cy.get('.start-page__header').should('exist') }); // it('logs in programmatically without using the UI', () => { // cy.visit('/accounts/login/'); // have to get a csrf token by getting the base page first diff --git a/client/cypress/integration/new-project.spec.js b/client/cypress/integration/new-project.spec.js new file mode 100644 index 00000000..986038b8 --- /dev/null +++ b/client/cypress/integration/new-project.spec.js @@ -0,0 +1,14 @@ +describe('New project', () => { + it('creates a new project and displays it', () => { + cy.viewport('macbook-15'); + cy.login('rahel.cueni', 'test'); + + cy.visit('/portfolio'); + cy.get('[data-cy=add-project-button]').click(); + cy.get('[data-cy=page-form-input-titel]').type('Some random title'); + cy.get('[data-cy=page-form-input-beschreibung]').type('This description rocks'); + cy.get('[data-cy=page-form-input-ziele]').type('Git gud'); + cy.get('[data-cy=save-project-button]').click(); + cy.get('.project-widget:first').contains('random'); + }) +}); diff --git a/client/index.html b/client/index.html index 7b0024b6..b94913b0 100644 --- a/client/index.html +++ b/client/index.html @@ -2,7 +2,7 @@ - + skillbox diff --git a/client/package-lock.json b/client/package-lock.json index 5999f44f..815dae07 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -3042,6 +3042,12 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", + "dev": true + }, "supports-color": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", @@ -7191,10 +7197,9 @@ } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=", - "dev": true + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "move-concurrently": { "version": "1.0.1", diff --git a/client/package.json b/client/package.json index 4c604618..7ff7c05c 100644 --- a/client/package.json +++ b/client/package.json @@ -51,6 +51,7 @@ "graphql-tag": "^2.9.2", "html-webpack-plugin": "^2.30.1", "lodash": "^4.17.10", + "moment": "^2.24.0", "node-notifier": "^5.1.2", "node-sass": "^4.9.2", "optimize-css-assets-webpack-plugin": "^3.2.0", diff --git a/client/src/App.vue b/client/src/App.vue index af50e398..1c73926d 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -1,7 +1,8 @@ @@ -10,6 +11,7 @@ import SimpleLayout from '@/layouts/SimpleLayout'; import BlankLayout from '@/layouts/BlankLayout'; import Modal from '@/components/Modal'; + import MobileNavigation from '@/components/MobileNavigation'; import NewContentBlockWizard from '@/components/content-block-form/NewContentBlockWizard'; import EditContentBlockWizard from '@/components/content-block-form/EditContentBlockWizard'; import NewRoomEntryWizard from '@/components/rooms/room-entries/NewRoomEntryWizard'; @@ -19,6 +21,9 @@ import NewProjectEntryWizard from '@/components/portfolio/NewProjectEntryWizard'; import FullscreenImage from '@/components/FullscreenImage'; import FullscreenInfographic from '@/components/FullscreenInfographic'; + import FullscreenVideo from '@/components/FullscreenVideo'; + + import {mapGetters} from 'vuex'; export default { name: 'App', @@ -28,6 +33,7 @@ SimpleLayout, BlankLayout, Modal, + MobileNavigation, NewContentBlockWizard, EditContentBlockWizard, NewRoomEntryWizard, @@ -36,16 +42,15 @@ EditObjectiveGroupWizard, NewProjectEntryWizard, FullscreenImage, - FullscreenInfographic + FullscreenInfographic, + FullscreenVideo }, computed: { layout() { return (this.$route.meta.layout || 'default') + '-layout'; }, - showModal() { - return this.$store.state.showModal - } + ...mapGetters(['showModal', 'showMobileNavigation']) }, mounted() { @@ -56,6 +61,18 @@ diff --git a/client/src/components/HeaderBar.vue b/client/src/components/HeaderBar.vue new file mode 100644 index 00000000..87cdd0cc --- /dev/null +++ b/client/src/components/HeaderBar.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/client/src/components/LogoutWidget.vue b/client/src/components/LogoutWidget.vue index 2889a985..bba0f6d4 100644 --- a/client/src/components/LogoutWidget.vue +++ b/client/src/components/LogoutWidget.vue @@ -32,7 +32,7 @@ &__logout { font-family: $sans-serif-font-family; line-height: 16px; - margin: 0 15px 0 20px; + margin: 0 15px 0 $large-spacing; background: none; color: inherit; border: none; diff --git a/client/src/components/MobileHeader.vue b/client/src/components/MobileHeader.vue new file mode 100644 index 00000000..d30a2b0a --- /dev/null +++ b/client/src/components/MobileHeader.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/client/src/components/MobileNavigation.vue b/client/src/components/MobileNavigation.vue new file mode 100644 index 00000000..5219504d --- /dev/null +++ b/client/src/components/MobileNavigation.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/client/src/components/Modal.vue b/client/src/components/Modal.vue index 51352e74..3fb0f7c8 100644 --- a/client/src/components/Modal.vue +++ b/client/src/components/Modal.vue @@ -59,9 +59,13 @@ border-radius: 12px; box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.15); border: 1px solid $color-lightgrey; - display: grid; + display: -ms-grid; + @supports (display: grid) { + display: grid; + } grid-template-rows: auto 1fr 65px; grid-template-areas: "header" "body" "footer"; + -ms-grid-rows: auto 1fr 65px; position: relative; &--hide-header { @@ -81,6 +85,7 @@ width: 95vw; height: auto; grid-template-rows: 1fr; + -ms-grid-rows: 1fr; grid-template-areas: "body"; overflow: hidden; } @@ -107,7 +112,11 @@ } &__backdrop { - display: grid; + display: flex; + justify-content: center; + @supports (display: grid) { + display: grid; + } position: fixed; top: 0; left: 0; @@ -119,12 +128,14 @@ &__header { grid-area: header; + -ms-grid-row: 1; padding: 10px $modal-lateral-padding; border-bottom: 1px solid $color-lightgrey; } &__body { grid-area: body; + -ms-grid-row: 2; padding: 10px $modal-lateral-padding; overflow: auto; box-sizing: border-box; @@ -150,6 +161,7 @@ &__footer { grid-area: footer; + -ms-grid-row: 3; border-top: 1px solid $color-lightgrey; padding: 16px $modal-lateral-padding; } diff --git a/client/src/components/NewsTeaser.vue b/client/src/components/NewsTeaser.vue index c2235dcd..d55a2cd3 100644 --- a/client/src/components/NewsTeaser.vue +++ b/client/src/components/NewsTeaser.vue @@ -4,8 +4,8 @@ {{title}} - {{date}} - + {{date}} + @@ -18,10 +18,21 @@ diff --git a/client/src/components/UserWidget.vue b/client/src/components/UserWidget.vue index 1479d8ed..7866d635 100644 --- a/client/src/components/UserWidget.vue +++ b/client/src/components/UserWidget.vue @@ -12,10 +12,15 @@ import UserIcon from '@/components/icons/UserIcon'; export default { - props: ['firstName', 'lastName', 'avatar', 'date', 'isProfile'], + props: ['firstName', 'lastName', 'avatar', 'date'], components: { UserIcon + }, + computed: { + isProfile() { + return this.$route.meta.isProfile; + } } } diff --git a/client/src/components/WidgetFooter.vue b/client/src/components/WidgetFooter.vue index 9ec6e1a5..52c232b5 100644 --- a/client/src/components/WidgetFooter.vue +++ b/client/src/components/WidgetFooter.vue @@ -1,14 +1,13 @@ @@ -17,7 +16,6 @@ import WidgetPopover from '@/components/rooms/WidgetPopover'; export default { - props: ['on-delete', 'on-edit', 'id', 'entity'], components: { Ellipses, @@ -28,12 +26,19 @@ return { showMenu: false } + }, + + methods: { + toggleMenu: function () { + this.showMenu = !this.showMenu + } } } diff --git a/client/src/components/icons/Play.vue b/client/src/components/icons/Play.vue new file mode 100644 index 00000000..ff5356bd --- /dev/null +++ b/client/src/components/icons/Play.vue @@ -0,0 +1,5 @@ + diff --git a/client/src/components/modules/Module.vue b/client/src/components/modules/Module.vue index 810c2bef..215e1b00 100644 --- a/client/src/components/modules/Module.vue +++ b/client/src/components/modules/Module.vue @@ -137,7 +137,7 @@ width: 640px; } flex-direction: column; - padding: 0 15px; + padding: $large-spacing 15px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; diff --git a/client/src/components/modules/ModuleNavigation.vue b/client/src/components/modules/ModuleNavigation.vue index 32b80085..a7c3fd4e 100644 --- a/client/src/components/modules/ModuleNavigation.vue +++ b/client/src/components/modules/ModuleNavigation.vue @@ -1,6 +1,6 @@ + + + + diff --git a/client/src/components/page-form/PageFormInput.vue b/client/src/components/page-form/PageFormInput.vue new file mode 100644 index 00000000..664235ee --- /dev/null +++ b/client/src/components/page-form/PageFormInput.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/client/src/components/portfolio/AddProject.vue b/client/src/components/portfolio/AddProject.vue index ff4e961d..63f9affb 100644 --- a/client/src/components/portfolio/AddProject.vue +++ b/client/src/components/portfolio/AddProject.vue @@ -1,5 +1,5 @@ diff --git a/client/src/components/portfolio/NewProjectEntryWizard.vue b/client/src/components/portfolio/NewProjectEntryWizard.vue index 99968e16..09f0cd9a 100644 --- a/client/src/components/portfolio/NewProjectEntryWizard.vue +++ b/client/src/components/portfolio/NewProjectEntryWizard.vue @@ -1,13 +1,17 @@ @@ -15,15 +19,65 @@ import Modal from '@/components/Modal'; import TextFormWithHelpText from '@/components/content-forms/TextFormWithHelpText'; + import NEW_PROJECT_ENTRY_MUTATION from '@/graphql/gql/mutations/addProjectEntry.gql'; + import PROJECT_QUERY from '@/graphql/gql/projectQuery.gql'; + export default { components: { Modal, TextFormWithHelpText }, + computed: { + project() { + return this.$store.state.parentProject; + }, + slug() { + return this.$route.params.slug; + } + }, + + methods: { + save() { + this.$apollo.mutate({ + mutation: NEW_PROJECT_ENTRY_MUTATION, + variables: { + input: { + projectEntry: Object.assign({}, { + nextSteps: this.nextSteps, + activity: this.activity, + reflection: this.reflection, + project: this.project + }) + } + }, + update: (store, {data: {addProjectEntry: {projectEntry}}}) => { + const query = PROJECT_QUERY; + const variables = {slug: this.slug}; + const data = store.readQuery({query, variables}); + if (data.project && data.project.entries) { + data.project.entries.edges.unshift({ + node: projectEntry, + __typename: 'ProjectEntryNode' + }); + store.writeQuery({query, variables, data}); + } + } + + }).then(() => { + this.hideModal(); + }); + }, + hideModal() { + this.$store.dispatch('hideModal'); + } + }, + data() { return { - value: '' + activity: '', + reflection: '', + nextSteps: '' } } } diff --git a/client/src/components/portfolio/Portfolio.vue b/client/src/components/portfolio/Portfolio.vue deleted file mode 100644 index 7af4b136..00000000 --- a/client/src/components/portfolio/Portfolio.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - diff --git a/client/src/components/portfolio/ProjectEntry.vue b/client/src/components/portfolio/ProjectEntry.vue index 02d935d4..7897f4ac 100644 --- a/client/src/components/portfolio/ProjectEntry.vue +++ b/client/src/components/portfolio/ProjectEntry.vue @@ -2,27 +2,30 @@

Tätigkeit

- Ich führe das Interview mit meiner Kollegin durch. + {{activity}}

Reflexion

- Da ich geeignete Fragen hatte, konnte meine Kollegin umfangreiche Antworten zum Thema geben. Die Eingangshalle - eignete sich nicht als Interviewort, da es viele Nebengeräusche hatte. Wir fanden aber dann ein freies - Klassenzimmer. Nicht nur die Fragen sind wichtig. Auch die Ortswahl, wo man das Interview aufzeichnen möchte, - ist sehr wichtig für ein erfolgreiches Interview. + {{reflection}}

Nächste Schritte

- Interview im Raum „Mein Lehrbetrieb“ ablegen. + {{nextSteps}}

- 21. Juni 2018 + {{created | date }}
+ + diff --git a/client/src/components/rooms/NewRoom.vue b/client/src/components/rooms/NewRoom.vue deleted file mode 100644 index a9ed7119..00000000 --- a/client/src/components/rooms/NewRoom.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - diff --git a/client/src/components/rooms/RoomEntry.vue b/client/src/components/rooms/RoomEntry.vue index a7e3ebe1..f591459e 100644 --- a/client/src/components/rooms/RoomEntry.vue +++ b/client/src/components/rooms/RoomEntry.vue @@ -4,13 +4,13 @@ - + v-if="showMenu"> + + +
diff --git a/client/src/components/rooms/RoomForm.vue b/client/src/components/rooms/RoomForm.vue index b2594499..e4f8265b 100644 --- a/client/src/components/rooms/RoomForm.vue +++ b/client/src/components/rooms/RoomForm.vue @@ -1,33 +1,31 @@ @@ -72,7 +43,9 @@ .skillbox { margin: 0 auto; width: 100%; - display: grid; + @supports (display: grid) { + display: grid; + } grid-template-rows: auto 1fr; min-height: 100vh; grid-auto-rows: 1fr; @@ -82,81 +55,41 @@ &--show-filter { grid-template-rows: auto auto 1fr; + -ms-grid-rows: 50px 50px 30px 1fr; // 1 extra row for gap grid-template-areas: "h" "." "c"; } + /* + * For IE10+ + */ + + &--show-filter &__content { + -ms-grid-row: 4; + -ms-grid-column: 1; + } + + &--show-filter &__filter-bar { + -ms-grid-row: 2; + -ms-grid-column: 1; + } + /* * For IE10+ */ display: -ms-grid; - -ms-grid-rows: auto 32px 1fr; // 1 extra row for gap + -ms-grid-rows: 50px 30px 1fr; // 1 extra row for gap -ms-grid-columns: 1fr; @include skillbox-colors; &__header { grid-area: h; - display: -ms-grid; - @supports (display: grid) { - display: grid; - } - align-items: center; - justify-content: space-around; - background-color: $color-white; - grid-auto-rows: 50px; - width: 100%; - - @include desktop { - grid-template-columns: 1fr 1fr 1fr; - } - - /* - * For IE10+ - */ - -ms-grid-columns: 1fr 1fr 1fr; - -ms-grid-rows: 60px 60px; - - /* - * For IE10+ - */ - & > :nth-child(1) { - -ms-grid-column: 1; - -ms-grid-row-align: center; - } - - /* - * For IE10+ - */ - & > :nth-child(3) { - -ms-grid-column: 3; - -ms-grid-row-align: center; - -ms-grid-column-align: end; - - justify-self: end; - } - - & > :nth-child(4) { - -ms-grid-row: 2; - -ms-grid-column: 1; - -ms-grid-column-span: 3; - } - + -ms-grid-row: 1; } - &__header-logo { - color: #17A887; - font-size: 36px; - font-weight: 800; - font-family: $sans-serif-font-family; - display: flex; - justify-self: center; - - /* - * For IE10+ - */ - -ms-grid-column: 2; - -ms-grid-row-align: center; - -ms-grid-column-align: center; + &__content { + -ms-grid-row: 3; + -ms-grid-column: 1; } &__footer { @@ -168,12 +101,12 @@ * For IE10+ */ & > :nth-child(2) { - -ms-grid-row: 3; + + } + + & > :nth-child(3) { + -ms-grid-row: 4; -ms-grid-column: 1; } } - - .user-header { - display: flex; - } diff --git a/client/src/layouts/SimpleLayout.vue b/client/src/layouts/SimpleLayout.vue index a38d3a2d..ff35ba0f 100644 --- a/client/src/layouts/SimpleLayout.vue +++ b/client/src/layouts/SimpleLayout.vue @@ -13,14 +13,19 @@ .layout { &--simple { display: -ms-grid; - display: grid; + @supports (display: grid) { + display: grid; + } padding: 20px; + width: 100%; @include desktop { grid-template-columns: 1fr 640px 1fr; + -ms-grid-columns: 1fr 640px 1fr; & > :nth-child(2) { grid-column: 2; + -ms-grid-column: 2; } } @@ -31,8 +36,12 @@ justify-self: end; cursor: pointer; + display:flex; + justify-content:end; + @include desktop { grid-column: 3; + -ms-grid-column: 3; } &__icon { diff --git a/client/src/main.js b/client/src/main.js index 60b03100..6c262d2f 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -13,6 +13,7 @@ import VueAnalytics from 'vue-analytics'; import { Validator, install as VeeValidate } from 'vee-validate/dist/vee-validate.minimal.esm.js'; import { required, min } from 'vee-validate/dist/rules.esm.js'; import veeDe from 'vee-validate/dist/locale/de'; +import {dateFilter} from './filters/date-filter' Vue.config.productionTip = false; @@ -105,6 +106,8 @@ Vue.use(VeeValidate, { locale: 'de' }); +Vue.filter('date', dateFilter); + /* eslint-disable no-new */ new Vue({ el: '#app', diff --git a/client/src/pages/basicknowledge-overview.vue b/client/src/pages/basicknowledgeOverview.vue similarity index 100% rename from client/src/pages/basicknowledge-overview.vue rename to client/src/pages/basicknowledgeOverview.vue diff --git a/client/src/pages/book.vue b/client/src/pages/book.vue index 385c18f5..8491000e 100644 --- a/client/src/pages/book.vue +++ b/client/src/pages/book.vue @@ -22,6 +22,8 @@ @import "@/styles/_mixins.scss"; .book { + padding-top: $large-spacing; + &__content { display: -ms-grid; @supports (display: grid) { diff --git a/client/src/pages/editProject.vue b/client/src/pages/editProject.vue new file mode 100644 index 00000000..3eeb50fc --- /dev/null +++ b/client/src/pages/editProject.vue @@ -0,0 +1,37 @@ + + + diff --git a/client/src/pages/editRoom.vue b/client/src/pages/editRoom.vue index 5cff5f90..91509c48 100644 --- a/client/src/pages/editRoom.vue +++ b/client/src/pages/editRoom.vue @@ -5,6 +5,7 @@ - - diff --git a/client/src/pages/newProject.vue b/client/src/pages/newProject.vue new file mode 100644 index 00000000..7b8a9e16 --- /dev/null +++ b/client/src/pages/newProject.vue @@ -0,0 +1,61 @@ + + + diff --git a/client/src/pages/newRoom.vue b/client/src/pages/newRoom.vue index 380cefcc..410feda5 100644 --- a/client/src/pages/newRoom.vue +++ b/client/src/pages/newRoom.vue @@ -1,23 +1,61 @@ - - diff --git a/client/src/pages/portfolio.vue b/client/src/pages/portfolio.vue index f1b0686c..f7a15708 100644 --- a/client/src/pages/portfolio.vue +++ b/client/src/pages/portfolio.vue @@ -1,23 +1,143 @@ - diff --git a/client/src/pages/project.vue b/client/src/pages/project.vue index ef1e017e..3c8234e7 100644 --- a/client/src/pages/project.vue +++ b/client/src/pages/project.vue @@ -1,28 +1,20 @@ @@ -31,13 +23,42 @@ import ProjectEntry from '@/components/portfolio/ProjectEntry'; import AddProjectEntry from '@/components/portfolio/AddProjectEntry'; + import PROJECT_QUERY from '@/graphql/gql/projectQuery.gql'; + export default { + props: ['slug'], components: { AddProjectEntry, ProjectEntry }, + computed: { + objectives() { + return this.project.objectives ? this.project.objectives.split('\n') : []; + } + }, + + apollo: { + project: { + query: PROJECT_QUERY, + variables() { + return { + slug: this.slug + } + }, + update(data) { + return this.$getRidOfEdges(data).project || {}; + } + } + }, + + data() { + return { + project: {} + } + }, + created() { this.$store.dispatch('setSpecialContainerClass', 'red'); }, @@ -53,10 +74,8 @@ @import "@/styles/_functions.scss"; .project { - margin-bottom: -50px; - &__header { - padding: 30px; + padding: $large-spacing; } &__add-entry { @@ -88,12 +107,19 @@ &__content { background-color: $color-grey--lighter; - display: grid; - grid-template-columns: 840px; + display: flex; + flex-direction: column; + max-width: 840px; + align-content: center; + margin: 0 auto; + @supports (display: grid) { + display: grid; + width: auto; + } + grid-template-columns: minmax(max-content, 840px); grid-row-gap: 30px; justify-content: center; - padding-top: 30px; - padding-bottom: 50px; + padding: $large-spacing $medium-spacing; } } diff --git a/client/src/pages/rooms.vue b/client/src/pages/rooms.vue index 85a9ca26..4ed7a2a8 100644 --- a/client/src/pages/rooms.vue +++ b/client/src/pages/rooms.vue @@ -1,7 +1,7 @@ @@ -63,7 +63,10 @@ @import "@/styles/_mixins.scss"; .rooms-page { - display: -ms-grid; + display: flex; + flex-wrap: wrap; + align-content: start; + @supports (display: grid) { display: grid; } @@ -71,6 +74,7 @@ padding: 50px 15px; @include desktop { grid-template-columns: repeat(3, 1fr); + -ms-grid-columns: 1fr 30px 1fr 30px 1fr; padding: 50px 45px; } grid-column-gap: 30px; @@ -81,26 +85,22 @@ justify-self: center; box-sizing: border-box; - /* - * For IE10+ - */ - -ms-grid-columns: 1fr 1fr 1fr; - -ms-grid-rows: 260px; + &__add-room { + visibility: hidden; - /* - * SHAME SHAME SHAME - * this is very hacky, but we have a dynamic amount of elements. better to be safe than sorry - * SHAME SHAME SHAME - */ - @for $i from 1 to 101 { - & > :nth-child(#{$i}) { - @if ($i%3) == 0 { - -ms-grid-column: 3; - } @else { - -ms-grid-column: ($i%3); - } + @include desktop { + visibility: visible; + } + } - -ms-grid-row: floor(($i - 1)/3)+1; + & > div { + flex: 0 0 30%; + margin-bottom: $large-spacing; + margin-right: 1%; + + @supports (display: grid) { + margin-bottom: inherit; + margin-right: inherit; } } diff --git a/client/src/pages/start.vue b/client/src/pages/start.vue index f6718d4a..e5e818bc 100644 --- a/client/src/pages/start.vue +++ b/client/src/pages/start.vue @@ -1,6 +1,9 @@ -