「MediaWiki:MobileUI.js」の版間の差分
編集の要約なし タグ: モバイル編集 モバイルウェブ編集 |
編集の要約なし タグ: モバイル編集 モバイルウェブ編集 |
||
| 2行目: | 2行目: | ||
/** | /** | ||
* @typedef { | * @typedef MediaWiki | ||
* @prop {readonly Map<string, any>} config | |||
*/ | */ | ||
| 32行目: | 33行目: | ||
* @typedef MobileUI | * @typedef MobileUI | ||
* @prop {MenuDataGroup[]} leftGroups | * @prop {MenuDataGroup[]} leftGroups | ||
* @prop {MenuDataGroup[]} rightGroups | * @prop {MenuDataGroup[]} rightGroups | ||
*/ | */ | ||
| 38行目: | 38行目: | ||
class MobileUIBuilder { | class MobileUIBuilder { | ||
/** | /** | ||
* @param { | * @param {MediaWiki} mw | ||
*/ | */ | ||
constructor(mw | constructor(mw) { | ||
this.mw = mw | // this.mw = mw; | ||
/** | /** | ||
| 59行目: | 57行目: | ||
*/ | */ | ||
this.wgArticleId = mw.config.get("wgArticleId"); | this.wgArticleId = mw.config.get("wgArticleId"); | ||
/** | |||
* @type {boolean} | |||
*/ | |||
this.wgIsArticle = mw.config.get("wgIsArticle"); | |||
/** | |||
* @type {boolean} | |||
*/ | |||
this.wgIsMainPage = mw.config.get("wgIsMainPage"); | |||
} | } | ||
| 84行目: | 92行目: | ||
/** | /** | ||
* @param {MenuDataItemComponent} component | * @param {MenuDataItemComponent} component | ||
* @returns { | * @returns {HTMLAnchorElement} | ||
*/ | */ | ||
menuDataItemComponent(component) { | menuDataItemComponent(component) { | ||
const href = this.hrefForMenuDataItemComponent(component); | const href = this.hrefForMenuDataItemComponent(component); | ||
const element = window.document.createElement("a"); | |||
element.text = component.text || href; | |||
element.href = encodeURI(href); | |||
element.id = component.id || ""; | |||
element.classList.add(...[].concat(component.class)); | |||
element.setAttribute("data-event-name", component.dataEventName || ""); | |||
return element; | |||
} | } | ||
/** | /** | ||
* @param {MenuDataItem} item | * @param {MenuDataItem} item | ||
* @returns { | * @returns {HTMLLIElement} | ||
*/ | */ | ||
menuDataItem(item) { | menuDataItem(item) { | ||
/** | /** | ||
* @type { | * @type {HTMLAnchorElement[]} | ||
*/ | */ | ||
const children = []; | const children = []; | ||
| 112行目: | 121行目: | ||
} | } | ||
const element = window.document.createElement("li"); | |||
element.id = item.id || ""; | |||
element.classList.add(...[].concat(item.class)); | |||
element.append(...children); | |||
return element; | |||
} | } | ||
/** | /** | ||
* @param {MenuDataGroup} group | * @param {MenuDataGroup} group | ||
* @returns { | * @returns {HTMLUListElement} | ||
*/ | */ | ||
menuDataGroup(group) { | menuDataGroup(group) { | ||
/** | /** | ||
* @type { | * @type {HTMLLIElement[]} | ||
*/ | */ | ||
const children = []; | const children = []; | ||
| 131行目: | 141行目: | ||
for (const item of group.items) { | for (const item of group.items) { | ||
children.push(this.menuDataItem(item)); | children.push(this.menuDataItem(item)); | ||
Function.call | |||
} | } | ||
const element = window.document.createElement("ul"); | |||
element.id = group.id || ""; | |||
element.classList.add(...[].concat(group.class)); | |||
element.append(...children); | |||
return element; | |||
} | } | ||
/** | /** | ||
* @param {MenuDataGroup[]} groups | * @param {MenuDataGroup[]} groups | ||
* @returns { | * @returns {HTMLUListElement[]} | ||
*/ | */ | ||
menuDataGroups(groups) { | menuDataGroups(groups) { | ||
/** | /** | ||
* @type { | * @type {HTMLUListElement[]} | ||
*/ | */ | ||
const children = []; | const children = []; | ||
| 180行目: | 192行目: | ||
/** | /** | ||
* @returns { | * @returns {HTMLDivElement | null} | ||
*/ | */ | ||
get menuElement() { | get menuElement() { | ||
return /** @type { | return /** @type {HTMLDivElement} */ ( | ||
this.navElement.getElementsByClassName("menu").item(0) | this.navElement.getElementsByClassName("menu").item(0) | ||
); | ); | ||
| 193行目: | 205行目: | ||
*/ | */ | ||
modify(mobileUI, menuElement) { | modify(mobileUI, menuElement) { | ||
const navElement = this.navElement; | |||
if (this.wgIsArticle && !this.wgIsMainPage) { | |||
navElement.classList.add("mobile-ui-article"); | |||
} | |||
const firstGroup = menuElement.getElementsByTagName("ul").item(0); | |||
if (firstGroup) { | |||
firstGroup.style.display = "none"; | |||
} | |||
const leftGroups = this.menuDataGroups(mobileUI.leftGroups); | const leftGroups = this.menuDataGroups(mobileUI.leftGroups); | ||
menuElement.prepend(...leftGroups); | |||
const rightMenuElement = window.document.createElement("div"); | |||
rightMenuElement.classList.add(...menuElement.classList, "menu-right"); | |||
const rightGroups = this.menuDataGroups(mobileUI.rightGroups); | |||
rightMenuElement.append(...rightGroups); | |||
navElement.append(rightMenuElement); | |||
} | } | ||