diff options
author | Andrew Dolgov <[email protected]> | 2010-01-13 18:31:51 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2010-01-13 18:31:51 +0300 |
commit | d9084cf22059f709e935c6c0755d2b69c21b3a87 (patch) | |
tree | 546788700196fbeb06afc2e87aa837a51e16a905 | |
parent | 57c7aa0f335d1cfef65646c958b838fd69a9ba5d (diff) |
implement settings profiles (bump schema)
-rw-r--r-- | backend.php | 29 | ||||
-rw-r--r-- | db-prefs.php | 26 | ||||
-rw-r--r-- | functions.js | 2 | ||||
-rw-r--r-- | functions.php | 48 | ||||
-rw-r--r-- | login_form.php | 32 | ||||
-rw-r--r-- | modules/backend-rpc.php | 83 | ||||
-rw-r--r-- | modules/popup-dialog.php | 97 | ||||
-rw-r--r-- | modules/pref-feeds.php | 2 | ||||
-rw-r--r-- | modules/pref-prefs.php | 137 | ||||
-rw-r--r-- | prefs.js | 120 | ||||
-rw-r--r-- | prefs.php | 2 | ||||
-rw-r--r-- | sanity_check.php | 2 | ||||
-rw-r--r-- | schema/ttrss_schema_mysql.sql | 16 | ||||
-rw-r--r-- | schema/ttrss_schema_pgsql.sql | 10 | ||||
-rw-r--r-- | schema/versions/mysql/63.sql | 18 | ||||
-rw-r--r-- | schema/versions/pgsql/63.sql | 16 | ||||
-rw-r--r-- | themes/compact/theme.css | 2 | ||||
-rw-r--r-- | tt-rss.php | 2 |
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>"; @@ -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; +} + + @@ -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 } ?> |