diff --git a/rdmo/management/assets/js/components/edit/EditTask.js b/rdmo/management/assets/js/components/edit/EditTask.js index 2057562628..5caef31548 100644 --- a/rdmo/management/assets/js/components/edit/EditTask.js +++ b/rdmo/management/assets/js/components/edit/EditTask.js @@ -76,14 +76,18 @@ const EditTask = ({ config, task, elements, elementActions}) => { rows={4} onChange={updateTask} />
-
+
-
+
+
+ +
diff --git a/rdmo/management/assets/js/components/edit/EditView.js b/rdmo/management/assets/js/components/edit/EditView.js index ab19a8b9c0..ae5bfb2986 100644 --- a/rdmo/management/assets/js/components/edit/EditView.js +++ b/rdmo/management/assets/js/components/edit/EditView.js @@ -5,6 +5,7 @@ import get from 'lodash/get' import CodeMirror from './common/CodeMirror' import Checkbox from './common/Checkbox' +import Number from './common/Number' import Select from './common/Select' import Text from './common/Text' import Textarea from './common/Textarea' @@ -70,14 +71,18 @@ const EditView = ({ config, view, elements, elementActions }) => { rows={4} onChange={updateView} />
-
+
-
+
+
+ +
diff --git a/rdmo/management/assets/js/components/element/Task.js b/rdmo/management/assets/js/components/element/Task.js index c8a4f981bf..12676cc89f 100644 --- a/rdmo/management/assets/js/components/element/Task.js +++ b/rdmo/management/assets/js/components/element/Task.js @@ -1,5 +1,6 @@ import React from 'react' import PropTypes from 'prop-types' +import get from 'lodash/get' import { filterElement } from '../../utils/filter' import { buildPath } from '../../utils/location' @@ -21,6 +22,8 @@ const Task = ({ config, task, elementActions, filter=false, filterSites=false, f const toggleAvailable = () => elementActions.storeElement('tasks', {...task, available: !task.available }) const toggleLocked = () => elementActions.storeElement('tasks', {...task, locked: !task.locked }) + const fetchCondition = (index) => elementActions.fetchElement('conditions', task.conditions[index]) + return showElement && (
  • @@ -40,8 +43,20 @@ const Task = ({ config, task, elementActions, filter=false, filterSites=false, f

    {gettext('Task')}{': '} - fetchEdit()} /> + {task.title}

    + { + get(config, 'display.uri.tasks', true) &&

    + fetchEdit()} /> +

    + } + { + get(config, 'display.uri.conditions', true) && task.condition_uris.map((uri, index) => ( +

    + fetchCondition(index)} /> +

    + )) + }
    diff --git a/rdmo/management/assets/js/components/elements/Tasks.js b/rdmo/management/assets/js/components/elements/Tasks.js index 693181538f..136ecc6140 100644 --- a/rdmo/management/assets/js/components/elements/Tasks.js +++ b/rdmo/management/assets/js/components/elements/Tasks.js @@ -6,6 +6,7 @@ import { getUriPrefixes } from '../../utils/filter' import { FilterString, FilterUriPrefix, FilterSite} from '../common/Filter' import { BackButton, NewButton } from '../common/Buttons' +import { Checkbox } from '../common/Checkboxes' import Task from '../element/Task' @@ -16,6 +17,9 @@ const Tasks = ({ config, tasks, configActions, elementActions }) => { const updateFilterSite = (value) => configActions.updateConfig('filter.sites', value) const updateFilterEditor = (value) => configActions.updateConfig('filter.editors', value) + const updateDisplayTasksURI = (value) => configActions.updateConfig('display.uri.tasks', value) + const updateDisplayConditionsURI = (value) => configActions.updateConfig('display.uri.conditions', value) + const createTask = () => elementActions.createElement('tasks') return ( @@ -51,6 +55,14 @@ const Tasks = ({ config, tasks, configActions, elementActions }) => { }
  • +
    + {gettext('Show URIs:')} + {gettext('Tasks')}} + value={get(config, 'display.uri.tasks', true)} onChange={updateDisplayTasksURI} /> + {gettext('Conditions')}} + value={get(config, 'display.uri.conditions', true)} onChange={updateDisplayConditionsURI} /> +
    +
      diff --git a/rdmo/projects/migrations/0060_alter_issue_options.py b/rdmo/projects/migrations/0060_alter_issue_options.py new file mode 100644 index 0000000000..9048e8c46c --- /dev/null +++ b/rdmo/projects/migrations/0060_alter_issue_options.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0059_project_progress'), + ] + + operations = [ + migrations.AlterModelOptions( + name='issue', + options={'ordering': ('project__title', 'task__uri'), 'verbose_name': 'Issue', 'verbose_name_plural': 'Issues'}, + ), + ] diff --git a/rdmo/projects/models/issue.py b/rdmo/projects/models/issue.py index bfaf95474d..1b2c30164d 100644 --- a/rdmo/projects/models/issue.py +++ b/rdmo/projects/models/issue.py @@ -40,7 +40,7 @@ class Issue(models.Model): ) class Meta: - ordering = ('project__title', ) + ordering = ('project__title', 'task__uri') verbose_name = _('Issue') verbose_name_plural = _('Issues') diff --git a/rdmo/projects/templates/projects/project_detail_views.html b/rdmo/projects/templates/projects/project_detail_views.html index 593aa57c2a..e3cda0f3fa 100644 --- a/rdmo/projects/templates/projects/project_detail_views.html +++ b/rdmo/projects/templates/projects/project_detail_views.html @@ -12,7 +12,7 @@

      {% trans 'Views' %}

      {% include 'projects/project_detail_views_help.html' %} - {% if project.views.exists %} + {% if views %} @@ -27,7 +27,7 @@

      {% trans 'Views' %}

      - {% for view in project.views.all %} + {% for view in views %}
      {{ view.title }} diff --git a/rdmo/projects/views/project.py b/rdmo/projects/views/project.py index 6bbe56fbd5..934b724cfa 100644 --- a/rdmo/projects/views/project.py +++ b/rdmo/projects/views/project.py @@ -157,7 +157,10 @@ def get_context_data(self, **kwargs): context['memberships'] = memberships.order_by('user__last_name', '-project__level') context['integrations'] = integrations.order_by('provider_key', '-project__level') context['providers'] = get_plugins('PROJECT_ISSUE_PROVIDERS') - context['issues'] = [issue for issue in project.issues.all() if issue.resolve(values)] + context['issues'] = [ + issue for issue in project.issues.order_by('-status', 'task__order', 'task__uri') if issue.resolve(values) + ] + context['views'] = project.views.order_by('order', 'uri') context['snapshots'] = project.snapshots.all() context['invites'] = project.invites.all() context['membership'] = Membership.objects.filter(project=project, user=self.request.user).first() diff --git a/rdmo/tasks/imports.py b/rdmo/tasks/imports.py index 7631d1be44..2f9ef7dca8 100644 --- a/rdmo/tasks/imports.py +++ b/rdmo/tasks/imports.py @@ -25,6 +25,8 @@ def import_task(element, save=False, user=None): set_common_fields(task, element) + task.order = element.get('order') or 0 + set_lang_field(task, 'title', element) set_lang_field(task, 'text', element) diff --git a/rdmo/tasks/migrations/0036_task_order.py b/rdmo/tasks/migrations/0036_task_order.py new file mode 100644 index 0000000000..868c80706f --- /dev/null +++ b/rdmo/tasks/migrations/0036_task_order.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tasks', '0035_uri_path'), + ] + + operations = [ + migrations.AddField( + model_name='task', + name='order', + field=models.IntegerField(default=0, help_text='The position of this task in lists.', verbose_name='Order'), + ), + ] diff --git a/rdmo/tasks/models.py b/rdmo/tasks/models.py index eef1a0c682..0e44a3d528 100644 --- a/rdmo/tasks/models.py +++ b/rdmo/tasks/models.py @@ -42,6 +42,11 @@ class Task(TranslationMixin, models.Model): verbose_name=_('Locked'), help_text=_('Designates whether this task can be changed.') ) + order = models.IntegerField( + default=0, + verbose_name=_('Order'), + help_text=_('The position of this task in lists.') + ) catalogs = models.ManyToManyField( Catalog, blank=True, verbose_name=_('Catalogs'), diff --git a/rdmo/tasks/renderers/mixins.py b/rdmo/tasks/renderers/mixins.py index 48e879c50c..adb6d1cc9c 100644 --- a/rdmo/tasks/renderers/mixins.py +++ b/rdmo/tasks/renderers/mixins.py @@ -11,6 +11,7 @@ def render_task(self, xml, task): self.render_text_element(xml, 'uri_prefix', {}, task['uri_prefix']) self.render_text_element(xml, 'uri_path', {}, task['uri_path']) self.render_text_element(xml, 'dc:comment', {}, task['comment']) + self.render_text_element(xml, 'order', {}, task['order']) for lang_code, lang_string, lang_field in get_languages(): self.render_text_element(xml, 'title', {'lang': lang_code}, task['title_%s' % lang_code]) diff --git a/rdmo/tasks/serializers/export.py b/rdmo/tasks/serializers/export.py index 7de22136d8..8aa3a327a1 100644 --- a/rdmo/tasks/serializers/export.py +++ b/rdmo/tasks/serializers/export.py @@ -20,6 +20,7 @@ class Meta: 'uri_prefix', 'uri_path', 'comment', + 'order', 'start_attribute', 'end_attribute', 'days_before', diff --git a/rdmo/tasks/serializers/v1.py b/rdmo/tasks/serializers/v1.py index cebd38a415..424c0db487 100644 --- a/rdmo/tasks/serializers/v1.py +++ b/rdmo/tasks/serializers/v1.py @@ -21,6 +21,8 @@ class TaskSerializer(TranslationSerializerMixin, ElementModelSerializerMixin, warning = serializers.SerializerMethodField() read_only = serializers.SerializerMethodField() + condition_uris = serializers.SerializerMethodField() + projects_count = serializers.IntegerField(read_only=True) class Meta: @@ -33,6 +35,7 @@ class Meta: 'uri_path', 'comment', 'locked', + 'order', 'available', 'catalogs', 'sites', @@ -47,6 +50,7 @@ class Meta: 'text', 'warning', 'read_only', + 'condition_uris', 'projects_count', ) trans_fields = ( @@ -61,6 +65,9 @@ class Meta: 'title', ) + def get_condition_uris(self, obj): + return [condition.uri for condition in obj.conditions.all()] + class TaskIndexSerializer(serializers.ModelSerializer): diff --git a/rdmo/views/imports.py b/rdmo/views/imports.py index 7c09061035..ce7a778cc2 100644 --- a/rdmo/views/imports.py +++ b/rdmo/views/imports.py @@ -18,6 +18,7 @@ def import_view(element, save=False, user=None): set_common_fields(view, element) + view.order = element.get('order') or 0 view.template = element.get('template') set_lang_field(view, 'title', element) diff --git a/rdmo/views/migrations/0029_view_order.py b/rdmo/views/migrations/0029_view_order.py new file mode 100644 index 0000000000..84fc690d19 --- /dev/null +++ b/rdmo/views/migrations/0029_view_order.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-11-18 10:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('views', '0028_uri_path'), + ] + + operations = [ + migrations.AddField( + model_name='view', + name='order', + field=models.IntegerField(default=0, help_text='The position of this view in lists.', verbose_name='Order'), + ), + ] diff --git a/rdmo/views/models.py b/rdmo/views/models.py index 4f8561b7fd..2a22b9b61f 100644 --- a/rdmo/views/models.py +++ b/rdmo/views/models.py @@ -43,6 +43,11 @@ class View(models.Model, TranslationMixin): verbose_name=_('Locked'), help_text=_('Designates whether this view can be changed.') ) + order = models.IntegerField( + default=0, + verbose_name=_('Order'), + help_text=_('The position of this view in lists.') + ) catalogs = models.ManyToManyField( Catalog, blank=True, verbose_name=_('Catalogs'), diff --git a/rdmo/views/renderers/mixins.py b/rdmo/views/renderers/mixins.py index 31971975d1..f6ee263d70 100644 --- a/rdmo/views/renderers/mixins.py +++ b/rdmo/views/renderers/mixins.py @@ -11,6 +11,7 @@ def render_view(self, xml, view): self.render_text_element(xml, 'uri_prefix', {}, view['uri_prefix']) self.render_text_element(xml, 'uri_path', {}, view['uri_path']) self.render_text_element(xml, 'dc:comment', {}, view['comment']) + self.render_text_element(xml, 'order', {}, view['order']) for lang_code, lang_string, lang_field in get_languages(): self.render_text_element(xml, 'title', {'lang': lang_code}, view['title_%s' % lang_code]) diff --git a/rdmo/views/serializers/export.py b/rdmo/views/serializers/export.py index 3dc6b6ebf3..d8d2527472 100644 --- a/rdmo/views/serializers/export.py +++ b/rdmo/views/serializers/export.py @@ -16,6 +16,7 @@ class Meta: 'uri_prefix', 'uri_path', 'comment', + 'order', 'catalogs', 'template' ) diff --git a/rdmo/views/serializers/v1.py b/rdmo/views/serializers/v1.py index 5862537a29..6b07fe63de 100644 --- a/rdmo/views/serializers/v1.py +++ b/rdmo/views/serializers/v1.py @@ -46,6 +46,7 @@ class Meta: 'uri_path', 'comment', 'locked', + 'order', 'available', 'catalogs', 'sites',