|
|
import { registerModule } from '../moduleRegister';
|
|
|
|
|
|
class CreatePageWidget {
|
|
|
constructor(dom) {
|
|
|
this.baseDom = dom;
|
|
|
this.pageUrl = null;
|
|
|
this.api = new mw.Api();
|
|
|
|
|
|
this.hasError = false;
|
|
|
|
|
|
this.initDom();
|
|
|
}
|
|
|
|
|
|
initDom() {
|
|
|
let namespaces = mw.config.get('wgIsekaiCreatePageNamespaces');
|
|
|
if (!Array.isArray(namespaces) || namespaces.length === 0) {
|
|
|
namespaces = [
|
|
|
{
|
|
|
name: 'Main',
|
|
|
prefix: '',
|
|
|
}
|
|
|
];
|
|
|
}
|
|
|
|
|
|
this.selectNamespaceDropdown = new OO.ui.DropdownInputWidget({
|
|
|
options: namespaces.map((nsInfo) => ({
|
|
|
data: nsInfo.prefix,
|
|
|
label: nsInfo.name,
|
|
|
})),
|
|
|
});
|
|
|
this.selectNamespaceDropdown.on('change', this.onNamespaceChange.bind(this));
|
|
|
|
|
|
this.pageNameInput = new isekai.ui.CreatePageInputWidget({
|
|
|
placeholder: mw.message('isekai-createpage-page-title').parse(),
|
|
|
});
|
|
|
this.pageNameInput.on('enter', this.createPage.bind(this));
|
|
|
this.pageNameInput.on('change', this.onPageNameChange.bind(this));
|
|
|
|
|
|
this.createButton = new OO.ui.ButtonWidget({
|
|
|
label: mw.message('isekai-createpage-create-page-button').parse(),
|
|
|
flags: [
|
|
|
'primary',
|
|
|
'progressive'
|
|
|
]
|
|
|
});
|
|
|
this.createButton.on('click', this.createPage.bind(this));
|
|
|
|
|
|
this.inputGroup = new OO.ui.ActionFieldLayout(this.pageNameInput, this.createButton, {
|
|
|
align: 'top'
|
|
|
});
|
|
|
|
|
|
this.formGroup = new OO.ui.HorizontalLayout({
|
|
|
items: [
|
|
|
this.selectNamespaceDropdown,
|
|
|
this.inputGroup
|
|
|
]
|
|
|
});
|
|
|
|
|
|
this.baseDom.find('.card-body .card-content').append(this.formGroup.$element);
|
|
|
}
|
|
|
|
|
|
createPage() {
|
|
|
let title = this.selectNamespaceDropdown.getValue() + this.pageNameInput.getValue();
|
|
|
console.log(title);
|
|
|
if (this.hasError) {
|
|
|
this.clearError(); //清除errors
|
|
|
}
|
|
|
if (title.trim().length > 0) {
|
|
|
this.createButton.setDisabled(true);
|
|
|
this.pageExists(title).then((exists) => {
|
|
|
if (exists) {
|
|
|
this.createButton.setDisabled(false);
|
|
|
this.setError(mw.message('isekai-createpage-page-exists').parse()); //提示页面已经存在
|
|
|
} else {
|
|
|
let targetUrl = mw.util.getUrl(title, { veaction: 'edit' });
|
|
|
this.inputGroup.setSuccess([
|
|
|
mw.message('isekai-createpage-redirecting').parse()
|
|
|
]); //提示正在跳转
|
|
|
location.href = targetUrl;
|
|
|
}
|
|
|
});
|
|
|
} else {
|
|
|
this.setError(mw.message('isekai-createpage-title-empty').parse());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
onPageNameChange() {
|
|
|
if (this.hasError) {
|
|
|
this.clearError();
|
|
|
}
|
|
|
|
|
|
let value = this.pageNameInput.getValue();
|
|
|
if (value.indexOf(':') !== -1 || value.indexOf('`') !== -1) {
|
|
|
let range = this.pageNameInput.getRange();
|
|
|
value = value.replace(/:/g, ':').replace(/`/g, '·');
|
|
|
this.pageNameInput.setValue(value);
|
|
|
this.pageNameInput.selectRange(range.from, range.to);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
onNamespaceChange() {
|
|
|
this.pageNameInput.setPagePrefix(this.selectNamespaceDropdown.getValue());
|
|
|
}
|
|
|
|
|
|
setError(msg) {
|
|
|
this.inputGroup.setErrors([msg]); //提示页面已经存在
|
|
|
this.hasError = true;
|
|
|
}
|
|
|
|
|
|
clearError() {
|
|
|
this.inputGroup.setErrors([]);
|
|
|
this.hasError = false;
|
|
|
}
|
|
|
|
|
|
pageExists(title) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
this.api.get({
|
|
|
action: 'query',
|
|
|
titles: title,
|
|
|
}).done((data) => {
|
|
|
if (data.query && data.query.pages) {
|
|
|
if (data.query.pages["-1"]) {
|
|
|
resolve(false);
|
|
|
} else {
|
|
|
resolve(true);
|
|
|
}
|
|
|
} else {
|
|
|
resolve(false);
|
|
|
}
|
|
|
}).fail(reject);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
setTitle(title) {
|
|
|
this.title.text(title);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
registerModule('ui.CreatePageWidget', CreatePageWidget); |