Revision: 3872 Author: hans URL: http://bknr.net/trac/changeset/3872
Fix image editing. Factor out login Javascript. Minor tweaks.
U trunk/projects/quickhoney/src/handlers.lisp U trunk/projects/quickhoney/src/webserver.lisp U trunk/projects/quickhoney/website/static/javascript.js A trunk/projects/quickhoney/website/static/login.js U trunk/projects/quickhoney/website/templates/image-browse.xml U trunk/projects/quickhoney/website/templates/index.xml U trunk/projects/quickhoney/website/templates/login.xml
Modified: trunk/projects/quickhoney/src/handlers.lisp =================================================================== --- trunk/projects/quickhoney/src/handlers.lisp 2008-09-09 17:41:22 UTC (rev 3871) +++ trunk/projects/quickhoney/src/handlers.lisp 2008-09-09 19:50:55 UTC (rev 3872) @@ -139,26 +139,32 @@ (:default-initargs :object-class 'quickhoney-image))
(defmethod handle-object-form ((handler json-edit-image-handler) action image) - (format t "; invalid action ~A or invalid object ~A~%" action image)) + (with-json-response () + (encode-object-element "result" "error") + (encode-object-element "message" (format nil "; invalid action ~A or invalid object ~A~%" action image))))
(defun image-keywords-from-request-parameters () (let (retval) - (dolist (keyword *editable-keywords* retval) + (dolist (keyword *editable-keywords* + retval) (when (query-param (string-downcase (symbol-name keyword))) (push keyword retval)))))
(defmethod handle-object-form ((handler json-edit-image-handler) (action (eql :edit)) image) (with-query-params (client spider-keywords) + (format t "editing image ~A client ~A spider-keywords ~A~%" image client spider-keywords) (with-transaction (:edit-image) (setf (quickhoney-image-client image) client (quickhoney-image-spider-keywords image) spider-keywords (store-image-keywords image) (append (set-difference (store-image-keywords image) *editable-keywords*) (image-keywords-from-request-parameters))))) + (setf *last-image-upload-timestamp* (get-universal-time)) (with-json-response () (encode-object-element "result" "edited")))
(defmethod handle-object-form ((handler json-edit-image-handler) (action (eql :delete)) (image quickhoney-image)) (delete-object image) + (setf *last-image-upload-timestamp* (get-universal-time)) (with-json-response () (encode-object-element "result" "deleted")))
@@ -292,7 +298,8 @@ (let* ((image (make-store-image :name (pathname-name (upload-original-filename uploaded-file)) :class-name 'quickhoney-image :keywords (cons :upload (image-keywords-from-request-parameters)) - :initargs (list :cat-sub (mapcar #'make-keyword-from-string (decoded-handler-path handler)) + :initargs (list :owner (bknr-session-user) + :cat-sub (mapcar #'make-keyword-from-string (decoded-handler-path handler)) :client client :spider-keywords spider-keywords)))) (with-http-response ()
Modified: trunk/projects/quickhoney/src/webserver.lisp =================================================================== --- trunk/projects/quickhoney/src/webserver.lisp 2008-09-09 17:41:22 UTC (rev 3871) +++ trunk/projects/quickhoney/src/webserver.lisp 2008-09-09 19:50:55 UTC (rev 3872) @@ -59,4 +59,4 @@ :site-logo-url "/image/quickhoney/color,000000,33ff00" :login-logo-url "/image/quickhoney/color,000000,33ff00/double,3" :style-sheet-urls '("/static/yui/reset-fonts/reset-fonts.css" "/static/quickhoney.css" "/static/cms.css") - :javascript-urls '("/static/javascript.js"))) + :javascript-urls '("/MochiKit/MochiKit.js" "/static/javascript.js")))
Modified: trunk/projects/quickhoney/website/static/javascript.js =================================================================== --- trunk/projects/quickhoney/website/static/javascript.js 2008-09-09 17:41:22 UTC (rev 3871) +++ trunk/projects/quickhoney/website/static/javascript.js 2008-09-09 19:50:55 UTC (rev 3872) @@ -97,31 +97,76 @@
/* image editing */
+function all_inputs(parent) { + var inputs = []; + map(function (tag) { + inputs = inputs.concat(getElementsByTagAndClassName(tag, null, parent)); + }, ['textarea', 'select', 'input']); + return inputs; +} + +function submit_json(url, form, handler) { + var names = []; + var values = []; + + if (form) { + map(function (input) { + names.push(input.name); + if (input.type != 'checkbox' || input.checked) { + values.push(input.value); + } + }, all_inputs(form)); + } + + MochiKit.Async.doXHR(url, { mimeType: 'text/plain', + headers: [['Accept', 'application/json']], + method: 'POST', + headers: {"Content-Type":"application/x-www-form-urlencoded"}, + sendContent: queryString(names, values) }) + .addCallbacks(function (req) { handler(MochiKit.Base.evalJSON(req.responseText)) }, + alert); + +} + function do_edit() { current_image.client = $("edit_client").value; current_image.spider_keywords = $("edit_keywords").value; current_image.keywords.explicit = $("edit_explicit").checked ? true : false;
show_cms_window('saving_edits_form'); // hide edit window until server replies + + submit_json('/json-edit-image/' + current_image.id + '?action=edit', 'edit_form_element', image_edited); + + return false; }
-function image_edited() { +function image_edited(json_data) { + if (json_data.result == 'error') { + alert(json_data.message); + } show_cms_window("image_edited_form"); setTimeout("show_cms_window('edit_form')", 2000); // reload_clients(); }
+function do_delete() { + + if (confirm('delete this image?')) { + show_cms_window('saving_edits_form'); // hide edit window until server replies + + submit_json('/json-edit-image/' + current_image.id + '?action=delete', null, image_deleted); + } + + return false; +} + function image_deleted() {
show_cms_window("image_deleted_form"); current_image = null; $("image_detail").innerHTML = ''; - if (current_directory == 'home') { - load_button_images(); - } else { - setTimeout("if (!current_image) { show_cms_window('upload_form'); }", 2000); - do_query(); - } + setTimeout("if (!current_image) { show_cms_window('upload_form'); }", 2000); + do_query(); }
/* clients list */ @@ -441,6 +486,11 @@ } }
+function do_query() +{ + query_imagedb(current_directory, current_subdirectory, true); +} + /* pages handling */
function Page(link_color, action) { @@ -469,6 +519,7 @@
if (logged_in) { if (current_directory == "home") { + show_cms_window(); } else if (current_directory == "news") { show_cms_window("edit_news"); } else if (current_directory && current_subdirectory) { @@ -1008,14 +1059,12 @@ wait_for_images(function () { img.style.visibility = 'inherit' }); }
- if (logged_in) { - $("edit_form_element").setAttribute("action", "/edit-image-js/" + current_image.id); $("edit_client").value = current_image.client; - $("edit_keywords").value = current_image.spider_keywords; + $("edit_keywords").value = current_image.spider_keywords || ""; map(function(keyword) { $('edit_' + keyword).checked = current_image.keywords[keyword] ? true : false; - }, ['explicit', 'buy-file', 'buy-print', 'buy-t-shirt']); + }, ['explicit']); show_cms_window("edit_form"); } } @@ -1217,7 +1266,11 @@ }
function make_ipod_image() { - window.open('/image/' + encodeURI(current_image.name) + '/cell,,320,480/download,' + encodeURI(current_image.name) + '.jpg'); + window.open('/image/' + + encodeURI(current_image.name) + + '/cell,,' + + ((current_image.width < current_image.height) ? '320,480' : '480,320') + + '/download,' + encodeURI(current_image.name) + '.jpg'); }
NOTICE = partial(SPAN, { 'class': 'notice' }); @@ -1414,7 +1467,7 @@ hidden_IMG({ src: recolored_image_path('hey'), 'class': 'flag', width: 37, height: 16}), DIV({ 'class': 'button-section-items last' }, UL(null, - make_image_action_button('ipod', 'iPod', make_ipod_image), + make_image_action_button('ipod', 'iPhone', make_ipod_image), make_image_action_button('comment', 'Comment', make_comment_form)))));
replaceChildNodes('image_action_buttons', groups); @@ -1436,18 +1489,3 @@ wait_for_images(function () { $('image_action_buttons').style.visibility = 'inherit'; }); }
-/* login stuff */ - -function init_login () { - $('username').focus(); - $('login_form').style.display = 'block'; -} - -function do_login () { - - $('login_form').style.display = 'none'; - $('logging-in').style.display = 'block'; - - return true; -} -
Added: trunk/projects/quickhoney/website/static/login.js =================================================================== --- trunk/projects/quickhoney/website/static/login.js (rev 0) +++ trunk/projects/quickhoney/website/static/login.js 2008-09-09 19:50:55 UTC (rev 3872) @@ -0,0 +1,15 @@ +/* login stuff */ + +function init_login () { + $('login_form').style.display = 'block'; + $('username').focus(); +} + +function do_login () { + + $('login_form').style.display = 'none'; + $('logging-in').style.display = 'block'; + + return true; +} +
Modified: trunk/projects/quickhoney/website/templates/image-browse.xml =================================================================== --- trunk/projects/quickhoney/website/templates/image-browse.xml 2008-09-09 17:41:22 UTC (rev 3871) +++ trunk/projects/quickhoney/website/templates/image-browse.xml 2008-09-09 19:50:55 UTC (rev 3872) @@ -10,8 +10,6 @@ <link rel="stylesheet" href="/static/yui/reset-fonts/reset-fonts.css" /> <link rel="stylesheet" href="/static/quickhoney.css" /> <link rel="stylesheet" href="/static/image-browse.css" /> - <script src="/static/javascript.js" type="text/javascript"><!-- x --> - </script> <title>QuickHoney image</title> </head> <body id="image-browse">
Modified: trunk/projects/quickhoney/website/templates/index.xml =================================================================== --- trunk/projects/quickhoney/website/templates/index.xml 2008-09-09 17:41:22 UTC (rev 3871) +++ trunk/projects/quickhoney/website/templates/index.xml 2008-09-09 19:50:55 UTC (rev 3872) @@ -179,12 +179,15 @@ <input type="text" id="upload_client" name="client" value="" /><br /> <span id="upload_client_select"> </span> + <br /> Keywords:<br /> <input type="text" id="upload_keywords" name="spider-keywords" value="" /><br /> <input type="checkbox" id="explicit" name="explicit" value="1" /> Explicit<br/> + <!-- shop disabled for now <input type="checkbox" name="buy-file" value="1"/> Sell as file<br/> <input type="checkbox" name="buy-print" value="1"/> Sell as print<br/> <input type="checkbox" name="buy-t-shirt" value="1"/> Sell as t-shirt<br/> + --> </p> <p class="cms"> <input type="submit" name="upload" value="upload" /> @@ -240,24 +243,26 @@ </div>
<div id="edit_form" class="cms_form"> - <form id="edit_form_element" action="/edit-image-js" target="edit_iframe" method="post" - onsubmit="return do_edit();"> + <form id="edit_form_element" action="#" method="post" onsubmit="return false;"> <div class="cms_title">Edit image</div> <p class="cms"> Client:<br /> <input type="text" id="edit_client" name="client" value="" /><br /> <span id="edit_client_select"> </span> + <br /> Keywords:<br /> <input type="text" id="edit_keywords" name="spider-keywords" value="" /><br /> <input type="checkbox" id="edit_explicit" name="explicit" value="1" /> Explicit<br/> + <!-- shop disabled for now <input type="checkbox" id="edit_buy-file" name="buy-file" value="1"/> Sell as file<br/> <input type="checkbox" id="edit_buy-print" name="buy-print" value="1"/> Sell as print<br/> <input type="checkbox" id="edit_buy-t-shirt" name="buy-t-shirt" value="1"/> Sell as t-shirt<br/> + --> </p> <p class="cms"> - <input type="submit" name="action" value="edit" /> - <input type="submit" name="action" value="delete" onclick="return confirm('Really delete this image?');" /> + <button type="submit" onclick="do_edit();">edit</button> + <button type="submit" onclick="do_delete();">delete</button> </p> </form> </div>
Modified: trunk/projects/quickhoney/website/templates/login.xml =================================================================== --- trunk/projects/quickhoney/website/templates/login.xml 2008-09-09 17:41:22 UTC (rev 3871) +++ trunk/projects/quickhoney/website/templates/login.xml 2008-09-09 19:50:55 UTC (rev 3872) @@ -10,7 +10,7 @@ <link rel="stylesheet" href="/static/yui/reset-fonts/reset-fonts.css" /> <link rel="stylesheet" href="/static/login.css" /> <script src="/MochiKit/MochiKit.js" type="text/javascript"> </script> - <script src="/static/javascript.js" type="text/javascript"> </script> + <script src="/static/login.js" type="text/javascript"> </script> <title>QuickHoney CMS Login</title> </head>