diff --git a/classes/ComicPress.inc b/classes/ComicPress.inc
index ba7a956..2cede76 100644
--- a/classes/ComicPress.inc
+++ b/classes/ComicPress.inc
@@ -31,7 +31,8 @@ class ComicPress {
),
'helpers' => array(),
'storyline_order' => '',
- 'enabled_backends' => null
+ 'enabled_backends' => null,
+ 'category_groupings' => array()
);
var $backends = array();
diff --git a/classes/ComicPressAdmin.inc b/classes/ComicPressAdmin.inc
index ba9c0d9..60c7788 100644
--- a/classes/ComicPressAdmin.inc
+++ b/classes/ComicPressAdmin.inc
@@ -224,6 +224,23 @@ class ComicPressAdmin {
}
}
+ function _render_admin_storyline_grouping_tree($node, $group_name, $category_ids) {
+ foreach ($node as $category_id => $children) {
+ $category = get_category($category_id);
+ echo '
';
+ echo '';
+ if (is_array($children)) {
+ echo '';
+ $this->_render_admin_storyline_grouping_tree($children, $group_name, $category_ids);
+ echo '
';
+ }
+ echo '';
+ }
+ }
+
/**
* Render the comic image ordering interface.
*/
@@ -394,6 +411,14 @@ class ComicPressAdmin {
case 'enabled_backends':
$this->comicpress->comicpress_options['enabled_backends'] = array_intersect(array_keys($info[$option]), $this->comicpress->get_valid_backends());
break;
+ case 'category_groupings':
+ $this->comicpress->comicpress_options['category_groupings'] = array();
+ foreach ($info[$option] as $key => $settings) {
+ if (!empty($settings['name'])) {
+ $this->comicpress->comicpress_options['category_groupings'][$settings['name']] = isset($settings['category']) ? $settings['category'] : array();
+ }
+ }
+ break;
}
}
}
@@ -452,6 +477,20 @@ class ComicPressAdmin {
exit(0);
}
+
+ function handle_update_get_new_category_group_editor($info) {
+ $key = substr(md5(rand()), 0, 6);
+ $name = 'group';
+ $category_ids = array();
+
+ $storyline = new ComicPressStoryline();
+ $storyline->normalize();
+ $storyline->read_from_options();
+
+ require_once('partials/_category-grouping-editor.inc');
+ exit(0);
+ }
+
/**
* Update the zoom slider info.
* @param $info The browser input.
diff --git a/classes/partials/_category-grouping-editor.inc b/classes/partials/_category-grouping-editor.inc
new file mode 100644
index 0000000..c189877
--- /dev/null
+++ b/classes/partials/_category-grouping-editor.inc
@@ -0,0 +1,22 @@
+
diff --git a/classes/partials/options-admin.inc b/classes/partials/options-admin.inc
index b3324ad..37b2e19 100644
--- a/classes/partials/options-admin.inc
+++ b/classes/partials/options-admin.inc
@@ -7,6 +7,23 @@
+
+
+
+
+ comicpress->comicpress_options['category_groupings'] as $name => $category_ids) {
+ $key = $name;
+ include('_category-grouping-editor.inc');
+ }
+ ?>
+
+
[+] Add a new category group
+
+
+
+
+
@@ -73,5 +90,10 @@
tab_holder.childElements().pop().addClassName('last');
show_tab(tab_holder.childElements().shift().id);
+
+ Event.observe(document, 'dom:loaded', function() {
+ ComicPressAdmin.image_type_editor_nonce = '';
+ ComicPressAdmin.category_group_editor_nonce = '';
+ });
}());
diff --git a/css/cp-admin.css b/css/cp-admin.css
index 42e55da..b164dd0 100644
--- a/css/cp-admin.css
+++ b/css/cp-admin.css
@@ -259,3 +259,21 @@ tr.highlighted td {
border: solid black 1px;
padding: 0 10px 10px;
}
+
+.category-group-holder ul ul {
+ margin-left: 20px
+}
+
+.category-group-holder {
+ border: solid #aaa 1px;
+ margin: 0 0 10px;
+ padding: 5px;
+}
+
+.delete-category-group-holder {
+ float: right
+}
+
+.category-group-holder .selected {
+ background-color: #99ccbb
+}
diff --git a/js/CategoryGroups.js b/js/CategoryGroups.js
new file mode 100644
index 0000000..e69de29
diff --git a/js/Storyline.js b/js/Storyline.js
index 0f3d855..91d16c2 100644
--- a/js/Storyline.js
+++ b/js/Storyline.js
@@ -1,5 +1,6 @@
var Storyline = {};
var ComicImageTypes = {};
+var CategoryGroupings = {};
(function() {
Storyline.get_order = function() {
@@ -76,7 +77,8 @@ var ComicImageTypes = {};
method: 'get',
parameters: {
'cp[_nonce]': ComicPressAdmin.nonce,
- 'cp[action]': 'get-new-image-type-editor'
+ 'cp[action]': 'get-new-image-type-editor',
+ 'cp[_action_nonce]': ComicPressAdmin.image_type_editor_nonce
},
insertion: 'bottom',
onComplete: function() {
@@ -85,4 +87,58 @@ var ComicImageTypes = {};
});
});
};
+
+ CategoryGroupings.highlight_child_levels = function(e) {
+ $$('.category-group-holder input[type=checkbox]').each(function(cb) {
+ cb.disabled = false;
+ });
+
+ $$('.category-group-holder li').each(function(li) {
+ var all_cb = li.select('input[type=checkbox]');
+ var cb = all_cb.shift();
+ li.removeClassName('selected');
+ if (cb && cb.checked) {
+ all_cb.each(function(ncb) {
+ ncb.disabled = true;
+ });
+ li.addClassName('selected');
+ }
+ });
+
+ $$('.category-group-holder').each(function(cgh) {
+ var all_off = true;
+ cgh.select('input[type=checkbox]').each(function(c) {
+ if (c.checked) { all_off = false; }
+ });
+ cgh.select('.empty-group-warning').pop()[all_off ? 'show' : 'hide']();
+ });
+ }
+
+ CategoryGroupings.setup_editors = function() {
+ $$('.category-group-holder input[type=checkbox], .category-group-holder label').each(function(cb) {
+ cb.stopObserving('click');
+ cb.observe('click', CategoryGroupings.highlight_child_levels);
+ });
+ }
+
+ CategoryGroupings.setup = function() {
+ CategoryGroupings.setup_editors();
+ CategoryGroupings.highlight_child_levels();
+
+ $('add-new-category-group').observe('click', function(e) {
+ Event.stop(e);
+ new Ajax.Updater('category-groups-holder', ComicPressAdmin.ajax_uri, {
+ method: 'get',
+ parameters: {
+ 'cp[_nonce]': ComicPressAdmin.nonce,
+ 'cp[action]': 'get-new-category-group-editor',
+ 'cp[_action_nonce]': ComicPressAdmin.category_group_editor_nonce
+ },
+ onComplete: function() {
+ CategoryGroupings.setup_editors();
+ },
+ insertion: 'bottom'
+ });
+ });
+ }
}())