diff --git a/src/components/DeleteNetworkDialog.vue b/src/components/DeleteNetworkDialog.vue index 8f07e715..9704f174 100644 --- a/src/components/DeleteNetworkDialog.vue +++ b/src/components/DeleteNetworkDialog.vue @@ -117,6 +117,7 @@ export default Vue.extend({ watch: { dialog() { if (this.dialog) { + this.clear(); this.confirmationPhrase = randomPhrase(); } else { this.$emit('closed'); @@ -134,6 +135,11 @@ export default Vue.extend({ await Promise.all(selection.map((network) => api.deleteNetwork(workspace, network))); this.dialog = false; }, + + clear() { + this.confirmationPhrase = ''; + this.confirmation = ''; + }, }, }); diff --git a/src/components/DeleteTableDialog.vue b/src/components/DeleteTableDialog.vue index d7831b7c..cdc27412 100644 --- a/src/components/DeleteTableDialog.vue +++ b/src/components/DeleteTableDialog.vue @@ -165,6 +165,7 @@ export default Vue.extend({ if (using.length > 0) { this.using = using; } else { + this.clear(); this.confirmationPhrase = randomPhrase(); } } else { @@ -181,10 +182,12 @@ export default Vue.extend({ } = this; await Promise.all(selection.map((table) => api.deleteTable(workspace, table))); - this.dialog = false; + }, + + clear() { + this.confirmationPhrase = ''; this.confirmation = ''; - this.confirmationPhrase = randomPhrase(); }, async findDependentNetworks() { diff --git a/src/components/DeleteWorkspaceDialog.vue b/src/components/DeleteWorkspaceDialog.vue index 27849c4a..9742cfaf 100644 --- a/src/components/DeleteWorkspaceDialog.vue +++ b/src/components/DeleteWorkspaceDialog.vue @@ -123,6 +123,7 @@ export default Vue.extend({ watch: { dialog() { if (this.dialog) { + this.clear(); this.confirmationPhrase = randomPhrase(); } else { this.$emit('closed'); @@ -143,6 +144,11 @@ export default Vue.extend({ this.dialog = false; }, + + clear() { + this.confirmationPhrase = ''; + this.confirmation = ''; + }, }, }); diff --git a/src/components/LoginMenu.vue b/src/components/LoginMenu.vue index 391f17d7..c221b2bc 100644 --- a/src/components/LoginMenu.vue +++ b/src/components/LoginMenu.vue @@ -80,7 +80,7 @@ export default { const userInfo = this.userInfo as unknown as UserSpec | null; if (userInfo !== null) { - return `${userInfo.first_name[0]}${userInfo.last_name[0]}`; + return `${userInfo.first_name[0] || ''}${userInfo.last_name[0] || ''}`; } return ''; }, diff --git a/src/components/NetworkCreateForm.vue b/src/components/NetworkCreateForm.vue index a5f0a179..0c6baa27 100644 --- a/src/components/NetworkCreateForm.vue +++ b/src/components/NetworkCreateForm.vue @@ -32,7 +32,9 @@ create network @@ -64,6 +66,7 @@ export default Vue.extend({ networkCreationErrors: [] as string[], networkEdgeTable: null as string | null, newNetwork: '', + loading: false, }; }, computed: { @@ -80,16 +83,24 @@ export default Vue.extend({ } try { + this.loading = true; await api.createNetwork(workspace, newNetwork, { edgeTable: this.networkEdgeTable, }); this.networkCreationErrors = []; + this.clear(); this.$emit('success'); } catch (error) { const message = `Network "${this.newNetwork}" already exists.`; this.networkCreationErrors = [message]; } }, + + clear() { + this.networkEdgeTable = null; + this.newNetwork = ''; + this.loading = false; + }, }, }); diff --git a/src/components/TableDialog.vue b/src/components/TableDialog.vue index 4fb17b85..ba4af52f 100644 --- a/src/components/TableDialog.vue +++ b/src/components/TableDialog.vue @@ -32,8 +32,10 @@ Set Column Types + {{ tableCreationError }} @@ -45,7 +47,7 @@ @@ -61,7 +64,6 @@ Create Table @@ -175,24 +179,16 @@ diff --git a/src/store/index.ts b/src/store/index.ts index 1eb954fe..86584f9f 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -37,23 +37,30 @@ const { currentWorkspacePermission: null, } as State, getters: { + tables(state: State, getters): string[] { + if (state.currentWorkspace !== null && state.currentWorkspace.nodeTables && state.currentWorkspace.edgeTables) { + return getters.nodeTables.concat(getters.edgeTables).sort(); + } + return []; + }, + nodeTables(state: State): string[] { if (state.currentWorkspace !== null && state.currentWorkspace.nodeTables) { - return state.currentWorkspace.nodeTables; + return state.currentWorkspace.nodeTables.sort(); } return []; }, edgeTables(state: State): string[] { if (state.currentWorkspace !== null && state.currentWorkspace.edgeTables) { - return state.currentWorkspace.edgeTables; + return state.currentWorkspace.edgeTables.sort(); } return []; }, networks(state: State) { if (state.currentWorkspace !== null && state.currentWorkspace.networks) { - return state.currentWorkspace.networks; + return state.currentWorkspace.networks.sort(); } return []; }, @@ -75,7 +82,7 @@ const { }, mutations: { setWorkspaces(state, workspaces: string[]) { - state.workspaces = workspaces; + state.workspaces = workspaces.sort(); }, setCurrentWorkspace(state, workspace: WorkspaceState) { diff --git a/src/utils/files.ts b/src/utils/files.ts index 8dd56609..d097dcf0 100644 --- a/src/utils/files.ts +++ b/src/utils/files.ts @@ -1,15 +1,6 @@ import Papa, { ParseResult } from 'papaparse'; import dayjs from 'dayjs'; -import { validUploadType } from 'multinet'; -import { FileType, CSVColumnType } from '@/types'; - -const fileExtension = (file: File) => file.name.split('.').slice(-1)[0]; -const fileName = (file: File) => file.name.split('.')[0]; - -function validFileType(file: File, allowedTypes: readonly FileType[]) { - const extension = fileExtension(file); - return allowedTypes.some((type) => type.extension.includes(extension) && validUploadType(type.queryCall)); -} +import { CSVColumnType } from '@/types'; function isBoolean(strings: Set) { // This function tests whether both elements of an array belong to the string @@ -150,7 +141,5 @@ async function analyzeCSV(file: File): Promise { } export { - fileName, - validFileType, analyzeCSV, }; diff --git a/src/views/NetworkDetail.vue b/src/views/NetworkDetail.vue index 21f18210..74e89efe 100644 --- a/src/views/NetworkDetail.vue +++ b/src/views/NetworkDetail.vue @@ -40,9 +40,7 @@ - - more_vert - + import Vue, { PropType } from 'vue'; import { EdgesSpec, TableRow } from 'multinet'; +import WorkspaceOptionMenu from '@/components/WorkspaceOptionMenu.vue'; import api from '@/api'; import { App } from '@/types'; export default Vue.extend({ name: 'NetworkDetail', + + components: { + WorkspaceOptionMenu, + }, + props: { workspace: { type: String as PropType, @@ -441,6 +445,8 @@ export default Vue.extend({ } }); this.edgeTypes = edges.results.length > 0 ? [tableName(edges.results[0])] : []; + this.nodeTypes = this.nodeTypes.sort(); + this.edgeTypes = this.edgeTypes.sort(); // eslint-disable-next-line no-underscore-dangle this.nodes = nodes.results.map((node) => node._id); diff --git a/src/views/NodeDetail.vue b/src/views/NodeDetail.vue index 2bb38144..4e0316e2 100644 --- a/src/views/NodeDetail.vue +++ b/src/views/NodeDetail.vue @@ -52,9 +52,7 @@ - - more_vert - + , diff --git a/src/views/TableDetail.vue b/src/views/TableDetail.vue index 9001d486..eb9ff94d 100644 --- a/src/views/TableDetail.vue +++ b/src/views/TableDetail.vue @@ -18,7 +18,7 @@ -
+
@@ -81,9 +81,7 @@ - - more_vert - +
, @@ -155,14 +160,15 @@ export default Vue.extend({ return { rowKeys: [] as KeyValue[][], headers: [] as Array, - tables: [] as string[], editing: false, tableSize: 1, pagination: {} as DataPagination, loading: true, + loadingTables: true, }; }, computed: { + tables: () => store.getters.tables, // eslint-disable-next-line @typescript-eslint/no-explicit-any dataTableHeaders(this: any) { const { @@ -217,12 +223,21 @@ export default Vue.extend({ this.update(); }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tables(this: any) { + this.loadingTables = false; + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any pagination(this: any) { this.update(); }, }, + created() { + store.dispatch.fetchWorkspace(this.workspace); + }, + methods: { rowClassName(index: number): 'even-row' | 'odd-row' { return index % 2 === 0 ? 'even-row' : 'odd-row'; @@ -271,11 +286,6 @@ export default Vue.extend({ this.rowKeys = rowKeys; this.headers = headers; - // Roni to convert these lines to computed function - this.tables = (await api.tables(this.workspace, { - type: 'all', - })).results.map((table) => table.name); - this.loading = false; }, }, diff --git a/src/views/WorkspaceDetail.vue b/src/views/WorkspaceDetail.vue index fe47dafd..bc9355db 100644 --- a/src/views/WorkspaceDetail.vue +++ b/src/views/WorkspaceDetail.vue @@ -80,39 +80,7 @@ /> - - - - - - - - - search - - - AQL Wizard - - - - - + string|boolean> = [ @@ -180,7 +148,7 @@ export default Vue.extend({ components: { TablePanel, NetworkPanel, - PermissionsDialog, + WorkspaceOptionMenu, }, props: { workspace: { @@ -194,13 +162,13 @@ export default Vue.extend({ editing: false, requestError: null as string | null, loading: false, - actionsMenu: false, }; }, computed: { nodeTables: () => store.getters.nodeTables, edgeTables: () => store.getters.edgeTables, + tables: () => store.getters.tables, networks: () => store.getters.networks, // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -213,14 +181,6 @@ export default Vue.extend({ return errors.filter((res): res is string => typeof res === 'string'); }, - tables(): string[] { - const { - nodeTables, - edgeTables, - } = this; - - return nodeTables.concat(edgeTables); - }, }, watch: { @@ -268,7 +228,7 @@ export default Vue.extend({ if (err.response.status === 409) { this.requestError = 'A workspace by that name already exists'; } else { - this.requestError = err.response.statusText; + this.requestError = `${Object.values(err.response.data).flat()[0]}`; } } }