Commit 9a9020ba93a15d68e6a716f486cac974f0e13e49

Golmote 2015-09-03T22:54:45

Merge pull request #561 from Golmote/prism-check-all Add a "Select All" languages checkbox (fix #513)

diff --git a/components.js b/components.js
index 4bc1146..01fd5f9 100644
--- a/components.js
+++ b/components.js
@@ -35,7 +35,8 @@ var components = {
 		"meta": {
 			"path": "components/prism-{id}",
 			"noCSS": true,
-			"examplesPath": "examples/prism-{id}"
+			"examplesPath": "examples/prism-{id}",
+			"addCheckAll": true
 		},
 		"markup": {
 			"title": "Markup",
diff --git a/download.html b/download.html
index 103d813..3cb74e2 100644
--- a/download.html
+++ b/download.html
@@ -71,7 +71,8 @@ section.options#category-plugins {
 		column-span: all;
 	}
 
-	section.options#category-languages label[data-id="javascript"] {
+	section.options#category-languages label[data-id="javascript"],
+	section.options label[data-id^="check-all-"] {
 		border-bottom: 1px solid #aaa;
 		padding-bottom: 1em;
 		margin-bottom: 1em;
diff --git a/download.js b/download.js
index 742da97..e56e587 100644
--- a/download.js
+++ b/download.js
@@ -64,6 +64,37 @@ for (var category in components) {
 		},
 		inside: '#components'
 	});
+
+	if (all.meta.addCheckAll) {
+		$u.element.create('label', {
+			attributes: {
+				'data-id': 'check-all-' + category
+			},
+			contents: [
+				{
+					tag: 'input',
+					properties: {
+						type: 'checkbox',
+						name: 'check-all-' + category,
+						value: '',
+						checked: false,
+						onclick: (function(category, all){
+							return function () {
+								var checkAll = this;
+								$$('input[name="download-' + category + '"]').forEach(function(input) {
+									all[input.value].enabled = input.checked = checkAll.checked;
+								});
+
+								update(category);
+							};
+						})(category, all)
+					}
+				},
+				'Select/unselect all'
+			],
+			inside: all.meta.section
+		});
+	}
 	
 	for (var id in all) {
 		if(id === 'meta') {
@@ -266,10 +297,11 @@ function update(updatedCategory, updatedId){
 	
 	for (var category in components) {
 		var all = components[category];
-		
+		var allChecked = true;
+
 		for (var id in all) {
 			var info = all[id];
-			
+
 			if (info.enabled || id == updatedId) {
 				var distro = info.files[minified? 'minified' : 'dev'];
 				
@@ -295,18 +327,28 @@ function update(updatedCategory, updatedId){
 					}
 				});
 			}
+			if (id !== 'meta' && !info.enabled) {
+				allChecked = false;
+			}
+		}
+
+		if (all.meta.addCheckAll) {
+			$('input[name="check-all-' + category + '"]').checked = allChecked;
 		}
 	}
 	
 	total.all = total.js + total.css;
-	updated.all = updated.js + updated.css;
-	
-	$u.element.prop($('label[data-id="' + updatedId + '"] .filesize'), {
-		textContent: prettySize(updated.all),
-		title: (updated.js? Math.round(100 * updated.js / updated.all) + '% JavaScript' : '') + 
-				(updated.js && updated.css? ' + ' : '') +
-				(updated.css? Math.round(100 * updated.css / updated.all) + '% CSS' : '')
-	});
+
+	if (updatedId) {
+		updated.all = updated.js + updated.css;
+
+		$u.element.prop($('label[data-id="' + updatedId + '"] .filesize'), {
+			textContent: prettySize(updated.all),
+			title: (updated.js ? Math.round(100 * updated.js / updated.all) + '% JavaScript' : '') +
+				(updated.js && updated.css ? ' + ' : '') +
+				(updated.css ? Math.round(100 * updated.css / updated.all) + '% CSS' : '')
+		});
+	}
 	
 	$('#filesize').textContent = prettySize(total.all);