Projet

Général

Profil

0001-applications-sort-elements-by-category-in-add-popup-.patch

Lauréline Guérin, 08 novembre 2022 18:42

Télécharger (4,32 ko)

Voir les différences:

Subject: [PATCH] applications: sort elements by category in add popup (#63883)

 .../hobo/applications/add-element.html        | 15 +++++++++++--
 hobo/applications/views.py                    | 22 +++++++++++++++++--
 2 files changed, 33 insertions(+), 4 deletions(-)
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
-