« MediaWiki:Gadget-tour-loader.js » : différence entre les versions
(Tour prêt à lancer) |
(Désactivation du tour visual_edition) |
||
(21 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 3 : | Ligne 3 : | ||
console.log("Skipping tour loading, MutationObserver not supported."); | console.log("Skipping tour loading, MutationObserver not supported."); | ||
} | } | ||
// else if(mw.util.getParamValue("load-tours") === null) { console.log("Tour loader is in debug mode."); } // Uncomment to launch tours only when load-tours is set. | |||
else if(window.self == window.top) // Prevent tours from being launched within an iframe. | else if(window.self == window.top) // Prevent tours from being launched within an iframe. | ||
{ | { | ||
Ligne 9 : | Ligne 10 : | ||
basic_navigation: { | basic_navigation: { | ||
requires: [], // List of tours that must have been completed for this tour to launch. | requires: [], // List of tours that must have been completed for this tour to launch. | ||
startDelayFromRegistration: | startDelayFromRegistration: 60 * 1000, // Delay in milliseconds the tour must wait after registration to launch. | ||
postponeDelay: 60 * 60 * 24 * 1000, // Delay in milliseconds the tour is shown again after being postponed. | postponeDelay: 60 * 60 * 24 * 1000, // Delay in milliseconds the tour is shown again after being postponed. | ||
loggedInUsersOnly: true, // If the tour is only for logged in users. | loggedInUsersOnly: true, // If the tour is only for logged in users. | ||
Ligne 16 : | Ligne 17 : | ||
debug: false // Tour is in debug mode (not lauched when ready) | debug: false // Tour is in debug mode (not lauched when ready) | ||
}, | }, | ||
visual_edition: { | /*visual_edition: { | ||
requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch. | requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch. | ||
startDelayFromRequiredTours: 24 * 60 * 60 * 1000, // Delay in milliseconds the tour must wait after required tours are completed. | startDelayFromRequiredTours: 24 * 60 * 60 * 1000, // Delay in milliseconds the tour must wait after required tours are completed. | ||
Ligne 23 : | Ligne 24 : | ||
canEditPage: true, // If the tour can only launch on pages a user can edit. | canEditPage: true, // If the tour can only launch on pages a user can edit. | ||
excludePages: [/^Accueil$/, /^Wikimedica./, /^Classe./, /^Modèle./], // Exclude pages (regex). | excludePages: [/^Accueil$/, /^Wikimedica./, /^Classe./, /^Modèle./], // Exclude pages (regex). | ||
debug: false // Tour is in debug mode (not lauched when ready) | |||
},*/ | |||
donate_button: { | |||
startDelayFromFirstVisit: 24 * 60 * 60 * 1000 * 3, // 3 days. | |||
loggedInUsersOnly: false, // The tour is for all users. | |||
debug: false // Tour is in debug mode (not lauched when ready) | |||
}, | |||
install_app: { | |||
startDelayFromFirstVisit: 24 * 60 * 60 * 1000 * 2, // 2 days. | |||
loggedInUsersOnly: false, // The tour is for all users. | |||
debug: false // Tour is in debug mode (not lauched when ready) | debug: false // Tour is in debug mode (not lauched when ready) | ||
}, | }, | ||
help_link: { | help_link: { | ||
requires: [" | requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch. | ||
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 10, // 10 days. | startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 10, // 10 days. | ||
loggedInUsersOnly: true, // If the tour is only for logged in users. | loggedInUsersOnly: true, // If the tour is only for logged in users. | ||
Ligne 32 : | Ligne 43 : | ||
}, | }, | ||
modify_button: { | modify_button: { | ||
requires: [" | requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch. | ||
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 11, // 11 days | startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 11, // 11 days | ||
loggedInUsersOnly: true, // If the tour is only for logged in users. | loggedInUsersOnly: true, // If the tour is only for logged in users. | ||
Ligne 40 : | Ligne 51 : | ||
}, | }, | ||
discussion_tab: { | discussion_tab: { | ||
requires: ["modify_button", " | requires: ["modify_button", "basic_navigation"], // List of tours that must have been completed for this tour to launch. | ||
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 1, // 1 day. | startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 1, // 1 day. | ||
loggedInUsersOnly: true, // If the tour is only for logged in users. | loggedInUsersOnly: true, // If the tour is only for logged in users. | ||
Ligne 53 : | Ligne 64 : | ||
}, | }, | ||
drafts: { | drafts: { | ||
requires: [" | requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch. | ||
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 14, // 14 days. | startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 14, // 14 days. | ||
loggedInUsersOnly: true, // If the tour is only for logged in users. | loggedInUsersOnly: true, // If the tour is only for logged in users. | ||
Ligne 59 : | Ligne 70 : | ||
}, | }, | ||
tasks: { | tasks: { | ||
requires: [" | requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch. | ||
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 60, // 60 days. | startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 60, // 60 days. | ||
loggedInUsersOnly: true, // If the tour is only for logged in users. | loggedInUsersOnly: true, // If the tour is only for logged in users. | ||
Ligne 68 : | Ligne 79 : | ||
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 1, // 1 day. | startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 1, // 1 day. | ||
loggedInUsersOnly: true, // If the tour is only for logged in users. | loggedInUsersOnly: true, // If the tour is only for logged in users. | ||
excludePages: [/^Accueil$/, /^Wikimedica./, /^Discussion./, /^Classe./, /^Modèle./], // Exclude pages (regex). | |||
debug: false // Tour is in debug mode (not lauched when ready) | debug: false // Tour is in debug mode (not lauched when ready) | ||
}, | }, | ||
Ligne 81 : | Ligne 93 : | ||
debug: false, // Tour is in debug mode (not lauched when ready) | debug: false, // Tour is in debug mode (not lauched when ready) | ||
canLaunch: function () { return mw.config.values.wgNamespaceNumber === 4001; } // For NS_ULAVAL_TALK. | canLaunch: function () { return mw.config.values.wgNamespaceNumber === 4001; } // For NS_ULAVAL_TALK. | ||
}, | |||
pending_notifications: { | |||
startDelayFromRegistration: 24 * 60 * 60 * 1000 * 7, // 7 days. | |||
loggedInUsersOnly: true, // If the tour is only for logged in users. | |||
debug: false, // Tour is in debug mode (not lauched when ready) | |||
canLaunch: function () { return $(".mw-echo-unseen-notifications").length > 0; } | |||
} | } | ||
}, | }, | ||
optionPrefix: 'userjs-mw-tour-', // Prefix under which tour launch data is saved in the user options. | optionPrefix: 'userjs-mw-tour-', // Prefix under which tour launch data is saved in the user options. | ||
firstVisitCookieRefreshed: false, // Set when the firstVisitCookie has been refreshed. | |||
// Get the state of a tour from the user options. | // Get the state of a tour from the user options. | ||
getTourState: function(name) { return mw.user.options. | getTourState: function(name) { | ||
key = this.optionPrefix + name + "-state"; | |||
// if this is a logged in user and they have done the tour. | |||
state = mw.user.options.get(key); | |||
if(state !== null) { return state; } | |||
// This is a anon user or a logged in user that did the tour while anon. | |||
state = mw.cookie.get(key); // Fetch the state from the cookies. | |||
if(state !== null) { // If the cookie was set. | |||
if(!mw.user.isAnon()) { // The user did that tour while anon. | |||
// Save the state in the user options for retrieval across platforms. | |||
this.setTourState(name, state, this.getTourTime(name)); | |||
} | |||
// Set the cookie again (cookies now have a default max expiry of 400 days across browsers. | |||
mw.cookie.set(key, state, { expires: new Date(8640000000000000) }); | |||
return state; | |||
} | |||
return null; // This tour was not done. | |||
}, | |||
// Get the | // Get the time of a tour from the user options. | ||
getTourTime: function(name) { return parseInt(mw.user.options. | getTourTime: function(name) { | ||
key = this.optionPrefix + name + "-time"; | |||
// If this is a logged in user and they have done the tour. | |||
time = mw.user.options.get(key); | |||
if(time !== null) { return parseInt(time); } | |||
// This is a anon user or a logged in user that did the tour while anon. | |||
time = mw.cookie.get(key); // Fetch the state from the cookies. | |||
if(time !== null) { // If the cookie was set. | |||
if(!mw.user.isAnon()) { // The user did that tour while anon. | |||
// Save the state in the user options for retrieval across platforms. | |||
this.setTourState(name, this.getTourState(name), time); | |||
} | |||
// Set the cookie again (cookies now have a default max expiry of 400 days across browsers. | |||
mw.cookie.set(key, time, { expires: new Date(8640000000000000) }); | |||
return parseInt(time); | |||
} | |||
return null; // This tour was not done. | |||
}, | |||
// Set a state and time for a tour state in the user options. | // Set a state and time for a tour state in the user options. | ||
setTourState: function(name, state, time) | setTourState: function(name, state, time) | ||
{ | { | ||
mw.user.options.set( | key = this.optionPrefix + name; | ||
if(!mw.user.isAnon()) { // Do not save options for anon visitors. | |||
// Save the sate in the options map. | |||
mw.user.options.set(key + "-state", state); | |||
mw.user.options.set(key + "-time", time); | |||
api = new mw.Api(); | |||
api.postWithEditToken({ | |||
'action': 'options', | |||
'change': key + "-state=" + state + "|" + key + "-time=" + time | |||
}).fail(function(data) { console.log("API options set call failed."); }); | |||
} | |||
// Always save cookies. | |||
mw.cookie.set(key + "-state", state, { expires: new Date(8640000000000000) }); | |||
mw.cookie.set(key + "-time", time, { expires: new Date(8640000000000000) }); | |||
}, | }, | ||
Ligne 114 : | Ligne 192 : | ||
{ | { | ||
// Normalize configuration. | // Normalize configuration. | ||
if(tour.startDelayFromFirstVisit === undefined) { tour.startDelayFromFirstVisit = 0; } | |||
if(tour.startDelayFromRegistration === undefined) { tour.startDelayFromRegistration = 0; } | if(tour.startDelayFromRegistration === undefined) { tour.startDelayFromRegistration = 0; } | ||
if(tour.startDelayFromRequiredTours === undefined) { tour.startDelayFromRequiredTours = 0; } | if(tour.startDelayFromRequiredTours === undefined) { tour.startDelayFromRequiredTours = 0; } | ||
Ligne 122 : | Ligne 201 : | ||
if(tour.excludePages === undefined) { tour.excludePages = []; } | if(tour.excludePages === undefined) { tour.excludePages = []; } | ||
if(tour.requires === undefined) { tour.requires = []; } | if(tour.requires === undefined) { tour.requires = []; } | ||
if(tour.canLaunch === undefined) { tour.canLaunch = function(){}; } | if(tour.debug === undefined) { tour.debug = true; } | ||
if(tour.canLaunch === undefined) { tour.canLaunch = function(){ return true; }; } | |||
// If the tour has been completed or abandoned. | // If the tour has been completed or abandoned. | ||
Ligne 130 : | Ligne 210 : | ||
} | } | ||
// ------------------- | // ------------------- startDelayfromFirstVisit ----------------------------- | ||
if(!(firstVisit = mw.cookie.get("first-visit"))) { | |||
// There is no cookie telling the user visited this site. | |||
firstVisit = Date.now(); // Now is the first visit, even for registered users. | |||
} | |||
if(!this.firstVisitCookieRefreshed) { | |||
// Always save a new first visit cookie so its expiration date is pushed back. | |||
mw.cookie.set('first-visit', firstVisit, { expires: new Date(8640000000000000) }); | |||
this.firstVisitCookieRefreshed = true; // Avoids refreshing the cookie for each tour. | |||
} | |||
// Not past the delay yet. | // Not past the delay yet. | ||
if(d.getTime() + tour.startDelayFromRegistration > Date.now()) { return false; } | if(parseInt(firstVisit) + tour.startDelayFromFirstVisit > Date.now()) { return false; } | ||
// ------------------- startDelayfromRegistration ----------------------------- | |||
if(mw.user.getRegistration() !== false) { // If registration is false, skip this because the user is anonymous. | |||
d = new Date(mw.user.getRegistration()); | |||
// Not past the delay yet. | |||
if(d.getTime() + tour.startDelayFromRegistration > Date.now()) { return false; } | |||
} | |||
// ------------------- postponeDelay ----------------------------- | // ------------------- postponeDelay ----------------------------- | ||
Ligne 146 : | Ligne 244 : | ||
// ------------------- loggedInUsersOnly ----------------------------- | // ------------------- loggedInUsersOnly ----------------------------- | ||
// The tour | // The tour requires the user to be logged in. | ||
if(tour.loggedInUsersOnly && mw.user.isAnon()) { return false; } | if(tour.loggedInUsersOnly && mw.user.isAnon()) { return false; } | ||
// ------------------- canEditPage ----------------------------- | // ------------------- canEditPage ----------------------------- | ||
// The tour requires the user to be able to edit the current page. | // The tour requires the user to be able to edit the current page. | ||
if(tour.canEditPage && !mw.config.get('wgIsProbablyEditable')) { return false; } | if(!mw.user.isAnon() && tour.canEditPage && !mw.config.get('wgIsProbablyEditable')) { return false; } | ||
// ------------------- excludePages ----------------------------- | // ------------------- excludePages ----------------------------- |
Dernière version du 20 février 2024 à 18:54
if(typeof MutationObserver == 'undefined') // If the MutationObserver pattern is not supported.
{
console.log("Skipping tour loading, MutationObserver not supported.");
}
// else if(mw.util.getParamValue("load-tours") === null) { console.log("Tour loader is in debug mode."); } // Uncomment to launch tours only when load-tours is set.
else if(window.self == window.top) // Prevent tours from being launched within an iframe.
{
mw.guidedTour.loader = { // Hook to the mw.guidedTour to make the launcher globally accessible.
tours: {
basic_navigation: {
requires: [], // List of tours that must have been completed for this tour to launch.
startDelayFromRegistration: 60 * 1000, // Delay in milliseconds the tour must wait after registration to launch.
postponeDelay: 60 * 60 * 24 * 1000, // Delay in milliseconds the tour is shown again after being postponed.
loggedInUsersOnly: true, // If the tour is only for logged in users.
canEditPage: true, // If the tour can only launch on pages a user can edit.
excludePages: [/^Accueil$/, /^Wikimedica./, /^Classe./, /^Modèle./], // Exclude pages (regex).
debug: false // Tour is in debug mode (not lauched when ready)
},
/*visual_edition: {
requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000, // Delay in milliseconds the tour must wait after required tours are completed.
postponeDelay: 60 * 60 * 24 * 1000, // Delay in milliseconds the tour shown again after being postponed.
loggedInUsersOnly: true, // If the tour is only for logged in users.
canEditPage: true, // If the tour can only launch on pages a user can edit.
excludePages: [/^Accueil$/, /^Wikimedica./, /^Classe./, /^Modèle./], // Exclude pages (regex).
debug: false // Tour is in debug mode (not lauched when ready)
},*/
donate_button: {
startDelayFromFirstVisit: 24 * 60 * 60 * 1000 * 3, // 3 days.
loggedInUsersOnly: false, // The tour is for all users.
debug: false // Tour is in debug mode (not lauched when ready)
},
install_app: {
startDelayFromFirstVisit: 24 * 60 * 60 * 1000 * 2, // 2 days.
loggedInUsersOnly: false, // The tour is for all users.
debug: false // Tour is in debug mode (not lauched when ready)
},
help_link: {
requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 10, // 10 days.
loggedInUsersOnly: true, // If the tour is only for logged in users.
debug: false // Tour is in debug mode (not lauched when ready)
},
modify_button: {
requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 11, // 11 days
loggedInUsersOnly: true, // If the tour is only for logged in users.
canEditPage: true, // If the tour can only launch on pages a user can edit.
excludePages: [/^Accueil$/, /^Wikimedica./, /^Classe./, /^Modèle./], // Exclude pages (regex).
debug: false // Tour is in debug mode (not lauched when ready)
},
discussion_tab: {
requires: ["modify_button", "basic_navigation"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 1, // 1 day.
loggedInUsersOnly: true, // If the tour is only for logged in users.
excludePages: [/^Accueil$/, /^Wikimedica./, /^Classe./, /^Modèle./], // Exclude pages (regex).
debug: false // Tour is in debug mode (not lauched when ready)
},
recent_changes: {
requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 14, // 14 days.
loggedInUsersOnly: true, // If the tour is only for logged in users.
debug: false // Tour is in debug mode (not lauched when ready)
},
drafts: {
requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 14, // 14 days.
loggedInUsersOnly: true, // If the tour is only for logged in users.
debug: false // Tour is in debug mode (not lauched when ready)
},
tasks: {
requires: ["basic_navigation"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 60, // 60 days.
loggedInUsersOnly: true, // If the tour is only for logged in users.
debug: false // Tour is in debug mode (not lauched when ready)
},
view_history: {
requires: ["recent_changes"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 1, // 1 day.
loggedInUsersOnly: true, // If the tour is only for logged in users.
excludePages: [/^Accueil$/, /^Wikimedica./, /^Discussion./, /^Classe./, /^Modèle./], // Exclude pages (regex).
debug: false // Tour is in debug mode (not lauched when ready)
},
ask_question: {
requires: ["help_link"], // List of tours that must have been completed for this tour to launch.
startDelayFromRequiredTours: 24 * 60 * 60 * 1000 * 1, // 1 day.
loggedInUsersOnly: true, // If the tour is only for logged in users.
debug: false // Tour is in debug mode (not lauched when ready)
},
ulaval_talk_pages_warning: {
startDelayFromRegistration: 300 * 1000, // Delay in milliseconds the tour must wait after registration to launch.
loggedInUsersOnly: true, // If the tour is only for logged in users.
debug: false, // Tour is in debug mode (not lauched when ready)
canLaunch: function () { return mw.config.values.wgNamespaceNumber === 4001; } // For NS_ULAVAL_TALK.
},
pending_notifications: {
startDelayFromRegistration: 24 * 60 * 60 * 1000 * 7, // 7 days.
loggedInUsersOnly: true, // If the tour is only for logged in users.
debug: false, // Tour is in debug mode (not lauched when ready)
canLaunch: function () { return $(".mw-echo-unseen-notifications").length > 0; }
}
},
optionPrefix: 'userjs-mw-tour-', // Prefix under which tour launch data is saved in the user options.
firstVisitCookieRefreshed: false, // Set when the firstVisitCookie has been refreshed.
// Get the state of a tour from the user options.
getTourState: function(name) {
key = this.optionPrefix + name + "-state";
// if this is a logged in user and they have done the tour.
state = mw.user.options.get(key);
if(state !== null) { return state; }
// This is a anon user or a logged in user that did the tour while anon.
state = mw.cookie.get(key); // Fetch the state from the cookies.
if(state !== null) { // If the cookie was set.
if(!mw.user.isAnon()) { // The user did that tour while anon.
// Save the state in the user options for retrieval across platforms.
this.setTourState(name, state, this.getTourTime(name));
}
// Set the cookie again (cookies now have a default max expiry of 400 days across browsers.
mw.cookie.set(key, state, { expires: new Date(8640000000000000) });
return state;
}
return null; // This tour was not done.
},
// Get the time of a tour from the user options.
getTourTime: function(name) {
key = this.optionPrefix + name + "-time";
// If this is a logged in user and they have done the tour.
time = mw.user.options.get(key);
if(time !== null) { return parseInt(time); }
// This is a anon user or a logged in user that did the tour while anon.
time = mw.cookie.get(key); // Fetch the state from the cookies.
if(time !== null) { // If the cookie was set.
if(!mw.user.isAnon()) { // The user did that tour while anon.
// Save the state in the user options for retrieval across platforms.
this.setTourState(name, this.getTourState(name), time);
}
// Set the cookie again (cookies now have a default max expiry of 400 days across browsers.
mw.cookie.set(key, time, { expires: new Date(8640000000000000) });
return parseInt(time);
}
return null; // This tour was not done.
},
// Set a state and time for a tour state in the user options.
setTourState: function(name, state, time)
{
key = this.optionPrefix + name;
if(!mw.user.isAnon()) { // Do not save options for anon visitors.
// Save the sate in the options map.
mw.user.options.set(key + "-state", state);
mw.user.options.set(key + "-time", time);
api = new mw.Api();
api.postWithEditToken({
'action': 'options',
'change': key + "-state=" + state + "|" + key + "-time=" + time
}).fail(function(data) { console.log("API options set call failed."); });
}
// Always save cookies.
mw.cookie.set(key + "-state", state, { expires: new Date(8640000000000000) });
mw.cookie.set(key + "-time", time, { expires: new Date(8640000000000000) });
},
// Delete a tour state.
deleteTourState: function(name, state) { this.setTourState(name, null, null); },
/*
* Checks if all conditions for a tour to launch are met.
*/
canLaunch: function(name, tour)
{
// Normalize configuration.
if(tour.startDelayFromFirstVisit === undefined) { tour.startDelayFromFirstVisit = 0; }
if(tour.startDelayFromRegistration === undefined) { tour.startDelayFromRegistration = 0; }
if(tour.startDelayFromRequiredTours === undefined) { tour.startDelayFromRequiredTours = 0; }
if(tour.postponeDelay === undefined) { tour.postponeDelay = false; }
if(tour.launchProbability === undefined) { tour.lauchProbability = 1; }
if(tour.loggedInUsersOnly === undefined) { tour.loggedInUsersOnly = true; }
if(tour.canEditPage === undefined) { tour.canEditPage = true; }
if(tour.excludePages === undefined) { tour.excludePages = []; }
if(tour.requires === undefined) { tour.requires = []; }
if(tour.debug === undefined) { tour.debug = true; }
if(tour.canLaunch === undefined) { tour.canLaunch = function(){ return true; }; }
// If the tour has been completed or abandoned.
if(this.getTourState(name) == "completed" || this.getTourState(name) == "abandoned")
{
return false;
}
// ------------------- startDelayfromFirstVisit -----------------------------
if(!(firstVisit = mw.cookie.get("first-visit"))) {
// There is no cookie telling the user visited this site.
firstVisit = Date.now(); // Now is the first visit, even for registered users.
}
if(!this.firstVisitCookieRefreshed) {
// Always save a new first visit cookie so its expiration date is pushed back.
mw.cookie.set('first-visit', firstVisit, { expires: new Date(8640000000000000) });
this.firstVisitCookieRefreshed = true; // Avoids refreshing the cookie for each tour.
}
// Not past the delay yet.
if(parseInt(firstVisit) + tour.startDelayFromFirstVisit > Date.now()) { return false; }
// ------------------- startDelayfromRegistration -----------------------------
if(mw.user.getRegistration() !== false) { // If registration is false, skip this because the user is anonymous.
d = new Date(mw.user.getRegistration());
// Not past the delay yet.
if(d.getTime() + tour.startDelayFromRegistration > Date.now()) { return false; }
}
// ------------------- postponeDelay -----------------------------
if(tour.postponeDelay !== false)
{
if(this.getTourState(name) == "postponed" && (this.getTourTime(name) + tour.postponeDelay > Date.now())) { return false; } // Tour has been postponed for now.
}
// ------------------- launchProbability -----------------------------
// if(tour.launchProbability < Math.random()) { return false; }
// ------------------- loggedInUsersOnly -----------------------------
// The tour requires the user to be logged in.
if(tour.loggedInUsersOnly && mw.user.isAnon()) { return false; }
// ------------------- canEditPage -----------------------------
// The tour requires the user to be able to edit the current page.
if(!mw.user.isAnon() && tour.canEditPage && !mw.config.get('wgIsProbablyEditable')) { return false; }
// ------------------- excludePages -----------------------------
page = mw.config.get("wgPageName");
for(var i = 0; i < tour.excludePages.length; i++)
{
if(tour.excludePages[i].test(page)) { return false; } // Page is excluded.
}
// ------------------- requires -----------------------------
for(var i = 0; i < tour.requires.length; i++)
{
time = null;
if(this.getTourState(tour.requires[i]) == "completed" || this.getTourState(tour.requires[i]) == "abandoned")
{
time = this.getTourTime(tour.requires[i]);
}
if(time === null)
{
return false; // Tour requires a tour that has not been taken (or abandoned) yet.
}
if(parseInt(time) + tour.startDelayFromRequiredTours > Date.now())
{
return false; // Not enough time has passed since the completion (or abandonment) of this required tour.
}
}
// ------------------- canLaunch -----------------------------
try { result = tour.canLaunch(); }
catch (error)
{
console.error(error);
result = false;
}
if(result !== true) { return false; }
return true; // The tour can run
},
/*
* Reset all tour states.
*/
reset: function()
{
for(const tour in this.tours)
{
this.deleteTourState(tour);
}
},
/*
* Iterates over tours to launch them.
*/
launch: function()
{
console.log('Launching tours ... ');
d = $(".guider").css("display");
if(d !== undefined && d != "none")
{
console.log('currently taking a tour.');
return;
}
for(const tour in this.tours)
{
if(this.canLaunch(tour, this.tours[tour]))
{
if(this.tours[tour].debug) // Tour is in debug mode.
{
console.log(tour + ' would have launched (but is in debug mode)');
continue;
}
console.log(tour + ' available for launching');
mw.guidedTour.launcher.launchTour(tour);
return; // A tour has launched, stop the loop as we don't want multiple tours to launch.
}
}
console.log('none ready to lauch.');
}
};
/* Create an observer instance to look for the addition of a guider element to the interface
Source: https://gabrieleromanato.name/jquery-detecting-new-elements-with-the-mutationobserver-object */
var observer = new MutationObserver(function( mutations )
{
mutations.forEach(function( mutation )
{
var newNodes = mutation.addedNodes; // DOM NodeList
if( newNodes === null ) // If there are no new nodes added.
{
return;
}
$(newNodes).each(function()
{
var $node = $(this);
if(!$node.hasClass("guider"))
{
return; // Not a guider.
}
// Deduce the tour name from the id.
// tourName = $node.attr('id').replace('gt-', '').replace('-overlay', '');
tourName = /(?:^|\s)mw-guidedtour-tour-(.*?)(?:\s|$)/g.exec($node.attr('class'))[1]; // Should use class because in id the step can be appended (e.g. basic_navigation-forum)
mw.guidedTour.loader.deleteTourState(tourName); // Reset the state of the tour.
$(".x_button").click(function() {
// If there was a complete button on the step.
if($(".mw-tour-complete, .guidedtour-end-button").length)
{
// This counts as a completion.
console.log(tourName + ' tour complete');
mw.guidedTour.loader.setTourState(tourName, "completed", Date.now()); // Tour has been completed.
return;
}
console.log(tourName + ' tour abandoned');
mw.guidedTour.loader.setTourState(tourName, "abandoned", Date.now()); // Tour has been abandoned.
});
$(".mw-tour-later").click(function() {
console.log(tourName + ' tour postponed');
mw.guidedTour.loader.setTourState(tourName, "postponed", Date.now()); // Tour has been postponed.
mw.guidedTour.endTour();
});
$(".mw-tour-complete, .guidedtour-end-button").click(function() {
console.log(tourName + ' tour completed');
mw.guidedTour.loader.setTourState(tourName, "completed", Date.now()); // Tour has been completed.
});
// Make the guiders draggable so users can move them when they are interfering with an element.
// Adapted from: https://www.sanwebe.com/2014/10/draggable-element-with-jquery-no-jquery-ui
$('.guider').
css('cursor', 'move').
hover(function() { $(this).css('border-width', '3px'); }, function() { $(this).css('border-width', '1px'); }).
on('mousedown', function(e) {
var dr = $(this).addClass("drag");
height = dr.outerHeight();
width = dr.outerWidth();
ypos = dr.offset().top + height - e.pageY,
xpos = dr.offset().left + width - e.pageX;
$(document.body).on('mousemove', function(e){
var itop = e.pageY + ypos - height;
var ileft = e.pageX + xpos - width;
if(dr.hasClass("drag")){
dr.offset({top: itop,left: ileft});
}
}).on('mouseup', function(e){
dr.removeClass("drag");
});
});
});
});
});
observer.observe($('body')[0], {
attributes: false,
childList: true,
characterData: false
});
console.log('Loaded tour loader gadget');
mw.guidedTour.loader.launch(); // Launch next available tour.
}