# HG changeset patch # User William Welliver # Date 1652466114 14400 # Fri May 13 14:21:54 2022 -0400 # Node ID fc3920be983e153883962be61a2baee57996cdbb # Parent 83cd04b67c32db7ac3eebc4635dccb3c64dc831d adding prefs controller diff --git a/classes/controller.pike b/classes/controller.pike --- a/classes/controller.pike +++ b/classes/controller.pike @@ -14,6 +14,7 @@ Fins.FinsController about; Fins.FinsController rpc; Fins.FinsController plugin; +Fins.FinsController prefs; // used only for installing Fins.FinsController install; @@ -49,6 +50,7 @@ archive = load_controller("archive_controller"); about = load_controller("about_controller"); plugin = load_controller("plugin_controller"); + prefs = load_controller("preference_controller"); around_filter(app->user_filter); _index = real_index; diff --git a/classes/plugin_controller.pike b/classes/plugin_controller.pike --- a/classes/plugin_controller.pike +++ b/classes/plugin_controller.pike @@ -19,11 +19,15 @@ public void index(Request id, Response response, mixed ... args) { +CHECKADMIN() + response->redirect("list"); } public void list(Request id, Response response, mixed ... args) { + CHECKADMIN() + object t = view->get_view("plugin/list"); app->set_default_data(id, t); @@ -43,6 +47,8 @@ public void toggle_enabled(Request id, Response response, mixed ... args) { +CHECKADMIN() + if(!id->variables->plugin) { response->flash("msg", LOCALE(299,"No plugin.")); diff --git a/classes/preference_controller.pike b/classes/preference_controller.pike new file mode 100644 --- /dev/null +++ b/classes/preference_controller.pike @@ -0,0 +1,180 @@ +//LOCALE + +#define LOCALE(X,Y) Locale.translate(app->config->app_name, id->get_lang(), X, Y) + +#define CHECKADMIN() object user = id->misc->session_variables->user; \ +if(!app->is_list_master(list, id->misc->session_variables->user)) \ +{response->set_data("You must be an admin user in order to access this function."); return; } + +import Fins; +import Tools.Logging; +import Fins.Model; +inherit Fins.FinsController; + +protected string vtype = "admin"; + +int __quiet=1; + +static void start() +{ + around_filter(app->mandatory_user_filter); +} + + +protected string get_root(object id) +{ + return ""; +} + +public void index(Request id, Response response, mixed ... args) +{ +CHECKADMIN() + response->redirect("list"); +} + +public void tree(Request id, Response response, mixed ... args) +{ +CHECKADMIN() + string pr = get_root(id); + if(id->variables->action && id->variables->action == "getChildren") + { + array data = ({}); + mapping d = Tools.JSON.deserialize(id->variables->data); + Log.debug("data: %O\n", d); + array prefixes = ({}); + array nodes = ({}); + + if(d->node && d->node->widgetId && d->node->widgetId == "prefroot") + { + + mapping prc = ([]); + if(pr && sizeof(pr)) prc->name = Fins.Model.LikeCriteria(pr + "%"); + array x = find.preferences(prc); + foreach(x;;object p) + { + array x = (p["name"][sizeof(pr)..]/"."); + prefixes += ({x[0]}); + } + prefixes = Array.uniq(prefixes); + prefixes -= ({"", 0}); + foreach(prefixes;;string p) + data += ({ (["title": p, "data": p, "widgetId": "tree_" + p, "isFolder": 1 ]) }); + + } + else if(d->node && d->node->widgetId) + { + array x; + if(!has_prefix(d->node->widgetId[5..], pr?(pr):"")) x = ({}); + else x = find.preferences((["name": Fins.Model.LikeCriteria(d->node->widgetId[5..] + "%")])); + int q = sizeof(d->node->widgetId[5..] / "."); + multiset nodesadded = (<>); + foreach(x;;object p) + { + array x1 = p["name"]/"."; + if(sizeof(x1)>(q)) + { + if(nodesadded[x1[q]]) continue; + prefixes += ({ ({x1[q], (x1[..q] * ".")})}); + nodesadded[x1[q]] = 1; + } + else + nodes += ({p}); + } + +// prefixes = Array.uniq(prefixes); + + + if(sizeof(prefixes)) + foreach(prefixes;; array p) + data += ({ (["title": p[0], "data": p[1], "widgetId": "tree_" + p[1], "isFolder": 1 ]) }); + if(sizeof(nodes))foreach(nodes;; object pref) + data += ({ (["title": pref["shortname"], "data": pref["name"], "widgetId": "treepref_" + pref["name"], "isFolder": 0 ]) }); + +} + response->set_data(Tools.JSON.serialize(data)); + response->set_type("text/json"); + + werror("JSON: %O\n", Tools.JSON.serialize( data )); + } +} + +public void list(Request id, Response response, mixed ... args) +{ +CHECKADMIN() + object t; + string pr = get_root(id); +werror("list()\n"); + if(id->variables->ajax) + t = view->get_view(vtype + "/prefs/_list"); + else + t = view->get_view(vtype + "/prefs/list"); +werror("template: %O\n", t); + app->set_default_data(id, t); + + mixed ul = ({}); + mapping c = ([]); + + array prefixes=({}); + + { + mapping prc = ([]); + if(pr && sizeof(pr)) prc->name = Fins.Model.LikeCriteria(pr + "%"); + array x = find.preferences(prc); + foreach(x;;object p) + prefixes += ({ (p["name"][sizeof(pr)..]/".")[0]}); + prefixes -= ({"", 0}); + prefixes = Array.uniq(prefixes); + } + + string startswith = id->variables->startswith; + if(startswith && !has_prefix(startswith, pr)) + { + ul = ({}); + } + else + { + if(startswith) c->name = Fins.Model.LikeCriteria(startswith + "%"); + else if(pr) c->name = Fins.Model.LikeCriteria(pr + "%"); + ul = find.preferences(c, Fins.Model.Criteria("ORDER BY Name DESC")); + } +werror("prefixes: %O\n", prefixes); +werror("prefs: %O\n", ul); + + if(startswith) + t->add("startswith", (startswith||"")/"."); + t->add("prefprefixes", prefixes); + t->add("preferences", ul); + + response->set_view(t); +} + +public void set(Request id, Response response, mixed ... args) +{ +CHECKADMIN() + mixed e; + if (id->variables->key && id->variables->value && has_prefix(id->variables->key, (string)get_root(id))) { + object pref = app->get_sys_pref(id->variables->key); + if (pref) { + if(pref["type"] == SpeedyDelivery.BOOLEAN) + { + if(lower_case(id->variables->value) == "false" || id->variables->value == "0" || lower_case(id->variables->value) == "no") + pref["value"] = 0; + else + { + pref["value"] = 1; + } + + } + else + pref["value"] = id->variables->value; + response->set_data(Tools.JSON.serialize(([ "set" : 1 ]))); + response->set_type("text/javascript"); + } + } + else { + response->set_data(Tools.JSON.serialize(([ "set" : 0 ]))); + response->set_type("text/javascript"); + } + + if(e) Log.exception("an error occurred while setting a variable.", e); +} diff --git a/templates/prefs/_list.phtml b/templates/prefs/_list.phtml new file mode 100644 --- /dev/null +++ b/templates/prefs/_list.phtml @@ -0,0 +1,58 @@ +Preferences: + +<% implode var="$startswith" splice=" > " final=" > "%> + + +

+ +<% foreach var="$preferences" val="pref" %> + + + + + + + +<% end %> +
+<%$pref.def.friendly_name %>: + + +<% if data->pref["type"] == FinScribe.BOOLEAN %> + <%$pref.yesnovalue%> + +<%elseif data->pref["type"] == FinScribe.STRING && arrayp(data->pref["def"]["options"]) && sizeof(data->pref["def"]["options"]) %> + + {label: '<%$opt.name%>', value: '<%$opt.value%>' <%if data->pref["value"] == data->opt["value"] %>, selected: 1<%endif%>}, + <%end%> + ] + }" + title="<%$pref.def.friendly_name%>" id="<%$pref.name%>" name="<%$pref.name%>"><%val_from_options var="$pref.value" options="$pref.def.options"%> +<% else %> + + <%$pref.value%> + +<% endif %> +
<%$pref.def.description%>
+

Click on a value to edit it. +

diff --git a/templates/prefs/list.phtml b/templates/prefs/list.phtml new file mode 100644 --- /dev/null +++ b/templates/prefs/list.phtml @@ -0,0 +1,57 @@ + +

Preferences

+ + + + + +
+<%if !data->startswith %> +<% foreach var="$prefprefixes" val="prefix" %> +<%action_link action="list" startswith="$prefix"%><%$prefix%> +<% end%> +<%else%> +<%action_link action="list"%><< root +<%endif%> + +
+ <%if data->startswith %> + <%@include file="prefs/_list.phtml"%> + <%endif %> +
+
+ + + +