לדלג לתוכן

משתמש:מיכי י-ם/form.js

מתוך ויקיפדיה, האנציקלופדיה החופשית

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
mw.loader
  .using([
    "mediawiki.api",
    "mediawiki.util",
    "oojs-ui-core",
    "oojs-ui-widgets",
    "mediawiki.widgets.UsersMultiselectWidget",
  ])
  .then(() => {
    const api = new mw.Api();
    const pageName = new mw.Title(mw.config.get("wgPageName"));

    const getContributors = async (page) => {
      const params = {
        prop: "contributors|revisions",
        titles: page,
        utf8: 1,
        formatversion: "2",
        pcexcludegroup: "bot",
        pclimit: "6",
        rvprop: "user|timestamp",
        rvlimit: "1",
        rvdir: "newer",
      };

      try {
        const { query } = await api.get(params);
        if (!query.pages) {
          throw new Error("page not found");
        }
        let contributors = query.pages[0].contributors.map((c) => c.name);
        if (contributors.length > 5) {
          const res = await fetch(
            `https://xtools.wmcloud.org/api/page/top_editors/he.wikipedia/${page}///5?nobots=1`
          );
          const { top_editors } = await res.json();
          contributors = top_editors.map((c) => c.username);
          contributors[contributors.length - 1] += " (על בסיס XTools)";
        }
        const contributorsString = contributors.join(", ");

        return {
          author: query.pages[0].revisions[0].user || "",
          contributors: contributorsString,
        };
      } catch (error) {
        console.error(error);
        return null;
      }
    };

    function ImportanceDialog(config) {
      ImportanceDialog.super.call(this, config);
    }
    OO.inheritClass(ImportanceDialog, OO.ui.ProcessDialog);

    // Specify a name for .addWindows()
    ImportanceDialog.static.name = "importanceDialog";
    // Specify a static title and actions.
    ImportanceDialog.static.title = "פתיחת דיון חשיבות";
    ImportanceDialog.static.size = "medium";
    ImportanceDialog.static.actions = [
      {
        action: "save",
        label: "שליחה",
        flags: ["primary", "progressive"],
      },
      {
        label: "סגירה",
        flags: "safe",
      },
    ];

    // Use the initialize() method to add content to the dialog's $body,
    // to initialize widgets, and to set up event handlers.
    ImportanceDialog.prototype.initialize = function () {
      ImportanceDialog.super.prototype.initialize.apply(this, arguments);

      this.content = new OO.ui.PanelLayout({
        padded: true,
        expanded: false,
      });

      this.inputExplanation = new OO.ui.TextInputWidget({
        indicator: "required",
        placeholder: "משהו כמו: רחוק מהרף לסופרים, עילה אחרת לא קיימת בערך.",
      });
      this.labelExplanation = new OO.ui.FieldLayout(this.inputExplanation, {
        label: "הסבר קצר להנחת התבנית",
        align: "top",
      });
      this.inputUser = new mw.widgets.UsersMultiselectWidget({});
      this.labelUser = new OO.ui.FieldLayout(this.inputUser, {
        id: "importanceDialog-users-pinging",
        label: "משתמשים לתיוג בדיון",
        align: "top",
        help: "יוצר הערך, תורמים משמעותיים",
        helpInline: true,
      });
      this.tgl = new OO.ui.CheckboxInputWidget({
        checked: false,
      });
      this.labelTgl = new OO.ui.FieldLayout(this.tgl, {
        label: "להנחת התבנית בדף השיחה",
        align: "inline",
      });

      this.content.$element.append(
        this.labelExplanation.$element,
        this.labelUser.$element,
        this.labelTgl.$element
      );
      this.inputExplanation.connect(this, { change: "validate" });
      this.$body.append(this.content.$element);
    };

    ImportanceDialog.prototype.validate = function (value) {
      this.actions.setAbilities({ save: value.length > 35 });
    };

    ImportanceDialog.prototype.getSetupProcess = function (data) {
      return ImportanceDialog.super.prototype.getSetupProcess
        .call(this, data)
        .next(function () {
          this.actions.setAbilities({ save: false });
        }, this)
        .next(async function () {
          try {
            const { author, contributors } = await getContributors(pageName.title);
            $("#importanceDialog-users-pinging .oo-ui-inline-help").text(
              `יוצר הערך: ${author}. תורמים: ${contributors}`
            );
          } catch { }
        }, this);
    };

    // Use the getActionProcess() method to specify a process to handle the
    // actions (for the 'save' action, in this example).
    ImportanceDialog.prototype.getActionProcess = function (action) {
      var dialog = this;
      const explanation = dialog.inputExplanation.getValue();
      const users = dialog.inputUser.getValue();
      const usersString = users.length > 0
        ? users.map((u) => `@[[User:${u}|${u}]]`).join(", ")
        : "";
      const talk = dialog.tgl.getValue();

      if (action === "cancel") {
        return new OO.ui.Process(function () {
          dialog.close();
        });
      } else if (action === "save") {
        return new OO.ui.Process(function () {
          api.postWithEditToken({
            action: "edit",
            title: talk ? pageName.getTalkPage().getPrefixedText() : pageName.getPrefixedText(),
            prependtext: text,
            summary: "דיון חשיבות"
          })
            .done(function (data) {
              return;
            })
            .fail(function (error) {
              console.error(error);
              return new OO.ui.Error("אירעה שגיאה בשמירת התבנית");
            });
        })
          .next(function () {
            api.newSection(
              "Talk:" + pageName,
              "דיון חשיבות",
              `${explanation}. `
            )
              .done(function (data) {
                return;
              })
              .fail(function (error) {
                console.error(error);
                return new OO.ui.Error("אירעה שגיאה בפתיחת הדיון!");
              });
          }, this)
          .next(function () {
            this.close();
          }, this);
      }
      // Fallback to parent handler.
      return ImportanceDialog.super.prototype.getActionProcess.call(this, action);
    };

    // Get dialog height.
    ImportanceDialog.prototype.getBodyHeight = function () {
      return this.content.$element.outerHeight(true) + 50;
    };

    // Create and append the window manager.
    var windowManager = new OO.ui.WindowManager();
    $(document.body).append(windowManager.$element);

    // Create a new dialog window.
    var importanceDialog = new ImportanceDialog();
    const idNamespace = mw.config.get("wgNamespaceNumber");
    if ([10, 14].includes(idNamespace) || idNamespace === 0) {
      // Add windows to window manager using the addWindows() method.
      windowManager.addWindows([importanceDialog]);

      $(mw.util.addPortletLink('p-cactions', '#', "דיון חשיבות")).click(() => {
        // Open the window.
        windowManager.openWindow(importanceDialog);
      });
    }
  });