Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add data elements add/edit form #344

Merged
merged 39 commits into from
Sep 26, 2023
Merged

feat: add data elements add/edit form #344

merged 39 commits into from
Sep 26, 2023

Conversation

Mohammer5
Copy link
Collaborator

@Mohammer5 Mohammer5 commented Jul 31, 2023

Open points

  • The current implementation of the layout doesn't work with the way forms are supposed to look
    • Forms have a scrollable section (which includes the form itself, and I think also the breadcrumb and headline) as well as a sticky section (the form action controls)
    • With the current implementation of the layout, the scrollbar disappears under the sticky form actions
    • @Birkbjo You implemented the layout, how do you think we should adjust this to make it work?
  • There are no specs for this form yet, just a figma demo. We'll have to talk to @cooper-joe the get the complete specs
    • Font sizes and spacing
    • Which fields (especially unter "Aggregation levels")
    • Maybe more?

ToDos

I suppose that many of the open ToDos can be implemented separately as long as this PR doesn't introduce erroneous code. I'm listing all open ToDos so we can plan what we want to be part of this PR and for which ToDos we should create Jira issues.

Custom attributes

  • What to use as form name?
  • Implement all possible value types!

DataElementForm

  • Implement hooks error display
  • Implement hooks loading display
  • Implement adding (inkl. Modal, mutation):
    • category combos
    • option sets
    • option set comments
    • legends
    • aggregation levels
  • Aggregation level section help text missing

New Data Element View

  • Initial form values dynamic or static?
  • Implement onSubmit
  • Cancel: What should happen?
    • Just back in history?
    • Change button to warning/error when form dirty?
    • Ask for user confirmation before really cancelling?

// ... More will follow

@Mohammer5 Mohammer5 requested review from Birkbjo and kabaros July 31, 2023 10:03
@Birkbjo
Copy link
Member

Birkbjo commented Jul 31, 2023

With the current implementation of the layout, the scrollbar disappears under the sticky form actions
@Birkbjo You implemented the layout, how do you think we should adjust this to make it work?

Hmm... There's a few different approaches we could do here. But I think we could introduce a showFooter as a handle, much like hideSidebar works. I've working solution doing this, but there's a small quirk with narrow screens.

But according to the figma-demo, the New-form should not have sticky action-bar? Only for edits?

@Mohammer5
Copy link
Collaborator Author

Mohammer5 commented Aug 1, 2023

But according to the figma-demo, the New-form should not have sticky action-bar? Only for edits?

Ah, that's true! Good catch, will change that

I think we could introduce a showFooter as a handle, much like hideSidebar works.

How/where would you render the footer in this case? For example with forms, the submit button should be within the form element, right? Maybe you already have a solution in mind how RFF's Form will be notified about the click on the button, but I can't think of a solution right now

@Birkbjo
Copy link
Member

Birkbjo commented Aug 1, 2023

How/where would you render the footer in this case? For example with forms, the submit button should be within the form element, right? Maybe you already have a solution in mind how RFF's Form will be notified about the click on the button, but I can't think of a solution right now

My solution would just keep restrict the height of the "main"-container, and keep space for a fixed footer that can be rendered anywhere. It just added another row to the layout grid, which didn't render anything in the layout - just reserved the space, which the fixed footer would overlap. But I did struggle with some gaps on narrow screens between the footer and main-content.
Might be a bit hacky? It's indeed a bit annoying to render a submit outside of the form.

Comment on lines 46 to 52
const [addLegend] = useAddLegendMutation()
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [addCategoryCombo] = useAddCategoryComboMutation()
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [addOptionSet] = useAddOptionSetMutation()
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const [addOptionSetComment] = useAddOptionSetCommentMutation()
Copy link
Member

@Birkbjo Birkbjo Aug 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if these should be part of the form? This will undoubtedly be shared, and I think we could extract these into components, that wraps this logic there.

Eg. LegendField, would wrap the logic for showing the modal. Would probably still need to handle mutation based on the model, and thus need a callback for successful mutation?
So LegendField would compose LegendFieldDialog, which would do the actual mutation of posting a new Legend. Then LegendField could handle refreshing the data.

In general I want the Forms themselves to have as little logic as possible, so it's easy to compose these fields in other forms.
I think we might also need to have "model"-specific fields, that would wrap "field-rule"-logic.

Not sure about the best way to do it, or if we should create an abstraction for field-rules. But my first instinct is to keep it simple and just create custom components for them, so the rules can just be code in those components, wrapping the fields.

One example for data elements is "when an optionSet is selected, automatically set valueType field to the valueType of the selected optionSet, and disable the valueType field.
So we might have a DataElementFormOptionSetField or something similar.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general I want the Forms themselves to have as little logic as possible, so it's easy to compose these fields in other forms.

Yeah, I agree with that. I only put these here because I didn't have a better place where I could put them. I just wanted something to be there and while it shouldn't be too much work to move code around.

Right now I'm not sure what should happen at all with these special form fields that have the two buttons. If you could open a modal and add a new element, then the "refresh" button makes little sense to me as we can automatically refetch items after having added a new one.

So maybe clicking on the "add" button will simply open a new tab with the actual form? Maybe we'll have some "initial data" parameters, e.g. when adding new attributes, it will automatically have "data elements" selected, but that's just a thought. But opening a new tab seems like the simplest solution implementation-wise as we wouldn't have to render the entire form in a Modal as well, but provide the full user experience with the real form on a full-width page. In that context the "refresh" button makes much more sense.

Otherwise we'll either have to implement two forms for each metadata that can be added via modals as well (e.g. we don't want to show the "add" button in a form inside a modal) or we'll have to have control flow changes / conditions in the forms that will produce a different form UI, but that'd make forms much more complicated compared to a "stupid" form that renders just fields.

In case we want to have re-usable components for adding certain metadata, e.g. the category combo dropdown with the buttons, I agree that it'd make sense to have them in their own component and move the hooks there instead of in the form.

I think we might also need to have "model"-specific fields, that would wrap "field-rule"-logic.

I was thinking about that, too. The solution I had in mind was to have a hook that uses RFF's useFormSpy internally and modifies form state reactively. This way, we'd separate logic that combines two fields without having to mix that logic with the fields themselves.

In the beginning I'd make these super simple and implement the logic for which field change would trigger another effect directly. I'm sure that after some time - when we see a pattern emerge - we can even make these hooks more abstract have something that we can re-use across forms without having to duplicate stupid code everywhere

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I agree with that. I only put these here because I didn't have a better place where I could put them. I just wanted something to be there and while it shouldn't be too much work to move code around.

Sounds good.

But opening a new tab seems like the simplest solution implementation-wise as we wouldn't have to render the entire form in a Modal as well, but provide the full user experience with the real form on a full-width page.

Yeah, agree. Let's talk to Joe about it. If a form just composed simple fields, it wouldn't necessarily be that hard to implement a modal version of it - or as you say have some "control" props that conditionally render things, if needed. But I agree we can defer that.

I was thinking about that, too. The solution I had in mind was to have a hook that uses RFF's useFormSpy internally and modifies form state reactively. This way, we'd separate logic that combines two fields without having to mix that logic with the fields themselves.

Sounds that we're on the same page, and I've been thinking about something similar. Not sure if we would even need a custom hook at first - but would definitely be great if we could find a fitting API that was generic enough.
One potential challenge that I can anticipate, is for the "dependant" field to get access to another fields data. Since naively, eg the optionSet data in the form would just be the ID of the selected optionSet - but the rule would need the valueType of that optionSet as well. So it's something to think about - maybe we can pass the entire object as value, and use format and parse.

Also, FormSpy doesn't support subscribing to a single field - you would have to subscribe to all values. We might be able to use useField in "dependant" components - but not really sure if that's a good idea (eg. DataElementValueType would call useField('optionSet')).
So we might indeed need to subscribe to values, and check for the condition in onChange and update values imperatively in the onChange-handler.
Could look at https://github.com/final-form/final-form-calculate for inspiration.
However another thing that complicates this, is that rules doesn't just affect the value of other fields - it also affects eg. hidden-functionality and other render-states like disabled. So to me it seems it would be better to do these subscriptions 'reactively' like you say - eg. use useField('optionSet') (if possible). And then an useEffect to update the "current"-fields value (eg. DataElementValueType).

However these limitations, and the amount of unresolved issues (and serious issues like this: final-form/react-final-form#984 ) for react final form, was why I initially planned to test out react-hook-form.

@codecov-commenter
Copy link

codecov-commenter commented Aug 24, 2023

Codecov Report

Merging #344 (e01148b) into master (494cf62) will increase coverage by 9.85%.
Report is 2 commits behind head on master.
The diff coverage is 8.35%.

@@            Coverage Diff             @@
##           master     #344      +/-   ##
==========================================
+ Coverage   49.42%   59.28%   +9.85%     
==========================================
  Files          55       83      +28     
  Lines         700     1093     +393     
  Branches      122      216      +94     
==========================================
+ Hits          346      648     +302     
- Misses        354      445      +91     
Files Changed Coverage Δ
src/app/layout/Breadcrumb.tsx 100.00% <ø> (ø)
src/app/sidebar/SidebarLinks.ts 100.00% <ø> (ø)
...mponents/ColorAndIconPicker/ColorAndIconPicker.tsx 0.00% <0.00%> (ø)
src/components/ColorAndIconPicker/IconPicker.tsx 0.00% <0.00%> (ø)
.../components/ColorAndIconPicker/IconPickerModal.tsx 0.00% <0.00%> (ø)
src/components/loading/Loader.tsx 91.66% <ø> (+83.33%) ⬆️
...ontrols/LegendSetTransfer/useInitialOptionQuery.ts 0.00% <0.00%> (ø)
src/components/sectionList/SectionList.tsx 100.00% <ø> (+80.00%) ⬆️
...c/components/sectionList/SectionListPagination.tsx 78.33% <ø> (+66.66%) ⬆️
src/components/sectionList/SectionListRow.tsx 84.61% <ø> (+61.53%) ⬆️
... and 27 more

... and 26 files with indirect coverage changes

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@netlify
Copy link

netlify bot commented Aug 28, 2023

Deploy Preview for dhis2-maintenance-app-beta ready!

Name Link
🔨 Latest commit e01148b
🔍 Latest deploy log https://app.netlify.com/sites/dhis2-maintenance-app-beta/deploys/6502ae16acff650008d0af20
😎 Deploy Preview https://deploy-preview-344--dhis2-maintenance-app-beta.netlify.app/
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

Copy link
Member

@Birkbjo Birkbjo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall looks very good! More comments are probably coming.

src/lib/schemas/translateAggregationType.ts Outdated Show resolved Hide resolved
src/lib/schemas/translateValueType.ts Outdated Show resolved Hide resolved
src/pages/dataElements/form/customFields.tsx Outdated Show resolved Hide resolved
src/pages/dataElements/edit/formatFormValues.ts Outdated Show resolved Hide resolved
src/pages/dataElements/New.tsx Show resolved Hide resolved
@Mohammer5 Mohammer5 marked this pull request as ready for review September 14, 2023 06:56
@Mohammer5 Mohammer5 merged commit a9daea7 into master Sep 26, 2023
9 checks passed
@Mohammer5 Mohammer5 deleted the DHIS2-14656 branch September 26, 2023 12:54
dhis2-bot added a commit that referenced this pull request Jun 7, 2024
# 1.0.0 (2024-06-07)

### Bug Fixes

* **config:** remove app from name ([f137a54](f137a54))
* fix cypress tests and color/icon buttons ([#402](#402)) ([251d76c](251d76c))
* **aggregation and value type fields:** do not use generated types for validation ([8edd272](8edd272))
* **aggregation type:** use "NONE" as default value ([89bb4c1](89bb4c1))
* **attributes:** fix deselecting attribute ([#361](#361)) ([2cc8801](2cc8801))
* **color and icon picker:** add remove icon btn & adjust styles according to specs ([c18f7f0](c18f7f0))
* **color and icon picker:** make button component a html button instead of div ([f7a2c50](f7a2c50))
* **custom attributes optionsets:** add no-value-option only when not required ([c10ec33](c10ec33))
* **dataElement:** default to default-cat-combo ([#400](#400)) ([90ff733](90ff733))
* **de form fields:** make text translatable ([8ab3090](8ab3090))
* **download:** default to only selected when list has selections ([#394](#394)) ([f7048fb](f7048fb))
* **download:** fix radio name ([b4f703b](b4f703b))
* **edit:** fix icons api response ([#377](#377)) ([f014351](f014351))
* **edit de:** allow removing nested values ([cc66cbd](cc66cbd))
* **filter:** add useInfiniteDataQuery ([0fa3b91](0fa3b91))
* **filters:** use refactored sectionlistfilter for refetch ([2dcbc75](2dcbc75))
* **form:** fix cancel link ([0fb0d12](0fb0d12))
* **form:** fix editing style object ([#362](#362)) ([88e1a58](88e1a58))
* **form:** fix render 0 when empty custom attributes ([92fb57a](92fb57a))
* **form:** hide custom attributes section if no attributes assigned ([#384](#384)) ([da4bbc9](da4bbc9))
* **form:** stylistic issues: max-width, todos, labels ([#385](#385)) ([523e8e9](523e8e9))
* **list:** fix filter being cleared on refresh ([#382](#382)) ([fc2f881](fc2f881))
* **list:** improve select performance for big lists ([#378](#378)) ([0a98f3c](0a98f3c))
* **list:** resolve reference names ([#360](#360)) ([ccd226c](ccd226c)), closes [#354](#354)
* **managelistview:** move reset to default to rightfooter ([b177893](b177893))
* **model single select:** search loaded options for selected option ([d022b8b](d022b8b))
* **model single select:** search loaded options for selected option ([57ad629](57ad629))
* **modelview:** put empty array if default ([13baa3e](13baa3e))
* **systemSettings:** use generic type for setting inference ([#393](#393)) ([e115fc6](e115fc6))
* add empty list message ([647713b](647713b))
* add linkbutton component ([c19814f](c19814f))
* cleanup ([407c912](407c912))
* cleanup filter props in DE-List ([3242a4f](3242a4f))
* failing test ([b506bae](b506bae))
* filtereddataelement type ([22e1600](22e1600))
* fix failing test ([e5c7eb5](e5c7eb5))
* fix sorting of filters ([1206241](1206241))
* fix uncontrolled input in identifiablefilter ([a4b2292](a4b2292))
* handle errors in list request ([ec160e7](ec160e7))
* hide unauthorized section cards ([11e18e6](11e18e6))
* missing files ([6718da9](6718da9))
* reset paging when clearing filters ([fdb0b10](fdb0b10))
* resolve conflict between cypress and jest types ([475907c](475907c))
* review ([92c1648](92c1648))
* simplify initial selected logic ([eb4ce54](eb4ce54))
* some cleanup ([432ac43](432ac43))
* some cleanup ([52b3521](52b3521))
* update default view for dataElements ([2125f77](2125f77))
* **searchable single selects:** add posibility to deselect ([f557dd0](f557dd0))
* **searchable single selects:** use old-app default labels ([7e5c907](7e5c907))
* **sectionlist:** add page title ([#346](#346)) ([110089f](110089f))
* **summarycard:** adjust icon-less design ([b938394](b938394))
* **summarycard:** remove unneeded wrapper ([72289c7](72289c7))
* **summarycard:** update button styles ([#353](#353)) ([494cf62](494cf62))
* update and simplify filter logic ([c4c507f](c4c507f))
* update empty text ([4e6e0b1](4e6e0b1))
* use spacers for styling ([0522f81](0522f81))
* wip filters ([342dbad](342dbad))
* **usemodelgist:** add goToPage to paginator ([5367159](5367159))
* add dynamicparams ([5e76a8c](5e76a8c))
* add missing dataElements pages ([3992228](3992228))
* add missing folder ([db51744](db51744))
* add missing folder ([c205bb1](c205bb1))
* add parentSectionKey to sections ([d6571f2](d6571f2))
* add relationShipType section ([da8132f](da8132f))
* add sections routes and legacy-redirects ([7971346](7971346))
* base types for schema saved schemas in zustand ([92055bc](92055bc))
* better loadschema typings ([dcda02d](dcda02d))
* better schema typing ([f83c0bd](f83c0bd))
* cleanup ([086a266](086a266))
* cleanup ([74b7321](74b7321))
* cleanup comment ([0dff06a](0dff06a))
* cleanup schema-routes ([3f36f28](3f36f28))
* cleanup schemas ([416acb9](416acb9))
* deduplicate deps ([10351a2](10351a2))
* deduplicate yarn lock ([3916128](3916128))
* improve BaseModelSchemas type ([5151f6e](5151f6e))
* layout overflow ([a56f459](a56f459))
* legacy redirect ([c00e996](c00e996))
* legacy routing for non-standard sections ([4a23954](4a23954))
* load overviews in same chunk ([220a69e](220a69e))
* map properties to record ([2a25430](2a25430))
* merge all generates files ([4c54b25](4c54b25))
* remove code, add handle to route ([32acb49](32acb49))
* remove locales folder ([f3ed675](f3ed675))
* remove unnecessary file ([f103853](f103853))
* simplify result type ([4741bcc](4741bcc))
* update useLoadApp with typefix ([13ae9d8](13ae9d8))
* useSchemaSectionHandleOrThrow ([0812aa9](0812aa9))
* **auth:** consider ALL authority ([561f236](561f236))
* **deps:** upgrade app-runtime for type fix ([a0069bd](a0069bd))
* **layout:** prepare layout for hide sidebar ([fd795d1](fd795d1))
* **legacyredirects:** fix programs redirect ([db225bb](db225bb))
* **overview:** fix category description ([c761c41](c761c41))
* **overview:** use constants for overview ([095e0d6](095e0d6))
* **overviewcards:** add link to card ([03e88e1](03e88e1))
* **router:** allow sections to opt-out of new/edit routes ([59f85f6](59f85f6))
* **router:** use replace for index redirect ([7007a18](7007a18))
* **schemas:** improve schema types ([43b1a9b](43b1a9b))
* **sections:** add section constants ([19187ca](19187ca))
* **sections:** make parentSectionKey required ([fb5ebe6](fb5ebe6))
* **sidebar:** add missing category ([80bc7c4](80bc7c4))
* **sidebar:** open routes when child routes matches ([faaedbd](faaedbd))
* **summarycard:** fix nested links and missing param ([#335](#335)) ([e20a1dc](e20a1dc))
* **type:** add app-rutime query-type ([8fd573d](8fd573d))
* **types:** add declaration for @dhis2/ui modules ([0a2ab11](0a2ab11))
* **types:** add missing error type ([fbe957d](fbe957d))
* **types:** fix type errors in files ([faeb206](faeb206))
* move declarations to global.d.ts ([39f5573](39f5573))
* remove unused type ([84c1c38](84c1c38))
* rename sidenav ([510b949](510b949))
* sidebarlinks filename and use plural for overview path ([4307be8](4307be8))
* types ([3e5477c](3e5477c))
* wrong casing for file name ([a57c46c](a57c46c))

### Features

* **authorities:** respect keyRequireAddToView when filtering sections ([#347](#347)) ([4031f68](4031f68))
* **breadcrumb:** breadcrumbs navigation ([#328](#328)) ([b247c53](b247c53))
* **custom attributes:** add "No value" option to optionset attributes ([de8cf8c](de8cf8c))
* **data element forms:** add validation ([#359](#359)) ([331eabd](331eabd))
* **data elements:** add form field rules ([a77697d](a77697d))
* **de edit and new:** handle loading and error states correctly ([32f7e20](32f7e20))
* **de form:** add aggregation level intro text ([402de21](402de21))
* **detailsPanel:** add detailsPanel in list-view ([#358](#358)) ([aceade9](aceade9)), closes [#354](#354)
* **filters:** add filters for dataSet and catCombo ([5c7acb4](5c7acb4))
* **filters:** rework config for better type safety for dynamic filters ([c132fd6](c132fd6))
* **layout:** add foundation ([#323](#323)) ([8b4d90c](8b4d90c))
* **list:** add bulk sharing ([#373](#373)) ([70e8d96](70e8d96))
* **list:** add filters to manage view ([5d67e27](5d67e27))
* **list:** add list for group and groupset ([#379](#379)) ([77f5695](77f5695))
* **list:** add more dropdown ([0ff853d](0ff853d))
* **list:** add sort for columns ([#368](#368)) ([90b02a4](90b02a4))
* **list:** add translation dialog ([#389](#389)) ([d21cd95](d21cd95)), closes [#392](#392)
* **list:** download dialog ([#392](#392)) ([d2b6582](d2b6582))
* **list:** manage columns ([#352](#352)) ([9ecd37d](9ecd37d)), closes [#354](#354)
* **list:** sharing dialog ([#374](#374)) ([abdad54](abdad54))
* **list view:** add delete action to row items ([#376](#376)) ([d1eeef9](d1eeef9))
* add data element group New and Edit views ([b06d6f2](b06d6f2))
* add data element group set New and Edit views ([3c02ce8](3c02ce8))
* **list:** implement more menu ([734d47d](734d47d))
* add controlled searchable select & category combo select ([#351](#351)) ([bb91abb](bb91abb))
* add data elements add/edit form ([#344](#344)) ([a9daea7](a9daea7))
* add publicAccessFilter ([a7e5d2f](a7e5d2f))
* **list:** pagination ([cc29470](cc29470))
* **list:** render user-friendly values ([#350](#350)) ([f03c2b6](f03c2b6))
* **systemSettings:** load systemsettings on appload ([#348](#348)) ([9e268df](9e268df))
* add protectedsection ([664e5dc](664e5dc))
* add translations for model constants ([c689080](c689080))
* filter authorized sections in overview ([cfdf9f5](cfdf9f5))
* logic to hide sidebar ([ead5966](ead5966))
* sectionlistheader, wip filters ([f585402](f585402))
* sectionlistwrapper ([d59d5ae](d59d5ae))
* useModelGist ([fcd341c](fcd341c))
* useSectionListFilter ([c431631](c431631))
* working filters ([0eac9d1](0eac9d1))
* **authorities:** add authority hooks ([4d3d6e8](4d3d6e8))
* **model-types:** add generated modeltypes ([8e888fe](8e888fe))
* **model-types:** add generated modeltypes ([#339](#339)) ([fc7e225](fc7e225))
* **modeltypes:** add modeltypes ([d3c2486](d3c2486))
* **overview:** add category overview ([ed97305](ed97305))
* **sectionlist:** add sectionList for data elements ([7721bbb](7721bbb))
@dhis2-bot
Copy link
Contributor

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

dhis2-bot added a commit that referenced this pull request Jun 7, 2024
# 1.0.0 (2024-06-07)

### Bug Fixes

* **config:** remove app from name ([f137a54](f137a54))
* fix cypress tests and color/icon buttons ([#402](#402)) ([251d76c](251d76c))
* **aggregation and value type fields:** do not use generated types for validation ([8edd272](8edd272))
* **aggregation type:** use "NONE" as default value ([89bb4c1](89bb4c1))
* **attributes:** fix deselecting attribute ([#361](#361)) ([2cc8801](2cc8801))
* **color and icon picker:** add remove icon btn & adjust styles according to specs ([c18f7f0](c18f7f0))
* **color and icon picker:** make button component a html button instead of div ([f7a2c50](f7a2c50))
* **custom attributes optionsets:** add no-value-option only when not required ([c10ec33](c10ec33))
* **dataElement:** default to default-cat-combo ([#400](#400)) ([90ff733](90ff733))
* **de form fields:** make text translatable ([8ab3090](8ab3090))
* **download:** default to only selected when list has selections ([#394](#394)) ([f7048fb](f7048fb))
* **download:** fix radio name ([b4f703b](b4f703b))
* **edit:** fix icons api response ([#377](#377)) ([f014351](f014351))
* **edit de:** allow removing nested values ([cc66cbd](cc66cbd))
* **filter:** add useInfiniteDataQuery ([0fa3b91](0fa3b91))
* **filters:** use refactored sectionlistfilter for refetch ([2dcbc75](2dcbc75))
* **form:** fix cancel link ([0fb0d12](0fb0d12))
* **form:** fix editing style object ([#362](#362)) ([88e1a58](88e1a58))
* **form:** fix render 0 when empty custom attributes ([92fb57a](92fb57a))
* **form:** hide custom attributes section if no attributes assigned ([#384](#384)) ([da4bbc9](da4bbc9))
* **form:** stylistic issues: max-width, todos, labels ([#385](#385)) ([523e8e9](523e8e9))
* **list:** fix filter being cleared on refresh ([#382](#382)) ([fc2f881](fc2f881))
* **list:** improve select performance for big lists ([#378](#378)) ([0a98f3c](0a98f3c))
* **list:** resolve reference names ([#360](#360)) ([ccd226c](ccd226c)), closes [#354](#354)
* **managelistview:** move reset to default to rightfooter ([b177893](b177893))
* **model single select:** search loaded options for selected option ([d022b8b](d022b8b))
* **model single select:** search loaded options for selected option ([57ad629](57ad629))
* **modelview:** put empty array if default ([13baa3e](13baa3e))
* **systemSettings:** use generic type for setting inference ([#393](#393)) ([e115fc6](e115fc6))
* add empty list message ([647713b](647713b))
* add linkbutton component ([c19814f](c19814f))
* cleanup ([407c912](407c912))
* cleanup filter props in DE-List ([3242a4f](3242a4f))
* failing test ([b506bae](b506bae))
* filtereddataelement type ([22e1600](22e1600))
* fix failing test ([e5c7eb5](e5c7eb5))
* fix sorting of filters ([1206241](1206241))
* fix uncontrolled input in identifiablefilter ([a4b2292](a4b2292))
* handle errors in list request ([ec160e7](ec160e7))
* hide unauthorized section cards ([11e18e6](11e18e6))
* missing files ([6718da9](6718da9))
* reset paging when clearing filters ([fdb0b10](fdb0b10))
* resolve conflict between cypress and jest types ([475907c](475907c))
* review ([92c1648](92c1648))
* simplify initial selected logic ([eb4ce54](eb4ce54))
* some cleanup ([432ac43](432ac43))
* some cleanup ([52b3521](52b3521))
* update default view for dataElements ([2125f77](2125f77))
* **searchable single selects:** add posibility to deselect ([f557dd0](f557dd0))
* **searchable single selects:** use old-app default labels ([7e5c907](7e5c907))
* **sectionlist:** add page title ([#346](#346)) ([110089f](110089f))
* **summarycard:** adjust icon-less design ([b938394](b938394))
* **summarycard:** remove unneeded wrapper ([72289c7](72289c7))
* **summarycard:** update button styles ([#353](#353)) ([494cf62](494cf62))
* update and simplify filter logic ([c4c507f](c4c507f))
* update empty text ([4e6e0b1](4e6e0b1))
* use spacers for styling ([0522f81](0522f81))
* wip filters ([342dbad](342dbad))
* **usemodelgist:** add goToPage to paginator ([5367159](5367159))
* add dynamicparams ([5e76a8c](5e76a8c))
* add missing dataElements pages ([3992228](3992228))
* add missing folder ([db51744](db51744))
* add missing folder ([c205bb1](c205bb1))
* add parentSectionKey to sections ([d6571f2](d6571f2))
* add relationShipType section ([da8132f](da8132f))
* add sections routes and legacy-redirects ([7971346](7971346))
* base types for schema saved schemas in zustand ([92055bc](92055bc))
* better loadschema typings ([dcda02d](dcda02d))
* better schema typing ([f83c0bd](f83c0bd))
* cleanup ([086a266](086a266))
* cleanup ([74b7321](74b7321))
* cleanup comment ([0dff06a](0dff06a))
* cleanup schema-routes ([3f36f28](3f36f28))
* cleanup schemas ([416acb9](416acb9))
* deduplicate deps ([10351a2](10351a2))
* deduplicate yarn lock ([3916128](3916128))
* improve BaseModelSchemas type ([5151f6e](5151f6e))
* layout overflow ([a56f459](a56f459))
* legacy redirect ([c00e996](c00e996))
* legacy routing for non-standard sections ([4a23954](4a23954))
* load overviews in same chunk ([220a69e](220a69e))
* map properties to record ([2a25430](2a25430))
* merge all generates files ([4c54b25](4c54b25))
* remove code, add handle to route ([32acb49](32acb49))
* remove locales folder ([f3ed675](f3ed675))
* remove unnecessary file ([f103853](f103853))
* simplify result type ([4741bcc](4741bcc))
* update useLoadApp with typefix ([13ae9d8](13ae9d8))
* useSchemaSectionHandleOrThrow ([0812aa9](0812aa9))
* **auth:** consider ALL authority ([561f236](561f236))
* **deps:** upgrade app-runtime for type fix ([a0069bd](a0069bd))
* **layout:** prepare layout for hide sidebar ([fd795d1](fd795d1))
* **legacyredirects:** fix programs redirect ([db225bb](db225bb))
* **overview:** fix category description ([c761c41](c761c41))
* **overview:** use constants for overview ([095e0d6](095e0d6))
* **overviewcards:** add link to card ([03e88e1](03e88e1))
* **router:** allow sections to opt-out of new/edit routes ([59f85f6](59f85f6))
* **router:** use replace for index redirect ([7007a18](7007a18))
* **schemas:** improve schema types ([43b1a9b](43b1a9b))
* **sections:** add section constants ([19187ca](19187ca))
* **sections:** make parentSectionKey required ([fb5ebe6](fb5ebe6))
* **sidebar:** add missing category ([80bc7c4](80bc7c4))
* **sidebar:** open routes when child routes matches ([faaedbd](faaedbd))
* **summarycard:** fix nested links and missing param ([#335](#335)) ([e20a1dc](e20a1dc))
* **type:** add app-rutime query-type ([8fd573d](8fd573d))
* **types:** add declaration for @dhis2/ui modules ([0a2ab11](0a2ab11))
* **types:** add missing error type ([fbe957d](fbe957d))
* **types:** fix type errors in files ([faeb206](faeb206))
* move declarations to global.d.ts ([39f5573](39f5573))
* remove unused type ([84c1c38](84c1c38))
* rename sidenav ([510b949](510b949))
* sidebarlinks filename and use plural for overview path ([4307be8](4307be8))
* types ([3e5477c](3e5477c))
* wrong casing for file name ([a57c46c](a57c46c))

### Features

* **authorities:** respect keyRequireAddToView when filtering sections ([#347](#347)) ([4031f68](4031f68))
* **breadcrumb:** breadcrumbs navigation ([#328](#328)) ([b247c53](b247c53))
* **custom attributes:** add "No value" option to optionset attributes ([de8cf8c](de8cf8c))
* **data element forms:** add validation ([#359](#359)) ([331eabd](331eabd))
* **data elements:** add form field rules ([a77697d](a77697d))
* **de edit and new:** handle loading and error states correctly ([32f7e20](32f7e20))
* **de form:** add aggregation level intro text ([402de21](402de21))
* **detailsPanel:** add detailsPanel in list-view ([#358](#358)) ([aceade9](aceade9)), closes [#354](#354)
* **filters:** add filters for dataSet and catCombo ([5c7acb4](5c7acb4))
* **filters:** rework config for better type safety for dynamic filters ([c132fd6](c132fd6))
* **layout:** add foundation ([#323](#323)) ([8b4d90c](8b4d90c))
* **list:** add bulk sharing ([#373](#373)) ([70e8d96](70e8d96))
* **list:** add filters to manage view ([5d67e27](5d67e27))
* **list:** add list for group and groupset ([#379](#379)) ([77f5695](77f5695))
* **list:** add more dropdown ([0ff853d](0ff853d))
* **list:** add sort for columns ([#368](#368)) ([90b02a4](90b02a4))
* **list:** add translation dialog ([#389](#389)) ([d21cd95](d21cd95)), closes [#392](#392)
* **list:** download dialog ([#392](#392)) ([d2b6582](d2b6582))
* **list:** manage columns ([#352](#352)) ([9ecd37d](9ecd37d)), closes [#354](#354)
* **list:** sharing dialog ([#374](#374)) ([abdad54](abdad54))
* **list view:** add delete action to row items ([#376](#376)) ([d1eeef9](d1eeef9))
* add data element group New and Edit views ([b06d6f2](b06d6f2))
* add data element group set New and Edit views ([3c02ce8](3c02ce8))
* **list:** implement more menu ([734d47d](734d47d))
* add controlled searchable select & category combo select ([#351](#351)) ([bb91abb](bb91abb))
* add data elements add/edit form ([#344](#344)) ([a9daea7](a9daea7))
* add publicAccessFilter ([a7e5d2f](a7e5d2f))
* **list:** pagination ([cc29470](cc29470))
* **list:** render user-friendly values ([#350](#350)) ([f03c2b6](f03c2b6))
* **systemSettings:** load systemsettings on appload ([#348](#348)) ([9e268df](9e268df))
* add protectedsection ([664e5dc](664e5dc))
* add translations for model constants ([c689080](c689080))
* filter authorized sections in overview ([cfdf9f5](cfdf9f5))
* logic to hide sidebar ([ead5966](ead5966))
* sectionlistheader, wip filters ([f585402](f585402))
* sectionlistwrapper ([d59d5ae](d59d5ae))
* useModelGist ([fcd341c](fcd341c))
* useSectionListFilter ([c431631](c431631))
* working filters ([0eac9d1](0eac9d1))
* **authorities:** add authority hooks ([4d3d6e8](4d3d6e8))
* **model-types:** add generated modeltypes ([8e888fe](8e888fe))
* **model-types:** add generated modeltypes ([#339](#339)) ([fc7e225](fc7e225))
* **modeltypes:** add modeltypes ([d3c2486](d3c2486))
* **overview:** add category overview ([ed97305](ed97305))
* **sectionlist:** add sectionList for data elements ([7721bbb](7721bbb))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants