{"id":20146204,"url":"https://github.com/evoluteur/evolutility-ui-react","last_synced_at":"2025-04-09T14:06:37.567Z","repository":{"id":10427413,"uuid":"61291846","full_name":"evoluteur/evolutility-ui-react","owner":"evoluteur","description":"Framework for building CRUD UIs for Hasura GraphQL with models rather than code.","archived":false,"fork":false,"pushed_at":"2024-05-24T19:55:21.000Z","size":11390,"stargazers_count":120,"open_issues_count":2,"forks_count":32,"subscribers_count":13,"default_branch":"main","last_synced_at":"2025-04-02T10:46:47.153Z","etag":null,"topics":["crud","crud-application","crud-functionality","evolutility","graphql","hasura","hasura-graphql","low-code","mda","metadata","metadata-driven","model","model-driven","model-driven-development","no-code","react-component","spa","views"],"latest_commit_sha":null,"homepage":"https://evoluteur.github.io/evodemo/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/evoluteur.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"evoluteur"}},"created_at":"2016-06-16T12:43:26.000Z","updated_at":"2025-03-17T14:06:08.000Z","dependencies_parsed_at":"2023-02-15T06:31:37.107Z","dependency_job_id":"a8ec45d7-7663-4f88-aa95-602fb66d2830","html_url":"https://github.com/evoluteur/evolutility-ui-react","commit_stats":{"total_commits":642,"total_committers":5,"mean_commits":128.4,"dds":0.02024922118380057,"last_synced_commit":"2f57526832949730e571adf1b26a33270aa14a56"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evoluteur%2Fevolutility-ui-react","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evoluteur%2Fevolutility-ui-react/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evoluteur%2Fevolutility-ui-react/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evoluteur%2Fevolutility-ui-react/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/evoluteur","download_url":"https://codeload.github.com/evoluteur/evolutility-ui-react/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248054227,"owners_count":21039952,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crud","crud-application","crud-functionality","evolutility","graphql","hasura","hasura-graphql","low-code","mda","metadata","metadata-driven","model","model-driven","model-driven-development","no-code","react-component","spa","views"],"created_at":"2024-11-13T22:20:27.610Z","updated_at":"2025-04-09T14:06:37.549Z","avatar_url":"https://github.com/evoluteur.png","language":"JavaScript","readme":"# Evolutility-UI-React \u0026middot; [![GitHub license](https://img.shields.io/github/license/evoluteur/evolutility-ui-react)](https://github.com/evoluteur/evolutility-ui-react/blob/main/LICENSE) [![npm version](https://img.shields.io/npm/v/evolutility-ui-react)](https://www.npmjs.com/package/evolutility-ui-react)\n\n\nEvolutility-UI-React is a set of **model-driven views** to [Browse](#Browse), [Edit](#Edit), [List](#List), [Cards](#Cards), [Charts](#Charts), [Stats](#Stats), [Overview](#Overview), and [Activity](#Activity).\n\nWith it you can easily build CRUD applications by writing models rather than code. It uses [Hasura](https://hasura.io) GraphQL backend. No hand-coding is necessary!\n\nCheck out the [live demos](https://evoluteur.github.io/evodemo/#/demos).\n\n![Edit](public/pix/screenshots/one-edit.png)\n\n\n### Table of Contents\n1. [Installation](#Installation)\n2. [Configuration](#Configuration)\n3. [Views](#Views) for [One](#ViewsOne), [Many](#ViewsMany) records, and for [Comfort](#ViewsComfort)\n4. [Models](#Models)\n5. [Backend](#Backend)\n6. [License](#License)\n\n\u003ca name=\"Installation\"\u003e\u003c/a\u003e\n## Installation\n\n[**Download**](https://github.com/evoluteur/evolutility-ui-react/archive/master.zip) or **clone** from [GitHub](https://github.com/evoluteur/evolutility-ui-react/).\n\n```bash\n# To get the latest stable version, use git from the command line.\ngit clone https://github.com/evoluteur/evolutility-ui-react\n```\n\nor use the [npm package](https://www.npmjs.com/package/evolutility-ui-react):\n\n```bash\n# To get the latest stable version, use npm from the command line.\nnpm install evolutility-ui-react\n```\n\n\nIn the Evolutility-UI-React directory, use the command line to type the following:\n\n```bash\n# Install dependencies\nnpm install\n\n# Run the node.js server\nnpm start\n\n```\n\nIn a web browser, go to the url [http://localhost:3000/ the REST endpoints, you also need to install and run [Evolutility-Server-Node](https://github.com/evoluteur/evolutility-server-node) which provides the matching REST endpoints based on the same metadata.\n\n\n\u003ca name=\"Configuration\"\u003e\u003c/a\u003e\n## Configuration\n\nConfigurations options are specified in the file [/src/config.js](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/config.js). They apply to all apps (app specific options are specified in models).\n\n| Option     | Description      | Example             |\n|------------|------------------|---------------------|\n| apiPath    | Path to GraphQL API. | \"https://myapp.hasura.app/v1/graphql\" |\n| adminSecret | Token for Hasura. | |\n| useCache   | Enable/disable data caching. | true |\n| cacheDuration | Cache duration in seconds. | 120 (for 2 minutes) |\n| filesUrl   | Path to upload files to. | \"/pix/\" |\n| pageSize   | Page size in pagination.  | 50 |\n| withActivity | Tracks and shows records activity (last visited and most visited). Currently implemented w/ the browser's localStorage, it will be moved to the server later. | true |\n| queryModels | Get models from JSON files or from the database through the API. (not implemented yet) |\n| withTimestamp | Tracks and shows timestamp for creation date and last update for every record. The DB tables need timestamp columns \"updated_at\" and \"created_at\" for the feature to work. (partial implementation) | true |\n\n\n\u003ca name=\"Views\"\u003e\u003c/a\u003e\n## Views\n\nFor any object, a single model defines UI elements across views in a simple declarative way.\n\nEvolutility-UI-React provides different types of view:\n\n* Views for One - a single record: [Browse](#Browse), [Edit](#Edit).\n* Views for Many - a collection of records: [List](#List), [Cards](#Cards), [Charts](#Charts), [Stats](#Stats).\n\nEvolutility uses GraphQL with [Hasura](https://hasura.io).\n\nNotes: Views for actions (search, filter, export) will come later.\n\n\n\u003ca name=\"ViewsOne\"\u003e\u003c/a\u003e\n## Views for One object\n\n[Browse](#Browse) - [Edit](#Edit)\n\n\u003ca name=\"Browse\"\u003e\u003c/a\u003e\n### Browse\nShows all fields for viewing (read only). Fields are grouped in panels.\n\n![Browse](public/pix/screenshots/one-browse.png)\n\nCode: [/src/components/views/one/Browse/Browse.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/one/Browse/Browse.jsx)\n\nRoute: \"/{entity}/browse/{id}\"\n\n\u003ca name=\"Edit\"\u003e\u003c/a\u003e\n### Edit\nThis view shows all fields for edition to create or update records.\nIt automatically performs validation based on the model.\nFields are grouped in panels and tabs.\n\n![Edit](public/pix/screenshots/one-edit.png)\n\nCode: [/src/components/views/one/Edit/Edit.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/one/Edit/Edit.jsx)\n\nRoute: \"/{entity}/edit/{id}\"\n\n\n\u003ca name=\"ViewsMany\"\u003e\u003c/a\u003e\n## Views for Many objects\n\n[List](#List) - [Cards](#Cards) - [Charts](#Charts) - [Stats](#Stats)\n\n\u003ca name=\"List\"\u003e\u003c/a\u003e\n### List\nGives a tabular view of a collection.\n\n![List](public/pix/screenshots/many-list.png)\n\nCode: [/src/components/views/many/List/List.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/many/List/List.jsx)\n\nRoute: \"/{entity}/list\"\n\n\u003ca name=\"Cards\"\u003e\u003c/a\u003e\n### Cards\nShows records side by side as cards.\n\n![Cards](public/pix/screenshots/many-cards.png)\n\nCode: [/src/components/views/many/Cards/Cards.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/many/Cards/Cards.jsx)\n\nRoute: \"/{entity}/cards\"\n\n\u003ca name=\"Charts\"\u003e\u003c/a\u003e\n### Charts\nDraws charts about the collection. Currently bars and pie charts are implemented, a list with count and percentages is also available. Only provided for fields of types like boolean, lov, integer, decimal, date... (not text or textmultilines).\n\n![Charts](public/pix/screenshots/analytics-charts.png)\n\nCode: [/src/components/views/analytics/Charts/Charts.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/analytics/Charts/Charts.jsx)\n\nRoute: \"/{entity}/charts\"\n\nNote: The \"Charts\" view is currently only implemented for REST, not available with GraphQL yet.\n\n\u003ca name=\"Stats\"\u003e\u003c/a\u003e\n### Stats\nDisplay last update, number of updates in the last week, and for numeric fields the min, max, count, average.\n\n![Stats](public/pix/screenshots/analytics-stats.png)\n\nCode: [/src/components/views/analytics/Stats/Stats.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/analytics/Stats/Stats.jsx)\n\nRoute: \"/{entity}/stats\"\n\n\n\u003ca name=\"ViewsComfort\"\u003e\u003c/a\u003e\n## \"Comfort\" views\nDisplay a summary of the object and the latest activity on it.\n\n\u003ca name=\"Overview\"\u003e\u003c/a\u003e\n### Overview\nDisplay a summary of the object and the latest activity on it.\n\n![Overview](public/pix/screenshots/comfort-overview.png)\n\nCode: [/src/components/views/comfort/Overview/Overview.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/comfort/Overview/Overview.jsx)\n\nRoute: \"/{entity}/\"\n\n\u003ca name=\"Activity\"\u003e\u003c/a\u003e\n### Activity\nShow list of \"last visited\" and \"most visited\" records for the object (stored in the browser's localStorage).\n\n![Activity](public/pix/screenshots/comfort-activity.png)\n\nCode: [/src/components/views/comfort/Activity/Activity.jsx](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/components/views/comfort/Activity/Activity.jsx)\n\nRoute: \"/{entity}/activity\"\n\n\n\n\u003ca name=\"Models\"\u003e\u003c/a\u003e\n## Models\n\nEach model describe an object and its list of fields. A single model is used for all views (Browse, Edit, List, Cards...).\n\nFor any object, all UI views (List, Cards, Edit, Charts...) share the same model.\nAll Fields are present in the Edit and Browse views. Fields can be flagged with \"inMany\" to be included in the List and Cards views, or \"noCharts\" and \"noStats\" to be excluded from the Charts or Stats views.\n\n\n### Object\n\n| Property     | Meaning                                 |\n|--------------|-----------------------------------------|\n| id           | Unique key to identify the entity (used in route and as API parameter). |\n| qid          | Entity ID used in GraphQL (may be different from id in route). |\n| icon         | Icon file name for the entity (example: \"cube.gif\"). |\n| name         | Object name (singular).    |\n| namePlural   | Object name (plural).      |\n| title        | Application name.          |\n| fields       | Array of [Fields](#Field). |\n| groups       | Array of [Groups](#Group). If not provided a single group will be used.   |\n| collections  | Array of [Collections](#Collection).      |\n| titleField      | Id of the field which value is used as record title. titleField can also be a function.                       |\n| titleFunction  | Function to calculate the record title based it's data. Example: titleFunction = (data, model) =\u003e data.firstname + \" \" + data.lastname;       | X   | X   |\n| defaultViewOne | To have List and Cards link to Edit instead of Browse, set defaultViewOne=\"edit\". |\n\n\n\u003ca name=\"Field\"\u003e\u003c/a\u003e\n### Field\n\nObjects have fields.\n\n| Property     | Meaning                               |\n|--------------|---------------------------------------|\n| id           | Unique key for the field (can be the same as column but doesn't have to be). |\n| type         | Field type to show in the UI. Possible field types: \u003cul\u003e\u003cli\u003eboolean (yes/no)\u003c/li\u003e\u003cli\u003edate\u003c/li\u003e\u003cli\u003edecimal\u003c/li\u003e\u003cli\u003edocument\u003c/li\u003e\u003cli\u003eemail\u003c/li\u003e\u003cli\u003eimage\u003c/li\u003e\u003cli\u003einteger\u003c/li\u003e\u003cli\u003ejson\u003c/li\u003e\u003cli\u003elov (list of values)\u003c/li\u003e\u003cli\u003emoney\u003c/li\u003e\u003cli\u003etext\u003c/li\u003e\u003cli\u003etextmultiline\u003c/li\u003e\u003cli\u003etime\u003c/li\u003e\u003cli\u003eurl\u003c/li\u003e\u003c/ul\u003e |\n| label        | Field description (displayed with an asterisk for required fields).      |\n| labelShort   | Optional shorter version of the labels (used in List and Cards views). |\n| required     | Determines if the field is required for saving.      |\n| readOnly     | If set to true, the field value cannot be changed.   |\n| defaultValue | Default field value for new records.    |\n| format       | Field format (using moment for date values and numeral for  numeric values). |\n| max, min     | Maximum/Minimum value allowed (only applies to numeric fields).      |\n| maxLength, minLength | Maximum/Minimum length allowed (only applies to text fields).      |\n| regExp       | Regular expression used to validate the field value.     |\n| list         | List of  items in the dropdown as an array  of id-text objects (only for fields of \"lov\" type). If ommited, the list will be  retrieved in the first query by id on that object.   |\n| lovIcon      | Set to True to include icon with LOV items(only for fields of \"lov\" type).    |\n| object       | Model id for the object to link to (only for fields of \"lov\" type).     |\n| chartObject | Optional overide for object name in charts (only for \"lov\" fields). |\n| aggregate | Optional overide for aggregation name in charts (only for \"lov\" fields). |\n| inMany       | Determines if the field is present (by default) in lists of records. |\n| inSearch     | Determine if the field is used in text searches.  |\n| height       | For fields of type \"textmultiline\", number of lines used in the field (in Browse and Edit views). |\n| width        | Field width in Browse and Edit views (in percent of parent width). |\n| help         | Optional help on the field. |\n| chartType    | Default charts type used for the field (\"Bars\", \"Pie\", or \"Table\"). \"Bars\" is used if not specified. |\n| noCharts     | Exclude field from charts (only applies to fields of type integer, decimal, money, boolean, list of values which are \"chartable\"). |\n| noStats      | Exclude field from Stats.   |\n\n\u003ca name=\"Group\"\u003e\u003c/a\u003e\n### Field Group\n\nField Groups are used to separate Fields into panels in the Edit and Browse views.\n\n| Property     | Meaning                               |\n|--------------|---------------------------------------|\n| id           | Unique key for the group. It is optional.            |\n| type         | Type of fields group. Only \"panel\" is currently supported (tab and other types of groups will be added later). |\n| label        | Group title displayed in the group header.      |\n| fields       | Array of field ids.       |\n| width        | Width (in % of the container total width).        |\n| help         | Optional help tooltip text.|\n| header       | Optional text displayed at the top of the group (just below the group title).|\n| footer       | Optional text displayed below the group.    |\n\nNotes:\n- Field Groups are optional. By default a single group holds all fields.\n- Field Groups are positioned based on their \"width\" property the same way than fields are positioned inside groups.\n\n\u003ca name=\"Collection\"\u003e\u003c/a\u003e\n### Collection\n\nMultiple details tables can be specified with \"collections\".\n\n| Property     | Meaning                               |\n|--------------|---------------------------------------|\n| id           | Unique key for the collection.        |\n| title        | Collection title.                     |\n| object       | Model.id for the Object to link to.   |\n| fields       | Array of fields (objects or ids). Fields in collections can be field objects or just ids of fields in the collection's object.   |\n| readOnly     | Specify if the collection is readOnly.   |\n| hideIfEmpty  | Hide Collection when it is empty in Edit view (always hidden when empty in Browse view).  |\n| help         | Optional help tooltip text.|\n| header       | Text to be displayed before the collection.   |\n| footer       | Text to be displayed below the collection.    |\n\nSample model using collections: [Wine Cellar](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/models/organizer/winecellar.js).\n\n### Sample model\n\nThe following example is the model for a simple graphic novels inventory app.\n\n```javascript\n{\n    id: \"comics\",\n    title: \"Graphic Novels\",\n    name: \"graphic novel serie\",\n    namePlural: \"graphic novel series\",\n    icon: \"comics.png\",\n    titleField: \"title\",\n    fields:[\n      {\n          id: \"title\", type: \"text\",\n          label: \"Title\",\n          required: true, maxLength: 255,\n          width: 100, inMany: true,\n      },\n      {\n          id: \"authors\", type: \"text\",\n          label: \"Authors\",\n          inMany: true, width: 62,\n\n      },\n      {\n          id: \"genre\", type: \"lov\",\n          label: \"Genre\",\n          width: 38, inMany: true,\n          list: [\n            {id: 1, text: \"Adventure\"},\n            {id: 2, text: \"Fairy tale\"},\n            {id: 3, text: \"Erotic\"},\n            {id: 4, text: \"Fantastic\"},\n            {id: 5, text: \"Heroic Fantasy\"},\n            {id: 6, text: \"Historic\"},\n            {id: 7, text: \"Humor\"},\n            {id: 8, text: \"One of a kind\"},\n            {id: 9, text: \"Youth\"},\n            {id: 10, text: \"Thriller\"},\n            {id: 11, text: \"Science-fiction\"},\n            {id: 12, text: \"Super Heros\"},\n            {id: 13, text: \"Western\"}\n          ]\n      },\n      {\n          id: \"serie_nb\", type: \"integer\",\n          label: \"Albums\", noCharts: true,\n          width: 15, inMany: false\n      },\n      {\n          id: \"have_nb\", type: \"integer\",\n          label: \"Owned\",\n          width: 15, inMany: false, noCharts: true\n      },\n      {\n          id: \"have\", type: \"text\",\n          label: \"Have\",\n          width: 15, inMany: false\n      },\n      {\n          id: \"language\", type: \"lov\",\n          label: \"Language\",\n          width: 17, inMany: true,\n          lovIcon: true,\n          list: [\n            {id: 2, text: 'French', icon:'comics/flags/fr.png'},\n            {id: 1, text: 'American', icon:'comics/flags/us.png'}\n          ]\n      },\n      {\n          id: \"complete\", type: \"boolean\",\n          label: \"Complete\",\n          width: 19, inMany: false\n      },\n      {\n          id: \"finished\", type: \"boolean\",\n          label: \"Finished\",\n          width: 19, inMany: false\n      },\n      {\n          id: \"pix\", type: \"image\",\n          label: \"Cover\",\n          width: 30, inMany: true\n      },\n      {\n          id: \"notes\", type: \"textmultiline\",\n          label: \"Notes\",\n          width: 70, height: 7, maxLength: 5000,\n          inMany: false\n      }\n  ],\n\n  groups: [\n      {\n        id:\"serie\", type: \"panel\", label: \"Serie\", width: 70,\n        fields: [\"title\", \"authors\", \"genre\",\n              \"serie_nb\", \"have_nb\", \"have\",\n              \"language\", \"complete\", \"finished\", \"notes\"\n        ]\n      },\n      {\n        id:\"pix\", type: \"panel\", label: \"Cover\", width: 30,\n        fields: [\"pix\"]\n      }\n  ]\n}\n\n```\n\nMore sample models: [To-do list](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/models/organizer/todo.js),\n[Address book](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/models/organizer/contact.js),\n[Restaurants list](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/models/organizer/restaurant.js),\n[Wine cellar](https://github.com/evoluteur/evolutility-ui-react/blob/main/src/models/organizer/winecellar.js).\n\n\u003ca name=\"Backend\"\u003e\u003c/a\u003e\n## Backend\n\nYou will need to setup the GraphQL backend on [Hasura](https://hasura.io/) with the Evolutility demo database.\n\n\u003col\u003e\u003cli\u003eYou can signup for a \u003ca href=\"https://cloud.hasura.io/signup\" target=\"h\" rel=\"noopener noreferrer\" class=\"extlink\"\u003efree account\u003c/a\u003e or host it yourself (\u003ca href=\"https://hasura.io/docs/latest/hasura-cli/quickstart/\" target=\"h\" rel=\"noopener noreferrer\" class=\"extlink\"\u003eQuickstart Hasura CLI\u003c/a\u003e).\u003c/li\u003e\u003cli\u003eAdd a Postgres database to your Hasura setup.\u003c/li\u003e\u003cli\u003eAdd the demo tables by running the SQL script \u003ca href=\"https://github.com/evoluteur/evolutility-ui-react/blob/main/sql/evol-db-schema.sql\" target=\"sql-s\" rel=\"noopener noreferrer\" class=\"extlink\"\u003eevol-db-schema.sql\u003c/a\u003e.\u003c/li\u003e\u003cli\u003ePopulate your database with sample data by running \u003ca href=\"https://github.com/evoluteur/evolutility-ui-react/blob/main/sql/evol-db-data.sql\" target=\"sql-d\" rel=\"noopener noreferrer\" class=\"extlink\"\u003eevol-db-data.sql\u003c/a\u003e\u003c/li\u003e\u003cli\u003eAdd relationships in Hasura console.\u003cdiv class=\"rels\"\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ecomics\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003egenre (Object): comics / genre_id -\u0026gt; comics_genre / id\u003c/li\u003e\u003cli\u003elanguage (Object): comics / language_id -\u0026gt; comics_language / id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ecomics_genre\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ecomics (Array): comics_genre / id =\u0026gt; comics / genre_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ecomics_language\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ecomics (Array): comics_language / id =\u0026gt; comics / language_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003econtact\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ecategory (Object): contact / category_id -\u0026gt; contact_category / id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003econtact_category\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003econtacts (Array): contact_category / id =\u0026gt; contact / category_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003emusic_album\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003eartist (Object): music_album / artist_id -\u0026gt; music_artist / id\u003c/li\u003e\u003cli\u003etracks (Array): music_album / id -\u0026gt; music_track / album_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003emusic_artist\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ealbums (Array): music_artist / id -\u0026gt; music_album / artist_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003emusic_genre\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003etracks (Array): music_genre / id -\u0026gt; music_track / genre_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003emusic_track\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ealbum (Object): music_track / album_id -\u0026gt; music_album / id\u003c/li\u003e\u003cli\u003egenre (Object): music_track / genre_id -\u0026gt; music_genre / id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003erestaurant\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ecuisine (Object): restaurant / cuisine_id -\u0026gt; restaurant_cuisine / id\u003c/li\u003e\u003cli\u003eprice (Object): restaurant / price_id -\u0026gt; restaurant_price / id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003erestaurant_cuisine\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003erestaurants (Array): restaurant_cuisine / id =\u0026gt; restaurants / cuisine_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003erestaurant_price\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003erestaurants (Array): restaurant_price / id =\u0026gt; restaurants / price_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003etask\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ecategory (Object): task / category_id -\u0026gt; task_category / id\u003c/li\u003e\u003cli\u003epriority (Object): task / priority_id -\u0026gt; task_priority / id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003etask_category\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003etasks (Array): task_category / id =\u0026gt; task / category_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003etask_priority\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003etasks (Array): task_priority / id =\u0026gt; task / priority_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ewine\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ewine_tastings (Array): wine / id -\u0026gt; wine_tasting / wine_id\u003c/li\u003e\u003cli\u003ebsize (Object): wine / bsize_id -\u0026gt; wine_bsize / id\u003c/li\u003e\u003cli\u003ecountry (Object): wine / country_id -\u0026gt; wine_country / id\u003c/li\u003e\u003cli\u003egrape (Object): wine / grape_id -\u0026gt; wine_grape / id\u003c/li\u003e\u003cli\u003escore (Object): wine / score_id -\u0026gt; wine_score / id\u003c/li\u003e\u003cli\u003etype (Object): wine / type_id -\u0026gt; wine_type / id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ewine_bsize\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ewines (Array): wine_bsize / id =\u0026gt; wine / bsize_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ewine_country\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ewines (Array): wine_country / id =\u0026gt; wine / country_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ewine_grape\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ewines (Array): wine_grape / id =\u0026gt; wine / grape_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ewine_score\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ewines (Array): wine_score / id =\u0026gt; wine / score_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ewine_tasting\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ewine (Object): wine_tasting / wine_id -\u0026gt; wine / id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eRelationships on \u003cstrong\u003ewine_type\u003c/strong\u003e table:\u003cul\u003e\u003cli\u003ewines (Array): wine_type / id =\u0026gt; wine / type_id\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003c/li\u003e\u003cli\u003eIn Evolutility, change the \"apiPath\" and \"adminSecret\" in the ./src/config.js file.\u003c/li\u003e\u003c/ol\u003e\n\n\u003ca name=\"License\"\u003e\u003c/a\u003e\n## License\n\nCopyright (c) 2023 [Olivier Giulieri](https://evoluteur.github.io/).\n\nEvolutility-UI-React is released under the [AGPL-3.0 license](http://github.com/evoluteur/evolutility-ui-react/blob/main/LICENSE).\n\nTo suggest a feature or report a bug: [https://github.com/evoluteur/evolutility-ui-react/issues](https://github.com/evoluteur/evolutility-ui-react/issues)\n\n","funding_links":["https://github.com/sponsors/evoluteur"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevoluteur%2Fevolutility-ui-react","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fevoluteur%2Fevolutility-ui-react","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevoluteur%2Fevolutility-ui-react/lists"}