+ let button_specs = [
+ "default", "Refresh";
+ "save", "Save";
+ "add", "Add";
+ "match", "Match";
+ "remove", "Remove";
+ ] in
+ let each_button (action, str) =
+ let req = string_of_request action "" in
+ KP.printf "<span class=\"button\"><a href=\"%s\">%s</a></span>\n" req str
+ in
+ let before_roles p count =
+ let req = string_of_request "select" p in
+ KP.printf "<div class=\"roles-head role-color\">\n";
+ KP.printf "<a href=\"%s\">Roles:</a>\n" req;
+ KP.printf "<span class=\"count\">%s</span>\n" count
+ in
+ let each_role p b str =
+ let req_x = string_of_request "expand" p in
+ let req_s = string_of_request "select" p in
+ let s = if b then " selected" else "" in
+ KP.printf "<div class=\"role role-color%s\">" s;
+ KP.printf "<a href=\"%s\">⮞</a> " req_x;
+ KP.printf "<a href=\"%s\">%s</a>" req_s str
+ in
+ let before_role x n o =
+ let msg_n = if n then " (added)" else "" in
+ let msg_o = if o then " (removed)" else "" in
+ KP.printf "%s%s</div>\n" msg_n msg_o;
+ if x then KP.printf "<div class=\"roles\">\n"
+ in
+ let after_role x =
+ if x then KP.printf "</div>\n"
+ in
+ let after_roles () =
+ KP.printf "</div>\n";
+ KP.printf "<div class=\"buttons\">\n";
+ List.iter each_button button_specs;
+ KP.printf "</div>\n"
+ in
+ let stage s m =
+ let msg_m = if m then " (modified)" else "" in
+ KP.printf "<div class=\"stage role-color\">";
+ KP.printf "Stage: %s%s" s msg_m;
+ KP.printf "</div>\n"
+ in