create-ui5-freestyle-lr 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +141 -0
  2. package/package.json +34 -0
  3. package/src/cli.js +74 -0
  4. package/src/metadata/fetch.js +42 -0
  5. package/src/metadata/parse.js +104 -0
  6. package/src/prompts/basic.js +43 -0
  7. package/src/prompts/fields.js +144 -0
  8. package/src/prompts/odata.js +57 -0
  9. package/src/render/buildContext.js +67 -0
  10. package/src/render/controlForType.js +136 -0
  11. package/src/render/engine.js +81 -0
  12. package/src/templates/README.md.ejs +62 -0
  13. package/src/templates/_valueHelp.fragment.xml.ejs +17 -0
  14. package/src/templates/package.json.ejs +14 -0
  15. package/src/templates/ui5.yaml.ejs +28 -0
  16. package/src/templates/webapp/Component.js.ejs +47 -0
  17. package/src/templates/webapp/controller/App.controller.js +29 -0
  18. package/src/templates/webapp/controller/BaseController.js +35 -0
  19. package/src/templates/webapp/controller/ErrorHandler.js +71 -0
  20. package/src/templates/webapp/controller/NotFound.controller.js +12 -0
  21. package/src/templates/webapp/controller/Worklist.controller.js.ejs +1158 -0
  22. package/src/templates/webapp/css/style.css +17 -0
  23. package/src/templates/webapp/i18n/i18n.properties.ejs +83 -0
  24. package/src/templates/webapp/i18n/i18n_de.properties.ejs +83 -0
  25. package/src/templates/webapp/index.html.ejs +52 -0
  26. package/src/templates/webapp/localService/backendCheck.js.ejs +52 -0
  27. package/src/templates/webapp/localService/mockserver.js.ejs +29 -0
  28. package/src/templates/webapp/manifest.json.ejs +106 -0
  29. package/src/templates/webapp/model/formatter.js +148 -0
  30. package/src/templates/webapp/model/models.js +23 -0
  31. package/src/templates/webapp/view/App.view.xml +10 -0
  32. package/src/templates/webapp/view/NotFound.view.xml +12 -0
  33. package/src/templates/webapp/view/Worklist.view.xml.ejs +173 -0
  34. package/src/templates/webapp/view/fragments/GroupDialog.fragment.xml.ejs +11 -0
  35. package/src/templates/webapp/view/fragments/InfoPopover.fragment.xml +38 -0
  36. package/src/templates/webapp/view/fragments/SortDialog.fragment.xml.ejs +11 -0
@@ -0,0 +1,173 @@
1
+ <mvc:View controllerName="<%= appId %>.controller.Worklist"
2
+ xmlns:mvc="sap.ui.core.mvc"
3
+ xmlns="sap.uxap"
4
+ xmlns:m="sap.m"
5
+ xmlns:f="sap.f"
6
+ xmlns:fb="sap.ui.comp.filterbar"
7
+ xmlns:plugins="sap.m.plugins"
8
+ xmlns:columnmenu="sap.m.table.columnmenu"
9
+ xmlns:fl="sap.ui.fl.variants"
10
+ xmlns:core="sap.ui.core">
11
+
12
+ <f:DynamicPage id="page" showFooter="true" preserveHeaderStateOnScroll="true">
13
+ <f:title>
14
+ <f:DynamicPageTitle>
15
+ <f:heading>
16
+ <m:HBox alignItems="Center" wrap="NoWrap">
17
+ <m:Title text="{i18n>worklistTitle}" wrapping="false" class="sapUiSmallMarginEnd"/>
18
+ <fl:VariantManagement id="variantMgmt"
19
+ headerLevel="H4"
20
+ showSetAsDefault="true"
21
+ select=".onVariantSelect"
22
+ save=".onVariantSave"
23
+ manage=".onVariantManage"/>
24
+ </m:HBox>
25
+ </f:heading>
26
+ </f:DynamicPageTitle>
27
+ </f:title>
28
+
29
+ <f:header>
30
+ <f:DynamicPageHeader>
31
+ <f:content>
32
+ <fb:FilterBar id="filterbar" useToolbar="false" search=".onSearch">
33
+ <fb:filterGroupItems>
34
+ <% filters.forEach(function (filter) { -%>
35
+ <fb:FilterGroupItem name="<%= filter.fieldName %>"
36
+ label="{i18n>filter.<%= filter.fieldName %>}"
37
+ groupName="main" visibleInFilterBar="true">
38
+ <fb:control>
39
+ <%- helpers.filterControlFor(filter, { i18nKey: 'filter.' + filter.fieldName }) %>
40
+ </fb:control>
41
+ </fb:FilterGroupItem>
42
+ <% }) -%>
43
+ </fb:filterGroupItems>
44
+ </fb:FilterBar>
45
+ </f:content>
46
+ </f:DynamicPageHeader>
47
+ </f:header>
48
+
49
+ <f:content>
50
+ <m:ScrollContainer height="100%" width="100%" vertical="true">
51
+ <m:Table id="worklistTable" class="lrTable"
52
+ items="{path: 'worklistView>/rows'}"
53
+ growing="false" alternateRowColors="true"
54
+ autoPopinMode="true" contextualWidth="Auto"
55
+ mode="MultiSelect" includeItemInSelection="false"
56
+ selectionChange=".onSelectionChange"
57
+ sticky="HeaderToolbar,ColumnHeaders,InfoToolbar"
58
+ fixedLayout="{= ${worklistView>/rows}.length > 0 }"
59
+ updateFinished=".onTableUpdateFinished">
60
+
61
+ <m:headerToolbar>
62
+ <m:OverflowToolbar>
63
+ <m:Title text="{worklistView>/tableTitleCount}"/>
64
+ <m:ToolbarSpacer/>
65
+ <m:Button icon="sap-icon://sort" tooltip="{i18n>tooltip.sort}" press=".onSortDialog"/>
66
+ <m:Button icon="sap-icon://group-2" tooltip="{i18n>tooltip.group}" press=".onGroupDialog"/>
67
+ <m:Button icon="sap-icon://table-view" tooltip="{i18n>columnSettings}" press=".onColumnDialog"/>
68
+ <m:Button icon="sap-icon://excel-attachment" tooltip="{i18n>tooltip.export}" press=".onExportToExcel"/>
69
+ <m:ToggleButton icon="sap-icon://history" text="{= ${worklistView>/autoRefreshOn} ? ${i18n>autoRefresh.btnOn} : ${i18n>autoRefresh.btnOff} }" tooltip="{i18n>tooltip.autoRefresh}" pressed="{worklistView>/autoRefreshOn}" press=".onToggleAutoRefresh"/>
70
+ <m:Button icon="sap-icon://synchronize" tooltip="{i18n>tooltip.refresh}" press=".onRefresh"/>
71
+ </m:OverflowToolbar>
72
+ </m:headerToolbar>
73
+
74
+ <m:infoToolbar>
75
+ <m:OverflowToolbar visible="{= ${worklistView>/infoBarVisible} || ${worklistView>/selectedCount} > 0 }">
76
+ <m:Text text="{worklistView>/infoBarText}" class="infoBarText" visible="{worklistView>/infoBarVisible}"/>
77
+ <m:ToolbarSpacer visible="{= ${worklistView>/selectedCount} > 0 &amp;&amp; ${worklistView>/infoBarVisible} }"/>
78
+ <m:Text text="{= ${worklistView>/selectedCount} + ' ' + ${i18n>selectedCount} }" visible="{= ${worklistView>/selectedCount} > 0 }"/>
79
+ <m:Button text="{i18n>bulkAction}" type="Emphasized" press=".onBulkAction" visible="{= ${worklistView>/selectedCount} > 0 }"/>
80
+ <m:Button icon="sap-icon://decline" tooltip="{i18n>clearSelection}" press=".onClearSelection" visible="{= ${worklistView>/selectedCount} > 0 }"/>
81
+ </m:OverflowToolbar>
82
+ </m:infoToolbar>
83
+
84
+ <m:dependents>
85
+ <plugins:ColumnResizer/>
86
+ <columnmenu:Menu id="columnHeaderMenu" beforeOpen=".onColumnMenuBeforeOpen">
87
+ <columnmenu:quickActions>
88
+ <columnmenu:QuickSort change=".onColumnQuickSort">
89
+ <columnmenu:items>
90
+ <columnmenu:QuickSortItem/>
91
+ </columnmenu:items>
92
+ </columnmenu:QuickSort>
93
+ </columnmenu:quickActions>
94
+ </columnmenu:Menu>
95
+ </m:dependents>
96
+
97
+ <m:columns>
98
+ <% columns.forEach(function (col, idx) { -%>
99
+ <m:Column width="<%= helpers.columnWidthFor(col, idx === 0) %>" hAlign="<%= helpers.columnHAlignFor(col) %>" importance="<%= helpers.columnImportanceFor(col, idx, columns.length) %>" headerMenu="columnHeaderMenu">
100
+ <m:customData>
101
+ <core:CustomData key="fieldName" value="<%= col.name %>"/>
102
+ <core:CustomData key="exportType" value="<%= helpers.exportTypeFor(col) %>"/>
103
+ </m:customData>
104
+ <m:Text text="{i18n>col.<%= col.name %>}"/>
105
+ </m:Column>
106
+ <% }) -%>
107
+ <m:Column width="4rem" hAlign="Center" importance="High">
108
+ <m:Text text="{i18n>col.info}"/>
109
+ </m:Column>
110
+ </m:columns>
111
+
112
+ <!-- Empty state: shown when /rows is empty (and not loading). Replace the
113
+ illustration type with one of the "sapIllus-*" set as needed. -->
114
+ <m:noData>
115
+ <m:IllustratedMessage
116
+ illustrationType="sapIllus-NoSearchResults"
117
+ title="{i18n>noDataIllustrationTitle}"
118
+ description="{i18n>noDataIllustrationDesc}"/>
119
+ </m:noData>
120
+
121
+ <m:items>
122
+ <!-- highlight = coloured bar on the row's left edge.
123
+ To preview the visual without real status data, replace
124
+ "formatStatusState" with "formatStatusStateDemo" below — every
125
+ row gets a green bar. Switch back once the backend returns
126
+ actual status codes.
127
+
128
+ type="Active" + press = whole row is clickable → opens InfoPopover.
129
+ includeItemInSelection on the Table is "false" so a row click does
130
+ NOT toggle selection — only the checkbox column does. -->
131
+ <m:ColumnListItem type="Active" press=".onItemPress"<% if (highlightField) { %> highlight="{path:'worklistView><%= highlightField %>', formatter:'.formatter.formatStatusState'}"<% } %>>
132
+ <m:cells>
133
+ <% columns.forEach(function (col, idx) { -%>
134
+ <%- helpers.cellControlFor(col, { isFirstColumn: idx === 0 }) %>
135
+ <% }) -%>
136
+ <m:Link text="{i18n>link.info}" press=".onInfoLinkPress"/>
137
+ </m:cells>
138
+ </m:ColumnListItem>
139
+ </m:items>
140
+ </m:Table>
141
+ </m:ScrollContainer>
142
+ </f:content>
143
+
144
+ <f:footer>
145
+ <m:OverflowToolbar>
146
+ <m:ObjectStatus text="{i18n>lastRefreshed.label}" state="Information" icon="sap-icon://information" visible="{= !!${worklistView>/lastRefreshedText} }" class="sapUiTinyMarginBegin"/>
147
+ <m:FormattedText htmlText="{worklistView>/lastRefreshedText}" class="sapUiTinyMarginBegin"/>
148
+ <m:ToolbarSpacer/>
149
+ <m:Text text="{i18n>rowsPerPage}"/>
150
+ <m:StepInput id="stepRowsPerPage" value="{worklistView>/top}"
151
+ min="10" max="100" step="10" width="100px" textAlign="Center"
152
+ change=".onStepChange"/>
153
+ <m:Button icon="sap-icon://close-command-field" press=".onFirstPage" enabled="{worklistView>/prevEnabled}">
154
+ <m:layoutData><m:OverflowToolbarLayoutData priority="NeverOverflow"/></m:layoutData>
155
+ </m:Button>
156
+ <m:Button icon="sap-icon://navigation-left-arrow" press=".onPrevPage" enabled="{worklistView>/prevEnabled}">
157
+ <m:layoutData><m:OverflowToolbarLayoutData priority="NeverOverflow"/></m:layoutData>
158
+ </m:Button>
159
+ <m:ComboBox id="pageSelect" width="4rem" selectedKey="{worklistView>/page}"
160
+ items="{worklistView>/pageList}" change=".onPageSelect">
161
+ <core:Item key="{worklistView>key}" text="{worklistView>text}"/>
162
+ </m:ComboBox>
163
+ <m:Text text="/ {worklistView>/totalPages}"/>
164
+ <m:Button icon="sap-icon://navigation-right-arrow" press=".onNextPage" enabled="{worklistView>/nextEnabled}">
165
+ <m:layoutData><m:OverflowToolbarLayoutData priority="NeverOverflow"/></m:layoutData>
166
+ </m:Button>
167
+ <m:Button icon="sap-icon://open-command-field" press=".onLastPage" enabled="{worklistView>/nextEnabled}">
168
+ <m:layoutData><m:OverflowToolbarLayoutData priority="NeverOverflow"/></m:layoutData>
169
+ </m:Button>
170
+ </m:OverflowToolbar>
171
+ </f:footer>
172
+ </f:DynamicPage>
173
+ </mvc:View>
@@ -0,0 +1,11 @@
1
+ <core:FragmentDefinition
2
+ xmlns="sap.m"
3
+ xmlns:core="sap.ui.core">
4
+ <ViewSettingsDialog id="groupDialog" confirm=".onGroupDialogConfirm" resetGroups=".onGroupDialogReset">
5
+ <groupItems>
6
+ <% columns.filter(c => c.sortable).forEach(col => { -%>
7
+ <ViewSettingsItem key="<%= col.name %>" text="{i18n>col.<%= col.name %>}"/>
8
+ <% }) -%>
9
+ </groupItems>
10
+ </ViewSettingsDialog>
11
+ </core:FragmentDefinition>
@@ -0,0 +1,38 @@
1
+ <core:FragmentDefinition
2
+ xmlns="sap.m"
3
+ xmlns:core="sap.ui.core"
4
+ xmlns:l="sap.ui.layout">
5
+
6
+ <!--
7
+ Demo popover for the "row -> link -> info" pattern.
8
+ Data is read from the "worklistView>/infoPopoverData" JSON model path, which is
9
+ populated by Worklist.controller.js -> onInfoPopoverPress before the popover opens.
10
+
11
+ Replace the labels and the fields to match whatever entity / fields you want to show.
12
+ -->
13
+ <Popover
14
+ id="infoPopover"
15
+ title="{i18n>infoPopoverTitle}"
16
+ placement="Auto"
17
+ contentWidth="22rem"
18
+ class="sapUiContentPadding">
19
+ <content>
20
+ <l:VerticalLayout class="sapUiSmallMargin">
21
+ <Label text="{i18n>infoPopoverKey}" design="Bold"/>
22
+ <Text text="{worklistView>/infoPopoverData/key}"/>
23
+
24
+ <Label text="{i18n>infoPopoverDetail}" design="Bold" class="sapUiSmallMarginTop"/>
25
+ <Text text="{worklistView>/infoPopoverData/detail}"/>
26
+
27
+ <Label text="{i18n>infoPopoverTimestamp}" design="Bold" class="sapUiSmallMarginTop"/>
28
+ <Text text="{path:'worklistView>/infoPopoverData/timestamp', formatter:'.formatter.formatDate'}"/>
29
+ </l:VerticalLayout>
30
+ </content>
31
+ <footer>
32
+ <OverflowToolbar>
33
+ <ToolbarSpacer/>
34
+ <Button text="{i18n>close}" press=".onInfoPopoverClose"/>
35
+ </OverflowToolbar>
36
+ </footer>
37
+ </Popover>
38
+ </core:FragmentDefinition>
@@ -0,0 +1,11 @@
1
+ <core:FragmentDefinition
2
+ xmlns="sap.m"
3
+ xmlns:core="sap.ui.core">
4
+ <ViewSettingsDialog id="sortDialog" confirm=".onSortDialogConfirm">
5
+ <sortItems>
6
+ <% columns.filter(c => c.sortable).forEach(col => { -%>
7
+ <ViewSettingsItem key="<%= col.name %>" text="{i18n>col.<%= col.name %>}"/>
8
+ <% }) -%>
9
+ </sortItems>
10
+ </ViewSettingsDialog>
11
+ </core:FragmentDefinition>