added a character count to the publisher
This commit is contained in:
parent
14f14d005b
commit
bb4c2ee85d
7 changed files with 113 additions and 12 deletions
|
|
@ -53,7 +53,7 @@
|
||||||
= image_tag "icons/globe.png", :title => t('.public'), :class => 'public_icon dim', :width => 16, :height => 16
|
= image_tag "icons/globe.png", :title => t('.public'), :class => 'public_icon dim', :width => 16, :height => 16
|
||||||
- if current_user.services
|
- if current_user.services
|
||||||
- for service in current_user.services
|
- for service in current_user.services
|
||||||
= image_tag "social_media_logos/#{service.provider}-16x16.png", :title => service.provider.titleize, :class => "service_icon dim", :id =>"#{service.provider}"
|
= image_tag "social_media_logos/#{service.provider}-16x16.png", :title => service.provider.titleize, :class => "service_icon dim", :id =>"#{service.provider}", :maxchar => "#{service.class::MAX_CHARACTERS}"
|
||||||
= link_to (image_tag "icons/monotone_wrench_settings.png"), "#question_mark_pane", :class => 'question_mark', :rel => 'facebox', :title => t('shared.public_explain.manage')
|
= link_to (image_tag "icons/monotone_wrench_settings.png"), "#question_mark_pane", :class => 'question_mark', :rel => 'facebox', :title => t('shared.public_explain.manage')
|
||||||
= status.submit t('.share'), :disable_with => t('.posting'), :class => 'button', :tabindex => 2
|
= status.submit t('.share'), :disable_with => t('.posting'), :class => 'button', :tabindex => 2
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ javascripts:
|
||||||
- public/javascripts/vendor/facebox.js
|
- public/javascripts/vendor/facebox.js
|
||||||
- public/javascripts/vendor/timeago.js
|
- public/javascripts/vendor/timeago.js
|
||||||
- public/javascripts/vendor/Mustache.js
|
- public/javascripts/vendor/Mustache.js
|
||||||
|
- public/javascripts/vendor/charCount.js
|
||||||
- public/javascripts/jquery.autocomplete-custom.js
|
- public/javascripts/jquery.autocomplete-custom.js
|
||||||
- public/javascripts/fileuploader-custom.js
|
- public/javascripts/fileuploader-custom.js
|
||||||
- public/javascripts/keycodes.js
|
- public/javascripts/keycodes.js
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,7 @@ var Publisher = {
|
||||||
bindServiceIcons: function(){
|
bindServiceIcons: function(){
|
||||||
$(".service_icon").bind("click", function(evt){
|
$(".service_icon").bind("click", function(evt){
|
||||||
$(this).toggleClass("dim");
|
$(this).toggleClass("dim");
|
||||||
Publisher.toggleServiceField($(this).attr('id'));
|
Publisher.toggleServiceField($(this));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
bindPublicIcon: function(){
|
bindPublicIcon: function(){
|
||||||
|
|
@ -299,12 +299,14 @@ var Publisher = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
toggleServiceField: function(service){
|
toggleServiceField: function(service){
|
||||||
var hidden_field = $('#publisher [name="services[]"][value="'+service+'"]')
|
Publisher.createCounter(service);
|
||||||
|
var provider = service.attr('id');
|
||||||
|
var hidden_field = $('#publisher [name="services[]"][value="'+provider+'"]')
|
||||||
if(hidden_field.length > 0){
|
if(hidden_field.length > 0){
|
||||||
hidden_field.remove();
|
hidden_field.remove();
|
||||||
} else {
|
} else {
|
||||||
$("#publisher .content_creation form").append(
|
$("#publisher .content_creation form").append(
|
||||||
'<input id="services_" name="services[]" type="hidden" value="'+service+'">');
|
'<input id="services_" name="services[]" type="hidden" value="'+provider+'">');
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
toggleAspectIds: function(aspectId) {
|
toggleAspectIds: function(aspectId) {
|
||||||
|
|
@ -316,6 +318,21 @@ var Publisher = {
|
||||||
'<input id="aspect_ids_" name="aspect_ids[]" type="hidden" value="'+aspectId+'">');
|
'<input id="aspect_ids_" name="aspect_ids[]" type="hidden" value="'+aspectId+'">');
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
createCounter: function(service){
|
||||||
|
var counter = $("#publisher .counter");
|
||||||
|
if (counter.length > 0) { counter.remove()};
|
||||||
|
|
||||||
|
var min = 40000;
|
||||||
|
var a = $('.service_icon:not(.dim)');
|
||||||
|
if(a.length > 0){
|
||||||
|
$.each(a, function(index, value){
|
||||||
|
var num = parseInt($(value).attr('maxchar'));
|
||||||
|
if (min > num) { min = num}
|
||||||
|
});
|
||||||
|
$('#status_message_fake_text').charCount({allowed: min, warning: min/10 });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
bindAspectToggles: function() {
|
bindAspectToggles: function() {
|
||||||
$('#publisher .aspect_badge').bind("click", function(){
|
$('#publisher .aspect_badge').bind("click", function(){
|
||||||
var unremovedAspects = $(this).parent().children('.aspect_badge').length - $(this).parent().children(".aspect_badge.removed").length;
|
var unremovedAspects = $(this).parent().children('.aspect_badge').length - $(this).parent().children(".aspect_badge.removed").length;
|
||||||
|
|
|
||||||
58
public/javascripts/vendor/charCount.js
vendored
Normal file
58
public/javascripts/vendor/charCount.js
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Character Count Plugin - jQuery plugin
|
||||||
|
* Dynamic character count for text areas and input fields
|
||||||
|
* written by Alen Grakalic
|
||||||
|
* http://cssglobe.com/post/7161/jquery-plugin-simplest-twitterlike-dynamic-character-count-for-textareas
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
|
||||||
|
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||||
|
* and GPL (GPL-LICENSE.txt) licenses.
|
||||||
|
*
|
||||||
|
* Built for jQuery library
|
||||||
|
* http://jquery.com
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function($) {
|
||||||
|
|
||||||
|
$.fn.charCount = function(options){
|
||||||
|
|
||||||
|
// default configuration properties
|
||||||
|
var defaults = {
|
||||||
|
allowed: 140,
|
||||||
|
warning: 25,
|
||||||
|
css: 'counter',
|
||||||
|
counterElement: 'span',
|
||||||
|
cssWarning: 'warning',
|
||||||
|
cssExceeded: 'exceeded',
|
||||||
|
counterText: ''
|
||||||
|
};
|
||||||
|
|
||||||
|
var options = $.extend(defaults, options);
|
||||||
|
|
||||||
|
function calculate(obj){
|
||||||
|
var count = $(obj).val().length;
|
||||||
|
var available = options.allowed - count;
|
||||||
|
if(available <= options.warning && available >= 0){
|
||||||
|
$(obj).next().addClass(options.cssWarning);
|
||||||
|
} else {
|
||||||
|
$(obj).next().removeClass(options.cssWarning);
|
||||||
|
}
|
||||||
|
if(available < 0){
|
||||||
|
$(obj).next().addClass(options.cssExceeded);
|
||||||
|
} else {
|
||||||
|
$(obj).next().removeClass(options.cssExceeded);
|
||||||
|
}
|
||||||
|
$(obj).next().html(options.counterText + available);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.each(function() {
|
||||||
|
$(this).after('<'+ options.counterElement +' class="' + options.css + '">'+ options.counterText +'</'+ options.counterElement +'>');
|
||||||
|
calculate(this);
|
||||||
|
$(this).keyup(function(){calculate(this)});
|
||||||
|
$(this).change(function(){calculate(this)});
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
|
|
@ -839,7 +839,8 @@ label
|
||||||
form
|
form
|
||||||
textarea
|
textarea
|
||||||
:height 18px !important
|
:height 18px !important
|
||||||
|
.counter
|
||||||
|
:display none
|
||||||
form
|
form
|
||||||
:position relative
|
:position relative
|
||||||
:top 0
|
:top 0
|
||||||
|
|
@ -1021,6 +1022,12 @@ label
|
||||||
.x
|
.x
|
||||||
:display block
|
:display block
|
||||||
|
|
||||||
|
.counter
|
||||||
|
:position absolute
|
||||||
|
.warning
|
||||||
|
:color orange
|
||||||
|
.exceeded
|
||||||
|
:color red
|
||||||
.field_with_submit
|
.field_with_submit
|
||||||
input[type='text']
|
input[type='text']
|
||||||
:width 82%
|
:width 82%
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,24 @@ describe("Publisher", function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("toggleCounter", function(){
|
||||||
|
beforeEach( function(){
|
||||||
|
spec.loadFixture('aspects_index_services');
|
||||||
|
});
|
||||||
|
|
||||||
|
it("gets called in when you toggle service icons", function(){
|
||||||
|
spyOn(Publisher, 'createCounter');
|
||||||
|
Publisher.toggleServiceField();
|
||||||
|
expect(Publisher.createCounter).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("removes the .counter span", function(){
|
||||||
|
spyOn($.fn, "remove");
|
||||||
|
Publisher.createCounter();
|
||||||
|
expect($.fn.remove).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("bindAspectToggles", function() {
|
describe("bindAspectToggles", function() {
|
||||||
beforeEach( function(){
|
beforeEach( function(){
|
||||||
spec.loadFixture('status_message_new');
|
spec.loadFixture('status_message_new');
|
||||||
|
|
@ -151,7 +169,7 @@ describe("Publisher", function() {
|
||||||
Publisher.bindServiceIcons();
|
Publisher.bindServiceIcons();
|
||||||
$(".service_icon#facebook").click();
|
$(".service_icon#facebook").click();
|
||||||
|
|
||||||
expect(Publisher.toggleServiceField).toHaveBeenCalledWith("facebook");
|
expect(Publisher.toggleServiceField).toHaveBeenCalledWith($(".service_icon#facebook").first());
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -162,25 +180,24 @@ describe("Publisher", function() {
|
||||||
|
|
||||||
it('adds a hidden field to the form if there is not one already', function(){
|
it('adds a hidden field to the form if there is not one already', function(){
|
||||||
expect($('#publisher [name="services[]"]').length).toBe(0);
|
expect($('#publisher [name="services[]"]').length).toBe(0);
|
||||||
Publisher.toggleServiceField("facebook");
|
Publisher.toggleServiceField($(".service_icon#facebook").first());
|
||||||
expect($('#publisher [name="services[]"]').length).toBe(1);
|
expect($('#publisher [name="services[]"]').length).toBe(1);
|
||||||
expect($('#publisher [name="services[]"]').attr('value')).toBe("facebook");
|
expect($('#publisher [name="services[]"]').attr('value')).toBe("facebook");
|
||||||
//<input id="aspect_ids_" name="aspect_ids[]" type="hidden" value="1">
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('removes the hidden field if its already there', function() {
|
it('removes the hidden field if its already there', function() {
|
||||||
Publisher.toggleServiceField("facebook");
|
Publisher.toggleServiceField($(".service_icon#facebook").first());
|
||||||
expect($('#publisher [name="services[]"]').length).toBe(1);
|
expect($('#publisher [name="services[]"]').length).toBe(1);
|
||||||
|
|
||||||
Publisher.toggleServiceField("facebook");
|
Publisher.toggleServiceField($(".service_icon#facebook").first());
|
||||||
expect($('#publisher [name="services[]"]').length).toBe(0);
|
expect($('#publisher [name="services[]"]').length).toBe(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not remove a hidden field with a different value', function() {
|
it('does not remove a hidden field with a different value', function() {
|
||||||
Publisher.toggleServiceField("facebook");
|
Publisher.toggleServiceField($(".service_icon#facebook").first());
|
||||||
expect($('#publisher [name="services[]"]').length).toBe(1);
|
expect($('#publisher [name="services[]"]').length).toBe(1);
|
||||||
|
|
||||||
Publisher.toggleServiceField("twitter");
|
Publisher.toggleServiceField(($(".service_icon#twitter").first());
|
||||||
expect($('#publisher [name="services[]"]').length).toBe(2);
|
expect($('#publisher [name="services[]"]').length).toBe(2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ src_files:
|
||||||
- public/javascripts/vendor/jquery.infieldlabel.js
|
- public/javascripts/vendor/jquery.infieldlabel.js
|
||||||
- public/javascripts/vendor/jquery.autoresize.min.js
|
- public/javascripts/vendor/jquery.autoresize.min.js
|
||||||
- public/javascripts/vendor/Mustache.js
|
- public/javascripts/vendor/Mustache.js
|
||||||
|
- public/javascripts/vendor/charCount.js
|
||||||
- public/javascripts/vendor/timeago.js
|
- public/javascripts/vendor/timeago.js
|
||||||
- public/javascripts/vendor/facebox.js
|
- public/javascripts/vendor/facebox.js
|
||||||
- public/javascripts/jquery.autocomplete-custom.js
|
- public/javascripts/jquery.autocomplete-custom.js
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue