schedule.html 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. {% extends "base.html" %}
  2. {% block body %}
  3. <div id="app">
  4. <div class="md-layout md-gutter md-alignment-center">
  5. <div class="md-layout-item md-size-100">
  6. <div class="md-title">
  7. <span>
  8. <md-button href="/" class="md-icon-button md-primary home-icon">
  9. <md-icon>home</md-icon>
  10. </md-button>
  11. Diffido: ${(schedule && schedule.title) || 'new'} schedule
  12. </span>
  13. </div>
  14. </div>
  15. <div class="md-layout-item md-medium-size-60 md-small-size-100">
  16. <md-card id="main-card">
  17. <md-card-header>
  18. <div class="md-title">
  19. Settings
  20. </div>
  21. </md-card-header>
  22. <md-card-content>
  23. <div class="md-layout md-gutter">
  24. <div class="md-layout-item md-size-50">
  25. <md-field>
  26. <label>title</label>
  27. <md-input v-model="schedule.title" required></md-input>
  28. </md-field>
  29. </div>
  30. <div class="md-layout-item md-size-50">
  31. <md-field>
  32. <label>url</label>
  33. <md-input v-model="schedule.url" required></md-input>
  34. </md-field>
  35. </div>
  36. </div>
  37. <div class="md-layout md-gutter">
  38. <div class="md-layout-item md-size-33">
  39. <md-field>
  40. <label>notify email</label>
  41. <md-input v-model="schedule.email" type="email"></md-input>
  42. </md-field>
  43. </div>
  44. <div class="md-layout-item md-size-33">
  45. <md-field>
  46. <label>XPath selector</label>
  47. <md-input v-model="schedule.xpath"></md-input>
  48. </md-field>
  49. </div>
  50. <div class="md-layout-item md-size-33">
  51. <md-field>
  52. <label>minimum change</label>
  53. <md-input v-model="schedule.minimum_change"></md-input>
  54. </md-field>
  55. </div>
  56. </div>
  57. <md-switch v-model="schedule.enabled">enabled</md-switch>
  58. </md-card-content>
  59. </md-card>
  60. </div>
  61. <div class="md-layout-item md-medium-size-40 md-small-size-100">
  62. <md-card id="trigger-card">
  63. <md-card-header>
  64. <div class="md-title">
  65. Trigger
  66. </div>
  67. </md-card-header>
  68. <md-card-content>
  69. <div class="md-layout md-gutter">
  70. <div class="md-layout-item md-size-25">
  71. <md-field>
  72. <label>trigger</label>
  73. <md-select v-model="schedule.trigger">
  74. <md-option value="interval">interval</md-option>
  75. <md-option value="cron">cron</md-option>
  76. </md-select>
  77. </md-field>
  78. </div>
  79. </div>
  80. <div v-if="schedule.trigger == 'cron'" class="md-layout md-gutter">
  81. <div class="md-layout-item md-size-50">
  82. <md-field>
  83. <label>crontab</label>
  84. <md-input v-model="schedule.cron_crontab"></md-input>
  85. </md-field>
  86. </div>
  87. </div>
  88. <div v-if="schedule.trigger == 'interval'" class="md-layout md-gutter">
  89. <div class="md-layout-item md-size-20">
  90. <md-field>
  91. <label>weeks</label>
  92. <md-input v-model="schedule.interval_weeks" type="number"></md-input>
  93. </md-field>
  94. </div>
  95. <div class="md-layout-item md-size-20">
  96. <md-field>
  97. <label>days</label>
  98. <md-input v-model="schedule.interval_days" type="number"></md-input>
  99. </md-field>
  100. </div>
  101. </div>
  102. <div v-if="schedule.trigger == 'interval'" class="md-layout md-gutter">
  103. <div class="md-layout-item md-size-20">
  104. <md-field>
  105. <label>hours</label>
  106. <md-input v-model="schedule.interval_hours" type="number"></md-input>
  107. </md-field>
  108. </div>
  109. <div class="md-layout-item md-size-20">
  110. <md-field>
  111. <label>minutes</label>
  112. <md-input v-model="schedule.interval_minutes" type="number"></md-input>
  113. </md-field>
  114. </div>
  115. <div class="md-layout-item md-size-20">
  116. <md-field>
  117. <label>seconds</label>
  118. <md-input v-model="schedule.interval_seconds" type="number"></md-input>
  119. </md-field>
  120. </div>
  121. </div>
  122. </md-card-content>
  123. </md-card>
  124. </div>
  125. <div class="md-layout-item md-size-100">
  126. <div class="md-title">
  127. <br />
  128. <md-button class="md-raised md-primary" @click="saveSchedule()">save</md-button>
  129. <md-button class="md-raised md-accent" :disabled="!hasID()" @click="deleteSchedule()">delete</md-button>
  130. <md-button href="/">back</md-button>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. <script>
  136. Vue.use(VueMaterial.default);
  137. var app = new Vue({
  138. el: '#app',
  139. delimiters: ['${', '}'],
  140. data: {
  141. {% if isinstance(id, str) %}
  142. id: "{{id}}",
  143. {% else %}
  144. id: null,
  145. {% end %}
  146. schedule: {},
  147. empty_schedule: {enabled: true, trigger: 'interval'}
  148. },
  149. mounted: function() {
  150. this.getSchedule(this.id);
  151. },
  152. computed: {
  153. },
  154. methods: {
  155. hasID: function() {
  156. return !(this.id === undefined || this.id === null || this.id === '');
  157. },
  158. getSchedule: function() {
  159. if (!this.hasID()) {
  160. this.schedule = this.empty_schedule;
  161. return;
  162. }
  163. self = this;
  164. var data = axios.get('/api/schedules/' + this.id).then(function(response) {
  165. self.schedule = response.data.schedule || self.empty_schedule;
  166. });
  167. },
  168. saveSchedule: function() {
  169. var data = this.schedule;
  170. if (this.hasID()) {
  171. axios.put('/api/schedules/' + this.id, data).then(function(response) {
  172. window.location = '/';
  173. });
  174. } else {
  175. axios.post('/api/schedules', data).then(function(response) {
  176. window.location = '/';
  177. /* window.location = '/schedule.html?id=' + response.data.id; */
  178. });
  179. }
  180. },
  181. deleteSchedule: function() {
  182. if (!this.hasID()) {
  183. return;
  184. }
  185. axios.delete('/api/schedules/' + this.id).then(function(response) {
  186. window.location = '/';
  187. });
  188. }
  189. }
  190. });
  191. </script>
  192. {% end %}
  193. {% block style %}
  194. body {
  195. padding: 12px 20px 12px 20px !important;
  196. }
  197. .home-icon {
  198. margin-top: -6px;
  199. }
  200. .md-card-content {
  201. padding: 20px;
  202. }
  203. #trigger-card, #main-card {
  204. min-height: 350px;
  205. }
  206. {% end %}