schedule.html 7.2 KB

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