ruleset io.picolabs.plan.bazaar { meta { name "bazaar apps" use module io.picolabs.wrangler alias wrangler use module io.picolabs.plan.apps alias app shares bazaar, krl_code } global { styles = << >> bazaar = function(_headers){ base = <<#{meta:host}/sky/cloud/#{meta:eci}/#{meta:rid}/krl_code.txt>> edit = app:event_url(meta:rid,"app_needs_edit","edit") repo = repo_pico() repo_attrs = repo => "" | << style="pointer-events:none;cursor:default">> repo_title = repo => "" | << title="not available">> li_apps = function(){ ent:apps .values() .map(function(spec){ rid = spec{"rid"} << #{rid} #{spec.get("name")} #{spec.get("rsname")} #{spec.get("event_domain")} show KRL edit/host KRL del >> }) } app:html_page("manage bazaar apps",styles, <<

Manage bazaar apps

Apps

#{li_apps().join("")}
Ruleset ID App Name App meta name event domain boilerplate Edit Delete

New app

e.x. my.special.guessing-app [start with a letter; may contain letters, digits, underscores, dashes, and periods]
e.x. guess [start with a letter; may contain letters, digits, and underscores]
e.x. guesses [start with a letter; may contain letters, digits, and spaces]
>> ,_headers) } krl_code = function(rid){ rsname = ent:apps{[rid,"rsname"]} home = ent:apps{[rid,"name"]} <Manage #{rsname} \>\>, _headers) } } } >> } repo_rid = "com.vcpnews.repo" repo_name = function(){ netid = wrangler:name() netid+"/bazaar" } repo_pico = function(){ the_name = repo_name() wrangler:children() .filter(function(c){ c{"name"} == the_name }) .head() } repo_krl = function(rid){ repo = repo_pico() repo.isnull() => "no repo" | wrangler:picoQuery( repo{"eci"}, repo_rid, "krl", {"rid":rid} ) } } rule acceptNewApp { select when io_picolabs_plan_bazaar new_app rid re#^([a-zA-Z][a-zA-Z0-9._-]+)$# home re#^([a-zA-Z][a-zA-Z0-9_]+)$# rsname re#([a-zA-Z][a-zA-Z0-9_ ]*)# setting(rid,home,rsname) pre { spec = { "rid": rid, "name": home, "rsname": rsname || home, "event_domain": rid.replace(re#[.-]#g,"_") } } fired { ent:apps{rid} := spec } } rule deleteApp { select when io_picolabs_plan_bazaar app_not_wanted rid re#^(.+)$# setting(rid) fired { clear ent:apps{rid} } } rule redirectBack { select when io_picolabs_plan_bazaar new_app or io_picolabs_plan_bazaar app_not_wanted pre { referrer = event:attr("_headers").get("referer") // sic } if referrer then send_directive("_redirect",{"url":referrer}) } rule sendSourceCode { select when io_picolabs_plan_bazaar app_needs_edit rid re#(.+)# setting(rid) pre { has = repo_krl() >< rid repo = repo_pico() } if repo && not has then event:send({ "eci": repo{"eci"}, "domain": "introspect_repo", "type": "new_source", "attrs": {"rid": rid, "src": krl_code(rid)} }) } rule openNewEditor { select when io_picolabs_plan_bazaar app_needs_edit rid re#(.+)# setting(rid) pre { rs_rid = "io.picolabs.plan.ruleset" rs_eci = wrangler:channels(["app","introspections"]).head(){"id"} url = <<#{meta:host}/c/#{rs_eci}/query/#{rs_rid}/codeEditor.html?rid=#{rid}>> } send_directive("_redirect",{"url":url}) } }