Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/optimization #419

Draft
wants to merge 109 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
1d3d474
feat: optimization mode
blackbirdem Apr 11, 2024
f5b8e24
refactor: remove place setId
blackbirdem Apr 11, 2024
98c92cf
feat: job, vehicle and skill models for optimization
blackbirdem Apr 11, 2024
c67126f
feat: notImplemented warning available
blackbirdem Apr 11, 2024
b2cc073
feat: optimization tab
blackbirdem Apr 11, 2024
7c9a11c
feat: adjust height of sidebar for optimization tab
blackbirdem Apr 11, 2024
3fd4977
feat: job list, vehicle list
blackbirdem Apr 11, 2024
0b8bf7c
feat: optimization markers
blackbirdem Apr 11, 2024
9af0cd0
feat: pick job/vehicle from map
blackbirdem Apr 11, 2024
d173776
feat: optimization route steps
blackbirdem Apr 15, 2024
8c8b77e
feat: optimization route details
blackbirdem Apr 15, 2024
e5578b9
style: make import order uniform
blackbirdem Apr 25, 2024
66a453f
feat: add jobs/vehicles via right click on map
blackbirdem Apr 25, 2024
7757348
feat: edit jobs/vehicles box dialog
blackbirdem Apr 25, 2024
da39363
feat: place autocomplete for job/vehicle location
blackbirdem Apr 25, 2024
3c6abf4
feat: profile selection for vehicles
blackbirdem Apr 25, 2024
98981b4
feat: edit skills of jobs/vehicles
blackbirdem Apr 25, 2024
fc674ac
feat: download jobs/vehicles/skills
blackbirdem Apr 25, 2024
52ee340
feat: import jobs/vehicles/skills
blackbirdem Apr 25, 2024
03a119a
docs: add todo
blackbirdem Apr 25, 2024
defe625
fix: don't show empty chips
blackbirdem Apr 25, 2024
65ec497
feat: open optimization route in new window as directions route
blackbirdem Apr 25, 2024
3fb7d31
fix: edit ID in header
blackbirdem Apr 25, 2024
86c66cb
docs: add todos
blackbirdem Apr 25, 2024
b4d5e0a
refactor: simplify translation files
blackbirdem Apr 25, 2024
f4fb158
feat: add (untranslated) translation files
blackbirdem Apr 25, 2024
919d7f8
fix: GeoJSON download and import
blackbirdem May 2, 2024
e28bbfe
fix: edit job/vehicle from marker click
blackbirdem May 2, 2024
091f474
feat: skills sync with jobs/vehicles
blackbirdem May 2, 2024
29e4001
feat: clear all data in edit dialog
blackbirdem May 2, 2024
0b2484c
fix: vehicle time window
blackbirdem May 6, 2024
02c8339
fix: chips in markers
blackbirdem May 10, 2024
3a3df01
refactor: remove unused functions, parameter and imports
Seli0303 May 23, 2024
c73b6cb
feat: save job properties to AppRouteData options
blackbirdem May 23, 2024
588a87e
refactor: decrease complexity
Seli0303 May 23, 2024
b29e418
refactor: decrease complexity
Seli0303 May 27, 2024
62debb4
fix: jobProps can't be parsed when undefined
blackbirdem May 27, 2024
197635f
refactor: reduce redundancy
Seli0303 May 27, 2024
7edf018
fix: add disabledActions
blackbirdem Jun 3, 2024
d34c82d
fix: parsing and display of job props
blackbirdem Jun 3, 2024
1b3d490
feat: humanise time in job/vehicle chips
blackbirdem Jun 3, 2024
1376dbc
refactor: reduce duplicate code
Seli0303 Jun 3, 2024
1bfc164
refactor: use compare function for sorting
Seli0303 Jun 3, 2024
40b00b9
fix: optimization route download
blackbirdem Jun 4, 2024
29cf2df
refactor: resolve security hotspots (v-html) & remove unused functions
Seli0303 Jun 4, 2024
473a0c5
refactor: return to resolve warning
Seli0303 Jun 4, 2024
a156fd5
fix: TypeError on Firefox
TheGreatRefrigerator Jun 5, 2024
ee5ac77
feat: buildMapViewData includes jobs/vehicles
blackbirdem Jun 6, 2024
63239dc
refactor: reduce complexity
Seli0303 Jun 6, 2024
e182e01
fix: use mapViewData prop for download
TheGreatRefrigerator Jun 6, 2024
9e68211
fix: use more exclusive check first
TheGreatRefrigerator Jun 7, 2024
d782714
refactor: Place.fromGeoJsonObject as static function
blackbirdem Jun 10, 2024
ebf6932
fix: Jobs and Vehicles to (Geo)JSON
blackbirdem Jun 10, 2024
fc8effc
fix: import optimization route from GeoJson
blackbirdem Jun 10, 2024
5b839b8
refactor: reduce complexity and remove unused function
Seli0303 Jun 11, 2024
d8bda1c
refactor: remove assignment of loop counters
Seli0303 Jun 11, 2024
5b3fdfd
fix: show place name in popup for isochrones
Seli0303 Jun 11, 2024
c75f5ae
refactor: remove unused function and adjust javadocs
Seli0303 Jun 11, 2024
e623079
refactor: reduce complexity and redundant code
Seli0303 Jun 11, 2024
65301e9
test: extend download tests for json file
Seli0303 Jun 13, 2024
208ff02
fix: remove csv download option from routes
Seli0303 Jun 13, 2024
88fd4df
fix: parsing of JSON file into mapViewData
blackbirdem Jun 18, 2024
159ef5a
refactor: reduce complexity
blackbirdem Jun 18, 2024
46f15a3
refactor: reduce complexity
Seli0303 Jun 11, 2024
a1168a2
fix: reload URL when mapViewData uploaded
blackbirdem Jun 18, 2024
cad5656
refactor: rename default skill to 'cold chain'
TheGreatRefrigerator Jun 18, 2024
be2ef13
refactor: improve maintainability
Seli0303 Jun 18, 2024
891eeed
fix: update unassigned jobs alert
blackbirdem Jun 19, 2024
5e79700
feat: unassigned job alert on respective jobs
blackbirdem Jun 19, 2024
ca1c3eb
refactor: resolve warnings
Seli0303 Jun 19, 2024
018ac56
refactor: Provide a compare function to avoid sorting elements alphab…
Seli0303 Jun 20, 2024
298f0fb
fix: error with empty search input
Seli0303 Jun 25, 2024
489867d
build: increase default timeout for cypress commands
Seli0303 Jun 25, 2024
01018d2
refactor: active prop defined in component
blackbirdem Jul 3, 2024
1116ed8
fix: static hint
blackbirdem Jul 3, 2024
005808c
feat: change icon for edit jobs, vehicles and skills
Seli0303 Jul 10, 2024
91d6773
feat: remove defaults and button for optimize jobs
Seli0303 Jul 10, 2024
6717db4
feat: create top border for job list
Seli0303 Jul 10, 2024
654079e
feat: make vehicles collapsible
blackbirdem Jul 10, 2024
7db37ce
feat: hide jobs
blackbirdem Jul 10, 2024
7e01a1c
style: fix indentation
blackbirdem Jul 15, 2024
2a705ab
fix: adjust headings for optimization
Seli0303 Jul 16, 2024
a7304ee
feat: create boundary between routes
Seli0303 Jul 16, 2024
c5a27da
fix: save don't update route when nothing changed
Seli0303 Jul 17, 2024
90ef122
fix: dividing line between jobs and vehicles
blackbirdem Jul 25, 2024
3e6fe06
feat: unassigned jobs have different color markers
blackbirdem Jul 25, 2024
81ee6e0
refactor: combine job and vehicle list to one item list
Seli0303 Jul 29, 2024
9d3e45f
fix: error message
blackbirdem Jul 29, 2024
5336453
fix: markers are updated when no jobs/vehicles
blackbirdem Jul 29, 2024
aadde0c
fix: remove loading of jobs from places
blackbirdem Jul 30, 2024
fe2a782
refactor: remove unused translation files
Seli0303 Jul 31, 2024
f02ddb3
fix: expansion of job list
blackbirdem Aug 1, 2024
28fe27d
fix: job.toJSON includes service time
blackbirdem Aug 2, 2024
042603a
test: loads route from URL link
blackbirdem Aug 2, 2024
dd29dc5
test: opens edit dialog
blackbirdem Aug 2, 2024
2254a6f
test: finish and close test for picking a place from map
Seli0303 Aug 5, 2024
06891ac
test: use data-cy for object identification
Seli0303 Aug 6, 2024
df666a6
test: extract method to reduce duplicated code
Seli0303 Aug 8, 2024
a998281
test: show jobs and vehicles correct
Seli0303 Aug 19, 2024
2199dc0
test: shows job expansion correct
Seli0303 Aug 19, 2024
b89dd8f
test: shows dialog for jobs correctly and features are working
Seli0303 Aug 20, 2024
c2f0741
test: improve pick place from map
Seli0303 Aug 21, 2024
d96d13c
test: show optimization page correctly
Seli0303 Aug 21, 2024
ba12346
fix: change icon to hide/show jobs
Seli0303 Aug 22, 2024
451603c
test: render EditDialog for jobs
Seli0303 Aug 22, 2024
23a6e8a
refactor(map-view): remove unused canAddStop
TheGreatRefrigerator Aug 26, 2024
0cd2ee0
test: render EditDialog with jobs and vehicles
Seli0303 Aug 30, 2024
cc54f54
fixup! test: render EditDialog with jobs and vehicles
TheGreatRefrigerator Sep 2, 2024
5d0af4f
test: improve render EditDialog with jobs and vehicles
Seli0303 Oct 1, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cypress.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const config = require('./config');
const webpackPreprocessor = require('@cypress/webpack-preprocessor')

module.exports = defineConfig({
defaultCommandTimeout: 6000,
projectId: '2npvgh',
video: false,
e2e: {
Expand Down
7 changes: 3 additions & 4 deletions cypress/e2e/download.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,9 @@ describe('download functionality', function () {
'profile': 'driving-car',
'preference': 'recommended'
})
// TODO: extend download tests. Aliasing the readFile with as(..) doesn't work
// cy.get('@response').its('places[0].placeName').should('eq', 'Mannheim, BW,Germany')
// cy.get('@response').its('mode').should('eq', 'directions')
// cy.get('@response').its('isRouteData').should('eq', 'directions')
cy.readFile(filePath).its('places[0].placeName').should('eq', 'Mannheim, BW,Germany')
cy.readFile(filePath).its('mode').should('eq', 'directions')
cy.readFile(filePath).its('isRouteData').should('eq', true)
})
it('downloads a geojson file', () => {
const filePath = downloadFile('GeoJSON', 'json')
Expand Down
188 changes: 188 additions & 0 deletions cypress/e2e/optimization.cy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@

describe('Optimization component', () => {
context('loads route from URL link', () => {
it('shows optimization page and features correctly', () => {
viewPage('/#/optimize/49.419614285204595,8.688426017761232/data/' +
'{"coordinates":"8.688426017761232,49.419614285204595",' +
'"options":{"center":{"lat":49.41743941444882,"lng":8.681871455062602},"zoom":18,' +
'"vehicles":[{"id":1,"start":[8.678770065307619,49.4197817871778],"end":[8.678770065307619,49.4197817871778],' +
'"profile":"driving-car","time_window":[45000,50420],"capacity":[5],' +
'"skills":[1]}],' +
'"jobProps":[{"id":1,"skills":[1],"service":3600,"delivery":[1],"pickup":[1]}]}}')

// shows the map view correctly
cy.get('[data-cy="place-search"]').should('not.exist')
cy.get('.view-on-ors').should('not.exist')
cy.get('.v-snack__content')
cy.get('.ors-toolbar').should('not.be.visible')
cy.get('.leaflet-control-layers').should('be.visible')
cy.get('.leaflet-control-zoom').should('be.visible')
cy.get('.leaflet-draw').should('be.visible')
cy.get('#polyline-measure-control').should('be.visible')
cy.get('.my-location-btn').should('be.visible')

// shows the sidebar correctly
cy.get('[data-cy="sidebar-header"]')
cy.get('[data-cy="sidebar-content"]').should('be.visible')
cy.get('[data-cy="route-details"]').should('be.visible')
cy.get('[data-cy="job-heading"]').should('be.visible')
cy.get('[data-cy="job-inputs"]').should('be.visible')
cy.get('[data-cy="vehicle-heading"]').should('be.visible')
cy.get('[data-cy="vehicle-inputs"]').should('be.visible')

// shows routes correctly
cy.get('[data-cy=optimization-routes]').as('routes')
cy.get('@routes').should('have.length', 1)
cy.get('@routes').contains('Distance')
cy.get('@routes').contains('Duration')
cy.get('@routes').contains('Service time')
cy.get('@routes').contains('Deliveries')
cy.get('@routes').contains('Pickups')
cy.get('.route-details').should('have.length', 1)
cy.get('.step').should('have.length', 3)

// shows buttons
cy.get('[data-cy="manage-skills"]').should('be.visible')
cy.get('[data-cy="add-place-input"]').should('be.not.visible')
cy.get('[data-cy="round-trip"]').should('be.not.visible')
cy.get('[data-cy="route-importer"]').should('be.not.visible')
})

it('shows job correctly', () => {
viewPage('/#/optimize/49.419614285204595,8.688426017761232/data/' +
'{"coordinates":"8.688426017761232,49.419614285204595",' +
'"options":{"center":{"lat":49.41743941444882,"lng":8.681871455062602},"zoom":18,' +
'"vehicles":[{"id":1,"start":[8.678770065307619,49.4197817871778],"end":[8.678770065307619,49.4197817871778],' +
'"profile":"driving-car","time_window":[45000,50420],"capacity":[5],' +
'"skills":[1]}],' +
'"jobProps":[{"id":1,"skills":[1],"service":3600,"delivery":[1],"pickup":[1]}]}}')

cy.get('[data-cy="manage-jobs"]').should('be.visible')
cy.get('[data-cy="hide-jobs"]').as('hide').should('be.visible')
cy.get('[data-cy="job-inputs"]').should('have.length', 1)

cy.get('[data-cy="job-list"]').as('jobs').should('be.visible')
cy.get('@jobs').contains('Job 1').should('be.visible')
cy.get('@jobs').contains('8.6884260, 49.419614').should('be.visible')
cy.get('@jobs').contains('Deliveries').should('be.not.visible')
cy.get('@jobs').contains('Pickups').should('be.not.visible')
cy.get('@jobs').contains('Skills').should('be.not.visible')
cy.get('@jobs').contains('Service time').should('be.not.visible')
//expand job
cy.get('@jobs').click()
cy.get('@jobs').contains('Deliveries').should('be.visible')
cy.get('@jobs').contains('Pickups').should('be.visible')
cy.get('@jobs').contains('Skills').should('be.visible')
cy.get('@jobs').contains('Service time').should('be.visible')

//hide job correctly
cy.get('@hide').click()
cy.get('[data-cy="hidden-jobs"]').contains('Saved Jobs: 1')
})

it('shows vehicle correctly', () => {
viewPage('/#/optimize/49.419614285204595,8.688426017761232/data/' +
'{"coordinates":"8.688426017761232,49.419614285204595",' +
'"options":{"center":{"lat":49.41743941444882,"lng":8.681871455062602},"zoom":18,' +
'"vehicles":[{"id":1,"start":[8.678770065307619,49.4197817871778],"end":[8.678770065307619,49.4197817871778],' +
'"profile":"driving-car","time_window":[45000,50420],"capacity":[5],' +
'"skills":[1]}],' +
'"jobProps":[{"id":1,"skills":[1],"service":3600,"delivery":[1],"pickup":[1]}]}}')

cy.get('[data-cy="manage-vehicles"]').should('be.visible')
cy.get('[data-cy="vehicle-inputs"]').should('have.length', 1)

cy.get('[data-cy="vehicle-list"]').as('vehicles').should('be.visible')
cy.get('@vehicles').contains('Vehicle 1')
cy.get('@vehicles').contains('driving-car')
cy.get('@vehicles').contains('Capacity')
cy.get('@vehicles').contains('Skills')
cy.get('@vehicles').contains('Time window')
})
})

context('opens edit dialog', () => {
it('shows manageJobs and features correctly', () => {
viewPage('/#/optimize/49.419614285204595,8.688426017761232/data/' +
'{"coordinates":"8.688426017761232,49.419614285204595",' +
'"options":{"center":{"lat":49.41743941444882,"lng":8.681871455062602},"zoom":18,' +
'"vehicles":[{"id":1,"start":[8.678770065307619,49.4197817871778],"end":[8.678770065307619,49.4197817871778],' +
'"profile":"driving-car","time_window":[45000,50420],"capacity":[5],' +
'"skills":[1]}],' +
'"jobProps":[{"id":1,"skills":[1],"service":3600,"delivery":[1],"pickup":[1]}]}}')

cy.get('[data-cy="manage-jobs"]').click()

// shows dialog and card content correctly
cy.get('.edit-header-btn')
cy.get('.download-container')
cy.get('[data-cy="dataCards"]').as('dataCards').should('have.length', 1)
cy.get('[data-cy="cardText"]').as('cardText')

cy.get('@dataCards').contains('edit').should('be.visible')
cy.get('@dataCards').contains('copy').should('be.visible')
cy.get('@dataCards').contains('delete').should('be.visible')

cy.get('@cardText').contains('Service time').should('be.visible')
cy.get('@cardText').contains('Skills').should('be.visible')
cy.get('@cardText').contains('Deliveries').should('be.visible')
cy.get('@cardText').contains('Pickups').should('be.visible')

//expand card and change job
cy.get('@cardText').click()
cy.get('@dataCards').contains('check').should('be.visible')

cy.get('[data-cy="delivery"]').clear()
.type('2')
cy.get('[data-cy="pickup"]').clear()
.type('2')
cy.get('[data-cy="service"]').clear()
.type('0')
cy.get('@cardText').contains('drop_down').click()
cy.contains('settings').should('be.visible')
cy.contains('check_box').click()

// close dialog with x and check if job has not changed
cy.get('[data-cy="edit-dialog"]').contains('close').click()
cy.get('[data-cy="job-list"]').as('jobs').click()
cy.get('@jobs').contains('Job 1').should('be.visible')
cy.get('@jobs').contains('8.6884260, 49.419614').should('be.visible')
cy.get('@jobs').contains('Deliveries: 1').should('be.visible')
cy.get('@jobs').contains('Pickups: 1').should('be.visible')
cy.get('@jobs').contains('Skills: 1').should('be.visible')
cy.get('@jobs').contains('Service time: 1').should('be.visible')
})

it('picks place from map', () => {
viewPage('/#/optimize/49.419614285204595,8.688426017761232/data/' +
'{"coordinates":"8.688426017761232,49.419614285204595",' +
'"options":{"center":{"lat":49.41743941444882,"lng":8.681871455062602},"zoom":18,' +
'"vehicles":[{"id":1,"start":[8.678770065307619,49.4197817871778],"end":[8.678770065307619,49.4197817871778],' +
'"profile":"driving-car","time_window":[45000,50420],"capacity":[5],' +
'"skills":[1]}],' +
'"jobProps":[{"id":1,"skills":[1],"service":3600,"delivery":[1],"pickup":[1]}]}}')

cy.get('[data-cy="manage-jobs"]').click()
cy.get('[data-cy="cardText"]').click()

cy.contains('search').click()
cy.get('[data-cy="location-input"]').should('be.visible')
cy.contains('map').should('be.visible')
.click()

cy.get('[data-cy="edit-dialog"]').should('not.exist')

cy.get('#map-view').click()
cy.get('[data-cy=save]').click()
cy.get('[data-cy="job-list"]').contains('Job 1')
})
})
function viewPage(url) {
cy.visit(url)
cy.viewport(1848, 980)
cy.get('#app')
cy.get('.app-content')
cy.get('#map-view')
cy.get('[data-cy="sidebar"]')
}
})
2 changes: 2 additions & 0 deletions src/config-examples/app-config-example.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ const appConfig = {

autoSelectFirstExactAddressMatchOnSearchEnter: true, // If the first exact address match must be auto selected when the user type a text and in the place search and hit enter/return

disabledActionsForOptimization: ['addPlaceInput', 'roundtrip', 'routeImporter'], // Possible values: `addPlaceInput`, `clearPlaces`, `reverseRoute`, `roundtrip`, `routeImporter`
disabledActionsForIsochrones: ['roundtrip'], // Possible values: `addPlaceInput`, `clearPlaces`, `reverseRoute`, `roundtrip`, `routeImporter`
disabledActionsForPlacesAndDirections: [], // // Possible values: `addPlaceInput`, `clearPlaces`, `reverseRoute`, `roundtrip`, `routeImporter`
supportsPlacesAndDirections: true, // If the whole places and directions feature is supported/enabled in the application
supportsIsochrones: true, // If isochrones is supported/enabled in the application
supportsOptimization: true, // If optimization is enabled
supportsMapFiltersOnSidebar: true, // if the filters options box is present/enabled in the app
supportsDirections: true, // If the directions functionality is available
sidebarStartsOpenInHighResolution: false, // if the sidebar must start open in high resolution
Expand Down
8 changes: 7 additions & 1 deletion src/fragments/forms/map-form/MapForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,20 @@
<v-tab ripple key="1" class="tab-title" v-if="hasIsochronesTab">
{{$t('mapForm.isochrones')}}
</v-tab>
<v-tab ripple key="2" class="tab-title" v-if="hasOptimizationTab">
{{$t('mapForm.optimization')}}
</v-tab>
</v-tabs>
<v-tabs-items v-model="activeTab" touchless>
<v-tab-item key="0" class="places-and-directions-tab-form" v-if="hasPlacesAndDirectionsTab" touchless>
<places-and-directions :active="$store.getters.mode !== constants.modes.isochrones"> </places-and-directions>
<places-and-directions :active="[constants.modes.places, constants.modes.directions].includes($store.getters.mode)"> </places-and-directions>
</v-tab-item>
<v-tab-item key="1" class="isochrones-tab-form" v-if="hasIsochronesTab" touchless>
<isochrones :active="$store.getters.mode === constants.modes.isochrones" ></isochrones>
</v-tab-item>
<v-tab-item key="2" class="optimization-tab-form" v-if="hasOptimizationTab" touchless>
<optimization :active="$store.getters.mode === constants.modes.optimization" ></optimization>
</v-tab-item>
</v-tabs-items>
</div>
</template>
Expand Down
12 changes: 10 additions & 2 deletions src/fragments/forms/map-form/components/download/Download.vue
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
<template>
<div class="download-container" ref="downloadContainer">
<v-btn class="open-download-btn" style="float:right; margin-top:0" small icon :title="$t('download.download')" @click="openDownload()"><v-icon>cloud_download</v-icon></v-btn>
<v-btn v-if="mapViewData" class="open-download-btn" style="float:right; margin-top:0" small icon :title="$t('download.download')" @click="openDownload()"><v-icon>cloud_download</v-icon></v-btn>
<v-btn v-else-if="data" class="edit-btn" flat style="background:white; margin-top:0" :title="$t('download.download')" @click="openDownload()"><v-icon color="primary">cloud_download</v-icon></v-btn>
<v-dialog v-model="isDownloadModalOpen" max-width="600" attach="body" :persistent="true">
<box customClass="download-modal" v-model="isDownloadModalOpen" background="white" closable @closed="closeDownload()">
<h3 slot="header">{{$t('download.downloadRoute')}}</h3>
<h3 v-if="mapViewData" slot="header">{{$t('download.downloadRoute')}}</h3>
<h3 v-else slot="header">
{{ $t('download.download') + ' ' + editProp }}
<v-btn :style="{background: 'white'}" flat small icon @click="copyToClipboard" :title="$t('download.copyToClipboard')">
<v-icon color="primary">content_copy</v-icon>
</v-btn>
</h3>
<v-text-field class="export-file-name" :label="$t('download.downloadFileName')" v-model="downloadFileName" :required="true"></v-text-field>
<v-select class="download-format" :label="$t('download.downloadFormat')" :items="availableDownloadFormats" v-model="downloadFormat"></v-select>
<v-layout row wrap>
Expand All @@ -18,3 +25,4 @@
</template>

<script src="./download.js"></script>
<style scoped src="./download.css"></style>
8 changes: 8 additions & 0 deletions src/fragments/forms/map-form/components/download/download.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
.edit-btn {
padding: 0 20px;
min-width: 0;
float: right;
margin: 0;
height: 24px;
background: white;
}
Loading