X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/c4e503180948300c3a6ef99e338d2e56b2931236..c11055f2d6ce8385088bc221eab1175e31777ec0:/src/services/collection-service/collection-service.ts diff --git a/src/services/collection-service/collection-service.ts b/src/services/collection-service/collection-service.ts index 47268255..d07ef216 100644 --- a/src/services/collection-service/collection-service.ts +++ b/src/services/collection-service/collection-service.ts @@ -2,17 +2,20 @@ // // SPDX-License-Identifier: AGPL-3.0 -import { CommonResourceService } from "../../common/api/common-resource-service"; -import { CollectionResource } from "../../models/collection"; +import * as _ from "lodash"; +import { CommonResourceService } from "~/common/api/common-resource-service"; +import { CollectionResource } from "~/models/collection"; import axios, { AxiosInstance } from "axios"; import { KeepService } from "../keep-service/keep-service"; -import { FilterBuilder } from "../../common/api/filter-builder"; -import { CollectionFile, createCollectionFile, createCollectionDirectory, createCollectionFilesTree } from "../../models/collection-file"; -import { parseKeepManifestText, stringifyKeepManifest } from "../collection-files-service/collection-manifest-parser"; -import * as _ from "lodash"; -import { KeepManifestStream } from "../../models/keep-manifest"; -import { WebDAV } from "../../common/webdav"; +import { WebDAV } from "~/common/webdav"; import { AuthService } from "../auth-service/auth-service"; +import { mapTree, getNodeChildren, getNode, TreeNode } from "../../models/tree"; +import { getTagValue } from "~/common/xml"; +import { FilterBuilder } from "~/common/api/filter-builder"; +import { CollectionFile, createCollectionFile, CollectionFileType, CollectionDirectory, createCollectionDirectory } from '~/models/collection-file'; +import { parseKeepManifestText, stringifyKeepManifest } from "../collection-files-service/collection-manifest-parser"; +import { KeepManifestStream } from "~/models/keep-manifest"; +import { createCollectionFilesTree } from '~/models/collection-file'; export type UploadProgress = (fileId: number, loaded: number, total: number, currentTime: number) => void; @@ -24,31 +27,39 @@ export class CollectionService extends CommonResourceService async files(uuid: string) { const request = await this.webdavClient.propfind(`/c=${uuid}`); if (request.responseXML != null) { - return createCollectionFilesTree(this.extractFilesData(request.responseXML)); + const files = this.extractFilesData(request.responseXML); + const tree = createCollectionFilesTree(files); + const sortedTree = mapTree(node => { + const children = getNodeChildren(node.id)(tree).map(id => getNode(id)(tree)) as TreeNode[]; + children.sort((a, b) => + a.value.type !== b.value.type + ? a.value.type === CollectionFileType.DIRECTORY ? -1 : 1 + : a.value.name.localeCompare(b.value.name) + ); + return { ...node, children: children.map(child => child.id) }; + })(tree); + return sortedTree; } return Promise.reject(); } - async deleteFile(collectionUuid: string, filePath: string){ + async deleteFile(collectionUuid: string, filePath: string) { return this.webdavClient.delete(`/c=${collectionUuid}${filePath}`); } - extractFilesData(document: Document) { + const collectionUrlPrefix = /\/c=[0-9a-zA-Z\-]*/; return Array .from(document.getElementsByTagName('D:response')) - .slice(1) + .slice(1) // omit first element which is collection itself .map(element => { - const [displayNameElement] = Array.from(element.getElementsByTagName('D:displayname')); - const name = displayNameElement ? displayNameElement.innerHTML : undefined; - - const [sizeElement] = Array.from(element.getElementsByTagName('D:getcontentlength')); - const size = sizeElement ? parseInt(sizeElement.innerHTML, 10) : 0; - - const [hrefElement] = Array.from(element.getElementsByTagName('D:href')); - const pathname = hrefElement ? hrefElement.innerHTML : undefined; - const directory = pathname && pathname.replace(/\/c=[0-9a-zA-Z\-]*/, '').replace(`/${name || ''}`, ''); - + const name = getTagValue(element, 'D:displayname', ''); + const size = parseInt(getTagValue(element, 'D:getcontentlength', '0'), 10); + const pathname = getTagValue(element, 'D:href', ''); + const nameSuffix = `/${name || ''}`; + const directory = pathname + .replace(collectionUrlPrefix, '') + .replace(nameSuffix, ''); const href = this.webdavClient.defaults.baseURL + pathname + '?api_token=' + this.authService.getApiToken(); const data = { @@ -58,10 +69,9 @@ export class CollectionService extends CommonResourceService path: directory, }; - const [resourceTypeElement] = Array.from(element.getElementsByTagName('D:resourcetype')); - return resourceTypeElement && resourceTypeElement.innerHTML === '' - ? createCollectionFile({ ...data, size }) - : createCollectionDirectory(data); + return getTagValue(element, 'D:resourcetype', '') + ? createCollectionDirectory(data) + : createCollectionFile({ ...data, size }); }); }