#wip(bin|ecma): Developt ECMA Forms and GUI items. Order the Binary items.
This commit is contained in:
		
							parent
							
								
									685c67240e
								
							
						
					
					
						commit
						6063de3623
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -2,3 +2,4 @@
 | 
				
			|||||||
/Public/data
 | 
					/Public/data
 | 
				
			||||||
*[Ss]ecrets*
 | 
					*[Ss]ecrets*
 | 
				
			||||||
/Go/Modules
 | 
					/Go/Modules
 | 
				
			||||||
 | 
					/Bin/AnP.golang.debug
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@ -38,6 +38,8 @@ func NewHTTPDriver(anp Models.AnPModel, inputs any) *HTTPDriver {
 | 
				
			|||||||
		}, inputs, Utils.GetPointer[any](true)), Utils.GetPointer(true)),
 | 
							}, inputs, Utils.GetPointer[any](true)), Utils.GetPointer(true)),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Models.DebugPrint(server.host + ":" + strconv.FormatInt(int64(server.port), 10))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Models.DebugPrint(server.host, ":", server.port)
 | 
						Models.DebugPrint(server.host, ":", server.port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if server.listener == nil {
 | 
						if server.listener == nil {
 | 
				
			||||||
 | 
				
			|||||||
@ -155,6 +155,8 @@ func (_self RoutesManager) Go(request_interface Interfaces.RequestModelInterface
 | 
				
			|||||||
	var done bool = false
 | 
						var done bool = false
 | 
				
			||||||
	var request Models.RequestModel = request_interface.(Models.RequestModel)
 | 
						var request Models.RequestModel = request_interface.(Models.RequestModel)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Models.DebugPrint([]any{_self.domains, request.Domain})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if slices.Contains(_self.domains, request.Domain) || slices.Contains(_self.domains, "") {
 | 
						if slices.Contains(_self.domains, request.Domain) || slices.Contains(_self.domains, "") {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var code int = 404
 | 
							var code int = 404
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,7 @@ package Models
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"AnP/Utils"
 | 
						"AnP/Utils"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -10,13 +11,31 @@ type RequestModel struct {
 | 
				
			|||||||
	Domain string
 | 
						Domain string
 | 
				
			||||||
	Method string
 | 
						Method string
 | 
				
			||||||
	URL    string
 | 
						URL    string
 | 
				
			||||||
 | 
						Port   int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewRequestModel(request *http.Request) RequestModel {
 | 
					func NewRequestModel(request *http.Request) RequestModel {
 | 
				
			||||||
 | 
						DebugPrint(strings.ToLower(request.Method) + ":" + request.Host + request.RequestURI)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var host []string = strings.Split(request.Host, ":")
 | 
				
			||||||
 | 
						var port int64 = 80
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(host) > 1 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							var error error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							port, error = strconv.ParseInt(host[1], 10, 32)
 | 
				
			||||||
 | 
							if error != nil {
 | 
				
			||||||
 | 
								port = 80
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return RequestModel{
 | 
						return RequestModel{
 | 
				
			||||||
		Domain: request.Host,
 | 
							Domain: host[0],
 | 
				
			||||||
		Method: strings.ToLower(request.Method),
 | 
							Method: strings.ToLower(request.Method),
 | 
				
			||||||
		URL:    request.RequestURI,
 | 
							URL:    request.RequestURI,
 | 
				
			||||||
 | 
							Port:   int(port),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,6 +44,7 @@ func (_self RequestModel) ToJSON(header string) string {
 | 
				
			|||||||
		header + "domain": _self.Domain,
 | 
							header + "domain": _self.Domain,
 | 
				
			||||||
		header + "method": _self.Method,
 | 
							header + "method": _self.Method,
 | 
				
			||||||
		header + "url":    _self.URL,
 | 
							header + "url":    _self.URL,
 | 
				
			||||||
 | 
							header + "port":   _self.Port,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -33,5 +53,6 @@ func (_self RequestModel) ToJSONItem(header string) map[string]string {
 | 
				
			|||||||
		header + "domain": _self.Domain,
 | 
							header + "domain": _self.Domain,
 | 
				
			||||||
		header + "method": _self.Method,
 | 
							header + "method": _self.Method,
 | 
				
			||||||
		header + "url":    _self.URL,
 | 
							header + "url":    _self.URL,
 | 
				
			||||||
 | 
							header + "port":   strconv.FormatInt(int64(_self.Port), 10),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -29,7 +29,7 @@
 | 
				
			|||||||
            import {AnPLoader} from "/ecma/AnPLoader.ecma.js";
 | 
					            import {AnPLoader} from "/ecma/AnPLoader.ecma.js";
 | 
				
			||||||
            import {AnP} from "/ecma/Application/AnP.ecma.js";
 | 
					            import {AnP} from "/ecma/Application/AnP.ecma.js";
 | 
				
			||||||
            import {Utils} from "/ecma/Utils/Utils.ecma.js";
 | 
					            import {Utils} from "/ecma/Utils/Utils.ecma.js";
 | 
				
			||||||
            import {WMarkDown} from "https://wmarkdown.local/ecma/WMarkDown.ecma.js";
 | 
					            import {WMarkDown} from "https://wmarkdown.gocal/ecma/WMarkDown.ecma.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            new AnPLoader({
 | 
					            new AnPLoader({
 | 
				
			||||||
                scripts : [[
 | 
					                scripts : [[
 | 
				
			||||||
@ -38,8 +38,8 @@
 | 
				
			|||||||
                ]], 
 | 
					                ]], 
 | 
				
			||||||
                styles : [[
 | 
					                styles : [[
 | 
				
			||||||
                    "/css/FontAwesome-6.7.2.css", 
 | 
					                    "/css/FontAwesome-6.7.2.css", 
 | 
				
			||||||
                    "https://wmarkdown.local/css/WMarkDown.icons.FontAwesome.css", 
 | 
					                    "https://wmarkdown.gocal/css/WMarkDown.icons.FontAwesome.css", 
 | 
				
			||||||
                    "https://wmarkdown.local/scss/WMarkDown.scss", 
 | 
					                    "https://wmarkdown.gocal/scss/WMarkDown.scss", 
 | 
				
			||||||
                    "/scss/AnP.scss"
 | 
					                    "/scss/AnP.scss"
 | 
				
			||||||
                ]]
 | 
					                ]]
 | 
				
			||||||
            }, () => {
 | 
					            }, () => {
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,7 @@ import {Components} from "./Components.ecma.js";
 | 
				
			|||||||
import {Check} from "../Utils/Check.ecma.js";
 | 
					import {Check} from "../Utils/Check.ecma.js";
 | 
				
			||||||
import {Utils} from "../Utils/Utils.ecma.js";
 | 
					import {Utils} from "../Utils/Utils.ecma.js";
 | 
				
			||||||
import {Patterns} from "../Utils/Patterns.ecma.js";
 | 
					import {Patterns} from "../Utils/Patterns.ecma.js";
 | 
				
			||||||
 | 
					import {EventsManager} from "../Managers/EventsManager.ecma.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @callback anp_preload_callback
 | 
					 * @callback anp_preload_callback
 | 
				
			||||||
@ -79,6 +80,12 @@ export const AnP = (function(){
 | 
				
			|||||||
            /** @type {number} */
 | 
					            /** @type {number} */
 | 
				
			||||||
            chain_length = 11;
 | 
					            chain_length = 11;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /** @type {EventsManager} */
 | 
				
			||||||
 | 
					        this.on_ready = new EventsManager({
 | 
				
			||||||
 | 
					            autoexecute : false, 
 | 
				
			||||||
 | 
					            times : 1
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {SettingsManager} */
 | 
					        /** @type {SettingsManager} */
 | 
				
			||||||
        this.settings = null;
 | 
					        this.settings = null;
 | 
				
			||||||
        /** @type {I18NManager} */
 | 
					        /** @type {I18NManager} */
 | 
				
			||||||
@ -133,16 +140,19 @@ export const AnP = (function(){
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            set_basics();
 | 
					            set_basics();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            self.settings.get("autostart") && self.start();
 | 
					            if(self.settings.get("autostart"))
 | 
				
			||||||
 | 
					                self.start(self.on_ready.execute);
 | 
				
			||||||
 | 
					            else 
 | 
				
			||||||
 | 
					                self.on_ready.execute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @returns {void}
 | 
					         * @returns {void}
 | 
				
			||||||
         * @access private
 | 
					         * @access private
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        const constructor = () => {
 | 
					        const constructor = () => {
 | 
				
			||||||
            if(Utils.get_value("debug_mode")){
 | 
					            if(Utils.get_value("debug_mode", inputs)){
 | 
				
			||||||
                try{
 | 
					                try{
 | 
				
			||||||
                    execute_constructor();
 | 
					                    execute_constructor();
 | 
				
			||||||
                }catch(exception){
 | 
					                }catch(exception){
 | 
				
			||||||
 | 
				
			|||||||
@ -49,13 +49,13 @@ export const Attributes = (function(){
 | 
				
			|||||||
        const self = this, 
 | 
					        const self = this, 
 | 
				
			||||||
              /** @type {Array.<string>} */
 | 
					              /** @type {Array.<string>} */
 | 
				
			||||||
              without_values = [
 | 
					              without_values = [
 | 
				
			||||||
                  "disabled", "readonly"
 | 
					                  "disabled", "readonly", "checked", "selected"
 | 
				
			||||||
              ], 
 | 
					              ], 
 | 
				
			||||||
              /** @type {Array.<string>} */
 | 
					              /** @type {Array.<string>} */
 | 
				
			||||||
              normals = [
 | 
					              normals = [
 | 
				
			||||||
                  "src", "class", "title", "id", "alt", "target", "href", "style", "lang", 
 | 
					                  "src", "class", "title", "id", "alt", "target", "href", "style", "lang", 
 | 
				
			||||||
                  "type", "name", "placeholder", "min", "max", "value", "step", "disabled", 
 | 
					                  "type", "name", "placeholder", "min", "max", "value", "step", "disabled", 
 | 
				
			||||||
                  "readonly"
 | 
					                  "readonly", "for", "checked", "selected", "method", "action"
 | 
				
			||||||
              ];
 | 
					              ];
 | 
				
			||||||
        /** @type {boolean} */
 | 
					        /** @type {boolean} */
 | 
				
			||||||
        let started = false;
 | 
					        let started = false;
 | 
				
			||||||
@ -203,6 +203,36 @@ export const Attributes = (function(){
 | 
				
			|||||||
            });
 | 
					            });
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @param {!(Object.<string, any|null>|Array.<any|null>)} attributes 
 | 
				
			||||||
 | 
					         * @param {?(string|Array.<string>)} [for_remove = null] 
 | 
				
			||||||
 | 
					         * @returns {Object.<string, any|null>}
 | 
				
			||||||
 | 
					         * @access public
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.get_for_input = (attributes, for_remove = null) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /** @type {string|null} */
 | 
				
			||||||
 | 
					            let text = Utils.get_value(["text", "title", "placeholder"], attributes = Utils.get_dictionary(attributes));
 | 
				
			||||||
 | 
					            /** @type {string|null} */
 | 
				
			||||||
 | 
					            const i18n = Utils.get_value(["i18n", "name"], attributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(i18n){
 | 
				
			||||||
 | 
					                text = anp.i18n.get([text, i18n]);
 | 
				
			||||||
 | 
					                attributes.i18n = i18n;
 | 
				
			||||||
 | 
					                attributes.i18n_without || (attributes.i18n_without = true);
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					            if(!Check.is_null_or_undefined(text)){
 | 
				
			||||||
 | 
					                attributes.placeholder = text + "...";
 | 
				
			||||||
 | 
					                attributes.title = text;
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            Attributes.remove(attributes, ["text"].concat(
 | 
				
			||||||
 | 
					                for_remove ? Check.is_array(for_remove) ? for_remove : [for_remove] : []
 | 
				
			||||||
 | 
					            ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return attributes;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        constructor();
 | 
					        constructor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@ -256,5 +286,17 @@ export const Attributes = (function(){
 | 
				
			|||||||
            return item;
 | 
					            return item;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param {!(string|Array.<string>)} i18n 
 | 
				
			||||||
 | 
					     * @param {!string} suffix 
 | 
				
			||||||
 | 
					     * @returns {string|Array.<string>|null}
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     * @static
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    Attributes.i18n_add_suffix = (i18n, suffix) => (
 | 
				
			||||||
 | 
					        Check.is_string(i18n) ? i18n + "_" + suffix : 
 | 
				
			||||||
 | 
					        Check.is_array(i18n) ? Utils.get_keys(i18n).map(key => key + "_" + suffix) : 
 | 
				
			||||||
 | 
					    null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return Attributes;
 | 
					    return Attributes;
 | 
				
			||||||
})();
 | 
					})();
 | 
				
			||||||
@ -121,31 +121,40 @@ export const Components = (function(){
 | 
				
			|||||||
        const set_childs = childs => Check.is_string(childs[0]) ? [childs] : childs;
 | 
					        const set_childs = childs => Check.is_string(childs[0]) ? [childs] : childs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @param {...Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>|null} items 
 | 
					         * @param {...([string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>]|null)} items 
 | 
				
			||||||
         * @returns {string}
 | 
					         * @returns {string}
 | 
				
			||||||
         * @access public
 | 
					         * @access public
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        this.set = (...items) => items.reduce((html, [tag, attributes, childs]) => {
 | 
					        this.set = (...items) => items.reduce((html, data) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            const subitem = (
 | 
					            /** @type {string} */
 | 
				
			||||||
 | 
					            let subitem = ``;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(data){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                /** @type {[string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>]} */
 | 
				
			||||||
 | 
					                const [tag, attributes, childs] = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                subitem = (
 | 
				
			||||||
                    self[tag] && (!attributes || !attributes.built) ? self[tag](...Utils.get_array(attributes)) : 
 | 
					                    self[tag] && (!attributes || !attributes.built) ? self[tag](...Utils.get_array(attributes)) : 
 | 
				
			||||||
                `<` + tag + anp.attributes.create(attributes, null, "built") + `>` + (
 | 
					                `<` + tag + anp.attributes.create(attributes, null, "built") + `>` + (
 | 
				
			||||||
                    Check.is_array(childs) && childs.length ? self.set(...set_childs(childs)) : 
 | 
					                    Check.is_array(childs) && childs.length ? self.set(...set_childs(childs)) : 
 | 
				
			||||||
                    Check.is_null_or_undefined(childs) ? "" : 
 | 
					                    Check.is_null_or_undefined(childs) ? "" : 
 | 
				
			||||||
                "" + childs) + `</` + tag + `>`);
 | 
					                "" + childs) + `</` + tag + `>`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return html + (Check.is_array(subitem) ? self.set(...[subitem]) : subitem);
 | 
					            return html + (Check.is_array(subitem) ? self.set(...[subitem]) : subitem);
 | 
				
			||||||
        }, ``);
 | 
					        }, ``);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @param {!(string|HTMLElement)} item
 | 
					         * @param {!HTMLElement} item
 | 
				
			||||||
         * @param {...Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>|null>} items 
 | 
					         * @param {...Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>|null>} items 
 | 
				
			||||||
         * @returns {string}
 | 
					         * @returns {void}
 | 
				
			||||||
         * @access public
 | 
					         * @access public
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        this.set_to = (item, ...items) => {
 | 
					        this.set_direct_to = (item, ...items) => {
 | 
				
			||||||
            anp.preload(item, (item, asynchronous, ok) => {
 | 
					            items.forEach(([tag, attributes, childs]) => {
 | 
				
			||||||
                ok && items.forEach(([tag, attributes, childs]) => {
 | 
					 | 
				
			||||||
                if(self[tag] && (!attributes || !attributes.built)){
 | 
					                if(self[tag] && (!attributes || !attributes.built)){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    /** @type {string|Array.<any|null>|HTMLElement|NodeList} */
 | 
					                    /** @type {string|Array.<any|null>|HTMLElement|NodeList} */
 | 
				
			||||||
@ -154,7 +163,7 @@ export const Components = (function(){
 | 
				
			|||||||
                    if(Check.is_string(subitem))
 | 
					                    if(Check.is_string(subitem))
 | 
				
			||||||
                        item.innerHTML += subitem;
 | 
					                        item.innerHTML += subitem;
 | 
				
			||||||
                    else if(Check.is_array(subitem))
 | 
					                    else if(Check.is_array(subitem))
 | 
				
			||||||
                            self.set_to(item, subitem);
 | 
					                        self.set_direct_to(item, subitem);
 | 
				
			||||||
                    else if(Check.is_html_items(subitem))
 | 
					                    else if(Check.is_html_items(subitem))
 | 
				
			||||||
                        subitem.forEach(subnode => item.appendChild(subnode));
 | 
					                        subitem.forEach(subnode => item.appendChild(subnode));
 | 
				
			||||||
                    else if(Check.is_html_item(subitem))
 | 
					                    else if(Check.is_html_item(subitem))
 | 
				
			||||||
@ -166,13 +175,50 @@ export const Components = (function(){
 | 
				
			|||||||
                    const subitem = item.appendChild(document.createElement(tag));
 | 
					                    const subitem = item.appendChild(document.createElement(tag));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    anp.attributes.set(subitem, attributes, null, ["built"]);
 | 
					                    anp.attributes.set(subitem, attributes, null, ["built"]);
 | 
				
			||||||
                        Check.is_array(childs) && childs.length && self.set_to(subitem, ...set_childs(childs));
 | 
					                    if(!Check.is_null_or_undefined(childs)){
 | 
				
			||||||
 | 
					                        if(Check.is_array(childs))
 | 
				
			||||||
 | 
					                            childs.length && self.set_direct_to(subitem, ...set_childs(childs));
 | 
				
			||||||
 | 
					                        else 
 | 
				
			||||||
 | 
					                            subitem.innerHTML = childs;
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @param {!(string|HTMLElement)} item
 | 
				
			||||||
 | 
					         * @param {...Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>|null>} items 
 | 
				
			||||||
 | 
					         * @returns {void}
 | 
				
			||||||
 | 
					         * @access public
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.set_to = (item, ...items) => {
 | 
				
			||||||
 | 
					            anp.preload(item, (item, asynchronous, ok) => {
 | 
				
			||||||
 | 
					                ok && self.set_direct_to(item, ...items);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @param {!(string|HTMLElement)} item
 | 
				
			||||||
 | 
					         * @param {...Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>|null>} items 
 | 
				
			||||||
 | 
					         * @returns {void}
 | 
				
			||||||
 | 
					         * @access public
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.reset_to = (item, ...items) => {
 | 
				
			||||||
 | 
					            anp.preload(item, (item, asynchronous, ok) => {
 | 
				
			||||||
 | 
					                if(ok){
 | 
				
			||||||
 | 
					                    // [...item.childNodes].forEach(subitem => {
 | 
				
			||||||
 | 
					                    //     item.removeChild(subitem);
 | 
				
			||||||
 | 
					                    // });
 | 
				
			||||||
 | 
					                    item.innerHTML = ``;
 | 
				
			||||||
 | 
					                    setTimeout(() => {
 | 
				
			||||||
 | 
					                        console.log(item);
 | 
				
			||||||
 | 
					                        self.set_direct_to(item, ...items);
 | 
				
			||||||
 | 
					                    }, 1);
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @param {!(Object.<string, any|null>|Array.<any|null>)} inputs 
 | 
					         * @param {!(Object.<string, any|null>|Array.<any|null>)} inputs 
 | 
				
			||||||
         * @returns {Array.<any|null>}
 | 
					         * @returns {Array.<any|null>}
 | 
				
			||||||
@ -349,42 +395,77 @@ export const Components = (function(){
 | 
				
			|||||||
         * @returns {Array.<any|null>}
 | 
					         * @returns {Array.<any|null>}
 | 
				
			||||||
         * @access public
 | 
					         * @access public
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        this.buttons = (buttons, attributes = null, tag = "div") => self.group(buttons, Utils.get_dictionary([attributes, {
 | 
					        this.buttons = (buttons, attributes = null, tag = "div") => self.group(buttons.map(button => ["button", button]), Utils.get_dictionary([attributes, {
 | 
				
			||||||
            class : Attributes.join_classes("buttons", Utils.get_value(["class", "classes"], attributes))
 | 
					            class : Attributes.join_classes("buttons", Utils.get_value(["class", "classes"], attributes))
 | 
				
			||||||
        }]), tag);
 | 
					        }]), tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					 | 
				
			||||||
         * @param {?(Object.<string, any|null|Array.<any|null>)} [attributes = null] 
 | 
					 | 
				
			||||||
         * @param {?(Object.<string, any|null|Array.<any|null>)} [own_attributes = null] 
 | 
					 | 
				
			||||||
         * @returns {Array.<any|null>}
 | 
					 | 
				
			||||||
         * @access public
 | 
					 | 
				
			||||||
         */
 | 
					 | 
				
			||||||
        this.input = (attributes = null, own_attributes = null) => ["input", {
 | 
					 | 
				
			||||||
            ...Utils.get_dictionary(attributes), 
 | 
					 | 
				
			||||||
            ...Utils.get_dictionary(own_attributes), 
 | 
					 | 
				
			||||||
            built : true
 | 
					 | 
				
			||||||
        }];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @param {?(Object.<string, any|null|Array.<any|null>)} [attributes = null] 
 | 
					         * @param {?(Object.<string, any|null|Array.<any|null>)} [attributes = null] 
 | 
				
			||||||
         * @returns {Array.<any|null>}
 | 
					         * @returns {Array.<any|null>}
 | 
				
			||||||
         * @access public
 | 
					         * @access public
 | 
				
			||||||
         * @returns 
 | 
					         * @returns 
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        this.number = (attributes = null) => {
 | 
					        this.number = (attributes = null) => ["input", anp.attr.get_for_input([attributes, {
 | 
				
			||||||
 | 
					            type : "number", 
 | 
				
			||||||
 | 
					            class : Attributes.join_classes("input-field input-number", Utils.get_value(["class", "classes"], attributes))
 | 
				
			||||||
 | 
					        }], ["classes"])];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            /** @type {string} */
 | 
					        /**
 | 
				
			||||||
            const classes = Attributes.join_classes("input-field input-number", Utils.get_value(["class", "classes"], attributes));
 | 
					         * @param {!string} tag 
 | 
				
			||||||
 | 
					         * @param {?(string|Array.<string>)} i18n 
 | 
				
			||||||
 | 
					         * @param {?string} text 
 | 
				
			||||||
 | 
					         * @param {?(Object.<string, any|null>|Array.<any|null>)} [inputs = null] 
 | 
				
			||||||
 | 
					         * @returns {Array.<any|null>|null}
 | 
				
			||||||
 | 
					         * @access public
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.i18n_text = (tag, i18n, text, inputs = null) => (
 | 
				
			||||||
 | 
					            i18n ? self.i18n(i18n, tag, [{text : text}, inputs]) : 
 | 
				
			||||||
 | 
					            !Check.is_null_or_undefined(text) ? ["legend", inputs, text] : 
 | 
				
			||||||
 | 
					        null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Attributes.remove(attributes = Utils.get_dictionary(attributes), ["class", "classes"]);
 | 
					        /**
 | 
				
			||||||
 | 
					         * @param {!Object.<string, any|null>} attributes 
 | 
				
			||||||
 | 
					         * @returns {Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>|null}
 | 
				
			||||||
 | 
					         * @access private
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        const get_check_text = attributes => (
 | 
				
			||||||
 | 
					            !Check.is_null_or_undefined(attributes.i18n) ? ["i18n", [attributes.i18n, "span", attributes.title]] : 
 | 
				
			||||||
 | 
					            !Check.is_null_or_undefined(attributes.title) ? ["span", null, attributes.title] : 
 | 
				
			||||||
 | 
					        null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return ["span", {class : classes}, [
 | 
					        /**
 | 
				
			||||||
                ["input", {
 | 
					         * @param {!(Object.<string, any|null>|Array.<any|null>)} attributes 
 | 
				
			||||||
                    ...attributes, 
 | 
					         * @returns {Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>}
 | 
				
			||||||
                    type : "number"
 | 
					         * @access public
 | 
				
			||||||
                }]
 | 
					         */
 | 
				
			||||||
 | 
					        this.checkbox = attributes => ["label", {
 | 
				
			||||||
 | 
					            class : "checkbox", 
 | 
				
			||||||
 | 
					            ...(attributes.id ? {for : attributes.id} : {})
 | 
				
			||||||
 | 
					        }, [
 | 
				
			||||||
 | 
					            ["input", attributes = anp.attr.get_for_input([attributes, {
 | 
				
			||||||
 | 
					                type : "checkbox", 
 | 
				
			||||||
 | 
					                class : Attributes.join_classes("input-field input-check", Utils.get_value(["class", "classes"], attributes))
 | 
				
			||||||
 | 
					            }], ["classes", "placeholder"])], 
 | 
				
			||||||
 | 
					            ["icon", ["checkbox"]], 
 | 
				
			||||||
 | 
					            get_check_text(attributes)
 | 
				
			||||||
 | 
					        ]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @param {!(Object.<string, any|null>|Array.<any|null>)} attributes 
 | 
				
			||||||
 | 
					         * @returns {Array.<string, Object.<string, any|null>|Array.<any|null>|null>, Array.<Array.<any|null>>}
 | 
				
			||||||
 | 
					         * @access public
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.radio = attributes => ["label", {
 | 
				
			||||||
 | 
					            class : "radio-button", 
 | 
				
			||||||
 | 
					            ...(attributes.id ? {for : attributes.id} : {})
 | 
				
			||||||
 | 
					        }, [
 | 
				
			||||||
 | 
					            ["input", attributes = anp.attr.get_for_input([attributes, {
 | 
				
			||||||
 | 
					                type : "radio", 
 | 
				
			||||||
 | 
					                class : Attributes.join_classes("input-field input-radio", Utils.get_value(["class", "classes"], attributes))
 | 
				
			||||||
 | 
					            }], ["classes", "placeholder"])], 
 | 
				
			||||||
 | 
					            ["icon", ["radio_button"]], 
 | 
				
			||||||
 | 
					            get_check_text(attributes)
 | 
				
			||||||
        ]];
 | 
					        ]];
 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        constructor();
 | 
					        constructor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -224,14 +224,23 @@ export const BaseComponent = (function(){
 | 
				
			|||||||
            /** @type {Array.<any|null>} */
 | 
					            /** @type {Array.<any|null>} */
 | 
				
			||||||
            const licenses = anp.settings.get(["application_licenses", "application_license", "licenses", "license"], inputs, []), 
 | 
					            const licenses = anp.settings.get(["application_licenses", "application_license", "licenses", "license"], inputs, []), 
 | 
				
			||||||
                  /** @type {Object.<string, any|null>} */
 | 
					                  /** @type {Object.<string, any|null>} */
 | 
				
			||||||
                  attributes = get_attributes(inputs);
 | 
					                  attributes = get_attributes(inputs), 
 | 
				
			||||||
 | 
					                  /** @type {string} */
 | 
				
			||||||
 | 
					                  link = anp.settings.get([
 | 
				
			||||||
 | 
					                      "application_web", "application_website", "application_link", "application_url", 
 | 
				
			||||||
 | 
					                      "web", "website", "link", "url"
 | 
				
			||||||
 | 
					                  ], inputs, "/"), 
 | 
				
			||||||
 | 
					                  /** @type {string|Array.<string>} */
 | 
				
			||||||
 | 
					                  logo = anp.settings.get(["application_logo", "logo"], inputs, "/images/AnP.png"), 
 | 
				
			||||||
 | 
					                  /** @type {string} */
 | 
				
			||||||
 | 
					                  name = anp.settings.get(["application_name", "name"], inputs, "AnP");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return anp.components.set(["div", attributes, [
 | 
					            return anp.components.set(["div", attributes, [
 | 
				
			||||||
                ["header", null, [
 | 
					                ["header", null, [
 | 
				
			||||||
                    ["h1", {class : "logo", title : "AnP"}, [
 | 
					                    ["h1", {class : "logo", title : name}, [
 | 
				
			||||||
                        ["a", {href : "https://anp.k3y.pw/", target : "_blank"}, [
 | 
					                        ["a", {href : link, target : "_blank"}, [
 | 
				
			||||||
                            ["image", {sources : "/images/AnP.png", title : "AnP"}],
 | 
					                            ["image", {sources : logo, title : name}],
 | 
				
			||||||
                            ["span", {class : "text"}, "AnP"]
 | 
					                            ["span", {class : "text"}, name]
 | 
				
			||||||
                        ]]
 | 
					                        ]]
 | 
				
			||||||
                    ]]
 | 
					                    ]]
 | 
				
			||||||
                ]],
 | 
					                ]],
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,9 @@
 | 
				
			|||||||
"use strict";
 | 
					"use strict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {Check} from "../Utils/Check.ecma.js";
 | 
				
			||||||
 | 
					import {Utils} from "../Utils/Utils.ecma.js";
 | 
				
			||||||
 | 
					import {Attributes} from "../Application/Attributes.ecma.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @typedef {import("../Application/AnP.ecma.js").AnP} AnP
 | 
					 * @typedef {import("../Application/AnP.ecma.js").AnP} AnP
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -56,22 +60,137 @@ export const FormsComponent = (function(){
 | 
				
			|||||||
         * @access public
 | 
					         * @access public
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        this.build = inputs => {
 | 
					        this.build = inputs => {
 | 
				
			||||||
            return anp.comp.set(["form", {}, [
 | 
					
 | 
				
			||||||
 | 
					            /** @type {string|null} */
 | 
				
			||||||
 | 
					            const i18n = Utils.get_value("i18n", inputs), 
 | 
				
			||||||
 | 
					                  /** @type {string|null} */
 | 
				
			||||||
 | 
					                  text = Utils.get_value("text", inputs, Check.is_array(i18n) ? i18n[0] : i18n);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return ["form", {
 | 
				
			||||||
 | 
					                class : "form", 
 | 
				
			||||||
 | 
					                on_submit : (item, event) => false, 
 | 
				
			||||||
 | 
					                method : "get", 
 | 
				
			||||||
 | 
					                action : "#"
 | 
				
			||||||
 | 
					            }, [
 | 
				
			||||||
                ["fieldset", null, [
 | 
					                ["fieldset", null, [
 | 
				
			||||||
                    ["legend", null, "LEGEND"], 
 | 
					                    anp.comp.i18n_text("legend", i18n, text), 
 | 
				
			||||||
                    ["p", null, "PARAGRAPH"], 
 | 
					                    anp.comp.i18n_text("p", Attributes.i18n_add_suffix(i18n, "text"), Utils.get_value("description", inputs, text)), 
 | 
				
			||||||
                    ["div", {class : "structure"}, Utils.get_value("structure", inputs, []).reduce((structure, item) => {
 | 
					                    ["div", {class : "structure"}, Utils.get_array(Utils.get_value("structure", inputs, [])).reduce((structure, item, i) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        /** @type {[string|null, boolean]} */
 | 
				
			||||||
 | 
					                        const [type, is_array] = (
 | 
				
			||||||
 | 
					                                  Check.is_array(item) ? [Check.is_string(item[0]) ? item[0] : null, true] : 
 | 
				
			||||||
 | 
					                                  Check.is_dictionary(item) ? [Check.is_string(item.type) ? item.type : null, false] : 
 | 
				
			||||||
 | 
					                              [null, false]), 
 | 
				
			||||||
 | 
					                              /** @type {string|null} */
 | 
				
			||||||
 | 
					                              name = Utils.get_value(["name", "i18n"], item), 
 | 
				
			||||||
 | 
					                              /** @type {string|null} */
 | 
				
			||||||
 | 
					                              i18n = Utils.get_value(["i18n", "name"], item), 
 | 
				
			||||||
 | 
					                              /** @type {string} */
 | 
				
			||||||
 | 
					                              id = Utils.get_value("id", item) || anp.random_chain(), 
 | 
				
			||||||
 | 
					                              /** @type {string|null} */
 | 
				
			||||||
 | 
					                              text = Utils.get_value("text", item);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        structure.push(["div", {
 | 
				
			||||||
 | 
					                            data_field : Utils.get_value("name", item, id), 
 | 
				
			||||||
 | 
					                            data_i : i
 | 
				
			||||||
 | 
					                        }, [
 | 
				
			||||||
 | 
					                            ["label", {for : id}, [
 | 
				
			||||||
 | 
					                                anp.comp.i18n(i18n, "span", text), 
 | 
				
			||||||
 | 
					                                anp.comp.i18n_text("span", 
 | 
				
			||||||
 | 
					                                    Attributes.i18n_add_suffix(i18n, "description"), 
 | 
				
			||||||
 | 
					                                    Utils.get_value("description", item, text)
 | 
				
			||||||
 | 
					                                )
 | 
				
			||||||
 | 
					                            ]], 
 | 
				
			||||||
 | 
					                            ["span", {class : "input"}, anp.comp[type] ? [anp.comp[type]([item, {id : id}])] : null], 
 | 
				
			||||||
 | 
					                            ["ul", {class : "errors"}]
 | 
				
			||||||
 | 
					                        ]]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        return structure;
 | 
					                        return structure;
 | 
				
			||||||
                    }, [])], 
 | 
					                    }, [])], 
 | 
				
			||||||
                    ["ul", {class : "errors"}], 
 | 
					                    ["ul", {class : "errors"}], 
 | 
				
			||||||
                    anp.comp.buttons()
 | 
					                    anp.comp.buttons(Utils.get_array(Utils.get_value(["buttons", "actions"], inputs, [])))
 | 
				
			||||||
                ]]
 | 
					                ]]
 | 
				
			||||||
            ]]);
 | 
					            ]];
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @param {!(HTMLFormElement|HTMLElement)} form 
 | 
				
			||||||
 | 
					         * @returns {Object.<string, any|null>}
 | 
				
			||||||
 | 
					         * @access public
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.get_data = form => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /** @type {Object.<string, any|null>} */
 | 
				
			||||||
 | 
					            const data = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            (form = FormsComponent.get(form)) && 
 | 
				
			||||||
 | 
					            form.querySelectorAll("[name]").forEach(item => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                /** @type {string} */
 | 
				
			||||||
 | 
					                const name_attribute = item.getAttribute("name"), 
 | 
				
			||||||
 | 
					                      /** @type {boolean} */
 | 
				
			||||||
 | 
					                      is_array = name_attribute.slice(-2) == "[]", 
 | 
				
			||||||
 | 
					                      /** @type {string} */
 | 
				
			||||||
 | 
					                      name = is_array ? name_attribute.slice(0, -2) : name_attribute;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if(is_array)
 | 
				
			||||||
 | 
					                    (data[name] || (data[name] = [])).push(self.get_value(item));
 | 
				
			||||||
 | 
					                else 
 | 
				
			||||||
 | 
					                    data[name] = self.get_value(item);
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return data;
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * @param {!HTMLElement} item 
 | 
				
			||||||
 | 
					         * @returns {any|null}
 | 
				
			||||||
 | 
					         * @access public
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        this.get_value = (item) => {
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            /** @type {string} */
 | 
				
			||||||
 | 
					            const type = item.getAttribute("type"), 
 | 
				
			||||||
 | 
					                  /** @type {string} */
 | 
				
			||||||
 | 
					                  tag = item.tagName.toLowerCase();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return (
 | 
				
			||||||
 | 
					                type == "number" ? Number(item.value) : 
 | 
				
			||||||
 | 
					                type == "date" ? new Date(item.value) : 
 | 
				
			||||||
 | 
					                ["radio", "checkbox"].includes(type) ? item.checked : 
 | 
				
			||||||
 | 
					            item.value);
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        constructor();
 | 
					        constructor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param {!HTMLElement} form 
 | 
				
			||||||
 | 
					     * @returns {HTMLFormElement|null}
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     * @static
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    FormsComponent.get = form => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(form){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /** @type {HTMLFormElement} */
 | 
				
			||||||
 | 
					            const child = form.querySelector && form.querySelector("form.form");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(child)
 | 
				
			||||||
 | 
					                form = child;
 | 
				
			||||||
 | 
					            else 
 | 
				
			||||||
 | 
					                while((
 | 
				
			||||||
 | 
					                    (form.tagName && form.tagName.toLowerCase() != "form") || 
 | 
				
			||||||
 | 
					                    (form.classList && !form.classList.contains("form"))
 | 
				
			||||||
 | 
					                ) && (form = form.parentNode));
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return form || null;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return FormsComponent;
 | 
					    return FormsComponent;
 | 
				
			||||||
})();
 | 
					})();
 | 
				
			||||||
@ -25,18 +25,31 @@ export const EventsManager = (function(){
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    const EventsManager = function(inputs = null){
 | 
					    const EventsManager = function(inputs = null){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {Array.<anp_events_manager_callback|null>} */
 | 
					        /** @type {Array.<Array.<anp_events_manager_callback|null, number>>} */
 | 
				
			||||||
        const events = [];
 | 
					        const events = [], 
 | 
				
			||||||
 | 
					              /** @type {EventsManager} */
 | 
				
			||||||
 | 
					              self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** @type {boolean} */
 | 
					        /** @type {boolean} */
 | 
				
			||||||
        this.autoexecute = Utils.get_value("autoexecute", inputs, false);
 | 
					        this.autoexecute = Utils.get_value("autoexecute", inputs, false);
 | 
				
			||||||
 | 
					        this.times = Utils.get_value("times", inputs, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @param  {...any} [parameters] 
 | 
					         * @param  {...any} [parameters] 
 | 
				
			||||||
         * @returns {Array.<any|null>}
 | 
					         * @returns {Array.<any|null>}
 | 
				
			||||||
         * @access public
 | 
					         * @access public
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        this.execute = (...parameters) => events.map(callback => callback ? callback(...parameters) : null);
 | 
					        this.execute = (...parameters) => events.map((event, i) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            let value = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(event){
 | 
				
			||||||
 | 
					                value = Utils.execute(event[0], ...parameters);
 | 
				
			||||||
 | 
					                self.times && ++ event[1] >= self.times && (events[i] = null);
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return value;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @param {!anp_events_manager_callback} callback 
 | 
					         * @param {!anp_events_manager_callback} callback 
 | 
				
			||||||
@ -53,7 +66,9 @@ export const EventsManager = (function(){
 | 
				
			|||||||
            while(++ i < l)
 | 
					            while(++ i < l)
 | 
				
			||||||
                if(!events[i])
 | 
					                if(!events[i])
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
            events[i] = callback;
 | 
					            events[i] = [callback, 0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self.autoexecute && self.execute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return i;
 | 
					            return i;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
				
			|||||||
@ -133,5 +133,13 @@ export const Check = (function(){
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    Check.is_number = item => typeof item == "number";
 | 
					    Check.is_number = item => typeof item == "number";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * @param {?any} item 
 | 
				
			||||||
 | 
					     * @returns {boolean}
 | 
				
			||||||
 | 
					     * @access public
 | 
				
			||||||
 | 
					     * @static
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    Check.is_integer = item => Check.is_number(item) && item == item >> 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return Check;
 | 
					    return Check;
 | 
				
			||||||
})();
 | 
					})();
 | 
				
			||||||
@ -4,19 +4,26 @@
 | 
				
			|||||||
    &,button,input,select,textarea{color : map-deep-get($color, $mode, fore);}
 | 
					    &,button,input,select,textarea{color : map-deep-get($color, $mode, fore);}
 | 
				
			||||||
    button,input,select,textarea{background-color : map-deep-get($color, $mode, input-back);}
 | 
					    button,input,select,textarea{background-color : map-deep-get($color, $mode, input-back);}
 | 
				
			||||||
    [role=link],[data-role=link],a[href]{
 | 
					    [role=link],[data-role=link],a[href]{
 | 
				
			||||||
        &[disabled]{color : map-deep-get($color, grey);}
 | 
					        // &[disabled]{color : map-deep-get($color, grey);}
 | 
				
			||||||
        &[readonly]{color : map-deep-get($color, $mode, fore);}
 | 
					        &[readonly]{color : map-deep-get($color, $mode, fore);}
 | 
				
			||||||
        &:not([disabled],[readonly]){
 | 
					        &:not([disabled],[readonly]){
 | 
				
			||||||
            color : map-deep-get($color, $mode, primary);
 | 
					            color : map-deep-get($color, $mode, primary);
 | 
				
			||||||
            &:hover{color : map-deep-get($color, $mode, secondary);}
 | 
					            &:hover{color : map-deep-get($color, $mode, secondary);}
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    [role=button],[data-role=button],button,[type=button],[type=submit],[type=reset]{
 | 
					    .checkbox,.radio-button{&:not([data-disabled]){
 | 
				
			||||||
        &[disabled]{
 | 
					        color : mix(map-deep-get($color, $mode, fore), map-deep-get($color, $mode, primary), 50%);
 | 
				
			||||||
            border-color : map-deep-get($color, grey);
 | 
					        &:hover>[type=checkbox]~span{
 | 
				
			||||||
            color : map-deep-get($color, grey);
 | 
					            color : mix(map-deep-get($color, $mode, fore), map-deep-get($color, $mode, secondary), 50%);
 | 
				
			||||||
            box-shadow : 0em 0em .4em inset map-deep-get($color, grey);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        &[data-readonly]{color : map-deep-get($color, $mode, fore);}
 | 
				
			||||||
 | 
					    }}
 | 
				
			||||||
 | 
					    [role=button],[data-role=button],button,[type=button],[type=submit],[type=reset]{
 | 
				
			||||||
 | 
					        // &[disabled]{
 | 
				
			||||||
 | 
					        //     border-color : map-deep-get($color, grey);
 | 
				
			||||||
 | 
					        //     color : map-deep-get($color, grey);
 | 
				
			||||||
 | 
					        //     box-shadow : 0em 0em .4em inset map-deep-get($color, grey);
 | 
				
			||||||
 | 
					        // }
 | 
				
			||||||
        &[readonly]{
 | 
					        &[readonly]{
 | 
				
			||||||
            border-color : map-deep-get($color, $mode, fore);
 | 
					            border-color : map-deep-get($color, $mode, fore);
 | 
				
			||||||
            color : map-deep-get($color, $mode, fore);
 | 
					            color : map-deep-get($color, $mode, fore);
 | 
				
			||||||
@ -33,6 +40,11 @@
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    textarea,[type=text],[type=number],[type=date],[type=password]{&:not([disabled]){
 | 
				
			||||||
 | 
					        border-color : mix(map-deep-get($color, $mode, fore), map-deep-get($color, $mode, primary), 50%);
 | 
				
			||||||
 | 
					        &:focus,&:hover{border-color : mix(map-deep-get($color, $mode, fore), map-deep-get($color, $mode, secondary), 50%);}
 | 
				
			||||||
 | 
					        &[readonly]{border-color : map-deep-get($color, $mode, fore);}
 | 
				
			||||||
 | 
					    }}
 | 
				
			||||||
    header,footer{box-shadow : 
 | 
					    header,footer{box-shadow : 
 | 
				
			||||||
        0em 0em 1em map-deep-get($color, $mode, back), 
 | 
					        0em 0em 1em map-deep-get($color, $mode, back), 
 | 
				
			||||||
        0em 0em 1.25em map-deep-get($color, $mode, back), 
 | 
					        0em 0em 1.25em map-deep-get($color, $mode, back), 
 | 
				
			||||||
@ -58,16 +70,50 @@
 | 
				
			|||||||
        font-family : $font-icon;
 | 
					        font-family : $font-icon;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .checkbox,.radio-button{input{display : none;}}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    a[href]{text-decoration : none;}
 | 
					    a[href]{text-decoration : none;}
 | 
				
			||||||
    [role=link],[role=button],[data-role=link],[data-role=button],a[href],button,[type=button],[type=submit],[type=reset]{&:not([disabled],[readonly]){
 | 
					    [role=link],[data-role=link],a[href],
 | 
				
			||||||
 | 
					    [role=button],[data-role=button],button,[type=button],[type=submit],[type=reset]{
 | 
				
			||||||
 | 
					        &:not([disabled],[readonly]){
 | 
				
			||||||
            cursor : pointer;
 | 
					            cursor : pointer;
 | 
				
			||||||
            transition-duration : $transition-out;
 | 
					            transition-duration : $transition-out;
 | 
				
			||||||
            transition-property : color;
 | 
					            transition-property : color;
 | 
				
			||||||
            &:hover{transition-duration : $transition-in;}
 | 
					            &:hover{transition-duration : $transition-in;}
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        &[disabled]{color : map-deep-get($color, grey);}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    .checkbox,.radio-button{
 | 
				
			||||||
 | 
					        &>input:not([disabled],[readonly]){&~span{
 | 
				
			||||||
 | 
					            cursor : pointer;
 | 
				
			||||||
 | 
					            transition-duration : $transition-out;
 | 
				
			||||||
 | 
					            transition-property : color;
 | 
				
			||||||
        }}
 | 
					        }}
 | 
				
			||||||
    [role=button],[data-role=button],button,[type=button],[type=submit],[type=reset],[type=text],[type=number],[type=date],[type=password],textarea{
 | 
					        &:hover>input:not([disabled],[readonly]){&~span{
 | 
				
			||||||
 | 
					            transition-duration : $transition-in;
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					        &>input[disabled]{color : map-deep-get($color, grey);}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    &.anp{
 | 
				
			||||||
 | 
					        [role=link],[data-role=link],a[href],
 | 
				
			||||||
 | 
					        [role=button],[data-role=button],button,[type=button],[type=submit],[type=reset]{
 | 
				
			||||||
 | 
					            &[disabled]{color : map-deep-get($color, grey);}
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    textarea,[type=text],[type=number],[type=date],[type=password]{&:not([disabled],[readonly]){
 | 
				
			||||||
 | 
					        transition-duration : $transition-out;
 | 
				
			||||||
 | 
					        transition-property : color,border-color;
 | 
				
			||||||
 | 
					        &:focus{
 | 
				
			||||||
 | 
					            outline : none;
 | 
				
			||||||
 | 
					            transition-duration : $transition-in;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }}
 | 
				
			||||||
 | 
					    [role=button],[data-role=button],
 | 
				
			||||||
 | 
					    button,[type=button],[type=submit],[type=reset],
 | 
				
			||||||
 | 
					    textarea,[type=text],[type=number],[type=date],[type=password]{
 | 
				
			||||||
        padding : .1em .4em;
 | 
					        padding : .1em .4em;
 | 
				
			||||||
        border-width : .1em;
 | 
					        border-width : .1em;
 | 
				
			||||||
 | 
					        color : map-deep-get($color, grey);
 | 
				
			||||||
        border-style : solid;
 | 
					        border-style : solid;
 | 
				
			||||||
        border-color : map-deep-get($color, grey);
 | 
					        border-color : map-deep-get($color, grey);
 | 
				
			||||||
        border-radius : $border-radius;
 | 
					        border-radius : $border-radius;
 | 
				
			||||||
@ -77,11 +123,20 @@
 | 
				
			|||||||
        transition-property : color,border-color,background-color,box-shadow;
 | 
					        transition-property : color,border-color,background-color,box-shadow;
 | 
				
			||||||
    }}
 | 
					    }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    textarea,select,[type=text],[type=number],[type=date],[type=password]{
 | 
				
			||||||
 | 
					        width : 100%;
 | 
				
			||||||
 | 
					        box-sizing : border-box;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .group{
 | 
					    .group{
 | 
				
			||||||
        &>*{&,&>*{border-radius : 0em;}}
 | 
					        &>*{&,&>*{border-radius : 0em;}}
 | 
				
			||||||
        &>:first-child{&,&>:first-child{border-radius : $border-radius 0em 0em $border-radius;}}
 | 
					        &>:first-child{&,&>:first-child{border-radius : $border-radius 0em 0em $border-radius;}}
 | 
				
			||||||
        &>:last-child{&,&>:last-child{border-radius : 0em $border-radius $border-radius 0em;}}
 | 
					        &>:last-child{&,&>:last-child{border-radius : 0em $border-radius $border-radius 0em;}}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    .buttons{
 | 
				
			||||||
 | 
					        width : 100%;
 | 
				
			||||||
 | 
					        text-align : center;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [data-visible=false]{display : none;}
 | 
					    [data-visible=false]{display : none;}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -220,4 +275,45 @@
 | 
				
			|||||||
        right : 0em;
 | 
					        right : 0em;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    form.form{
 | 
				
			||||||
 | 
					        display : block;
 | 
				
			||||||
 | 
					        position : relative;
 | 
				
			||||||
 | 
					        &>fieldset{
 | 
				
			||||||
 | 
					            border : none;
 | 
				
			||||||
 | 
					            &>legend{
 | 
				
			||||||
 | 
					                font-size : 1.5em;
 | 
				
			||||||
 | 
					                font-weight : 900;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        .structure{
 | 
				
			||||||
 | 
					            display : table;
 | 
				
			||||||
 | 
					            width : 100%;
 | 
				
			||||||
 | 
					            box-sizing : border-box;
 | 
				
			||||||
 | 
					            &>div{
 | 
				
			||||||
 | 
					                display : table-row;
 | 
				
			||||||
 | 
					                &>*{
 | 
				
			||||||
 | 
					                    display : table-cell;
 | 
				
			||||||
 | 
					                    padding : 1em .3em;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                &>:first-child{
 | 
				
			||||||
 | 
					                    padding-left : 1em;
 | 
				
			||||||
 | 
					                    width  :30%;
 | 
				
			||||||
 | 
					                    min-width : 30%;
 | 
				
			||||||
 | 
					                    max-width : 50%;
 | 
				
			||||||
 | 
					                    text-align : right;
 | 
				
			||||||
 | 
					                    span{display : block;}
 | 
				
			||||||
 | 
					                    &>:first-child{
 | 
				
			||||||
 | 
					                        font-weight : 900;
 | 
				
			||||||
 | 
					                        &::after{content : ":";}
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    &>:last-child{font-size : .85em;}
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                &>:nth-child(2){width : 100%;}
 | 
				
			||||||
 | 
					                &>:last-child{
 | 
				
			||||||
 | 
					                    padding-right : 1em;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -33,4 +33,13 @@
 | 
				
			|||||||
        &[data-gui-mode=#{$mode}] [data-icon=gui_mode]::before{content : unicode($code); font-family : "FA6FS";}
 | 
					        &[data-gui-mode=#{$mode}] [data-icon=gui_mode]::before{content : unicode($code); font-family : "FA6FS";}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .checkbox input{
 | 
				
			||||||
 | 
					        &+[data-icon]::before{content : unicode("f0c8"); font-family : "FA6FR";}
 | 
				
			||||||
 | 
					        &:checked+[data-icon]::before{content : unicode("f14a"); font-family : "FA6FR";}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    .radio-button input{
 | 
				
			||||||
 | 
					        &+[data-icon]::before{content : unicode("f111"); font-family : "FA6FR";}
 | 
				
			||||||
 | 
					        &:checked+[data-icon]::before{content : unicode("f192"); font-family : "FA6FR";}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user