From 8ed8a109659bc4a629dd785f21f22e99bb84f289 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 16 Jun 2021 14:24:57 +0300 Subject: [PATCH] add settings profile cloning --- classes/pref/prefs.php | 37 +++++++++++++++++++++++++++++++++++++ js/PrefHelpers.js | 27 ++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/classes/pref/prefs.php b/classes/pref/prefs.php index 1eaa99345..cb666e945 100644 --- a/classes/pref/prefs.php +++ b/classes/pref/prefs.php @@ -1338,6 +1338,35 @@ class Pref_Prefs extends Handler_Protected { } } + function cloneprofile() { + $old_profile = $_REQUEST["old_profile"] ?? 0; + $new_title = clean($_REQUEST["new_title"]); + + if ($old_profile && $new_title) { + $new_profile = ORM::for_table('ttrss_settings_profiles')->create(); + $new_profile->title = $new_title; + $new_profile->owner_uid = $_SESSION['uid']; + + if ($new_profile->save()) { + $sth = $this->pdo->prepare("INSERT INTO ttrss_user_prefs + (owner_uid, pref_name, profile, value) + SELECT + :uid, + pref_name, + :new_profile, + value + FROM ttrss_user_prefs + WHERE owner_uid = :uid AND profile = :old_profile"); + + $sth->execute([ + "uid" => $_SESSION["uid"], + "new_profile" => $new_profile->id, + "old_profile" => $old_profile, + ]); + } + } + } + function remprofiles() { $ids = $_REQUEST["ids"] ?? []; @@ -1394,11 +1423,19 @@ class Pref_Prefs extends Handler_Protected { array_push($rv, ["title" => __("Default profile"), "id" => 0, + "initialized" => true, "active" => empty($_SESSION["profile"]) ]); foreach ($profiles as $profile) { $profile['active'] = ($_SESSION["profile"] ?? 0) == $profile->id; + + $num_settings = ORM::for_table('ttrss_user_prefs') + ->where('profile', $profile->id) + ->count(); + + $profile['initialized'] = $num_settings > 0; + array_push($rv, $profile->as_array()); }; diff --git a/js/PrefHelpers.js b/js/PrefHelpers.js index 361b653b6..30a4544fe 100644 --- a/js/PrefHelpers.js +++ b/js/PrefHelpers.js @@ -128,6 +128,24 @@ const Helpers = { getSelectedProfiles: function () { return Tables.getSelected("pref-profiles-list"); }, + cloneSelected: function() { + const sel_rows = this.getSelectedProfiles(); + + if (sel_rows.length == 1) { + const new_title = prompt(__("Name for cloned profile:")); + + if (new_title) { + xhr.post("backend.php", {op: "pref-prefs", method: "cloneprofile", "new_title": new_title, "old_profile": sel_rows[0]}, () => { + Notify.close(); + dialog.refresh(); + }); + } + + } else { + alert(__("Please select a single profile to clone.")); + } + + }, removeSelected: function () { const sel_rows = this.getSelectedProfiles(); @@ -174,7 +192,7 @@ const Helpers = {
- ${App.FormFields.button_tag(__('Create profile'), "", {onclick: 'App.dialogOf(this).addProfile()'})} + ${App.FormFields.button_tag(App.FormFields.icon("add_circle") + " " + __('Add'), "", {onclick: 'App.dialogOf(this).addProfile()'})}
@@ -198,6 +216,7 @@ const Helpers = { ` : `${profile.title}`} ${profile.active ? __("(active)") : ""} + ${profile.initialized ? "" : __("(empty)")} `).join("")} @@ -205,9 +224,11 @@ const Helpers = {