add settings profile cloning

This commit is contained in:
Andrew Dolgov 2021-06-16 14:24:57 +03:00
parent 92c78beb90
commit 8ed8a10965
2 changed files with 61 additions and 3 deletions

View File

@ -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());
};

View File

@ -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 = {
<div class="pull-right">
<input name='newprofile' dojoType='dijit.form.ValidationTextBox' required='1'>
${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()'})}
</div>
</div>
@ -198,6 +216,7 @@ const Helpers = {
</script>
</span>` : `${profile.title}`}
${profile.active ? __("(active)") : ""}
${profile.initialized ? "" : __("(empty)")}
</td>
</tr>
`).join("")}
@ -205,9 +224,11 @@ const Helpers = {
</div>
<footer>
${App.FormFields.button_tag(App.FormFields.icon("delete") + " " +__('Remove selected profiles'), "",
${App.FormFields.button_tag(App.FormFields.icon("delete") + " " +__('Remove selected'), "",
{class: 'pull-left alt-danger', onclick: 'App.dialogOf(this).removeSelected()'})}
${App.FormFields.submit_tag(App.FormFields.icon("check") + " " + __('Activate profile'), {onclick: 'App.dialogOf(this).execute()'})}
${App.FormFields.button_tag(App.FormFields.icon("content_copy") + " " + __('Clone'), "",
{class: '', onclick: 'App.dialogOf(this).cloneSelected()'})}
${App.FormFields.submit_tag(App.FormFields.icon("check") + " " + __('Activate'), {onclick: 'App.dialogOf(this).execute()'})}
${App.FormFields.cancel_dialog_tag(__('Cancel'))}
</footer>
</form>