Added browsing settings
This commit is contained in:
parent
f5606c4169
commit
e6b37d8e57
12 changed files with 150 additions and 20 deletions
|
@ -34,6 +34,7 @@
|
|||
<script type="text/javascript" src="/js/Api.js"></script>
|
||||
<script type="text/javascript" src="/js/Auth.js"></script>
|
||||
<script type="text/javascript" src="/js/Util.js"></script>
|
||||
<script type="text/javascript" src="/js/BrowsingSettings.js"></script>
|
||||
<script type="text/javascript" src="/js/Controls/FileDropper.js"></script>
|
||||
<script type="text/javascript" src="/js/Presenters/TopNavigationPresenter.js"></script>
|
||||
<script type="text/javascript" src="/js/Presenters/PagedCollectionPresenter.js"></script>
|
||||
|
|
86
public_html/js/BrowsingSettings.js
Normal file
86
public_html/js/BrowsingSettings.js
Normal file
|
@ -0,0 +1,86 @@
|
|||
var App = App || {};
|
||||
|
||||
App.BrowsingSettings = function(
|
||||
promise,
|
||||
auth,
|
||||
api) {
|
||||
|
||||
var settings = getDefaultSettings();
|
||||
|
||||
auth.startObservingLoginChanges('top-navigation', loginStateChanged);
|
||||
|
||||
readFromLocalStorage();
|
||||
if (auth.isLoggedIn())
|
||||
loginStateChanged();
|
||||
|
||||
function setSettings(newSettings) {
|
||||
settings = newSettings;
|
||||
return save();
|
||||
}
|
||||
|
||||
function getSettings() {
|
||||
return settings;
|
||||
}
|
||||
|
||||
function getDefaultSettings() {
|
||||
return {
|
||||
hideDownvoted: true,
|
||||
endlessScroll: true,
|
||||
listPosts: {
|
||||
safe: true,
|
||||
sketchy: true,
|
||||
unsafe: true,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function loginStateChanged() {
|
||||
readFromUser(auth.getCurrentUser());
|
||||
}
|
||||
|
||||
function readFromLocalStorage() {
|
||||
readFromString(localStorage.getItem('browsingSettings'));
|
||||
}
|
||||
|
||||
function readFromUser(user) {
|
||||
readFromString(user.browsingSettings);
|
||||
}
|
||||
|
||||
function readFromString(string) {
|
||||
if (!string)
|
||||
return;
|
||||
try {
|
||||
settings = JSON.parse(string);
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
|
||||
function saveToLocalStorage() {
|
||||
localStorage.setItem('browsingSettings', JSON.stringify(settings));
|
||||
}
|
||||
|
||||
function saveToUser(user) {
|
||||
var formData = {
|
||||
browsingSettings: JSON.stringify(settings),
|
||||
};
|
||||
return api.put('/users/' + user.name, formData);
|
||||
}
|
||||
|
||||
function save() {
|
||||
return promise.make(function(resolve, reject) {
|
||||
saveToLocalStorage();
|
||||
if (auth.isLoggedIn()) {
|
||||
saveToUser(auth.getCurrentUser()).then(resolve).fail(reject);
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
getSettings: getSettings,
|
||||
setSettings: setSettings,
|
||||
};
|
||||
}
|
||||
|
||||
App.DI.registerSingleton('browsingSettings', App.BrowsingSettings);
|
|
@ -5,7 +5,9 @@ App.Presenters.UserBrowsingSettingsPresenter = function(
|
|||
jQuery,
|
||||
util,
|
||||
promise,
|
||||
auth) {
|
||||
auth,
|
||||
browsingSettings,
|
||||
messagePresenter) {
|
||||
|
||||
var target;
|
||||
var template;
|
||||
|
@ -29,7 +31,27 @@ App.Presenters.UserBrowsingSettingsPresenter = function(
|
|||
|
||||
function render() {
|
||||
var $el = jQuery(target);
|
||||
$el.html(template({user: user}));
|
||||
$el.html(template({user: user, settings: browsingSettings.getSettings()}));
|
||||
$el.find('form').submit(browsingSettingsFormSubmitted);
|
||||
}
|
||||
|
||||
function browsingSettingsFormSubmitted(e) {
|
||||
e.preventDefault();
|
||||
var $el = jQuery(target);
|
||||
var $messages = $el.find('.messages');
|
||||
messagePresenter.hideMessages($messages);
|
||||
var newSettings = {
|
||||
endlessScroll: $el.find('[name=endless-scroll]:visible').prop('checked'),
|
||||
hideDownvoted: $el.find('[name=hide-downvoted]:visible').prop('checked'),
|
||||
listPosts: {
|
||||
safe: $el.find('[name=listSafePosts]:visible').prop('checked'),
|
||||
sketchy: $el.find('[name=listSketchyPosts]:visible').prop('checked'),
|
||||
unsafe: $el.find('[name=listUnsafePosts]:visible').prop('checked'),
|
||||
},
|
||||
};
|
||||
browsingSettings.setSettings(newSettings).then(function() {
|
||||
messagePresenter.showInfo($messages, 'Browsing settings updated!');
|
||||
});
|
||||
}
|
||||
|
||||
function getPrivileges() {
|
||||
|
|
|
@ -4,9 +4,8 @@
|
|||
<div class="form-row">
|
||||
<label class="form-label" for="account-removal-confirmation">Confirmation:</label>
|
||||
<div class="form-input">
|
||||
<input type="hidden" name="confirmation" value="0"/>
|
||||
<label for="account-removal-confirmation">
|
||||
<input type="checkbox" id="account-removal-confirmation" name="confirmation" value="1"/>
|
||||
<input type="checkbox" id="account-removal-confirmation" name="confirmation"/>
|
||||
I confirm that I want to delete this account.
|
||||
</label>
|
||||
</div>
|
||||
|
|
|
@ -4,43 +4,38 @@
|
|||
<div class="form-row">
|
||||
<label class="form-label">Safety:</label>
|
||||
<div class="form-input">
|
||||
<input type="hidden" name="safety[]" value=""/>
|
||||
<label for="browsing-settings-safety-safe">
|
||||
<input type="checkbox" id="browsing-settings-safety-safe" name="safety[]" value="1"/>
|
||||
<input <% print(settings.listPosts.safe ? 'checked="checked"' : '') %> type="checkbox" id="browsing-settings-safety-safe" name="listSafePosts" value="1"/>
|
||||
Safe
|
||||
</label>
|
||||
|
||||
<input type="hidden" name="safety[]" value=""/>
|
||||
<label for="browsing-settings-safety-sketchy">
|
||||
<input type="checkbox" id="browsing-settings-safety-sketchy" name="safety[]" value="2"/>
|
||||
<input <% print(settings.listPosts.sketchy ? 'checked="checked"' : '') %> type="checkbox" id="browsing-settings-safety-sketchy" name="listSketchyPosts" value="2"/>
|
||||
Sketchy
|
||||
</label>
|
||||
|
||||
<input type="hidden" name="safety[]" value=""/>
|
||||
<label for="browsing-settings-safety-unsafe">
|
||||
<input type="checkbox" id="browsing-settings-safety-unsafe" name="safety[]" value="3"/>
|
||||
<input <% print(settings.listPosts.unsafe ? 'checked="checked"' : '') %> type="checkbox" id="browsing-settings-safety-unsafe" name="listUnsafePosts" value="3"/>
|
||||
Unsafe
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label class="form-label" for="browsing-settings-endless-scrolling">Endless scrolling:</label>
|
||||
<label class="form-label" for="browsing-settings-endless-scroll">Endless scroll:</label>
|
||||
<div class="form-input">
|
||||
<input type="hidden" name="endless-scrolling" value="0"/>
|
||||
<label for="browsing-settings-endless-scrolling">
|
||||
<input type="checkbox" id="browsing-settings-endless-scrolling" name="endless-scrolling" value="1"/>
|
||||
<label for="browsing-settings-endless-scroll">
|
||||
<input <% print(settings.endlessScroll ? 'checked="checked"' : '') %> type="checkbox" id="browsing-settings-endless-scroll" name="endless-scroll" value="1"/>
|
||||
Enabled
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<label class="form-label" for="browsing-settings-hide-disliked-posts">Hide down-voted:</label>
|
||||
<label class="form-label" for="browsing-settings-hide-downvoted">Hide down-voted:</label>
|
||||
<div class="form-input">
|
||||
<input type="hidden" name="hide-disliked-posts" value="0"/>
|
||||
<label for="browsing-settings-hide-disliked-posts">
|
||||
<input type="checkbox" id="browsing-settings-hide-disliked-posts" name="hide-disliked-posts" value="1"/>
|
||||
<label for="browsing-settings-hide-downvoted">
|
||||
<input <% print(settings.hideDownvoted ? 'checked="checked"' : '') %>type="checkbox" id="browsing-settings-hide-downvoted" name="hide-downvoted" value="1"/>
|
||||
Enabled
|
||||
</label>
|
||||
</div>
|
||||
|
|
|
@ -26,9 +26,8 @@
|
|||
<div class="form-input">
|
||||
<button type="submit">Log in</button>
|
||||
|
||||
<input type="hidden" name="remember" value="0"/>
|
||||
<label>
|
||||
<input type="checkbox" name="remember" value="1"/>
|
||||
<input type="checkbox" name="remember"/>
|
||||
Remember me
|
||||
</label>
|
||||
</div>
|
||||
|
|
|
@ -99,6 +99,11 @@ final class UserController extends AbstractController
|
|||
$this->privilegeService->assertPrivilege(\Szurubooru\Privilege::CHANGE_ACCESS_RANK);
|
||||
}
|
||||
|
||||
if ($formData->browsingSettings)
|
||||
{
|
||||
$this->privilegeService->assertLoggedIn($userName);
|
||||
}
|
||||
|
||||
$user = $this->userService->updateUser($userName, $formData);
|
||||
return $this->userViewProxy->fromEntity($user);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,11 @@ class UserViewProxy extends AbstractViewProxy
|
|||
$result->lastLoginTime = $user->lastLoginTime;
|
||||
$result->avatarStyle = $user->avatarStyle;
|
||||
|
||||
if ($this->privilegeService->isLoggedIn($user))
|
||||
{
|
||||
$result->browsingSettings = $user->browsingSettings;
|
||||
}
|
||||
|
||||
if ($this->privilegeService->hasPrivilege(\Szurubooru\Privilege::VIEW_ALL_EMAIL_ADDRESSES) or
|
||||
$this->privilegeService->isLoggedIn($user))
|
||||
{
|
||||
|
|
|
@ -21,4 +21,5 @@ final class User extends Entity
|
|||
public $registrationTime;
|
||||
public $lastLoginTime;
|
||||
public $avatarStyle;
|
||||
public $browsingSettings;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ class UserEditFormData
|
|||
public $accessRank;
|
||||
public $password;
|
||||
public $avatarStyle;
|
||||
public $browsingSettings;
|
||||
|
||||
public function __construct($inputReader = null)
|
||||
{
|
||||
|
@ -19,6 +20,7 @@ class UserEditFormData
|
|||
$this->accessRank = $inputReader->accessRank;
|
||||
$this->avatarStyle = $inputReader->avatarStyle;
|
||||
$this->avatarContent = $inputReader->avatarContent;
|
||||
$this->browsingSettings = $inputReader->browsingSettings;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,6 +47,12 @@ class PrivilegeService
|
|||
throw new \DomainException('Unprivileged operation');
|
||||
}
|
||||
|
||||
public function assertLoggedIn($userIdentifier)
|
||||
{
|
||||
if (!$this->isLoggedIn($userIdentifier))
|
||||
throw new \DomainException('Unprivileged operation');
|
||||
}
|
||||
|
||||
public function isLoggedIn($userIdentifier)
|
||||
{
|
||||
$loggedInUser = $this->authService->getLoggedInUser();
|
||||
|
|
|
@ -109,6 +109,15 @@ class UserService
|
|||
$user->accessRank = \Szurubooru\Helpers\EnumHelper::accessRankFromString($formData->accessRank);
|
||||
}
|
||||
|
||||
if ($formData->browsingSettings !== null)
|
||||
{
|
||||
if (!is_string($formData->browsingSettings))
|
||||
throw new \InvalidArgumentException('Browsing settings must be stringified JSON.');
|
||||
if (strlen($formData->browsingSettings) > 2000)
|
||||
throw new \InvalidArgumentException('Stringified browsing settings can have at most 2000 characters.');
|
||||
$user->browsingSettings = $formData->browsingSettings;
|
||||
}
|
||||
|
||||
if ($formData->email !== null)
|
||||
$this->sendActivationMailIfNeeded($user);
|
||||
|
||||
|
|
Loading…
Reference in a new issue