diff --git a/pages/settings/accounts.pixy b/pages/settings/accounts.pixy new file mode 100644 index 00000000..98301f0e --- /dev/null +++ b/pages/settings/accounts.pixy @@ -0,0 +1,63 @@ +component SettingsAccounts(user *arn.User) + SettingsTabs + + h1.page-title Accounts settings + + .settings + .widget.mountable(data-api="/api/user/" + user.ID) + h3.widget-title + Icon("cubes") + span Accounts + + InputText("Accounts.AniList.Nick", user.Accounts.AniList.Nick, "AniList", "Your username on anilist.co") + InputText("Accounts.MyAnimeList.Nick", user.Accounts.MyAnimeList.Nick, "MyAnimeList", "Your username on myanimelist.net") + InputText("Accounts.Kitsu.Nick", user.Accounts.Kitsu.Nick, "Kitsu", "Your username on kitsu.io") + InputText("Accounts.Osu.Nick", user.Accounts.Osu.Nick, "Osu", "Your username on osu.ppy.sh") + InputText("Accounts.Overwatch.BattleTag", user.Accounts.Overwatch.BattleTag, "Overwatch", "Your battletag on Overwatch") + //- InputText("Accounts.AnimePlanet.Nick", user.Accounts.AnimePlanet.Nick, "AnimePlanet", "Your username on anime-planet.com") + + .widget.mountable + h3.widget-title + Icon("user-plus") + span Connect + + .widget-section.social-account + label(for="google") Google: + + a#google.button.social-account-button(href="/auth/google", data-ajax="false") + if user.Accounts.Google.ID != "" + Icon("check") + span Connected + else + Icon("circle-o") + span Not connected + + .widget-section.social-account + label(for="facebook") Facebook: + + a#facebook.button.social-account-button(href="/auth/facebook", data-ajax="false") + if user.Accounts.Facebook.ID != "" + Icon("check") + span Connected + else + Icon("circle-o") + span Not connected + + .widget.mountable + h3.widget-title + Icon("download") + span Import + + ImportLists(user) + + if len(user.AnimeList().Items) > 0 + .widget.mountable + h3.widget-title + Icon("upload") + span Export + + .widget-section + label JSON: + a.button(href="/api/animelist/" + user.ID, target="_blank") + Icon("upload") + span Export anime list as JSON \ No newline at end of file diff --git a/pages/settings/apps.pixy b/pages/settings/apps.pixy new file mode 100644 index 00000000..21157250 --- /dev/null +++ b/pages/settings/apps.pixy @@ -0,0 +1,34 @@ +component SettingsApps(user *arn.User) + SettingsTabs + + h1.page-title App settings + + .settings + .widget.mountable + h3.widget-title + Icon("puzzle-piece") + span Apps + + .widget-section + label Chrome Extension: + button.action(data-action="installExtension", data-trigger="click") + Icon("chrome") + span Get the Chrome Extension + + .widget-section + label Firefox Extension: + a.button(href="https://addons.mozilla.org/en-US/firefox/addon/anime-notifier/", target="_blank", rel="nofollow") + Icon("firefox") + span Get the Firefox Extension + + .widget-section + label Android Web App: + a.button(href="https://www.youtube.com/watch?v=opyt4cw0ep8", target="_blank", rel="noopener") + Icon("android") + span Get the Android Web App + + .widget-section + label Desktop Web App: + button.action(data-action="installApp", data-trigger="click") + Icon("desktop") + span Get the Desktop Web App \ No newline at end of file diff --git a/pages/settings/formatting.pixy b/pages/settings/formatting.pixy new file mode 100644 index 00000000..462a9ec3 --- /dev/null +++ b/pages/settings/formatting.pixy @@ -0,0 +1,26 @@ +component SettingsFormatting(user *arn.User) + SettingsTabs + + h1.page-title Formatting settings + + .settings + .widget.mountable(data-api="/api/settings/" + user.ID) + h3.widget-title + Icon("font") + span Formatting + + .widget-section + label(for="Theme")= "Theme:" + select.widget-ui-element.action(id="Theme", data-field="Theme", value=user.Settings().Theme, title="Language of anime titles", data-action="save", data-trigger="change") + option(value="light") Light + option(value="dark") Dark + + .widget-section + label(for="TitleLanguage")= "Title language:" + select.widget-ui-element.action(id="TitleLanguage", data-field="TitleLanguage", value=user.Settings().TitleLanguage, title="Language of anime titles", data-action="save", data-trigger="change") + option(value="canonical") Canonical + option(value="english") English + option(value="romaji") Romaji + option(value="japanese") 日本語 + + InputNumber("Format.RatingsPrecision", float64(user.Settings().Format.RatingsPrecision), "Ratings precision", "How many decimals after the comma would you like to display in ratings on anime pages?", "0", "2", "1") \ No newline at end of file diff --git a/pages/settings/notifications.pixy b/pages/settings/notifications.pixy new file mode 100644 index 00000000..4cbb901d --- /dev/null +++ b/pages/settings/notifications.pixy @@ -0,0 +1,50 @@ +component SettingsNotifications(user *arn.User) + SettingsTabs + + h1.page-title Notification settings + + .settings + .widget.mountable + h3.widget-title + Icon("bell") + span Instant notifications + + #enable-notifications.widget-section + label Instant notifications: + button.action(data-action="enableNotifications", data-trigger="click") + Icon("toggle-off") + span OFF + + #disable-notifications.widget-section.hidden + label Instant notifications: + button.action(data-action="disableNotifications", data-trigger="click") + Icon("toggle-on") + span ON + + #test-notification.widget-section + label Test: + button.action(data-action="testNotification", data-trigger="click") + Icon("paper-plane") + span Send test notification + + .footer + p(title="This setting is not account bound, instead it is bound to your browser.") You can customize this setting on every device you own. + + .widget.mountable(data-api="/api/settings/" + user.ID) + h3.widget-title + Icon("filter") + span Filter + + InputBool("Notification.AnimeEpisodeReleases", user.Settings().Notification.AnimeEpisodeReleases, "New episodes", "Notifications about new episodes") + InputBool("Notification.AnimeFinished", user.Settings().Notification.AnimeFinished, "Finished anime series", "Notifications about finished anime series") + //- InputBool("Notification.NewFollowers", user.Settings().Notification.NewFollowers, "New followers", "Notifications about new followers") + + //- .widget.mountable(data-api="/api/settings/" + user.ID) + //- h3.widget-title + //- Icon("heart") + //- span Likes + + //- InputBool("Notification.ForumLikes", user.Settings().Notification.ForumLikes, "Forum post likes", "Notifications about forum post likes") + //- InputBool("Notification.SoundTrackLikes", user.Settings().Notification.SoundTrackLikes, "Soundtrack likes", "Notifications about soundtrack likes") + //- //- InputBool("Notification.GroupPostLikes", user.Settings().Notification.GroupPostLikes, "Group post likes", "Notifications about group post likes") + //- InputBool("Notification.QuoteLikes", user.Settings().Notification.QuoteLikes, "Quote likes", "Notifications about quote likes") diff --git a/pages/settings/personal.pixy b/pages/settings/personal.pixy new file mode 100644 index 00000000..4d756ead --- /dev/null +++ b/pages/settings/personal.pixy @@ -0,0 +1,72 @@ +component SettingsPersonal(user *arn.User) + SettingsTabs + + h1.page-title Personal settings + + .settings + .widget.mountable(data-api="/api/user/" + user.ID) + h3.widget-title + Icon("user") + span Personal + + InputText("Nick", user.Nick, "Username", "Your username on notify.moe") + InputText("Tagline", user.Tagline, "Tagline", "Text that appears below your username") + InputText("Website", user.Website, "Website", "Your homepage") + + if arn.IsDevelopment() + InputTextArea("Introduction", user.Introduction, "Introduction", "Tell us about yourself (Markdown is allowed)") + + .widget.mountable(data-api="/api/settings/" + user.ID) + h3.widget-title + Icon("camera") + span Avatar + + //- .widget-section + //- label(for="Avatar.Source") Source: + //- select.widget-ui-element.action(id="Avatar.Source", data-field="Avatar.Source", value=user.Settings().Avatar.Source, data-action="save", data-trigger="change") + //- option(value="") Automatic + //- option(value="Gravatar") Gravatar + //- option(value="URL") Link + //- option(value="FileSystem") Upload + + //- //- URL input + //- if user.Settings().Avatar.Source == "URL" + //- InputText("Avatar.SourceURL", user.Settings().Avatar.SourceURL, "Link", "Post the link to the image here") + + //- //- Gravatar preview image + //- if user.Settings().Avatar.Source == "Gravatar" || (user.Settings().Avatar.Source == "" && user.Avatar.Source == "Gravatar") + //- .profile-image-container.avatar-preview + //- img.profile-image.mountable(src=user.Gravatar(), alt="Gravatar (" + user.Email + ")", title="Gravatar (" + user.Email + ")") + + //- //- URL preview image + //- if user.Settings().Avatar.Source == "URL" && user.Settings().Avatar.SourceURL != "" + //- .profile-image-container.avatar-preview + //- img.profile-image.mountable(src=strings.Replace(user.Settings().Avatar.SourceURL, "http://", "https://", 1), alt="Avatar preview") + + //- //- File upload + //- if user.Settings().Avatar.Source == "FileSystem" + + InputFileUpload("avatar-input", "File", "image", "/api/upload/avatar") + + .profile-image-container.avatar-preview + if user.HasAvatar() + img.avatar-input-preview.profile-image.lazy(data-src=user.AvatarLink("large"), data-webp="true", alt="Profile image", title="Recommended: 560 x 560 | PNG or JPG") + else + img.avatar-input-preview.profile-image.hidden(src=user.AvatarLink("large"), alt="Profile image", title="Recommended: 560 x 560 | PNG or JPG") + + #avatar-input-preview-svg + SVGProfileImage(user) + + .widget.mountable(data-api="/api/settings/" + user.ID) + h3.widget-title + Icon("picture-o") + span Cover + + InputFileUpload("cover-input", "File", "image", "/api/upload/cover") + + .cover-preview(title="Recommended: 1920 x 450 | PNG or JPG") + img.profile-cover.cover-input-preview.lazy(data-src=user.CoverLink("small"), data-webp="true", alt="Cover image") + + if !user.IsPro() + .footer + p PRO account required. diff --git a/pages/settings/pro.pixy b/pages/settings/pro.pixy new file mode 100644 index 00000000..146f2088 --- /dev/null +++ b/pages/settings/pro.pixy @@ -0,0 +1,26 @@ +component SettingsPro(user *arn.User) + SettingsTabs + + h1.page-title PRO settings + + .settings + .widget.mountable(data-api="/api/settings/" + user.ID) + h3.widget-title + Icon("star") + span PRO + + if user.IsPro() + .widget-section + label + span Your PRO account expires in + span.utc-date(data-date=user.ProExpires) + span . + a.button(href="/shop") + Icon("star") + span Extend PRO account duration + else + .widget-section + label Would you like to make this website more awesome? + a.button(href="/support") + Icon("star") + span Go PRO \ No newline at end of file diff --git a/pages/settings/settings.pixy b/pages/settings/settings.pixy deleted file mode 100644 index 77c93910..00000000 --- a/pages/settings/settings.pixy +++ /dev/null @@ -1,285 +0,0 @@ -component SettingsTabs - .tabs - Tab("Personal", "user", "/settings") - Tab("Accounts", "cubes", "/settings/accounts") - Tab("Notifications", "bell", "/settings/notifications") - Tab("Apps", "puzzle-piece", "/settings/apps") - Tab("Formatting", "font", "/settings/formatting") - Tab("PRO", "star", "/settings/pro") - -component SettingsPersonal(user *arn.User) - SettingsTabs - - h1.page-title Personal settings - - .settings - .widget.mountable(data-api="/api/user/" + user.ID) - h3.widget-title - Icon("user") - span Personal - - InputText("Nick", user.Nick, "Username", "Your username on notify.moe") - InputText("Tagline", user.Tagline, "Tagline", "Text that appears below your username") - InputText("Website", user.Website, "Website", "Your homepage") - - if arn.IsDevelopment() - InputTextArea("Introduction", user.Introduction, "Introduction", "Tell us about yourself (Markdown is allowed)") - - .widget.mountable(data-api="/api/settings/" + user.ID) - h3.widget-title - Icon("camera") - span Avatar - - //- .widget-section - //- label(for="Avatar.Source") Source: - //- select.widget-ui-element.action(id="Avatar.Source", data-field="Avatar.Source", value=user.Settings().Avatar.Source, data-action="save", data-trigger="change") - //- option(value="") Automatic - //- option(value="Gravatar") Gravatar - //- option(value="URL") Link - //- option(value="FileSystem") Upload - - //- //- URL input - //- if user.Settings().Avatar.Source == "URL" - //- InputText("Avatar.SourceURL", user.Settings().Avatar.SourceURL, "Link", "Post the link to the image here") - - //- //- Gravatar preview image - //- if user.Settings().Avatar.Source == "Gravatar" || (user.Settings().Avatar.Source == "" && user.Avatar.Source == "Gravatar") - //- .profile-image-container.avatar-preview - //- img.profile-image.mountable(src=user.Gravatar(), alt="Gravatar (" + user.Email + ")", title="Gravatar (" + user.Email + ")") - - //- //- URL preview image - //- if user.Settings().Avatar.Source == "URL" && user.Settings().Avatar.SourceURL != "" - //- .profile-image-container.avatar-preview - //- img.profile-image.mountable(src=strings.Replace(user.Settings().Avatar.SourceURL, "http://", "https://", 1), alt="Avatar preview") - - //- //- File upload - //- if user.Settings().Avatar.Source == "FileSystem" - - InputFileUpload("avatar-input", "File", "image", "/api/upload/avatar") - - .profile-image-container.avatar-preview - if user.HasAvatar() - img.avatar-input-preview.profile-image.lazy(data-src=user.AvatarLink("large"), data-webp="true", alt="Profile image", title="Recommended: 560 x 560 | PNG or JPG") - else - img.avatar-input-preview.profile-image.hidden(src=user.AvatarLink("large"), alt="Profile image", title="Recommended: 560 x 560 | PNG or JPG") - - #avatar-input-preview-svg - SVGProfileImage(user) - - .widget.mountable(data-api="/api/settings/" + user.ID) - h3.widget-title - Icon("picture-o") - span Cover - - InputFileUpload("cover-input", "File", "image", "/api/upload/cover") - - .cover-preview(title="Recommended: 1920 x 450 | PNG or JPG") - img.profile-cover.cover-input-preview.lazy(data-src=user.CoverLink("small"), data-webp="true", alt="Cover image") - - if !user.IsPro() - .footer - p PRO account required. - -component SettingsNotifications(user *arn.User) - SettingsTabs - - h1.page-title Notification settings - - .settings - .widget.mountable - h3.widget-title - Icon("bell") - span Instant notifications - - #enable-notifications.widget-section - label Instant notifications: - button.action(data-action="enableNotifications", data-trigger="click") - Icon("toggle-off") - span OFF - - #disable-notifications.widget-section.hidden - label Instant notifications: - button.action(data-action="disableNotifications", data-trigger="click") - Icon("toggle-on") - span ON - - #test-notification.widget-section - label Test: - button.action(data-action="testNotification", data-trigger="click") - Icon("paper-plane") - span Send test notification - - .footer - p(title="This setting is not account bound, instead it is bound to your browser.") You can customize this setting on every device you own. - - .widget.mountable(data-api="/api/settings/" + user.ID) - h3.widget-title - Icon("filter") - span Filter - - InputBool("Notification.AnimeEpisodeReleases", user.Settings().Notification.AnimeEpisodeReleases, "New episodes", "Notifications about new episodes") - InputBool("Notification.AnimeFinished", user.Settings().Notification.AnimeFinished, "Finished anime series", "Notifications about finished anime series") - //- InputBool("Notification.NewFollowers", user.Settings().Notification.NewFollowers, "New followers", "Notifications about new followers") - - //- .widget.mountable(data-api="/api/settings/" + user.ID) - //- h3.widget-title - //- Icon("heart") - //- span Likes - - //- InputBool("Notification.ForumLikes", user.Settings().Notification.ForumLikes, "Forum post likes", "Notifications about forum post likes") - //- InputBool("Notification.SoundTrackLikes", user.Settings().Notification.SoundTrackLikes, "Soundtrack likes", "Notifications about soundtrack likes") - //- //- InputBool("Notification.GroupPostLikes", user.Settings().Notification.GroupPostLikes, "Group post likes", "Notifications about group post likes") - //- InputBool("Notification.QuoteLikes", user.Settings().Notification.QuoteLikes, "Quote likes", "Notifications about quote likes") - -component SettingsApps(user *arn.User) - SettingsTabs - - h1.page-title App settings - - .settings - .widget.mountable - h3.widget-title - Icon("puzzle-piece") - span Apps - - .widget-section - label Chrome Extension: - button.action(data-action="installExtension", data-trigger="click") - Icon("chrome") - span Get the Chrome Extension - - .widget-section - label Firefox Extension: - a.button(href="https://addons.mozilla.org/en-US/firefox/addon/anime-notifier/", target="_blank", rel="nofollow") - Icon("firefox") - span Get the Firefox Extension - - .widget-section - label Android Web App: - a.button(href="https://www.youtube.com/watch?v=opyt4cw0ep8", target="_blank", rel="noopener") - Icon("android") - span Get the Android Web App - - .widget-section - label Desktop Web App: - button.action(data-action="installApp", data-trigger="click") - Icon("desktop") - span Get the Desktop Web App - -component SettingsFormatting(user *arn.User) - SettingsTabs - - h1.page-title Formatting settings - - .settings - .widget.mountable(data-api="/api/settings/" + user.ID) - h3.widget-title - Icon("font") - span Formatting - - .widget-section - label(for="Theme")= "Theme:" - select.widget-ui-element.action(id="Theme", data-field="Theme", value=user.Settings().Theme, title="Language of anime titles", data-action="save", data-trigger="change") - option(value="light") Light - option(value="dark") Dark - - .widget-section - label(for="TitleLanguage")= "Title language:" - select.widget-ui-element.action(id="TitleLanguage", data-field="TitleLanguage", value=user.Settings().TitleLanguage, title="Language of anime titles", data-action="save", data-trigger="change") - option(value="canonical") Canonical - option(value="english") English - option(value="romaji") Romaji - option(value="japanese") 日本語 - - InputNumber("Format.RatingsPrecision", float64(user.Settings().Format.RatingsPrecision), "Ratings precision", "How many decimals after the comma would you like to display in ratings on anime pages?", "0", "2", "1") - -component SettingsPro(user *arn.User) - SettingsTabs - - h1.page-title PRO settings - - .settings - .widget.mountable(data-api="/api/settings/" + user.ID) - h3.widget-title - Icon("star") - span PRO - - if user.IsPro() - .widget-section - label - span Your PRO account expires in - span.utc-date(data-date=user.ProExpires) - span . - a.button(href="/shop") - Icon("star") - span Extend PRO account duration - else - .widget-section - label Would you like to make this website more awesome? - a.button(href="/support") - Icon("star") - span Go PRO - -component SettingsAccounts(user *arn.User) - SettingsTabs - - h1.page-title Accounts settings - - .settings - .widget.mountable(data-api="/api/user/" + user.ID) - h3.widget-title - Icon("cubes") - span Accounts - - InputText("Accounts.AniList.Nick", user.Accounts.AniList.Nick, "AniList", "Your username on anilist.co") - InputText("Accounts.MyAnimeList.Nick", user.Accounts.MyAnimeList.Nick, "MyAnimeList", "Your username on myanimelist.net") - InputText("Accounts.Kitsu.Nick", user.Accounts.Kitsu.Nick, "Kitsu", "Your username on kitsu.io") - InputText("Accounts.Osu.Nick", user.Accounts.Osu.Nick, "Osu", "Your username on osu.ppy.sh") - InputText("Accounts.Overwatch.BattleTag", user.Accounts.Overwatch.BattleTag, "Overwatch", "Your battletag on Overwatch") - //- InputText("Accounts.AnimePlanet.Nick", user.Accounts.AnimePlanet.Nick, "AnimePlanet", "Your username on anime-planet.com") - - .widget.mountable - h3.widget-title - Icon("user-plus") - span Connect - - .widget-section.social-account - label(for="google") Google: - - a#google.button.social-account-button(href="/auth/google", data-ajax="false") - if user.Accounts.Google.ID != "" - Icon("check") - span Connected - else - Icon("circle-o") - span Not connected - - .widget-section.social-account - label(for="facebook") Facebook: - - a#facebook.button.social-account-button(href="/auth/facebook", data-ajax="false") - if user.Accounts.Facebook.ID != "" - Icon("check") - span Connected - else - Icon("circle-o") - span Not connected - - .widget.mountable - h3.widget-title - Icon("download") - span Import - - ImportLists(user) - - if len(user.AnimeList().Items) > 0 - .widget.mountable - h3.widget-title - Icon("upload") - span Export - - .widget-section - label JSON: - a.button(href="/api/animelist/" + user.ID, target="_blank") - Icon("upload") - span Export anime list as JSON \ No newline at end of file diff --git a/pages/settings/tabs.pixy b/pages/settings/tabs.pixy new file mode 100644 index 00000000..f4b2c55a --- /dev/null +++ b/pages/settings/tabs.pixy @@ -0,0 +1,8 @@ +component SettingsTabs + .tabs + Tab("Personal", "user", "/settings") + Tab("Accounts", "cubes", "/settings/accounts") + Tab("Notifications", "bell", "/settings/notifications") + Tab("Apps", "puzzle-piece", "/settings/apps") + Tab("Formatting", "font", "/settings/formatting") + Tab("PRO", "star", "/settings/pro") \ No newline at end of file