2014-12-30 13:04:31 -05:00
"use strict" ;
2015-01-01 16:24:47 -05:00
/*global define, app, socket, ajaxify, RELATIVE_PATH, bootbox */
2014-12-30 13:04:31 -05:00
define ( 'admin/manage/category' , [
'uploader' ,
2015-03-25 19:29:24 -04:00
'iconSelect' ,
2015-03-25 15:42:15 -04:00
'admin/modules/colorpicker' ,
'autocomplete'
] , function ( uploader , iconSelect , colorpicker , autocomplete ) {
2014-12-30 13:04:31 -05:00
var Category = { } ;
Category . init = function ( ) {
var modified _categories = { } ;
2015-01-01 16:24:47 -05:00
function modified ( el ) {
var cid = $ ( el ) . parents ( 'form' ) . attr ( 'data-cid' ) ;
2015-01-01 15:35:22 -05:00
if ( cid ) {
2014-12-30 13:04:31 -05:00
modified _categories [ cid ] = modified _categories [ cid ] || { } ;
modified _categories [ cid ] [ $ ( el ) . attr ( 'data-name' ) ] = $ ( el ) . val ( ) ;
}
}
2015-03-25 17:51:46 -04:00
function save ( e ) {
e . preventDefault ( ) ;
2014-12-30 13:04:31 -05:00
if ( Object . keys ( modified _categories ) . length ) {
socket . emit ( 'admin.categories.update' , modified _categories , function ( err , result ) {
if ( err ) {
return app . alertError ( err . message ) ;
}
if ( result && result . length ) {
app . alert ( {
title : 'Updated Categories' ,
message : 'Category IDs ' + result . join ( ', ' ) + ' was successfully updated.' ,
type : 'success' ,
timeout : 2000
} ) ;
}
} ) ;
modified _categories = { } ;
}
}
$ ( '.blockclass, form.category select' ) . each ( function ( ) {
var $this = $ ( this ) ;
$this . val ( $this . attr ( 'data-value' ) ) ;
} ) ;
function enableColorPicker ( idx , inputEl ) {
var $inputEl = $ ( inputEl ) ,
previewEl = $inputEl . parents ( '[data-cid]' ) . find ( '.preview-box' ) ;
colorpicker . enable ( $inputEl , function ( hsb , hex ) {
if ( $inputEl . attr ( 'data-name' ) === 'bgColor' ) {
previewEl . css ( 'background' , '#' + hex ) ;
} else if ( $inputEl . attr ( 'data-name' ) === 'color' ) {
previewEl . css ( 'color' , '#' + hex ) ;
}
modified ( $inputEl [ 0 ] ) ;
} ) ;
}
function setupEditTargets ( ) {
$ ( '[data-edit-target]' ) . on ( 'click' , function ( ) {
var $this = $ ( this ) ,
target = $ ( $this . attr ( 'data-edit-target' ) ) ;
$this . addClass ( 'hide' ) ;
target . removeClass ( 'hide' ) . on ( 'blur' , function ( ) {
$this . removeClass ( 'hide' ) . children ( 'span' ) . html ( this . value ) ;
$ ( this ) . addClass ( 'hide' ) ;
} ) . val ( $this . children ( 'span' ) . html ( ) ) ;
target . focus ( ) ;
} ) ;
}
2015-01-01 15:35:22 -05:00
// If any inputs have changed, prepare it for saving
$ ( 'form.category input, form.category select' ) . on ( 'change' , function ( ev ) {
modified ( ev . target ) ;
} ) ;
2014-12-30 13:04:31 -05:00
2015-01-01 15:35:22 -05:00
// Colour Picker
$ ( '[data-name="bgColor"], [data-name="color"]' ) . each ( enableColorPicker ) ;
2014-12-30 13:04:31 -05:00
2015-03-25 17:51:46 -04:00
$ ( '.save' ) . on ( 'click' , save ) ;
$ ( '.revert' ) . on ( 'click' , ajaxify . refresh ) ;
$ ( '.purge' ) . on ( 'click' , function ( e ) {
e . preventDefault ( ) ;
2014-12-30 13:04:31 -05:00
2015-01-01 15:35:22 -05:00
bootbox . confirm ( '<p class="lead">Do you really want to purge this category "' + $ ( 'form.category' ) . find ( 'input[data-name="name"]' ) . val ( ) + '"?</p><p><strong class="text-danger">Warning!</strong> All topics and posts in this category will be purged!</p>' , function ( confirm ) {
if ( ! confirm ) {
return ;
}
2015-03-25 17:51:46 -04:00
socket . emit ( 'admin.categories.purge' , ajaxify . variables . get ( 'cid' ) , function ( err ) {
2015-01-01 15:35:22 -05:00
if ( err ) {
return app . alertError ( err . message ) ;
2014-12-30 13:04:31 -05:00
}
2015-01-01 15:35:22 -05:00
app . alertSuccess ( 'Category purged!' ) ;
2015-03-25 17:51:46 -04:00
ajaxify . go ( 'admin/manage/categories' ) ;
2014-12-30 13:04:31 -05:00
} ) ;
} ) ;
2015-01-01 15:35:22 -05:00
} ) ;
// Image Uploader
$ ( '.upload-button' ) . on ( 'click' , function ( ) {
var inputEl = $ ( this ) ,
cid = inputEl . attr ( 'data-cid' ) ;
2015-03-25 11:58:21 -04:00
uploader . open ( RELATIVE _PATH + '/api/admin/category/uploadpicture' , { cid : cid } , 0 , function ( imageUrlOnServer ) {
2015-01-01 15:35:22 -05:00
inputEl . val ( imageUrlOnServer ) ;
2015-03-25 15:42:15 -04:00
var previewBox = inputEl . parent ( ) . parent ( ) . siblings ( '.category-preview' ) ;
2015-01-01 15:35:22 -05:00
previewBox . css ( 'background' , 'url(' + imageUrlOnServer + '?' + new Date ( ) . getTime ( ) + ')' )
. css ( 'background-size' , 'cover' ) ;
2015-01-01 16:24:47 -05:00
modified ( inputEl [ 0 ] ) ;
2015-01-01 15:35:22 -05:00
} ) ;
} ) ;
2015-01-01 16:24:47 -05:00
// Icon selection
$ ( '.category-preview' ) . on ( 'click' , function ( ev ) {
iconSelect . init ( $ ( this ) . find ( 'i' ) , modified ) ;
} ) ;
2015-03-25 17:21:38 -04:00
// Parent Category Selector
$ ( 'button[data-action="setParent"]' ) . on ( 'click' , Category . launchParentSelector ) ;
$ ( 'button[data-action="removeParent"]' ) . on ( 'click' , function ( ) {
var payload = { } ;
payload [ ajaxify . variables . get ( 'cid' ) ] = {
parentCid : 0
} ;
socket . emit ( 'admin.categories.update' , payload , function ( err ) {
if ( err ) {
return app . alertError ( err . message ) ;
}
ajaxify . refresh ( ) ;
} ) ;
} ) ;
setupEditTargets ( ) ;
2015-03-25 15:42:15 -04:00
Category . setupPrivilegeTable ( ) ;
2014-12-30 13:04:31 -05:00
} ;
2015-03-25 15:42:15 -04:00
Category . setupPrivilegeTable = function ( ) {
var searchEl = $ ( '.privilege-search' ) ,
searchObj = autocomplete . user ( searchEl ) ;
// User search + addition to table
searchObj . on ( 'autocompleteselect' , function ( ev , ui ) {
socket . emit ( 'admin.categories.setPrivilege' , {
cid : ajaxify . variables . get ( 'cid' ) ,
privilege : 'read' ,
set : true ,
member : ui . item . user . uid
} , function ( err ) {
if ( err ) {
return app . alertError ( err . message ) ;
}
Category . refreshPrivilegeTable ( ) ;
searchEl . val ( '' ) ;
} ) ;
} ) ;
// Checkbox event capture
$ ( '.privilege-table-container' ) . on ( 'change' , 'input[type="checkbox"]' , function ( ) {
var checkboxEl = $ ( this ) ,
privilege = checkboxEl . parent ( ) . attr ( 'data-privilege' ) ,
state = checkboxEl . prop ( 'checked' ) ,
rowEl = checkboxEl . parents ( 'tr' ) ,
2015-03-25 17:41:54 -04:00
member = rowEl . attr ( 'data-group-name' ) || rowEl . attr ( 'data-uid' ) ;
2015-03-25 15:42:15 -04:00
if ( member ) {
socket . emit ( 'admin.categories.setPrivilege' , {
cid : ajaxify . variables . get ( 'cid' ) ,
privilege : privilege ,
set : state ,
member : member
} , function ( err ) {
if ( err ) {
return app . alertError ( err . message ) ;
}
checkboxEl . replaceWith ( '<i class="fa fa-spin fa-spinner"></i>' ) ;
Category . refreshPrivilegeTable ( ) ;
} ) ;
} else {
app . alertError ( 'No member or group was selected' ) ;
}
} )
} ;
Category . refreshPrivilegeTable = function ( ) {
2015-03-25 17:41:54 -04:00
socket . emit ( 'admin.categories.getPrivilegeSettings' , ajaxify . variables . get ( 'cid' ) , function ( err , privileges ) {
2015-03-25 15:42:15 -04:00
if ( err ) {
return app . alertError ( err . message ) ;
}
templates . parse ( 'admin/partials/categories/privileges' , {
privileges : privileges
} , function ( html ) {
$ ( '.privilege-table-container' ) . html ( html ) ;
} ) ;
} ) ;
} ;
2015-03-25 17:21:38 -04:00
Category . launchParentSelector = function ( ) {
socket . emit ( 'categories.get' , function ( err , categories ) {
templates . parse ( 'partials/category_list' , {
categories : categories
} , function ( html ) {
var modal = bootbox . dialog ( {
message : html ,
title : 'Set Parent Category'
} ) ;
modal . find ( 'li[data-cid]' ) . on ( 'click' , function ( ) {
var parentCid = $ ( this ) . attr ( 'data-cid' ) ,
payload = { } ;
payload [ ajaxify . variables . get ( 'cid' ) ] = {
parentCid : parentCid
} ;
socket . emit ( 'admin.categories.update' , payload , function ( err ) {
if ( err ) {
return app . alertError ( err . message ) ;
}
modal . modal ( 'hide' ) ;
ajaxify . refresh ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;
} ;
2014-12-30 13:04:31 -05:00
return Category ;
} ) ;