forked from Botanical/BotanJS
191 lines
4.8 KiB
JavaScript
191 lines
4.8 KiB
JavaScript
(function(){
|
|
var ns = __namespace( "Astro.Blog.AstroEdit" );
|
|
|
|
/** @type {System.Debug} */
|
|
var debug = __import( "System.Debug" );
|
|
/** @type {Components.MessageBox} */
|
|
var MessageBox = __import( "Components.MessageBox" );
|
|
/** @type {Dandelion} */
|
|
var Dand = __import( "Dandelion" );
|
|
/** @type {Dandelion.IDOMElement} */
|
|
var IDOMElement = __import( "Dandelion.IDOMElement" );
|
|
/** @type {Astro.Blog.Config} */
|
|
var Config = __import( "Astro.Blog.Config" );
|
|
|
|
var postData = __import( "System.Net.postData" );
|
|
|
|
/* @type {AstroEdit.IPlugins} */
|
|
var Flag = function ( id, target, flagConf )
|
|
{
|
|
this.id = id;
|
|
var stage = Dand.id( target );
|
|
var ae_addFlag = Dand.glass( "ae_flag_add" , true, stage )[0];
|
|
var ae_flags = Dand.glass( "ae_flags" , false, stage )[0];
|
|
|
|
// Store flags for future use
|
|
var flags = {};
|
|
|
|
////// Handlers
|
|
ae_addFlag.addEventListener(
|
|
"Click", function ( e )
|
|
{
|
|
e.stopPropagation();
|
|
// Input fields
|
|
var ae_flagInput;
|
|
|
|
// Popup MessageBox
|
|
new MessageBox(
|
|
"Add new flag(s)"
|
|
, Dand.wrape([
|
|
Dand.wrapc(
|
|
"v_instruction flsf"
|
|
, "Flags are separated by \\n. (existing flags will be ignored.)"
|
|
)
|
|
, ae_flagInput = Dand.wrap( "textarea", null, "v_snippet_input" )
|
|
])
|
|
, "OK", "Cancel"
|
|
, parseFlags.bind( ae_flagInput )
|
|
).show();
|
|
}
|
|
);
|
|
|
|
var deleteFlag = function (e)
|
|
{
|
|
e.stopPropagation();
|
|
var p = { stage: this.parentNode };
|
|
p[ id ] = this.nodeValue;
|
|
p[ "id" ] = id;
|
|
postData( flagConf.URICount, p, confirmDelete.bind( p ), serverFailed );
|
|
};
|
|
|
|
var confirmDelete = function (obj)
|
|
{
|
|
new MessageBox(
|
|
"Delete Flag"
|
|
, [
|
|
Dand.wrapc("ae_blockswitch",
|
|
[
|
|
Dand.textNode( "Are you sure you want to delete " )
|
|
, Dand.wrap( "span", null, "flag_active", Dand.textNode( this[ id ] ) )
|
|
, Dand.textNode( " ?." )
|
|
]
|
|
)
|
|
, obj.count > 0
|
|
? Dand.wrape([
|
|
Dand.textNode( "This will affect " )
|
|
, Dand.wrap(
|
|
"span", null, "ae_affected_count", Dand.textNode( obj.count )
|
|
)
|
|
, Dand.textNode(" article(s).")
|
|
])
|
|
: null
|
|
]
|
|
, "Delete", "No"
|
|
, doDelete.bind( this )
|
|
).show();
|
|
};
|
|
|
|
var doDelete = function( confirmed )
|
|
{
|
|
if ( confirmed )
|
|
{
|
|
this[ "del" ] = 1;
|
|
postData(
|
|
flagConf.URISet
|
|
, this
|
|
, deleteSuccess.bind( this )
|
|
, serverFailed
|
|
);
|
|
}
|
|
};
|
|
|
|
var deleteSuccess = function(obj)
|
|
{
|
|
// Remove element
|
|
this.stage.parentNode.removeChild( this.stage );
|
|
// Delete reference
|
|
delete flags[ this[ id ] ];
|
|
};
|
|
|
|
var parseFlags = function ()
|
|
{
|
|
// Filter invalid flags
|
|
var nflags = this.value.trim().match(/[^\n]+/g), d, e;
|
|
for (var i in nflags)
|
|
{
|
|
if(!flags[(i = nflags[i]).toLowerCase()])
|
|
{
|
|
flags[i] = Dand.wrap("span", null, "flag_active",
|
|
[d = Dand.wrap("span", null, "ae_flag_delete", "\u00D7"), e = Dand.textNode(i)]
|
|
);
|
|
// Seperator
|
|
ae_flags.appendChild(Dand.textNode(" "));
|
|
ae_flags.appendChild(flags[i]);
|
|
|
|
flags[i].onclick = function() { toggleFlag(this) }.bind(flags[i]);
|
|
d.onclick = deleteFlag.bind(e);
|
|
|
|
}
|
|
else
|
|
{
|
|
debug.Info("Flag exist: " + i);
|
|
// Hightlight these flags
|
|
flags[i.toLowerCase()].className = "flag_active";
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
var toggleFlag = function (flag)
|
|
{
|
|
var isEnabled = flag.className == "flag_active" ? true : false;
|
|
flag.className = isEnabled ? "ae_disabled" : "flag_active";
|
|
};
|
|
|
|
var serverFailed = function (obj) { };
|
|
|
|
var cflag, ae_children = ae_flags.childNodes;
|
|
for (var i in ae_children)
|
|
{
|
|
if((cflag = ae_children[i]).nodeType == 1)
|
|
{
|
|
flags[cflag.lastChild.nodeValue.toLowerCase()] = cflag;
|
|
IDOMElement( cflag ).addEventListener( "Click", function() { toggleFlag( this ); }.bind( cflag ) );
|
|
// Bind the last child (x button) to firstChild (textNode: flagname)
|
|
IDOMElement( cflag.firstChild ).addEventListener( "Click", deleteFlag.bind( cflag.lastChild ) );
|
|
}
|
|
}
|
|
|
|
this.getData = function ()
|
|
{
|
|
// Compile flag list
|
|
var tlist = [];
|
|
|
|
// Return names
|
|
for (var i in flags)
|
|
{
|
|
if(flags[i].className == "flag_active")
|
|
tlist[tlist.length] = flags[i].lastChild.nodeValue;
|
|
}
|
|
|
|
return tlist.join("\n");
|
|
}
|
|
|
|
this.setForView = function ( flagList )
|
|
{
|
|
// Disable all flags first
|
|
for ( var i in flags ) flags[i].className = "ae_disabled";
|
|
|
|
// Set flags from flagList
|
|
for ( i in flagList )
|
|
if ( flagList[i] ) flags[flagList[i].toLowerCase()].className = "flag_active";
|
|
}
|
|
}
|
|
|
|
Flag.prototype.getSetData = function () { };
|
|
Flag.prototype.setForView = function ( flagList ) { };
|
|
|
|
ns[ NS_EXPORT ]( EX_CLASS, "Flag", Flag );
|
|
|
|
})();
|