Files
AstroJS/botanjs/src/Astro/Blog/AstroEdit/Visualizer/Snippet/SiteFile.js
T
2026-06-16 08:33:04 +08:00

290 lines
8.2 KiB
JavaScript

(function ()
{
var ns = __namespace( "Astro.Blog.AstroEdit.Visualizer.Snippet" );
/** @type {typeof System.utils.IKey} */
var IKey = __import( "System.utils.IKey" );
/** @type {typeof System.utils.DataKey} */
var DataKey = __import( "System.utils.DataKey" );
/** @type {function(...?): Dandelion.IDOMElement} */
var IDOMElement = __import( "Dandelion.IDOMElement" );
/** @type {typeof Dandelion} */
var Dand = __import( "Dandelion" );
/** @type {typeof Components.MessageBox} */
var MessageBox = __import( "Components.MessageBox" );
/** @type {Astro.Blog.Config} */
var Config = __import( "Astro.Blog.Config" );
/** @type {System.utils.Perf} */
var Perf = __import( "System.utils.Perf" );
/** @type {System.Cycle.Trigger} */
var Trigger = __import( "System.Cycle.Trigger" );
/** @type {Astro.utils.Date} */
var XDate = __import( "Astro.utils.Date" );
var escapeStr = ns[ NS_INVOKE ]( "escapeStr" );
var compileProp = ns[ NS_INVOKE ]( "compileProp" );
var getData = __import( "System.Net.getData" );
/** @type {_AstConf_.SiteFile} */
var config;
var sitefile = function ( insertSnippet, snippetWrap, createContext, override )
{
config = Config.get( "SiteFile" );
if( !config ) throw new Error( "config is not defined" );
var temp, i, j
, handler = function ()
{
// Input fields
var v_snippetInput = Dand.wrap("input", null, "v_snippet_input_single", null, new IKey("type", "text"))
, input_preferred = Dand.wrapna( "input", new IKey( "type", "checkbox" ) )
;
if ( this._stage )
{
v_snippetInput.value = this._content;
input_preferred.checked = ( this._preferred == "on" );
}
// Popup MessageBox
new MessageBox(
"Insert site file"
, Dand.wrape([
v_snippetInput
, Dand.wrape( Dand.wrapne( "label", [ input_preferred, "Preferred" ] ) )
])
, "OK", "Cancel"
, visualizer.bind({
code: v_snippetInput
, input_preferred: input_preferred
, stage: this._stage
})
).show();
}
, __applyData = function (e)
{
if( typeof( e ) == "string" )
e = JSON.parse(e);
var _stage = IDOMElement( this.stage );
var isAlbum = false;
// Check if this is an album
if( isAlbum = ( "files" in e ) )
{
e.file = e.files[0];
_stage.setAttribute( new DataKey( "collection", 1 ) );
}
var s, m, l, o;
var finfo = e.file;
var content = this.stage.firstChild;
var desc = this.stage.lastChild;
var _hash = finfo.hash;
switch ( finfo.type )
{
case "image":
this.stage.removeChild(content);
// Default size is large
var _image = Dand.wrapna( "img", new IKey("src", config.path.image.large + _hash + ".jpg") );
var keys = [ new IKey( "type", "radio" ), new IKey( "name", "size_grp" + Perf.uuid ) ];
var sid;
var detectImageChange = function() { return _image.complete; };
var setImageSizeProp = function()
{
_stage.setAttribute( new DataKey( "dimensions", _image.naturalWidth + "x" + _image.naturalHeight ) );
};
var selectionChanged = function ()
{
_stage.setAttribute( new DataKey( "size", this.size ) );
//// Handles the size selection
switch(this.size)
{
case "small":
_image.setAttribute( "src", config.path.image.small + _hash + ".jpg" );
break;
case "medium":
_image.setAttribute( "src", config.path.image.medium + _hash + ".jpg" );
break;
case "large":
_image.setAttribute( "src", config.path.image.large + _hash + ".jpg" );
break;
case "original":
_image.setAttribute( "src", config.path.image.original + _hash + ".jpg" );
break;
}
Trigger.register( detectImageChange, setImageSizeProp, 100 );
};
Trigger.register( detectImageChange, setImageSizeProp, 100 );
this.stage.insertBefore( _image, desc );
desc.removeChild( desc.firstChild );
desc.appendChild(
Dand.wrape([
Dand.textNode( ( isAlbum ? "[Album] " : "" ) + "Size: ")
, s = Dand.wrapna("input", keys.concat( new IKey("id", sid = "size_" + Perf.uuid) ))
, Dand.wrapne("label", "small", new IKey("for", sid))
, m = Dand.wrapna("input", keys.concat( new IKey("id", sid = "size_" + Perf.uuid) ))
, Dand.wrapne("label", "medium", new IKey("for", sid))
, l = Dand.wrapna("input", keys.concat( new IKey("checked", "1"), new IKey("id", sid = "size_" + Perf.uuid) ))
, Dand.wrapne("label", "large (default)", new IKey("for", sid))
, o = Dand.wrapna("input", keys.concat( new IKey("id", sid = "size_" + Perf.uuid) ))
, Dand.wrapne("label", "original", new IKey("for", sid))
])
);
// ad handlers to handles size change event
IDOMElement(s).addEventListener("Change", selectionChanged.bind({size: "small"}));
IDOMElement(m).addEventListener("Change", selectionChanged.bind({size: "medium"}));
IDOMElement(l).addEventListener("Change", selectionChanged.bind({size: "large"}));
IDOMElement(o).addEventListener("Change", selectionChanged.bind({size: "original"}));
var hasValue = _stage.getDAttribute( "size" );
if( hasValue )
{
switch( hasValue )
{
case "small": s.checked = 1; break;
case "medium": m.checked = 1; break;
case "large": l.checked = 1; break;
case "original": o.checked = 1; break;
}
selectionChanged.bind({ size: hasValue })();
}
break;
case "audio":
// TODO
break;
default:
content.firstChild.nodeValue = "Regular file: " + finfo.name;
content.style.paddingBottom = "2em";
content.appendChild( Dand.wrap( "br" ) );
content.appendChild( Dand.textNode( "Date: " + XDate.pretty( new Date( finfo.date_created ), true ) ) );
}
}
, loadFailed = function (e) { }
, visualizer = function ( submitted, override )
{
var hash, preferred, _obj, stage = this && this.stage;
if( override )
{
hash = override.value;
preferred = override[ "preferred" ] ? "on" : "";
}
else
{
hash = this.code.value;
preferred = this.input_preferred.checked ? "on" : "";
}
_obj = { file: hash };
if ( submitted && hash )
{
// Visualize component
if (!stage)
{
temp = Dand.wrapc("v_box sf-view"
, [
Dand.wrape("Getting information from Server ...")
, Dand.wrapc("v_description", "Site file (hash): " + hash)
]
, [
new DataKey( "value", hash )
, new DataKey( "size", ( override && override.size ) || "large" )
, new DataKey( "preferred", preferred )
]
);
// Get data from site library
getData( config.path.info + hash, __applyData.bind({stage: temp, hash: hash}), loadFailed );
insertSnippet(
j = snippetWrap( "SiteFile", temp )
, !!override
);
}
else
{
IDOMElement( stage ).setAttribute([
new DataKey( "value", hash )
, new DataKey( "preferred", preferred )
]);
getData( config.path.info + hash, __applyData.bind({stage: temp, hash: hash}), loadFailed );
}
i = {
_content: hash
, _preferred: preferred || "off"
, _stage: temp
};
// Set context menu
createContext( i, j, handler );
}
};
if (override)
{
visualizer(true, override);
override = false;
}
else
{
return handler;
}
return true;
};
var compile = function ( stage )
{
stage = IDOMElement( stage );
var options = "";
var opt;
if( opt = stage.getDAttribute( "collection" ) )
{
options += " collection=\"1\"";
}
if( opt = stage.getDAttribute( "size" ) )
{
options += " size=\"" + opt + "\"";
}
if( opt = stage.getDAttribute( "dimensions" ) )
{
options += " dimensions=\"" + opt + "\"";
}
if( opt = stage.getDAttribute( "preferred" ) )
{
options += " preferred=\"" + opt + "\"";
}
return "[sitefile" + options + "]"
+ escapeStr( stage.getDAttribute( "value" ) )
+ "[/sitefile]";
};
__static_method( sitefile, "compile", compile );
ns[ NS_EXPORT ]( EX_CLASS, "SiteFile", sitefile );
})();