From 335d7cfba3f767efe709eb27676c34c7086a2d68 Mon Sep 17 00:00:00 2001 From: Julius Härtl Date: Mon, 9 Sep 2019 16:20:33 +0200 Subject: Add tag selector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- .../src/components/Checks/FileSystemTag.vue | 82 +++++++++++++ .../Checks/MultiselectTag/MultiselectTag.vue | 130 +++++++++++++++++++++ .../src/components/Checks/MultiselectTag/api.js | 90 ++++++++++++++ .../src/components/Checks/MultiselectTag/index.js | 4 + apps/workflowengine/src/components/Checks/file.js | 4 +- .../src/components/Checks/request.js | 5 +- 6 files changed, 312 insertions(+), 3 deletions(-) create mode 100644 apps/workflowengine/src/components/Checks/FileSystemTag.vue create mode 100644 apps/workflowengine/src/components/Checks/MultiselectTag/MultiselectTag.vue create mode 100644 apps/workflowengine/src/components/Checks/MultiselectTag/api.js create mode 100644 apps/workflowengine/src/components/Checks/MultiselectTag/index.js (limited to 'apps/workflowengine/src') diff --git a/apps/workflowengine/src/components/Checks/FileSystemTag.vue b/apps/workflowengine/src/components/Checks/FileSystemTag.vue new file mode 100644 index 00000000000..ead4edf60c2 --- /dev/null +++ b/apps/workflowengine/src/components/Checks/FileSystemTag.vue @@ -0,0 +1,82 @@ + + + + + + + diff --git a/apps/workflowengine/src/components/Checks/MultiselectTag/MultiselectTag.vue b/apps/workflowengine/src/components/Checks/MultiselectTag/MultiselectTag.vue new file mode 100644 index 00000000000..a046861b132 --- /dev/null +++ b/apps/workflowengine/src/components/Checks/MultiselectTag/MultiselectTag.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/apps/workflowengine/src/components/Checks/MultiselectTag/api.js b/apps/workflowengine/src/components/Checks/MultiselectTag/api.js new file mode 100644 index 00000000000..f371a4b71de --- /dev/null +++ b/apps/workflowengine/src/components/Checks/MultiselectTag/api.js @@ -0,0 +1,90 @@ +import axios from 'nextcloud-axios' +import { generateRemoteUrl } from 'nextcloud-router' + +const xmlToJson = (xml) => { + let obj = {} + + if (xml.nodeType === 1) { + if (xml.attributes.length > 0) { + obj['@attributes'] = {} + for (let j = 0; j < xml.attributes.length; j++) { + const attribute = xml.attributes.item(j) + obj['@attributes'][attribute.nodeName] = attribute.nodeValue + } + } + } else if (xml.nodeType === 3) { + obj = xml.nodeValue + } + + if (xml.hasChildNodes()) { + for (let i = 0; i < xml.childNodes.length; i++) { + const item = xml.childNodes.item(i) + const nodeName = item.nodeName + if (typeof (obj[nodeName]) === 'undefined') { + obj[nodeName] = xmlToJson(item) + } else { + if (typeof obj[nodeName].push === 'undefined') { + var old = obj[nodeName] + obj[nodeName] = [] + obj[nodeName].push(old) + } + obj[nodeName].push(xmlToJson(item)) + } + } + } + return obj +} + +const parseXml = (xml) => { + let dom = null + try { + dom = (new DOMParser()).parseFromString(xml, 'text/xml') + } catch (e) { + console.error('Failed to parse xml document', e) + } + return dom +} + +const xmlToTagList = (xml) => { + let json = xmlToJson(parseXml(xml)) + let list = json['d:multistatus']['d:response'] + let result = [] + for (let index in list) { + let tag = list[index]['d:propstat'] + + if (tag['d:status']['#text'] !== 'HTTP/1.1 200 OK') { + continue + } + result.push({ + id: tag['d:prop']['oc:id']['#text'], + displayName: tag['d:prop']['oc:display-name']['#text'], + canAssign: tag['d:prop']['oc:can-assign']['#text'] === 'true', + userAssignable: tag['d:prop']['oc:user-assignable']['#text'] === 'true', + userVisible: tag['d:prop']['oc:user-visible']['#text'] === 'true' + }) + } + return result +} + +const searchTags = function() { + return axios({ + method: 'PROPFIND', + url: generateRemoteUrl('dav') + '/systemtags/', + data: ` + + + + + + + + + ` + }).then((response) => { + return xmlToTagList(response.data) + }) +} + +export { + searchTags +} diff --git a/apps/workflowengine/src/components/Checks/MultiselectTag/index.js b/apps/workflowengine/src/components/Checks/MultiselectTag/index.js new file mode 100644 index 00000000000..69b7e277e76 --- /dev/null +++ b/apps/workflowengine/src/components/Checks/MultiselectTag/index.js @@ -0,0 +1,4 @@ +import MultiselectTag from './MultiselectTag' + +export default MultiselectTag +export { MultiselectTag } diff --git a/apps/workflowengine/src/components/Checks/file.js b/apps/workflowengine/src/components/Checks/file.js index 816aaa73a65..431a3f93580 100644 --- a/apps/workflowengine/src/components/Checks/file.js +++ b/apps/workflowengine/src/components/Checks/file.js @@ -22,6 +22,7 @@ import FileMimeType from './FileMimeType' import { stringValidator, validateIPv4, validateIPv6 } from './../../helpers/validators' +import FileSystemTag from './FileSystemTag'; const FileChecks = [ { class: 'OCA\\WorkflowEngine\\Check\\FileName', @@ -95,7 +96,8 @@ const FileChecks = [ operators: [ { operator: 'is', name: t('workflowengine', 'is tagged with') }, { operator: '!is', name: t('workflowengine', 'is not tagged with') } - ] + ], + component: FileSystemTag } ] diff --git a/apps/workflowengine/src/components/Checks/request.js b/apps/workflowengine/src/components/Checks/request.js index 5550555cf02..ee574f9de90 100644 --- a/apps/workflowengine/src/components/Checks/request.js +++ b/apps/workflowengine/src/components/Checks/request.js @@ -22,6 +22,7 @@ import RequestUserAgent from './RequestUserAgent' import RequestTime from './RequestTime' +import RequestURL from './RequestURL' const RequestChecks = [ { @@ -32,8 +33,8 @@ const RequestChecks = [ { operator: '!is', name: t('workflowengine', 'is not') }, { operator: 'matches', name: t('workflowengine', 'matches') }, { operator: '!matches', name: t('workflowengine', 'does not match') } - ] - // TODO: implement component + ], + component: RequestURL }, { class: 'OCA\\WorkflowEngine\\Check\\RequestTime', -- cgit v1.2.3