ethyca-fides 2.63.3rc0__py2.py3-none-any.whl → 2.64.1b0__py2.py3-none-any.whl

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 (362) hide show
  1. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/METADATA +2 -2
  2. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/RECORD +249 -242
  3. fides/_version.py +3 -3
  4. fides/api/alembic/migrations/versions/ba414a58ba90_create_manual_task_config_tables.py +121 -0
  5. fides/api/api/v1/endpoints/connection_endpoints.py +16 -3
  6. fides/api/api/v1/endpoints/oauth_endpoints.py +8 -2
  7. fides/api/db/base.py +4 -0
  8. fides/api/models/attachment.py +37 -23
  9. fides/api/models/manual_tasks/__init__.py +6 -0
  10. fides/api/models/manual_tasks/manual_task.py +11 -1
  11. fides/api/models/manual_tasks/manual_task_config.py +136 -0
  12. fides/api/models/manual_tasks/manual_task_log.py +13 -9
  13. fides/api/schemas/connection_configuration/connection_config.py +19 -4
  14. fides/api/schemas/manual_tasks/manual_task_config.py +311 -0
  15. fides/api/schemas/manual_tasks/manual_task_schemas.py +1 -1
  16. fides/api/schemas/manual_tasks/manual_task_status.py +1 -1
  17. fides/api/schemas/privacy_request.py +2 -0
  18. fides/api/service/connectors/query_configs/saas_query_config.py +15 -0
  19. fides/api/service/privacy_request/attachment_handling.py +132 -0
  20. fides/api/service/privacy_request/dsr_package/dsr_report_builder.py +264 -46
  21. fides/api/service/privacy_request/dsr_package/templates/attachments_index.html +33 -0
  22. fides/api/service/privacy_request/dsr_package/templates/collection_index.html +34 -9
  23. fides/api/service/privacy_request/dsr_package/templates/main.css +45 -2
  24. fides/api/service/privacy_request/dsr_package/templates/welcome.html +12 -8
  25. fides/api/service/privacy_request/request_runner_service.py +258 -139
  26. fides/api/service/storage/gcs.py +15 -3
  27. fides/api/service/storage/s3.py +28 -14
  28. fides/api/service/storage/util.py +45 -7
  29. fides/api/tasks/csv_utils.py +170 -0
  30. fides/api/tasks/encryption_utils.py +42 -0
  31. fides/api/tasks/storage.py +85 -91
  32. fides/api/util/cache.py +6 -3
  33. fides/api/util/saas_util.py +1 -0
  34. fides/config/redis_settings.py +105 -44
  35. fides/service/manual_tasks/manual_task_config_service.py +370 -0
  36. fides/service/manual_tasks/manual_task_service.py +231 -87
  37. fides/service/manual_tasks/utils.py +185 -0
  38. fides/ui-build/static/admin/404.html +1 -1
  39. fides/ui-build/static/admin/_next/static/chunks/1040-630c7f4284dc6f70.js +1 -0
  40. fides/ui-build/static/admin/_next/static/chunks/1100-d43cb04522a6505c.js +1 -0
  41. fides/ui-build/static/admin/_next/static/chunks/1316-6cc72a45ebf7ff81.js +1 -0
  42. fides/ui-build/static/admin/_next/static/chunks/1817-b4688ba5042ec687.js +1 -0
  43. fides/ui-build/static/admin/_next/static/chunks/2430-b480401d44c55416.js +1 -0
  44. fides/ui-build/static/admin/_next/static/chunks/2599-6c4d22e75028d8b6.js +1 -0
  45. fides/ui-build/static/admin/_next/static/chunks/2921-aabf41bf3d7573f9.js +1 -0
  46. fides/ui-build/static/admin/_next/static/chunks/3450-bdaeb35442d810b4.js +1 -0
  47. fides/ui-build/static/admin/_next/static/chunks/3505-a79256cd851dfab4.js +1 -0
  48. fides/ui-build/static/admin/_next/static/chunks/3513-8677ee280eaef0da.js +1 -0
  49. fides/ui-build/static/admin/_next/static/chunks/3855-0dec3e7d9e886550.js +1 -0
  50. fides/ui-build/static/admin/_next/static/chunks/3872-ffa16c2df7ef0ab6.js +1 -0
  51. fides/ui-build/static/admin/_next/static/chunks/3923-5d580fbb1dd6ae01.js +1 -0
  52. fides/ui-build/static/admin/_next/static/chunks/401-fceaae662cfca5a5.js +1 -0
  53. fides/ui-build/static/admin/_next/static/chunks/4060-71cd041e5a57ca5a.js +1 -0
  54. fides/ui-build/static/admin/_next/static/chunks/409-037cfc3f096150f0.js +1 -0
  55. fides/ui-build/static/admin/_next/static/chunks/4121-78a76e980acbd539.js +1 -0
  56. fides/ui-build/static/admin/_next/static/chunks/4230-1cdb7ea1be370ed3.js +1 -0
  57. fides/ui-build/static/admin/_next/static/chunks/431-f72599f01b98f07d.js +1 -0
  58. fides/ui-build/static/admin/_next/static/chunks/4481-f597a7cf03f8c9e1.js +1 -0
  59. fides/ui-build/static/admin/_next/static/chunks/5309-4511df9708d5a63c.js +1 -0
  60. fides/ui-build/static/admin/_next/static/chunks/5574-3cd33b3a6c937899.js +1 -0
  61. fides/ui-build/static/admin/_next/static/chunks/6277-3fb4c7fc790a6d20.js +1 -0
  62. fides/ui-build/static/admin/_next/static/chunks/6662-cb11881dcaabe5e2.js +1 -0
  63. fides/ui-build/static/admin/_next/static/chunks/6853-a4097260e402980e.js +1 -0
  64. fides/ui-build/static/admin/_next/static/chunks/6882-3cc73d407a088d7d.js +1 -0
  65. fides/ui-build/static/admin/_next/static/chunks/69-6889d6674c95e7b5.js +1 -0
  66. fides/ui-build/static/admin/_next/static/chunks/6954-13a25cef3a8fdd76.js +1 -0
  67. fides/ui-build/static/admin/_next/static/chunks/699-8ca44b0de9fa20f0.js +1 -0
  68. fides/ui-build/static/admin/_next/static/chunks/7553-a95939c32d54b5b7.js +1 -0
  69. fides/ui-build/static/admin/_next/static/chunks/79-5670e31eb65d0a53.js +1 -0
  70. fides/ui-build/static/admin/_next/static/chunks/796-9a6b13c838e25538.js +1 -0
  71. fides/ui-build/static/admin/_next/static/chunks/8433-adb1fcb29d82f1b7.js +1 -0
  72. fides/ui-build/static/admin/_next/static/chunks/9046-fdf53cc7e926a8c1.js +1 -0
  73. fides/ui-build/static/admin/_next/static/chunks/{905-8ab919e7b274ed50.js → 905-742074a074be1055.js} +2 -2
  74. fides/ui-build/static/admin/_next/static/chunks/9226-ba6587e46ec7659a.js +1 -0
  75. fides/ui-build/static/admin/_next/static/chunks/{9392.81edc11e3a175275.js → 9392.25024e070026343d.js} +1 -1
  76. fides/ui-build/static/admin/_next/static/chunks/9676.e60a53f1f5890847.js +1 -0
  77. fides/ui-build/static/admin/_next/static/chunks/9767-e49b065d03ce4e80.js +1 -0
  78. fides/ui-build/static/admin/_next/static/chunks/9951-f9ab5cac7e2c05ab.js +1 -0
  79. fides/ui-build/static/admin/_next/static/chunks/pages/404-ac2f0844e5c4b4cd.js +1 -0
  80. fides/ui-build/static/admin/_next/static/chunks/pages/{_app-f70bffa5a7903c46.js → _app-8ec6e466f3373ac0.js} +10 -10
  81. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-0a5f2310ce6b1059.js +1 -0
  82. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-00cb904825aad7e3.js +1 -0
  83. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-587e21d14e0a5196.js +1 -0
  84. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-fa7305b88c1afd20.js +1 -0
  85. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-f140ec9d8e8a0f7a.js +1 -0
  86. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-0edb7c92518e7d21.js +1 -0
  87. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-d8d926f0735a2546.js +1 -0
  88. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-5c949f2e3cef2398.js +1 -0
  89. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-130155cfb4a0bcc7.js +1 -0
  90. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-1135ad8924d32c36.js +1 -0
  91. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-776855e370414beb.js +1 -0
  92. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-21c23f75ff1135d9.js +1 -0
  93. fides/ui-build/static/admin/_next/static/chunks/pages/consent-4d5ea70a77df1bb8.js +1 -0
  94. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]/{[resourceUrn]-18e3faf7963962e4.js → [resourceUrn]-c623d6f1a61c8ea9.js} +1 -1
  95. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-030ee304cbe5e530.js +1 -0
  96. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-cfac259a30641e68.js +1 -0
  97. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/resources/{[resourceUrn]-7320524a47104798.js → [resourceUrn]-57bd5cdf784f059f.js} +1 -1
  98. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-7b5aec33da578745.js +1 -0
  99. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-c948f93c833d4358.js +1 -0
  100. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-333f53caab751428.js +1 -0
  101. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-27205f8457a1ecb0.js +1 -0
  102. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-20a1043f6a06198f.js +1 -0
  103. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/detection/{[resourceUrn]-4c526db0c30c488a.js → [resourceUrn]-06edce289876dea1.js} +1 -1
  104. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{detection-6f27dbb7c8edc69d.js → detection-faf326a6200637d0.js} +1 -1
  105. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/discovery/{[resourceUrn]-562d2b8ae90dd1f0.js → [resourceUrn]-64acf269256ee74f.js} +1 -1
  106. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/{discovery-fe7f51502eda57c9.js → discovery-8c3e4be6d36da66d.js} +1 -1
  107. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-fb50de22f83edd4a.js +1 -0
  108. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-41ab27c4195cfa93.js +1 -0
  109. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-6e2caba24b3e78c2.js +1 -0
  110. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-904d43e31157aa55.js +1 -0
  111. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-d4e31a1c4a58800e.js +1 -0
  112. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-8f7d16bc5e9229c8.js +1 -0
  113. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-4a33dd0371dbaebc.js +1 -0
  114. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-e88509346b2d2851.js +1 -0
  115. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-8f9b8890018e1ea5.js +1 -0
  116. fides/ui-build/static/admin/_next/static/chunks/pages/{fides-js-docs-80b241bf6cddb72e.js → fides-js-docs-5d8fd1af75f19e2f.js} +1 -1
  117. fides/ui-build/static/admin/_next/static/chunks/pages/index-1adb6bcb71701ac2.js +1 -0
  118. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-fdc2964fa7d1d8fd.js +1 -0
  119. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-adc286ff254e7f41.js +1 -0
  120. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-9b4d1d61c7c97509.js +1 -0
  121. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-f8fd4795e260887c.js +1 -0
  122. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-aa744ae8b61e5ff2.js +1 -0
  123. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-3407158757fb3627.js +1 -0
  124. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-47e947c02ae90fd0.js +1 -0
  125. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-24f9a44512ce8827.js +1 -0
  126. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-e567a69f8c37fb9a.js +1 -0
  127. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-35a33f9c7def2220.js +1 -0
  128. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-780e18dde8e38099.js +1 -0
  129. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-7a17dffa515e5560.js +1 -0
  130. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-91dd0039cc2b70bc.js +1 -0
  131. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-b01cbbaac34dadbc.js +1 -0
  132. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-a15410de7f1d0f84.js +1 -0
  133. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-1a1aa83a3f88844c.js +1 -0
  134. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-c4e1b69fb5bab61a.js +1 -0
  135. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-19737d4f21aadbee.js +1 -0
  136. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-9ccb295110feee20.js +1 -0
  137. fides/ui-build/static/admin/_next/static/chunks/pages/properties-3a1037a2e036212a.js +1 -0
  138. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-4cdbbb8cd1d8698e.js +1 -0
  139. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-965cc21889b25e44.js +1 -0
  140. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-0e1c381d488a7ada.js +1 -0
  141. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-d0e350d2a2667883.js +1 -0
  142. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-7796fbf458f8f159.js +1 -0
  143. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-6f866bc799a5f67f.js +1 -0
  144. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-0b44b2b224077dcd.js +1 -0
  145. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-5d00e1155bd11178.js +1 -0
  146. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-d2cdbe770683e9df.js +1 -0
  147. fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-811dadb489f23d7d.js +1 -0
  148. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-24108f615ff5e1e7.js +1 -0
  149. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-54f142bc3e4c95ba.js +1 -0
  150. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-fef247a87baeb080.js +1 -0
  151. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-6eb886e7b7e6785b.js +1 -0
  152. fides/ui-build/static/admin/_next/static/chunks/pages/systems-7b71274334c559a4.js +1 -0
  153. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-18534d2a79a3850b.js +1 -0
  154. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-75d41fde668b9025.js +1 -0
  155. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-dd43755b687c09a7.js +1 -0
  156. fides/ui-build/static/admin/_next/static/chunks/webpack-0a61b5bd21a41fe6.js +1 -0
  157. fides/ui-build/static/admin/_next/static/css/c693338e3bc8dcc6.css +1 -0
  158. fides/ui-build/static/admin/_next/static/nRQ3pmK_d3F5PJE39rP2h/_buildManifest.js +1 -0
  159. fides/ui-build/static/admin/add-systems/manual.html +1 -1
  160. fides/ui-build/static/admin/add-systems/multiple.html +1 -1
  161. fides/ui-build/static/admin/add-systems.html +1 -1
  162. fides/ui-build/static/admin/consent/configure/add-vendors.html +1 -1
  163. fides/ui-build/static/admin/consent/configure.html +1 -1
  164. fides/ui-build/static/admin/consent/privacy-experience/[id].html +1 -1
  165. fides/ui-build/static/admin/consent/privacy-experience/new.html +1 -1
  166. fides/ui-build/static/admin/consent/privacy-experience.html +1 -1
  167. fides/ui-build/static/admin/consent/privacy-notices/[id].html +1 -1
  168. fides/ui-build/static/admin/consent/privacy-notices/new.html +1 -1
  169. fides/ui-build/static/admin/consent/privacy-notices.html +1 -1
  170. fides/ui-build/static/admin/consent/properties.html +1 -1
  171. fides/ui-build/static/admin/consent/reporting.html +1 -1
  172. fides/ui-build/static/admin/consent.html +1 -1
  173. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn]/[resourceUrn].html +1 -1
  174. fides/ui-build/static/admin/data-catalog/[systemId]/projects/[projectUrn].html +1 -1
  175. fides/ui-build/static/admin/data-catalog/[systemId]/projects.html +1 -1
  176. fides/ui-build/static/admin/data-catalog/[systemId]/resources/[resourceUrn].html +1 -1
  177. fides/ui-build/static/admin/data-catalog/[systemId]/resources.html +1 -1
  178. fides/ui-build/static/admin/data-catalog.html +1 -1
  179. fides/ui-build/static/admin/data-discovery/action-center/[monitorId]/[systemId].html +1 -1
  180. fides/ui-build/static/admin/data-discovery/action-center/[monitorId].html +1 -1
  181. fides/ui-build/static/admin/data-discovery/action-center.html +1 -1
  182. fides/ui-build/static/admin/data-discovery/activity.html +1 -1
  183. fides/ui-build/static/admin/data-discovery/detection/[resourceUrn].html +1 -1
  184. fides/ui-build/static/admin/data-discovery/detection.html +1 -1
  185. fides/ui-build/static/admin/data-discovery/discovery/[resourceUrn].html +1 -1
  186. fides/ui-build/static/admin/data-discovery/discovery.html +1 -1
  187. fides/ui-build/static/admin/datamap.html +1 -1
  188. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName]/[...subfieldNames].html +1 -1
  189. fides/ui-build/static/admin/dataset/[datasetId]/[collectionName].html +1 -1
  190. fides/ui-build/static/admin/dataset/[datasetId].html +1 -1
  191. fides/ui-build/static/admin/dataset/new.html +1 -1
  192. fides/ui-build/static/admin/dataset.html +1 -1
  193. fides/ui-build/static/admin/datastore-connection/[id].html +1 -1
  194. fides/ui-build/static/admin/datastore-connection/new.html +1 -1
  195. fides/ui-build/static/admin/datastore-connection.html +1 -1
  196. fides/ui-build/static/admin/images/connector-logos/salesforce.svg +41 -0
  197. fides/ui-build/static/admin/index.html +1 -1
  198. fides/ui-build/static/admin/integrations/[id].html +1 -1
  199. fides/ui-build/static/admin/integrations.html +1 -1
  200. fides/ui-build/static/admin/lib/fides-ext-gpp.js +1 -1
  201. fides/ui-build/static/admin/lib/fides-headless.js +1 -1
  202. fides/ui-build/static/admin/lib/fides-preview.js +1 -1
  203. fides/ui-build/static/admin/lib/fides-tcf.js +2 -2
  204. fides/ui-build/static/admin/lib/fides.js +2 -2
  205. fides/ui-build/static/admin/login/[provider].html +1 -1
  206. fides/ui-build/static/admin/login.html +1 -1
  207. fides/ui-build/static/admin/messaging/[id].html +1 -1
  208. fides/ui-build/static/admin/messaging/add-template.html +1 -1
  209. fides/ui-build/static/admin/messaging.html +1 -1
  210. fides/ui-build/static/admin/poc/ant-components.html +1 -1
  211. fides/ui-build/static/admin/poc/form-experiments/AntForm.html +1 -1
  212. fides/ui-build/static/admin/poc/form-experiments/FormikAntFormItem.html +1 -1
  213. fides/ui-build/static/admin/poc/form-experiments/FormikControlled.html +1 -1
  214. fides/ui-build/static/admin/poc/form-experiments/FormikField.html +1 -1
  215. fides/ui-build/static/admin/poc/form-experiments/FormikSpreadField.html +1 -1
  216. fides/ui-build/static/admin/poc/forms.html +1 -1
  217. fides/ui-build/static/admin/poc/table-migration.html +1 -1
  218. fides/ui-build/static/admin/privacy-requests/[id].html +1 -1
  219. fides/ui-build/static/admin/privacy-requests/configure/messaging.html +1 -1
  220. fides/ui-build/static/admin/privacy-requests/configure/storage.html +1 -1
  221. fides/ui-build/static/admin/privacy-requests/configure.html +1 -1
  222. fides/ui-build/static/admin/privacy-requests.html +1 -1
  223. fides/ui-build/static/admin/properties/[id].html +1 -1
  224. fides/ui-build/static/admin/properties/add-property.html +1 -1
  225. fides/ui-build/static/admin/properties.html +1 -1
  226. fides/ui-build/static/admin/reporting/datamap.html +1 -1
  227. fides/ui-build/static/admin/settings/about/alpha.html +1 -1
  228. fides/ui-build/static/admin/settings/about.html +1 -1
  229. fides/ui-build/static/admin/settings/consent/[configuration_id]/[purpose_id].html +1 -1
  230. fides/ui-build/static/admin/settings/consent.html +1 -1
  231. fides/ui-build/static/admin/settings/custom-fields.html +1 -1
  232. fides/ui-build/static/admin/settings/domain-records.html +1 -1
  233. fides/ui-build/static/admin/settings/domains.html +1 -1
  234. fides/ui-build/static/admin/settings/email-templates.html +1 -1
  235. fides/ui-build/static/admin/settings/locations.html +1 -1
  236. fides/ui-build/static/admin/settings/organization.html +1 -1
  237. fides/ui-build/static/admin/settings/regulations.html +1 -1
  238. fides/ui-build/static/admin/systems/configure/[id]/test-datasets.html +1 -1
  239. fides/ui-build/static/admin/systems/configure/[id].html +1 -1
  240. fides/ui-build/static/admin/systems.html +1 -1
  241. fides/ui-build/static/admin/taxonomy.html +1 -1
  242. fides/ui-build/static/admin/user-management/new.html +1 -1
  243. fides/ui-build/static/admin/user-management/profile/[id].html +1 -1
  244. fides/ui-build/static/admin/user-management.html +1 -1
  245. fides/api/service/privacy_request/dsr_package/templates/item.html +0 -37
  246. fides/ui-build/static/admin/_next/static/chunks/1099-667e84655846e78c.js +0 -1
  247. fides/ui-build/static/admin/_next/static/chunks/1100-0b01f500b1eaf60d.js +0 -1
  248. fides/ui-build/static/admin/_next/static/chunks/1817-951f58ddd5d46081.js +0 -1
  249. fides/ui-build/static/admin/_next/static/chunks/1904-964f8eb328dc2715.js +0 -1
  250. fides/ui-build/static/admin/_next/static/chunks/2310-744354001d01f366.js +0 -1
  251. fides/ui-build/static/admin/_next/static/chunks/2921-49af55ad7c631c93.js +0 -1
  252. fides/ui-build/static/admin/_next/static/chunks/3119-e36ae5071c8f27a5.js +0 -1
  253. fides/ui-build/static/admin/_next/static/chunks/3505-113f9c95d34b7aae.js +0 -1
  254. fides/ui-build/static/admin/_next/static/chunks/3513-5c2d412a84a78971.js +0 -1
  255. fides/ui-build/static/admin/_next/static/chunks/3872-45cc725e241211f0.js +0 -1
  256. fides/ui-build/static/admin/_next/static/chunks/3923-b4f701ada3ef0ee0.js +0 -1
  257. fides/ui-build/static/admin/_next/static/chunks/401-7e800aed05537126.js +0 -1
  258. fides/ui-build/static/admin/_next/static/chunks/4060-90a52a9afc655bfc.js +0 -1
  259. fides/ui-build/static/admin/_next/static/chunks/4121-66b0e00d5e7ae817.js +0 -1
  260. fides/ui-build/static/admin/_next/static/chunks/4132-9b1731bfec6ee537.js +0 -1
  261. fides/ui-build/static/admin/_next/static/chunks/4481-7f6710c928bb0cb0.js +0 -1
  262. fides/ui-build/static/admin/_next/static/chunks/5258-2079138c8cc34f6c.js +0 -1
  263. fides/ui-build/static/admin/_next/static/chunks/5404-2694509cf5fa96da.js +0 -1
  264. fides/ui-build/static/admin/_next/static/chunks/5487-2cbd8d2169eb2a65.js +0 -1
  265. fides/ui-build/static/admin/_next/static/chunks/5683-37137111b3e769fb.js +0 -1
  266. fides/ui-build/static/admin/_next/static/chunks/6202-081545c7822d09af.js +0 -1
  267. fides/ui-build/static/admin/_next/static/chunks/6277-459e054b2702c60e.js +0 -1
  268. fides/ui-build/static/admin/_next/static/chunks/641-7e4eef3222cbda70.js +0 -1
  269. fides/ui-build/static/admin/_next/static/chunks/6853-688df0b88fe65fd5.js +0 -1
  270. fides/ui-build/static/admin/_next/static/chunks/69-00cba94689b9e740.js +0 -1
  271. fides/ui-build/static/admin/_next/static/chunks/6954-4e313b4599b8763d.js +0 -1
  272. fides/ui-build/static/admin/_next/static/chunks/7553-08bc3d9f66695111.js +0 -1
  273. fides/ui-build/static/admin/_next/static/chunks/79-fc548561beed136f.js +0 -1
  274. fides/ui-build/static/admin/_next/static/chunks/796-d6586308ed44334b.js +0 -1
  275. fides/ui-build/static/admin/_next/static/chunks/7980-736f9fd1e749ddd2.js +0 -1
  276. fides/ui-build/static/admin/_next/static/chunks/8032-74d94f7bd5b81c89.js +0 -1
  277. fides/ui-build/static/admin/_next/static/chunks/8433-51870336908fb253.js +0 -1
  278. fides/ui-build/static/admin/_next/static/chunks/8499-1fd392d0be9e8ee4.js +0 -1
  279. fides/ui-build/static/admin/_next/static/chunks/8702-d1c8296f9f6afc10.js +0 -1
  280. fides/ui-build/static/admin/_next/static/chunks/9033-fdd87182c15b91e2.js +0 -1
  281. fides/ui-build/static/admin/_next/static/chunks/9187-851756440f79cd75.js +0 -1
  282. fides/ui-build/static/admin/_next/static/chunks/9327-6a53461c9764b16f.js +0 -1
  283. fides/ui-build/static/admin/_next/static/chunks/9494-1ffb888b95289891.js +0 -1
  284. fides/ui-build/static/admin/_next/static/chunks/9676.61cf5f6d6a083175.js +0 -1
  285. fides/ui-build/static/admin/_next/static/chunks/9767-afd674014a1d1152.js +0 -1
  286. fides/ui-build/static/admin/_next/static/chunks/pages/404-ec04f826f3dd79ea.js +0 -1
  287. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/manual-1bec086d567aacff.js +0 -1
  288. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems/multiple-f68bf100e4e60e88.js +0 -1
  289. fides/ui-build/static/admin/_next/static/chunks/pages/add-systems-effde5cfe49de55f.js +0 -1
  290. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure/add-vendors-ec95ed8cb0712828.js +0 -1
  291. fides/ui-build/static/admin/_next/static/chunks/pages/consent/configure-4cc195e15e0c3cc8.js +0 -1
  292. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience/[id]-be8972c79fb39705.js +0 -1
  293. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-experience-ccf96207de3b74ea.js +0 -1
  294. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/[id]-b9823cc008372cee.js +0 -1
  295. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices/new-373f5772ab41bc93.js +0 -1
  296. fides/ui-build/static/admin/_next/static/chunks/pages/consent/privacy-notices-b9beeee1bde5ca79.js +0 -1
  297. fides/ui-build/static/admin/_next/static/chunks/pages/consent/properties-6ab3a5baafebd199.js +0 -1
  298. fides/ui-build/static/admin/_next/static/chunks/pages/consent/reporting-8562790ae07f17c9.js +0 -1
  299. fides/ui-build/static/admin/_next/static/chunks/pages/consent-42d4d2d6e0253671.js +0 -1
  300. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects/[projectUrn]-9d1df6d890671b0c.js +0 -1
  301. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog/[systemId]/projects-7eb08af333baaa8e.js +0 -1
  302. fides/ui-build/static/admin/_next/static/chunks/pages/data-catalog-bb57eed84f59a932.js +0 -1
  303. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]/[systemId]-47eb34aef3e31ac6.js +0 -1
  304. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center/[monitorId]-76cefefc53e84c7f.js +0 -1
  305. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/action-center-9d8e84a8b4bf568d.js +0 -1
  306. fides/ui-build/static/admin/_next/static/chunks/pages/data-discovery/activity-f208fef5e72dafd6.js +0 -1
  307. fides/ui-build/static/admin/_next/static/chunks/pages/datamap-db45aa864e9dda8a.js +0 -1
  308. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]/[...subfieldNames]-d5cfdebc74654337.js +0 -1
  309. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]/[collectionName]-618b89228f83435e.js +0 -1
  310. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/[datasetId]-12fc86f15a4c764e.js +0 -1
  311. fides/ui-build/static/admin/_next/static/chunks/pages/dataset/new-c23d18a9b56c2e3c.js +0 -1
  312. fides/ui-build/static/admin/_next/static/chunks/pages/dataset-e3b2d8e3980ab093.js +0 -1
  313. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/[id]-6e27257eccf65f01.js +0 -1
  314. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection/new-bbac1f624424282d.js +0 -1
  315. fides/ui-build/static/admin/_next/static/chunks/pages/datastore-connection-84eb56f5a07bdf4f.js +0 -1
  316. fides/ui-build/static/admin/_next/static/chunks/pages/index-773182b5e35d0045.js +0 -1
  317. fides/ui-build/static/admin/_next/static/chunks/pages/integrations/[id]-eb28c927da5bd653.js +0 -1
  318. fides/ui-build/static/admin/_next/static/chunks/pages/integrations-781808bca01f8048.js +0 -1
  319. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/[id]-b51bee8680d66b20.js +0 -1
  320. fides/ui-build/static/admin/_next/static/chunks/pages/messaging/add-template-1de479533f733fbd.js +0 -1
  321. fides/ui-build/static/admin/_next/static/chunks/pages/messaging-7dc295b3ed3d2224.js +0 -1
  322. fides/ui-build/static/admin/_next/static/chunks/pages/poc/ant-components-f64dac3392f5ded7.js +0 -1
  323. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/AntForm-eb020bfac4bee532.js +0 -1
  324. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikAntFormItem-0bd62e28b539e114.js +0 -1
  325. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikControlled-936877004113c2a6.js +0 -1
  326. fides/ui-build/static/admin/_next/static/chunks/pages/poc/form-experiments/FormikField-6416f01524482af9.js +0 -1
  327. fides/ui-build/static/admin/_next/static/chunks/pages/poc/forms-3f4e1313d1f2969b.js +0 -1
  328. fides/ui-build/static/admin/_next/static/chunks/pages/poc/table-migration-1db7a54437db7db0.js +0 -1
  329. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/[id]-64236fd0141414fd.js +0 -1
  330. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/messaging-8cab04871908cfeb.js +0 -1
  331. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure/storage-150d40428245ee0c.js +0 -1
  332. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests/configure-b6c876dceb16ad1b.js +0 -1
  333. fides/ui-build/static/admin/_next/static/chunks/pages/privacy-requests-20cdb2c8a03deae1.js +0 -1
  334. fides/ui-build/static/admin/_next/static/chunks/pages/properties/[id]-54bcc875592d1fb9.js +0 -1
  335. fides/ui-build/static/admin/_next/static/chunks/pages/properties/add-property-644dc669b508a79a.js +0 -1
  336. fides/ui-build/static/admin/_next/static/chunks/pages/properties-9a88220d03e7e02f.js +0 -1
  337. fides/ui-build/static/admin/_next/static/chunks/pages/reporting/datamap-70dc1081df37ea69.js +0 -1
  338. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about/alpha-3c71b4dbcb6fd6c9.js +0 -1
  339. fides/ui-build/static/admin/_next/static/chunks/pages/settings/about-7cb16e0000dd16c9.js +0 -1
  340. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent/[configuration_id]/[purpose_id]-a18d8f12ee8dcf5d.js +0 -1
  341. fides/ui-build/static/admin/_next/static/chunks/pages/settings/consent-dc220e116ad5c09e.js +0 -1
  342. fides/ui-build/static/admin/_next/static/chunks/pages/settings/custom-fields-55ddc5f25b86f28e.js +0 -1
  343. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domain-records-5ca7decded228bc8.js +0 -1
  344. fides/ui-build/static/admin/_next/static/chunks/pages/settings/domains-a6fafa1be2834c40.js +0 -1
  345. fides/ui-build/static/admin/_next/static/chunks/pages/settings/email-templates-e633750d2b45ddd6.js +0 -1
  346. fides/ui-build/static/admin/_next/static/chunks/pages/settings/locations-3948686cbd372969.js +0 -1
  347. fides/ui-build/static/admin/_next/static/chunks/pages/settings/organization-04ece499c22d23f4.js +0 -1
  348. fides/ui-build/static/admin/_next/static/chunks/pages/settings/regulations-7752305084280cca.js +0 -1
  349. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]/test-datasets-9e5f9066be6f218d.js +0 -1
  350. fides/ui-build/static/admin/_next/static/chunks/pages/systems/configure/[id]-86de9e6d72098e45.js +0 -1
  351. fides/ui-build/static/admin/_next/static/chunks/pages/systems-cac52e6c3abf6a15.js +0 -1
  352. fides/ui-build/static/admin/_next/static/chunks/pages/taxonomy-60d5930b6855679b.js +0 -1
  353. fides/ui-build/static/admin/_next/static/chunks/pages/user-management/profile/[id]-b0f4c34752d32c73.js +0 -1
  354. fides/ui-build/static/admin/_next/static/chunks/pages/user-management-7dee83dd6d9292aa.js +0 -1
  355. fides/ui-build/static/admin/_next/static/chunks/webpack-8457bad7859c44f0.js +0 -1
  356. fides/ui-build/static/admin/_next/static/css/1fdf5c593349dbc6.css +0 -1
  357. fides/ui-build/static/admin/_next/static/f_8LkSZkhtDM14f8gbC0b/_buildManifest.js +0 -1
  358. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/WHEEL +0 -0
  359. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/entry_points.txt +0 -0
  360. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/licenses/LICENSE +0 -0
  361. {ethyca_fides-2.63.3rc0.dist-info → ethyca_fides-2.64.1b0.dist-info}/top_level.txt +0 -0
  362. /fides/ui-build/static/admin/_next/static/{f_8LkSZkhtDM14f8gbC0b → nRQ3pmK_d3F5PJE39rP2h}/_ssgManifest.js +0 -0
@@ -1,4 +1,4 @@
1
- from typing import Optional
1
+ from typing import Any, Optional, cast
2
2
 
3
3
  from loguru import logger
4
4
  from sqlalchemy import select
@@ -6,18 +6,22 @@ from sqlalchemy.orm import Session
6
6
 
7
7
  from fides.api.models.fides_user import FidesUser
8
8
  from fides.api.models.manual_tasks.manual_task import ManualTask, ManualTaskReference
9
- from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
9
+ from fides.api.models.manual_tasks.manual_task_config import ManualTaskConfig
10
10
  from fides.api.schemas.manual_tasks.manual_task_schemas import (
11
- ManualTaskLogStatus,
12
11
  ManualTaskParentEntityType,
13
12
  ManualTaskReferenceType,
14
13
  ManualTaskType,
15
14
  )
15
+ from fides.service.manual_tasks.manual_task_config_service import (
16
+ ManualTaskConfigService,
17
+ )
18
+ from fides.service.manual_tasks.utils import with_task_logging
16
19
 
17
20
 
18
21
  class ManualTaskService:
19
22
  def __init__(self, db: Session):
20
23
  self.db = db
24
+ self.config_service = ManualTaskConfigService(db)
21
25
 
22
26
  def get_task(
23
27
  self,
@@ -25,9 +29,12 @@ class ManualTaskService:
25
29
  parent_entity_id: Optional[str] = None,
26
30
  parent_entity_type: Optional[ManualTaskParentEntityType] = None,
27
31
  task_type: Optional[ManualTaskType] = None,
28
- ) -> Optional[ManualTask]:
32
+ ) -> ManualTask:
29
33
  """Get the manual task using provided filters.
30
34
 
35
+ This is a flexible lookup method that can find tasks based on various filters.
36
+ It's normal for this method to return None if no task matches the given filters.
37
+
31
38
  Args:
32
39
  task_id: The task ID
33
40
  parent_entity_id: The parent entity ID
@@ -35,89 +42,203 @@ class ManualTaskService:
35
42
  task_type: The task type
36
43
 
37
44
  Returns:
38
- Optional[ManualTask]: The manual task for the connection, if it exists
45
+ ManualTask: The matching task
39
46
  """
40
47
  if not any([task_id, parent_entity_id, parent_entity_type, task_type]):
41
- logger.warning("No filters provided to get_task. Returning None.")
42
- return None
48
+ logger.debug("No filters provided to get_task")
49
+ raise ValueError("No filters provided to get_task")
43
50
 
44
- stmt = select(ManualTask) # type: ignore[arg-type]
51
+ # Build filter conditions and a human-readable description
52
+ filters = []
53
+ filter_desc = []
45
54
  if task_id:
46
- stmt = stmt.where(ManualTask.id == task_id)
55
+ filters.append(ManualTask.id == task_id)
56
+ filter_desc.append(f"task_id={task_id}")
47
57
  if parent_entity_id:
48
- stmt = stmt.where(ManualTask.parent_entity_id == parent_entity_id)
58
+ filters.append(ManualTask.parent_entity_id == parent_entity_id)
59
+ filter_desc.append(f"parent_entity_id={parent_entity_id}")
49
60
  if parent_entity_type:
50
- stmt = stmt.where(ManualTask.parent_entity_type == parent_entity_type)
61
+ filters.append(ManualTask.parent_entity_type == parent_entity_type)
62
+ filter_desc.append(f"parent_entity_type={parent_entity_type}")
51
63
  if task_type:
52
- stmt = stmt.where(ManualTask.task_type == task_type)
53
- return self.db.execute(stmt).scalar_one_or_none()
64
+ filters.append(ManualTask.task_type == task_type)
65
+ filter_desc.append(f"task_type={task_type}")
54
66
 
55
- # User Management
56
- def assign_users_to_task(
57
- self, db: Session, task: ManualTask, user_ids: list[str]
67
+ # Apply all filters at once
68
+ stmt = select(ManualTask) # type: ignore[arg-type]
69
+ if filters:
70
+ stmt = stmt.where(*filters)
71
+
72
+ task = self.db.execute(stmt).scalar_one_or_none()
73
+ if task is None:
74
+ logger.debug(f"No task found with filters: {filter_desc}")
75
+ raise ValueError(f"No task found with filters: {filter_desc}")
76
+ return task
77
+
78
+ @with_task_logging("Provided user IDs verified")
79
+ def _non_existent_users(
80
+ self, non_existent_user_ids: list[str], *, task_id: str
58
81
  ) -> None:
59
- """Assigns users to this task. We can assign one or more users to a task.
82
+ """This is a helper function to raise an error if users do not exist.
83
+ If non_existent_user_ids is empty, this function will instead create
84
+ a success log entry.
60
85
 
61
86
  Args:
62
- db: Database session
63
- task: The task to assign users to
64
- user_ids: List of user IDs to assign
87
+ non_existent_user_ids: List of non-existent user IDs
88
+ task_id: The task ID
89
+
90
+ Returns:
91
+ None
65
92
  """
66
- user_ids = list(set(user_ids))
67
- if not user_ids:
68
- raise ValueError("User ID is required for assignment")
69
-
70
- # Create new user assignment
71
- for user_id in user_ids:
72
- # if user is already assigned, skip
73
- if user_id in task.assigned_users:
74
- continue
75
- # verify user exists
76
- user = db.query(FidesUser).filter_by(id=user_id).first()
77
- if not user:
78
- ManualTaskLog.create_error_log(
79
- db=db,
80
- task_id=task.id,
81
- message=f"Failed to add user {user_id} to task {task.id}: user does not exist",
82
- details={"user_id": user_id},
83
- )
84
- continue
85
-
86
- ManualTaskReference.create(
87
- db=db,
88
- data={
89
- "task_id": task.id,
90
- "reference_id": user_id,
91
- "reference_type": ManualTaskReferenceType.assigned_user,
92
- },
93
+ if len(non_existent_user_ids) > 0:
94
+ raise ValueError(
95
+ f"User(s) {sorted(list(non_existent_user_ids))} do not exist"
93
96
  )
94
97
 
95
- # Log the user assignment
96
- ManualTaskLog.create_log(
97
- db=db,
98
- task_id=task.id,
99
- status=ManualTaskLogStatus.updated,
100
- message=f"User {user_id} assigned to task",
101
- details={"assigned_user_id": user_id},
102
- )
98
+ def _create_log_data(self, task_id: str, details: dict[str, Any]) -> dict[str, Any]:
99
+ """Create standard log data structure.
103
100
 
104
- def unassign_users_from_task(
105
- self, db: Session, task: ManualTask, user_ids: list[str]
101
+ Args:
102
+ task_id: The task ID
103
+ details: The log details
104
+
105
+ Returns:
106
+ dict: The log data structure
107
+ """
108
+ return {
109
+ "task_id": task_id,
110
+ "details": details,
111
+ }
112
+
113
+ def _handle_user_errors(
114
+ self,
115
+ non_existent_users: list[str],
116
+ task_id: str,
117
+ details: dict[str, Any],
118
+ success_count: int,
119
+ error_key: str,
106
120
  ) -> None:
107
- """Remove the user assignment from this task.
121
+ """Handle errors for non-existent users.
108
122
 
109
123
  Args:
110
- db: Database session
111
- task: The task to unassign users from
112
- user_ids: List of user IDs to unassign
124
+ non_existent_users: List of non-existent user IDs
125
+ task_id: The task ID
126
+ details: The log details to update
127
+ success_count: Number of successful operations
128
+ error_key: Key to use for error details
129
+
130
+ Raises:
131
+ ValueError: If no successful operations and users don't exist
132
+ """
133
+ try:
134
+ self._non_existent_users(non_existent_users, task_id=task_id)
135
+ except ValueError as e:
136
+ details[error_key] = sorted(non_existent_users)
137
+ if success_count == 0:
138
+ raise e
139
+
140
+ def _get_existing_users(self, user_ids: list[str]) -> set[str]:
141
+ """Get set of existing user IDs from the provided list.
142
+
143
+ Args:
144
+ user_ids: List of user IDs to check
145
+
146
+ Returns:
147
+ set: Set of existing user IDs
113
148
  """
114
- user_ids = list(set(user_ids))
115
- if not user_ids:
116
- raise ValueError("User ID is required for unassignment")
149
+ return set(
150
+ user.id
151
+ for user in self.db.query(FidesUser)
152
+ .filter(FidesUser.id.in_(user_ids))
153
+ .all()
154
+ )
117
155
 
118
- # Get references to unassign
119
- references_to_unassign = (
120
- db.query(ManualTaskReference)
156
+ def _handle_user_operation(
157
+ self,
158
+ task_id: str,
159
+ user_ids: list[str],
160
+ operation_type: str,
161
+ current_users: Optional[set[str]] = None,
162
+ ) -> tuple[set[str], dict[str, Any]]:
163
+ """Handle user assignment/unassignment operations.
164
+
165
+ Args:
166
+ task_id: The task ID
167
+ user_ids: List of user IDs to process
168
+ operation_type: Type of operation ('assign' or 'unassign')
169
+ current_users: Optional set of current users
170
+
171
+ Returns:
172
+ tuple: (processed_users, log_data)
173
+ """
174
+ if not (user_ids := list(set(user_ids))):
175
+ raise ValueError(f"User ID is required for {operation_type}ment")
176
+
177
+ existing_users = set(
178
+ u.id
179
+ for u in self.db.query(FidesUser).filter(FidesUser.id.in_(user_ids)).all()
180
+ )
181
+ processed_users = (
182
+ existing_users - (current_users or set())
183
+ if operation_type == "assign"
184
+ else existing_users
185
+ )
186
+ details = {f"{operation_type}ed_users": sorted(list(processed_users))}
187
+
188
+ if non_existing := list(set(user_ids) - existing_users):
189
+ try:
190
+ self._non_existent_users(non_existing, task_id=task_id)
191
+ except ValueError as e:
192
+ details[f"user_ids_not_{operation_type}ed"] = sorted(non_existing)
193
+ if not processed_users:
194
+ raise e
195
+
196
+ return processed_users, {"task_id": task_id, "details": details}
197
+
198
+ @with_task_logging("Assign users to task")
199
+ def assign_users_to_task(
200
+ self, task_id: str, user_ids: list[str]
201
+ ) -> tuple[ManualTask, dict[str, Any]]:
202
+ """Assign users to a task.
203
+
204
+ Args:
205
+ task_id: The task ID
206
+ user_ids: List of user IDs to assign
207
+
208
+ Returns:
209
+ Tuple containing the task and log data, the log data is
210
+ captured by the with_task_logging decorator. and the task is
211
+ returned to the caller.
212
+ """
213
+ task = self.get_task(task_id=task_id)
214
+ users_to_assign, log_data = self._handle_user_operation(
215
+ task_id, user_ids, "assign", set(task.assigned_users)
216
+ )
217
+
218
+ if users_to_assign:
219
+ self.db.bulk_insert_mappings(
220
+ ManualTaskReference,
221
+ [
222
+ {
223
+ "task_id": task.id,
224
+ "reference_id": user_id,
225
+ "reference_type": ManualTaskReferenceType.assigned_user,
226
+ }
227
+ for user_id in users_to_assign
228
+ ],
229
+ )
230
+ self.db.flush()
231
+ self.db.refresh(task)
232
+
233
+ return task, log_data
234
+
235
+ @with_task_logging("Unassign users from task")
236
+ def unassign_users_from_task(
237
+ self, task_id: str, user_ids: list[str]
238
+ ) -> tuple[ManualTask, dict[str, Any]]:
239
+ task = self.get_task(task_id=task_id)
240
+ refs_to_unassign = (
241
+ self.db.query(ManualTaskReference)
121
242
  .filter(
122
243
  ManualTaskReference.task_id == task.id,
123
244
  ManualTaskReference.reference_type
@@ -127,24 +248,47 @@ class ManualTaskService:
127
248
  .all()
128
249
  )
129
250
 
130
- # Delete references and log unassignments
131
- for ref in references_to_unassign:
132
- ref.delete(db)
133
- ManualTaskLog.create_log(
134
- db=db,
135
- task_id=task.id,
136
- status=ManualTaskLogStatus.updated,
137
- message=f"User {ref.reference_id} unassigned from task",
138
- details={"unassigned_user_id": ref.reference_id},
139
- )
251
+ if refs_to_unassign:
252
+ self.db.query(ManualTaskReference).filter(
253
+ ManualTaskReference.id.in_([ref.id for ref in refs_to_unassign])
254
+ ).delete(synchronize_session=False)
255
+ self.db.flush()
256
+ self.db.refresh(task)
140
257
 
141
- # Check if any users weren't unassigned
142
- unassigned_user_ids = [ref.reference_id for ref in references_to_unassign]
143
- left_over_user_ids = [
144
- user_id for user_id in user_ids if user_id not in unassigned_user_ids
145
- ]
146
- if left_over_user_ids:
147
- logger.warning(
148
- f"Failed to unassign users {left_over_user_ids} from task {task.id}: "
149
- "users were not assigned to the task"
150
- )
258
+ _, log_data = self._handle_user_operation(task_id, user_ids, "unassign")
259
+ return task, log_data
260
+
261
+ def create_config(
262
+ self, config_type: str, fields: list[dict], task_id: str
263
+ ) -> ManualTaskConfig:
264
+ """Create a new config for a task.
265
+
266
+ Args:
267
+ config_type: The config type
268
+ fields: The fields for the config
269
+ task_id: The task ID
270
+
271
+ Returns:
272
+ ManualTaskConfig: The new config
273
+ """
274
+ task = self.get_task(task_id=task_id)
275
+ config = self.config_service.create_new_version(task, config_type, fields)
276
+ return cast(ManualTaskConfig, config)
277
+
278
+ def delete_config(self, config: ManualTaskConfig, task_id: str) -> None:
279
+ """Delete this configuration.
280
+ Args:
281
+ config: The config to delete
282
+ task_id: The task ID
283
+ Raises:
284
+ ValueError: If there are active instances using this configuration
285
+ ValueError: If the task does not exist
286
+
287
+ Returns:
288
+ dict[str, Any]: The log details - intercepted by the `with_task_logging` decorator.
289
+ """
290
+ task = self.get_task(task_id=task_id)
291
+
292
+ # Delete the configuration
293
+ config_id = config.id
294
+ self.config_service.delete_config(task, config_id)
@@ -0,0 +1,185 @@
1
+ from functools import wraps
2
+ from typing import Any, Callable, Optional, TypeVar
3
+
4
+ from loguru import logger
5
+ from pydantic import ValidationError
6
+
7
+ from fides.api.models.manual_tasks.manual_task_log import ManualTaskLog
8
+ from fides.api.schemas.manual_tasks.manual_task_config import ManualTaskFieldBase
9
+ from fides.api.schemas.manual_tasks.manual_task_schemas import ManualTaskLogStatus
10
+ from fides.api.schemas.manual_tasks.manual_task_status import StatusType
11
+
12
+ T = TypeVar("T")
13
+
14
+
15
+ def validate_fields(fields: list[dict[str, Any]], is_submission: bool = False) -> None:
16
+ """Validate field data against the appropriate Pydantic model.
17
+
18
+ Args:
19
+ fields: List of field data to validate
20
+ is_submission: Whether the fields are for a submission (True) or configuration (False)
21
+
22
+ Raises:
23
+ ValueError: If the field data is invalid
24
+ """
25
+ # Check for duplicate field keys
26
+ if len({str(field.get("field_key")) for field in fields}) != len(fields):
27
+ raise ValueError(
28
+ "Duplicate field keys found in field updates, field keys must be unique."
29
+ )
30
+
31
+ for field in fields:
32
+ if not field.get("field_key"):
33
+ raise ValueError("Invalid field data: field_key is required")
34
+ if not field.get("field_type"):
35
+ raise ValueError("Invalid field data: field_type is required")
36
+ if is_submission and "value" not in field:
37
+ raise ValueError("Invalid field data: value is required for submissions")
38
+ if not is_submission:
39
+ try:
40
+ field_model = ManualTaskFieldBase.get_field_model_for_type(
41
+ field["field_type"]
42
+ )
43
+ field_model.model_validate(field)
44
+ except ValidationError as e:
45
+ raise ValueError(f"Invalid field data: {str(e)}")
46
+
47
+
48
+ class TaskLogger:
49
+ """Class-based decorator for logging operation success/failure in service methods.
50
+ Args:
51
+ operation_name: The name of the operation to log
52
+ success_status: The status to log for successful operations
53
+
54
+ The decorated function can return either:
55
+ - A tuple of (return_value, log_details)
56
+ - Just the return value (in which case log details will be extracted from it)
57
+ """
58
+
59
+ def __init__(
60
+ self,
61
+ operation_name: str,
62
+ success_status: ManualTaskLogStatus = ManualTaskLogStatus.complete,
63
+ ) -> None:
64
+ self.operation_name = operation_name
65
+ self.success_status = success_status
66
+
67
+ def __call__(self, func: Callable[..., T]) -> Callable[..., T]:
68
+ @wraps(func)
69
+ def wrapped(service_self: Any, *args: Any, **kwargs: Any) -> T:
70
+ try:
71
+ result = func(service_self, *args, **kwargs)
72
+ return_value, log_data = (
73
+ result
74
+ if isinstance(result, tuple) and len(result) == 2
75
+ else (result, {})
76
+ )
77
+ if hasattr(service_self, "db") and (
78
+ task_id := self._get_task_id(return_value, kwargs)
79
+ ):
80
+ self._log_success(
81
+ service_self.db, task_id, return_value, log_data, kwargs
82
+ )
83
+ return return_value
84
+ except Exception as e:
85
+ self._log_error(service_self, e, kwargs)
86
+ raise
87
+
88
+ return wrapped
89
+
90
+ def _get_task_id(self, result: Any, kwargs: dict) -> Optional[str]:
91
+ """Extract task_id from result or kwargs."""
92
+ return getattr(result, "task_id", None) or kwargs.get("task_id")
93
+
94
+ def _get_log_data(self, result: Any, kwargs: dict) -> dict:
95
+ """Create log data from result and kwargs."""
96
+ log_data = {}
97
+ for field in ["task_id", "config_id", "instance_id"]:
98
+ if value := getattr(result, field, None) or kwargs.get(field):
99
+ log_data[field] = value
100
+ log_data["details"] = kwargs.get("details", {})
101
+ return log_data
102
+
103
+ def _log_success(
104
+ self, db: Any, task_id: str, result: Any, log_data: dict, kwargs: dict
105
+ ) -> None:
106
+ """Log successful operation."""
107
+ ManualTaskLog.create_log(
108
+ db=db,
109
+ **self._get_log_data(result, kwargs | log_data),
110
+ status=self.success_status,
111
+ message=self.operation_name,
112
+ )
113
+
114
+ def _log_error(self, service_self: Any, error: Exception, kwargs: dict) -> None:
115
+ """Log operation error."""
116
+ logger.error(f"Error in {self.operation_name}: {str(error)}")
117
+ if hasattr(service_self, "db") and (task_id := self._get_task_id({}, kwargs)):
118
+ ManualTaskLog.create_log(
119
+ db=service_self.db,
120
+ task_id=task_id,
121
+ **{
122
+ k: v
123
+ for k, v in self._get_log_data({}, kwargs).items()
124
+ if k != "task_id"
125
+ },
126
+ status=ManualTaskLogStatus.error,
127
+ message=f"Error in {self.operation_name}: {str(error)}",
128
+ )
129
+
130
+ @staticmethod
131
+ def log_status_change(
132
+ db: Any,
133
+ task_id: str,
134
+ config_id: Optional[str] = None,
135
+ instance_id: Optional[str] = None,
136
+ previous_status: Optional[StatusType] = None,
137
+ new_status: Optional[StatusType] = None,
138
+ user_id: Optional[str] = None,
139
+ ) -> None:
140
+ """Log a status change event."""
141
+ ManualTaskLog.create_log(
142
+ db=db,
143
+ task_id=task_id,
144
+ config_id=config_id,
145
+ instance_id=instance_id,
146
+ status=ManualTaskLogStatus.in_progress,
147
+ message=f"Task instance status transitioning from {previous_status} to {new_status}",
148
+ details={
149
+ "previous_status": previous_status,
150
+ "new_status": new_status,
151
+ "user_id": user_id,
152
+ },
153
+ )
154
+
155
+ @staticmethod
156
+ def log_create(
157
+ db: Any,
158
+ task_id: str,
159
+ entity_type: str,
160
+ entity_id: str,
161
+ details: Optional[dict] = None,
162
+ user_id: Optional[str] = None,
163
+ status: ManualTaskLogStatus = ManualTaskLogStatus.created,
164
+ ) -> None:
165
+ """Log a creation event."""
166
+ id_fields = {
167
+ "task": {"task_id": task_id},
168
+ "config": {"task_id": task_id, "config_id": entity_id},
169
+ "instance": {"task_id": task_id, "instance_id": entity_id},
170
+ "submission": {"task_id": task_id, "instance_id": entity_id},
171
+ }
172
+ if entity_type not in id_fields:
173
+ raise ValueError(f"Invalid entity type: {entity_type}")
174
+
175
+ ManualTaskLog.create_log(
176
+ db=db,
177
+ **id_fields[entity_type],
178
+ status=status,
179
+ message=f"Created new {entity_type}",
180
+ details=(details or {}) | ({"user_id": user_id} if user_id else {}),
181
+ )
182
+
183
+
184
+ # Alias the class to maintain the original decorator name
185
+ with_task_logging = TaskLogger
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/1fdf5c593349dbc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1fdf5c593349dbc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8457bad7859c44f0.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-f70bffa5a7903c46.js" defer=""></script><script src="/_next/static/chunks/pages/404-ec04f826f3dd79ea.js" defer=""></script><script src="/_next/static/f_8LkSZkhtDM14f8gbC0b/_buildManifest.js" defer=""></script><script src="/_next/static/f_8LkSZkhtDM14f8gbC0b/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"f_8LkSZkhtDM14f8gbC0b","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><meta name="next-head-count" content="2"/><link data-next-font="" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/c693338e3bc8dcc6.css" as="style"/><link rel="stylesheet" href="/_next/static/css/c693338e3bc8dcc6.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-0a61b5bd21a41fe6.js" defer=""></script><script src="/_next/static/chunks/framework-c92fc3344e6fd165.js" defer=""></script><script src="/_next/static/chunks/main-090643377c8254e6.js" defer=""></script><script src="/_next/static/chunks/pages/_app-8ec6e466f3373ac0.js" defer=""></script><script src="/_next/static/chunks/pages/404-ac2f0844e5c4b4cd.js" defer=""></script><script src="/_next/static/nRQ3pmK_d3F5PJE39rP2h/_buildManifest.js" defer=""></script><script src="/_next/static/nRQ3pmK_d3F5PJE39rP2h/_ssgManifest.js" defer=""></script><style>.data-ant-cssinjs-cache-path{content:"";}</style></head><body><div id="__next"><div style="height:100%;display:flex"></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/404","query":{},"buildId":"nRQ3pmK_d3F5PJE39rP2h","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1040],{66726:function(e,a,n){var i=n(11611),t=n(82846),s=n(91936),r=Math.max,o=Math.min;e.exports=function(e,a,n){var _,l,F,d,c,u,m=0,S=!1,h=!1,C=!0;if("function"!=typeof e)throw TypeError("Expected a function");function g(a){var n=_,i=l;return _=l=void 0,m=a,d=e.apply(i,n)}function y(e){var n=e-u,i=e-m;return void 0===u||n>=a||n<0||h&&i>=F}function p(){var e,n,i,s=t();if(y(s))return f(s);c=setTimeout(p,(e=s-u,n=s-m,i=a-e,h?o(i,F-n):i))}function f(e){return(c=void 0,C&&_)?g(e):(_=l=void 0,d)}function b(){var e,n=t(),i=y(n);if(_=arguments,l=this,u=n,i){if(void 0===c)return m=e=u,c=setTimeout(p,a),S?g(e):d;if(h)return clearTimeout(c),c=setTimeout(p,a),g(u)}return void 0===c&&(c=setTimeout(p,a)),d}return a=s(a)||0,i(n)&&(S=!!n.leading,F=(h="maxWait"in n)?r(s(n.maxWait)||0,a):F,C="trailing"in n?!!n.trailing:C),b.cancel=function(){void 0!==c&&clearTimeout(c),m=0,_=u=l=c=void 0},b.flush=function(){return void 0===c?d:f(t())},b}},82846:function(e,a,n){var i=n(77400);e.exports=function(){return i.Date.now()}},7617:function(e,a,n){"use strict";n.d(a,{q:function(){return s}});var i=n(24246),t=n(62051);let s=e=>{let{label:a,isDisabled:n,...s}=e;return(0,i.jsx)(t.OK9,{"data-testid":"tab-".concat(a),_selected:{fontWeight:"600",color:"complimentary.500",borderColor:"complimentary.500"},fontSize:s.fontSize,fontWeight:"500",color:"gray.500",isDisabled:n||!1,children:a})};a.Z=e=>{let{data:a,border:n="partial",...r}=e;return(0,i.jsxs)(t.mQc,{colorScheme:"complimentary",...r,children:[(0,i.jsx)(t.tdY,{width:"partial"===n?"max-content":void 0,children:a.map(e=>(0,i.jsx)(s,{label:e.label,isDisabled:e.isDisabled,fontSize:r.fontSize},e.label))}),(0,i.jsx)(t.nPR,{children:a.map(e=>(0,i.jsx)(t.x45,{px:0,"data-testid":"tab-panel-".concat(e.label),children:e.content},e.label))})]})}},30952:function(e,a,n){"use strict";n.d(a,{f:function(){return _}});var i=n(24246),t=n(66726),s=n.n(t),r=n(27378),o=n(26917);let _=e=>{let{value:a,onChange:n,placeholder:t,..._}=e,[l,F]=(0,r.useState)(a),d=s()(n,500),c=(0,r.useCallback)(e=>{F(e),d(e)},[]);return(0,i.jsx)(o.Z,{value:l,onChange:c,onClear:()=>{F(""),n("")},placeholder:t,..._})}},26089:function(e,a,n){"use strict";var i=n(24246),t=n(62051),s=n(99830),r=n.n(s);a.Z=e=>{let{onClick:a,children:n}=e;return(0,i.jsx)(t.wpx,{onClick:a,type:"link",role:"link",size:"small",className:r().toastLink,children:n})}},29850:function(e,a,n){"use strict";n.d(a,{R:function(){return F}});var i=n(24246),t=n(62051),s=n(27378),r=n(65450);let o=e=>{let{children:a,className:n,style:s,...r}=e;return(0,i.jsx)(t.wpx,{...r,type:"text",className:"w-full justify-start ".concat(n),style:{fontWeight:600,padding:"var(--ant-select-option-padding)",backgroundColor:"var(--ant-select-option-selected-bg)",...s},children:a})};var _=n(16394);let l=(e,a)=>(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(o,{onClick:a,"data-testid":"add-new-system",id:"add-new-system",children:"Add new system +"}),e]}),F=e=>{var a;let{onAddSystem:n,...o}=e,[F,d]=(0,s.useState)(),{data:c,isFetching:u}=(0,r.xF)({page:1,size:25,search:F||void 0}),m=null==c?void 0:null===(a=c.items)||void 0===a?void 0:a.map(e=>({value:e.fides_key,label:e.name})),S=(0,s.useCallback)(e=>{(null==e?void 0:e.length)>1&&d(e),(null==e?void 0:e.length)===0&&d(void 0)},[d]),h=(0,s.useMemo)(()=>(0,_.Ds)(S,300),[S]);return(0,i.jsx)(t.WPr,{placeholder:"Search...","aria-label":"Search for a system to select",dropdownStyle:{minWidth:"500px"},dropdownRender:n?e=>l(e,n):void 0,"data-testid":"system-select",...o,filterOption:!1,options:m,onSearch:h,loading:o.loading||u})}},8411:function(e,a,n){"use strict";n.d(a,{NA:function(){return s},Z8:function(){return t}});var i=n(46420);let t={[i._F.ER]:"Eritrea",[i._F.DJ]:"Djibouti",[i._F.MR]:"Mauritania",[i._F.NA]:"Namibia",[i._F.GH]:"Ghana",[i._F.SS]:"South Sudan",[i._F.SC]:"Seychelles",[i._F.IO]:"British Indian Ocean Territory",[i._F.GQ]:"Equatorial Guinea",[i._F.AO]:"Angola",[i._F.CG]:"Republic of the Congo",[i._F.BW]:"Botswana",[i._F.BI]:"Burundi",[i._F.DZ]:"Algeria",[i._F.TD]:"Chad",[i._F.NG]:"Nigeria",[i._F.TZ]:"Tanzania",[i._F.EH]:"Western Sahara",[i._F.SN]:"Senegal",[i._F.LR]:"Liberia",[i._F.ZA]:"South Africa",[i._F.CV]:"Cape Verde",[i._F.GM]:"Gambia",[i._F.SD]:"Sudan",[i._F.KM]:"Comoros",[i._F.SZ]:"Eswatini",[i._F.UG]:"Uganda",[i._F.MG]:"Madagascar",[i._F.RW]:"Rwanda",[i._F.CD]:"DR Congo",[i._F.CM]:"Cameroon",[i._F.SH]:"Saint Helena, Ascension and Tristan da Cunha",[i._F.TG]:"Togo",[i._F.MU]:"Mauritius",[i._F.NE]:"Niger",[i._F.BJ]:"Benin",[i._F.EG]:"Egypt",[i._F.LS]:"Lesotho",[i._F.ET]:"Ethiopia",[i._F.MA]:"Morocco",[i._F.YT]:"Mayotte",[i._F.BF]:"Burkina Faso",[i._F.RE]:"R\xe9union",[i._F.ST]:"S\xe3o Tom\xe9 and Pr\xedncipe",[i._F.CF]:"Central African Republic",[i._F.MZ]:"Mozambique",[i._F.MW]:"Malawi",[i._F.ML]:"Mali",[i._F.ZM]:"Zambia",[i._F.LY]:"Libya",[i._F.GW]:"Guinea-Bissau",[i._F.SO]:"Somalia",[i._F.KE]:"Kenya",[i._F.GN]:"Guinea",[i._F.ZW]:"Zimbabwe",[i._F.TN]:"Tunisia",[i._F.SL]:"Sierra Leone",[i._F.GA]:"Gabon",[i._F.CI]:"Ivory Coast",[i._F.JO]:"Jordan",[i._F.PK]:"Pakistan",[i._F.KP]:"North Korea",[i._F.MO]:"Macau",[i._F.AM]:"Armenia",[i._F.SY]:"Syria",[i._F.TJ]:"Tajikistan",[i._F.SA]:"Saudi Arabia",[i._F.KR]:"South Korea",[i._F.NP]:"Nepal",[i._F.PH]:"Philippines",[i._F.IQ]:"Iraq",[i._F.LB]:"Lebanon",[i._F.MN]:"Mongolia",[i._F.PS]:"Palestine",[i._F.YE]:"Yemen",[i._F.JP]:"Japan",[i._F.KZ]:"Kazakhstan",[i._F.LK]:"Sri Lanka",[i._F.MM]:"Myanmar",[i._F.KG]:"Kyrgyzstan",[i._F.CN]:"China",[i._F.AF]:"Afghanistan",[i._F.OM]:"Oman",[i._F.IN]:"India",[i._F.LA]:"Laos",[i._F.UZ]:"Uzbekistan",[i._F.MV]:"Maldives",[i._F.ID]:"Indonesia",[i._F.VN]:"Vietnam",[i._F.MY]:"Malaysia",[i._F.TW]:"Taiwan",[i._F.KH]:"Cambodia",[i._F.AE]:"United Arab Emirates",[i._F.HK]:"Hong Kong",[i._F.GE]:"Georgia (Country)",[i._F.BD]:"Bangladesh",[i._F.KW]:"Kuwait",[i._F.TM]:"Turkmenistan",[i._F.QA]:"Qatar",[i._F.BH]:"Bahrain",[i._F.BN]:"Brunei",[i._F.TH]:"Thailand",[i._F.BT]:"Bhutan",[i._F.SG]:"Singapore",[i._F.IL]:"Israel",[i._F.AZ]:"Azerbaijan",[i._F.TL]:"Timor-Leste",[i._F.IR]:"Iran",[i._F.TR]:"Turkey",[i._F.MK]:"North Macedonia",[i._F.IE]:"Ireland",[i._F.DK]:"Denmark",[i._F.SK]:"Slovakia",[i._F.MD]:"Moldova",[i._F.AX]:"\xc5land Islands",[i._F.PL]:"Poland",[i._F.BA]:"Bosnia and Herzegovina",[i._F.SM]:"San Marino",[i._F.CZ]:"Czechia",[i._F.EE]:"Estonia",[i._F.XK]:"Kosovo",[i._F.FO]:"Faroe Islands",[i._F.SJ]:"Svalbard and Jan Mayen",[i._F.GG]:"Guernsey",[i._F.FR]:"France",[i._F.NL]:"Netherlands",[i._F.FI]:"Finland",[i._F.PT]:"Portugal",[i._F.DE]:"Germany",[i._F.MT]:"Malta",[i._F.JE]:"Jersey",[i._F.IS]:"Iceland",[i._F.ES]:"Spain",[i._F.GI]:"Gibraltar",[i._F.NO]:"Norway",[i._F.CY]:"Cyprus",[i._F.RS]:"Serbia",[i._F.LT]:"Lithuania",[i._F.MC]:"Monaco",[i._F.LU]:"Luxembourg",[i._F.UA]:"Ukraine",[i._F.IM]:"Isle of Man",[i._F.RO]:"Romania",[i._F.BE]:"Belgium",[i._F.SE]:"Sweden",[i._F.ME]:"Montenegro",[i._F.LV]:"Latvia",[i._F.VA]:"Vatican City",[i._F.AT]:"Austria",[i._F.AL]:"Albania",[i._F.LI]:"Liechtenstein",[i._F.GR]:"Greece",[i._F.IT]:"Italy",[i._F.AD]:"Andorra",[i._F.GB]:"United Kingdom",[i._F.RU]:"Russia",[i._F.SI]:"Slovenia",[i._F.BY]:"Belarus",[i._F.CH]:"Switzerland",[i._F.HU]:"Hungary",[i._F.BG]:"Bulgaria",[i._F.HR]:"Croatia",[i._F.TC]:"Turks and Caicos Islands",[i._F.CW]:"Cura\xe7ao",[i._F.GP]:"Guadeloupe",[i._F.UM]:"United States Minor Outlying Islands",[i._F.GT]:"Guatemala",[i._F.PM]:"Saint Pierre and Miquelon",[i._F.BQ]:"Caribbean Netherlands",[i._F.GL]:"Greenland",[i._F.SX]:"Sint Maarten",[i._F.PA]:"Panama",[i._F.AW]:"Aruba",[i._F.MQ]:"Martinique",[i._F.AG]:"Antigua and Barbuda",[i._F.BM]:"Bermuda",[i._F.CU]:"Cuba",[i._F.GD]:"Grenada",[i._F.NI]:"Nicaragua",[i._F.LC]:"Saint Lucia",[i._F.KN]:"Saint Kitts and Nevis",[i._F.DO]:"Dominican Republic",[i._F.VC]:"Saint Vincent and the Grenadines",[i._F.BZ]:"Belize",[i._F.HT]:"Haiti",[i._F.JM]:"Jamaica",[i._F.BS]:"Bahamas",[i._F.MX]:"Mexico",[i._F.MF]:"Saint Martin",[i._F.SV]:"El Salvador",[i._F.BL]:"Saint Barth\xe9lemy",[i._F.AI]:"Anguilla",[i._F.MS]:"Montserrat",[i._F.VG]:"British Virgin Islands",[i._F.BB]:"Barbados",[i._F.HN]:"Honduras",[i._F.KY]:"Cayman Islands",[i._F.DM]:"Dominica",[i._F.TT]:"Trinidad and Tobago",[i._F.CR]:"Costa Rica",[i._F.SR]:"Suriname",[i._F.CX]:"Christmas Island",[i._F.WS]:"Samoa",[i._F.PF]:"French Polynesia",[i._F.AS]:"American Samoa",[i._F.NC]:"New Caledonia",[i._F.TK]:"Tokelau",[i._F.PW]:"Palau",[i._F.KI]:"Kiribati",[i._F.VU]:"Vanuatu",[i._F.PN]:"Pitcairn Islands",[i._F.CK]:"Cook Islands",[i._F.FJ]:"Fiji",[i._F.PG]:"Papua New Guinea",[i._F.MP]:"Northern Mariana Islands",[i._F.NU]:"Niue",[i._F.TV]:"Tuvalu",[i._F.NF]:"Norfolk Island",[i._F.TO]:"Tonga",[i._F.FM]:"Micronesia",[i._F.SB]:"Solomon Islands",[i._F.NR]:"Nauru",[i._F.WF]:"Wallis and Futuna",[i._F.GU]:"Guam",[i._F.AU]:"Australia",[i._F.NZ]:"New Zealand",[i._F.MH]:"Marshall Islands",[i._F.CC]:"Cocos (Keeling) Islands",[i._F.VE]:"Venezuela",[i._F.PY]:"Paraguay",[i._F.BR]:"Brazil",[i._F.CO]:"Colombia",[i._F.PE]:"Peru",[i._F.CL]:"Chile",[i._F.UY]:"Uruguay",[i._F.AR]:"Argentina",[i._F.GY]:"Guyana",[i._F.BO]:"Bolivia",[i._F.GF]:"French Guiana",[i._F.EC]:"Ecuador",[i._F.FK]:"Falkland Islands",[i._F.US_AL]:"Alabama",[i._F.US_AK]:"Alaska",[i._F.US_AZ]:"Arizona",[i._F.US_AR]:"Arkansas",[i._F.US_CA]:"California",[i._F.US_CO]:"Colorado",[i._F.US_CT]:"Connecticut",[i._F.US_DE]:"Delaware",[i._F.US_DC]:"District of Columbia (DC)",[i._F.US_FL]:"Florida",[i._F.US_GA]:"Georgia",[i._F.US_HI]:"Hawaii",[i._F.US_ID]:"Idaho",[i._F.US_IL]:"Illinois",[i._F.US_IN]:"Indiana",[i._F.US_IA]:"Iowa",[i._F.US_KS]:"Kansas",[i._F.US_KY]:"Kentucky",[i._F.US_LA]:"Louisiana",[i._F.US_ME]:"Maine",[i._F.US_MD]:"Maryland",[i._F.US_MA]:"Massachusetts",[i._F.US_MI]:"Michigan",[i._F.US_MN]:"Minnesota",[i._F.US_MS]:"Mississippi",[i._F.US_MO]:"Missouri",[i._F.US_MT]:"Montana",[i._F.US_NE]:"Nebraska",[i._F.US_NV]:"Nevada",[i._F.US_NH]:"New Hampshire",[i._F.US_NJ]:"New Jersey",[i._F.US_NM]:"New Mexico",[i._F.US_NY]:"New York",[i._F.US_NC]:"North Carolina",[i._F.US_ND]:"North Dakota",[i._F.US_OH]:"Ohio",[i._F.US_OK]:"Oklahoma",[i._F.US_OR]:"Oregon",[i._F.US_PA]:"Pennsylvania",[i._F.US_PR]:"Puerto Rico",[i._F.US_RI]:"Rhode Island",[i._F.US_SC]:"South Carolina",[i._F.US_SD]:"South Dakota",[i._F.US_TN]:"Tennessee",[i._F.US_TX]:"Texas",[i._F.US_UT]:"Utah",[i._F.US_VA]:"Virginia",[i._F.US_VI]:"United States Virgin Islands",[i._F.US_VT]:"Vermont",[i._F.US_WA]:"Washington",[i._F.US_WV]:"West Virginia",[i._F.US_WI]:"Wisconsin",[i._F.US_WY]:"Wyoming",[i._F.CA_AB]:"Alberta",[i._F.CA_BC]:"British Columbia",[i._F.CA_MB]:"Manitoba",[i._F.CA_NB]:"New Brunswick",[i._F.CA_NL]:"Newfoundland and Labrador",[i._F.CA_NS]:"Nova Scotia",[i._F.CA_ON]:"Ontario",[i._F.CA_PE]:"Prince Edward Island",[i._F.CA_QC]:"Quebec",[i._F.CA_SK]:"Saskatchewan",[i._F.CA_NT]:"Northwest Territories",[i._F.CA_NU]:"Nunavut",[i._F.CA_YT]:"Yukon",[i._F.CA]:"Canada",[i._F.US]:"United States",[i._F.MEXICO_CENTRAL_AMERICA]:"Mexico and Central America",[i._F.CARIBBEAN]:"Caribbean",[i._F.EEA]:"European Economic Area (EEA)",[i._F.NON_EEA]:"Non European Economic Area",[i._F.GLOBAL]:"Global"},s=new Map(Object.entries(t));Object.entries(t).map(e=>({value:e[0],label:e[1]}))},77685:function(e,a,n){"use strict";n.d(a,{i:function(){return M}});var i=n(24246),t=n(62051),s=n(34090),r=n(27378),o=n(55484),_=n(16134),l=n(25980),F=n(97181),d=n(40324),c=n(812),u=n(14047),m=n(45938),S=n(8133),h=n(33335),C=n(32885),g=n(57865),y=n(93237),p=n(65450),f=n(36345);let{Text:b}=t.AntTypography,v={name:"",vendor_id:void 0,description:"",tags:[]},M=e=>{let{onSuccessfulSubmit:a,toastOnSuccess:n,...M}=e,[A,N]=(0,r.useState)(!1),x=(0,_.T)(),{tcf:U,dictionaryService:I}=(0,l.hz)(),{isLoading:j}=(0,C.Rd)(void 0,{skip:!I}),T=(0,_.C)(C.o),w=(0,_.C)(g.gU),[B]=(0,p.in)(),[E]=(0,C.Qk)(),[G]=(0,p.f7)(),{successAlert:k,errorAlert:L}=(0,u.V)(),{setSuggestions:R,setLockedForGVL:D}=g.dictSuggestionsSlice.actions,K=(0,r.useRef)(null),P=(0,r.useMemo)(()=>o.Ry().shape({name:o.Z_().required().label("System name").test("is-unique","",async(e,a)=>{let{data:n}=await B({page:1,size:10,search:e});return!((null==n?void 0:n.items)||[]).filter(a=>a.name===e).some(a=>a.name===e)||a.createError({message:'You already have a system called "'.concat(e,'". Please specify a unique name for this system.')})})}),[B]),O=e=>{if(I){if(!e){x(R("hiding")),x(D(!1));return}x(R("showing")),U&&(0,c.cj)(e)===c.c6.GVL?x(D(!0)):x(D(!1))}},W=()=>{M.onClose(),x(R("initial")),x(D(!1))},V=async e=>{if(N(!0),e.vendor_id){let i=await E([e.vendor_id]);if((0,c.D4)(i))L((0,c.e$)(i.error));else{let{data:e}=i,t=e.systems[0];null==a||a(t.fides_key,t.name),n&&k("".concat(e.name," has been added to your system inventory."))}}else{let i={...e,fides_key:(0,h.E)(e.name),system_type:"",body:"",privacy_declarations:[]},t=await G(i);if((0,c.D4)(t))L((0,c.e$)(t.error));else{let{fides_key:i,name:s}=t.data;null==a||a(i,s),n&&k("".concat(e.name," has been added to your system inventory."))}W()}N(!1)};return(0,i.jsx)(S.Z,{title:"Add New System",...M,onClose:W,children:(0,i.jsx)(s.J9,{initialValues:v,onSubmit:V,validationSchema:P,innerRef:K,children:e=>{let{dirty:a,isValid:n}=e;return(0,i.jsxs)(s.l0,{children:[(0,i.jsx)(m.Gt,{id:"new-system-modal",name:"Add New System"}),(0,i.jsxs)(t.jqI,{vertical:!0,gap:20,className:"pb-6 pt-4",children:[(0,i.jsx)(b,{children:"Fides will add this system to your inventory and configure it for consent using the categories of consent listed below. Optionally, you can check if this system is listed within the Fides compass library by selecting the compass icon below."}),I?(0,i.jsx)(f.Z,{label:"System name",options:T,onVendorSelected:O,isCreate:!0,lockedForGVL:w,isLoading:j}):(0,i.jsx)(d.j0,{id:"name",name:"name",label:"System name",tooltip:"Give the system a unique, and relevant name for reporting purposes. e.g. “Email Data Warehouse”",variant:"stacked",isRequired:!0}),(0,i.jsx)(y.Sv,{id:"description",name:"description",label:"Description",tooltip:"What services does this system perform?",disabled:w}),(0,i.jsx)(F.d,{mode:"tags",id:"tags",name:"tags",label:"System Tags",options:[],layout:"stacked",tooltip:"Are there any tags to associate with this system?",disabled:w})]}),(0,i.jsxs)(t.jqI,{justify:"space-between",children:[(0,i.jsx)(t.wpx,{htmlType:"reset",onClick:W,disabled:j||!a||!n,"data-testid":"cancel-btn",children:"Cancel"}),(0,i.jsx)(t.wpx,{htmlType:"submit",type:"primary",disabled:j||!a||!n,loading:A,"data-testid":"save-btn",children:"Save"})]})]})}})})}},93237:function(e,a,n){"use strict";n.d(a,{Sv:function(){return m},Yb:function(){return u},dQ:function(){return S},lm:function(){return h}});var i=n(24246),t=n(62051),s=n(34090),r=n(27378),o=n(16134),_=n(40324),l=n(46238),F=n(32885),d=n(57865);let c=(e,a,n)=>{var i,t;let[_,l,{setValue:c,setTouched:u}]=(0,s.U$)({name:e,type:n||void 0}),m=!!(l.touched&&l.error),{error:S}=l,h={..._,value:null!==(i=_.value)&&void 0!==i?i:""},[C,g]=(0,r.useState)(null!==(t=h.value)&&void 0!==t?t:""),{values:y}=(0,s.u6)(),{vendor_id:p}=y,f=(0,o.C)((0,F.$e)(p||"")),b=(0,o.C)(d.bN),v=(0,r.useRef)();return(0,r.useEffect)(()=>{"showing"===b&&g(h.value)},[b,g]),(0,r.useEffect)(()=>{if("showing"===b&&f){let n=a?a(f):f[e];h.value!==n&&(c(n),setTimeout(()=>{var e;u(!0),null===(e=v.current)||void 0===e||e.blur()},300))}},[b,c,f,v.current]),(0,r.useEffect)(()=>{"hiding"===b&&c(C)},[b,c,C]),{field:h,isInvalid:m,isShowingSuggestions:b,error:S,inputRef:v}},u=e=>{let{label:a,tooltip:n,disabled:s,isRequired:r=!1,dictField:o,name:F,placeholder:d,id:u}=e,{field:m,isInvalid:S,isShowingSuggestions:h,error:C,inputRef:g}=c(F,o);return(0,i.jsx)(t.NIc,{isInvalid:S,isRequired:r,children:(0,i.jsxs)(t.gCW,{alignItems:"start",children:[(0,i.jsxs)(t.kCb,{alignItems:"center",children:[(0,i.jsx)(_.__,{htmlFor:u||F,fontSize:"xs",my:0,mr:1,children:a}),(0,i.jsx)(l.b,{label:n})]}),(0,i.jsx)(_.oi,{...m,ref:g,isRequired:r,isDisabled:s,"data-testid":"input-".concat(m.name),placeholder:d,isPassword:!1,color:"showing"===h?"complimentary.500":"gray.800"}),(0,i.jsx)(_.Bc,{isInvalid:S,message:C,fieldName:m.name})]})})},m=e=>{let{label:a,tooltip:n,disabled:s,isRequired:r=!1,dictField:o,name:F,id:d}=e,{field:u,isInvalid:m,isShowingSuggestions:S,error:h}=c(F,o);return(0,i.jsx)(t.NIc,{isInvalid:m,isRequired:r,children:(0,i.jsxs)(t.gCW,{alignItems:"start",children:[(0,i.jsxs)(t.kCb,{alignItems:"center",children:[(0,i.jsx)(_.__,{htmlFor:d||F,fontSize:"xs",my:0,mr:1,children:a}),(0,i.jsx)(l.b,{label:n})]}),(0,i.jsx)(t.gxH,{...u,size:"sm","data-testid":"input-".concat(u.name),focusBorderColor:"primary.600",color:"showing"===S?"complimentary.500":"gray.800",isDisabled:s}),(0,i.jsx)(_.Bc,{isInvalid:m,message:h,fieldName:u.name})]})})},S=e=>{let{label:a,tooltip:n,dictField:r,name:o,id:F,disabled:d}=e,{field:u,isInvalid:m,error:S}=c(o,r,"checkbox");return(0,i.jsxs)(t.NIc,{isInvalid:m,width:"full",children:[(0,i.jsxs)(t.xuv,{display:"flex",alignItems:"center",justifyContent:"space-between",children:[(0,i.jsxs)(t.Ugi,{spacing:1,children:[(0,i.jsx)(_.__,{htmlFor:F||o,fontSize:"xs",my:0,mr:0,children:a}),(0,i.jsx)(l.b,{label:n})]}),(0,i.jsx)(t.Ugi,{children:(0,i.jsx)(s.gN,{name:u.name,children:e=>{let{form:{setFieldValue:a}}=e;return(0,i.jsx)(t.rAg,{checked:u.checked,onChange:e=>{a(u.name,e)},disabled:d,className:"mr-2","data-testid":"input-".concat(u.name),size:"small"})}})})]}),(0,i.jsx)(_.Bc,{isInvalid:m,message:S,fieldName:u.name})]})},h=e=>{let{label:a,tooltip:n,dictField:r,name:o,id:F,disabled:d}=e,{field:u,isInvalid:m,error:S,isShowingSuggestions:h}=c(o,r,"numeric"),{setFieldValue:C}=(0,s.u6)();return(0,i.jsxs)(t.NIc,{isInvalid:m,width:"full",children:[(0,i.jsxs)(t.xuv,{display:"flex",alignItems:"center",justifyContent:"space-between",children:[(0,i.jsxs)(t.Ugi,{spacing:1,children:[(0,i.jsx)(_.__,{htmlFor:F||o,fontSize:"xs",my:0,mr:0,children:a}),(0,i.jsx)(l.b,{label:n})]}),(0,i.jsx)(t.Ugi,{children:(0,i.jsxs)(t.Y2U,{value:u.value,name:u.name,size:"xs",onBlur:u.onBlur,onChange:e=>{C(u.name,e)},w:"100%",colorScheme:"terracotta",inputMode:"numeric","data-testid":"input-".concat(u.name),color:"showing"===h?"complimentary.500":"gray.800",focusBorderColor:"primary.600",isDisabled:d,children:[(0,i.jsx)(t.zuI,{}),(0,i.jsxs)(t.FiK,{children:[(0,i.jsx)(t.WQu,{}),(0,i.jsx)(t.Y_d,{})]})]})})]}),(0,i.jsx)(_.Bc,{isInvalid:m,message:S,fieldName:u.name})]})}},99830:function(e){e.exports={toastLink:"ToastLink_toastLink__OLSeq"}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1100],{58754:function(e,t,n){var r=n(24246),i=n(62051),s=n(70788);t.Z=e=>{let{heading:t,breadcrumbItems:n,isSticky:a=!0,children:l,rightContent:o,style:u,...c}=e;return(0,r.jsxs)("div",{...c,style:a?{position:"sticky",top:"-24px",paddingTop:"24px",paddingBottom:"24px",paddingLeft:"40px",marginLeft:"-40px",paddingRight:"40px",marginRight:"-40px",marginTop:"-24px",left:0,zIndex:20,backgroundColor:"white",...u}:{paddingBottom:"24px",...u},children:[(0,r.jsxs)(i.jqI,{justify:"space-between",children:["string"==typeof t?(0,r.jsx)(i.lQT,{className:n||l?"pb-4":void 0,level:1,"data-testid":"page-heading",children:t}):t,o&&(0,r.jsx)("div",{"data-testid":"page-header-right-content",children:o})]}),!!n&&(0,r.jsx)(s.m,{className:l?"pb-4":void 0,items:n,"data-testid":"page-breadcrumb"}),l]})}},10342:function(e,t,n){var r=n(24246),i=n(62051),s=n(46238);t.Z=e=>{let{title:t,tooltip:n,children:a,...l}=e;return(0,r.jsxs)(i.xuv,{borderRadius:"md",border:"1px solid",borderColor:"gray.200",...l,children:[(0,r.jsxs)(i.X6q,{as:"h3",fontSize:"sm",fontWeight:"semibold",color:"gray.700",py:4,px:6,backgroundColor:"gray.50",borderRadius:"md",textAlign:"left",children:[t,n?(0,r.jsx)(i.xvT,{as:"span",mx:1,children:(0,r.jsx)(s.b,{label:n})}):void 0]}),(0,r.jsx)(i.Kqy,{p:6,spacing:6,children:a})]})}},70788:function(e,t,n){n.d(t,{m:function(){return u}});var r=n(24246),i=n(62051),s=n(79894),a=n.n(s),l=n(27378);let{Text:o}=i.AntTypography,u=e=>{let{items:t,...n}=e,s=(0,l.useMemo)(()=>null==t?void 0:t.map((e,n)=>{let s=n===t.length-1,l={...e},u=l.onClick&&!l.href;return("string"==typeof l.title&&(l.title=(0,r.jsx)(o,{style:{color:"inherit",maxWidth:s?void 0:400},ellipsis:!s,children:l.title})),u)?l.title=(0,r.jsx)(i.wpx,{type:"text",size:"small",icon:l.icon,onClick:l.onClick,className:"ant-breadcrumb-link -mt-px px-1 text-inherit",children:l.title}):(l.icon&&(l.title=(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("span",{className:"anticon align-text-bottom",children:l.icon}),l.title]})),l.href&&l.title&&(l.title=(0,r.jsx)(a(),{href:l.href,className:"ant-breadcrumb-link",children:l.title}),delete l.href)),l}),[t]);return(0,r.jsx)(i.zrq,{items:s,...n})}},67810:function(e,t,n){n.d(t,{Z:function(){return s}}),(r=i||(i={})).PRIVACY_REQUEST_REVIEW_APPROVE="privacy_request_review_approve",r.PRIVACY_REQUEST_REVIEW_DENY="privacy_request_review_deny",r.PRIVACY_REQUEST_RECEIPT="privacy_request_receipt",r.PRIVACY_REQUEST_COMPLETE_ACCESS="privacy_request_complete_access",r.PRIVACY_REQUEST_COMPLETE_DELETION="privacy_request_complete_deletion",r.SUBJECT_IDENTITY_VERIFICATION="subject_identity_verification";var r,i,s={[i.PRIVACY_REQUEST_COMPLETE_ACCESS]:"Access request completed",[i.PRIVACY_REQUEST_COMPLETE_DELETION]:"Erasure request completed",[i.PRIVACY_REQUEST_RECEIPT]:"Privacy request received",[i.PRIVACY_REQUEST_REVIEW_APPROVE]:"Privacy request approved",[i.PRIVACY_REQUEST_REVIEW_DENY]:"Privacy request denied",[i.SUBJECT_IDENTITY_VERIFICATION]:"Subject identity verification"}},20149:function(e,t,n){var r=n(24246),i=n(77830),s=n(62051),a=n(34090),l=n(86677),o=n(16134),u=n(10342),c=n(40324),d=n(51472),p=n(67810),m=n(64826);let g=()=>{var e;let t=(0,o.C)(m.Zp),n=(0,o.C)(m.G1);(0,m.gz)({page:t,size:n});let i=(0,o.C)(m.YO),{values:s,setFieldValue:l}=(0,a.u6)();return(0,r.jsx)(d.Z,{label:"Associated properties",addButtonLabel:"Add property",idField:"id",nameField:"name",allItems:i.map(e=>({id:e.id,name:e.name})),values:null!==(e=s.properties)&&void 0!==e?e:[],setValues:e=>l("properties",e),draggable:!0,maxHeight:100,baseTestId:"property"})};t.Z=e=>{let{template:t,handleSubmit:n,handleDelete:o}=e,d=(0,l.useRouter)(),m=()=>{d.push(i.q)},f={type:t.type,content:t.content,properties:t.properties||[],is_enabled:t.is_enabled,id:t.id||""};return(0,r.jsx)(a.J9,{enableReinitialize:!0,initialValues:f,onSubmit:n,children:e=>{let{dirty:t,isValid:n,isSubmitting:i}=e;return(0,r.jsxs)(a.l0,{style:{paddingTop:"12px",paddingBottom:"12px"},children:[(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsxs)(u.Z,{title:"".concat(p.Z[f.type]),children:[(0,r.jsx)(c.j0,{isRequired:!0,label:"Email subject",name:"content.subject",variant:"stacked"}),(0,r.jsx)(c.Ks,{isRequired:!0,label:"Message body",name:"content.body",value:"test",variant:"stacked",resize:!0}),(0,r.jsx)(s.xuv,{py:3,children:(0,r.jsx)(g,{})}),(0,r.jsx)(c.w8,{name:"is_enabled",label:"Enable message",variant:"switchFirst"})]})}),(0,r.jsxs)(s.kCb,{justifyContent:"space-between",width:"100%",paddingTop:2,children:[f.id&&o&&(0,r.jsx)(s.wpx,{"data-testid":"delete-template-button",loading:!1,className:"mr-3",onClick:o,children:"Delete"}),(0,r.jsxs)(s.kCb,{justifyContent:"right",width:"100%",paddingTop:2,children:[(0,r.jsx)(s.wpx,{loading:!1,className:"mr-3",onClick:m,children:"Cancel"}),(0,r.jsx)(s.wpx,{htmlType:"submit",type:"primary",disabled:i||!t||!n,loading:i,"data-testid":"submit-btn",children:"Save"})]})]})]})}})}},5058:function(e,t,n){n.d(t,{Vw:function(){return s},ms:function(){return r},pS:function(){return i},vm:function(){return a}});let{useGetSummaryMessagingTemplatesQuery:r,usePutMessagingTemplateByIdMutation:i,useCreateMessagingTemplateByTypeMutation:s,usePatchMessagingTemplateByIdMutation:a}=n(78780).u.injectEndpoints({endpoints:e=>({getSummaryMessagingTemplates:e.query({query:e=>({method:"GET",url:"plus/messaging/templates/summary",params:e}),providesTags:()=>["Property-Specific Messaging Templates"]}),putMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PUT",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),patchMessagingTemplateById:e.mutation({query:e=>{let{templateId:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"PATCH",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]}),createMessagingTemplateByType:e.mutation({query:e=>{let{templateType:t,template:n}=e;return{url:"plus/messaging/templates/".concat(t),method:"POST",body:n}},invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},47466:function(e,t,n){n.d(t,{KC:function(){return a},ew:function(){return l},gQ:function(){return s},jM:function(){return r},lE:function(){return i}});let{useGetMessagingTemplatesQuery:r,useUpdateMessagingTemplatesMutation:i,useGetMessagingTemplateByIdQuery:s,useGetMessagingTemplateDefaultQuery:a,useDeleteMessagingTemplateByIdMutation:l}=n(78780).u.injectEndpoints({endpoints:e=>({getMessagingTemplates:e.query({query:()=>({url:"messaging/templates"}),providesTags:()=>["Messaging Templates"]}),updateMessagingTemplates:e.mutation({query:e=>({url:"messaging/templates",method:"PUT",body:e}),invalidatesTags:()=>["Messaging Templates"]}),getMessagingTemplateById:e.query({query:e=>({url:"/messaging/templates/".concat(e)}),providesTags:()=>["Property-Specific Messaging Templates"]}),getMessagingTemplateDefault:e.query({query:e=>({url:"/messaging/templates/default/".concat(e)})}),deleteMessagingTemplateById:e.mutation({query:e=>({url:"/messaging/templates/".concat(e),method:"DELETE"}),invalidatesTags:()=>["Property-Specific Messaging Templates"]})})})},31883:function(e,t,n){n.d(t,{Bw:function(){return r.Bw},D4:function(){return r.D4}});var r=n(19043)},11055:function(e,t,n){n.d(t,{M:function(){return d}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),l=n(18397),o=n(42308),u=n(25431),c=n(39556);let d=(0,s.forwardRef)(function({children:e,as:t="ul",axis:n="y",onReorder:d,values:g,...f},y){let h=(0,o.h)(()=>l.E[t]),x=[],E=(0,s.useRef)(!1);return(0,i.k)(!!g,"Reorder.Group must be provided a values prop"),(0,s.useEffect)(()=>{E.current=!1}),(0,r.jsx)(h,{...f,ref:y,ignoreStrict:!0,children:(0,r.jsx)(a.Y.Provider,{value:{axis:n,registerItem:(e,t)=>{let r=x.findIndex(t=>e===t.value);-1!==r?x[r].layout=t[n]:x.push({value:e,layout:t[n]}),x.sort(m)},updateOrder:(e,t,n)=>{if(E.current)return;let r=function(e,t,n,r){if(!r)return e;let i=e.findIndex(e=>e.value===t);if(-1===i)return e;let s=r>0?1:-1,a=e[i+s];if(!a)return e;let l=e[i],o=a.layout,d=(0,c.t)(o.min,o.max,.5);return 1===s&&l.layout.max+n>d||-1===s&&l.layout.min+n<d?(0,u.uo)(e,i,i+s):e}(x,e,t,n);x!==r&&(E.current=!0,d(r.map(p).filter(e=>-1!==g.indexOf(e))))}},children:e})})});function p(e){return e.value}function m(e,t){return e.layout.min-t.layout.min}},7078:function(e,t,n){n.d(t,{e:function(){return T}});var r=n(24246),i=n(29427),s=n(27378),a=n(40976),l=n(18397),o=n(42308),u=n(69222),c=n(67412);function d(e){let t=(0,o.h)(()=>(0,u.BX)(e)),{isStatic:n}=(0,s.useContext)(c._);if(n){let[,n]=(0,s.useState)(e);(0,s.useEffect)(()=>t.on("change",n),[])}return t}var p=n(13998);let m=e=>e&&"object"==typeof e&&e.mix,g=e=>m(e)?e.mix:void 0;var f=n(64306),y=n(95984);function h(e,t){let n=d(t()),r=()=>n.set(t());return r(),(0,f.L)(()=>{let t=()=>y.Wi.preRender(r,!1,!0),n=e.map(e=>e.on("change",t));return()=>{n.forEach(e=>e()),(0,y.Pn)(r)}}),n}function x(e,t){let n=(0,o.h)(()=>[]);return h(e,()=>{n.length=0;let r=e.length;for(let t=0;t<r;t++)n[t]=e[t].get();return t(n)})}var E=n(3522);function v(e,t=0){return(0,E.i)(e)?e:d(t)}let T=(0,s.forwardRef)(function({children:e,style:t={},value:n,as:c="li",onDrag:d,layout:m=!0,...f},y){let E=(0,o.h)(()=>l.E[c]),T=(0,s.useContext)(a.Y),b={x:v(t.x),y:v(t.y)},_=function(e,t,n,r){if("function"==typeof e)return function(e){u.S1.current=[],e();let t=h(u.S1.current,e);return u.S1.current=void 0,t}(e);let i="function"==typeof t?t:function(...e){let t=!Array.isArray(e[0]),n=t?0:-1,r=e[0+n],i=e[1+n],s=e[2+n],a=e[3+n],l=(0,p.s)(i,s,{mixer:g(s[0]),...a});return t?l(r):l}(t,void 0,void 0);return Array.isArray(e)?x(e,i):x([e],([e])=>i(e))}([b.x,b.y],([e,t])=>e||t?1:"unset");(0,i.k)(!!T,"Reorder.Item must be a child of Reorder.Group");let{axis:C,registerItem:j,updateOrder:R}=T;return(0,r.jsx)(E,{drag:C,...f,dragSnapToOrigin:!0,style:{...t,x:b.x,y:b.y,zIndex:_},layout:m,onDrag:(e,t)=>{let{velocity:r}=t;r[C]&&R(n,b[C].get(),r[C]),d&&d(e,t)},onLayoutMeasure:e=>j(n,e),ref:y,ignoreStrict:!0,children:e})})},40976:function(e,t,n){n.d(t,{Y:function(){return r}});let r=(0,n(27378).createContext)(null)},47397:function(e,t,n){n.d(t,{o:function(){return a}});var r=n(42308);class i{constructor(){this.componentControls=new Set}subscribe(e){return this.componentControls.add(e),()=>this.componentControls.delete(e)}start(e,t){this.componentControls.forEach(n=>{n.start(e.nativeEvent||e,t)})}}let s=()=>new i;function a(){return(0,r.h)(s)}},76649:function(e,t,n){n.d(t,{Ln:function(){return r}});let r=(e,t)=>s(e,t),i=Symbol("SOME"),s=(e,t)=>"string"==typeof e?e===typeof t:Array.isArray(e)?i in e?e.some(e=>s(e,t)):!!Array.isArray(t)&&(0===e.length||t.every(t=>e.some(e=>s(e,t)))):"object"==typeof t&&null!==t&&Object.entries(e).every(([e,n])=>s(n,t[e]));class a{static narrow(e){return new a(t=>r(e,t))}constructor(e){this.NF=void 0,this.NF=e}satisfied(e){return this.NF(e)}build(e){return e}and(e){let t=this.NF,n=e instanceof a?e.NF:e instanceof Function?e:t=>r(e,t);return new a(e=>t(e)&&n(e))}}new a(e=>!0)}}]);