@budibase/server 0.0.32 → 0.0.999-alpha.30

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 (977) hide show
  1. package/.dockerignore +6 -0
  2. package/.yarnrc +1 -0
  3. package/Dockerfile +41 -0
  4. package/LICENSE +391 -377
  5. package/__mocks__/@elastic/elasticsearch.ts +24 -0
  6. package/__mocks__/@google-cloud/firestore.ts +36 -0
  7. package/__mocks__/@sendgrid/mail.ts +22 -0
  8. package/__mocks__/airtable.ts +8 -0
  9. package/__mocks__/arangojs.ts +24 -0
  10. package/__mocks__/aws-sdk.ts +80 -0
  11. package/__mocks__/mongodb.ts +39 -0
  12. package/__mocks__/mssql.ts +24 -0
  13. package/__mocks__/mysql2/promise.ts +17 -0
  14. package/__mocks__/mysql2.ts +14 -0
  15. package/__mocks__/node-fetch.ts +201 -0
  16. package/__mocks__/oracledb.ts +31 -0
  17. package/__mocks__/pg.ts +30 -0
  18. package/babel.config.js +3 -0
  19. package/build/entitlements.mac.plist +14 -0
  20. package/build/icon.icns +0 -0
  21. package/build/icon.png +0 -0
  22. package/build/icons/512x512.png +0 -0
  23. package/build/pouchdb.js +9 -0
  24. package/builder/assets/auth0-logo.6fa5973f.png +0 -0
  25. package/builder/assets/backups-default.8c011f1b.png +0 -0
  26. package/builder/assets/bb-emblem.05f7ae7a.svg +80 -0
  27. package/builder/assets/bb-space-man.5be51a45.svg +290 -0
  28. package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
  29. package/builder/assets/bg.29e85dd5.png +0 -0
  30. package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
  31. package/builder/assets/bulgaria.bd68393d.png +0 -0
  32. package/builder/assets/covanta.72c46c1e.png +0 -0
  33. package/builder/assets/discord.c14881e9.svg +10 -0
  34. package/builder/assets/google-logo.c16467b8.png +0 -0
  35. package/builder/assets/index.c0265b74.css +6 -0
  36. package/builder/assets/index.c977bf31.js +1776 -0
  37. package/builder/assets/integromat.42212f11.png +0 -0
  38. package/builder/assets/listScreenPreview.599c0aae.png +0 -0
  39. package/builder/assets/microsoft-logo.07033b2a.png +0 -0
  40. package/builder/assets/oidc-logo.cb2fff74.png +0 -0
  41. package/builder/assets/okta-logo.61437d3d.png +0 -0
  42. package/builder/assets/onelogin-logo.181cc193.png +0 -0
  43. package/builder/assets/oracle.66592424.png +0 -0
  44. package/builder/assets/remixicon.0ac8bc3c.ttf +0 -0
  45. package/builder/assets/remixicon.64bb3a0f.eot +0 -0
  46. package/builder/assets/remixicon.a10268fe.svg +6835 -0
  47. package/builder/assets/remixicon.c2dacfbc.woff +0 -0
  48. package/builder/assets/remixicon.e61f0d10.woff2 +0 -0
  49. package/builder/assets/schnellecke.cf1837a8.png +0 -0
  50. package/builder/assets/slack.1e1f7cfb.svg +33 -0
  51. package/builder/assets/zapier.3fbd8f5c.png +0 -0
  52. package/builder/index.html +10 -13
  53. package/dist/api/controllers/analytics.js +46 -0
  54. package/dist/api/controllers/apikeys.js +72 -0
  55. package/dist/api/controllers/application.js +575 -0
  56. package/dist/api/controllers/auth.js +80 -0
  57. package/dist/api/controllers/automation.js +303 -0
  58. package/dist/api/controllers/backup.js +37 -0
  59. package/dist/api/controllers/cloud.js +130 -0
  60. package/dist/api/controllers/component.js +59 -0
  61. package/dist/api/controllers/datasource.js +306 -0
  62. package/dist/api/controllers/deploy/Deployment.js +53 -0
  63. package/dist/api/controllers/deploy/index.js +198 -0
  64. package/dist/api/controllers/dev.js +146 -0
  65. package/dist/api/controllers/integration.js +28 -0
  66. package/dist/api/controllers/layout.js +49 -0
  67. package/dist/api/controllers/metadata.js +63 -0
  68. package/dist/api/controllers/migrations.js +29 -0
  69. package/dist/api/controllers/ops.js +40 -0
  70. package/dist/api/controllers/permission.js +162 -0
  71. package/dist/api/controllers/plugin/file.js +24 -0
  72. package/dist/api/controllers/plugin/github.js +69 -0
  73. package/dist/api/controllers/plugin/index.js +112 -0
  74. package/dist/api/controllers/plugin/npm.js +58 -0
  75. package/dist/api/controllers/plugin/uploaders.js +11 -0
  76. package/dist/api/controllers/plugin/url.js +24 -0
  77. package/dist/api/controllers/plugin/utils.js +27 -0
  78. package/dist/api/controllers/public/applications.js +146 -0
  79. package/dist/api/controllers/public/mapping/applications.js +29 -0
  80. package/dist/api/controllers/public/mapping/index.js +11 -0
  81. package/dist/api/controllers/public/mapping/queries.js +36 -0
  82. package/dist/api/controllers/public/mapping/rows.js +24 -0
  83. package/dist/api/controllers/public/mapping/tables.js +23 -0
  84. package/dist/api/controllers/public/mapping/types.js +2 -0
  85. package/dist/api/controllers/public/mapping/users.js +29 -0
  86. package/dist/api/controllers/public/metrics.js +113 -0
  87. package/dist/api/controllers/public/queries.js +58 -0
  88. package/dist/api/controllers/public/rows.js +120 -0
  89. package/dist/api/controllers/public/tables.js +95 -0
  90. package/dist/api/controllers/public/users.js +93 -0
  91. package/dist/api/controllers/public/utils.js +56 -0
  92. package/dist/api/controllers/query/import/index.js +87 -0
  93. package/dist/api/controllers/query/import/sources/base/index.js +75 -0
  94. package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
  95. package/dist/api/controllers/query/import/sources/curl.js +99 -0
  96. package/dist/api/controllers/query/import/sources/openapi2.js +145 -0
  97. package/dist/api/controllers/query/import/sources/openapi3.js +177 -0
  98. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  99. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  100. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  101. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  102. package/dist/api/controllers/query/index.js +299 -0
  103. package/dist/api/controllers/query/validation.js +53 -0
  104. package/dist/api/controllers/role.js +109 -0
  105. package/dist/api/controllers/routing.js +105 -0
  106. package/dist/api/controllers/row/ExternalRequest.js +676 -0
  107. package/dist/api/controllers/row/external.js +339 -0
  108. package/dist/api/controllers/row/index.js +203 -0
  109. package/dist/api/controllers/row/internal.js +502 -0
  110. package/dist/api/controllers/row/internalSearch.js +28 -0
  111. package/dist/api/controllers/row/staticFormula.js +165 -0
  112. package/dist/api/controllers/row/utils.js +183 -0
  113. package/dist/api/controllers/screen.js +110 -0
  114. package/dist/api/controllers/script.js +30 -0
  115. package/dist/api/controllers/static/index.js +268 -0
  116. package/dist/api/controllers/static/templates/BudibaseApp.svelte +135 -0
  117. package/dist/api/controllers/static/templates/app.hbs +13 -0
  118. package/dist/api/controllers/static/templates/preview.hbs +117 -0
  119. package/dist/api/controllers/table/bulkFormula.js +173 -0
  120. package/dist/api/controllers/table/external.js +279 -0
  121. package/dist/api/controllers/table/index.js +179 -0
  122. package/dist/api/controllers/table/internal.js +194 -0
  123. package/dist/api/controllers/table/utils.js +374 -0
  124. package/dist/api/controllers/templates.js +56 -0
  125. package/dist/api/controllers/user.js +124 -0
  126. package/dist/api/controllers/view/exporters.js +44 -0
  127. package/dist/api/controllers/view/index.js +193 -0
  128. package/dist/api/controllers/view/utils.js +177 -0
  129. package/dist/api/controllers/view/viewBuilder.js +158 -0
  130. package/dist/api/controllers/webhook.js +134 -0
  131. package/dist/api/index.js +56 -0
  132. package/dist/api/routes/analytics.js +34 -0
  133. package/dist/api/routes/apikeys.js +37 -0
  134. package/dist/api/routes/application.js +48 -0
  135. package/dist/api/routes/auth.js +33 -0
  136. package/dist/api/routes/automation.js +50 -0
  137. package/dist/api/routes/backup.js +35 -0
  138. package/dist/api/routes/cloud.js +39 -0
  139. package/dist/api/routes/component.js +35 -0
  140. package/dist/api/routes/datasource.js +43 -0
  141. package/dist/api/routes/deploy.js +37 -0
  142. package/dist/api/routes/dev.js +49 -0
  143. package/dist/api/routes/index.js +77 -0
  144. package/dist/api/routes/integration.js +37 -0
  145. package/dist/api/routes/layout.js +37 -0
  146. package/dist/api/routes/metadata.js +40 -0
  147. package/dist/api/routes/migrations.js +36 -0
  148. package/dist/api/routes/ops.js +52 -0
  149. package/dist/api/routes/permission.js +44 -0
  150. package/dist/api/routes/plugin.js +39 -0
  151. package/dist/api/routes/public/applications.js +174 -0
  152. package/dist/api/routes/public/index.js +131 -0
  153. package/dist/api/routes/public/metrics.js +30 -0
  154. package/dist/api/routes/public/middleware/mapper.js +97 -0
  155. package/dist/api/routes/public/queries.js +72 -0
  156. package/dist/api/routes/public/rows.js +158 -0
  157. package/dist/api/routes/public/tables.js +152 -0
  158. package/dist/api/routes/public/users.js +135 -0
  159. package/dist/api/routes/public/utils/Endpoint.js +36 -0
  160. package/dist/api/routes/query.js +47 -0
  161. package/dist/api/routes/role.js +40 -0
  162. package/dist/api/routes/routing.js +39 -0
  163. package/dist/api/routes/row.js +239 -0
  164. package/dist/api/routes/screen.js +39 -0
  165. package/dist/api/routes/script.js +35 -0
  166. package/dist/api/routes/static.js +80 -0
  167. package/dist/api/routes/table.js +163 -0
  168. package/dist/api/routes/templates.js +37 -0
  169. package/dist/api/routes/user.js +43 -0
  170. package/dist/api/routes/utils/validators.js +238 -0
  171. package/dist/api/routes/view.js +42 -0
  172. package/dist/api/routes/webhook.js +43 -0
  173. package/dist/app.js +132 -0
  174. package/dist/automations/actions.js +137 -0
  175. package/dist/automations/automationUtils.js +173 -0
  176. package/dist/automations/bullboard.js +71 -0
  177. package/dist/automations/index.js +43 -0
  178. package/dist/automations/logging/index.js +53 -0
  179. package/dist/automations/steps/bash.js +111 -0
  180. package/dist/automations/steps/createRow.js +108 -0
  181. package/dist/automations/steps/delay.js +53 -0
  182. package/dist/automations/steps/deleteRow.js +96 -0
  183. package/dist/automations/steps/discord.js +116 -0
  184. package/dist/automations/steps/executeQuery.js +134 -0
  185. package/dist/automations/steps/executeScript.js +106 -0
  186. package/dist/automations/steps/filter.js +112 -0
  187. package/dist/automations/steps/integromat.js +119 -0
  188. package/dist/automations/steps/loop.js +54 -0
  189. package/dist/automations/steps/outgoingWebhook.js +166 -0
  190. package/dist/automations/steps/queryRows.js +216 -0
  191. package/dist/automations/steps/sendSmtpEmail.js +115 -0
  192. package/dist/automations/steps/serverLog.js +65 -0
  193. package/dist/automations/steps/slack.js +98 -0
  194. package/dist/automations/steps/updateRow.js +144 -0
  195. package/dist/automations/steps/utils.js +56 -0
  196. package/dist/automations/steps/zapier.js +117 -0
  197. package/dist/automations/triggerInfo/app.js +36 -0
  198. package/dist/automations/triggerInfo/cron.js +35 -0
  199. package/dist/automations/triggerInfo/index.js +40 -0
  200. package/dist/automations/triggerInfo/rowDeleted.js +36 -0
  201. package/dist/automations/triggerInfo/rowSaved.js +44 -0
  202. package/dist/automations/triggerInfo/rowUpdated.js +44 -0
  203. package/dist/automations/triggerInfo/webhook.js +40 -0
  204. package/dist/automations/triggers.js +180 -0
  205. package/dist/automations/utils.js +264 -0
  206. package/dist/constants/definitions.js +2 -0
  207. package/dist/constants/index.js +181 -0
  208. package/dist/constants/layouts.js +148 -0
  209. package/dist/constants/screens.js +51 -0
  210. package/dist/db/defaultData/datasource_bb_default.js +574 -0
  211. package/dist/db/defaultData/employeeImport.js +155 -0
  212. package/dist/db/defaultData/expensesImport.js +117 -0
  213. package/dist/db/defaultData/inventoryImport.js +109 -0
  214. package/dist/db/defaultData/jobsImport.js +152 -0
  215. package/dist/db/dynamoClient.js +124 -0
  216. package/dist/db/inMemoryView.js +62 -0
  217. package/dist/db/index.js +43 -0
  218. package/dist/db/linkedRows/LinkController.js +392 -0
  219. package/dist/db/linkedRows/LinkDocument.js +33 -0
  220. package/dist/db/linkedRows/index.js +206 -0
  221. package/dist/db/linkedRows/linkUtils.js +131 -0
  222. package/dist/db/newid.js +7 -0
  223. package/dist/db/utils.js +247 -0
  224. package/dist/db/views/staticViews.js +144 -0
  225. package/dist/ddApm.js +11 -0
  226. package/dist/definitions/automations.js +8 -0
  227. package/dist/definitions/common.js +2 -0
  228. package/dist/definitions/datasource.js +7 -0
  229. package/dist/definitions/openapi.js +6 -0
  230. package/dist/environment.js +113 -0
  231. package/dist/events/AutomationEmitter.js +53 -0
  232. package/dist/events/BudibaseEmitter.js +25 -0
  233. package/dist/events/docUpdates/index.js +17 -0
  234. package/dist/events/docUpdates/processors.js +18 -0
  235. package/dist/events/docUpdates/syncUsers.js +49 -0
  236. package/dist/events/index.js +11 -0
  237. package/dist/events/utils.js +43 -0
  238. package/dist/index.js +16 -0
  239. package/dist/integrations/airtable.js +147 -0
  240. package/dist/integrations/arangodb.js +103 -0
  241. package/dist/integrations/base/query.js +32 -0
  242. package/dist/integrations/base/sql.js +600 -0
  243. package/dist/integrations/base/sqlTable.js +160 -0
  244. package/dist/integrations/base/types.js +2 -0
  245. package/dist/integrations/couchdb.js +125 -0
  246. package/dist/integrations/dynamodb.js +194 -0
  247. package/dist/integrations/elasticsearch.js +186 -0
  248. package/dist/integrations/firebase.js +174 -0
  249. package/dist/integrations/googlesheets.js +455 -0
  250. package/dist/integrations/index.js +135 -0
  251. package/dist/integrations/microsoftSqlServer.js +273 -0
  252. package/dist/integrations/mongodb.js +614 -0
  253. package/dist/integrations/mysql.js +256 -0
  254. package/dist/integrations/oracle.js +375 -0
  255. package/dist/integrations/postgres.js +300 -0
  256. package/dist/integrations/queries/sql.js +84 -0
  257. package/dist/integrations/redis.js +168 -0
  258. package/dist/integrations/rest.js +400 -0
  259. package/dist/integrations/s3.js +237 -0
  260. package/dist/integrations/snowflake.js +99 -0
  261. package/dist/integrations/utils.js +295 -0
  262. package/dist/middleware/appInfo.js +22 -0
  263. package/dist/middleware/authorized.js +112 -0
  264. package/dist/middleware/builder.js +93 -0
  265. package/dist/middleware/currentapp.js +103 -0
  266. package/dist/middleware/joi-validator.js +43 -0
  267. package/dist/middleware/publicApi.js +25 -0
  268. package/dist/middleware/resourceId.js +59 -0
  269. package/dist/middleware/selfhost.js +24 -0
  270. package/dist/middleware/utils.js +8 -0
  271. package/dist/migrations/functions/appUrls.js +42 -0
  272. package/dist/migrations/functions/backfill/app/automations.js +31 -0
  273. package/dist/migrations/functions/backfill/app/datasources.js +28 -0
  274. package/dist/migrations/functions/backfill/app/layouts.js +33 -0
  275. package/dist/migrations/functions/backfill/app/queries.js +50 -0
  276. package/dist/migrations/functions/backfill/app/roles.js +28 -0
  277. package/dist/migrations/functions/backfill/app/screens.js +28 -0
  278. package/dist/migrations/functions/backfill/app/tables.js +37 -0
  279. package/dist/migrations/functions/backfill/app.js +176 -0
  280. package/dist/migrations/functions/backfill/global/configs.js +67 -0
  281. package/dist/migrations/functions/backfill/global/quotas.js +60 -0
  282. package/dist/migrations/functions/backfill/global/users.js +50 -0
  283. package/dist/migrations/functions/backfill/global.js +205 -0
  284. package/dist/migrations/functions/backfill/index.js +32 -0
  285. package/dist/migrations/functions/backfill/installation.js +80 -0
  286. package/dist/migrations/functions/syncQuotas.js +50 -0
  287. package/dist/migrations/functions/tableSettings.js +130 -0
  288. package/dist/migrations/functions/usageQuotas/index.js +16 -0
  289. package/dist/migrations/functions/usageQuotas/syncApps.js +25 -0
  290. package/dist/migrations/functions/usageQuotas/syncPlugins.js +23 -0
  291. package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
  292. package/dist/migrations/functions/userEmailViewCasing.js +24 -0
  293. package/dist/migrations/index.js +111 -0
  294. package/dist/migrations/tests/helpers.js +72 -0
  295. package/dist/migrations/tests/structures.js +37 -0
  296. package/dist/package.json +180 -0
  297. package/dist/sdk/app/applications/index.js +28 -0
  298. package/dist/sdk/app/applications/sync.js +164 -0
  299. package/dist/sdk/app/applications/utils.js +21 -0
  300. package/dist/sdk/app/automations/index.js +29 -0
  301. package/dist/sdk/app/automations/webhook.js +54 -0
  302. package/dist/sdk/app/backups/constants.js +6 -0
  303. package/dist/sdk/app/backups/exports.js +184 -0
  304. package/dist/sdk/app/backups/imports.js +170 -0
  305. package/dist/sdk/app/backups/index.js +29 -0
  306. package/dist/sdk/app/backups/statistics.js +73 -0
  307. package/dist/sdk/app/datasources/datasources.js +166 -0
  308. package/dist/sdk/app/datasources/index.js +27 -0
  309. package/dist/sdk/app/queries/index.js +27 -0
  310. package/dist/sdk/app/queries/queries.js +60 -0
  311. package/dist/sdk/app/rows/attachments.js +61 -0
  312. package/dist/sdk/app/rows/index.js +28 -0
  313. package/dist/sdk/app/rows/rows.js +30 -0
  314. package/dist/sdk/app/tables/index.js +65 -0
  315. package/dist/sdk/index.js +27 -0
  316. package/dist/sdk/plugins/index.js +27 -0
  317. package/dist/sdk/plugins/plugins.js +53 -0
  318. package/dist/sdk/users/index.js +27 -0
  319. package/dist/sdk/users/utils.js +87 -0
  320. package/dist/sdk/utils/index.js +29 -0
  321. package/dist/startup.js +158 -0
  322. package/dist/threads/automation.js +449 -0
  323. package/dist/threads/definitions.js +2 -0
  324. package/dist/threads/index.js +137 -0
  325. package/dist/threads/query.js +265 -0
  326. package/dist/threads/utils.js +122 -0
  327. package/dist/tsconfig.build.tsbuildinfo +1 -0
  328. package/dist/utilities/appDirectoryTemplate/package.json +10 -0
  329. package/dist/utilities/budibaseDir.js +5 -0
  330. package/dist/utilities/centralPath.js +27 -0
  331. package/dist/utilities/fileSystem/app.js +88 -0
  332. package/dist/utilities/fileSystem/clientLibrary.js +138 -0
  333. package/dist/utilities/fileSystem/filesystem.js +180 -0
  334. package/dist/utilities/fileSystem/index.js +21 -0
  335. package/dist/utilities/fileSystem/plugin.js +76 -0
  336. package/dist/utilities/fileSystem/processor.js +34 -0
  337. package/dist/utilities/fileSystem/template.js +47 -0
  338. package/dist/utilities/global.js +149 -0
  339. package/dist/utilities/index.js +143 -0
  340. package/dist/utilities/redis.js +117 -0
  341. package/dist/utilities/retry.js +30 -0
  342. package/dist/utilities/routing/index.js +39 -0
  343. package/dist/utilities/rowProcessor/index.js +284 -0
  344. package/dist/utilities/rowProcessor/map.js +99 -0
  345. package/dist/utilities/rowProcessor/utils.js +88 -0
  346. package/dist/utilities/schema.js +108 -0
  347. package/dist/utilities/scriptRunner.js +26 -0
  348. package/dist/utilities/security.js +57 -0
  349. package/dist/utilities/statusCodes.js +9 -0
  350. package/dist/utilities/usageQuota/rows.js +88 -0
  351. package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
  352. package/dist/utilities/users.js +57 -0
  353. package/dist/utilities/workerRequests.js +171 -0
  354. package/dist/watch.js +53 -0
  355. package/dist/websockets/client.js +14 -0
  356. package/dist/websockets/grid.js +60 -0
  357. package/dist/websockets/index.js +17 -0
  358. package/dist/websockets/websocket.js +78 -0
  359. package/docker_run.sh +7 -0
  360. package/jest-testcontainers-config.js +8 -0
  361. package/jest.config.ts +52 -0
  362. package/nodemon.json +10 -0
  363. package/package.json +166 -31
  364. package/pm2.config.js +9 -0
  365. package/scripts/account.js +8 -0
  366. package/scripts/dev/manage.js +119 -0
  367. package/scripts/docs/README.md +31 -0
  368. package/scripts/docs/generate.js +74 -0
  369. package/scripts/docs/toSwagger.js +320 -0
  370. package/scripts/exportAppTemplate.js +64 -0
  371. package/scripts/integrations/customer-categories/docker-compose.yml +28 -0
  372. package/scripts/integrations/customer-categories/init.sql +41 -0
  373. package/scripts/integrations/customer-categories/reset.sh +3 -0
  374. package/scripts/integrations/mssql/data/Dockerfile +9 -0
  375. package/scripts/integrations/mssql/data/entrypoint.sh +25 -0
  376. package/scripts/integrations/mssql/data/setup.sql +80 -0
  377. package/scripts/integrations/mssql/docker-compose.yaml +12 -0
  378. package/scripts/integrations/mssql/reset.sh +3 -0
  379. package/scripts/integrations/mysql/docker-compose.yaml +21 -0
  380. package/scripts/integrations/mysql/init.sql +32 -0
  381. package/scripts/integrations/mysql/reset.sh +3 -0
  382. package/scripts/integrations/oracle/docker-compose.yml +19 -0
  383. package/scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip +0 -0
  384. package/scripts/integrations/oracle/instantclient/linux/arm64/install.sh +23 -0
  385. package/scripts/integrations/oracle/instantclient/linux/install.sh +10 -0
  386. package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
  387. package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
  388. package/scripts/integrations/oracle/oracle.md +90 -0
  389. package/scripts/integrations/pg-json/docker-compose.yml +28 -0
  390. package/scripts/integrations/pg-json/init.sql +22 -0
  391. package/scripts/integrations/pg-json/reset.sh +3 -0
  392. package/scripts/integrations/postgres/docker-compose.yml +28 -0
  393. package/scripts/integrations/postgres/emp-skill.sql +46 -0
  394. package/scripts/integrations/postgres/emp-territory.sql +32 -0
  395. package/scripts/integrations/postgres/init.sql +57 -0
  396. package/scripts/integrations/postgres/reset.sh +3 -0
  397. package/scripts/integrations/service-vehicles/docker-compose.yml +28 -0
  398. package/scripts/integrations/service-vehicles/init.sql +52 -0
  399. package/scripts/integrations/service-vehicles/reset.sh +3 -0
  400. package/scripts/load/create-many-apps.js +24 -0
  401. package/scripts/load/create-many-rows.js +30 -0
  402. package/scripts/load/utils.js +66 -0
  403. package/scripts/localdomain.js +52 -0
  404. package/scripts/multiTenancy.js +8 -0
  405. package/scripts/selfhost.js +8 -0
  406. package/scripts/test.sh +14 -0
  407. package/scripts/watchtower-hooks/post-check.sh +1 -0
  408. package/scripts/watchtower-hooks/post-update.sh +1 -0
  409. package/scripts/watchtower-hooks/pre-check.sh +1 -0
  410. package/scripts/watchtower-hooks/pre-update.sh +1 -0
  411. package/specs/generate.ts +92 -0
  412. package/specs/openapi.json +2782 -0
  413. package/specs/openapi.yaml +2111 -0
  414. package/specs/parameters.ts +59 -0
  415. package/specs/resources/application.ts +137 -0
  416. package/specs/resources/index.ts +26 -0
  417. package/specs/resources/metrics.ts +81 -0
  418. package/specs/resources/misc.ts +128 -0
  419. package/specs/resources/query.ts +217 -0
  420. package/specs/resources/row.ts +124 -0
  421. package/specs/resources/table.ts +197 -0
  422. package/specs/resources/user.ts +132 -0
  423. package/specs/resources/utils/Resource.ts +39 -0
  424. package/specs/resources/utils/index.ts +11 -0
  425. package/specs/security.ts +7 -0
  426. package/src/api/controllers/analytics.ts +35 -0
  427. package/src/api/controllers/apikeys.ts +54 -0
  428. package/src/api/controllers/application.ts +633 -0
  429. package/src/api/controllers/auth.ts +72 -0
  430. package/src/api/controllers/automation.ts +302 -0
  431. package/src/api/controllers/backup.ts +21 -0
  432. package/src/api/controllers/cloud.ts +119 -0
  433. package/src/api/controllers/component.ts +58 -0
  434. package/src/api/controllers/datasource.ts +351 -0
  435. package/src/api/controllers/deploy/Deployment.ts +59 -0
  436. package/src/api/controllers/deploy/index.ts +203 -0
  437. package/src/api/controllers/dev.ts +129 -0
  438. package/src/api/controllers/integration.ts +13 -0
  439. package/src/api/controllers/layout.ts +47 -0
  440. package/src/api/controllers/metadata.ts +42 -0
  441. package/src/api/controllers/migrations.ts +14 -0
  442. package/src/api/controllers/ops.ts +32 -0
  443. package/src/api/controllers/permission.ts +178 -0
  444. package/src/api/controllers/plugin/file.ts +15 -0
  445. package/src/api/controllers/plugin/github.ts +75 -0
  446. package/src/api/controllers/plugin/index.ts +101 -0
  447. package/src/api/controllers/plugin/npm.ts +56 -0
  448. package/src/api/controllers/plugin/uploaders.ts +4 -0
  449. package/src/api/controllers/plugin/url.ts +12 -0
  450. package/src/api/controllers/plugin/utils.ts +17 -0
  451. package/src/api/controllers/public/applications.ts +100 -0
  452. package/src/api/controllers/public/mapping/applications.ts +32 -0
  453. package/src/api/controllers/public/mapping/index.ts +13 -0
  454. package/src/api/controllers/public/mapping/queries.ts +39 -0
  455. package/src/api/controllers/public/mapping/rows.ts +31 -0
  456. package/src/api/controllers/public/mapping/tables.ts +26 -0
  457. package/src/api/controllers/public/mapping/types.ts +21 -0
  458. package/src/api/controllers/public/mapping/users.ts +32 -0
  459. package/src/api/controllers/public/metrics.ts +251 -0
  460. package/src/api/controllers/public/queries.ts +20 -0
  461. package/src/api/controllers/public/rows.ts +81 -0
  462. package/src/api/controllers/public/tables.ts +56 -0
  463. package/src/api/controllers/public/users.ts +80 -0
  464. package/src/api/controllers/public/utils.ts +45 -0
  465. package/src/api/controllers/query/import/index.ts +96 -0
  466. package/src/api/controllers/query/import/sources/base/index.ts +98 -0
  467. package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
  468. package/src/api/controllers/query/import/sources/curl.ts +106 -0
  469. package/src/api/controllers/query/import/sources/openapi2.ts +167 -0
  470. package/src/api/controllers/query/import/sources/openapi3.ts +209 -0
  471. package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
  472. package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
  473. package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
  474. package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
  475. package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
  476. package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
  477. package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
  478. package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
  479. package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
  480. package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
  481. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
  482. package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
  483. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
  484. package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
  485. package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
  486. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  487. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  488. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  489. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  490. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  491. package/src/api/controllers/query/import/tests/index.spec.js +162 -0
  492. package/src/api/controllers/query/index.ts +307 -0
  493. package/src/api/controllers/query/validation.ts +50 -0
  494. package/src/api/controllers/role.ts +104 -0
  495. package/src/api/controllers/routing.ts +95 -0
  496. package/src/api/controllers/row/ExternalRequest.ts +821 -0
  497. package/src/api/controllers/row/external.ts +304 -0
  498. package/src/api/controllers/row/index.ts +162 -0
  499. package/src/api/controllers/row/internal.ts +500 -0
  500. package/src/api/controllers/row/internalSearch.ts +18 -0
  501. package/src/api/controllers/row/staticFormula.ts +170 -0
  502. package/src/api/controllers/row/utils.ts +156 -0
  503. package/src/api/controllers/screen.ts +126 -0
  504. package/src/api/controllers/script.ts +12 -0
  505. package/src/api/controllers/static/index.ts +241 -0
  506. package/src/api/controllers/static/templates/BudibaseApp.svelte +135 -0
  507. package/src/api/controllers/static/templates/app.hbs +13 -0
  508. package/src/api/controllers/static/templates/preview.hbs +117 -0
  509. package/src/api/controllers/table/bulkFormula.ts +188 -0
  510. package/src/api/controllers/table/external.ts +364 -0
  511. package/src/api/controllers/table/index.ts +143 -0
  512. package/src/api/controllers/table/internal.ts +191 -0
  513. package/src/api/controllers/table/tests/utils.spec.ts +97 -0
  514. package/src/api/controllers/table/utils.ts +422 -0
  515. package/src/api/controllers/templates.ts +43 -0
  516. package/src/api/controllers/user.ts +97 -0
  517. package/src/api/controllers/view/exporters.ts +43 -0
  518. package/src/api/controllers/view/index.ts +192 -0
  519. package/src/api/controllers/view/tests/__snapshots__/viewBuilder.spec.js.snap +147 -0
  520. package/src/api/controllers/view/tests/viewBuilder.spec.js +65 -0
  521. package/src/api/controllers/view/utils.ts +165 -0
  522. package/src/api/controllers/view/viewBuilder.ts +203 -0
  523. package/src/api/controllers/webhook.ts +100 -0
  524. package/src/api/index.ts +63 -0
  525. package/src/api/routes/analytics.ts +9 -0
  526. package/src/api/routes/apikeys.ts +12 -0
  527. package/src/api/routes/application.ts +57 -0
  528. package/src/api/routes/auth.ts +8 -0
  529. package/src/api/routes/automation.ts +87 -0
  530. package/src/api/routes/backup.ts +14 -0
  531. package/src/api/routes/cloud.ts +18 -0
  532. package/src/api/routes/component.ts +14 -0
  533. package/src/api/routes/datasource.ts +60 -0
  534. package/src/api/routes/deploy.ts +20 -0
  535. package/src/api/routes/dev.ts +38 -0
  536. package/src/api/routes/index.ts +73 -0
  537. package/src/api/routes/integration.ts +16 -0
  538. package/src/api/routes/layout.ts +16 -0
  539. package/src/api/routes/metadata.ts +38 -0
  540. package/src/api/routes/migrations.ts +14 -0
  541. package/src/api/routes/ops.ts +30 -0
  542. package/src/api/routes/permission.ts +41 -0
  543. package/src/api/routes/plugin.ts +22 -0
  544. package/src/api/routes/public/applications.ts +195 -0
  545. package/src/api/routes/public/index.ts +145 -0
  546. package/src/api/routes/public/metrics.ts +28 -0
  547. package/src/api/routes/public/middleware/mapper.ts +85 -0
  548. package/src/api/routes/public/queries.ts +76 -0
  549. package/src/api/routes/public/rows.ts +171 -0
  550. package/src/api/routes/public/tables.ts +167 -0
  551. package/src/api/routes/public/tests/compare.spec.ts +185 -0
  552. package/src/api/routes/public/tests/metrics.spec.js +34 -0
  553. package/src/api/routes/public/tests/users.spec.js +38 -0
  554. package/src/api/routes/public/tests/utils.ts +45 -0
  555. package/src/api/routes/public/users.ts +142 -0
  556. package/src/api/routes/public/utils/Endpoint.ts +51 -0
  557. package/src/api/routes/query.ts +61 -0
  558. package/src/api/routes/role.ts +24 -0
  559. package/src/api/routes/routing.ts +14 -0
  560. package/src/api/routes/row.ts +266 -0
  561. package/src/api/routes/screen.ts +23 -0
  562. package/src/api/routes/script.ts +10 -0
  563. package/src/api/routes/static.ts +65 -0
  564. package/src/api/routes/table.ts +170 -0
  565. package/src/api/routes/templates.ts +16 -0
  566. package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +93 -0
  567. package/src/api/routes/tests/__snapshots__/view.spec.js.snap +38 -0
  568. package/src/api/routes/tests/analytics.spec.js +62 -0
  569. package/src/api/routes/tests/apikeys.spec.js +59 -0
  570. package/src/api/routes/tests/appSync.spec.ts +31 -0
  571. package/src/api/routes/tests/application.spec.ts +327 -0
  572. package/src/api/routes/tests/auth.spec.js +24 -0
  573. package/src/api/routes/tests/automation.spec.js +349 -0
  574. package/src/api/routes/tests/backup.spec.ts +45 -0
  575. package/src/api/routes/tests/cloud.spec.ts +54 -0
  576. package/src/api/routes/tests/component.spec.js +32 -0
  577. package/src/api/routes/tests/data/budibase-component-1.0.1.tgz +0 -0
  578. package/src/api/routes/tests/data/comment-box-1.0.2.tar.gz +0 -0
  579. package/src/api/routes/tests/data/export-test.tar.gz +0 -0
  580. package/src/api/routes/tests/data/export.txt +1 -0
  581. package/src/api/routes/tests/data/old-app.txt +3 -0
  582. package/src/api/routes/tests/datasource.spec.ts +238 -0
  583. package/src/api/routes/tests/dev.spec.js +40 -0
  584. package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
  585. package/src/api/routes/tests/integration.spec.js +52 -0
  586. package/src/api/routes/tests/internalSearch.spec.js +197 -0
  587. package/src/api/routes/tests/layout.spec.js +59 -0
  588. package/src/api/routes/tests/metadata.spec.js +65 -0
  589. package/src/api/routes/tests/misc.spec.js +91 -0
  590. package/src/api/routes/tests/permissions.spec.js +133 -0
  591. package/src/api/routes/tests/plugin.spec.ts +179 -0
  592. package/src/api/routes/tests/query.seq.spec.js +538 -0
  593. package/src/api/routes/tests/role.spec.js +131 -0
  594. package/src/api/routes/tests/routing.spec.js +116 -0
  595. package/src/api/routes/tests/row.spec.js +573 -0
  596. package/src/api/routes/tests/screen.spec.js +103 -0
  597. package/src/api/routes/tests/static.spec.js +140 -0
  598. package/src/api/routes/tests/table.spec.js +302 -0
  599. package/src/api/routes/tests/templates.spec.js +24 -0
  600. package/src/api/routes/tests/user.spec.js +208 -0
  601. package/src/api/routes/tests/utilities/TestFunctions.ts +177 -0
  602. package/src/api/routes/tests/utilities/index.ts +96 -0
  603. package/src/api/routes/tests/view.spec.js +419 -0
  604. package/src/api/routes/tests/webhook.spec.js +134 -0
  605. package/src/api/routes/user.ts +46 -0
  606. package/src/api/routes/utils/validators.ts +240 -0
  607. package/src/api/routes/view.ts +34 -0
  608. package/src/api/routes/webhook.ts +27 -0
  609. package/src/app.ts +114 -0
  610. package/src/automations/actions.ts +109 -0
  611. package/src/automations/automationUtils.ts +163 -0
  612. package/src/automations/bullboard.ts +38 -0
  613. package/src/automations/index.ts +26 -0
  614. package/src/automations/logging/index.ts +38 -0
  615. package/src/automations/steps/bash.ts +81 -0
  616. package/src/automations/steps/createRow.ts +102 -0
  617. package/src/automations/steps/delay.ts +46 -0
  618. package/src/automations/steps/deleteRow.ts +91 -0
  619. package/src/automations/steps/discord.ts +106 -0
  620. package/src/automations/steps/executeQuery.ts +98 -0
  621. package/src/automations/steps/executeScript.ts +83 -0
  622. package/src/automations/steps/filter.ts +105 -0
  623. package/src/automations/steps/integromat.ts +110 -0
  624. package/src/automations/steps/loop.ts +58 -0
  625. package/src/automations/steps/outgoingWebhook.ts +141 -0
  626. package/src/automations/steps/queryRows.ts +196 -0
  627. package/src/automations/steps/sendSmtpEmail.ts +92 -0
  628. package/src/automations/steps/serverLog.ts +59 -0
  629. package/src/automations/steps/slack.ts +87 -0
  630. package/src/automations/steps/updateRow.ts +121 -0
  631. package/src/automations/steps/utils.ts +46 -0
  632. package/src/automations/steps/zapier.ts +108 -0
  633. package/src/automations/tests/automation.spec.ts +99 -0
  634. package/src/automations/tests/bash.spec.js +34 -0
  635. package/src/automations/tests/createRow.spec.ts +46 -0
  636. package/src/automations/tests/delay.spec.js +16 -0
  637. package/src/automations/tests/deleteRow.spec.ts +55 -0
  638. package/src/automations/tests/discord.spec.js +27 -0
  639. package/src/automations/tests/executeQuery.spec.js +48 -0
  640. package/src/automations/tests/executeScript.spec.js +48 -0
  641. package/src/automations/tests/filter.spec.js +49 -0
  642. package/src/automations/tests/loop.spec.ts +45 -0
  643. package/src/automations/tests/outgoingWebhook.spec.js +39 -0
  644. package/src/automations/tests/queryRows.spec.js +117 -0
  645. package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
  646. package/src/automations/tests/serverLog.spec.js +22 -0
  647. package/src/automations/tests/updateRow.spec.js +44 -0
  648. package/src/automations/tests/utilities/index.ts +60 -0
  649. package/src/automations/tests/zapier.spec.js +27 -0
  650. package/src/automations/triggerInfo/app.ts +40 -0
  651. package/src/automations/triggerInfo/cron.ts +39 -0
  652. package/src/automations/triggerInfo/index.ts +15 -0
  653. package/src/automations/triggerInfo/rowDeleted.ts +40 -0
  654. package/src/automations/triggerInfo/rowSaved.ts +48 -0
  655. package/src/automations/triggerInfo/rowUpdated.ts +48 -0
  656. package/src/automations/triggerInfo/webhook.ts +44 -0
  657. package/src/automations/triggers.ts +156 -0
  658. package/src/automations/unitTests/automationUtils.spec.ts +133 -0
  659. package/src/automations/utils.ts +267 -0
  660. package/src/constants/definitions.ts +42 -0
  661. package/src/constants/index.ts +183 -0
  662. package/src/constants/layouts.ts +147 -0
  663. package/src/constants/screens.ts +48 -0
  664. package/src/db/defaultData/datasource_bb_default.ts +654 -0
  665. package/src/db/defaultData/employeeImport.ts +152 -0
  666. package/src/db/defaultData/expensesImport.ts +114 -0
  667. package/src/db/defaultData/inventoryImport.ts +106 -0
  668. package/src/db/defaultData/jobsImport.ts +158 -0
  669. package/src/db/dynamoClient.ts +147 -0
  670. package/src/db/inMemoryView.ts +55 -0
  671. package/src/db/index.ts +16 -0
  672. package/src/db/linkedRows/LinkController.ts +445 -0
  673. package/src/db/linkedRows/LinkDocument.ts +60 -0
  674. package/src/db/linkedRows/index.ts +217 -0
  675. package/src/db/linkedRows/linkUtils.ts +125 -0
  676. package/src/db/newid.ts +5 -0
  677. package/src/db/tests/linkController.spec.js +236 -0
  678. package/src/db/tests/linkTests.spec.js +65 -0
  679. package/src/db/utils.ts +272 -0
  680. package/src/db/views/staticViews.ts +132 -0
  681. package/src/ddApm.ts +7 -0
  682. package/src/definitions/automations.ts +33 -0
  683. package/src/definitions/common.ts +54 -0
  684. package/src/definitions/datasource.ts +9 -0
  685. package/src/definitions/openapi.ts +1233 -0
  686. package/src/environment.ts +125 -0
  687. package/src/events/AutomationEmitter.ts +58 -0
  688. package/src/events/BudibaseEmitter.ts +29 -0
  689. package/src/events/docUpdates/index.ts +1 -0
  690. package/src/events/docUpdates/processors.ts +14 -0
  691. package/src/events/docUpdates/syncUsers.ts +35 -0
  692. package/src/events/index.ts +6 -0
  693. package/src/events/utils.ts +78 -0
  694. package/src/index.ts +16 -0
  695. package/src/integration-test/postgres.spec.ts +1026 -0
  696. package/src/integrations/airtable.ts +148 -0
  697. package/src/integrations/arangodb.ts +110 -0
  698. package/src/integrations/base/query.ts +18 -0
  699. package/src/integrations/base/sql.ts +651 -0
  700. package/src/integrations/base/sqlTable.ts +202 -0
  701. package/src/integrations/base/types.ts +134 -0
  702. package/src/integrations/couchdb.ts +133 -0
  703. package/src/integrations/dynamodb.ts +220 -0
  704. package/src/integrations/elasticsearch.ts +187 -0
  705. package/src/integrations/firebase.ts +187 -0
  706. package/src/integrations/googlesheets.ts +511 -0
  707. package/src/integrations/index.ts +125 -0
  708. package/src/integrations/microsoftSqlServer.ts +312 -0
  709. package/src/integrations/mongodb.ts +638 -0
  710. package/src/integrations/mysql.ts +300 -0
  711. package/src/integrations/oracle.ts +435 -0
  712. package/src/integrations/postgres.ts +336 -0
  713. package/src/integrations/queries/sql.ts +81 -0
  714. package/src/integrations/redis.ts +163 -0
  715. package/src/integrations/rest.ts +436 -0
  716. package/src/integrations/s3.ts +260 -0
  717. package/src/integrations/snowflake.ts +97 -0
  718. package/src/integrations/tests/TestConfiguration.js +0 -0
  719. package/src/integrations/tests/airtable.spec.ts +75 -0
  720. package/src/integrations/tests/arangodb.spec.ts +38 -0
  721. package/src/integrations/tests/couchdb.spec.ts +86 -0
  722. package/src/integrations/tests/dynamodb.spec.ts +155 -0
  723. package/src/integrations/tests/elasticsearch.spec.ts +82 -0
  724. package/src/integrations/tests/firebase.spec.ts +97 -0
  725. package/src/integrations/tests/googlesheets.spec.ts +126 -0
  726. package/src/integrations/tests/microsoftSqlServer.spec.ts +56 -0
  727. package/src/integrations/tests/mongo.spec.ts +334 -0
  728. package/src/integrations/tests/mysql.spec.ts +133 -0
  729. package/src/integrations/tests/oracle.spec.ts +96 -0
  730. package/src/integrations/tests/postgres.spec.ts +81 -0
  731. package/src/integrations/tests/redis.spec.ts +88 -0
  732. package/src/integrations/tests/rest.spec.ts +595 -0
  733. package/src/integrations/tests/s3.spec.ts +112 -0
  734. package/src/integrations/tests/sql.spec.ts +639 -0
  735. package/src/integrations/utils.ts +330 -0
  736. package/src/middleware/appInfo.ts +20 -0
  737. package/src/middleware/authorized.ts +131 -0
  738. package/src/middleware/builder.ts +97 -0
  739. package/src/middleware/currentapp.ts +112 -0
  740. package/src/middleware/joi-validator.ts +40 -0
  741. package/src/middleware/publicApi.ts +21 -0
  742. package/src/middleware/resourceId.ts +66 -0
  743. package/src/middleware/selfhost.ts +12 -0
  744. package/src/middleware/tests/authorized.spec.js +163 -0
  745. package/src/middleware/tests/currentapp.spec.js +207 -0
  746. package/src/middleware/tests/resourceId.spec.js +105 -0
  747. package/src/middleware/tests/selfhost.spec.js +43 -0
  748. package/src/middleware/utils.ts +9 -0
  749. package/src/migrations/functions/appUrls.ts +27 -0
  750. package/src/migrations/functions/backfill/app/automations.ts +26 -0
  751. package/src/migrations/functions/backfill/app/datasources.ts +22 -0
  752. package/src/migrations/functions/backfill/app/layouts.ts +29 -0
  753. package/src/migrations/functions/backfill/app/queries.ts +47 -0
  754. package/src/migrations/functions/backfill/app/roles.ts +22 -0
  755. package/src/migrations/functions/backfill/app/screens.ts +22 -0
  756. package/src/migrations/functions/backfill/app/tables.ts +27 -0
  757. package/src/migrations/functions/backfill/app.ts +149 -0
  758. package/src/migrations/functions/backfill/global/configs.ts +73 -0
  759. package/src/migrations/functions/backfill/global/quotas.ts +60 -0
  760. package/src/migrations/functions/backfill/global/users.ts +49 -0
  761. package/src/migrations/functions/backfill/global.ts +213 -0
  762. package/src/migrations/functions/backfill/index.ts +7 -0
  763. package/src/migrations/functions/backfill/installation.ts +50 -0
  764. package/src/migrations/functions/syncQuotas.ts +15 -0
  765. package/src/migrations/functions/tableSettings.ts +145 -0
  766. package/src/migrations/functions/tests/appUrls.spec.js +26 -0
  767. package/src/migrations/functions/tests/syncQuotas.spec.js +26 -0
  768. package/src/migrations/functions/tests/tableSettings.spec.ts +144 -0
  769. package/src/migrations/functions/tests/userEmailViewCasing.spec.js +34 -0
  770. package/src/migrations/functions/usageQuotas/index.ts +3 -0
  771. package/src/migrations/functions/usageQuotas/syncApps.ts +14 -0
  772. package/src/migrations/functions/usageQuotas/syncPlugins.ts +10 -0
  773. package/src/migrations/functions/usageQuotas/syncRows.ts +27 -0
  774. package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +35 -0
  775. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +53 -0
  776. package/src/migrations/functions/userEmailViewCasing.ts +13 -0
  777. package/src/migrations/index.ts +115 -0
  778. package/src/migrations/tests/helpers.ts +40 -0
  779. package/src/migrations/tests/index.spec.ts +142 -0
  780. package/src/migrations/tests/structures.ts +67 -0
  781. package/src/sdk/app/applications/index.ts +7 -0
  782. package/src/sdk/app/applications/sync.ts +168 -0
  783. package/src/sdk/app/applications/tests/sync.spec.ts +137 -0
  784. package/src/sdk/app/applications/utils.ts +17 -0
  785. package/src/sdk/app/automations/index.ts +5 -0
  786. package/src/sdk/app/automations/webhook.ts +43 -0
  787. package/src/sdk/app/backups/constants.ts +3 -0
  788. package/src/sdk/app/backups/exports.ts +195 -0
  789. package/src/sdk/app/backups/imports.ts +185 -0
  790. package/src/sdk/app/backups/index.ts +9 -0
  791. package/src/sdk/app/backups/statistics.ts +69 -0
  792. package/src/sdk/app/datasources/datasources.ts +162 -0
  793. package/src/sdk/app/datasources/index.ts +5 -0
  794. package/src/sdk/app/queries/index.ts +5 -0
  795. package/src/sdk/app/queries/queries.ts +50 -0
  796. package/src/sdk/app/rows/attachments.ts +60 -0
  797. package/src/sdk/app/rows/index.ts +7 -0
  798. package/src/sdk/app/rows/rows.ts +18 -0
  799. package/src/sdk/app/tables/index.ts +63 -0
  800. package/src/sdk/index.ts +24 -0
  801. package/src/sdk/plugins/index.ts +5 -0
  802. package/src/sdk/plugins/plugins.ts +41 -0
  803. package/src/sdk/tests/attachments.spec.ts +76 -0
  804. package/src/sdk/users/index.ts +5 -0
  805. package/src/sdk/users/tests/utils.spec.ts +128 -0
  806. package/src/sdk/users/utils.ts +93 -0
  807. package/src/sdk/utils/index.ts +16 -0
  808. package/src/startup.ts +138 -0
  809. package/src/tests/jestEnv.ts +11 -0
  810. package/src/tests/jestSetup.ts +22 -0
  811. package/src/tests/utilities/TestConfiguration.ts +768 -0
  812. package/src/tests/utilities/controllers.ts +14 -0
  813. package/src/tests/utilities/index.ts +11 -0
  814. package/src/tests/utilities/structures.ts +289 -0
  815. package/src/threads/automation.ts +502 -0
  816. package/src/threads/definitions.ts +21 -0
  817. package/src/threads/index.ts +111 -0
  818. package/src/threads/query.ts +305 -0
  819. package/src/threads/utils.ts +96 -0
  820. package/src/utilities/appDirectoryTemplate/package.json +10 -0
  821. package/src/utilities/budibaseDir.ts +3 -0
  822. package/src/utilities/centralPath.ts +22 -0
  823. package/src/utilities/fileSystem/app.ts +79 -0
  824. package/src/utilities/fileSystem/clientLibrary.ts +154 -0
  825. package/src/utilities/fileSystem/filesystem.ts +168 -0
  826. package/src/utilities/fileSystem/index.ts +5 -0
  827. package/src/utilities/fileSystem/plugin.ts +73 -0
  828. package/src/utilities/fileSystem/processor.ts +19 -0
  829. package/src/utilities/fileSystem/template.ts +36 -0
  830. package/src/utilities/global.ts +153 -0
  831. package/src/utilities/index.ts +134 -0
  832. package/src/utilities/redis.ts +88 -0
  833. package/src/utilities/retry.ts +18 -0
  834. package/src/utilities/routing/index.ts +32 -0
  835. package/src/utilities/rowProcessor/index.ts +279 -0
  836. package/src/utilities/rowProcessor/map.ts +96 -0
  837. package/src/utilities/rowProcessor/tests/utils.spec.ts +57 -0
  838. package/src/utilities/rowProcessor/utils.ts +96 -0
  839. package/src/utilities/schema.ts +141 -0
  840. package/src/utilities/scriptRunner.ts +28 -0
  841. package/src/utilities/security.ts +65 -0
  842. package/{utilities/statusCodes.js → src/utilities/statusCodes.ts} +1 -1
  843. package/src/utilities/tests/test.csv +4 -0
  844. package/src/utilities/usageQuota/rows.ts +80 -0
  845. package/src/utilities/usageQuota/usageQuoteReset.ts +18 -0
  846. package/src/utilities/users.ts +49 -0
  847. package/src/utilities/workerRequests.ts +188 -0
  848. package/src/watch.ts +37 -0
  849. package/src/websockets/client.ts +11 -0
  850. package/src/websockets/grid.ts +55 -0
  851. package/src/websockets/index.ts +14 -0
  852. package/src/websockets/websocket.ts +83 -0
  853. package/tsconfig.build.json +28 -0
  854. package/tsconfig.json +22 -0
  855. package/app.js +0 -20
  856. package/appPackages/_master/access_levels.json +0 -175
  857. package/appPackages/_master/appDefinition.json +0 -527
  858. package/appPackages/_master/main.js +0 -125
  859. package/appPackages/_master/node_modules/.yarn-integrity +0 -20
  860. package/appPackages/_master/node_modules/@budibase/materialdesign-components/README.md +0 -33
  861. package/appPackages/_master/node_modules/@budibase/materialdesign-components/components.json +0 -249
  862. package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js +0 -11282
  863. package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js.map +0 -1
  864. package/appPackages/_master/node_modules/@budibase/materialdesign-components/package.json +0 -50
  865. package/appPackages/_master/node_modules/@budibase/standard-components/README.md +0 -33
  866. package/appPackages/_master/node_modules/@budibase/standard-components/components.json +0 -239
  867. package/appPackages/_master/node_modules/@budibase/standard-components/dist/generators.js +0 -198
  868. package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js +0 -3460
  869. package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js.map +0 -1
  870. package/appPackages/_master/node_modules/@budibase/standard-components/package.json +0 -38
  871. package/appPackages/_master/package-lock.json +0 -247
  872. package/appPackages/_master/package.json +0 -14
  873. package/appPackages/_master/pages/main/page.json +0 -199
  874. package/appPackages/_master/pages/main/screens/Apps List.json +0 -131
  875. package/appPackages/_master/pages/main/screens/Manage App.json +0 -292
  876. package/appPackages/_master/pages/main/screens/New App.json +0 -410
  877. package/appPackages/_master/pages/main/screens/New Instance.json +0 -227
  878. package/appPackages/_master/pages/unauthenticated/page.json +0 -83
  879. package/appPackages/_master/plugins.js +0 -3
  880. package/appPackages/_master/public/_shared/budibase-logo.png +0 -0
  881. package/appPackages/_master/public/main/budibase-client.js +0 -25115
  882. package/appPackages/_master/public/main/budibase-client.js.map +0 -1
  883. package/appPackages/_master/public/main/index.html +0 -48
  884. package/appPackages/_master/public/main/index.js +0 -3397
  885. package/appPackages/_master/public/main/index.js.map +0 -1
  886. package/appPackages/_master/public/unauthenticated/budibase-client.js +0 -25115
  887. package/appPackages/_master/public/unauthenticated/budibase-client.js.map +0 -1
  888. package/appPackages/_master/public/unauthenticated/index.html +0 -40
  889. package/appPackages/_master/public/unauthenticated/index.js +0 -3397
  890. package/appPackages/_master/public/unauthenticated/index.js.map +0 -1
  891. package/appPackages/_master/yarn.lock +0 -13
  892. package/builder/__app.html +0 -22
  893. package/builder/assets/budibase-emblem-white.svg +0 -29
  894. package/builder/assets/budibase-logo-only.png +0 -0
  895. package/builder/assets/budibase-logo-white.png +0 -0
  896. package/builder/assets/budibase-logo.png +0 -0
  897. package/builder/assets/javascript-logo.svg +0 -1
  898. package/builder/assets/roboto-v20-latin-ext_latin-300.woff +0 -0
  899. package/builder/assets/roboto-v20-latin-ext_latin-300.woff2 +0 -0
  900. package/builder/assets/roboto-v20-latin-ext_latin-500.woff +0 -0
  901. package/builder/assets/roboto-v20-latin-ext_latin-500.woff2 +0 -0
  902. package/builder/assets/roboto-v20-latin-ext_latin-700.woff +0 -0
  903. package/builder/assets/roboto-v20-latin-ext_latin-700.woff2 +0 -0
  904. package/builder/assets/roboto-v20-latin-ext_latin-900.woff +0 -0
  905. package/builder/assets/roboto-v20-latin-ext_latin-900.woff2 +0 -0
  906. package/builder/assets/roboto-v20-latin-ext_latin-regular.woff +0 -0
  907. package/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 +0 -0
  908. package/builder/budibase-client.esm.mjs +0 -24948
  909. package/builder/budibase.css +0 -120
  910. package/builder/bundle.css +0 -70
  911. package/builder/bundle.css.map +0 -146
  912. package/builder/bundle.js +0 -99294
  913. package/builder/bundle.js.map +0 -1
  914. package/builder/codemirror.css +0 -349
  915. package/builder/favicon.png +0 -0
  916. package/builder/flatpickr.css +0 -784
  917. package/builder/fonts.css +0 -47
  918. package/builder/global.css +0 -111
  919. package/builder/monokai.css +0 -41
  920. package/builder/uikit.min.css +0 -1
  921. package/config.contributors.js +0 -13
  922. package/config.dev.js +0 -13
  923. package/config.sample.js +0 -33
  924. package/index.js +0 -24
  925. package/initialise/buildAppContext.js +0 -11
  926. package/initialise/createInstanceDb.js +0 -37
  927. package/initialise/createMasterDb.js +0 -34
  928. package/initialise/initialiseBudibase.js +0 -1
  929. package/initialise/initialiseRuntimePackages.js +0 -42
  930. package/middleware/routeHandlers/aggregatesPost.js +0 -12
  931. package/middleware/routeHandlers/appDefault.js +0 -21
  932. package/middleware/routeHandlers/authenticate.js +0 -15
  933. package/middleware/routeHandlers/changeMyPassword.js +0 -9
  934. package/middleware/routeHandlers/createTemporaryAccess.js +0 -17
  935. package/middleware/routeHandlers/createUser.js +0 -10
  936. package/middleware/routeHandlers/deleteRecord.js +0 -9
  937. package/middleware/routeHandlers/disableUser.js +0 -11
  938. package/middleware/routeHandlers/enableUser.js +0 -6
  939. package/middleware/routeHandlers/executeAction.js +0 -9
  940. package/middleware/routeHandlers/getAccessLevels.js +0 -6
  941. package/middleware/routeHandlers/getRecord.js +0 -15
  942. package/middleware/routeHandlers/getUsers.js +0 -6
  943. package/middleware/routeHandlers/helpers.js +0 -15
  944. package/middleware/routeHandlers/index.js +0 -45
  945. package/middleware/routeHandlers/listRecordsGet.js +0 -8
  946. package/middleware/routeHandlers/listRecordsPost.js +0 -12
  947. package/middleware/routeHandlers/lookupField.js +0 -14
  948. package/middleware/routeHandlers/postFiles.js +0 -13
  949. package/middleware/routeHandlers/saveAppHierarchy.js +0 -6
  950. package/middleware/routeHandlers/saveRecord.js +0 -6
  951. package/middleware/routeHandlers/setPasswordFromTemporaryCode.js +0 -20
  952. package/middleware/routeHandlers/upgradeData.js +0 -11
  953. package/middleware/routers.js +0 -330
  954. package/middleware/session.js +0 -24
  955. package/utilities/budibaseApi.js +0 -84
  956. package/utilities/builder/buildPage.js +0 -164
  957. package/utilities/builder/componentLibraryInfo.js +0 -77
  958. package/utilities/builder/convertCssToFiles.js +0 -43
  959. package/utilities/builder/deleteCodeMeta.js +0 -9
  960. package/utilities/builder/getPages.js +0 -20
  961. package/utilities/builder/index.js +0 -165
  962. package/utilities/builder/index.template.html +0 -44
  963. package/utilities/builder/listScreens.js +0 -48
  964. package/utilities/builder/publicPath.js +0 -3
  965. package/utilities/builder/saveBackend.js +0 -28
  966. package/utilities/constructHierarchy.js +0 -8
  967. package/utilities/createAppPackage.js +0 -101
  968. package/utilities/databaseManager.js +0 -4
  969. package/utilities/datastore.js +0 -2
  970. package/utilities/exceptions.js +0 -16
  971. package/utilities/injectedPlugins/createUser.js +0 -19
  972. package/utilities/injectedPlugins/disableUser.js +0 -3
  973. package/utilities/injectedPlugins/enableUser.js +0 -3
  974. package/utilities/injectedPlugins/index.js +0 -76
  975. package/utilities/masterAppInternal.js +0 -384
  976. package/utilities/runtimePackages.js +0 -34
  977. package/utilities/targzAppPackage.js +0 -119
@@ -1,146 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "bundle.css",
4
- "sources": [
5
- "../../builder/App.svelte",
6
- "../../builder/PackageRoot.svelte",
7
- "../../builder/NoPackage.svelte",
8
- "../../builder/IconButton.svelte",
9
- "../../builder/AppNotification.svelte",
10
- "../../builder/BackendRoot.svelte",
11
- "../../builder/Button.svelte",
12
- "../../builder/UserInterfaceRoot.svelte",
13
- "../../builder/ComingSoon.svelte",
14
- "../../builder/BackendNav.svelte",
15
- "../../builder/SchemaManagementDrawer.svelte",
16
- "../../builder/DatabaseRoot.svelte",
17
- "../../builder/ActionsAndTriggersRoot.svelte",
18
- "../../builder/AccessLevelsRoot.svelte",
19
- "../../builder/Modal.svelte",
20
- "../../builder/ConfirmDialog.svelte",
21
- "../../builder/MasterLayout.svelte",
22
- "../../builder/ComponentsHierarchyChildren.svelte",
23
- "../../builder/ComponentsHierarchy.svelte",
24
- "../../builder/PagesList.svelte",
25
- "../../builder/NewScreen.svelte",
26
- "../../builder/CurrentItemPreview.svelte",
27
- "../../builder/ComponentsPaneSwitcher.svelte",
28
- "../../builder/PageView.svelte",
29
- "../../builder/SettingsView.svelte",
30
- "../../builder/Pencil.svelte",
31
- "../../builder/HierarchyRow.svelte",
32
- "../../builder/DatabasesList.svelte",
33
- "../../builder/NavItem.svelte",
34
- "../../builder/UsersList.svelte",
35
- "../../builder/DropdownButton.svelte",
36
- "../../builder/ModelView.svelte",
37
- "../../builder/ActionButton.svelte",
38
- "../../builder/IndexView.svelte",
39
- "../../builder/ButtonGroup.svelte",
40
- "../../builder/Triggers.svelte",
41
- "../../builder/Actions.svelte",
42
- "../../builder/AccessLevelView.svelte",
43
- "../../builder/Textbox.svelte",
44
- "../../builder/PropsView.svelte",
45
- "../../builder/ComponentPropertiesPanel.svelte",
46
- "../../builder/ComponentSelectionList.svelte",
47
- "../../builder/Select.svelte",
48
- "../../builder/CodeArea.svelte",
49
- "../../builder/FieldView.svelte",
50
- "../../builder/Checkbox.svelte",
51
- "../../builder/ActionView.svelte",
52
- "../../builder/StateBindingControl.svelte",
53
- "../../builder/PropControl.svelte",
54
- "../../builder/CodeEditor.svelte",
55
- "../../builder/LayoutEditor.svelte",
56
- "../../builder/PlusButton.svelte",
57
- "../../builder/ModelDataTable.svelte",
58
- "../../builder/DeleteRecord.svelte",
59
- "../../builder/CreateDatabase.svelte",
60
- "../../builder/CreateUser.svelte",
61
- "../../builder/CreateEditRecord.svelte",
62
- "../../builder/ValuesList.svelte",
63
- "../../builder/Input.svelte",
64
- "../../builder/LayoutTemplateControls.svelte",
65
- "../../builder/InputGroup.svelte",
66
- "../../builder/TablePagination.svelte",
67
- "../../builder/EventsEditor.svelte",
68
- "../../builder/PropertyCascader.svelte",
69
- "../../builder/HandlerSelector.svelte",
70
- "../../builder/EventEditorModal.svelte",
71
- "../../builder/StateBindingOptions.svelte",
72
- "../../builder/StateBindingCascader.svelte"
73
- ],
74
- "sourcesContent": [
75
- "<script>\n import NoPackage from \"./NoPackage.svelte\"\n import PackageRoot from \"./PackageRoot.svelte\"\n import Settings from \"./Settings.svelte\"\n import { store, initialise } from \"builderStore\"\n import { onMount } from \"svelte\"\n import IconButton from \"components/common/IconButton.svelte\"\n import Spinner from \"components/common/Spinner.svelte\"\n import AppNotification, {\n showAppNotification,\n } from \"components/common/AppNotification.svelte\"\n\n let init = initialise()\n\n function showErrorBanner() {\n showAppNotification({\n status: \"danger\",\n message:\n \"Whoops! Looks like we're having trouble. Please refresh the page.\",\n })\n }\n\n onMount(() => {\n window.addEventListener(\"error\", showErrorBanner)\n window.addEventListener(\"unhandledrejection\", showErrorBanner)\n })\n</script>\n\n<main>\n <AppNotification />\n {#await init}\n <div class=\"spinner-container\">\n <Spinner />\n </div>\n {:then result}\n\n {#if $store.hasAppPackage}\n <PackageRoot />\n {:else}\n <NoPackage />\n {/if}\n\n {:catch err}\n <h1 style=\"color:red\">{err}</h1>\n {/await}\n\n <!--\n <div class=\"settings\">\n <IconButton icon=\"settings\"\n on:click={store.showSettings}/>\n </div>\n\n\n {#if $store.useAnalytics}\n <iframe src=\"https://marblekirby.github.io/bb-analytics.html\" width=\"0\" height=\"0\" style=\"visibility:hidden;display:none\"/>\n {/if}\n -->\n</main>\n\n<style>\n main {\n height: 100%;\n width: 100%;\n font-family: \"Roboto\", Helvetica, Arial, sans-serif;\n }\n\n .settings {\n position: absolute;\n bottom: 25px;\n right: 25px;\n }\n\n .spinner-container {\n height: 100%;\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n</style>\n",
76
- "<script>\n import IconButton from \"components/common/IconButton.svelte\"\n import { store } from \"builderStore\"\n import UserInterfaceRoot from \"components/userInterface/UserInterfaceRoot.svelte\"\n import BackendRoot from \"./BackendRoot.svelte\"\n import { fade } from \"svelte/transition\"\n import { SettingsIcon, PreviewIcon } from \"components/common/Icons/\"\n\n const TABS = {\n BACKEND: \"backend\",\n FRONTEND: \"frontend\",\n }\n\n let selectedTab = TABS.BACKEND\n</script>\n\n<div class=\"root\">\n\n <div class=\"top-nav\">\n <div class=\"topleftnav\">\n <button class=\"home-logo\">\n <img src=\"/_builder/assets/budibase-emblem-white.svg\" />\n </button>\n <!-- <IconButton icon=\"home\"\n color=\"var(--slate)\"\n hoverColor=\"var(--secondary75)\"/> -->\n <span\n class:active={selectedTab === TABS.BACKEND}\n class=\"topnavitem\"\n on:click={() => (selectedTab = TABS.BACKEND)}>\n Backend\n </span>\n <span\n class:active={selectedTab === TABS.FRONTEND}\n class=\"topnavitem\"\n on:click={() => (selectedTab = TABS.FRONTEND)}>\n Frontend\n </span>\n </div>\n\n <div class=\"toprightnav\">\n <span\n class:active={selectedTab === TABS.FRONTEND}\n class=\"topnavitemright\"\n on:click={() => selectedTab === TABS.FRONTEND}>\n <SettingsIcon />\n </span>\n <span\n class:active={selectedTab === TABS.FRONTEND}\n class=\"topnavitemright\"\n on:click={() => selectedTab === TABS.FRONTEND}>\n <PreviewIcon />\n </span>\n </div>\n </div>\n\n <div class=\"content\">\n {#if selectedTab === TABS.BACKEND}\n <div in:fade out:fade>\n <BackendRoot />\n </div>\n {:else}\n <div in:fade out:fade>\n <UserInterfaceRoot />\n </div>\n {/if}\n </div>\n\n</div>\n\n<style>\n .root {\n height: 100%;\n width: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .top-nav {\n flex: 0 0 auto;\n height: 48px;\n background: #0d203b;\n padding: 0px 20px 0 20px;\n display: flex;\n box-sizing: border-box;\n justify-content: space-between;\n align-items: center;\n }\n\n .content {\n flex: 1 1 auto;\n width: 100%;\n height: 100px;\n overflow: hidden;\n }\n\n .content > div {\n height: 100%;\n width: 100%;\n }\n\n .toprightnav {\n display: flex;\n }\n\n .topleftnav {\n display: flex;\n align-items: center;\n }\n\n .topnavitem {\n cursor: pointer;\n color: rgb(255, 255, 255, 0.6);\n margin: 0px 10px;\n padding-top: 4px;\n font-weight: 500;\n font-size: 1rem;\n height: 100%;\n align-items: center;\n box-sizing: border-box;\n }\n\n .topnavitem:hover {\n color: rgb(255, 255, 255, 0.8);\n font-weight: 500;\n }\n\n .active {\n color: white;\n font-weight: 600;\n }\n\n .topnavitemright {\n cursor: pointer;\n color: rgb(255, 255, 255, 0.6);\n margin: 0px 5px;\n padding-top: 4px;\n font-weight: 500;\n font-size: 1rem;\n height: 100%;\n display: flex;\n flex: 1;\n align-items: center;\n box-sizing: border-box;\n }\n\n .topnavitemright:hover {\n color: rgb(255, 255, 255, 0.8);\n font-weight: 500;\n }\n\n .home-logo {\n border-style: none;\n background-color: rgba(0, 0, 0, 0);\n cursor: pointer;\n outline: none;\n height: 40px;\n padding: 8px 10px 8px 0;\n }\n\n .home-logo:hover {\n color: var(--hovercolor);\n }\n\n .home-logo:active {\n outline: none;\n }\n\n .home-logo img {\n height: 100%;\n }\n</style>\n",
77
- "<script>\n import Button from \"components/common/Button.svelte\"\n import { store } from \"builderStore\"\n\n let errors = []\n</script>\n\n<div class=\"root\">\n <div class=\"inner\">\n <img\n src=\"/_builder/assets/budibase-logo.png\"\n class=\"logo\"\n alt=\"budibase logo\" />\n <div>\n\n <div>\n <h4 style=\"margin-bottom: 20px\">Choose an Application</h4>\n {#each $store.apps as app}\n <a href={`#${app}`} class=\"app-link\">{app}</a>\n {/each}\n </div>\n </div>\n </div>\n</div>\n\n<style>\n .root {\n position: fixed;\n margin: 0 auto;\n text-align: center;\n top: 20%;\n /*color: #333333;\n background-color: #fdfdfd;*/\n width: 100%;\n }\n\n .inner {\n display: inline-block;\n margin: auto;\n }\n\n .logo {\n width: 300px;\n margin-bottom: 40px;\n }\n\n .root :global(.option) {\n width: 250px;\n }\n\n .app-link {\n margin-top: 10px;\n display: block;\n }\n</style>\n",
78
- "<script>\n import getIcon from \"./icon\"\n\n export let size = 18\n export let icon = \"\"\n export let style = \"\"\n export let color = \"var(--secondary100)\"\n export let hoverColor = \"var(--secondary75)\"\n export let attributes = {}\n\n let currentAttributes = []\n const addAttributes = (node, attributes) => {\n const add = _attributes => {\n const attrs = []\n for (let attr in _attributes) {\n node.setAttribute(attr, _attributes[attr])\n attrs.push(\"uk-toggle\")\n }\n currentAttributes = attrs\n }\n\n add(attributes)\n\n return {\n // should implement update method\n update(attributes) {\n for (let attr of currentAttributes) {\n node.removeAttribute(attr)\n }\n add(attributes)\n },\n destroy() {},\n }\n }\n</script>\n\n<button\n style=\"{style}{style ? ';' : ''} color:{color}; --hovercolor:{hoverColor}\"\n on:click\n use:addAttributes={attributes}>\n {@html getIcon(icon, size)}\n</button>\n\n<style>\n button {\n border-style: none;\n background-color: rgba(0, 0, 0, 0);\n cursor: pointer;\n outline: none;\n }\n\n button:hover {\n color: var(--hovercolor);\n }\n\n button:active {\n outline: none;\n }\n</style>\n",
79
- "<script context=\"module\">\n import UIKit from \"uikit\"\n\n export function showAppNotification({ message, status }) {\n UIKit.notification({\n message: `\n <div class=\"message-container\">\n <i class=\"ri-information-fill information-icon\"></i> \n <span class=\"notification-message\"> \n ${message}\n </span>\n <button class=\"hoverable refresh-page-button\" onclick=\"window.location.reload()\">Refresh Page</button>\n </div>\n `,\n status,\n timeout: 100000\n })\n }\n</script>\n\n<style>\n :global(.information-icon) {\n font-size: 24px;\n }\n\n :global(.uk-nofi) {\n display: grid;\n grid-template-columns: 40px 1fr auto;\n grid-gap: 5px;\n align-items: center;\n }\n\n :global(.message-container) {\n display: grid;\n grid-template-columns: 40px 1fr auto;\n grid-gap: 5px;\n align-items: center;\n }\n\n :global(.uk-notification) {\n width: 50% !important;\n left: 0 !important;\n right: 0 !important;\n margin-right: auto !important;\n margin-left: auto !important;\n border-radius: 10px;\n box-shadow: 0px 3px 6px #00000029;\n }\n\n :global(.uk-notification-message) {\n border-radius: 5px;\n }\n\n :global(.uk-notification-message:hover .uk-notification-close) {\n visibility: hidden;\n }\n\n :global(.uk-notification-message-danger) {\n background: #f2545b !important;\n color: #fff !important;\n font-family: Roboto;\n font-size: 14px !important;\n }\n\n :global(.refresh-page-button) {\n font-size: 12px;\n font-weight: 600;\n border-radius: 5px;\n border: none;\n padding: 5px;\n width: 91px;\n height: 28px;\n color: #f2545b;\n background: #ffffff;\n }\n</style>\n",
80
- "<script>\n import BackendNav from \"components/nav/BackendNav.svelte\"\n import SchemaManagementDrawer from \"components/nav/SchemaManagementDrawer.svelte\"\n import Database from \"components/database/DatabaseRoot.svelte\"\n import UserInterface from \"components/userInterface/UserInterfaceRoot.svelte\"\n import ActionsAndTriggers from \"components/actionsAndTriggers/ActionsAndTriggersRoot.svelte\"\n import AccessLevels from \"components/accessLevels/AccessLevelsRoot.svelte\"\n import ComingSoon from \"components/common/ComingSoon.svelte\"\n\n import { store, backendUiStore } from \"builderStore\"\n</script>\n\n<div class=\"root\">\n <div class=\"nav\">\n <BackendNav />\n </div>\n <div class=\"content\">\n {#if $backendUiStore.leftNavItem === 'DATABASE'}\n <Database />\n {:else if $backendUiStore.leftNavItem === 'ACTIONS'}\n <ActionsAndTriggers />\n {:else if $backendUiStore.leftNavItem === 'ACCESS_LEVELS'}\n <AccessLevels />\n {/if}\n </div>\n <div class=\"nav\">\n <SchemaManagementDrawer />\n </div>\n</div>\n\n<style>\n .root {\n height: 100%;\n display: flex;\n background: #fafafa;\n }\n\n .content {\n flex: 1 1 auto;\n margin: 80px 60px;\n }\n\n .nav {\n overflow: auto;\n flex: 0 1 auto;\n width: 300px;\n height: 100%;\n }\n</style>\n",
81
- "<script>\n export let color = \"primary\"\n export let className = \"\"\n export let style = \"\"\n export let groupPosition = \"\"\n export let grouped = false\n\n $: borderClass = grouped ? \"\" : \"border-normal\"\n</script>\n\n<button\n class=\"{color}\n {className}\n {borderClass}\n {grouped ? 'grouped' : ''}\"\n {style}\n on:click>\n <slot />\n</button>\n\n<style>\n .border-normal {\n border-radius: var(--borderradiusall);\n }\n .border-left {\n border-radius: var(--borderradius) 0 0 var(--borderradius);\n }\n .border-right {\n border-radius: 0 var(--borderradius) var(--borderradius) 0;\n }\n .border-middle {\n border-radius: 0;\n }\n\n button {\n border-style: solid;\n padding: 7.5px 15px;\n cursor: pointer;\n margin: 5px;\n border-radius: 5px;\n }\n\n /* ---- PRIMARY ----*/\n .primary {\n background-color: var(--primary100);\n border-color: var(--primary100);\n color: var(--white);\n }\n\n .primary:hover {\n background-color: var(--primary75);\n border-color: var(--primary75);\n }\n\n .primary:active {\n background-color: var(--primarydark);\n border-color: var(--primarydark);\n }\n\n .primary-outline {\n background-color: var(--white);\n border-color: var(--primary100);\n color: var(--primary100);\n }\n\n .primary-outline:hover {\n background-color: var(--primary10);\n }\n\n .primary-outline:pressed {\n background-color: var(--primary25);\n }\n\n /* ---- secondary ----*/\n\n .secondary {\n background-color: var(--secondary100);\n border-color: var(--secondary100);\n color: var(--white);\n }\n\n .secondary:hover {\n background-color: var(--secondary75);\n border-color: var(--secondary75);\n }\n\n .secondary:pressed {\n background-color: var(--secondarydark);\n border-color: var(--secondarydark);\n }\n\n .secondary-outline {\n background-color: var(--white);\n border-color: var(--secondary100);\n color: var(--secondary100);\n }\n\n .secondary-outline:hover {\n background-color: var(--secondary10);\n }\n\n .secondary-outline:pressed {\n background-color: var(--secondary25);\n }\n\n /* ---- success ----*/\n .success {\n background-color: var(--success100);\n border-color: var(--success100);\n color: var(--white);\n }\n\n .success:hover {\n background-color: var(--success75);\n border-color: var(--success75);\n }\n\n .success:pressed {\n background-color: var(--successdark);\n border-color: var(--successdark);\n }\n\n .success-outline {\n background-color: var(--white);\n border-color: var(--success100);\n color: var(--success100);\n }\n\n .success-outline:hover {\n background-color: var(--success10);\n }\n\n .success-outline:pressed {\n background-color: var(--success25);\n }\n\n /* ---- deletion ----*/\n .deletion {\n background-color: var(--deletion100);\n border-color: var(--deletion100);\n color: var(--white);\n }\n\n .deletion:hover {\n background-color: var(--deletion75);\n border-color: var(--deletion75);\n }\n\n .deletion:pressed {\n background-color: var(--deletiondark);\n border-color: var(--deletiondark);\n }\n\n .deletion-outline {\n background-color: var(--white);\n border-color: var(--deletion100);\n color: var(--deletion100);\n }\n\n .deletion-outline:hover {\n background-color: var(--deletion10);\n }\n\n .deletion-outline:pressed {\n background-color: var(--deletion25);\n }\n</style>\n",
82
- "<script>\n import ComponentsHierarchy from \"./ComponentsHierarchy.svelte\"\n import ComponentsHierarchyChildren from \"./ComponentsHierarchyChildren.svelte\"\n import MasterLayout from \"./MasterLayout.svelte\"\n import PagesList from \"./PagesList.svelte\"\n import { store } from \"builderStore\"\n import IconButton from \"components/common/IconButton.svelte\"\n import Modal from \"components/common/Modal.svelte\"\n import NewScreen from \"./NewScreen.svelte\"\n import CurrentItemPreview from \"./CurrentItemPreview.svelte\"\n import SettingsView from \"./SettingsView.svelte\"\n import PageView from \"./PageView.svelte\"\n import ComponentsPaneSwitcher from \"./ComponentsPaneSwitcher.svelte\"\n import ConfirmDialog from \"components/common/ConfirmDialog.svelte\"\n import { last } from \"lodash/fp\"\n import { AddIcon } from \"components/common/Icons\"\n\n let newScreenPicker\n let confirmDeleteDialog\n let componentToDelete = \"\"\n\n const newScreen = () => {\n newScreenPicker.show()\n }\n\n let settingsView\n const settings = () => {\n settingsView.show()\n }\n\n const confirmDeleteComponent = component => {\n componentToDelete = component\n confirmDeleteDialog.show()\n }\n\n const lastPartOfName = c => (c ? last(c.split(\"/\")) : \"\")\n</script>\n\n<div class=\"root\">\n\n <div class=\"ui-nav\">\n\n <div class=\"pages-list-container\">\n <div class=\"nav-header\">\n <span class=\"navigator-title\">Navigator</span>\n <div class=\"border-line\" />\n\n <span class=\"components-nav-page\">Pages</span>\n </div>\n\n <div class=\"nav-items-container\">\n <PagesList />\n </div>\n </div>\n\n <div class=\"border-line\" />\n\n <div class=\"components-list-container\">\n <div class=\"nav-group-header\">\n <span class=\"components-nav-header\" style=\"margin-top: 0;\">\n Screens\n </span>\n <div>\n <button on:click={newScreen}>\n <AddIcon />\n </button>\n </div>\n </div>\n <div class=\"nav-items-container\">\n <MasterLayout layout={$store.pages[$store.currentPageName]} />\n <ComponentsHierarchy screens={$store.screens} />\n </div>\n </div>\n\n </div>\n\n <div class=\"preview-pane\">\n <CurrentItemPreview />\n </div>\n\n {#if $store.currentFrontEndType === 'screen' || $store.currentFrontEndType === 'page'}\n <div class=\"components-pane\">\n <ComponentsPaneSwitcher />\n </div>\n {/if}\n\n</div>\n\n<NewScreen bind:this={newScreenPicker} />\n<SettingsView bind:this={settingsView} />\n\n<ConfirmDialog\n bind:this={confirmDeleteDialog}\n title=\"Confirm Delete\"\n body={`Are you sure you wish to delete this '${lastPartOfName(componentToDelete)}' component`}\n okText=\"Delete Component\"\n onOk={() => store.deleteComponent(componentToDelete)} />\n\n<style>\n button {\n cursor: pointer;\n outline: none;\n border: none;\n border-radius: 5px;\n width: 20px;\n padding-bottom: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0;\n }\n\n .root {\n display: grid;\n grid-template-columns: 275px 1fr 275px;\n height: 100%;\n width: 100%;\n background: #fafafa;\n }\n\n @media only screen and (min-width: 1800px) {\n .root {\n display: grid;\n grid-template-columns: 300px 1fr 300px;\n height: 100%;\n width: 100%;\n background: #fafafa;\n }\n }\n\n .ui-nav {\n grid-column: 1;\n background-color: var(--white);\n height: calc(100vh - 49px);\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .preview-pane {\n grid-column: 2;\n margin: 40px;\n background: #fff;\n border-radius: 5px;\n box-shadow: 0 0px 6px rgba(0, 0, 0, 0.05);\n }\n\n .components-pane {\n grid-column: 3;\n background-color: var(--white);\n min-height: 0px;\n overflow-y: hidden;\n }\n\n .components-nav-page {\n font-size: 12px;\n color: #000333;\n text-transform: uppercase;\n padding-left: 20px;\n margin-top: 20px;\n font-weight: 600;\n opacity: 0.4;\n letter-spacing: 1px;\n }\n\n .components-nav-header {\n font-size: 12px;\n color: #000333;\n text-transform: uppercase;\n margin-top: 20px;\n font-weight: 600;\n opacity: 0.4;\n letter-spacing: 1px;\n }\n\n .nav-header {\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n }\n\n .nav-items-container {\n padding: 1rem 0rem 0rem 0rem;\n }\n\n .nav-group-header {\n display: flex;\n padding: 0px 20px 0px 20px;\n font-size: 0.9rem;\n font-weight: bold;\n justify-content: space-between;\n align-items: center;\n }\n\n .nav-group-header > div:nth-child(1) {\n padding: 0rem 0.5rem 0rem 0rem;\n vertical-align: bottom;\n grid-column-start: icon;\n margin-right: 5px;\n }\n\n .nav-group-header > span:nth-child(3) {\n margin-left: 5px;\n vertical-align: bottom;\n grid-column-start: title;\n margin-top: auto;\n }\n\n .nav-group-header > div:nth-child(3) {\n vertical-align: bottom;\n grid-column-start: button;\n cursor: pointer;\n color: var(--primary75);\n }\n\n .nav-group-header > div:nth-child(3):hover {\n color: var(--primary75);\n }\n\n .navigator-title {\n font-size: 14px;\n color: var(--secondary100);\n font-weight: 600;\n text-transform: uppercase;\n padding: 0 20px 20px 20px;\n line-height: 1rem !important;\n letter-spacing: 1px;\n }\n\n .border-line {\n border-bottom: 1px solid #d8d8d8;\n }\n\n .components-list-container {\n overflow: auto;\n padding: 20px 0px 0 0;\n }\n</style>\n",
83
- "<script>\n export let name = \"\"\n</script>\n\n<div>\n <h4>Coming Sometime: {name}</h4>\n</div>\n\n<style>\n h4 {\n margin-top: 20px;\n }\n</style>\n",
84
- "<script>\n import { getContext } from \"svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import HierarchyRow from \"./HierarchyRow.svelte\"\n import DatabasesList from \"./DatabasesList.svelte\"\n import UsersList from \"./UsersList.svelte\"\n import NavItem from \"./NavItem.svelte\"\n import getIcon from \"components/common/icon\"\n</script>\n\n<div class=\"items-root\">\n <div class=\"hierarchy\">\n <div class=\"components-list-container\">\n <div class=\"nav-group-header\">\n <div class=\"hierarchy-title\">Databases</div>\n <i\n class=\"ri-add-line hoverable\"\n on:click={() => backendUiStore.actions.modals.show('DATABASE')} />\n </div>\n </div>\n\n <div class=\"hierarchy-items-container\">\n <DatabasesList />\n </div>\n </div>\n <hr />\n {#if $backendUiStore.selectedDatabase.id}\n <div class=\"hierarchy\">\n <div class=\"components-list-container\">\n <div class=\"nav-group-header\">\n <div class=\"hierarchy-title\">Users</div>\n <i\n class=\"ri-add-line hoverable\"\n on:click={() => backendUiStore.actions.modals.show('USER')} />\n </div>\n </div>\n\n <div class=\"hierarchy-items-container\">\n <UsersList />\n </div>\n\n </div>\n {/if}\n <NavItem name=\"ACCESS_LEVELS\" label=\"User Levels\" />\n</div>\n\n<style>\n .items-root {\n display: flex;\n flex-direction: column;\n max-height: 100%;\n height: 100%;\n background-color: var(--white);\n }\n\n .nav-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 2rem 1rem 1rem 1rem;\n }\n\n .hierarchy-title {\n text-transform: uppercase;\n font-size: 0.85em;\n }\n\n .hierarchy {\n display: flex;\n flex-direction: column;\n }\n\n .hierarchy-items-container {\n flex: 1 1 auto;\n overflow-y: auto;\n }\n</style>\n",
85
- "<script>\n import { store, backendUiStore } from \"builderStore\"\n import HierarchyRow from \"./HierarchyRow.svelte\"\n import DropdownButton from \"components/common/DropdownButton.svelte\"\n import NavItem from \"./NavItem.svelte\"\n import getIcon from \"components/common/icon\"\n\n function newModel() {\n if ($store.currentNode) {\n store.newChildRecord()\n } else {\n store.newRootRecord()\n }\n backendUiStore.actions.modals.show(\"MODEL\")\n }\n\n function newView() {\n store.newRootIndex()\n backendUiStore.actions.modals.show(\"VIEW\")\n }\n</script>\n\n<div class=\"items-root\">\n <div class=\"hierarchy\">\n <div class=\"components-list-container\">\n <div class=\"nav-group-header\">\n <div class=\"hierarchy-title\">Schema</div>\n <div class=\"uk-inline\">\n <i class=\"ri-add-line hoverable\" />\n <div uk-dropdown=\"mode: click;\">\n <ul class=\"uk-nav uk-dropdown-nav\">\n <li class=\"hoverable\" on:click={newModel}>Model</li>\n <li class=\"hoverable\" on:click={newView}>View</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hierarchy-items-container\">\n {#each $store.hierarchy.children as record}\n <HierarchyRow node={record} type=\"record\" />\n {/each}\n\n {#each $store.hierarchy.indexes as index}\n <HierarchyRow node={index} type=\"index\" />\n {/each}\n </div>\n </div>\n</div>\n\n<style>\n .items-root {\n display: flex;\n flex-direction: column;\n max-height: 100%;\n height: 100%;\n background-color: var(--secondary5);\n }\n\n .nav-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 2rem 1rem 1rem 1rem;\n }\n\n .hierarchy-title {\n align-items: center;\n text-transform: uppercase;\n font-size: 0.85em;\n }\n\n .hierarchy {\n display: flex;\n flex-direction: column;\n }\n\n .hierarchy-items-container {\n flex: 1 1 auto;\n overflow-y: auto;\n }\n</style>\n",
86
- "<script>\n import ModelView from \"./ModelView.svelte\"\n import IndexView from \"./IndexView.svelte\"\n import ModelDataTable from \"./ModelDataTable\"\n import { store, backendUiStore } from \"builderStore\"\n import getIcon from \"components/common/icon\"\n import DropdownButton from \"components/common/DropdownButton.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import Modal from \"components/common/Modal.svelte\"\n import * as api from \"./ModelDataTable/api\"\n import {\n CreateEditRecordModal,\n CreateEditModelModal,\n CreateEditViewModal,\n CreateDatabaseModal,\n DeleteRecordModal,\n CreateUserModal,\n } from \"./ModelDataTable/modals\"\n\n let selectedRecord\n\n async function selectRecord(record) {\n selectedRecord = await api.loadRecord(record.key, {\n appname: $store.appname,\n instanceId: $backendUiStore.selectedDatabase.id,\n })\n }\n\n function onClosed() {\n backendUiStore.actions.modals.hide()\n }\n\n $: recordOpen = $backendUiStore.visibleModal === \"RECORD\"\n $: modelOpen = $backendUiStore.visibleModal === \"MODEL\"\n $: viewOpen = $backendUiStore.visibleModal === \"VIEW\"\n $: databaseOpen = $backendUiStore.visibleModal === \"DATABASE\"\n $: deleteRecordOpen = $backendUiStore.visibleModal === \"DELETE_RECORD\"\n $: userOpen = $backendUiStore.visibleModal === \"USER\"\n $: breadcrumbs = $backendUiStore.breadcrumbs.join(\" / \")\n</script>\n\n<Modal isOpen={!!$backendUiStore.visibleModal} {onClosed}>\n {#if recordOpen}\n <CreateEditRecordModal record={selectedRecord} {onClosed} />\n {/if}\n {#if modelOpen}\n <CreateEditModelModal {onClosed} />\n {/if}\n {#if viewOpen}\n <CreateEditViewModal {onClosed} />\n {/if}\n {#if databaseOpen}\n <CreateDatabaseModal {onClosed} />\n {/if}\n {#if deleteRecordOpen}\n <DeleteRecordModal record={selectedRecord} {onClosed} />\n {/if}\n {#if userOpen}\n <CreateUserModal {onClosed} />\n {/if}\n</Modal>\n\n<div class=\"root\">\n <div class=\"node-view\">\n <div class=\"database-actions\">\n <div class=\"budibase__label--big\">{breadcrumbs}</div>\n {#if $backendUiStore.selectedDatabase.id}\n <ActionButton\n primary\n on:click={() => {\n selectedRecord = null\n backendUiStore.actions.modals.show('RECORD')\n }}>\n Create new record\n </ActionButton>\n {/if}\n </div>\n {#if $backendUiStore.selectedDatabase.id}\n <ModelDataTable {selectRecord} />\n {:else}Please select a database{/if}\n </div>\n</div>\n\n<style>\n .root {\n height: 100%;\n position: relative;\n }\n\n .node-view {\n overflow-y: auto;\n flex: 1 1 auto;\n }\n\n .database-actions {\n display: flex;\n justify-content: space-between;\n }\n</style>\n",
87
- "<script>\n import getIcon from \"components/common/icon\"\n import { store } from \"builderStore\"\n import Button from \"components/common/Button.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import ButtonGroup from \"components/common/ButtonGroup.svelte\"\n import Actions from \"./Actions.svelte\"\n import Triggers from \"./Triggers.svelte\"\n import { getNewAction, getNewTrigger } from \"components/common/core\"\n\n let editingAction = null\n let editingActionIsNew = true\n let editingTrigger = null\n let editingTriggerIsNew = true\n\n let getDefaultOptionsHtml = defaultOptions =>\n pipe(\n defaultOptions,\n [\n keys,\n map(\n k =>\n `<span style=\"color:var(--slate)\">${k}: </span>${JSON.parse(\n typeOptions[k]\n )}`\n ),\n join(\"<br>\"),\n ]\n )\n\n let onActionEdit = action => {\n editingAction = action\n editingActionIsNew = false\n }\n\n let newAction = () => {\n editingAction = getNewAction()\n editingActionIsNew = true\n }\n\n let onActionDelete = action => {\n store.deleteAction(action)\n }\n\n let deleteTrigger = () => {}\n\n let editTrigger = trigger => {\n editingTrigger = trigger\n editingTriggerIsNew = false\n }\n\n let newTrigger = () => {\n editingTrigger = getNewTrigger()\n editingTriggerIsNew = true\n }\n\n let onActionSave = action => {\n store.saveAction(action, editingActionIsNew, editingAction)\n\n editingAction = null\n }\n\n let onActionCancel = () => {\n editingAction = null\n }\n\n let onTriggerSave = trigger => {\n store.saveTrigger(trigger, editingTriggerIsNew, editingTrigger)\n\n editingTrigger = null\n }\n\n let onTriggerCancel = () => {\n editingTrigger = null\n }\n\n let onTriggerEdit = trigger => {\n editingTrigger = trigger\n editingTriggerIsNew = false\n }\n\n let onTriggerDelete = trigger => {\n store.deleteTrigger(trigger)\n }\n</script>\n\n<div class=\"root\">\n <div class=\"actions-header\">\n <ButtonGroup>\n <ActionButton color=\"secondary\" grouped on:click={newAction}>\n Create New Action\n </ActionButton>\n <ActionButton color=\"tertiary\" grouped on:click={newTrigger}>\n Create New Trigger\n </ActionButton>\n </ButtonGroup>\n </div>\n\n <div class=\"node-view\">\n <Actions\n {editingActionIsNew}\n {editingAction}\n {onActionEdit}\n {onActionDelete}\n {onActionSave}\n {onActionCancel} />\n\n <Triggers\n {editingTriggerIsNew}\n {editingTrigger}\n {onTriggerEdit}\n {onTriggerDelete}\n {onTriggerSave}\n {onTriggerCancel} />\n </div>\n\n</div>\n\n<style>\n .root {\n height: 100%;\n position: relative;\n padding: 1.5rem;\n }\n\n .actions-header {\n flex: 0 1 auto;\n margin-bottom: 10px;\n }\n\n .node-view {\n overflow-y: auto;\n flex: 1 1 auto;\n }\n</style>\n",
88
- "<script>\n import ButtonGroup from \"components/common/ButtonGroup.svelte\"\n import Button from \"components/common/Button.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import {\n generateFullPermissions,\n getNewAccessLevel,\n } from \"components/common/core\"\n import getIcon from \"components/common/icon\"\n import AccessLevelView from \"./AccessLevelView.svelte\"\n import Modal from \"components/common/Modal.svelte\"\n\n let editingLevel = null\n let editingLevelIsNew = false\n $: {\n if (editingLevel !== null) {\n backendUiStore.actions.modals.show(\"ACCESS_LEVELS\")\n }\n }\n $: modalOpen = $backendUiStore.visibleModal === \"ACCESS_LEVELS\"\n\n let allPermissions = []\n store.subscribe(db => {\n allPermissions = generateFullPermissions(db.hierarchy, db.actions)\n })\n\n let onLevelEdit = level => {\n editingLevel = level\n editingLevelIsNew = false\n }\n\n let onLevelCancel = () => {\n editingAction = null\n }\n\n let onLevelDelete = level => {\n store.deleteLevel(level)\n }\n\n let createNewLevel = () => {\n editingLevelIsNew = true\n editingLevel = getNewAccessLevel()\n }\n\n let onEditingFinished = level => {\n if (level) {\n store.saveLevel(level, editingLevelIsNew, editingLevel)\n }\n editingLevel = null\n backendUiStore.actions.modals.hide()\n }\n\n const getPermissionsString = perms => {\n return `${perms.length} / ${allPermissions.length}`\n }\n</script>\n\n<div class=\"root\">\n <ButtonGroup>\n <ActionButton primary on:click={createNewLevel}>\n Create New Access Level\n </ActionButton>\n </ButtonGroup>\n\n {#if $store.accessLevels}\n <table class=\"fields-table uk-table uk-table-small\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Permissions</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {#each $store.accessLevels.levels as level}\n <tr>\n <td>{level.name}</td>\n <td>{getPermissionsString(level.permissions)}</td>\n <td class=\"edit-button\">\n <span on:click={() => onLevelEdit(level)}>\n {@html getIcon('edit')}\n </span>\n <span on:click={() => onLevelDelete(level)}>\n {@html getIcon('trash')}\n </span>\n </td>\n </tr>\n {/each}\n </tbody>\n </table>\n {:else}(no actions added){/if}\n\n <Modal\n onClosed={backendUiStore.actions.modals.hide}\n bind:isOpen={modalOpen}\n title={modalOpen ? 'Edit Access Level' : 'Create Access Level'}>\n <AccessLevelView\n level={editingLevel}\n {allPermissions}\n onFinished={onEditingFinished}\n isNew={editingLevelIsNew}\n allLevels={$store.accessLevels.levels}\n hierarchy={$store.hierarchy}\n actions={$store.actions} />\n </Modal>\n\n</div>\n\n<style>\n .root {\n height: 100%;\n position: relative;\n padding: 1.5rem;\n }\n</style>\n",
89
- "<script>\r\n import UIkit from \"uikit\"\r\n import ActionButton from \"../common/ActionButton.svelte\"\r\n\r\n export let isOpen = false\r\n export let onClosed\r\n export let id = \"\"\r\n export let title\r\n\r\n let ukModal\r\n let listenerAdded = false\r\n\r\n $: {\r\n if (ukModal && !listenerAdded) {\r\n listenerAdded = true\r\n ukModal.addEventListener(\"hidden\", onClosed)\r\n }\r\n\r\n if (ukModal) {\r\n if (isOpen) {\r\n UIkit.modal(ukModal).show()\r\n } else {\r\n UIkit.modal(ukModal).hide()\r\n }\r\n }\r\n }\r\n</script>\r\n\r\n<div bind:this={ukModal} uk-modal {id}>\r\n {#if isOpen}\r\n <div class=\"uk-modal-dialog\" uk-overflow-auto>\r\n {#if title}\r\n <div class=\"uk-modal-header\">\r\n <h4 class=\"budibase__title--4\">{title}</h4>\r\n </div>\r\n {/if}\r\n <div class=\"uk-modal-body\">\r\n {#if onClosed}\r\n <button class=\"uk-modal-close-default\" type=\"button\" uk-close />\r\n {/if}\r\n <slot />\r\n </div>\r\n <div class=\"uk-modal-footer\">\r\n <slot name=\"footer\" />\r\n </div>\r\n </div>\r\n {/if}\r\n</div>\r\n\r\n<style>\r\n .uk-modal-dialog {\r\n border-radius: 0.3rem;\r\n width: 60%;\r\n height: 80vh;\r\n display: flex;\r\n flex-direction: column;\r\n padding: 0;\r\n }\r\n</style>\r\n",
90
- "<script>\n import Button from \"./Button.svelte\"\n import ActionButton from \"./ActionButton.svelte\"\n import ButtonGroup from \"./ButtonGroup.svelte\"\n import UIkit from \"uikit\"\n\n export let title = \"\"\n export let body = \"\"\n export let okText = \"OK\"\n export let cancelText = \"Cancel\"\n export let onOk = () => {}\n export let onCancel = () => {}\n\n export const show = () => {\n uiKitModal.hide()\n uiKitModal.show()\n }\n\n export const hide = () => {\n uiKitModal.hide()\n }\n\n let theModal\n $: uiKitModal = theModal && UIkit.modal(theModal)\n\n const cancel = () => {\n hide()\n onCancel()\n }\n\n const ok = () => {\n hide()\n onOk()\n }\n</script>\n\n<div id={title} uk-modal bind:this={theModal}>\n <div class=\"uk-modal-dialog\">\n <button class=\"uk-modal-close-default\" type=\"button\" uk-close />\n <div class=\"uk-modal-header\">\n <h4 class=\"budibase__title--4\">{title}</h4>\n </div>\n <div class=\"uk-modal-body\">\n <slot class=\"rows\">{body}</slot>\n </div>\n <div class=\"uk-modal-footer\">\n <ButtonGroup>\n <ActionButton cancel on:click={cancel}>{cancelText}</ActionButton>\n <ActionButton primary on:click={ok}>{okText}</ActionButton>\n </ButtonGroup>\n </div>\n </div>\n</div>\n\n<style>\n .uk-modal-footer {\n background: var(--lightslate);\n }\n\n .uk-modal-dialog {\n width: 400px;\n border-radius: 5px;\n }\n</style>\n",
91
- "<script>\n // import { tick } from \"svelte\"\n import ComponentsHierarchyChildren from \"./ComponentsHierarchyChildren.svelte\"\n\n import { last, sortBy, map, trimCharsStart, trimChars, join } from \"lodash/fp\"\n import ConfirmDialog from \"components/common/ConfirmDialog.svelte\"\n import { pipe } from \"components/common/core\"\n import { store } from \"builderStore\"\n import { ArrowDownIcon, GridIcon } from \"components/common/Icons/\"\n\n export let layout\n\n let confirmDeleteDialog\n let componentToDelete = \"\"\n\n const joinPath = join(\"/\")\n\n const normalizedName = name =>\n pipe(\n name,\n [\n trimCharsStart(\"./\"),\n trimCharsStart(\"~/\"),\n trimCharsStart(\"../\"),\n trimChars(\" \"),\n ]\n )\n\n const lastPartOfName = c =>\n c && last(c.name ? c.name.split(\"/\") : c._component.split(\"/\"))\n\n const isComponentSelected = (current, comp) => current === comp\n\n const isFolderSelected = (current, folder) => isInSubfolder(current, folder)\n\n $: _layout = pipe(\n layout,\n [c => ({ component: c, title: lastPartOfName(c) })]\n )\n\n const isScreenSelected = component =>\n component.component &&\n $store.currentPreviewItem &&\n component.component.name === $store.currentPreviewItem.name\n\n const confirmDeleteComponent = async component => {\n componentToDelete = component\n // await tick()\n confirmDeleteDialog.show()\n }\n</script>\n\n<div>\n <div\n class=\"budibase__nav-item\"\n class:selected={$store.currentComponentInfo._id === _layout.component.props._id}\n on:click|stopPropagation={() => store.setScreenType('page')}>\n <span\n class=\"icon\"\n class:rotate={$store.currentPreviewItem.name !== _layout.title}>\n {#if _layout.component.props._children.length}\n <ArrowDownIcon />\n {/if}\n </span>\n\n <span class=\"icon\">\n <GridIcon />\n </span>\n\n <span class=\"title\">Master Layout</span>\n </div>\n\n {#if $store.currentPreviewItem.name === _layout.title && _layout.component.props._children}\n <ComponentsHierarchyChildren\n components={_layout.component.props._children}\n currentComponent={$store.currentComponentInfo}\n onSelect={store.selectComponent}\n onDeleteComponent={confirmDeleteComponent}\n onMoveUpComponent={store.moveUpComponent}\n onMoveDownComponent={store.moveDownComponent}\n onCopyComponent={store.copyComponent} />\n {/if}\n</div>\n\n<ConfirmDialog\n bind:this={confirmDeleteDialog}\n title=\"Confirm Delete\"\n body={`Are you sure you wish to delete this '${lastPartOfName(componentToDelete)}' component?`}\n okText=\"Delete Component\"\n onOk={() => store.deleteComponent(componentToDelete)} />\n\n<style>\n .title {\n margin-left: 10px;\n margin-top: 2px;\n }\n\n .icon {\n display: inline-block;\n transition: 0.2s;\n width: 20px;\n margin-top: 2px;\n color: #333;\n }\n\n .icon:nth-of-type(2) {\n width: 14px;\n margin: 0 0 0 5px;\n }\n\n :global(svg) {\n transition: 0.2s;\n }\n\n .rotate :global(svg) {\n transform: rotate(-90deg);\n }\n</style>\n",
92
- "<script>\n import { last } from \"lodash/fp\"\n import { pipe } from \"../common/core\"\n import {\n XCircleIcon,\n ChevronUpIcon,\n ChevronDownIcon,\n CopyIcon,\n } from \"../common/Icons\"\n\n export let components = []\n export let currentComponent\n export let onSelect = () => {}\n export let level = 0\n export let onDeleteComponent\n export let onMoveUpComponent\n export let onMoveDownComponent\n export let onCopyComponent\n\n const capitalise = s => s.substring(0, 1).toUpperCase() + s.substring(1)\n const get_name = s => (!s ? \"\" : last(s.split(\"/\")))\n\n const get_capitalised_name = name => pipe(name, [get_name, capitalise])\n\n const moveDownComponent = component => {\n const c = component\n return () => {\n return onMoveDownComponent(c)\n }\n }\n</script>\n\n<ul>\n {#each components as component, index (component._id)}\n <li on:click|stopPropagation={() => onSelect(component)}>\n <div\n class=\"budibase__nav-item item\"\n class:selected={currentComponent === component}\n style=\"padding-left: {level * 20 + 53}px\">\n <div>{get_capitalised_name(component._component)}</div>\n <div class=\"reorder-buttons\">\n {#if index > 0}\n <button\n class:solo={index === components.length - 1}\n on:click|stopPropagation={() => onMoveUpComponent(component)}>\n <ChevronUpIcon />\n </button>\n {/if}\n {#if index < components.length - 1}\n <button\n class:solo={index === 0}\n on:click|stopPropagation={moveDownComponent(component)}>\n <ChevronDownIcon />\n </button>\n {/if}\n </div>\n <button\n class=\"copy\"\n on:click|stopPropagation={() => onCopyComponent(component)}>\n <CopyIcon />\n </button>\n <button on:click|stopPropagation={() => onDeleteComponent(component)}>\n <XCircleIcon />\n </button>\n </div>\n\n {#if component._children}\n <svelte:self\n components={component._children}\n {currentComponent}\n {onSelect}\n level={level + 1}\n {onDeleteComponent}\n {onMoveUpComponent}\n {onMoveDownComponent}\n {onCopyComponent} />\n {/if}\n </li>\n {/each}\n</ul>\n\n<style>\n ul {\n list-style: none;\n padding-left: 0;\n margin: 0;\n }\n\n .item {\n display: grid;\n grid-template-columns: 1fr auto auto auto;\n padding: 0px 5px 0px 15px;\n margin: auto 0px;\n border-radius: 3px;\n height: 35px;\n align-items: center;\n font-weight: 400;\n }\n\n .item button {\n display: none;\n height: 20px;\n width: 28px;\n color: var(--slate);\n padding: 0px 5px;\n border-style: none;\n background: rgba(0, 0, 0, 0);\n cursor: pointer;\n }\n\n .item button.copy {\n width: 26px;\n }\n\n .item:hover {\n background: #fafafa;\n cursor: pointer;\n }\n .item:hover button {\n display: block;\n }\n\n .item:hover button:hover {\n color: var(--button-text);\n }\n\n .reorder-buttons {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n .reorder-buttons > button {\n flex: 1 1 auto;\n width: 30px;\n height: 15px;\n }\n\n .reorder-buttons > button.solo {\n padding-top: 2px;\n }\n</style>\n",
93
- "<script>\n import ComponentsHierarchyChildren from \"./ComponentsHierarchyChildren.svelte\"\n\n import { last, sortBy, map, trimCharsStart, trimChars, join } from \"lodash/fp\"\n import ConfirmDialog from \"components/common/ConfirmDialog.svelte\"\n import { pipe } from \"components/common/core\"\n import { store } from \"builderStore\"\n import { ArrowDownIcon, ShapeIcon } from \"components/common/Icons/\"\n\n export let screens = []\n\n let confirmDeleteDialog\n let componentToDelete = \"\"\n\n const joinPath = join(\"/\")\n\n const normalizedName = name =>\n pipe(\n name,\n [\n trimCharsStart(\"./\"),\n trimCharsStart(\"~/\"),\n trimCharsStart(\"../\"),\n trimChars(\" \"),\n ]\n )\n\n const lastPartOfName = c => {\n if (!c) return \"\"\n const name = c.name ? c.name : c._component ? c._component : c\n return last(name.split(\"/\"))\n }\n\n const isComponentSelected = (current, comp) => current === comp\n\n const isFolderSelected = (current, folder) => isInSubfolder(current, folder)\n\n $: _screens = pipe(\n screens,\n [map(c => ({ component: c, title: lastPartOfName(c) })), sortBy(\"title\")]\n )\n\n const isScreenSelected = component =>\n component.component &&\n $store.currentPreviewItem &&\n component.component.name === $store.currentPreviewItem.name\n\n const confirmDeleteComponent = component => {\n componentToDelete = component\n confirmDeleteDialog.show()\n }\n</script>\n\n<div class=\"root\">\n\n {#each _screens as screen}\n <div\n class=\"budibase__nav-item component\"\n class:selected={$store.currentComponentInfo._id === screen.component.props._id}\n on:click|stopPropagation={() => store.setCurrentScreen(screen.title)}>\n\n <span\n class=\"icon\"\n class:rotate={$store.currentPreviewItem.name !== screen.title}>\n {#if screen.component.props._children.length}\n <ArrowDownIcon />\n {/if}\n </span>\n\n <span class=\"icon\">\n <ShapeIcon />\n </span>\n\n <span class=\"title\">{screen.title}</span>\n </div>\n\n {#if $store.currentPreviewItem.name === screen.title && screen.component.props._children}\n <ComponentsHierarchyChildren\n components={screen.component.props._children}\n currentComponent={$store.currentComponentInfo}\n onSelect={store.selectComponent}\n onDeleteComponent={confirmDeleteComponent}\n onMoveUpComponent={store.moveUpComponent}\n onMoveDownComponent={store.moveDownComponent}\n onCopyComponent={store.copyComponent} />\n {/if}\n {/each}\n\n</div>\n\n<ConfirmDialog\n bind:this={confirmDeleteDialog}\n title=\"Confirm Delete\"\n body={`Are you sure you wish to delete this '${lastPartOfName(componentToDelete)}' component?`}\n okText=\"Delete Component\"\n onOk={() => store.deleteComponent(componentToDelete)} />\n\n<style>\n .root {\n font-weight: 400;\n color: #333;\n }\n\n .title {\n margin-left: 10px;\n margin-top: 2px;\n }\n\n .icon {\n display: inline-block;\n transition: 0.2s;\n width: 20px;\n margin-top: 2px;\n color: #333;\n }\n\n .icon:nth-of-type(2) {\n width: 14px;\n margin: 0 0 0 5px;\n }\n\n :global(svg) {\n transition: 0.2s;\n }\n\n .rotate :global(svg) {\n transform: rotate(-90deg);\n }\n</style>\n",
94
- "<script>\n import { store } from \"builderStore\"\n import getIcon from \"components/common/icon\"\n import { CheckIcon } from \"components/common/Icons\"\n\n const getPage = (s, name) => {\n const props = s.pages[name]\n return { name, props }\n }\n\n const pages = [\n {\n title: \"Main\",\n id: \"main\",\n },\n {\n title: \"Login\",\n id: \"unauthenticated\",\n },\n ]\n\n store.setCurrentPage(\"main\")\n</script>\n\n<div class=\"root\">\n <ul>\n {#each pages as { title, id }}\n <li>\n <span class=\"icon\">\n {#if id === $store.currentPageName}\n <CheckIcon />\n {/if}\n </span>\n\n <button\n class:active={id === $store.currentPageName}\n on:click={() => store.setCurrentPage(id)}>\n {title}\n </button>\n </li>\n {/each}\n </ul>\n</div>\n\n<style>\n .root {\n padding-bottom: 10px;\n font-size: 0.9rem;\n color: #000333;\n font-weight: bold;\n position: relative;\n padding-left: 1.8rem;\n }\n\n ul {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n li {\n margin: 0.5rem 0;\n }\n\n button {\n margin: 0 0 0 6px;\n padding: 0;\n border: none;\n font-family: Roboto;\n font-size: 0.8rem;\n outline: none;\n cursor: pointer;\n background: rgba(0, 0, 0, 0);\n }\n\n .active {\n font-weight: 500;\n }\n\n .icon {\n display: inline-block;\n width: 14px;\n color: #000333;\n }\n</style>\n",
95
- "<script>\n import { store } from \"builderStore\"\n import PropsView from \"./PropsView.svelte\"\n import Textbox from \"components/common/Textbox.svelte\"\n import Button from \"components/common/Button.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import ButtonGroup from \"components/common/ButtonGroup.svelte\"\n import ConfirmDialog from \"components/common/ConfirmDialog.svelte\"\n import { pipe } from \"components/common/core\"\n import UIkit from \"uikit\"\n import { isRootComponent } from \"./pagesParsing/searchComponents\"\n import { splitName } from \"./pagesParsing/splitRootComponentName.js\"\n\n import { find, filter, some, map, includes } from \"lodash/fp\"\n import { assign } from \"lodash\"\n\n export const show = () => {\n dialog.show()\n }\n\n let dialog\n let layoutComponents\n let layoutComponent\n let screens\n let name = \"\"\n\n let saveAttempted = false\n\n $: layoutComponents = pipe(\n $store.components,\n [\n filter(c => c.container),\n map(c => ({ name: c.name, ...splitName(c.name) })),\n ]\n )\n\n $: layoutComponent = layoutComponent\n ? find(c => c.name === layoutComponent.name)(layoutComponents)\n : layoutComponents[0]\n\n $: screens = $store.screens\n $: route = !route && screens.length === 0 ? \"*\" : route\n\n const save = () => {\n saveAttempted = true\n\n const isValid =\n name.length > 0 &&\n !screenNameExists(name) &&\n route.length > 0 &&\n !routeNameExists(route) &&\n layoutComponent\n\n if (!isValid) return\n\n store.createScreen(name, route, layoutComponent.name)\n dialog.hide()\n }\n\n const cancel = () => {\n dialog.hide()\n }\n\n const screenNameExists = name => {\n return some(s => {\n return s.name.toLowerCase() === name.toLowerCase()\n })(screens)\n }\n\n const routeNameExists = route => {\n return some(s => {\n return s.route.toLowerCase() === route.toLowerCase()\n })(screens)\n }\n\n const routeChanged = event => {\n const r = event.target.value\n if (!r.startsWith(\"/\")) {\n route = \"/\" + r\n }\n }\n</script>\n\n<ConfirmDialog\n bind:this={dialog}\n title=\"New Screen\"\n onCancel={cancel}\n onOk={save}\n okText=\"Create Screen\">\n\n <div class=\"uk-form-horizontal\">\n <div class=\"uk-margin\">\n <label class=\"uk-form-label\">Name</label>\n <div class=\"uk-form-controls\">\n <input\n class=\"uk-input uk-form-small\"\n class:uk-form-danger={saveAttempted && (name.length === 0 || screenNameExists(name))}\n bind:value={name} />\n </div>\n </div>\n\n <div class=\"uk-margin\">\n <label class=\"uk-form-label\">Route (Url)</label>\n <div class=\"uk-form-controls\">\n <input\n class=\"uk-input uk-form-small\"\n class:uk-form-danger={saveAttempted && (route.length === 0 || routeNameExists(route))}\n bind:value={route}\n on:change={routeChanged} />\n </div>\n </div>\n\n <div class=\"uk-margin\">\n <label class=\"uk-form-label\">Layout Component</label>\n <div class=\"uk-form-controls\">\n <select\n class=\"uk-select uk-form-small\"\n bind:value={layoutComponent}\n class:uk-form-danger={saveAttempted && !layoutComponent}>\n {#each layoutComponents as comp}\n <option value={comp}>{comp.componentName} - {comp.libName}</option>\n {/each}\n </select>\n </div>\n </div>\n </div>\n\n</ConfirmDialog>\n\n<style>\n .uk-margin {\n display: flex;\n flex-direction: column;\n }\n\n .uk-form-controls {\n margin-left: 0 !important;\n }\n\n .uk-form-label {\n padding-bottom: 10px;\n font-weight: 500;\n font-size: 16px;\n color: var(--secondary80);\n }\n\n .uk-input {\n height: 40px !important;\n border-radius: 3px;\n }\n\n .uk-select {\n height: 40px !important;\n font-weight: 500px;\n color: var(--secondary60);\n border: 1px solid var(--slate);\n border-radius: 3px;\n }\n</style>\n",
96
- "<script>\n import { store, backendUiStore } from \"builderStore\"\n import { map, join } from \"lodash/fp\"\n import { pipe } from \"components/common/core\"\n\n let iframe\n\n function transform_component(comp) {\n const props = comp.props || comp\n if (props && props._children && props._children.length) {\n props._children = props._children.map(transform_component)\n }\n\n return props\n }\n\n $: iframe &&\n console.log(\n iframe.contentDocument.head.insertAdjacentHTML(\n \"beforeend\",\n `<\\style></style>`\n )\n )\n $: hasComponent = !!$store.currentPreviewItem\n $: styles = hasComponent ? $store.currentPreviewItem._css : \"\"\n\n $: stylesheetLinks = pipe(\n $store.pages.stylesheets,\n [map(s => `<link rel=\"stylesheet\" href=\"${s}\"/>`), join(\"\\n\")]\n )\n\n $: frontendDefinition = {\n componentLibraries: $store.loadLibraryUrls($store.currentPageName),\n page: $store.currentPreviewItem,\n screens: [{\n name: \"Screen Placeholder\",\n route: \"*\",\n props: {\n _component: \"@budibase/standard-components/container\",\n type: \"div\",\n _children: [\n {\n _component: \"@budibase/standard-components/container\",\n _styles: { \"position\": {},\"layout\": {} },\n _id: \"__screenslot__text\",\n _code: \"\",\n className: \"\",\n onLoad: [],\n type: \"div\",\n _children: [{\n _component:\"@budibase/standard-components/text\",\n _styles: { \"position\": {}, \"layout\": {} },\n _id: \"__screenslot__text_2\",\n _code: \"\",\n text: \"content\",\n font: \"\",\n color: \"\",\n textAlign: \"inline\",\n verticalAlign: \"inline\",\n formattingTag: \"none\"\n }]\n }\n ]\n }\n }],\n appRootPath: `/_builder/instance/${$store.appname}/${$backendUiStore.selectedDatabase.id}/`,\n }\n\n $: backendDefinition = {\n hierarchy: $store.hierarchy,\n }\n\n $: selectedComponentId = $store.currentComponentInfo ? $store.currentComponentInfo._id : \"\"\n</script>\n\n<div class=\"component-container\">\n {#if hasComponent && $store.currentPreviewItem}\n <iframe\n style=\"height: 100%; width: 100%\"\n title=\"componentPreview\"\n bind:this={iframe}\n srcdoc={`<html>\n <head>\n ${stylesheetLinks}\n\n <style>\n ${styles || ''}\n\n .pos-${selectedComponentId} {\n border: 2px solid #0055ff;\n }\n\n body, html {\n height: 100%!important;\n }\n .lay-__screenslot__text {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 20px 0;\n border: dashed 2px #ccc;\n font-family: sans-serif;\n font-size: 1.2rem;\n color: #999;\n text-transform: uppercase;\n font-weight: bold;\n }\n <\\/style>\n <\\script>\n window[\"##BUDIBASE_FRONTEND_DEFINITION##\"] = ${JSON.stringify(frontendDefinition)};\n window[\"##BUDIBASE_BACKEND_DEFINITION##\"] = ${JSON.stringify(backendDefinition)};\n window[\"##BUDIBASE_FRONTEND_FUNCTIONS##\"] = ${$store.currentPageFunctions};\n\n import('/_builder/budibase-client.esm.mjs')\n .then(module => {\n module.loadBudibase({ window, localStorage });\n })\n <\\/script>\n </head>\n <body>\n </body>\n</html>`} />\n {/if}\n</div>\n\n<style>\n .component-container {\n grid-row-start: middle;\n grid-column-start: middle;\n position: relative;\n overflow: hidden;\n padding-top: 56.25%;\n margin: auto;\n }\n\n .component-container iframe {\n border: 0;\n height: 100%;\n left: 0;\n position: absolute;\n top: 0;\n width: 100%;\n }\n</style>\n",
97
- "<script>\n import { store } from \"builderStore/\"\n import ComponentPropertiesPanel from \"./ComponentPropertiesPanel.svelte\"\n import ComponentSelectionList from \"./ComponentSelectionList.svelte\"\n\n const PROPERTIES_TAB = \"properties\"\n const COMPONENT_SELECTION_TAB = \"components\"\n\n let selected = PROPERTIES_TAB\n\n const isSelected = tab => selected === tab\n\n const selectTab = tab => (selected = tab)\n\n const toggleTab = () =>\n (selected =\n selected === PROPERTIES_TAB ? COMPONENT_SELECTION_TAB : PROPERTIES_TAB)\n</script>\n\n<div class=\"root\">\n {#if $store.currentFrontEndType === 'page' || $store.screens.length}\n <div class=\"switcher\">\n\n <button\n class:selected={selected === COMPONENT_SELECTION_TAB}\n on:click={() => selectTab(COMPONENT_SELECTION_TAB)}>\n Components\n </button>\n\n <button\n class:selected={selected === PROPERTIES_TAB}\n on:click={() => selectTab(PROPERTIES_TAB)}>\n Properties\n </button>\n\n </div>\n\n <div class=\"panel\">\n {#if selected === PROPERTIES_TAB}\n <ComponentPropertiesPanel {toggleTab} />\n {/if}\n\n {#if selected === COMPONENT_SELECTION_TAB}\n <ComponentSelectionList {toggleTab} />\n {/if}\n\n </div>\n {/if}\n\n</div>\n\n<style>\n .root {\n height: 100%;\n display: flex;\n flex-direction: column;\n padding: 20px 0;\n }\n\n .switcher {\n display: flex;\n justify-content: space-between;\n margin-bottom: 20px;\n padding: 0 20px 20px;\n border-bottom: 1px solid #d8d8d8;\n }\n\n .switcher > button {\n text-rendering: optimizeLegibility;\n display: inline-block;\n border: none;\n margin: 0;\n padding: 0;\n cursor: pointer;\n font-size: 14px;\n text-transform: uppercase;\n background: rgba(0, 0, 0, 0);\n font-weight: 500;\n color: var(--secondary40);\n margin-right: 20px;\n letter-spacing: 1px;\n }\n\n .switcher > .selected {\n color: var(--secondary100);\n font-weight: 600;\n }\n\n .panel {\n flex: 1 1 auto;\n height: 0px;\n overflow-y: auto;\n padding: 0 20px 40px 20px;\n }\n</style>\n",
98
- "<script>\n import Textbox from \"components/common/Textbox.svelte\"\n import Dropdown from \"components/common/Dropdown.svelte\"\n import Button from \"components/common/Button.svelte\"\n import { store } from \"builderStore\"\n import { isRootComponent } from \"./pagesParsing/searchComponents\"\n import { pipe } from \"components/common/core\"\n import { filter, find, concat } from \"lodash/fp\"\n\n const notSeletedComponent = { name: \"(none selected)\" }\n\n $: page = $store.pages[$store.currentPageName]\n $: title = page.index.title\n $: components = pipe(\n $store.components,\n [filter(store => !isRootComponent($store)), concat([notSeletedComponent])]\n )\n $: entryComponent =\n find(c => c.name === page.appBody)(components) || notSeletedComponent\n\n const save = () => {\n if (!title || !entryComponent || entryComponent === notSeletedComponent)\n return\n const page = {\n index: {\n title,\n },\n appBody: entryComponent.name,\n }\n store.savePage(page)\n }\n</script>\n\n<div class=\"root\">\n\n <h3>{$store.currentPageName}</h3>\n\n <form class=\"uk-form-horizontal\">\n <Textbox bind:text={title} label=\"Title\" hasError={!title} />\n <div class=\"help-text\">\n The title of your page, displayed in the bowser tab\n </div>\n <Dropdown\n label=\"App Entry Component\"\n options={components}\n bind:selected={entryComponent}\n textMember={v => v.name} />\n\n <div class=\"help-text\">\n The component that will be loaded into the body of the page\n </div>\n <div style=\"margin-top: 20px\" />\n <Button on:click={save}>Save</Button>\n </form>\n\n</div>\n\n<style>\n .root {\n padding: 15px;\n }\n .help-text {\n color: var(--slate);\n font-size: 10pt;\n }\n</style>\n",
99
- "<script>\n import { store } from \"builderStore\"\n import Textbox from \"components/common/Textbox.svelte\"\n import Button from \"components/common/Button.svelte\"\n import IconButton from \"components/common/IconButton.svelte\"\n import { libraryDependencies } from \"./pagesParsing/findDependencies\"\n import UIkit from \"uikit\"\n import { libsFromPages } from \"builderStore/loadComponentLibraries\"\n let addNewLib = \"\"\n let addNewStylesheet = \"\"\n let modalElement\n\n $: components = $store.components\n\n const removeLibrary = lib => {\n const dependencies = libraryDependencies(components, lib)\n if (dependencies.length > 0) return\n store.removeComponentLibrary(lib)\n }\n\n const addLib = () => {\n store.addComponentLibrary(addNewLib).then(() => {\n addNewLib = \"\"\n })\n }\n\n const removeStylesheet = stylesheet => {\n store.removeStylesheet(stylesheet)\n }\n\n const addStylesheet = () => {\n if (addNewStylesheet) store.addStylesheet(addNewStylesheet)\n }\n\n export const close = () => {\n UIkit.modal(modalElement).hide()\n }\n\n export const show = () => {\n UIkit.modal(modalElement).show()\n }\n</script>\n\n<div bind:this={modalElement} id=\"new-component-modal\" uk-modal>\n <div class=\"uk-modal-dialog\">\n\n <div class=\"uk-modal-header header\">\n <div>Settings</div>\n <div>\n <IconButton icon=\"x\" on:click={close} />\n </div>\n </div>\n\n <div class=\"uk-modal-body uk-form-horizontal\">\n\n <div class=\"section-container\">\n <p>\n Component Libraries\n <span>\n <input bind:value={addNewLib} />\n <Button color=\"primary-outline\" on:click={addLib}>Add</Button>\n </span>\n </p>\n {#each $store.pages[$store.currentPageName].componentLibraries as lib}\n <div>\n <span class=\"row-text\">{lib}</span>\n <IconButton icon=\"x\" on:click={() => removeLibrary(lib)} />\n </div>\n {/each}\n </div>\n\n <div class=\"section-container\">\n <p>\n Stylesheets\n <span>\n <input bind:value={addNewStylesheet} />\n <Button color=\"primary-outline\" on:click={addStylesheet}>\n Add\n </Button>\n </span>\n </p>\n {#each $store.pages[$store.currentPageName].stylesheets as stylesheet}\n <div>\n <span class=\"row-text\">{stylesheet}</span>\n <IconButton\n icon=\"x\"\n on:click={() => removeStylesheet(stylesheet)} />\n </div>\n {/each}\n </div>\n\n </div>\n </div>\n</div>\n\n<style>\n .section-container {\n padding: 15px;\n border-style: dotted;\n border-width: 1px;\n border-color: var(--lightslate);\n border-radius: 2px;\n }\n\n .section-container:nth-child(1) {\n margin-bottom: 15px;\n }\n\n .row-text {\n margin-right: 15px;\n color: var(--primary100);\n }\n\n input {\n margin-right: 15px;\n }\n\n p > span {\n margin-left: 30px;\n }\n\n .header {\n display: grid;\n grid-template-columns: [title] 1fr [icon] auto;\n }\n\n .header > div:nth-child(1) {\n grid-column-start: title;\n }\n\n .header > div:nth-child(2) {\n grid-column-start: icon;\n }\n</style>\n",
100
- "<svg\n on:click\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n height=\"24\">\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\n <path\n d=\"M15.728 9.686l-1.414-1.414L5\n 17.586V19h1.414l9.314-9.314zm1.414-1.414l1.414-1.414-1.414-1.414-1.414 1.414\n 1.414 1.414zM7.242 21H3v-4.243L16.435 3.322a1 1 0 0 1 1.414 0l2.829 2.829a1\n 1 0 0 1 0 1.414L7.243 21z\" />\n</svg>\n\n<style>\n svg:hover {\n cursor: pointer;\n }\n</style>\n",
101
- "<script>\n import { getContext } from \"svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import { cloneDeep } from \"lodash/fp\"\n import getIcon from \"../common/icon\"\n\n export let level = 0\n export let node\n export let type\n\n let navActive = \"\"\n\n const ICON_MAP = {\n index: \"ri-eye-line\",\n record: \"ri-list-settings-line\",\n }\n\n store.subscribe(state => {\n if (state.currentNode) {\n navActive = node.nodeId === state.currentNode.nodeId\n }\n })\n\n function selectHierarchyItem(node) {\n store.selectExistingNode(node.nodeId)\n const modalType = node.type === \"index\" ? \"VIEW\" : \"MODEL\"\n backendUiStore.actions.modals.show(modalType)\n }\n</script>\n\n<div>\n <div\n on:click={() => selectHierarchyItem(node)}\n class=\"budibase__nav-item hierarchy-item\"\n class:capitalized={type === 'record'}\n style=\"padding-left: {20 + level * 20}px\"\n class:selected={navActive}>\n <i class={ICON_MAP[type]} />\n <span style=\"margin-left: 1rem\">{node.name}</span>\n </div>\n {#if node.children}\n {#each node.children as child}\n <svelte:self node={child} level={level + 1} type=\"record\" />\n {/each}\n {/if}\n {#if node.indexes}\n {#each node.indexes as index}\n <svelte:self node={index} level={level + 1} type=\"index\" />\n {/each}\n {/if}\n</div>\n\n<style>\n .hierarchy-item {\n font-size: 14px;\n font-weight: 400;\n }\n\n .capitalized {\n text-transform: capitalize;\n }\n</style>\n",
102
- "<script>\n import { tick, onMount } from \"svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import api from \"builderStore/api\"\n import getIcon from \"../common/icon\"\n import { CheckIcon } from \"../common/Icons\"\n\n $: instances = $store.appInstances\n $: views = $store.hierarchy.indexes\n\n async function selectDatabase(database) {\n backendUiStore.actions.navigate(\"DATABASE\")\n backendUiStore.actions.records.select(null)\n backendUiStore.actions.views.select(views[0])\n backendUiStore.actions.database.select(database)\n }\n\n async function deleteDatabase(database) {\n const DELETE_DATABASE_URL = `/_builder/instance/_master/0/api/record/applications/${$store.appId}/instances/${database.id}`\n const response = await api.delete(DELETE_DATABASE_URL)\n store.update(state => {\n state.appInstances = state.appInstances.filter(\n db => db.id !== database.id\n )\n return state\n })\n }\n\n onMount(() => {\n if ($store.appInstances.length > 0) {\n selectDatabase($store.appInstances[0])\n }\n })\n</script>\n\n<div class=\"root\">\n <ul>\n {#each $store.appInstances as database}\n <li>\n <span class=\"icon\">\n {#if database.id === $backendUiStore.selectedDatabase.id}\n <CheckIcon />\n {/if}\n </span>\n <i\n class=\"ri-delete-bin-7-line hoverable uk-margin-small-left\"\n on:click={() => deleteDatabase(database)} />\n <button\n class:active={database.id === $backendUiStore.selectedDatabase.id}\n on:click={() => selectDatabase(database)}>\n {database.name}\n </button>\n\n </li>\n {/each}\n </ul>\n</div>\n\n<style>\n .root {\n padding-bottom: 10px;\n font-size: 0.9rem;\n color: var(--secondary50);\n font-weight: bold;\n position: relative;\n padding-left: 1.8rem;\n }\n\n ul {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n li {\n margin: 0.5rem 0;\n display: flex;\n align-items: center;\n }\n\n button {\n margin: 0 0 0 6px;\n padding: 0;\n border: none;\n font-family: Roboto;\n font-size: 0.8rem;\n outline: none;\n cursor: pointer;\n background: rgba(0, 0, 0, 0);\n }\n\n .active {\n font-weight: 500;\n }\n\n .icon {\n display: inline-block;\n width: 14px;\n color: #333;\n }\n</style>\n",
103
- "<script>\n import getIcon from \"../common/icon\"\n import { backendUiStore } from \"builderStore\"\n\n export let name = \"\"\n export let label = \"\"\n\n $: navActive = $backendUiStore.leftNavItem === name\n\n const setActive = () => backendUiStore.actions.navigate(name)\n</script>\n\n<div\n class=\"budibase__nav-item backend-nav-item\"\n class:selected={navActive}\n on:click={setActive}>\n {label}\n</div>\n\n<style>\n .backend-nav-item {\n padding-left: 25px;\n }\n</style>\n",
104
- "<script>\n import { onMount } from \"svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import api from \"builderStore/api\"\n import getIcon from \"../common/icon\"\n import { CheckIcon } from \"../common/Icons\"\n\n const getPage = (s, name) => {\n const props = s.pages[name]\n return { name, props }\n }\n\n let users = []\n\n $: currentAppInfo = {\n appname: $store.appname,\n instanceId: $backendUiStore.selectedDatabase.id,\n }\n\n async function fetchUsers() {\n const FETCH_USERS_URL = `/_builder/instance/${currentAppInfo.appname}/${currentAppInfo.instanceId}/api/users`\n const response = await api.get(FETCH_USERS_URL)\n users = await response.json()\n backendUiStore.update(state => {\n state.users = users\n return state\n })\n }\n\n onMount(fetchUsers)\n</script>\n\n<div class=\"root\">\n <ul>\n {#each users as user}\n <li>\n <i class=\"ri-user-4-line\" />\n <button class:active={user.id === $store.currentUserId}>\n {user.name}\n </button>\n </li>\n {/each}\n </ul>\n</div>\n\n<style>\n .root {\n padding-bottom: 10px;\n font-size: 0.9rem;\n color: var(--secondary50);\n font-weight: bold;\n position: relative;\n padding-left: 1.8rem;\n }\n\n ul {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n li {\n margin: 0.5rem 0;\n }\n\n button {\n margin: 0 0 0 6px;\n padding: 0;\n border: none;\n font-family: Roboto;\n font-size: 0.8rem;\n outline: none;\n cursor: pointer;\n background: rgba(0, 0, 0, 0);\n }\n\n .active {\n font-weight: 500;\n }\n\n .icon {\n display: inline-block;\n width: 14px;\n color: #333;\n }\n</style>\n",
105
- "<script>\n import getIcon from \"./icon\"\n export let iconName\n export let actions = [] // [ {label: \"Action Name\", onclick: () => {...} } ]\n let isDroppedDown = false\n</script>\n\n<div class=\"root\" on:click={() => (isDroppedDown = !isDroppedDown)}>\n {@html getIcon(iconName)}\n\n <div\n class=\"dropdown-background\"\n on:click|stopPropagation={() => (isDroppedDown = false)}\n style=\"display: {isDroppedDown ? 'block' : 'none'}\" />\n\n <div\n class=\"dropdown-content\"\n style=\"display: {isDroppedDown ? 'inline-block' : 'none'}\">\n {#each actions as action}\n <div class=\"budibase__nav-item\" on:click={action.onclick}>\n {action.label}\n </div>\n {/each}\n </div>\n\n</div>\n\n<style>\n .dropdown-background {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n }\n\n .root {\n cursor: pointer;\n z-index: 1;\n }\n\n .dropdown-content {\n position: absolute;\n background-color: var(--white);\n min-width: 160px;\n box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);\n z-index: 1;\n font-weight: normal;\n border-style: solid;\n border-width: 1px;\n border-color: var(--secondary10);\n }\n\n .dropdown-content:not(:focus) {\n display: none;\n }\n\n .action-row {\n padding: 7px 10px;\n cursor: pointer;\n }\n\n .action-row:hover {\n background-color: var(--primary100);\n color: var(--white);\n }\n</style>\n",
106
- "<script>\n import { tick } from \"svelte\"\n import Textbox from \"components/common/Textbox.svelte\"\n import Button from \"components/common/Button.svelte\"\n import Select from \"components/common/Select.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import getIcon from \"components/common/icon\"\n import FieldView from \"./FieldView.svelte\"\n import Modal from \"components/common/Modal.svelte\"\n import {\n get,\n compose,\n map,\n join,\n filter,\n some,\n find,\n keys,\n isDate,\n } from \"lodash/fp\"\n import { store, backendUiStore } from \"builderStore\"\n import { common, hierarchy } from \"../../../../core/src/\"\n import { getNode } from \"components/common/core\"\n import { templateApi, pipe, validate } from \"components/common/core\"\n import ErrorsBox from \"components/common/ErrorsBox.svelte\"\n\n let record\n let getIndexAllowedRecords\n let editingField = false\n let fieldToEdit\n let isNewField = false\n let newField\n let editField\n let deleteField\n let onFinishedFieldEdit\n let editIndex\n\n $: models = $store.hierarchy.children\n $: parent = record && record.parent()\n $: isChildModel = parent && parent.name !== \"root\"\n $: modelExistsInHierarchy =\n $store.currentNode && getNode($store.hierarchy, $store.currentNode.nodeId)\n\n store.subscribe($store => {\n record = $store.currentNode\n const flattened = hierarchy.getFlattenedHierarchy($store.hierarchy)\n\n getIndexAllowedRecords = compose(\n join(\", \"),\n map(id => flattened.find(n => n.nodeId === id).name),\n filter(id => flattened.some(n => n.nodeId === id)),\n get(\"allowedRecordNodeIds\")\n )\n\n newField = () => {\n isNewField = true\n fieldToEdit = templateApi($store.hierarchy).getNewField(\"string\")\n editingField = true\n }\n\n onFinishedFieldEdit = field => {\n if (field) {\n store.saveField(field)\n }\n editingField = false\n }\n\n editField = field => {\n isNewField = false\n fieldToEdit = field\n editingField = true\n }\n\n deleteField = field => {\n store.deleteField(field)\n }\n\n editIndex = index => {\n store.selectExistingNode(index.nodeId)\n }\n })\n\n let getTypeOptionsValueText = value => {\n if (\n value === Number.MAX_SAFE_INTEGER ||\n value === Number.MIN_SAFE_INTEGER ||\n new Date(value).getTime() === new Date(8640000000000000).getTime() ||\n new Date(value).getTime() === new Date(-8640000000000000).getTime()\n )\n return \"(any)\"\n\n if (value === null) return \"(not set)\"\n return value\n }\n\n const nameChanged = ev => {\n const pluralName = n => `${n}s`\n if (record.collectionName === \"\") {\n record.collectionName = pluralName(ev.target.value)\n }\n }\n</script>\n\n<div class=\"root\">\n <heading>\n {#if !editingField}\n <i class=\"ri-list-settings-line button--toggled\" />\n <h3 class=\"budibase__title--3\">Create / Edit Model</h3>\n {:else}\n <i class=\"ri-file-list-line button--toggled\" />\n <h3 class=\"budibase__title--3\">Create / Edit Field</h3>\n {/if}\n </heading>\n {#if !editingField}\n <h4 class=\"budibase__label--big\">Settings</h4>\n\n {#if $store.errors && $store.errors.length > 0}\n <ErrorsBox errors={$store.errors} />\n {/if}\n\n <form class=\"uk-form-stacked\">\n\n <Textbox label=\"Name\" bind:text={record.name} on:change={nameChanged} />\n {#if isChildModel}\n <div>\n <label class=\"uk-form-label\">Parent</label>\n <div class=\"uk-form-controls parent-name\">{parent.name}</div>\n </div>\n {/if}\n </form>\n\n <div class=\"table-controls\">\n <span class=\"budibase__label--big\">Fields</span>\n <h4 class=\"hoverable new-field\" on:click={newField}>Add new field</h4>\n </div>\n\n <table class=\"uk-table fields-table budibase__table\">\n <thead>\n <tr>\n <th>Edit</th>\n <th>Name</th>\n <th>Type</th>\n <th>Values</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {#each record ? record.fields : [] as field}\n <tr>\n <td>\n <i class=\"ri-more-line\" on:click={() => editField(field)} />\n </td>\n <td>\n <div>{field.name}</div>\n </td>\n <td>{field.type}</td>\n <td>{field.typeOptions.values || ''}</td>\n <td>\n <i\n class=\"ri-delete-bin-6-line hoverable\"\n on:click={() => deleteField(field)} />\n </td>\n </tr>\n {/each}\n </tbody>\n </table>\n <div class=\"uk-margin\">\n <ActionButton color=\"secondary\" on:click={store.saveCurrentNode}>\n Save\n </ActionButton>\n {#if modelExistsInHierarchy}\n <ActionButton color=\"primary\" on:click={store.newChildRecord}>\n Create Child Model on {record.name}\n </ActionButton>\n <ActionButton\n color=\"primary\"\n on:click={async () => {\n backendUiStore.actions.modals.show('VIEW')\n await tick()\n store.newChildIndex()\n }}>\n Create Child View on {record.name}\n </ActionButton>\n <ActionButton alert on:click={store.deleteCurrentNode}>\n Delete\n </ActionButton>\n {/if}\n </div>\n {:else}\n <FieldView\n field={fieldToEdit}\n onFinished={onFinishedFieldEdit}\n allFields={record.fields}\n store={$store} />\n {/if}\n</div>\n\n<style>\n .root {\n height: 100%;\n }\n\n .new-field {\n font-size: 16px;\n font-weight: bold;\n color: var(--button-text);\n }\n\n .fields-table {\n margin: 1rem 1rem 0rem 0rem;\n border-collapse: collapse;\n }\n\n tbody > tr:hover {\n background-color: var(--primary10);\n }\n\n .table-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .ri-more-line:hover {\n cursor: pointer;\n }\n\n heading {\n display: flex;\n align-items: center;\n }\n\n h3 {\n margin: 0 0 0 10px;\n }\n\n .parent-name {\n font-weight: bold;\n }\n</style>\n",
107
- "<script>\n export let disabled = false\n export let hidden = false\n export let primary = true\n export let cancel = false\n export let alert = false\n export let warning = false\n</script>\n\n<button\n on:click\n class=\"button\"\n class:hidden\n class:primary\n class:alert\n class:cancel\n class:warning\n {disabled}>\n <slot />\n</button>\n\n<style>\n .primary {\n color: #ffffff;\n background: #0055ff;\n }\n\n .alert {\n color: rgba(255, 0, 31, 1);\n background: rgba(255, 0, 31, 0.1);\n }\n\n .cancel {\n color: var(--secondary40);\n background: none;\n }\n\n .button {\n font-size: 14px;\n font-weight: 600;\n border-radius: 5px;\n border: none;\n padding: 10px 20px;\n height: 45px;\n }\n\n .button:hover {\n cursor: pointer;\n font-weight: 700;\n }\n\n .button:disabled {\n color: rgba(22, 48, 87, 0.2);\n cursor: default;\n background: transparent;\n }\n\n .hidden {\n visibility: hidden;\n }\n</style>\n",
108
- "<script>\n import Textbox from \"components/common/Textbox.svelte\"\n import CodeArea from \"components/common/CodeArea.svelte\"\n import Button from \"components/common/Button.svelte\"\n import Dropdown from \"components/common/Dropdown.svelte\"\n import { store } from \"builderStore\"\n import { filter, some, map, compose } from \"lodash/fp\"\n import {\n hierarchy as hierarchyFunctions,\n common,\n } from \"../../../../core/src/\"\n import ErrorsBox from \"components/common/ErrorsBox.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n\n const SNIPPET_EDITORS = {\n MAP: \"Map\",\n FILTER: \"Filter\",\n SHARD: \"Shard Name\",\n }\n\n let index\n let indexableRecords = []\n let currentSnippetEditor = SNIPPET_EDITORS.MAP\n\n const indexableRecordsFromIndex = compose(\n map(node => ({\n node,\n isallowed:\n index.allowedRecordNodeIds &&\n index.allowedRecordNodeIds.some(id => node.nodeId === id),\n })),\n filter(hierarchyFunctions.isRecord),\n filter(hierarchyFunctions.isDecendant($store.currentNode.parent())),\n hierarchyFunctions.getFlattenedHierarchy\n )\n\n store.subscribe($store => {\n index = $store.currentNode\n indexableRecords = indexableRecordsFromIndex($store.hierarchy)\n })\n\n const toggleAllowedRecord = record => {\n if (record.isallowed) {\n index.allowedRecordNodeIds = index.allowedRecordNodeIds.filter(\n id => id !== record.node.nodeId\n )\n } else {\n index.allowedRecordNodeIds.push(record.node.nodeId)\n }\n }\n</script>\n\n<heading>\n <i class=\"ri-eye-line button--toggled\" />\n <h3 class=\"budibase__title--3\">Create / Edit View</h3>\n</heading>\n<form class=\"uk-form-stacked root\">\n <h4 class=\"budibase__label--big\">Settings</h4>\n {#if $store.errors && $store.errors.length > 0}\n <ErrorsBox errors={$store.errors} />\n {/if}\n <div class=\"uk-grid-small\" uk-grid>\n <div class=\"uk-width-1-2@s\">\n <Textbox bind:text={index.name} label=\"Name\" />\n </div>\n <div class=\"uk-width-1-2@s\">\n <Dropdown\n label=\"View Type\"\n bind:selected={index.indexType}\n options={['ancestor', 'reference']} />\n </div>\n </div>\n\n <div class=\"allowed-records\">\n <div class=\"budibase__label--big\">\n Which models would you like to add to this view?\n </div>\n {#each indexableRecords as rec}\n <input\n class=\"uk-checkbox\"\n type=\"checkbox\"\n checked={rec.isallowed}\n on:change={() => toggleAllowedRecord(rec)} />\n <span class=\"checkbox-model-label\">{rec.node.name}</span>\n {/each}\n </div>\n\n <h4 class=\"budibase__label--big\">Snippets</h4>\n {#each Object.values(SNIPPET_EDITORS) as snippetType}\n <span\n class=\"snippet-selector__heading hoverable\"\n class:highlighted={currentSnippetEditor === snippetType}\n on:click={() => (currentSnippetEditor = snippetType)}>\n {snippetType}\n </span>\n {/each}\n {#if currentSnippetEditor === SNIPPET_EDITORS.MAP}\n <CodeArea bind:text={index.map} label=\"Map\" />\n {:else if currentSnippetEditor === SNIPPET_EDITORS.FILTER}\n <CodeArea bind:text={index.filter} label=\"Filter\" />\n {:else if currentSnippetEditor === SNIPPET_EDITORS.SHARD}\n <CodeArea bind:text={index.getShardName} label=\"Shard Name\" />\n {/if}\n\n <ActionButton color=\"secondary\" on:click={store.saveCurrentNode}>\n Save\n </ActionButton>\n\n {#if !$store.currentNodeIsNew}\n <ActionButton alert on:click={store.deleteCurrentNode}>Delete</ActionButton>\n {/if}\n\n</form>\n\n<style>\n .root {\n height: 100%;\n padding: 15px;\n }\n\n .allowed-records {\n margin: 20px 0px;\n }\n\n .allowed-records > span {\n margin-right: 30px;\n }\n\n .snippet-selector__heading {\n margin-right: 20px;\n opacity: 0.7;\n }\n\n .highlighted {\n opacity: 1;\n }\n\n .checkbox-model-label {\n text-transform: capitalize;\n }\n\n h3 {\n margin: 0 0 0 10px;\n }\n\n heading {\n display: flex;\n align-items: center;\n }\n</style>\n",
109
- "<script>\n export let style = \"\"\n</script>\n\n<div class=\"root\" {style}>\n <slot />\n</div>\n\n<style>\n .root {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n }\n</style>\n",
110
- "<script>\n import { store } from \"builderStore\"\n import getIcon from \"components/common/icon\"\n import Button from \"components/common/Button.svelte\"\n import Modal from \"components/common/Modal.svelte\"\n import TriggerView from \"./TriggerView.svelte\"\n\n export let editingTrigger = null\n export let editingTriggerIsNew = true\n export let onTriggerEdit = trigger => {}\n export let onTriggerDelete = trigger => {}\n export let onTriggerSave = trigger => {}\n export let onTriggerCancel = () => {}\n\n $: isEditing = editingTrigger !== null\n\n let triggerEditingFinished = trigger => {\n if (trigger) {\n onTriggerSave(trigger)\n } else {\n onTriggerCancel()\n }\n }\n</script>\n\n<h3 class=\"budibase__title--3\">Triggers</h3>\n\n{#if $store.triggers}\n <table class=\"fields-table uk-table uk-table-small uk-table-striped\">\n <thead>\n <tr>\n <th>Event</th>\n <th>Action</th>\n <th>Condition</th>\n <th>Create Options</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {#each $store.triggers as trigger}\n <tr>\n <td class=\"table-content\">{trigger.eventName}</td>\n <td class=\"table-content\">{trigger.actionName}</td>\n <td class=\"table-content\">{trigger.condition}</td>\n <td class=\"table-content\">{trigger.optionsCreator}</td>\n <td class=\"edit-button\">\n <span on:click={() => onTriggerEdit(trigger)}>\n {@html getIcon('edit')}\n </span>\n <span on:click={() => onTriggerDelete(trigger)}>\n {@html getIcon('trash')}\n </span>\n </td>\n </tr>\n {/each}\n </tbody>\n </table>\n{:else}(no triggers added){/if}\n\n<Modal\n title={editingTriggerIsNew ? 'Create Trigger' : 'Edit Trigger'}\n onClosed={() => (isEditing = false)}\n bind:isOpen={isEditing}>\n {#if isEditing}\n <TriggerView\n trigger={editingTrigger}\n allActions={$store.actions}\n allTriggers={$store.triggers}\n onFinished={triggerEditingFinished}\n isNew={editingTriggerIsNew} />\n {/if}\n</Modal>\n\n<style>\n .edit-button {\n cursor: pointer;\n color: var(--secondary25);\n }\n\n .title {\n margin: 3rem 0rem 0rem 0rem;\n font-weight: 700;\n }\n\n .table-content {\n font-weight: 500;\n font-size: 0.9rem;\n }\n\n tr:hover .edit-button {\n color: var(--secondary75);\n }\n</style>\n",
111
- "<script>\n import getIcon from \"components/common/icon\"\n import { store } from \"builderStore\"\n import Button from \"components/common/Button.svelte\"\n import ButtonGroup from \"components/common/ButtonGroup.svelte\"\n import ActionView from \"./ActionView.svelte\"\n import Modal from \"components/common/Modal.svelte\"\n import { pipe } from \"components/common/core\"\n import { keys, map, join } from \"lodash/fp\"\n\n export let editingActionIsNew = false\n export let editingAction = null\n export let onActionEdit = action => {}\n export let onActionDelete = action => {}\n export let onActionSave = action => {}\n export let onActionCancel = () => {}\n\n $: isEditing = editingAction !== null\n\n let actionsArray = []\n store.subscribe(s => {\n actionsArray = pipe(s.actions, [keys, map(k => s.actions[k])])\n })\n\n let getDefaultOptionsHtml = defaultOptions =>\n pipe(defaultOptions, [\n keys,\n map(\n k =>\n `<span style=\"color:var(--slate)\">${k}: </span>${JSON.stringify(\n defaultOptions[k]\n )}`\n ),\n join(\"<br>\"),\n ])\n\n let actionEditingFinished = action => {\n if (action) {\n onActionSave(action)\n } else {\n onActionCancel()\n }\n }\n</script>\n\n<h3 class=\"budibase__title--3\">Actions</h3>\n\n{#if actionsArray}\n <table class=\"fields-table uk-table uk-table-small uk-table-striped\">\n <thead>\n <tr>\n <th>Description</th>\n <th>Behaviour Source</th>\n <th>Behaviour Name</th>\n <th>Default Options</th>\n <th />\n </tr>\n </thead>\n <tbody>\n {#each actionsArray as action}\n <tr>\n <td class=\"table-content\">{action.name}</td>\n <td class=\"table-content\">{action.behaviourSource}</td>\n <td class=\"table-content\">{action.behaviourName}</td>\n <td class=\"table-content\">\n {@html getDefaultOptionsHtml(action.initialOptions)}\n </td>\n <td class=\"edit-button\">\n <span on:click={() => onActionEdit(action)}>\n {@html getIcon('edit')}\n </span>\n <span on:click={() => onActionDelete(action)}>\n {@html getIcon('trash')}\n </span>\n </td>\n </tr>\n {/each}\n </tbody>\n </table>\n{:else}(no actions added){/if}\n\n<Modal\n title={editingActionIsNew ? 'Create Action' : 'Edit Action'}\n bind:isOpen={isEditing}>\n {#if isEditing}\n <ActionView\n action={editingAction}\n allActions={$store.actions}\n onFinished={actionEditingFinished}\n isNew={editingActionIsNew} />\n {/if}\n</Modal>\n\n<style>\n .edit-button {\n cursor: pointer;\n color: var(--secondary25);\n }\n\n tr:hover .edit-button {\n color: var(--secondary75);\n }\n\n .table-content {\n font-weight: 500;\n font-size: 0.9rem;\n }\n</style>\n",
112
- "<script>\n import { cloneDeep, map, some, filter } from \"lodash/fp\"\n import Textbox from \"../common/Textbox.svelte\"\n import Checkbox from \"../common/Checkbox.svelte\"\n import ButtonGroup from \"../common/ButtonGroup.svelte\"\n import Button from \"../common/Button.svelte\"\n import ActionButton from \"../common/ActionButton.svelte\"\n import { validateAccessLevels, nodeNameFromNodeKey } from \"../common/core\"\n import ErrorsBox from \"../common/ErrorsBox.svelte\"\n\n export let level\n export let allPermissions\n export let onFinished\n export let isNew\n export let allLevels\n export let hierarchy\n export let actions\n\n let errors = []\n let clonedLevel = cloneDeep(level)\n\n const matchPermissions = (p1, p2) =>\n p1.type === p2.type &&\n ((!p2.nodeKey && !p1.nodeKey) || p2.nodeKey === p1.nodeKey)\n\n const hasPermission = hasPerm =>\n clonedLevel.permissions.some(permission =>\n matchPermissions(permission, hasPerm)\n )\n\n $: permissionMatrix = allPermissions.map(permission => ({\n permission,\n hasPermission: hasPermission(permission),\n }))\n\n $: allPermissionsSelected = permissionMatrix.every(\n permission => permission.hasPermission\n )\n\n const getPermissionName = perm =>\n perm.nodeKey \n ? `${perm.type} - ${nodeNameFromNodeKey(hierarchy, perm.nodeKey)}` \n : perm.type\n\n const save = () => {\n const newLevels = isNew\n ? [...allLevels, clonedLevel]\n : [...allLevels.filter(l => l.name !== level.name), clonedLevel]\n\n errors = validateAccessLevels(hierarchy, actions, newLevels)\n\n if (errors.length > 0) return\n\n onFinished(clonedLevel)\n }\n\n const permissionChanged = perm => ev => {\n const hasPermission = ev.target.checked\n\n if (hasPermission) {\n clonedLevel.permissions.push(perm)\n } else {\n clonedLevel.permissions = filter(p => !matchPermissions(p, perm))(\n clonedLevel.permissions\n )\n }\n allPermissions = allPermissions\n }\n</script>\n\n<div>\n\n <ErrorsBox {errors} />\n\n <form class=\"uk-form-horizontal\">\n\n <Textbox label=\"Access Level Name\" bind:text={clonedLevel.name} />\n\n <h4 class=\"budibase__title--4\">Permissions</h4>\n\n <Checkbox\n label={'Select All'}\n checked={allPermissionsSelected}\n on:change={ev => {\n permissionMatrix.forEach(permission =>\n permissionChanged(permission.permission)(ev)\n )\n }} />\n {#each permissionMatrix as permission}\n <div class=\"permission-container\">\n <Checkbox\n label={getPermissionName(permission.permission)}\n checked={permission.hasPermission}\n on:change={permissionChanged(permission.permission)} />\n </div>\n {/each}\n\n </form>\n\n <div class=\"uk-modal-footer uk-text-right\">\n <ButtonGroup>\n <ActionButton primary grouped on:click={save}>Save</ActionButton>\n <ActionButton alert grouped on:click={() => onFinished()}>\n Cancel\n </ActionButton>\n </ButtonGroup>\n </div>\n\n</div>\n\n<style>\n .permission-container {\n margin-top: 10px;\n margin-bottom: 10px;\n }\n</style>\n",
113
- "<script>\n export let text = \"\"\n export let label = \"\"\n export let width = \"medium\"\n export let size = \"small\"\n export let margin = true\n export let infoText = \"\"\n export let hasError = false\n export let disabled = false\n</script>\n\n<div class:uk-margin={margin}>\n <label class=\"uk-form-label\">{label}</label>\n <div class=\"uk-form-controls\">\n <input\n class=\"budibase__input\"\n class:uk-form-danger={hasError}\n on:change\n bind:value={text}\n {disabled} />\n </div>\n {#if infoText}\n <div class=\"info-text\">{infoText}</div>\n {/if}\n</div>\n\n<style>\n .info-text {\n font-size: 0.7rem;\n color: var(--secondary50);\n }\n</style>\n",
114
- "<script>\n import { some, includes, filter } from \"lodash/fp\"\n import Textbox from \"../common/Textbox.svelte\"\n import Dropdown from \"../common/Dropdown.svelte\"\n import PropControl from \"./PropControl.svelte\"\n import IconButton from \"../common/IconButton.svelte\"\n\n export let component\n export let onPropChanged = () => {}\n export let components\n\n let errors = []\n const props_to_ignore = [\"_component\", \"_children\", \"_styles\", \"_code\", \"_id\"]\n\n $: componentDef =\n component &&\n components &&\n components.find(({ name }) => name === component._component)\n\n let setProp = (name, value) => {\n onPropChanged(name, value)\n }\n</script>\n\n<div class=\"root\">\n\n <form class=\"uk-form-stacked form-root\">\n {#if componentDef}\n {#each Object.entries(componentDef.props) as [prop_name, prop_def], index}\n <div class=\"prop-container\">\n\n <PropControl\n {setProp}\n {prop_name}\n prop_value={component[prop_name]}\n prop_definition={prop_def}\n {index}\n disabled={false} />\n\n </div>\n {/each}\n {/if}\n </form>\n\n</div>\n\n<style>\n .root {\n font-size: 10pt;\n width: 100%;\n }\n\n .form-root {\n display: flex;\n flex-wrap: wrap;\n }\n\n .prop-container {\n flex: 1 1 auto;\n min-width: 250px;\n }\n</style>\n",
115
- "<script>\n import PropsView from \"./PropsView.svelte\"\n import StateBindingControl from \"./StateBindingControl.svelte\"\n import { store } from \"builderStore\"\n import IconButton from \"components/common/IconButton.svelte\"\n import {\n LayoutIcon,\n PaintIcon,\n TerminalIcon,\n CircleIndicator,\n EventsIcon,\n } from \"components/common/Icons/\"\n import CodeEditor from \"./CodeEditor.svelte\"\n import LayoutEditor from \"./LayoutEditor.svelte\"\n import EventsEditor from \"./EventsEditor\"\n\n let current_view = \"props\"\n let codeEditor\n\n $: component = $store.currentComponentInfo\n $: originalName = component.name\n $: name =\n $store.currentView === \"detail\"\n ? $store.currentPreviewItem.name\n : component._component\n $: description = component.description\n $: components = $store.components\n $: screen_props =\n $store.currentFrontEndType === \"page\"\n ? getProps($store.currentPreviewItem, [\"name\", \"favicon\"])\n : getProps($store.currentPreviewItem, [\"name\", \"description\", \"route\"])\n\n const onPropChanged = store.setComponentProp\n const onStyleChanged = store.setComponentStyle\n\n function getProps(obj, keys) {\n return keys.map((k, i) => [k, obj[k], obj.props._id + i])\n }\n</script>\n\n<div class=\"root\">\n <ul>\n <li>\n <button\n class:selected={current_view === 'props'}\n on:click={() => (current_view = 'props')}>\n <PaintIcon />\n </button>\n </li>\n <li>\n <button\n class:selected={current_view === 'layout'}\n on:click={() => (current_view = 'layout')}>\n <LayoutIcon />\n </button>\n </li>\n {#if !component._component.startsWith('##')}\n <li>\n <button\n class:selected={current_view === 'code'}\n on:click={() => codeEditor && codeEditor.show()}>\n {#if component._code && component._code.trim().length > 0}\n <div class=\"button-indicator\">\n <CircleIndicator />\n </div>\n {/if}\n <TerminalIcon />\n </button>\n </li>\n <li>\n <button\n class:selected={current_view === 'events'}\n on:click={() => (current_view = 'events')}>\n <EventsIcon />\n </button>\n </li>\n {/if}\n </ul>\n <div class=\"component-props-container\">\n\n {#if current_view === 'props'}\n {#if $store.currentView === 'detail'}\n {#each screen_props as [k, v, id] (id)}\n <div class=\"detail-prop\" for={k}>\n <label>{k}:</label>\n <input\n id={k}\n value={v}\n on:input={({ target }) => store.setMetadataProp(k, target.value)} />\n </div>\n {/each}\n <PropsView {component} {components} {onPropChanged} />\n {:else}\n <PropsView {component} {components} {onPropChanged} />\n {/if}\n {:else if current_view === 'layout'}\n <LayoutEditor {onStyleChanged} {component} />\n {:else if current_view === 'events'}\n <EventsEditor {component} {components} {onPropChanged} />\n {/if}\n\n <CodeEditor\n bind:this={codeEditor}\n code={component._code}\n onCodeChanged={store.setComponentCode} />\n\n </div>\n\n</div>\n\n<style>\n .detail-prop {\n height: 40px;\n margin-bottom: 15px;\n display: grid;\n grid-template-rows: 1fr;\n grid-template-columns: 70px 1fr;\n grid-gap: 10px;\n }\n\n .detail-prop label {\n word-wrap: break-word;\n font-size: 12px;\n font-weight: 700;\n color: #163057;\n opacity: 0.6;\n padding-top: 12px;\n margin-bottom: 0;\n }\n\n input {\n height: 30px;\n padding-left: 8px;\n padding-right: 8px;\n border: 1px solid #dbdbdb;\n border-radius: 2px;\n opacity: 0.5;\n }\n\n input:focus {\n outline: 0;\n background-color: #fff;\n color: #666;\n border-color: #1e87f0;\n }\n\n .root {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .title > div:nth-child(1) {\n grid-column-start: name;\n color: var(--secondary100);\n }\n\n .title > div:nth-child(2) {\n grid-column-start: actions;\n }\n\n .component-props-container {\n margin-top: 10px;\n flex: 1 1 auto;\n }\n\n ul {\n list-style: none;\n display: flex;\n justify-content: space-between;\n padding: 0;\n }\n\n li {\n background: none;\n border-radius: 3px;\n width: 48px;\n height: 48px;\n }\n\n li button {\n width: 48px;\n height: 48px;\n background: none;\n border: none;\n border-radius: 3px;\n padding: 7px;\n outline: none;\n cursor: pointer;\n position: relative;\n }\n\n li:nth-last-child(1) {\n margin-right: 0px;\n background: none;\n border-radius: 3px;\n width: 48px;\n height: 48px;\n }\n\n .selected {\n color: var(--button-text);\n background: #f9f9f9 !important;\n width: 48px;\n height: 48px;\n }\n\n .button-indicator {\n position: absolute;\n top: 8px;\n right: 10px;\n color: var(--button-text);\n }\n</style>\n",
116
- "<script>\n import { splitName } from \"./pagesParsing/splitRootComponentName.js\"\n import { store } from \"builderStore\"\n import {\n find,\n sortBy,\n groupBy,\n values,\n filter,\n map,\n uniqBy,\n flatten,\n } from \"lodash/fp\"\n import { ImageIcon, InputIcon, LayoutIcon } from \"components/common/Icons/\"\n import Select from \"components/common/Select.svelte\"\n import Button from \"components/common/PlusButton.svelte\"\n import ConfirmDialog from \"components/common/ConfirmDialog.svelte\"\n import {\n getRecordNodes,\n getIndexNodes,\n getIndexSchema,\n pipe,\n } from \"components/common/core\"\n\n export let toggleTab\n\n let componentLibraries = []\n let current_view = \"text\"\n let selectedComponent = null\n let selectedLib\n let selectTemplateDialog\n let templateInstances = []\n let selectedTemplateInstance\n\n $: templatesByComponent = groupBy(t => t.component)($store.templates)\n $: hierarchy = $store.hierarchy\n $: libraryModules = $store.libraries\n $: standaloneTemplates = pipe(\n templatesByComponent,\n [\n values,\n flatten,\n filter(t => !$store.components.some(c => c.name === t.component)),\n map(t => ({ name: splitName(t.component).componentName, template: t })),\n uniqBy(t => t.name),\n ]\n )\n\n const addRootComponent = (component, allComponents) => {\n const { libName } = splitName(component.name)\n let group = find(r => r.libName === libName)(allComponents)\n\n if (!group) {\n group = {\n libName,\n components: [],\n }\n\n allComponents.push(group)\n }\n\n group.components.push(component)\n }\n\n const onComponentChosen = component => {\n if (component.template) {\n onTemplateChosen(component.template)\n } else {\n store.addChildComponent(component.name)\n toggleTab()\n }\n }\n\n const onTemplateChosen = template => {\n selectedComponent = null\n const { componentName, libName } = splitName(template.name)\n const templateOptions = {\n records: getRecordNodes(hierarchy),\n indexes: getIndexNodes(hierarchy),\n helpers: {\n indexSchema: getIndexSchema(hierarchy),\n },\n }\n templateInstances = libraryModules[libName][componentName](templateOptions)\n if (!templateInstances || templateInstances.length === 0) return\n selectedTemplateInstance = templateInstances[0].name\n selectTemplateDialog.show()\n }\n\n const onTemplateInstanceChosen = () => {\n selectedComponent = null\n const instance = templateInstances.find(\n i => i.name === selectedTemplateInstance\n )\n store.addTemplatedComponent(instance.props)\n toggleTab()\n }\n\n function generate_components_list(components) {\n return ($store.currentFrontEndType === \"page\"\n ? $store.builtins.concat(components)\n : components\n ).concat(standaloneTemplates)\n }\n\n $: {\n const newComponentLibraries = []\n\n for (let comp of sortBy([\"name\"])($store.components)) {\n addRootComponent(comp, newComponentLibraries)\n }\n\n componentLibraries = newComponentLibraries\n if (!selectedLib) selectedLib = newComponentLibraries[0].libName\n }\n\n $: componentLibrary = componentLibraries.find(l => l.libName === selectedLib)\n</script>\n\n<div class=\"root\">\n <Select on:change={e => (selectedLib = e.target.value)}>\n {#each componentLibraries as lib}\n <option value={lib.libName}>{lib.libName}</option>\n {/each}\n </Select>\n\n <div class=\"library-container\">\n <!-- <ul>\n <li>\n <button\n class:selected={current_view === 'text'}\n on:click={() => (current_view = 'text')}>\n <InputIcon />\n </button>\n </li>\n <li>\n <button\n class:selected={current_view === 'layout'}\n on:click={() => (current_view = 'layout')}>\n <LayoutIcon />\n </button>\n </li>\n <li>\n <button\n class:selected={current_view === 'media'}\n on:click={() => (current_view = 'media')}>\n <ImageIcon />\n </button>\n </li>\n </ul> -->\n\n {#if componentLibrary}\n {#each generate_components_list(componentLibrary.components) as component}\n <div class=\"component-container\">\n <div class=\"component\" on:click={() => onComponentChosen(component)}>\n <div class=\"name\">{splitName(component.name).componentName}</div>\n {#if (component.presets || templatesByComponent[component.name]) && component.name === selectedComponent}\n <ul class=\"preset-menu\">\n {#if component.presets}\n <span>{splitName(component.name).componentName} Presets</span>\n {#each Object.keys(component.presets) as preset}\n <li\n on:click|stopPropagation={() => onComponentChosen(component, preset)}>\n {preset}\n </li>\n {/each}\n {/if}\n {#if templatesByComponent[component.name]}\n <span>\n {splitName(component.name).componentName} Templates\n </span>\n {#each templatesByComponent[component.name] as template}\n <li\n on:click|stopPropagation={() => onTemplateChosen(template)}>\n {template.description}\n </li>\n {/each}\n {/if}\n </ul>\n {/if}\n </div>\n {#if component.presets || templatesByComponent[component.name]}\n <Button\n on:click={() => {\n selectedComponent = selectedComponent ? null : component.name\n }}>\n <span\n class=\"open-presets\"\n class:open={selectedComponent === component.name}>\n ...\n </span>\n </Button>\n {/if}\n </div>\n {/each}\n {/if}\n </div>\n\n</div>\n\n<ConfirmDialog\n bind:this={selectTemplateDialog}\n title=\"Choose Template\"\n onCancel={() => (selectedComponent = null)}\n onOk={onTemplateInstanceChosen}>\n {#each templateInstances.map(i => i.name) as instance}\n <div class=\"uk-margin uk-grid-small uk-child-width-auto uk-grid\">\n <label>\n <input\n class=\"uk-radio\"\n type=\"radio\"\n bind:group={selectedTemplateInstance}\n value={instance} />\n <span class=\"template-instance-label\">{instance}</span>\n </label>\n </div>\n {/each}\n</ConfirmDialog>\n\n<style>\n .root {\n display: flex;\n flex-direction: column;\n }\n\n .library-container {\n padding: 0 0 10px 0;\n flex: 1 1 auto;\n min-height: 0px;\n margin-top: 20px;\n }\n\n .component-container {\n display: flex;\n align-items: center;\n }\n\n .component {\n position: relative;\n padding: 0 15px;\n cursor: pointer;\n border: 1px solid #d8d8d8;\n border-radius: 2px;\n margin: 5px 0;\n height: 40px;\n box-sizing: border-box;\n color: #000333;\n display: flex;\n align-items: center;\n flex: 1;\n margin-right: 5px;\n }\n\n .component:hover {\n background-color: var(--lightslate);\n }\n\n .component > .name {\n color: #000333;\n display: inline-block;\n font-size: 12px;\n opacity: 0.8;\n }\n\n ul {\n list-style: none;\n display: flex;\n padding: 0;\n }\n\n .preset-menu {\n flex-direction: column;\n position: absolute;\n top: 25px;\n left: 0;\n right: 0;\n z-index: 1;\n background: #fafafa;\n padding: 10px;\n border-radius: 2px;\n color: var(--secondary80);\n }\n\n .preset-menu > span {\n font-size: 12px;\n text-transform: uppercase;\n margin-top: 5px;\n }\n\n .preset-menu li {\n font-size: 14px;\n margin-top: 13px;\n }\n\n .preset-menu li:hover {\n font-weight: bold;\n }\n\n li {\n margin-right: 20px;\n background: none;\n border-radius: 5px;\n }\n\n /* li button {\n width: 100%;\n height: 100%;\n background: none;\n border: none;\n border-radius: 5px;\n padding: 12px;\n outline: none;\n cursor: pointer;\n } */\n\n /* .selected {\n color: var(--button-text);\n background: var(--background-button) !important;\n } */\n\n .open {\n color: rgba(0, 85, 255, 1);\n }\n\n .template-instance-label {\n margin-left: 20px;\n }\n</style>\n",
117
- "<script>\n import getIcon from \"./icon\"\n\n export let icon\n export let value\n</script>\n\n<div class=\"select-container\">\n {#if icon}\n <i class={icon} />\n {/if}\n <select class:adjusted={icon} on:change bind:value>\n <slot />\n </select>\n <span class=\"arrow\">\n {@html getIcon('chevron-down', '24')}\n </span>\n</div>\n\n<style>\n .select-container {\n font-size: 0.9rem;\n color: var(--secondary50);\n font-weight: bold;\n position: relative;\n max-width: 300px;\n min-width: 200px;\n }\n\n .adjusted {\n padding-left: 2.5em;\n }\n\n i {\n position: absolute;\n left: 8px;\n top: 8px;\n }\n\n select {\n height: 40px;\n display: block;\n font-family: sans-serif;\n font-weight: 400;\n color: #000333;\n padding: 0 2.6em 0em 1.4em;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n margin: 0;\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n background: var(--lightslate);\n }\n\n .arrow {\n position: absolute;\n right: 10px;\n bottom: 0;\n margin: auto;\n width: 30px;\n height: 30px;\n pointer-events: none;\n color: var(--primary100);\n }\n</style>\n",
118
- "<script>\n import { JavaScriptIcon } from \"../common/Icons\"\n // todo: use https://ace.c9.io\n export let text = \"\"\n</script>\n\n<textarea class=\"uk-textarea\" bind:value={text} />\n\n<style>\n textarea {\n padding: 10px;\n margin-top: 5px;\n margin-bottom: 10px;\n background: var(--secondary80);\n color: var(--white);\n font-family: \"Courier New\", Courier, monospace;\n width: 95%;\n height: 100px;\n border-radius: 5px;\n }\n</style>\n",
119
- "<script>\n import Dropdown from \"../common/Dropdown.svelte\"\n import Textbox from \"../common/Textbox.svelte\"\n import Button from \"../common/Button.svelte\"\n import ButtonGroup from \"../common/ButtonGroup.svelte\"\n import NumberBox from \"../common/NumberBox.svelte\"\n import ValuesList from \"../common/ValuesList.svelte\"\n import ErrorsBox from \"../common/ErrorsBox.svelte\"\n import Checkbox from \"../common/Checkbox.svelte\"\n import ActionButton from \"../common/ActionButton.svelte\"\n import DatePicker from \"../common/DatePicker.svelte\"\n import {\n cloneDeep,\n keys,\n isNumber,\n includes,\n map,\n isBoolean,\n } from \"lodash/fp\"\n import {\n allTypes,\n validate,\n getPotentialReferenceIndexes,\n getDefaultTypeOptions,\n getNode,\n getPotentialReverseReferenceIndexes,\n } from \"../common/core\"\n\n export let field\n export let allFields\n export let onFinished = () => {}\n export let store\n\n let errors = []\n let clonedField = cloneDeep(field)\n\n $: isNew = !!field && field.name.length === 0\n\n $: possibleReferenceIndexes = getPotentialReferenceIndexes(\n store.hierarchy,\n store.currentNode\n )\n\n $: selectedReverseRefIndex = !clonedField.typeOptions.indexNodeKey\n ? \"\"\n : getNode(store.hierarchy, clonedField.typeOptions.indexNodeKey)\n\n $: possibleReverseReferenceIndexes = !selectedReverseRefIndex\n ? []\n : getPotentialReverseReferenceIndexes(\n store.hierarchy,\n selectedReverseRefIndex\n )\n\n const typeChanged = ev =>\n (clonedField.typeOptions = getDefaultTypeOptions(ev.detail))\n\n const save = () => {\n errors = validate.field(allFields)(clonedField)\n if (errors.length > 0) return\n field.typeOptions = cloneDeep(clonedField.typeOptions)\n onFinished({ ...field, ...clonedField })\n }\n</script>\n\n<div class=\"root\">\n\n <ErrorsBox {errors} />\n\n <form class=\"uk-form-stacked\">\n <Textbox label=\"Name\" bind:text={clonedField.name} />\n <Dropdown\n label=\"Type\"\n bind:selected={clonedField.type}\n options={keys(allTypes)}\n on:change={typeChanged} />\n\n <Textbox label=\"Label\" bind:text={clonedField.label} />\n\n {#if clonedField.type === 'string'}\n <NumberBox\n label=\"Max Length\"\n bind:value={clonedField.typeOptions.maxLength} />\n <ValuesList\n label=\"Categories\"\n bind:values={clonedField.typeOptions.values} />\n <Checkbox\n label=\"Declared Values Only\"\n bind:checked={clonedField.typeOptions.allowDeclaredValuesOnly} />\n {:else if clonedField.type === 'bool'}\n <Checkbox\n label=\"Allow Null\"\n bind:checked={clonedField.typeOptions.allowNulls} />\n {:else if clonedField.type === 'datetime'}\n <DatePicker\n label=\"Min Value\"\n bind:value={clonedField.typeOptions.minValue} />\n <DatePicker\n label=\"Max Value\"\n bind:value={clonedField.typeOptions.maxValue} />\n {:else if clonedField.type === 'number'}\n <NumberBox\n label=\"Min Value\"\n bind:value={clonedField.typeOptions.minValue} />\n <NumberBox\n label=\"Max Value\"\n bind:value={clonedField.typeOptions.maxValue} />\n <NumberBox\n label=\"Decimal Places\"\n bind:value={clonedField.typeOptions.decimalPlaces} />\n {:else if clonedField.type === 'reference'}\n <Dropdown\n label=\"Lookup Index\"\n options={possibleReferenceIndexes}\n valueMember={n => n.nodeKey()}\n textMember={n => n.name}\n bind:selected={clonedField.typeOptions.indexNodeKey} />\n\n <Dropdown\n label=\"Reverse Reference Index\"\n options={possibleReverseReferenceIndexes}\n multiple=\"true\"\n valueMember={n => n.nodeKey()}\n textMember={n => n.name}\n bind:selected={clonedField.typeOptions.reverseIndexNodeKeys} />\n\n <Textbox\n label=\"Display Value\"\n bind:text={clonedField.typeOptions.displayValue} />\n {:else if clonedField.type.startsWith('array')}\n <NumberBox\n label=\"Min Length\"\n bind:value={clonedField.typeOptions.minLength} />\n <NumberBox\n label=\"Max Length\"\n bind:value={clonedField.typeOptions.maxLength} />\n {/if}\n </form>\n\n <footer>\n <ActionButton primary on:click={save}>Save</ActionButton>\n <ActionButton alert on:click={() => onFinished(false)}>Cancel</ActionButton>\n </footer>\n</div>\n\n<style>\n footer {\n position: absolute;\n padding: 20px;\n width: 100%;\n bottom: 0;\n left: 0;\n background: #fafafa;\n }\n</style>\n",
120
- "<script>\n export let checked = false\n export let label = \"\"\n</script>\n\n<input class=\"uk-checkbox\" type=\"checkbox\" bind:checked on:change />\n{label}\n\n<style>\n input {\n margin-right: 7px;\n }\n</style>\n",
121
- "<script>\n import Textbox from \"components/common/Textbox.svelte\"\n import Button from \"components/common/Button.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import ButtonGroup from \"components/common/ButtonGroup.svelte\"\n import { cloneDeep, filter, keys, map, isUndefined } from \"lodash/fp\"\n import ErrorsBox from \"components/common/ErrorsBox.svelte\"\n import { validateActions, pipe } from \"components/common/core\"\n import getIcon from \"components/common/icon\"\n\n export let action\n export let onFinished = action => {}\n export let allActions\n\n let optKey = \"\"\n let optValue = \"\"\n\n let clonedAction = cloneDeep(action)\n let initialOptions = pipe(action.initialOptions, [\n keys,\n map(k => ({ key: k, value: action.initialOptions[k] })),\n ])\n let errors = []\n\n const addNewOption = () => {\n if (\n optKey &&\n optValue &&\n isUndefined(clonedAction.initialOptions[optKey])\n ) {\n clonedAction.initialOptions[optKey] = optValue\n initialOptions = [\n ...initialOptions,\n {\n key: optKey,\n value: optValue,\n },\n ]\n optKey = \"\"\n optValue = \"\"\n }\n }\n\n const removeOption = opt => {\n if (opt) {\n delete clonedAction.initialOptions[opt.key]\n initialOptions = pipe(initialOptions, [filter(o => o.key !== opt.key)])\n }\n }\n\n const save = () => {\n const newActionsList = [\n ...pipe(allActions, [filter(a => a !== action)]),\n clonedAction,\n ]\n\n errors = pipe(newActionsList, [validateActions, map(e => e.error)])\n\n if (errors.length === 0) onFinished(clonedAction)\n }\n\n const cancel = () => {\n onFinished()\n }\n</script>\n\n<div class=\"root\">\n\n <ErrorsBox {errors} />\n\n <form class=\"uk-form-horizontal\">\n\n <Textbox label=\"Name\" bind:text={clonedAction.name} />\n <Textbox\n label=\"Behaviour Source\"\n bind:text={clonedAction.behaviourSource} />\n <Textbox label=\"Behaviour\" bind:text={clonedAction.behaviourName} />\n\n </form>\n\n <div class=\" uk-form-stacked\" style=\"margin-bottom: 20px\">\n <label class=\"uk-form-label\">Default Options</label>\n <div class=\"uk-grid-small\" uk-grid>\n <input\n class=\"uk-input uk-width-1-4 uk-margin-right\"\n placeholder=\"key\"\n bind:value={optKey} />\n <input\n class=\"uk-input uk-width-1-4 uk-margin-right\"\n placeholder=\"value\"\n bind:value={optValue} />\n <ActionButton primary on:click={addNewOption}>Add</ActionButton>\n </div>\n <div style=\"margin-top: 10px\">\n {#each initialOptions as option}\n <span class=\"option-container\">\n {option.key} : {option.value}\n <span\n style=\"font-size:10pt; cursor: pointer\"\n on:click={() => removeOption(option)}>\n {@html getIcon('trash-2')}\n </span>\n </span>\n {/each}\n </div>\n </div>\n\n <div class=\"uk-modal-footer uk-text-right\">\n <ButtonGroup>\n <ActionButton primary grouped on:click={save}>Save</ActionButton>\n <ActionButton alert grouped on:click={cancel}>Cancel</ActionButton>\n </ButtonGroup>\n </div>\n</div>\n\n<style>\n .root {\n padding: 2rem;\n border-radius: 2rem;\n }\n\n .uk-grid-small {\n padding: 1rem;\n }\n\n .option-container {\n border-style: dotted;\n border-width: 1px;\n border-color: var(--primary75);\n padding: 3px;\n margin-right: 5px;\n }\n</style>\n",
122
- "<script>\n import IconButton from \"../common/IconButton.svelte\"\n import Input from \"../common/Input.svelte\"\n import PropertyCascader from \"./PropertyCascader\"\n import { isBinding, getBinding, setBinding } from \"../common/binding\"\n\n export let value = \"\"\n export let onChanged = () => {}\n export let type = \"\"\n export let options = []\n</script>\n\n<div class=\"unbound-container\">\n {#if type === 'bool'}\n <div>\n <IconButton\n icon={value == true ? 'check-square' : 'square'}\n size=\"19\"\n on:click={() => onChanged(!value)} />\n </div>\n {:else if type === 'options'}\n <select\n class=\"uk-select uk-form-small\"\n {value}\n on:change={ev => onChanged(ev.target.value)}>\n {#each options || [] as option}\n <option value={option}>{option}</option>\n {/each}\n </select>\n {:else}\n <PropertyCascader {onChanged} {value} />\n {/if}\n</div>\n\n<style>\n .unbound-container {\n display: flex;\n }\n\n .bound-header > div:nth-child(1) {\n flex: 1 0 auto;\n width: 30px;\n color: var(--secondary50);\n padding-left: 5px;\n }\n</style>\n",
123
- "<script>\n import Checkbox from \"../common/Checkbox.svelte\"\n import Textbox from \"../common/Textbox.svelte\"\n import Dropdown from \"../common/Dropdown.svelte\"\n import StateBindingControl from \"./StateBindingControl.svelte\"\n\n export let setProp = () => {}\n export let index\n export let prop_name\n export let prop_value\n export let prop_definition = {}\n\n const setComponentProp = props => {\n setProp(propDef.____name, props)\n }\n</script>\n\n<div class=\"root\">\n {#if prop_definition.type !== 'event'}\n <h5>{prop_name}</h5>\n <StateBindingControl\n value={prop_value}\n type={prop_definition.type}\n options={prop_definition.options}\n onChanged={v => setProp(prop_name, v)} />\n {/if}\n</div>\n\n<style>\n .root {\n height: 40px;\n margin-bottom: 15px;\n display: grid;\n grid-template-rows: 1fr;\n grid-template-columns: 70px 1fr;\n grid-gap: 10px;\n align-items: baseline;\n }\n\n h5 {\n word-wrap: break-word;\n font-size: 12px;\n font-weight: 400;\n color: #000333;\n opacity: 0.8;\n padding-top: 12px;\n margin-bottom: 0;\n }\n</style>\n",
124
- "<script>\n import { store } from \"builderStore\"\n import UIkit from \"uikit\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import ButtonGroup from \"components/common/ButtonGroup.svelte\"\n import CodeMirror from \"codemirror\"\n import \"codemirror/mode/javascript/javascript.js\"\n\n export let onCodeChanged\n export let code\n\n export const show = () => {\n UIkit.modal(codeModal).show()\n }\n\n let codeModal\n let editor\n let cmInstance\n\n $: currentCode = code\n $: originalCode = code\n $: {\n if (editor) {\n if (!cmInstance) {\n cmInstance = CodeMirror.fromTextArea(editor, {\n mode: \"javascript\",\n lineNumbers: false,\n lineWrapping: true,\n smartIndent: true,\n matchBrackets: true,\n readOnly: false,\n })\n cmInstance.on(\"change\", () => (currentCode = cmInstance.getValue()))\n }\n cmInstance.focus()\n cmInstance.setValue(code || \"\")\n }\n }\n\n const cancel = () => {\n UIkit.modal(codeModal).hide()\n currentCode = originalCode\n }\n\n const save = () => {\n originalCode = currentCode\n onCodeChanged(currentCode)\n UIkit.modal(codeModal).hide()\n }\n</script>\n\n<div bind:this={codeModal} uk-modal>\n <div class=\"uk-modal-dialog\" uk-overflow-auto>\n\n <div class=\"uk-modal-header\">\n <h3>Code</h3>\n </div>\n\n <div class=\"uk-modal-body uk-form-horizontal\">\n\n <p>\n Use the code box below to control how this component is displayed, with\n javascript.\n </p>\n\n <div>\n <div class=\"editor-code-surround\">\n function(render, context, state, route) {'{'}\n </div>\n <div class=\"editor\">\n <textarea bind:this={editor} />\n </div>\n <div class=\"editor-code-surround\">{'}'}</div>\n </div>\n </div>\n\n <div class=\"uk-modal-footer\">\n <ButtonGroup>\n <ActionButton primary on:click={save}>Save</ActionButton>\n <ActionButton alert on:click={cancel}>Close</ActionButton>\n </ButtonGroup>\n </div>\n </div>\n</div>\n\n<style>\n h3 {\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 700;\n color: #8997ab;\n margin-bottom: 10px;\n }\n\n p {\n font-size: 12px;\n color: #333;\n margin-top: 0;\n }\n\n .editor {\n border-style: dotted;\n border-width: 1px;\n border-color: gainsboro;\n padding: 10px 30px;\n }\n\n .editor-code-surround {\n font-family: \"Courier New\", Courier, monospace;\n }\n</style>\n",
125
- "<script>\n import InputGroup from \"../common/Inputs/InputGroup.svelte\"\n import LayoutTemplateControls from \"./LayoutTemplateControls.svelte\"\n\n export let onStyleChanged = () => {}\n export let component\n\n const tbrl = [\n { placeholder: \"T\" },\n { placeholder: \"R\" },\n { placeholder: \"B\" },\n { placeholder: \"L\" },\n ]\n\n const se = [{ placeholder: \"START\" }, { placeholder: \"END\" }]\n\n const single = [{ placeholder: \"\" }]\n\n $: layout = {\n ...component._styles.position,\n ...component._styles.layout,\n }\n\n $: layouts = {\n templaterows: [\"Grid Rows\", single],\n templatecolumns: [\"Grid Columns\", single],\n }\n\n $: display = {\n direction: [\"Direction\", single],\n align: [\"Align\", single],\n justify: [\"Justify\", single],\n }\n\n $: positions = {\n column: [\"Column\", se],\n row: [\"Row\", se],\n }\n\n $: spacing = {\n margin: [\"Margin\", tbrl, \"small\"],\n padding: [\"Padding\", tbrl, \"small\"],\n }\n\n $: size = {\n height: [\"Height\", single],\n width: [\"Width\", single],\n }\n\n $: zindex = {\n zindex: [\"Z-Index\", single],\n }\n\n const newValue = n => Array(n).fill(\"\")\n</script>\n\n<h3>Layout</h3>\n<div class=\"layout-pos\">\n {#each Object.entries(display) as [key, [name, meta, size]] (component._id + key)}\n <div class=\"grid\">\n <h5>{name}:</h5>\n <LayoutTemplateControls\n onStyleChanged={_value => onStyleChanged('layout', key, _value)}\n values={layout[key] || newValue(meta.length)}\n propertyName={name}\n {meta}\n {size}\n type=\"text\" />\n </div>\n {/each}\n</div>\n\n<!-- <h4>Positioning</h4>\n<div class=\"layout-pos\">\n {#each Object.entries(positions) as [key, [name, meta, size]] (component._id + key)}\n <div class=\"grid\">\n <h5>{name}:</h5>\n <InputGroup\n onStyleChanged={_value => onStyleChanged('position', key, _value)}\n values={layout[key] || newValue(meta.length)}\n {meta}\n {size} />\n </div>\n {/each}\n</div> -->\n\n<h3>Spacing</h3>\n<div class=\"layout-spacing\">\n {#each Object.entries(spacing) as [key, [name, meta, size]] (component._id + key)}\n <div class=\"grid\">\n <h5>{name}:</h5>\n <InputGroup\n onStyleChanged={_value => onStyleChanged('position', key, _value)}\n values={layout[key] || newValue(meta.length)}\n {meta}\n {size}\n type=\"text\" />\n </div>\n {/each}\n</div>\n\n<h3>Size</h3>\n<div class=\"layout-layer\">\n {#each Object.entries(size) as [key, [name, meta, size]] (component._id + key)}\n <div class=\"grid\">\n <h5>{name}:</h5>\n <InputGroup\n onStyleChanged={_value => onStyleChanged('position', key, _value)}\n values={layout[key] || newValue(meta.length)}\n type=\"text\"\n {meta}\n {size} />\n </div>\n {/each}\n</div>\n\n<h3>Order</h3>\n<div class=\"layout-layer\">\n {#each Object.entries(zindex) as [key, [name, meta, size]] (component._id + key)}\n <div class=\"grid\">\n <h5>{name}:</h5>\n <InputGroup\n onStyleChanged={_value => onStyleChanged('position', key, _value)}\n values={layout[key] || newValue(meta.length)}\n {meta}\n {size} />\n </div>\n {/each}\n</div>\n\n<style>\n h3 {\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 700;\n color: #000333;\n opacity: 0.6;\n margin-bottom: 10px;\n }\n\n h4 {\n text-transform: uppercase;\n font-size: 10px;\n font-weight: 600;\n color: #000333;\n opacity: 0.4;\n letter-spacing: 1px;\n margin-bottom: 10px;\n }\n\n h5 {\n font-size: 12px;\n font-weight: 400;\n color: #000333;\n opacity: 0.8;\n padding-top: 12px;\n margin-bottom: 0;\n }\n\n div > div {\n display: grid;\n grid-template-rows: 1fr;\n grid-gap: 10px;\n height: 40px;\n margin-bottom: 15px;\n }\n\n .grid {\n grid-template-columns: 70px 2fr;\n }\n</style>\n",
126
- "<button on:click>\n <slot>+</slot>\n</button>\n\n<style>\n button {\n cursor: pointer;\n outline: none;\n border: none;\n border-radius: 5px;\n min-width: 1.8rem;\n min-height: 1.8rem;\n padding-bottom: 10px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n font-size: 1.2rem;\n font-weight: 700;\n color: var(--secondary100);\n }\n</style>\n",
127
- "<script>\n import { onMount } from \"svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import {\n tap,\n get,\n find,\n last,\n compose,\n flatten,\n map,\n remove,\n keys,\n takeRight,\n } from \"lodash/fp\"\n import Select from \"components/common/Select.svelte\"\n import { getIndexSchema } from \"components/common/core\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import TablePagination from \"./TablePagination.svelte\"\n import { DeleteRecordModal } from \"./modals\"\n import * as api from \"./api\"\n\n export let selectRecord\n\n const ITEMS_PER_PAGE = 10\n // Internal headers we want to hide from the user\n const INTERNAL_HEADERS = [\"key\", \"sortKey\", \"type\", \"id\", \"isNew\"]\n\n let modalOpen = false\n let data = []\n let headers = []\n let views = []\n let currentPage = 0\n\n $: views = $backendUiStore.selectedRecord\n ? childViewsForRecord($store.hierarchy)\n : $store.hierarchy.indexes\n\n $: currentAppInfo = {\n appname: $store.appname,\n instanceId: $backendUiStore.selectedDatabase.id,\n }\n\n $: fetchRecordsForView(\n $backendUiStore.selectedView,\n $backendUiStore.selectedDatabase\n ).then(records => {\n data = records || []\n headers = hideInternalHeaders($backendUiStore.selectedView)\n })\n\n $: paginatedData = data.slice(\n currentPage * ITEMS_PER_PAGE,\n currentPage * ITEMS_PER_PAGE + ITEMS_PER_PAGE\n )\n\n const getSchema = getIndexSchema($store.hierarchy)\n\n const childViewsForRecord = compose(\n flatten,\n map(\"indexes\"),\n get(\"children\")\n )\n\n const hideInternalHeaders = compose(\n remove(headerName => INTERNAL_HEADERS.includes(headerName)),\n map(get(\"name\")),\n getSchema\n )\n\n async function fetchRecordsForView(view, instance) {\n if (!view || !view.name) return\n\n const viewName = $backendUiStore.selectedRecord\n ? `${$backendUiStore.selectedRecord.key}/${view.name}`\n : view.name\n\n return await api.fetchDataForView(viewName, {\n appname: $store.appname,\n instanceId: instance.id,\n })\n }\n\n function drillIntoRecord(record) {\n backendUiStore.update(state => {\n state.breadcrumbs = [...state.breadcrumbs, record.type, record.id]\n state.selectedRecord = record\n state.selectedView = childViewsForRecord($store.hierarchy)[0]\n return state\n })\n }\n\n onMount(() => {\n if (views.length) {\n backendUiStore.actions.views.select(views[0])\n }\n })\n</script>\n\n<section>\n <div class=\"table-controls\">\n <h4 class=\"budibase__title--3\">\n {takeRight(2, $backendUiStore.breadcrumbs).join(' / ')}\n </h4>\n <Select icon=\"ri-eye-line\" bind:value={$backendUiStore.selectedView}>\n {#each views as view}\n <option value={view}>{view.name}</option>\n {/each}\n </Select>\n </div>\n <table class=\"uk-table\">\n <thead>\n <tr>\n <th>Edit</th>\n {#each headers as header}\n <th>{header}</th>\n {/each}\n </tr>\n </thead>\n <tbody>\n {#if paginatedData.length === 0}\n <div class=\"no-data\">No Data.</div>\n {/if}\n {#each paginatedData as row}\n <tr class=\"hoverable\">\n <td>\n <div class=\"uk-inline\">\n <i class=\"ri-more-line\" />\n <div uk-dropdown=\"mode: click\">\n <ul class=\"uk-nav uk-dropdown-nav\">\n <li>\n <div on:click={() => drillIntoRecord(row)}>View</div>\n </li>\n <li\n on:click={() => {\n selectRecord(row)\n backendUiStore.actions.modals.show('RECORD')\n }}>\n <div>Edit</div>\n </li>\n <li>\n <div\n on:click={() => {\n selectRecord(row)\n backendUiStore.actions.modals.show('DELETE_RECORD')\n }}>\n Delete\n </div>\n </li>\n </ul>\n </div>\n </div>\n </td>\n {#each headers as header}\n <td>{row[header]}</td>\n {/each}\n </tr>\n {/each}\n </tbody>\n </table>\n <TablePagination\n {data}\n bind:currentPage\n pageItemCount={data.length}\n {ITEMS_PER_PAGE} />\n</section>\n\n<style>\n table {\n border: 1px solid #ccc;\n background: #fff;\n border-radius: 3px;\n border-collapse: collapse;\n }\n\n thead {\n background: var(--background-button);\n }\n\n thead th {\n color: var(--button-text);\n text-transform: capitalize;\n font-weight: 500;\n }\n\n tbody tr {\n border-bottom: 1px solid #ccc;\n transition: 0.3s background-color;\n color: var(--darkslate);\n }\n\n tbody tr:hover {\n background: #fafafa;\n }\n\n .table-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .ri-more-line:hover,\n .uk-dropdown-nav li:hover {\n cursor: pointer;\n }\n\n .no-data {\n padding: 20px;\n }\n</style>\n",
128
- "<script>\n import Modal from \"components/common/Modal.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import * as api from \"../api\"\n\n export let record\n\n $: currentAppInfo = {\n appname: $store.appname,\n instanceId: $backendUiStore.selectedDatabase.id,\n }\n\n function onClosed() {\n backendUiStore.actions.modals.hide()\n }\n</script>\n\n<section>\n <heading>\n <i class=\"ri-information-line alert\" />\n <h4 class=\"budibase__title--4\">Delete Record</h4>\n </heading>\n <p>\n Are you sure you want to delete this record? All of your data will be\n permanently removed. This action cannot be undone.\n </p>\n <div class=\"modal-actions\">\n <ActionButton on:click={onClosed}>Cancel</ActionButton>\n <ActionButton\n alert\n on:click={async () => {\n await api.deleteRecord(record, currentAppInfo)\n backendUiStore.actions.records.delete(record)\n onClosed()\n }}>\n Delete\n </ActionButton>\n </div>\n</section>\n\n<style>\n .alert {\n color: rgba(255, 0, 31, 1);\n background: #fafafa;\n padding: 5px;\n }\n\n .modal-actions {\n padding: 10px;\n position: absolute;\n bottom: 0;\n left: 0;\n background: #fafafa;\n border-top: 1px solid #ccc;\n width: 100%;\n }\n\n heading {\n display: flex;\n align-items: center;\n }\n\n h4 {\n margin: 0 0 0 10px;\n }\n</style>\n",
129
- "<script>\n import Modal from \"components/common/Modal.svelte\"\n import { store } from \"builderStore\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import * as api from \"../api\"\n\n export let onClosed\n\n let databaseName\n\n async function createDatabase() {\n const response = await api.createDatabase($store.appId, databaseName)\n store.createDatabaseForApp(response)\n onClosed()\n }\n</script>\n\n<section>\n Database Name\n <input class=\"uk-input\" type=\"text\" bind:value={databaseName} />\n <footer>\n <ActionButton alert on:click={onClosed}>Cancel</ActionButton>\n <ActionButton disabled={!databaseName} on:click={createDatabase}>\n Save\n </ActionButton>\n </footer>\n</section>\n\n<style>\n footer {\n position: absolute;\n padding: 20px;\n width: 100%;\n bottom: 0;\n left: 0;\n background: #fafafa;\n }\n</style>\n",
130
- "<script>\n import Modal from \"components/common/Modal.svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import * as api from \"../api\"\n\n export let onClosed\n\n let username\n let password\n let accessLevels = []\n\n $: valid = username && password && accessLevels.length\n $: currentAppInfo = {\n appname: $store.appname,\n instanceId: $backendUiStore.selectedDatabase.id,\n }\n\n async function createUser() {\n const user = {\n name: username,\n accessLevels,\n enabled: true,\n temporaryAccessId: \"\",\n }\n const response = await api.createUser(password, user, currentAppInfo)\n backendUiStore.actions.users.save(user)\n onClosed()\n }\n</script>\n\n<form class=\"uk-form-stacked\">\n <label class=\"uk-form-label\" for=\"form-stacked-text\">Username</label>\n <input class=\"uk-input\" type=\"text\" bind:value={username} />\n <label class=\"uk-form-label\" for=\"form-stacked-text\">Password</label>\n <input class=\"uk-input\" type=\"password\" bind:value={password} />\n <label class=\"uk-form-label\" for=\"form-stacked-text\">Access Levels</label>\n <select multiple bind:value={accessLevels}>\n {#each $store.accessLevels.levels as level}\n <option value={level.name}>{level.name}</option>\n {/each}\n </select>\n <footer>\n <ActionButton alert on:click={onClosed}>Cancel</ActionButton>\n <ActionButton disabled={!valid} on:click={createUser}>Save</ActionButton>\n </footer>\n</form>\n\n<style>\n footer {\n position: absolute;\n padding: 20px;\n width: 100%;\n bottom: 0;\n left: 0;\n background: #fafafa;\n }\n select {\n width: 100%;\n }\n option {\n padding: 10px;\n }\n</style>\n",
131
- "<script>\n import { onMount } from \"svelte\"\n import { store, backendUiStore } from \"builderStore\"\n import { compose, map, get, flatten } from \"lodash/fp\"\n import Modal from \"components/common/Modal.svelte\"\n import ActionButton from \"components/common/ActionButton.svelte\"\n import Select from \"components/common/Select.svelte\"\n import {\n getNewRecord,\n joinKey,\n getExactNodeForKey,\n } from \"components/common/core\"\n import RecordFieldControl from \"./RecordFieldControl.svelte\"\n import * as api from \"../api\"\n import ErrorsBox from \"components/common/ErrorsBox.svelte\"\n\n export let record\n export let onClosed\n\n let errors = []\n\n const childModelsForModel = compose(flatten, map(\"children\"), get(\"children\"))\n\n $: currentAppInfo = {\n appname: $store.appname,\n instanceId: $backendUiStore.selectedDatabase.id,\n }\n $: models = $backendUiStore.selectedRecord\n ? childModelsForModel($store.hierarchy)\n : $store.hierarchy.children\n\n let selectedModel\n $: {\n if (record) {\n selectedModel = getExactNodeForKey($store.hierarchy)(record.key)\n } else {\n selectedModel = selectedModel || models[0]\n }\n }\n\n $: modelFields = selectedModel ? selectedModel.fields : []\n\n function getCurrentCollectionKey(selectedRecord) {\n return selectedRecord\n ? joinKey(selectedRecord.key, selectedModel.collectionName)\n : joinKey(selectedModel.collectionName)\n }\n\n $: editingRecord =\n record ||\n editingRecord ||\n getNewRecord(\n selectedModel,\n getCurrentCollectionKey($backendUiStore.selectedRecord)\n )\n\n function closed() {\n editingRecord = null\n onClosed()\n }\n\n async function saveRecord() {\n const recordResponse = await api.saveRecord(editingRecord, currentAppInfo)\n backendUiStore.update(state => {\n state.selectedView = state.selectedView\n return state\n })\n closed()\n }\n</script>\n\n<div>\n <h4 class=\"budibase__title--4\">Create / Edit Record</h4>\n <ErrorsBox {errors} />\n <div class=\"actions\">\n <form class=\"uk-form-stacked\">\n {#if !record}\n <div class=\"uk-margin\">\n <label class=\"uk-form-label\" for=\"form-stacked-text\">Model</label>\n <Select bind:value={selectedModel}>\n {#each models as model}\n <option value={model}>{model.name}</option>\n {/each}\n </Select>\n </div>\n {/if}\n {#each modelFields || [] as field}\n <RecordFieldControl record={editingRecord} {field} {errors} />\n {/each}\n </form>\n <footer>\n <ActionButton alert on:click={onClosed}>Cancel</ActionButton>\n <ActionButton on:click={saveRecord}>Save</ActionButton>\n </footer>\n </div>\n</div>\n\n<style>\n footer {\n position: absolute;\n padding: 20px;\n width: 100%;\n bottom: 0;\n left: 0;\n background: #fafafa;\n }\n</style>\n",
132
- "<script>\n import { join } from \"lodash/fp\"\n\n export let values\n export let label\n\n const inputChanged = ev => {\n try {\n values = ev.target.value.split(\"\\n\")\n } catch (_) {\n values = []\n }\n }\n\n $: valuesText = join(\"\\n\")(values)\n</script>\n\n<div class=\"uk-margin\">\n <label class=\"uk-form-label\">{label}</label>\n <div class=\"uk-form-controls\">\n <textarea value={valuesText} on:change={inputChanged} />\n </div>\n</div>\n\n<style>\n textarea {\n width: 300px;\n height: 100px;\n }\n</style>\n",
133
- "<script>\n export let value = \"\"\n</script>\n\n<input type=\"text\" on:change bind:value />\n\n<style>\n input {\n display: block;\n font-size: 14px;\n font-family: sans-serif;\n font-weight: 500;\n color: #163057;\n line-height: 1.3;\n padding: 1em 2.6em 0.9em 1.4em;\n width: 100%;\n max-width: 100%;\n box-sizing: border-box;\n margin: 0;\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n background: #fff;\n border: 1px solid #ccc;\n height: 35px;\n }\n</style>\n",
134
- "<script>\n import PlusButton from \"../common/PlusButton.svelte\"\n\n export let meta = []\n export let size = \"\"\n export let values = []\n export let propertyName\n export let onStyleChanged = () => {}\n\n let selectedLayoutValues = values.map(v => v)\n\n $: onStyleChanged(selectedLayoutValues)\n\n const PROPERTY_OPTIONS = {\n Direction: {\n vertical: [\"column\", \"ri-arrow-up-down-line\"],\n horizontal: [\"row\", \"ri-arrow-left-right-line\"],\n },\n Align: {\n left: [\"flex-start\", \"ri-layout-bottom-line\"],\n center: [\"center\", \"ri-layout-row-line\"],\n right: [\"flex-end\", \"ri-layout-top-line\"],\n space: [\"space-between\", \"ri-space\"],\n },\n Justify: {\n left: [\"flex-start\", \"ri-layout-left-line\"],\n center: [\"center\", \"ri-layout-column-line\"],\n right: [\"flex-end\", \"ri-layout-right-line\"],\n space: [\"space-between\", \"ri-space\"],\n },\n }\n\n $: propertyChoices = Object.entries(PROPERTY_OPTIONS[propertyName])\n</script>\n\n<div class=\"inputs {size}\">\n {#each meta as { placeholder }, i}\n {#each propertyChoices as [displayName, [cssPropValue, icon]]}\n <button\n class:selected={cssPropValue === selectedLayoutValues[i]}\n on:click={() => {\n const newPropertyValue = cssPropValue === selectedLayoutValues[i] ? '' : cssPropValue\n selectedLayoutValues[i] = newPropertyValue\n }}>\n <i class={icon} />\n </button>\n {/each}\n {/each}\n</div>\n\n<style>\n .selected {\n color: var(--button-text);\n background: #f9f9f9;\n opacity: 1;\n }\n\n button {\n cursor: pointer;\n outline: none;\n border: none;\n border-radius: 3px;\n\n min-width: 1.6rem;\n min-height: 1.6rem;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n\n font-size: 1.2rem;\n font-weight: 500;\n color: #000333;\n }\n\n .inputs {\n display: flex;\n justify-content: space-between;\n }\n</style>\n",
135
- "<script>\n import { onMount } from \"svelte\"\n\n export let meta = []\n export let size = \"\"\n export let values = []\n export let type = \"number\"\n export let onStyleChanged = () => {}\n\n let _values = values.map(v => v)\n\n $: onStyleChanged(_values)\n</script>\n\n<div class=\"inputs {size}\">\n {#each meta as { placeholder }, i}\n <input\n {type}\n {placeholder}\n value={values[i]}\n on:input={e => (_values[i] = e.target.value)} />\n {/each}\n</div>\n\n<style>\n .inputs {\n display: flex;\n justify-content: space-between;\n }\n\n input {\n width: 83px;\n font-size: 12px;\n font-weight: 700;\n color: #163057;\n opacity: 0.7;\n padding: 5px 10px;\n box-sizing: border-box;\n border: 1px solid #dbdbdb;\n border-radius: 2px;\n outline: none;\n }\n\n input[type=\"number\"]::-webkit-inner-spin-button,\n input[type=\"number\"]::-webkit-outer-spin-button {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n margin: 0;\n }\n\n .small > input {\n width: 38px;\n height: 38px;\n display: flex;\n justify-content: center;\n align-items: center;\n text-align: center;\n padding: 0;\n }\n\n .small > input::placeholder {\n text-align: center;\n }\n</style>\n",
136
- "<script>\n import { backendUiStore } from \"builderStore\"\n\n export let data\n export let currentPage\n export let pageItemCount\n export let ITEMS_PER_PAGE\n\n let numPages = 0\n\n $: numPages = Math.ceil(data.length / ITEMS_PER_PAGE)\n\n const next = () => {\n if (currentPage + 1 === numPages) return\n currentPage = currentPage + 1\n }\n\n const previous = () => {\n if (currentPage == 0) return\n currentPage = currentPage - 1\n }\n\n const selectPage = page => {\n currentPage = page\n }\n</script>\n\n<div class=\"pagination\">\n <div class=\"pagination__buttons\">\n <button on:click={previous}>Previous</button>\n <button on:click={next}>Next</button>\n {#each Array(numPages) as _, idx}\n <button\n class:selected={idx === currentPage}\n on:click={() => selectPage(idx)}>\n {idx + 1}\n </button>\n {/each}\n </div>\n <p>Showing {pageItemCount} of {data.length} entries</p>\n</div>\n\n<style>\n .pagination {\n width: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .pagination__buttons {\n display: flex;\n }\n\n .pagination__buttons button {\n display: inline-block;\n padding: 10px;\n margin: 0;\n background: #fff;\n border: 1px solid #ccc;\n text-transform: capitalize;\n border-radius: 3px;\n font-family: Roboto;\n min-width: 20px;\n transition: 0.3s background-color;\n }\n\n .pagination__buttons button:hover {\n cursor: pointer;\n background-color: #fafafa;\n }\n\n .selected {\n color: var(--button-text);\n }\n</style>\n",
137
- "<script>\n import {\n keys,\n map,\n some,\n includes,\n cloneDeep,\n isEqual,\n sortBy,\n filter,\n difference,\n } from \"lodash/fp\"\n import { pipe } from \"components/common/core\"\n import Checkbox from \"components/common/Checkbox.svelte\"\n import Textbox from \"components/common/Textbox.svelte\"\n import Dropdown from \"components/common/Dropdown.svelte\"\n import PlusButton from \"components/common/PlusButton.svelte\"\n import IconButton from \"components/common/IconButton.svelte\"\n import Modal from \"components/common/Modal.svelte\"\n import EventEditorModal from \"./EventEditorModal.svelte\"\n import HandlerSelector from \"./HandlerSelector.svelte\"\n\n import { PencilIcon } from \"components/common/Icons\"\n import { EVENT_TYPE_MEMBER_NAME } from \"components/common/eventHandlers\"\n\n export const EVENT_TYPE = \"event\"\n\n export let component\n export let onPropChanged = () => {}\n export let components\n\n let modalOpen = false\n let events = []\n let selectedEvent = null\n\n $: {\n const componentDefinition = components.find(\n c => c.name === component._component\n )\n events = Object.keys(componentDefinition.props)\n .filter(\n propName => componentDefinition.props[propName].type === EVENT_TYPE\n )\n .map(propName => ({\n name: propName,\n handlers: component[propName] || [],\n }))\n }\n\n const openModal = event => {\n selectedEvent = event\n modalOpen = true\n }\n\n const closeModal = () => {\n selectedEvent = null\n modalOpen = false\n }\n</script>\n\n<header>\n <h3>Events</h3>\n <PlusButton on:click={() => openModal()} />\n</header>\n\n<div class=\"root\">\n <form class=\"uk-form-stacked form-root\">\n {#each events as event, index}\n {#if event.handlers.length > 0}\n <div\n class:selected={selectedEvent && selectedEvent.index === index}\n class=\"handler-container budibase__nav-item\"\n on:click={() => openModal({ ...event, index })}>\n <span class=\"event-name\">{event.name}</span>\n <span class=\"edit-text\">EDIT</span>\n </div>\n {/if}\n {/each}\n </form>\n</div>\n<EventEditorModal\n {onPropChanged}\n open={modalOpen}\n onClose={closeModal}\n eventOptions={events}\n event={selectedEvent} />\n\n<style>\n h3 {\n text-transform: uppercase;\n font-size: 12px;\n font-weight: 700;\n color: #8997ab;\n margin-bottom: 10px;\n }\n\n .root {\n font-size: 10pt;\n width: 100%;\n }\n\n .form-root {\n display: flex;\n flex-wrap: wrap;\n }\n\n header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .handler-container {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n border: 2px solid #f9f9f9;\n height: 80px;\n width: 100%;\n }\n\n .event-name {\n margin-top: 5px;\n font-weight: bold;\n font-size: 16px;\n color: rgba(22, 48, 87, 0.6);\n align-self: end;\n }\n\n .edit-text {\n font-family: Arial, Helvetica, sans-serif;\n font-weight: bold;\n align-self: end;\n justify-self: end;\n font-size: 10px;\n color: rgba(35, 65, 105, 0.4);\n }\n\n .selected {\n color: var(--button-text);\n background: var(--background-button) !important;\n }\n</style>\n",
138
- "<script>\n import { ArrowDownIcon } from \"components/common/Icons/\"\n import { store } from \"builderStore\"\n import { buildStateOrigins } from \"builderStore/buildStateOrigins\"\n import { isBinding, getBinding, setBinding } from \"components/common/binding\"\n import StateBindingOptions from \"./StateBindingOptions.svelte\"\n\n export let onChanged = () => {}\n export let value = \"\"\n\n let isOpen = false\n let stateBindings = []\n\n let bindingPath = \"\"\n let bindingFallbackValue = \"\"\n let bindingSource = \"store\"\n let bindingValue = \"\"\n\n const bindValueToSource = (path, fallback, source) => {\n if (!path) {\n onChanged(fallback)\n return\n }\n const binding = setBinding({ path, fallback, source })\n onChanged(binding)\n }\n\n const setBindingPath = value =>\n bindValueToSource(value, bindingFallbackValue, bindingSource)\n\n const setBindingFallback = value =>\n bindValueToSource(bindingPath, value, bindingSource)\n\n const setBindingSource = source =>\n bindValueToSource(bindingPath, bindingFallbackValue, source)\n\n $: {\n const binding = getBinding(value)\n if (bindingPath !== binding.path) isOpen = false\n bindingPath = binding.path\n bindingValue = typeof value === \"object\" ? \"\" : value\n bindingFallbackValue = binding.fallback || bindingValue\n\n const currentScreen = $store.screens.find(\n ({ name }) => name === $store.currentPreviewItem.name\n )\n stateBindings = currentScreen\n ? Object.keys(buildStateOrigins(currentScreen))\n : []\n }\n</script>\n\n<div class=\"cascader\">\n <div class=\"input-box\">\n <input\n class:bold={!bindingFallbackValue && bindingPath}\n class=\"uk-input uk-form-small\"\n value={bindingFallbackValue || bindingPath}\n on:change={e => {\n setBindingFallback(e.target.value)\n onChanged(e.target.value)\n }} />\n <button on:click={() => (isOpen = !isOpen)}>\n <div\n class=\"icon\"\n class:highlighted={bindingPath}\n style={`transform: rotate(${isOpen ? 0 : 90}deg);`}>\n <ArrowDownIcon size={36} />\n </div>\n </button>\n </div>\n {#if isOpen}\n <StateBindingOptions\n onSelect={option => {\n onChanged(option)\n isOpen = false\n }} />\n {/if}\n</div>\n\n<style>\n .bold {\n font-weight: bold;\n }\n\n .highlighted {\n color: rgba(0, 85, 255, 0.8);\n }\n\n button {\n cursor: pointer;\n outline: none;\n border: none;\n border-radius: 3px;\n font-size: 1.6rem;\n font-weight: 700;\n color: rgba(22, 48, 87, 1);\n }\n\n .cascader {\n position: relative;\n width: 100%;\n }\n\n .input-box {\n display: flex;\n align-items: center;\n }\n\n input {\n margin-right: 5px;\n border: 1px solid #dbdbdb;\n border-radius: 2px;\n opacity: 0.5;\n height: 40px;\n }\n\n .icon {\n width: 24px;\n }\n</style>\n",
139
- "<script>\n import IconButton from \"components/common/IconButton.svelte\"\n import PlusButton from \"components/common/PlusButton.svelte\"\n import Select from \"components/common/Select.svelte\"\n import StateBindingCascader from \"./StateBindingCascader.svelte\"\n import StateBindingControl from \"../StateBindingControl.svelte\"\n import { find, map, keys, reduce, keyBy } from \"lodash/fp\"\n import { pipe, userWithFullAccess } from \"components/common/core\"\n import {\n EVENT_TYPE_MEMBER_NAME,\n allHandlers,\n } from \"components/common/eventHandlers\"\n import { store } from \"builderStore\"\n\n export let handler\n export let onCreate\n export let onChanged\n export let onRemoved\n\n export let index\n export let newHandler\n\n let eventOptions\n let handlerType\n let parameters = []\n\n $: eventOptions = allHandlers(\n { hierarchy: $store.hierarchy },\n userWithFullAccess({\n hierarchy: $store.hierarchy,\n actions: keyBy(\"name\")($store.actions),\n })\n )\n\n $: {\n if (handler) {\n handlerType = handler[EVENT_TYPE_MEMBER_NAME]\n parameters = Object.entries(handler.parameters).map(([name, value]) => ({\n name,\n value,\n }))\n } else {\n // Empty Handler\n handlerType = \"\"\n parameters = []\n }\n }\n\n const handlerChanged = (type, params) => {\n const handlerParams = {}\n for (let param of params) {\n handlerParams[param.name] = param.value\n }\n\n const updatedHandler = {\n [EVENT_TYPE_MEMBER_NAME]: type,\n parameters: handlerParams,\n }\n\n onChanged(updatedHandler, index)\n }\n\n const handlerTypeChanged = e => {\n const handlerType = eventOptions.find(\n handler => handler.name === e.target.value\n )\n const defaultParams = handlerType.parameters.map(param => ({\n name: param,\n value: \"\",\n }))\n\n handlerChanged(handlerType.name, defaultParams)\n }\n\n const onParameterChanged = index => e => {\n const value = e.target ? e.target.value : e\n const newParams = [...parameters]\n newParams[index].value = value\n handlerChanged(handlerType, newParams)\n }\n</script>\n\n<div class=\"type-selector-container {newHandler && 'new-handler'}\">\n <div class=\"handler-controls\">\n <div class=\"handler-option\">\n <span>Action</span>\n <Select value={handlerType} on:change={handlerTypeChanged}>\n <option />\n {#each eventOptions as option}\n <option value={option.name}>{option.name}</option>\n {/each}\n </Select>\n </div>\n {#if parameters}\n {#each parameters as parameter, idx}\n <StateBindingCascader onChange={onParameterChanged(idx)} {parameter} />\n {/each}\n {/if}\n </div>\n <div class=\"event-action-button\">\n {#if parameters.length > 0}\n {#if newHandler}\n <PlusButton on:click={onCreate} />\n {:else}\n <IconButton icon=\"x\" on:click={onRemoved} />\n {/if}\n {/if}\n </div>\n</div>\n\n<style>\n .type-selector-container {\n display: flex;\n justify-content: space-between;\n align-items: center;\n background: rgba(223, 223, 223, 0.5);\n border: 1px solid #dfdfdf;\n margin-bottom: 18px;\n }\n\n .handler-option {\n display: flex;\n flex-direction: column;\n }\n\n .new-handler {\n background: #fff;\n }\n\n .handler-controls {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n grid-gap: 10px;\n padding: 22px;\n }\n\n .event-action-button {\n margin-right: 20px;\n }\n\n span {\n font-size: 12px;\n margin-bottom: 5px;\n }\n</style>\n",
140
- "<script>\n import Modal from \"../../common/Modal.svelte\"\n import HandlerSelector from \"./HandlerSelector.svelte\"\n import IconButton from \"../../common/IconButton.svelte\"\n import ActionButton from \"../../common/ActionButton.svelte\"\n import PlusButton from \"../../common/PlusButton.svelte\"\n import Select from \"../../common/Select.svelte\"\n import Input from \"../../common/Input.svelte\"\n import getIcon from \"../../common/icon\"\n\n import { EVENT_TYPE_MEMBER_NAME } from \"../../common/eventHandlers\"\n\n export let event\n export let eventOptions = []\n export let open\n export let onClose\n export let onPropChanged\n\n let eventType = \"\"\n let draftEventHandler = { parameters: [] }\n\n $: eventData = event || { handlers: [] }\n $: if (!eventOptions.includes(eventType) && eventOptions.length > 0)\n eventType = eventOptions[0].name\n\n const closeModal = () => {\n onClose()\n draftEventHandler = { parameters: [] }\n eventData = { handlers: [] }\n }\n\n const updateEventHandler = (updatedHandler, index) => {\n eventData.handlers[index] = updatedHandler\n }\n\n const updateDraftEventHandler = updatedHandler => {\n draftEventHandler = updatedHandler\n }\n\n const deleteEventHandler = index => {\n eventData.handlers.splice(index, 1)\n eventData = eventData\n }\n\n const createNewEventHandler = handler => {\n const newHandler = handler || {\n parameters: {},\n [EVENT_TYPE_MEMBER_NAME]: \"\",\n }\n eventData.handlers.push(newHandler)\n eventData = eventData\n }\n\n const deleteEvent = () => {\n onPropChanged(eventType, [])\n closeModal()\n }\n\n const saveEventData = () => {\n onPropChanged(eventType, eventData.handlers)\n closeModal()\n }\n</script>\n\n<Modal bind:isOpen={open} onClosed={closeModal}>\n <h2>\n {eventData.name ? `${eventData.name} Event` : 'Create a New Component Event'}\n </h2>\n <a href=\"https://docs.budibase.com/\" target=\"_blank\">\n Click here to learn more about component events\n </a>\n\n <div class=\"event-options\">\n <div>\n <header>\n <h5>Event Type</h5>\n {@html getIcon('info', 20)}\n </header>\n <Select bind:value={eventType}>\n {#each eventOptions as option}\n <option value={option.name}>{option.name}</option>\n {/each}\n </Select>\n </div>\n </div>\n\n <header>\n <h5>Event Action(s)</h5>\n {@html getIcon('info', 20)}\n </header>\n <HandlerSelector\n newHandler\n onChanged={updateDraftEventHandler}\n onCreate={() => {\n createNewEventHandler(draftEventHandler)\n draftEventHandler = { parameters: [] }\n }}\n handler={draftEventHandler} />\n {#if eventData}\n {#each eventData.handlers as handler, index}\n <HandlerSelector\n {index}\n onChanged={updateEventHandler}\n onRemoved={() => deleteEventHandler(index)}\n {handler} />\n {/each}\n {/if}\n\n <div class=\"actions\">\n <ActionButton\n alert\n disabled={eventData.handlers.length === 0}\n hidden={!eventData.name}\n on:click={deleteEvent}>\n Delete\n </ActionButton>\n <ActionButton\n disabled={eventData.handlers.length === 0}\n on:click={saveEventData}>\n Save\n </ActionButton>\n </div>\n</Modal>\n\n<style>\n h2 {\n color: var(--primary100);\n font-size: 20px;\n font-weight: bold;\n margin-bottom: 0;\n }\n\n h5 {\n color: rgba(22, 48, 87, 0.6);\n font-size: 15px;\n margin: 0;\n }\n\n .event-options {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: 10px;\n }\n\n .actions,\n header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .actions {\n margin-top: auto;\n }\n\n header {\n margin-top: 30px;\n margin-bottom: 10px;\n }\n\n a {\n color: rgba(22, 48, 87, 0.6);\n font-size: 12px;\n margin-top: 0;\n }\n</style>\n",
141
- "<script>\n export let onSelect = () => {}\n\n let options = [\n {\n name: \"state\",\n description: \"Front-end client state.\",\n },\n {\n name: \"context\",\n description: \"The component context object.\",\n },\n {\n name: \"event\",\n description: \"DOM event handler arguments.\",\n },\n ]\n</script>\n\n<ul class=\"options\">\n {#each options as option}\n <li on:click={() => onSelect(`${option.name}.`)}>\n <span class=\"name\">{option.name}</span>\n <span class=\"description\">{option.description}</span>\n </li>\n {/each}\n</ul>\n\n<style>\n .options {\n width: 172px;\n margin: 0;\n position: absolute;\n top: 35px;\n padding: 10px;\n z-index: 1;\n background: rgba(249, 249, 249, 1);\n min-height: 50px;\n border-radius: 2px;\n }\n\n .description {\n font-size: 0.8em;\n }\n\n .name {\n color: rgba(22, 48, 87, 0.6);\n font-size: 12px;\n font-weight: bold;\n text-transform: uppercase;\n margin-top: 5px;\n display: block;\n }\n\n .name:hover {\n cursor: pointer;\n font-weight: 800;\n }\n\n li {\n list-style-type: none;\n }\n</style>\n",
142
- "<script>\n import IconButton from \"components/common/IconButton.svelte\"\n import PlusButton from \"components/common/PlusButton.svelte\"\n import Select from \"components/common/Select.svelte\"\n import Input from \"components/common/Input.svelte\"\n import StateBindingControl from \"../StateBindingControl.svelte\"\n import { find, map, keys, reduce, keyBy } from \"lodash/fp\"\n import { pipe, userWithFullAccess } from \"components/common/core\"\n import {\n EVENT_TYPE_MEMBER_NAME,\n allHandlers,\n } from \"components/common/eventHandlers\"\n import { store } from \"builderStore\"\n import StateBindingOptions from \"../PropertyCascader/StateBindingOptions.svelte\"\n import { ArrowDownIcon } from \"components/common/Icons/\"\n\n export let parameter\n export let onChange\n\n let isOpen = false\n</script>\n\n<div class=\"handler-option\">\n <span>{parameter.name}</span>\n <div class=\"handler-input\">\n <Input on:change={onChange} value={parameter.value} />\n <button on:click={() => (isOpen = !isOpen)}>\n <div class=\"icon\" style={`transform: rotate(${isOpen ? 0 : 90}deg);`}>\n <ArrowDownIcon size={36} />\n </div>\n </button>\n {#if isOpen}\n <StateBindingOptions\n onSelect={option => {\n onChange(option)\n isOpen = false\n }} />\n {/if}\n </div>\n</div>\n\n<style>\n button {\n cursor: pointer;\n outline: none;\n border: none;\n border-radius: 5px;\n background: rgba(249, 249, 249, 1);\n\n font-size: 1.6rem;\n font-weight: 700;\n color: rgba(22, 48, 87, 1);\n margin-left: 5px;\n }\n\n .icon {\n width: 24px;\n }\n\n .handler-option {\n display: flex;\n flex-direction: column;\n }\n\n .handler-input {\n position: relative;\n display: flex;\n }\n\n span {\n font-size: 12px;\n margin-bottom: 5px;\n }\n</style>\n"
143
- ],
144
- "names": [],
145
- "mappings": "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"
146
- }