From 6a9172e60b457941d17c05f2e64a88874e527079 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 6 Oct 2023 18:13:59 +0200 Subject: [PATCH 001/114] Refactor autocomplete and add free autocomplete widget for arbitrary inputs (#600) --- rdmo/core/settings.py | 1 + .../projects/js/project_questions/services.js | 75 ++++++++++++++++--- .../projects/project_questions_element.html | 6 +- ...ect_questions_form_group_autocomplete.html | 4 +- rdmo/projects/views/project.py | 2 +- rdmo/projects/widgets.py | 5 ++ rdmo/questions/constants.py | 14 ---- 7 files changed, 75 insertions(+), 32 deletions(-) delete mode 100644 rdmo/questions/constants.py diff --git a/rdmo/core/settings.py b/rdmo/core/settings.py index 55125a2ad0..c99f1a2a51 100644 --- a/rdmo/core/settings.py +++ b/rdmo/core/settings.py @@ -318,6 +318,7 @@ ('radio', _('Radio buttons'), 'rdmo.projects.widgets.RadioWidget'), ('select', _('Select drop-down'), 'rdmo.projects.widgets.SelectWidget'), ('autocomplete', _('Autocomplete'), 'rdmo.projects.widgets.AutocompleteWidget'), + ('freeautocomplete', _('Free autocomplete'), 'rdmo.projects.widgets.FreeAutocompleteWidget'), ('range', _('Range slider'), 'rdmo.projects.widgets.RangeWidget'), ('date', _('Date picker'), 'rdmo.projects.widgets.DateWidget'), ('file', _('File upload'), 'rdmo.projects.widgets.FileWidget') diff --git a/rdmo/projects/static/projects/js/project_questions/services.js b/rdmo/projects/static/projects/js/project_questions/services.js index efa8e4ea9d..ce9214c544 100644 --- a/rdmo/projects/static/projects/js/project_questions/services.js +++ b/rdmo/projects/static/projects/js/project_questions/services.js @@ -941,7 +941,6 @@ angular.module('project_questions') } } } else { - console.log('next'); service.next(); } } else { @@ -1372,12 +1371,22 @@ angular.module('project_questions') // unset the searching flag value.searching = false; + + // activate the first item + if (question.widget_type == 'autocomplete' && angular.isDefined(value.items[0])) { + value.items[0].active = true; + } }); } } else { // if no search was performed, do the searching on the client value.autocomplete_search = false; value.items = question.options_fuse.search(value.autocomplete_input); + + // activate the first item + if (question.widget_type == 'autocomplete' && angular.isDefined(value.items[0])) { + value.items[0].active = true; + } } } else { value.items = []; @@ -1420,8 +1429,19 @@ angular.module('project_questions') value.autocomplete_input = next.text; } } else if ($event.code == 'Enter' || $event.code == 'NumpadEnter') { - if (angular.isDefined(active)) { + if (value.autocomplete_input == '') { + service.resetAutocomplete(value); + } else if (angular.isDefined(active)) { service.selectAutocomplete(value, value.items[active]); + } else if (question.widget_type == 'freeautocomplete') { + var matchingOptions = $filter('filter')(value.items, function(item) { + return item.text.toLowerCase() == value.autocomplete_input.toLowerCase(); + }) + if (matchingOptions.length > 0) { + service.selectAutocomplete(value, matchingOptions[0]); + } else { + service.selectAutocomplete(value, null); + } } } else if ($event.code == 'Escape') { if (value.selected === '') { @@ -1437,24 +1457,57 @@ angular.module('project_questions') // called when the user clicks on an option of the autocomplete field service.selectAutocomplete = function(value, option) { value.autocomplete_locked = true; - value.selected = option.id.toString(); - value.autocomplete_text = option.text; + + if (option === null) { + value.text = value.autocomplete_input; + value.selected = ''; + value.autocomplete_text = value.text; + } else { + value.text = ''; + value.selected = option.id.toString(); + value.autocomplete_text = option.text; + value.autocomplete_input = option.text; + } service.changed(value, true); } // called when the user clicks outside the autocomplete field - service.blurAutocomplete = function(value) { - if (value.selected === '') { - value.autocomplete_input = ''; - value.autocomplete_text = ''; - value.items = null; + service.blurAutocomplete = function(question, value) { + if (question.widget_type == 'freeautocomplete') { + if (value.autocomplete_input == '') { + service.resetAutocomplete(value); + } else { + var matchingOptions = $filter('filter')(value.items, function(item) { + return item.text.toLowerCase() == value.autocomplete_input.toLowerCase(); + }) + if (matchingOptions.length > 0) { + service.selectAutocomplete(value, matchingOptions[0]); + } else { + service.selectAutocomplete(value, null); + } + } } else { - value.autocomplete_locked = true; - value.autocomplete_input = value.autocomplete_text; + if (value.selected === '') { + service.resetAutocomplete(value); + } else { + value.autocomplete_locked = true; + value.autocomplete_input = value.autocomplete_text; + } } } + // called when an empty string is entered in the autocomplete field + service.resetAutocomplete = function(value) { + value.text = ''; + value.selected = ''; + value.autocomplete_input = ''; + value.autocomplete_text = ''; + value.items = null; + + service.changed(value, true); + } + // called when the user clicks in the autocomplete field service.unlockAutocomplete = function(question, value, set_prefix, set_index, index) { value.autocomplete_locked = false; diff --git a/rdmo/projects/templates/projects/project_questions_element.html b/rdmo/projects/templates/projects/project_questions_element.html index 0e28e8e8d0..cc1de9476e 100644 --- a/rdmo/projects/templates/projects/project_questions_element.html +++ b/rdmo/projects/templates/projects/project_questions_element.html @@ -28,10 +28,8 @@
- {% for widget in widgets %} - {% if widget.template_name %} - {% include widget.template_name %} - {% endif %} + {% for template_name in widgets %} + {% include template_name %} {% endfor %}
diff --git a/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html b/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html index e35e795114..981e7dfc0d 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_autocomplete.html @@ -1,6 +1,6 @@ {% load i18n %} -
+
{% include 'projects/project_questions_question_label.html' %} {% include 'projects/project_questions_question_help.html' %} {% include 'projects/project_questions_question_warning.html' %} @@ -30,7 +30,7 @@ ng-focus="service.filterAutocomplete(question, value)" ng-change="service.filterAutocomplete(question, value);" ng-keydown="service.keydownAutocomplete(question, value, $event)" - ng-blur="service.blurAutocomplete(value)" + ng-blur="service.blurAutocomplete(question, value)" ng-class="{'default-value': service.isDefaultValue(question, value)}" placeholder="{% trans 'Please type and select.' %}"/> diff --git a/rdmo/projects/views/project.py b/rdmo/projects/views/project.py index 6bbe56fbd5..aa243b1609 100644 --- a/rdmo/projects/views/project.py +++ b/rdmo/projects/views/project.py @@ -272,7 +272,7 @@ def get(self, request, *args, **kwargs): return redirect('project_error', pk=self.object.pk) else: context = self.get_context_data(object=self.object) - context['widgets'] = get_widgets() + context['widgets'] = {widget.template_name for widget in get_widgets() if widget.template_name} return self.render_to_response(context) diff --git a/rdmo/projects/widgets.py b/rdmo/projects/widgets.py index 94507c7f91..bff47e8089 100644 --- a/rdmo/projects/widgets.py +++ b/rdmo/projects/widgets.py @@ -31,6 +31,11 @@ class AutocompleteWidget(Widget): widget_class = 'autocomplete' +class FreeAutocompleteWidget(Widget): + template_name = 'projects/project_questions_form_group_autocomplete.html' + widget_class = 'autocomplete' + + class DateWidget(Widget): template_name = 'projects/project_questions_form_group_date.html' widget_class = 'date' diff --git a/rdmo/questions/constants.py b/rdmo/questions/constants.py deleted file mode 100644 index 554286f3b3..0000000000 --- a/rdmo/questions/constants.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.utils.translation import gettext_lazy as _ - -WIDGET_TYPES = ( - ('text', _('Text')), - ('textarea', _('Textarea')), - ('yesno', _('Yes/No')), - ('checkbox', _('Checkboxes')), - ('radio', _('Radio buttons')), - ('select', _('Select drop-down')), - ('autocomplete', _('Autocomplete')), - ('range', _('Range slider')), - ('date', _('Date picker')), - ('file', _('File upload')) -) From 14eace49cd82838cdf974c65711f4d8d9f20350f Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Fri, 20 Oct 2023 14:58:23 +0200 Subject: [PATCH 002/114] #745 Add order parameter back to managament interface * pass order value to Section, Page, and Question --- .../assets/js/components/common/Links.js | 27 +++++----- .../assets/js/components/element/Page.js | 38 +++++++------- .../assets/js/components/element/Question.js | 19 +++---- .../assets/js/components/element/Section.js | 50 ++++++++++++------- .../js/components/nested/NestedCatalog.js | 45 +++++++++++------ 5 files changed, 108 insertions(+), 71 deletions(-) diff --git a/rdmo/management/assets/js/components/common/Links.js b/rdmo/management/assets/js/components/common/Links.js index 0c291ad8ed..687e7fa9ae 100644 --- a/rdmo/management/assets/js/components/common/Links.js +++ b/rdmo/management/assets/js/components/common/Links.js @@ -7,7 +7,7 @@ import isUndefined from 'lodash/isUndefined' import Link from 'rdmo/core/assets/js/components/Link' import LinkButton from 'rdmo/core/assets/js/components/LinkButton' -const NestedLink = ({ href, title, onClick, show=true }) => { +const NestedLink = ({ href, title, onClick, show = true }) => { return show && } @@ -74,7 +74,7 @@ const AvailableLink = ({ available, locked, title, onClick, disabled }) => { }) return + disabled={locked || disabled} onClick={onClick} /> } AvailableLink.propTypes = { @@ -120,7 +120,7 @@ ShowElementsLink.propTypes = { onClick: PropTypes.func.isRequired } -const ExportLink = ({ exportUrl, title, exportFormats, csv=false, full=false }) => { +const ExportLink = ({ exportUrl, title, exportFormats, csv = false, full = false }) => { return ( @@ -144,8 +144,8 @@ const ExportLink = ({ exportUrl, title, exportFormats, csv=false, full=false }) { exportFormats.map(([key, label], index) =>
  • {label} + target={['pdf', 'html'].includes(key) ? '_blank' : '_self'} + rel="noreferrer">{label}
  • ) } @@ -169,7 +169,7 @@ const ExtendLink = ({ extend, onClick }) => { }) const title = extend ? gettext('Show less') - : gettext('Show more') + : gettext('Show more') return } @@ -179,18 +179,19 @@ ExtendLink.propTypes = { onClick: PropTypes.func.isRequired } -const CodeLink = ({ className, uri, onClick }) => { +const CodeLink = ({ className, uri, onClick, order }) => { return ( - + <> {uri} - + {order !== undefined && order !== null ? {order} : null} ) } CodeLink.propTypes = { className: PropTypes.string.isRequired, uri: PropTypes.string.isRequired, - onClick: PropTypes.func.isRequired + onClick: PropTypes.func.isRequired, + order: PropTypes.number } const ErrorLink = ({ element, onClick }) => { @@ -235,5 +236,7 @@ ShowLink.propTypes = { onClick: PropTypes.func.isRequired } -export { EditLink, CopyLink, AddLink, AvailableLink, LockedLink, ShowElementsLink, - NestedLink, ExportLink, ExtendLink, CodeLink, ErrorLink, WarningLink, ShowLink } +export { + EditLink, CopyLink, AddLink, AvailableLink, LockedLink, ShowElementsLink, + NestedLink, ExportLink, ExtendLink, CodeLink, ErrorLink, WarningLink, ShowLink +} diff --git a/rdmo/management/assets/js/components/element/Page.js b/rdmo/management/assets/js/components/element/Page.js index af692967be..d30a08c13d 100644 --- a/rdmo/management/assets/js/components/element/Page.js +++ b/rdmo/management/assets/js/components/element/Page.js @@ -8,13 +8,15 @@ import { buildPath } from '../../utils/location' import QuestionSet from './QuestionSet' import Question from './Question' import { ElementErrors } from '../common/Errors' -import { EditLink, CopyLink, AddLink, LockedLink, NestedLink, - ExportLink, CodeLink, ShowElementsLink } from '../common/Links' +import { + EditLink, CopyLink, AddLink, LockedLink, NestedLink, + ExportLink, CodeLink, ShowElementsLink +} from '../common/Links' import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const Page = ({ config, page, configActions, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { +const Page = ({ config, page, configActions, elementActions, display = 'list', indent = 0, + filter = false, filterEditors = false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, page) const showElements = get(config, `display.elements.pages.${page.id}`, true) @@ -27,7 +29,7 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind const fetchEdit = () => elementActions.fetchElement('pages', page.id) const fetchCopy = () => elementActions.fetchElement('pages', page.id, 'copy') const fetchNested = () => elementActions.fetchElement('pages', page.id, 'nested') - const toggleLocked = () => elementActions.storeElement('pages', {...page, locked: !page.locked }) + const toggleLocked = () => elementActions.storeElement('pages', { ...page, locked: !page.locked }) const toggleElements = () => configActions.toggleElements(page) const createQuestionSet = () => elementActions.createElement('questionsets', { page }) @@ -35,7 +37,6 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind const fetchAttribute = () => elementActions.fetchElement('attributes', page.attribute) const fetchCondition = (index) => elementActions.fetchElement('conditions', page.conditions[index]) - const elementNode = (
    @@ -45,11 +46,11 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind + onClick={createQuestion} onAltClick={createQuestionSet} disabled={page.read_only} /> + locked={page.locked} onClick={toggleLocked} disabled={page.read_only} /> + exportFormats={config.settings.export_formats} full={true} />
    @@ -58,7 +59,7 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind

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

    - fetchEdit()} /> + fetchEdit()} order={order} />

    } { @@ -82,7 +83,7 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind case 'list': return showElement && (
  • - { elementNode } + {elementNode}
  • ) case 'nested': @@ -93,7 +94,7 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind
    - { elementNode } + {elementNode}
    @@ -101,14 +102,16 @@ const Page = ({ config, page, configActions, elementActions, display='list', ind } { showElements && page.elements.map((element, index) => { + const questionInfo = page.questions.find(info => info.question === element.id) + const questionOrder = questionInfo ? questionInfo.order : null // Get the order value if (element.model == 'questions.questionset') { return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionOrder} /> } else { return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionOrder} /> } }) } @@ -128,7 +131,8 @@ Page.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default Page diff --git a/rdmo/management/assets/js/components/element/Question.js b/rdmo/management/assets/js/components/element/Question.js index ecf280573f..27faedeec9 100644 --- a/rdmo/management/assets/js/components/element/Question.js +++ b/rdmo/management/assets/js/components/element/Question.js @@ -10,8 +10,8 @@ import { EditLink, CopyLink, LockedLink, ExportLink, CodeLink } from '../common/ import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const Question = ({ config, question, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { +const Question = ({ config, question, elementActions, display = 'list', indent = 0, + filter = false, filterEditors = false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, question) @@ -21,7 +21,7 @@ const Question = ({ config, question, elementActions, display='list', indent=0, const fetchEdit = () => elementActions.fetchElement('questions', question.id) const fetchCopy = () => elementActions.fetchElement('questions', question.id, 'copy') - const toggleLocked = () => elementActions.storeElement('questions', {...question, locked: !question.locked }) + const toggleLocked = () => elementActions.storeElement('questions', { ...question, locked: !question.locked }) const fetchAttribute = () => elementActions.fetchElement('attributes', question.attribute) const fetchCondition = (index) => elementActions.fetchElement('conditions', question.conditions[index]) @@ -34,9 +34,9 @@ const Question = ({ config, question, elementActions, display='list', indent=0, + locked={question.locked} onClick={toggleLocked} disabled={question.read_only} /> + exportFormats={config.settings.export_formats} full={true} />
    @@ -46,7 +46,7 @@ const Question = ({ config, question, elementActions, display='list', indent=0,

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

    - fetchEdit()} /> + fetchEdit()} order={order} />

    } { @@ -77,7 +77,7 @@ const Question = ({ config, question, elementActions, display='list', indent=0, case 'list': return showElement && (
  • - { elementNode } + {elementNode}
  • ) case 'nested': @@ -87,7 +87,7 @@ const Question = ({ config, question, elementActions, display='list', indent=0, showElement && (
    - { elementNode } + {elementNode}
    ) @@ -106,7 +106,8 @@ Question.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default Question diff --git a/rdmo/management/assets/js/components/element/Section.js b/rdmo/management/assets/js/components/element/Section.js index c675ee8103..d893b5836a 100644 --- a/rdmo/management/assets/js/components/element/Section.js +++ b/rdmo/management/assets/js/components/element/Section.js @@ -8,14 +8,16 @@ import { buildPath } from '../../utils/location' import Page from './Page' import { ElementErrors } from '../common/Errors' -import { EditLink, CopyLink, AddLink, LockedLink, NestedLink, ExportLink, - CodeLink, ShowElementsLink } from '../common/Links' +import { + EditLink, CopyLink, AddLink, LockedLink, NestedLink, ExportLink, + CodeLink, ShowElementsLink +} from '../common/Links' import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const Section = ({ config, section, configActions, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { +const Section = ({ config, section, configActions, elementActions, display = 'list', indent = 0, + filter = false, filterEditors = false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, section) const showElements = get(config, `display.elements.sections.${section.id}`, true) @@ -28,7 +30,7 @@ const Section = ({ config, section, configActions, elementActions, display='list const fetchEdit = () => elementActions.fetchElement('sections', section.id) const fetchCopy = () => elementActions.fetchElement('sections', section.id, 'copy') const fetchNested = () => elementActions.fetchElement('sections', section.id, 'nested') - const toggleLocked = () => elementActions.storeElement('sections', {...section, locked: !section.locked }) + const toggleLocked = () => elementActions.storeElement('sections', { ...section, locked: !section.locked }) const toggleElements = () => configActions.toggleElements(section) const createPage = () => elementActions.createElement('pages', { section }) @@ -43,10 +45,10 @@ const Section = ({ config, section, configActions, elementActions, display='list + : gettext('Lock section')} + locked={section.locked} onClick={toggleLocked} disabled={section.read_only} /> + exportFormats={config.settings.export_formats} full={true} />
    @@ -55,7 +57,7 @@ const Section = ({ config, section, configActions, elementActions, display='list

    { get(config, 'display.uri.sections', true) && - fetchEdit()} /> + fetchEdit()} order={order} /> }
    @@ -66,7 +68,7 @@ const Section = ({ config, section, configActions, elementActions, display='list case 'list': return showElement && (
  • - { elementNode } + {elementNode}
  • ) case 'nested': @@ -77,7 +79,7 @@ const Section = ({ config, section, configActions, elementActions, display='list
    - { elementNode } + {elementNode}
    @@ -88,11 +90,24 @@ const Section = ({ config, section, configActions, elementActions, display='list } { - showElements && section.elements.map((page, index) => ( - - )) + showElements && section.elements.map((page, index) => { + const pageInfo = section.pages.find(info => info.page === page.id) + const pageOrder = pageInfo ? pageInfo.order : null // Get the order value + + return ( + + ) + }) } @@ -110,7 +125,8 @@ Section.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default Section diff --git a/rdmo/management/assets/js/components/nested/NestedCatalog.js b/rdmo/management/assets/js/components/nested/NestedCatalog.js index 3b2809f909..654e868d9a 100644 --- a/rdmo/management/assets/js/components/nested/NestedCatalog.js +++ b/rdmo/management/assets/js/components/nested/NestedCatalog.js @@ -40,18 +40,18 @@ const NestedCatalog = ({ config, catalog, configActions, elementActions }) => {
    + configActions={configActions} elementActions={elementActions} display="plain" />
    + placeholder={gettext('Filter catalogs')} />
    + options={getUriPrefixes(catalog.elements)} />
    @@ -63,21 +63,21 @@ const NestedCatalog = ({ config, catalog, configActions, elementActions }) => {
    {gettext('Show URIs:')} {gettext('Catalogs')}} - value={get(config, 'display.uri.catalogs', true)} onChange={updateDisplayCatalogURI} /> + value={get(config, 'display.uri.catalogs', true)} onChange={updateDisplayCatalogURI} /> {gettext('Sections')}} - value={get(config, 'display.uri.sections', true)} onChange={updateDisplaySectionsURI} /> + value={get(config, 'display.uri.sections', true)} onChange={updateDisplaySectionsURI} /> {gettext('Pages')}} - value={get(config, 'display.uri.pages', true)} onChange={updateDisplayPagesURI} /> + value={get(config, 'display.uri.pages', true)} onChange={updateDisplayPagesURI} /> {gettext('Question sets')}} - value={get(config, 'display.uri.questionsets', true)} onChange={updateDisplayQuestionSetsURI} /> + value={get(config, 'display.uri.questionsets', true)} onChange={updateDisplayQuestionSetsURI} /> {gettext('Questions')}} - value={get(config, 'display.uri.questions', true)} onChange={updateDisplayQuestionsURI} /> + value={get(config, 'display.uri.questions', true)} onChange={updateDisplayQuestionsURI} /> {gettext('Attributes')}} - value={get(config, 'display.uri.attributes', true)} onChange={updateDisplayAttributesURI} /> + value={get(config, 'display.uri.attributes', true)} onChange={updateDisplayAttributesURI} /> {gettext('Conditions')}} - value={get(config, 'display.uri.conditions', true)} onChange={updateDisplayConditionsURI} /> + value={get(config, 'display.uri.conditions', true)} onChange={updateDisplayConditionsURI} /> {gettext('Option sets')}} - value={get(config, 'display.uri.optionsets', true)} onChange={updateDisplayOptionSetURI} /> + value={get(config, 'display.uri.optionsets', true)} onChange={updateDisplayOptionSetURI} />
    @@ -86,12 +86,25 @@ const NestedCatalog = ({ config, catalog, configActions, elementActions }) => { } { - catalog.elements.map((section, index) => ( -
    - )) + catalog.elements.map((section, index) => { + const sectionInfo = catalog.sections.find(info => info.section === section.id) + const sectionOrder = sectionInfo ? sectionInfo.order : null // Get the order value + + return ( +
    + ) + }) } + ) } From de725c352b5da44c651823149d89f537d852225d Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Fri, 20 Oct 2023 15:38:24 +0200 Subject: [PATCH 003/114] #745 Add order parameter back to managament interface * pass order value to QuestionSet * pass order value to Question from QuestionSet --- .../assets/js/components/element/Page.js | 8 ++-- .../js/components/element/QuestionSet.js | 41 +++++++++++-------- .../assets/js/components/element/Section.js | 2 +- .../js/components/nested/NestedCatalog.js | 4 +- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/rdmo/management/assets/js/components/element/Page.js b/rdmo/management/assets/js/components/element/Page.js index d30a08c13d..2bf9f79614 100644 --- a/rdmo/management/assets/js/components/element/Page.js +++ b/rdmo/management/assets/js/components/element/Page.js @@ -102,13 +102,15 @@ const Page = ({ config, page, configActions, elementActions, display = 'list', i } { showElements && page.elements.map((element, index) => { - const questionInfo = page.questions.find(info => info.question === element.id) - const questionOrder = questionInfo ? questionInfo.order : null // Get the order value if (element.model == 'questions.questionset') { + const questionSetInfo = page.questionsets.find(info => info.questionset === element.id) + const questionSetOrder = questionSetInfo ? questionSetInfo.order : undefined return + display="nested" filter={filter} indent={indent + 1} order={questionSetOrder} /> } else { + const questionInfo = page.questions.find(info => info.question === element.id) + const questionOrder = questionInfo ? questionInfo.order : undefined return diff --git a/rdmo/management/assets/js/components/element/QuestionSet.js b/rdmo/management/assets/js/components/element/QuestionSet.js index 024652536f..bf975e37b2 100644 --- a/rdmo/management/assets/js/components/element/QuestionSet.js +++ b/rdmo/management/assets/js/components/element/QuestionSet.js @@ -7,13 +7,15 @@ import { buildPath } from '../../utils/location' import Question from './Question' import { ElementErrors } from '../common/Errors' -import { EditLink, CopyLink, AddLink, LockedLink, - NestedLink, ExportLink, CodeLink, ShowElementsLink } from '../common/Links' +import { + EditLink, CopyLink, AddLink, LockedLink, + NestedLink, ExportLink, CodeLink, ShowElementsLink +} from '../common/Links' import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const QuestionSet = ({ config, questionset, configActions, elementActions, display='list', indent=0, - filter=false, filterEditors=false }) => { +const QuestionSet = ({ config, questionset, configActions, elementActions, display = 'list', indent = 0, + filter = false, filterEditors = false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, questionset) const showElements = get(config, `display.elements.questionsets.${questionset.id}`, true) @@ -26,7 +28,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ const fetchEdit = () => elementActions.fetchElement('questionsets', questionset.id) const fetchCopy = () => elementActions.fetchElement('questionsets', questionset.id, 'copy') const fetchNested = () => elementActions.fetchElement('questionsets', questionset.id, 'nested') - const toggleLocked = () => elementActions.storeElement('questionsets', {...questionset, locked: !questionset.locked }) + const toggleLocked = () => elementActions.storeElement('questionsets', { ...questionset, locked: !questionset.locked }) const toggleElements = () => configActions.toggleElements(questionset) const createQuestionSet = () => elementActions.createElement('questionsets', { questionset }) @@ -44,11 +46,11 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ + onClick={createQuestion} onAltClick={createQuestionSet} disabled={questionset.read_only} /> + locked={questionset.locked} onClick={toggleLocked} disabled={questionset.read_only} /> + exportFormats={config.settings.export_formats} full={true} />
    @@ -57,11 +59,11 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ

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

    - fetchEdit()} /> + fetchEdit()} order={order} />

    } { - get(config, 'display.uri.attributes', true) && questionset.attribute_uri &&

    + get(config, 'display.uri.attributes', true) && questionset.attribute_uri &&

    fetchAttribute()} />

    } @@ -81,7 +83,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ case 'list': return showElement && (
  • - { elementNode } + {elementNode}
  • ) case 'nested': @@ -92,7 +94,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ
    - { elementNode } + {elementNode}
    @@ -101,13 +103,17 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ { showElements && questionset.elements.map((element, index) => { if (element.model == 'questions.questionset') { + const questionSetInfo = questionset.questionsets.find(info => info.questionset === element.id) + const questionSetOrder = questionSetInfo ? questionSetInfo.order : undefined return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionSetOrder} /> } else { + const questionInfo = questionset.questions.find(info => info.question === element.id) + const questionOrder = questionInfo ? questionInfo.order : undefined return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionOrder} /> } }) } @@ -127,7 +133,8 @@ QuestionSet.propTypes = { display: PropTypes.string, indent: PropTypes.number, filter: PropTypes.string, - filterEditors: PropTypes.bool + filterEditors: PropTypes.bool, + order: PropTypes.number } export default QuestionSet diff --git a/rdmo/management/assets/js/components/element/Section.js b/rdmo/management/assets/js/components/element/Section.js index d893b5836a..2b6de70075 100644 --- a/rdmo/management/assets/js/components/element/Section.js +++ b/rdmo/management/assets/js/components/element/Section.js @@ -92,7 +92,7 @@ const Section = ({ config, section, configActions, elementActions, display = 'li { showElements && section.elements.map((page, index) => { const pageInfo = section.pages.find(info => info.page === page.id) - const pageOrder = pageInfo ? pageInfo.order : null // Get the order value + const pageOrder = pageInfo ? pageInfo.order : undefined return ( { { catalog.elements.map((section, index) => { const sectionInfo = catalog.sections.find(info => info.section === section.id) - const sectionOrder = sectionInfo ? sectionInfo.order : null // Get the order value + const sectionOrder = sectionInfo ? sectionInfo.order : undefined return (
    { display="nested" filter="catalog" indent={0} - order={sectionOrder} // Pass the order value as a prop + order={sectionOrder} /> ) }) From 8c31431bb1c562500259b524947cd5e540f03e4c Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Sat, 28 Oct 2023 09:44:51 +0200 Subject: [PATCH 004/114] * revert auto formatting * fix change requests --- .../assets/js/components/common/Links.js | 29 +++++++++-------- .../assets/js/components/element/Page.js | 31 +++++++++--------- .../assets/js/components/element/Question.js | 14 ++++---- .../js/components/element/QuestionSet.js | 32 +++++++++---------- .../assets/js/components/element/Section.js | 20 ++++++------ .../js/components/nested/NestedCatalog.js | 22 ++++++------- 6 files changed, 73 insertions(+), 75 deletions(-) diff --git a/rdmo/management/assets/js/components/common/Links.js b/rdmo/management/assets/js/components/common/Links.js index 687e7fa9ae..8fbe780447 100644 --- a/rdmo/management/assets/js/components/common/Links.js +++ b/rdmo/management/assets/js/components/common/Links.js @@ -7,7 +7,7 @@ import isUndefined from 'lodash/isUndefined' import Link from 'rdmo/core/assets/js/components/Link' import LinkButton from 'rdmo/core/assets/js/components/LinkButton' -const NestedLink = ({ href, title, onClick, show = true }) => { +const NestedLink = ({ href, title, onClick, show=true }) => { return show && } @@ -74,7 +74,7 @@ const AvailableLink = ({ available, locked, title, onClick, disabled }) => { }) return + disabled={locked || disabled} onClick={onClick} /> } AvailableLink.propTypes = { @@ -120,7 +120,7 @@ ShowElementsLink.propTypes = { onClick: PropTypes.func.isRequired } -const ExportLink = ({ exportUrl, title, exportFormats, csv = false, full = false }) => { +const ExportLink = ({ exportUrl, title, exportFormats, csv=false, full=false }) => { return ( @@ -144,8 +144,8 @@ const ExportLink = ({ exportUrl, title, exportFormats, csv = false, full = false { exportFormats.map(([key, label], index) =>
  • {label} + target={['pdf', 'html'].includes(key) ? '_blank' : '_self'} + rel="noreferrer">{label}
  • ) } @@ -169,7 +169,7 @@ const ExtendLink = ({ extend, onClick }) => { }) const title = extend ? gettext('Show less') - : gettext('Show more') + : gettext('Show more') return } @@ -181,9 +181,14 @@ ExtendLink.propTypes = { const CodeLink = ({ className, uri, onClick, order }) => { return ( - <> - {uri} - {order !== undefined && order !== null ? {order} : null} + <> + + {uri} + + {order !== undefined && order !== null ? ( + <>{' '}{order} + ) : null} + ) } @@ -236,7 +241,5 @@ ShowLink.propTypes = { onClick: PropTypes.func.isRequired } -export { - EditLink, CopyLink, AddLink, AvailableLink, LockedLink, ShowElementsLink, - NestedLink, ExportLink, ExtendLink, CodeLink, ErrorLink, WarningLink, ShowLink -} +export { EditLink, CopyLink, AddLink, AvailableLink, LockedLink, ShowElementsLink, + NestedLink, ExportLink, ExtendLink, CodeLink, ErrorLink, WarningLink, ShowLink } diff --git a/rdmo/management/assets/js/components/element/Page.js b/rdmo/management/assets/js/components/element/Page.js index 2bf9f79614..0a7e086296 100644 --- a/rdmo/management/assets/js/components/element/Page.js +++ b/rdmo/management/assets/js/components/element/Page.js @@ -8,15 +8,13 @@ import { buildPath } from '../../utils/location' import QuestionSet from './QuestionSet' import Question from './Question' import { ElementErrors } from '../common/Errors' -import { - EditLink, CopyLink, AddLink, LockedLink, NestedLink, - ExportLink, CodeLink, ShowElementsLink -} from '../common/Links' +import { EditLink, CopyLink, AddLink, LockedLink, NestedLink, + ExportLink, CodeLink, ShowElementsLink } from '../common/Links' import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const Page = ({ config, page, configActions, elementActions, display = 'list', indent = 0, - filter = false, filterEditors = false, order }) => { +const Page = ({ config, page, configActions, elementActions, display='list', indent=0, + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, page) const showElements = get(config, `display.elements.pages.${page.id}`, true) @@ -29,7 +27,7 @@ const Page = ({ config, page, configActions, elementActions, display = 'list', i const fetchEdit = () => elementActions.fetchElement('pages', page.id) const fetchCopy = () => elementActions.fetchElement('pages', page.id, 'copy') const fetchNested = () => elementActions.fetchElement('pages', page.id, 'nested') - const toggleLocked = () => elementActions.storeElement('pages', { ...page, locked: !page.locked }) + const toggleLocked = () => elementActions.storeElement('pages', {...page, locked: !page.locked }) const toggleElements = () => configActions.toggleElements(page) const createQuestionSet = () => elementActions.createElement('questionsets', { page }) @@ -37,6 +35,7 @@ const Page = ({ config, page, configActions, elementActions, display = 'list', i const fetchAttribute = () => elementActions.fetchElement('attributes', page.attribute) const fetchCondition = (index) => elementActions.fetchElement('conditions', page.conditions[index]) + const elementNode = (
    @@ -46,11 +45,11 @@ const Page = ({ config, page, configActions, elementActions, display = 'list', i + onClick={createQuestion} onAltClick={createQuestionSet} disabled={page.read_only} /> + locked={page.locked} onClick={toggleLocked} disabled={page.read_only} /> + exportFormats={config.settings.export_formats} full={true} />
    @@ -83,7 +82,7 @@ const Page = ({ config, page, configActions, elementActions, display = 'list', i case 'list': return showElement && (
  • - {elementNode} + { elementNode }
  • ) case 'nested': @@ -94,7 +93,7 @@ const Page = ({ config, page, configActions, elementActions, display = 'list', i
    - {elementNode} + { elementNode }
    @@ -106,14 +105,14 @@ const Page = ({ config, page, configActions, elementActions, display = 'list', i const questionSetInfo = page.questionsets.find(info => info.questionset === element.id) const questionSetOrder = questionSetInfo ? questionSetInfo.order : undefined return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionSetOrder} /> } else { const questionInfo = page.questions.find(info => info.question === element.id) const questionOrder = questionInfo ? questionInfo.order : undefined return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionOrder} /> } }) } diff --git a/rdmo/management/assets/js/components/element/Question.js b/rdmo/management/assets/js/components/element/Question.js index 27faedeec9..e9864d8cd2 100644 --- a/rdmo/management/assets/js/components/element/Question.js +++ b/rdmo/management/assets/js/components/element/Question.js @@ -10,8 +10,8 @@ import { EditLink, CopyLink, LockedLink, ExportLink, CodeLink } from '../common/ import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const Question = ({ config, question, elementActions, display = 'list', indent = 0, - filter = false, filterEditors = false, order }) => { +const Question = ({ config, question, elementActions, display='list', indent=0, + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, question) @@ -21,7 +21,7 @@ const Question = ({ config, question, elementActions, display = 'list', indent = const fetchEdit = () => elementActions.fetchElement('questions', question.id) const fetchCopy = () => elementActions.fetchElement('questions', question.id, 'copy') - const toggleLocked = () => elementActions.storeElement('questions', { ...question, locked: !question.locked }) + const toggleLocked = () => elementActions.storeElement('questions', {...question, locked: !question.locked }) const fetchAttribute = () => elementActions.fetchElement('attributes', question.attribute) const fetchCondition = (index) => elementActions.fetchElement('conditions', question.conditions[index]) @@ -34,9 +34,9 @@ const Question = ({ config, question, elementActions, display = 'list', indent = + locked={question.locked} onClick={toggleLocked} disabled={question.read_only} /> + exportFormats={config.settings.export_formats} full={true} />
    @@ -77,7 +77,7 @@ const Question = ({ config, question, elementActions, display = 'list', indent = case 'list': return showElement && (
  • - {elementNode} + { elementNode }
  • ) case 'nested': @@ -87,7 +87,7 @@ const Question = ({ config, question, elementActions, display = 'list', indent = showElement && (
    - {elementNode} + { elementNode }
    ) diff --git a/rdmo/management/assets/js/components/element/QuestionSet.js b/rdmo/management/assets/js/components/element/QuestionSet.js index bf975e37b2..56d3bdd701 100644 --- a/rdmo/management/assets/js/components/element/QuestionSet.js +++ b/rdmo/management/assets/js/components/element/QuestionSet.js @@ -7,15 +7,13 @@ import { buildPath } from '../../utils/location' import Question from './Question' import { ElementErrors } from '../common/Errors' -import { - EditLink, CopyLink, AddLink, LockedLink, - NestedLink, ExportLink, CodeLink, ShowElementsLink -} from '../common/Links' +import { EditLink, CopyLink, AddLink, LockedLink, + NestedLink, ExportLink, CodeLink, ShowElementsLink } from '../common/Links' import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const QuestionSet = ({ config, questionset, configActions, elementActions, display = 'list', indent = 0, - filter = false, filterEditors = false, order }) => { +const QuestionSet = ({ config, questionset, configActions, elementActions, display='list', indent=0, + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, questionset) const showElements = get(config, `display.elements.questionsets.${questionset.id}`, true) @@ -28,7 +26,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ const fetchEdit = () => elementActions.fetchElement('questionsets', questionset.id) const fetchCopy = () => elementActions.fetchElement('questionsets', questionset.id, 'copy') const fetchNested = () => elementActions.fetchElement('questionsets', questionset.id, 'nested') - const toggleLocked = () => elementActions.storeElement('questionsets', { ...questionset, locked: !questionset.locked }) + const toggleLocked = () => elementActions.storeElement('questionsets', {...questionset, locked: !questionset.locked }) const toggleElements = () => configActions.toggleElements(questionset) const createQuestionSet = () => elementActions.createElement('questionsets', { questionset }) @@ -46,11 +44,11 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ + onClick={createQuestion} onAltClick={createQuestionSet} disabled={questionset.read_only} /> + locked={questionset.locked} onClick={toggleLocked} disabled={questionset.read_only} /> + exportFormats={config.settings.export_formats} full={true} />
    @@ -63,7 +61,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ

    } { - get(config, 'display.uri.attributes', true) && questionset.attribute_uri &&

    + get(config, 'display.uri.attributes', true) && questionset.attribute_uri &&

    fetchAttribute()} />

    } @@ -83,7 +81,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ case 'list': return showElement && (
  • - {elementNode} + { elementNode }
  • ) case 'nested': @@ -94,7 +92,7 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ
    - {elementNode} + { elementNode }
    @@ -106,14 +104,14 @@ const QuestionSet = ({ config, questionset, configActions, elementActions, displ const questionSetInfo = questionset.questionsets.find(info => info.questionset === element.id) const questionSetOrder = questionSetInfo ? questionSetInfo.order : undefined return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionSetOrder} /> } else { const questionInfo = questionset.questions.find(info => info.question === element.id) const questionOrder = questionInfo ? questionInfo.order : undefined return + configActions={configActions} elementActions={elementActions} + display="nested" filter={filter} indent={indent + 1} order={questionOrder} /> } }) } diff --git a/rdmo/management/assets/js/components/element/Section.js b/rdmo/management/assets/js/components/element/Section.js index 2b6de70075..acea3b6ed7 100644 --- a/rdmo/management/assets/js/components/element/Section.js +++ b/rdmo/management/assets/js/components/element/Section.js @@ -8,16 +8,14 @@ import { buildPath } from '../../utils/location' import Page from './Page' import { ElementErrors } from '../common/Errors' -import { - EditLink, CopyLink, AddLink, LockedLink, NestedLink, ExportLink, - CodeLink, ShowElementsLink -} from '../common/Links' +import { EditLink, CopyLink, AddLink, LockedLink, NestedLink, ExportLink, + CodeLink, ShowElementsLink } from '../common/Links' import { ReadOnlyIcon } from '../common/Icons' import { Drag, Drop } from '../common/DragAndDrop' -const Section = ({ config, section, configActions, elementActions, display = 'list', indent = 0, - filter = false, filterEditors = false, order }) => { +const Section = ({ config, section, configActions, elementActions, display='list', indent=0, + filter=false, filterEditors=false, order }) => { const showElement = filterElement(config, filter, false, filterEditors, section) const showElements = get(config, `display.elements.sections.${section.id}`, true) @@ -30,7 +28,7 @@ const Section = ({ config, section, configActions, elementActions, display = 'li const fetchEdit = () => elementActions.fetchElement('sections', section.id) const fetchCopy = () => elementActions.fetchElement('sections', section.id, 'copy') const fetchNested = () => elementActions.fetchElement('sections', section.id, 'nested') - const toggleLocked = () => elementActions.storeElement('sections', { ...section, locked: !section.locked }) + const toggleLocked = () => elementActions.storeElement('sections', {...section, locked: !section.locked }) const toggleElements = () => configActions.toggleElements(section) const createPage = () => elementActions.createElement('pages', { section }) @@ -45,10 +43,10 @@ const Section = ({ config, section, configActions, elementActions, display = 'li + exportFormats={config.settings.export_formats} full={true} />
    @@ -68,7 +66,7 @@ const Section = ({ config, section, configActions, elementActions, display = 'li case 'list': return showElement && (
  • - {elementNode} + { elementNode }
  • ) case 'nested': @@ -79,7 +77,7 @@ const Section = ({ config, section, configActions, elementActions, display = 'li
    - {elementNode} + { elementNode }
    diff --git a/rdmo/management/assets/js/components/nested/NestedCatalog.js b/rdmo/management/assets/js/components/nested/NestedCatalog.js index 2eb1895c91..b57840b9c6 100644 --- a/rdmo/management/assets/js/components/nested/NestedCatalog.js +++ b/rdmo/management/assets/js/components/nested/NestedCatalog.js @@ -40,18 +40,18 @@ const NestedCatalog = ({ config, catalog, configActions, elementActions }) => {
    + configActions={configActions} elementActions={elementActions} display="plain" />
    + placeholder={gettext('Filter catalogs')} />
    + options={getUriPrefixes(catalog.elements)} />
    @@ -63,21 +63,21 @@ const NestedCatalog = ({ config, catalog, configActions, elementActions }) => {
    {gettext('Show URIs:')} {gettext('Catalogs')}} - value={get(config, 'display.uri.catalogs', true)} onChange={updateDisplayCatalogURI} /> + value={get(config, 'display.uri.catalogs', true)} onChange={updateDisplayCatalogURI} /> {gettext('Sections')}} - value={get(config, 'display.uri.sections', true)} onChange={updateDisplaySectionsURI} /> + value={get(config, 'display.uri.sections', true)} onChange={updateDisplaySectionsURI} /> {gettext('Pages')}} - value={get(config, 'display.uri.pages', true)} onChange={updateDisplayPagesURI} /> + value={get(config, 'display.uri.pages', true)} onChange={updateDisplayPagesURI} /> {gettext('Question sets')}} - value={get(config, 'display.uri.questionsets', true)} onChange={updateDisplayQuestionSetsURI} /> + value={get(config, 'display.uri.questionsets', true)} onChange={updateDisplayQuestionSetsURI} /> {gettext('Questions')}} - value={get(config, 'display.uri.questions', true)} onChange={updateDisplayQuestionsURI} /> + value={get(config, 'display.uri.questions', true)} onChange={updateDisplayQuestionsURI} /> {gettext('Attributes')}} - value={get(config, 'display.uri.attributes', true)} onChange={updateDisplayAttributesURI} /> + value={get(config, 'display.uri.attributes', true)} onChange={updateDisplayAttributesURI} /> {gettext('Conditions')}} - value={get(config, 'display.uri.conditions', true)} onChange={updateDisplayConditionsURI} /> + value={get(config, 'display.uri.conditions', true)} onChange={updateDisplayConditionsURI} /> {gettext('Option sets')}} - value={get(config, 'display.uri.optionsets', true)} onChange={updateDisplayOptionSetURI} /> + value={get(config, 'display.uri.optionsets', true)} onChange={updateDisplayOptionSetURI} />
    From 5ae2e54243d2c64fd10ca9aa65b1879991e9f1b6 Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Mon, 30 Oct 2023 09:42:26 +0100 Subject: [PATCH 005/114] #745 Add order parameter back to managament interface * use isNil --- rdmo/management/assets/js/components/common/Links.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rdmo/management/assets/js/components/common/Links.js b/rdmo/management/assets/js/components/common/Links.js index 8fbe780447..8f816dd64a 100644 --- a/rdmo/management/assets/js/components/common/Links.js +++ b/rdmo/management/assets/js/components/common/Links.js @@ -2,6 +2,7 @@ import React from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import isEmpty from 'lodash/isEmpty' +import isNil from 'lodash/isNil' import isUndefined from 'lodash/isUndefined' import Link from 'rdmo/core/assets/js/components/Link' @@ -185,7 +186,7 @@ const CodeLink = ({ className, uri, onClick, order }) => { {uri} - {order !== undefined && order !== null ? ( + {!isNil(order) ? ( <>{' '}{order} ) : null} From f11bf6c250eb72951229569eacb84d31d2b0dda5 Mon Sep 17 00:00:00 2001 From: Claudia Malzer Date: Mon, 30 Oct 2023 09:47:42 +0100 Subject: [PATCH 006/114] * fix indent --- rdmo/management/assets/js/components/element/Section.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdmo/management/assets/js/components/element/Section.js b/rdmo/management/assets/js/components/element/Section.js index acea3b6ed7..92e0150ad7 100644 --- a/rdmo/management/assets/js/components/element/Section.js +++ b/rdmo/management/assets/js/components/element/Section.js @@ -44,7 +44,7 @@ const Section = ({ config, section, configActions, elementActions, display='list + locked={section.locked} onClick={toggleLocked} disabled={section.read_only} /> From 472e3e719cc3cf79a11663939c213765eb3e8fbb Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Fri, 10 Nov 2023 18:18:57 +0100 Subject: [PATCH 007/114] Fix optionset refresh in projects_questions (#819) --- .../projects/js/project_questions/services.js | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/rdmo/projects/static/projects/js/project_questions/services.js b/rdmo/projects/static/projects/js/project_questions/services.js index efa8e4ea9d..37f1e7eaad 100644 --- a/rdmo/projects/static/projects/js/project_questions/services.js +++ b/rdmo/projects/static/projects/js/project_questions/services.js @@ -852,7 +852,7 @@ angular.module('project_questions') service.prev = function() { service.error = null; // reset error when moving to previous questionset if (service.settings.project_questions_autosave) { - service.save(false).then(function() { + service.save(false, true).then(function() { back = true; service.initView(service.page.prev_page); }) @@ -865,7 +865,7 @@ angular.module('project_questions') service.next = function() { service.error = null; // reset error when moving to next questionset if (service.settings.project_questions_autosave) { - service.save(false).then(function() { + service.save(false, true).then(function() { service.initView(service.page.next_page); }) } else { @@ -876,7 +876,7 @@ angular.module('project_questions') service.jump = function(section, page) { service.error = null; // reset error before saving if (service.settings.project_questions_autosave) { - service.save(false).then(function() { + service.save(false, true).then(function() { if (service.error !== null) { // pass, dont jump } else if (angular.isDefined(page)) { @@ -916,7 +916,7 @@ angular.module('project_questions') } }; - service.save = function(proceed) { + service.save = function(proceed, jump) { service.error = null; // reset error return service.storeValues().then(function() { if (service.error !== null) { @@ -941,7 +941,6 @@ angular.module('project_questions') } } } else { - console.log('next'); service.next(); } } else { @@ -956,19 +955,20 @@ angular.module('project_questions') }); // check if we need to refresh the site - angular.forEach([service.page].concat(service.questionsets), function(questionset) { - angular.forEach(questionset.elements, function(element) { - if (element.model == 'questions.question') { - var question = element; - angular.forEach(question.optionsets, function(optionset) { - if (optionset.has_refresh) { - return service.initView(service.page.id); - } - }); - } + if (angular.isUndefined(jump) || !jump) { + angular.forEach([service.page].concat(service.questionsets), function(questionset) { + angular.forEach(questionset.elements, function(element) { + if (element.model == 'questions.question') { + var question = element; + angular.forEach(question.optionsets, function(optionset) { + if (optionset.has_refresh) { + return service.initView(service.page.id); + } + }); + } + }); }); - }); - + } // re-evaluate conditions angular.forEach([service.page].concat(service.questionsets), function(questionset) { angular.forEach(service.valuesets[questionset.id], function(valuesets, set_prefix) { From 42e08cf78e3521bb97e90dcbfd5b6ad28a51a985 Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 16 Nov 2023 10:31:19 +0100 Subject: [PATCH 008/114] Add missing gettext calls to sidebar in management interface --- .../js/components/sidebar/ElementsSidebar.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js b/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js index b0b90eb123..16780f7e8e 100644 --- a/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js +++ b/rdmo/management/assets/js/components/sidebar/ElementsSidebar.js @@ -27,47 +27,47 @@ const ElementsSidebar = ({ config, elements, elementActions, importActions }) =>
    • elementActions.fetchElements('catalogs')}>Catalogs + onClick={() => elementActions.fetchElements('catalogs')}>{gettext('Catalogs')}
    • elementActions.fetchElements('sections')}>Sections + onClick={() => elementActions.fetchElements('sections')}>{gettext('Sections')}
    • elementActions.fetchElements('pages')}>Pages + onClick={() => elementActions.fetchElements('pages')}>{gettext('Pages')}
    • elementActions.fetchElements('questionsets')}>Question sets + onClick={() => elementActions.fetchElements('questionsets')}>{gettext('Question sets')}
    • elementActions.fetchElements('questions')}>Questions + onClick={() => elementActions.fetchElements('questions')}>{gettext('Questions')}
    • elementActions.fetchElements('attributes')}>Attributes + onClick={() => elementActions.fetchElements('attributes')}>{gettext('Attributes')}
    • elementActions.fetchElements('optionsets')}>Option sets + onClick={() => elementActions.fetchElements('optionsets')}>{gettext('Option sets')}
    • elementActions.fetchElements('options')}>Options + onClick={() => elementActions.fetchElements('options')}>{gettext('Options')}
    • elementActions.fetchElements('conditions')}>Conditions + onClick={() => elementActions.fetchElements('conditions')}>{gettext('Conditions')}
    • elementActions.fetchElements('tasks')}>Tasks + onClick={() => elementActions.fetchElements('tasks')}>{gettext('Tasks')}
    • elementActions.fetchElements('views')}>Views + onClick={() => elementActions.fetchElements('views')}>{gettext('Views')}
    From 2c6c4876a6456a30bfdf6dae4939dce91806577e Mon Sep 17 00:00:00 2001 From: Jochen Klar Date: Thu, 16 Nov 2023 10:58:11 +0100 Subject: [PATCH 009/114] Remove interpolation from MultiSelect, OrderedMultiSelect, and Select components --- .../assets/js/components/edit/EditCatalog.js | 4 ++-- .../assets/js/components/edit/EditCondition.js | 2 +- .../assets/js/components/edit/EditOptionSet.js | 8 ++++---- .../assets/js/components/edit/EditPage.js | 11 ++++++----- .../assets/js/components/edit/EditQuestion.js | 10 +++++----- .../assets/js/components/edit/EditQuestionSet.js | 11 ++++++----- .../assets/js/components/edit/EditSection.js | 4 ++-- .../assets/js/components/edit/EditTask.js | 4 ++-- .../js/components/edit/common/MultiSelect.js | 9 +++++---- .../components/edit/common/OrderedMultiSelect.js | 16 ++++++++-------- .../assets/js/components/edit/common/Select.js | 6 +++--- 11 files changed, 44 insertions(+), 41 deletions(-) diff --git a/rdmo/management/assets/js/components/edit/EditCatalog.js b/rdmo/management/assets/js/components/edit/EditCatalog.js index e179456943..1e91fd17fd 100644 --- a/rdmo/management/assets/js/components/edit/EditCatalog.js +++ b/rdmo/management/assets/js/components/edit/EditCatalog.js @@ -95,8 +95,8 @@ const EditCatalog = ({ config, catalog, elements, elementActions }) => { } - {get(config, 'settings.groups') && { } - { } - - {get(config, 'settings.multisite') && { } -
    + + {% include 'projects/project_questions_value_errors.html' %}
    diff --git a/rdmo/projects/templates/projects/project_questions_form_group_text.html b/rdmo/projects/templates/projects/project_questions_form_group_text.html index d9284bdf56..e3fad422ec 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_text.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_text.html @@ -21,6 +21,8 @@ ng-disabled="service.project.read_only" ng-change="service.changed(value)" ng-class="{'default-value': service.isDefaultValue(question, value)}"> + + {% include 'projects/project_questions_value_errors.html' %}
    diff --git a/rdmo/projects/templates/projects/project_questions_form_group_textarea.html b/rdmo/projects/templates/projects/project_questions_form_group_textarea.html index 756e21c96e..26baee92a1 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_textarea.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_textarea.html @@ -23,6 +23,8 @@ ng-class="{'default-value': service.isDefaultValue(question, value)}"> + + {% include 'projects/project_questions_value_errors.html' %}
    diff --git a/rdmo/projects/templates/projects/project_questions_form_group_yesno.html b/rdmo/projects/templates/projects/project_questions_form_group_yesno.html index c06ce86618..31dda7fb79 100644 --- a/rdmo/projects/templates/projects/project_questions_form_group_yesno.html +++ b/rdmo/projects/templates/projects/project_questions_form_group_yesno.html @@ -41,6 +41,8 @@
    + + {% include 'projects/project_questions_value_errors.html' %}
    diff --git a/rdmo/projects/templates/projects/project_questions_overview.html b/rdmo/projects/templates/projects/project_questions_overview.html index 1ee6ea347b..6058e465a5 100644 --- a/rdmo/projects/templates/projects/project_questions_overview.html +++ b/rdmo/projects/templates/projects/project_questions_overview.html @@ -10,6 +10,9 @@