{"id":19742134,"url":"https://github.com/merkle-open/aem-generic-multifield","last_synced_at":"2025-04-30T06:30:52.697Z","repository":{"id":57728148,"uuid":"112594107","full_name":"merkle-open/aem-generic-multifield","owner":"merkle-open","description":"Generic Multifield component dialog extension for AEM","archived":false,"fork":false,"pushed_at":"2025-03-21T09:34:01.000Z","size":451,"stargazers_count":16,"open_issues_count":0,"forks_count":7,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-04-05T23:32:00.344Z","etag":null,"topics":["aem","coral-spectrum","coralui","graniteui"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/merkle-open.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2017-11-30T09:46:44.000Z","updated_at":"2025-03-30T01:28:39.000Z","dependencies_parsed_at":"2024-02-08T16:27:55.293Z","dependency_job_id":"3d036e28-088e-43ed-aebc-d696b7ab6268","html_url":"https://github.com/merkle-open/aem-generic-multifield","commit_stats":null,"previous_names":["namics/aem-generic-multifield"],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/merkle-open%2Faem-generic-multifield","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/merkle-open%2Faem-generic-multifield/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/merkle-open%2Faem-generic-multifield/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/merkle-open%2Faem-generic-multifield/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/merkle-open","download_url":"https://codeload.github.com/merkle-open/aem-generic-multifield/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251653967,"owners_count":21622230,"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":["aem","coral-spectrum","coralui","graniteui"],"created_at":"2024-11-12T01:29:20.095Z","updated_at":"2025-04-30T06:30:52.406Z","avatar_url":"https://github.com/merkle-open.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Generic Multifield for AEMaaCS\n\nWith this project you can use a widget\nin [AEM as a Cloud Service](https://experienceleague.adobe.com/docs/experience-manager-cloud-service/content/release-notes/home.html)\nTouch UI which lets you create a generic multifield in a dialog.\n\n| System     | Status                                                                                                                                                                                                                                                          |\n|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| CI master  | [![release and deploy](https://github.com/merkle-open/aem-generic-multifield/actions/workflows/release-and-deploy-release.yml/badge.svg?branch=master)](https://github.com/merkle-open/aem-generic-multifield/actions/workflows/release-and-deploy-release.yml) |\n| CI develop | [![deploy snapshot](https://github.com/merkle-open/aem-generic-multifield/actions/workflows/deploy-snapshot.yml/badge.svg?branch=develop)](https://github.com/merkle-open/aem-generic-multifield/actions/workflows/deploy-snapshot.yml)                         |\n| Dependency | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.namics.oss.aem/genericmultifield/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.namics.oss.aem/genericmultifield)                                                      |\n\n\u003c!-- TOC --\u003e\n\n* [Generic Multifield for AEMaaCS](#generic-multifield-for-aemaacs)\n    * [Requirements](#requirements)\n    * [Maven Dependency](#maven-dependency)\n    * [in AEM](#in-aem)\n        * [Component Dialog](#component-dialog)\n            * [Properties](#properties)\n        * [Item-Dialog](#item-dialog)\n        * [Repository](#repository)\n    * [Development](#development)\n\n\u003c!-- TOC --\u003e\n\n## Requirements\n\n| System  | Version                                                                                                                                                                |\n|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| AEMaaCS | min version: [2023.12.0](https://experienceleague.adobe.com/en/docs/experience-manager-cloud-service/content/release-notes/release-notes/2023/release-notes-2023-12-0) |\n\n## Maven Dependency\n\n```\n  \u003cdependency\u003e\n    \u003cgroupId\u003ecom.namics.oss.aem\u003c/groupId\u003e\n    \u003cartifactId\u003egenericmultifield\u003c/artifactId\u003e\n    \u003cversion\u003e4.0.0\u003c/version\u003e\n  \u003c/dependency\u003e\n```\n\n## in AEM\n\nSince the Generic Multifield is built as an OSGi bundle, only the bundle has to be installed into your AEM instance.\nWith the common AEM archetype it can be added within the embedded configuration of the `content-package-maven-plugin`\nplugin.\n\n```xml\n\u003cplugin\u003e\n    \u003cgroupId\u003ecom.day.jcr.vault\u003c/groupId\u003e\n    \u003cartifactId\u003econtent-package-maven-plugin\u003c/artifactId\u003e\n    \u003cextensions\u003etrue\u003c/extensions\u003e\n    \u003cconfiguration\u003e\n        ...\n        \u003cembeddeds\u003e\n            \u003cembedded\u003e\n                \u003cgroupId\u003ecom.namics.oss.aem\u003c/groupId\u003e\n                \u003cartifactId\u003egenericmultifield\u003c/artifactId\u003e\n                \u003ctarget\u003e/apps/myProject/install\u003c/target\u003e\n            \u003c/embedded\u003e\n        \u003c/embeddeds\u003e\n    \u003c/configuration\u003e\n\u003c/plugin\u003e\n```\n\n### Component Dialog\n\nExample usage of the Generic Multifield in your component `_cq_dialog.xml` definition within AEM:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cjcr:root\u003e\n    \u003c!-- Within the component dialog definition --\u003e\n    ...\n    \u003ctitle\n            jcr:primaryType=\"nt:unstructured\"\n            sling:resourceType=\"granite/ui/components/coral/foundation/form/textfield\"\n            fieldLabel=\"Title\"\n            name=\"./title\"/\u003e\n    \u003cgenericmultifield\n            jcr:primaryType=\"nt:unstructured\"\n            sling:resourceType=\"merkle/genericmultifield\"\n            itemDialog=\"/your/project/path/component/item-dialog.xml\"\n            fieldLabel=\"Generic Multifield\"\n            fieldDescription=\"A list of generic multfield items\"\n            itemNameProperty=\"itemTitle\"\n            minElements=\"2\"\n            maxElements=\"5\"\n            required=\"{Boolean}true\"\n            itemStorageNode=\"./items\"/\u003e\n    ...\n\u003c/jcr:root\u003e\n```\n\n#### Properties\n\n| Property             | Function                                                                                                                                          |\n|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|\n| **itemDialog**       | Path reference to the dialog definition of a generic multifield item.                                                                             |\n| **itemNameProperty** | Defines the value representation of a generic multifield entry within the component dialog. Must be a reference to an item dialog property.       |\n| **minElements**      | Defines the minimal amount of generic multifield entries.                                                                                         |\n| **maxElements**      | Defines the maximal amount of generic multifield entries.                                                                                         |\n| **required**         | If set to `{Boolean}true`, the main component dialog will not validate until at least one item hast been defined.                                 |\n| **itemStorageNode**  | Defines the parent node name created within the component node. Generic multifield items will be saved beneath this node \u003cbr/\u003e(default: `items`). |\n\n![main dialog](docs/component.png)\n\n### Item-Dialog\n\nExample definition of the Generic Multifield item in your component's `item-dialog.xml` referenced\nwithin `\u003cgenericmultifield\u003e` definition via property `itemDialog`:\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cjcr:root xmlns:sling=\"http://sling.apache.org/jcr/sling/1.0\"\n          xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"\n          xmlns:nt=\"http://www.jcp.org/jcr/nt/1.0\"\n          jcr:primaryType=\"nt:unstructured\"\n          sling:resourceType=\"cq/gui/components/authoring/dialog\"\n          jcr:title=\"Generic Multifield Item\"\u003e\n    \u003ccontent\n            jcr:primaryType=\"nt:unstructured\"\n            sling:resourceType=\"granite/ui/components/coral/foundation/tabs\"\u003e\n        \u003citems\n                jcr:primaryType=\"nt:unstructured\"\u003e\n            \u003ctabOne\n                    jcr:primaryType=\"nt:unstructured\"\n                    sling:resourceType=\"granite/ui/components/coral/foundation/fixedcolumns\"\n                    jcr:title=\"Tab 1\"\n                    margin=\"{Boolean}true\"\u003e\n                \u003citems\n                        jcr:primaryType=\"nt:unstructured\"\u003e\n                    \u003ccolumn\n                            jcr:primaryType=\"nt:unstructured\"\n                            sling:resourceType=\"granite/ui/components/coral/foundation/container\"\u003e\n                        \u003citems\n                                jcr:primaryType=\"nt:unstructured\"\u003e\n                            \u003citemTitle\n                                    jcr:primaryType=\"nt:unstructured\"\n                                    sling:resourceType=\"granite/ui/components/coral/foundation/form/textfield\"\n                                    fieldLabel=\"Item Title\"\n                                    fieldDescription=\"Item Title Description\"\n                                    required=\"{Boolean}true\"\n                                    name=\"./itemTitle\"/\u003e\n                            \u003citemText\n                                    jcr:primaryType=\"nt:unstructured\"\n                                    sling:resourceType=\"granite/ui/components/coral/foundation/form/textarea\"\n                                    fieldLabel=\"Item Text\"\n                                    fieldDescription=\"Item Text Description\"\n                                    name=\"./itemText\"/\u003e\n                            \u003citemPath\n                                    jcr:primaryType=\"nt:unstructured\"\n                                    sling:resourceType=\"granite/ui/components/coral/foundation/form/pathbrowser\"\n                                    fieldLabel=\"Item Path\"\n                                    fieldDescription=\"Item Path Description\"\n                                    name=\"./itemPath\"/\u003e\n                        \u003c/items\u003e\n                    \u003c/column\u003e\n                \u003c/items\u003e\n            \u003c/tabOne\u003e\n            \u003ctabTwo\n                    jcr:primaryType=\"nt:unstructured\"\n                    sling:resourceType=\"granite/ui/components/coral/foundation/fixedcolumns\"\n                    jcr:title=\"Tab 2\"\n                    margin=\"{Boolean}true\"\u003e\n                \u003citems\n                        jcr:primaryType=\"nt:unstructured\"\u003e\n                    \u003ccolumn\n                            jcr:primaryType=\"nt:unstructured\"\n                            sling:resourceType=\"granite/ui/components/coral/foundation/container\"\u003e\n                        \u003citems\n                                jcr:primaryType=\"nt:unstructured\"\u003e\n\n                            \u003c!-- properties definition --\u003e\n\n                        \u003c/items\u003e\n                    \u003c/column\u003e\n                \u003c/items\u003e\n            \u003c/tabTwo\u003e\n            \u003ctabThree\n                    jcr:primaryType=\"nt:unstructured\"\n                    sling:resourceType=\"granite/ui/components/coral/foundation/fixedcolumns\"\n                    jcr:title=\"Tab 3\"\n                    margin=\"{Boolean}true\"\u003e\n                \u003citems\n                        jcr:primaryType=\"nt:unstructured\"\u003e\n                    \u003ccolumn\n                            jcr:primaryType=\"nt:unstructured\"\n                            sling:resourceType=\"granite/ui/components/coral/foundation/container\"\u003e\n                        \u003citems\n                                jcr:primaryType=\"nt:unstructured\"\u003e\n\n                            \u003c!-- properties definition --\u003e\n\n                        \u003c/items\u003e\n                    \u003c/column\u003e\n                \u003c/items\u003e\n            \u003c/tabThree\u003e\n        \u003c/items\u003e\n    \u003c/content\u003e\n\u003c/jcr:root\u003e\n``` \n\n![multifield dialog](docs/item.png)\n\n### Repository\n\nIn the repository the content is stored as follows:\n\n![content](docs/repo.png)\n\n## Development\n\nBuild locally with Maven\n\n```\n    mvn clean install -PautoInstallBundle\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmerkle-open%2Faem-generic-multifield","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmerkle-open%2Faem-generic-multifield","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmerkle-open%2Faem-generic-multifield/lists"}