0001-applications-sort-elements-by-category-in-add-popup-.patch
hobo/applications/templates/hobo/applications/add-element.html | ||
---|---|---|
9 | 9 |
<form method="post"> |
10 | 10 |
{% csrf_token %} |
11 | 11 |
<div class="application-elements"> |
12 |
{% for element in elements %} |
|
13 |
<label data-slugged-text="{{ element.text|slugify }}"><input type="checkbox" name="elements" value="{{ element.id }}">{{ element.text }}</label> |
|
12 |
{% for category in categories %} |
|
13 |
<div> |
|
14 |
<h4>{{ category.name }}</h4> |
|
15 |
{% for element in category.elements %} |
|
16 |
<label data-slugged-text="{{ element.text|slugify }}"><input type="checkbox" name="elements" value="{{ element.id }}">{{ element.text }}</label> |
|
17 |
{% endfor %} |
|
18 |
</div> |
|
14 | 19 |
{% endfor %} |
15 | 20 |
</div> |
16 | 21 |
<div style="text-align: right"> |
... | ... | |
27 | 32 |
$('.application-elements').css('height', $('.application-elements').height()); |
28 | 33 |
$('.application-elements').css('width', $('.application-elements').width()); |
29 | 34 |
if (!val) { |
35 |
$('.application-elements div').show(); |
|
30 | 36 |
$('.application-elements label').show(); |
31 | 37 |
} else { |
32 | 38 |
$('.application-elements label').each(function(idx, elem) { |
39 |
var container = $(elem).parent(); |
|
33 | 40 |
var slugged_text = $(elem).attr('data-slugged-text'); |
34 | 41 |
if (slugged_text.indexOf(val) > -1) { |
35 | 42 |
$(elem).show(); |
43 |
container.show(); |
|
36 | 44 |
} else { |
37 | 45 |
$(elem).hide(); |
46 |
if (!$('label:visible', container).lenght) { |
|
47 |
container.hide(); |
|
48 |
} |
|
38 | 49 |
} |
39 | 50 |
}); |
40 | 51 |
} |
hobo/applications/views.py | ||
---|---|---|
14 | 14 |
# You should have received a copy of the GNU Affero General Public License |
15 | 15 |
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | 16 | |
17 |
import dataclasses |
|
17 | 18 |
import io |
18 | 19 |
import json |
19 | 20 |
import tarfile |
... | ... | |
146 | 147 |
metadata = MetadataView.as_view() |
147 | 148 | |
148 | 149 | |
150 |
@dataclasses.dataclass |
|
151 |
class Category: |
|
152 |
name: str |
|
153 |
elements: list |
|
154 | ||
155 | ||
149 | 156 |
class AppAddElementView(TemplateView): |
150 | 157 |
template_name = 'hobo/applications/add-element.html' |
151 | 158 | |
... | ... | |
157 | 164 |
context['type'] = object_type |
158 | 165 |
url = object_type['urls']['list'] |
159 | 166 |
response = requests.get(url) |
160 |
context['elements'] = response.json()['data'] |
|
167 |
elements = response.json()['data'] |
|
168 |
category_names = {el.get('category') or '' for el in elements} |
|
169 |
categories = [ |
|
170 |
Category(name=c, elements=[el for el in elements if el.get('category') == c]) |
|
171 |
for c in sorted(list(category_names)) |
|
172 |
] |
|
173 |
categories.append( |
|
174 |
Category( |
|
175 |
name=_('Uncategorized'), elements=[el for el in elements if not el.get('category')] |
|
176 |
) |
|
177 |
) |
|
178 |
context['categories'] = categories |
|
161 | 179 |
break |
162 | 180 |
return context |
163 | 181 | |
164 | 182 |
def post(self, request, app_slug, type): |
165 | 183 |
context = self.get_context_data() |
166 | 184 |
app = context['app'] |
167 |
element_infos = {x['id']: x for x in context['elements']}
|
|
185 |
element_infos = {x['id']: x for c in context['categories'] for x in c.elements}
|
|
168 | 186 |
for element_slug in request.POST.getlist('elements'): |
169 | 187 |
element, created = Element.objects.get_or_create( |
170 | 188 |
type=type, slug=element_slug, defaults={'name': element_infos[element_slug]['text']} |
171 |
- |