Skip to content

Commit

Permalink
[#1262] First working version of the JS module for image uploading
Browse files Browse the repository at this point in the history
  • Loading branch information
johnmartin committed Oct 15, 2013
1 parent bb6cb7d commit 3dee852
Show file tree
Hide file tree
Showing 6 changed files with 211 additions and 17 deletions.
147 changes: 147 additions & 0 deletions ckan/public/base/javascript/modules/image-upload.js
@@ -0,0 +1,147 @@
/* Image Upload
*
*
* Options
* - id: what's the id of the context?
*/
this.ckan.module('image-upload', function($, _) {
return {
/* options object can be extended using data-module-* attributes */
options: {
is_url: true,
has_image: false,
i18n: {
upload: _('From computer'),
url: _('From web'),
remove: _('Remove'),
label: _('Upload image'),
label_url: _('Image URL'),
remove_tooltip: _('Reset this')
},
template: [
''
].join("\n")
},

state: {
attached: 1,
blank: 2,
web: 3
},

/* Initialises the module setting up elements and event listeners.
*
* Returns nothing.
*/
initialize: function () {
$.proxyAll(this, /_on/);
var options = this.options;

// firstly setup the fields
this.input = $('input[name="image_upload"]', this.el);
this.field_url = $('input[name="image_url"]', this.el).parents('.control-group');
this.field_image = this.input.parents('.control-group');

var checkbox = $('input[name="clear_upload"]', this.el);
if (checkbox.length > 0) {
options.has_image = true;
checkbox.parents('.control-group').remove();
}

this.field_clear = $('<input type="hidden" name="clear_upload">')
.appendTo(this.el);

this.button_url = $('<a href="javascript:;" class="btn"><i class="icon-globe"></i> '+this.i18n('url')+'</a>')
.on('click', this._onFromWeb)
.insertAfter(this.input);

this.button_upload = $('<a href="javascript:;" class="btn"><i class="icon-cloud-upload"></i>'+this.i18n('upload')+'</a>')
.insertAfter(this.input);

this.button_remove = $('<a href="javascript:;" class="btn btn-danger" />')
.text(this.i18n('remove'))
.on('click', this._onRemove)
.insertAfter(this.button_upload);

$('<a href="javascript:;" class="btn btn-danger btn-remove-url"><i class="icon-remove"></i></a>')
.prop('title', this.i18n('remove_tooltip'))
.on('click', this._onRemove)
.insertBefore($('input', this.field_url));

$('label[for="field-image-upload"]').text(this.i18n('label'));

this.input
.on('mouseover', this._onInputMouseOver)
.on('mouseout', this._onInputMouseOut)
.on('change', this._onInputChange)
.css('width', this.button_upload.outerWidth())
.hide();

this.fields = $('<i />')
.add(this.button_remove)
.add(this.button_upload)
.add(this.button_url)
.add(this.input)
.add(this.field_url)
.add(this.field_image);

if (options.is_url) {
this.changeState(this.state.web);
} else if (options.has_image) {
this.changeState(this.state.attached);
} else {
this.changeState(this.state.blank);
}

},

changeState: function(state) {
this.fields.hide();
if (state == this.state.blank) {
this.button_upload
.add(this.field_image)
.add(this.button_url)
.add(this.input)
.show();
} else if (state == this.state.attached) {
this.button_remove
.add(this.field_image)
.show();
} else if (state == this.state.web) {
this.field_url
.show();
}
},

_onFromWeb: function() {
this.changeState(this.state.web);
$('input', this.field_url).focus();
if (this.options.has_image) {
this.field_clear.val('true');
}
},

_onRemove: function() {
this.changeState(this.state.blank);
$('input', this.field_url).val('');
if (this.options.has_image) {
this.field_clear.val('true');
}
},

_onInputChange: function() {
this.file_name = this.input.val();
this.field_clear.val('');
this.changeState(this.state.attached);
},

_onInputMouseOver: function() {
this.button_upload.addClass('hover');
},

_onInputMouseOut: function() {
this.button_upload.removeClass('hover');
}

}
});
1 change: 1 addition & 0 deletions ckan/public/base/javascript/resource.config
Expand Up @@ -38,6 +38,7 @@ ckan =
modules/table-toggle-more.js
modules/dataset-visibility.js
modules/media-grid.js
modules/image-upload.js

main =
apply_html_class
Expand Down
34 changes: 34 additions & 0 deletions ckan/public/base/less/forms.less
Expand Up @@ -670,3 +670,37 @@ textarea {
.box-shadow(none);
}
}

.js .image-upload {
#field-image-upload {
cursor: pointer;
position: absolute;
z-index: 1;
.opacity(0);
}
.controls {
position: relative;
}
.btn {
position: relative;
top: 0;
margin-right: 10px;
&.hover {
color: @grayDark;
text-decoration: none;
background-position: 0 -15px;
.transition(background-position .1s linear);
}
}
.btn-remove-url {
position: absolute;
margin-right: 0;
top: 4px;
right: 5px;
padding: 0 4px;
.border-radius(100px);
.icon-remove {
margin-right: 0;
}
}
}
10 changes: 1 addition & 9 deletions ckan/templates/group/snippets/group_form.html
Expand Up @@ -19,15 +19,7 @@

{{ form.markdown('description', label=_('Description'), id='field-description', placeholder=_('A little information about my group...'), value=data.description, error=errors.description) }}

{{ form.input('image_url', label=_('Image URL'), id='field-image-url', placeholder=_('http://example.com/my-image.jpg'), value=data.image_url, error=errors.image_url, classes=['control-full']) }}


{% if h.uploads_enabled() %}
{{ form.input('image_upload', label=_('Image Upload'), id='field-image-upload', type='file', placeholder='', value=data.image_url, error='', classes=['control-full']) }}
{% if data.image_url and not data.image_url.startswith('http') %}
{{ form.checkbox('clear_upload', label=_('Clear Upload'), id='field-clear-upload', value='true', error='', classes=['control-full']) }}
{% endif %}
{% endif %}
{{ form.image_upload(data, errors, image_url=c.group_dict.image_display_url, is_upload_enabled=h.uploads_enabled()) }}

{% endblock %}

Expand Down
27 changes: 27 additions & 0 deletions ckan/templates/macros/form.html
Expand Up @@ -395,3 +395,30 @@
</p>
{% endmacro %}

{#
Builds a file upload for input

Example
{% import 'macros/form.html' as form %}
{{ form.image_upload(data, errors, is_upload_enabled=true) }}

#}
{% macro image_upload(data, errors, image_url=false, is_upload_enabled=false, placeholder=false) %}
{% set placeholder = placeholder if placeholder else _('http://example.com/my-image.jpg') %}
{% set has_uploaded_data = data.image_url and not data.image_url.startswith('http') %}
{% set is_url = data.image_url and data.image_url.startswith('http') %}

{% if is_upload_enabled %}<div class="image-upload" data-module="image-upload" data-module-is_url="{{ 'true' if is_url else 'false' }}" data-module-image_url="{{ image_url }}">{% endif %}

{{ input('image_url', label=_('Image URL'), id='field-image-url', placeholder=placeholder, value=data.image_url, error=errors.image_url, classes=['control-full']) }}

{% if is_upload_enabled %}
{{ input('image_upload', label=_('Image Upload'), id='field-image-upload', type='file', placeholder='', value='', error='', classes=['control-full']) }}
{% if has_uploaded_data %}
{{ checkbox('clear_upload', label=_('Clear Upload'), id='field-clear-upload', value='true', error='', classes=['control-full']) }}
{% endif %}
{% endif %}

{% if is_upload_enabled %}</div>{% endif %}

{% endmacro %}
9 changes: 1 addition & 8 deletions ckan/templates/organization/snippets/organization_form.html
Expand Up @@ -19,14 +19,7 @@

{{ form.markdown('description', label=_('Description'), id='field-description', placeholder=_('A little information about my organization...'), value=data.description, error=errors.description) }}

{{ form.input('image_url', label=_('Image URL'), id='field-image-url', placeholder=_('http://example.com/my-image.jpg'), value=data.image_url, error=errors.image_url, classes=['control-full']) }}

{% if h.uploads_enabled() %}
{{ form.input('image_upload', label=_('Image Upload'), id='field-image-upload', type='file', placeholder='', value=data.image_url, error='', classes=['control-full']) }}
{% if data.image_url and not data.image_url.startswith('http') %}
{{ form.checkbox('clear_upload', label=_('Clear Upload'), id='field-clear-upload', value='true', error='', classes=['control-full']) }}
{% endif %}
{% endif %}
{{ form.image_upload(data, errors, image_url=c.group_dict.image_display_url, is_upload_enabled=h.uploads_enabled()) }}

{% endblock %}

Expand Down

0 comments on commit 3dee852

Please sign in to comment.