# HG changeset patch # User ymh # Date 1293463327 -3600 # Node ID 8d2b6ee4eb582bbb62a5f26055253a16ce849084 # Parent d77bc51d9682a566431d3239fddb78218e7d25bd add id to copy ine dialog diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html --- a/web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html Wed Dec 01 16:56:01 2010 +0100 +++ b/web/ldt/ldt_utils/templates/ldt/ldt_utils/embed_popup.html Mon Dec 27 16:22:07 2010 +0100 @@ -8,6 +8,7 @@ Ligne de Temps - IRI + @@ -22,20 +23,47 @@ }; + + + + +
+
{% trans 'project id' %}:
+
 
{{ldt_id}}
+
{% include "ldt/ldt_utils/partial/embed_player.html" %}
- -
 
-
diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/ldt/ldt_utils/views.py --- a/web/ldt/ldt_utils/views.py Wed Dec 01 16:56:01 2010 +0100 +++ b/web/ldt/ldt_utils/views.py Mon Dec 27 16:22:07 2010 +0100 @@ -79,7 +79,7 @@ for typestr in ('player','seo_body', 'seo_meta', 'links') ) return render_to_response("ldt/ldt_utils/embed_popup.html", - {'json_url':json_url,'player_id':player_id, 'embed_rendered':embed_rendered, 'annotations':annotations}, + {'json_url':json_url,'player_id':player_id, 'embed_rendered':embed_rendered, 'annotations':annotations, 'ldt_id' : ldt_id}, context_instance=RequestContext(request)) diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/ldt/locale/en/LC_MESSAGES/django.mo Binary file web/ldt/locale/en/LC_MESSAGES/django.mo has changed diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/ldt/locale/en/LC_MESSAGES/django.po --- a/web/ldt/locale/en/LC_MESSAGES/django.po Wed Dec 01 16:56:01 2010 +0100 +++ b/web/ldt/locale/en/LC_MESSAGES/django.po Mon Dec 27 16:22:07 2010 +0100 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-19 19:43+0200\n" +"POT-Creation-Date: 2010-12-27 15:49+0100\n" "PO-Revision-Date: 2010-02-17 03:53+0100\n" "Last-Translator: Yves-Marie Haussonne \n" "Language-Team: LANGUAGE \n" @@ -137,11 +137,11 @@ msgid "content.duration" msgstr "duration (ms)" -#: ldt_utils/models.py:256 +#: ldt_utils/models.py:260 msgid "created by" msgstr "created by" -#: ldt_utils/models.py:257 +#: ldt_utils/models.py:261 msgid "changed by" msgstr "changed by" @@ -171,35 +171,35 @@ msgid "confirm deletion" msgstr "Confirm deletion" -#: ldt_utils/views.py:683 +#: ldt_utils/views.py:695 msgid "Problem when downloading file from url : " msgstr "Problem when downloading file from url: " -#: ldt_utils/views.py:686 +#: ldt_utils/views.py:698 msgid "Problem when uploading file : " msgstr "Problem when uploading file: " -#: ldt_utils/views.py:756 +#: ldt_utils/views.py:768 #, python-format msgid "There is %(count)d error when deleting content" msgid_plural "There are %(count)d errors when deleting content" msgstr[0] "There is %(count)d error when deleting content" msgstr[1] "There are %(count)d errors when deleting content" -#: ldt_utils/views.py:757 +#: ldt_utils/views.py:769 msgid "title error deleting content" msgstr "Error when deleting content" -#: ldt_utils/views.py:759 +#: ldt_utils/views.py:771 #, python-format msgid "Confirm delete content %(titles)s" msgstr "Confirm delete content %(titles)s" -#: ldt_utils/views.py:760 +#: ldt_utils/views.py:772 msgid "confirm delete content" msgstr "Confirm delete content" -#: ldt_utils/views.py:791 +#: ldt_utils/views.py:803 #, python-format msgid "" "Content '%(title)s' is referenced by this project : %(project_titles)s. " @@ -334,23 +334,31 @@ msgid "create_project" msgstr "Create new project" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:60 +msgid "project id" +msgstr "project id" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:61 +msgid "copy to clipboard" +msgstr "copy to clipboard" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_player" msgstr "player" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_seo_body" msgstr "seo" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_seo_meta" msgstr "meta" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_links" msgstr "links" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:56 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:84 msgid "clik here to see the project content" msgstr "clik here to see the project content" @@ -594,19 +602,19 @@ msgstr "Password:" #: templates/admin/page_login.html:29 -#: user/templates/registration/login.html:29 +#: user/templates/registration/login.html:39 msgid "Create an account" msgstr "Create an account" #: templates/admin/page_login.html:30 -#: user/templates/registration/login.html:30 +#: user/templates/registration/login.html:40 msgid "Forget password?" msgstr "Forget password?" #: templates/admin/page_login.html:32 #: user/templates/ldt/user/login_form.html:37 #: user/templates/ldt/user/login_form.html:45 -#: user/templates/registration/login.html:14 +#: user/templates/registration/login.html:21 #: user/templates/registration/password_reset_complete.html:14 msgid "Log in" msgstr "Log in" @@ -700,7 +708,7 @@ msgid "The two emails didn't match." msgstr "The two emails didn't match." -#: user/views.py:45 user/templates/registration/login.html:17 +#: user/views.py:45 user/templates/registration/login.html:24 msgid "Sorry, that's not a valid username or password." msgstr "Sorry, that's not a valid username or password." @@ -823,7 +831,7 @@ msgid "Log in again" msgstr "Log in again" -#: user/templates/registration/login.html:25 +#: user/templates/registration/login.html:46 msgid "login" msgstr "login" diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/ldt/locale/fr/LC_MESSAGES/django.mo Binary file web/ldt/locale/fr/LC_MESSAGES/django.mo has changed diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/ldt/locale/fr/LC_MESSAGES/django.po --- a/web/ldt/locale/fr/LC_MESSAGES/django.po Wed Dec 01 16:56:01 2010 +0100 +++ b/web/ldt/locale/fr/LC_MESSAGES/django.po Mon Dec 27 16:22:07 2010 +0100 @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-10-19 19:43+0200\n" +"POT-Creation-Date: 2010-12-27 15:49+0100\n" "PO-Revision-Date: 2010-03-09 15:52+0100\n" "Last-Translator: Yves-Marie Haussonne \n" "Language-Team: LANGUAGE \n" @@ -137,11 +137,11 @@ msgid "content.duration" msgstr "Durée (ms)" -#: ldt_utils/models.py:256 +#: ldt_utils/models.py:260 msgid "created by" msgstr "créé par" -#: ldt_utils/models.py:257 +#: ldt_utils/models.py:261 msgid "changed by" msgstr "modifié par" @@ -172,35 +172,35 @@ msgid "confirm deletion" msgstr "Confirmation d'effacement" -#: ldt_utils/views.py:683 +#: ldt_utils/views.py:695 msgid "Problem when downloading file from url : " msgstr "Problème lors du téléchargement du fichier : " -#: ldt_utils/views.py:686 +#: ldt_utils/views.py:698 msgid "Problem when uploading file : " msgstr "Problème lors de l'upload du fichier : " -#: ldt_utils/views.py:756 +#: ldt_utils/views.py:768 #, python-format msgid "There is %(count)d error when deleting content" msgid_plural "There are %(count)d errors when deleting content" msgstr[0] "Il y a %(count)d erreur lors de l'effacement du contenu" msgstr[1] "Il y a %(count)d erreurs lors de l'effacement du contenu" -#: ldt_utils/views.py:757 +#: ldt_utils/views.py:769 msgid "title error deleting content" msgstr "Erreur lors de l'effacement du contenu" -#: ldt_utils/views.py:759 +#: ldt_utils/views.py:771 #, python-format msgid "Confirm delete content %(titles)s" msgstr "Veuillez confirmer l'effacement du contenu %(titles)s" -#: ldt_utils/views.py:760 +#: ldt_utils/views.py:772 msgid "confirm delete content" msgstr "Confirmation effacement contenu" -#: ldt_utils/views.py:791 +#: ldt_utils/views.py:803 #, python-format msgid "" "Content '%(title)s' is referenced by this project : %(project_titles)s. " @@ -335,23 +335,31 @@ msgid "create_project" msgstr "Créer un nouveau projet Ligne de Temps" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:60 +msgid "project id" +msgstr "Identifiant du projet " + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:61 +msgid "copy to clipboard" +msgstr "Copier l'id dans le presse-papiers" + +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_player" msgstr "Code Lecteur métadata" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_seo_body" msgstr "Code SEO" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_seo_meta" msgstr "Code balise meta en-tête" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:42 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:70 msgid "popup_links" msgstr "Liste de liens" -#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:56 +#: ldt_utils/templates/ldt/ldt_utils/embed_popup.html:84 msgid "clik here to see the project content" msgstr "cliquer ici pour voir le contenu du projet" @@ -595,19 +603,19 @@ msgstr "Mot de passe :" #: templates/admin/page_login.html:29 -#: user/templates/registration/login.html:29 +#: user/templates/registration/login.html:39 msgid "Create an account" msgstr "Créer un compte" #: templates/admin/page_login.html:30 -#: user/templates/registration/login.html:30 +#: user/templates/registration/login.html:40 msgid "Forget password?" msgstr "Oubliez le mot de passe?" #: templates/admin/page_login.html:32 #: user/templates/ldt/user/login_form.html:37 #: user/templates/ldt/user/login_form.html:45 -#: user/templates/registration/login.html:14 +#: user/templates/registration/login.html:21 #: user/templates/registration/password_reset_complete.html:14 msgid "Log in" msgstr "Connexion" @@ -701,7 +709,7 @@ msgid "The two emails didn't match." msgstr "les deux emails ne correspondent pas" -#: user/views.py:45 user/templates/registration/login.html:17 +#: user/views.py:45 user/templates/registration/login.html:24 msgid "Sorry, that's not a valid username or password." msgstr "Saisissez un nom d'utilisateur et un mot de passe valide." @@ -824,7 +832,7 @@ msgid "Log in again" msgstr "Se reconnecter" -#: user/templates/registration/login.html:25 +#: user/templates/registration/login.html:46 msgid "login" msgstr "Connexion" diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/static/ldt/css/embed_popup.css --- a/web/static/ldt/css/embed_popup.css Wed Dec 01 16:56:01 2010 +0100 +++ b/web/static/ldt/css/embed_popup.css Mon Dec 27 16:22:07 2010 +0100 @@ -31,3 +31,36 @@ float: right; } +#ldt_id { + color: #949494; + font-family: Verdana; + font-weight: lighter; + font-style: normal; + text-align: left; + +} + +#ldt_id_row { + height: 20px; + vertical-align: middle; + font-size: 1.5em; + font-style: normal; + text-align: left; + +} + +#ldt_id_id { + float: left; +} + +#clipboard_button { + height: 20px; + width: 20px; + float: left; + background-image:url('../img/clipboard.png'); + background-repeat:no-repeat; + background-position:center; + cursor: pointer; + margin-right: 10px; + padding: 2px; +} diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/static/ldt/js/ZeroClipboard.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/static/ldt/js/ZeroClipboard.js Mon Dec 27 16:22:07 2010 +0100 @@ -0,0 +1,311 @@ +// Simple Set Clipboard System +// Author: Joseph Huckaby + +var ZeroClipboard = { + + version: "1.0.7", + clients: {}, // registered upload clients on page, indexed by id + moviePath: 'ZeroClipboard.swf', // URL to movie + nextId: 1, // ID of next movie + + $: function(thingy) { + // simple DOM lookup utility function + if (typeof(thingy) == 'string') thingy = document.getElementById(thingy); + if (!thingy.addClass) { + // extend element with a few useful methods + thingy.hide = function() { this.style.display = 'none'; }; + thingy.show = function() { this.style.display = ''; }; + thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; + thingy.removeClass = function(name) { + var classes = this.className.split(/\s+/); + var idx = -1; + for (var k = 0; k < classes.length; k++) { + if (classes[k] == name) { idx = k; k = classes.length; } + } + if (idx > -1) { + classes.splice( idx, 1 ); + this.className = classes.join(' '); + } + return this; + }; + thingy.hasClass = function(name) { + return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); + }; + } + return thingy; + }, + + setMoviePath: function(path) { + // set path to ZeroClipboard.swf + this.moviePath = path; + }, + + dispatch: function(id, eventName, args) { + // receive event from flash movie, send to client + var client = this.clients[id]; + if (client) { + client.receiveEvent(eventName, args); + } + }, + + register: function(id, client) { + // register new client to receive events + this.clients[id] = client; + }, + + getDOMObjectPosition: function(obj, stopObj) { + // get absolute coordinates for dom element + var info = { + left: 0, + top: 0, + width: obj.width ? obj.width : obj.offsetWidth, + height: obj.height ? obj.height : obj.offsetHeight + }; + + while (obj && (obj != stopObj)) { + info.left += obj.offsetLeft; + info.top += obj.offsetTop; + obj = obj.offsetParent; + } + + return info; + }, + + Client: function(elem) { + // constructor for new simple upload client + this.handlers = {}; + + // unique ID + this.id = ZeroClipboard.nextId++; + this.movieId = 'ZeroClipboardMovie_' + this.id; + + // register client with singleton to receive flash events + ZeroClipboard.register(this.id, this); + + // create movie + if (elem) this.glue(elem); + } +}; + +ZeroClipboard.Client.prototype = { + + id: 0, // unique ID for us + ready: false, // whether movie is ready to receive events or not + movie: null, // reference to movie object + clipText: '', // text to copy to clipboard + handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor + cssEffects: true, // enable CSS mouse effects on dom container + handlers: null, // user event handlers + + glue: function(elem, appendElem, stylesToAdd) { + // glue to DOM element + // elem can be ID or actual DOM element object + this.domElement = ZeroClipboard.$(elem); + + // float just above object, or zIndex 99 if dom element isn't set + var zIndex = 99; + if (this.domElement.style.zIndex) { + zIndex = parseInt(this.domElement.style.zIndex, 10) + 1; + } + + if (typeof(appendElem) == 'string') { + appendElem = ZeroClipboard.$(appendElem); + } + else if (typeof(appendElem) == 'undefined') { + appendElem = document.getElementsByTagName('body')[0]; + } + + // find X/Y position of domElement + var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem); + + // create floating DIV above element + this.div = document.createElement('div'); + var style = this.div.style; + style.position = 'absolute'; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + style.width = '' + box.width + 'px'; + style.height = '' + box.height + 'px'; + style.zIndex = zIndex; + + if (typeof(stylesToAdd) == 'object') { + for (addedStyle in stylesToAdd) { + style[addedStyle] = stylesToAdd[addedStyle]; + } + } + + // style.backgroundColor = '#f00'; // debug + + appendElem.appendChild(this.div); + + this.div.innerHTML = this.getHTML( box.width, box.height ); + }, + + getHTML: function(width, height) { + // return HTML for movie + var html = ''; + var flashvars = 'id=' + this.id + + '&width=' + width + + '&height=' + height; + + if (navigator.userAgent.match(/MSIE/)) { + // IE gets an OBJECT tag + var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; + html += ''; + } + else { + // all other browsers get an EMBED tag + html += ''; + } + return html; + }, + + hide: function() { + // temporarily hide floater offscreen + if (this.div) { + this.div.style.left = '-2000px'; + } + }, + + show: function() { + // show ourselves after a call to hide() + this.reposition(); + }, + + destroy: function() { + // destroy control and floater + if (this.domElement && this.div) { + this.hide(); + this.div.innerHTML = ''; + + var body = document.getElementsByTagName('body')[0]; + try { body.removeChild( this.div ); } catch(e) {;} + + this.domElement = null; + this.div = null; + } + }, + + reposition: function(elem) { + // reposition our floating div, optionally to new container + // warning: container CANNOT change size, only position + if (elem) { + this.domElement = ZeroClipboard.$(elem); + if (!this.domElement) this.hide(); + } + + if (this.domElement && this.div) { + var box = ZeroClipboard.getDOMObjectPosition(this.domElement); + var style = this.div.style; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + } + }, + + setText: function(newText) { + // set text to be copied to clipboard + this.clipText = newText; + if (this.ready) this.movie.setText(newText); + }, + + addEventListener: function(eventName, func) { + // add user event listener for event + // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + if (!this.handlers[eventName]) this.handlers[eventName] = []; + this.handlers[eventName].push(func); + }, + + setHandCursor: function(enabled) { + // enable hand cursor (true), or default arrow cursor (false) + this.handCursorEnabled = enabled; + if (this.ready) this.movie.setHandCursor(enabled); + }, + + setCSSEffects: function(enabled) { + // enable or disable CSS effects on DOM container + this.cssEffects = !!enabled; + }, + + receiveEvent: function(eventName, args) { + // receive event from flash + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + + // special behavior for certain events + switch (eventName) { + case 'load': + // movie claims it is ready, but in IE this isn't always the case... + // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function + this.movie = document.getElementById(this.movieId); + if (!this.movie) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 1 ); + return; + } + + // firefox on pc needs a "kick" in order to set these in certain cases + if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { + var self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 100 ); + this.ready = true; + return; + } + + this.ready = true; + this.movie.setText( this.clipText ); + this.movie.setHandCursor( this.handCursorEnabled ); + break; + + case 'mouseover': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('hover'); + if (this.recoverActive) this.domElement.addClass('active'); + } + break; + + case 'mouseout': + if (this.domElement && this.cssEffects) { + this.recoverActive = false; + if (this.domElement.hasClass('active')) { + this.domElement.removeClass('active'); + this.recoverActive = true; + } + this.domElement.removeClass('hover'); + } + break; + + case 'mousedown': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('active'); + } + break; + + case 'mouseup': + if (this.domElement && this.cssEffects) { + this.domElement.removeClass('active'); + this.recoverActive = false; + } + break; + } // switch eventName + + if (this.handlers[eventName]) { + for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { + var func = this.handlers[eventName][idx]; + + if (typeof(func) == 'function') { + // actual function reference + func(this, args); + } + else if ((typeof(func) == 'object') && (func.length == 2)) { + // PHP style object + method, i.e. [myObject, 'myMethod'] + func[0][ func[1] ](this, args); + } + else if (typeof(func) == 'string') { + // name of function + window[func](this, args); + } + } // foreach event handler defined + } // user defined handler for event + } + +}; diff -r d77bc51d9682 -r 8d2b6ee4eb58 web/static/ldt/swf/ZeroClipboard10.swf Binary file web/static/ldt/swf/ZeroClipboard10.swf has changed