Skip to content

Commit

Permalink
Merge branch 'feature/foundation-6-jquery-3' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
mpasternak committed Feb 24, 2018
2 parents cb426e8 + 89bfa14 commit e30aa1d
Show file tree
Hide file tree
Showing 14 changed files with 126 additions and 183 deletions.
37 changes: 1 addition & 36 deletions multiseek/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,26 +265,18 @@ def __init__(

if model is not None:
self.model = model
self.url = '/multiseek/autocomplete/' + str(model.__name__)

if url is not None:
self.url = url

self._cache = {}

def get_url(self):
if self.url:
return self.url
return '/multiseek/autocomplete/%s/' % self.model.__name__
return self.url

@classmethod
def get_label(cls, model):
return text(model)

def value_from_web(self, value):
if value in self._cache:
return self._cache[value]

# The value should be an integer:
try:
value_i = int(value)
Expand All @@ -296,7 +288,6 @@ def value_from_web(self, value):
except self.model.DoesNotExist:
return

self._cache[value] = ret
return ret

def value_to_web(self, value):
Expand All @@ -306,32 +297,6 @@ def value_to_web(self, value):
return json.dumps([None, ''])
return json.dumps([value, self.get_label(model)])

def get_autocomplete_query(self, data):
"""This function should return an iterable, like a QuerySet. This
iterable, in turn, will be used by JQuery UI widget on the web.
:param data: string passed from web request.
"""

def args(fld, elem):
return {fld + "__icontains": elem}

if data:
# split by comma, space, etc.
data = data.split(" ")

ret = Q(**args(self.search_fields[0], data[0]))
for f, v in zip(self.search_fields[1:], data[1:]):
ret = ret & Q(**args(f, v))
return self.model.objects.filter(ret)

return self.model.objects.all()

def get_autocomplete_label(self, elem):
"""This function returns a label for the elem, this label in turn
will be used by JQuery UI widget."""
return text(elem)


class DateQueryObject(QueryObject):
type = DATE
Expand Down
117 changes: 45 additions & 72 deletions multiseek/static/multiseek/js/multiseek.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

if (typeof String.prototype.startsWith != 'function') {
// see below for better implementation!
String.prototype.startsWith = function (str) {
Expand Down Expand Up @@ -27,17 +26,17 @@ multiseek = {
};

function installDatePicker(element) {
if (element.fdatepicker) {
/* Use foundation date picker if available */
element.fdatepicker({
format: multiseekDateFormat,
weekStart: multiseekDateWeekStart,
language: djangoLanguageCode
});
} else {
/* Use JQuery datepicker if available */
element.datepicker($.datepicker.regional[djangoLanguageCode]);
}
if (element.fdatepicker) {
/* Use foundation date picker if available */
element.fdatepicker({
format: multiseekDateFormat,
weekStart: multiseekDateWeekStart,
language: djangoLanguageCode
});
} else {
/* Use JQuery datepicker if available */
element.datepicker($.datepicker.regional[djangoLanguageCode]);
}
}


Expand Down Expand Up @@ -175,58 +174,27 @@ $.widget("multiseek.multiseekAutocompleteValue", $.multiseek.multiseekBaseValue,
_create: function () {
this.element.append(
$("<div/>")
.addClass("row collapse")
.addClass("row")
.append([
$("<div/>")
.addClass("small-11 columns")
.append(
$("<input data-type=search id='value' type='text' />")
.prop("data-id", null)
.autocomplete({
minLength: 0,
source: this.options.url,
change: $.proxy(function (evt, ui) {
if (ui.item == null) {
alert(gettext("Please select value from the dropdown."));
this.element.children().first().val('');
this.element.children().first().focus();
}

$(evt.target).attr("data-id", null);
}, this),
select: function (evt, ui) {

$(evt.target).prop("data-id", ui.item.id);
}
})
),
$("<div/>")
.addClass("small-1 columns")
.append(
$("<span/>")
.addClass("postfix")
.text("X")
.click($.proxy(function () {
this.element.find("#value").first().val('').focus();
}, this))
)
$("<select/>")
.attr("data-autocomplete-light-url", this.options.url)
.attr("data-autocomplete-light-function", "select2")
.attr("data-autocomplete-light-language", djangoLanguageCode)
.attr("data-html", "")
.attr("data-placeholder", gettext("Enter something..."))
])
);

this.element.find("#value").focus(function (evt) {
$(evt.target).autocomplete("search");
});
},

getValue: function () {
return this.element.find("#value").first().prop("data-id");
return this.element.find("select").val();
},

setValue: function (value) {
value = $.parseJSON(value);
var elem = this.element.find("#value").first();
elem.prop("data-id", value[0]);
elem.val(value[1]);
var select = this.element.find("select");
var option = new Option(value[1], value[0], true, true);
select.append(option).trigger('change');
}
});

Expand Down Expand Up @@ -301,10 +269,10 @@ $.widget("multiseek.multiseekDateValue", $.multiseek.multiseekBaseValue, {
// add extra field

var element = $("<input/>")
.attr("type", "text")
.attr("id", "value_max")
.attr("placeholder", gettext('today'))
.attr("size", "10");
.attr("type", "text")
.attr("id", "value_max")
.attr("placeholder", gettext('today'))
.attr("size", "10");

installDatePicker(element);
row.append([
Expand Down Expand Up @@ -416,7 +384,8 @@ $.widget("multiseek.multiseekField", $.multiseek.multiseekBase, {
p[this.getWidgetType()]("destroy"); // children().remove();
} catch (Error) {

};
}
;

p.children().remove();
var x = p.append("<span/>");
Expand Down Expand Up @@ -504,12 +473,14 @@ $.widget("multiseek.multiseekFrame", $.multiseek.multiseekBase, {
.attr("class", "multiseekFrame")
.append([

$('<div/>')
$("<div/>")
.addClass("large-1 small-2 columns")
.attr("id", "prev-op-placeholder"),

$("<fieldset />")
.attr("class", "multiseek-fieldset")
.append([

$("<div/>")
.attr("id", "field-list"),
$("<button/>")
Expand Down Expand Up @@ -596,7 +567,7 @@ $.widget("multiseek.multiseekFrame", $.multiseek.multiseekBase, {
getFieldDOM: function (id) {
// USES DOM
return $("<field/>")
.addClass("row collapse")
.addClass("row")
.attr("id", id)
.append([
$("<div/>")
Expand All @@ -619,13 +590,14 @@ $.widget("multiseek.multiseekFrame", $.multiseek.multiseekBase, {
$("<div/>")
.addClass("large-5 small-10 columns")
.attr("id", "value-placeholder"),

$("<div/>")
.addClass("large-1 small-2 columns")
.append(
$("<button/>")
.text("X")
.html("&times;")
.attr("id", "close-button")
.addClass('small radius ')
.addClass('button alert tiny round close-button')
.data("for-field", id)
.click($.proxy(function (evt) {
evt.preventDefault();
Expand Down Expand Up @@ -720,7 +692,8 @@ function formReportType() {

function formAsJSON() {
return JSON.stringify(
{'form_data': $("#frame-0").multiseekFrame("serialize"),
{
'form_data': $("#frame-0").multiseekFrame("serialize"),
'ordering': formOrdering(),
'report_type': formReportType()
}); // <div id=#frame-0>
Expand Down Expand Up @@ -784,7 +757,7 @@ function saveForm(button) {
} else if (data.result == 'overwrite-prompt') {
if (confirm(form_exists)) {
dct['overwrite'] = true;
$.post(url, dct,function (data, textStatus, jqXHR) {
$.post(url, dct, function (data, textStatus, jqXHR) {
if (textStatus == 'success') {
if (data.result == 'saved') {
alert(saved);
Expand All @@ -794,8 +767,8 @@ function saveForm(button) {
} else
alert(error);
}).error(function () {
alert(error);
});
alert(error);
});
;
}
} else
Expand All @@ -805,8 +778,8 @@ function saveForm(button) {
alert(err);
}
).fail(function () {
alert(error);
});
alert(error);
});
}

function loadForm(select) {
Expand All @@ -815,9 +788,9 @@ function loadForm(select) {
$(select).val('');
}

window.multiseek.removeFromResults = function(id){
window.multiseek.removeFromResults = function (id) {
var elem = $("#multiseek-row-" + id).children(".multiseek-element");
var deco = elem.css("text-decoration");
var deco = elem.css("text-decoration");

var css_after = 'line-through';
var url = '../remove-from-results/' + id
Expand All @@ -827,7 +800,7 @@ window.multiseek.removeFromResults = function(id){
url = '../remove-from-removed-results/' + id;
}

$.get(url, function(data){
$.get(url, function (data) {
elem.css("text-decoration", css_after);
});
}
4 changes: 4 additions & 0 deletions multiseek/templates/multiseek/multiseek_buttons.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@
to log in, then come back. You will be able to save created
forms.
{% endblocktrans %}
<br/>
{% blocktrans %}
You can also <a href="?foundation=1">access Foundation 6 themed version</a> of this page.
{% endblocktrans %}
{% endif %}

<select name="load" onchange="loadForm(this);" id="formsSelector">
Expand Down
9 changes: 2 additions & 7 deletions multiseek/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.views.i18n import JavaScriptCatalog

from multiseek import views
from multiseek.views import load_form, MultiseekModelRouter
from multiseek.views import load_form


urlpatterns = [
Expand Down Expand Up @@ -49,10 +49,5 @@

url(r'^load_form/(?P<search_form_pk>\d+)',
load_form,
name="load_form"),

url(r'^autocomplete/(?P<model>.*)/$', MultiseekModelRouter.as_view(
registry=settings.MULTISEEK_REGISTRY
))

name="load_form")
]
38 changes: 0 additions & 38 deletions multiseek/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,44 +291,6 @@ def get_queryset(self):
self.request.session.get(MULTISEEK_SESSION_KEY_REMOVED, []))


class MultiseekModelRouter(View):
registry = None

def get(self, request, model, *args, **kw):
registry = get_registry(self.registry)
for field in registry.fields:
if field.type == AUTOCOMPLETE:
if model == field.model.__name__:
return MultiseekModelAutocomplete(original=field).get(request)
raise Http404


class MultiseekModelAutocomplete(View):
# TODO: JSONResponseMixin
qobj = None
max_items = 10

def get_queryset(self, request):
return self.qobj.model.objects.all()

def get(self, request, *args, **kwargs):
q = request.GET.get('term', '')
if sys.version_info < (3, 0):
q = q.encode('utf-8')

qset = self.original.get_autocomplete_query(q)

ret = []
for elem in qset[:self.max_items]:
ret.append(
{'id': elem.pk,
'label': self.original.get_autocomplete_label(elem),
'value': self.original.get_autocomplete_label(elem)})

return HttpResponse(json.dumps(ret),
content_type='application/json')


JSON_OK = HttpResponse(json.dumps({'status':"OK"}), content_type='application/json')

def manually_add_or_remove(request, pk, add=True):
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
python-dateutil==2.6.1
django-autocomplete-light==3.3.0rc5
4 changes: 2 additions & 2 deletions test_project/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"datetimepicker": "^0.1.38",
"font-awesome": "^4.7.0",
"foundation-datepicker": "^1.5.6",
"foundation-sites": "5",
"jquery": "^2.1.4",
"foundation-sites": "^6.4.4-rc1",
"jquery": "^3.3.1",
"jqueryui": "^1.11.1"
}
}

0 comments on commit e30aa1d

Please sign in to comment.