From 9dd6c56f9f07fe1d397d134ca58129598529d4c2 Mon Sep 17 00:00:00 2001 From: polesye Date: Mon, 7 Oct 2013 14:55:23 +0300 Subject: [PATCH] Add isoTime js view. --- cms/static/js/models/metadata.js | 1 + cms/static/js/views/metadata.js | 46 ++++++++++++++++++- cms/templates/base.html | 5 ++ .../js/vendor/jquery.maskedinput.min.js | 7 +++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 common/static/js/vendor/jquery.maskedinput.min.js diff --git a/cms/static/js/models/metadata.js b/cms/static/js/models/metadata.js index f4421b3079..cc63e5946e 100644 --- a/cms/static/js/models/metadata.js +++ b/cms/static/js/models/metadata.js @@ -108,6 +108,7 @@ define(["backbone"], function(Backbone) { Metadata.GENERIC_TYPE = "Generic"; Metadata.LIST_TYPE = "List"; Metadata.VIDEO_LIST_TYPE = "VideoList"; + Metadata.ISO_TIME_TYPE = "IsoTime"; return Metadata; }); diff --git a/cms/static/js/views/metadata.js b/cms/static/js/views/metadata.js index b555f7c048..970d45cfdf 100644 --- a/cms/static/js/views/metadata.js +++ b/cms/static/js/views/metadata.js @@ -2,7 +2,7 @@ define( [ "backbone", "underscore", "js/models/metadata", "js/views/abstract_editor", - "js/views/transcripts/metadata_videolist" + "js/views/transcripts/metadata_videolist", "jquery.maskedinput" ], function(Backbone, _, MetadataModel, AbstractEditor, VideoList) { var Metadata = {}; @@ -39,6 +39,8 @@ function(Backbone, _, MetadataModel, AbstractEditor, VideoList) { } else if(model.getType() === MetadataModel.VIDEO_LIST_TYPE) { new VideoList(data); + else if(model.getType() === MetadataModel.ISO_TIME_TYPE) { + new Metadata.IsoTime(data); } else { // Everything else is treated as GENERIC_TYPE, which uses String editor. @@ -292,5 +294,47 @@ function(Backbone, _, MetadataModel, AbstractEditor, VideoList) { } }); + Metadata.IsoTime = Metadata.AbstractEditor.extend({ + + events : { + "change input" : "updateModel", + "keypress .setting-input" : "showClearButton" , + "click .setting-clear" : "clear" + }, + + templateName: "metadata-string-entry", + + render: function () { + Metadata.AbstractEditor.prototype.render.apply(this); + + // Time format: HH:mm:ss + $.mask.definitions['h'] = '[0-2]'; + $.mask.definitions['H'] = '[0-3]'; + $.mask.definitions['m'] = $.mask.definitions['s'] = '[0-5]'; + $.mask.definitions['M'] = $.mask.definitions['S'] = '[0-9]'; + this.$el.find('#' + this.uniqueId).mask('hH:mM:sS', {placeholder: "0"}); + }, + + getValueFromEditor : function () { + var $input = this.$el.find('#' + this.uniqueId), + value = $input.val(), + time = Date.parse(value); + + if (time === null) { + value = null; + } + + return value; + }, + + setValueInEditor : function (value) { + if (!value) { + value = '00:00:00'; + } + + this.$el.find('input').val(value); + } + }); + return Metadata; }); diff --git a/cms/templates/base.html b/cms/templates/base.html index 541960911a..ded53b8188 100644 --- a/cms/templates/base.html +++ b/cms/templates/base.html @@ -52,6 +52,7 @@ var require = { "jquery.qtip": "js/vendor/jquery.qtip.min", "jquery.scrollTo": "js/vendor/jquery.scrollTo-1.4.2-min", "jquery.flot": "js/vendor/flot/jquery.flot.min", + "jquery.maskedinput": "js/vendor/jquery.maskedinput.min", "jquery.fileupload": "js/vendor/jQuery-File-Upload/js/jquery.fileupload", "jquery.iframe-transport": "js/vendor/jQuery-File-Upload/js/jquery.iframe-transport", "jquery.inputnumber": "js/vendor/html5-input-polyfills/number-polyfill", @@ -125,6 +126,10 @@ var require = { deps: ["jquery"], exports: "jQuery.fn.plot" }, + "jquery.maskedinput": { + deps: ["jquery"], + exports: "jQuery.fn.mask" + }, "jquery.fileupload": { deps: ["jquery.iframe-transport"], exports: "jQuery.fn.fileupload" diff --git a/common/static/js/vendor/jquery.maskedinput.min.js b/common/static/js/vendor/jquery.maskedinput.min.js new file mode 100644 index 0000000000..4769d6fda4 --- /dev/null +++ b/common/static/js/vendor/jquery.maskedinput.min.js @@ -0,0 +1,7 @@ +/* + Masked Input plugin for jQuery + Copyright (c) 2007-2013 Josh Bush (digitalbush.com) + Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) + Version: 1.3.1 +*/ +(function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery);