MediaWiki:Gadget-requestWizard.js

Tủ sách mở Wikibooks

Chú ý: Sau khi lưu trang, có thể bạn sẽ phải xóa bộ nhớ đệm của trình duyệt để xem các thay đổi.

  • Firefox / Safari: Nhấn giữ phím Shift trong khi nhấn Tải lại (Reload), hoặc nhấn tổ hợp Ctrl-F5 hay Ctrl-R (⌘R trên Mac)
  • Google Chrome: Nhấn tổ hợp Ctrl-Shift-R (⇧⌘R trên Mac)
  • Internet Explorer / Edge: Nhấn giữ phím Ctrl trong khi nhấn Làm tươi (Refresh), hoặc nhấn tổ hợp Ctrl-F5
  • Opera: Nhấn tổ hợp Ctrl-F5.
mw.loader.using(["oojs-ui-widgets", "oojs-ui-core"], function() {

/**
 * DROPDOWN-WIDGET
 * Menu thả xuống chọn khu vực sách (Sách wiki hoặc Sách trẻ em)
 * Menu thả xuống chọn kiểu sách
**/

	var bookNamespace = new OO.ui.DropdownWidget({
		label: 'Chọn khu vực sách',
		classes: ['booknamespace'],
		indicator: 'down',
		menu: {
			items: [
				new OO.ui.MenuOptionWidget({
					data: 'wikibook',
					label: 'Sách wiki'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: 'wikijunior',
					label: 'Sách trẻ em'
				})
			]
		}
	})
	
	var bookType = new OO.ui.DropdownWidget({
		label: 'Chọn kiểu sách',
		indicator: 'down'
	})
	
	var wikibookType = [
		new OO.ui.MenuOptionWidget({
			data: 'textbook',
			label: 'Sách giáo khoa'
		}),
		
		new OO.ui.MenuOptionWidget({
			data: 'guideline',
			label: 'Cẩm nang hướng dẫn'
		}),
		
		new OO.ui.MenuOptionWidget({
			data: 'document',
			label: 'Sách tài liệu'
		}),
		
		new OO.ui.MenuOptionWidget({
			data: 'encyclopedia',
			label: 'Bách khoa tri thức'
		})
	]
	
	var wikijuniorType = [
		new OO.ui.MenuOptionWidget({
			data: '1',
			label: 'Thế giới quanh ta'
		}),
		
		new OO.ui.MenuOptionWidget({
			data: '2',
			label: 'Khám phá thiên nhiên'
		}),
		
		new OO.ui.MenuOptionWidget({
			data: '3',
			label: 'Học đếm'
		}),
		
		new OO.ui.MenuOptionWidget({
			data: '4',
			label: 'Bách khoa tri thức'
		})
	]
	
	bookNamespace.on('labelChange', function(){
		// Set label mặc định cho bookType
		// Lấy menu bookType => Xóa hết => Thay bằng cái mới theo 2 trường hợp
		if (bookNamespace.label == "Sách wiki") {
			bookType.setLabel("Chọn kiểu sách wiki")
			bookType.getMenu().clearItems().addItems(wikibookType)
		} else {
			bookType.setLabel("Chọn kiểu sách trẻ em")
			bookType.getMenu().clearItems().addItems(wikijuniorType)
		}
	})
	
	var bookArea = new OO.ui.Widget({
		content: [
			new OO.ui.HorizontalLayout({
				items: [ 
					bookNamespace, 
					bookType 
				]
			})
		]
	})
	
/**
 * Chọn tiêu đề sách
**/
	
	var bookTitle = new OO.ui.TextInputWidget({
		placeholder: 'Chọn tiêu đề phù hợp với cuốn sách',
		indicator: 'require'
	})
	
/**
 * Menu chọn chủ đề của sách
**/

	var bookCategory = new OO.ui.TagMultiselectWidget({
		placeholder: 'Tối đa 10 từ khóa',
		tagLimit: 10,
		allowArbitrary: true,
		indicator: 'require'
	})
	
/**
 * Mô tả nội dung cuốn sách
**/

	var bookDesc = new OO.ui.MultilineTextInputWidget({
		indicator: 'require',
		placeholder: 'Ghi vào đây nội dung của cuốn sách',
		rows: 5
	})
	
/**
 * Ước lượng số trang sách
**/

	var pageEstimate = new OO.ui.DropdownWidget({
		indicator: 'down',
		label: 'Ước lượng số trang sách định viết',
		menu: {
			items: [
				new OO.ui.MenuOptionWidget({
					data: '1',
					label: 'Duy nhất một trang'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '10',
					label: 'Số trang đếm trên đầu ngón tay'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '100',
					label: 'Vài chục trang'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '1000',
					label: 'Vài trăm trang'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '5000',
					label: 'Hơn một nghìn trang'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '10000',
					label: 'Vài nghìn trang'
				})
			]
		}
	})
	
/**
 * Ước lượng thời gian hoàn thành
**/

	var timeEstimate = new OO.ui.DropdownWidget({
		indicator: 'down',
		label: 'Ước lượng thời gian hoàn thành sách',
		menu: {
			items: [
				new OO.ui.MenuOptionWidget({
					data: '1',
					label: 'Khoảng một ngày'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '7',
					label: 'Khoảng một tuần'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '30',
					label: 'Khoảng một tháng'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '90',
					label: 'Khoảng một quý'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '180',
					label: 'Tầm nửa năm'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '365',
					label: 'Khoảng 1 năm'
				}),
				
				new OO.ui.MenuOptionWidget({
					data: '1000',
					label: 'Khoảng vài năm'
				})
			]
		}
	})
/**
 * Các chương, các phần của sách
 * 
**/

	var chapterList = []

	var bookChapter = new OO.ui.FieldsetLayout({
		items: []
	})
/**
 * Widget nhập vào các chương, các phần của sách
**/
	
	var chapterInput = new OO.ui.TextInputWidget({
		value: 'Chương 1: '
	})

	chapterInput.on('enter', function() {
		chapterList.push(chapterInput.value)
		bookChapter.addItems([
			new OO.ui.LabelWidget({
				label: chapterInput.value,
				classes: ['book-chapter']
			})
		])
		setTimeout(function() {
			chapterInput.setValue('Chương ' + (chapterList.length + 1) + ': ')
		}, 1)
		
	})
	
/**
 * Nút bấm xác nhận đề xuất ý tưởng
 * 
**/

	var confirmButton = new OO.ui.ButtonWidget({
		label: 'Đăng ý tưởng',
		flags: [
			'primary',
			'progressive'
		]
	})
	
	confirmButton.on('click', function(){
		
		// Xử lý tên mục
		var headerPrefix = (bookNamespace.label == "Sách trẻ em") ? "Sách trẻ em: " : "Sách: ",
			header = headerPrefix + bookTitle.value
		
		// Thu nhặt từ khóa
		var allKeys = '',
			keyTags = bookCategory.getValue()
		for (var i = 0 ; i < keyTags.length ; i++) {
			allKeys += keyTags[i]
			if (i + 1 < keyTags.length) allKeys += ', '
		}
		
		// Các chương
		
		var allChapters = (chapterList.length > 0) ? '* Nội dung con:\n' : ''
		for (var x = 0 ; x < chapterList.length ; x++) {
			allChapters = allChapters + '** ' + chapterList[x] + '\n'
		}
		
		// Thiết lập nội dung
		var message = "''Người đề xuất ý tưởng:'' ~" + '~~\n'
					+ '=== Thông tin về sách ===\n'
					+ '* Loại sách: ' + bookNamespace.label + ' (' + bookType.label + ').\n'
					+ '* Tiêu đề sách: ' + bookTitle.value + '.\n'
					+ '* Từ khóa sách: ' + allKeys + '.\n'
					+ '=== Nội dung sách ===\n'
					+ '* Mô tả về sách: ' + bookDesc.value +'\n'
					+ allChapters
					+ '=== Công việc biên tập ===\n'
					+ '* Ước lượng số trang: ' + pageEstimate.label + '.\n'
					+ '* Uớc lượng thời gian thực hiện: ' + timeEstimate.label + '.\n'
					+ '=== Ý kiến và nhận xét ===\n'
					
		var logic = bookNamespace.label !== "Chọn khu vực sách" && 
					bookType.label !== "Chọn kiểu sách" && 
					bookType.label !== "Chọn kiểu sách wiki" && 
					bookType.label !== "Chọn kiểu sách trẻ em" && 
					bookTitle.value !== "" && 
					bookCategory.getValue().length > 0 && 
					bookDesc.value !== "" && 
					pageEstimate.label !== "Ước lượng số trang sách định viết" && 
					timeEstimate.label !== "Ước lượng thời gian hoàn thành sách"

		// Thông báo xác nhận chắc chắc => Thực hiện thêm đề mục => Tải lại trang
		
		if (logic) {
			OO.ui.confirm("Bạn chắc chắn muốn đăng ý tưởng này chứ ?").done( function (confirmed) {
				if (confirmed) {
					new mw.Api().newSection("Wikibooks:Tòa soạn", header, message)
					OO.ui.alert("Đăng ý tưởng thành công !").done(function(){ location.reload() })
				}
			})
		} else {
			new OO.ui.alert( 'Bạn chưa điền đầy đủ thông tin kìa !' )
		}
	})

/**
 * FIELDSET-LAYOUT
 * NƠI CHỨA TOÀN BỘ THÀNH PHẦN CỦA 'TRÌNH ĐỀ XUẤT Ý TƯỞNG SÁCH'
 * 
 **/
	
	var requestWizard = new OO.ui.FieldsetLayout({
		label: 'Đề xuất ý tưởng sách',
		classes: ['book-request']
	})
	
	requestWizard.addItems([
		new OO.ui.FieldLayout(bookArea, {
			label: 'Khu vực sách',
			align: 'top'
		}),
		
		new OO.ui.FieldLayout(bookTitle, {
			label: 'Tiêu đề sách',
			align: 'top'
		}),
		
		new OO.ui.FieldLayout(bookCategory, {
			label: 'Từ khóa',
			align: 'top',
			help: 'Ghi vào đây bất kỳ từ khóa nào liên quan đến sách. Tối đa 10 từ khóa.'
		}),
		
		new OO.ui.FieldLayout(pageEstimate, {
			label: 'Uớc lượng số trang sách',
			align: 'top'
		}),
		
		new OO.ui.FieldLayout(timeEstimate, {
			label: 'Uớc lượng thời gian thực hiện',
			align: 'top'
		}),
		
		new OO.ui.FieldLayout(bookDesc, {
			label: 'Mô tả về nội dung sách',
			align: 'top'
		}),
		
		new OO.ui.FieldLayout(
			new OO.ui.Widget({
				content: [bookChapter]
			}),
			{
				label: 'Các chương sách (Nhấn enter để thêm)',
				align: 'top'
			}
		),
		
		new OO.ui.FieldLayout(chapterInput, {
			align: 'top'
		}),
		
		new OO.ui.FieldLayout(confirmButton, {
			align: 'top'
		})
	])
	
	$('.request-wizard.special-tool').append(requestWizard.$element)
})