aboutsummaryrefslogtreecommitdiffstats
path: root/apps/workflowengine/src/components/Workflow.vue
diff options
context:
space:
mode:
authorJulius Härtl <jus@bitgrid.net>2019-08-06 17:40:30 +0200
committerJulius Härtl <jus@bitgrid.net>2019-09-10 09:01:22 +0200
commitad976c66fd9a78e6d90224091634b04a25a08f40 (patch)
tree7ad9280b669d4fa8991867302d3e8b684b4be496 /apps/workflowengine/src/components/Workflow.vue
parent9eb7a318649b3ca2bf85ccdb1db5ecb3be0bde70 (diff)
downloadnextcloud-server-ad976c66fd9a78e6d90224091634b04a25a08f40.tar.gz
nextcloud-server-ad976c66fd9a78e6d90224091634b04a25a08f40.zip
Unified workflow management
Signed-off-by: Julius Härtl <jus@bitgrid.net>
Diffstat (limited to 'apps/workflowengine/src/components/Workflow.vue')
-rw-r--r--apps/workflowengine/src/components/Workflow.vue146
1 files changed, 146 insertions, 0 deletions
diff --git a/apps/workflowengine/src/components/Workflow.vue b/apps/workflowengine/src/components/Workflow.vue
new file mode 100644
index 00000000000..9993b328827
--- /dev/null
+++ b/apps/workflowengine/src/components/Workflow.vue
@@ -0,0 +1,146 @@
+<template>
+ <div>
+ <div class="section">
+ <h2>{{ t('workflowengine', 'Workflows') }}</h2>
+
+ <div class="actions" v-if="!hasUnsavedRule">
+ <Operation v-for="operation in getMainOperations" :key="operation.class"
+ :icon="operation.icon" :title="operation.title" :description="operation.description" :color="operation.color"
+ @click.native="createNewRule(operation)"></Operation>
+ </div>
+ <div class="actions__more" v-if="!hasUnsavedRule && hasMoreOperations">
+ <button class="icon" :class="showMoreOperations ? 'icon-triangle-n' : 'icon-triangle-s'"
+ @click="showMoreOperations=!showMoreOperations">
+ {{ showMoreOperations ? t('workflowengine', 'Show less') : t('workflowengine', 'Show more') }}
+ </button>
+ </div>
+ <transition name="slide">
+ <div class="actions" v-if="!hasUnsavedRule && showMoreOperations && hasMoreOperations">
+ <Operation v-for="operation in getMoreOperations" :key="operation.class" :icon="operation.icon" :title="operation.title" :description="operation.description"
+ @click.native="createNewRule(operation)"></Operation>
+ </div>
+ </transition>
+ </div>
+
+ <transition-group name="slide">
+ <Rule v-for="rule in rules" :key="rule.id" :rule="rule" @delete="removeRule(rule)" @cancel="removeRule(rule)" @update="updateRule"></Rule>
+ </transition-group>
+
+ </div>
+</template>
+
+<script>
+ import Rule from './Rule'
+ import Operation from './Operation'
+ import { operationService } from '../services/Operation'
+ import axios from 'nextcloud-axios'
+
+ const ACTION_LIMIT = 3
+
+ export default {
+ name: 'Workflow',
+ components: {
+ Operation,
+ Rule
+ },
+ async mounted() {
+ const { data } = await axios.get(OC.generateUrl('/apps/workflowengine/operations'))
+ this.rules = data
+ },
+ data() {
+ return {
+ operations: operationService,
+ showMoreOperations: false,
+ rules: []
+ }
+ },
+ computed: {
+ hasMoreOperations() {
+ return Object.keys(this.operations.getAll()).length > ACTION_LIMIT
+ },
+ getMainOperations() {
+ return Object.values(this.operations.getAll()).slice(0, ACTION_LIMIT)
+ },
+ getMoreOperations() {
+ return Object.values(this.operations.getAll()).slice(ACTION_LIMIT)
+
+ },
+ hasUnsavedRule() {
+ return !!this.rules.find((rule) => rule.id === -1)
+ }
+ },
+ methods: {
+ updateRule(rule) {
+ let index = this.rules.findIndex((item) => rule === item)
+ this.$set(this.rules, index, rule)
+ },
+ removeRule(rule) {
+ let index = this.rules.findIndex((item) => rule === item)
+ this.rules.splice(index, 1)
+ },
+ showAllOperations() {
+
+ },
+ createNewRule(operation) {
+ this.rules.unshift({
+ id: -1,
+ class: operation.class,
+ name: '', // unused in the new ui, there for legacy reasons
+ checks: [],
+ operation: operation.operation || ''
+ })
+ }
+ }
+ }
+</script>
+
+<style scoped lang="scss">
+ .actions {
+ display: flex;
+ .action__item {
+ border: 1px solid var(--color-border);
+ }
+ }
+
+ .actions__more {
+ text-align: center;
+ }
+
+ button.icon {
+ padding-left: 32px;
+ background-position: 10px center;
+ }
+
+
+ .slide-enter-active {
+ -moz-transition-duration: 0.3s;
+ -webkit-transition-duration: 0.3s;
+ -o-transition-duration: 0.3s;
+ transition-duration: 0.3s;
+ -moz-transition-timing-function: ease-in;
+ -webkit-transition-timing-function: ease-in;
+ -o-transition-timing-function: ease-in;
+ transition-timing-function: ease-in;
+ }
+
+ .slide-leave-active {
+ -moz-transition-duration: 0.3s;
+ -webkit-transition-duration: 0.3s;
+ -o-transition-duration: 0.3s;
+ transition-duration: 0.3s;
+ -moz-transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
+ -webkit-transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
+ -o-transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
+ transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
+ }
+
+ .slide-enter-to, .slide-leave {
+ max-height: 500px;
+ overflow: hidden;
+ }
+
+ .slide-enter, .slide-leave-to {
+ overflow: hidden;
+ max-height: 0;
+ }
+</style> \ No newline at end of file