Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

1322 строки
35 KiB

  1. {
  2. "data": {
  3. "settings": {
  4. "version": "1.1.1",
  5. "debug": true,
  6. "unit": 1,
  7. "authRequired": false,
  8. "localDb": "0",
  9. "localWebhook": "",
  10. "localWebhookPlayground": "",
  11. "localPath": "db/reslevis",
  12. "serverUrl": "https://10.251.0.30:5050/frontend/api/reslevis",
  13. "serverMethod": "GET",
  14. "serverTokenUrl": "",
  15. "serverClientSecret": "",
  16. "updateInterval": 50000
  17. },
  18. "user": {
  19. "id": "",
  20. "name": "",
  21. "token": ""
  22. },
  23. "ui": {
  24. "pages": {
  25. "building": {
  26. "columns": [
  27. {
  28. "accessorKey": "name",
  29. "header": "Name"
  30. },
  31. {
  32. "accessorKey": "city",
  33. "header": "City"
  34. },
  35. {
  36. "accessorKey": "actions",
  37. "header": ""
  38. }
  39. ]
  40. },
  41. "floor": {
  42. "columns": [
  43. {
  44. "accessorKey": "name",
  45. "header": "Name"
  46. },
  47. {
  48. "accessorKey": "BuildingName",
  49. "header": "Building"
  50. },
  51. {
  52. "accessorKey": "actions",
  53. "header": ""
  54. }
  55. ]
  56. },
  57. "zone": {
  58. "columns": [
  59. {
  60. "accessorKey": "name",
  61. "header": "Name"
  62. },
  63. {
  64. "accessorKey": "BuildingName",
  65. "header": "Building"
  66. },
  67. {
  68. "accessorKey": "FloorName",
  69. "header": "Floor"
  70. },
  71. {
  72. "accessorKey": "actions",
  73. "header": ""
  74. }
  75. ]
  76. },
  77. "operator": {
  78. "columns": [
  79. {
  80. "accessorKey": "name",
  81. "header": "Name"
  82. },
  83. {
  84. "accessorKey": "buildingName",
  85. "header": "Building"
  86. },
  87. {
  88. "accessorKey": "floorName",
  89. "header": "Floor"
  90. },
  91. {
  92. "accessorKey": "zones",
  93. "header": "Zones"
  94. },
  95. {
  96. "accessorKey": "actions",
  97. "header": ""
  98. }
  99. ]
  100. },
  101. "subject": {
  102. "columns": [
  103. {
  104. "accessorKey": "name",
  105. "header": "Name"
  106. },
  107. {
  108. "accessorKey": "buildingName",
  109. "header": "Building"
  110. },
  111. {
  112. "accessorKey": "floorName",
  113. "header": "Floor"
  114. },
  115. {
  116. "accessorKey": "actions",
  117. "header": ""
  118. }
  119. ]
  120. },
  121. "home": {
  122. "columns": [
  123. {
  124. "accessorKey": "timestamp",
  125. "header": "Time"
  126. },
  127. {
  128. "accessorKey": "subjectName",
  129. "header": "Subject"
  130. },
  131. {
  132. "accessorKey": "status",
  133. "header": "Status"
  134. },
  135. {
  136. "accessorKey": "actions",
  137. "header": ""
  138. }
  139. ]
  140. },
  141. "alarm": {
  142. "columns": [
  143. {
  144. "accessorKey": "timestamp",
  145. "header": "Time"
  146. },
  147. {
  148. "accessorKey": "subjectName",
  149. "header": "Subject"
  150. },
  151. {
  152. "accessorKey": "status",
  153. "header": "Status"
  154. },
  155. {
  156. "accessorKey": "actions",
  157. "header": ""
  158. }
  159. ]
  160. },
  161. "gateway": {
  162. "columns": [
  163. {
  164. "accessorKey": "name",
  165. "header": "Name"
  166. },
  167. {
  168. "accessorKey": "status",
  169. "header": "Status"
  170. },
  171. {
  172. "accessorKey": "model",
  173. "header": "Model"
  174. },
  175. {
  176. "accessorKey": "ip",
  177. "header": "IP"
  178. },
  179. {
  180. "accessorKey": "position",
  181. "header": "Position"
  182. },
  183. {
  184. "accessorKey": "actions",
  185. "header": ""
  186. }
  187. ]
  188. },
  189. "tracker": {
  190. "columns": [
  191. {
  192. "accessorKey": "name",
  193. "header": "Name"
  194. },
  195. {
  196. "accessorKey": "status",
  197. "header": "Status"
  198. },
  199. {
  200. "accessorKey": "model",
  201. "header": "Model"
  202. },
  203. {
  204. "accessorKey": "actions",
  205. "header": ""
  206. }
  207. ]
  208. },
  209. "trackerZone": {
  210. "columns": [
  211. {
  212. "accessorKey": "name",
  213. "header": "Name"
  214. },
  215. {
  216. "accessorKey": "days",
  217. "header": "Days"
  218. },
  219. {
  220. "accessorKey": "hours",
  221. "header": "Hours"
  222. },
  223. {
  224. "accessorKey": "actions",
  225. "header": ""
  226. }
  227. ]
  228. },
  229. "track": {
  230. "columns": [
  231. {
  232. "accessorKey": "timestamp",
  233. "header": "Time"
  234. },
  235. {
  236. "accessorKey": "subject",
  237. "header": "Subject"
  238. },
  239. {
  240. "accessorKey": "gateway",
  241. "header": "Gateway"
  242. },
  243. {
  244. "accessorKey": "status",
  245. "header": "Status"
  246. },
  247. {
  248. "accessorKey": "signal",
  249. "header": "Signal"
  250. },
  251. {
  252. "accessorKey": "actions",
  253. "header": ""
  254. }
  255. ]
  256. },
  257. "setting": {
  258. "columns": [
  259. {
  260. "accessorKey": "name",
  261. "header": "Name"
  262. },
  263. {
  264. "accessorKey": "role",
  265. "header": "Role"
  266. },
  267. {
  268. "accessorKey": "actions",
  269. "header": ""
  270. }
  271. ]
  272. }
  273. }
  274. }
  275. },
  276. "on": {
  277. "resize": [],
  278. "hashchange": [
  279. {
  280. "log": "hashchange"
  281. },
  282. {
  283. "browser:pageFromHash": {
  284. "pagesClass": "page",
  285. "pageChanger": "rl:openPage"
  286. }
  287. }
  288. ],
  289. "init": [
  290. {
  291. "set": {
  292. "var saveMethod": "POST"
  293. }
  294. },
  295. {
  296. "loadTemplate": {
  297. "selector": "body",
  298. "url": "./assets/templates/menu.html",
  299. "to": "template menu",
  300. "arguments": {},
  301. "callback": []
  302. }
  303. },
  304. {
  305. "rl:menuIcons": {
  306. "selector": "body",
  307. "items": [
  308. {
  309. "title": "Buildings",
  310. "icon": "rl:menu",
  311. "link": "#building"
  312. },
  313. {
  314. "title": "Floors",
  315. "icon": "rl:floors",
  316. "link": "#floor"
  317. },
  318. {
  319. "title": "Zones",
  320. "icon": "rl:zones",
  321. "link": "#zone"
  322. },
  323. {
  324. "title": "Operators",
  325. "icon": "rl:operators",
  326. "link": "#operator"
  327. },
  328. {
  329. "title": "Subjects",
  330. "icon": "rl:subjects",
  331. "link": "#subject"
  332. },
  333. {
  334. "title": "Alarms",
  335. "icon": "rl:alarms",
  336. "link": "#alarm"
  337. },
  338. {
  339. "title": "Gateways",
  340. "icon": "rl:gateways",
  341. "link": "#gateway"
  342. },
  343. {
  344. "title": "Trackers",
  345. "icon": "rl:trackers",
  346. "link": "#tracker"
  347. },
  348. {
  349. "title": "Tracks",
  350. "icon": "rl:tracks",
  351. "link": "#track"
  352. },
  353. {
  354. "title": "Settings",
  355. "icon": "rl:settings",
  356. "link": "#setting"
  357. },
  358. {
  359. "title": "Tracker Zone",
  360. "icon": "rl:trackerZone",
  361. "link": "#trackerZone"
  362. }
  363. ]
  364. }
  365. },
  366. {
  367. "fetchJson": {
  368. "url": "./assets/api/reslevis.api-1.0.5.json",
  369. "to": "data api",
  370. "options": {
  371. "method": "GET",
  372. "headers": {
  373. "Content-Type": "application/json",
  374. "Authorization": ""
  375. }
  376. },
  377. "success": [
  378. {
  379. "log": "API {data api info version} loaded"
  380. },
  381. {
  382. "rl:checkAuth": {}
  383. }
  384. ],
  385. "error": [
  386. {
  387. "log": "Error loading reslevis.api-1.0.5.json"
  388. },
  389. {
  390. "rl:checkAuth": {}
  391. }
  392. ]
  393. }
  394. }
  395. ]
  396. },
  397. "plugins": [
  398. {
  399. "name": "app",
  400. "version": "",
  401. "ondemand": false,
  402. "files": [
  403. {
  404. "type": "link",
  405. "url": "app.css"
  406. },
  407. {
  408. "type": "script",
  409. "url": "app.js"
  410. },
  411. {
  412. "type": "script",
  413. "url": "api.js"
  414. }
  415. ]
  416. },
  417. {
  418. "name": "tablestack",
  419. "description": "Headless UI for building powerful tables & datagrids",
  420. "version": "8.21.3",
  421. "ondemand": false,
  422. "files": [
  423. {
  424. "type": "script",
  425. "url": "assets/plugins/tablestack.min.js",
  426. "cdn": "https://unpkg.com/@tanstack/table-core@8.11.6/build/umd/index.production.js"
  427. }
  428. ]
  429. },
  430. {
  431. "name": "alpinejs",
  432. "description": "The rugged, minimal JavaScript framework",
  433. "version": "3.x.x",
  434. "ondemand": false,
  435. "files": [
  436. {
  437. "type": "script",
  438. "url": "assets/plugins/alpinejs.min.js"
  439. }
  440. ]
  441. },
  442. {
  443. "name": "simplebar",
  444. "description": "Scrollbars, simpler",
  445. "version": "6.2.7",
  446. "ondemand": false,
  447. "files": [
  448. {
  449. "type": "link",
  450. "url": "assets/plugins/simplebar.css"
  451. },
  452. {
  453. "type": "script",
  454. "url": "assets/plugins/simplebar.min.js"
  455. }
  456. ]
  457. },
  458. {
  459. "name": "flatpickr",
  460. "description": " A lightweight, powerful javascript datetime picker",
  461. "version": "4.6.13",
  462. "ondemand": false,
  463. "files": [
  464. {
  465. "type": "link",
  466. "url": "assets/plugins/flatpickr.min.css"
  467. },
  468. {
  469. "type": "script",
  470. "url": "assets/plugins/flatpickr.min.js"
  471. }
  472. ]
  473. },
  474. {
  475. "name": "sweetalert2",
  476. "description": "A beautiful, responsive, customizable and accessible (WAI-ARIA) replacement for JavaScript's popup boxes",
  477. "version": "11.17.2",
  478. "ondemand": false,
  479. "files": [
  480. {
  481. "type": "script",
  482. "url": "assets/plugins/sweetalert2@11.js"
  483. }
  484. ]
  485. },
  486. {
  487. "name": "snapsvg",
  488. "description": "JavaScript Vector Library",
  489. "type": "script",
  490. "version": "0.5.1",
  491. "ondemand": false,
  492. "url": "assets/plugins/snap.svg-min.js"
  493. },
  494. {
  495. "name": "qrcode-svg",
  496. "description": "A simple QR Code generator in pure JavaScript",
  497. "type": "script",
  498. "version": "1.1.0",
  499. "ondemand": false,
  500. "url": "assets/plugins/qrcode.min.js",
  501. "ref": "https://papnkukn.github.io/qrcode-svg/"
  502. }
  503. ],
  504. "plugins-disabled": [],
  505. "setup": {
  506. "languages": [
  507. "en"
  508. ],
  509. "language": "en",
  510. "log": false,
  511. "modules": [
  512. {
  513. "name": "reslevisIcons",
  514. "url": "assets/modules/reslevis.icons.json"
  515. },
  516. {
  517. "name": "reslevisData",
  518. "url": "assets/modules/reslevis.data.json"
  519. },
  520. {
  521. "name": "reslevisTexts",
  522. "url": "assets/modules/reslevis.texts.json"
  523. }
  524. ]
  525. },
  526. "parts": {
  527. "rl": {
  528. "checkAuth": [
  529. {
  530. "if": {
  531. "is": "{data settings authRequired}",
  532. "then": [
  533. {
  534. "getToken": {
  535. "url": "{data settings serverTokenUrl}",
  536. "options": {
  537. "method": "POST",
  538. "headers": {
  539. "Content-Type": "application/x-www-form-urlencoded"
  540. },
  541. "body": "grant_type=client_credentials&client_id=Fastapi&client_secret={data settings serverClientSecret}"
  542. },
  543. "success": [
  544. {
  545. "rl:createDashboard": {
  546. "page": "home",
  547. "db": "alarm"
  548. }
  549. },
  550. {
  551. "rl:createPages": {}
  552. }
  553. ],
  554. "error": [
  555. {
  556. "rl:createDashboard": {
  557. "page": "home",
  558. "db": "alarm"
  559. }
  560. },
  561. {
  562. "rl:createPages": {}
  563. }
  564. ]
  565. }
  566. }
  567. ],
  568. "else": [
  569. {
  570. "rl:createDashboard": {
  571. "page": "home",
  572. "db": "alarm"
  573. }
  574. },
  575. {
  576. "rl:createPages": {}
  577. }
  578. ]
  579. }
  580. }
  581. ],
  582. "getToken": [
  583. {
  584. "log": "getToken from {arguments:serverTokenUrl}"
  585. },
  586. {
  587. "fetchJson": {
  588. "to": "data user token",
  589. "url": "{arguments:serverTokenUrl}",
  590. "options": {
  591. "method": "POST",
  592. "headers": {
  593. "Content-Type": "application/x-www-form-urlencoded"
  594. },
  595. "body": "grant_type=client_credentials&client_id=Fastapi&client_secret=wojuoB7Z5xhlPFrF2lIxJSSdVHCApEgC"
  596. },
  597. "success": [
  598. {
  599. "log": "token ok"
  600. }
  601. ],
  602. "error": [
  603. {
  604. "log": "Error fetching auth token"
  605. }
  606. ]
  607. }
  608. }
  609. ],
  610. "createPages": {
  611. "do": [
  612. {
  613. "log": "Create pages"
  614. },
  615. {
  616. "for": {
  617. "var": "db",
  618. "of": [
  619. "building",
  620. "floor",
  621. "zone",
  622. "operator",
  623. "subject",
  624. "gateway",
  625. "tracker",
  626. "trackerZone",
  627. "track",
  628. "setting"
  629. ],
  630. "do": [
  631. {
  632. "html": [
  633. {
  634. "selector": ".main",
  635. "tag": "div",
  636. "attr": {
  637. "id": "page{var db}",
  638. "data-value": "{var db}",
  639. "class": "page hidden"
  640. },
  641. "text": ""
  642. }
  643. ]
  644. },
  645. {
  646. "if": {
  647. "is": "'{data settings localDb}' == '1'",
  648. "then": [
  649. {
  650. "rl:getDb": {
  651. "template": "{var db}",
  652. "db": "{var db}",
  653. "serverMethod": "{data settings serverMethod}",
  654. "localDb": "{data settings localDb}",
  655. "localPath": "{data settings localPath}",
  656. "token": "{data user token}"
  657. }
  658. }
  659. ],
  660. "else": [
  661. {
  662. "apiGet": {
  663. "db": "{var db}",
  664. "template": "{var db}",
  665. "method": "GET",
  666. "success": [
  667. {
  668. "log": "apiCall get success"
  669. }
  670. ],
  671. "error": [
  672. {
  673. "log": "apiCall get error"
  674. }
  675. ]
  676. }
  677. }
  678. ]
  679. }
  680. }
  681. ]
  682. }
  683. },
  684. {
  685. "browser:pageFromHash": {
  686. "pagesClass": "page",
  687. "pageChanger": "rl:openPage"
  688. }
  689. }
  690. ]
  691. },
  692. "createDashboard": {
  693. "do": [
  694. {
  695. "log": "Create page {arguments:page}"
  696. },
  697. {
  698. "html": [
  699. {
  700. "selector": ".main",
  701. "tag": "div",
  702. "attr": {
  703. "id": "page{arguments:page}",
  704. "data-value": "{arguments:page}",
  705. "class": "page hidden"
  706. },
  707. "text": ""
  708. }
  709. ]
  710. },
  711. {
  712. "rl:getDb": {
  713. "template": "{arguments:page}",
  714. "db": "{arguments:db}",
  715. "serverMethod": "{data settings serverMethod}",
  716. "localDb": "{data settings localDb}",
  717. "localPath": "{data settings localPath}",
  718. "token": "{data user token}"
  719. }
  720. },
  721. {
  722. "browser:pageFromHash": {
  723. "pagesClass": "page",
  724. "pageChanger": "rl:openPage"
  725. }
  726. }
  727. ]
  728. },
  729. "apiPostCallback": {
  730. "do": [
  731. {
  732. "log": "apiPostCallback"
  733. },
  734. {
  735. "log": "{arguments:data}"
  736. },
  737. {
  738. "apiGet": {
  739. "db": "{arguments:db}",
  740. "template": "{arguments:db}",
  741. "method": "GET",
  742. "success": [
  743. {
  744. "log": "apiCall get success"
  745. }
  746. ],
  747. "error": [
  748. {
  749. "log": "apiCall get error"
  750. }
  751. ]
  752. }
  753. }
  754. ]
  755. },
  756. "apiUpdateCallback": {
  757. "do": [
  758. {
  759. "log": "apiUpdateCallback"
  760. },
  761. {
  762. "log": "{arguments:data}"
  763. }
  764. ]
  765. },
  766. "apiDeleteCallback": {
  767. "do": [
  768. {
  769. "log": "apiDeleteCallback"
  770. },
  771. {
  772. "log": "{arguments:data}"
  773. }
  774. ]
  775. },
  776. "apiGetCallback": {
  777. "do": [
  778. {
  779. "log": "apiGetCallback"
  780. },
  781. {
  782. "log": "{arguments:data}"
  783. },
  784. {
  785. "set": {
  786. "data db {arguments:db}": "{arguments:data}"
  787. }
  788. },
  789. {
  790. "loadTemplate": {
  791. "selector": "#page{arguments:template}",
  792. "url": "./assets/templates/{arguments:template}.html",
  793. "to": "template {arguments:template}",
  794. "empty": true,
  795. "arguments": {
  796. "db": "{arguments:db}",
  797. "info": "{texts info{arguments:db}s}",
  798. "serverUrl": "{arguments:serverUrl}",
  799. "new": "rl:newPost"
  800. },
  801. "callback": []
  802. }
  803. }
  804. ]
  805. },
  806. "updateDb": {
  807. "do": [
  808. {
  809. "set": {
  810. "var dbUrl": [
  811. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  812. "{arguments:localPath}/{arguments:db}.json"
  813. ],
  814. "var token": "{data user token}"
  815. }
  816. },
  817. {
  818. "log": "DB update: {var dbUrl {arguments:localDb}}"
  819. },
  820. {
  821. "fetchJson": {
  822. "to": "data db {arguments:db}",
  823. "url": "{var dbUrl {arguments:localDb}}",
  824. "options": {
  825. "method": "GET",
  826. "headers": {
  827. "Content-Type": "application/json",
  828. "Authorization": "Bearer {var token}"
  829. }
  830. },
  831. "success": [
  832. {
  833. "js": "{document.querySelector('.update{arguments:db}').click()}"
  834. }
  835. ]
  836. }
  837. }
  838. ]
  839. },
  840. "getDb": {
  841. "do": [
  842. {
  843. "set": {
  844. "var dbUrl": [
  845. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  846. "{arguments:localPath}/{arguments:db}.json"
  847. ],
  848. "var infoText": "{texts info{arguments:db}s}",
  849. "var token": "{data user token}"
  850. }
  851. },
  852. {
  853. "log": "getDb: {var dbUrl {arguments:localDb}}"
  854. },
  855. {
  856. "fetchJson": {
  857. "to": "var getResult",
  858. "url": "{var dbUrl {arguments:localDb}}",
  859. "options": {
  860. "method": "GET",
  861. "headers": {
  862. "Content-Type": "application/json",
  863. "Authorization": "Bearer {var token}"
  864. }
  865. },
  866. "success": [
  867. {
  868. "set": {
  869. "data db {arguments:db}": "{var getResult}"
  870. }
  871. },
  872. {
  873. "loadTemplate": {
  874. "selector": "#page{arguments:template}",
  875. "url": "./assets/templates/{arguments:template}.html",
  876. "to": "template {arguments:template}",
  877. "empty": true,
  878. "arguments": {
  879. "db": "{arguments:db}",
  880. "info": "{texts info{arguments:db}s}",
  881. "serverUrl": "{data settings serverUrl}",
  882. "new": "rl:newPost"
  883. },
  884. "callback": []
  885. }
  886. }
  887. ],
  888. "errorDisabled": [
  889. {
  890. "log": "Error loading {var dbUrl {arguments:localDb}}"
  891. },
  892. {
  893. "log": "{var getResult}"
  894. }
  895. ]
  896. }
  897. }
  898. ]
  899. },
  900. "openPage": {
  901. "arguments": "(page, path)",
  902. "do": [
  903. {
  904. "if": {
  905. "is": "'{arguments:page}' === ''",
  906. "then": [
  907. {
  908. "link": "#home"
  909. }
  910. ]
  911. }
  912. },
  913. {
  914. "set": {
  915. "var infoText": "{texts info{arguments:page}}"
  916. }
  917. },
  918. {
  919. "html": [
  920. {
  921. "selector": ".infoText",
  922. "text": "{var infoText}",
  923. "empty": true
  924. }
  925. ]
  926. },
  927. {
  928. "log": "openPage: {var infoText}"
  929. },
  930. {
  931. "if": {
  932. "is": "{arguments:page} !== {var actualPage}",
  933. "then": [
  934. {
  935. "set": {
  936. "var actualPage": "{arguments:page}"
  937. }
  938. }
  939. ],
  940. "else": [
  941. {
  942. "rl:closePost": {
  943. "db": "{arguments:page}"
  944. }
  945. },
  946. {
  947. "clearInterval": {
  948. "name": "update"
  949. }
  950. },
  951. {
  952. "setInterval": {
  953. "name": "update",
  954. "duration": 5000,
  955. "do": [
  956. {
  957. "apiGet": {
  958. "db": "{arguments:page}",
  959. "template": "{arguments:page}",
  960. "method": "GET",
  961. "success": [
  962. {
  963. "log": "apiCall get success"
  964. }
  965. ],
  966. "error": [
  967. {
  968. "log": "apiCall get error"
  969. }
  970. ]
  971. }
  972. }
  973. ]
  974. }
  975. }
  976. ]
  977. }
  978. }
  979. ]
  980. },
  981. "updateTable": {
  982. "do": [
  983. {
  984. "set": {
  985. "var dbUrl": [
  986. "{data api servers {arguments:localDb} url}/get{arguments:db}s",
  987. "{arguments:localPath}/{arguments:db}.json"
  988. ],
  989. "var token": "{data user token}"
  990. }
  991. },
  992. {
  993. "log": "DB source: {var dbUrl {arguments:localDb}}"
  994. },
  995. {
  996. "fetchJson": {
  997. "to": "data db {arguments:db}",
  998. "url": "{var dbUrl {arguments:localDb}}",
  999. "options": {
  1000. "method": "POST",
  1001. "headers": {
  1002. "Content-Type": "application/json",
  1003. "Authorization": "Bearer {var token}"
  1004. },
  1005. "body": ""
  1006. },
  1007. "success": [
  1008. {
  1009. "loadTemplate": {
  1010. "selector": "#page{arguments:db}",
  1011. "url": "./assets/templates/{arguments:db}Table.html",
  1012. "to": "template {arguments:db}",
  1013. "empty": true,
  1014. "arguments": {
  1015. "db": "{arguments:db}",
  1016. "info": "{var infoText}",
  1017. "serverUrl": "{data settings serverUrl}",
  1018. "new": "rl:newPost"
  1019. },
  1020. "callback": []
  1021. }
  1022. }
  1023. ]
  1024. }
  1025. }
  1026. ]
  1027. },
  1028. "openPost": {
  1029. "do": [
  1030. {
  1031. "set": {
  1032. "var saveMethod": "{arguments:method}"
  1033. }
  1034. },
  1035. {
  1036. "set": {
  1037. "var schemaItem": "{data api components schemas {arguments:db}Item}"
  1038. }
  1039. },
  1040. {
  1041. "set": {
  1042. "var schemaItem": "{data api components schemas {arguments:db}Item}"
  1043. }
  1044. },
  1045. {
  1046. "loadTemplate": {
  1047. "selector": ".page[data-value={arguments:db}] .post",
  1048. "url": "./assets/templates/post.html",
  1049. "to": "template post",
  1050. "empty": true,
  1051. "arguments": {
  1052. "db": "{arguments:db}",
  1053. "id": "{arguments:fields id}",
  1054. "fields": "{arguments:fields}",
  1055. "method": "{arguments:method}",
  1056. "serverUrl": "{data settings serverUrl}",
  1057. "close": "rl:closePost",
  1058. "remove": "rl:removePost",
  1059. "save": "rl:savePost"
  1060. },
  1061. "callback": [
  1062. {
  1063. "html": [
  1064. {
  1065. "selector": ".cancelButton",
  1066. "on": {
  1067. "mousedown": [
  1068. {
  1069. "rl:closePost": {
  1070. "db": "{arguments:db}"
  1071. }
  1072. }
  1073. ]
  1074. }
  1075. }
  1076. ]
  1077. },
  1078. {
  1079. "createForm": {
  1080. "selector": ".page[data-value={arguments:db}] .fields",
  1081. "serverUrl": "{data settings serverUrl}",
  1082. "db": "{arguments:db}",
  1083. "name": "{arguments:db}",
  1084. "schema": "{var schemaItem}",
  1085. "fields": "{arguments:fields}",
  1086. "error": [
  1087. {
  1088. "log": "error"
  1089. }
  1090. ],
  1091. "success": [
  1092. {
  1093. "log": "success"
  1094. }
  1095. ],
  1096. "callback": []
  1097. }
  1098. }
  1099. ]
  1100. }
  1101. },
  1102. {
  1103. "attr": {
  1104. "selector": ".page[data-value={arguments:db}] .post",
  1105. "removeClass": "hidden"
  1106. }
  1107. }
  1108. ]
  1109. },
  1110. "newPost": {
  1111. "note": "https://developer.mozilla.org/en-US/docs/Glossary/UUID",
  1112. "do": [
  1113. {
  1114. "set": {
  1115. "var newId": "{js:window.crypto.randomUUID();}"
  1116. }
  1117. },
  1118. {
  1119. "rl:openPost": {
  1120. "db": "{arguments:db}",
  1121. "method": "POST",
  1122. "id": "{var newId}",
  1123. "fields": {
  1124. "id": "{var newId}"
  1125. }
  1126. }
  1127. }
  1128. ]
  1129. },
  1130. "closePost": {
  1131. "do": [
  1132. {
  1133. "attr": {
  1134. "selector": ".page[data-value={arguments:db}] .post",
  1135. "addClass": "hidden"
  1136. }
  1137. }
  1138. ]
  1139. },
  1140. "savePost": {
  1141. "do": [
  1142. {
  1143. "log": "savePost:{arguments:name}"
  1144. },
  1145. {
  1146. "set": {
  1147. "var formData": "{formDataToJson:.form{arguments:name}}"
  1148. }
  1149. },
  1150. {
  1151. "apiPost": {
  1152. "db": "{arguments:name}",
  1153. "method": "{var saveMethod}",
  1154. "item": "{var formData}",
  1155. "success": [
  1156. {
  1157. "log": "apiPost {var saveMethod} success"
  1158. }
  1159. ],
  1160. "error": [
  1161. {
  1162. "log": "apiPost {var saveMethod} error"
  1163. }
  1164. ]
  1165. }
  1166. }
  1167. ]
  1168. },
  1169. "removePost": {
  1170. "do": [
  1171. {
  1172. "log": "removePost:{arguments:name}"
  1173. },
  1174. {
  1175. "apiPost": {
  1176. "db": "{arguments:name}",
  1177. "id": "{arguments:id}",
  1178. "method": "DELETE",
  1179. "success": [
  1180. {
  1181. "log": "apiPost DELETE success"
  1182. }
  1183. ],
  1184. "error": [
  1185. {
  1186. "log": "apiPost DELETE error"
  1187. }
  1188. ]
  1189. }
  1190. }
  1191. ]
  1192. },
  1193. "menuIcons": {
  1194. "do": [
  1195. {
  1196. "html": [
  1197. {
  1198. "selector": "body",
  1199. "tag": "div",
  1200. "attr": {
  1201. "class": "main w-full h-screen"
  1202. },
  1203. "comment": [
  1204. {
  1205. "tag": "div",
  1206. "attr": {
  1207. "class": "header flex align-items-center justify-content-center text-center float-wrap"
  1208. },
  1209. "html": [
  1210. {
  1211. "tag": "div",
  1212. "attr": {
  1213. "class": "logo m-[10px]"
  1214. },
  1215. "html": [
  1216. {
  1217. "tag": "div",
  1218. "attr": {
  1219. "class": "w-[120px] float-left"
  1220. },
  1221. "html": [
  1222. {
  1223. "tag": "a",
  1224. "attr": {
  1225. "href": "#home"
  1226. },
  1227. "html": [
  1228. {
  1229. "tag": "img",
  1230. "attr": {
  1231. "class": "",
  1232. "src": "./assets/images/logo-reslevis.svg"
  1233. }
  1234. }
  1235. ]
  1236. }
  1237. ]
  1238. }
  1239. ]
  1240. },
  1241. {
  1242. "for": {
  1243. "var": "item",
  1244. "of": "{arguments:items}",
  1245. "html": [
  1246. {
  1247. "tag": "div",
  1248. "attr": {
  1249. "class": "p-[20px] text-center"
  1250. },
  1251. "html": [
  1252. {
  1253. "tag": "a",
  1254. "attr": {
  1255. "href": "{var item link}"
  1256. },
  1257. "html": [
  1258. {
  1259. "tag": "span",
  1260. "attr": {
  1261. "class": "iconify text-[60px] bg-[transparent] text-[#008EED]",
  1262. "data-icon": "{var item icon}"
  1263. }
  1264. }
  1265. ]
  1266. },
  1267. {
  1268. "html": [
  1269. {
  1270. "tag": "a",
  1271. "attr": {
  1272. "href": "{var item link}"
  1273. }
  1274. },
  1275. {
  1276. "tag": "span",
  1277. "text": "{var item title}",
  1278. "attr": {
  1279. "class": "text-[#008EED] text-[16px] px-[0px] py-[10px]"
  1280. }
  1281. }
  1282. ]
  1283. }
  1284. ]
  1285. }
  1286. ]
  1287. }
  1288. }
  1289. ]
  1290. }
  1291. ]
  1292. }
  1293. ]
  1294. }
  1295. ]
  1296. }
  1297. }
  1298. },
  1299. "functions": {
  1300. "apiGet": {
  1301. "js": "let args = arguments[0]; console.log('UI.apiGet'); UI.apiGet(args);"
  1302. },
  1303. "apiPost": {
  1304. "js": "let args = arguments[0]; console.log('UI.apiPost'); UI.apiPost(args);"
  1305. },
  1306. "apiCall": {
  1307. "js": "let args = arguments[0]; console.log('UI.apiCall'); UI.apiCall(args);"
  1308. },
  1309. "getToken": {
  1310. "js": "let args = arguments[0]; UI.getToken(args);"
  1311. },
  1312. "createTable": {
  1313. "js": "let args = arguments[0]; console.log('createTable'); console.log(args); UI.createTable(args); js.callback({do:args.callback});"
  1314. },
  1315. "createForm": {
  1316. "js": "let args = arguments[0]; /*console.log('createForm'); console.log(args);*/ UI.createForm(args); js.callback({do:args.callback});"
  1317. },
  1318. "loadTemplate": {
  1319. "js": "let args = arguments[0]; /*console.log('loadTemplate'); console.log(args);*/ UI.loadTemplate(args); js.callback({do:args.callback});"
  1320. }
  1321. }
  1322. }