-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtwentyc.rest.min.js
35 lines (35 loc) · 17.6 KB
/
twentyc.rest.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(function(f,d){function p(a){a.contents().filter(function(){return"A"!=this.nodeName}).each(function(){const b=d(this).text().replace(/((https?:\/\/[^\s]+)|(\S+@\S+))/g,c=>/\S+@\S+/.test(c)?`<a href="mailto:${c}">${c}</a>`:`<a href="${c}">${c}</a>`);d(this).replaceWith(b)})}(function(a){a.fn.closest_descendant=function(b){for(var c=a(),e=this.children();e.length;){c=e.filter(b);if(c.length)break;e=e.children()}return c.first()}})(jQuery);f.rest={config:{csrf:""},url:{trim_endpoint:function(a){return a.replace(/^\/+|\/+$/g,
"")},url_join:function(a,...b){let c=[],e=!f.rest.no_end_slash;a=a.replace(/\/+$/g,"");for(const k of b)c=c.concat(k.split("/").filter(g=>g).map(g=>this.trim_endpoint(g)));if(!c.length)return e?`${a}/`:a;c=c.join("/");if(!a)return e?`/${c}/`:`/${c}`;a=`${a.replace(/\/$/,"")}/${c}`;return e?`${a}/`:a}}};f.rest.Response=f.cls.define("Response",{Response:function(a,b){a&&(a.data||a.errors)?(this.status=b,this.content=a):this.status=b},rows:function(a){var b;for(b=0;b<this.content.data.length;b++)a(this.content.data[b],
b)},first:function(){return this.content&&this.content.data?this.content.data[0]:null},field_errors:function(a){if(this.has_errors()){var b;if(this.content.errors.field_errors)d.each(this.content.errors.field_errors,(c,e)=>{a(e.name,e.errors)});else for(b in this.content.errors)"non_field_errors"!=b&&a(b,this.content.errors[b])}},non_field_errors:function(a){if(this.has_errors()){var b=this.content.errors.non_field_errors;"string"==typeof b&&(b=[b]);b&&a(b)}},http_status_text:function(){return 401==
this.status?"Unauthorized Access":403==this.status?"Permission Denied":404==this.status?"Resource not found":405==this.status?"Method not allowed":429==this.status?this.content.errors.detail?this.content.errors.detail:"Request is rate limited":500==this.status?"Internal Error":"Http Error "+this.status},has_errors:function(){400<this.status&&(this.content||(this.content={}),this.content.errors||(this.content.errors={}),this.content.errors.non_field_errors=[this.http_status_text()]);return 0==d.isEmptyObject(this.content.errors)}});
f.rest.Client=f.cls.define("Client",{Client:function(a){this.base_url=a.replace(/\/$/g,"")},endpoint_url:function(a){return a?f.rest.url.url_join(this.base_url,a):f.rest.url.url_join(this.base_url)},encode:function(a){return JSON.stringify(a)},format_request_url:function(a,b){return a},read:function(a,b,c){c=c.toLowerCase();d(this).trigger("api-request:before",[a,b,c]);d(this).trigger("api-read:before",[a,b,c]);d(this).trigger("api-"+c+":before",[a,b]);return new Promise(function(e,k){d.ajax({method:c.toUpperCase(),
data:b,url:this.format_request_url(this.endpoint_url(a),c)}).done(function(g){g=new f.rest.Response(g);d(this).trigger("api-request:success",[a,b,g,c]);d(this).trigger("api-read:success",[a,b,g,c]);d(this).trigger("api-"+c+":success",[a,b,g]);e(g)}.bind(this)).fail(function(g){g=new f.rest.Response(g.responseJSON);d(this).trigger("api-request:error",[a,b,g,c]);d(this).trigger("api-read:error",[a,b,g,c]);d(this).trigger("api-"+c+":error",[a,b,g]);k(g)}.bind(this)).always(function(g){d(this).trigger("api-request:after",
[a,b,c]);d(this).trigger("api-read:after",[a,b,c]);d(this).trigger("api-"+c+":after",[a,b])}.bind(this))}.bind(this))},write:function(a,b,c,e=null){e=e||this.endpoint_url(a);c=c.toLowerCase();d(this).trigger("api-request:before",[a,b,c]);d(this).trigger("api-write:before",[a,b,c]);d(this).trigger("api-"+c+":before",[a,b]);return new Promise(function(k,g){d.ajax({dataType:"json",method:c.toUpperCase(),url:this.format_request_url(e,c),data:this.encode(b),headers:{"Content-Type":"application/json","X-CSRFToken":f.rest.config.csrf}}).done(function(h){h=
new f.rest.Response(h);d(this).trigger("api-request:success",[a,b,h,c]);d(this).trigger("api-write:success",[a,b,h,c]);d(this).trigger("api-"+c+":success",[a,b,h]);k(h)}.bind(this)).fail(function(h){h=new f.rest.Response(h.responseJSON,h.status);d(this).trigger("api-request:error",[a,b,h,c]);d(this).trigger("api-write:error",[a,b,h,c]);d(this).trigger("api-"+c+":error",[a,b,h]);g(h)}.bind(this)).always(function(h){d(this).trigger("api-request:after",[a,b,c]);d(this).trigger("api-write:after",[a,b,
c]);d(this).trigger("api-"+c+":after",[a,b])}.bind(this))}.bind(this))},get:function(a,b){return this.read(a,b,"get")},options:function(a,b){return this.read(a,b,"options")},post:function(a,b){return this.write(a,b,"post")},put:function(a,b){return this.write(a,b,"put")},delete:function(a,b){return this.write(a,b,"delete")}});f.rest.Widget=f.cls.extend("Widget",{Widget:function(a,b){this.action=b.data("api-action");this.local_actions={};this.formatters={};this.Client(a);this.bind(b)},start_processing:function(){this.busy=
!0;this.loading_shim||(this.loading_shim=d("<div>").addClass("loading-shim"),this.element.append(this.loading_shim));this.loading_shim_disabled||this.loading_shim.show();d(this).trigger("processing")},done_processing:function(){this.busy=!1;this.loading_shim&&!window.debug_loading_shim&&this.loading_shim.hide();d(this).trigger("ready")},template:function(a){return this.element.closest_descendant(".templates").find('[data-template="'+a+'"]').clone().attr("data-template",null)},bind:function(a){a.data("rest_widget",
this);this.element=a;this.redirect=this.element.data("api-redirect");d(this).on("api-write:before",function(){this.clear_errors();this.start_processing()}.bind(this));d(this).on("api-write:after",function(){this.done_processing()}.bind(this));d(this).on("api-read:before",function(){this.start_processing()}.bind(this));d(this).on("api-read:after",function(){this.done_processing()}.bind(this))},local_action:function(a,b){this.local_actions[a]=b},clear_errors:function(){this.element.find(".validation-error").detach();
this.element.find(".validation-error-indicator").removeClass("validation-error-indicator")},render_error:function(a,b){if(b){var c=d("<div>").addClass("validation-error"),e=this.element.find('[name="'+a+'"]');e.addClass("validation-error-indicator");for(a=0;a<b.length;a++)c.append(d("<p>").text(b[a]));"checkbox"!=e.attr("type")&&c.insertAfter(e)}},render_non_field_errors:function(a){var b=d("<div>").addClass("alert alert-danger validation-error non-field-errors");let c;for(c=0;c<a.length;c++)d(f.rest).trigger("non-field-error",
[a[c],a,c,b,this]),a[c]&&b.append(d("<div>").addClass("non-field-error").text(a[c]));p(b);this.element.prepend(b)},payload:function(){var a={};this.element.find('[data-api-submit="yes"]').each(function(){d(this).find("input,select,textarea").each(function(){var b=d(this);"checkbox"==b.attr("type")?b.prop("checked")?a[b.attr("name")]=!0:a[b.attr("name")]=!1:"int"==b.data("type")?a[b.attr("name")]=parseInt(b.val()):"bool"==b.data("type")?a[b.attr("name")]="true"==b.val().toLowerCase()?!0:!1:a[b.attr("name")]=
b.val();"yes"==b.data("blank-as-null")&&""==b.val()&&(a[b.attr("name")]=null)})});d(this).trigger("payload:after",[a]);return a},apply_data:function(a,b){d(this).trigger("apply_data:before",[a]);b||(b=this.element);var c,e;for(c in a){var k=this.formatters[c];var g=b.find('[data-field="'+c+'"]');g.length&&(e=g.get(0).tagName.toLowerCase());var h=g.data("toggle");h?a[c]?g.addClass(h):g.removeClass(h):k?(k=k(a[c],a,g),g.empty().append(k)):"select"==e||"input"==e||"textarea"==e?"checkbox"==g.attr("type")?
g.prop("checked",a[c]):g.val(a[c]):g.text(a[c]).val(a[c])}}},f.rest.Client);f.rest.Form=f.cls.extend("Form",{Form:function(a){var b=a.data("api-base");this.form_action=a.data("api-action");this.submit_inline="yes"==a.data("submit-inline");this.Widget(b,a)},fill:function(a){var b;this.clear_errors();for(b in a){var c=a[b];this.element.find('[name="'+b+'"]').each(function(){"yes"!=d(this).data("constant")&&("checkbox"==d(this).attr("type")?d(this).prop("checked",c):d(this).val(c))});this.element.find('[data-field="'+
b+'"]').each(function(){d(this).text(c)})}},reset:function(){var a,b={};for(a in this.payload())b[a]="";this.fill(b)},post_success:function(a){},post_failure:function(a){a.field_errors(this.render_error.bind(this));a.non_field_errors(this.render_non_field_errors.bind(this))},submit:function(a){this.clear_errors();a||(a=this.method);this[a.toLowerCase()].bind(this)(this.form_action,this.payload()).then(this.post_success.bind(this),this.post_failure.bind(this))},bind:function(a){this.Widget_bind(a);
this.method=a.data("api-method")||"POST";this.element.find("input").keydown(function(c){if(13==c.keyCode)return c.preventDefault(),this.submit(),!1}.bind(this));var b=this;this.element.find("button").click(function(c){c.preventDefault();return!1});this.element.find('button.submit,button[data-element="submit"]').click(function(c){c.preventDefault();b.submit(d(this).data("api-method"));return!1});this.submit_inline&&this.wire_inline_submit()},wire_inline_submit:function(){var a=this,b=new f.util.SmartTimeout(()=>
{},100),c=function(e){console.log(e);d(a).one("api-write:success",()=>{d(this).removeClass("saving").addClass("saved")});b.set(()=>{d(this).addClass("saving").removeClass("saved");a.submit(this.method)},"keyup"==e.type?500:100)};this.element.find("input,textarea,select").each(function(){var e=d(this);if("select"==this.tagName.toLowerCase()||"checkbox"==e.attr("type"))e.on("change",c);else e.on("keyup",c)})},wire_submit:function(a){var b=this;a.off("click").click(function(){b.submit(this.method)})}},
f.rest.Widget);f.rest.Input=f.cls.extend("Input",{Input:function(a){var b=a.data("api-base");this.Widget(b,a)},start_processing:function(){this.busy=!0;this.element.prop("disabled",!0);d(this).trigger("processing")},done_processing:function(){this.busy=!1;this.element.prop("disabled",!1);d(this).trigger("ready")},post_success:function(a){},post_failure:function(a){console.error(a);a.field_errors(this.render_error.bind(this));a.non_field_errors(this.render_non_field_errors.bind(this))},bind:function(a){this.Widget_bind(a);
this.method=a.data("api-method")||"POST";this.element.on("keyup",function(b){this.clear_errors();13==b.which&&(b=this.action,this[this.method.toLowerCase()].bind(this)(b,this.payload()).then(this.post_success.bind(this),this.post_failure.bind(this)))}.bind(this))},val:function(a){return this.element.val(a)}},f.rest.Widget);f.rest.Checkbox=f.cls.extend("Checkbox",{payload:function(){var a={};a[this.element.attr("name")]=this.element.prop("checked")?!0:!1;return a},bind:function(a){this.Widget_bind(a);
this.method=a.data("api-method")||"POST";this.element.on("change",function(b){b=this.element.data("confirm");if(!b||confirm(b))this.clear_errors(),b=this.action,this[this.method.toLowerCase()].bind(this)(b,this.payload()).then(this.post_success.bind(this),this.post_failure.bind(this))}.bind(this))}},f.rest.Input);f.rest.Button=f.cls.extend("Button",{bind:function(a){this.Widget_bind(a);this.method=a.data("api-method")||"POST";this.element.on(this.bind_to_event||"mouseup",function(b){b=this.element.data("confirm");
if(!b||confirm(b))this.clear_errors(),b=this.action,this[this.method.toLowerCase()].bind(this)(b,this.payload()).then(this.post_success.bind(this),this.post_failure.bind(this))}.bind(this))}},f.rest.Input);f.rest.Select=f.cls.extend("Select",{Select:function(a){this.load_action=a.data("api-load");this.name_field=a.data("name-field")||"name";this.id_field=a.data("id-field")||"id";this.selected_field=a.data("selected-field")||"selected";this.load_type=a.data("load-type")||"get";this.drf_name=a.data("drf-name")||
a.attr("name");this.null_option=a.data("null-option");this.proxy_data=a.data("proxy-data");this.Input(a)},payload:function(){return{id:this.element.val()}},load_params:function(){return null},filter:function(a){return!0},load:function(a){if(this.proxy_data){var b=this.element;b.empty();this.null_option&&(a=this.null_option.split(";"),b.append(d("<option>").val(a[0]).text(a[1])));d(this.proxy_data).find("option").each(function(){b.append(d(this).clone())});d(this).trigger("load:after",[b,{},this]);
return new Promise((c,e)=>{c()})}return"drf-choices"==this.load_type?this._load_drf_choices(a):this._load_get(a)},_load_get:function(a){return this.get(null,this.load_params()).then(function(b){var c=this.element,e=this.name_field,k=this.id_field,g=this.selected_field,h=this,m=c.val();c.empty();if(this.null_option){let l=this.null_option.split(";");c.append(d("<option>").val(l[0]).text(l[1]))}d(b.content.data).each(function(){if(h.filter(this)){var l=this[g]||!1,n=d("<option>").val(this[k]).text(this[e]);
l&&n.attr("selected",!0);c.append(n)}});a&&(c.val(a),a!=m&&c.trigger("change",[]));d(this).trigger("load:after",[c,b.content.data,this])}.bind(this))},_load_drf_choices:function(a){return this.options().then(function(b){var c=this.element.empty();b=b.content.data[0].actions.POST[this.drf_name].choices;if(this.null_option){let e=this.null_option.split(";");c.append(d("<option>").val(e[0]).text(e[1]))}d(b).each(function(){c.append(d("<option>").val(this.value).text(this.display_name))});a&&c.val(a)}.bind(this))},
refresh:function(){var a=this.element.val();return this.load().then(()=>{this.element.val(a)},()=>{})},prepare_write_url:function(a){return a},bind:function(a){this.Widget_bind(a);this.method=a.data("api-method")||"POST";this.load_action&&this.load();this.element.on("change",function(){this.clear_errors();if(this.action){var b=this.action;this[this.method.toLowerCase()].bind(this)(b,this.payload()).then(this.post_success.bind(this),this.post_failure.bind(this))}}.bind(this))}},f.rest.Input);f.rest.List=
f.cls.extend("List",{List:function(a){var b=a.data("api-base");this.id_field="id";this.formatters={};this.Widget(b,a);this.list_head=this.element.find("thead,.list-header").first();this.initialize_sorting()},load:function(){this.sortable&&this.apply_ordering();return this.get(this.action,this.payload()).then(function(a){this.list_body.empty();a.rows(function(b,c){this.insert(b)}.bind(this));d(this).trigger("load:after",[a])}.bind(this))},load_until_data:function(a,b){this.load().then(()=>{!this.element.find(".list-body").is(":empty")||
b&&!b()||setTimeout(()=>{this.load_until_data(a,b)},a)})},reload_row:function(a){var b=this.find_row(a);if(b)return this.get(a,this.payload()).then(function(c){this.insert(c.first()).insertAfter(b);b.detach()}.bind(this))},build_row:function(a){return this.template("row")},insert:function(a){var b=this.build_row(a);this.apply_data(a,b);this.formatters.row&&this.formatters.row(b,a);b.data("apiobject",a);b.addClass("row-"+a[this.id_field]);this.list_body.append(b);this.wire(b);d(this).trigger("insert:after",
[b,a]);return b},api_callback_remove:function(a){a.rows(function(b){this.remove(b)}.bind(this))},remove:function(a){d(this).trigger("remove:before",[a]);this.list_body.find(".row-"+a[this.id_field]).detach()},find_row:function(a){return this.list_body.find(".row-"+(""+a).replace(":","\\:"))},action_failure:function(a){a.field_errors(this.render_error.bind(this));a.non_field_errors(this.render_non_field_errors.bind(this))},wire:function(a){var b=this;a.find("a[data-action]").click(function(){var c=
d(this).data("action");if(b.local_actions[c])b.local_actions[c](a.data("apiobject"),a)});a.find("a[data-api-action], button[data-api-action]").each(function(){var c=(d(this).data("api-method")||"POST").toLowerCase(),e=d(this).data("api-action").toLowerCase(),k=d(this).data("api-callback"),g=d(this).data("api-callback"),h=d(this).data("confirm");k&&=b["api_callback_"+k].bind(b);d(this).click(function(){if(!h||confirm(h)){var m=a.data("apiobject"),l=e.replace(/\{([^\{\}]+)\}/,(n,q,r,t)=>m[q]);b[c](l,
a.data("apiobject")).then(k,b.action_failure.bind(b)).then(d(b).trigger("api_callback_"+g+":after"))}})})},bind:function(a){this.Widget_bind(a);this.list_body=a.find(".list-body")},payload:function(){return this.ordering?{ordering:this.ordering}:{}},initialize_sorting:function(){var a=this;this.sort_headings=this.list_head.find("[data-sort-target]");if(this.sortable=0<this.sort_headings.length){this.sort_headings.click(function(){var c=d(this);a.sort(c.data("sort-target"),c.data("sort-secondary"))});
var b=this.sort_headings.filter("[data-sort-initial]");this.sort_target=b.data("sort-target");this.sort_secondary=b.data("sort-secondary");this.sort_asc=!0;this.ordering="";this.payload=function(){return{ordering:this.ordering}}}},sort:function(a,b){this.sort_secondary=b;a==this.sort_target?this.sort_asc=!this.sort_asc:(this.sort_target=a,this.sort_asc=!0);this.load()},apply_ordering:function(){this.ordering=this.return_ordering();this.indicate_ordering()},return_ordering:function(){let a=this.sort_secondary?
","+this.sort_secondary:"";return this.sort_asc?this.sort_target+a:"-"+this.sort_target+a},indicate_ordering:function(){let a=this.sort_target,b=this.sort_asc;d(this.sort_headings).each(function(){d(this).find("span").remove();d(this).data("sort-target")==a?b?(d(this).removeClass("selected-order-header-desc"),d(this).addClass("selected-order-header-asc")):(d(this).removeClass("selected-order-header-asc"),d(this).addClass("selected-order-header-desc")):(d(this).removeClass("selected-order-header-asc"),
d(this).removeClass("selected-order-header-desc"))})}},f.rest.Widget);f.rest.PermissionsForm=f.cls.extend("PermissionsForm",{set_flag_values:function(a){this.element.find("input[data-permission-flag]").each(function(){var b=d(this).data("permission-flag");if(1==b.length)var c=-1<a.perms.indexOf(b);else{var e;c=!0;for(e=0;e<b.length;e++)-1==a.perms.indexOf(b.charAt(e))&&(c=!1)}d(this).prop("checked",c)})},payload:function(){var a=this.Form_payload();a.permissions="";this.element.find("input[data-permission-flag]").each(function(){d(this).prop("checked")&&
(a.permissions+=d(this).data("permission-flag"))});return a},bind:function(a){this.Widget_bind(a);this.method=a.data("api-method")||"POST";this.element.find("input[data-permission-flag]").on("change",function(){this.clear_errors();this[this.method.toLowerCase()].bind(this)(this.action,this.payload()).then(this.post_success.bind(this),this.post_failure.bind(this))}.bind(this))}},f.rest.Form)})(twentyc,jQuery);