From 9959c75a2ac7ae2042953ef78bc4521343fb5d4a Mon Sep 17 00:00:00 2001 From: Nik Topler Date: Wed, 7 Oct 2020 09:36:52 +0200 Subject: [PATCH] Few adjustments --- CSS/*.css | 21 +- CSS/account.css | 123 +++--- CSS/index.css | 173 +++++++- CSS/profileImg.css | 344 +++++++++------ CSS/responsive.css | 2 +- Images/5f7c9d2f10f750.23675548.png | Bin 0 -> 75527 bytes ...481097.png => 5f7c9e63c9ab76.22203358.png} | Bin JS/account.js | 51 ++- JS/main.js | 393 +++++++++++++++--- JS/show.js | 186 ++++++++- JS/signIn/signin.js | 2 +- JS/signIn/signup.js | 2 +- JS/variables.js | 5 +- account/add-ons/side-bar.php | 9 +- account/admin.php | 5 +- account/home.php | 13 +- account/settings.php | 2 + account/trending.php | 191 ++++++++- add-ons/head.php | 1 + add-ons/navigation-bar-right.php | 18 +- add-ons/profileImg.php | 43 +- headlines.php | 179 ++++++-- include/check.inc.php | 19 + include/db.inc.php | 40 +- include/insert.inc.php | 60 ++- include/update.inc.php | 55 ++- personal/following.php | 43 +- personal/for-you.php | 45 +- personal/library.php | 139 +++++-- search.php | 4 + topics/business.php | 3 +- topics/categories.php | 1 + topics/covid-19.php | 1 + topics/entertainment.php | 1 + topics/health.php | 1 + topics/sports.php | 1 + topics/technology.php | 1 + topics/world.php | 1 + 38 files changed, 1678 insertions(+), 500 deletions(-) create mode 100644 Images/5f7c9d2f10f750.23675548.png rename Images/{5f7b8d76df9d60.00481097.png => 5f7c9e63c9ab76.22203358.png} (100%) diff --git a/CSS/*.css b/CSS/*.css index 83b0bad..a7f279f 100644 --- a/CSS/*.css +++ b/CSS/*.css @@ -89,7 +89,13 @@ body{ .company-date:hover .tooltiptext, .outter-container:hover .tooltiptext, .plus-icon-container:hover .tooltiptext, - .trash-icon-container:hover .tooltiptext{ + .trash-icon-container:hover .tooltiptext, + .google:hover .tooltiptext, + .facebook:hover .tooltiptext, + .costum:hover .tooltiptext, + .extra-circle:hover +.tooltiptext, + .save-circle:hover +.tooltiptext, + .author:hover .tooltiptext{ visibility: visible; opacity: 1; font-size: 0.7em; @@ -100,7 +106,7 @@ body{ width: fit-content; border-radius: 3px; padding: 4px 6px; - z-index: 12; + z-index: 100000; white-space: nowrap; transition: opacity 0.3s; font-size: 0.8rem !important; @@ -156,6 +162,17 @@ body{ -o-transition: all ease-in-out .2s; transition: all ease-in-out .2s; } + .blue-button { + padding: 8px 18px; + display: flex; + align-items: center; + justify-content: center; + background-color: var(--blue-medium); + border-radius: 0.25rem; + color: var(--bg); + transition: all ease-in-out .15; + cursor: pointer; + } .background-shadow{ box-shadow: 0 0 0 99999px rgba(0, 0, 0, 0.328); diff --git a/CSS/account.css b/CSS/account.css index e768711..93b32d3 100644 --- a/CSS/account.css +++ b/CSS/account.css @@ -115,71 +115,7 @@ body { } .nav-right-side .outter-container:hover { background-color: var(--hover-light); } .nav-right-side .outter-container.active { background-color: var(--hover-medium); } - .img { - position: relative; - border-radius: 50%; - width: var(--num); - height: var(--num); - } - .img-settings { - background-repeat: no-repeat; - background-size: cover; - } - .img.xxl { - --num: 7.5rem; - --letter: 3.25rem; - cursor: pointer; - } - .img.big { - --num: 5.5rem; - --letter: 2.75rem; - cursor: pointer; - } - .img.medium { - --num: 3.25rem; - --letter: 2rem; - cursor: pointer; - } - .img.small { - --num: 2.25rem; - --letter: 1rem; - cursor: pointer; - } - .img .letter { - position: absolute; - left: calc(50% - 1.5rem); - right: calc(50% - 1.5rem); - top: calc(50% - 1.5rem); - bottom: calc(50% - 1.5rem); - width: 3rem; - height: 3rem; - display: flex; - align-items: center; - justify-content: center; - } - .img .letter span{ - font-size: var(--letter); - color: var(--bg); - } - .img:hover { filter: brightness(1.1); } - - .camera-container { - position: absolute; - bottom: -3px; - right: 0; - background-color: yellow; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - width: 1.25rem; - height: 1.25rem; - padding: 5px; - border: 1px solid var(--border-light); - background-color: var(--bg); - cursor: pointer; - } - .camera-container:hover i{ color: var(--google-blue); } + .top-div .personal-info { padding: 12px 10px; @@ -799,17 +735,6 @@ body { .main-content.change .button-container .inner-container:first-of-type { flex-grow: 1; } - .blue-button { - padding: 8px 18px; - display: flex; - align-items: center; - justify-content: center; - background-color: var(--blue-medium); - border-radius: 0.25rem; - color: var(--bg); - transition: all ease-in-out .15; - cursor: pointer; - } .name-container,.surname-container { margin-bottom: 1rem; } .main-content.change .button-container a { color: var(--google-blue); @@ -880,6 +805,52 @@ body { } .eye-icon-container i { color: var(--font-medium); } + + .trending-main-container { + display: flex; + flex-direction: column; + } + .trending-main-container section:last-of-type { margin-top: 5rem; } + .trending-main-container section { + margin-top: 1.5rem; + } + .trending-main-container section .table { + display: flex; + flex-direction: column; + min-width: 200px; + box-shadow: 0px 0px 10px 0 var(--hover-medium); + } + .trending-main-container section .table .col{ + width: 100%; + display: grid; + grid-template-columns: repeat(4, minmax(0, 12rem)); + } + .trending-main-container section .table .col .cell { + display: flex; + align-items: center; + justify-content: center; + padding: 10px; + overflow: auto; + max-height: 8rem; + padding: 10px; + border: 1px solid var(--border-light); + } + .table .col:hover { + background-color: var(--hover-light); + cursor: pointer; + } + .trending-main-container section .table .col .cell span { + font-size: 0.9rem; + color: var(--font-dark); + } + .trending-main-container section .table .col div h1 { + font-size: 1.2rem; + font-weight: 600; + } + + + + @media screen and (max-width: 1486px) { .main-content { margin-left: 280px; diff --git a/CSS/index.css b/CSS/index.css index 7c46e52..3892799 100644 --- a/CSS/index.css +++ b/CSS/index.css @@ -2,6 +2,7 @@ body{ display: grid; grid-template-rows: 65px 1fr; overflow: auto; + position: relative; } /* Navigation Bar */ @@ -631,11 +632,15 @@ body{ margin: auto; transition: all ease-in-out .3s; } + .main-content-section .library { + max-width: 700px !important; + } .main-content-section.full { width: 760px; } .main-content-section.full .article-container { display: flex; flex-direction: column; - grid-column: 1/13; + grid-column: 1/13 !important; + padding-bottom: 5rem; } .main-content-section.full .main-header { padding: 2rem 0; @@ -696,7 +701,9 @@ body{ } .main-content-section.headlines .main-content-container .article-container { grid-column: 1/9; } .main-content-section.headlines .main-content-container .main-side-content-container { grid-column: 9/13 ; } - + .library .main-content-container .article-container { + grid-column: 3/11; + } .article-container { grid-column: 1/9; } #main-side-content-container { grid-column: 9/13; } article.aside { border: none; } @@ -1163,6 +1170,8 @@ body{ width: calc(100% - 40px); grid-template-rows: 4.2rem 15px 1fr 15px 1.5rem; padding-bottom: 0; + margin: 0; + margin-top: 20px; } .weather-article .weather-main-header{ grid-template-columns: 88px 1fr 100px; @@ -1487,3 +1496,163 @@ body{ width: inherit; border-bottom: 1px solid var(--font-medium); } + + + /* Article */ + + article.news { + display: flex; + flex-direction: column; + position: relative; + padding-right: 185px; + padding-bottom: 2.5rem; + } + article.news.no-img { padding-right: 15px; } + article.news .article-header { + display: flex; + flex-direction: column; + margin-bottom: 0.75rem; + } + article.news .article-heading-container:hover h1 { + text-decoration: underline; + cursor: pointer; + } + article.news .article-header h1 { + font-weight: 600; + } + article.news .extra-content-container { + display: flex; + flex-direction: row; + padding: 5px 0; + min-height: 1.2rem; + } + article.news .extra-content-container .author { + display: flex; + align-items: center; + padding-right: 1rem; + } + article.news .author { + font-size: 0.9rem; + color: var(--font-medium); + } + article.news .extra-options-container { + display: flex; + flex-direction: row; + } + .save-container, + .extra-container { + position: relative; + margin-right: 0.5rem; + } + .save-circle, + .extra-circle { + width: 1.75rem; + height: 1.75rem; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + box-shadow: 2px 2px 1px 0px var(--border-light), + 0 0 0 1px var(--hover-light) inset; + cursor: pointer; + } + .save-circle:hover, + .extra-circle:hover { + box-shadow: 2px 2px 2px 0px var(--border-medium), + 0 0 0 0.4px var(--hover-medium) inset; + } + .save-circle:active, + .extra-circle:active { + box-shadow: 2px 3px 2px 0px var(--border-medium); + background-color: var(--hover-light); + } + + .extra-option-container { + position: absolute; + min-width: 10rem; + border-radius: 4px; + padding: 10px 0; + border: 1px solid var(--border-light); + background-color: var(--bg); + z-index: 7; + top: 2rem; + left: 0.5rem; + } + .extra-option-container .e-o-c-container { + padding: 10px 5px; + } + .e-o-c-container { + display: flex; + flex-direction: row; + cursor: pointer; + } + .e-o-c-container:hover { background-color: var(--hover-light); } + .e-o-c-container:active { background-color: var(--hover-medium); } + .e-o-c-container div { + width: 1.25rem; + height: 1.25rem; + display: flex; + align-items: center; + justify-content: center; + margin: 0 1rem 0 0.5rem; + } + article.news .text { + display: inline-flex; + font-size: 1rem; + color: var(--font-dark); + } + article.news .footer { + height: 2rem; + width: 2rem; + position: absolute; + bottom: 15px; + right: 15px; + width: calc(100% -30px); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + } + article.news .footer div { + transition: all ease-in-out .3s; + } + .r180 { transform: rotate(180deg); } + article.news .article-img { + position: absolute; + top: 15px; + right: 15px; + display: flex; + align-items: center; + justify-content: center; + } + article.news .article-img img{ + border-radius: 0.5rem; + max-width: 150px; + max-height: 150px; + } + + +.trending-page { + display: flex; + flex-direction: column; + background-color: var(--hover-light); + padding: 0; +} +.trending-page .header { + margin-bottom: 0.5rem; + padding: 10px; +} +.trending-page .main { + border-top: 1px solid var(--border-light); + padding: 10px 0; + cursor: pointer; + color: var(--font-dark); +} +.trending-page .main div { + padding: 0 10px; + margin-bottom: 7px; +} +.trending-page .small { + font-size: 0.8rem; +} +.trending-page .main:hover { background-color: var(--hover-medium); } \ No newline at end of file diff --git a/CSS/profileImg.css b/CSS/profileImg.css index d5307da..4ef9edf 100644 --- a/CSS/profileImg.css +++ b/CSS/profileImg.css @@ -1,172 +1,274 @@ .main-img-container { - visibility: hidden; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%,-50%) scale(0.9); - border: 1px solid var(--hover-medium); - border-radius: 5px; - background-color: var(--bg); - padding: 20px; - z-index: -10; - height: 0; + visibility: hidden !important; + position: absolute !important; + top: 50% !important; + left: 50% !important; + transform: translate(-50%,-50%) scale(0.9) !important; + border: 1px solid var(--hover-medium) !important; + border-radius: 5px !important; + background-color: var(--bg) !important; + padding: 20px !important; + z-index: -10 !important; + height: 0 !important; } .main-img-container.active { - z-index: 1000; - visibility: visible; - transform: translate(-50%,-50%) scale(1); - min-width: 320px; - max-width: 370px; - height: auto; + z-index: 1000000000 !important; + visibility: visible !important; + transform: translate(-50%,-50%) scale(1) !important; + min-width: 320px !important; + max-width: 370px !important; + height: auto !important; } .main-img-container .container { - margin-top: 0.75rem; - margin-bottom: 0.75rem; - display: flex; + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; + display: flex !important; } -.main-img-container .container .img { margin-right: 1rem; } -.color-img { margin-top: 0; } -.color-img.active { margin-top: 1rem; } +.main-img-container .google, +.main-img-container .facebook, +.main-img-container .selected, +.main-img-container .add, +.main-img-container .costum + { margin-right: 1rem !important; } +.color-img { margin-top: 0 !important; } +.color-img.active { margin-top: 1rem !important; } .main-img-container section { - margin: 1rem 0 2rem 0; - padding: 0 5px; + margin: 1rem 0 2rem 0 !important; + padding: 0 5px !important; } -.main-img-container.active section:nth-of-type(2) { margin-top: 0; } +.main-img-container.active section:nth-of-type(2) { margin-top: 0 !important; } .main-img-container section .img-text{ - display: flex; - align-items: center; - margin-bottom: 0.75rem; + display: flex !important; + align-items: center !important; + margin-bottom: 0.75rem !important; } -.main-img-container section .img-text p { color: var(--font-medium); } +.main-img-container section .img-text p { color: var(--font-medium) !important; } .main-img-container .img { - transition: all ease-in-out .12; + transition: all ease-in-out .12 !important; } -.main-img-container .img:hover { filter: brightness(0.97); } +.main-img-container .img:hover { filter: brightness(0.97) !important; } .img.medium.add { - background-color: var(--hover-light); + background-color: var(--hover-light) !important; } .img.medium.add div { - height: 100%; - width: 100%; - display: flex; - align-items: center; - justify-content: center; + height: 100% !important; + width: 100% !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; } .img.medium.add div i { - font-size: 1.7rem; - color: var(--font-medium); + font-size: 1.7rem !important; + color: var(--font-medium) !important; } .select-img { - background-color: var(--hover-medium); - border-radius: 4px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all ease-in-out .12s; - height: 0; + background-color: var(--hover-medium) !important; + border-radius: 4px !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + cursor: pointer !important; + transition: all ease-in-out .12s !important; + height: 0 !important; } .select-img .icon { - display: flex; - align-items: center; - justify-content: center; + display: flex !important; + align-items: center !important; + justify-content: center !important; } .select-img .icon i { - font-size: 3rem; - color: var(--font-medium); + font-size: 3rem !important; + color: var(--font-medium) !important; } -.select-img:hover { background-color: var(--hover-dark); } +.select-img:hover { background-color: var(--hover-dark) !important; } .main-img-container .x { - position: absolute; - top: 0; - right: 0; - padding: 5px; + position: absolute !important; + top: 0 !important; + right: 0 !important; + padding: 5px !important; } .main-img-container .x div { - width: 2.5rem; - height: 2.5rem; - display: flex; - align-items: center; - justify-content: center; - border-radius: 50%; - cursor: pointer; + width: 2.5rem !important; + height: 2.5rem !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + border-radius: 50% !important; + cursor: pointer !important; } -.main-img-container .x div:hover { background-color: var(--hover-light); } -.main-img-container .x div:active { background-color: var(--hover-medium); } +.main-img-container .x div:hover { background-color: var(--hover-light) !important; } +.main-img-container .x div:active { background-color: var(--hover-medium) !important; } .main-img-container .x div i { - font-size: 1.25rem; - display: flex; - align-items: center; - justify-content: center; - color: var(--font-dark); + font-size: 1.25rem !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + color: var(--font-dark) !important; } .insert-photo-container { - padding: 0; - margin: 0; - height: 0; - visibility: hidden; - transition: all ease-in-out .2s; - position: relative; + padding: 0 !important; + margin: 0 !important; + height: 0 !important; + visibility: hidden !important; + transition: all ease-in-out .2s !important; + position: relative !important; } .insert-photo-container.active { - visibility: visible; - height: 14rem; + visibility: visible !important; + height: 14rem !important; } .main-insert-photo-container { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - visibility: hidden; + position: absolute !important; + top: 0 !important; + left: 0 !important; + width: 100% !important; + height: 100% !important; + visibility: hidden !important; } -.insert-photo-container.active .main-insert-photo-container { visibility: visible; } -.insert-photo-container.active .main-insert-photo-container .select-img { height: 10rem; } -.insert-photo-container + section { margin-top: 0; } +.insert-photo-container.active .main-insert-photo-container { visibility: visible !important; } +.insert-photo-container.active .main-insert-photo-container .select-img { height: 10rem !important; } +.insert-photo-container + section { margin-top: 0 !important; } .main-insert-photo-container .footer { + height: 3rem !important; + display: flex !important; + align-items: center !important; + width: 100% !important; +} +.main-insert-photo-container .footer div:first-of-type { + display: flex !important; + align-items: center !important; + justify-self: flex-start !important; + flex-grow: 1 !important; +} +.main-insert-photo-container .footer div:first-of-type span { + color: var(--font-dark) !important; + font-size: 0.8rem !important; +} +.main-insert-photo-container .footer .button { + display: flex !important; + padding: 2px 5px !important; + align-items: center !important; + justify-content: center !important; + height: 50% !important; + background-color: var(--bg) !important; + border: 1px solid var(--border-light) !important; + border-radius: 3px !important; + cursor: pointer !important; + transition: all ease-in-out .15s !important; + color: var(--font-dark) !important; +} +.main-insert-photo-container .footer .button:hover { background-color: var(--hover-light) !important; } + +.color-container { + min-height: 4rem !important; + align-items: center !important; + justify-content: center !important; +} +.color-container .box-container { + display: inline-flex !important; + padding: 0.5rem 0.5rem !important; + position: relative !important; +} +.color-container div:last-of-type { margin-right: 0 !important;} + +.check-mark { + position: absolute !important; + width: 100% !important; + height: 100% !important; + top: 0 !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; + cursor: pointer !important; +} +.check-mark i { + color: var(--bg) !important; + font-size: 1.25rem !important; +} + +.footer-container { + display: flex !important; + justify-content: flex-end !important; +} +.footer-container .button { + width: 5rem !important; + height: 2.5rem !important; + display: flex !important; + align-items: center !important; + justify-content: center !important; +} +.google { position: relative !important; } +.main-img-container .error, +.main-img-container .error i + { font-size: 0.9rem !important; } + + + .img { + position: relative; + border-radius: 50%; + width: var(--num); + height: var(--num); +} +.img-settings { + background-repeat: no-repeat; + background-size: cover; +} +.img.xxl { + --num: 7.5rem; + --letter: 3.25rem; + cursor: pointer; +} +.img.big { + --num: 5.5rem; + --letter: 2.75rem; + cursor: pointer; +} +.img.medium { + --num: 3.25rem; + --letter: 2rem; + cursor: pointer; +} +.img.small { + --num: 2.25rem; + --letter: 1rem; + cursor: pointer; +} +.img .letter { + position: absolute; + left: calc(50% - 1.5rem); + right: calc(50% - 1.5rem); + top: calc(50% - 1.5rem); + bottom: calc(50% - 1.5rem); + width: 3rem; height: 3rem; display: flex; align-items: center; - width: 100%; -} -.main-insert-photo-container .footer div:first-of-type { - display: flex; - align-items: center; - justify-self: flex-start; - flex-grow: 1; -} -.main-insert-photo-container .footer div:first-of-type span { - color: var(--font-dark); - font-size: 0.8rem; -} -.main-insert-photo-container .footer .button { - display: flex; - padding: 2px 5px; - align-items: center; justify-content: center; - height: 50%; - background-color: var(--bg); - border: 1px solid var(--border-light); - border-radius: 3px; - cursor: pointer; - transition: all ease-in-out .15s; - color: var(--font-dark); } -.main-insert-photo-container .footer .button:hover { background-color: var(--hover-light); } +.img .letter span{ + font-size: var(--letter); + color: var(--bg); +} +.img:hover { filter: brightness(1.1); } -.color-container { - min-height: 4rem; +.camera-container { + position: absolute; + bottom: -3px; + right: 0; + border-radius: 50%; + display: flex; align-items: center; justify-content: center; + width: 1.25rem; + height: 1.25rem; + padding: 5px; + border: 1px solid var(--border-light); + background-color: var(--bg); + cursor: pointer; } -.color-container .box-container { - display: inline-flex; - padding: 0.5rem 0.5rem; - /* margin: auto 1rem 1rem auto; */ -} -.color-container div:last-of-type { margin-right: 0;} +.camera-container:hover i{ color: var(--google-blue); } \ No newline at end of file diff --git a/CSS/responsive.css b/CSS/responsive.css index 75de87c..164d820 100644 --- a/CSS/responsive.css +++ b/CSS/responsive.css @@ -26,7 +26,7 @@ display: none; } .article-container { - grid-column: 1/13; + grid-column: 1/13 !important; } .main-content-section { width: 100%; diff --git a/Images/5f7c9d2f10f750.23675548.png b/Images/5f7c9d2f10f750.23675548.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7604c4b7dab620a023db043006b430e191b7d1 GIT binary patch literal 75527 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%0A=ZoH@Pq__!I#r#x`6*S6iJLS?u9DDEwhf{^F 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%0D#@B3}gg0?Iywzud5rJl>QSNs&Tkp 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 JqtzXP{|_4dIza#c literal 0 HcmV?d00001 diff --git a/Images/5f7b8d76df9d60.00481097.png b/Images/5f7c9e63c9ab76.22203358.png similarity index 100% rename from Images/5f7b8d76df9d60.00481097.png rename to Images/5f7c9e63c9ab76.22203358.png diff --git a/JS/account.js b/JS/account.js index d0c5bf3..f1be63f 100644 --- a/JS/account.js +++ b/JS/account.js @@ -229,7 +229,6 @@ const check = { body: createFormData(string, array) }) const data = await res.text() - console.log(data) if(data === 'success') openLinks('/account/personal.php') else error.passwordOldAfter() } @@ -390,10 +389,11 @@ async function admin(action, email) { let imageUploadActive = false let currentImageUploadLocation +let newImg = false async function submitProfileImageUploadForm() { if(document.getElementById('file-upload').value) { - + errorSpanUploadImage.classList.remove('light-green-color') let photo = document.getElementById("file-upload").files[0] let formData = new FormData() @@ -408,30 +408,55 @@ async function submitProfileImageUploadForm() { else if(text === 'error') errorSpanUploadImage.innerHTML = `${icon} There have been some sort of an error` else if(text === 'extension not allowed') errorSpanUploadImage.innerHTML = `${icon} Only jpeg, jpg, png are allowed` else { + newImg = true imageUploadActive = true errorSpanUploadImage.classList.remove('red-color') errorSpanUploadImage.classList.add('light-green-color') errorSpanUploadImage.innerHTML = 'Image has been successfully added' - currentImageUploadLocation = text.split(' ')[1] - - array = JSON.stringify(['0', currentImageUploadLocation]) - const res = await fetch('../include/update.inc.php', { - method: "POST", - body: createFormData('imageUpload', array) - }) - const data = await res.text() - console.log(data) + console.log(currentImageUploadLocation) + if(document.querySelector('#external-img-container div.costum')) { + document.querySelector('#external-img-container div.costum').remove() + removeImg('../' + currentImageUploadLocation) + } + let div = document.createElement('div') + div.style.display = 'flex' + div.style.alignItems = 'center' + div.style.justifyContent = 'center' + div.classList.add('google','costum') + div.onclick = () => { selectImg(div) } + let img = document.createElement('img') + img.src = '../' + currentImageUploadLocation + img.alt = 'profile' + img.classList.add('img','medium') + div.appendChild(img) + document.querySelector('#external-img-container').insertBefore(div , document.querySelector('#external-img-container').children[0]) } - document.getElementById('file-upload').value = '' + document.getElementById('file-upload').value = null } else imageNameLabel.innerHTML = 'No file selected' } function fileChange() { - console.log(document.querySelector('.insert-photo-container .footer')) document.querySelector('.insert-photo-container .footer .footer').classList.remove('disable') let a = document.getElementById('file-upload').value.split(`fakepath`).pop().replace(/\\/g, '') a = a.substring(0, 20)+'...' imageNameLabel.innerHTML = a } + +function selectImg(element) { + if(document.querySelector('.check-mark')) document.querySelector('.check-mark').remove() + let div = document.createElement('div') + div.classList.add('check-mark') + let i = document.createElement('i') + i.classList.add('far','fa-check') + div.appendChild(i) + element.appendChild(div) +} + +async function removeImg(name) { + await fetch('../include/update.inc.php', { + method: "POST", + body: createFormData('deleteImg', name) + }) +} \ No newline at end of file diff --git a/JS/main.js b/JS/main.js index 810e281..cef7a8e 100644 --- a/JS/main.js +++ b/JS/main.js @@ -222,7 +222,6 @@ const php = { const error = { window : () => { - // Checkes if correct country acronym is in URL if(window.location.search.match(regularExpressions.url.country)) { let countryAcronym = window.location.search.match(regularExpressions.url.country)[0].slice(5, 7) let country = getAcronymCountry(countryAcronym) @@ -299,7 +298,6 @@ window.onload = async () => { else if (window.location.pathname.includes('help')) help() else if (window.location.pathname.includes('search')) mainSearch() await user.location() - // changeBackgroundColor() } window.onclick = (e) => { @@ -398,10 +396,212 @@ async function headlines() { sidebarCategorySelect(document.querySelector('.fa-newspaper').parentElement.parentElement) historyPushState(window.location.origin + window.location.pathname, '', `?cou=${getCountryAcronym(selectedCountry.innerHTML.trim())}`,`&bg=${backgroundColor}`) + apiString = await getApiString() + await fetchNewsArticles(apiString) + generatArticles(publicArticleArray) +} +async function getApiString() { + const key = await php.info('news') + return apiString = `https://newsapi.org/v2/top-headlines?country=${getCountryAcronym(selectedCountry.innerHTML.trim())}&apiKey=${key}`; +} + +async function generatArticles(array) { + if(array == null) return + for(let i = 0; i < array.length; i++) { + + let authors = array[i].author + let content = array[i].content + let description = array[i].description + let date = getDate(array[i].publishedAt) + let source = array[i].source.name + let title = array[i].title + let url = array[i].url + let imgUrl = array[i].urlToImage + + let bookmarkcolor = 'aaaaa' + let defaultClass = 'far' + if(checkIfUserIsLoggedIn() !== 'ni') { + const res = await isSaved(title) + if(res === 'saved') { + bookmarkcolor = 'yellow-color' + defaultClass = 'fas' + } + } + + dbArray = [authors, content, description, date, source, title, url, imgUrl] + + insertIntoDB(dbArray) + + let article = document.createElement('article') + article.classList.add('news', `a-${i}-a`) + let div = document.createElement('div') + div.classList.add('article-header') + let headingContainer = document.createElement('div') + headingContainer.classList.add('article-heading-container') + let a = document.createElement('a') + a.href = array[i].url.trim() + let h1 = document.createElement('h1') + h1.innerHTML = array[i].title.trim() + a.appendChild(h1) + headingContainer.appendChild(a) + let extraContentContainer = document.createElement('extra-content-containe') + extraContentContainer.classList.add('extra-content-container') + let author = document.createElement('div') + author.classList.add('author') + author.style.position = 'relative' + let span = document.createElement('span') + span.innerHTML = `${array[i].source.name.trim()} • ${getDate(array[i].publishedAt)}` + author.appendChild(span) + if(array[i].author != null) { + let tooltiptext = document.createElement('span') + tooltiptext.classList.add('tooltiptext','tooltiptextTop90') + tooltiptext.innerHTML = array[i].author + author.appendChild(tooltiptext) + } + let extraOptionsContainer = document.createElement('div') + extraOptionsContainer.classList.add('extra-options-container') + let saveContainer = document.createElement('div') + saveContainer.classList.add('save-container', `a-${i}-a`) + let saveCircle = document.createElement('div') + saveCircle.classList.add('save-circle') + saveCircle.onclick = () => { saveNews(1, saveContainer) } + let bookmark1 = document.createElement('i') + bookmark1.classList.add(defaultClass,'fa-bookmark', bookmarkcolor) + let tooltiptextSave1 = document.createElement('span') + tooltiptextSave1.classList.add('tooltiptext','tooltiptextTop130') + tooltiptextSave1.innerHTML = 'Save' + saveCircle.appendChild(bookmark1) + saveContainer.appendChild(saveCircle) + saveContainer.appendChild(tooltiptextSave1) + let extraContaner = document.createElement('div') + extraContaner.classList.add('extra-container') + let extraCircle = document.createElement('div') + extraCircle.classList.add('extra-circle') + extraCircle.onclick = () => { openExtraOptions(extraCircle) } + let extraI = document.createElement('i') + extraI.classList.add('far', 'fa-ellipsis-v') + extraCircle.appendChild(extraI) + let tooltiptextextra1 = document.createElement('span') + tooltiptextextra1.classList.add('tooltiptext','tooltiptextTop130') + tooltiptextextra1.innerHTML = 'Extra options' + let aside = document.createElement('aside') + aside.classList.add('extra-option-container', 'disable', `a-${i}-a`) + let aDiv1 = document.createElement('div') + aDiv1.classList.add('e-o-c-container') + aDiv1.onclick = () => { openNews(aDiv1) } + let div11 = document.createElement('div') + let i11 = document.createElement('i') + i11.classList.add('far', 'fa-external-link-alt') + div11.appendChild(i11) + let span11 = document.createElement('span') + span11.innerHTML = 'Open' + div11.appendChild(i11) + aDiv1.appendChild(div11) + aDiv1.appendChild(span11) + let aDiv2 = document.createElement('div') + aDiv2.classList.add('e-o-c-container') + aDiv2.onclick = () => { saveNews(2, aside) } + let div22 = document.createElement('div') + let i22 = document.createElement('i') + i22.classList.add(bookmarkcolor, 'fa-bookmark', defaultClass) + div22.appendChild(i22) + let span22 = document.createElement('span') + span22.innerHTML = 'Save' + div22.appendChild(i22) + aDiv2.appendChild(div22) + aDiv2.appendChild(span22) + let aDiv3 = document.createElement('div') + aDiv3.classList.add('e-o-c-container') + aDiv3.onclick = () => { hideArticle(`a-${i}-a`) } + let div33 = document.createElement('div') + let i33 = document.createElement('i') + i33.classList.add('far', 'fa-minus-circle') + div33.appendChild(i33) + let span33 = document.createElement('span') + span33.innerHTML = 'Hide' + div33.appendChild(i33) + aDiv3.appendChild(div33) + aDiv3.appendChild(span33) + aside.appendChild(aDiv1) + aside.appendChild(aDiv2) + aside.appendChild(aDiv3) + extraContaner.appendChild(extraCircle) + extraContaner.appendChild(tooltiptextextra1) + extraContaner.appendChild(aside) + extraOptionsContainer.appendChild(saveContainer) + extraOptionsContainer.appendChild(extraContaner) + extraContentContainer.appendChild(author) + extraContentContainer.appendChild(extraOptionsContainer) + div.appendChild(headingContainer) + div.appendChild(extraContentContainer) + article.appendChild(div) + if(array[i].content !== null) { + let text = document.createElement('div') + text.classList.add('text') + let p = document.createElement('p') + p.innerHTML = array[i].content.slice(0, -18) + if(array[i].description != null) { + let spanT = document.createElement('span') + spanT.classList.add('disable' ,`a-${i}-t`) + spanT.innerHTML = array[i].description.trim() + p.appendChild(spanT) + } + text.appendChild(p) + article.appendChild(text) + } + + + if(array[i].description !== null) { + let footer = document.createElement('div') + footer.classList.add('footer') + let divF = document.createElement('div') + divF.onclick = () => { manageArticleText(divF, `a-${i}-t`) } + let iF = document.createElement('i') + iF.classList.add('far', 'fa-chevron-down') + divF.appendChild(iF) + footer.appendChild(divF) + article.appendChild(footer) + } + + + if(array[i].urlToImage === null) article.classList.add('no-img') + else { + let imgD = document.createElement('div') + imgD.classList.add('article-img') + let img = document.createElement('img') + img.src = array[i].urlToImage + img.alt = 'img' + + imgD.appendChild(img) + article.appendChild(imgD) + } + + document.querySelector('.article-container').appendChild(article) + } + +} + +function getDate(date) { return date.slice(0, -10) } + +async function insertIntoDB(arrayVal) { + + array = JSON.stringify(arrayVal) + const res = await fetch(`${locationOrganiser}include/insert.inc.php`, { + method: "POST", + body: createFormData('news', array) + }) +} +async function isSaved(title) { + const res = await fetch(`${locationOrganiser}include/check.inc.php`, { + method: "POST", + body: createFormData('newsSaveArticle', title) + }) + const data = await res.text() + return data } /* SEARCH */ - function mainSearch(extra, type) { + async function mainSearch(extra, type) { let url = '' let newSearch = false pathLocation = '' @@ -433,13 +633,26 @@ async function headlines() { let searchInputValue = window.location.search.match(regularExpressions.url.query)[0].slice(3, -1) mainSearchInput.value = urlEdit(searchInputValue) + let n = 0 + let mainArticleContainer = document.querySelector('.article-container') + const num = mainArticleContainer.children.length + + for(let i = 0; i < num; i++) { + if(mainArticleContainer.children[n].tagName === 'ARTICLE') mainArticleContainer.children[n].remove() + else n = 1 + } + + const key = await php.info('news') + apiString = await getApiString() + await fetchNewsArticles(`https://newsapi.org/v2/everything?q=${mainSearchInput.value}&apiKey=${key}`) + generatArticles(publicArticleArray) + + searchBox.update(mainSearchInput.value.trim()) hideExtraSearchOptions() hideSuggestWords() suggest.suggest() - /* Search news articles */ - // console.log(url[4]) } function createUrlExtraOptions(option) { let url @@ -490,8 +703,21 @@ function library() { /* CATEGORIES */ -function category(word) { +async function category(word) { sidebarCategorySelect(document.querySelector(`.${word}`).parentElement.parentElement) + let string = '' + const key = await php.info('news') + + if(word == 'fa-shield-cross') string = `https://newsapi.org/v2/everything?q=covid&apiKey=${key}` + else if(word == 'fa-globe-europe') string = `https://newsapi.org/v2/everything?q=world&apiKey=${key}` + else if(word == 'fa-building') string = `https://newsapi.org/v2/top-headlines?country=${getCountryAcronym(selectedCountry.innerHTML.trim())}&category=business&apiKey=${key}` + else if(word == 'fa-microchip') string = `https://newsapi.org/v2/top-headlines?country=${getCountryAcronym(selectedCountry.innerHTML.trim())}&category=technology&apiKey=${key}` + else if(word == 'fa-camera-movie') string = `https://newsapi.org/v2/top-headlines?country=${getCountryAcronym(selectedCountry.innerHTML.trim())}&category=entertainment&apiKey=${key}` + else if(word == 'fa-tennis-ball') string = `https://newsapi.org/v2/top-headlines?country=${getCountryAcronym(selectedCountry.innerHTML.trim())}&category=sport&apiKey=${key}` + else if(word == 'fa-heartbeat') string = `https://newsapi.org/v2/top-headlines?country=${getCountryAcronym(selectedCountry.innerHTML.trim())}&category=health&apiKey=${key}` + + await fetchNewsArticles(string) + generatArticles(publicArticleArray) } /* SETTINGS */ @@ -553,12 +779,23 @@ mainSearchInput.onkeyup = (e) => { } } -function updateCountrySelect(country) { +async function updateCountrySelect(country) { selectedCountry.innerHTML = country if(location.pathname.includes('search')) string = '&' else string = '?' historyPushState(location.origin + location.pathname, location.search.replace(regularExpressions.url.country,`${string}cou=${getCountryAcronym(country)}`), '', '') hideSelectCountry() + let mainArticleContainer = document.querySelector('.article-container') + const num = mainArticleContainer.children.length + let n = 0 + for(let i = 0; i < num; i++) { + if(mainArticleContainer.children[n].tagName === 'ARTICLE') mainArticleContainer.children[n].remove() + else n = 1 + } + apiString = await getApiString() + await fetchNewsArticles(apiString) + generatArticles(publicArticleArray) + } function createUrlPath(type, search) { @@ -752,52 +989,6 @@ function inputExtraSearchOptionChange() { function addDisableSideElements() { mainAsideContent.querySelectorAll('article').forEach(article => article.classList.add('disable')) } function removeDisableSideElements() { mainAsideContent.querySelectorAll('article.disable').forEach(article => article.classList.remove('disable')) } -function follow(element) { - if(element.lastElementChild.textContent === 'Follow') fillIcons(element.firstElementChild, element.lastElementChild, 'Following') - else emptyIcons(element.firstElementChild, element.lastElementChild, 'Follow') - - if(window.location.pathname.includes('search')) followNews() - else followCategory() -} -function saveNews(element) { - if(element.lastElementChild.textContent === 'Save') fillIcons(element.firstElementChild, element.lastElementChild, 'Saved') - else emptyIcons(element.firstElementChild, element.lastElementChild, 'Save') - //PHP -} -function followNews() { - //PHP -} -function followCategory() { - -} - -function fillIcons(icon, text, string) { - icon.classList.remove('far') - icon.classList.add('fas') - text.textContent = string -} -function emptyIcons(icon, text, string) { - icon.classList.add('far') - icon.classList.remove('fas') - text.textContent = string -} - -/* API */ - -// fetchNewsArticles() -async function fetchNewsArticles() { - - const key = await php.info('news') - const response = await fetch(`http://cors-anywhere.herokuapp.com/http://newsapi.org/v2/everything?q=-velenje america "coronavirus"&sortBy=popularity&apiKey=${key}`).catch(() => { - // noArticlesFoundNotification() - }) - // const response = await fetch(newsApiLoadUrl).catch(err => { - // noArticlesFoundNotification() - // }) - const json = await response.json() - const articles = await json.articles -} - function createFormData(word, data) { let formData = new FormData formData.append(word, data) @@ -814,10 +1005,102 @@ function checkIfCategoriesAreOpen() { return true return false } -// string.trim().replace(/\s\s+/g, ' ').replace(/%20/g, ' ').replace(/%22/g, '"') -async function logOut(string) { +async function logout(string) { const res = await fetch(`include/logout.inc.php`) const data = res.text() openLinks(filePath.headlines + string); } + + + + + +let imageUploadActive = false +let currentImageUploadLocation +let newImg = false +async function submitProfileImageUploadForm() { + + if(document.getElementById('file-upload').value) { + errorSpanUploadImage.classList.remove('light-green-color') + let photo = document.getElementById("file-upload").files[0] + let formData = new FormData() + + formData.append('file', photo) + + const response = await fetch('../include/uploadFile.inc.php', { + method: "POST", + body: formData + }) + const text = await response.text() + if(text === 'too big') errorSpanUploadImage.innerHTML = `${icon} Max file size is 1MB` + else if(text === 'error') errorSpanUploadImage.innerHTML = `${icon} There have been some sort of an error` + else if(text === 'extension not allowed') errorSpanUploadImage.innerHTML = `${icon} Only jpeg, jpg, png are allowed` + else { + newImg = true + imageUploadActive = true + errorSpanUploadImage.classList.remove('red-color') + errorSpanUploadImage.classList.add('light-green-color') + errorSpanUploadImage.innerHTML = 'Image has been successfully added' + currentImageUploadLocation = text.split(' ')[1] + console.log(currentImageUploadLocation) + if(document.querySelector('#external-img-container div.costum')) { + document.querySelector('#external-img-container div.costum').remove() + removeImg('../' + currentImageUploadLocation) + } + let div = document.createElement('div') + div.style.display = 'flex' + div.style.alignItems = 'center' + div.style.justifyContent = 'center' + div.classList.add('google','costum') + div.onclick = () => { selectImg(div) } + let img = document.createElement('img') + img.src = '../' + currentImageUploadLocation + img.alt = 'profile' + img.classList.add('img','medium') + div.appendChild(img) + document.querySelector('#external-img-container').insertBefore(div , document.querySelector('#external-img-container').children[0]) + } + document.getElementById('file-upload').value = null + + } else imageNameLabel.innerHTML = 'No file selected' + +} +function fileChange() { + document.querySelector('.insert-photo-container .footer .footer').classList.remove('disable') + let a = document.getElementById('file-upload').value.split(`fakepath`).pop().replace(/\\/g, '') + a = a.substring(0, 20)+'...' + imageNameLabel.innerHTML = a +} + +function selectImg(element) { + if(document.querySelector('.check-mark')) document.querySelector('.check-mark').remove() + let div = document.createElement('div') + div.classList.add('check-mark') + let i = document.createElement('i') + i.classList.add('far','fa-check') + div.appendChild(i) + element.appendChild(div) +} + +async function removeImg(name) { + await fetch('../include/update.inc.php', { + method: "POST", + body: createFormData('deleteImg', name) + }) +} + + + +/* API */ + + +async function fetchNewsArticles(url) { + + const response = await fetch(url) + const json = await response.json() + const articles = await json.articles + publicArticleArray = articles +} + +let publicArticleArray = [] diff --git a/JS/show.js b/JS/show.js index cf5881f..09741d3 100644 --- a/JS/show.js +++ b/JS/show.js @@ -170,11 +170,193 @@ function generateColors () { if(!parent) return for(let i = 0; i < colors.length; i++) { let divP = document.createElement('div') + divP.style.position = 'realtive' divP.classList.add('box-container') let div = document.createElement('div') div.classList.add('img','medium') div.style.backgroundColor = colors[i] - divP.appendChild(div) + divP.onclick = () => { selectImg(div) } + divP.appendChild(div) + if(document.querySelector('.img.small.test').style.backgroundColor === colors[i]) { + let div1 = document.createElement('div') + div1 .classList.add('check-mark') + let i = document.createElement('i') + i.classList.add('far', 'fa-check') + div1.appendChild(i) + div.appendChild(div1) + } parent.appendChild(divP) } -} \ No newline at end of file +} +function saveImg() { + selectedImg = document.querySelector('.check-mark') + if(!selectedImg) return + let num + if(selectedImg.parentElement.classList.contains('costum')) num = 0 + else if(selectedImg.parentElement.classList.contains('img')) num = 1 + else if(selectedImg.parentElement.classList.contains('google')) num = 2 + else if(selectedImg.parentElement.classList.contains('facebook')) num = 3 + else if(selectedImg.parentElement.classList.contains('github')) num = 4 + if (selectedImg.parentElement.firstElementChild.tagName == 'IMG') { + if(num == 0 && newImg == true) img = currentImageUploadLocation + else if(num == 0 && newImg == false) img = selectedImg.parentElement.firstElementChild.src.replace(websiteURL, '') + else img = selectedImg.parentElement.firstElementChild.src + } + else img = selectedImg.parentElement.firstElementChild.parentElement.style.backgroundColor + uploadImg(num, img) + newImg = false + +} +let locationOrganiser = '../' +if(window.location.pathname.includes('headlines') || window.location.pathname.includes('search')) locationOrganiser = '' +async function uploadImg(num, img) { + array = JSON.stringify([num, img]) + console.log(num,img) + await fetch(`${locationOrganiser}include/update.inc.php`, { + method: "POST", + body: createFormData('imageUpload', array) + }) + location.reload() +} + + + +function openExtraOptions(element) { + if(element.parentElement.lastElementChild.classList.contains('disable')) { + element.parentElement.lastElementChild.classList.remove('disable') + } else { + element.parentElement.lastElementChild.classList.add('disable') + } +} +function hideArticle(c) { + document.querySelector(`article.${c}`).remove() + //Php +} +function openNews(element) { element.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.firstElementChild.firstElementChild.firstElementChild.click() } + + +function follow(element) { + if(element.lastElementChild.textContent === 'Follow') fillIcons(element.firstElementChild, element.lastElementChild, 'Following') + else emptyIcons(element.firstElementChild, element.lastElementChild, 'Follow') + + if(window.location.pathname.includes('search')) followNews() + else followCategory() +} +async function saveNews(num, element) { + let i1 + let i2 + let res = await checkIfUserIsLoggedIn() + if(res == 'ni') return manageLoginOptions() + if(num == 1) { + i1 = element.firstElementChild.firstElementChild + i2 = document.querySelectorAll('.'+element.classList[1])[2].children[1].firstElementChild.firstElementChild + } else { + i1 = element.children[1].firstElementChild.firstElementChild + i2 = element.parentElement.parentElement.firstElementChild.querySelector('i') + let n = 0 + for(let i = 0; i < publicArticleArray.length; i++) { + if(element.parentElement.parentElement.parentElement.parentElement.classList[1].includes(i)) n = i + } + let array = JSON.stringify([publicArticleArray[n].title]) + + const res = await fetch(`${locationOrganiser}include/update.inc.php`, { + method: "POST", + body: createFormData('unsaveNews', array) + }) + const data = await res.text() + console.log(data) + } + if(i1.classList.contains('fas')) { + i1.classList.remove('fas') + i1.classList.add('far') + i1.classList.remove('yellow-color') + i2.classList.remove('fas') + i2.classList.add('far') + i2.classList.remove('yellow-color') + string = 'unsaveNews' + } else { + i1.classList.add('fas') + i1.classList.remove('far') + i1.classList.add('yellow-color') + i2.classList.add('fas') + i2.classList.remove('far') + i2.classList.add('yellow-color') + string = 'saveNews' + } + let n = 0 + let array + if(publicArticleArray !== null && publicArticleArray !== undefined && publicArticleArray.length !== 0) { + for(let i = 0; i < publicArticleArray.length; i++) { + if(element.parentElement.parentElement.parentElement.parentElement.classList[1].includes(i)) n = i + } + array = JSON.stringify([publicArticleArray[n].title]) + } else array = JSON.stringify([element.parentElement.parentElement.parentElement.firstElementChild.firstElementChild.firstElementChild.innerHTML.trim()]) + const res2 = await fetch(`${locationOrganiser}include/update.inc.php`, { + method: "POST", + body: createFormData(string, array) + }) + const data2 = await res2.text() + console.log(data2) +} +async function manageNews() { + const res = await fetch(`${locationOrganiser}include/check.inc.php`, { + method: "POST", + body: createFormData('isIdSet', '') + }) + const data = await res.text() + return data; +} + +function followNews() { + //PHP +} +function followCategory() { + +} + +function fillIcons(icon, text, string) { + icon.classList.remove('far') + icon.classList.add('fas') + text.textContent = string +} +function emptyIcons(icon, text, string) { + icon.classList.add('far') + icon.classList.remove('fas') + text.textContent = string +} + +function manageArticleText(element,c) { + if(document.querySelector('.'+c).classList.contains('disable')) { + document.querySelector('.'+c).classList.remove('disable') + element.classList.add('r180') + } + else { + document.querySelector('.'+c).classList.add('disable') + element.classList.remove('r180') + } +} + +async function checkIfUserIsLoggedIn() { + const res = await fetch(`${locationOrganiser}include/check.inc.php`, { + method: "POST", + body: createFormData('isIdSet', '') + }) + const data = await res.text() + return data; +} + +async function showTrendingOptions(element) { + let keyword + if(element.parentElement.parentElement.classList.contains('trending')) { + keyword = 'trendingOut' + document.querySelector('section.all article').appendChild(element) + } else if(element.parentElement.parentElement.classList.contains('all')) { + document.querySelector('section.trending article').appendChild(element) + keyword = 'trendingIn' + } else location.reload() + if(!element.querySelector('.id').innerHTML) location.reload() + const res = await fetch('../include/update.inc.php', { + method: "POST", + body: createFormData(keyword, element.querySelector('.id').innerHTML) + }) +} diff --git a/JS/signIn/signin.js b/JS/signIn/signin.js index 338f10a..ca239de 100644 --- a/JS/signIn/signin.js +++ b/JS/signIn/signin.js @@ -4,7 +4,7 @@ const password = document.querySelector('.password-container') const emailInput = document.getElementById('email-input') const passwordInput = document.getElementById('password-input') -const websiteURL = 'http://localhost:8080/News-website/' +const websiteURL = 'https://news.niktopler.com/' emailInput.onfocus = () => { email.querySelector('.label-container').classList.add('active') diff --git a/JS/signIn/signup.js b/JS/signIn/signup.js index 8efd7df..7947b4a 100644 --- a/JS/signIn/signup.js +++ b/JS/signIn/signup.js @@ -152,7 +152,7 @@ function managePasswordVisibility(element) { pswRepeatInput.type = 'password' } } -const websiteURL = 'http://localhost:8080/News-website/' +const websiteURL = 'https://news.niktopler.com/' function urlOpen(string) { window.location.replace(`${websiteURL}headlines.php${string}`) } diff --git a/JS/variables.js b/JS/variables.js index 170bd21..12c0e2c 100644 --- a/JS/variables.js +++ b/JS/variables.js @@ -8,8 +8,8 @@ const colors = ['rgb(211, 47, 47)','rgb(123, 31, 162)','rgb(81, 45, 168)','rgb(48, 63, 159)','rgb(25, 118, 210)','rgb(2, 136, 209)','rgb(0, 151, 167)','rgb(0, 121, 107)','rgb(56, 142, 60)','rgb(104, 159, 56)','rgb(175, 180, 43)','rgb(251, 192, 45)','rgb(255, 160, 0)','rgb(245, 124, 0)','rgb(230, 74, 25)','rgb(93, 64, 55)','rgb(97, 97, 97)'] const days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'] const daysAcronyms = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'] - const websiteURL = 'http://localhost:8080/News-website' - // const websiteURL = 'https://news.niktopler.com' + // const websiteURL = 'http://localhost:8080/News-website' + const websiteURL = 'https://news.niktopler.com' const topStoriesURL = '&t=topstories&' const everythingURL = '&t=everything&' @@ -48,6 +48,7 @@ /* Navigation Bar Right */ const logInOptions = document.getElementById('login-option-div') + const CORS = 'https://cors-anywhere.herokuapp.com/' /** Main Content */ /** Side Menu */ let sideBarContent = document.getElementById('side-bar-content') diff --git a/account/add-ons/side-bar.php b/account/add-ons/side-bar.php index 821c6e4..fff35b3 100644 --- a/account/add-ons/side-bar.php +++ b/account/add-ons/side-bar.php @@ -11,18 +11,19 @@
- + echo ' - - + +
\ No newline at end of file diff --git a/account/home.php b/account/home.php index 472da72..794a8d7 100644 --- a/account/home.php +++ b/account/home.php @@ -22,25 +22,25 @@
-
+
'); + echo ('
'); else if($_SESSION['profile_choice'] == 1) - echo ('
+ echo ('
'.$_SESSION['letter'].'
'); else if($_SESSION['profile_choice'] == 2) - echo ('
'); + echo ('
'); else if($_SESSION['profile_choice'] == 3) - echo ('
'); + echo ('
'); else if($_SESSION['profile_choice'] == 4) - echo ('
'); + echo ('
'); ?>
@@ -122,6 +122,7 @@
+ \ No newline at end of file diff --git a/account/settings.php b/account/settings.php index 45ba479..321660d 100644 --- a/account/settings.php +++ b/account/settings.php @@ -25,6 +25,8 @@
+ +
diff --git a/account/trending.php b/account/trending.php index 735eace..f077107 100644 --- a/account/trending.php +++ b/account/trending.php @@ -1,5 +1,6 @@ @@ -22,11 +23,197 @@
- - +
+
+
+

+ Welcome to Trending Section +

+
+
+

+ Have full controll over trending page +

+
+
+ +
\ No newline at end of file diff --git a/add-ons/head.php b/add-ons/head.php index 383ac7b..4215a91 100644 --- a/add-ons/head.php +++ b/add-ons/head.php @@ -9,6 +9,7 @@ + diff --git a/add-ons/navigation-bar-right.php b/add-ons/navigation-bar-right.php index e76cdd1..3295a2f 100644 --- a/add-ons/navigation-bar-right.php +++ b/add-ons/navigation-bar-right.php @@ -12,19 +12,19 @@ else $str = ''; if($_SESSION['profile_choice'] == 0) - echo ('
'); + echo ('
'); else if($_SESSION['profile_choice'] == 1) - echo ('
+ echo ('
'.$_SESSION['letter'].'
'); else if($_SESSION['profile_choice'] == 2) - echo ('
'); + echo ('
'); else if($_SESSION['profile_choice'] == 3) - echo ('
'); + echo ('
'); else if($_SESSION['profile_choice'] == 4) - echo ('
'); + echo ('
'); ?> @@ -104,7 +104,7 @@
-
> +
>
@@ -117,7 +117,7 @@
-
> +
> -
> +
>
@@ -146,7 +146,7 @@
-
+
Sign out diff --git a/add-ons/profileImg.php b/add-ons/profileImg.php index 1cf2b0a..b573e31 100644 --- a/add-ons/profileImg.php +++ b/add-ons/profileImg.php @@ -1,4 +1,4 @@ -
+

Change Profile Image

@@ -19,12 +19,44 @@
+
+
'; + if(isset($_SESSION['profile_img']) && $_SESSION['profile_img'] != null) { + if($_SESSION['profile_choice'] == 0) $checkC = $check; + else $checkC = ''; + echo '
profile + Costum Image + '.$checkC.' +
'; + } + if(isset($_SESSION['google_profile_img']) && $_SESSION['google_profile_img'] != null) { + if($_SESSION['profile_choice'] != 2) $checkG = ''; + else $checkG = $check; + echo '
profile + Google Image + '.$checkG.' +
'; + } + if(isset($_SESSION['facebook_profile_img']) && $_SESSION['facebook_profile_img'] != null) { + if($_SESSION['profile_choice'] != 3) $checkF = ''; + else $checkF = $check; + echo ''; + } + ?> +

Click on grey area and add image

-
+
@@ -36,7 +68,7 @@
+
diff --git a/headlines.php b/headlines.php index c05f6f1..db31a93 100644 --- a/headlines.php +++ b/headlines.php @@ -9,6 +9,7 @@ + @@ -37,21 +38,113 @@
- -
- -
-

Hello World!

-
- +
+
- - - - - @@ -145,6 +258,8 @@
+ + diff --git a/include/check.inc.php b/include/check.inc.php index f8108b8..507f15b 100644 --- a/include/check.inc.php +++ b/include/check.inc.php @@ -1,4 +1,6 @@ '; die; } + + public function isIdSet() { + if(isset($_SESSION['email'])) echo 'je'; + else echo 'ni'; + die; + } + + public function newsSaveArticle($title) { + $sql = 'SELECT * FROM news n INNER JOIN saved_news sn ON n.id = sn.news_id INNER JOIN users u ON u.id = sn.user_id WHERE n.title = ?'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$title]); + $row = $stmt->fetch(); + if($row) echo 'saved'; + else echo 'not saved'; + } } $checkObj = new Check(); @@ -105,3 +122,5 @@ if($_SERVER['REQUEST_METHOD'] !== 'POST') return; if(isset($_POST['email'])) $checkObj->email(json_decode($_POST['email'])); else if(isset($_POST['login'])) $checkObj->login(json_decode($_POST['login'])); else if(isset($_POST['pswSet'])) $checkObj->pswSet(); +else if(isset($_POST['isIdSet'])) $checkObj->isIdSet(); +else if(isset($_POST['newsSaveArticle'])) $checkObj->newsSaveArticle($_POST['newsSaveArticle']); diff --git a/include/db.inc.php b/include/db.inc.php index 41fe99f..c762268 100644 --- a/include/db.inc.php +++ b/include/db.inc.php @@ -1,26 +1,10 @@ host. ';dbname=' .$this->dbName. ';charset=' .$this->charset ; - $pdo = new PDO($dsn, $this->user, $this->pwd); - $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); - return $pdo; - } - } - - // class Dbh { - // private $host = ''; - // private $dbName = 'niktople_Fews'; - // private $user = 'niktople_nik'; - // private $pwd = 'niktopler2002'; + // private $host = 'localhost'; + // private $dbName = 'NewsWebsite'; + // private $user = 'root'; + // private $pwd = ''; // private $charset = 'utf8mb4'; // protected function connect() { @@ -32,3 +16,19 @@ // } + class Dbh { + private $host = ''; + private $dbName = 'niktople_Fews'; + private $user = 'niktople_nik'; + private $pwd = 'niktopler2002'; + private $charset = 'utf8mb4'; + + protected function connect() { + $dsn = 'mysql:host=' .$this->host. ';dbname=' .$this->dbName. ';charset=' .$this->charset ; + $pdo = new PDO($dsn, $this->user, $this->pwd); + $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); + return $pdo; + } + } + + diff --git a/include/insert.inc.php b/include/insert.inc.php index a5a75a0..57862eb 100644 --- a/include/insert.inc.php +++ b/include/insert.inc.php @@ -1,16 +1,15 @@ - $userInfo[2]]); - $payload = $client->verifyIdToken($userInfo[1]); - if (!$payload) { - echo 'error'; - return; - } - + // require_once '../vendor/autoload.php'; + // $client = new Google_Client(['client_id' => $userInfo[2]]); + // $payload = $client->verifyIdToken($userInfo[1]); + // if (!$payload) { + // echo 'error'; + // return; + // } $userExist = $this->checkIfUserExistsExternal('google', $userInfo); if($userExist == 'empty') $this->insert('google', $userInfo); else if($userExist == 'ID') $this->updateID('googleID', $userInfo); @@ -154,11 +153,46 @@ class Login extends Dbh{ $i = array_rand($colors); return $colors[$i]; } + + public function news($array) { + echo $this->checkIfNewsIsInDB($array); + if($this->checkIfNewsIsInDB($array) == 'je') die; + + $this->insertSource($array[4]); + + $sql = 'INSERT INTO news(author,title,subtitle,URL_site,URL_img,date,text,source_id) VALUES(?,?,?,?,?,?,?,(SELECT id FROM sources WHERE name = ?))'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$array[0], $array[5], $array[1], $array[6], $array[7], $array[3], $array[2], $array[4]]); + + } + public function checkIfNewsIsInDB($array) { + $sql = 'SELECT * FROM news WHERE title = ? AND author = ?'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$array[5], $array[0]]); + $row = $stmt->fetch(); + if($row) return 'je'; + else return 'ni'; + } + public function insertSource($name) { + if($this->checkIfSourceIsInDB($name) == 'je') return; + $sql = 'INSERT INTO sources(name) VALUES (?)'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$name]); + } + public function checkIfSourceIsInDB($name) { + $sql = 'SELECT * FROM sources WHERE name = ?'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$name]); + $row = $stmt->fetch(); + if($row) return 'je'; + else return 'ni'; + } + } $loginObj = new Login(); - -if($_SERVER['REQUEST_METHOD'] !== 'POST') return; +if($_SERVER['REQUEST_METHOD'] !== 'POST') die; else if(isset($_POST['google'])) $loginObj->google(json_decode($_POST['google'])); else if(isset($_POST['facebook'])) $loginObj->facebook(json_decode($_POST['facebook'])); -else if(isset($_POST['standard'])) $loginObj->standard(json_decode($_POST['standard'])); \ No newline at end of file +else if(isset($_POST['standard'])) $loginObj->standard(json_decode($_POST['standard'])); +else if(isset($_POST['news'])) $loginObj->news(json_decode($_POST['news'])); \ No newline at end of file diff --git a/include/update.inc.php b/include/update.inc.php index 77c5f01..7bdc696 100644 --- a/include/update.inc.php +++ b/include/update.inc.php @@ -127,24 +127,67 @@ class update extends Dbh { if($info[0] == '0') { $name = "profile_img"; $num = 0; + if($this->checkForImage($info[1],$info[0]) == 'true') die; + } else if($info[0] == '1') { + $name = "profile_color"; + $num = 1; + + } else if($info[0] == '2') { + $name = "google_profile_img"; + $num = 2; + } else if($info[0] == '3') { + $name = "facebook_profile_img"; + $num = 3; + } else if($info[0] == '4') { + $name = "github_profile_img"; + $num = 4; } - $this->checkForImage(); $sql = "UPDATE users SET profile_choice = ? WHERE email = ?"; $stmt = $this->connect()->prepare($sql); $stmt->execute([$num, $_SESSION['email']]); + $sql = "UPDATE users SET ".$name." = ? WHERE email = ?"; $stmt = $this->connect()->prepare($sql); $stmt->execute([$info[1], $_SESSION['email']]); $this->setSessionVariables($_SESSION['email']); - echo 'success'; + header("Refresh:0"); } - public function checkForImage() { + public function checkForImage($path, $num) { $sql = 'SELECT * FROM users WHERE email = ?'; $stmt = $this->connect()->prepare($sql); $stmt->execute([$_SESSION['email']]); $row = $stmt->fetch(); - if($row['profile_select'] == 0 && $row['profile_img'] != null) unlink('../'.$row['profile_img']); + if($row['profile_img'] == $path) die; + if($row['profile_img'] == $path) return 'true'; + else return 'false'; + } + public function deleteImg($path) { unlink($path); } + public function trendingIn($id) { + $sql = "INSERT INTO trending(news_id,admin_id) VALUES(?,(SELECT id FROM admins WHERE user_id = (SELECT id FROM users WHERE email = ?))) "; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$id, $_SESSION['email']]); + } + + + public function saveNews($info) { + if($this->checkIfAlreadySaved($info) == 'obstaja') die; + $sql = 'INSERT INTO saved_news(user_id,news_id) VALUES ((SELECT id FROM users WHERE email = ?), (SELECT id FROM news WHERE title = ?))'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$_SESSION['email'], $info[0]]); + } + public function unsaveNews($title) { + $sql = 'DELETE FROM saved_news WHERE user_id = (SELECT id FROM users WHERE email = ?) AND news_id = (SELECT id FROM news WHERE title = ?)'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$_SESSION['email'], $title[0]]); + } + public function checkIfAlreadySaved($info) { + $sql = 'SELECT * FROM news n inner join saved_news sn on n.id = sn.news_id inner join users u on u.id = sn.user_id WHERE sn.user_id = (SELECT id FROM users WHERE email = ?) AND sn.news_id = (SELECT id FROM news WHERE title = ?)'; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$_SESSION['email'], $info[0]]); + $row = $stmt->fetch(); + if($row) return 'obstaja'; + else return 'neobstaj'; } } @@ -159,4 +202,8 @@ else if(isset($_POST['oldPsw'])) $updateObj->oldPsw(json_decode($_POST['oldPsw'] else if(isset($_POST['addAdmin'])) $updateObj->addAdmin($_POST['addAdmin']); else if(isset($_POST['removeAdmin'])) $updateObj->removeAdmin($_POST['removeAdmin']); else if(isset($_POST['imageUpload'])) $updateObj->imageUpload(json_decode($_POST['imageUpload'])); +else if(isset($_POST['deleteImg'])) $updateObj->deleteImg($_POST['deleteImg']); +else if(isset($_POST['trendingIn'])) $updateObj->trendingIn($_POST['trendingIn']); +else if(isset($_POST['saveNews'])) $updateObj->saveNews(json_decode($_POST['saveNews'])); +else if(isset($_POST['unsaveNews'])) $updateObj->unsaveNews(json_decode($_POST['unsaveNews'])); diff --git a/personal/following.php b/personal/following.php index e939d06..b364ebb 100644 --- a/personal/following.php +++ b/personal/following.php @@ -9,54 +9,15 @@ + -
+ diff --git a/personal/for-you.php b/personal/for-you.php index e939d06..8d2ac7c 100644 --- a/personal/for-you.php +++ b/personal/for-you.php @@ -9,54 +9,15 @@ + - - +
+ diff --git a/personal/library.php b/personal/library.php index e939d06..c8a8830 100644 --- a/personal/library.php +++ b/personal/library.php @@ -3,61 +3,112 @@
- +
+
+
+ connect()->prepare($sql); + $stmt->execute([$_SESSION['email']]); + $row = $stmt->fetch(); + $n = 0; + while($row = $stmt->fetch()) { + + if($row['URL_img'] == null) { + $img1 = 'no-img'; + $img2 = ''; + }else { + $img1 = ''; + $img2 = '
+ +
'; + } + + echo ('
+
+
+ +

'.$row['title'].'

+
+
+
+
+ '.$this->getSource($row['source_id']).' • '.$row['date'].' +
+
+
+
+ +
+ Remove Bookmark +
+
+
+ +
+ More + +
+
+
+
+
+

'.$row['subtitle'].' + '.$row['text'].' + +

+
+ + '.$img2.' +
'); + $n++; + } + } + public function getSource($id) { + $sql = "SELECT * FROM sources WHERE id = ?"; + $stmt = $this->connect()->prepare($sql); + $stmt->execute([$id]); + $row = $stmt->fetch(); + if($row['name'] == null) return 'No source'; + else return $row['name']; + } + } + $generateObj = new generateUsers(); + $generateObj->generate(); + ?> +
+
+
+
- +
+ - - \ No newline at end of file diff --git a/search.php b/search.php index 2d80fab..2d9ea47 100644 --- a/search.php +++ b/search.php @@ -9,8 +9,10 @@ + + @@ -95,6 +97,8 @@ + + diff --git a/topics/business.php b/topics/business.php index 012e742..086888f 100644 --- a/topics/business.php +++ b/topics/business.php @@ -15,7 +15,7 @@
-

Buisiness

+

Business

@@ -44,6 +44,7 @@
+ diff --git a/topics/categories.php b/topics/categories.php index 3336be4..daa9cca 100644 --- a/topics/categories.php +++ b/topics/categories.php @@ -17,6 +17,7 @@
+ diff --git a/topics/covid-19.php b/topics/covid-19.php index 2fd8f19..d530968 100644 --- a/topics/covid-19.php +++ b/topics/covid-19.php @@ -42,6 +42,7 @@
+ diff --git a/topics/entertainment.php b/topics/entertainment.php index 171c47c..56482f0 100644 --- a/topics/entertainment.php +++ b/topics/entertainment.php @@ -42,6 +42,7 @@
+ diff --git a/topics/health.php b/topics/health.php index b8521eb..ebacb3a 100644 --- a/topics/health.php +++ b/topics/health.php @@ -42,6 +42,7 @@
+ diff --git a/topics/sports.php b/topics/sports.php index b9db5f5..136295a 100644 --- a/topics/sports.php +++ b/topics/sports.php @@ -42,6 +42,7 @@
+ diff --git a/topics/technology.php b/topics/technology.php index f200eb3..99506a4 100644 --- a/topics/technology.php +++ b/topics/technology.php @@ -44,6 +44,7 @@
+ diff --git a/topics/world.php b/topics/world.php index a03430d..b4a3594 100644 --- a/topics/world.php +++ b/topics/world.php @@ -44,6 +44,7 @@
+