summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2010-01-13 18:31:51 +0300
committerAndrew Dolgov <[email protected]>2010-01-13 18:31:51 +0300
commitd9084cf22059f709e935c6c0755d2b69c21b3a87 (patch)
tree546788700196fbeb06afc2e87aa837a51e16a905
parent57c7aa0f335d1cfef65646c958b838fd69a9ba5d (diff)
implement settings profiles (bump schema)
-rw-r--r--backend.php29
-rw-r--r--db-prefs.php26
-rw-r--r--functions.js2
-rw-r--r--functions.php48
-rw-r--r--login_form.php32
-rw-r--r--modules/backend-rpc.php83
-rw-r--r--modules/popup-dialog.php97
-rw-r--r--modules/pref-feeds.php2
-rw-r--r--modules/pref-prefs.php137
-rw-r--r--prefs.js120
-rw-r--r--prefs.php2
-rw-r--r--sanity_check.php2
-rw-r--r--schema/ttrss_schema_mysql.sql16
-rw-r--r--schema/ttrss_schema_pgsql.sql10
-rw-r--r--schema/versions/mysql/63.sql18
-rw-r--r--schema/versions/pgsql/63.sql16
-rw-r--r--themes/compact/theme.css2
-rw-r--r--tt-rss.php2
18 files changed, 548 insertions, 96 deletions
diff --git a/backend.php b/backend.php
index f1b9cd343..7757931f3 100644
--- a/backend.php
+++ b/backend.php
@@ -49,6 +49,7 @@
init_connection($link);
$op = $_REQUEST["op"];
+ $subop = $_REQUEST["subop"];
$mode = $_REQUEST["mode"];
$print_exec_time = false;
@@ -81,7 +82,7 @@
}
if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds"
- && $op != "rss" && $op != "getUnread" && $op != "publish") {
+ && $op != "rss" && $op != "getUnread" && $op != "publish" && $op != "getProfiles") {
if ($op == "rpc" || $op == "viewfeed" || $op == "view") {
print_error_xml(6); die;
@@ -506,6 +507,32 @@
$print_exec_time = false;
break; // digestSend
+ case "getProfiles":
+ $login = db_escape_string($_REQUEST["login"]);
+ $password = db_escape_string($_REQUEST["password"]);
+
+ if (authenticate_user($link, $login, $password)) {
+ $result = db_query($link, "SELECT * FROM ttrss_settings_profiles
+ WHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title");
+
+ print "<select style='width: 100%' name='profile'>";
+
+ print "<option value='0'>" . __("Default profile") . "</option>";
+
+ while ($line = db_fetch_assoc($result)) {
+ $id = $line["id"];
+ $title = $line["title"];
+
+ print "<option value='$id'>$title</option>";
+ }
+
+ print "</select>";
+
+ $_SESSION = array();
+
+ break;
+ }
+
} // Select action according to $op value.
// We close the connection to database.
diff --git a/db-prefs.php b/db-prefs.php
index ecd380535..1c9bbd116 100644
--- a/db-prefs.php
+++ b/db-prefs.php
@@ -14,11 +14,19 @@
if (!$user_id) {
$user_id = $_SESSION["uid"];
+ $profile = $_SESSION["profile"];
} else {
$user_id = sprintf("%d", $user_id);
$prefs_cache = false;
}
+ if ($profile) {
+ $profile_qpart = "profile = '$profile'";
+ } else {
+ $profile_qpart = "profile IS NULL";
+ }
+
+
if ($prefs_cache && !defined('DISABLE_SESSIONS') && !SINGLE_USER_MODE) {
if ($_SESSION["prefs_cache"] && $_SESSION["prefs_cache"][$pref_name]) {
$tuple = $_SESSION["prefs_cache"][$pref_name];
@@ -31,6 +39,7 @@
FROM
ttrss_user_prefs,ttrss_prefs,ttrss_prefs_types
WHERE
+ $profile_qpart AND
ttrss_user_prefs.pref_name = '$pref_name' AND
ttrss_prefs_types.id = type_id AND
owner_uid = '$user_id' AND
@@ -68,10 +77,24 @@
}
}
- function set_pref($link, $key, $value) {
+ function set_pref($link, $key, $value, $user_id) {
$key = db_escape_string($key);
$value = db_escape_string($value);
+ if (!$user_id) {
+ $user_id = $_SESSION["uid"];
+ $profile = $_SESSION["profile"];
+ } else {
+ $user_id = sprintf("%d", $user_id);
+ $prefs_cache = false;
+ }
+
+ if ($profile) {
+ $profile_qpart = "profile = '$profile'";
+ } else {
+ $profile_qpart = "profile IS NULL";
+ }
+
$result = db_query($link, "SELECT type_name
FROM ttrss_prefs,ttrss_prefs_types
WHERE pref_name = '$key' AND type_id = ttrss_prefs_types.id");
@@ -96,6 +119,7 @@
db_query($link, "UPDATE ttrss_user_prefs SET
value = '$value' WHERE pref_name = '$key'
+ AND $profile_qpart
AND owner_uid = " . $_SESSION["uid"]);
$_SESSION["prefs_cache"] = array();
diff --git a/functions.js b/functions.js
index aa9bdcefe..1b676a9ef 100644
--- a/functions.js
+++ b/functions.js
@@ -2224,7 +2224,7 @@ function feedArchiveRemove() {
if (selected.length > 0) {
- var pr = __("Remove selected feeds from archive?");
+ var pr = __("Remove selected feeds from the archive? Feeds with stored articles will not be removed.");
if (confirm(pr)) {
Element.show('feed_browser_spinner');
diff --git a/functions.php b/functions.php
index a0ec1c3fb..672d9ef1d 100644
--- a/functions.php
+++ b/functions.php
@@ -1679,16 +1679,23 @@
}
}
- function initialize_user_prefs($link, $uid) {
+ function initialize_user_prefs($link, $uid, $profile = false) {
$uid = db_escape_string($uid);
+ if (!$profile) {
+ $profile = "NULL";
+ $profile_qpart = "profile IS NULL";
+ } else {
+ $profile_qpart = "profile = '$profile'";
+ }
+
db_query($link, "BEGIN");
$result = db_query($link, "SELECT pref_name,def_value FROM ttrss_prefs");
$u_result = db_query($link, "SELECT pref_name
- FROM ttrss_user_prefs WHERE owner_uid = '$uid'");
+ FROM ttrss_user_prefs WHERE owner_uid = '$uid' AND $profile_qpart");
$active_prefs = array();
@@ -1701,8 +1708,8 @@
// print "adding " . $line["pref_name"] . "<br>";
db_query($link, "INSERT INTO ttrss_user_prefs
- (owner_uid,pref_name,value) VALUES
- ('$uid', '".$line["pref_name"]."','".$line["def_value"]."')");
+ (owner_uid,pref_name,value, profile) VALUES
+ ('$uid', '".$line["pref_name"]."','".$line["def_value"]."', $profile)");
}
}
@@ -1783,7 +1790,6 @@
$user_theme = get_user_theme_path($link);
- $_SESSION["theme"] = $user_theme;
$_SESSION["ip_address"] = $_SERVER["REMOTE_ADDR"];
$_SESSION["pwd_hash"] = db_fetch_result($result, 0, "pwd_hash");
@@ -1801,7 +1807,6 @@
$user_theme = get_user_theme_path($link);
- $_SESSION["theme"] = $user_theme;
$_SESSION["ip_address"] = $_SERVER["REMOTE_ADDR"];
initialize_user_prefs($link, $_SESSION["uid"]);
@@ -1926,6 +1931,19 @@
$_SESSION["language"] = $_POST["language"];
$_SESSION["bw_limit"] = !!$_POST["bw_limit"];
+ if ($_POST["profile"]) {
+
+ $profile = db_escape_string($_POST["profile"]);
+
+ $result = db_query($link, "SELECT id FROM ttrss_settings_profiles
+ WHERE id = '$profile' AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) != 0) {
+ $_SESSION["profile"] = $profile;
+ $_SESSION["prefs_cache"] = array();
+ }
+ }
+
header("Location: " . $_SERVER["REQUEST_URI"]);
exit;
@@ -1968,10 +1986,10 @@
}
function get_user_theme_path($link) {
+ $theme_id = get_pref($link, "_THEME_ID");
+
$result = db_query($link, "SELECT theme_path
- FROM
- ttrss_themes,ttrss_users
- WHERE ttrss_themes.id = theme_id AND ttrss_users.id = " . $_SESSION["uid"]);
+ FROM ttrss_themes WHERE id = '$theme_id'");
if (db_num_rows($result) != 0) {
return db_fetch_result($result, 0, "theme_path");
} else {
@@ -3039,7 +3057,7 @@
}
}
- print "<param key=\"theme\" value=\"".$_SESSION["theme"]."\"/>";
+ print "<param key=\"theme\" value=\"".get_user_theme_path($link)."\"/>";
print "<param key=\"daemon_enabled\" value=\"" . ENABLE_UPDATE_DAEMON . "\"/>";
print "<param key=\"feeds_frame_refresh\" value=\"" . FEEDS_FRAME_REFRESH . "\"/>";
print "<param key=\"daemon_refresh_only\" value=\"true\"/>";
@@ -5570,7 +5588,8 @@
}
$url_path .= $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
- $url_path .= "/backend.php?op=publish&key=" . get_pref($link, "_PREFS_PUBLISH_KEY");
+ $url_path .= "/backend.php?op=publish&key=" .
+ get_pref($link, "_PREFS_PUBLISH_KEY", $_SESSION["uid"]);
return $url_path;
}
@@ -6206,11 +6225,13 @@
$num_tags = 0;
- if ($_SESSION["theme"] == "3pane") {
+/* if (get_user_theme_path($link) == "3pane") {
$tag_limit = 3;
} else {
$tag_limit = 6;
- }
+ } */
+
+ $tag_limit = 6;
$formatted_tags = array();
@@ -6415,4 +6436,5 @@
return ($parts['scheme'] == 'http' || $parts['scheme'] == 'feed' || $parts['scheme'] == 'https');
}
+
?>
diff --git a/login_form.php b/login_form.php
index 884a13628..af5e70e9b 100644
--- a/login_form.php
+++ b/login_form.php
@@ -28,6 +28,27 @@ function init() {
login.focus();
}
+function fetchProfiles() {
+ try {
+ var params = Form.serialize('loginForm');
+ var query = "?op=getProfiles&" + params;
+
+ if (query) {
+ new Ajax.Request("backend.php", {
+ parameters: query,
+ onComplete: function(transport) {
+ if (transport.responseText.match("select")) {
+ $('profile_box').innerHTML = transport.responseText;
+ }
+ } });
+ }
+
+ } catch (e) {
+ exception_error("fetchProfiles", e);
+ }
+}
+
+
function languageChange(elem) {
try {
document.forms['loginForm']['click'].disabled = true;
@@ -87,7 +108,7 @@ if (document.addEventListener) {
window.onload = init;
</script>
-<form action="" method="POST" name="loginForm" onsubmit="return validateLoginForm(this)">
+<form action="" method="POST" id="loginForm" name="loginForm" onsubmit="return validateLoginForm(this)">
<input type="hidden" name="login_action" value="do_login">
<table width="100%" class="loginForm2">
@@ -104,9 +125,11 @@ window.onload = init;
<table>
<tr><td align="right"><?php echo __("Login:") ?></td>
<td align="right"><input name="login"
+ onchange="fetchProfiles()"
value="<?php echo $_SERVER["REMOTE_USER"] ?>"></td></tr>
<tr><td align="right"><?php echo __("Password:") ?></td>
<td align="right"><input type="password" name="password"
+ onchange="fetchProfiles()"
value="<?php echo $_SERVER["REMOTE_USER"] ?>"></td></tr>
<?php if (ENABLE_TRANSLATIONS) { ?>
<tr><td align="right"><?php echo __("Language:") ?></td>
@@ -118,6 +141,13 @@ window.onload = init;
?>
</td></tr>
<?php } ?>
+
+ <tr><td align="right"><?php echo __("Profile:") ?></td>
+ <td align="right" id="profile_box">
+ <select style='width : 100%' disabled='1'>
+ <option><?php echo __("Default profile") ?></option></select>
+ </td></tr>
+
<!-- <tr><td colspan="2">
<input type="checkbox" name="remember_me" id="remember_me">
<label for="remember_me">Remember me on this computer</label>
diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php
index 1e0732ef8..adefbd5a5 100644
--- a/modules/backend-rpc.php
+++ b/modules/backend-rpc.php
@@ -3,6 +3,87 @@
$subop = $_REQUEST["subop"];
+ if ($subop == "setprofile") {
+ $id = db_escape_string($_REQUEST["id"]);
+
+ $_SESSION["profile"] = $id;
+ $_SESSION["prefs_cache"] = array();
+ return;
+ }
+
+ if ($subop == "remprofiles") {
+ $ids = split(",", db_escape_string(trim($_REQUEST["ids"])));
+
+ foreach ($ids as $id) {
+ if ($_SESSION["profile"] != $id) {
+ db_query($link, "DELETE FROM ttrss_settings_profiles WHERE id = '$id' AND
+ owner_uid = " . $_SESSION["uid"]);
+ }
+ }
+ return;
+ }
+
+ if ($subop == "addprofile") {
+ $title = db_escape_string(trim($_REQUEST["title"]));
+ if ($title) {
+ db_query($link, "BEGIN");
+
+ $result = db_query($link, "SELECT id FROM ttrss_settings_profiles
+ WHERE title = '$title' AND owner_uid = " . $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 0) {
+
+ db_query($link, "INSERT INTO ttrss_settings_profiles (title, owner_uid)
+ VALUES ('$title', ".$_SESSION["uid"] .")");
+
+ $result = db_query($link, "SELECT id FROM ttrss_settings_profiles WHERE
+ title = '$title'");
+
+ if (db_num_rows($result) != 0) {
+ $profile_id = db_fetch_result($result, 0, "id");
+
+ if ($profile_id) {
+ initialize_user_prefs($link, $_SESSION["uid"], $profile_id);
+ }
+ }
+ }
+
+ db_query($link, "COMMIT");
+ }
+ return;
+ }
+
+ if ($subop == "saveprofile") {
+ $id = db_escape_string($_REQUEST["id"]);
+ $title = db_escape_string(trim($_REQUEST["value"]));
+
+ if ($id == 0) {
+ print __("Default profile");
+ return;
+ }
+
+ if ($title) {
+ db_query($link, "BEGIN");
+
+ $result = db_query($link, "SELECT id FROM ttrss_settings_profiles
+ WHERE title = '$title' AND owner_uid =" . $_SESSION["uid"]);
+
+ if (db_num_rows($result) == 0) {
+ db_query($link, "UPDATE ttrss_settings_profiles
+ SET title = '$title' WHERE id = '$id' AND
+ owner_uid = " . $_SESSION["uid"]);
+ print $title;
+ } else {
+ $result = db_query($link, "SELECT title FROM ttrss_settings_profiles
+ WHERE id = '$id' AND owner_uid =" . $_SESSION["uid"]);
+ print db_fetch_result($result, 0, "title");
+ }
+
+ db_query($link, "COMMIT");
+ }
+ return;
+ }
+
if ($subop == "remarchive") {
$ids = split(",", db_escape_string($_REQUEST["ids"]));
@@ -412,7 +493,7 @@
print "<rpc-reply>";
- set_pref($link, "_PREFS_PUBLISH_KEY", generate_publish_key());
+ set_pref($link, "_PREFS_PUBLISH_KEY", generate_publish_key(), $_SESSION["uid"]);
$new_link = article_publish_url($link);
diff --git a/modules/popup-dialog.php b/modules/popup-dialog.php
index c3285fb0c..cca7b053c 100644
--- a/modules/popup-dialog.php
+++ b/modules/popup-dialog.php
@@ -3,6 +3,97 @@
$id = $_REQUEST["id"];
$param = db_escape_string($_REQUEST["param"]);
+ if ($id == "editPrefProfiles") {
+
+ print "<div id=\"infoBoxTitle\">".__('Settings Profiles')."</div>";
+ print "<div class=\"infoBoxContents\">";
+
+ print "<div><input id=\"fadd_profile\"
+ onkeypress=\"return filterCR(event, addPrefProfile)\"
+ size=\"40\">
+ <button onclick=\"javascript:addPrefProfile()\">".
+ __('Create profile')."</button></div>";
+
+ print "<p>";
+
+ $result = db_query($link, "SELECT title,id FROM ttrss_settings_profiles
+ WHERE owner_uid = ".$_SESSION["uid"]."ORDER BY title");
+
+ print __('Select:')."
+ <a href=\"javascript:selectPrefRows('fcat', true)\">".__('All')."</a>,
+ <a href=\"javascript:selectPrefRows('fcat', false)\">".__('None')."</a>";
+
+ print "<div class=\"prefFeedCatHolder\">";
+
+ print "<form id=\"profile_edit_form\" onsubmit=\"return false\">";
+
+ print "<table width=\"100%\" class=\"prefFeedCatList\"
+ cellspacing=\"0\" id=\"prefFeedCatList\">";
+
+ print "<tr class=\"odd\" id=\"FCATR-0\">";
+
+ print "<td width='5%' align='center'><input
+ onclick='toggleSelectPrefRow(this, \"fcat\");'
+ type=\"checkbox\" id=\"FCCHK-0\"></td>";
+
+ print "<td><span id=\"FCATT-0\">" .
+ __("Default profile") . "</span></td>";
+
+ print "</tr>";
+
+ $lnum = 1;
+
+ while ($line = db_fetch_assoc($result)) {
+
+ $class = ($lnum % 2) ? "even" : "odd";
+
+ $cat_id = $line["id"];
+ $this_row_id = "id=\"FCATR-$cat_id\"";
+
+ print "<tr class=\"$class\" $this_row_id>";
+
+ $edit_title = htmlspecialchars($line["title"]);
+
+ print "<td width='5%' align='center'><input
+ onclick='toggleSelectPrefRow(this, \"fcat\");'
+ type=\"checkbox\" id=\"FCCHK-$cat_id\"></td>";
+
+ if ($_SESSION["profile"] == $line["id"]) {
+ $is_active = __("(active)");
+ } else {
+ $is_active = "";
+ }
+
+ print "<td><span id=\"FCATT-$cat_id\">" .
+ $edit_title . "</span> $is_active</td>";
+
+ print "</tr>";
+
+ ++$lnum;
+ }
+
+ print "</table>";
+ print "</form>";
+ print "</div>";
+
+ print "<div class='dlgButtons'>
+ <div style='float : left'>
+ <button onclick=\"return removeSelectedPrefProfiles()\">".
+ __('Remove')."</button>
+ <input class=\"button\"
+ type=\"submit\" onclick=\"return activatePrefProfile()\"
+ value=\"".__('Activate')."\">
+ </div>";
+
+ print "<input class=\"button\"
+ type=\"submit\" onclick=\"return closeInfoBox()\"
+ value=\"".__('Close this window')."\">";
+
+ print "</div></div>";
+
+ return;
+ }
+
if ($id == "pubUrl") {
print "<div id=\"infoBoxTitle\">".__('Published Articles')."</div>";
@@ -185,13 +276,17 @@
$owner_uid = $_SESSION["uid"];
+/* print __('Select:')."
+ <a href=\"javascript:selectPrefRows('fbrowse', true)\">".__('All')."</a>,
+ <a href=\"javascript:selectPrefRows('fbrowse', false)\">".__('None')."</a>"; */
+
print "<ul class='browseFeedList' id='browseFeedList'>";
print_feed_browser($link, $search, 25);
print "</ul>";
print "<div align='center'>
<button onclick=\"feedBrowserSubscribe()\">".__('Subscribe')."</button>
- <button style='display : none' id='feed_archive_remove' onclick=\"feedArchiveRemove()\">".__('Remove from archive')."</button>
+ <button style='display : none' id='feed_archive_remove' onclick=\"feedArchiveRemove()\">".__('Remove')."</button>
<button onclick=\"closeInfoBox()\" >".__('Cancel')."</button></div>";
print "</div>";
diff --git a/modules/pref-feeds.php b/modules/pref-feeds.php
index 531396cf5..05c796bb3 100644
--- a/modules/pref-feeds.php
+++ b/modules/pref-feeds.php
@@ -999,7 +999,7 @@
}
}
- print "<div class=\"prefGenericAddBox\">
+ print "<div>
<input id=\"fadd_cat\"
onkeypress=\"return filterCR(event, addFeedCat)\"
size=\"40\">
diff --git a/modules/pref-prefs.php b/modules/pref-prefs.php
index 6fb5fb576..b789720d4 100644
--- a/modules/pref-prefs.php
+++ b/modules/pref-prefs.php
@@ -16,6 +16,12 @@
$prefs_blacklist = array("HIDE_FEEDLIST", "SYNC_COUNTERS", "ENABLE_LABELS",
"ENABLE_SEARCH_TOOLBAR", "HIDE_READ_FEEDS");
+ $profile_blacklist = array("ALLOW_DUPLICATE_POSTS", "PURGE_OLD_DAYS",
+ "PURGE_UNREAD_ARTICLES", "DIGEST_ENABLE", "DIGEST_CATCHUP",
+ "BLACKLISTED_TAGS", "ENABLE_FEED_ICONS", "ENABLE_API_ACCESS",
+ "UPDATE_POST_ON_CHECKSUM_CHANGE", "DEFAULT_UPDATE_INTERVAL",
+ "MARK_UNREAD_ON_UPDATE");
+
if (FORCE_ARTICLE_PURGE != 0) {
array_push($prefs_blacklist, "PURGE_OLD_DAYS");
array_push($prefs_blacklist, "PURGE_UNREAD_ARTICLES");
@@ -79,6 +85,8 @@
// print_r($_POST);
+ $orig_theme_id = get_pref($link, "_THEME_ID");
+
foreach (array_keys($_POST) as $pref_name) {
$pref_name = db_escape_string($pref_name);
@@ -88,9 +96,23 @@
}
- #return prefs_js_redirect();
+ if ($orig_theme_id != get_pref($link, "_THEME_ID")) {
+
+ $result = db_query($link, "SELECT theme_path FROM ttrss_themes
+ WHERE id = '".get_pref($link, "_THEME_ID")."'");
+
+ if (db_num_rows($result) == 1) {
+ $theme_path = db_fetch_result($result, 0, "theme_path");
+ } else {
+ $theme_path = "";
+ }
+
+ $_SESSION["theme"] = $theme_path;
- print __("The configuration was saved.");
+ print "PREFS_THEME_CHANGED";
+ } else {
+ print __("The configuration was saved.");
+ }
return;
@@ -132,38 +154,14 @@
return;
- } else if ($subop == "change-theme") {
-
- $theme = db_escape_string($_POST["theme"]);
-
- if ($theme == "Default") {
- $theme_qpart = 'NULL';
- } else {
- $theme_qpart = "'$theme'";
- }
-
- $result = db_query($link, "SELECT id,theme_path FROM ttrss_themes
- WHERE theme_name = '$theme'");
-
- if (db_num_rows($result) == 1) {
- $theme_id = db_fetch_result($result, 0, "id");
- $theme_path = db_fetch_result($result, 0, "theme_path");
- } else {
- $theme_id = "NULL";
- $theme_path = "";
- }
-
- db_query($link, "UPDATE ttrss_users SET
- theme_id = $theme_id WHERE id = " . $_SESSION["uid"]);
-
- $_SESSION["theme"] = $theme_path;
-
- return prefs_js_redirect();
-
} else {
set_pref($link, "_PREFS_ACTIVE_TAB", "genConfig");
+ if ($_SESSION["profile"]) {
+ print_notice("Some preferences are only available in default profile.");
+ }
+
if (!SINGLE_USER_MODE) {
$result = db_query($link, "SELECT id FROM ttrss_users
@@ -272,47 +270,20 @@
}
- $result = db_query($link, "SELECT
- theme_id FROM ttrss_users WHERE id = " . $_SESSION["uid"]);
-
- $user_theme_id = db_fetch_result($result, 0, "theme_id");
-
- $result = db_query($link, "SELECT
- id,theme_name FROM ttrss_themes ORDER BY theme_name");
-
- if (db_num_rows($result) > 0) {
-
- print "<form action=\"backend.php\" method=\"POST\">";
- print "<table width=\"100%\" class=\"prefPrefsList\">";
- print "<tr><td colspan='3'><h3>".__("Themes")."</h3></tr></td>";
- print "<tr><td width=\"40%\">".__("Select theme")."</td>";
- print "<td><select name=\"theme\">";
- print "<option value='Default'>".__('Default')."</option>";
- print "<option disabled>--------</option>";
-
- while ($line = db_fetch_assoc($result)) {
- if ($line["id"] == $user_theme_id) {
- $selected = "selected";
- } else {
- $selected = "";
- }
- print "<option $selected>" . $line["theme_name"] . "</option>";
- }
- print "</select></td></tr>";
- print "</table>";
- print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
- print "<input type=\"hidden\" name=\"subop\" value=\"change-theme\">";
- print "<p><button>".__('Change theme')."</button>";
- print "</form>";
+ if ($_SESSION["profile"]) {
+ initialize_user_prefs($link, $_SESSION["uid"], $_SESSION["profile"]);
+ $profile_qpart = "profile = '" . $_SESSION["profile"] . "'";
+ } else {
+ initialize_user_prefs($link, $_SESSION["uid"]);
+ $profile_qpart = "profile IS NULL";
}
- initialize_user_prefs($link, $_SESSION["uid"]);
-
$result = db_query($link, "SELECT
ttrss_user_prefs.pref_name,short_desc,help_text,value,type_name,
- section_name,def_value
+ section_name,def_value,section_id
FROM ttrss_prefs,ttrss_prefs_types,ttrss_prefs_sections,ttrss_user_prefs
WHERE type_id = ttrss_prefs_types.id AND
+ $profile_qpart AND
section_id = ttrss_prefs_sections.id AND
ttrss_user_prefs.pref_name = ttrss_prefs.pref_name AND
short_desc != '' AND
@@ -332,6 +303,11 @@
continue;
}
+ if ($_SESSION["profile"] && in_array($line["pref_name"],
+ $profile_blacklist)) {
+ continue;
+ }
+
if ($active_section != $line["section_name"]) {
if ($active_section != "") {
@@ -339,10 +315,34 @@
}
print "<p><table width=\"100%\" class=\"prefPrefsList\">";
-
+
$active_section = $line["section_name"];
print "<tr><td colspan=\"3\"><h3>".__($active_section)."</h3></td></tr>";
+
+ if ($line["section_id"] == 2) {
+ print "<tr><td width=\"40%\">".__("Select theme")."</td>";
+ print "<td><select name=\"_THEME_ID\">";
+ print "<option value='0'>".__('Default')."</option>";
+ print "<option disabled>--------</option>";
+
+ $user_theme_id = get_pref($link, "_THEME_ID");
+
+ $tmp_result = db_query($link, "SELECT
+ id,theme_name FROM ttrss_themes ORDER BY theme_name");
+
+ while ($tmp_line = db_fetch_assoc($tmp_result)) {
+ if ($tmp_line["id"] == $user_theme_id) {
+ $selected = "selected";
+ } else {
+ $selected = "";
+ }
+ print "<option value=\"".$tmp_line["id"]."\" $selected>" .
+ $tmp_line["theme_name"] . "</option>";
+ }
+ print "</select></td></tr>";
+ }
+
// print "<tr class=\"title\">
// <td width=\"25%\">Option</td><td>Value</td></tr>";
@@ -398,7 +398,10 @@
print "<p><button onclick=\"return validatePrefsSave()\">".
__('Save configuration')."</button> ";
-
+
+ print "<button onclick=\"return editProfiles()\">".
+ __('Manage profiles')."</button> ";
+
print "<button onclick=\"return validatePrefsReset()\">".
__('Reset to defaults')."</button></p>";
diff --git a/prefs.js b/prefs.js
index 59e455443..cc0a8e978 100644
--- a/prefs.js
+++ b/prefs.js
@@ -121,6 +121,26 @@ function notify_callback2(transport) {
notify_info(transport.responseText);
}
+function init_profile_inline_editor() {
+ try {
+
+ if ($("prefFeedCatList")) {
+ var elems = $("prefFeedCatList").getElementsByTagName("SPAN");
+
+ for (var i = 0; i < elems.length; i++) {
+ if (elems[i].id && elems[i].id.match("FCATT-")) {
+ var id = elems[i].id.replace("FCATT-", "");
+ new Ajax.InPlaceEditor(elems[i],
+ 'backend.php?op=rpc&subop=saveprofile&id=' + id);
+ }
+ }
+ }
+
+ } catch (e) {
+ exception_error("init_profile_inline_editor", e);
+ }
+}
+
function init_cat_inline_editor() {
try {
@@ -267,6 +287,28 @@ function addFeed() {
}
+function addPrefProfile() {
+
+ var profile = $("fadd_profile");
+
+ if (profile.value.length == 0) {
+ alert(__("Can't add profile: no name specified."));
+ } else {
+ notify_progress("Adding profile...");
+
+ var query = "?op=rpc&subop=addprofile&title=" +
+ param_escape(profile.value);
+
+ new Ajax.Request("backend.php", {
+ parameters: query,
+ onComplete: function(transport) {
+ editProfiles();
+ } });
+
+ }
+}
+
+
function addFeedCat() {
var cat = $("fadd_cat");
@@ -616,6 +658,34 @@ function purgeSelectedFeeds() {
return false;
}
+function removeSelectedPrefProfiles() {
+
+ var sel_rows = getSelectedFeedCats();
+
+ if (sel_rows.length > 0) {
+
+ var ok = confirm(__("Remove selected profiles? Active and default profiles will not be removed."));
+
+ if (ok) {
+ notify_progress("Removing selected profiles...");
+
+ var query = "?op=rpc&subop=remprofiles&ids="+
+ param_escape(sel_rows.toString());
+
+ new Ajax.Request("backend.php", {
+ parameters: query,
+ onComplete: function(transport) {
+ editProfiles();
+ } });
+ }
+
+ } else {
+ alert(__("No profiles selected."));
+ }
+
+ return false;
+}
+
function removeSelectedFeedCats() {
var sel_rows = getSelectedFeedCats();
@@ -1207,7 +1277,7 @@ function validatePrefsReset() {
}
} catch (e) {
- exception_error("validatePrefsSave", e);
+ exception_error("validatePrefsReset", e);
}
return false;
@@ -1282,6 +1352,11 @@ function selectPrefRows(kind, select) {
nrow = "UMRR-";
nchk = "UMCHK-";
lname = "prefUserList";
+ } else if (kind == "fbrowse") {
+ opbarid = "browseOpToolbar";
+ nrow = "FBROW-";
+ nchk = "FBCHK-";
+ lname = "browseFeedList";
}
if (opbarid) {
@@ -1685,7 +1760,12 @@ function validatePrefsSave() {
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function(transport) {
- notify_callback2(transport);
+ var msg = transport.responseText;
+ if (msg.match("PREFS_THEME_CHANGED")) {
+ window.location.reload();
+ } else {
+ notify_info(msg);
+ }
} });
}
@@ -2104,3 +2184,39 @@ function mouse_up_handler(e) {
function inPreferences() {
return true;
}
+
+function editProfiles() {
+ displayDlg('editPrefProfiles', false, function() {
+ init_profile_inline_editor();
+ });
+}
+
+function activatePrefProfile() {
+
+ var sel_rows = getSelectedFeedCats();
+
+ if (sel_rows.length == 1) {
+
+ var ok = confirm(__("Activate selected profile?"));
+
+ if (ok) {
+ notify_progress("Loading, please wait...");
+
+ var query = "?op=rpc&subop=setprofile&id="+
+ param_escape(sel_rows.toString());
+
+ new Ajax.Request("backend.php", {
+ parameters: query,
+ onComplete: function(transport) {
+ window.location.reload();
+ } });
+ }
+
+ } else {
+ alert(__("Please choose a profile to activate."));
+ }
+
+ return false;
+}
+
+
diff --git a/prefs.php b/prefs.php
index cae69a54f..8a0b5237a 100644
--- a/prefs.php
+++ b/prefs.php
@@ -26,7 +26,7 @@
<title>Tiny Tiny RSS : Preferences</title>
<link rel="stylesheet" type="text/css" href="tt-rss.css?<?php echo $dt_add ?>"/>
- <?php $user_theme = $_SESSION["theme"];
+ <?php $user_theme = get_user_theme_path($link);
if ($user_theme) { ?>
<link rel="stylesheet" type="text/css" href="themes/<?php echo $user_theme ?>/theme.css"/>
<?php } ?>
diff --git a/sanity_check.php b/sanity_check.php
index 950dff766..c50d391a1 100644
--- a/sanity_check.php
+++ b/sanity_check.php
@@ -2,7 +2,7 @@
require_once "functions.php";
define('EXPECTED_CONFIG_VERSION', 18);
- define('SCHEMA_VERSION', 62);
+ define('SCHEMA_VERSION', 63);
if (!file_exists("config.php")) {
print "<b>Fatal Error</b>: You forgot to copy
diff --git a/schema/ttrss_schema_mysql.sql b/schema/ttrss_schema_mysql.sql
index e2f9729aa..862ae3a42 100644
--- a/schema/ttrss_schema_mysql.sql
+++ b/schema/ttrss_schema_mysql.sql
@@ -15,6 +15,7 @@ drop table if exists ttrss_prefs_types;
drop table if exists ttrss_prefs_sections;
drop table if exists ttrss_tags;
drop table if exists ttrss_enclosures;
+drop table if exists ttrss_settings_profiles;
drop table if exists ttrss_entry_comments;
drop table if exists ttrss_user_entries;
drop table if exists ttrss_entries;
@@ -238,9 +239,9 @@ create table ttrss_tags (id integer primary key auto_increment,
create table ttrss_version (schema_version int not null) TYPE=InnoDB;
-insert into ttrss_version values (62);
+insert into ttrss_version values (63);
-create table ttrss_enclosures (id serial not null primary key,
+create table ttrss_enclosures (id integer primary key auto_increment,
content_url text not null,
content_type varchar(250) not null,
post_id integer not null,
@@ -249,6 +250,12 @@ create table ttrss_enclosures (id serial not null primary key,
index (post_id),
foreign key (post_id) references ttrss_entries(id) ON DELETE cascade) TYPE=InnoDB;
+create table ttrss_settings_profiles(id integer primary key auto_increment,
+ title varchar(250) not null,
+ owner_uid integer not null,
+ index (owner_uid),
+ foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB;
+
create table ttrss_prefs_types (id integer not null primary key,
type_name varchar(100) not null) TYPE=InnoDB;
@@ -389,10 +396,15 @@ insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) valu
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('_MOBILE_SORT_FEEDS_UNREAD', 1, 'false', '', 1);
+insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('_THEME_ID', 3, '0', '', 1);
+
create table ttrss_user_prefs (
owner_uid integer not null,
pref_name varchar(250),
value text not null,
+ profile integer,
+ index (profile),
+ foreign key (profile) references ttrss_settings_profiles(id) ON DELETE CASCADE,
index (owner_uid),
foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE,
index (pref_name),
diff --git a/schema/ttrss_schema_pgsql.sql b/schema/ttrss_schema_pgsql.sql
index f242a6bba..fb2ac1822 100644
--- a/schema/ttrss_schema_pgsql.sql
+++ b/schema/ttrss_schema_pgsql.sql
@@ -12,6 +12,7 @@ drop table ttrss_prefs_types;
drop table ttrss_prefs_sections;
drop table ttrss_tags;
drop table ttrss_enclosures;
+drop table ttrss_settings_profiles;
drop table ttrss_entry_comments;
drop table ttrss_user_entries;
drop table ttrss_entries;
@@ -210,7 +211,7 @@ create index ttrss_tags_owner_uid_index on ttrss_tags(owner_uid);
create table ttrss_version (schema_version int not null);
-insert into ttrss_version values (62);
+insert into ttrss_version values (63);
create table ttrss_enclosures (id serial not null primary key,
content_url text not null,
@@ -219,6 +220,10 @@ create table ttrss_enclosures (id serial not null primary key,
duration text not null,
post_id integer references ttrss_entries(id) ON DELETE cascade NOT NULL);
+create table ttrss_settings_profiles(id serial not null primary key,
+ title varchar(250) not null,
+ owner_uid integer not null references ttrss_users(id) on delete cascade);
+
create table ttrss_prefs_types (id integer not null primary key,
type_name varchar(100) not null);
@@ -355,9 +360,12 @@ insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) valu
insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('_MOBILE_SORT_FEEDS_UNREAD', 1, 'false', '', 1);
+insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('_THEME_ID', 3, '0', '', 1);
+
create table ttrss_user_prefs (
owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
pref_name varchar(250) not null references ttrss_prefs(pref_name) ON DELETE CASCADE,
+ profile integer references ttrss_settings_profiles(id) ON DELETE CASCADE,
value text not null);
create index ttrss_user_prefs_owner_uid_index on ttrss_user_prefs(owner_uid);
diff --git a/schema/versions/mysql/63.sql b/schema/versions/mysql/63.sql
new file mode 100644
index 000000000..e5b539906
--- /dev/null
+++ b/schema/versions/mysql/63.sql
@@ -0,0 +1,18 @@
+begin;
+
+create table ttrss_settings_profiles(id integer primary key auto_increment,
+ title varchar(250) not null,
+ owner_uid integer not null,
+ index (owner_uid),
+ foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB;
+
+alter table ttrss_user_prefs add column profile integer;
+update ttrss_user_prefs set profile = NULL;
+
+alter table ttrss_user_prefs add FOREIGN KEY (profile) REFERENCES ttrss_settings_profiles(id) ON DELETE CASCADE;
+
+insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('_THEME_ID', 3, '0', '', 1);
+
+update ttrss_version set schema_version = 63;
+
+commit;
diff --git a/schema/versions/pgsql/63.sql b/schema/versions/pgsql/63.sql
new file mode 100644
index 000000000..90bde3154
--- /dev/null
+++ b/schema/versions/pgsql/63.sql
@@ -0,0 +1,16 @@
+begin;
+
+create table ttrss_settings_profiles(id serial not null primary key,
+ title varchar(250) not null,
+ owner_uid integer not null references ttrss_users(id) on delete cascade);
+
+alter table ttrss_user_prefs add column profile integer;
+update ttrss_user_prefs set profile = NULL;
+
+alter table ttrss_user_prefs add constraint "$3" FOREIGN KEY (profile) REFERENCES ttrss_settings_profiles(id) ON DELETE CASCADE;
+
+insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('_THEME_ID', 3, '0', '', 1);
+
+update ttrss_version set schema_version = 63;
+
+commit;
diff --git a/themes/compact/theme.css b/themes/compact/theme.css
index f9ff384b7..a221497ce 100644
--- a/themes/compact/theme.css
+++ b/themes/compact/theme.css
@@ -37,7 +37,7 @@ div.postReply div.postHeader {
border-width : 0px 0px 1px 1px;
}
-#prefContent {
+#prefContentOuter {
bottom : 0px;
}
diff --git a/tt-rss.php b/tt-rss.php
index ed4171a9b..bf5575b95 100644
--- a/tt-rss.php
+++ b/tt-rss.php
@@ -27,7 +27,7 @@
<link rel="stylesheet" type="text/css" href="tt-rss.css?<?php echo $dt_add ?>"/>
- <?php $user_theme = $_SESSION["theme"];
+ <?php $user_theme = get_user_theme_path($link);
if ($user_theme) { ?>
<link rel="stylesheet" type="text/css" href="themes/<?php echo $user_theme ?>/theme.css?<?php echo $dt_add ?>">
<?php } ?>