simpledomcontrol 0.158.7__tar.gz → 0.158.9__tar.gz

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 (198) hide show
  1. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/PKG-INFO +1 -1
  2. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/pyproject.toml +1 -1
  3. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/consumers.py +9 -3
  4. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/sdc_extentions/models.py +5 -1
  5. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_model_form/sdc_model_form.js +16 -12
  6. {simpledomcontrol-0.158.7/sdc_tools/Assets/src → simpledomcontrol-0.158.9/sdc_tools/Assets/bin}/sdc_tools/controller/sdc_navigator/sdc_navigator.js +8 -4
  7. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_search_select/sdc_search_select.js +34 -30
  8. simpledomcontrol-0.158.9/sdc_tools/Assets/bin/sdc_tools/sdc_tools.organizer.js +1 -0
  9. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/sdc_tools.style.css +28 -14
  10. {simpledomcontrol-0.158.7/sdc_tools/Assets/bin → simpledomcontrol-0.158.9/sdc_tools/Assets/src}/sdc_tools/controller/sdc_detail_view/sdc_detail_view.js +0 -7
  11. {simpledomcontrol-0.158.7/sdc_tools/Assets/bin → simpledomcontrol-0.158.9/sdc_tools/Assets/src}/sdc_tools/controller/sdc_list_view/sdc_list_view.js +25 -14
  12. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_model_form/sdc_model_form.js +16 -12
  13. {simpledomcontrol-0.158.7/sdc_tools/Assets/bin → simpledomcontrol-0.158.9/sdc_tools/Assets/src}/sdc_tools/controller/sdc_navigator/sdc_navigator.js +8 -4
  14. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_search_select/sdc_search_select.js +34 -30
  15. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_search_select/sdc_search_select.scss +34 -15
  16. simpledomcontrol-0.158.7/sdc_tools/Assets/bin/sdc_tools/sdc_tools.organizer.js +0 -1
  17. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/README.md +0 -0
  18. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/__init__.py +0 -0
  19. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/apps.py +0 -0
  20. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/jwt_utils.py +0 -0
  21. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/__init__.py +0 -0
  22. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/__init__.py +0 -0
  23. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/_private.py +0 -0
  24. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/init_add/__init__.py +0 -0
  25. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/init_add/add_controller_manager.py +0 -0
  26. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/init_add/add_model_manager.py +0 -0
  27. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/init_add/options.py +0 -0
  28. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/init_add/sdc_core_manager.py +0 -0
  29. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/init_add/settings_manager.py +0 -0
  30. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/init_add/utils.py +0 -0
  31. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_cc.py +0 -0
  32. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_db_tools.py +0 -0
  33. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_get_controller_infos.py +0 -0
  34. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_get_controller_url.py +0 -0
  35. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_get_model_infos.py +0 -0
  36. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_init.py +0 -0
  37. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_is_installed.py +0 -0
  38. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_make_model_js.py +0 -0
  39. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_new_model.py +0 -0
  40. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_open_api.py +0 -0
  41. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_overwrite_lib_file.py +0 -0
  42. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_shell_execute_script.py +0 -0
  43. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_update_links.py +0 -0
  44. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/sdc_update_url.py +0 -0
  45. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/management/commands/utils/__init__.py +0 -0
  46. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/rest_api.py +0 -0
  47. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/sdc_extentions/__init__.py +0 -0
  48. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/sdc_extentions/forms.py +0 -0
  49. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/sdc_extentions/import_manager.py +0 -0
  50. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/sdc_extentions/response.py +0 -0
  51. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/sdc_extentions/search.py +0 -0
  52. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/sdc_extentions/views.py +0 -0
  53. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/signals.py +0 -0
  54. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/.devcontainer/Dockerfile +0 -0
  55. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/.devcontainer/devcontainer.json +0 -0
  56. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/.devcontainer/on_create.sh +0 -0
  57. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/.devcontainer/on_startup.sh +0 -0
  58. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/babel.config.json +0 -0
  59. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/gulpfile.jsx +0 -0
  60. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/src/index.organizer.js +0 -0
  61. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/src/index.style.scss +0 -0
  62. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/static/img/favicon.png +0 -0
  63. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/tests/config/post-test-teardown.js +0 -0
  64. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/tests/config/pre-test-setup.js +0 -0
  65. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/tests/config/test-setup.js +0 -0
  66. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/webpack.config/webpack.bundle.config.jsx +0 -0
  67. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/webpack.config/webpack.default.config.jsx +0 -0
  68. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/webpack.config/webpack.development.config.jsx +0 -0
  69. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/Assets/webpack.config/webpack.production.config.jsx +0 -0
  70. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/asgi.py.txt +0 -0
  71. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/controller/template_controller.js.txt +0 -0
  72. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/controller/template_css.scss +0 -0
  73. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/controller/template_test.js.txt +0 -0
  74. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/controller/template_view.html +0 -0
  75. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/js_test.js.txt +0 -0
  76. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/models/detail.html +0 -0
  77. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/models/list.html +0 -0
  78. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/package.json +0 -0
  79. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/routing.py.txt +0 -0
  80. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/sdc_urls.py.txt +0 -0
  81. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/sdc_views.py.txt +0 -0
  82. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/settings_extension.py.txt +0 -0
  83. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/templates/base.html +0 -0
  84. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/templates/elements/form.html +0 -0
  85. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/templates/elements/inline_form.html +0 -0
  86. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/templates/index.html +0 -0
  87. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/template_files/urls.py.txt +0 -0
  88. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/templatetags/__init__.py +0 -0
  89. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/templatetags/addclass.py +0 -0
  90. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/templatetags/indexfilter.py +0 -0
  91. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_core/templatetags/sdc_filter.py +0 -0
  92. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_alert_messenger/sdc_alert_messenger.js +0 -0
  93. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_auto_submit/sdc_auto_submit.js +0 -0
  94. {simpledomcontrol-0.158.7/sdc_tools/Assets/src → simpledomcontrol-0.158.9/sdc_tools/Assets/bin}/sdc_tools/controller/sdc_detail_view/sdc_detail_view.js +0 -0
  95. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_dummy/sdc_dummy.js +0 -0
  96. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_error/sdc_error.js +0 -0
  97. {simpledomcontrol-0.158.7/sdc_tools/Assets/src → simpledomcontrol-0.158.9/sdc_tools/Assets/bin}/sdc_tools/controller/sdc_list_view/sdc_list_view.js +0 -0
  98. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_navigation_client/sdc_navigation_client.js +0 -0
  99. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_search_view/sdc_search_view.js +0 -0
  100. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/bin/sdc_tools/controller/sdc_update_on_change/sdc_update_on_change.js +0 -0
  101. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_alert_messenger/sdc_alert_messenger.js +0 -0
  102. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_alert_messenger/sdc_alert_messenger.scss +0 -0
  103. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_auto_submit/sdc_auto_submit.js +0 -0
  104. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_detail_view/sdc_detail_view.scss +0 -0
  105. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_dummy/sdc_dummy.js +0 -0
  106. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_dummy/sdc_dummy.scss +0 -0
  107. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_error/sdc_error.js +0 -0
  108. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_error/sdc_error.scss +0 -0
  109. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_list_view/sdc_list_view.scss +0 -0
  110. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_model_form/sdc_model_form.scss +0 -0
  111. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_navigation_client/sdc_navigation_client.js +0 -0
  112. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_navigator/sdc_navigator.scss +0 -0
  113. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_search_view/sdc_search_view.js +0 -0
  114. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_search_view/sdc_search_view.scss +0 -0
  115. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/controller/sdc_update_on_change/sdc_update_on_change.js +0 -0
  116. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/sdc_tools.organizer.js +0 -0
  117. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/src/sdc_tools/sdc_tools.style.scss +0 -0
  118. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/Assets/tests/sdc_tools.test.js +0 -0
  119. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/__init__.py +0 -0
  120. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/admin.py +0 -0
  121. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/apps.py +0 -0
  122. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/migrations/__init__.py +0 -0
  123. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/models.py +0 -0
  124. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/sdc_urls.py +0 -0
  125. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/sdc_views.py +0 -0
  126. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/email/base.html +0 -0
  127. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/dummy_sdc.html +0 -0
  128. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_alert_messenger.html +0 -0
  129. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_detail_view.html +0 -0
  130. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_dummy.html +0 -0
  131. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_error.html +0 -0
  132. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_list_view.html +0 -0
  133. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_model_form.html +0 -0
  134. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_navigator.html +0 -0
  135. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_search_select.html +0 -0
  136. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/sdc_tools/sdc/sdc_search_view.html +0 -0
  137. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/templates/widgets/searchable_select.html +0 -0
  138. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/tests.py +0 -0
  139. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/views.py +0 -0
  140. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_tools/widgets.py +0 -0
  141. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/register/register.js +0 -0
  142. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_change_password/sdc_change_password.js +0 -0
  143. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_confirm_email/sdc_confirm_email.js +0 -0
  144. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_login/sdc_login.js +0 -0
  145. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_logout/sdc_logout.js +0 -0
  146. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_password_forgotten/sdc_password_forgotten.js +0 -0
  147. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_reset_password/sdc_reset_password.js +0 -0
  148. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_user/sdc_user.js +0 -0
  149. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/controller/sdc_user_nav_btn/sdc_user_nav_btn.js +0 -0
  150. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/sdc_user.organizer.js +0 -0
  151. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/bin/sdc_user/sdc_user.style.css +0 -0
  152. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/register/register.js +0 -0
  153. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/register/register.scss +0 -0
  154. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_change_password/sdc_change_password.js +0 -0
  155. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_change_password/sdc_change_password.scss +0 -0
  156. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_confirm_email/sdc_confirm_email.js +0 -0
  157. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_confirm_email/sdc_confirm_email.scss +0 -0
  158. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_login/sdc_login.js +0 -0
  159. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_login/sdc_login.scss +0 -0
  160. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_logout/sdc_logout.js +0 -0
  161. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_logout/sdc_logout.scss +0 -0
  162. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_password_forgotten/sdc_password_forgotten.js +0 -0
  163. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_password_forgotten/sdc_password_forgotten.scss +0 -0
  164. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_reset_password/sdc_reset_password.js +0 -0
  165. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_reset_password/sdc_reset_password.scss +0 -0
  166. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_user/sdc_user.js +0 -0
  167. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_user/sdc_user.scss +0 -0
  168. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_user_nav_btn/sdc_user_nav_btn.js +0 -0
  169. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/controller/sdc_user_nav_btn/sdc_user_nav_btn.scss +0 -0
  170. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/sdc_user.organizer.js +0 -0
  171. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/src/sdc_user/sdc_user.style.scss +0 -0
  172. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/Assets/tests/sdc_user.test.js +0 -0
  173. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/__init__.py +0 -0
  174. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/admin.py +0 -0
  175. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/apps.py +0 -0
  176. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/forms.py +0 -0
  177. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/mails.py +0 -0
  178. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/migrations/0001_initial.py +0 -0
  179. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/migrations/__init__.py +0 -0
  180. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/models.py +0 -0
  181. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/sdc_urls.py +0 -0
  182. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/sdc_views.py +0 -0
  183. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/email/confirm.html +0 -0
  184. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/email/reset_password.html +0 -0
  185. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/models/SdcUser/SdcUser_details.html +0 -0
  186. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/models/SdcUser/SdcUser_list.html +0 -0
  187. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/register.html +0 -0
  188. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/sdc_change_password.html +0 -0
  189. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/sdc_confirm_email.html +0 -0
  190. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/sdc_login.html +0 -0
  191. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/sdc_logout.html +0 -0
  192. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/sdc_password_forgotten.html +0 -0
  193. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/sdc_reset_password.html +0 -0
  194. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/sdc_user/sdc/sdc_user_nav_btn.html +0 -0
  195. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/templates/widgets/read_only_password_hash.html +0 -0
  196. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/tests.py +0 -0
  197. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/views.py +0 -0
  198. {simpledomcontrol-0.158.7 → simpledomcontrol-0.158.9}/sdc_user/widgets.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: SimpleDomControl
3
- Version: 0.158.7
3
+ Version: 0.158.9
4
4
  Summary: Simple DOM control -> a django MVC framework
5
5
  License: Apache-2.0
6
6
  Keywords: django,MVC
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "SimpleDomControl"
3
- version = "0.158.7"
3
+ version = "0.158.9"
4
4
  authors = [ "Martin Starman <private@martin-starman.com>", ]
5
5
  description = "Simple DOM control -> a django MVC framework"
6
6
  readme = "README.md"
@@ -206,6 +206,7 @@ class SDCModelConsumer(WebsocketConsumer):
206
206
  def websocket_disconnect(self, close_code):
207
207
  for group in self._group_names:
208
208
  async_to_sync(self.channel_layer.group_discard(group, self.channel_name))
209
+ hasattr(self.model.SdcMeta, 'on_disconnected') and self.model.SdcMeta.on_disconnected(self._load_model('disconnect'))
209
210
  super().websocket_disconnect(close_code)
210
211
 
211
212
  def on_update(self, data):
@@ -286,7 +287,9 @@ class SDCModelConsumer(WebsocketConsumer):
286
287
  except Exception as e:
287
288
  extracted_list = traceback.extract_tb(e.__traceback__)
288
289
  e_text = [e.__str__()] + [item for item in traceback.StackSummary.from_list(extracted_list).format()]
290
+
289
291
  if settings.DEBUG:
292
+ logger.error(e_text[0])
290
293
  traceback.print_tb(e.__traceback__)
291
294
  else:
292
295
  logger.error(e_text)
@@ -316,8 +319,10 @@ class SDCModelConsumer(WebsocketConsumer):
316
319
  self.channel_name
317
320
  )
318
321
 
319
- def _load_model(self):
320
- queryset = self.model.get_queryset(self.scope['user'], self.scope['event_type'], self.queryset)
322
+ def _load_model(self, event_type=None):
323
+ if event_type is None:
324
+ event_type = self.scope['event_type']
325
+ queryset = self.model.get_queryset(self.scope['user'], event_type, self.queryset)
321
326
 
322
327
  data_load_result = self.model.data_load(self.scope['user'], queryset, self.queryset)
323
328
  if data_load_result is not None:
@@ -473,7 +478,8 @@ class SDCModelConsumer(WebsocketConsumer):
473
478
  loaded_data = self._load_model()
474
479
  view_name = json_data['args']['view_name']
475
480
  if not hasattr(self.model.SdcMeta, view_name):
476
- raise NotImplementedError()
481
+ text = f'"{view_name}" is not implemented in "{loaded_data.__class__.__name__}.SdcMeta".'
482
+ raise Exception(text)
477
483
  self.send(text_data=json.dumps({
478
484
  'type': json_data['event_type'],
479
485
  'event_id': json_data['event_id'],
@@ -168,7 +168,7 @@ _SDC_META_DEFAULT = {
168
168
  'create_form': None,
169
169
  'html_list_template': None,
170
170
  'html_detail_template': None,
171
- 'html_form_template': getattr(settings, 'MODEL_FORM_TEMPLATE', "elements/form.html")
171
+ 'html_form_template': getattr(settings, 'MODEL_FORM_TEMPLATE', "elements/form.html"),
172
172
  }
173
173
 
174
174
 
@@ -229,6 +229,10 @@ class SdcModel:
229
229
  """
230
230
  _sdc_checked = False
231
231
 
232
+ @classmethod
233
+ def on_disconnected(cls, qs: QuerySet):
234
+ pass
235
+
232
236
  @property
233
237
  def scope(self) -> dict[str, Any]:
234
238
  """
@@ -85,16 +85,16 @@ export class SdcModelFormController extends AbstractSDC {
85
85
  }
86
86
 
87
87
  if (typeof this.model === 'object' && this.model instanceof SdcQuerySet) {
88
- try {
89
- this.model = await this.model.get();
90
- this.id = this.model.id;
91
- } catch (e) {
92
- if (this.model.length !== 0) {
88
+ if(Object.keys(this.model.modelQuery).length === 0) {
89
+ this.id = null;
90
+ this.model = this.model.new();
91
+ } else {
92
+ try {
93
+ this.model = await this.model.get();
94
+ this.id = this.model.id;
95
+ } catch (e) {
93
96
  this.id = null;
94
97
  this.model = this.model.new();
95
- } else {
96
- console.error(e);
97
- throw e;
98
98
  }
99
99
  }
100
100
  }
@@ -118,10 +118,14 @@ export class SdcModelFormController extends AbstractSDC {
118
118
  }
119
119
 
120
120
  async onLoad($html) {
121
- await this.onInitForm(this.params);
122
-
123
- this.form = this.formGenerator(this.model).addClass('container-fluid');
124
- $html.find('.form-container').append(this.form);
121
+ await this.onInitForm(this.params).catch((e) => {
122
+ this.model = null;
123
+ console.error(e);
124
+ });
125
+ if (this.model) {
126
+ this.form = this.formGenerator(this.model).addClass('container-fluid');
127
+ $html.find('.form-container').append(this.form);
128
+ }
125
129
  // $html.find(`.not-${this.type}`).remove();
126
130
  return super.onLoad($html);
127
131
  }
@@ -182,7 +182,7 @@ export class SdcNavigatorController extends AbstractSDC {
182
182
  }
183
183
  this._is_processing = false;
184
184
  this._updateBreadcrumb();
185
- this._checkProcessQueue();
185
+ this._checkProcessQueue(controller);
186
186
  this.refresh();
187
187
  return;
188
188
  }
@@ -237,7 +237,7 @@ export class SdcNavigatorController extends AbstractSDC {
237
237
  } else {
238
238
  this._updateBreadcrumb();
239
239
  if (!this._manageDefault(last_view_array.empty_container)) {
240
- this._checkProcessQueue();
240
+ this._checkProcessQueue(controller);
241
241
  }
242
242
  setTimeout(() => {
243
243
  this.$container.find('.header-loading').removeClass('active');
@@ -264,12 +264,16 @@ export class SdcNavigatorController extends AbstractSDC {
264
264
  return c_list.join('~').split('~~').join('~');
265
265
  }
266
266
 
267
- _checkProcessQueue() {
267
+ _checkProcessQueue(controller) {
268
268
  let next = this._process_queue.shift();
269
269
  this._current_process = null;
270
270
  if (next) {
271
271
  this._pushState(next[0], next[1]);
272
- } else if (this._redirectAfterCurrentProcess) {
272
+ } else if (this._redirectAfterCurrentProcess || controller.autoRedirect) {
273
+ if(controller.autoRedirect) {
274
+ this._RedirectOnView(controller.autoRedirect);
275
+ }
276
+
273
277
  const temp = this._redirectAfterCurrentProcess;
274
278
  this._redirectAfterCurrentProcess = null;
275
279
  this.goTo(temp);
@@ -1,4 +1,4 @@
1
- import {AbstractSDC, app} from 'sdc_client';
1
+ import { AbstractSDC, app } from 'sdc_client';
2
2
 
3
3
 
4
4
  class SdcSearchSelectController extends AbstractSDC {
@@ -63,7 +63,7 @@ class SdcSearchSelectController extends AbstractSDC {
63
63
  this.name = name;
64
64
  if (modelName) {
65
65
  if (ids) {
66
- this.model = this.newModel(modelName, {pk__in: ids});
66
+ this.model = this.newModel(modelName, { pk__in: ids });
67
67
  } else {
68
68
  this.model = this.newModel(modelName);
69
69
  }
@@ -132,32 +132,28 @@ class SdcSearchSelectController extends AbstractSDC {
132
132
 
133
133
  current_val() {
134
134
  if (this._state === 0) {
135
- const content = () => {
136
- if (this.value.length === 0) {
137
- return <input type="hidden" className="timer-change" name={this.name} value=""/>
138
- } else {
139
- let values;
140
- if (this.multi) {
141
- values = `[${this.value.join(',')}]`;
142
- } else {
143
- values = this.value[0];
144
- }
145
- return <div className={this.multi ? 'multi' : ''}>{this._currentOption}
146
- <input className="timer-change" type="hidden" name={this.name} value={values}/>
147
- </div>
148
- }
135
+ if (this.value.length === 0) {
136
+ return <div>
137
+ <p sdc_click="onActivate" className="mb-2 custom-select form-control">
138
+ <span className="select-label">{gettext('Search & select...')}</span>
139
+ <span className="select-arrow"></span>
140
+ </p>
141
+ <input type="hidden" className="timer-change" name={this.name} value=""/>
142
+ </div>
149
143
  }
150
144
 
151
- return <div>
152
- <p sdc_click="onActivate" className="mb-2 custom-select form-control">
153
- <span className="select-label">{gettext('Search & select...')}</span>
154
- <span className="select-arrow"></span>
155
- </p>
156
- {content()}
145
+ let values;
146
+ if (this.multi) {
147
+ values = `[${this.value.join(',')}]`;
148
+ } else {
149
+ values = this.value[0];
150
+ }
151
+ return <div sdc_click="onActivate" className={this.multi ? 'multi custom-select-selected' : 'custom-select-selected'}>
152
+ {this._currentOption.map(this._optionBtnToSelected.bind(this))}
153
+ <input className="timer-change" type="hidden" name={this.name} value={values}/>
154
+ <span className="select-arrow"></span>
157
155
  </div>
158
156
  }
159
-
160
-
161
157
  }
162
158
 
163
159
  onActivate() {
@@ -182,9 +178,8 @@ class SdcSearchSelectController extends AbstractSDC {
182
178
  });
183
179
  }
184
180
 
185
- _storeSelectedOption($btn) {
181
+ _optionBtnToSelected($btn) {
186
182
  const currentOption = $btn.clone()[0];
187
- $btn.addClass('selected');
188
183
  // copy attributes into array first (NamedNodeMap is live)
189
184
  Array.from(currentOption.attributes).forEach(attr => currentOption.removeAttribute(attr.name));
190
185
  currentOption.className = "selected-option";
@@ -196,19 +191,28 @@ class SdcSearchSelectController extends AbstractSDC {
196
191
  currentOption.append(delBtn[0]);
197
192
  }
198
193
 
194
+ return currentOption;
195
+ }
196
+
197
+ _storeSelectedOption($btn) {
198
+ const newVal = String($btn.data('value'));
199
+ $btn.addClass('selected');
199
200
  if (!this.multi) {
200
201
  this.value = [newVal];
201
- this._currentOption = [currentOption];
202
+ this._currentOption.forEach(($selBtn) => $selBtn.removeClass('selected'));
203
+ this._currentOption = [$btn];
202
204
  } else if (!this.value.includes(newVal)) {
203
205
  this.value.push(newVal);
204
- this._currentOption.push(currentOption);
206
+ this._currentOption.push($btn);
205
207
  }
206
208
  }
207
209
 
208
- remove_selection($btn) {
210
+ remove_selection($btn, e) {
211
+ e.stopPropagation();
209
212
  const idx = this.value.indexOf($btn.data('value'));
210
213
  this.value.splice(idx, 1);
211
- this._currentOption.splice(idx, 1);
214
+ const [$selBtn] = this._currentOption.splice(idx, 1);
215
+ $selBtn.removeClass('selected');
212
216
  this.refresh().then(() => {
213
217
  this.find('.timer-change').trigger('change');
214
218
  });
@@ -0,0 +1 @@
1
+ (()=>{"use strict";const t=sdc_client;class SdcSearchSelectController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_search_select",this._state=0,this._searchIdx={},this._searchtimer=null,this._currentOption=[],this.startValues=[],this.value=[],this._allowDelete=!1,this.model=null,this.events.unshift({click:{".option-container":function(t){this.onSelect(t)}}})}onInitSearchSelect({name:t="unknown",required:e,value:i=[""],modelName:s,multiple:n,ids:r}){this.required=Boolean("true"===e?.toLocaleLowerCase()),this.multi=Boolean("true"===n?.toLocaleLowerCase()),this._allowDelete=!this.required||this.multi,this.startValues=i instanceof Array?i:JSON.parse(i.replaceAll("'",'"')),this.name=t,s&&(this.model=r?this.newModel(s,{pk__in:r}):this.newModel(s))}onLoad(t){if(this.onInitSearchSelect(this.params),!this.model){let e=this;const i=$('<div class="all-option-container"></div>');t.find(".main-select-options").append(i),this.find(".option-container").each((function(){e._prepareOption(this),i.append(this)}))}return super.onLoad(t)}willShow(){return this.model?new Promise((t=>{const e=this,i=this.model.view({viewName:"html_select_template",cbResolve:()=>{e.find(".option-container").each((function(){e._prepareOption(this)})),t(super.willShow())}});i.removeClass("container-fluid").addClass("all-option-container"),this.find(".main-select-options").append(i)})):super.willShow()}_prepareOption(t){const e=$(t),i=String(e.data("value")),s=i.replace(/[^a-zA-Z0-9_-]+/g,"__");this._searchIdx[s]=e.data("search").toLowerCase().split(",").map((t=>t.replaceAll(" ",""))),this._searchIdx[s].push(e.data("search")),e.addClass(`oc-${s}`).addClass("oc-style"),this.startValues.includes(i)&&this._storeSelectedOption(e)}onRefresh(){return 1===this._state?(setTimeout((()=>this.find(".search-term-input").focus()),100),this.find(".main-select-options").addClass("active").find(".search-term-input").val(""),this.find(".option-container").addClass("found")):this.find(".main-select-options").removeClass("active"),super.onRefresh()}current_val(){if(0===this._state){if(0===this.value.length)return sdcDom("div",null,sdcDom("p",{sdc_click:"onActivate",className:"mb-2 custom-select form-control"},sdcDom("span",{className:"select-label"},gettext("Search & select...")),sdcDom("span",{className:"select-arrow"})),sdcDom("input",{type:"hidden",className:"timer-change",name:this.name,value:""}));let t;return t=this.multi?`[${this.value.join(",")}]`:this.value[0],sdcDom("div",{sdc_click:"onActivate",className:this.multi?"multi custom-select-selected":"custom-select-selected"},this._currentOption.map(this._optionBtnToSelected.bind(this)),sdcDom("input",{className:"timer-change",type:"hidden",name:this.name,value:t}),sdcDom("span",{className:"select-arrow"}))}}onActivate(){this._state=1,this.refresh()}onDeactivate(t,e){const i=document.elementFromPoint(e.clientX,e.clientY);$(i).hasClass("background-event")&&this._deactivate()}_deactivate(){return new Promise((t=>{setTimeout((()=>{this._state=0,t(this.refresh())}),100)}))}_optionBtnToSelected(t){const e=t.clone()[0];Array.from(e.attributes).forEach((t=>e.removeAttribute(t.name))),e.className="selected-option";const i=String(t.data("value"));if(this._allowDelete){const t=$('<button type="button" sdc_click="remove_selection" class="delete-btn" aria-label="Remove Bouldering">&times;</button>');t.data("value",i),e.append(t[0])}return e}_storeSelectedOption(t){const e=String(t.data("value"));t.addClass("selected"),this.multi?this.value.includes(e)||(this.value.push(e),this._currentOption.push(t)):(this.value=[e],this._currentOption.forEach((t=>t.removeClass("selected"))),this._currentOption=[t])}remove_selection(t,e){e.stopPropagation();const i=this.value.indexOf(t.data("value"));this.value.splice(i,1);const[s]=this._currentOption.splice(i,1);s.removeClass("selected"),this.refresh().then((()=>{this.find(".timer-change").trigger("change")}))}onSelect(t){this._storeSelectedOption(t),this._deactivate().then((()=>{this.find(".timer-change").trigger("change")}))}updateSearch(t){this._searchtimer&&clearTimeout(this._searchtimer),this._searchtimer=setTimeout((()=>{this.find(".option-container").removeClass("found");const e=t.val().toLowerCase().split(/[,\s]+/);e&&Object.entries(this._searchIdx).forEach((([t,i])=>{e.every((t=>i.some((e=>e.includes(t)))))&&this.find(`.oc-${t}`).addClass("found")}))}),500)}}t.app.register(SdcSearchSelectController);class SdcDummyController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_dummy"}onInitDummy({text:t}){this._text=t}onLoad(t){return this.onInitDummy(this.params),t.find(".origen_content").append(this.$container.html()),super.onLoad(t)}willShow(){return super.willShow()}onRefresh(){return super.onRefresh()}page_text(){return sdcDom("p",{className:"col"},this._text||"")}}t.app.register(SdcDummyController);class SdcAutoSubmitController extends t.AbstractSDC{constructor(){super(),this.events.unshift({submit:{".ajax-form":function(e,i){i.preventDefault();const s=e[0];this.submitForm(s).then((e=>{(e.msg||e.header)&&(0,t.trigger)("pushMsg",e.header||"",e.msg||""),(0,t.clearErrorsInForm)($(s)),this.onSubmit(e)})).catch((i=>{let s=i.responseJSON;s&&(s.html&&(0,t.setErrorsInForm)(e,$(s.html)),(s.msg||s.header)&&(0,t.trigger)("pushErrorMsg",s.header||"",s.msg||"")),this.onErrorSubmit(i)}))}}})}onLoad(t){return super.onLoad(t)}willShow(){return super.willShow()}onRefresh(){return super.onRefresh()}onSubmit(){}onErrorSubmit(){}onChange(t){t.closest(".ajax-form").submit()}}t.app.register(SdcAutoSubmitController);class SdcErrorController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_error/%(code)s"}onLoad(t){return t.find(".error_content").append(this.$container.html()),super.onLoad(t)}willShow(){return super.willShow()}onRefresh(){return super.onRefresh()}}t.app.register(SdcErrorController);class SdcNavigationClientController extends t.AbstractSDC{constructor(){super(),this.menu_id=0,this._navController=null}onLoad(e){return(0,t.on)("_onResize",this),super.onLoad(e)}willShow(){return this.confirmPageLoaded(),super.willShow()}_onResize(){this.onResize()}onResize(){}confirmPageLoaded(){(0,t.trigger)("navLoaded",this),(0,t.trigger)("changeMenu",this.menu_id)}get navController(){return this._navController?.deref()}get activeController(){return this._navController?.deref().activeController}get navControllerPath(){return this._navController?.deref()._origin_target}}t.app.register(SdcNavigationClientController);class SdcAlertMessengerController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_alert_messenger",this.msgCounter=0}onLoad(e){return(0,t.on)("pushMsg",this),(0,t.on)("pushErrorMsg",this),super.onLoad(e)}willShow(){return super.willShow()}onRefresh(){return super.onRefresh()}pushMsg(t,e){return this._pushMsg(t,e,!1)}pushErrorMsg(t,e){return this._pushMsg(t,e,!0)}_pushMsg(t,e,i){"string"==typeof e&&(e=[e]),this._pushMsgArray(t,e,i)}_pushMsgArray(t,e,i){let s=this.find(".dummy_row");if(0===s.length)return;let n=s.clone();n.removeClass("dummy_row"),i&&n.addClass("error_box"),n.find(".msg_header").text(t),n.find(".msg_body")[0].innerHTML=e;let r=new Date,o=r.getMinutes();o=o<10?"0"+o:o,n.find(".msg_date").text(r.getHours()+":"+o),n.insertAfter(s);let a=this;var l;this.msgCounter++,this.find(".alert_msg_container").addClass("active"),l=n,setTimeout((()=>{l.remove(),a.msgCounter--,0===a.msgCounter&&a.find(".alert_msg_container").removeClass("active")}),2e3)}}t.app.registerGlobal(SdcAlertMessengerController);class SdcUpdateOnChangeController extends t.AbstractSDC{constructor(){super(),this._timer=null,this.isAutoChange=!0,this._isNotReady=!0,this._isChanged=!1,this._lastTimeChanged="",this.events.unshift({change:{".timer-change":this.change},keydown:{".timer-change":this.startTimer}})}onLoad(t){return super.onLoad(t)}willShow(){return this._isNotReady=!0,super.willShow()}onRefresh(){return setTimeout((()=>{this._isNotReady=!1}),500),super.onRefresh()}change(t){this.isAutoChange&&!this._isNotReady&&(this._timer&&(clearTimeout(this._timer),this._timer=null),!this._lastTimeChanged!==t.name&&(this.onChange($(t)),this._isChanged=!0,this._lastTimeChanged=""))}startTimer(t){this.isAutoChange&&!this._isNotReady&&(this._timer&&(clearTimeout(this._timer),this._timer=null),this._lastTimeChanged="",this._isChanged=!1,this._timer=setTimeout((()=>{this._isChanged||(this.onChange($(t)),this._lastTimeChanged=t.name)}),1e3))}}t.app.register(SdcUpdateOnChangeController);class SdcSearchViewController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_search_view",this.isRange=!0,this.isTotalCount=!0,this.dataIdxKey="next-idx",this.id=`${(new Date).getTime()}_${Math.random().toString(36).substring(7)}`,this.$form=null,this.events.unshift({submit:{".search-form":(t,e)=>{e.preventDefault()}},click:{".page-number-control-btn":function(t){this.$form[0].range_start.value=$(t).data(this.dataIdxKey),this.onChange()}}})}onInitSearch({url:t,rangeSize:e,rangeStart:i,rangeEnd:s,totalCount:n,removeLabels:r}){this.url=t||"",void 0===i||void 0===s?this.isRange=!1:(void 0===e&&(e=s-i),void 0===n&&(this.isTotalCount=!1),this.totalCount=n,this.rangeSize=e,this.range=[i-e-1,i,s],i<=1&&s>=n&&(this.isRange=!1)),this.removeLabels=r||!1}onLoad(t){return this.onInitSearch(this.params),this.$form=$(document.createElement("form")),t.find(".inner-form.search-form").append(this.$container.html()),this.$form.append(this.$container.html()),this.$form.attr("action",this.url),this.$form.attr("method","post"),this.$form.attr("id",this.id),super.onLoad(t)}willShow(){let t=this.find(".page-number-control");return this.find(".form-group").addClass("form-group-sm"),this.removeLabels&&(this.find(".form-input-container").removeClass("col-md-7"),this.find(".form-group").addClass("no-label")),this.isRange?(t.find(".range-span").text(this.range[1]+" - "+this.range[2]),this.isTotalCount?t.find(".total-amount-span").text(" / "+this.totalCount):t.find(".total-amount-span").remove(),this.range[1]>1?t.find(".page-number-control-btn-prev").data(this.dataIdxKey,this.range[0]):t.find(".page-number-control-btn-prev").addClass("disabled").prop("disabled",!0),this.range[2]<this.totalCount?t.find(".page-number-control-btn-next").data(this.dataIdxKey,this.range[2]):t.find(".page-number-control-btn-next").addClass("disabled").prop("disabled",!0),super.willShow()):(t.remove(),super.willShow())}onRefresh(){return super.onRefresh()}onChange(){let t=this.find(".inner-form.search-form");this.$form.find(".form-control").each((function(){if(""!==this.id){let e=t.find(`#${this.id}`);if("SELECT"===this.tagName){let t=$(this);t.empty(),t.append(`<option value="${e.val()}" selected">`)}else $(this).val(e.val())}})),this._parentController.onSearch?this._parentController.onSearch(this.$form[0]):console.error("SearchController parent needs to implement onSearch(form)")}}t.app.register(SdcSearchViewController).addMixin("sdc-update-on-change");class SdcDetailViewController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_detail_view",this.template_context=null,this.model=null}async onInitDetails({model:e,pk:i,id:s}){if(this.id??=s??i,this.model&&(e=this.model),e instanceof Promise&&(e=await e),"object"==typeof e&&e instanceof t.SdcModel)return this.model=e,void(this.querySetInstance=e.querySet);"object"==typeof e&&e instanceof t.SdcQuerySet&&(this.querySetInstance=e),"object"!=typeof e&&(this.querySetInstance=this.querySet(this.model_name||e,{id:this.id})),this.model=await this.querySetInstance.get()}async onLoad(t){await this.onInitDetails(this.params);const e=this.model.detailView({cbResolve:()=>{this.find(".detail-container").append(e),this.refresh().then((t=>null)),this._onUpdate.bind(this)},templateContext:this.template_context});return this.querySetInstance&&(this.querySetInstance.onUpdate=async()=>{await this._updateView(),this._onUpdate()}),super.onLoad(t)}willShow(){return super.willShow()}onRefresh(){return this.find('[data-bs-toggle="tooltip"]').each((function(){new Tooltip(this)})),super.onRefresh()}_onUpdate(){this.on_update&&this.model.update().then((()=>{this.on_update(this.model)}))}_updateView(){return new Promise((e=>{const i=this.model.detailView({cbResolve:()=>{$(".tooltip.fade.show").remove(),t.app.reconcile(this,i,this.find(".detail-container").children()),e()},templateContext:this.template_context})}))}}t.app.register(SdcDetailViewController);class SdcModelFormController extends t.AbstractSDC{constructor(){super(),this.id=null,this.contentUrl="/sdc_view/sdc_tools/sdc_model_form",this.model_name=null,this.isKeepEditing=null,this.isReset=null,this._isLoaded=!1,this.autoSave=null,this.model=null,this.formHeader=null,this.buttonText=null}async onInitForm({model:e,pk:i,id:s,next:n,filter:r=null,on_update:o,on_error:a,form_header:l,button_text:h,form_name:d=!1,reset_on_save:c=!1,editing_after_save:u=!1,auto_save:p=!0}){if(this.on_update??=o,this.on_error??=a,this.next??=n,this.buttonText??=h||gettext("Save"),this.formHeader??=l,this.autoSave??=p,this.isReset??=c,this.isKeepEditing??=u,this.id??=s??i,this.form_name??=d,this.id?r={id:this.id}:"function"==typeof r&&(r=r()),this.model&&(e=this.model),e instanceof Promise&&(e=await e),"object"==typeof e&&e instanceof t.SdcModel?(this.model=e,this.id??=e.id):"object"!=typeof e?this.model=this.querySet(this.model_name||e,r):"object"==typeof e&&e instanceof t.SdcQuerySet&&(this.model=e),"object"==typeof this.model&&this.model instanceof t.SdcQuerySet)if(0===Object.keys(this.model.modelQuery).length)this.id=null,this.model=this.model.new();else try{this.model=await this.model.get(),this.id=this.model.id}catch(t){this.id=null,this.model=this.model.new()}void 0===this.id||null===this.id?(this.isAutoChange=!1,this.type="create",this.formGenerator=t=>t.form({cbResolve:this._onFormLoaded.bind(this)})):this.form_name?(this.isAutoChange=this.autoSave,this.type="edit",this.formGenerator=t=>t.namedForm({formName:this.form_name,cbResolve:this._onFormLoaded.bind(this)})):(this.isAutoChange=!0,this.type="edit",this.formGenerator=t=>t.form({cbResolve:this._onFormLoaded.bind(this)}))}async onLoad(t){return await this.onInitForm(this.params).catch((t=>{this.model=null,console.error(t)})),this.model&&(this.form=this.formGenerator(this.model).addClass("container-fluid"),t.find(".form-container").append(this.form)),super.onLoad(t)}onChange(){this.form?.closest("form").submit()}willShow(){return super.willShow()}onRefresh(){return super.onRefresh()}_onFormLoaded(){this._isLoaded||this.refresh(),this._isLoaded=!0}_createFormToEditForm(){this.id=this.model.id,this.type="edit",this.isAutoChange=!0;const t=this.form?.closest("form"),e=t.clone(),i=e.find(".form-container").safeEmpty(),s=this.model.form({cbResolve:()=>{this.reconcile(e,t)}}).addClass("container-fluid");i.append(s)}submitModelForm(e,i){let s=this;return super.defaultSubmitModelForm(e,i).then((function(i){let n=!0;i&&"create"===i.type&&(n=!1,s.isReset?e[0].reset():s.isKeepEditing?(s.model.querySet.setIds(s.model.id),s._createFormToEditForm()):(0,t.trigger)("goTo",s.next||"..")),s.on_update&&s.on_update(i),n&&s.next&&(0,t.trigger)("goTo",s.next)})).catch((t=>{s.on_error&&s.on_error(t)}))}controller_name(){return`${this.type.replace(/^./g,(t=>t.toUpperCase()))} ${this.model.constructor.name.replace(/[A-Z]/g,(t=>" "+t)).replace(/^./g,(t=>t.toUpperCase()))}`}save_btn(){return this._isLoaded?this.autoSave||"edit"!==this.type?sdcDom("span",null):sdcDom("button",{className:"btn btn-success"},this.buttonText):sdcDom("h3",null,gettext("Loading..."))}header_top(){return this.formHeader?sdcDom("h3",null,this.formHeader):sdcDom("span",null)}}t.app.register(SdcModelFormController).addMixin("sdc-update-on-change");class SdcListViewController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_list_view",this.search_values={},this.model_name=null,this.template_context=null}async onInitList({model:e,filter:i,onUpdate:s}){this.model&&(e=this.model),e instanceof Promise&&(e=await e),this.filter??=i,this.model_name??=e,this.on_update??=s,"function"==typeof this.filter&&(this.filter=this.filter()),"object"==typeof e&&e instanceof t.SdcQuerySet&&(this.model=e),"object"!=typeof e&&(this.model=this.querySet(this.model_name)),this.filter&&this.model.setFilter(this.filter),this.on_update&&this.model.load().then((()=>{this.on_update(this.model)}))}onLoad(t){this.onInitList(this.params);let e=t.filter(".list-container");return 0===e.length&&(e=t.find(".list-container")),e.append(this.model.listView({modelQuery:this.search_values,templateContext:this.template_context})),this.model.onUpdate=this.model.onCreate=()=>{this.on_update&&this.model.update().then((()=>{this.on_update(this.model)})),this._updateView()},super.onLoad(t)}willShow(){return super.willShow()}onRefresh(){return this.find('[data-bs-toggle="tooltip"]').each((function(){new Tooltip(this)})),super.onRefresh()}removeInstance(t){this.model.delete({id:t.data("instance-pk")})}onSearch(t){new FormData(t).forEach(((t,e)=>this.search_values[e]=t)),this._updateView()}_updateView(){const e=this.model.listView({searchValues:this.search_values,templateContext:this.template_context,cbResolve:()=>{$(".tooltip.fade.show").remove(),t.app.reconcile(this,e,this.find(".list-container .container-fluid").first()).then((t=>null))}})}}t.app.register(SdcListViewController);const e="sdc_sub_detail_container",i="sdc_detail_view";class SdcNavigatorController extends t.AbstractSDC{constructor(){super(),this.contentUrl="/sdc_view/sdc_tools/sdc_navigator",this._setup(),this.events.unshift({click:{".navigation-links":function(t,e){e.preventDefault(),this.onNavLink(t,e)}}})}_setup(){this._isLoggedIn=!1,this._history_path=[],this._breadcrumb=[],this._activeContorller=[],this._history_idx=0,this._origin_target=[],this._$detail_view_container=[],this._default_controller=null,this._previous_args=[],this._is_processing=!1,this._process_queue=[],this._current_process=null,this._redirectAfterCurrentProcess=null,this._non_controller_path_prefix="/",this._menu_id=0}onInitNav({defaultController:t}){this._default_controller=t}onLoad(e){return this.onInitNav(this.params),(0,t.on)("onNavLink",this),(0,t.on)("onNavigateToController",this),(0,t.on)("_RedirectOnView",this),(0,t.on)("goTo",this),(0,t.on)("changeMenu",this),(0,t.on)("navigateToPage",this),(0,t.on)("navLoaded",this),(0,t.on)("login",this),(0,t.on)("logout",this),e.find(".main-nav-import-container").append(this.$container.html()),this._isLoggedIn=e.data("user"),super.onLoad(e)}willShow(){let e=this;$(window).resize((function(){(0,t.trigger)("_onResize",e)})),this._setupButton();let i=this._handleUrl(window.location.pathname);return history.replaceState(i,"",i.url,i),super.willShow()}onRefresh(){return super.onRefresh()}get activeController(){return this._activeContorller}get default_controller(){return this._default_controller?this._default_controller:(console.error(`Set the property data-default-controller in < ${this.tagName}> (tag name of the default controller)`),"")}onNavLink(t,e){e&&e.preventDefault(),this.goTo($(t).attr("href"))}goTo(t,e=null){return t=this._prepareUrl(t),this.onNavigateToController(t,e)}onNavigateToController(t,e=null){if(Array.isArray(t)&&(t=t.join("~")),e){if(Array.isArray(e))e=e.join("&");else if("object"==typeof e){const t=[];for(const[i,s]of Object.entries(e))t.push(`${i}=${s}`);e=t.join("&")}t+="~&"+e}this._pushState(t)}navigateToPage(e,i,s){this._current_process=[e,i],s&&this._updateButton(s.buttonSelector),this._is_processing=!0,this._origin_target=e;let n=this._getSubViewObj(i);if(this._previous_args=i,n.container.container.data("modal")){if(!this._currentModal){this._currentModal=new Modal(n.container.empty_container.closest(n.container.container.data("modal"))[0],{keyboard:!1}),this._currentModal.show(),this._currentModal.off=()=>{this.addEvent("hide.bs.modal",n.container.container.data("modal"),(()=>{}))};const t="/"+"~*".repeat(n.idx);this.addEvent("hide.bs.modal",n.container.container.data("modal"),(()=>{this._currentModal.off(),this.onNavigateToController(t)}))}}else this._currentModal&&(this._currentModal.off(),this._currentModal.hide(),this._currentModal=null);if(n.isBack){n.container.active_sub_container.removeClass("active loading"),n.container.empty_container.addClass("empty").removeClass("active loading"),n.container.active_container.addClass("active").removeClass("empty loading"),n.container.deeper_sub_container.safeEmpty().removeClass("empty loading");let e=t.app.getController(n.container.active_container.find("> ._sdc_controller_"));return this._manageDefault(n.container.active_container),"function"==typeof e.onBack&&e.onBack(),this._is_processing=!1,this._updateBreadcrumb(),this._checkProcessQueue(e),void this.refresh()}n.container.empty_container.addClass("loading"),n.container.active_sub_container.addClass("loading"),n.container.active_container.addClass("loading");let r=$(`<${n.target}_sdc-navigation-client></${n.target}_sdc-navigation-client>`);for(let[t,e]of Object.entries(i)){let i=t.split(".");i.length>0&&(t=i.at(-1));const s=t.replace(/([A-Z])/g,(t=>"-"+t.toLowerCase()));(1===i.length||i.length>1&&parseInt(i[0])===n.idx+1)&&r.data(s,e)}n.container.empty_container.safeEmpty().append(r),this.refresh(),this.find(".header-loading").addClass("active"),r.hasClass("_sdc_controller_")||(n.container.empty_container.empty().append('<sdc-error_sdc-navigation-client data-code="404"></sdc-error_sdc-navigation-client>'),this.refresh())}navLoaded(t){let e=this._history_path.length-1,i=this._preparedLastViewContainer(e);i.active_container.removeClass("active loading").addClass("empty"),i.active_sub_container.removeClass("active loading"),i.empty_container.addClass("active").removeClass("empty loading"),i.deeper_sub_container.safeEmpty().removeClass("empty loading"),this._breadcrumb.splice(e),this._activeContorller.splice(e),this._is_processing=!1,$(".tooltip.fade.show").remove(),this._breadcrumb[e]=t.controller_name(),this._activeContorller[e]=t,t._navController=new WeakRef(this),this._origin_target.length!==this._history_path.length?this._current_process&&this.navigateToPage(this._current_process[0],this._current_process[1]):(this._updateBreadcrumb(),this._manageDefault(i.empty_container)||this._checkProcessQueue(t),setTimeout((()=>{this.$container.find(".header-loading").removeClass("active")}),100))}_prepareUrl(t){Array.isArray(t)&&(0!==t.length&&[".","..",""].includes(t[0])||t.unshift(""),t=t.join("~"));let e=t.split("~").map((t=>t.split("/"))).flat().filter(((t,e)=>e<1||t.length>0));if(!e[0].startsWith(".")&&"*"!==e[0]&&""!==e[0]){for(let t=0;t<this._history_path.length;++t)e.unshift("*");e.unshift("")}return e.join("~").split("~~").join("~")}_checkProcessQueue(t){let e=this._process_queue.shift();if(this._current_process=null,e)this._pushState(e[0],e[1]);else if(this._redirectAfterCurrentProcess||t.autoRedirect){t.autoRedirect&&this._RedirectOnView(t.autoRedirect);const e=this._redirectAfterCurrentProcess;this._redirectAfterCurrentProcess=null,this.goTo(e)}}_RedirectOnView(t){let e=Array(this._history_path.length).fill("~*").join(""),{href:i}=this._handleUrl(e);this._redirectAfterCurrentProcess=$(t).attr("href").replace("next=..",`next=${i}`)}_updateBreadcrumb(){this._breadcrumb.splice(this._history_path.length),this._activeContorller.splice(this._history_path.length);const t=this.find(".breadcrumb"),e=this;t.each((function(){const t=$(this);t.safeEmpty();let i=t.data("offset");i=i?parseInt(i):0;let s=[];e._breadcrumb.length-i-1>0&&(s=Array(e._breadcrumb.length-i-1).fill(".."));for(let n=i;n<e._breadcrumb.length-1;++n)t.append(`<li class="breadcrumb-item"><a class="navigation-links" href="${s.join("~")}">${e._breadcrumb[n]}</a></li>`),s.pop();t.append(`<li class="breadcrumb-item">${e._breadcrumb.at(-1)}</li>`)}))}_preparedLastViewContainer(){let t=this._$detail_view_container.at(-1);const s=this._$detail_view_container.length-1;0===t.length&&console.error(`sdc-navigation only works if you have a <div class="${i}"></div>`),t.hasClass("prepared")||t.addClass("prepared").safeEmpty(),t.hasClass(`prepared${s}`)||t.addClass(`prepared${s}`).append(`<div data-nav-idx="${s}" class="${e} ${s}_${e} empty"></div>`).append(`<div data-nav-idx="${s}" class="${e} ${s}_${e} active"></div>`);let n=t.find(`> .${s}_${e}`).eq(1),r=t.find(`> .${s}_${e}`).first();return r.hasClass("empty")||([r,n]=[n,r]),{container:t,empty_container:r,active_container:n,active_sub_container:t.find(`.${e}.active`).filter((function(){return parseInt($(this).data("nav-idx"))!==s})),deeper_sub_container:t.find(`.${e}`).filter((function(){return parseInt($(this).data("nav-idx"))>s}))}}_getViewContainer(t=0){0===this._$detail_view_container.length&&this._$detail_view_container.push(this.find(`.${i}`)),this._$detail_view_container.splice(t+1).map((t=>t.addClass("sdc_nav_to_remove").find(`> .${e}`).addClass("loading")));let s=this._preparedLastViewContainer();if(this._$detail_view_container.length!==t+1){let t=s.active_container.find(`.${i}`);0!==t.length?this._$detail_view_container.push(t.first()):this._$detail_view_container.push(this._$detail_view_container.at(-1)),s=this._preparedLastViewContainer()}return s}_getSubViewObj(t){const e=this._origin_target;let i=0,s=!1;for(;i<Math.min(e.length,this._history_path.length)&&e[i]===this._history_path[i];)i++;return i>=e.length&&e[i-1]===this._history_path[i-1]?(i=e.length-1,s=e.length<this._history_path.length&&_.isMatch(this._previous_args,t),this._history_path=[...e]):i>=e.length?(i=e.length-1,this._history_path=[...e]):this._history_path=[...e].slice(0,i+1),{idx:i,container:this._getViewContainer(i),target:e[i],isBack:s}}changeMenu(t){t>0&&this._menu_id!==t&&(this._menu_id=t,this.find(".nav-menu-set").removeClass("active"),this.find(`.nav-menu-set.menu-${t}`).addClass("active"))}_setupButton(){let t=this;this.find(".navigation-links").each((function(){let e=$(this);if(!this.hasAttribute("href"))return;e.hasClass("_link-done")||(e.data("_origin_href",t._prepareUrl(e.attr("href"))),e.addClass("_link-done")),e.addClass("_link-done");let i=t._handleUrl(e.data("_origin_href"));e.attr("href",i.href),e.addClass(`nav-family-${i.path.at(-1)}`)}))}_updateButton(t){let e;return t&&(this._currentButton=t),e=this.find(this._currentButton.join(", ")),e&&(this.find(".navigation-links").removeClass("active"),e.addClass("active")),this._isLoggedIn?(this.find(".navigation-links.only-logged-in").show(),this.find(".navigation-links.only-logged-out").hide()):(this.find(".navigation-links.only-logged-in").hide(),this.find(".navigation-links.only-logged-out").show()),e}_handleUrl(t){let e,i,s,n=t.match(/[&?]/);n?(e=t.substring(n.index+1),i=t.substring(0,n.index).split(/[~]/)):(i=t.split(/[~]/),e="");let r=0;t.startsWith(".")?s=[...this._history_path]:(r=-1,this._non_controller_path_prefix=i.shift(),""===this._non_controller_path_prefix&&(this._non_controller_path_prefix="/"),s=[]);for(let t of i)".."===t?s.pop():"*"===t?this._history_path.length>s.length&&s.push(this._history_path[s.length]):"."!==t&&""!==t&&s.push(t);if(0!==i.length&&i.at(-1)!==s.at(-1)&&(r=0),0===s.length&&""!==this.default_controller)return this._handleUrl(`~${this.default_controller}`);t=this._non_controller_path_prefix+"~"+s.join("~"),e=this._parseArgs(e,s.length);let o=[];r+=s.length;for(const[t,i]of Object.entries(this._previous_args)){let s=t.split(".");!e.hasOwnProperty(t)&&(1===s.length||parseInt(s[0])<=r)&&(e[t]=i)}for(const[t,i]of Object.entries(e))o.push(`${t}=${i}`);o.length>0&&(t+="~&"+o.join("&"));let a=`${window.location.protocol}//${window.location.host}${t}`,l=s.map((t=>`.navigation-links.nav-family-${t}`));return{contentName:s.at(-1),args:e,path:s,buttonSelector:l,url:a,href:t}}_parseArgs(e,i=null){if(!e||""===e)return{};let s={},n=e.split("&");for(var r=0;r<n.length;r++){let e=n[r].split("="),o=e.shift();i&&o.split(".").length<2&&(o=`${i}.${o}`);let a=e.join("=");s.hasOwnProperty(o)&&console.error("Duplication of url params: "+o),s[o]=(0,t.checkIfParamNumberBoolOrString)(decodeURIComponent(a))}return s}_manageDefault(t){const e=t.find(`.${i}`).data("default-controller");return!!e&&(this._pushState(`.~${e}`,!0),!0)}_pushState(t,e=!0){if(this._is_processing)return void this._process_queue.push([t,e]);let i=this._handleUrl(t);e?history.pushState(i,"",i.url):this.navigateToPage(i.path,i.args,i)}login(){location.reload()}logout(){this.login()}}t.app.register(SdcNavigatorController),function(e){function updateStateFunc(i){let s=e[i];e[i]=function(n,r,o){let a=Array.apply(null,arguments);if("function"==typeof e["on"+i.toLowerCase()]&&e["on"+i.toLowerCase()]({state:n}),t.trigger.apply(t.app.events,["navigateToPage",n.path,n.args,n]),"function"==typeof s)return s.apply(e,a)}}updateStateFunc("replaceState"),updateStateFunc("pushState"),updateStateFunc("popState"),window.onpopstate=function(t){e.popState(t.state)}}(window.history)})();
@@ -229,37 +229,51 @@
229
229
  cursor: pointer;
230
230
  user-select: none;
231
231
  transition: all 0.2s ease;
232
+ /* ▼ arrow */
233
+ }
234
+ [sdc-search-select] .main-select .custom-select .select-arrow {
235
+ display: inline-block;
236
+ width: 0;
237
+ height: 0;
238
+ margin-left: 10px;
239
+ vertical-align: middle;
240
+ border-left: 6px solid transparent;
241
+ border-right: 6px solid transparent;
242
+ border-top: 6px solid #555;
243
+ transition: transform 0.2s ease;
232
244
  }
233
- [sdc-search-select] .main-select .custom-select:hover {
245
+ [sdc-search-select] .main-select .custom-select-selected:hover, [sdc-search-select] .main-select .custom-select:hover {
234
246
  border-color: #999;
235
247
  background-color: #fafafa;
236
248
  }
237
- [sdc-search-select] .main-select {
238
- /* Label text */
239
- }
240
- [sdc-search-select] .main-select .select-label {
241
- flex: 1;
242
- color: #333;
243
- font-size: 14px;
244
- }
245
- [sdc-search-select] .main-select {
249
+ [sdc-search-select] .main-select .custom-select-selected {
250
+ position: relative;
246
251
  /* ▼ arrow */
247
252
  }
248
- [sdc-search-select] .main-select .select-arrow {
249
- display: inline-block;
253
+ [sdc-search-select] .main-select .custom-select-selected .select-arrow {
254
+ position: absolute;
250
255
  width: 0;
251
256
  height: 0;
252
- margin-left: 10px;
257
+ right: 12px;
258
+ top: 12px;
253
259
  vertical-align: middle;
254
260
  border-left: 6px solid transparent;
255
261
  border-right: 6px solid transparent;
256
262
  border-top: 6px solid #555;
257
263
  transition: transform 0.2s ease;
258
264
  }
265
+ [sdc-search-select] .main-select {
266
+ /* Label text */
267
+ }
268
+ [sdc-search-select] .main-select .select-label {
269
+ flex: 1;
270
+ color: #333;
271
+ font-size: 14px;
272
+ }
259
273
  [sdc-search-select] .main-select {
260
274
  /* Optional — rotate arrow when open */
261
275
  }
262
- [sdc-search-select] .main-select .custom-select.open .select-arrow {
276
+ [sdc-search-select] .main-select .open .select-arrow {
263
277
  transform: rotate(-180deg);
264
278
  }
265
279
  [sdc-search-select] .main-select .selected-option {
@@ -37,8 +37,6 @@ export class SdcDetailViewController extends AbstractSDC {
37
37
  model = await model;
38
38
  }
39
39
 
40
-
41
-
42
40
  if (typeof model === 'object' && model instanceof SdcModel) {
43
41
  this.model = model;
44
42
  this.querySetInstance = model.querySet;
@@ -88,11 +86,6 @@ export class SdcDetailViewController extends AbstractSDC {
88
86
  return super.onRefresh();
89
87
  }
90
88
 
91
-
92
- removeInstance($btn, e) {
93
- this.model.delete();
94
- }
95
-
96
89
  _onUpdate() {
97
90
  if (this.on_update) {
98
91
  this.model.update().then(() => {
@@ -1,4 +1,4 @@
1
- import {AbstractSDC, app} from 'sdc_client';
1
+ import { AbstractSDC, app, SdcModel, SdcQuerySet } from 'sdc_client';
2
2
 
3
3
  export class SdcListViewController extends AbstractSDC {
4
4
 
@@ -12,7 +12,7 @@ export class SdcListViewController extends AbstractSDC {
12
12
  /**
13
13
  * Events is an array of dom events.
14
14
  * The pattern is {'event': {'dom_selector': handler}}
15
- * Uncommend the following line to add events;
15
+ * Uncomment the following line to add events;
16
16
  */
17
17
  // this.events.unshift({'click': {'.header-sample': (ev, $elem)=> $elem.css('border', '2px solid black')}}});
18
18
  }
@@ -26,22 +26,31 @@ export class SdcListViewController extends AbstractSDC {
26
26
  // - onRemove //
27
27
  //-------------------------------------------------//
28
28
 
29
- onInitList({ model, filter, onUpdate }) {
30
- if (!this.model) {
31
- if (this.model_name) {
32
- model = this.model_name;
33
- }
29
+ async onInitList({ model, filter, onUpdate }) {
30
+ if (this.model) {
31
+ model = this.model;
32
+ }
34
33
 
35
- this.model = this.querySet(model);
34
+ if (model instanceof Promise) {
35
+ model = await model;
36
36
  }
37
- if (onUpdate) {
38
- this.on_update = onUpdate;
37
+ this.filter ??= filter;
38
+ this.model_name ??= model;
39
+ this.on_update ??= onUpdate;
40
+ if (typeof this.filter === 'function') {
41
+ this.filter = this.filter();
42
+ }
43
+
44
+ if (typeof model === 'object' && model instanceof SdcQuerySet) {
45
+ this.model = model;
39
46
  }
40
- if (typeof filter === 'function') {
41
- filter = filter();
47
+
48
+ if (typeof model !== 'object') {
49
+ this.model = this.querySet(this.model_name);
42
50
  }
43
- if (typeof filter === 'object') {
44
- this.model.filter(filter);
51
+
52
+ if(this.filter) {
53
+ this.model.setFilter(this.filter);
45
54
  }
46
55
 
47
56
  if (this.on_update) {
@@ -57,6 +66,7 @@ export class SdcListViewController extends AbstractSDC {
57
66
  if (lc.length === 0) {
58
67
  lc = $html.find('.list-container');
59
68
  }
69
+
60
70
  lc.append(this.model.listView({modelQuery: this.search_values, templateContext: this.template_context}));
61
71
  this.model.onUpdate = this.model.onCreate = () => {
62
72
  if (this.on_update) {
@@ -64,6 +74,7 @@ export class SdcListViewController extends AbstractSDC {
64
74
  this.on_update(this.model);
65
75
  });
66
76
  }
77
+
67
78
  this._updateView();
68
79
  };
69
80
  return super.onLoad($html);
@@ -85,16 +85,16 @@ export class SdcModelFormController extends AbstractSDC {
85
85
  }
86
86
 
87
87
  if (typeof this.model === 'object' && this.model instanceof SdcQuerySet) {
88
- try {
89
- this.model = await this.model.get();
90
- this.id = this.model.id;
91
- } catch (e) {
92
- if (this.model.length !== 0) {
88
+ if(Object.keys(this.model.modelQuery).length === 0) {
89
+ this.id = null;
90
+ this.model = this.model.new();
91
+ } else {
92
+ try {
93
+ this.model = await this.model.get();
94
+ this.id = this.model.id;
95
+ } catch (e) {
93
96
  this.id = null;
94
97
  this.model = this.model.new();
95
- } else {
96
- console.error(e);
97
- throw e;
98
98
  }
99
99
  }
100
100
  }
@@ -118,10 +118,14 @@ export class SdcModelFormController extends AbstractSDC {
118
118
  }
119
119
 
120
120
  async onLoad($html) {
121
- await this.onInitForm(this.params);
122
-
123
- this.form = this.formGenerator(this.model).addClass('container-fluid');
124
- $html.find('.form-container').append(this.form);
121
+ await this.onInitForm(this.params).catch((e) => {
122
+ this.model = null;
123
+ console.error(e);
124
+ });
125
+ if (this.model) {
126
+ this.form = this.formGenerator(this.model).addClass('container-fluid');
127
+ $html.find('.form-container').append(this.form);
128
+ }
125
129
  // $html.find(`.not-${this.type}`).remove();
126
130
  return super.onLoad($html);
127
131
  }
@@ -182,7 +182,7 @@ export class SdcNavigatorController extends AbstractSDC {
182
182
  }
183
183
  this._is_processing = false;
184
184
  this._updateBreadcrumb();
185
- this._checkProcessQueue();
185
+ this._checkProcessQueue(controller);
186
186
  this.refresh();
187
187
  return;
188
188
  }
@@ -237,7 +237,7 @@ export class SdcNavigatorController extends AbstractSDC {
237
237
  } else {
238
238
  this._updateBreadcrumb();
239
239
  if (!this._manageDefault(last_view_array.empty_container)) {
240
- this._checkProcessQueue();
240
+ this._checkProcessQueue(controller);
241
241
  }
242
242
  setTimeout(() => {
243
243
  this.$container.find('.header-loading').removeClass('active');
@@ -264,12 +264,16 @@ export class SdcNavigatorController extends AbstractSDC {
264
264
  return c_list.join('~').split('~~').join('~');
265
265
  }
266
266
 
267
- _checkProcessQueue() {
267
+ _checkProcessQueue(controller) {
268
268
  let next = this._process_queue.shift();
269
269
  this._current_process = null;
270
270
  if (next) {
271
271
  this._pushState(next[0], next[1]);
272
- } else if (this._redirectAfterCurrentProcess) {
272
+ } else if (this._redirectAfterCurrentProcess || controller.autoRedirect) {
273
+ if(controller.autoRedirect) {
274
+ this._RedirectOnView(controller.autoRedirect);
275
+ }
276
+
273
277
  const temp = this._redirectAfterCurrentProcess;
274
278
  this._redirectAfterCurrentProcess = null;
275
279
  this.goTo(temp);