Järjestelmäviesti:Gadget-Lomakkeet.js

Huomautus: Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.

  • Firefox ja Safari: Napsauta Shift-näppäin pohjassa Päivitä, tai paina Ctrl-F5 tai Ctrl-R (⌘-R Macilla)
  • Google Chrome: Paina Ctrl-Shift-R (⌘-Shift-R Macilla)
  • Edge: Napsauta Ctrl-näppäin pohjassa Päivitä tai paina Ctrl-F5
(function () {
    if ( mw.config.get("wgPageName").startsWith("Wikisanakirja") ||
         mw.config.get("wgPageName").startsWith("Käyttäjä") ) {
        jQuery(document).ready(function ($) {
            var $formDivs = $(".oual-form");
            console.log("Lomake 0.1");
            
            $formDivs.each(function () {
                var $this = $(this),
                    $form = $('<form name="createbox" class="createbox oual-form" action="/w/index.php" method="get"></form>'),
                    $inpTitle,
                    openInNewTab = true,
                    checkedPages = {},    // Sivut joiden olemassaolo on tarkistettu jo (true/false).
                    index = 1,            // elementin järjestys
                    setTooltip = function ($elem, $hint) {
                        $hint.hide();
                        
                        $elem.on("focus", function () {
                            $hint.show();
                        });
                        $elem.on("blur", function () {
                            $hint.hide();
                        });
                        $hint.on("click", function () {
                            $hint.hide();
                        });
                    };

                if ( openInNewTab ) {
                    $form.attr("target", "_blank");
                }
                
                // Luetaan lomakekohtaiset elementit.
                $this.find(".oual-input").each(function () {
                    var $this = $(this),
                        $label,
                        $input,
                        $hint,
                        $datalist,
                        params,
                        ex;

                    try {
                        params = JSON.parse($this.html());
                    } catch ( ex ) {
                        $this.replaceWith('<span class="error">&lt;' + ex + ': ' + $this.text() + '&gt;</span>');
                        return;
                    }

                    if ( $this.hasClass("oual-title") ) {  // Laatikko sivun nimen syöttöön
                        $input = $('<input type="text" />');
                        $input.attr("size", params.leveys);
                        $inpTitle = $input;
                        
                        (function () {
                            var $parent = $this.parent().parent(), // div
                                $lnk    = $parent.find('a'),
                                $cnt    = $lnk.parent(),
                                $loader = $parent.find('img').parent();
                            
                            $input.on('focus', function () {
                                // Piilotetaan sivulinkki.
                                //$cnt.hide();
                            });
                            
                            $input.on('blur', function () {
                                var $this = $(this),
                                    title = $this.val(),
                                    q = {
                                        action: 'render',
                                        title: title,
                                    },
                                    url = mw.config.get("wgServer") + mw.config.get("wgScript"),
                                    f_success = function () {
                                        console.log("success");
                                        checkedPages[title] = true;
                                        $cnt.show();
                                        $loader.hide();
                                        $lnk.attr("href", mw.config.get("wgArticlePath").replace("$1", title));
                                        $lnk.html(title);
                                    },
                                    f_fail = function () {
                                        console.log("fail");
                                        checkedPages[title] = false;
                                        $cnt.hide();
                                        $loader.hide();
                                    };

                                if ( title ) {
                                    if ( checkedPages[title] ) {
                                        f_success();
                                    } else {
                                        $cnt.hide();
                                        $loader.show();
                                        $.get(url, q).done(function (resp) {
                                            f_success();
                                        }).fail(function (resp) {
                                            f_fail();  
                                        });
                                    }
                                }
                            });
                        }());
                    } else if ( $this.hasClass("oual-text") ) {  // Tekstilaatikko, jossa on oletusarvoja.
                        $input = $('<input type="text" />');
                        if ( params.values ) {
                            $datalist = $('<datalist></datalist>');
                            $datalist.attr("id", "datalist-" + Math.floor(Math.random(1) * 100000));
                            $form.append($datalist);
                            $datalist.append(params.values.map(function (opt) { return $("<option></option>").append(opt); }));
                            $input.attr("list", $datalist.attr("id"));
                        }
                        $input.attr("size", params.leveys);
                    } else if ( $this.hasClass("oual-list") ) {
                        $input = $('<select></select>');
                        $input.append(params.values.map(function (opt) { return $("<option></option>").append(opt); }));
                    } else if ( $this.hasClass("oual-checkbox") ) {
                        $input = $('<input type="checkbox" />');
                        params.valinnainen = true; // checkbox voi aina olla tyhjä
                    } else if ( $this.hasClass("oual-submit") ) {
                        $input = $('<input type="submit" />');
                        $input.attr("class", params.class);
                    } else if ( $this.hasClass("oual-hidden") ) {
                        $input = $('<input type="hidden" />');
                        params.valinnainen = true; // voi olla aina tyhjä, koska käyttäjä ei pääse vaikuttamaan
                    } else {
                        $input = $('<span class="error">Tuntematon elementti: ' + $this.attr('class') + '.</span>');
                    }

					$hint = $this.next(".oual-hint");
                    if ( !params.nimi ) {
                        $input.attr("name", "preloadparams[]");
                        $input.attr("index", index);
                        $hint.html($hint.html() + " [Parametri <strong>$" + index + "</strong>]");
                        index += 1;
                    } else {
                        $input.attr("name", params.nimi);
                		// Suhteellinen sivunnimi absoluuttiseksi.
                		if ( params.nimi === "preload" && params.arvo && params.arvo[0] === "/" ) {
                    		params.arvo = mw.config.get("wgPageName") + params.arvo;
                		}
                    }

                    $input.attr("null", params.valinnainen);
                    $input.val(params.arvo || "");
                    setTooltip($input, $hint);
                    if ( params.selite ) {
                        $label = $('<label></label>');
                        $label.html(params.selite || "");
                        $label.append([ " ", $input ]);
                        if ( params["teksti/leveys"] ) {
                        	$label.css("display", "inline-block");
                        	$label.css("width", parseInt(params["selite/leveys"]) + "em");
                        }
                        $input = $label;
                    }

                    $this.replaceWith($input);
                });

                $this.after($form);
                $form.append($this.children());
                $this.remove();
                
                $form.on("submit", function (e) {
                    var $first = null;
                    console.log("submit");
                    $(this).find("input").each(function () {
                        var $this = $(this);
                        if ( $this.val() === "" && !$this.attr("null") ) {
                		    console.log("seis " + $this.attr("name"));
                            $this.css("border-color", "red");
                            $first = $first || $this;
                            e.preventDefault();
                        } else {
                            $this.css("border-color", "");
                        }
                    });
                    $first = $first || $inpTitle;
                    $first.focus();
                });

            });
        }); // jQuery().ready()
    } // ajoehdot
}());