<!-- 
RSS generated by JIRA (1001.0.0-SNAPSHOT#100246-sha1:7a5c50119eb0633d306e14180817ddef5e80c75d) at Thu Feb 08 23:15:13 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary add field=key&field=summary to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>FOLIO Jira</title>
    <link>https://folio-org.atlassian.net</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>1001.0.0-SNAPSHOT</version>
        <build-number>100246</build-number>
        <build-date>07-02-2024</build-date>
    </build-info>

<item>
            <title>[FOLIO-1694] RFC Routing Refactor</title>
                <link>https://folio-org.atlassian.net/browse/FOLIO-1694</link>
                <project id="10290" key="FOLIO">FOLIO</project>
                    <description>&lt;p&gt;This JIRA is meant to sum up the different aspects of the routing/url issue that FOLIO faces in order to create a big picture view so that we can choose and describe work to move us to the best path in an iterative way.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;Browserlocation%2Fhistorymanagement.&quot;&gt;&lt;/a&gt;Browser location/history management.&lt;/h4&gt;
&lt;p&gt;The current pattern typical among core modules is to update the Store via &lt;tt&gt;mutator.query.update&lt;/tt&gt; which, eventually syncs up the url via `history.push` - the problem here is that if the history is updated again through other means (browser back button, subsequent call to &lt;tt&gt;history.push&lt;/tt&gt;) the store is now out of sync, which could cause expected updates to no longer happen and break UI functionality (
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;STCOM-302&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/STCOM-302&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Settings module: Unsaved Changes Modal not popping up after being closed once and Save/Update button does not work&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium&quot; /&gt;
            STCOM-302
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
).&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;mutator.query&lt;/tt&gt; does provide nice things such as a graceful API in case only a portion of the query parameters need to be updated, but this case should be reduced to a minimum if we&apos;re able to rely on the location&apos;s path as opposed to query parameters for portions of user workflow that extend beyond the initial record search/preview.&lt;/p&gt;

&lt;p&gt;Ideally, there&apos;s a unidirectional flow between the browser location and state/store of the system, where the location is updated via a link or call to history API and the client state/store/rendering are updated accordingly.&lt;br/&gt;
React-router can do the heavy lifting here, where components and their according state updates can be rendered through &lt;tt&gt;&amp;lt;Route&amp;gt;&lt;/tt&gt; components.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;Routingrestructuretouimodulecode&quot;&gt;&lt;/a&gt;Routing re-structure to ui-module code&lt;/h4&gt;
&lt;p&gt;Currently, routing is handled in a multitude of ways throughout modules- &lt;/p&gt;
&lt;ul class=&quot;alternate&quot; type=&quot;square&quot;&gt;
	&lt;li&gt;through query parameters (edit Layers)&lt;/li&gt;
	&lt;li&gt;Routes that are rendered within consumed smart-components.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Once something changes in the data layer or Routing layer, big refactors will need to take place here and the abstractions that render Routes may be incompatible.&lt;/p&gt;

&lt;p&gt;Proposed solution to this: Routing and data layer should live at the top level of ui-modules.&lt;br/&gt;
A module can set up a &lt;tt&gt;Switch&lt;/tt&gt; of &lt;tt&gt;Routes&lt;/tt&gt; that each represent an independant portion of the UI that connects to a data source and *excludes * rendering of workflows that are not currently visible to the user.&lt;/p&gt;

&lt;p&gt;Data from these connected containers are passed as props into presentational &apos;view&apos; components, and few things below this view are &apos;connected&apos; to a data source.&lt;br/&gt;
Additional guidance for this approach is available in 
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;STRIPES-589&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/STRIPES-589&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Quest: Route-based architecture in modules&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10309?size=medium&quot; /&gt;
            STRIPES-589
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
&lt;/p&gt;
&lt;h4&gt;&lt;a name=&quot;URLStructure&quot;&gt;&lt;/a&gt;URL Structure&lt;/h4&gt;
&lt;p&gt;URL&apos;s should contain very little of the current state of the component outside of those necessary for React-Router to render the appropriate view. Need to resolve/document sane usage of query params.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;RemoveRoutinginsmartcomponents&quot;&gt;&lt;/a&gt;Remove Routing in smart-components&lt;/h4&gt;

&lt;p&gt;Smart components can function as containers, but should be rendered within separate routes within the modules, but should not supply routes themselves. These will have to be refactored and modules will have to eject from them. For the most part, non-routing code will be split among sub-smart-components which can then be imported by modules, leaving non-rigid use-cases that perform only the heavy-lifting required. As these container components are broken out, The modular pieces can be put to use within their larger molecules - these can still be used in modules for short-term legacy support, but as routing moves to the modules, these molecules will go away as well...&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;Submodules&quot;&gt;&lt;/a&gt;Sub-modules&lt;/h4&gt;
&lt;p&gt;Need a way to handle routing for these-  these may exist as sidecars to detail views. They lean on URL structure.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;Intermodulenavigation%28backlinks%2Cclosebuttons%2Ceditbuttons%2Cetc%29&quot;&gt;&lt;/a&gt;Inter-module navigation (back-links, close buttons, edit buttons, etc)&lt;/h4&gt;
&lt;p&gt;Without manipulating &lt;tt&gt;history&lt;/tt&gt; directly, ui-modules may need to pass appropriate navigational props to &apos;view&apos; components. These would consist of url&apos;s to place as  &apos;href&apos; or &apos;to&apos;. Some cases where intra-module navigation occur may require some way to hide conditionally hide &apos;back&apos; links.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;Nestedroutes&quot;&gt;&lt;/a&gt;Nested routes&lt;/h4&gt;
&lt;p&gt;Spike-worthy approach to see if we should employ a nested route solution. May need to build/provide something like eholdings&apos; Route component: &lt;a href=&quot;https://github.com/folio-org/ui-eholdings/blob/master/src/router.js&quot; class=&quot;external-link&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://github.com/folio-org/ui-eholdings/blob/master/src/router.js&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;Routing%2Fqueryonplugins&quot;&gt;&lt;/a&gt;Routing/query on plugins&lt;/h4&gt;
&lt;p&gt;Plugins will need further adjustment to work with module routing.&lt;/p&gt;
</description>
                <environment></environment>
        <key id="80987">FOLIO-1694</key>
            <summary>RFC Routing Refactor</summary>
                <type id="10003" iconUrl="https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10318?size=medium">Task</type>
                                            <priority id="10002" iconUrl="https://dev.folio.org/assets/jira-priority/jira-p3.svg">P3</priority>
                        <status id="6" iconUrl="https://folio-org.atlassian.net/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="green"/>
                                    <resolution id="10003">Done</resolution>
                                                        <assignee accountid="5cd595118fa24d0dd2de1253">John Coburn</assignee>
                                                                <reporter accountid="5cd595118fa24d0dd2de1253">John Coburn</reporter>
                                    <labels>
                            <label>RFC</label>
                            <label>rfc</label>
                            <label>stripes-force</label>
                    </labels>
                <created>Fri, 11 Jan 2019 19:36:02 +0000</created>
                <updated>Wed, 3 Jun 2020 16:39:22 +0000</updated>
                            <resolved>Mon, 11 Mar 2019 20:04:48 +0000</resolved>
                                                                        <due></due>
                            <votes>0</votes>
                                    <watches>4</watches>
                                                                <comments>
                                                            <comment id="194269" author="62a96ae7192edb006f9f1bf9" created="Thu, 31 Jan 2019 16:37:07 +0000"  >&lt;p&gt;KG : need to determine a new app planned.&lt;/p&gt;</comment>
                                                            <comment id="194272" author="5d1cd1e35e43080ce8bf881f" created="Tue, 12 Feb 2019 02:56:24 +0000"  >&lt;h4&gt;&lt;a name=&quot;Modificationtoroutingrestructure&quot;&gt;&lt;/a&gt;Modification to routing re-structure&lt;/h4&gt;

&lt;p&gt;In meetings stemming from 
    &lt;span class=&quot;jira-issue-macro resolved&quot; data-jira-key=&quot;STRIPES-589&quot; &gt;
                &lt;a href=&quot;https://folio-org.atlassian.net/browse/STRIPES-589&quot; class=&quot;jira-issue-macro-key issue-link&quot;  title=&quot;Quest: Route-based architecture in modules&quot; &gt;
            &lt;img class=&quot;icon&quot; src=&quot;https://folio-org.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10309?size=medium&quot; /&gt;
            STRIPES-589
        &lt;/a&gt;
                                                    &lt;span class=&quot;aui-lozenge aui-lozenge-subtle aui-lozenge-success jira-macro-single-issue-export-pdf&quot;&gt;Closed&lt;/span&gt;
            &lt;/span&gt;
 and in further comments we are considering somewhat relaxing the original proposal:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;to allow re-use of glue code, provided that these container components only consist of glue and the underlying presentational components are available. There should be a smooth path to eject from the abstraction.&lt;/li&gt;
	&lt;li&gt;to allow data access in glue-only containers outside of the &lt;tt&gt;routes/&lt;/tt&gt; directory either in a &lt;tt&gt;containers/&lt;/tt&gt; directory or explictly named as FooContainer. Not all data access is route dependent (eg. autocomplete) and some module types can&apos;t bind routes (eg. plugins). While we could just use a &lt;tt&gt;containers/&lt;/tt&gt; dir for routes in all modules, it&apos;s useful to convey the module structure as it gives you an overview at a glance.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;&lt;a name=&quot;Deprecate%28orreplace%3F%29resourcebasedqueryparams&quot;&gt;&lt;/a&gt;Deprecate (or replace?) resource-based query params&lt;/h4&gt;

&lt;p&gt;It seems syncing a resource to the query parmeters has been more trouble than it&apos;s worth. Should we deprecate this for new development? We can&apos;t remove it until we refactor those situations where whole apps get pulled into plugins (eg. plugin-find-user), but we can stop recommending it in documentation.&lt;/p&gt;

&lt;p&gt;Would we want to replace it with any other helper or are the existing browser and react-router APIs sufficient?&lt;/p&gt;</comment>
                                                            <comment id="194275" author="5d1cd1e35e43080ce8bf881f" created="Fri, 22 Feb 2019 23:58:26 +0000"  >&lt;p&gt;So here&apos;s the spike on nesting route components---how to keep all our routes in one place and still used &lt;tt&gt;react-router&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;For more detail on the FS approach to nested routes, see Jeffrey&apos;s commit here (or also in eHoldings), the rest of the commit/PR provides an example of its use: &lt;br/&gt;
&lt;a href=&quot;https://github.com/frontside-folio/ui-circulation/blob/5e6d2dcae6cd1da2ebcef6e07f0ca41b4d9cc4d3/src/router.js&quot; class=&quot;external-link&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://github.com/frontside-folio/ui-circulation/blob/5e6d2dcae6cd1da2ebcef6e07f0ca41b4d9cc4d3/src/router.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We could instead use render props and not have to have to maintain this intermediate component and developers won&apos;t have to learn anything special outside of core react and react-router. But it&apos;s actually a bit more convoluted and so even though the other thing would be particular to FOLIO, it&apos;d be a bit more readable. This isn&apos;t... terrible though, conveniently it&apos;s a common enough thing one can readily google an example:&lt;br/&gt;
&lt;a href=&quot;https://stackoverflow.com/a/49321289&quot; class=&quot;external-link&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://stackoverflow.com/a/49321289&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;react-router&lt;/tt&gt;&apos;s own doc provide a third approach which I don&apos;t think we should go with but for the sake of completeness: You can make a sort of config object with the whole routing hierarchy and parse it into routes.&lt;br/&gt;
&lt;a href=&quot;https://reacttraining.com/react-router/web/example/route-config&quot; class=&quot;external-link&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://reacttraining.com/react-router/web/example/route-config&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don&apos;t have a particularly strong opinion beyond not being thrilled with the config object version. If we use render props, we should document the pattern where we mandate routes all be in index.js. If we use the route component, same thing, but now we need to put this component someplace. Should we use &lt;tt&gt;stripes-util&lt;/tt&gt; for that so as to avoid having a dependency on &lt;tt&gt;react-router&lt;/tt&gt; in &lt;tt&gt;stripes-components&lt;/tt&gt;?&lt;/p&gt;

&lt;p&gt;Does anyone have a strong (or even medium) preference between the first two options?&lt;/p&gt;</comment>
                                                            <comment id="194278" author="5d1cd1e35e43080ce8bf881f" created="Thu, 21 Mar 2019 21:28:06 +0000"  >&lt;p&gt;...we wound up opting for the nested route component and are exporting it from core &lt;a href=&quot;https://github.com/folio-org/stripes-core/pull/648&quot; class=&quot;external-link&quot; rel=&quot;nofollow noreferrer&quot;&gt;https://github.com/folio-org/stripes-core/pull/648&lt;/a&gt;&lt;/p&gt;</comment>
                    </comments>
                <issuelinks>
                            <issuelinktype id="10003">
                    <name>Relates</name>
                                            <outwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="61378">STRIPES-589</issuekey>
        </issuelink>
                            </outwardlinks>
                                                                <inwardlinks description="relates to">
                                        <issuelink>
            <issuekey id="61421">STRIPES-537</issuekey>
        </issuelink>
            <issuelink>
            <issuekey id="10924">UXPROD-1418</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                            <issuelinktype id="10007">
                    <name>Requires</name>
                                                                <inwardlinks description="is required by">
                                        <issuelink>
            <issuekey id="71106">UITEN-19</issuekey>
        </issuelink>
                            </inwardlinks>
                                    </issuelinktype>
                    </issuelinks>
                <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                <customfield id="customfield_10000" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummarycf">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10057" key="com.atlassian.jira.plugin.system.customfieldtypes:select">
                        <customfieldname>Development Team</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue key="10144"><![CDATA[Core: Platform]]></customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10019" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>0|hzzac7:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_10020" key="com.pyxis.greenhopper.jira:gh-sprint">
                        <customfieldname>Sprint</customfieldname>
                        <customfieldvalues>
                                <customfieldvalue id="980">stripes-force Sprint 55</customfieldvalue>
    <customfieldvalue id="982">stripes-force Sprint 57</customfieldvalue>
    <customfieldvalue id="793">stripes-force Sprint 58</customfieldvalue>
    <customfieldvalue id="989">stripes-force Sprint 59</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        <customfield id="customfield_10024" key="com.atlassian.jira.ext.charting:firstresponsedate">
                        <customfieldname>[CHART] Date of First Response</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>Thu, 31 Jan 2019 16:37:07 +0000</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10025" key="com.atlassian.jira.ext.charting:timeinstatus">
                        <customfieldname>[CHART] Time in Status</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                    </customfields>
    </item>
</channel>
</rss>