forked from Botanical/BotanJS
Generalize tags to flags
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
(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)
|
||||
{
|
||||
var p = { flag: this.nodeValue, sflage: this.parentNode };
|
||||
postData( flagConf.URICount, p, confirmDelete.bind( p ), serverFailed );
|
||||
e.stopPropagation();
|
||||
};
|
||||
|
||||
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.flag ) )
|
||||
, 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 )
|
||||
{
|
||||
postData(
|
||||
flagConf.URISet
|
||||
, { flag: this.flag, del: 1 }
|
||||
, deleteSuccess.bind( this )
|
||||
, serverFailed
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var deleteSuccess = function(obj)
|
||||
{
|
||||
// Remove element
|
||||
this.sflage.parentNode.removeChild(this.sflage);
|
||||
// Delete reference
|
||||
delete flags[this.flag];
|
||||
};
|
||||
|
||||
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.getSetData = function ( data )
|
||||
{
|
||||
// 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;
|
||||
}
|
||||
|
||||
data[ this.id ] = 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 );
|
||||
|
||||
})();
|
||||
Reference in New Issue
Block a user