@researchdatabox/redbox-core 0.0.0-bootstrap.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 (934) hide show
  1. package/dist/Attachment.d.ts +17 -0
  2. package/dist/Attachment.d.ts.map +1 -0
  3. package/dist/Attachment.js +40 -0
  4. package/dist/CoreController.d.ts +202 -0
  5. package/dist/CoreController.d.ts.map +1 -0
  6. package/dist/CoreController.js +688 -0
  7. package/dist/CoreService.d.ts +95 -0
  8. package/dist/CoreService.d.ts.map +1 -0
  9. package/dist/CoreService.js +295 -0
  10. package/dist/Datastream.d.ts +11 -0
  11. package/dist/Datastream.d.ts.map +1 -0
  12. package/dist/Datastream.js +38 -0
  13. package/dist/DatastreamService.d.ts +19 -0
  14. package/dist/DatastreamService.d.ts.map +1 -0
  15. package/dist/DatastreamService.js +3 -0
  16. package/dist/DatastreamServiceResponse.d.ts +12 -0
  17. package/dist/DatastreamServiceResponse.d.ts.map +1 -0
  18. package/dist/DatastreamServiceResponse.js +37 -0
  19. package/dist/IntegrationAuditParams.d.ts.map +1 -0
  20. package/dist/Logger.d.ts +16 -0
  21. package/dist/Logger.d.ts.map +1 -0
  22. package/dist/Logger.js +3 -0
  23. package/dist/QueueService.d.ts +9 -0
  24. package/dist/QueueService.d.ts.map +1 -0
  25. package/dist/QueueService.js +21 -0
  26. package/dist/RecordAuditParams.d.ts +6 -0
  27. package/dist/RecordAuditParams.d.ts.map +1 -0
  28. package/dist/RecordAuditParams.js +10 -0
  29. package/dist/RecordsService.d.ts +39 -0
  30. package/dist/RecordsService.d.ts.map +1 -0
  31. package/dist/RecordsService.js +3 -0
  32. package/dist/SearchService.d.ts +8 -0
  33. package/dist/SearchService.d.ts.map +1 -0
  34. package/dist/SearchService.js +3 -0
  35. package/dist/StorageService.d.ts +27 -0
  36. package/dist/StorageService.d.ts.map +1 -0
  37. package/dist/StorageService.js +3 -0
  38. package/dist/StorageServiceResponse.d.ts +16 -0
  39. package/dist/StorageServiceResponse.d.ts.map +1 -0
  40. package/dist/StorageServiceResponse.js +41 -0
  41. package/dist/bootstrap.d.ts +32 -0
  42. package/dist/bootstrap.d.ts.map +1 -0
  43. package/dist/bootstrap.js +172 -0
  44. package/dist/config/action.config.d.ts +13 -0
  45. package/dist/config/action.config.d.ts.map +1 -0
  46. package/dist/config/action.config.js +9 -0
  47. package/dist/config/agendaQueue.config.d.ts +49 -0
  48. package/dist/config/agendaQueue.config.d.ts.map +1 -0
  49. package/dist/config/agendaQueue.config.js +71 -0
  50. package/dist/config/api.config.d.ts +9 -0
  51. package/dist/config/api.config.d.ts.map +1 -0
  52. package/dist/config/api.config.js +11 -0
  53. package/dist/config/appmode.config.d.ts +12 -0
  54. package/dist/config/appmode.config.d.ts.map +1 -0
  55. package/dist/config/appmode.config.js +12 -0
  56. package/dist/config/auth.config.d.ts +15 -0
  57. package/dist/config/auth.config.d.ts.map +1 -0
  58. package/dist/config/auth.config.js +81 -0
  59. package/dist/config/autoreload.config.d.ts +18 -0
  60. package/dist/config/autoreload.config.d.ts.map +1 -0
  61. package/dist/config/autoreload.config.js +21 -0
  62. package/dist/config/blueprints.config.d.ts +28 -0
  63. package/dist/config/blueprints.config.d.ts.map +1 -0
  64. package/dist/config/blueprints.config.js +15 -0
  65. package/dist/config/bootstrap.config.d.ts +15 -0
  66. package/dist/config/bootstrap.config.d.ts.map +1 -0
  67. package/dist/config/bootstrap.config.js +12 -0
  68. package/dist/config/branding.config.d.ts +19 -0
  69. package/dist/config/branding.config.d.ts.map +1 -0
  70. package/dist/config/branding.config.js +109 -0
  71. package/dist/config/brandingConfigurationDefaults.config.d.ts +134 -0
  72. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -0
  73. package/dist/config/brandingConfigurationDefaults.config.js +283 -0
  74. package/dist/config/companion.config.d.ts +41 -0
  75. package/dist/config/companion.config.d.ts.map +1 -0
  76. package/dist/config/companion.config.js +61 -0
  77. package/dist/config/cors.config.d.ts +22 -0
  78. package/dist/config/cors.config.d.ts.map +1 -0
  79. package/dist/config/cors.config.js +11 -0
  80. package/dist/config/crontab.config.d.ts +22 -0
  81. package/dist/config/crontab.config.d.ts.map +1 -0
  82. package/dist/config/crontab.config.js +18 -0
  83. package/dist/config/csp.config.d.ts +53 -0
  84. package/dist/config/csp.config.d.ts.map +1 -0
  85. package/dist/config/csp.config.js +32 -0
  86. package/dist/config/custom.config.d.ts +16 -0
  87. package/dist/config/custom.config.d.ts.map +1 -0
  88. package/dist/config/custom.config.js +22 -0
  89. package/dist/config/custom_cache.config.d.ts +14 -0
  90. package/dist/config/custom_cache.config.d.ts.map +1 -0
  91. package/dist/config/custom_cache.config.js +13 -0
  92. package/dist/config/dashboardtype.config.d.ts +45 -0
  93. package/dist/config/dashboardtype.config.d.ts.map +1 -0
  94. package/dist/config/dashboardtype.config.js +98 -0
  95. package/dist/config/datacite.config.d.ts +51 -0
  96. package/dist/config/datacite.config.d.ts.map +1 -0
  97. package/dist/config/datacite.config.js +44 -0
  98. package/dist/config/datapubs.config.d.ts +72 -0
  99. package/dist/config/datapubs.config.d.ts.map +1 -0
  100. package/dist/config/datapubs.config.js +74 -0
  101. package/dist/config/datastores.config.d.ts +20 -0
  102. package/dist/config/datastores.config.d.ts.map +1 -0
  103. package/dist/config/datastores.config.js +21 -0
  104. package/dist/config/dompurify.config.d.ts +65 -0
  105. package/dist/config/dompurify.config.d.ts.map +1 -0
  106. package/dist/config/dompurify.config.js +181 -0
  107. package/dist/config/dynamicasset.config.d.ts +13 -0
  108. package/dist/config/dynamicasset.config.d.ts.map +1 -0
  109. package/dist/config/dynamicasset.config.js +18 -0
  110. package/dist/config/dynamicconfig.config.d.ts +12 -0
  111. package/dist/config/dynamicconfig.config.d.ts.map +1 -0
  112. package/dist/config/dynamicconfig.config.js +13 -0
  113. package/dist/config/emailnotification.config.d.ts +49 -0
  114. package/dist/config/emailnotification.config.d.ts.map +1 -0
  115. package/dist/config/emailnotification.config.js +37 -0
  116. package/dist/config/figshareAPI.config.d.ts +116 -0
  117. package/dist/config/figshareAPI.config.d.ts.map +1 -0
  118. package/dist/config/figshareAPI.config.js +857 -0
  119. package/dist/config/figshareAPIEnv.config.d.ts +11 -0
  120. package/dist/config/figshareAPIEnv.config.d.ts.map +1 -0
  121. package/dist/config/figshareAPIEnv.config.js +13 -0
  122. package/dist/config/figshareDev.config.d.ts.map +1 -0
  123. package/dist/config/figshareRedboxFORMapping.config.d.ts +15 -0
  124. package/dist/config/figshareRedboxFORMapping.config.d.ts.map +1 -0
  125. package/dist/config/figshareRedboxFORMapping.config.js +7458 -0
  126. package/dist/config/form.config.d.ts +20 -0
  127. package/dist/config/form.config.d.ts.map +1 -0
  128. package/dist/config/form.config.js +11 -0
  129. package/dist/config/globals.config.d.ts +20 -0
  130. package/dist/config/globals.config.d.ts.map +1 -0
  131. package/dist/config/globals.config.js +52 -0
  132. package/dist/config/http.config.d.ts +57 -0
  133. package/dist/config/http.config.d.ts.map +1 -0
  134. package/dist/config/http.config.js +462 -0
  135. package/dist/config/i18n.config.d.ts +38 -0
  136. package/dist/config/i18n.config.d.ts.map +1 -0
  137. package/dist/config/i18n.config.js +30 -0
  138. package/dist/config/index.d.ts +306 -0
  139. package/dist/config/index.d.ts.map +1 -0
  140. package/dist/config/index.js +240 -0
  141. package/dist/config/jsonld.config.d.ts +19 -0
  142. package/dist/config/jsonld.config.d.ts.map +1 -0
  143. package/dist/config/jsonld.config.js +33 -0
  144. package/dist/config/log.config.d.ts +20 -0
  145. package/dist/config/log.config.d.ts.map +1 -0
  146. package/dist/config/log.config.js +157 -0
  147. package/dist/config/lognamespace.config.d.ts +13 -0
  148. package/dist/config/lognamespace.config.d.ts.map +1 -0
  149. package/dist/config/lognamespace.config.js +17 -0
  150. package/dist/config/mint.config.d.ts +23 -0
  151. package/dist/config/mint.config.d.ts.map +1 -0
  152. package/dist/config/mint.config.js +20 -0
  153. package/dist/config/models.config.d.ts +37 -0
  154. package/dist/config/models.config.d.ts.map +1 -0
  155. package/dist/config/models.config.js +23 -0
  156. package/dist/config/namedQuery.config.d.ts +26 -0
  157. package/dist/config/namedQuery.config.d.ts.map +1 -0
  158. package/dist/config/namedQuery.config.js +358 -0
  159. package/dist/config/ng2.config.d.ts +11 -0
  160. package/dist/config/ng2.config.d.ts.map +1 -0
  161. package/dist/config/ng2.config.js +12 -0
  162. package/dist/config/orcid.config.d.ts +12 -0
  163. package/dist/config/orcid.config.d.ts.map +1 -0
  164. package/dist/config/orcid.config.js +13 -0
  165. package/dist/config/orm.config.d.ts +12 -0
  166. package/dist/config/orm.config.d.ts.map +1 -0
  167. package/dist/config/orm.config.js +13 -0
  168. package/dist/config/peopleSearch.config.d.ts +14 -0
  169. package/dist/config/peopleSearch.config.d.ts.map +1 -0
  170. package/dist/config/peopleSearch.config.js +15 -0
  171. package/dist/config/policies.config.d.ts +18 -0
  172. package/dist/config/policies.config.d.ts.map +1 -0
  173. package/dist/config/policies.config.js +65 -0
  174. package/dist/config/queue.config.d.ts +12 -0
  175. package/dist/config/queue.config.d.ts.map +1 -0
  176. package/dist/config/queue.config.js +13 -0
  177. package/dist/config/raid.config.d.ts +66 -0
  178. package/dist/config/raid.config.d.ts.map +1 -0
  179. package/dist/config/raid.config.js +272 -0
  180. package/dist/config/record.config.d.ts +74 -0
  181. package/dist/config/record.config.d.ts.map +1 -0
  182. package/dist/config/record.config.js +104 -0
  183. package/dist/config/recordtype.config.d.ts +66 -0
  184. package/dist/config/recordtype.config.d.ts.map +1 -0
  185. package/dist/config/recordtype.config.js +660 -0
  186. package/dist/config/redboxSession.config.d.ts +29 -0
  187. package/dist/config/redboxSession.config.d.ts.map +1 -0
  188. package/dist/config/redboxSession.config.js +14 -0
  189. package/dist/config/redboxToCkan.config.d.ts +17 -0
  190. package/dist/config/redboxToCkan.config.d.ts.map +1 -0
  191. package/dist/config/redboxToCkan.config.js +18 -0
  192. package/dist/config/relatedObjectsFormDefinition.config.d.ts.map +1 -0
  193. package/dist/config/report.config.d.ts +46 -0
  194. package/dist/config/report.config.d.ts.map +1 -0
  195. package/dist/config/report.config.js +54 -0
  196. package/dist/config/reusableContributorFormDefinitions.config.d.ts +3 -0
  197. package/dist/config/reusableContributorFormDefinitions.config.d.ts.map +1 -0
  198. package/dist/config/reusableContributorFormDefinitions.config.js +408 -0
  199. package/dist/config/reusableFormDefinitions.config.d.ts +16 -0
  200. package/dist/config/reusableFormDefinitions.config.d.ts.map +1 -0
  201. package/dist/config/reusableFormDefinitions.config.js +41 -0
  202. package/dist/config/reusableRelatedObjectsFormDefinitions.config.d.ts +22 -0
  203. package/dist/config/reusableRelatedObjectsFormDefinitions.config.d.ts.map +1 -0
  204. package/dist/config/reusableRelatedObjectsFormDefinitions.config.js +291 -0
  205. package/dist/config/reusableViewFormDefinitions.config.d.ts +3 -0
  206. package/dist/config/reusableViewFormDefinitions.config.d.ts.map +1 -0
  207. package/dist/config/reusableViewFormDefinitions.config.js +140 -0
  208. package/dist/config/routes.config.d.ts +21 -0
  209. package/dist/config/routes.config.d.ts.map +1 -0
  210. package/dist/config/routes.config.js +389 -0
  211. package/dist/config/search.config.d.ts +9 -0
  212. package/dist/config/search.config.d.ts.map +1 -0
  213. package/dist/config/search.config.js +11 -0
  214. package/dist/config/security.config.d.ts +22 -0
  215. package/dist/config/security.config.d.ts.map +1 -0
  216. package/dist/config/security.config.js +14 -0
  217. package/dist/config/session.config.d.ts +37 -0
  218. package/dist/config/session.config.d.ts.map +1 -0
  219. package/dist/config/session.config.js +11 -0
  220. package/dist/config/sockets.config.d.ts +17 -0
  221. package/dist/config/sockets.config.d.ts.map +1 -0
  222. package/dist/config/sockets.config.js +12 -0
  223. package/dist/config/solr.config.d.ts +73 -0
  224. package/dist/config/solr.config.d.ts.map +1 -0
  225. package/dist/config/solr.config.js +79 -0
  226. package/dist/config/static_assets.config.d.ts +10 -0
  227. package/dist/config/static_assets.config.d.ts.map +1 -0
  228. package/dist/config/static_assets.config.js +12 -0
  229. package/dist/config/storage.config.d.ts +42 -0
  230. package/dist/config/storage.config.d.ts.map +1 -0
  231. package/dist/config/storage.config.js +30 -0
  232. package/dist/config/typescript.config.d.ts +12 -0
  233. package/dist/config/typescript.config.d.ts.map +1 -0
  234. package/dist/config/typescript.config.js +13 -0
  235. package/dist/config/validators.config.d.ts +13 -0
  236. package/dist/config/validators.config.d.ts.map +1 -0
  237. package/dist/config/validators.config.js +15 -0
  238. package/dist/config/views.config.d.ts +20 -0
  239. package/dist/config/views.config.d.ts.map +1 -0
  240. package/dist/config/views.config.js +20 -0
  241. package/dist/config/vocab.config.d.ts +58 -0
  242. package/dist/config/vocab.config.d.ts.map +1 -0
  243. package/dist/config/vocab.config.js +58 -0
  244. package/dist/config/webpack.config.d.ts +16 -0
  245. package/dist/config/webpack.config.d.ts.map +1 -0
  246. package/dist/config/webpack.config.js +153 -0
  247. package/dist/config/workflow.config.d.ts +76 -0
  248. package/dist/config/workflow.config.d.ts.map +1 -0
  249. package/dist/config/workflow.config.js +339 -0
  250. package/dist/config/workspacetype.config.d.ts +23 -0
  251. package/dist/config/workspacetype.config.d.ts.map +1 -0
  252. package/dist/config/workspacetype.config.js +19 -0
  253. package/dist/configmodels/AdminSidebarConfig.d.ts +352 -0
  254. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -0
  255. package/dist/configmodels/AdminSidebarConfig.js +163 -0
  256. package/dist/configmodels/AppConfig.interface.d.ts +4 -0
  257. package/dist/configmodels/AppConfig.interface.d.ts.map +1 -0
  258. package/dist/configmodels/AppConfig.interface.js +10 -0
  259. package/dist/configmodels/AuthorizedDomainsEmails.d.ts +43 -0
  260. package/dist/configmodels/AuthorizedDomainsEmails.d.ts.map +1 -0
  261. package/dist/configmodels/AuthorizedDomainsEmails.js +49 -0
  262. package/dist/configmodels/ConfigModels.d.ts +22 -0
  263. package/dist/configmodels/ConfigModels.d.ts.map +1 -0
  264. package/dist/configmodels/ConfigModels.js +98 -0
  265. package/dist/configmodels/DoiPublishing.d.ts.map +1 -0
  266. package/dist/configmodels/FigsharePublishing.d.ts.map +1 -0
  267. package/dist/configmodels/HomePanelConfig.d.ts +244 -0
  268. package/dist/configmodels/HomePanelConfig.d.ts.map +1 -0
  269. package/dist/configmodels/HomePanelConfig.js +132 -0
  270. package/dist/configmodels/MenuConfig.d.ts +203 -0
  271. package/dist/configmodels/MenuConfig.d.ts.map +1 -0
  272. package/dist/configmodels/MenuConfig.js +158 -0
  273. package/dist/configmodels/SystemMessage.d.ts +24 -0
  274. package/dist/configmodels/SystemMessage.d.ts.map +1 -0
  275. package/dist/configmodels/SystemMessage.js +30 -0
  276. package/dist/controllers/ActionController.d.ts +21 -0
  277. package/dist/controllers/ActionController.d.ts.map +1 -0
  278. package/dist/controllers/ActionController.js +41 -0
  279. package/dist/controllers/AdminController.d.ts +45 -0
  280. package/dist/controllers/AdminController.d.ts.map +1 -0
  281. package/dist/controllers/AdminController.js +498 -0
  282. package/dist/controllers/AppConfigController.d.ts +25 -0
  283. package/dist/controllers/AppConfigController.d.ts.map +1 -0
  284. package/dist/controllers/AppConfigController.js +90 -0
  285. package/dist/controllers/AsynchController.d.ts +30 -0
  286. package/dist/controllers/AsynchController.d.ts.map +1 -0
  287. package/dist/controllers/AsynchController.js +146 -0
  288. package/dist/controllers/BrandingAppController.d.ts +21 -0
  289. package/dist/controllers/BrandingAppController.d.ts.map +1 -0
  290. package/dist/controllers/BrandingAppController.js +144 -0
  291. package/dist/controllers/BrandingController.d.ts +64 -0
  292. package/dist/controllers/BrandingController.d.ts.map +1 -0
  293. package/dist/controllers/BrandingController.js +256 -0
  294. package/dist/controllers/DynamicAssetController.d.ts +67 -0
  295. package/dist/controllers/DynamicAssetController.d.ts.map +1 -0
  296. package/dist/controllers/DynamicAssetController.js +225 -0
  297. package/dist/controllers/EmailController.d.ts +35 -0
  298. package/dist/controllers/EmailController.d.ts.map +1 -0
  299. package/dist/controllers/EmailController.js +138 -0
  300. package/dist/controllers/ExportController.d.ts +22 -0
  301. package/dist/controllers/ExportController.d.ts.map +1 -0
  302. package/dist/controllers/ExportController.js +73 -0
  303. package/dist/controllers/FormVocabularyController.d.ts +12 -0
  304. package/dist/controllers/FormVocabularyController.d.ts.map +1 -0
  305. package/dist/controllers/FormVocabularyController.js +218 -0
  306. package/dist/controllers/RecordAuditController.d.ts +25 -0
  307. package/dist/controllers/RecordAuditController.d.ts.map +1 -0
  308. package/dist/controllers/RecordAuditController.js +74 -0
  309. package/dist/controllers/RecordController.d.ts +114 -0
  310. package/dist/controllers/RecordController.d.ts.map +1 -0
  311. package/dist/controllers/RecordController.js +1614 -0
  312. package/dist/controllers/RenderViewController.d.ts +14 -0
  313. package/dist/controllers/RenderViewController.d.ts.map +1 -0
  314. package/dist/controllers/RenderViewController.js +30 -0
  315. package/dist/controllers/ReportController.d.ts +25 -0
  316. package/dist/controllers/ReportController.d.ts.map +1 -0
  317. package/dist/controllers/ReportController.js +80 -0
  318. package/dist/controllers/ReportsController.d.ts +22 -0
  319. package/dist/controllers/ReportsController.d.ts.map +1 -0
  320. package/dist/controllers/ReportsController.js +37 -0
  321. package/dist/controllers/TranslationController.d.ts +27 -0
  322. package/dist/controllers/TranslationController.d.ts.map +1 -0
  323. package/dist/controllers/TranslationController.js +245 -0
  324. package/dist/controllers/UserController.d.ts +50 -0
  325. package/dist/controllers/UserController.d.ts.map +1 -0
  326. package/dist/controllers/UserController.js +518 -0
  327. package/dist/controllers/VocabController.d.ts +43 -0
  328. package/dist/controllers/VocabController.d.ts.map +1 -0
  329. package/dist/controllers/VocabController.js +190 -0
  330. package/dist/controllers/VocabularyController.d.ts +23 -0
  331. package/dist/controllers/VocabularyController.d.ts.map +1 -0
  332. package/dist/controllers/VocabularyController.js +344 -0
  333. package/dist/controllers/WorkspaceAsyncController.d.ts +18 -0
  334. package/dist/controllers/WorkspaceAsyncController.d.ts.map +1 -0
  335. package/dist/controllers/WorkspaceAsyncController.js +63 -0
  336. package/dist/controllers/WorkspaceTypesController.d.ts +19 -0
  337. package/dist/controllers/WorkspaceTypesController.d.ts.map +1 -0
  338. package/dist/controllers/WorkspaceTypesController.js +96 -0
  339. package/dist/controllers/index.d.ts +8 -0
  340. package/dist/controllers/index.d.ts.map +1 -0
  341. package/dist/controllers/index.js +159 -0
  342. package/dist/controllers/webservice/AdminController.d.ts +20 -0
  343. package/dist/controllers/webservice/AdminController.d.ts.map +1 -0
  344. package/dist/controllers/webservice/AdminController.js +83 -0
  345. package/dist/controllers/webservice/AppConfigController.d.ts +25 -0
  346. package/dist/controllers/webservice/AppConfigController.d.ts.map +1 -0
  347. package/dist/controllers/webservice/AppConfigController.js +72 -0
  348. package/dist/controllers/webservice/BrandingController.d.ts +13 -0
  349. package/dist/controllers/webservice/BrandingController.d.ts.map +1 -0
  350. package/dist/controllers/webservice/BrandingController.js +147 -0
  351. package/dist/controllers/webservice/ExportController.d.ts +22 -0
  352. package/dist/controllers/webservice/ExportController.d.ts.map +1 -0
  353. package/dist/controllers/webservice/ExportController.js +67 -0
  354. package/dist/controllers/webservice/FormManagementController.d.ts +24 -0
  355. package/dist/controllers/webservice/FormManagementController.d.ts.map +1 -0
  356. package/dist/controllers/webservice/FormManagementController.js +79 -0
  357. package/dist/controllers/webservice/IntegrationAuditController.d.ts.map +1 -0
  358. package/dist/controllers/webservice/RecordController.d.ts +65 -0
  359. package/dist/controllers/webservice/RecordController.d.ts.map +1 -0
  360. package/dist/controllers/webservice/RecordController.js +1348 -0
  361. package/dist/controllers/webservice/RecordTypeController.d.ts +24 -0
  362. package/dist/controllers/webservice/RecordTypeController.d.ts.map +1 -0
  363. package/dist/controllers/webservice/RecordTypeController.js +70 -0
  364. package/dist/controllers/webservice/ReportController.d.ts +22 -0
  365. package/dist/controllers/webservice/ReportController.d.ts.map +1 -0
  366. package/dist/controllers/webservice/ReportController.js +74 -0
  367. package/dist/controllers/webservice/SearchController.d.ts +28 -0
  368. package/dist/controllers/webservice/SearchController.d.ts.map +1 -0
  369. package/dist/controllers/webservice/SearchController.js +123 -0
  370. package/dist/controllers/webservice/TranslationController.d.ts +18 -0
  371. package/dist/controllers/webservice/TranslationController.d.ts.map +1 -0
  372. package/dist/controllers/webservice/TranslationController.js +226 -0
  373. package/dist/controllers/webservice/UserManagementController.d.ts +38 -0
  374. package/dist/controllers/webservice/UserManagementController.d.ts.map +1 -0
  375. package/dist/controllers/webservice/UserManagementController.js +608 -0
  376. package/dist/controllers/webservice/VocabularyController.d.ts +18 -0
  377. package/dist/controllers/webservice/VocabularyController.d.ts.map +1 -0
  378. package/dist/controllers/webservice/VocabularyController.js +172 -0
  379. package/dist/decorator/PopulateExportedMethods.decorator.d.ts +4 -0
  380. package/dist/decorator/PopulateExportedMethods.decorator.d.ts.map +1 -0
  381. package/dist/decorator/PopulateExportedMethods.decorator.js +22 -0
  382. package/dist/decorator/index.d.ts +2 -0
  383. package/dist/decorator/index.d.ts.map +1 -0
  384. package/dist/decorator/index.js +6 -0
  385. package/dist/decorators/Associations.d.ts +4 -0
  386. package/dist/decorators/Associations.d.ts.map +1 -0
  387. package/dist/decorators/Associations.js +12 -0
  388. package/dist/decorators/Attr.d.ts +4 -0
  389. package/dist/decorators/Attr.d.ts.map +1 -0
  390. package/dist/decorators/Attr.js +34 -0
  391. package/dist/decorators/Entity.d.ts +3 -0
  392. package/dist/decorators/Entity.d.ts.map +1 -0
  393. package/dist/decorators/Entity.js +29 -0
  394. package/dist/decorators/Lifecycle.d.ts +10 -0
  395. package/dist/decorators/Lifecycle.d.ts.map +1 -0
  396. package/dist/decorators/Lifecycle.js +26 -0
  397. package/dist/decorators/index.d.ts +8 -0
  398. package/dist/decorators/index.d.ts.map +1 -0
  399. package/dist/decorators/index.js +35 -0
  400. package/dist/decorators/registry.d.ts +8 -0
  401. package/dist/decorators/registry.d.ts.map +1 -0
  402. package/dist/decorators/registry.js +68 -0
  403. package/dist/decorators/types.d.ts +81 -0
  404. package/dist/decorators/types.d.ts.map +1 -0
  405. package/dist/decorators/types.js +4 -0
  406. package/dist/decorators/utils.d.ts +5 -0
  407. package/dist/decorators/utils.d.ts.map +1 -0
  408. package/dist/decorators/utils.js +68 -0
  409. package/dist/form-config/dataPublication-1.0-draft.d.ts.map +1 -0
  410. package/dist/form-config/dataPublication-1.0-embargoed.d.ts.map +1 -0
  411. package/dist/form-config/dataPublication-1.0-published.d.ts.map +1 -0
  412. package/dist/form-config/dataPublication-1.0-queued.d.ts.map +1 -0
  413. package/dist/form-config/dataPublication-1.0-retired.d.ts.map +1 -0
  414. package/dist/form-config/dataRecord-1.0-draft.d.ts +4 -0
  415. package/dist/form-config/dataRecord-1.0-draft.d.ts.map +1 -0
  416. package/dist/form-config/dataRecord-1.0-draft.js +1042 -0
  417. package/dist/form-config/default-1.0-draft.d.ts +4 -0
  418. package/dist/form-config/default-1.0-draft.d.ts.map +1 -0
  419. package/dist/form-config/default-1.0-draft.js +1132 -0
  420. package/dist/form-config/generated-view-only.d.ts +12 -0
  421. package/dist/form-config/generated-view-only.d.ts.map +1 -0
  422. package/dist/form-config/generated-view-only.js +169 -0
  423. package/dist/form-config/index.d.ts +3 -0
  424. package/dist/form-config/index.d.ts.map +1 -0
  425. package/dist/form-config/index.js +15 -0
  426. package/dist/hooks/defineRedboxHook.d.ts +31 -0
  427. package/dist/hooks/defineRedboxHook.d.ts.map +1 -0
  428. package/dist/hooks/defineRedboxHook.js +47 -0
  429. package/dist/hooks/index.d.ts +9 -0
  430. package/dist/hooks/index.d.ts.map +1 -0
  431. package/dist/hooks/index.js +13 -0
  432. package/dist/hooks/webpack.d.ts +27 -0
  433. package/dist/hooks/webpack.d.ts.map +1 -0
  434. package/dist/hooks/webpack.js +82 -0
  435. package/dist/index.d.ts +58 -0
  436. package/dist/index.d.ts.map +1 -0
  437. package/dist/index.js +116 -0
  438. package/dist/loader/bootstrapShimRuntime.d.ts +8 -0
  439. package/dist/loader/bootstrapShimRuntime.d.ts.map +1 -0
  440. package/dist/loader/bootstrapShimRuntime.js +83 -0
  441. package/dist/loader/index.d.ts +93 -0
  442. package/dist/loader/index.d.ts.map +1 -0
  443. package/dist/loader/index.js +767 -0
  444. package/dist/middleware/redboxSession.d.ts +6 -0
  445. package/dist/middleware/redboxSession.d.ts.map +1 -0
  446. package/dist/middleware/redboxSession.js +60 -0
  447. package/dist/model/APIActionResponse.d.ts +6 -0
  448. package/dist/model/APIActionResponse.d.ts.map +1 -0
  449. package/dist/model/APIActionResponse.js +13 -0
  450. package/dist/model/APIErrorResponse.d.ts +6 -0
  451. package/dist/model/APIErrorResponse.d.ts.map +1 -0
  452. package/dist/model/APIErrorResponse.js +13 -0
  453. package/dist/model/APIHarvestResponse.d.ts +9 -0
  454. package/dist/model/APIHarvestResponse.d.ts.map +1 -0
  455. package/dist/model/APIHarvestResponse.js +19 -0
  456. package/dist/model/APIObjectActionResponse.d.ts +7 -0
  457. package/dist/model/APIObjectActionResponse.d.ts.map +1 -0
  458. package/dist/model/APIObjectActionResponse.js +15 -0
  459. package/dist/model/BuildResponse.d.ts +47 -0
  460. package/dist/model/BuildResponse.d.ts.map +1 -0
  461. package/dist/model/BuildResponse.js +5 -0
  462. package/dist/model/DashboardTypeResponseModel.d.ts +6 -0
  463. package/dist/model/DashboardTypeResponseModel.d.ts.map +1 -0
  464. package/dist/model/DashboardTypeResponseModel.js +13 -0
  465. package/dist/model/ListAPIResponse.d.ts +7 -0
  466. package/dist/model/ListAPIResponse.d.ts.map +1 -0
  467. package/dist/model/ListAPIResponse.js +12 -0
  468. package/dist/model/ListAPISummary.d.ts +7 -0
  469. package/dist/model/ListAPISummary.d.ts.map +1 -0
  470. package/dist/model/ListAPISummary.js +12 -0
  471. package/dist/model/RBValidationError.d.ts +62 -0
  472. package/dist/model/RBValidationError.d.ts.map +1 -0
  473. package/dist/model/RBValidationError.js +98 -0
  474. package/dist/model/RecordTypeResponseModel.d.ts +10 -0
  475. package/dist/model/RecordTypeResponseModel.d.ts.map +1 -0
  476. package/dist/model/RecordTypeResponseModel.js +19 -0
  477. package/dist/model/RequestDetails.d.ts +27 -0
  478. package/dist/model/RequestDetails.d.ts.map +1 -0
  479. package/dist/model/RequestDetails.js +53 -0
  480. package/dist/model/SolrDocument.d.ts +17 -0
  481. package/dist/model/SolrDocument.d.ts.map +1 -0
  482. package/dist/model/SolrDocument.js +30 -0
  483. package/dist/model/api/APIResponseVersion2.d.ts +107 -0
  484. package/dist/model/api/APIResponseVersion2.d.ts.map +1 -0
  485. package/dist/model/api/APIResponseVersion2.js +3 -0
  486. package/dist/model/api/APIVersions.d.ts +9 -0
  487. package/dist/model/api/APIVersions.d.ts.map +1 -0
  488. package/dist/model/api/APIVersions.js +11 -0
  489. package/dist/model/api/CreateUserAPIResponse.d.ts +9 -0
  490. package/dist/model/api/CreateUserAPIResponse.d.ts.map +1 -0
  491. package/dist/model/api/CreateUserAPIResponse.js +13 -0
  492. package/dist/model/api/FigshareArticleCreate.d.ts +11 -0
  493. package/dist/model/api/FigshareArticleCreate.d.ts.map +1 -0
  494. package/dist/model/api/FigshareArticleCreate.js +16 -0
  495. package/dist/model/api/FigshareArticleEmbargo.d.ts +11 -0
  496. package/dist/model/api/FigshareArticleEmbargo.d.ts.map +1 -0
  497. package/dist/model/api/FigshareArticleEmbargo.js +23 -0
  498. package/dist/model/api/FigshareArticleUpdate.d.ts +13 -0
  499. package/dist/model/api/FigshareArticleUpdate.d.ts.map +1 -0
  500. package/dist/model/api/FigshareArticleUpdate.js +20 -0
  501. package/dist/model/api/UserAPITokenAPIResponse.d.ts +6 -0
  502. package/dist/model/api/UserAPITokenAPIResponse.d.ts.map +1 -0
  503. package/dist/model/api/UserAPITokenAPIResponse.js +10 -0
  504. package/dist/model/api/index.d.ts +8 -0
  505. package/dist/model/api/index.d.ts.map +1 -0
  506. package/dist/model/api/index.js +16 -0
  507. package/dist/model/config/ReportConfig.d.ts +50 -0
  508. package/dist/model/config/ReportConfig.d.ts.map +1 -0
  509. package/dist/model/config/ReportConfig.js +58 -0
  510. package/dist/model/config/SolrConfig.d.ts +72 -0
  511. package/dist/model/config/SolrConfig.d.ts.map +1 -0
  512. package/dist/model/config/SolrConfig.js +41 -0
  513. package/dist/model/config/VocabQueryConfig.d.ts +30 -0
  514. package/dist/model/config/VocabQueryConfig.d.ts.map +1 -0
  515. package/dist/model/config/VocabQueryConfig.js +32 -0
  516. package/dist/model/config/index.d.ts +4 -0
  517. package/dist/model/config/index.d.ts.map +1 -0
  518. package/dist/model/config/index.js +20 -0
  519. package/dist/model/index.d.ts +16 -0
  520. package/dist/model/index.d.ts.map +1 -0
  521. package/dist/model/index.js +45 -0
  522. package/dist/model/storage/AppConfigModel.d.ts +9 -0
  523. package/dist/model/storage/AppConfigModel.d.ts.map +1 -0
  524. package/dist/model/storage/AppConfigModel.js +3 -0
  525. package/dist/model/storage/AsynchProgressModel.d.ts +18 -0
  526. package/dist/model/storage/AsynchProgressModel.d.ts.map +1 -0
  527. package/dist/model/storage/AsynchProgressModel.js +3 -0
  528. package/dist/model/storage/BrandingModel.d.ts +24 -0
  529. package/dist/model/storage/BrandingModel.d.ts.map +1 -0
  530. package/dist/model/storage/BrandingModel.js +60 -0
  531. package/dist/model/storage/CacheEntryModel.d.ts +6 -0
  532. package/dist/model/storage/CacheEntryModel.d.ts.map +1 -0
  533. package/dist/model/storage/CacheEntryModel.js +3 -0
  534. package/dist/model/storage/CounterModel.d.ts +7 -0
  535. package/dist/model/storage/CounterModel.d.ts.map +1 -0
  536. package/dist/model/storage/CounterModel.js +3 -0
  537. package/dist/model/storage/DashboardTypeModel.d.ts +9 -0
  538. package/dist/model/storage/DashboardTypeModel.d.ts.map +1 -0
  539. package/dist/model/storage/DashboardTypeModel.js +3 -0
  540. package/dist/model/storage/DeletedRecordModel.d.ts +7 -0
  541. package/dist/model/storage/DeletedRecordModel.d.ts.map +1 -0
  542. package/dist/model/storage/DeletedRecordModel.js +3 -0
  543. package/dist/model/storage/IntegrationAuditModel.d.ts.map +1 -0
  544. package/dist/model/storage/NamedQueryModel.d.ts +13 -0
  545. package/dist/model/storage/NamedQueryModel.d.ts.map +1 -0
  546. package/dist/model/storage/NamedQueryModel.js +17 -0
  547. package/dist/model/storage/RecordAuditModel.d.ts +15 -0
  548. package/dist/model/storage/RecordAuditModel.d.ts.map +1 -0
  549. package/dist/model/storage/RecordAuditModel.js +28 -0
  550. package/dist/model/storage/RecordModel.d.ts +42 -0
  551. package/dist/model/storage/RecordModel.d.ts.map +1 -0
  552. package/dist/model/storage/RecordModel.js +3 -0
  553. package/dist/model/storage/RecordTypeModel.d.ts +36 -0
  554. package/dist/model/storage/RecordTypeModel.d.ts.map +1 -0
  555. package/dist/model/storage/RecordTypeModel.js +43 -0
  556. package/dist/model/storage/ReportModel.d.ts +5 -0
  557. package/dist/model/storage/ReportModel.d.ts.map +1 -0
  558. package/dist/model/storage/ReportModel.js +3 -0
  559. package/dist/model/storage/RoleModel.d.ts +9 -0
  560. package/dist/model/storage/RoleModel.d.ts.map +1 -0
  561. package/dist/model/storage/RoleModel.js +12 -0
  562. package/dist/model/storage/UserAuditModel.d.ts +9 -0
  563. package/dist/model/storage/UserAuditModel.d.ts.map +1 -0
  564. package/dist/model/storage/UserAuditModel.js +3 -0
  565. package/dist/model/storage/UserLinkModel.d.ts +14 -0
  566. package/dist/model/storage/UserLinkModel.d.ts.map +1 -0
  567. package/dist/model/storage/UserLinkModel.js +18 -0
  568. package/dist/model/storage/UserModel.d.ts +25 -0
  569. package/dist/model/storage/UserModel.d.ts.map +1 -0
  570. package/dist/model/storage/UserModel.js +26 -0
  571. package/dist/model/storage/WorkflowStepModel.d.ts +11 -0
  572. package/dist/model/storage/WorkflowStepModel.d.ts.map +1 -0
  573. package/dist/model/storage/WorkflowStepModel.js +3 -0
  574. package/dist/model/storage/WorkspaceAppModel.d.ts +8 -0
  575. package/dist/model/storage/WorkspaceAppModel.d.ts.map +1 -0
  576. package/dist/model/storage/WorkspaceAppModel.js +3 -0
  577. package/dist/model/storage/index.d.ts +18 -0
  578. package/dist/model/storage/index.d.ts.map +1 -0
  579. package/dist/model/storage/index.js +19 -0
  580. package/dist/policies/brandingAndPortal.d.ts +9 -0
  581. package/dist/policies/brandingAndPortal.d.ts.map +1 -0
  582. package/dist/policies/brandingAndPortal.js +34 -0
  583. package/dist/policies/checkAuth.d.ts +9 -0
  584. package/dist/policies/checkAuth.d.ts.map +1 -0
  585. package/dist/policies/checkAuth.js +64 -0
  586. package/dist/policies/checkBrandingValid.d.ts +9 -0
  587. package/dist/policies/checkBrandingValid.d.ts.map +1 -0
  588. package/dist/policies/checkBrandingValid.js +40 -0
  589. package/dist/policies/companionAttachmentUploadAuth.d.ts +9 -0
  590. package/dist/policies/companionAttachmentUploadAuth.d.ts.map +1 -0
  591. package/dist/policies/companionAttachmentUploadAuth.js +221 -0
  592. package/dist/policies/contentSecurityPolicy.d.ts +23 -0
  593. package/dist/policies/contentSecurityPolicy.d.ts.map +1 -0
  594. package/dist/policies/contentSecurityPolicy.js +135 -0
  595. package/dist/policies/disallowedHeadRequestHandler.d.ts +8 -0
  596. package/dist/policies/disallowedHeadRequestHandler.d.ts.map +1 -0
  597. package/dist/policies/disallowedHeadRequestHandler.js +17 -0
  598. package/dist/policies/i18nLanguages.d.ts +8 -0
  599. package/dist/policies/i18nLanguages.d.ts.map +1 -0
  600. package/dist/policies/i18nLanguages.js +56 -0
  601. package/dist/policies/index.d.ts +52 -0
  602. package/dist/policies/index.d.ts.map +1 -0
  603. package/dist/policies/index.js +70 -0
  604. package/dist/policies/isAuthenticated.d.ts +9 -0
  605. package/dist/policies/isAuthenticated.d.ts.map +1 -0
  606. package/dist/policies/isAuthenticated.js +19 -0
  607. package/dist/policies/isWebServiceAuthenticated.d.ts +9 -0
  608. package/dist/policies/isWebServiceAuthenticated.d.ts.map +1 -0
  609. package/dist/policies/isWebServiceAuthenticated.js +25 -0
  610. package/dist/policies/menuResolver.d.ts +11 -0
  611. package/dist/policies/menuResolver.d.ts.map +1 -0
  612. package/dist/policies/menuResolver.js +58 -0
  613. package/dist/policies/noCache.d.ts +9 -0
  614. package/dist/policies/noCache.d.ts.map +1 -0
  615. package/dist/policies/noCache.js +34 -0
  616. package/dist/policies/prepWs.d.ts +9 -0
  617. package/dist/policies/prepWs.d.ts.map +1 -0
  618. package/dist/policies/prepWs.js +23 -0
  619. package/dist/policies/sessionAuth.d.ts +11 -0
  620. package/dist/policies/sessionAuth.d.ts.map +1 -0
  621. package/dist/policies/sessionAuth.js +23 -0
  622. package/dist/policies/setLang.d.ts +8 -0
  623. package/dist/policies/setLang.d.ts.map +1 -0
  624. package/dist/policies/setLang.js +13 -0
  625. package/dist/responses/badRequest.d.ts +22 -0
  626. package/dist/responses/badRequest.d.ts.map +1 -0
  627. package/dist/responses/badRequest.js +66 -0
  628. package/dist/responses/created.d.ts +22 -0
  629. package/dist/responses/created.d.ts.map +1 -0
  630. package/dist/responses/created.js +55 -0
  631. package/dist/responses/forbidden.d.ts +22 -0
  632. package/dist/responses/forbidden.d.ts.map +1 -0
  633. package/dist/responses/forbidden.js +66 -0
  634. package/dist/responses/index.d.ts +6 -0
  635. package/dist/responses/index.d.ts.map +1 -0
  636. package/dist/responses/index.js +22 -0
  637. package/dist/responses/ok.d.ts +26 -0
  638. package/dist/responses/ok.d.ts.map +1 -0
  639. package/dist/responses/ok.js +59 -0
  640. package/dist/responses/serverError.d.ts +22 -0
  641. package/dist/responses/serverError.d.ts.map +1 -0
  642. package/dist/responses/serverError.js +66 -0
  643. package/dist/sails.d.ts +238 -0
  644. package/dist/sails.d.ts.map +1 -0
  645. package/dist/sails.js +3 -0
  646. package/dist/services/AgendaQueueService.d.ts +58 -0
  647. package/dist/services/AgendaQueueService.d.ts.map +1 -0
  648. package/dist/services/AgendaQueueService.js +225 -0
  649. package/dist/services/AppConfigService.d.ts +59 -0
  650. package/dist/services/AppConfigService.d.ts.map +1 -0
  651. package/dist/services/AppConfigService.js +273 -0
  652. package/dist/services/AsynchsService.d.ts +20 -0
  653. package/dist/services/AsynchsService.d.ts.map +1 -0
  654. package/dist/services/AsynchsService.js +64 -0
  655. package/dist/services/BrandingLogoService.d.ts +47 -0
  656. package/dist/services/BrandingLogoService.d.ts.map +1 -0
  657. package/dist/services/BrandingLogoService.js +212 -0
  658. package/dist/services/BrandingService.d.ts +70 -0
  659. package/dist/services/BrandingService.d.ts.map +1 -0
  660. package/dist/services/BrandingService.js +332 -0
  661. package/dist/services/CacheService.d.ts +25 -0
  662. package/dist/services/CacheService.d.ts.map +1 -0
  663. package/dist/services/CacheService.js +153 -0
  664. package/dist/services/ConfigService.d.ts +23 -0
  665. package/dist/services/ConfigService.d.ts.map +1 -0
  666. package/dist/services/ConfigService.js +379 -0
  667. package/dist/services/ContrastService.d.ts +77 -0
  668. package/dist/services/ContrastService.d.ts.map +1 -0
  669. package/dist/services/ContrastService.js +218 -0
  670. package/dist/services/DashboardTypesService.d.ts +98 -0
  671. package/dist/services/DashboardTypesService.d.ts.map +1 -0
  672. package/dist/services/DashboardTypesService.js +291 -0
  673. package/dist/services/DoiService.d.ts +36 -0
  674. package/dist/services/DoiService.d.ts.map +1 -0
  675. package/dist/services/DoiService.js +494 -0
  676. package/dist/services/DomSanitizerService.d.ts +105 -0
  677. package/dist/services/DomSanitizerService.d.ts.map +1 -0
  678. package/dist/services/DomSanitizerService.js +506 -0
  679. package/dist/services/EmailService.d.ts +185 -0
  680. package/dist/services/EmailService.d.ts.map +1 -0
  681. package/dist/services/EmailService.js +527 -0
  682. package/dist/services/FigshareService.d.ts +75 -0
  683. package/dist/services/FigshareService.d.ts.map +1 -0
  684. package/dist/services/FigshareService.js +2193 -0
  685. package/dist/services/FormRecordConsistencyService.d.ts +156 -0
  686. package/dist/services/FormRecordConsistencyService.d.ts.map +1 -0
  687. package/dist/services/FormRecordConsistencyService.js +516 -0
  688. package/dist/services/FormsService.d.ts +65 -0
  689. package/dist/services/FormsService.d.ts.map +1 -0
  690. package/dist/services/FormsService.js +580 -0
  691. package/dist/services/I18nEntriesService.d.ts +80 -0
  692. package/dist/services/I18nEntriesService.d.ts.map +1 -0
  693. package/dist/services/I18nEntriesService.js +469 -0
  694. package/dist/services/IntegrationAuditService.d.ts.map +1 -0
  695. package/dist/services/NamedQueryService.d.ts +87 -0
  696. package/dist/services/NamedQueryService.d.ts.map +1 -0
  697. package/dist/services/NamedQueryService.js +396 -0
  698. package/dist/services/NavigationService.d.ts +115 -0
  699. package/dist/services/NavigationService.d.ts.map +1 -0
  700. package/dist/services/NavigationService.js +553 -0
  701. package/dist/services/OniService.d.ts +77 -0
  702. package/dist/services/OniService.d.ts.map +1 -0
  703. package/dist/services/OniService.js +753 -0
  704. package/dist/services/OrcidService.d.ts +30 -0
  705. package/dist/services/OrcidService.d.ts.map +1 -0
  706. package/dist/services/OrcidService.js +126 -0
  707. package/dist/services/PathRulesService.d.ts +57 -0
  708. package/dist/services/PathRulesService.d.ts.map +1 -0
  709. package/dist/services/PathRulesService.js +129 -0
  710. package/dist/services/RDMPService.d.ts +102 -0
  711. package/dist/services/RDMPService.d.ts.map +1 -0
  712. package/dist/services/RDMPService.js +767 -0
  713. package/dist/services/RaidService.d.ts +83 -0
  714. package/dist/services/RaidService.d.ts.map +1 -0
  715. package/dist/services/RaidService.js +556 -0
  716. package/dist/services/RecordTypesService.d.ts +27 -0
  717. package/dist/services/RecordTypesService.d.ts.map +1 -0
  718. package/dist/services/RecordTypesService.js +106 -0
  719. package/dist/services/RecordsService.d.ts +129 -0
  720. package/dist/services/RecordsService.d.ts.map +1 -0
  721. package/dist/services/RecordsService.js +1477 -0
  722. package/dist/services/ReportsService.d.ts +99 -0
  723. package/dist/services/ReportsService.d.ts.map +1 -0
  724. package/dist/services/ReportsService.js +475 -0
  725. package/dist/services/RolesService.d.ts +41 -0
  726. package/dist/services/RolesService.d.ts.map +1 -0
  727. package/dist/services/RolesService.js +171 -0
  728. package/dist/services/RvaImportService.d.ts +56 -0
  729. package/dist/services/RvaImportService.d.ts.map +1 -0
  730. package/dist/services/RvaImportService.js +410 -0
  731. package/dist/services/SassCompilerService.d.ts +26 -0
  732. package/dist/services/SassCompilerService.d.ts.map +1 -0
  733. package/dist/services/SassCompilerService.js +201 -0
  734. package/dist/services/SolrSearchService.d.ts +52 -0
  735. package/dist/services/SolrSearchService.d.ts.map +1 -0
  736. package/dist/services/SolrSearchService.js +463 -0
  737. package/dist/services/StandardDatastreamService.d.ts +66 -0
  738. package/dist/services/StandardDatastreamService.d.ts.map +1 -0
  739. package/dist/services/StandardDatastreamService.js +297 -0
  740. package/dist/services/StorageManagerService.d.ts +90 -0
  741. package/dist/services/StorageManagerService.d.ts.map +1 -0
  742. package/dist/services/StorageManagerService.js +234 -0
  743. package/dist/services/TemplateService.d.ts +65 -0
  744. package/dist/services/TemplateService.d.ts.map +1 -0
  745. package/dist/services/TemplateService.js +208 -0
  746. package/dist/services/TranslationService.d.ts +38 -0
  747. package/dist/services/TranslationService.d.ts.map +1 -0
  748. package/dist/services/TranslationService.js +358 -0
  749. package/dist/services/TriggerService.d.ts +72 -0
  750. package/dist/services/TriggerService.d.ts.map +1 -0
  751. package/dist/services/TriggerService.js +554 -0
  752. package/dist/services/UsersService.d.ts +174 -0
  753. package/dist/services/UsersService.d.ts.map +1 -0
  754. package/dist/services/UsersService.js +2108 -0
  755. package/dist/services/ViewUtilsService.d.ts +36 -0
  756. package/dist/services/ViewUtilsService.d.ts.map +1 -0
  757. package/dist/services/ViewUtilsService.js +120 -0
  758. package/dist/services/VocabService.d.ts +81 -0
  759. package/dist/services/VocabService.d.ts.map +1 -0
  760. package/dist/services/VocabService.js +424 -0
  761. package/dist/services/VocabularyService.d.ts +115 -0
  762. package/dist/services/VocabularyService.d.ts.map +1 -0
  763. package/dist/services/VocabularyService.js +752 -0
  764. package/dist/services/WorkflowStepsService.d.ts +29 -0
  765. package/dist/services/WorkflowStepsService.d.ts.map +1 -0
  766. package/dist/services/WorkflowStepsService.js +110 -0
  767. package/dist/services/WorkspaceAsyncService.d.ts +34 -0
  768. package/dist/services/WorkspaceAsyncService.d.ts.map +1 -0
  769. package/dist/services/WorkspaceAsyncService.js +68 -0
  770. package/dist/services/WorkspaceService.d.ts +67 -0
  771. package/dist/services/WorkspaceService.d.ts.map +1 -0
  772. package/dist/services/WorkspaceService.js +148 -0
  773. package/dist/services/WorkspaceTypesService.d.ts +33 -0
  774. package/dist/services/WorkspaceTypesService.d.ts.map +1 -0
  775. package/dist/services/WorkspaceTypesService.js +89 -0
  776. package/dist/services/doi-v2/audit.d.ts.map +1 -0
  777. package/dist/services/doi-v2/bindings.d.ts.map +1 -0
  778. package/dist/services/doi-v2/config.d.ts.map +1 -0
  779. package/dist/services/doi-v2/context.d.ts.map +1 -0
  780. package/dist/services/doi-v2/http.d.ts.map +1 -0
  781. package/dist/services/doi-v2/payload.d.ts.map +1 -0
  782. package/dist/services/doi-v2/profiles.d.ts.map +1 -0
  783. package/dist/services/doi-v2/runtime.d.ts.map +1 -0
  784. package/dist/services/doi-v2/types.d.ts.map +1 -0
  785. package/dist/services/figshare-v2/assets.d.ts.map +1 -0
  786. package/dist/services/figshare-v2/bindings.d.ts.map +1 -0
  787. package/dist/services/figshare-v2/config.d.ts.map +1 -0
  788. package/dist/services/figshare-v2/context.d.ts.map +1 -0
  789. package/dist/services/figshare-v2/embargo.d.ts.map +1 -0
  790. package/dist/services/figshare-v2/http.d.ts.map +1 -0
  791. package/dist/services/figshare-v2/metadata.d.ts.map +1 -0
  792. package/dist/services/figshare-v2/observability.d.ts.map +1 -0
  793. package/dist/services/figshare-v2/plan.d.ts.map +1 -0
  794. package/dist/services/figshare-v2/publish.d.ts.map +1 -0
  795. package/dist/services/figshare-v2/queue.d.ts.map +1 -0
  796. package/dist/services/figshare-v2/runtime.d.ts.map +1 -0
  797. package/dist/services/figshare-v2/types.d.ts.map +1 -0
  798. package/dist/services/figshare-v2/workflow.d.ts.map +1 -0
  799. package/dist/services/figshare-v2/writeback.d.ts.map +1 -0
  800. package/dist/services/index.d.ts +136 -0
  801. package/dist/services/index.d.ts.map +1 -0
  802. package/dist/services/index.js +276 -0
  803. package/dist/shims/index.d.ts +9 -0
  804. package/dist/shims/index.d.ts.map +1 -0
  805. package/dist/shims/index.js +15 -0
  806. package/dist/shims/momentShim.d.ts +7 -0
  807. package/dist/shims/momentShim.d.ts.map +1 -0
  808. package/dist/shims/momentShim.js +69 -0
  809. package/dist/transformers/ExportJSONTransformer.d.ts +16 -0
  810. package/dist/transformers/ExportJSONTransformer.d.ts.map +1 -0
  811. package/dist/transformers/ExportJSONTransformer.js +90 -0
  812. package/dist/utilities/ContextVariableUtils.d.ts +8 -0
  813. package/dist/utilities/ContextVariableUtils.d.ts.map +1 -0
  814. package/dist/utilities/ContextVariableUtils.js +91 -0
  815. package/dist/utilities/TransactionUtils.d.ts +7 -0
  816. package/dist/utilities/TransactionUtils.d.ts.map +1 -0
  817. package/dist/utilities/TransactionUtils.js +25 -0
  818. package/dist/visitor/attachment-fields.visitor.d.ts +37 -0
  819. package/dist/visitor/attachment-fields.visitor.d.ts.map +1 -0
  820. package/dist/visitor/attachment-fields.visitor.js +93 -0
  821. package/dist/visitor/client.visitor.d.ts +211 -0
  822. package/dist/visitor/client.visitor.d.ts.map +1 -0
  823. package/dist/visitor/client.visitor.js +865 -0
  824. package/dist/visitor/construct.visitor.d.ts +219 -0
  825. package/dist/visitor/construct.visitor.d.ts.map +1 -0
  826. package/dist/visitor/construct.visitor.js +1499 -0
  827. package/dist/visitor/context-variables.visitor.d.ts +51 -0
  828. package/dist/visitor/context-variables.visitor.d.ts.map +1 -0
  829. package/dist/visitor/context-variables.visitor.js +192 -0
  830. package/dist/visitor/data-value.visitor.d.ts +159 -0
  831. package/dist/visitor/data-value.visitor.d.ts.map +1 -0
  832. package/dist/visitor/data-value.visitor.js +310 -0
  833. package/dist/visitor/json-type-def.visitor.d.ts +155 -0
  834. package/dist/visitor/json-type-def.visitor.d.ts.map +1 -0
  835. package/dist/visitor/json-type-def.visitor.js +384 -0
  836. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts +244 -0
  837. package/dist/visitor/migrate-config-v4-v5.visitor.d.ts.map +1 -0
  838. package/dist/visitor/migrate-config-v4-v5.visitor.js +2941 -0
  839. package/dist/visitor/template.visitor.d.ts +163 -0
  840. package/dist/visitor/template.visitor.d.ts.map +1 -0
  841. package/dist/visitor/template.visitor.js +397 -0
  842. package/dist/visitor/validator.visitor.d.ts +123 -0
  843. package/dist/visitor/validator.visitor.d.ts.map +1 -0
  844. package/dist/visitor/validator.visitor.js +480 -0
  845. package/dist/visitor/visitor-helpers.d.ts +15 -0
  846. package/dist/visitor/visitor-helpers.d.ts.map +1 -0
  847. package/dist/visitor/visitor-helpers.js +191 -0
  848. package/dist/visitor/vocab-inline.visitor.d.ts +33 -0
  849. package/dist/visitor/vocab-inline.visitor.d.ts.map +1 -0
  850. package/dist/visitor/vocab-inline.visitor.js +173 -0
  851. package/dist/waterline-models/AppConfig.d.ts +19 -0
  852. package/dist/waterline-models/AppConfig.d.ts.map +1 -0
  853. package/dist/waterline-models/AppConfig.js +38 -0
  854. package/dist/waterline-models/AsynchProgress.d.ts +37 -0
  855. package/dist/waterline-models/AsynchProgress.d.ts.map +1 -0
  856. package/dist/waterline-models/AsynchProgress.js +83 -0
  857. package/dist/waterline-models/BrandingConfig.d.ts +28 -0
  858. package/dist/waterline-models/BrandingConfig.d.ts.map +1 -0
  859. package/dist/waterline-models/BrandingConfig.js +132 -0
  860. package/dist/waterline-models/BrandingConfigHistory.d.ts +25 -0
  861. package/dist/waterline-models/BrandingConfigHistory.d.ts.map +1 -0
  862. package/dist/waterline-models/BrandingConfigHistory.js +66 -0
  863. package/dist/waterline-models/CacheEntry.d.ts +18 -0
  864. package/dist/waterline-models/CacheEntry.d.ts.map +1 -0
  865. package/dist/waterline-models/CacheEntry.js +38 -0
  866. package/dist/waterline-models/Counter.d.ts +19 -0
  867. package/dist/waterline-models/Counter.d.ts.map +1 -0
  868. package/dist/waterline-models/Counter.js +38 -0
  869. package/dist/waterline-models/DashboardType.d.ts +23 -0
  870. package/dist/waterline-models/DashboardType.d.ts.map +1 -0
  871. package/dist/waterline-models/DashboardType.js +53 -0
  872. package/dist/waterline-models/Form.d.ts +21 -0
  873. package/dist/waterline-models/Form.d.ts.map +1 -0
  874. package/dist/waterline-models/Form.js +38 -0
  875. package/dist/waterline-models/I18nBundle.d.ts +29 -0
  876. package/dist/waterline-models/I18nBundle.d.ts.map +1 -0
  877. package/dist/waterline-models/I18nBundle.js +85 -0
  878. package/dist/waterline-models/I18nTranslation.d.ts +32 -0
  879. package/dist/waterline-models/I18nTranslation.d.ts.map +1 -0
  880. package/dist/waterline-models/I18nTranslation.js +110 -0
  881. package/dist/waterline-models/NamedQuery.d.ts +29 -0
  882. package/dist/waterline-models/NamedQuery.d.ts.map +1 -0
  883. package/dist/waterline-models/NamedQuery.js +68 -0
  884. package/dist/waterline-models/PathRule.d.ts +26 -0
  885. package/dist/waterline-models/PathRule.d.ts.map +1 -0
  886. package/dist/waterline-models/PathRule.js +53 -0
  887. package/dist/waterline-models/RBReport.d.ts +38 -0
  888. package/dist/waterline-models/RBReport.d.ts.map +1 -0
  889. package/dist/waterline-models/RBReport.js +73 -0
  890. package/dist/waterline-models/RecordType.d.ts +37 -0
  891. package/dist/waterline-models/RecordType.d.ts.map +1 -0
  892. package/dist/waterline-models/RecordType.js +88 -0
  893. package/dist/waterline-models/Role.d.ts +19 -0
  894. package/dist/waterline-models/Role.d.ts.map +1 -0
  895. package/dist/waterline-models/Role.js +38 -0
  896. package/dist/waterline-models/ThemeConfig.d.ts +16 -0
  897. package/dist/waterline-models/ThemeConfig.d.ts.map +1 -0
  898. package/dist/waterline-models/ThemeConfig.js +33 -0
  899. package/dist/waterline-models/User.d.ts +50 -0
  900. package/dist/waterline-models/User.d.ts.map +1 -0
  901. package/dist/waterline-models/User.js +151 -0
  902. package/dist/waterline-models/UserAudit.d.ts +18 -0
  903. package/dist/waterline-models/UserAudit.d.ts.map +1 -0
  904. package/dist/waterline-models/UserAudit.js +38 -0
  905. package/dist/waterline-models/UserLink.d.ts +30 -0
  906. package/dist/waterline-models/UserLink.d.ts.map +1 -0
  907. package/dist/waterline-models/UserLink.js +62 -0
  908. package/dist/waterline-models/Vocabulary.d.ts +38 -0
  909. package/dist/waterline-models/Vocabulary.d.ts.map +1 -0
  910. package/dist/waterline-models/Vocabulary.js +183 -0
  911. package/dist/waterline-models/VocabularyEntry.d.ts +33 -0
  912. package/dist/waterline-models/VocabularyEntry.d.ts.map +1 -0
  913. package/dist/waterline-models/VocabularyEntry.js +210 -0
  914. package/dist/waterline-models/WorkflowStep.d.ts +25 -0
  915. package/dist/waterline-models/WorkflowStep.d.ts.map +1 -0
  916. package/dist/waterline-models/WorkflowStep.js +53 -0
  917. package/dist/waterline-models/WorkspaceApp.d.ts +19 -0
  918. package/dist/waterline-models/WorkspaceApp.d.ts.map +1 -0
  919. package/dist/waterline-models/WorkspaceApp.js +50 -0
  920. package/dist/waterline-models/WorkspaceAsync.d.ts +32 -0
  921. package/dist/waterline-models/WorkspaceAsync.d.ts.map +1 -0
  922. package/dist/waterline-models/WorkspaceAsync.js +73 -0
  923. package/dist/waterline-models/WorkspaceType.d.ts +25 -0
  924. package/dist/waterline-models/WorkspaceType.d.ts.map +1 -0
  925. package/dist/waterline-models/WorkspaceType.js +53 -0
  926. package/dist/waterline-models/index.d.ts +53 -0
  927. package/dist/waterline-models/index.d.ts.map +1 -0
  928. package/dist/waterline-models/index.js +99 -0
  929. package/dist/waterline-models/types.d.ts +8 -0
  930. package/dist/waterline-models/types.d.ts.map +1 -0
  931. package/dist/waterline-models/types.js +3 -0
  932. package/package.json +150 -0
  933. package/redbox-loader-templates/bootstrap-shim.js.hbs +17 -0
  934. package/redbox-loader-templates/form-config-index.js.hbs +11 -0
@@ -0,0 +1,2941 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MigrationV4ToV5FormConfigVisitor = void 0;
4
+ const lodash_1 = require("lodash");
5
+ const sails_ng_common_1 = require("@researchdatabox/sails-ng-common");
6
+ const sails_ng_common_2 = require("@researchdatabox/sails-ng-common");
7
+ const sails_ng_common_3 = require("@researchdatabox/sails-ng-common");
8
+ const sails_ng_common_4 = require("@researchdatabox/sails-ng-common");
9
+ const sails_ng_common_5 = require("@researchdatabox/sails-ng-common");
10
+ const sails_ng_common_6 = require("@researchdatabox/sails-ng-common");
11
+ const sails_ng_common_7 = require("@researchdatabox/sails-ng-common");
12
+ const sails_ng_common_8 = require("@researchdatabox/sails-ng-common");
13
+ const sails_ng_common_9 = require("@researchdatabox/sails-ng-common");
14
+ const sails_ng_common_10 = require("@researchdatabox/sails-ng-common");
15
+ const sails_ng_common_11 = require("@researchdatabox/sails-ng-common");
16
+ const sails_ng_common_12 = require("@researchdatabox/sails-ng-common");
17
+ const sails_ng_common_13 = require("@researchdatabox/sails-ng-common");
18
+ const sails_ng_common_14 = require("@researchdatabox/sails-ng-common");
19
+ const sails_ng_common_15 = require("@researchdatabox/sails-ng-common");
20
+ const sails_ng_common_16 = require("@researchdatabox/sails-ng-common");
21
+ const sails_ng_common_17 = require("@researchdatabox/sails-ng-common");
22
+ const sails_ng_common_18 = require("@researchdatabox/sails-ng-common");
23
+ const sails_ng_common_19 = require("@researchdatabox/sails-ng-common");
24
+ const sails_ng_common_20 = require("@researchdatabox/sails-ng-common");
25
+ const sails_ng_common_21 = require("@researchdatabox/sails-ng-common");
26
+ const sails_ng_common_22 = require("@researchdatabox/sails-ng-common");
27
+ const sails_ng_common_23 = require("@researchdatabox/sails-ng-common");
28
+ const sails_ng_common_24 = require("@researchdatabox/sails-ng-common");
29
+ const sails_ng_common_25 = require("@researchdatabox/sails-ng-common");
30
+ const sails_ng_common_26 = require("@researchdatabox/sails-ng-common");
31
+ const sails_ng_common_27 = require("@researchdatabox/sails-ng-common");
32
+ const sails_ng_common_28 = require("@researchdatabox/sails-ng-common");
33
+ const sails_ng_common_29 = require("@researchdatabox/sails-ng-common");
34
+ const sails_ng_common_30 = require("@researchdatabox/sails-ng-common");
35
+ const sails_ng_common_31 = require("@researchdatabox/sails-ng-common");
36
+ const sails_ng_common_32 = require("@researchdatabox/sails-ng-common");
37
+ const sails_ng_common_33 = require("@researchdatabox/sails-ng-common");
38
+ const sails_ng_common_34 = require("@researchdatabox/sails-ng-common");
39
+ const sails_ng_common_35 = require("@researchdatabox/sails-ng-common");
40
+ const sails_ng_common_36 = require("@researchdatabox/sails-ng-common");
41
+ const sails_ng_common_37 = require("@researchdatabox/sails-ng-common");
42
+ const sails_ng_common_38 = require("@researchdatabox/sails-ng-common");
43
+ const sails_ng_common_39 = require("@researchdatabox/sails-ng-common");
44
+ const sails_ng_common_40 = require("@researchdatabox/sails-ng-common");
45
+ const sails_ng_common_41 = require("@researchdatabox/sails-ng-common");
46
+ const sails_ng_common_42 = require("@researchdatabox/sails-ng-common");
47
+ const sails_ng_common_43 = require("@researchdatabox/sails-ng-common");
48
+ const sails_ng_common_44 = require("@researchdatabox/sails-ng-common");
49
+ const sails_ng_common_45 = require("@researchdatabox/sails-ng-common");
50
+ const sails_ng_common_46 = require("@researchdatabox/sails-ng-common");
51
+ const sails_ng_common_47 = require("@researchdatabox/sails-ng-common");
52
+ const sails_ng_common_48 = require("@researchdatabox/sails-ng-common");
53
+ const sails_ng_common_49 = require("@researchdatabox/sails-ng-common");
54
+ const sails_ng_common_50 = require("@researchdatabox/sails-ng-common");
55
+ const sails_ng_common_51 = require("@researchdatabox/sails-ng-common");
56
+ const sails_ng_common_52 = require("@researchdatabox/sails-ng-common");
57
+ const sails_ng_common_53 = require("@researchdatabox/sails-ng-common");
58
+ const sails_ng_common_54 = require("@researchdatabox/sails-ng-common");
59
+ const sails_ng_common_55 = require("@researchdatabox/sails-ng-common");
60
+ const sails_ng_common_56 = require("@researchdatabox/sails-ng-common");
61
+ const sails_ng_common_57 = require("@researchdatabox/sails-ng-common");
62
+ const sails_ng_common_58 = require("@researchdatabox/sails-ng-common");
63
+ const sails_ng_common_59 = require("@researchdatabox/sails-ng-common");
64
+ const sails_ng_common_60 = require("@researchdatabox/sails-ng-common");
65
+ const sails_ng_common_61 = require("@researchdatabox/sails-ng-common");
66
+ const sails_ng_common_62 = require("@researchdatabox/sails-ng-common");
67
+ const sails_ng_common_63 = require("@researchdatabox/sails-ng-common");
68
+ const sails_ng_common_64 = require("@researchdatabox/sails-ng-common");
69
+ const sails_ng_common_65 = require("@researchdatabox/sails-ng-common");
70
+ const attachment_fields_visitor_1 = require("./attachment-fields.visitor");
71
+ /*
72
+ * HOW TO ADD OR UPDATE THE MAPPING
73
+ *
74
+ * There are a few places to update to properly map from a v4 form config to a v5 form config:
75
+ * 1. Add the v4 class name and comp class name to formConfigV4ToV5Mapping, along with the matching v5 class names.
76
+ * 2. Add any component-specific mapping post-processing to postProcessingFormConfigV4ToV5Mapping.
77
+ * 3. Check the 'visit<Name>[Field|Form]...' methods, and see if there is any special processing needed.
78
+ *
79
+ */
80
+ /**
81
+ * Overall mapping from v4 class, v4 compClass to v5 class names.
82
+ */
83
+ const formConfigV4ToV5Mapping = {
84
+ Container: {
85
+ '': {
86
+ componentClassName: sails_ng_common_2.GroupFieldComponentName,
87
+ modelClassName: sails_ng_common_2.GroupFieldModelName,
88
+ },
89
+ TextBlockComponent: {
90
+ componentClassName: sails_ng_common_13.ContentComponentName,
91
+ },
92
+ GenericGroupComponent: {
93
+ componentClassName: sails_ng_common_2.GroupFieldComponentName,
94
+ modelClassName: sails_ng_common_2.GroupFieldModelName,
95
+ },
96
+ },
97
+ TextArea: {
98
+ '': {
99
+ componentClassName: sails_ng_common_18.TextAreaComponentName,
100
+ modelClassName: sails_ng_common_18.TextAreaModelName,
101
+ },
102
+ TextAreaComponent: {
103
+ componentClassName: sails_ng_common_18.TextAreaComponentName,
104
+ modelClassName: sails_ng_common_18.TextAreaModelName,
105
+ },
106
+ },
107
+ MarkdownTextArea: {
108
+ '': {
109
+ componentClassName: sails_ng_common_20.RichTextEditorComponentName,
110
+ modelClassName: sails_ng_common_20.RichTextEditorModelName,
111
+ },
112
+ MarkdownTextAreaComponent: {
113
+ componentClassName: sails_ng_common_20.RichTextEditorComponentName,
114
+ modelClassName: sails_ng_common_20.RichTextEditorModelName,
115
+ },
116
+ },
117
+ TabOrAccordionContainer: {
118
+ '': {
119
+ componentClassName: sails_ng_common_14.TabComponentName,
120
+ layoutClassName: sails_ng_common_14.TabLayoutName,
121
+ },
122
+ TabOrAccordionContainerComponent: {
123
+ componentClassName: sails_ng_common_14.TabComponentName,
124
+ layoutClassName: sails_ng_common_14.TabLayoutName,
125
+ },
126
+ },
127
+ ButtonBarContainer: {
128
+ '': {
129
+ componentClassName: sails_ng_common_2.GroupFieldComponentName,
130
+ modelClassName: sails_ng_common_2.GroupFieldModelName,
131
+ layoutClassName: sails_ng_common_10.ActionRowLayoutName,
132
+ },
133
+ ButtonBarContainerComponent: {
134
+ componentClassName: sails_ng_common_2.GroupFieldComponentName,
135
+ modelClassName: sails_ng_common_2.GroupFieldModelName,
136
+ layoutClassName: sails_ng_common_10.ActionRowLayoutName,
137
+ },
138
+ },
139
+ TextField: {
140
+ '': {
141
+ componentClassName: sails_ng_common_6.SimpleInputComponentName,
142
+ modelClassName: sails_ng_common_6.SimpleInputModelName,
143
+ },
144
+ },
145
+ HiddenValue: {
146
+ HiddenValueComponent: {
147
+ componentClassName: sails_ng_common_6.SimpleInputComponentName,
148
+ modelClassName: sails_ng_common_6.SimpleInputModelName,
149
+ },
150
+ },
151
+ LinkValueComponent: {
152
+ '': {
153
+ componentClassName: sails_ng_common_13.ContentComponentName,
154
+ },
155
+ },
156
+ HtmlRaw: {
157
+ HtmlRawComponent: {
158
+ componentClassName: sails_ng_common_13.ContentComponentName,
159
+ },
160
+ },
161
+ RepeatableContainer: {
162
+ '': {
163
+ componentClassName: sails_ng_common_3.RepeatableComponentName,
164
+ modelClassName: sails_ng_common_3.RepeatableModelName,
165
+ },
166
+ RepeatableTextfieldComponent: {
167
+ componentClassName: sails_ng_common_3.RepeatableComponentName,
168
+ modelClassName: sails_ng_common_3.RepeatableModelName,
169
+ },
170
+ RepeatableGroupComponent: {
171
+ componentClassName: sails_ng_common_3.RepeatableComponentName,
172
+ modelClassName: sails_ng_common_3.RepeatableModelName,
173
+ },
174
+ RepeatableVocabComponent: {
175
+ componentClassName: sails_ng_common_3.RepeatableComponentName,
176
+ modelClassName: sails_ng_common_3.RepeatableModelName,
177
+ },
178
+ },
179
+ RepeatableContributor: {
180
+ RepeatableContributorComponent: {
181
+ componentClassName: sails_ng_common_3.RepeatableComponentName,
182
+ modelClassName: sails_ng_common_3.RepeatableModelName,
183
+ },
184
+ },
185
+ RepeatableVocab: {
186
+ '': {
187
+ componentClassName: sails_ng_common_3.RepeatableComponentName,
188
+ modelClassName: sails_ng_common_3.RepeatableModelName,
189
+ },
190
+ RepeatableVocabComponent: {
191
+ componentClassName: sails_ng_common_3.RepeatableComponentName,
192
+ modelClassName: sails_ng_common_3.RepeatableModelName,
193
+ },
194
+ },
195
+ SelectionField: {
196
+ DropdownFieldComponent: {
197
+ componentClassName: sails_ng_common_23.DropdownInputComponentName,
198
+ modelClassName: sails_ng_common_23.DropdownInputModelName,
199
+ },
200
+ SelectionFieldComponent: {
201
+ componentClassName: sails_ng_common_23.DropdownInputComponentName,
202
+ modelClassName: sails_ng_common_23.DropdownInputModelName,
203
+ },
204
+ },
205
+ VocabField: {
206
+ '': {
207
+ componentClassName: sails_ng_common_25.TypeaheadInputComponentName,
208
+ modelClassName: sails_ng_common_25.TypeaheadInputModelName,
209
+ },
210
+ VocabFieldComponent: {
211
+ componentClassName: sails_ng_common_25.TypeaheadInputComponentName,
212
+ modelClassName: sails_ng_common_25.TypeaheadInputModelName,
213
+ },
214
+ },
215
+ DateTime: {
216
+ '': {
217
+ componentClassName: sails_ng_common_29.DateInputComponentName,
218
+ modelClassName: sails_ng_common_29.DateInputModelName,
219
+ },
220
+ },
221
+ SaveButton: {
222
+ '': {
223
+ componentClassName: sails_ng_common_31.SaveButtonComponentName,
224
+ },
225
+ },
226
+ // TODO: Should tab nav be a different component?
227
+ TabNavButton: {
228
+ '': {
229
+ componentClassName: sails_ng_common_37.TabNavButtonComponentName,
230
+ },
231
+ },
232
+ // TODO: Should anchor or button be a different component?
233
+ AnchorOrButton: {
234
+ '': {
235
+ componentClassName: sails_ng_common_31.SaveButtonComponentName,
236
+ },
237
+ // TODO: what is class: AnchorOrButton, compClass: TextBlockComponent?
238
+ // "TextBlockComponent": {}
239
+ },
240
+ // TODO: Should cancel button be a different component?
241
+ CancelButton: {
242
+ '': {
243
+ componentClassName: sails_ng_common_33.CancelButtonComponentName,
244
+ },
245
+ },
246
+ // TabContentContainer is not a real v4 class: it a placeholder to aid mapping to tab content component
247
+ TabContentContainer: {
248
+ '': {
249
+ componentClassName: sails_ng_common_16.TabContentComponentName,
250
+ layoutClassName: sails_ng_common_16.TabContentLayoutName,
251
+ },
252
+ },
253
+ ContributorField: {
254
+ '': {
255
+ componentClassName: sails_ng_common_64.ReusableComponentName,
256
+ },
257
+ },
258
+ ANDSVocab: {
259
+ '': {
260
+ componentClassName: sails_ng_common_45.CheckboxTreeComponentName,
261
+ modelClassName: sails_ng_common_45.CheckboxTreeModelName,
262
+ },
263
+ ANDSVocabComponent: {
264
+ componentClassName: sails_ng_common_45.CheckboxTreeComponentName,
265
+ modelClassName: sails_ng_common_45.CheckboxTreeModelName,
266
+ },
267
+ },
268
+ RelatedObjectSelector: {
269
+ '': {
270
+ componentClassName: sails_ng_common_47.RecordSelectorComponentName,
271
+ modelClassName: sails_ng_common_47.RecordSelectorModelName,
272
+ },
273
+ RelatedObjectSelectorComponent: {
274
+ componentClassName: sails_ng_common_47.RecordSelectorComponentName,
275
+ modelClassName: sails_ng_common_47.RecordSelectorModelName,
276
+ },
277
+ },
278
+ MapField: {
279
+ '': {
280
+ componentClassName: sails_ng_common_49.MapComponentName,
281
+ modelClassName: sails_ng_common_49.MapModelName,
282
+ },
283
+ MapComponent: {
284
+ componentClassName: sails_ng_common_49.MapComponentName,
285
+ modelClassName: sails_ng_common_49.MapModelName,
286
+ },
287
+ },
288
+ RelatedFileUpload: {
289
+ '': {
290
+ componentClassName: sails_ng_common_51.FileUploadComponentName,
291
+ modelClassName: sails_ng_common_51.FileUploadModelName,
292
+ },
293
+ RelatedFileUploadComponent: {
294
+ componentClassName: sails_ng_common_51.FileUploadComponentName,
295
+ modelClassName: sails_ng_common_51.FileUploadModelName,
296
+ },
297
+ RelatedFileComponent: {
298
+ componentClassName: sails_ng_common_51.FileUploadComponentName,
299
+ modelClassName: sails_ng_common_51.FileUploadModelName,
300
+ },
301
+ },
302
+ DataLocation: {
303
+ '': {
304
+ componentClassName: sails_ng_common_55.DataLocationComponentName,
305
+ modelClassName: sails_ng_common_55.DataLocationModelName,
306
+ },
307
+ DataLocationComponent: {
308
+ componentClassName: sails_ng_common_55.DataLocationComponentName,
309
+ modelClassName: sails_ng_common_55.DataLocationModelName,
310
+ },
311
+ },
312
+ PDFList: {
313
+ '': {
314
+ componentClassName: sails_ng_common_53.PDFListComponentName,
315
+ modelClassName: sails_ng_common_53.PDFListModelName,
316
+ },
317
+ PDFListComponent: {
318
+ componentClassName: sails_ng_common_53.PDFListComponentName,
319
+ modelClassName: sails_ng_common_53.PDFListModelName,
320
+ },
321
+ },
322
+ PublishDataLocationSelector: {
323
+ '': {
324
+ componentClassName: sails_ng_common_57.PublishDataLocationSelectorComponentName,
325
+ modelClassName: sails_ng_common_57.PublishDataLocationSelectorModelName,
326
+ },
327
+ PublishDataLocationSelectorComponent: {
328
+ componentClassName: sails_ng_common_57.PublishDataLocationSelectorComponentName,
329
+ modelClassName: sails_ng_common_57.PublishDataLocationSelectorModelName,
330
+ },
331
+ },
332
+ RecordMetadataRetriever: {
333
+ '': {
334
+ componentClassName: sails_ng_common_40.RecordMetadataRetrieverComponentName,
335
+ },
336
+ RecordMetadataRetrieverComponent: {
337
+ componentClassName: sails_ng_common_40.RecordMetadataRetrieverComponentName,
338
+ },
339
+ },
340
+ // Map the legacy button-like field to the new explicit V5 component so the
341
+ // runtime can drive refresh through behaviours instead of embedded fetch code.
342
+ PublishDataLocationRefresh: {
343
+ '': {
344
+ componentClassName: sails_ng_common_42.PublishDataLocationRefreshComponentName,
345
+ },
346
+ PublishDataLocationRefreshComponent: {
347
+ componentClassName: sails_ng_common_42.PublishDataLocationRefreshComponentName,
348
+ },
349
+ },
350
+ };
351
+ const andsVocabDefaultLabelTemplate = '{{default (split notation "/" -1) notation}} - {{label}}';
352
+ /**
353
+ * Post-processing after mapping v4 to v5 class names.
354
+ * @param v4Field The v4 field.
355
+ * @param v4ClassNames The v4 class names used to match the mapping.
356
+ * @param v5ClassNames The v5 class names that matched.
357
+ */
358
+ function postProcessingFormConfigV4ToV5Mapping(v4Field, v4ClassNames, v5ClassNames) {
359
+ const fieldDefinition = (v4Field?.definition ?? {});
360
+ let v5ComponentClassName = v5ClassNames.componentClassName || '';
361
+ let v5ModelClassName = v5ClassNames.modelClassName || '';
362
+ const v5LayoutClassName = v5ClassNames.layoutClassName || '';
363
+ // Some components need special processing.
364
+ // Use the CheckboxInputComponent
365
+ if (fieldDefinition?.controlType === 'checkbox') {
366
+ v5ComponentClassName = 'CheckboxInputComponent';
367
+ v5ModelClassName = 'CheckboxInputModel';
368
+ }
369
+ // Use the RadioInputComponent
370
+ if (fieldDefinition?.controlType === 'radio') {
371
+ v5ComponentClassName = 'RadioInputComponent';
372
+ v5ModelClassName = 'RadioInputModel';
373
+ }
374
+ // Anchor links should remain navigational links in view mode, not save actions.
375
+ if (v4ClassNames?.v4ClassName === 'AnchorOrButton' && fieldDefinition?.controlType === 'anchor') {
376
+ v5ComponentClassName = sails_ng_common_13.ContentComponentName;
377
+ v5ModelClassName = '';
378
+ }
379
+ if (v5ComponentClassName === sails_ng_common_31.SaveButtonComponentName && fieldDefinition?.isDelete === true) {
380
+ v5ComponentClassName = sails_ng_common_35.DeleteButtonComponentName;
381
+ }
382
+ return {
383
+ componentClassName: v5ComponentClassName,
384
+ modelClassName: v5ModelClassName,
385
+ layoutClassName: v5LayoutClassName,
386
+ };
387
+ }
388
+ /**
389
+ * A form config visitor for migrating from v4 form config structure to v5 structure.
390
+ *
391
+ * Any v4 form config that cannot be automatically mapped will be added as a string value to a property.
392
+ * If a component cannot be mapped, it will be added as a ContentComponent with a descriptive content.
393
+ *
394
+ * The resulting FormConfig is intended to be passed to the construct visitor, as if it was loaded from form config json.
395
+ */
396
+ class MigrationV4ToV5FormConfigVisitor extends sails_ng_common_59.FormConfigVisitor {
397
+ logName = 'MigrationV4ToV5FormConfigVisitor';
398
+ formComponentMap;
399
+ v4FormConfig;
400
+ v5FormConfig;
401
+ mostRecentRepeatableElementTemplatePath;
402
+ v4FormPath;
403
+ formPathHelper;
404
+ sharedProps;
405
+ isInsideButtonBarContainer = false;
406
+ legacyInlineContainerDepth = 0;
407
+ constructor(logger) {
408
+ super(logger);
409
+ this.formComponentMap = sails_ng_common_61.FormComponentDefinitionMap;
410
+ this.v4FormConfig = {
411
+ attachmentFields: undefined,
412
+ customAngularApp: { appName: '', appSelector: '' },
413
+ editCssClasses: '',
414
+ fields: [],
415
+ messages: {},
416
+ name: '',
417
+ requiredFieldIndicator: '',
418
+ skipValidationOnSave: false,
419
+ type: '',
420
+ viewCssClasses: '',
421
+ workflowStep: '',
422
+ };
423
+ this.v5FormConfig = new sails_ng_common_1.FormConfig();
424
+ this.v4FormPath = [];
425
+ this.mostRecentRepeatableElementTemplatePath = null;
426
+ this.formPathHelper = new sails_ng_common_60.FormPathHelper(logger, this);
427
+ this.sharedProps = new sails_ng_common_60.PropertiesHelper();
428
+ }
429
+ start(options) {
430
+ this.v4FormConfig = (0, lodash_1.cloneDeep)(this.normaliseV4FormConfig(options.data));
431
+ this.v5FormConfig = new sails_ng_common_1.FormConfig();
432
+ this.v5FormConfig.debugValue = true;
433
+ this.v4FormPath = [];
434
+ this.mostRecentRepeatableElementTemplatePath = null;
435
+ this.formPathHelper.reset();
436
+ this.v5FormConfig.accept(this);
437
+ this.retargetPublishDataLocationSelectorExpressions(this.v5FormConfig.componentDefinitions);
438
+ const attachmentVisitor = new attachment_fields_visitor_1.AttachmentFieldsVisitor(this.logger);
439
+ attachmentVisitor.start(this.v5FormConfig);
440
+ return this.v5FormConfig;
441
+ }
442
+ /* Form Config */
443
+ visitFormConfig(item) {
444
+ const currentData = this.getV4Data();
445
+ // Set properties that are the same in v4 and v5.
446
+ this.sharedProps.setPropOverride('name', item, currentData);
447
+ this.sharedProps.setPropOverride('type', item, currentData);
448
+ this.sharedProps.setPropOverride('viewCssClasses', item, currentData);
449
+ this.sharedProps.setPropOverride('editCssClasses', item, currentData);
450
+ this.applyLegacyFormCssNormalization(item);
451
+ // Convert properties from v4 to v5.
452
+ // TODO: form.customAngularApp?
453
+ // TODO: form.workflowStep?
454
+ // TODO: form.requiredFieldIndicator?
455
+ // TODO: form.messages?
456
+ // TODO: form.attachmentFields?
457
+ // Convert skipValidationOnSave to enabledValidationGroups.
458
+ if (Object.hasOwn(currentData, 'skipValidationOnSave')) {
459
+ switch (currentData.skipValidationOnSave) {
460
+ case true:
461
+ item.enabledValidationGroups = ['none'];
462
+ break;
463
+ case false:
464
+ default:
465
+ item.enabledValidationGroups = ['all'];
466
+ break;
467
+ }
468
+ }
469
+ // Convert fields to components
470
+ const fields = currentData.fields ?? [];
471
+ // this.logger.info(`Processing '${item.name}': with ${fields.length} fields at ${JSON.stringify(this.v4FormPath)}.`);
472
+ fields.forEach((field, index) => {
473
+ const v4FormPathMore = ['fields', index.toString()];
474
+ if (this.shouldOmitLegacyField(field, v4FormPathMore)) {
475
+ return;
476
+ }
477
+ // Create the instance from the v4 config
478
+ const formComponent = this.constructFormComponent(field, v4FormPathMore);
479
+ // Visit children
480
+ const componentIndex = item.componentDefinitions.length;
481
+ this.acceptV4FormConfigPath(formComponent, this.formPathHelper.lineagePathsForFormConfigComponentDefinition(formComponent, componentIndex), v4FormPathMore);
482
+ // Store the instance on the item
483
+ item.componentDefinitions.push(formComponent);
484
+ const hiddenBinding = this.constructLegacyNameBindingCompanion(field, v4FormPathMore);
485
+ if (hiddenBinding) {
486
+ this.retargetLegacyTextBlockBinding(formComponent, hiddenBinding.sourceName, hiddenBinding.sourceName);
487
+ this.ensureLegacyTextBlockComponentNameIsUnique(formComponent, hiddenBinding.sourceName, v4FormPathMore);
488
+ const hiddenComponentIndex = item.componentDefinitions.length;
489
+ this.acceptV4FormConfigPath(hiddenBinding.component, this.formPathHelper.lineagePathsForFormConfigComponentDefinition(hiddenBinding.component, hiddenComponentIndex), hiddenBinding.v4FormPathMore);
490
+ this.enforceLegacyHiddenBindingConfig(hiddenBinding.component, hiddenBinding.allowRoles);
491
+ item.componentDefinitions.push(hiddenBinding.component);
492
+ }
493
+ });
494
+ this.injectLegacyRecordMetadataRetrieverExpressions(fields, item.componentDefinitions, this.formPathHelper.formPath.angularComponentsJsonPointer ?? '');
495
+ // Add the validation summary.
496
+ const validationSummaryFrame = {
497
+ name: 'validation_summary',
498
+ component: { class: 'ValidationSummaryComponent' },
499
+ };
500
+ const validationSummaryComponent = this.sharedProps.sharedConstructFormComponent(validationSummaryFrame);
501
+ item.componentDefinitions.push(validationSummaryComponent);
502
+ }
503
+ /* SimpleInput */
504
+ visitSimpleInputFieldComponentDefinition(item) {
505
+ const field = this.getV4Data();
506
+ item.config = new sails_ng_common_7.SimpleInputFieldComponentConfig();
507
+ this.sharedPopulateFieldComponentConfig(item.config, field);
508
+ this.sharedProps.setPropOverride('type', item.config, field?.definition);
509
+ if (field?.class === 'HiddenValue' || field?.compClass === 'HiddenValueComponent') {
510
+ item.config.type = 'hidden';
511
+ }
512
+ }
513
+ visitSimpleInputFieldModelDefinition(item) {
514
+ const field = this.getV4Data();
515
+ item.config = new sails_ng_common_7.SimpleInputFieldModelConfig();
516
+ this.sharedPopulateFieldModelConfig(item.config, field);
517
+ }
518
+ visitSimpleInputFormComponentDefinition(item) {
519
+ this.populateFormComponent(item);
520
+ const field = this.getV4Data();
521
+ if (field?.class === 'HiddenValue' || field?.compClass === 'HiddenValueComponent') {
522
+ if (item.component?.config) {
523
+ item.component.config.visible = false;
524
+ }
525
+ if (item.layout?.config) {
526
+ item.layout.config.visible = false;
527
+ }
528
+ }
529
+ }
530
+ /* Content */
531
+ visitContentFieldComponentDefinition(item) {
532
+ const field = this.getV4Data();
533
+ if (!item.config) {
534
+ item.config = new sails_ng_common_22.ContentFieldComponentConfig();
535
+ }
536
+ this.sharedPopulateFieldComponentConfig(item.config, field);
537
+ if (this.isLegacyLinkValueControl(field)) {
538
+ const definition = (field?.definition ?? {});
539
+ const label = typeof definition.label === 'string' ? definition.label : '';
540
+ const valuePath = typeof definition.name === 'string' ? definition.name.trim() : '';
541
+ const labelTemplateToken = this.isLegacyTranslationKey(label) ? '{{t content.label}}' : '{{content.label}}';
542
+ const target = typeof definition.target === 'string' ? String(definition.target).trim() : '';
543
+ item.config.label = undefined;
544
+ const content = { label, valuePath };
545
+ if (target.length > 0) {
546
+ content.target = target;
547
+ }
548
+ item.config.content = content;
549
+ item.config.template =
550
+ `{{#if (get formData content.valuePath "")}}` +
551
+ `<li class="key-value-pair padding-bottom-10">` +
552
+ `{{#if content.label}}<span class="key">${labelTemplateToken}</span>{{/if}}` +
553
+ `<span class="value"><a href="{{get formData content.valuePath ""}}" target="{{default content.target "_blank"}}">` +
554
+ `{{get formData content.valuePath ""}}</a></span>` +
555
+ `</li>` +
556
+ `{{/if}}`;
557
+ return;
558
+ }
559
+ if (this.isLegacyAnchorControl(field)) {
560
+ const definition = (field?.definition ?? {});
561
+ const href = typeof definition.value === 'string' ? definition.value : '';
562
+ let cssClasses = this.normalizeLegacyButtonCssClasses(definition.cssClasses ?? definition.cssClass) ?? 'btn btn-primary';
563
+ cssClasses = this.removeLegacyCssToken(cssClasses, 'margin-15');
564
+ const label = typeof definition.label === 'string' ? definition.label : '';
565
+ const showPencil = definition.showPencil === true;
566
+ const labelTemplateToken = this.isLegacyTranslationKey(label) ? '{{t content.label}}' : '{{content.label}}';
567
+ item.config.label = undefined;
568
+ item.config.content = { href, cssClasses, label, showPencil };
569
+ item.config.template = `<a href="${this.buildLegacyAnchorHrefTemplate(href)}" class="{{content.cssClasses}}">${showPencil ? '<i class="fa fa-pencil"></i> ' : ''}${labelTemplateToken}</a>`;
570
+ return;
571
+ }
572
+ // TODO: form.customAngularApp?
573
+ // TODO: form.requiredFieldIndicator?
574
+ // TODO: form.messages?
575
+ // TODO: form.attachmentFields?
576
+ // Content component is used to display info about missing component mappings.
577
+ // Provide a message for not yet implemented fields.
578
+ const { componentClassName, modelClassName, layoutClassName } = this.mapV4ToV5(field);
579
+ if (!componentClassName) {
580
+ const v4ClassName = field?.class?.toString() ?? '';
581
+ const v4CompClassName = field?.compClass?.toString() ?? '';
582
+ const v4Name = field?.definition?.name || field?.definition?.id;
583
+ const msgs = [
584
+ `Not yet implemented in v5: v4ClassName ${JSON.stringify(v4ClassName)} v4CompClassName ${JSON.stringify(v4CompClassName)} v4Name ${JSON.stringify(v4Name)}.`,
585
+ `At path '${JSON.stringify(this.v4FormPath)}'.`,
586
+ ];
587
+ if (modelClassName) {
588
+ msgs.push(`Model: ${modelClassName}.`);
589
+ }
590
+ if (layoutClassName) {
591
+ msgs.push(`Layout: ${layoutClassName}.`);
592
+ }
593
+ const msg = msgs.join(' ');
594
+ item.config.content = msg;
595
+ this.logger.warn(msg);
596
+ }
597
+ else {
598
+ // Map from the v4 config to v5 config.
599
+ /*
600
+ * The below template is a reference that needs to be taken into account for legacy compatibility
601
+ *
602
+ * <span *ngSwitchCase="'h1'" role="heading" aria-level="1" [ngClass]="field.cssClasses">{{field.value == null? '' : field.value}}</span>
603
+ * <span *ngSwitchCase="'h2'" role="heading" aria-level="2" [ngClass]="field.cssClasses">{{field.value == null? '' : field.value}}</span>
604
+ * <span *ngSwitchCase="'h3'" role="heading" aria-level="3" [ngClass]="field.cssClasses">{{field.value == null? '' : field.value}}</span>
605
+ * <span *ngSwitchCase="'h4'" role="heading" aria-level="4" [ngClass]="field.cssClasses">{{field.value == null? '' : field.value}}</span>
606
+ * <span *ngSwitchCase="'h5'" role="heading" aria-level="5" [ngClass]="field.cssClasses">{{field.value == null? '' : field.value}}</span>
607
+ * <span *ngSwitchCase="'h6'" role="heading" aria-level="6" [ngClass]="field.cssClasses">{{field.value == null? '' : field.value}}</span>
608
+ * <hr *ngSwitchCase="'hr'" [ngClass]="field.cssClasses">
609
+ * <span *ngSwitchCase="'span'" [ngClass]="field.cssClasses">{{field.label == null? '' : field.label + ': '}}{{field.value == null? '' : field.value}}</span>
610
+ * <p *ngSwitchDefault [ngClass]="field.cssClasses" [innerHtml]="field.value == null? '' : field.value"></p>
611
+ */
612
+ const v4Value = field?.definition?.value ?? '';
613
+ const v4Type = field?.definition?.type;
614
+ const v4ValueIsTranslationKey = this.isLegacyTranslationKey(v4Value);
615
+ const v4Name = typeof field?.definition?.name === 'string' ? field.definition.name.trim() : '';
616
+ const bindContentFromFormData = v4Value === '' && v4Name.length > 0;
617
+ const contentTemplateToken = v4ValueIsTranslationKey ? '{{t content}}' : '{{content}}';
618
+ const contentHtmlTemplateToken = v4ValueIsTranslationKey ? '{{{t content}}}' : '{{{content}}}';
619
+ const contentLabelTemplateToken = '{{t content.label}}';
620
+ const contentValueTemplateToken = v4ValueIsTranslationKey ? '{{t content.value}}' : '{{content.value}}';
621
+ const contentBoundTemplateToken = '{{get formData content ""}}';
622
+ const contentBoundHtmlTemplateToken = '{{{get formData content ""}}}';
623
+ const contentBoundValueTemplateToken = '{{get formData content.value ""}}';
624
+ const labelOnlyTemplateToken = this.isLegacyTranslationKey(item.config.label) ? '{{t content}}' : '{{content}}';
625
+ switch (v4Type) {
626
+ case 'h1':
627
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
628
+ item.config.template = `<h1>${bindContentFromFormData ? contentBoundTemplateToken : contentTemplateToken}</h1>`;
629
+ break;
630
+ case 'h2':
631
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
632
+ item.config.template = `<h2>${bindContentFromFormData ? contentBoundTemplateToken : contentTemplateToken}</h2>`;
633
+ break;
634
+ case 'h3':
635
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
636
+ item.config.template = `<h3>${bindContentFromFormData ? contentBoundTemplateToken : contentTemplateToken}</h3>`;
637
+ break;
638
+ case 'h4':
639
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
640
+ item.config.template = `<h4>${bindContentFromFormData ? contentBoundTemplateToken : contentTemplateToken}</h4>`;
641
+ break;
642
+ case 'h5':
643
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
644
+ item.config.template = `<h5>${bindContentFromFormData ? contentBoundTemplateToken : contentTemplateToken}</h5>`;
645
+ break;
646
+ case 'h6':
647
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
648
+ item.config.template = `<h6>${bindContentFromFormData ? contentBoundTemplateToken : contentTemplateToken}</h6>`;
649
+ break;
650
+ case 'hr':
651
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
652
+ item.config.template = `<hr>`;
653
+ break;
654
+ case 'span':
655
+ const label = item.config.label;
656
+ const promoteLegacySpanToLayoutLabel = this.shouldPromoteLegacyTextBlockSpanToLayoutLabel(field);
657
+ if (promoteLegacySpanToLayoutLabel && typeof v4Value === 'string') {
658
+ item.config.content = '';
659
+ item.config.template = `<span></span>`;
660
+ }
661
+ else if (v4Value && label) {
662
+ item.config.content = { value: v4Value, label: item.config.label };
663
+ item.config.template = `<span>${contentLabelTemplateToken}: ${contentValueTemplateToken}</span>`;
664
+ }
665
+ else if (bindContentFromFormData && label) {
666
+ item.config.content = { value: v4Name, label: item.config.label };
667
+ item.config.template = `<span>${contentLabelTemplateToken}: ${contentBoundValueTemplateToken}</span>`;
668
+ }
669
+ else if (bindContentFromFormData && !label) {
670
+ item.config.content = v4Name;
671
+ item.config.template = `<span>${contentBoundTemplateToken}</span>`;
672
+ }
673
+ else if (v4Value && !label) {
674
+ item.config.content = v4Value;
675
+ item.config.template = `<span>${contentTemplateToken}</span>`;
676
+ }
677
+ else if (!v4Value && label) {
678
+ item.config.content = label;
679
+ item.config.template = `<span>${labelOnlyTemplateToken}:</span>`;
680
+ }
681
+ else {
682
+ item.config.content = '';
683
+ }
684
+ break;
685
+ default:
686
+ item.config.content = bindContentFromFormData ? v4Name : v4Value;
687
+ item.config.template = `<div>${bindContentFromFormData ? contentBoundHtmlTemplateToken : contentHtmlTemplateToken}</div>`;
688
+ break;
689
+ }
690
+ }
691
+ }
692
+ visitContentFormComponentDefinition(item) {
693
+ this.populateFormComponent(item);
694
+ if (this.isLegacyLinkValueControl(this.getV4Data())) {
695
+ const definition = (this.getV4Data()?.definition ?? {});
696
+ const valuePath = typeof definition.name === 'string' ? definition.name.trim() : '';
697
+ if (valuePath) {
698
+ item.name = `${valuePath}-link-value`;
699
+ }
700
+ }
701
+ }
702
+ /* Repeatable */
703
+ visitRepeatableFieldComponentDefinition(item) {
704
+ const field = this.getV4Data();
705
+ item.config = new sails_ng_common_4.RepeatableFieldComponentConfig();
706
+ this.sharedPopulateFieldComponentConfig(item.config, field);
707
+ const definition = (field?.definition ?? {});
708
+ this.sharedProps.setPropOverride('addButtonShow', item.config, definition);
709
+ this.sharedProps.setPropOverride('allowZeroRows', item.config, definition);
710
+ this.sharedProps.setPropOverride('hideWhenZeroRows', item.config, definition);
711
+ const currentFormConfigPath = this.formPathHelper.formPath.formConfig;
712
+ const fields = field?.definition?.fields ?? [];
713
+ // this.logger.info(`Processing '${item.class}': with ${fields.length} fields at ${JSON.stringify(this.v4FormPath)}.`);
714
+ if (fields.length === 1) {
715
+ const v4Field = fields[0];
716
+ // Track the most recent element template.
717
+ // - Ensure newEntryValue is used only in elementTemplate definitions.
718
+ // - Ensure defaultValue is not defined in elementTemplate or any nested components.
719
+ const previousMostRecentRepeatableElementTemplatePath = this.mostRecentRepeatableElementTemplatePath === null
720
+ ? null
721
+ : [...this.mostRecentRepeatableElementTemplatePath];
722
+ this.mostRecentRepeatableElementTemplatePath = [...currentFormConfigPath, 'config', 'elementTemplate'];
723
+ try {
724
+ const v4FormPathMore = ['definition', 'fields', '0'];
725
+ if (this.shouldOmitLegacyField(v4Field, v4FormPathMore)) {
726
+ return;
727
+ }
728
+ // Create the instance from the v4 config
729
+ const formComponent = this.constructFormComponent(v4Field, v4FormPathMore);
730
+ // The elementTemplate's name must be a falsy value.
731
+ formComponent.name = '';
732
+ // Visit children
733
+ this.acceptV4FormConfigPath(formComponent, this.formPathHelper.lineagePathsForRepeatableFieldComponentDefinition(formComponent), v4FormPathMore);
734
+ // Always use the repeatable element layout so each item renders the remove button.
735
+ if (formComponent.layout) {
736
+ formComponent.layout.class = sails_ng_common_3.RepeatableElementLayoutName;
737
+ }
738
+ // TODO: This check & change needs to be expanded to collect the defaultValues for all nested components as well.
739
+ // Likely something similar to how the construct visitor does it could be adapted for this.
740
+ // Overall repeatable default: repeatable.model.config.defaultValue
741
+ // New item default: elementTemplate.model.config.newEntryValue
742
+ // The elementTemplate defaultValue must be set in newEntryValue
743
+ if (formComponent?.model?.config?.defaultValue !== undefined) {
744
+ formComponent.model.config.newEntryValue = formComponent?.model?.config?.defaultValue;
745
+ const i = formComponent.model.config;
746
+ delete i['defaultValue'];
747
+ }
748
+ // The newEntryValue must have a value.
749
+ // if (formComponent?.model?.config !== undefined && formComponent.model.config.newEntryValue === undefined) {
750
+ // formComponent.model.config.newEntryValue = {};
751
+ // }
752
+ // Store the instance on the item
753
+ item.config.elementTemplate = formComponent;
754
+ }
755
+ finally {
756
+ // Restore the previous element template state.
757
+ this.mostRecentRepeatableElementTemplatePath = previousMostRecentRepeatableElementTemplatePath;
758
+ }
759
+ }
760
+ else {
761
+ this.logger.error(`${this.logName}: Expected one field in definition for repeatable, but found ${fields.length}: ${JSON.stringify(field)}`);
762
+ }
763
+ }
764
+ visitRepeatableFieldModelDefinition(item) {
765
+ const field = this.getV4Data();
766
+ item.config = new sails_ng_common_4.RepeatableFieldModelConfig();
767
+ this.sharedPopulateFieldModelConfig(item.config, field);
768
+ }
769
+ visitRepeatableElementFieldLayoutDefinition(item) {
770
+ const field = this.getV4Data();
771
+ item.config = new sails_ng_common_4.RepeatableElementFieldLayoutConfig();
772
+ this.sharedPopulateFieldLayoutConfig(item.config, field);
773
+ }
774
+ visitRepeatableFormComponentDefinition(item) {
775
+ const field = this.getV4Data();
776
+ this.populateFormComponent(item);
777
+ const v4ClassName = `${field?.class ?? ''}`.trim();
778
+ if (v4ClassName === 'RepeatableContributor') {
779
+ const definition = (field?.definition ?? {});
780
+ const hasExplicitLabel = typeof definition.label === 'string';
781
+ const contributorLabel = hasExplicitLabel
782
+ ? definition.label
783
+ : (typeof definition.name === 'string' ? definition.name : undefined);
784
+ if (contributorLabel && item.layout?.config && !item.layout.config.label) {
785
+ item.layout.config.label = contributorLabel;
786
+ }
787
+ }
788
+ }
789
+ /* Validation Summary */
790
+ visitValidationSummaryFieldComponentDefinition(item) {
791
+ const field = this.getV4Data();
792
+ item.config = new sails_ng_common_39.ValidationSummaryFieldComponentConfig();
793
+ this.sharedPopulateFieldComponentConfig(item.config, field);
794
+ }
795
+ visitValidationSummaryFormComponentDefinition(item) {
796
+ this.populateFormComponent(item);
797
+ }
798
+ /* Record Metadata Retriever */
799
+ visitRecordMetadataRetrieverFieldComponentDefinition(item) {
800
+ const field = this.getV4Data();
801
+ item.config = new sails_ng_common_41.RecordMetadataRetrieverFieldComponentConfig();
802
+ this.sharedPopulateFieldComponentConfig(item.config, field);
803
+ item.config.label = undefined;
804
+ item.config.visible = false;
805
+ }
806
+ visitRecordMetadataRetrieverFormComponentDefinition(item) {
807
+ this.populateFormComponent(item);
808
+ if (item.layout?.config) {
809
+ item.layout.config.label = undefined;
810
+ item.layout.config.visible = false;
811
+ }
812
+ }
813
+ // Preserve shared label/visibility/readonly config, while intentionally not
814
+ // inventing any model state during migration.
815
+ visitPublishDataLocationRefreshFieldComponentDefinition(item) {
816
+ const field = this.getV4Data();
817
+ item.config = new sails_ng_common_43.PublishDataLocationRefreshFieldComponentConfig();
818
+ this.sharedPopulateFieldComponentConfig(item.config, field);
819
+ }
820
+ visitPublishDataLocationRefreshFormComponentDefinition(item) {
821
+ this.populateFormComponent(item);
822
+ }
823
+ /* Save Status */
824
+ visitSaveStatusFieldComponentDefinition(item) {
825
+ const field = this.getV4Data();
826
+ item.config = new sails_ng_common_44.SaveStatusFieldComponentConfig();
827
+ this.sharedPopulateFieldComponentConfig(item.config, field);
828
+ }
829
+ visitSaveStatusFormComponentDefinition(item) {
830
+ this.populateFormComponent(item);
831
+ }
832
+ /* Group */
833
+ visitGroupFieldComponentDefinition(item) {
834
+ const field = this.getV4Data();
835
+ const config = new sails_ng_common_5.GroupFieldComponentConfig();
836
+ item.config = config;
837
+ this.sharedPopulateFieldComponentConfig(item.config, field);
838
+ const isButtonBarContainer = field?.class === 'ButtonBarContainer' || field?.compClass === 'ButtonBarContainerComponent';
839
+ const isLegacyInlineContainer = this.isLegacyInlineContainer(field);
840
+ if (isButtonBarContainer) {
841
+ this.isInsideButtonBarContainer = true;
842
+ }
843
+ if (isLegacyInlineContainer) {
844
+ this.legacyInlineContainerDepth += 1;
845
+ }
846
+ try {
847
+ this.logger.debug(`${this.logName}: visitGroupFieldComponentDefinition for '${String(field?.definition?.name ?? field?.definition?.id ?? '')}'.`);
848
+ const fields = field?.definition?.fields ?? [];
849
+ // this.logger.info(`Processing '${item.class}': with ${fields.length} fields at ${JSON.stringify(this.v4FormPath)}.`);
850
+ fields.forEach((childField, index) => {
851
+ if (childField?.class === 'Spacer' || childField?.compClass === 'SpacerComponent') {
852
+ return;
853
+ }
854
+ const v4FormPathMore = ['definition', 'fields', index.toString()];
855
+ if (this.shouldOmitLegacyField(childField, v4FormPathMore)) {
856
+ return;
857
+ }
858
+ // Create the instance from the v4 config
859
+ const formComponent = this.constructFormComponent(childField, v4FormPathMore);
860
+ // Visit children
861
+ const componentIndex = config.componentDefinitions.length;
862
+ this.acceptV4FormConfigPath(formComponent, this.formPathHelper.lineagePathsForGroupFieldComponentDefinition(formComponent, componentIndex), v4FormPathMore);
863
+ if (isLegacyInlineContainer && formComponent.layout?.config) {
864
+ formComponent.layout.config.label = undefined;
865
+ }
866
+ // Store the instance on the item
867
+ config.componentDefinitions.push(formComponent);
868
+ const hiddenBinding = this.constructLegacyNameBindingCompanion(childField, v4FormPathMore);
869
+ if (hiddenBinding) {
870
+ this.retargetLegacyTextBlockBinding(formComponent, hiddenBinding.sourceName, hiddenBinding.sourceName);
871
+ this.ensureLegacyTextBlockComponentNameIsUnique(formComponent, hiddenBinding.sourceName, v4FormPathMore);
872
+ const hiddenComponentIndex = config.componentDefinitions.length;
873
+ this.acceptV4FormConfigPath(hiddenBinding.component, this.formPathHelper.lineagePathsForGroupFieldComponentDefinition(hiddenBinding.component, hiddenComponentIndex), hiddenBinding.v4FormPathMore);
874
+ this.enforceLegacyHiddenBindingConfig(hiddenBinding.component, hiddenBinding.allowRoles);
875
+ config.componentDefinitions.push(hiddenBinding.component);
876
+ }
877
+ });
878
+ this.injectLegacyRecordMetadataRetrieverExpressions(fields, config.componentDefinitions, this.formPathHelper.formPath.angularComponentsJsonPointer ?? '');
879
+ }
880
+ finally {
881
+ if (isLegacyInlineContainer) {
882
+ this.legacyInlineContainerDepth = Math.max(0, this.legacyInlineContainerDepth - 1);
883
+ }
884
+ if (isButtonBarContainer) {
885
+ this.isInsideButtonBarContainer = false;
886
+ }
887
+ }
888
+ }
889
+ visitGroupFieldModelDefinition(item) {
890
+ const field = this.getV4Data();
891
+ item.config = new sails_ng_common_5.GroupFieldModelConfig();
892
+ this.sharedPopulateFieldModelConfig(item.config, field);
893
+ if (field?.class === 'ButtonBarContainer' || field?.compClass === 'ButtonBarContainerComponent') {
894
+ item.config.disabled = true;
895
+ }
896
+ }
897
+ visitGroupFormComponentDefinition(item) {
898
+ this.populateFormComponent(item);
899
+ }
900
+ /* Tab */
901
+ visitTabFieldComponentDefinition(item) {
902
+ const field = this.getV4Data();
903
+ const config = new sails_ng_common_15.TabFieldComponentConfig();
904
+ item.config = config;
905
+ this.sharedPopulateFieldComponentConfig(item.config, field);
906
+ const fields = field?.definition?.fields ?? [];
907
+ // this.logger.info(`Processing '${item.class}': with ${fields.length} fields at ${JSON.stringify(this.v4FormPath)}.`);
908
+ fields.forEach((field, index) => {
909
+ const v4FormPathMore = ['definition', 'fields', index.toString()];
910
+ if (this.shouldOmitLegacyField(field, v4FormPathMore)) {
911
+ return;
912
+ }
913
+ // TODO: Does this approach to mapping the tab content component lose data?
914
+ // build tab component from field by setting 'placeholder' v4 class
915
+ // TabContentContainer is not a real v4 class: it a placeholder to aid mapping to tab content component
916
+ field.class = 'TabContentContainer';
917
+ // Create the instance from the v4 config
918
+ const formComponent = this.constructFormComponent(field, v4FormPathMore);
919
+ if ((0, sails_ng_common_62.isTypeFormComponentDefinitionName)(formComponent, sails_ng_common_16.TabContentComponentName)) {
920
+ // Visit children
921
+ this.acceptV4FormConfigPath(formComponent, this.formPathHelper.lineagePathsForTabFieldComponentDefinition(formComponent, index), v4FormPathMore);
922
+ // Store the instance on the item
923
+ config.tabs.push(formComponent);
924
+ }
925
+ });
926
+ }
927
+ visitTabFieldLayoutDefinition(item) {
928
+ const field = this.getV4Data();
929
+ item.config = new sails_ng_common_15.TabFieldLayoutConfig();
930
+ this.sharedPopulateFieldLayoutConfig(item.config, field);
931
+ }
932
+ visitTabFormComponentDefinition(item) {
933
+ this.populateFormComponent(item);
934
+ }
935
+ /* Tab Content */
936
+ visitTabContentFieldComponentDefinition(item) {
937
+ const field = this.getV4Data();
938
+ const config = new sails_ng_common_17.TabContentFieldComponentConfig();
939
+ item.config = config;
940
+ this.sharedPopulateFieldComponentConfig(item.config, field);
941
+ const fields = field?.definition?.fields ?? [];
942
+ // this.logger.info(`Processing '${item.class}': with ${fields.length} fields at ${JSON.stringify(this.v4FormPath)}.`);
943
+ fields.forEach((field, index) => {
944
+ const v4FormPathMore = ['definition', 'fields', index.toString()];
945
+ if (this.shouldOmitLegacyField(field, v4FormPathMore)) {
946
+ return;
947
+ }
948
+ // Create the instance from the v4 config
949
+ const formComponent = this.constructFormComponent(field, v4FormPathMore);
950
+ // Visit children
951
+ const componentIndex = config.componentDefinitions.length;
952
+ this.acceptV4FormConfigPath(formComponent, this.formPathHelper.lineagePathsForTabContentFieldComponentDefinition(formComponent, componentIndex), ['definition', 'fields', index.toString()]);
953
+ // Store the instance on the item
954
+ config.componentDefinitions.push(formComponent);
955
+ const hiddenBinding = this.constructLegacyNameBindingCompanion(field, v4FormPathMore);
956
+ if (hiddenBinding) {
957
+ this.retargetLegacyTextBlockBinding(formComponent, hiddenBinding.sourceName, hiddenBinding.sourceName);
958
+ this.ensureLegacyTextBlockComponentNameIsUnique(formComponent, hiddenBinding.sourceName, v4FormPathMore);
959
+ const hiddenComponentIndex = config.componentDefinitions.length;
960
+ this.acceptV4FormConfigPath(hiddenBinding.component, this.formPathHelper.lineagePathsForTabContentFieldComponentDefinition(hiddenBinding.component, hiddenComponentIndex), hiddenBinding.v4FormPathMore);
961
+ this.enforceLegacyHiddenBindingConfig(hiddenBinding.component, hiddenBinding.allowRoles);
962
+ config.componentDefinitions.push(hiddenBinding.component);
963
+ }
964
+ });
965
+ this.injectLegacyRecordMetadataRetrieverExpressions(fields, config.componentDefinitions, this.formPathHelper.formPath.angularComponentsJsonPointer ?? '');
966
+ }
967
+ visitTabContentFieldLayoutDefinition(item) {
968
+ const field = this.getV4Data();
969
+ item.config = new sails_ng_common_17.TabContentFieldLayoutConfig();
970
+ if (field?.definition?.label) {
971
+ item.config.buttonLabel = field?.definition?.label;
972
+ }
973
+ this.sharedPopulateFieldLayoutConfig(item.config, field);
974
+ }
975
+ visitTabContentFormComponentDefinition(item) {
976
+ this.populateFormComponent(item);
977
+ }
978
+ /* Save Button */
979
+ visitSaveButtonFieldComponentDefinition(item) {
980
+ const field = this.getV4Data();
981
+ item.config = new sails_ng_common_32.SaveButtonFieldComponentConfig();
982
+ this.sharedPopulateFieldComponentConfig(item.config, field);
983
+ this.sharedProps.setPropOverride('targetStep', item.config, field?.definition);
984
+ this.sharedProps.setPropOverride('forceSave', item.config, field?.definition);
985
+ this.sharedProps.setPropOverride('enabledValidationGroups', item.config, field?.definition);
986
+ this.sharedProps.setPropOverride('labelSaving', item.config, field?.definition);
987
+ this.sharedProps.setPropOverride('buttonCssClasses', item.config, {
988
+ buttonCssClasses: this.normalizeLegacyButtonCssClasses(field?.definition?.cssClasses ?? field?.definition?.cssClass),
989
+ });
990
+ }
991
+ visitSaveButtonFormComponentDefinition(item) {
992
+ this.populateFormComponent(item);
993
+ }
994
+ /* Cancel Button */
995
+ visitCancelButtonFieldComponentDefinition(item) {
996
+ const field = this.getV4Data();
997
+ item.config = new sails_ng_common_34.CancelButtonFieldComponentConfig();
998
+ this.sharedPopulateFieldComponentConfig(item.config, field);
999
+ this.sharedProps.setPropOverride('confirmationMessage', item.config, field?.definition);
1000
+ this.sharedProps.setPropOverride('confirmationTitle', item.config, field?.definition);
1001
+ this.sharedProps.setPropOverride('cancelButtonMessage', item.config, field?.definition);
1002
+ this.sharedProps.setPropOverride('confirmButtonMessage', item.config, field?.definition);
1003
+ this.sharedProps.setPropOverride('buttonCssClasses', item.config, {
1004
+ buttonCssClasses: this.normalizeLegacyButtonCssClasses(field?.definition?.cssClasses ?? field?.definition?.cssClass),
1005
+ });
1006
+ }
1007
+ visitCancelButtonFormComponentDefinition(item) {
1008
+ this.populateFormComponent(item);
1009
+ }
1010
+ /* Delete Button */
1011
+ visitDeleteButtonFieldComponentDefinition(item) {
1012
+ const field = this.getV4Data();
1013
+ item.config = new sails_ng_common_36.DeleteButtonFieldComponentConfig();
1014
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1015
+ this.sharedProps.setPropOverride('closeOnDelete', item.config, {
1016
+ closeOnDelete: field?.definition?.closeOnSave,
1017
+ });
1018
+ this.sharedProps.setPropOverride('redirectLocation', item.config, field?.definition);
1019
+ if (typeof item.config.redirectLocation === 'string' && item.config.redirectLocation.trim()) {
1020
+ item.config.redirectLocation = this.buildLegacyUrlTemplate(item.config.redirectLocation);
1021
+ }
1022
+ this.sharedProps.setPropOverride('redirectDelaySeconds', item.config, field?.definition);
1023
+ this.sharedProps.setPropOverride('confirmationMessage', item.config, field?.definition);
1024
+ this.sharedProps.setPropOverride('confirmationTitle', item.config, field?.definition);
1025
+ this.sharedProps.setPropOverride('cancelButtonMessage', item.config, field?.definition);
1026
+ this.sharedProps.setPropOverride('confirmButtonMessage', item.config, field?.definition);
1027
+ this.sharedProps.setPropOverride('buttonCssClasses', item.config, {
1028
+ buttonCssClasses: this.normalizeLegacyButtonCssClasses(field?.definition?.cssClasses ?? field?.definition?.cssClass),
1029
+ });
1030
+ }
1031
+ visitDeleteButtonFormComponentDefinition(item) {
1032
+ this.populateFormComponent(item);
1033
+ }
1034
+ /* Tab Nav Button */
1035
+ visitTabNavButtonFieldComponentDefinition(item) {
1036
+ const field = this.getV4Data();
1037
+ item.config = new sails_ng_common_38.TabNavButtonFieldComponentConfig();
1038
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1039
+ this.sharedProps.setPropOverride('prevLabel', item.config, field?.definition);
1040
+ this.sharedProps.setPropOverride('nextLabel', item.config, field?.definition);
1041
+ this.sharedProps.setPropOverride('targetTabContainerId', item.config, field?.definition);
1042
+ this.sharedProps.setPropOverride('endDisplayMode', item.config, field?.definition);
1043
+ }
1044
+ visitTabNavButtonFormComponentDefinition(item) {
1045
+ this.populateFormComponent(item);
1046
+ }
1047
+ /* Text Area */
1048
+ visitTextAreaFieldComponentDefinition(item) {
1049
+ const field = this.getV4Data();
1050
+ item.config = new sails_ng_common_19.TextAreaFieldComponentConfig();
1051
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1052
+ const colsRaw = field?.definition?.cols ?? field?.definition?.columns ?? undefined;
1053
+ const colsParsed = colsRaw === undefined ? undefined : Number.parseInt(String(colsRaw), 10);
1054
+ const cols = colsParsed !== undefined && Number.isFinite(colsParsed) ? colsParsed : undefined;
1055
+ this.sharedProps.setPropOverride('cols', item.config, { cols });
1056
+ const rowsRaw = field?.definition?.rows ?? undefined;
1057
+ const rowsParsed = rowsRaw === undefined ? undefined : Number.parseInt(String(rowsRaw), 10);
1058
+ const rows = rowsParsed !== undefined && Number.isFinite(rowsParsed) ? rowsParsed : undefined;
1059
+ this.sharedProps.setPropOverride('rows', item.config, { rows });
1060
+ }
1061
+ visitTextAreaFieldModelDefinition(item) {
1062
+ const field = this.getV4Data();
1063
+ item.config = new sails_ng_common_19.TextAreaFieldModelConfig();
1064
+ this.sharedPopulateFieldModelConfig(item.config, field);
1065
+ }
1066
+ visitTextAreaFormComponentDefinition(item) {
1067
+ this.populateFormComponent(item);
1068
+ }
1069
+ /* Rich Text Editor */
1070
+ visitRichTextEditorFieldComponentDefinition(item) {
1071
+ const field = this.getV4Data();
1072
+ item.config = new sails_ng_common_21.RichTextEditorFieldComponentConfig();
1073
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1074
+ const v4ClassName = field?.class?.toString() ?? '';
1075
+ if (v4ClassName === 'MarkdownTextArea') {
1076
+ item.config.outputFormat = 'markdown';
1077
+ }
1078
+ }
1079
+ visitRichTextEditorFieldModelDefinition(item) {
1080
+ const field = this.getV4Data();
1081
+ item.config = new sails_ng_common_21.RichTextEditorFieldModelConfig();
1082
+ this.sharedPopulateFieldModelConfig(item.config, field);
1083
+ }
1084
+ visitRichTextEditorFormComponentDefinition(item) {
1085
+ this.populateFormComponent(item);
1086
+ }
1087
+ /* Map */
1088
+ visitMapFieldComponentDefinition(item) {
1089
+ const field = this.getV4Data();
1090
+ item.config = new sails_ng_common_50.MapFieldComponentConfig();
1091
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1092
+ const rawDefinition = (field?.definition ?? {});
1093
+ const leafletOptions = this.readObject(rawDefinition.leafletOptions);
1094
+ const drawOptions = this.readObject(rawDefinition.drawOptions);
1095
+ const center = this.extractLegacyMapCenter(leafletOptions);
1096
+ if (center) {
1097
+ this.sharedProps.setPropOverride('center', item.config, { center });
1098
+ }
1099
+ const zoom = this.extractLegacyMapZoom(leafletOptions);
1100
+ if (zoom !== undefined) {
1101
+ this.sharedProps.setPropOverride('zoom', item.config, { zoom });
1102
+ }
1103
+ const tileLayers = this.extractLegacyMapTileLayers(rawDefinition);
1104
+ if (tileLayers.length > 0) {
1105
+ this.sharedProps.setPropOverride('tileLayers', item.config, { tileLayers });
1106
+ }
1107
+ const enabledModes = this.extractLegacyMapEnabledModes(drawOptions);
1108
+ if (enabledModes.length > 0) {
1109
+ this.sharedProps.setPropOverride('enabledModes', item.config, { enabledModes });
1110
+ }
1111
+ }
1112
+ visitMapFieldModelDefinition(item) {
1113
+ const field = this.getV4Data();
1114
+ item.config = new sails_ng_common_50.MapFieldModelConfig();
1115
+ this.sharedPopulateFieldModelConfig(item.config, field);
1116
+ this.coerceMapFeatureCollection(item.config);
1117
+ }
1118
+ visitMapFormComponentDefinition(item) {
1119
+ this.populateFormComponent(item);
1120
+ }
1121
+ /* File Upload */
1122
+ visitFileUploadFieldComponentDefinition(item) {
1123
+ const field = this.getV4Data();
1124
+ item.config = new sails_ng_common_52.FileUploadFieldComponentConfig();
1125
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1126
+ const restrictions = this.readObject(field?.definition?.restrictions);
1127
+ if (restrictions) {
1128
+ this.sharedProps.setPropOverride('restrictions', item.config, { restrictions });
1129
+ }
1130
+ const uppyDashboardNote = field?.definition?.uppyDashboardNote;
1131
+ if (uppyDashboardNote) {
1132
+ this.sharedProps.setPropOverride('uppyDashboardNote', item.config, { uppyDashboardNote });
1133
+ }
1134
+ const notesEnabled = field?.definition?.notesEnabled;
1135
+ if (typeof notesEnabled === 'boolean') {
1136
+ const metadataFields = notesEnabled
1137
+ ? [
1138
+ {
1139
+ id: 'notes',
1140
+ name: 'Notes',
1141
+ placeholder: 'Notes about this file.',
1142
+ },
1143
+ ]
1144
+ : [];
1145
+ this.sharedProps.setPropOverride('restrictions', item.config, {
1146
+ restrictions: {
1147
+ ...(item.config.restrictions ?? {}),
1148
+ metadataFields,
1149
+ },
1150
+ });
1151
+ }
1152
+ }
1153
+ visitFileUploadFieldModelDefinition(item) {
1154
+ const field = this.getV4Data();
1155
+ item.config = new sails_ng_common_52.FileUploadFieldModelConfig();
1156
+ this.sharedPopulateFieldModelConfig(item.config, field);
1157
+ }
1158
+ visitFileUploadFormComponentDefinition(item) {
1159
+ this.populateFormComponent(item);
1160
+ }
1161
+ /* PDF List */
1162
+ visitPDFListFieldComponentDefinition(item) {
1163
+ const field = this.getV4Data();
1164
+ item.config = new sails_ng_common_54.PDFListFieldComponentConfig();
1165
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1166
+ const mappedProps = [
1167
+ 'startsWith',
1168
+ 'recentPdfLimit',
1169
+ 'showVersionCounter',
1170
+ 'showVersionColumn',
1171
+ 'versionColumnValueField',
1172
+ 'versionColumnLabelKey',
1173
+ 'useVersionLabelForFileName',
1174
+ 'downloadBtnLabel',
1175
+ 'downloadPreviousBtnLabel',
1176
+ 'downloadPrefix',
1177
+ 'fileNameTemplate',
1178
+ ];
1179
+ for (const prop of mappedProps) {
1180
+ if (field?.definition?.[prop] !== undefined) {
1181
+ const value = prop === 'fileNameTemplate'
1182
+ ? this.convertLegacyPdfListFileNameTemplate(field.definition[prop])
1183
+ : field.definition[prop];
1184
+ this.sharedProps.setPropOverride(prop, item.config, { [prop]: value });
1185
+ }
1186
+ }
1187
+ }
1188
+ convertLegacyPdfListFileNameTemplate(value) {
1189
+ if (typeof value !== 'string') {
1190
+ return value;
1191
+ }
1192
+ return value.replace(/<%=\s*([\s\S]+?)\s*%>/g, '{{$1}}');
1193
+ }
1194
+ visitPDFListFieldModelDefinition(item) {
1195
+ const field = this.getV4Data();
1196
+ item.config = new sails_ng_common_54.PDFListFieldModelConfig();
1197
+ this.sharedPopulateFieldModelConfig(item.config, field);
1198
+ }
1199
+ visitPDFListFormComponentDefinition(item) {
1200
+ this.populateFormComponent(item);
1201
+ }
1202
+ /* Data Location */
1203
+ visitDataLocationFieldComponentDefinition(item) {
1204
+ const field = this.getV4Data();
1205
+ item.config = new sails_ng_common_56.DataLocationFieldComponentConfig();
1206
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1207
+ const mappedProps = [
1208
+ 'restrictions',
1209
+ 'uppyDashboardNote',
1210
+ 'notesEnabled',
1211
+ 'iscEnabled',
1212
+ 'iscHeader',
1213
+ 'defaultSelect',
1214
+ 'securityClassificationOptions',
1215
+ 'locationAddText',
1216
+ 'typeHeader',
1217
+ 'locationHeader',
1218
+ 'columns',
1219
+ 'notesHeader',
1220
+ 'dataTypes',
1221
+ 'dataTypeLookup',
1222
+ 'hideNotesForLocationTypes',
1223
+ 'allowUploadWithoutSave',
1224
+ 'editNotesButtonText',
1225
+ 'editNotesTitle',
1226
+ 'cancelEditNotesButtonText',
1227
+ 'applyEditNotesButtonText',
1228
+ 'editNotesCssClasses'
1229
+ ];
1230
+ for (const prop of mappedProps) {
1231
+ if (field?.definition?.[prop] !== undefined) {
1232
+ this.sharedProps.setPropOverride(prop, item.config, { [prop]: field.definition[prop] });
1233
+ }
1234
+ }
1235
+ }
1236
+ visitDataLocationFieldModelDefinition(item) {
1237
+ const field = this.getV4Data();
1238
+ item.config = new sails_ng_common_56.DataLocationFieldModelConfig();
1239
+ this.sharedPopulateFieldModelConfig(item.config, field);
1240
+ }
1241
+ visitDataLocationFormComponentDefinition(item) {
1242
+ this.populateFormComponent(item);
1243
+ }
1244
+ visitPublishDataLocationSelectorFieldComponentDefinition(item) {
1245
+ const field = this.getV4Data();
1246
+ item.config = new sails_ng_common_58.PublishDataLocationSelectorFieldComponentConfig();
1247
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1248
+ const mappedProps = [
1249
+ 'columns',
1250
+ 'editNotesButtonText',
1251
+ 'editNotesTitle',
1252
+ 'cancelEditNotesButtonText',
1253
+ 'applyEditNotesButtonText',
1254
+ 'editNotesCssClasses',
1255
+ 'typeHeader',
1256
+ 'locationHeader',
1257
+ 'notesHeader',
1258
+ 'iscHeader',
1259
+ 'iscEnabled',
1260
+ 'notesEnabled',
1261
+ 'noLocationSelectedText',
1262
+ 'noLocationSelectedHelp',
1263
+ 'publicCheck',
1264
+ 'selectionCriteria',
1265
+ 'dataTypes',
1266
+ 'dataTypeLookup',
1267
+ ];
1268
+ for (const prop of mappedProps) {
1269
+ if (field?.definition?.[prop] !== undefined) {
1270
+ this.sharedProps.setPropOverride(prop, item.config, { [prop]: field.definition[prop] });
1271
+ }
1272
+ }
1273
+ }
1274
+ visitPublishDataLocationSelectorFieldModelDefinition(item) {
1275
+ const field = this.getV4Data();
1276
+ item.config = new sails_ng_common_58.PublishDataLocationSelectorFieldModelConfig();
1277
+ this.sharedPopulateFieldModelConfig(item.config, field);
1278
+ }
1279
+ visitPublishDataLocationSelectorFormComponentDefinition(item) {
1280
+ this.populateFormComponent(item);
1281
+ const field = this.getV4Data();
1282
+ const definition = (field?.definition ?? {});
1283
+ const subscribe = (definition.subscribe ?? {});
1284
+ const expressions = item.expressions ?? [];
1285
+ for (const [sourceName, sourceConfigUnknown] of Object.entries(subscribe)) {
1286
+ const sourceConfig = (sourceConfigUnknown ?? {});
1287
+ const onValueUpdate = Array.isArray(sourceConfig.onValueUpdate)
1288
+ ? sourceConfig.onValueUpdate
1289
+ : [];
1290
+ const sourcePointer = this.resolveComponentAngularComponentsJsonPointer(sourceName, this.getCurrentContainerAngularComponentsJsonPointer(item.name));
1291
+ for (const actionConfig of onValueUpdate) {
1292
+ if (actionConfig?.action !== 'utilityService.getPropertyFromObject') {
1293
+ continue;
1294
+ }
1295
+ const propertyName = String(actionConfig.field ?? '').trim();
1296
+ if (!propertyName) {
1297
+ continue;
1298
+ }
1299
+ expressions.push({
1300
+ name: `${sourceName}-${item.name}-${propertyName}`.replace(/[^a-zA-Z0-9_-]+/g, '-'),
1301
+ description: `Populate ${item.name} from ${sourceName} metadata`,
1302
+ config: {
1303
+ conditionKind: sails_ng_common_63.ExpressionsConditionKind.JSONPointer,
1304
+ runOnFormReady: false,
1305
+ condition: `${sourcePointer}::field.value.changed`,
1306
+ target: 'model.value',
1307
+ hasTemplate: true,
1308
+ template: this.buildEventValueTemplate(propertyName),
1309
+ },
1310
+ });
1311
+ }
1312
+ }
1313
+ if (expressions.length > 0) {
1314
+ item.expressions = expressions;
1315
+ }
1316
+ }
1317
+ /* Default Layout */
1318
+ visitDefaultFieldLayoutDefinition(item) {
1319
+ const field = this.getV4Data();
1320
+ item.config = new sails_ng_common_9.DefaultFieldLayoutConfig();
1321
+ this.sharedPopulateFieldLayoutConfig(item.config, field);
1322
+ const v4ClassName = `${field?.class ?? ''}`.trim();
1323
+ if (v4ClassName === 'AnchorOrButton' || this.isInsideLegacyInlineContainer()) {
1324
+ item.config.label = undefined;
1325
+ }
1326
+ }
1327
+ visitActionRowFieldLayoutDefinition(item) {
1328
+ const field = this.getV4Data();
1329
+ item.config = new sails_ng_common_11.ActionRowFieldLayoutConfig();
1330
+ this.sharedPopulateFieldLayoutConfig(item.config, field);
1331
+ if (this.isLegacyInlineContainer(field)) {
1332
+ item.config.alignment = 'start';
1333
+ item.config.compact = true;
1334
+ item.config.containerCssClass = this.mergeCssClassTokens(item.config.containerCssClass, 'rb-form-action-row--legacy-inline');
1335
+ }
1336
+ }
1337
+ /* Checkbox Input */
1338
+ visitCheckboxInputFieldComponentDefinition(item) {
1339
+ const field = this.getV4Data();
1340
+ item.config = new sails_ng_common_27.CheckboxInputFieldComponentConfig();
1341
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1342
+ const options = this.migrateOptions(field);
1343
+ this.sharedProps.setPropOverride('options', item.config, { options: options });
1344
+ }
1345
+ visitCheckboxInputFieldModelDefinition(item) {
1346
+ const field = this.getV4Data();
1347
+ item.config = new sails_ng_common_27.CheckboxInputFieldModelConfig();
1348
+ this.sharedPopulateFieldModelConfig(item.config, field);
1349
+ const definition = (field?.definition ?? {});
1350
+ const rawDefaultValue = definition.value ?? definition.defaultValue;
1351
+ const hasOptions = Array.isArray(definition.options) && definition.options.length > 0;
1352
+ if (definition.controlType === 'checkbox' && typeof rawDefaultValue === 'boolean' && !hasOptions) {
1353
+ delete item.config.defaultValue;
1354
+ }
1355
+ }
1356
+ visitCheckboxInputFormComponentDefinition(item) {
1357
+ this.populateFormComponent(item);
1358
+ }
1359
+ /* Checkbox Tree */
1360
+ visitCheckboxTreeFieldComponentDefinition(item) {
1361
+ const field = this.getV4Data();
1362
+ item.config = new sails_ng_common_46.CheckboxTreeFieldComponentConfig();
1363
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1364
+ const rawDefinition = (field?.definition ?? {});
1365
+ const vocabRef = String(rawDefinition.vocabRef ?? rawDefinition.vocabId ?? '').trim();
1366
+ if (!vocabRef) {
1367
+ this.logger.warn(`${this.logName}: CheckboxTree migration missing vocabId/vocabRef at ${JSON.stringify(this.v4FormPath)}.`);
1368
+ }
1369
+ else {
1370
+ this.sharedProps.setPropOverride('vocabRef', item.config, { vocabRef });
1371
+ }
1372
+ const inlineVocab = this.parseLegacyBooleanFlag(rawDefinition.inlineVocab, undefined, 'inlineVocab');
1373
+ if (inlineVocab !== undefined) {
1374
+ this.sharedProps.setPropOverride('inlineVocab', item.config, { inlineVocab });
1375
+ }
1376
+ const leafOnly = this.parseLegacyBooleanFlag(rawDefinition.leafOnly, true, 'leafOnly');
1377
+ this.sharedProps.setPropOverride('leafOnly', item.config, { leafOnly });
1378
+ const maxDepth = this.parseLegacyPositiveInteger(rawDefinition.maxDepth, 'maxDepth');
1379
+ if (maxDepth !== undefined) {
1380
+ this.sharedProps.setPropOverride('maxDepth', item.config, { maxDepth });
1381
+ }
1382
+ if (this.isLegacyAndsVocabField(field)) {
1383
+ this.sharedProps.setPropOverride('labelTemplate', item.config, {
1384
+ labelTemplate: andsVocabDefaultLabelTemplate,
1385
+ });
1386
+ }
1387
+ this.warnOnMalformedLegacyRegex(rawDefinition);
1388
+ }
1389
+ visitCheckboxTreeFieldModelDefinition(item) {
1390
+ const field = this.getV4Data();
1391
+ item.config = new sails_ng_common_46.CheckboxTreeFieldModelConfig();
1392
+ this.sharedPopulateFieldModelConfig(item.config, field);
1393
+ this.coerceCheckboxTreeDefaultValue(item.config);
1394
+ }
1395
+ visitCheckboxTreeFormComponentDefinition(item) {
1396
+ this.populateFormComponent(item);
1397
+ }
1398
+ /* Record Selector */
1399
+ visitRecordSelectorFieldComponentDefinition(item) {
1400
+ const field = this.getV4Data();
1401
+ item.config = new sails_ng_common_48.RecordSelectorFieldComponentConfig();
1402
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1403
+ const definition = (field?.definition ?? {});
1404
+ this.sharedProps.setPropOverride('columnTitle', item.config, {
1405
+ columnTitle: String(definition.columnTitle ?? 'Record title'),
1406
+ });
1407
+ this.sharedProps.setPropOverride('recordType', item.config, {
1408
+ recordType: typeof definition.recordType === 'string' ? definition.recordType : undefined,
1409
+ });
1410
+ this.sharedProps.setPropOverride('workflowState', item.config, {
1411
+ workflowState: typeof definition.workflowState === 'string' ? definition.workflowState : '',
1412
+ });
1413
+ const v4FilterMode = typeof definition.filterMode === 'string' ? definition.filterMode : 'default';
1414
+ let filterMode = 'default';
1415
+ switch (String(v4FilterMode).trim().toLowerCase()) {
1416
+ case '':
1417
+ case 'default':
1418
+ filterMode = 'default';
1419
+ break;
1420
+ case 'equal':
1421
+ case 'exact':
1422
+ filterMode = 'equal';
1423
+ break;
1424
+ default:
1425
+ filterMode = 'regex';
1426
+ break;
1427
+ }
1428
+ this.sharedProps.setPropOverride('filterMode', item.config, {
1429
+ filterMode,
1430
+ });
1431
+ this.sharedProps.setPropOverride('filterFields', item.config, {
1432
+ filterFields: Array.isArray(definition.filterFields)
1433
+ ? definition.filterFields.map((fieldName) => String(fieldName))
1434
+ : [],
1435
+ });
1436
+ }
1437
+ visitRecordSelectorFieldModelDefinition(item) {
1438
+ const field = this.getV4Data();
1439
+ item.config = new sails_ng_common_48.RecordSelectorFieldModelConfig();
1440
+ this.sharedPopulateFieldModelConfig(item.config, field);
1441
+ const coerceRecordSelectorValue = (value) => {
1442
+ if (!value || typeof value !== 'object') {
1443
+ return null;
1444
+ }
1445
+ const oid = typeof value.oid === 'string'
1446
+ ? String(value.oid).trim()
1447
+ : '';
1448
+ if (!oid) {
1449
+ return null;
1450
+ }
1451
+ const title = typeof value.title === 'string'
1452
+ ? String(value.title)
1453
+ : undefined;
1454
+ return title ? { oid, title } : { oid };
1455
+ };
1456
+ if (item.config.defaultValue !== undefined) {
1457
+ item.config.defaultValue = coerceRecordSelectorValue(item.config.defaultValue);
1458
+ }
1459
+ if (item.config.value !== undefined) {
1460
+ item.config.value = coerceRecordSelectorValue(item.config.value);
1461
+ }
1462
+ }
1463
+ visitRecordSelectorFormComponentDefinition(item) {
1464
+ this.populateFormComponent(item);
1465
+ }
1466
+ /* Dropdown Input */
1467
+ visitDropdownInputFieldComponentDefinition(item) {
1468
+ const field = this.getV4Data();
1469
+ item.config = new sails_ng_common_24.DropdownInputFieldComponentConfig();
1470
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1471
+ const options = this.migrateOptions(field);
1472
+ this.sharedProps.setPropOverride('options', item.config, { options: options });
1473
+ }
1474
+ visitDropdownInputFieldModelDefinition(item) {
1475
+ const field = this.getV4Data();
1476
+ item.config = new sails_ng_common_24.DropdownInputFieldModelConfig();
1477
+ this.sharedPopulateFieldModelConfig(item.config, field);
1478
+ }
1479
+ visitDropdownInputFormComponentDefinition(item) {
1480
+ this.populateFormComponent(item);
1481
+ }
1482
+ /* Typeahead Input */
1483
+ visitTypeaheadInputFieldComponentDefinition(item) {
1484
+ const field = this.getV4Data();
1485
+ item.config = new sails_ng_common_26.TypeaheadInputFieldComponentConfig();
1486
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1487
+ const definition = (field?.definition ?? {});
1488
+ const sourceType = this.resolveTypeaheadSourceType(definition);
1489
+ this.sharedProps.setPropOverride('sourceType', item.config, { sourceType });
1490
+ if (sourceType === 'namedQuery') {
1491
+ const queryId = String(definition.vocabQueryId ?? definition.queryId ?? '').trim();
1492
+ if (queryId) {
1493
+ this.sharedProps.setPropOverride('queryId', item.config, { queryId });
1494
+ }
1495
+ else {
1496
+ this.logger.warn(`${this.logName}: Typeahead migration missing queryId/vocabQueryId at ${JSON.stringify(this.v4FormPath)}.`);
1497
+ }
1498
+ const labelField = this.resolveLegacyLabelField(definition);
1499
+ this.sharedProps.setPropOverride('labelField', item.config, { labelField });
1500
+ const valueField = String(definition.valueFieldName ?? definition.valueField ?? 'value').trim() || 'value';
1501
+ this.sharedProps.setPropOverride('valueField', item.config, { valueField });
1502
+ }
1503
+ else if (sourceType === 'static') {
1504
+ const labelField = this.resolveLegacyLabelField(definition);
1505
+ const valueField = String(definition.valueFieldName ?? definition.valueField ?? 'value').trim() || 'value';
1506
+ const normalizedOptions = this.normalizeLegacyTypeaheadStaticOptions(definition, labelField, valueField);
1507
+ this.sharedProps.setPropOverride('options', item.config, { options: normalizedOptions });
1508
+ this.sharedProps.setPropOverride('staticOptions', item.config, { staticOptions: normalizedOptions });
1509
+ }
1510
+ else if (sourceType === 'vocabulary') {
1511
+ const vocabRef = String(definition.vocabRef ?? definition.vocabId ?? '').trim();
1512
+ if (vocabRef) {
1513
+ this.sharedProps.setPropOverride('vocabRef', item.config, { vocabRef });
1514
+ }
1515
+ else {
1516
+ this.logger.warn(`${this.logName}: Typeahead migration missing vocabRef/vocabId at ${JSON.stringify(this.v4FormPath)}.`);
1517
+ }
1518
+ }
1519
+ else if (sourceType === 'external') {
1520
+ const provider = String(definition.provider ?? '').trim();
1521
+ if (provider) {
1522
+ this.sharedProps.setPropOverride('provider', item.config, { provider });
1523
+ }
1524
+ else {
1525
+ this.logger.warn(`${this.logName}: Typeahead migration missing provider at ${JSON.stringify(this.v4FormPath)}.`);
1526
+ }
1527
+ const resultArrayProperty = String(definition.resultArrayProperty ?? '').trim();
1528
+ if (resultArrayProperty) {
1529
+ this.sharedProps.setPropOverride('resultArrayProperty', item.config, { resultArrayProperty });
1530
+ }
1531
+ const labelField = this.resolveLegacyLabelField(definition);
1532
+ this.sharedProps.setPropOverride('labelField', item.config, { labelField });
1533
+ const valueField = String(definition.valueFieldName ?? definition.valueField ?? labelField).trim() || labelField;
1534
+ this.sharedProps.setPropOverride('valueField', item.config, { valueField });
1535
+ }
1536
+ const requireSelection = !this.parseLegacyTypeaheadBoolean(definition.freeText, false, 'freeText');
1537
+ this.sharedProps.setPropOverride('requireSelection', item.config, { requireSelection });
1538
+ const storeLabelOnly = this.parseLegacyTypeaheadBoolean(definition.storeLabelOnly, true, 'storeLabelOnly');
1539
+ const valueMode = storeLabelOnly ? 'value' : 'optionObject';
1540
+ this.sharedProps.setPropOverride('valueMode', item.config, { valueMode });
1541
+ const readOnlyAfterSelect = this.parseLegacyTypeaheadBoolean(definition.disableEditAfterSelect, false, 'disableEditAfterSelect');
1542
+ if (readOnlyAfterSelect) {
1543
+ this.sharedProps.setPropOverride('readOnlyAfterSelect', item.config, { readOnlyAfterSelect });
1544
+ }
1545
+ this.warnOnDroppedLegacyTypeaheadProperties(definition);
1546
+ }
1547
+ visitTypeaheadInputFieldModelDefinition(item) {
1548
+ const field = this.getV4Data();
1549
+ item.config = new sails_ng_common_26.TypeaheadInputFieldModelConfig();
1550
+ this.sharedPopulateFieldModelConfig(item.config, field);
1551
+ const definition = (field?.definition ?? {});
1552
+ const labelField = this.resolveLegacyLabelField(definition);
1553
+ const storeLabelOnly = this.parseLegacyTypeaheadBoolean(definition.storeLabelOnly, true, 'storeLabelOnly');
1554
+ const valueMode = storeLabelOnly ? 'value' : 'optionObject';
1555
+ if (item.config.defaultValue !== undefined) {
1556
+ item.config.defaultValue = this.coerceLegacyTypeaheadValue(item.config.defaultValue, valueMode, labelField);
1557
+ }
1558
+ if (item.config.value !== undefined) {
1559
+ item.config.value = this.coerceLegacyTypeaheadValue(item.config.value, valueMode, labelField);
1560
+ }
1561
+ }
1562
+ visitTypeaheadInputFormComponentDefinition(item) {
1563
+ this.populateFormComponent(item);
1564
+ }
1565
+ /* Radio Input */
1566
+ visitRadioInputFieldComponentDefinition(item) {
1567
+ const field = this.getV4Data();
1568
+ item.config = new sails_ng_common_28.RadioInputFieldComponentConfig();
1569
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1570
+ const options = this.migrateOptions(field);
1571
+ this.sharedProps.setPropOverride('options', item.config, { options: options });
1572
+ }
1573
+ visitRadioInputFieldModelDefinition(item) {
1574
+ const field = this.getV4Data();
1575
+ item.config = new sails_ng_common_28.RadioInputFieldModelConfig();
1576
+ this.sharedPopulateFieldModelConfig(item.config, field);
1577
+ }
1578
+ visitRadioInputFormComponentDefinition(item) {
1579
+ this.populateFormComponent(item);
1580
+ }
1581
+ /* Date Input */
1582
+ visitDateInputFieldComponentDefinition(item) {
1583
+ const field = this.getV4Data();
1584
+ item.config = new sails_ng_common_30.DateInputFieldComponentConfig();
1585
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1586
+ }
1587
+ visitDateInputFieldModelDefinition(item) {
1588
+ const field = this.getV4Data();
1589
+ item.config = new sails_ng_common_30.DateInputFieldModelConfig();
1590
+ this.sharedPopulateFieldModelConfig(item.config, field);
1591
+ }
1592
+ visitDateInputFormComponentDefinition(item) {
1593
+ this.populateFormComponent(item);
1594
+ }
1595
+ /* Reusable */
1596
+ visitReusableFieldComponentDefinition(item) {
1597
+ const field = this.getV4Data();
1598
+ item.config = new sails_ng_common_65.ReusableFieldComponentConfig();
1599
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1600
+ // Set up the reusable form config for ContributorField in the field component.
1601
+ const v4ClassName = field?.class?.toString() ?? '';
1602
+ if (v4ClassName === 'ContributorField') {
1603
+ const fieldDefinition = (field?.definition ?? {});
1604
+ // TODO: use more of the contributor field properties on the new component?
1605
+ const name = fieldDefinition.name?.toString() ?? fieldDefinition.id?.toString() ?? '';
1606
+ // The elementTemplate name must be falsy.
1607
+ // If this ContributorField is inside a RepeatableContributor's elementTemplate,
1608
+ // we must provide a falsy replaceName so the ConstructVisitor's validation passes.
1609
+ const replaceName = this.isRepeatableElementTemplateDescendant() ? '' : name;
1610
+ const reusableFormName = this.getLegacyContributorReusableFormName(fieldDefinition);
1611
+ const reusableGroupItemName = this.getLegacyContributorReusableGroupItemName(reusableFormName);
1612
+ // Use the same field, so don't change the lineage path.
1613
+ const reusableComponentItemData = {
1614
+ name: reusableGroupItemName,
1615
+ overrides: { replaceName },
1616
+ layout: { class: 'DefaultLayout', config: {} },
1617
+ component: { class: 'GroupComponent', config: {} },
1618
+ };
1619
+ const reusableComponentItem = this.sharedProps.sharedConstructFormComponent(reusableComponentItemData);
1620
+ if (reusableComponentItem.component?.config) {
1621
+ this.sharedPopulateFieldComponentConfig(reusableComponentItem.component.config, field);
1622
+ }
1623
+ if (reusableComponentItem.layout?.config) {
1624
+ this.sharedPopulateFieldLayoutConfig(reusableComponentItem.layout.config, field);
1625
+ }
1626
+ // Visit children
1627
+ this.acceptV4FormConfigPath(reusableComponentItem, this.formPathHelper.lineagePathsForReusableFieldComponentDefinition(reusableComponentItem, 0));
1628
+ // Store the instance on the item
1629
+ item.config.componentDefinitions.push(reusableComponentItem);
1630
+ }
1631
+ }
1632
+ visitReusableFormComponentDefinition(item) {
1633
+ const field = this.getV4Data();
1634
+ const fieldDefinition = (field?.definition ?? {});
1635
+ const v4ClassName = field?.class?.toString() ?? '';
1636
+ // Set up the reusable form config for ContributorField in the form component.
1637
+ if (v4ClassName === 'ContributorField') {
1638
+ // Use a reusable form config.
1639
+ item.overrides = { reusableFormName: this.getLegacyContributorReusableFormName(fieldDefinition) };
1640
+ // ReusableComponent cannot have a layout.
1641
+ item.layout = undefined;
1642
+ }
1643
+ this.populateFormComponent(item);
1644
+ }
1645
+ /* Question Tree */
1646
+ visitQuestionTreeFieldComponentDefinition(item) {
1647
+ const field = this.getV4Data();
1648
+ item.config = new sails_ng_common_1.QuestionTreeFieldComponentConfig();
1649
+ this.sharedPopulateFieldComponentConfig(item.config, field);
1650
+ }
1651
+ visitQuestionTreeFieldModelDefinition(item) {
1652
+ const field = this.getV4Data();
1653
+ item.config = new sails_ng_common_1.QuestionTreeFieldModelConfig();
1654
+ this.sharedPopulateFieldModelConfig(item.config, field);
1655
+ }
1656
+ visitQuestionTreeFormComponentDefinition(item) {
1657
+ this.populateFormComponent(item);
1658
+ }
1659
+ /* Data classification to Question Tree config migration */
1660
+ migrateDataClassificationToQuestionTree(data) {
1661
+ const v4Definition = data.createDataClassificationStructure();
1662
+ const v4OrderedOutcomes = data.orderedOutcomes ?? [];
1663
+ // NOTE: The outcome is the 'main' result, which might be displayed, from a Question Tree.
1664
+ // The outcome meta is additional data that can be included in any outcomes, but is not the 'main' outcome.
1665
+ // A question tree may have multiple outcomes, and multiple meta properties, each with the same or multiple values.
1666
+ const availableOutcomes = v4OrderedOutcomes.map(o => {
1667
+ return { value: o, label: o };
1668
+ });
1669
+ const availableMeta = {};
1670
+ const questions = [];
1671
+ const defaultOutcomePropName = "classification";
1672
+ for (const [questionId, questionInfo] of Object.entries(v4Definition)) {
1673
+ const qInfo = questionInfo;
1674
+ const rawConditions = qInfo?.conditions;
1675
+ const rawAnswers = (Array.isArray(qInfo?.answers) ? qInfo?.answers : []) ?? [];
1676
+ const rawLabel = qInfo?.label;
1677
+ // const rawHelp = qInfo?.help;
1678
+ const rawMinAnswers = qInfo?.minAnswers;
1679
+ const rawMaxAnswers = qInfo?.maxAnswers;
1680
+ const questionAnswers = [];
1681
+ for (const rawAnswer of rawAnswers) {
1682
+ const answerValue = rawAnswer?.value;
1683
+ const answerLabel = rawAnswer?.label;
1684
+ const answerOutcome = rawAnswer?.outcome;
1685
+ const answerOutcomeGuessedType = (0, sails_ng_common_1.guessType)(answerOutcome);
1686
+ if (answerOutcomeGuessedType === "string") {
1687
+ questionAnswers.push({
1688
+ value: answerValue,
1689
+ label: answerLabel,
1690
+ outcome: answerOutcome,
1691
+ });
1692
+ }
1693
+ else if (answerOutcomeGuessedType === 'object') {
1694
+ // Use the v4 'classification' property as the v5 outcome,
1695
+ // any other property is outcome meta / additional data.
1696
+ const meta = Object.fromEntries(Object.entries(answerOutcome)
1697
+ .filter(([k, v]) => k !== defaultOutcomePropName && !!v)
1698
+ .map(([k, v]) => [k, v?.toString() ?? ""]));
1699
+ questionAnswers.push({
1700
+ value: answerValue,
1701
+ label: answerLabel,
1702
+ outcome: answerOutcome[defaultOutcomePropName],
1703
+ meta: meta,
1704
+ });
1705
+ Object.entries(meta).forEach(([k, v]) => {
1706
+ if (!(k in availableMeta)) {
1707
+ availableMeta[k] = {};
1708
+ }
1709
+ if (!(v in availableMeta[k])) {
1710
+ availableMeta[k][v] = v;
1711
+ }
1712
+ });
1713
+ }
1714
+ else if (["undefined", "null"].includes(answerOutcomeGuessedType)) {
1715
+ questionAnswers.push({
1716
+ value: answerValue,
1717
+ label: answerLabel,
1718
+ });
1719
+ }
1720
+ else {
1721
+ throw new Error(JSON.stringify({ answerOutcomeGuessedType, rawAnswer }));
1722
+ }
1723
+ }
1724
+ const rules = {
1725
+ op: "or", args: [
1726
+ ...Object.entries(rawConditions).map(([ruleQuestionId, ruleAnswerValue]) => {
1727
+ return { op: "in", q: ruleQuestionId, a: ruleAnswerValue };
1728
+ })
1729
+ ]
1730
+ };
1731
+ questions.push({
1732
+ id: questionId,
1733
+ label: typeof rawLabel === "string" ? rawLabel : undefined,
1734
+ answersMin: parseInt(rawMinAnswers?.toString() ?? "1"),
1735
+ answersMax: parseInt(rawMaxAnswers?.toString() ?? "1"),
1736
+ answers: questionAnswers,
1737
+ rules: rules,
1738
+ });
1739
+ }
1740
+ return {
1741
+ availableOutcomes,
1742
+ availableMeta,
1743
+ questions,
1744
+ componentDefinitions: [],
1745
+ };
1746
+ }
1747
+ /* Shared */
1748
+ acceptV4FormConfigPath(item, more, v4FormPath) {
1749
+ // Copy the original lineage paths so they can be restored.
1750
+ const original = [...(this.v4FormPath ?? [])];
1751
+ try {
1752
+ this.v4FormPath = [...original, ...(v4FormPath ?? [])];
1753
+ this.formPathHelper.acceptFormPath(item, more);
1754
+ }
1755
+ finally {
1756
+ this.v4FormPath = original;
1757
+ }
1758
+ }
1759
+ mapV4ToV5(v4Field) {
1760
+ const v4ClassName = v4Field?.class?.toString() ?? '';
1761
+ const v4CompClassName = v4Field?.compClass?.toString() ?? '';
1762
+ const matched = formConfigV4ToV5Mapping[v4ClassName]?.[v4CompClassName] ?? {};
1763
+ const v4ClassNames = { v4ClassName, v4CompClassName };
1764
+ return postProcessingFormConfigV4ToV5Mapping(v4Field, v4ClassNames, matched);
1765
+ }
1766
+ shouldOmitLegacyField(field, v4FormPathMore) {
1767
+ const v4ClassName = `${field?.class ?? ''}`.trim();
1768
+ const v4CompClassName = `${field?.compClass ?? ''}`.trim();
1769
+ const definition = (field?.definition ?? {});
1770
+ const isLegacyParameterRetriever = v4ClassName === 'ParameterRetriever' || v4CompClassName === 'ParameterRetrieverComponent';
1771
+ if (!isLegacyParameterRetriever) {
1772
+ return false;
1773
+ }
1774
+ const v4Name = `${definition?.name ?? definition?.id ?? ''}`.trim();
1775
+ const fullPath = [...(this.v4FormPath ?? []), ...(v4FormPathMore ?? [])];
1776
+ this.logger.warn(`${this.logName}: Omitting legacy ParameterRetriever '${v4Name}' at ${JSON.stringify(fullPath)}. URL request params are now available via FormComponent.requestParams/getRequestParam and JSONata requestParams runtime context.`);
1777
+ return true;
1778
+ }
1779
+ constructFormComponent(field, more) {
1780
+ const { componentClassName, modelClassName, layoutClassName: mappedLayoutClassName } = this.mapV4ToV5(field);
1781
+ let layoutClassName = mappedLayoutClassName;
1782
+ const definition = (field?.definition ?? {});
1783
+ const isLegacyInlineContainer = this.isLegacyInlineContainer(field);
1784
+ const name = String(definition.name ?? definition.id ?? [componentClassName, ...this.v4FormPath, ...(more ?? [])].join('-'));
1785
+ // Build the form component definition frame
1786
+ const currentData = {
1787
+ name: name,
1788
+ module: undefined,
1789
+ component: {
1790
+ class: componentClassName,
1791
+ config: {},
1792
+ },
1793
+ };
1794
+ if (modelClassName) {
1795
+ currentData.model = { class: modelClassName, config: {} };
1796
+ }
1797
+ // TODO: Give everything a layout for now.
1798
+ if (!layoutClassName) {
1799
+ layoutClassName = 'DefaultLayout';
1800
+ }
1801
+ if (isLegacyInlineContainer && componentClassName === sails_ng_common_2.GroupFieldComponentName) {
1802
+ layoutClassName = sails_ng_common_10.ActionRowLayoutName;
1803
+ }
1804
+ if (this.shouldUseInlineLayoutForAnchorButton(field, componentClassName)) {
1805
+ layoutClassName = sails_ng_common_12.InlineLayoutName;
1806
+ }
1807
+ if (this.isInsideButtonBarContainer && this.shouldUseInlineLayoutInButtonBar(componentClassName)) {
1808
+ layoutClassName = sails_ng_common_12.InlineLayoutName;
1809
+ }
1810
+ if (this.isInsideLegacyInlineContainer() && !isLegacyInlineContainer) {
1811
+ layoutClassName = sails_ng_common_12.InlineLayoutName;
1812
+ }
1813
+ currentData.layout = { class: layoutClassName, config: {} };
1814
+ // Set the constraints
1815
+ currentData.constraints = {};
1816
+ const editOnly = field?.editOnly === true || definition?.editOnly === true;
1817
+ const viewOnly = field?.viewOnly === true || definition?.viewOnly === true;
1818
+ if (editOnly || viewOnly) {
1819
+ currentData.constraints.allowModes = [];
1820
+ if (editOnly) {
1821
+ currentData.constraints.allowModes.push('edit');
1822
+ }
1823
+ if (viewOnly) {
1824
+ currentData.constraints.allowModes.push('view');
1825
+ if (currentData.component.class) {
1826
+ const viewComponentClassName = currentData.component.class === sails_ng_common_20.RichTextEditorComponentName
1827
+ ? sails_ng_common_13.ContentComponentName
1828
+ : currentData.component.class;
1829
+ currentData.overrides = {
1830
+ ...(currentData.overrides ?? {}),
1831
+ formModeClasses: {
1832
+ ...(currentData.overrides?.formModeClasses ?? {}),
1833
+ view: {
1834
+ ...(currentData.overrides?.formModeClasses?.view ?? {}),
1835
+ component: viewComponentClassName,
1836
+ },
1837
+ },
1838
+ };
1839
+ }
1840
+ }
1841
+ }
1842
+ if (isLegacyInlineContainer && currentData.component.class === sails_ng_common_2.GroupFieldComponentName) {
1843
+ currentData.overrides = {
1844
+ ...(currentData.overrides ?? {}),
1845
+ formModeClasses: {
1846
+ ...(currentData.overrides?.formModeClasses ?? {}),
1847
+ view: {
1848
+ ...(currentData.overrides?.formModeClasses?.view ?? {}),
1849
+ component: sails_ng_common_2.GroupFieldComponentName,
1850
+ },
1851
+ },
1852
+ };
1853
+ }
1854
+ currentData.constraints.authorization = {};
1855
+ currentData.constraints.authorization.allowRoles = [];
1856
+ const roles = Array.isArray(field?.roles) ? field.roles : [];
1857
+ if (roles.length > 0) {
1858
+ currentData.constraints.authorization.allowRoles.push(...roles);
1859
+ }
1860
+ // TODO: Set the expressions
1861
+ // If there is an error message or the form component class is not known,
1862
+ // create a content component instead.
1863
+ // The content is set when visiting the field component.
1864
+ const formComponentClass = this.formComponentMap?.get(componentClassName);
1865
+ if (!componentClassName || !formComponentClass) {
1866
+ currentData.component.class = sails_ng_common_13.ContentComponentName;
1867
+ currentData.layout = { class: sails_ng_common_8.DefaultLayoutName, config: {} };
1868
+ currentData.model = undefined;
1869
+ if (!currentData.component.config) {
1870
+ currentData.component.config = {};
1871
+ }
1872
+ if (this.isInsideLegacyInlineContainer() && !isLegacyInlineContainer) {
1873
+ currentData.layout = { class: sails_ng_common_12.InlineLayoutName, config: {} };
1874
+ }
1875
+ }
1876
+ // Construct the form component instance from the built form config frame.
1877
+ return this.sharedProps.sharedConstructFormComponent(currentData);
1878
+ }
1879
+ constructLegacyNameBindingCompanion(field, v4FormPathMore) {
1880
+ const definition = (field?.definition ?? {});
1881
+ const sourceName = typeof definition.name === 'string' ? definition.name.trim() : '';
1882
+ const sourceType = typeof definition.type === 'string' ? definition.type.trim().toLowerCase() : '';
1883
+ const sourceValue = definition.value;
1884
+ const isLegacyLinkValue = `${field?.class ?? ''}`.trim() === 'LinkValueComponent' &&
1885
+ sourceName.length > 0;
1886
+ const isLegacyHeadingTextBlock = `${field?.class ?? ''}`.trim() === 'Container' &&
1887
+ `${field?.compClass ?? ''}`.trim() === 'TextBlockComponent' &&
1888
+ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(sourceType) &&
1889
+ sourceName.length > 0 &&
1890
+ (sourceValue === undefined || sourceValue === null || sourceValue === '') &&
1891
+ (field?.viewOnly === true || definition?.viewOnly === true);
1892
+ if (!isLegacyHeadingTextBlock && !isLegacyLinkValue) {
1893
+ return undefined;
1894
+ }
1895
+ const hiddenField = {
1896
+ class: 'HiddenValue',
1897
+ compClass: 'HiddenValueComponent',
1898
+ viewOnly: true,
1899
+ roles: Array.isArray(field?.roles) ? field.roles : [],
1900
+ definition: {
1901
+ name: sourceName,
1902
+ type: 'hidden',
1903
+ },
1904
+ };
1905
+ const hiddenPath = [...(v4FormPathMore ?? [])];
1906
+ const hiddenComponent = this.constructFormComponent(hiddenField, hiddenPath);
1907
+ hiddenComponent.name = sourceName;
1908
+ const allowRoles = Array.isArray(field?.roles) ? field.roles : [];
1909
+ this.enforceLegacyHiddenBindingConfig(hiddenComponent, allowRoles);
1910
+ hiddenComponent.overrides = {
1911
+ ...(hiddenComponent.overrides ?? {}),
1912
+ formModeClasses: {
1913
+ ...(hiddenComponent.overrides?.formModeClasses ?? {}),
1914
+ view: {
1915
+ component: sails_ng_common_6.SimpleInputComponentName,
1916
+ },
1917
+ },
1918
+ };
1919
+ return {
1920
+ component: hiddenComponent,
1921
+ sourceName,
1922
+ allowRoles,
1923
+ v4FormPathMore: hiddenPath.map(i => i.toString()),
1924
+ };
1925
+ }
1926
+ enforceLegacyHiddenBindingConfig(component, allowRoles = []) {
1927
+ if (component.component?.config) {
1928
+ const hiddenComponentConfig = component.component.config;
1929
+ hiddenComponentConfig.type = 'hidden';
1930
+ hiddenComponentConfig.visible = false;
1931
+ }
1932
+ if (component.layout?.config) {
1933
+ const hiddenLayoutConfig = component.layout.config;
1934
+ hiddenLayoutConfig.visible = false;
1935
+ }
1936
+ component.constraints = {
1937
+ authorization: {
1938
+ allowRoles: [...allowRoles],
1939
+ },
1940
+ allowModes: ['view'],
1941
+ };
1942
+ }
1943
+ retargetLegacyTextBlockBinding(formComponent, sourceName, bindingName) {
1944
+ const componentConfig = formComponent?.component?.config;
1945
+ if (!componentConfig) {
1946
+ return;
1947
+ }
1948
+ if (componentConfig.content === sourceName) {
1949
+ componentConfig.content = bindingName;
1950
+ }
1951
+ }
1952
+ ensureLegacyTextBlockComponentNameIsUnique(formComponent, sourceName, v4FormPathMore) {
1953
+ if ((formComponent?.name ?? '') !== sourceName) {
1954
+ return;
1955
+ }
1956
+ const pathSuffix = (v4FormPathMore ?? []).map(i => `${i}`).join('-');
1957
+ const fallback = sourceName.length > 0 ? sourceName : 'content';
1958
+ formComponent.name = `ContentComponent-${pathSuffix || fallback}`;
1959
+ }
1960
+ populateFormComponent(item) {
1961
+ // Continue visiting
1962
+ this.formPathHelper.acceptFormComponentDefinition(item);
1963
+ // this.acceptV4FormConfigPath(item.component, {formConfig: ['component']});
1964
+ // if (item.model) {
1965
+ // this.acceptV4FormConfigPath(item.model, {formConfig: ['model']});
1966
+ // }
1967
+ // if (item.layout) {
1968
+ // this.acceptV4FormConfigPath(item.layout, {formConfig: ['layout']});
1969
+ // }
1970
+ }
1971
+ sharedPopulateFieldComponentConfig(item, field) {
1972
+ const isLegacyContributor = ['RepeatableContributor', 'ContributorField'].includes(`${field?.class ?? ''}`.trim());
1973
+ const isLegacyDataLocation = this.isLegacyDataLocationField(field);
1974
+ const definition = (field?.definition ?? {});
1975
+ const hasExplicitLabel = typeof definition.label === 'string';
1976
+ let fallbackLabel = undefined;
1977
+ if (isLegacyContributor) {
1978
+ const innerFields = definition.fields;
1979
+ if (Array.isArray(innerFields) && innerFields.length > 0) {
1980
+ const firstDefinition = (innerFields[0]?.definition ?? {});
1981
+ fallbackLabel = typeof firstDefinition.label === 'string' ? firstDefinition.label : undefined;
1982
+ }
1983
+ if (!fallbackLabel) {
1984
+ fallbackLabel = typeof definition.name === 'string' ? definition.name : undefined;
1985
+ }
1986
+ }
1987
+ const label = hasExplicitLabel
1988
+ ? definition.label
1989
+ : isLegacyDataLocation
1990
+ ? fallbackLabel
1991
+ : (typeof definition.name === 'string' ? definition.name : undefined) || fallbackLabel;
1992
+ const config = {
1993
+ label,
1994
+ };
1995
+ this.sharedProps.sharedPopulateFieldComponentConfig(item, config);
1996
+ }
1997
+ sharedPopulateFieldModelConfig(item, field) {
1998
+ const definition = (field?.definition ?? {});
1999
+ if (!item.validators) {
2000
+ item.validators = [];
2001
+ }
2002
+ if (definition.required === true) {
2003
+ item.validators.push({ class: 'required' });
2004
+ }
2005
+ if (definition.maxLength !== undefined) {
2006
+ item.validators.push({ class: 'maxLength', config: { maxLength: definition.maxLength } });
2007
+ }
2008
+ const config = {
2009
+ defaultValue: definition.value ?? definition.defaultValue,
2010
+ };
2011
+ // TODO: Components that are a descendant of a repeatable element template cannot have a default value.
2012
+ // The default values should be collected and set as the element template newEntryValue.
2013
+ if (this.isRepeatableElementTemplateDescendant()) {
2014
+ delete config['defaultValue'];
2015
+ }
2016
+ this.sharedProps.sharedPopulateFieldModelConfig(item, config);
2017
+ }
2018
+ sharedPopulateFieldLayoutConfig(item, field) {
2019
+ const isLegacyContributor = ['RepeatableContributor', 'ContributorField'].includes(`${field?.class ?? ''}`.trim());
2020
+ const isLegacyDataLocation = this.isLegacyDataLocationField(field);
2021
+ const definition = (field?.definition ?? {});
2022
+ const hasExplicitLabel = typeof definition.label === 'string';
2023
+ let fallbackLabel = undefined;
2024
+ if (isLegacyContributor) {
2025
+ const innerFields = definition.fields;
2026
+ if (Array.isArray(innerFields) && innerFields.length > 0) {
2027
+ const firstDefinition = (innerFields[0]?.definition ?? {});
2028
+ fallbackLabel = typeof firstDefinition.label === 'string' ? firstDefinition.label : undefined;
2029
+ }
2030
+ if (!fallbackLabel) {
2031
+ fallbackLabel = typeof definition.name === 'string' ? definition.name : undefined;
2032
+ }
2033
+ }
2034
+ const migratedLabel = (this.shouldSuppressLegacyTextBlockLayoutLabel(field) ||
2035
+ this.isLegacyLinkValueControl(field) ||
2036
+ this.isLegacyPDFListControl(field))
2037
+ ? undefined
2038
+ : hasExplicitLabel
2039
+ ? definition.label
2040
+ : isLegacyDataLocation
2041
+ ? fallbackLabel
2042
+ : // RepeatableContributor often only defines 'name'; preserve a section label on migration.
2043
+ fallbackLabel ||
2044
+ (typeof definition.name === 'string' ? definition.name : undefined) ||
2045
+ (this.shouldPromoteLegacyTextBlockSpanToLayoutLabel(field) && typeof definition.value === 'string'
2046
+ ? definition.value
2047
+ : undefined);
2048
+ const legacyCssClasses = typeof definition.cssClasses === 'string' ? definition.cssClasses.trim() : '';
2049
+ const cssClassesMap = this.shouldPromoteLegacyTextBlockSpanToLayoutLabel(field) && legacyCssClasses
2050
+ ? { label: legacyCssClasses }
2051
+ : undefined;
2052
+ const config = {
2053
+ label: (this.isInsideButtonBarContainer || this.isInsideLegacyInlineContainer()) ? undefined : migratedLabel,
2054
+ helpText: typeof definition.help === 'string' ? definition.help : undefined,
2055
+ cssClassesMap,
2056
+ };
2057
+ this.sharedProps.sharedPopulateFieldLayoutConfig(item, config);
2058
+ }
2059
+ isLegacyDataLocationField(field) {
2060
+ const v4ClassName = `${field?.class ?? ''}`.trim();
2061
+ const v4CompClassName = `${field?.compClass ?? ''}`.trim();
2062
+ return v4ClassName === 'DataLocation' || v4CompClassName === 'DataLocationComponent';
2063
+ }
2064
+ isLegacyPDFListControl(field) {
2065
+ const v4ClassName = `${field?.class ?? ''}`.trim();
2066
+ const v4CompClassName = `${field?.compClass ?? ''}`.trim();
2067
+ return v4ClassName === 'PDFList' || v4CompClassName === 'PDFListComponent';
2068
+ }
2069
+ getV4Data() {
2070
+ const data = this.v4FormConfig;
2071
+ const path = this.v4FormPath;
2072
+ const result = !path || path.length < 1
2073
+ ? data
2074
+ : (0, lodash_1.get)(data, path.map(i => i.toString()));
2075
+ // this.logger.info(JSON.stringify({path, result}));
2076
+ return result;
2077
+ }
2078
+ isLegacyTranslationKey(value) {
2079
+ return typeof value === 'string' && value.trim().startsWith('@');
2080
+ }
2081
+ isLegacyTextBlockSpanField(field) {
2082
+ if (!field) {
2083
+ return false;
2084
+ }
2085
+ const definition = (field.definition ?? {});
2086
+ return (`${field.class ?? ''}`.trim() === 'Container' &&
2087
+ `${field.compClass ?? ''}`.trim() === 'TextBlockComponent' &&
2088
+ `${definition.type ?? ''}`.trim() === 'span');
2089
+ }
2090
+ shouldPromoteLegacyTextBlockSpanToLayoutLabel(field) {
2091
+ if (!this.isLegacyTextBlockSpanField(field)) {
2092
+ return false;
2093
+ }
2094
+ const definition = (field?.definition ?? {});
2095
+ const hasHelpText = typeof definition.help === 'string' && definition.help.trim().length > 0;
2096
+ const hasLegacyCssClass = typeof definition.cssClasses === 'string' && definition.cssClasses.trim().length > 0;
2097
+ return hasHelpText || hasLegacyCssClass;
2098
+ }
2099
+ shouldSuppressLegacyTextBlockLayoutLabel(field) {
2100
+ if (!field) {
2101
+ return false;
2102
+ }
2103
+ const definition = (field.definition ?? {});
2104
+ const isLegacyTextBlock = `${field.class ?? ''}`.trim() === 'Container' && `${field.compClass ?? ''}`.trim() === 'TextBlockComponent';
2105
+ const hasExplicitLabel = typeof definition.label === 'string' && definition.label.trim().length > 0;
2106
+ const hasLegacyNameBinding = typeof definition.name === 'string' && definition.name.trim().length > 0;
2107
+ return isLegacyTextBlock && hasLegacyNameBinding && !hasExplicitLabel && !this.shouldPromoteLegacyTextBlockSpanToLayoutLabel(field);
2108
+ }
2109
+ getLegacyContributorReusableFormName(fieldDefinition) {
2110
+ const forceLookupOnly = this.parseLegacyTypeaheadBoolean(fieldDefinition.forceLookupOnly, false, 'forceLookupOnly');
2111
+ return forceLookupOnly ? 'standard-contributor-fields-lookup-only-group' : 'standard-contributor-fields-group';
2112
+ }
2113
+ getLegacyContributorReusableGroupItemName(reusableFormName) {
2114
+ switch (reusableFormName) {
2115
+ case 'standard-contributor-fields-lookup-only-group':
2116
+ return 'standard_contributor_fields_lookup_only_group';
2117
+ case 'standard-contributor-fields-group':
2118
+ default:
2119
+ return 'standard_contributor_fields_group';
2120
+ }
2121
+ }
2122
+ normaliseV4FormConfig(formConfig) {
2123
+ let normalized;
2124
+ if (formConfig === undefined || formConfig === null) {
2125
+ normalized = {};
2126
+ }
2127
+ else if (Array.isArray(formConfig)) {
2128
+ normalized = { fields: formConfig };
2129
+ }
2130
+ else if (typeof formConfig === 'object') {
2131
+ normalized = formConfig;
2132
+ }
2133
+ else {
2134
+ normalized = {};
2135
+ }
2136
+ // If the top level has a 'form' property, assume it is an export in the structure form.forms[formId] = formConfig.
2137
+ if (Object.hasOwn(normalized, 'form')) {
2138
+ const formContainer = (normalized.form ?? {});
2139
+ const forms = (formContainer.forms ?? {});
2140
+ const formIds = Object.keys(forms).filter(formId => formId !== '_dontMerge');
2141
+ if (formIds.length === 1) {
2142
+ this.logger.info(`Migrating form id: ${formIds[0]}`);
2143
+ normalized = forms[formIds[0]] ?? {};
2144
+ }
2145
+ else {
2146
+ const topKeys = Object.keys(normalized);
2147
+ const formKeys = Object.keys(formContainer);
2148
+ const formsKeys = Object.keys(forms);
2149
+ this.logger.error(`Cannot migrate due to more or less than one form id: ${JSON.stringify({
2150
+ topKeys,
2151
+ formKeys,
2152
+ formsKeys,
2153
+ })}`);
2154
+ normalized = {};
2155
+ }
2156
+ }
2157
+ // Set the form config name if there isn't one.
2158
+ if (typeof normalized.name !== 'string' || normalized.name.length === 0) {
2159
+ normalized.name = 'v4FormConfig';
2160
+ }
2161
+ return normalized;
2162
+ }
2163
+ migrateOptions(field) {
2164
+ return (field?.definition?.options ?? []).map((option) => {
2165
+ return {
2166
+ label: option?.label ?? '',
2167
+ value: option?.value ?? '',
2168
+ disabled: option?.disabled ?? option?.historicalOnly ?? undefined,
2169
+ };
2170
+ });
2171
+ }
2172
+ applyLegacyFormCssNormalization(item) {
2173
+ const normalizedViewCssClasses = this.normalizeLegacyFormCssClasses(item.viewCssClasses, 'view');
2174
+ if (normalizedViewCssClasses) {
2175
+ item.viewCssClasses = normalizedViewCssClasses;
2176
+ }
2177
+ const normalizedEditCssClasses = this.normalizeLegacyFormCssClasses(item.editCssClasses, 'edit');
2178
+ if (normalizedEditCssClasses) {
2179
+ item.editCssClasses = normalizedEditCssClasses;
2180
+ }
2181
+ }
2182
+ normalizeLegacyFormCssClasses(cssClasses, mode) {
2183
+ if (typeof cssClasses !== 'string') {
2184
+ return undefined;
2185
+ }
2186
+ const normalized = cssClasses.trim().replace(/\s+/g, ' ');
2187
+ if (mode === 'view' && normalized === 'row col-md-offset-1 col-md-10') {
2188
+ return 'redbox-form form rb-form-view';
2189
+ }
2190
+ if (mode === 'edit' && normalized === 'row col-md-12') {
2191
+ return 'redbox-form form rb-form-edit';
2192
+ }
2193
+ return undefined;
2194
+ }
2195
+ normalizeLegacyButtonCssClasses(cssClasses) {
2196
+ if (typeof cssClasses !== 'string') {
2197
+ return undefined;
2198
+ }
2199
+ const normalized = cssClasses.trim().replace(/\s+/g, ' ');
2200
+ if (!normalized) {
2201
+ return undefined;
2202
+ }
2203
+ // Bootstrap 3 -> 5 compatibility for common legacy button class.
2204
+ const migrated = normalized.replace(/\bbtn-default\b/g, 'btn-secondary').trim();
2205
+ const classTokens = migrated.split(/\s+/);
2206
+ return classTokens.includes('btn') ? migrated : `btn ${migrated}`;
2207
+ }
2208
+ shouldUseInlineLayoutInButtonBar(componentClassName) {
2209
+ return (componentClassName === sails_ng_common_31.SaveButtonComponentName ||
2210
+ componentClassName === sails_ng_common_33.CancelButtonComponentName ||
2211
+ componentClassName === sails_ng_common_35.DeleteButtonComponentName ||
2212
+ componentClassName === sails_ng_common_37.TabNavButtonComponentName);
2213
+ }
2214
+ shouldUseInlineLayoutForAnchorButton(field, componentClassName) {
2215
+ const v4ClassName = `${field?.class ?? ''}`.trim();
2216
+ return v4ClassName === 'AnchorOrButton' && (componentClassName === sails_ng_common_31.SaveButtonComponentName ||
2217
+ componentClassName === sails_ng_common_13.ContentComponentName);
2218
+ }
2219
+ isLegacyAnchorControl(field) {
2220
+ if (!field) {
2221
+ return false;
2222
+ }
2223
+ const definition = (field.definition ?? {});
2224
+ return `${field.class ?? ''}`.trim() === 'AnchorOrButton' && `${definition.controlType ?? ''}`.trim() === 'anchor';
2225
+ }
2226
+ isLegacyLinkValueControl(field) {
2227
+ if (!field) {
2228
+ return false;
2229
+ }
2230
+ return `${field.class ?? ''}`.trim() === 'LinkValueComponent';
2231
+ }
2232
+ isInsideLegacyInlineContainer() {
2233
+ return this.legacyInlineContainerDepth > 0;
2234
+ }
2235
+ isLegacyInlineContainer(field) {
2236
+ if (!field) {
2237
+ return false;
2238
+ }
2239
+ const v4ClassName = `${field.class ?? ''}`.trim();
2240
+ const v4CompClassName = `${field.compClass ?? ''}`.trim();
2241
+ if (v4ClassName !== 'Container' || v4CompClassName !== 'GenericGroupComponent') {
2242
+ return false;
2243
+ }
2244
+ const definition = (field.definition ?? {});
2245
+ return this.hasLegacyCssClass(definition.cssClasses, 'form-inline') || this.hasLegacyCssClass(definition.cssClass, 'form-inline');
2246
+ }
2247
+ hasLegacyCssClass(value, token) {
2248
+ if (typeof value !== 'string') {
2249
+ return false;
2250
+ }
2251
+ return value
2252
+ .trim()
2253
+ .split(/\s+/)
2254
+ .filter(Boolean)
2255
+ .includes(token);
2256
+ }
2257
+ mergeCssClassTokens(baseCssClasses, appendCssClasses) {
2258
+ const classes = `${typeof baseCssClasses === 'string' ? baseCssClasses : ''} ${appendCssClasses}`
2259
+ .split(/\s+/)
2260
+ .map((cssClass) => cssClass.trim())
2261
+ .filter(Boolean);
2262
+ return Array.from(new Set(classes)).join(' ');
2263
+ }
2264
+ removeLegacyCssToken(cssClasses, tokenToRemove) {
2265
+ return cssClasses
2266
+ .split(/\s+/)
2267
+ .map((cssClass) => cssClass.trim())
2268
+ .filter((cssClass) => cssClass.length > 0 && cssClass !== tokenToRemove)
2269
+ .join(' ');
2270
+ }
2271
+ buildLegacyAnchorHrefTemplate(href) {
2272
+ const rawHref = String(href ?? '');
2273
+ const templatedHref = this.buildLegacyUrlTemplate(rawHref);
2274
+ if (templatedHref === rawHref) {
2275
+ return '{{content.href}}';
2276
+ }
2277
+ return templatedHref;
2278
+ }
2279
+ buildLegacyUrlTemplate(value) {
2280
+ const rawHref = String(value ?? '');
2281
+ if (!rawHref.includes('@branding') && !rawHref.includes('@portal') && !rawHref.includes('@oid')) {
2282
+ return rawHref;
2283
+ }
2284
+ const parts = [];
2285
+ const tokenRegex = /@branding|@portal|@oid/g;
2286
+ let cursor = 0;
2287
+ let match;
2288
+ while ((match = tokenRegex.exec(rawHref)) !== null) {
2289
+ const tokenIndex = match.index;
2290
+ const literalPart = rawHref.slice(cursor, tokenIndex);
2291
+ if (literalPart.length > 0) {
2292
+ parts.push(`"${this.escapeHandlebarsStringLiteral(literalPart)}"`);
2293
+ }
2294
+ const matchedToken = match[0];
2295
+ if (matchedToken === '@branding') {
2296
+ parts.push('branding');
2297
+ }
2298
+ else if (matchedToken === '@portal') {
2299
+ parts.push('portal');
2300
+ }
2301
+ else if (matchedToken === '@oid') {
2302
+ parts.push('oid');
2303
+ }
2304
+ else {
2305
+ parts.push(`"${this.escapeHandlebarsStringLiteral(matchedToken)}"`);
2306
+ }
2307
+ cursor = tokenIndex + matchedToken.length;
2308
+ }
2309
+ const trailingPart = rawHref.slice(cursor);
2310
+ if (trailingPart.length > 0) {
2311
+ parts.push(`"${this.escapeHandlebarsStringLiteral(trailingPart)}"`);
2312
+ }
2313
+ if (parts.length === 0) {
2314
+ return rawHref;
2315
+ }
2316
+ return `{{concat ${parts.join(' ')}}}`;
2317
+ }
2318
+ escapeHandlebarsStringLiteral(value) {
2319
+ return String(value).replace(/\\/g, '\\\\').replace(/"/g, '\\"');
2320
+ }
2321
+ /**
2322
+ * Check whether the current form config path is a descendant (and not a match)
2323
+ * of the most recent repeatable element template path.
2324
+ * @protected
2325
+ */
2326
+ isRepeatableElementTemplateDescendant() {
2327
+ const mostRecentPath = this.mostRecentRepeatableElementTemplatePath ?? [];
2328
+ const formConfigPath = this.formPathHelper.formPath.formConfig;
2329
+ if (!mostRecentPath || mostRecentPath.length === 0 || !formConfigPath || formConfigPath.length === 0) {
2330
+ return false;
2331
+ }
2332
+ // The formConfig path might have ["[component|model|layout]", "config"] at the end (2 additional items),
2333
+ // but only the path up to ["config", "elementTemplate"] is relevant for this check.
2334
+ if (formConfigPath.length + 2 <= mostRecentPath.length) {
2335
+ return false;
2336
+ }
2337
+ return mostRecentPath.every((value, index) => value === formConfigPath[index]);
2338
+ }
2339
+ parseLegacyBooleanFlag(rawValue, defaultValue, fieldName) {
2340
+ if (typeof rawValue === 'boolean') {
2341
+ return rawValue;
2342
+ }
2343
+ if (rawValue === undefined || rawValue === null || rawValue === '') {
2344
+ return defaultValue;
2345
+ }
2346
+ if (typeof rawValue === 'number') {
2347
+ return rawValue !== 0;
2348
+ }
2349
+ if (typeof rawValue === 'string') {
2350
+ const normalized = rawValue.trim().toLowerCase();
2351
+ if (['true', '1', 'yes', 'on'].includes(normalized)) {
2352
+ return true;
2353
+ }
2354
+ if (['false', '0', 'no', 'off'].includes(normalized)) {
2355
+ return false;
2356
+ }
2357
+ }
2358
+ this.logger.warn(`${this.logName}: CheckboxTree migration received malformed '${fieldName}' value, using safe default.`);
2359
+ return defaultValue;
2360
+ }
2361
+ parseLegacyPositiveInteger(rawValue, fieldName) {
2362
+ if (rawValue === undefined || rawValue === null || rawValue === '') {
2363
+ return undefined;
2364
+ }
2365
+ const parsed = Number.parseInt(String(rawValue), 10);
2366
+ if (Number.isInteger(parsed) && parsed > 0) {
2367
+ return parsed;
2368
+ }
2369
+ this.logger.warn(`${this.logName}: CheckboxTree migration received invalid '${fieldName}' value, ignoring it.`);
2370
+ return undefined;
2371
+ }
2372
+ warnOnMalformedLegacyRegex(definition) {
2373
+ for (const key of ['regex', 'pattern', 'leafRegex']) {
2374
+ if (!Object.hasOwn(definition, key)) {
2375
+ continue;
2376
+ }
2377
+ const rawValue = definition[key];
2378
+ if (rawValue === undefined || rawValue === null || rawValue === '') {
2379
+ continue;
2380
+ }
2381
+ if (rawValue instanceof RegExp) {
2382
+ continue;
2383
+ }
2384
+ if (typeof rawValue === 'string') {
2385
+ try {
2386
+ // Validate regex string syntax to avoid carrying malformed values into v5 config.
2387
+ new RegExp(rawValue);
2388
+ continue;
2389
+ }
2390
+ catch {
2391
+ this.logger.warn(`${this.logName}: CheckboxTree migration found malformed regex in '${key}', using defaults.`);
2392
+ continue;
2393
+ }
2394
+ }
2395
+ this.logger.warn(`${this.logName}: CheckboxTree migration found unsupported regex value in '${key}', using defaults.`);
2396
+ }
2397
+ }
2398
+ coerceCheckboxTreeDefaultValue(config) {
2399
+ const rawDefaultValue = config.defaultValue;
2400
+ if (rawDefaultValue === undefined || rawDefaultValue === null) {
2401
+ return;
2402
+ }
2403
+ if (!Array.isArray(rawDefaultValue)) {
2404
+ config.defaultValue = [];
2405
+ this.logger.warn(`${this.logName}: CheckboxTree migration coerced non-array default value to empty selection array.`);
2406
+ return;
2407
+ }
2408
+ const coerced = rawDefaultValue.filter(item => {
2409
+ if (!item || typeof item !== 'object') {
2410
+ return false;
2411
+ }
2412
+ const notation = String(item.notation ?? '').trim();
2413
+ const label = String(item.label ?? '').trim();
2414
+ const name = String(item.name ?? '').trim();
2415
+ return Boolean(notation && label && name);
2416
+ });
2417
+ if (coerced.length !== rawDefaultValue.length) {
2418
+ this.logger.warn(`${this.logName}: CheckboxTree migration dropped malformed default selection entries.`);
2419
+ }
2420
+ config.defaultValue = coerced;
2421
+ }
2422
+ coerceMapFeatureCollection(config) {
2423
+ const emptyCollection = {
2424
+ type: 'FeatureCollection',
2425
+ features: [],
2426
+ };
2427
+ const normalize = (value) => {
2428
+ if (!value || typeof value !== 'object') {
2429
+ return emptyCollection;
2430
+ }
2431
+ const source = value;
2432
+ const type = String(source.type ?? '');
2433
+ if (type !== 'FeatureCollection') {
2434
+ return emptyCollection;
2435
+ }
2436
+ const features = Array.isArray(source.features) ? source.features : [];
2437
+ return {
2438
+ type: 'FeatureCollection',
2439
+ features: features,
2440
+ };
2441
+ };
2442
+ config.defaultValue = normalize(config.defaultValue);
2443
+ if (config.value !== undefined) {
2444
+ config.value = normalize(config.value);
2445
+ }
2446
+ }
2447
+ extractLegacyMapCenter(leafletOptions) {
2448
+ const center = leafletOptions.center;
2449
+ if (Array.isArray(center) && center.length >= 2) {
2450
+ const lat = Number(center[0]);
2451
+ const lng = Number(center[1]);
2452
+ if (Number.isFinite(lat) && Number.isFinite(lng)) {
2453
+ return [lat, lng];
2454
+ }
2455
+ }
2456
+ if (center && typeof center === 'object') {
2457
+ const centerObj = center;
2458
+ const lat = Number(centerObj.lat);
2459
+ const lng = Number(centerObj.lng ?? centerObj.lon);
2460
+ if (Number.isFinite(lat) && Number.isFinite(lng)) {
2461
+ return [lat, lng];
2462
+ }
2463
+ }
2464
+ return undefined;
2465
+ }
2466
+ extractLegacyMapZoom(leafletOptions) {
2467
+ const zoom = Number(leafletOptions.zoom);
2468
+ if (Number.isFinite(zoom)) {
2469
+ return zoom;
2470
+ }
2471
+ return undefined;
2472
+ }
2473
+ extractLegacyMapTileLayers(definition) {
2474
+ const layersControl = this.readObject(definition.layersControl);
2475
+ const baseLayers = this.readObject(layersControl.baseLayers);
2476
+ const tileLayers = [];
2477
+ for (const [name, layerValue] of Object.entries(baseLayers)) {
2478
+ if (!layerValue || typeof layerValue !== 'object') {
2479
+ continue;
2480
+ }
2481
+ const layer = layerValue;
2482
+ const url = String(layer._url ?? '');
2483
+ if (!url) {
2484
+ continue;
2485
+ }
2486
+ tileLayers.push({
2487
+ name,
2488
+ url,
2489
+ options: this.readObject(layer.options),
2490
+ });
2491
+ }
2492
+ return tileLayers;
2493
+ }
2494
+ extractLegacyMapEnabledModes(drawOptions) {
2495
+ const draw = this.readObject(drawOptions.draw);
2496
+ const enabledModes = [];
2497
+ const modeMap = [
2498
+ { key: 'marker', mode: 'point' },
2499
+ { key: 'polygon', mode: 'polygon' },
2500
+ { key: 'polyline', mode: 'linestring' },
2501
+ { key: 'rectangle', mode: 'rectangle' },
2502
+ ];
2503
+ for (const { key, mode } of modeMap) {
2504
+ const rawModeConfig = draw[key];
2505
+ if (rawModeConfig === false) {
2506
+ continue;
2507
+ }
2508
+ enabledModes.push(mode);
2509
+ }
2510
+ const hasLegacyEditConfig = Object.prototype.hasOwnProperty.call(drawOptions, 'edit');
2511
+ if (hasLegacyEditConfig && drawOptions.edit !== false) {
2512
+ enabledModes.push('select');
2513
+ }
2514
+ const deduped = [...new Set(enabledModes)];
2515
+ const invalidModes = deduped.filter(mode => !['point', 'polygon', 'linestring', 'rectangle', 'select'].includes(mode));
2516
+ if (invalidModes.length > 0) {
2517
+ this.logger.warn(`${this.logName}: Map migration dropped unsupported enabledModes values at ${JSON.stringify(this.v4FormPath)}: ${JSON.stringify(invalidModes)}.`);
2518
+ }
2519
+ return deduped.filter((mode) => mode === 'point' || mode === 'polygon' || mode === 'linestring' || mode === 'rectangle' || mode === 'select');
2520
+ }
2521
+ readObject(input) {
2522
+ return input && typeof input === 'object' && !Array.isArray(input) ? input : {};
2523
+ }
2524
+ resolveTypeaheadSourceType(definition) {
2525
+ const legacySourceType = String(definition.sourceType ?? '')
2526
+ .trim()
2527
+ .toLowerCase();
2528
+ if (legacySourceType === 'query' || legacySourceType === 'namedquery') {
2529
+ return 'namedQuery';
2530
+ }
2531
+ if (legacySourceType === 'external') {
2532
+ return 'external';
2533
+ }
2534
+ if (legacySourceType === 'vocabulary') {
2535
+ return 'vocabulary';
2536
+ }
2537
+ if (Array.isArray(definition.options) || Array.isArray(definition.staticOptions)) {
2538
+ return 'static';
2539
+ }
2540
+ if (definition.vocabQueryId || definition.queryId) {
2541
+ return 'namedQuery';
2542
+ }
2543
+ if (definition.vocabRef || definition.vocabId) {
2544
+ return 'vocabulary';
2545
+ }
2546
+ if (definition.provider) {
2547
+ return 'external';
2548
+ }
2549
+ return 'namedQuery';
2550
+ }
2551
+ normalizeLegacyTypeaheadStaticOptions(definition, labelField, valueField) {
2552
+ const options = this.resolvePreferredLegacyTypeaheadStaticOptions(definition);
2553
+ const normalized = options
2554
+ .map(entry => this.normalizeLegacyTypeaheadStaticOption(entry, labelField, valueField))
2555
+ .filter((entry) => entry !== null);
2556
+ if (options.length > 0 && normalized.length !== options.length) {
2557
+ this.logger.warn(`${this.logName}: Typeahead migration dropped malformed static option entries at ${JSON.stringify(this.v4FormPath)}.`);
2558
+ }
2559
+ return normalized;
2560
+ }
2561
+ resolvePreferredLegacyTypeaheadStaticOptions(definition) {
2562
+ const options = Array.isArray(definition.options) ? definition.options : [];
2563
+ const staticOptions = Array.isArray(definition.staticOptions) ? definition.staticOptions : [];
2564
+ if (options.length > 0) {
2565
+ return options;
2566
+ }
2567
+ if (staticOptions.length > 0) {
2568
+ return staticOptions;
2569
+ }
2570
+ return options.length > 0 ? options : staticOptions;
2571
+ }
2572
+ normalizeLegacyTypeaheadStaticOption(entry, labelField, valueField) {
2573
+ if (entry === undefined || entry === null) {
2574
+ return null;
2575
+ }
2576
+ if (typeof entry === 'string' || typeof entry === 'number' || typeof entry === 'boolean') {
2577
+ const normalized = String(entry).trim();
2578
+ return normalized ? { label: normalized, value: normalized } : null;
2579
+ }
2580
+ if (typeof entry !== 'object') {
2581
+ return null;
2582
+ }
2583
+ const source = entry;
2584
+ const resolvedLabel = String(source.label ??
2585
+ source.name ??
2586
+ source.title ??
2587
+ source.text ??
2588
+ source[labelField] ??
2589
+ source[valueField] ??
2590
+ source.value ??
2591
+ '').trim();
2592
+ const resolvedValue = String(source.value ?? source[valueField] ?? source.name ?? source[labelField] ?? source.title ?? source.label ?? '').trim();
2593
+ const label = resolvedLabel || resolvedValue;
2594
+ const value = resolvedValue || resolvedLabel;
2595
+ if (!label && !value) {
2596
+ return null;
2597
+ }
2598
+ return { label, value };
2599
+ }
2600
+ resolveLegacyLabelField(definition) {
2601
+ const titleFieldName = String(definition.titleFieldName ?? '').trim();
2602
+ if (titleFieldName) {
2603
+ return titleFieldName;
2604
+ }
2605
+ const stringLabelToField = String(definition.stringLabelToField ?? '').trim();
2606
+ if (stringLabelToField) {
2607
+ return stringLabelToField;
2608
+ }
2609
+ const titleFieldArr = Array.isArray(definition.titleFieldArr) ? definition.titleFieldArr : [];
2610
+ const firstTitleField = String(titleFieldArr[0] ?? '').trim();
2611
+ if (firstTitleField) {
2612
+ return firstTitleField;
2613
+ }
2614
+ return 'label';
2615
+ }
2616
+ parseLegacyTypeaheadBoolean(rawValue, defaultValue, fieldName) {
2617
+ if (typeof rawValue === 'boolean') {
2618
+ return rawValue;
2619
+ }
2620
+ if (rawValue === undefined || rawValue === null || rawValue === '') {
2621
+ return defaultValue;
2622
+ }
2623
+ if (typeof rawValue === 'number') {
2624
+ return rawValue !== 0;
2625
+ }
2626
+ if (typeof rawValue === 'string') {
2627
+ const normalized = rawValue.trim().toLowerCase();
2628
+ if (['true', '1', 'yes', 'on'].includes(normalized)) {
2629
+ return true;
2630
+ }
2631
+ if (['false', '0', 'no', 'off'].includes(normalized)) {
2632
+ return false;
2633
+ }
2634
+ }
2635
+ this.logger.warn(`${this.logName}: Typeahead migration received malformed '${fieldName}' value, using safe default.`);
2636
+ return defaultValue;
2637
+ }
2638
+ coerceLegacyTypeaheadValue(rawValue, valueMode, labelField) {
2639
+ if (rawValue === undefined || rawValue === null || rawValue === '') {
2640
+ return null;
2641
+ }
2642
+ if (valueMode === 'value') {
2643
+ if (typeof rawValue === 'string') {
2644
+ return rawValue;
2645
+ }
2646
+ if (typeof rawValue === 'object') {
2647
+ const source = rawValue;
2648
+ const candidate = String(source[labelField] ?? source.title ?? source.label ?? source.value ?? '').trim();
2649
+ if (candidate) {
2650
+ return candidate;
2651
+ }
2652
+ }
2653
+ this.logger.warn(`${this.logName}: Typeahead migration coerced malformed legacy value to null.`);
2654
+ return null;
2655
+ }
2656
+ if (typeof rawValue === 'string') {
2657
+ return {
2658
+ label: rawValue,
2659
+ value: rawValue,
2660
+ sourceType: 'freeText',
2661
+ };
2662
+ }
2663
+ if (typeof rawValue === 'object') {
2664
+ const source = rawValue;
2665
+ const label = String(source.label ?? source[labelField] ?? source.title ?? source.value ?? '').trim();
2666
+ const value = String(source.value ?? source[labelField] ?? source.label ?? source.title ?? '').trim();
2667
+ if (!label && !value) {
2668
+ this.logger.warn(`${this.logName}: Typeahead migration coerced malformed legacy object value to null.`);
2669
+ return null;
2670
+ }
2671
+ const sourceType = String(source.sourceType ?? '').trim();
2672
+ const normalizedSourceType = ['static', 'vocabulary', 'namedQuery', 'freeText'].includes(sourceType)
2673
+ ? sourceType
2674
+ : undefined;
2675
+ return {
2676
+ label: label || value,
2677
+ value: value || label,
2678
+ sourceType: normalizedSourceType,
2679
+ };
2680
+ }
2681
+ this.logger.warn(`${this.logName}: Typeahead migration coerced malformed legacy value to null.`);
2682
+ return null;
2683
+ }
2684
+ injectLegacyRecordMetadataRetrieverExpressions(legacyFields, migratedComponents, containerPointer = '') {
2685
+ for (const legacyField of legacyFields) {
2686
+ if (!this.isLegacyRecordMetadataRetrieverField(legacyField)) {
2687
+ continue;
2688
+ }
2689
+ const retrieverDefinition = (legacyField.definition ?? {});
2690
+ const retrieverName = String(retrieverDefinition.name ?? retrieverDefinition.id ?? '').trim();
2691
+ if (!retrieverName) {
2692
+ continue;
2693
+ }
2694
+ const migratedRetriever = migratedComponents.find((component) => component.name === retrieverName);
2695
+ if (migratedRetriever) {
2696
+ migratedRetriever.expressions = (migratedRetriever.expressions ?? []).concat(this.buildRetrieverExpressions(legacyField, legacyFields, containerPointer));
2697
+ }
2698
+ for (const targetField of legacyFields) {
2699
+ const targetDefinition = (targetField.definition ?? {});
2700
+ const targetName = String(targetDefinition.name ?? targetDefinition.id ?? '').trim();
2701
+ if (!targetName) {
2702
+ continue;
2703
+ }
2704
+ const subscribe = (targetDefinition.subscribe ?? {});
2705
+ const retrieverSubscriptions = subscribe[retrieverName];
2706
+ const onValueUpdate = Array.isArray(retrieverSubscriptions?.onValueUpdate)
2707
+ ? retrieverSubscriptions.onValueUpdate
2708
+ : [];
2709
+ if (onValueUpdate.length === 0) {
2710
+ continue;
2711
+ }
2712
+ const migratedTarget = migratedComponents.find((component) => component.name === targetName);
2713
+ if (!migratedTarget?.model) {
2714
+ continue;
2715
+ }
2716
+ const expressions = migratedTarget.expressions ?? [];
2717
+ for (const actionConfig of onValueUpdate) {
2718
+ if (actionConfig?.action !== 'utilityService.getPropertyFromObject') {
2719
+ continue;
2720
+ }
2721
+ const propertyName = String(actionConfig.field ?? '').trim();
2722
+ if (!propertyName) {
2723
+ continue;
2724
+ }
2725
+ expressions.push({
2726
+ name: `${retrieverName}-${targetName}-${propertyName}`.replace(/[^a-zA-Z0-9_-]+/g, '-'),
2727
+ description: `Populate ${targetName} from ${retrieverName} metadata`,
2728
+ config: {
2729
+ conditionKind: sails_ng_common_63.ExpressionsConditionKind.JSONPointer,
2730
+ runOnFormReady: false,
2731
+ condition: `${this.buildNestedComponentJsonPointer(containerPointer, retrieverName)}::field.value.changed`,
2732
+ target: 'model.value',
2733
+ hasTemplate: true,
2734
+ template: this.buildEventValueTemplate(propertyName),
2735
+ },
2736
+ });
2737
+ }
2738
+ migratedTarget.expressions = expressions;
2739
+ }
2740
+ }
2741
+ }
2742
+ buildRetrieverExpressions(retrieverField, siblingFields, containerPointer = '') {
2743
+ const definition = (retrieverField.definition ?? {});
2744
+ const subscribe = (definition.subscribe ?? {});
2745
+ const expressions = [];
2746
+ for (const [sourceName, sourceConfigUnknown] of Object.entries(subscribe)) {
2747
+ const sourceConfig = (sourceConfigUnknown ?? {});
2748
+ const onValueUpdate = Array.isArray(sourceConfig.onValueUpdate)
2749
+ ? sourceConfig.onValueUpdate
2750
+ : [];
2751
+ const relatedObjectSelected = Array.isArray(sourceConfig.relatedObjectSelected)
2752
+ ? sourceConfig.relatedObjectSelected
2753
+ : [];
2754
+ if (onValueUpdate.some((action) => action?.action === 'publishMetadata')) {
2755
+ const parameterName = this.resolveLegacyParameterRetrieverName(sourceName, siblingFields);
2756
+ if (parameterName) {
2757
+ expressions.push({
2758
+ name: `fetchOnFormReady-${parameterName}`,
2759
+ description: 'Fetch metadata on form load using request params',
2760
+ config: {
2761
+ runOnFormReady: true,
2762
+ conditionKind: sails_ng_common_63.ExpressionsConditionKind.JSONataQuery,
2763
+ condition: `$exists(runtimeContext.requestParams.${parameterName})`,
2764
+ operation: 'fetchMetadata',
2765
+ hasTemplate: true,
2766
+ template: `runtimeContext.requestParams.${parameterName}`,
2767
+ },
2768
+ });
2769
+ }
2770
+ }
2771
+ if (relatedObjectSelected.some((action) => action?.action === 'publishMetadata')) {
2772
+ expressions.push({
2773
+ name: `fetchOnRelatedObjectSelected-${sourceName}`,
2774
+ description: `Fetch metadata when ${sourceName} changes`,
2775
+ config: {
2776
+ conditionKind: sails_ng_common_63.ExpressionsConditionKind.JSONPointer,
2777
+ runOnFormReady: false,
2778
+ condition: `${this.buildNestedComponentJsonPointer(containerPointer, sourceName)}::field.value.changed`,
2779
+ operation: 'fetchMetadata',
2780
+ hasTemplate: true,
2781
+ template: '$exists(event.value.oid) ? event.value.oid : ($exists(event.value.redboxOid) ? event.value.redboxOid : event.value)',
2782
+ },
2783
+ });
2784
+ }
2785
+ }
2786
+ return expressions;
2787
+ }
2788
+ resolveLegacyParameterRetrieverName(sourceName, siblingFields) {
2789
+ const parameterRetriever = siblingFields.find((field) => {
2790
+ if (!this.isLegacyParameterRetrieverField(field)) {
2791
+ return false;
2792
+ }
2793
+ const definition = (field.definition ?? {});
2794
+ return String(definition.name ?? definition.id ?? '').trim() === sourceName;
2795
+ });
2796
+ const parameterDefinition = (parameterRetriever?.definition ?? {});
2797
+ const parameterName = String(parameterDefinition.parameterName ?? '').trim();
2798
+ return parameterName || undefined;
2799
+ }
2800
+ isLegacyParameterRetrieverField(field) {
2801
+ const v4ClassName = `${field?.class ?? ''}`.trim();
2802
+ const v4CompClassName = `${field?.compClass ?? ''}`.trim();
2803
+ return v4ClassName === 'ParameterRetriever' || v4CompClassName === 'ParameterRetrieverComponent';
2804
+ }
2805
+ isLegacyRecordMetadataRetrieverField(field) {
2806
+ const v4ClassName = `${field?.class ?? ''}`.trim();
2807
+ const v4CompClassName = `${field?.compClass ?? ''}`.trim();
2808
+ return v4ClassName === 'RecordMetadataRetriever' || v4CompClassName === 'RecordMetadataRetrieverComponent';
2809
+ }
2810
+ buildNestedComponentJsonPointer(containerPointer, componentName) {
2811
+ const trimmedName = componentName.trim();
2812
+ if (!trimmedName) {
2813
+ return containerPointer || '';
2814
+ }
2815
+ const normalizedContainerPointer = containerPointer && containerPointer !== '/'
2816
+ ? containerPointer.replace(/\/+$/, '')
2817
+ : '';
2818
+ return `${normalizedContainerPointer}/${trimmedName}`;
2819
+ }
2820
+ getCurrentContainerAngularComponentsJsonPointer(componentName) {
2821
+ const currentPointer = this.formPathHelper.formPath.angularComponentsJsonPointer ?? '';
2822
+ const trimmedName = componentName?.trim();
2823
+ if (!currentPointer || !trimmedName) {
2824
+ return currentPointer;
2825
+ }
2826
+ const suffix = `/${trimmedName}`;
2827
+ if (currentPointer.endsWith(suffix)) {
2828
+ return currentPointer.slice(0, -suffix.length);
2829
+ }
2830
+ return currentPointer;
2831
+ }
2832
+ resolveComponentAngularComponentsJsonPointer(componentName, fallbackContainerPointer = '') {
2833
+ const trimmedName = componentName.trim();
2834
+ if (!trimmedName) {
2835
+ return fallbackContainerPointer;
2836
+ }
2837
+ const globalPointer = this.findComponentAngularComponentsJsonPointer(this.v5FormConfig.componentDefinitions, trimmedName);
2838
+ if (globalPointer) {
2839
+ return globalPointer;
2840
+ }
2841
+ return this.buildNestedComponentJsonPointer(fallbackContainerPointer, trimmedName);
2842
+ }
2843
+ findComponentAngularComponentsJsonPointer(components, componentName, parentPointer = '') {
2844
+ for (const component of components ?? []) {
2845
+ const currentName = component?.name?.trim();
2846
+ if (!currentName) {
2847
+ continue;
2848
+ }
2849
+ const currentPointer = this.buildNestedComponentJsonPointer(parentPointer, currentName);
2850
+ if (currentName === componentName) {
2851
+ return currentPointer;
2852
+ }
2853
+ const childDefinitions = this.getChildComponentDefinitions(component);
2854
+ const found = this.findComponentAngularComponentsJsonPointer(childDefinitions, componentName, currentPointer);
2855
+ if (found) {
2856
+ return found;
2857
+ }
2858
+ }
2859
+ return null;
2860
+ }
2861
+ getChildComponentDefinitions(component) {
2862
+ const componentConfig = component?.component?.config;
2863
+ const nested = [
2864
+ ...(Array.isArray(componentConfig?.componentDefinitions)
2865
+ ? componentConfig.componentDefinitions
2866
+ : []),
2867
+ ...(Array.isArray(componentConfig?.tabs)
2868
+ ? componentConfig.tabs
2869
+ : []),
2870
+ ...(Array.isArray(componentConfig?.panels)
2871
+ ? componentConfig.panels
2872
+ : []),
2873
+ ];
2874
+ return nested;
2875
+ }
2876
+ retargetPublishDataLocationSelectorExpressions(components) {
2877
+ for (const component of components ?? []) {
2878
+ if (component.component?.class === sails_ng_common_57.PublishDataLocationSelectorComponentName) {
2879
+ for (const expression of component.expressions ?? []) {
2880
+ const sourceName = this.getExpressionSourceComponentName(expression.config?.condition);
2881
+ if (!sourceName) {
2882
+ continue;
2883
+ }
2884
+ const sourcePointer = this.findComponentAngularComponentsJsonPointer(this.v5FormConfig.componentDefinitions, sourceName);
2885
+ if (sourcePointer) {
2886
+ expression.config.condition = `${sourcePointer}::field.value.changed`;
2887
+ }
2888
+ }
2889
+ }
2890
+ this.retargetPublishDataLocationSelectorExpressions(this.getChildComponentDefinitions(component));
2891
+ }
2892
+ }
2893
+ getExpressionSourceComponentName(condition) {
2894
+ const pointer = condition?.split('::')[0]?.trim();
2895
+ if (!pointer) {
2896
+ return null;
2897
+ }
2898
+ const segments = pointer.split('/').filter((segment) => segment.length > 0);
2899
+ return segments.length > 0 ? segments[segments.length - 1] : null;
2900
+ }
2901
+ buildEventValueTemplate(propertyName) {
2902
+ const segments = propertyName.split('.').filter((segment) => segment.length > 0);
2903
+ if (segments.length === 0) {
2904
+ return 'event.value';
2905
+ }
2906
+ return segments.reduce((path, segment) => {
2907
+ if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {
2908
+ return `${path}.${segment}`;
2909
+ }
2910
+ return `${path}[${JSON.stringify(segment)}]`;
2911
+ }, 'event.value');
2912
+ }
2913
+ warnOnDroppedLegacyTypeaheadProperties(definition) {
2914
+ const droppedProps = [
2915
+ 'forceClone',
2916
+ 'completerService',
2917
+ 'lookupService',
2918
+ 'publish',
2919
+ 'subscribe',
2920
+ 'disableLookupIcon',
2921
+ 'searchFields',
2922
+ 'fieldNames',
2923
+ 'titleFieldDelim',
2924
+ ];
2925
+ for (const key of droppedProps) {
2926
+ if (Object.hasOwn(definition, key) &&
2927
+ definition[key] !== undefined &&
2928
+ definition[key] !== null &&
2929
+ definition[key] !== '') {
2930
+ this.logger.warn(`${this.logName}: Typeahead migration dropped legacy property '${key}' at ${JSON.stringify(this.v4FormPath)}.`);
2931
+ }
2932
+ }
2933
+ }
2934
+ isLegacyAndsVocabField(field) {
2935
+ const v4Class = String(field?.class ?? '').trim();
2936
+ const v4CompClass = String(field?.compClass ?? '').trim();
2937
+ return v4Class === 'ANDSVocab' || v4CompClass === 'ANDSVocabComponent';
2938
+ }
2939
+ }
2940
+ exports.MigrationV4ToV5FormConfigVisitor = MigrationV4ToV5FormConfigVisitor;
2941
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0ZS1jb25maWctdjQtdjUudmlzaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92aXNpdG9yL21pZ3JhdGUtY29uZmlnLXY0LXY1LnZpc2l0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQThEO0FBQzlELHNFQVkwQztBQUUxQyxzRUFNMEM7QUFDMUMsc0VBUTBDO0FBQzFDLHNFQUkwQztBQUMxQyxzRUFBb0c7QUFDcEcsc0VBTTBDO0FBQzFDLHNFQUFnSDtBQUNoSCxzRUFBMEc7QUFDMUcsc0VBQTRFO0FBQzVFLHVFQUE4RztBQUM5Ryx1RUFBOEU7QUFDOUUsdUVBQW9FO0FBRXBFLHVFQUkwQztBQUMxQyx1RUFNMEM7QUFDMUMsdUVBQWlHO0FBQ2pHLHVFQU8wQztBQUMxQyx1RUFBK0c7QUFDL0csdUVBTTBDO0FBQzFDLHVFQUEwRztBQUMxRyx1RUFNMEM7QUFDMUMsdUVBQXNIO0FBQ3RILHVFQUErRTtBQUMvRSx1RUFNMEM7QUFDMUMsdUVBQW9IO0FBQ3BILHVFQU0wQztBQUMxQyx1RUFBc0g7QUFNdEgsdUVBQW9IO0FBTXBILHVFQUE4RztBQUM5Ryx1RUFNMEM7QUFDMUMsdUVBQTRHO0FBQzVHLHVFQUkwQztBQUMxQyx1RUFBa0Y7QUFDbEYsdUVBSTBDO0FBQzFDLHVFQUFvRjtBQUNwRix1RUFJMEM7QUFDMUMsdUVBQW9GO0FBQ3BGLHVFQUkwQztBQUMxQyx1RUFBb0Y7QUFLcEYsdUVBQXlGO0FBQ3pGLHVFQUkwQztBQUMxQyx1RUFBK0Y7QUFDL0YsdUVBSTBDO0FBQzFDLHVFQUFrRztBQUtsRyx1RUFBa0Y7QUFDbEYsdUVBTTBDO0FBQzFDLHVFQUFrSDtBQUNsSCx1RUFNMEM7QUFDMUMsdUVBQXNIO0FBQ3RILHVFQVMwQztBQUMxQyx1RUFBZ0c7QUFDaEcsdUVBTTBDO0FBQzFDLHVFQUE4RztBQUM5Ryx1RUFNMEM7QUFDMUMsdUVBQXdHO0FBQ3hHLHVFQU0wQztBQUMxQyx1RUFBa0g7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