eventrule.html 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. <!--
  2. Copyright (C) 2024 Nicola Murino
  3. This WebUI uses the KeenThemes Mega Bundle, a proprietary theme:
  4. https://keenthemes.com/products/templates-mega-bundle
  5. KeenThemes HTML/CSS/JS components are allowed for use only within the
  6. SFTPGo product and restricted to be used in a resealable HTML template
  7. that can compete with KeenThemes products anyhow.
  8. This WebUI is allowed for use only within the SFTPGo product and
  9. therefore cannot be used in derivative works/products without an
  10. explicit grant from the SFTPGo Team ([email protected]).
  11. -->
  12. {{template "base" .}}
  13. {{- define "page_body"}}
  14. <div class="card shadow-sm">
  15. <div class="card-header bg-light">
  16. <h3 data-i18n="{{.Title}}" class="card-title section-title"></h3>
  17. </div>
  18. <div class="card-body">
  19. {{- template "errmsg" .Error}}
  20. <form id="eventrule_form" action="{{.CurrentURL}}" method="POST" autocomplete="off">
  21. <div class="form-group row">
  22. <label for="idName" data-i18n="general.name" class="col-md-3 col-form-label">Name</label>
  23. <div class="col-md-9">
  24. <input id="idName" type="text" placeholder="" name="name" value="{{.Rule.Name}}" maxlength="255" autocomplete="off"
  25. spellcheck="false" required {{if eq .Mode 2}}class="form-control-plaintext readonly-input" readonly{{else}}class="form-control"{{end}} />
  26. </div>
  27. </div>
  28. <div class="form-group row mt-10">
  29. <label for="idStatus" data-i18n="general.status" class="col-md-3 col-form-label">Status</label>
  30. <div class="col-md-9">
  31. <select id="idStatus" name="status" class="form-select" data-control="i18n-select2" data-hide-search="true">
  32. <option data-i18n="general.active" value="1" {{- if eq .Rule.Status 1 }} selected{{- end}}>Active</option>
  33. <option data-i18n="general.inactive" value="0" {{- if eq .Rule.Status 0 }} selected{{- end}}>Inactive</option>
  34. </select>
  35. </div>
  36. </div>
  37. <div class="form-group row mt-10">
  38. <label for="idDescription" data-i18n="general.description" class="col-md-3 col-form-label">Description</label>
  39. <div class="col-md-9">
  40. <input id="idDescription" type="text" class="form-control" name="description" value="{{.Rule.Description}}" maxlength="255">
  41. </div>
  42. </div>
  43. <div class="form-group row mt-10">
  44. <label for="idTrigger" data-i18n="rules.trigger" class="col-md-3 col-form-label">Trigger</label>
  45. <div class="col-md-9">
  46. <select id="idTrigger" name="trigger" class="form-select" data-control="i18n-select2" data-hide-search="true">
  47. {{- range .TriggerTypes}}
  48. <option value="{{.Value}}" {{if eq $.Rule.Trigger .Value }}selected{{end}} data-i18n="{{.Name}}"></option>
  49. {{- end}}
  50. </select>
  51. </div>
  52. </div>
  53. <div class="form-group row trigger trigger-fs mt-10">
  54. <label for="idFsEvents" data-i18n="rules.triggers.fs_events" class="col-md-3 col-form-label">Fs events</label>
  55. <div class="col-md-9">
  56. <select id="idFsEvents" name="fs_events" class="form-select" data-control="i18n-select2" data-hide-search="true" data-close-on-select="false" multiple>
  57. {{- range $event := .FsEvents}}
  58. <option value="{{$event}}" {{- range $.Rule.Conditions.FsEvents }}{{- if eq . $event}}selected{{- end}}{{- end}}>{{$event}}</option>
  59. {{- end}}
  60. </select>
  61. </div>
  62. </div>
  63. <div class="form-group row trigger trigger-provider mt-10">
  64. <label for="idProviderEvents" data-i18n="rules.triggers.provider_events" class="col-md-3 col-form-label">Provider events</label>
  65. <div class="col-md-9">
  66. <select id="idProviderEvents" name="provider_events" class="form-select" data-control="i18n-select2" data-hide-search="true" data-close-on-select="false" multiple>
  67. {{- range $event := .ProviderEvents}}
  68. <option value="{{$event}}" {{- range $.Rule.Conditions.ProviderEvents }}{{- if eq . $event}}selected{{- end}}{{- end}}>{{$event}}</option>
  69. {{- end}}
  70. </select>
  71. </div>
  72. </div>
  73. <div class="form-group row trigger trigger-idp mt-10">
  74. <label for="idIDPEvent" data-i18n="general.type" class="col-md-3 col-form-label">IDP Login event</label>
  75. <div class="col-md-9">
  76. <select id="idIDPEvent" name="idp_login_event" class="form-select" data-control="i18n-select2" data-hide-search="true">
  77. <option value="0" data-i18n="ip_list.any" {{if eq .Rule.Conditions.IDPLoginEvent 0}}selected{{end}}>Any</option>
  78. <option value="1" data-i18n="rules.idp_logins.user" {{if eq .Rule.Conditions.IDPLoginEvent 1}}selected{{end}}>User login</option>
  79. <option value="2" data-i18n="rules.idp_logins.admin" {{if eq .Rule.Conditions.IDPLoginEvent 2}}selected{{end}}>Admin login</option>
  80. </select>
  81. </div>
  82. </div>
  83. <div class="card trigger trigger-schedule mt-10">
  84. <div class="card-header bg-light">
  85. <h3 data-i18n="rules.triggers.schedule" class="card-title section-title-inner">Schedules</h3>
  86. </div>
  87. <div class="card-body">
  88. <div id="schedules">
  89. {{- template "infomsg-no-mb" "rules.scheduler_help"}}
  90. <div class="form-group">
  91. <div data-repeater-list="schedules">
  92. {{- range $idx, $val := .Rule.Conditions.Schedules}}
  93. <div data-repeater-item>
  94. <div data-repeater-item>
  95. <div class="form-group row">
  96. <div class="col-md-3 mt-3 mt-md-8">
  97. <input data-i18n="[placeholder]general.hour" type="text" class="form-control" name="schedule_hour" value="{{$val.Hours}}" />
  98. </div>
  99. <div class="col-md-3 mt-3 mt-md-8">
  100. <input data-i18n="[placeholder]general.day_of_week" type="text" class="form-control" name="schedule_day_of_week" value="{{$val.DayOfWeek}}" />
  101. </div>
  102. <div class="col-md-3 mt-3 mt-md-8">
  103. <input data-i18n="[placeholder]general.day_of_month" type="text" class="form-control" name="schedule_day_of_month" value="{{$val.DayOfMonth}}" />
  104. </div>
  105. <div class="col-md-2 mt-3 mt-md-8">
  106. <input data-i18n="[placeholder]general.month" type="text" class="form-control" name="schedule_month" value="{{$val.Month}}" />
  107. </div>
  108. <div class="col-md-1 mt-3 mt-md-8">
  109. <a href="#" data-repeater-delete
  110. class="btn btn-light-danger ps-5 pe-4">
  111. <i class="ki-duotone ki-trash fs-2">
  112. <span class="path1"></span>
  113. <span class="path2"></span>
  114. <span class="path3"></span>
  115. <span class="path4"></span>
  116. <span class="path5"></span>
  117. </i>
  118. </a>
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. {{- else}}
  124. <div data-repeater-item>
  125. <div class="form-group row">
  126. <div class="col-md-3 mt-3 mt-md-8">
  127. <input data-i18n="[placeholder]general.hour" type="text" class="form-control" name="schedule_hour" value="" />
  128. </div>
  129. <div class="col-md-3 mt-3 mt-md-8">
  130. <input data-i18n="[placeholder]general.day_of_week" type="text" class="form-control" name="schedule_day_of_week" value="" />
  131. </div>
  132. <div class="col-md-3 mt-3 mt-md-8">
  133. <input data-i18n="[placeholder]general.day_of_month" type="text" class="form-control" name="schedule_day_of_month" value="" />
  134. </div>
  135. <div class="col-md-2 mt-3 mt-md-8">
  136. <input data-i18n="[placeholder]general.month" type="text" class="form-control" name="schedule_month" value="" />
  137. </div>
  138. <div class="col-md-1 mt-3 mt-md-8">
  139. <a href="#" data-repeater-delete
  140. class="btn btn-light-danger ps-5 pe-4">
  141. <i class="ki-duotone ki-trash fs-2">
  142. <span class="path1"></span>
  143. <span class="path2"></span>
  144. <span class="path3"></span>
  145. <span class="path4"></span>
  146. <span class="path5"></span>
  147. </i>
  148. </a>
  149. </div>
  150. </div>
  151. </div>
  152. {{- end}}
  153. </div>
  154. </div>
  155. <div class="form-group mt-5">
  156. <a href="#" data-repeater-create class="btn btn-light-primary">
  157. <i class="ki-duotone ki-plus fs-3"></i>
  158. <span data-i18n="general.add">Add</span>
  159. </a>
  160. </div>
  161. </div>
  162. </div>
  163. </div>
  164. {{- if .IsShared}}
  165. <div class="form-group row align-items-center trigger trigger-schedule mt-10">
  166. <div class="col-md-12">
  167. <div class="form-check form-switch form-check-custom form-check-solid">
  168. <input class="form-check-input" type="checkbox" id="idConcurrentExecution" name="concurrent_execution" {{if .Rule.Conditions.Options.ConcurrentExecution}}checked{{end}}/>
  169. <label data-i18n="rules.concurrent_run" class="form-check-label fw-semibold text-gray-800" for="idConcurrentExecution">
  170. Concurrent execution
  171. </label>
  172. </div>
  173. </div>
  174. </div>
  175. {{- end}}
  176. <div class="form-group row trigger trigger-fs mt-10">
  177. <label for="idFsProtocols" data-i18n="rules.protocol_filters" class="col-md-3 col-form-label">Protocol filters</label>
  178. <div class="col-md-9">
  179. <select id="idFsProtocols" name="fs_protocols" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple aria-describedby="idFsProtocolsHelp">
  180. {{- range $p := .Protocols}}
  181. <option value="{{$p}}" {{- range $.Rule.Conditions.Options.Protocols }}{{- if eq . $p}}selected{{- end}}{{- end}}>{{$p}}</option>
  182. {{- end}}
  183. </select>
  184. <div id="idFsProtocolsHelp" data-i18n="rules.no_filter" class="form-text"></div>
  185. </div>
  186. </div>
  187. <div class="form-group row trigger trigger-fs mt-10">
  188. <label for="idFsStatuses" data-i18n="rules.status_filters" class="col-md-3 col-form-label">Status filters</label>
  189. <div class="col-md-9">
  190. <select id="idFsStatuses" name="fs_statuses" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple aria-describedby="idFsStatusesHelp">
  191. <option value="1" data-i18n="general.ok" {{- range $.Rule.Conditions.Options.EventStatuses }}{{- if eq . 1}}selected{{- end}}{{- end}}>OK</option>
  192. <option value="2" data-i18n="general.failed" {{- range $.Rule.Conditions.Options.EventStatuses }}{{- if eq . 2}}selected{{- end}}{{- end}}>Failed</option>
  193. <option value="3" data-i18n="events.quota_exceeded" {{- range $.Rule.Conditions.Options.EventStatuses }}{{- if eq . 3}}selected{{- end}}{{- end}}>Quota exceeded</option>
  194. </select>
  195. <div id="idFsStatusesHelp" data-i18n="rules.no_filter" class="form-text"></div>
  196. </div>
  197. </div>
  198. <div class="form-group row trigger trigger-provider mt-10">
  199. <label for="idProviderObjects" data-i18n="rules.object_filters" class="col-md-3 col-form-label">Object filters</label>
  200. <div class="col-md-9">
  201. <select id="idProviderObjects" name="provider_objects" class="form-select" data-control="i18n-select2" data-close-on-select="false" multiple aria-describedby="idProviderObjectsHelp">
  202. {{- range $p := .ProviderObjects}}
  203. <option value="{{$p}}" {{- range $.Rule.Conditions.Options.ProviderObjects }}{{- if eq . $p}}selected{{- end}}{{- end}}>{{$p}}</option>
  204. {{- end}}
  205. </select>
  206. <div id="idProviderObjectsHelp" data-i18n="rules.no_filter" class="form-text"></div>
  207. </div>
  208. </div>
  209. <div class="card trigger trigger-fs trigger-provider trigger-schedule trigger-on-demand trigger-idp mt-10">
  210. <div class="card-header bg-light">
  211. <h3 data-i18n="rules.name_filters" class="card-title section-title-inner">Name filters</h3>
  212. </div>
  213. <div class="card-body">
  214. <div id="name_filters">
  215. {{- template "infomsg-no-mb" "rules.name_filters_help"}}
  216. <div class="form-group">
  217. <div data-repeater-list="name_filters">
  218. {{- range $idx, $val := .Rule.Conditions.Options.Names}}
  219. <div data-repeater-item>
  220. <div data-repeater-item>
  221. <div class="form-group row">
  222. <div class="col-md-7 mt-3 mt-md-8">
  223. <input type="text" class="form-control" name="name_pattern" value="{{$val.Pattern}}" />
  224. </div>
  225. <div class="col-md-4 mt-3 mt-md-8">
  226. <select name="type_name_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  227. <option value=""></option>
  228. <option value="inverse" data-i18n="rules.inverse_match" {{if $val.InverseMatch}}selected{{end}}>Inverse match</option>
  229. </select>
  230. </div>
  231. <div class="col-md-1 mt-3 mt-md-8">
  232. <a href="#" data-repeater-delete
  233. class="btn btn-light-danger ps-5 pe-4">
  234. <i class="ki-duotone ki-trash fs-2">
  235. <span class="path1"></span>
  236. <span class="path2"></span>
  237. <span class="path3"></span>
  238. <span class="path4"></span>
  239. <span class="path5"></span>
  240. </i>
  241. </a>
  242. </div>
  243. </div>
  244. </div>
  245. </div>
  246. {{- else}}
  247. <div data-repeater-item>
  248. <div class="form-group row">
  249. <div class="col-md-7 mt-3 mt-md-8">
  250. <input type="text" class="form-control" name="name_pattern" value="" />
  251. </div>
  252. <div class="col-md-4 mt-3 mt-md-8">
  253. <select name="type_name_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  254. <option value=""></option>
  255. <option value="inverse" data-i18n="rules.inverse_match">Inverse match</option>
  256. </select>
  257. </div>
  258. <div class="col-md-1 mt-3 mt-md-8">
  259. <a href="#" data-repeater-delete
  260. class="btn btn-light-danger ps-5 pe-4">
  261. <i class="ki-duotone ki-trash fs-2">
  262. <span class="path1"></span>
  263. <span class="path2"></span>
  264. <span class="path3"></span>
  265. <span class="path4"></span>
  266. <span class="path5"></span>
  267. </i>
  268. </a>
  269. </div>
  270. </div>
  271. </div>
  272. {{- end}}
  273. </div>
  274. </div>
  275. <div class="form-group mt-5">
  276. <a href="#" data-repeater-create class="btn btn-light-primary">
  277. <i class="ki-duotone ki-plus fs-3"></i>
  278. <span data-i18n="general.add">Add</span>
  279. </a>
  280. </div>
  281. </div>
  282. </div>
  283. </div>
  284. <div class="card trigger trigger-fs trigger-schedule trigger-on-demand mt-10">
  285. <div class="card-header bg-light">
  286. <h3 data-i18n="rules.group_name_filters" class="card-title section-title-inner">Group name filters</h3>
  287. </div>
  288. <div class="card-body">
  289. <div id="group_name_filters">
  290. {{- template "infomsg-no-mb" "rules.group_name_filters_help"}}
  291. <div class="form-group">
  292. <div data-repeater-list="group_name_filters">
  293. {{- range $idx, $val := .Rule.Conditions.Options.GroupNames}}
  294. <div data-repeater-item>
  295. <div data-repeater-item>
  296. <div class="form-group row">
  297. <div class="col-md-7 mt-3 mt-md-8">
  298. <input type="text" class="form-control" name="group_name_pattern" value="{{$val.Pattern}}" />
  299. </div>
  300. <div class="col-md-4 mt-3 mt-md-8">
  301. <select name="type_group_name_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  302. <option value=""></option>
  303. <option value="inverse" data-i18n="rules.inverse_match" {{if $val.InverseMatch}}selected{{end}}>Inverse match</option>
  304. </select>
  305. </div>
  306. <div class="col-md-1 mt-3 mt-md-8">
  307. <a href="#" data-repeater-delete
  308. class="btn btn-light-danger ps-5 pe-4">
  309. <i class="ki-duotone ki-trash fs-2">
  310. <span class="path1"></span>
  311. <span class="path2"></span>
  312. <span class="path3"></span>
  313. <span class="path4"></span>
  314. <span class="path5"></span>
  315. </i>
  316. </a>
  317. </div>
  318. </div>
  319. </div>
  320. </div>
  321. {{- else}}
  322. <div data-repeater-item>
  323. <div class="form-group row">
  324. <div class="col-md-7 mt-3 mt-md-8">
  325. <input type="text" class="form-control" name="group_name_pattern" value="" />
  326. </div>
  327. <div class="col-md-4 mt-3 mt-md-8">
  328. <select name="type_group_name_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  329. <option value=""></option>
  330. <option value="inverse" data-i18n="rules.inverse_match">Inverse match</option>
  331. </select>
  332. </div>
  333. <div class="col-md-1 mt-3 mt-md-8">
  334. <a href="#" data-repeater-delete
  335. class="btn btn-light-danger ps-5 pe-4">
  336. <i class="ki-duotone ki-trash fs-2">
  337. <span class="path1"></span>
  338. <span class="path2"></span>
  339. <span class="path3"></span>
  340. <span class="path4"></span>
  341. <span class="path5"></span>
  342. </i>
  343. </a>
  344. </div>
  345. </div>
  346. </div>
  347. {{- end}}
  348. </div>
  349. </div>
  350. <div class="form-group mt-5">
  351. <a href="#" data-repeater-create class="btn btn-light-primary">
  352. <i class="ki-duotone ki-plus fs-3"></i>
  353. <span data-i18n="general.add">Add</span>
  354. </a>
  355. </div>
  356. </div>
  357. </div>
  358. </div>
  359. <div class="card trigger trigger-fs trigger-schedule trigger-provider trigger-on-demand mt-10">
  360. <div class="card-header bg-light">
  361. <h3 data-i18n="rules.role_name_filters" class="card-title section-title-inner">Role name filters</h3>
  362. </div>
  363. <div class="card-body">
  364. <div id="role_name_filters">
  365. {{- template "infomsg-no-mb" "rules.role_name_filters_help"}}
  366. <div class="form-group">
  367. <div data-repeater-list="role_name_filters">
  368. {{- range $idx, $val := .Rule.Conditions.Options.RoleNames}}
  369. <div data-repeater-item>
  370. <div data-repeater-item>
  371. <div class="form-group row">
  372. <div class="col-md-7 mt-3 mt-md-8">
  373. <input type="text" class="form-control" name="role_name_pattern" value="{{$val.Pattern}}" />
  374. </div>
  375. <div class="col-md-4 mt-3 mt-md-8">
  376. <select name="type_role_name_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  377. <option value=""></option>
  378. <option value="inverse" data-i18n="rules.inverse_match" {{if $val.InverseMatch}}selected{{end}}>Inverse match</option>
  379. </select>
  380. </div>
  381. <div class="col-md-1 mt-3 mt-md-8">
  382. <a href="#" data-repeater-delete
  383. class="btn btn-light-danger ps-5 pe-4">
  384. <i class="ki-duotone ki-trash fs-2">
  385. <span class="path1"></span>
  386. <span class="path2"></span>
  387. <span class="path3"></span>
  388. <span class="path4"></span>
  389. <span class="path5"></span>
  390. </i>
  391. </a>
  392. </div>
  393. </div>
  394. </div>
  395. </div>
  396. {{- else}}
  397. <div data-repeater-item>
  398. <div class="form-group row">
  399. <div class="col-md-7 mt-3 mt-md-8">
  400. <input type="text" class="form-control" name="role_name_pattern" value="" />
  401. </div>
  402. <div class="col-md-4 mt-3 mt-md-8">
  403. <select name="type_role_name_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  404. <option value=""></option>
  405. <option value="inverse" data-i18n="rules.inverse_match">Inverse match</option>
  406. </select>
  407. </div>
  408. <div class="col-md-1 mt-3 mt-md-8">
  409. <a href="#" data-repeater-delete
  410. class="btn btn-light-danger ps-5 pe-4">
  411. <i class="ki-duotone ki-trash fs-2">
  412. <span class="path1"></span>
  413. <span class="path2"></span>
  414. <span class="path3"></span>
  415. <span class="path4"></span>
  416. <span class="path5"></span>
  417. </i>
  418. </a>
  419. </div>
  420. </div>
  421. </div>
  422. {{- end}}
  423. </div>
  424. </div>
  425. <div class="form-group mt-5">
  426. <a href="#" data-repeater-create class="btn btn-light-primary">
  427. <i class="ki-duotone ki-plus fs-3"></i>
  428. <span data-i18n="general.add">Add</span>
  429. </a>
  430. </div>
  431. </div>
  432. </div>
  433. </div>
  434. <div class="card trigger trigger-fs mt-10">
  435. <div class="card-header bg-light">
  436. <h3 data-i18n="rules.path_filters" class="card-title section-title-inner">Path filters</h3>
  437. </div>
  438. <div class="card-body">
  439. <div id="path_filters">
  440. {{- template "infomsg-no-mb" "rules.path_filters_help"}}
  441. <div class="form-group">
  442. <div data-repeater-list="path_filters">
  443. {{- range $idx, $val := .Rule.Conditions.Options.FsPaths}}
  444. <div data-repeater-item>
  445. <div data-repeater-item>
  446. <div class="form-group row">
  447. <div class="col-md-7 mt-3 mt-md-8">
  448. <input type="text" class="form-control" name="fs_path_pattern" value="{{$val.Pattern}}" />
  449. </div>
  450. <div class="col-md-4 mt-3 mt-md-8">
  451. <select name="type_fs_path_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  452. <option value=""></option>
  453. <option value="inverse" data-i18n="rules.inverse_match" {{if $val.InverseMatch}}selected{{end}}>Inverse match</option>
  454. </select>
  455. </div>
  456. <div class="col-md-1 mt-3 mt-md-8">
  457. <a href="#" data-repeater-delete
  458. class="btn btn-light-danger ps-5 pe-4">
  459. <i class="ki-duotone ki-trash fs-2">
  460. <span class="path1"></span>
  461. <span class="path2"></span>
  462. <span class="path3"></span>
  463. <span class="path4"></span>
  464. <span class="path5"></span>
  465. </i>
  466. </a>
  467. </div>
  468. </div>
  469. </div>
  470. </div>
  471. {{- else}}
  472. <div data-repeater-item>
  473. <div class="form-group row">
  474. <div class="col-md-7 mt-3 mt-md-8">
  475. <input type="text" class="form-control" name="fs_path_pattern" value="" />
  476. </div>
  477. <div class="col-md-4 mt-3 mt-md-8">
  478. <select name="type_fs_path_pattern" data-i18n="[data-placeholder]general.mode" class="form-select select-repetear" data-hide-search="true" data-allow-clear="true">
  479. <option value=""></option>
  480. <option value="inverse" data-i18n="rules.inverse_match">Inverse match</option>
  481. </select>
  482. </div>
  483. <div class="col-md-1 mt-3 mt-md-8">
  484. <a href="#" data-repeater-delete
  485. class="btn btn-light-danger ps-5 pe-4">
  486. <i class="ki-duotone ki-trash fs-2">
  487. <span class="path1"></span>
  488. <span class="path2"></span>
  489. <span class="path3"></span>
  490. <span class="path4"></span>
  491. <span class="path5"></span>
  492. </i>
  493. </a>
  494. </div>
  495. </div>
  496. </div>
  497. {{- end}}
  498. </div>
  499. </div>
  500. <div class="form-group mt-5">
  501. <a href="#" data-repeater-create class="btn btn-light-primary">
  502. <i class="ki-duotone ki-plus fs-3"></i>
  503. <span data-i18n="general.add">Add</span>
  504. </a>
  505. </div>
  506. </div>
  507. </div>
  508. </div>
  509. <div class="card trigger trigger-fs mt-10">
  510. <div class="card-header bg-light">
  511. <h3 data-i18n="rules.file_size_limits" class="card-title section-title-inner">
  512. File size limits
  513. </h3>
  514. </div>
  515. <div class="card-body">
  516. {{- template "infomsg" "rules.file_size_limits_help"}}
  517. <div class="form-group row">
  518. <label for="idFsMinSize" data-i18n="rules.min_size" class="col-md-3 col-form-label">Min size</label>
  519. <div class="col-md-3">
  520. <input id="idFsMinSize" type="text" class="form-control" name="fs_min_size" value="{{HumanizeBytes .Rule.Conditions.Options.MinFileSize}}" />
  521. </div>
  522. <div class="col-md-1"></div>
  523. <label for="idFsMaxSize" data-i18n="rules.max_size" class="col-md-2 col-form-label">Max size</label>
  524. <div class="col-md-3">
  525. <input id="idFsMaxSize" type="text" class="form-control" name="fs_max_size" value="{{HumanizeBytes .Rule.Conditions.Options.MaxFileSize}}" />
  526. </div>
  527. </div>
  528. </div>
  529. </div>
  530. <div class="card mt-10">
  531. <div class="card-header bg-light">
  532. <h3 data-i18n="title.event_actions" class="card-title section-title-inner">Actions</h3>
  533. </div>
  534. <div class="card-body">
  535. <div id="actions">
  536. {{- template "infomsg-no-mb" "rules.actions_help"}}
  537. <div class="form-group">
  538. <div data-repeater-list="actions">
  539. {{- range $idx, $val := .Rule.Actions}}
  540. <div data-repeater-item>
  541. <div data-repeater-item>
  542. <div class="form-group row">
  543. <div class="col-md-6 mt-3 mt-md-8">
  544. <select name="action_name" data-i18n="[data-placeholder]rules.action_placeholder" class="form-select select-repetear" data-allow-clear="true">
  545. <option value=""></option>
  546. {{- range $.Actions}}
  547. <option value="{{.Name}}" {{if eq $val.Name .Name}}selected{{end}}>{{.Name}}</option>
  548. {{- end}}
  549. </select>
  550. </div>
  551. <div class="col-md-5 mt-3 mt-md-8">
  552. <select name="action_options" class="form-select select-repetear" data-i18n="[data-placeholder]general.options" data-close-on-select="false" data-allow-clear="true" data-hide-search="true" multiple>
  553. <option value=""></option>
  554. <option value="2" data-i18n="rules.option_stop_on_failure" {{if $val.Options.StopOnFailure}}selected{{end}}>Stop on failure</option>
  555. <option value="3" data-i18n="rules.option_execute_sync" {{if $val.Options.ExecuteSync}}selected{{end}}>Execute sync</option>
  556. <option value="1" data-i18n="rules.option_failure_action" {{if $val.Options.IsFailureAction}}selected{{end}}>Is failure action</option>
  557. </select>
  558. </div>
  559. <div class="col-md-1 mt-3 mt-md-8">
  560. <a href="#" data-repeater-delete
  561. class="btn btn-light-danger ps-5 pe-4">
  562. <i class="ki-duotone ki-trash fs-2">
  563. <span class="path1"></span>
  564. <span class="path2"></span>
  565. <span class="path3"></span>
  566. <span class="path4"></span>
  567. <span class="path5"></span>
  568. </i>
  569. </a>
  570. </div>
  571. </div>
  572. </div>
  573. </div>
  574. {{- else}}
  575. <div data-repeater-item>
  576. <div class="form-group row">
  577. <div class="col-md-6 mt-3 mt-md-8">
  578. <select name="action_name" data-i18n="[data-placeholder]rules.action_placeholder" class="form-select select-repetear" data-allow-clear="true">
  579. <option value=""></option>
  580. {{- range $.Actions}}
  581. <option value="{{.Name}}">{{.Name}}</option>
  582. {{- end}}
  583. </select>
  584. </div>
  585. <div class="col-md-5 mt-3 mt-md-8">
  586. <select name="action_options" class="form-select select-repetear" data-i18n="[data-placeholder]general.options" data-close-on-select="false" data-allow-clear="true" data-hide-search="true" multiple>
  587. <option value=""></option>
  588. <option value="2" data-i18n="rules.option_stop_on_failure">Stop on failure</option>
  589. <option value="3" data-i18n="rules.option_execute_sync">Execute sync</option>
  590. <option value="1" data-i18n="rules.option_failure_action">Is failure action</option>
  591. </select>
  592. </div>
  593. <div class="col-md-1 mt-3 mt-md-8">
  594. <a href="#" data-repeater-delete
  595. class="btn btn-light-danger ps-5 pe-4">
  596. <i class="ki-duotone ki-trash fs-2">
  597. <span class="path1"></span>
  598. <span class="path2"></span>
  599. <span class="path3"></span>
  600. <span class="path4"></span>
  601. <span class="path5"></span>
  602. </i>
  603. </a>
  604. </div>
  605. </div>
  606. </div>
  607. {{- end}}
  608. </div>
  609. </div>
  610. <div class="form-group mt-5">
  611. <a href="#" data-repeater-create class="btn btn-light-primary">
  612. <i class="ki-duotone ki-plus fs-3"></i>
  613. <span data-i18n="general.add">Add</span>
  614. </a>
  615. </div>
  616. </div>
  617. </div>
  618. </div>
  619. <div class="d-flex justify-content-end mt-12">
  620. <input type="hidden" name="_form_token" value="{{.CSRFToken}}">
  621. <button type="submit" id="form_submit" class="btn btn-primary px-10" name="form_action" value="submit">
  622. <span data-i18n="general.submit" class="indicator-label">
  623. Submit
  624. </span>
  625. <span data-i18n="general.wait" class="indicator-progress">
  626. Please wait...
  627. <span class="spinner-border spinner-border-sm align-middle ms-2"></span>
  628. </span>
  629. </button>
  630. </div>
  631. </form>
  632. </div>
  633. </div>
  634. {{- end}}
  635. {{- define "extra_js"}}
  636. <script {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}} src="{{.StaticURL}}/assets/plugins/custom/formrepeater/formrepeater.bundle.js"></script>
  637. <script type="text/javascript" {{- if .CSPNonce}} nonce="{{.CSPNonce}}"{{- end}}>
  638. function onTriggerChanged(val){
  639. $('.trigger').hide();
  640. switch (val) {
  641. case '1':
  642. $('.trigger-fs').show();
  643. break;
  644. case '2':
  645. $('.trigger-provider').show();
  646. break;
  647. case '3':
  648. $('.trigger-schedule').show();
  649. break;
  650. case '4':
  651. case '5':
  652. break;
  653. case '6':
  654. $('.trigger-on-demand').show();
  655. break;
  656. case '7':
  657. $('.trigger-idp').show();
  658. break;
  659. default:
  660. console.log(`unsupported event trigger type: ${val}`);
  661. }
  662. }
  663. $(document).on("i18nload", function(){
  664. onTriggerChanged('{{.Rule.Trigger}}');
  665. });
  666. $(document).on("i18nshow", function(){
  667. initRepeater('#schedules');
  668. initRepeater('#name_filters');
  669. initRepeater('#group_name_filters');
  670. initRepeater('#role_name_filters');
  671. initRepeater('#path_filters');
  672. initRepeater('#actions');
  673. initRepeaterItems();
  674. $('#idTrigger').on("change", function(){
  675. onTriggerChanged(this.value);
  676. });
  677. $('#eventrule_form').submit(function (event) {
  678. let submitButton = document.querySelector('#form_submit');
  679. submitButton.setAttribute('data-kt-indicator', 'on');
  680. submitButton.disabled = true;
  681. });
  682. });
  683. </script>
  684. {{- end}}