From 1186e5727c75138fde7b0873d694191f66834e5c Mon Sep 17 00:00:00 2001 From: Justin Denton Date: Thu, 13 Jun 2019 12:35:34 -0600 Subject: [PATCH 1/4] test(cypress): Splits selectors into multiple files --- 0] | 0 cypress.json | 3 +- .../feature-list.spec.js/After go to.snap.png | Bin 0 -> 8573 bytes .../Before go to.snap.png | Bin 0 -> 6722 bytes .../features loaded.snap.png | Bin 30170 -> 29865 bytes .../features loaded.snap.png | Bin 122386 -> 161207 bytes .../{layer-features => feature-list}/feat.kml | 2 +- .../toolbar-right/test-state_state.xml | 273 ++ .../layers-dialog/feature-list.spec.js | 960 +++++ .../layers-dialog/layer-features.spec.js | 180 - .../smoke-tests/generate-heatmap.spec.js | 55 +- .../integration/smoke-tests/layers.spec.js | 64 +- .../smoke-tests/load-data-file-csv.spec.js | 67 +- .../load-data-file-geojson.spec.js | 63 +- .../smoke-tests/load-data-file-kml.spec.js | 63 +- .../smoke-tests/load-data-file-shp.spec.js | 63 +- .../load-data-server-arcgis.spec.js | 102 +- .../load-data-server-geoserver.spec.js | 142 +- .../load-state-file-arcgis.spec.js | 93 +- .../load-state-file-geoserver.spec.js | 74 +- .../load-state-file-url-csv.spec.js | 54 +- .../load-state-file-url-kml.spec.js | 56 +- cypress/integration/smoke-tests/map.spec.js | 30 +- .../smoke-tests/smoke-test.spec.js | 103 +- .../smoke-tests/status-bar.spec.js | 187 +- .../smoke-tests/toolbar-center.spec.js | 102 +- .../smoke-tests/toolbar-left.spec.js | 288 +- .../smoke-tests/toolbar-right.spec.js | 320 +- cypress/support/commands.js | 23 +- cypress/support/execute-tests.sh | 60 +- cypress/support/index.js | 9 + cypress/support/selectors.js | 3152 ----------------- cypress/support/selectors/core.js | 272 ++ cypress/support/selectors/dialogs.js | 722 ++++ cypress/support/selectors/imports.js | 179 + cypress/support/selectors/layers.js | 308 ++ cypress/support/selectors/settings.js | 158 + cypress/support/selectors/shared.js | 393 ++ package.json | 1 + src/os/ui/descriptioninfo.js | 3 +- views/descriptioninfo.html | 2 +- views/windows/featurelist.html | 2 +- 42 files changed, 4339 insertions(+), 4289 deletions(-) create mode 100644 0] create mode 100644 cypress/comparisons/regression-tests/layers-dialog/feature-list.spec.js/After go to.snap.png create mode 100644 cypress/comparisons/regression-tests/layers-dialog/feature-list.spec.js/Before go to.snap.png rename cypress/fixtures/regression-tests/layers-dialog/{layer-features => feature-list}/feat.kml (99%) create mode 100644 cypress/fixtures/smoke-tests/toolbar-right/test-state_state.xml create mode 100644 cypress/integration/regression-tests/layers-dialog/feature-list.spec.js delete mode 100644 cypress/integration/regression-tests/layers-dialog/layer-features.spec.js delete mode 100644 cypress/support/selectors.js create mode 100644 cypress/support/selectors/core.js create mode 100644 cypress/support/selectors/dialogs.js create mode 100644 cypress/support/selectors/imports.js create mode 100644 cypress/support/selectors/layers.js create mode 100644 cypress/support/selectors/settings.js create mode 100644 cypress/support/selectors/shared.js diff --git a/0] b/0] new file mode 100644 index 000000000..e69de29bb diff --git a/cypress.json b/cypress.json index cdda38dda..8f7852092 100644 --- a/cypress.json +++ b/cypress.json @@ -3,5 +3,6 @@ "viewportWidth": 1279, "viewportHeight": 1000, "video": false, - "numTestsKeptInMemory": 20 + "numTestsKeptInMemory": 20, + "defaultCommandTimeout": 8000 } diff --git a/cypress/comparisons/regression-tests/layers-dialog/feature-list.spec.js/After go to.snap.png b/cypress/comparisons/regression-tests/layers-dialog/feature-list.spec.js/After go to.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..47b4482dc878d5e667200bf8416b95e6e21baae4 GIT binary patch literal 8573 zcmeHLYgAKL7QR$lyJTTzmMw9Fl2ue#R!kf_f@mOP3l&hIQz{R6#0L{9CV>VB2q8G_ zI4%cA4J;BMB=POIQb9;DggihIc_vg8Qv?DIAy7jI5xGH|3ATHO;pK_=fXV%4o+mX3EY( z&myq>l?{DV6ZhnW{QP;GW;Uk1=9%om*@p*P(n62aFt4uJkTd;LsPArbu?{AhucuzQ z;L+1^lhBI5wxDwAD&Pck;VC*on|7gNTa*|2*zv{6t7qsB_bYccP#UO1X zS?G9%vk`q9z2Sc4&W4*C?(N_fhZQ|M4772R(K;NbZ^wmKWV0q>{8%}J#YHXJtIoMj zybnR+U3Lu8NKU3#3BlP9NGT0bRs@qf*%QFS--REoU-W5j2YWmt=6>s%f_ZO^+Px?P~kbKX>oTDSERb1!%JyE-R(jkV#*3Z&Kb znDr_?&MCo`7zNvPvRHUY?ht6oxQ^NiMxvr`2PP|yb6$lJC z*E8)~(A;Ne#k*J)sk3QD9oI#6ArTqb_rmcZNEWtrfdxUjF3@GPappfIy|%KPiB4)c zO&C^s*%Q02F-ecH^(3ZuIi1ITwws&3G*(l(Xx51`_&iWXw~Gh;`Rd^M?WsN|gFvC*&(>QvqhAoBNqg(QO@%lv5uFR^8o_X{EYNDv$1kF& z+n%5OHdT?gokvcZvh^BS#)tca_NArNBDUZL05c4wU4*Y;v>>e9WhV>OAit?9g{GrS z%WyjO3EB26A&WtZ3u_X=Qy7NLvWMoB9{LxaKVWv#iB7Vl@_4zm!QM5F38=h+~KE3cV5MWPP=GE&bm)O6-5a)gip!q8bO_$7c zf7tRYK5kMrCG>>aaEHNh(l-AvS1b1Kwc0 z^dxspTq5}a6e5=Ak)0ME@Lb^Toj}t5XFAEPadVf^Hpo8#;4hYE0C! z6`2u6VapUVS_HAIC!}k%jp_ghI(Y9OBN)(V8>xAu`?~RztYy^jLGNK8>RExMi*_GN zg*Htjr3KptUIrLJx1MnSANC?LPXF|_j_dQnG2_W&u$A42X%>iiS>$Zk*J(~&w~u9S zB4TMWfz=heR_Z`!PjELmy^cYbXq16$ONBlZXrAp7NpsDimNwPt_SR-i-P`IVr6EqF{rVt7muUow)84W3qnXr z759J#G=8@Z3_sdDfrmOKU(28?HE5!K0D|(}2uJ@VU)v~&(x^}ouDXhvF2qMWU!Jcx zO_xMVy2K_5$Hgq%06~-_ko$RO7M~nmaw?s{mUN$OKjfXPA5=A}xS+!A=m1V%u!gks z5d^9&1bJa$)nV@;J?2I7=2Bw^P?a`cAYv!BmphF7F=1lMsm#FQVOkv(^VC7cVleOz zYH7wV0mNSc_8PgH#U1|jOk|cGey`X+ldJCT@E1p-C`$1>8!s^S9q7!jKC3Z6rmme`_;x+;4~uciE3Ls=PtIv%ne&;S7u2@#-Z&tWOIN zqmFR(chmtu9nVZ$SqAHNU|m1Kqyzw6JO_d}F;PF7^O5VMWE})`ehS=fn8&u3gcDYS z3D=ej**3D@*c#N`r21g=eWi(?H|wp5#u1n-P$EYq&MSEtZhGYPieif21YY YnA1bu(oum((IzB1GB%>_lcV4K9a72R*8l(j literal 0 HcmV?d00001 diff --git a/cypress/comparisons/regression-tests/layers-dialog/feature-list.spec.js/Before go to.snap.png b/cypress/comparisons/regression-tests/layers-dialog/feature-list.spec.js/Before go to.snap.png new file mode 100644 index 0000000000000000000000000000000000000000..d3f7f2bc855844549abf59c64309eab8356e8041 GIT binary patch literal 6722 zcmeAS@N?(olHy`uVBq!ia0y~yVENC$!2E)P4JfkkRrEIo1}RQY7srqa#y1BU1rIm~ zFfV-j^ZTE#6B+ltVg;&UII|N(Hh7AID1(^ee4Wee0FoLMbdLT045?GVZ zE)Zu_6T@ggjHZautT9?fj24!owZ>@mIoc!uwu(lZ1fxxY(I&xYlVG$-Fxn&-Z4!(& z2}YX)zz`U&O@agWBoac~!qYSEYJYD@<);T3K F0RWv>1<(Kh literal 0 HcmV?d00001 diff --git a/cypress/comparisons/smoke-tests/load-data-file-kml.spec.js/features loaded.snap.png b/cypress/comparisons/smoke-tests/load-data-file-kml.spec.js/features loaded.snap.png index 1debadefa0c2af470b7a0dbde6617e10900a7354..b1da5ef91756f20d4ed2fddecee9b3a0971e6525 100644 GIT binary patch literal 29865 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

&>;=+-8jhBCBNku2Vib|E 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 tL|?B;%2&j3SX^Q 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 literal 30170 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

    sP<1;lY`dmbA7?a~=`&(4na4p}?rjPKRm?H+t& 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 - -73.98384899986625,40.76172799961419 + -073.99962,+40.71919 diff --git a/cypress/fixtures/smoke-tests/toolbar-right/test-state_state.xml b/cypress/fixtures/smoke-tests/toolbar-right/test-state_state.xml new file mode 100644 index 000000000..5ef47486e --- /dev/null +++ b/cypress/fixtures/smoke-tests/toolbar-right/test-state_state.xml @@ -0,0 +1,273 @@ + + load-state-file-test-state + + + -104.762689220413 + 39.684036153011 + 40406.39413085028 + 359.9999999999991 + 0.1465133313096203 + 0 + clampToGround + + Equirectangular + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-3769575637#features + Tile and Feature Groups + https://ags.auroragov.org/aurora/rest/services/OpenData/MapServer/3/query + + json + 4326 + 4326 + * + esriGeometryPolygon + {geom} + true + + true + Police Stations + true + false + true + true + load-state-file-test-state + true + 0 + Infinity + 100 + m + 1000 + 1000 + manual + + 1 + + m + m + + 1 + + + false + Default + Point + false + absolute + 0 + true + + 255 + 0xFFFFFF + 6 + 14 + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-1904757301#features + Tile and Feature Groups + https://ags.auroragov.org/aurora/rest/services/OpenData/MapServer/234/query + + json + 4326 + 4326 + * + esriGeometryPolygon + {geom} + true + + true + Fire Hydrants + true + false + true + true + load-state-file-test-state + true + 0 + Infinity + 100 + m + 1000 + 1000 + manual + + 1 + + m + m + + 1 + + + false + Default + Point + false + absolute + 0 + true + + 255 + 0xFFFFFF + 6 + 14 + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-3769575637#tiles + Tile and Feature Groups + Aurora ArcGIS Server + false + https://ags.auroragov.org/aurora/rest/services/OpenData/MapServer + + show: 3 + + Police Stations + colorControl:pickerReset + 0xFFFFFF + + https://ags.auroragov.org/aurora/rest/services/OpenData/MapServer + + true + 0 + 0 + 1 + false + 25 + 2 + 0 + true + load-state-file-test-state + + 255 + 0xFFFFFF + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-1904757301#tiles + Tile and Feature Groups + Aurora ArcGIS Server + false + https://ags.auroragov.org/aurora/rest/services/OpenData/MapServer + + show: 234 + + Fire Hydrants + colorControl:pickerReset + 0xFFFFFF + + https://ags.auroragov.org/aurora/rest/services/OpenData/MapServer + + true + 0 + 0 + 1 + false + 25 + 2 + 0 + true + load-state-file-test-state + + 255 + 0xFFFFFF + + + + + + + + + -104.86673846853317,39.690182046896496 -104.86673846853317,39.704755563026254 -104.6384463523347,39.704755563026254 -104.6384463523347,39.690182046896496 -104.86673846853317,39.690182046896496 + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-1904757301#features + + + + + + -104.83642564896452,39.73758771113435 -104.83642564896452,39.76152069521899 -104.82702880692463,39.76152069521899 -104.82702880692463,39.73758771113435 -104.83642564896452,39.73758771113435 + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-3769575637#features + + + + + + + + OWNER + + + + + + + #ffffff + 1 + 3 + Icon + http://maps.google.com/mapfiles/kml/paddle/purple-stars.png + Point + true + false + + + + + + + + + DIRECTION + + + + + + + + + + + + + -104.82165729127,39.61403121471881 -104.82165729127,39.77515550513715 -104.66969363246358,39.77515550513715 -104.66969363246358,39.61403121471881 -104.82165729127,39.61403121471881 + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-1904757301#features + + + + + + + + -104.84757476992185,39.68512152332343 -104.84757476992185,39.75605766958 -104.80108188783922,39.75605766958 -104.80108188783922,39.68512152332343 -104.84757476992185,39.68512152332343 + + + + state#ghn7ebhnrjq2-depdqf9ttkbk-3769575637#features + + + + + + + + + + diff --git a/cypress/integration/regression-tests/layers-dialog/feature-list.spec.js b/cypress/integration/regression-tests/layers-dialog/feature-list.spec.js new file mode 100644 index 000000000..321fd1b27 --- /dev/null +++ b/cypress/integration/regression-tests/layers-dialog/feature-list.spec.js @@ -0,0 +1,960 @@ +/// +var core = require('../../../support/selectors/core.js'); +var dialogs = require('../../../support/selectors/dialogs.js'); +var imports = require('../../../support/selectors/imports.js'); +var layers = require('../../../support/selectors/layers.js'); +var shared = require('../../../support/selectors/shared.js'); + +describe('Feature list', function() { + before('Login', function() { + cy.login(); + + // Import test data + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.upload('regression-tests/layers-dialog/feature-list/feat.kml'); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importKMLDialog.OK_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'feat.kml Features (7)'); + + // Open features list dialog + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Status bar', function() { + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records'); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'selected'); + }); + + it('Column headers', function() { + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.GRID).should('be.visible'); + cy.get(shared.Grid.HEADER_ROW).should('be.visible'); + cy.get(shared.Grid.HEADER_CELL_1).should('have.text', ''); + cy.get(shared.Grid.HEADER_CELL_2).contains('TIME'); + cy.get(shared.Grid.HEADER_CELL_3).contains('MGRS'); + cy.get(shared.Grid.HEADER_CELL_4).contains('LAT_DMS'); + cy.get(shared.Grid.HEADER_CELL_5).contains('LON_DMS'); + cy.get(shared.Grid.HEADER_CELL_6).contains('LAT'); + cy.get(shared.Grid.HEADER_CELL_7).contains('LON'); + cy.get(shared.Grid.HEADER_CELL_8).contains('LAT_DDM'); + cy.get(shared.Grid.HEADER_CELL_9).contains('LON_DDM'); + cy.get(shared.Grid.HEADER_CELL_10).contains('name'); + cy.get(shared.Grid.HEADER_CELL_11).contains('description'); + cy.get(shared.Grid.HEADER_CELL_12).contains('line'); + cy.get(shared.Grid.HEADER_ROW).contains('notes'); // Columns reversed GUI vs CLI, less specific selector + cy.get(shared.Grid.HEADER_ROW).contains('objectid'); // Columns reversed GUI vs CLI, less specific selector + cy.get(shared.Grid.HEADER_CELL_15).contains('ID'); + }); + }); + + it('Spot check data', function() { + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).within(function() { + cy.get(shared.Grid.CELL_3).contains('18TWL8884215339'); + cy.get(shared.Grid.CELL_5).contains('073° 56\' 49.44" W'); + cy.get(shared.Grid.CELL_7).contains('-73.9470660219183'); + cy.get(shared.Grid.CELL_9).contains('073° 56.82\' W'); + }); + + cy.get(shared.Grid.ROW_3).within(function() { + cy.get(shared.Grid.CELL_2).should('have.text', ''); + cy.get(shared.Grid.CELL_4).should('contain', '40° 39\' 52.97" N'); + cy.get(shared.Grid.CELL_6).should('contain', '40.66471445143568'); + cy.get(shared.Grid.CELL_8).should('contain', '40° 39.88\' N'); + }); + + cy.get(shared.Grid.ROW_5).within(function() { + cy.get(shared.Grid.CELL_3).should('contain', '18TWL8449008066'); + cy.get(shared.Grid.CELL_4).should('contain', '40° 43\' 09.08" N'); + cy.get(shared.Grid.CELL_5).should('contain', '073° 59\' 58.63" W'); + cy.get(shared.Grid.CELL_6).should('contain', '40.71919'); + }); + }); + }); + + it('Description dialog', function() { + // Setup + cy.wait(100); // Link not immediately ready when dialog loads + + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.CELL_11) + .contains('Show') + .click(); + cy.get(dialogs.descriptionInfoDialog.DIALOG).should('be.visible'); + + // See https://github.com/cypress-io/cypress/issues/136 for why this is needed + cy.get(dialogs.descriptionInfoDialog.CONTENT).then(function($iframe) { + var $body = $iframe.contents().find('body'); + expect($body.text()).to.equal('This is the description text.'); + }); + + // Clean up + cy.get(dialogs.descriptionInfoDialog.CLOSE_BUTTON).click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_1) + .find(shared.Grid.CELL_2) + .click(); + }); + + describe('Selections (mouse/keyboard)', function() { + before('Login', function() { + // Setup + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Make single selection', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + }); + + it('Change single selection', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'selected'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + }); + + it('Remove single selection', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'selected'); + }); + + it('Make multiple selection (ctrl)', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (2 selected)'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + }); + + it('Change multiple selection (ctrl)', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + }); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (2 selected)'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_2) + .click(); + }); + + it('Remove multiple selection (ctrl)', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + }); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'selected'); + }); + + it('Make multiple selection (shift)', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{shift}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (3 selected)'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + }); + + it('Change multiple selection (shift)', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{shift}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{shift}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_2).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + }); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (3 selected)'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_4) + .find(shared.Grid.CELL_2) + .click(); + }); + + it('Remove multiple selection (shift)', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_1) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{shift}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{shift}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + }); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (3 selected)'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_1) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .find(shared.Grid.CELL_2) + .click(); + }); + }); + + describe('Context menu', function() { + before('Login', function() { + // Setup + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Menu options without selection', function() { + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'selected'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).should('be.visible'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Select All'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Deselect All'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Invert'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).should('not.contain', 'Sort Selected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Hide Selected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Hide Unselected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Display All'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Remove Selected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Remove Unselected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Export'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).should('not.contain', 'Go To'); + }); + + it('Menu options with selection', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick() + .rightClick(); // TODO: This is a workaround for #677 and can be removed after it is fixed + cy.get(dialogs.featureListDialog.contextMenu.PANEL).should('be.visible'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Select All'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Deselect All'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Invert'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Sort Selected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Hide Selected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Hide Unselected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Display All'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Remove Selected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Remove Unselected'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Export'); + cy.get(dialogs.featureListDialog.contextMenu.PANEL).contains('Go To'); + + // Clean up + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .find(shared.Grid.CELL_2) + .click(); + }); + + it('Select All', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'selected'); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.GRID) + .rightClick() + .rightClick(); // TODO: This is a workaround for #677 and can be removed after it is fixed + }); + cy.get(dialogs.featureListDialog.contextMenu.SELECT_ALL).click(); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + }); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (7 selected)'); + + // Clean up + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.DESELECT_ALL).click(); + }); + + it('Deselect All', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.SELECT_ALL).click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (7 selected)'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.DESELECT_ALL).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'selected'); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + }); + }); + + it('Invert', function() { + // Setup + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_2) + .click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (2 selected)'); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.GRID).rightClick(); + }); + cy.get(dialogs.featureListDialog.contextMenu.INVERT).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (5 selected)'); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + }); + + // Clean up + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.DESELECT_ALL).click(); + }); + + it('Sort Selected', function() { + // Setup + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_2) + .click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (2 selected)'); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_1) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8884215339'); + cy.get(shared.Grid.ROW_2) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL9489920441'); + cy.get(shared.Grid.ROW_3) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL9341202125'); + cy.get(shared.Grid.ROW_4) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8661903835'); + cy.get(shared.Grid.ROW_5) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8449008066'); + cy.get(shared.Grid.ROW_6) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8444208022'); + cy.get(shared.Grid.ROW_7) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8519809280'); + cy.get(shared.Grid.GRID).rightClick(); + }); + cy.get(dialogs.featureListDialog.contextMenu.SORT_SELECTED).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (2 selected)'); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(shared.Grid.ROW_1).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_2).should('have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_3).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_4).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_5).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_6).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_7).should('not.have.class', shared.Grid.ROW_IS_SELECTED_CLASS); + cy.get(shared.Grid.ROW_1) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8449008066'); + cy.get(shared.Grid.ROW_2) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8519809280'); + cy.get(shared.Grid.ROW_3) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8884215339'); + cy.get(shared.Grid.ROW_4) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL9489920441'); + cy.get(shared.Grid.ROW_5) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL9341202125'); + cy.get(shared.Grid.ROW_6) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8661903835'); + cy.get(shared.Grid.ROW_7) + .find(shared.Grid.CELL_3) + .should('contain', '18TWL8444208022'); + }); + + // Clean up + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Hide Selected', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_3) + .click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .should('contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.HIDE_SELECTED).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '6 records (1 hidden)'); + cy.get(dialogs.featureListDialog.DIALOG).should('not.contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'feat.kml Features (6/7)'); + + // Clean up + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.DISPLAY_ALL).click(); + }); + + it('Hide Unselected', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_3) + .click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_1) + .should('contain', '18TWL8884215339'); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.HIDE_UNSELECTED).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '1 record (1 selected, 6 hidden)'); + cy.get(dialogs.featureListDialog.DIALOG).should('not.contain', '18TWL8884215339'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_1) + .should('contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'feat.kml Features (1/7)'); + + // Clean up + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.DISPLAY_ALL).click(); + }); + + it('Display All (after hide)', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.HIDE_SELECTED).click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.DISPLAY_ALL).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .should('contain', '18TWL9341202125'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .should('contain', '18TWL8449008066'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .should('contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'feat.kml Features (7)'); + + // Clean up + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Display All (after remove)', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_3) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_5) + .find(shared.Grid.CELL_2) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.REMOVE_SELECTED).click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.DISPLAY_ALL).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '4 records'); + cy.get(dialogs.featureListDialog.DIALOG) + .should('not.contain', '18TWL9341202125') + .should('not.contain', '18TWL8449008066') + .should('not.contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'feat.kml Features (4)'); + + // Clean up + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.REFRESH).click(); + cy.wait(200); // Row not immediately ready after refresh + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Remove Selected', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_3) + .click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (1 selected)'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .should('contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.REMOVE_SELECTED).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '6 records'); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'hidden'); + cy.get(dialogs.featureListDialog.DIALOG).should('not.contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'feat.kml Features (6)'); + + // Clean up + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.REFRESH).click(); + cy.wait(200); // Row not immediately ready after refresh + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Remove Unselected', function() { + // Setup + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_3) + .click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .find(shared.Grid.CELL_3) + .click(); + + // Test + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '7 records (2 selected)'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .should('contain', '18TWL8444208022'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_7) + .should('contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.REMOVE_UNSELECTED).click(); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('contain', '2 records'); + cy.get(dialogs.featureListDialog.DIALOG_FOOTER).should('not.contain', 'hidden'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_1) + .should('contain', '18TWL8444208022'); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_2) + .should('contain', '18TWL8519809280'); + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'feat.kml Features (2)'); + + // Clean up + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.REFRESH).click(); + cy.wait(200); // Row not immediately ready after refresh + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + }); + + it('Export', function() { + // Test + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.EXPORT).click(); + cy.get(dialogs.exportDataDialog.DIALOG).should('be.visible'); + + // Clean up + cy.get(dialogs.exportDataDialog.CANCEL_BUTTON).click(); + }); + + it('Go to', function() { + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .click(); + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .click(); + cy.get(shared.Tree.ROW_4).click; + cy.get(shared.layerStyle.BUTTON).click(); + cy.get(shared.layerStyle.SIZE_SLIDER) + .type('{rightarrow}{rightarrow}{rightarrow}{rightarrow}'); + cy.imageComparison('Before go to'); // TODO: Baseline image needs update after #676 fixed + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_2) + .click(); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.GRID) + .rightClick(); + cy.get(dialogs.featureListDialog.contextMenu.GO_TO).click(); + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + cy.imageComparison('After go to'); + + // Clean up + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .click(); + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.SHOW_FEATURES).click(); + cy.get('body').type('{ctrl}', {release: false}); + cy.get(dialogs.featureListDialog.DIALOG) + .find(shared.Grid.ROW_6) + .find(shared.Grid.CELL_3) + .click(); + }); + }); + + it('Close button', function() { + cy.get(dialogs.featureListDialog.DIALOG).should('be.visible'); + cy.get(dialogs.featureListDialog.DIALOG).within(function() { + cy.get(dialogs.featureListDialog.CLOSE_BUTTON).click(); + }); + cy.get(dialogs.featureListDialog.DIALOG).should('not.exist'); + }); +}); diff --git a/cypress/integration/regression-tests/layers-dialog/layer-features.spec.js b/cypress/integration/regression-tests/layers-dialog/layer-features.spec.js deleted file mode 100644 index 953b8f1c0..000000000 --- a/cypress/integration/regression-tests/layers-dialog/layer-features.spec.js +++ /dev/null @@ -1,180 +0,0 @@ -/// -var os = require('../../../support/selectors.js'); - -os.layerFeaturesDialog = { - CELLS: '.slick-cell', - DESCRIPTION_CELL: '[data-testid=\'featurelist\'] .slick-viewport .slick-cell', - DIALOG: '[data-testid=\'featurelist\']', - FOOTER_STATUS_TEXT: '[ng-if=\'ctrl.status\']', - FULL_FOOTER_STATUS_TEXT: '[data-testid=\'featurelist\'] [ng-if=\'ctrl.status\']', - GRID: '[data-testid=\'featurelist\'] .slick-grid', - HEADER_CELLS: '.slick-column-name', - HEADER_ROW: '.slick-header', - ROWS_CELLS: '[data-testid=\'featurelist\'] .slick-cell.l5', - SOURCE_GRID: '.js-source-grid', - VIEWPORT: '.slick-viewport', - buttons: { - CLOSE: '[ng-click=\'ctrl.close()\']' - }, - contextMenu: { - EXPORT: '[title=\'Exports data to a file\']', - DESELECT_ALL: '[title=\'Deselects all items\']', - INVERT_SELECTION: '[title=\'Inverts the selection\']', - SELECT_ALL: '[title=\'Selects all items\']', - HIDE_SELECTED: '[title=\'Hides selected items\']', - DISPLAY_ALL: '[title=\'Displays all items\']', - HIDE_UNSELECTED: '[title=\'Hides unselected items\']', - REMOVE_SELECTED: '[title=\'Removes selected items\']', - REMOVE_UNSELECTED: '[title=\'Removes the unselected items\']' - } -}; - -var TEST_FIXTURE_DATA = 'regression-tests/layers-dialog/layer-features/feat.kml'; - -describe('Feature grid', function() { - before('Login', function() { - cy.login(); - }); - - it('Shows data', function() { - // Upload a file - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); - cy.upload(TEST_FIXTURE_DATA); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importKMLDialog.DIALOG).should('be.visible'); - cy.get(os.importKMLDialog.LAYER_TITLE_INPUT).should('be.visible'); - cy.get(os.importKMLDialog.OK_BUTTON).click(); - - // Load a layer - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', TEST_FIXTURE_DATA + ' Features (7)'); - - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.SHOW_FEATURES).click(); - cy.get('[title=\'' + TEST_FIXTURE_DATA + '\']').should('be.visible'); - - // Check status bar - cy.get(os.layerFeaturesDialog.DIALOG).within(function() { - cy.get(os.layerFeaturesDialog.FOOTER_STATUS_TEXT).should('be.visible'); - cy.get(os.layerFeaturesDialog.FOOTER_STATUS_TEXT).should('contain', '7 records'); - }); - - cy.get(os.layerFeaturesDialog.DIALOG).within(function() { - cy.get(os.layerFeaturesDialog.SOURCE_GRID).should('be.visible'); - cy.get(os.layerFeaturesDialog.SOURCE_GRID).within(function() { - cy.get(os.layerFeaturesDialog.HEADER_ROW).should('be.visible'); - // Check column headers - cy.get(os.layerFeaturesDialog.HEADER_ROW).within(function() { - cy.get(os.layerFeaturesDialog.HEADER_CELLS).should('have.length', 15); - cy.get(os.layerFeaturesDialog.HEADER_CELLS + ':empty').should('exist'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('TIME'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('MGRS'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('LAT_DMS'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('LON_DMS'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('LAT'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('LON'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('LAT_DDM'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('LON_DDM'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('line'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('name'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('notes'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('objectid'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('ID'); - cy.get(os.layerFeaturesDialog.HEADER_CELLS).contains('description'); - }); - }); - - // Check data - cy.get(os.layerFeaturesDialog.VIEWPORT).should('be.visible'); - cy.get(os.layerFeaturesDialog.VIEWPORT).within(function() { - cy.get(os.layerFeaturesDialog.CELLS).contains('18TWL8884215339'); - }); - }); - - cy.get(os.layerFeaturesDialog.DESCRIPTION_CELL).should('be.visible'); - cy.get(os.layerFeaturesDialog.DESCRIPTION_CELL).contains('Show'); - cy.get(os.layerFeaturesDialog.DESCRIPTION_CELL).contains('Show').click(); - cy.get(os.descriptionInfoDialog.DIALOG, {timeout: 5000}).should('be.visible'); - cy.get(os.descriptionInfoDialog.DIALOG).within(function() { - // Check description content - cy.get(os.descriptionInfoDialog.CONTENT).should('be.visible'); - // https://github.com/cypress-io/cypress/issues/136 for why this is needed - cy.get(os.descriptionInfoDialog.CONTENT).then(function($iframe) { - var $body = $iframe.contents().find('body'); - expect($body.text()).to.equal('This is the description text.'); - }); - cy.get(os.descriptionInfoDialog.CLOSE_BUTTON).click(); - }); - cy.get(os.descriptionInfoDialog.DIALOG, {timeout: 5000}).should('not.exist'); - - // Check selection - cy.get(os.layerFeaturesDialog.ROWS_CELLS).should('be.visible'); - cy.get(os.layerFeaturesDialog.ROWS_CELLS).first().click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records (1 selected)'); - - // Check context menu works. - cy.get(os.layerFeaturesDialog.ROWS_CELLS).first().rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.EXPORT).should('be.visible'); - - cy.get(os.layerFeaturesDialog.contextMenu.DESELECT_ALL).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records'); - - cy.get(os.layerFeaturesDialog.ROWS_CELLS).first().click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records (1 selected)'); - - cy.get(os.layerFeaturesDialog.ROWS_CELLS).first().rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.INVERT_SELECTION).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records (6 selected)'); - - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.SELECT_ALL).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records (7 selected)'); - - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.DESELECT_ALL).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records'); - - cy.get(os.layerFeaturesDialog.ROWS_CELLS).last().click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records (1 selected)'); - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.HIDE_SELECTED).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '6 records (1 hidden)'); - - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.DISPLAY_ALL).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records'); - - cy.get(os.layerFeaturesDialog.ROWS_CELLS).last().click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records (1 selected)'); - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.HIDE_UNSELECTED).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '1 record (1 selected, 6 hidden)'); - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.DISPLAY_ALL).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '7 records (1 selected)'); - - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.REMOVE_SELECTED).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '6 records'); - - cy.get(os.layerFeaturesDialog.ROWS_CELLS).last().click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '6 records (1 selected)'); - cy.get(os.layerFeaturesDialog.GRID).rightClick(); - cy.get(os.layerFeaturesDialog.contextMenu.REMOVE_UNSELECTED).click(); - cy.get(os.layerFeaturesDialog.FULL_FOOTER_STATUS_TEXT).should('contain', '1 record (1 selected)'); - - // Check Close button works - cy.get(os.layerFeaturesDialog.DIALOG).within(function() { - cy.get(os.layerFeaturesDialog.buttons.CLOSE).should('be.visible'); - cy.get(os.layerFeaturesDialog.buttons.CLOSE).click(); - }); - cy.get('[title=\'' + TEST_FIXTURE_DATA + '\']').should('not.exist'); - - // Clean up - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', TEST_FIXTURE_DATA + ' Features (1)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.REMOVE_LAYER_BUTTON_WILDCARD).click(); - cy.get(os.layersDialog.DIALOG).should('not.contain', TEST_FIXTURE_DATA + ' Features'); - cy.get(os.Application.PAGE).type('v'); - }); -}); diff --git a/cypress/integration/smoke-tests/generate-heatmap.spec.js b/cypress/integration/smoke-tests/generate-heatmap.spec.js index dc2b3e74c..50df2e493 100644 --- a/cypress/integration/smoke-tests/generate-heatmap.spec.js +++ b/cypress/integration/smoke-tests/generate-heatmap.spec.js @@ -1,5 +1,8 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Generate heatmap from CSV', function() { before('Login', function() { @@ -8,41 +11,41 @@ describe('Generate heatmap from CSV', function() { it('Load data, then generate heatmap', function() { // Setup - cy.get(os.layersDialog.DIALOG).should('not.contain', '(Image'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Heatmap'); + cy.get(layers.Dialog.DIALOG).should('not.contain', '(Image'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Heatmap'); // Upload a file - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/generate-heatmap/chicago-traffic-counts.csv'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.DIALOG).should('be.visible'); - cy.get(os.importCSVDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.Tabs.Options.LAYER_TITLE_INPUT).clear(); - cy.get(os.importCSVDialog.Tabs.Options.LAYER_TITLE_INPUT).type('Chicago Traffic Counts'); - cy.get(os.importCSVDialog.DONE_BUTTON).click(); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importCSVDialog.DIALOG).should('be.visible'); + cy.get(imports.importCSVDialog.NEXT_BUTTON).click(); + cy.get(imports.importCSVDialog.NEXT_BUTTON).click(); + cy.get(imports.importCSVDialog.NEXT_BUTTON).click(); + cy.get(shared.Options.LAYER_TITLE_INPUT).clear(); + cy.get(shared.Options.LAYER_TITLE_INPUT).type('Chicago Traffic Counts'); + cy.get(imports.importCSVDialog.DONE_BUTTON).click(); // Load a layer - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) + cy.get(shared.Tree.ROW_4) .should('contain', 'Chicago Traffic Counts Features (1279)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.GO_TO).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.GO_TO).click(); cy.imageComparison('features loaded'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(shared.Tree.ROW_4) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.GENERATE_HEATMAP).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_1).should('contain', 'Image (1)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_2).should('contain', 'Heatmap - Chicago Traffic Counts'); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.GENERATE_HEATMAP).click(); + cy.get(shared.Tree.ROW_1).should('contain', 'Image (1)'); + cy.get(shared.Tree.ROW_2).should('contain', 'Heatmap - Chicago Traffic Counts'); cy.imageComparison('heatmap loaded'); }); }); diff --git a/cypress/integration/smoke-tests/layers.spec.js b/cypress/integration/smoke-tests/layers.spec.js index 48d72eb67..213bf6495 100755 --- a/cypress/integration/smoke-tests/layers.spec.js +++ b/cypress/integration/smoke-tests/layers.spec.js @@ -1,6 +1,6 @@ /// - -var os = require('../../support/selectors.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Layers dialog', function() { before('Login', function() { @@ -8,44 +8,44 @@ describe('Layers dialog', function() { }); it('Layers tab', function() { - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.layersDialog.DIALOG_HEADER).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.Layers.addData.BUTTON).should('be.visible'); - cy.get(os.layersDialog.Tabs.Layers.SEARCH_INPUT).should('be.visible'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_1).should('contain', 'Feature Layers'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', 'Map Layers'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.DIALOG_HEADER).should('contain', 'Layers'); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Layers'); + cy.get(layers.layersTab.addData.BUTTON).should('be.visible'); + cy.get(layers.layersTab.SEARCH_INPUT).should('be.visible'); + cy.get(shared.Tree.ROW_1).should('contain', 'Feature Layers'); + cy.get(shared.Tree.ROW_4).should('contain', 'Map Layers'); }); it('Areas tab', function() { - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.layersDialog.DIALOG_HEADER).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Areas'); - cy.get(os.layersDialog.Tabs.Areas.SEARCH_INPUT).should('be.visible'); - cy.get(os.layersDialog.Tabs.Areas.EXPORT_BUTTON).should('be.visible'); - cy.get(os.layersDialog.Tabs.Areas.Import.BUTTON).should('be.visible'); - cy.get(os.layersDialog.Tabs.Areas.ADVANCED_BUTTON).should('be.visible'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.DIALOG_HEADER).should('contain', 'Layers'); + cy.get(layers.areasTab.TAB).click(); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Areas'); + cy.get(layers.areasTab.SEARCH_INPUT).should('be.visible'); + cy.get(layers.areasTab.EXPORT_BUTTON).should('be.visible'); + cy.get(layers.areasTab.Import.BUTTON).should('be.visible'); + cy.get(layers.areasTab.ADVANCED_BUTTON).should('be.visible'); }); it('Filters tab', function() { - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.layersDialog.DIALOG_HEADER).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.Filters.TAB).click(); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Filters'); - cy.get(os.layersDialog.Tabs.Filters.SEARCH_INPUT).should('be.visible'); - cy.get(os.layersDialog.Tabs.Filters.IMPORT_BUTTON).should('be.visible'); - cy.get(os.layersDialog.Tabs.Filters.EXPORT_BUTTON).should('be.visible'); - cy.get(os.layersDialog.Tabs.Filters.ADVANCED_BUTTON).should('be.visible'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.DIALOG_HEADER).should('contain', 'Layers'); + cy.get(layers.filtersTab.TAB).click(); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Filters'); + cy.get(layers.filtersTab.SEARCH_INPUT).should('be.visible'); + cy.get(layers.filtersTab.IMPORT_BUTTON).should('be.visible'); + cy.get(layers.filtersTab.EXPORT_BUTTON).should('be.visible'); + cy.get(layers.filtersTab.ADVANCED_BUTTON).should('be.visible'); }); it('Places tab', function() { - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.layersDialog.DIALOG_HEADER).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.Places.TAB).click(); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Places'); - cy.get(os.layersDialog.Tabs.Places.ADD_FOLDER_BUTTON).should('be.visible'); - cy.get(os.layersDialog.Tabs.Places.ADD_PLACE_BUTTON).should('be.visible'); - cy.get(os.layersDialog.Tabs.Places.EXPORT_BUTTON).should('be.visible'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.DIALOG_HEADER).should('contain', 'Layers'); + cy.get(layers.placesTab.TAB).click(); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Places'); + cy.get(layers.placesTab.ADD_FOLDER_BUTTON).should('be.visible'); + cy.get(layers.placesTab.ADD_PLACE_BUTTON).should('be.visible'); + cy.get(layers.placesTab.EXPORT_BUTTON).should('be.visible'); }); }); diff --git a/cypress/integration/smoke-tests/load-data-file-csv.spec.js b/cypress/integration/smoke-tests/load-data-file-csv.spec.js index 61b014ee6..29c2fd1b8 100644 --- a/cypress/integration/smoke-tests/load-data-file-csv.spec.js +++ b/cypress/integration/smoke-tests/load-data-file-csv.spec.js @@ -1,5 +1,8 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('CSV import', function() { before('Login', function() { @@ -8,49 +11,49 @@ describe('CSV import', function() { it('Load data from CSV', function() { // Upload a file - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-data-file-csv/test-features.csv'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.DIALOG).should('be.visible'); - cy.get(os.importCSVDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.NEXT_BUTTON).click(); - cy.get(os.importCSVDialog.DONE_BUTTON).click(); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importCSVDialog.DIALOG).should('be.visible'); + cy.get(imports.importCSVDialog.NEXT_BUTTON).click(); + cy.get(imports.importCSVDialog.NEXT_BUTTON).click(); + cy.get(imports.importCSVDialog.NEXT_BUTTON).click(); + cy.get(imports.importCSVDialog.DONE_BUTTON).click(); // Load a layer - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) + cy.get(shared.Tree.ROW_4) .should('contain', 'smoke-tests/load-data-file-csv/test-features.csv Features (447)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.MOST_RECENT).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.MOST_RECENT).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.GO_TO).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.GO_TO).click(); cy.imageComparison('features loaded'); // Open the timeline and animate the data (view window animates) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.HISTOGRAM_POINTS).should('be.visible'); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.HISTOGRAM_POINTS).should('be.visible'); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); }); - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('not.exist'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('not.exist'); // Open the timeline and animate the data (feature count changes) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.NEXT_BUTTON).click(); - cy.get(os.Timeline.NEXT_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.NEXT_BUTTON).click(); + cy.get(core.Timeline.NEXT_BUTTON).click(); + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .should('match', new RegExp('\\(0/447\\)')); }); diff --git a/cypress/integration/smoke-tests/load-data-file-geojson.spec.js b/cypress/integration/smoke-tests/load-data-file-geojson.spec.js index 01a3555c4..a0ca2bc2f 100644 --- a/cypress/integration/smoke-tests/load-data-file-geojson.spec.js +++ b/cypress/integration/smoke-tests/load-data-file-geojson.spec.js @@ -1,5 +1,8 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Geojson import', function() { before('Login', function() { @@ -8,47 +11,47 @@ describe('Geojson import', function() { it('Load data from geojson', function() { // Upload a file - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-data-file-geojson/test-features.geojson'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importGeoJSONDialog.DIALOG).should('be.visible'); - cy.get(os.importGeoJSONDialog.NEXT_BUTTON).click(); - cy.get(os.importGeoJSONDialog.DONE_BUTTON).click(); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importGeoJSONDialog.DIALOG).should('be.visible'); + cy.get(imports.importGeoJSONDialog.NEXT_BUTTON).click(); + cy.get(imports.importGeoJSONDialog.DONE_BUTTON).click(); // Load a layer - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) + cy.get(shared.Tree.ROW_4) .should('contain', 'smoke-tests/load-data-file-geojson/test-features.geojson Features (291)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.MOST_RECENT).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.MOST_RECENT).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.GO_TO).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.GO_TO).click(); cy.imageComparison('features loaded'); // Open the timeline and animate the data (view window animates) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.HISTOGRAM_POINTS).should('be.visible'); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.HISTOGRAM_POINTS).should('be.visible'); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); }); - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('not.exist'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('not.exist'); // Open the timeline and animate the data (feature count changes) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.PAUSE_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.PAUSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .should('match', new RegExp('\\([0-9]\\d{0,3}\\/' + '291\\)')); }); diff --git a/cypress/integration/smoke-tests/load-data-file-kml.spec.js b/cypress/integration/smoke-tests/load-data-file-kml.spec.js index bf4c3f2af..6cc67be21 100644 --- a/cypress/integration/smoke-tests/load-data-file-kml.spec.js +++ b/cypress/integration/smoke-tests/load-data-file-kml.spec.js @@ -1,5 +1,8 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('KML import', function() { before('Login', function() { @@ -8,47 +11,47 @@ describe('KML import', function() { it('Load data from KML', function() { // Upload a file - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-data-file-kml/test-features.kmz'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importKMLDialog.DIALOG).should('be.visible'); - cy.get(os.importKMLDialog.LAYER_TITLE_INPUT).should('be.visible'); - cy.get(os.importKMLDialog.OK_BUTTON).click(); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importKMLDialog.DIALOG).should('be.visible'); + cy.get(imports.importKMLDialog.LAYER_TITLE_INPUT).should('be.visible'); + cy.get(imports.importKMLDialog.OK_BUTTON).click(); // Load a layer - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) + cy.get(shared.Tree.ROW_4) .should('contain', 'smoke-tests/load-data-file-kml/test-features.kmz Features (291)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.MOST_RECENT).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.MOST_RECENT).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.GO_TO).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.GO_TO).click(); cy.imageComparison('features loaded'); // Open the timeline and animate the data (view window animates) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.HISTOGRAM_POINTS).should('be.visible'); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.HISTOGRAM_POINTS).should('be.visible'); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); }); - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('not.exist'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('not.exist'); // Open the timeline and animate the data (feature count changes) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.PAUSE_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.PAUSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .should('match', new RegExp('\\([0-9]\\d{0,3}\\/' + '291\\)')); }); diff --git a/cypress/integration/smoke-tests/load-data-file-shp.spec.js b/cypress/integration/smoke-tests/load-data-file-shp.spec.js index 6267457d5..822dae753 100644 --- a/cypress/integration/smoke-tests/load-data-file-shp.spec.js +++ b/cypress/integration/smoke-tests/load-data-file-shp.spec.js @@ -1,5 +1,8 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('SHP import', function() { before('Login', function() { @@ -8,47 +11,47 @@ describe('SHP import', function() { it('Load data from SHP', function() { // Upload a file - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-data-file-shp/test-features.zip'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.shpImportDialog.DIALOG).should('be.visible'); - cy.get(os.shpImportDialog.NEXT_BUTTON).click(); - cy.get(os.shpImportDialog.DONE_BUTTON).click(); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.SHPImportDialog.DIALOG).should('be.visible'); + cy.get(imports.SHPImportDialog.NEXT_BUTTON).click(); + cy.get(imports.SHPImportDialog.DONE_BUTTON).click(); // Load a layer - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) + cy.get(shared.Tree.ROW_4) .should('contain', 'smoke-tests/load-data-file-shp/test-features.zip Features (291)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.MOST_RECENT).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.MOST_RECENT).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Local.contextMenu.menuOptions.GO_TO).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.GO_TO).click(); cy.imageComparison('features loaded'); // Open the timeline and animate the data (view window animates) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.HISTOGRAM_POINTS).should('be.visible'); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.HISTOGRAM_POINTS).should('be.visible'); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); }); - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('not.exist'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('not.exist'); // Open the timeline and animate the data (feature count changes) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.PAUSE_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.PAUSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .should('match', new RegExp('\\([0-9]\\d{0,3}\\/' + '291\\)')); }); diff --git a/cypress/integration/smoke-tests/load-data-server-arcgis.spec.js b/cypress/integration/smoke-tests/load-data-server-arcgis.spec.js index a5b5d35fd..3903d98cd 100644 --- a/cypress/integration/smoke-tests/load-data-server-arcgis.spec.js +++ b/cypress/integration/smoke-tests/load-data-server-arcgis.spec.js @@ -1,5 +1,10 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var settings = require('../../support/selectors/settings.js'); +var shared = require('../../support/selectors/shared.js'); describe('Add ARCGIS server', function() { before('Login', function() { @@ -20,67 +25,70 @@ describe('Add ARCGIS server', function() { it('Load data from ARCGIS server', function() { // Add a server - cy.get(os.statusBar.SERVERS_BUTTON).click(); - cy.get(os.settingsDialog.Tabs.dataServers.ADD_SERVER_BUTTON).click(); - cy.get(os.importURLDialog.ENTER_A_URL_INPUT) + cy.get(core.statusBar.SERVERS_BUTTON).click(); + cy.get(settings.settingsDialog.Tabs.dataServers.ADD_SERVER_BUTTON).click(); + cy.get(imports.importURLDialog.ENTER_A_URL_INPUT) .type('https://ags.auroragov.org/aurora/rest/services/OpenData/MapServer'); - cy.get(os.importURLDialog.NEXT_BUTTON).click(); - cy.get(os.addArcServerDialog.TITLE_INPUT).clear(); - cy.get(os.addArcServerDialog.TITLE_INPUT).type('Aurora ArcGIS Server'); - cy.get(os.addArcServerDialog.SAVE_BUTTON).click(); - cy.get(os.settingsDialog.Tabs.dataServers.SERVER_1) + cy.get(imports.importURLDialog.NEXT_BUTTON).click(); + cy.get(dialogs.addArcServerDialog.TITLE_INPUT).clear(); + cy.get(dialogs.addArcServerDialog.TITLE_INPUT).type('Aurora ArcGIS Server'); + cy.get(dialogs.addArcServerDialog.SAVE_BUTTON).click(); + cy.get(settings.settingsDialog.Tabs.dataServers.SERVER_1) .should('contain', 'Aurora ArcGIS Server'); - cy.get(os.settingsDialog.Tabs.dataServers.SERVER_1) - .find(os.settingsDialog.Tabs.dataServers.SERVER_ONLINE_BADGE_WILDCARD) + cy.get(settings.settingsDialog.Tabs.dataServers.SERVER_1) + .find(settings.settingsDialog.Tabs.dataServers.SERVER_ONLINE_BADGE) .should('be.visible'); - cy.get(os.settingsDialog.DIALOG_CLOSE).click(); + cy.get(settings.settingsDialog.DIALOG_CLOSE).click(); // Load a layer - cy.get(os.Toolbar.addData.BUTTON).click(); - cy.get(os.addDataDialog.SEARCH_INPUT).type('fire station'); - cy.get(os.addDataDialog.Tree.LAYER_1).should('contain', 'Fire Stations'); - cy.get(os.addDataDialog.Tree.LAYER_1) - .find(os.addDataDialog.Tree.LAYER_TOGGLE_SWITCH_WILDCARD) - .should('have.class', os.addDataDialog.Tree.LAYER_IS_OFF_CLASS_WILDCARD); - cy.get(os.addDataDialog.Tree.LAYER_1).find(os.addDataDialog.Tree.LAYER_TOGGLE_SWITCH_WILDCARD).click(); - cy.get(os.addDataDialog.Tree.LAYER_1) - .find(os.addDataDialog.Tree.LAYER_TOGGLE_SWITCH_WILDCARD) - .should('have.class', os.addDataDialog.Tree.LAYER_IS_ON_CLASS_WILDCARD); - cy.get(os.addDataDialog.CLOSE_BUTTON).click(); - cy.get(os.addDataDialog.DIALOG).should('not.exist'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', 'Fire Stations Features (0)'); + cy.get(core.Toolbar.addData.BUTTON).click(); + cy.get(dialogs.addDataDialog.DIALOG).within(function() { + cy.get(dialogs.addDataDialog.SEARCH_INPUT).type('fire station'); + cy.get(shared.Tree.ROW_1).should('contain', 'Fire Stations'); + cy.get(shared.Tree.ROW_1) + .find(dialogs.addDataDialog.Tree.LAYER_TOGGLE_SWITCH) + .should('have.class', dialogs.addDataDialog.Tree.LAYER_IS_OFF_CLASS); + cy.get(shared.Tree.ROW_1).find(dialogs.addDataDialog.Tree.LAYER_TOGGLE_SWITCH).click(); + cy.get(shared.Tree.ROW_1) + .find(dialogs.addDataDialog.Tree.LAYER_TOGGLE_SWITCH) + .should('have.class', dialogs.addDataDialog.Tree.LAYER_IS_ON_CLASS); + cy.get(dialogs.addDataDialog.CLOSE_BUTTON).click(); + }); + + cy.get(dialogs.addDataDialog.DIALOG).should('not.exist'); + cy.get(shared.Tree.ROW_4).should('contain', 'Fire Stations Features (0)'); // Import and activate a query area - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.Tabs.Areas.Import.BUTTON).click(); + cy.get(layers.areasTab.TAB).click(); + cy.get(layers.areasTab.Import.BUTTON).click(); cy.upload('smoke-tests/load-data-server-arcgis/test-area.geojson'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.geoJSONAreaImportDialog.Tabs.areaOptions.TITLE_COLUMN_INPUT).should('be.visible'); - cy.get(os.geoJSONAreaImportDialog.DONE_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_1).should('contain', 'temp area 5'); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_1).rightClick(); - cy.get(os.layersDialog.Tabs.Areas.Tree.contextMenu.menuOptions.ZOOM).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_1).rightClick(); - cy.get(os.layersDialog.Tabs.Areas.Tree.contextMenu.menuOptions.Query.LOAD).click(); // THIS LINE CAUSES TWO REQUESTS TO BE SENT + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.geoJSONAreaImportDialog.Tabs.areaOptions.TITLE_COLUMN_INPUT).should('be.visible'); + cy.get(imports.geoJSONAreaImportDialog.DONE_BUTTON).click(); + cy.get(shared.Tree.ROW_1).should('contain', 'temp area 5'); + cy.get(shared.Tree.ROW_1).rightClick(); + cy.get(layers.areasTab.Tree.contextMenu.ZOOM).click(); + cy.get(shared.Tree.ROW_1).rightClick(); + cy.get(layers.areasTab.Tree.contextMenu.Query.LOAD).click(); // THIS LINE CAUSES TWO REQUESTS TO BE SENT cy.wait(400); cy.route('POST', '**/OpenData/MapServer/5/query', 'fx:/smoke-tests/load-data-server-arcgis/query-2.stub.json') .as('getFeatureDetails'); - cy.get(os.layersDialog.Tabs.Layers.TAB).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.TAB).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', 'Fire Station'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(shared.Tree.ROW_4).should('contain', 'Fire Station'); + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .should('not.contain', 'Loading...'); // wait for feature count value to stabilize - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .should('not.contain', '(0)'); // wait for feature count value to stabilize - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .should('match', /\([1-9]\d{0,3}\)/); // Any number 1-9999, surrounded by () cy.imageComparison('features loaded'); diff --git a/cypress/integration/smoke-tests/load-data-server-geoserver.spec.js b/cypress/integration/smoke-tests/load-data-server-geoserver.spec.js index ea033370e..e70ea82be 100644 --- a/cypress/integration/smoke-tests/load-data-server-geoserver.spec.js +++ b/cypress/integration/smoke-tests/load-data-server-geoserver.spec.js @@ -1,5 +1,10 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var settings = require('../../support/selectors/settings.js'); +var shared = require('../../support/selectors/shared.js'); describe('Add GeoServer', function() { before('Login', function() { @@ -23,95 +28,98 @@ describe('Add GeoServer', function() { it('Load data from GeoServer', function() { // Add a server - cy.get(os.statusBar.SERVERS_BUTTON).click(); - cy.get(os.settingsDialog.Tabs.dataServers.ADD_SERVER_BUTTON).click(); - cy.get(os.importURLDialog.ENTER_A_URL_INPUT) + cy.get(core.statusBar.SERVERS_BUTTON).click(); + cy.get(settings.settingsDialog.Tabs.dataServers.ADD_SERVER_BUTTON).click(); + cy.get(imports.importURLDialog.ENTER_A_URL_INPUT) .type('https://gdp-geoserver.dev.dev.east.paas.geointservices.io/geoserver/ows'); - cy.get(os.importURLDialog.NEXT_BUTTON).click(); - cy.get(os.addGeoServerDialog.TITLE_INPUT).clear(); - cy.get(os.addGeoServerDialog.TITLE_INPUT).type('GDP GeoServer'); - cy.get(os.addGeoServerDialog.SAVE_BUTTON).click(); - cy.get(os.settingsDialog.Tabs.dataServers.SERVER_1) + cy.get(imports.importURLDialog.NEXT_BUTTON).click(); + cy.get(dialogs.addGeoServerDialog.TITLE_INPUT).clear(); + cy.get(dialogs.addGeoServerDialog.TITLE_INPUT).type('GDP GeoServer'); + cy.get(dialogs.addGeoServerDialog.SAVE_BUTTON).click(); + cy.get(settings.settingsDialog.Tabs.dataServers.SERVER_1) .should('contain', 'GDP GeoServer'); - cy.get(os.settingsDialog.Tabs.dataServers.SERVER_1) - .find(os.settingsDialog.Tabs.dataServers.SERVER_ONLINE_BADGE_WILDCARD) + cy.get(settings.settingsDialog.Tabs.dataServers.SERVER_1) + .find(settings.settingsDialog.Tabs.dataServers.SERVER_ONLINE_BADGE) .should('be.visible'); - cy.get(os.settingsDialog.DIALOG_CLOSE).click(); + cy.get(settings.settingsDialog.DIALOG_CLOSE).click(); // Load a layer - cy.get(os.Toolbar.addData.BUTTON).click(); - cy.get(os.addDataDialog.SEARCH_INPUT).type('viirs'); - cy.get(os.addDataDialog.Tree.LAYER_1).should('contain', 'VIIRS Detection'); - cy.get(os.addDataDialog.Tree.LAYER_1) - .find(os.addDataDialog.Tree.LAYER_TOGGLE_SWITCH_WILDCARD) - .should('have.class', os.addDataDialog.Tree.LAYER_IS_OFF_CLASS_WILDCARD); - cy.get(os.addDataDialog.Tree.LAYER_1) - .find(os.addDataDialog.Tree.LAYER_TOGGLE_SWITCH_WILDCARD) - .click(); - cy.get(os.addDataDialog.Tree.LAYER_1) - .find(os.addDataDialog.Tree.LAYER_TOGGLE_SWITCH_WILDCARD) - .should('have.class', os.addDataDialog.Tree.LAYER_IS_ON_CLASS_WILDCARD); - cy.get(os.addDataDialog.CLOSE_BUTTON).click(); - cy.get(os.addDataDialog.DIALOG).should('not.exist'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) + cy.get(core.Toolbar.addData.BUTTON).click(); + cy.get(dialogs.addDataDialog.DIALOG).within(function() { + cy.get(dialogs.addDataDialog.SEARCH_INPUT).type('viirs'); + cy.get(shared.Tree.ROW_1).should('contain', 'VIIRS Detection'); + cy.get(shared.Tree.ROW_1) + .find(dialogs.addDataDialog.Tree.LAYER_TOGGLE_SWITCH) + .should('have.class', dialogs.addDataDialog.Tree.LAYER_IS_OFF_CLASS); + cy.get(shared.Tree.ROW_1) + .find(dialogs.addDataDialog.Tree.LAYER_TOGGLE_SWITCH) + .click(); + cy.get(shared.Tree.ROW_1) + .find(dialogs.addDataDialog.Tree.LAYER_TOGGLE_SWITCH) + .should('have.class', dialogs.addDataDialog.Tree.LAYER_IS_ON_CLASS); + cy.get(dialogs.addDataDialog.CLOSE_BUTTON).click(); + }); + + cy.get(dialogs.addDataDialog.DIALOG).should('not.exist'); + cy.get(shared.Tree.ROW_4) .should('contain', 'VIIRS Detection Features (0)'); // Import and activate a query area - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Server.contextMenu.menuOptions.MOST_RECENT).click(); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.Tabs.Areas.Import.BUTTON).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.MOST_RECENT).click(); + cy.get(layers.areasTab.TAB).click(); + cy.get(layers.areasTab.Import.BUTTON).click(); cy.upload('smoke-tests/load-data-server-geoserver/test-area.geojson'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.geoJSONAreaImportDialog.Tabs.areaOptions.TITLE_COLUMN_INPUT).should('be.visible'); - cy.get(os.geoJSONAreaImportDialog.DONE_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_1).should('contain', 'temp area 1'); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_1).rightClick(); - cy.get(os.layersDialog.Tabs.Areas.Tree.contextMenu.menuOptions.ZOOM).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_1).rightClick(); - cy.get(os.layersDialog.Tabs.Areas.Tree.contextMenu.menuOptions.Query.LOAD).click(); - cy.get(os.layersDialog.Tabs.Layers.TAB).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.geoJSONAreaImportDialog.Tabs.areaOptions.TITLE_COLUMN_INPUT).should('be.visible'); + cy.get(imports.geoJSONAreaImportDialog.DONE_BUTTON).click(); + cy.get(shared.Tree.ROW_1).should('contain', 'temp area 1'); + cy.get(shared.Tree.ROW_1).rightClick(); + cy.get(layers.areasTab.Tree.contextMenu.ZOOM).click(); + cy.get(shared.Tree.ROW_1).rightClick(); + cy.get(layers.areasTab.Tree.contextMenu.Query.LOAD).click(); + cy.get(layers.layersTab.TAB).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', 'VIIRS Detection'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD, {timeout: 8000}) + cy.get(shared.Tree.ROW_4).should('contain', 'VIIRS Detection'); + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .should('not.contain', 'Loading...'); // wait for feature count value to stabilize - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .should('not.contain', '(0)'); // wait for feature count value to stabilize - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD, {timeout: 8000}) + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .should('match', /\([1-9]\d{0,3}\)/); // Any number 1-9999, surrounded by () cy.imageComparison('features loaded'); // Open the timeline and animate the data (view window animates) - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.HISTOGRAM_POINTS).should('be.visible'); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.HISTOGRAM_POINTS).should('be.visible'); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').then(function(elementPosition) { + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.VIEW_WINDOW).invoke('position').should('not.equal', elementPosition); }); - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('not.exist'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('not.exist'); // Open the timeline and animate the data (feature count changes) - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .then(function(featureCount) { - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.PLAY_BUTTON).click(); - cy.get(os.Timeline.PAUSE_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4) - .find(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.FEATURE_COUNT_TEXT_WILDCARD) + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.PLAY_BUTTON).click(); + cy.get(core.Timeline.PAUSE_BUTTON).click(); + cy.get(shared.Tree.ROW_4) + .find(layers.layersTab.Tree.FEATURE_COUNT_TEXT) .invoke('text') .should('match', new RegExp('\\([0-9]\\d{0,3}\\/' + featureCount + '\\)')); }); diff --git a/cypress/integration/smoke-tests/load-state-file-arcgis.spec.js b/cypress/integration/smoke-tests/load-state-file-arcgis.spec.js index d0a6ac2d9..7f2eac742 100644 --- a/cypress/integration/smoke-tests/load-state-file-arcgis.spec.js +++ b/cypress/integration/smoke-tests/load-state-file-arcgis.spec.js @@ -1,5 +1,9 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Import state file', function() { before('Login', function() { @@ -20,60 +24,59 @@ describe('Import state file', function() { it('Load data from state file', function() { // Setup - cy.get(os.Toolbar.Date.INPUT).should('not.have.value', '2019-01-07'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Police Stations Features'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Fire Hydrants Features'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Police Stations Tiles'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Fire Hydrants Tiles'); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Aurora Hydrant Include'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Aurora Police Include'); - cy.get(os.layersDialog.Tabs.Filters.TAB).click(); - cy.get(os.layersDialog.DIALOG).should('contain', 'No results'); - cy.get(os.layersDialog.Tabs.Layers.TAB).click(); + cy.get(core.Toolbar.Date.INPUT).should('not.have.value', '2019-01-07'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Police Stations Features'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Fire Hydrants Features'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Police Stations Tiles'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Fire Hydrants Tiles'); + cy.get(layers.areasTab.TAB).click(); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Aurora Hydrant Include'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Aurora Police Include'); + cy.get(layers.filtersTab.TAB).click(); + cy.get(layers.Dialog.DIALOG).should('contain', 'No results'); + cy.get(layers.layersTab.TAB).click(); // Test - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-state-file-arcgis/test-state-arcgis_state.xml'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importStateDialog.DIALOG).should('be.visible'); - cy.get(os.importStateDialog.CLEAR_CHECKBOX).check(); - cy.get(os.importStateDialog.OK_BUTTON).click(); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importStateDialog.DIALOG).should('be.visible'); + cy.get(imports.importStateDialog.CLEAR_CHECKBOX).check(); + cy.get(imports.importStateDialog.OK_BUTTON).click(); cy.wait(1400); cy.route('POST', '**/OpenData/MapServer/3/query', 'fx:/smoke-tests/load-state-file-arcgis/query-3-2.stub.json') .as('getFeatureDetails-13_second'); cy.route('POST', '**/OpenData/MapServer/234/query', 'fx:/smoke-tests/load-state-file-arcgis/query-234-2.stub.json') .as('getFeatureDetails-234_second'); - cy.get(os.Toolbar.Date.INPUT).should('have.value', '2019-01-07'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.Application.PAGE).trigger('mouseenter').trigger('mousemove'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '+39'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', 'Police Stations Features (3)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_5).should('contain', 'Fire Hydrants Features (747)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(core.Toolbar.Date.INPUT).should('have.value', '2019-01-07'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.Application.PAGE).trigger('mouseenter').trigger('mousemove'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '+39'); + cy.get(shared.Tree.ROW_4).should('contain', 'Police Stations Features (3)'); + cy.get(shared.Tree.ROW_5).should('contain', 'Fire Hydrants Features (747)'); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.wait(1000); cy.imageComparison('features loaded'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_5).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Server.contextMenu.menuOptions.FEATURE_ACTIONS).click(); - cy.get(os.featureActionsDialog.DIALOG).should('be.visible'); - cy.get(os.featureActionsDialog.DIALOG).should('contain', 'Private Hydrant'); - cy.get(os.featureActionsDialog.DIALOG_CLOSE).click(); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_2).should('contain', 'Aurora Hydrant Include'); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_4).should('contain', 'Aurora Police Include'); - cy.get(os.layersDialog.Tabs.Areas.ADVANCED_BUTTON).click(); - cy.get(os.advancedDialog.DIALOG).should('be.visible'); - cy.get(os.advancedDialog.ADVANCED_CHECKBOX).should('be.checked'); - cy.get(os.advancedDialog.DIALOG_CLOSE).click(); - cy.get(os.layersDialog.Tabs.Filters.TAB).click(); - cy.get(os.layersDialog.Tabs.Filters.Tree.FILTER_2).should('contain', 'East Hydrants'); + cy.get(shared.Tree.ROW_5).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.FEATURE_ACTIONS).click(); + cy.get(dialogs.featureActionsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.featureActionsDialog.DIALOG).should('contain', 'Private Hydrant'); + cy.get(dialogs.featureActionsDialog.DIALOG_CLOSE).click(); + cy.get(layers.areasTab.TAB).click(); + cy.get(shared.Tree.ROW_2).should('contain', 'Aurora Hydrant Include'); + cy.get(shared.Tree.ROW_4).should('contain', 'Aurora Police Include'); + cy.get(layers.areasTab.ADVANCED_BUTTON).click(); + cy.get(dialogs.advancedDialog.DIALOG).should('be.visible'); + cy.get(dialogs.advancedDialog.ADVANCED_CHECKBOX).should('be.checked'); + cy.get(dialogs.advancedDialog.DIALOG_CLOSE).click(); + cy.get(layers.filtersTab.TAB).click(); + cy.get(shared.Tree.ROW_2).should('contain', 'East Hydrants'); }); }); diff --git a/cypress/integration/smoke-tests/load-state-file-geoserver.spec.js b/cypress/integration/smoke-tests/load-state-file-geoserver.spec.js index fd276d9c9..08a693ce0 100644 --- a/cypress/integration/smoke-tests/load-state-file-geoserver.spec.js +++ b/cypress/integration/smoke-tests/load-state-file-geoserver.spec.js @@ -1,5 +1,9 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Import state file', function() { before('Login', function() { @@ -14,46 +18,46 @@ describe('Import state file', function() { it('Load data from state file', function() { // Setup - cy.get(os.Toolbar.Date.INPUT).should('not.have.value', '2019-01-27'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'VIIRS Detection Features'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'VIIRS Detection Tiles'); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'test exclude area'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'test include area'); - cy.get(os.layersDialog.Tabs.Filters.TAB).click(); - cy.get(os.layersDialog.DIALOG).should('contain', 'No results'); - cy.get(os.layersDialog.Tabs.Layers.TAB).click(); + cy.get(core.Toolbar.Date.INPUT).should('not.have.value', '2019-01-27'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'VIIRS Detection Features'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'VIIRS Detection Tiles'); + cy.get(layers.areasTab.TAB).click(); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'test exclude area'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'test include area'); + cy.get(layers.filtersTab.TAB).click(); + cy.get(layers.Dialog.DIALOG).should('contain', 'No results'); + cy.get(layers.layersTab.TAB).click(); // Test - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-state-file-geoserver/test-state-geoserver_state.xml'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importStateDialog.DIALOG).should('be.visible'); - cy.get(os.importStateDialog.CLEAR_CHECKBOX).check(); - cy.get(os.importStateDialog.OK_BUTTON).click(); - cy.get(os.Toolbar.Date.INPUT).should('have.value', '2019-01-27'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.Application.PAGE).trigger('mouseenter').trigger('mousemove'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '+016'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4, {timeout: 8000}) + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importStateDialog.DIALOG).should('be.visible'); + cy.get(imports.importStateDialog.CLEAR_CHECKBOX).check(); + cy.get(imports.importStateDialog.OK_BUTTON).click(); + cy.get(core.Toolbar.Date.INPUT).should('have.value', '2019-01-27'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.Application.PAGE).trigger('mouseenter').trigger('mousemove'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '+016'); + cy.get(shared.Tree.ROW_4) .should('contain', 'VIIRS Detection Features (19)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); cy.imageComparison('features loaded'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Server.contextMenu.menuOptions.FEATURE_ACTIONS).click(); - cy.get(os.featureActionsDialog.DIALOG).should('be.visible'); - cy.get(os.featureActionsDialog.DIALOG).should('contain', 'high confidence'); - cy.get(os.featureActionsDialog.DIALOG_CLOSE).click(); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_1).should('contain', 'test exclude area'); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_2).should('contain', 'test include area'); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.FEATURE_ACTIONS).click(); + cy.get(dialogs.featureActionsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.featureActionsDialog.DIALOG).should('contain', 'high confidence'); + cy.get(dialogs.featureActionsDialog.DIALOG_CLOSE).click(); + cy.get(layers.areasTab.TAB).click(); + cy.get(shared.Tree.ROW_1).should('contain', 'test exclude area'); + cy.get(shared.Tree.ROW_2).should('contain', 'test include area'); }); }); diff --git a/cypress/integration/smoke-tests/load-state-file-url-csv.spec.js b/cypress/integration/smoke-tests/load-state-file-url-csv.spec.js index 7015021d4..f39f400b6 100644 --- a/cypress/integration/smoke-tests/load-state-file-url-csv.spec.js +++ b/cypress/integration/smoke-tests/load-state-file-url-csv.spec.js @@ -1,5 +1,9 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Import state file', function() { before('Login', function() { @@ -12,36 +16,36 @@ describe('Import state file', function() { it('Load data from state file', function() { // Setup - cy.get(os.Toolbar.Date.INPUT).should('not.have.value', '2019-04-17'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Fireballs and Bolides Features (92)'); + cy.get(core.Toolbar.Date.INPUT).should('not.have.value', '2019-04-17'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Fireballs and Bolides Features (92)'); // Test - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-state-file-url-csv/test-state-file-fireball.xml'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importStateDialog.DIALOG).should('be.visible'); - cy.get(os.importStateDialog.CLEAR_CHECKBOX).check(); - cy.get(os.importStateDialog.OK_BUTTON).click(); - cy.get(os.Toolbar.Date.INPUT).should('have.value', '2019-04-17'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.Application.PAGE).trigger('mouseenter').trigger('mousemove'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '+129'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4, {timeout: 8000}) + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importStateDialog.DIALOG).should('be.visible'); + cy.get(imports.importStateDialog.CLEAR_CHECKBOX).check(); + cy.get(imports.importStateDialog.OK_BUTTON).click(); + cy.get(core.Toolbar.Date.INPUT).should('have.value', '2019-04-17'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.Application.PAGE).trigger('mouseenter').trigger('mousemove'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '+129'); + cy.get(shared.Tree.ROW_4) .should('contain', 'Fireballs and Bolides Features (92)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); cy.imageComparison('features loaded'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Server.contextMenu.menuOptions.FEATURE_ACTIONS).click(); - cy.get(os.featureActionsDialog.DIALOG).should('be.visible'); - cy.get(os.featureActionsDialog.DIALOG).should('contain', 'high impact energy'); - cy.get(os.featureActionsDialog.DIALOG_CLOSE).click(); + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.FEATURE_ACTIONS).click(); + cy.get(dialogs.featureActionsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.featureActionsDialog.DIALOG).should('contain', 'high impact energy'); + cy.get(dialogs.featureActionsDialog.DIALOG_CLOSE).click(); }); }); diff --git a/cypress/integration/smoke-tests/load-state-file-url-kml.spec.js b/cypress/integration/smoke-tests/load-state-file-url-kml.spec.js index 7d5d5bd70..72985aae1 100644 --- a/cypress/integration/smoke-tests/load-state-file-url-kml.spec.js +++ b/cypress/integration/smoke-tests/load-state-file-url-kml.spec.js @@ -1,5 +1,9 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Import state file', function() { before('Login', function() { @@ -12,36 +16,36 @@ describe('Import state file', function() { it('Load data from state file', function() { // Setup - cy.get(os.Toolbar.Date.INPUT).should('not.have.value', '2019-04-17'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'City of New York Subway Stations Features (473)'); + cy.get(core.Toolbar.Date.INPUT).should('not.have.value', '2019-04-17'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'City of New York Subway Stations Features (473)'); // Test - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); cy.upload('smoke-tests/load-state-file-url-kml/test-state-file-nyc.xml'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importStateDialog.DIALOG).should('be.visible'); - cy.get(os.importStateDialog.CLEAR_CHECKBOX).check(); - cy.get(os.importStateDialog.OK_BUTTON).click(); - cy.get(os.Toolbar.Date.INPUT).should('have.value', '2019-04-17'); - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); - cy.get(os.Application.PAGE).trigger('mouseenter').trigger('mousemove'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '+40'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4, {timeout: 8000}) + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importStateDialog.DIALOG).should('be.visible'); + cy.get(imports.importStateDialog.CLEAR_CHECKBOX).check(); + cy.get(imports.importStateDialog.OK_BUTTON).click(); + cy.get(core.Toolbar.Date.INPUT).should('have.value', '2019-04-17'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.Application.PAGE).trigger('mouseenter').trigger('mousemove'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '+40'); + cy.get(shared.Tree.ROW_4) .should('contain', 'City of New York Subway Stations Features (473)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) .click(); - cy.imageComparison('features loaded'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).rightClick(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.featureLayer.Server.contextMenu.menuOptions.FEATURE_ACTIONS).click(); - cy.get(os.featureActionsDialog.DIALOG).should('be.visible'); - cy.get(os.featureActionsDialog.DIALOG).should('contain', 'line 2-5'); - cy.get(os.featureActionsDialog.DIALOG_CLOSE).click(); + cy.imageComparison('features loaded'); // TODO: Baseline image needs update after #676 fixed + cy.get(shared.Tree.ROW_4).rightClick(); + cy.get(layers.layersTab.Tree.contextMenu.FEATURE_ACTIONS).click(); + cy.get(dialogs.featureActionsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.featureActionsDialog.DIALOG).should('contain', 'line 2-5'); + cy.get(dialogs.featureActionsDialog.DIALOG_CLOSE).click(); }); }); diff --git a/cypress/integration/smoke-tests/map.spec.js b/cypress/integration/smoke-tests/map.spec.js index 5aead5099..c91416eea 100644 --- a/cypress/integration/smoke-tests/map.spec.js +++ b/cypress/integration/smoke-tests/map.spec.js @@ -1,5 +1,5 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); describe('Map controls', function() { before('Login', function() { @@ -9,20 +9,20 @@ describe('Map controls', function() { // Note: 3D tests not supported in CI environment describe('2D Tests', function() { before('Ensure map is in 2D mode', function() { - cy.get(os.Map.MAP_MODE_BUTTON).should('contain', '2D'); + cy.get(core.Map.MAP_MODE_BUTTON).should('contain', '2D'); }); it('Map overview', function() { // Setup - cy.get(os.Map.OVERVIEW_MAP).should('be.visible'); + cy.get(core.Map.OVERVIEW_MAP).should('be.visible'); // Test - cy.get(os.Map.OVERVIEW_MAP_TOGGLE_BUTTON).click(); - cy.get(os.Map.OVERVIEW_MAP).should('not.be.visible'); + cy.get(core.Map.OVERVIEW_MAP_TOGGLE_BUTTON).click(); + cy.get(core.Map.OVERVIEW_MAP).should('not.be.visible'); // Clean up - cy.get(os.Map.OVERVIEW_MAP_TOGGLE_BUTTON).click(); - cy.get(os.Map.OVERVIEW_MAP).should('be.visible'); + cy.get(core.Map.OVERVIEW_MAP_TOGGLE_BUTTON).click(); + cy.get(core.Map.OVERVIEW_MAP).should('be.visible'); }); // TODO: Finish test after mouse interactions with the map are working. @@ -40,30 +40,30 @@ describe('Map controls', function() { it('Zoom', function() { // Setup - cy.get(os.Application.PAGE).type('v'); - cy.get(os.statusBar.ZOOM_TEXT).should('contain', 'Zoom:'); + cy.get(core.Application.PAGE).type('v'); + cy.get(core.statusBar.ZOOM_TEXT).should('contain', 'Zoom:'); // Test - cy.get(os.statusBar.ZOOM_TEXT).then(function($zoom) { + cy.get(core.statusBar.ZOOM_TEXT).then(function($zoom) { var INITIAL_ZOOM = $zoom.text(); - cy.get(os.Map.ZOOM_IN_BUTTON) + cy.get(core.Map.ZOOM_IN_BUTTON) .click() .click() .click() .click() .click(); - cy.get(os.statusBar.ZOOM_TEXT).should('not.contain', INITIAL_ZOOM); + cy.get(core.statusBar.ZOOM_TEXT).should('not.contain', INITIAL_ZOOM); }); - cy.get(os.statusBar.ZOOM_TEXT).then(function($zoom) { + cy.get(core.statusBar.ZOOM_TEXT).then(function($zoom) { var INITIAL_ZOOM = $zoom.text(); - cy.get(os.Map.ZOOM_OUT_BUTTON) + cy.get(core.Map.ZOOM_OUT_BUTTON) .click() .click() .click() .click() .click(); - cy.get(os.statusBar.ZOOM_TEXT).should('not.contain', INITIAL_ZOOM); + cy.get(core.statusBar.ZOOM_TEXT).should('not.contain', INITIAL_ZOOM); }); }); }); diff --git a/cypress/integration/smoke-tests/smoke-test.spec.js b/cypress/integration/smoke-tests/smoke-test.spec.js index 2aa42bd87..1fb01c40a 100755 --- a/cypress/integration/smoke-tests/smoke-test.spec.js +++ b/cypress/integration/smoke-tests/smoke-test.spec.js @@ -1,5 +1,6 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var layers = require('../../support/selectors/layers.js'); describe('Application startup', function() { before('Login', function() { @@ -7,71 +8,71 @@ describe('Application startup', function() { }); it('Major GUI components', function() { - cy.get(os.Toolbar.PANEL).should('be.visible'); - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.statusBar.PANEL).should('be.visible'); + cy.get(core.Toolbar.PANEL).should('be.visible'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(core.statusBar.PANEL).should('be.visible'); }); it('Toolbar', function() { - cy.get(os.Toolbar.addData.BUTTON).should('be.visible'); - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).should('be.visible'); - cy.get(os.Toolbar.addData.Menu.BUTTON).should('be.visible'); - cy.get(os.Toolbar.LAYERS_TOGGLE_BUTTON).should('be.visible'); - cy.get(os.Toolbar.Drawing.BUTTON).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.BUTTON).should('be.visible'); - cy.get(os.Toolbar.Measure.BUTTON).should('be.visible'); - cy.get(os.Toolbar.Measure.Menu.BUTTON).should('be.visible'); - cy.get(os.Toolbar.CLEAR_BUTTON).should('be.visible'); - cy.get(os.Toolbar.PREVIOUS_DAY_BUTTON).should('be.visible'); - cy.get(os.Toolbar.Date.INPUT).should('be.visible'); - cy.get(os.Toolbar.Date.INPUT) + cy.get(core.Toolbar.addData.BUTTON).should('be.visible'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.BUTTON).should('be.visible'); + cy.get(core.Toolbar.LAYERS_TOGGLE_BUTTON).should('be.visible'); + cy.get(core.Toolbar.Drawing.BUTTON).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.BUTTON).should('be.visible'); + cy.get(core.Toolbar.Measure.BUTTON).should('be.visible'); + cy.get(core.Toolbar.Measure.Menu.BUTTON).should('be.visible'); + cy.get(core.Toolbar.CLEAR_BUTTON).should('be.visible'); + cy.get(core.Toolbar.PREVIOUS_DAY_BUTTON).should('be.visible'); + cy.get(core.Toolbar.Date.INPUT).should('be.visible'); + cy.get(core.Toolbar.Date.INPUT) .should('have.value', Cypress.moment().format('YYYY[-]MM[-]DD')); - cy.get(os.Toolbar.NEXT_DAY_BUTTON).should('be.visible'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('be.visible'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('have.value', 'day'); - cy.get(os.Toolbar.timeFilter.BUTTON).should('be.visible'); - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).should('be.visible'); - cy.get(os.Toolbar.Save.Menu.BUTTON).should('be.visible'); - cy.get(os.Toolbar.States.Menu.BUTTON).should('be.visible'); - cy.get(os.Toolbar.Search.Menu.BUTTON).should('be.visible'); - cy.get(os.Toolbar.Search.INPUT).should('be.visible'); - cy.get(os.Toolbar.Search.CLEAR_BUTTON).should('be.visible'); - cy.get(os.Toolbar.Search.BUTTON).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.BUTTON).should('be.visible'); + cy.get(core.Toolbar.NEXT_DAY_BUTTON).should('be.visible'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('be.visible'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('have.value', 'day'); + cy.get(core.Toolbar.timeFilter.BUTTON).should('be.visible'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).should('be.visible'); + cy.get(core.Toolbar.Save.Menu.BUTTON).should('be.visible'); + cy.get(core.Toolbar.States.Menu.BUTTON).should('be.visible'); + cy.get(core.Toolbar.Search.Menu.BUTTON).should('be.visible'); + cy.get(core.Toolbar.Search.INPUT).should('be.visible'); + cy.get(core.Toolbar.Search.CLEAR_BUTTON).should('be.visible'); + cy.get(core.Toolbar.Search.BUTTON).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.BUTTON).should('be.visible'); }); it('Map controls', function() { - cy.get(os.Map.OVERVIEW_MAP).should('be.visible'); - cy.get(os.Map.OVERVIEW_MAP_TOGGLE_BUTTON).should('be.visible'); - cy.get(os.Map.ZOOM_IN_BUTTON).should('be.visible'); - cy.get(os.Map.ZOOM_OUT_BUTTON).should('be.visible'); - cy.get(os.Map.ROTATION_BUTTON).should('be.visible'); - cy.get(os.Map.MAP_MODE_BUTTON).should('be.visible'); + cy.get(core.Map.OVERVIEW_MAP).should('be.visible'); + cy.get(core.Map.OVERVIEW_MAP_TOGGLE_BUTTON).should('be.visible'); + cy.get(core.Map.ZOOM_IN_BUTTON).should('be.visible'); + cy.get(core.Map.ZOOM_OUT_BUTTON).should('be.visible'); + cy.get(core.Map.ROTATION_BUTTON).should('be.visible'); + cy.get(core.Map.MAP_MODE_BUTTON).should('be.visible'); }); it('Layers dialog', function() { - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.layersDialog.DIALOG_HEADER).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.Areas.TAB).should('be.visible'); - cy.get(os.layersDialog.Tabs.Filters.TAB).should('be.visible'); - cy.get(os.layersDialog.Tabs.Places.TAB).should('be.visible'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.DIALOG_HEADER).should('contain', 'Layers'); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Layers'); + cy.get(layers.areasTab.TAB).should('be.visible'); + cy.get(layers.filtersTab.TAB).should('be.visible'); + cy.get(layers.placesTab.TAB).should('be.visible'); }); it('Status bar', function() { - cy.get(os.statusBar.ALTITUDE_TEXT).should('be.visible'); - cy.get(os.statusBar.ZOOM_TEXT).should('be.visible'); - cy.get(os.statusBar.Scale.BAR).should('be.visible'); - cy.get(os.statusBar.COORDINATES_TEXT).should('be.visible'); - cy.get(os.statusBar.SETTINGS_BUTTON).should('be.visible'); - cy.get(os.statusBar.LEGEND_BUTTON).should('be.visible'); - cy.get(os.statusBar.SERVERS_BUTTON).should('be.visible'); - cy.get(os.statusBar.ALERTS_BUTTON).should('be.visible'); - cy.get(os.statusBar.HISTORY_BUTTON).should('be.visible'); - cy.get(os.statusBar.Mute.BUTTON).should('be.visible'); + cy.get(core.statusBar.ALTITUDE_TEXT).should('be.visible'); + cy.get(core.statusBar.ZOOM_TEXT).should('be.visible'); + cy.get(core.statusBar.Scale.BAR).should('be.visible'); + cy.get(core.statusBar.COORDINATES_TEXT).should('be.visible'); + cy.get(core.statusBar.SETTINGS_BUTTON).should('be.visible'); + cy.get(core.statusBar.LEGEND_BUTTON).should('be.visible'); + cy.get(core.statusBar.SERVERS_BUTTON).should('be.visible'); + cy.get(core.statusBar.ALERTS_BUTTON).should('be.visible'); + cy.get(core.statusBar.HISTORY_BUTTON).should('be.visible'); + cy.get(core.statusBar.Mute.BUTTON).should('be.visible'); }); it('Alerts', function() { - cy.get(os.statusBar.ALERTS_UNREAD_BADGE).should('not.exist'); + cy.get(core.statusBar.ALERTS_UNREAD_BADGE).should('not.exist'); }); }); diff --git a/cypress/integration/smoke-tests/status-bar.spec.js b/cypress/integration/smoke-tests/status-bar.spec.js index 935545ef0..8690922f6 100644 --- a/cypress/integration/smoke-tests/status-bar.spec.js +++ b/cypress/integration/smoke-tests/status-bar.spec.js @@ -1,5 +1,8 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var layers = require('../../support/selectors/layers.js'); +var settings = require('../../support/selectors/settings.js'); describe('Status bar', function() { before('Login', function() { @@ -8,209 +11,209 @@ describe('Status bar', function() { it('Altitude', function() { // Setup - cy.get(os.Application.PAGE).type('v'); + cy.get(core.Application.PAGE).type('v'); // Test - cy.get(os.statusBar.ALTITUDE_TEXT).should('contain', 'Altitude:'); - cy.get(os.statusBar.ALTITUDE_TEXT).then(function($altitude) { + cy.get(core.statusBar.ALTITUDE_TEXT).should('contain', 'Altitude:'); + cy.get(core.statusBar.ALTITUDE_TEXT).then(function($altitude) { var INITIAL_ALTITUDE = $altitude.text(); - cy.get(os.Application.PAGE).type('++++'); - cy.get(os.statusBar.ALTITUDE_TEXT).should('not.contain', INITIAL_ALTITUDE); + cy.get(core.Application.PAGE).type('++++'); + cy.get(core.statusBar.ALTITUDE_TEXT).should('not.contain', INITIAL_ALTITUDE); }); // Clean up - cy.get(os.Application.PAGE).type('v'); + cy.get(core.Application.PAGE).type('v'); }); it('Zoom', function() { // Setup - cy.get(os.Application.PAGE).type('v'); + cy.get(core.Application.PAGE).type('v'); // Test - cy.get(os.statusBar.ZOOM_TEXT).should('contain', 'Zoom:'); - cy.get(os.statusBar.ZOOM_TEXT).then(function($zoom) { + cy.get(core.statusBar.ZOOM_TEXT).should('contain', 'Zoom:'); + cy.get(core.statusBar.ZOOM_TEXT).then(function($zoom) { var INITIAL_ZOOM = $zoom.text(); - cy.get(os.Application.PAGE).type('++++'); - cy.get(os.statusBar.ZOOM_TEXT).should('not.contain', INITIAL_ZOOM); + cy.get(core.Application.PAGE).type('++++'); + cy.get(core.statusBar.ZOOM_TEXT).should('not.contain', INITIAL_ZOOM); }); // Clean up - cy.get(os.Application.PAGE).type('v'); + cy.get(core.Application.PAGE).type('v'); }); it('Scale', function() { // Setup - cy.get(os.Application.PAGE).type('v'); + cy.get(core.Application.PAGE).type('v'); // Test - cy.get(os.statusBar.Scale.BAR).then(function($scale) { + cy.get(core.statusBar.Scale.BAR).then(function($scale) { var INITIAL_SCALE = $scale.text(); - cy.get(os.Application.PAGE).type('++++'); - cy.get(os.statusBar.Scale.BAR).should('not.contain', INITIAL_SCALE); + cy.get(core.Application.PAGE).type('++++'); + cy.get(core.statusBar.Scale.BAR).should('not.contain', INITIAL_SCALE); }); // Clean up - cy.get(os.Application.PAGE).type('v'); + cy.get(core.Application.PAGE).type('v'); }); it('Scale options', function() { // Setup - cy.get(os.statusBar.Scale.Menu.PANEL).should('not.be.visible'); + cy.get(core.statusBar.Scale.Menu.PANEL).should('not.be.visible'); // Test - cy.get(os.statusBar.Scale.BAR).click(); - cy.get(os.statusBar.Scale.Menu.PANEL).should('be.visible'); - cy.get(os.statusBar.Scale.Menu.menuOptions.IMPERIAL).should('be.visible'); - cy.get(os.statusBar.Scale.Menu.menuOptions.METRIC).should('be.visible'); - cy.get(os.statusBar.Scale.Menu.menuOptions.NAUTICAL).should('be.visible'); - cy.get(os.statusBar.Scale.Menu.menuOptions.NAUTICAL_MILES_ONLY).should('be.visible'); - cy.get(os.statusBar.Scale.Menu.menuOptions.MILES_ONLY).should('be.visible'); - cy.get(os.statusBar.Scale.Menu.menuOptions.YARDS_ONLY).should('be.visible'); - cy.get(os.statusBar.Scale.Menu.menuOptions.FEET_ONLY).should('be.visible'); + cy.get(core.statusBar.Scale.BAR).click(); + cy.get(core.statusBar.Scale.Menu.PANEL).should('be.visible'); + cy.get(core.statusBar.Scale.Menu.IMPERIAL).should('be.visible'); + cy.get(core.statusBar.Scale.Menu.METRIC).should('be.visible'); + cy.get(core.statusBar.Scale.Menu.NAUTICAL).should('be.visible'); + cy.get(core.statusBar.Scale.Menu.NAUTICAL_MILES_ONLY).should('be.visible'); + cy.get(core.statusBar.Scale.Menu.MILES_ONLY).should('be.visible'); + cy.get(core.statusBar.Scale.Menu.YARDS_ONLY).should('be.visible'); + cy.get(core.statusBar.Scale.Menu.FEET_ONLY).should('be.visible'); // Clean up - cy.get(os.statusBar.Scale.BAR).click(); - cy.get(os.statusBar.Scale.Menu.PANEL).should('not.be.visible'); + cy.get(core.statusBar.Scale.BAR).click(); + cy.get(core.statusBar.Scale.Menu.PANEL).should('not.be.visible'); }); it('Scale units', function() { // Setup - cy.get(os.Application.PAGE).type('v'); - cy.get(os.statusBar.Scale.BAR).should('not.contain', 'mi'); + cy.get(core.Application.PAGE).type('v'); + cy.get(core.statusBar.Scale.BAR).should('not.contain', 'mi'); // Test - cy.get(os.statusBar.Scale.BAR).click(); - cy.get(os.statusBar.Scale.Menu.menuOptions.IMPERIAL).click(); - cy.get(os.statusBar.Scale.Menu.PANEL).should('not.be.visible'); - cy.get(os.statusBar.Scale.BAR).should('contain', 'mi'); + cy.get(core.statusBar.Scale.BAR).click(); + cy.get(core.statusBar.Scale.Menu.IMPERIAL).click(); + cy.get(core.statusBar.Scale.Menu.PANEL).should('not.be.visible'); + cy.get(core.statusBar.Scale.BAR).should('contain', 'mi'); // Clean up - cy.get(os.statusBar.Scale.BAR).click(); - cy.get(os.statusBar.Scale.Menu.menuOptions.METRIC).click(); + cy.get(core.statusBar.Scale.BAR).click(); + cy.get(core.statusBar.Scale.Menu.METRIC).click(); }); it('Coordinates', function() { // Setup - cy.get(os.layersDialog.DIALOG_CLOSE).click(); - cy.get(os.Application.PAGE).type('+++++++++++++++++++'); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); + cy.get(layers.Dialog.DIALOG_CLOSE).click(); + cy.get(core.Application.PAGE).type('+++++++++++++++++++'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', 'No coordinate'); // Test - cy.get(os.statusBar.COORDINATES_TEXT).then(function($coordinates) { + cy.get(core.statusBar.COORDINATES_TEXT).then(function($coordinates) { var INITIAL_COORDINATES = $coordinates.text(); - cy.get(os.Application.PAGE) + cy.get(core.Application.PAGE) .trigger('mouseenter') .trigger('mousemove', 500, 500); - cy.get(os.statusBar.COORDINATES_TEXT).should('not.contain', INITIAL_COORDINATES); + cy.get(core.statusBar.COORDINATES_TEXT).should('not.contain', INITIAL_COORDINATES); }); // Clean up - cy.get(os.Application.PAGE).type('v'); + cy.get(core.Application.PAGE).type('v'); }); it('Coordinates format', function() { // Setup - cy.get(os.Application.PAGE).type('+++++++++++++++++++'); - cy.get(os.Application.PAGE) + cy.get(core.Application.PAGE).type('+++++++++++++++++++'); + cy.get(core.Application.PAGE) .trigger('mouseenter') .trigger('mousemove', 500, 500); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '(DD)'); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '(DD)'); // Test - cy.get(os.statusBar.COORDINATES_TEXT).click(); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '(DMS)'); - cy.get(os.statusBar.COORDINATES_TEXT).click(); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '(DDM)'); - cy.get(os.statusBar.COORDINATES_TEXT).click(); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '(MGRS)'); + cy.get(core.statusBar.COORDINATES_TEXT).click(); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '(DMS)'); + cy.get(core.statusBar.COORDINATES_TEXT).click(); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '(DDM)'); + cy.get(core.statusBar.COORDINATES_TEXT).click(); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '(MGRS)'); // Clean up - cy.get(os.statusBar.COORDINATES_TEXT).click(); - cy.get(os.statusBar.COORDINATES_TEXT).should('contain', '(DD)'); - cy.get(os.Application.PAGE).type('v'); + cy.get(core.statusBar.COORDINATES_TEXT).click(); + cy.get(core.statusBar.COORDINATES_TEXT).should('contain', '(DD)'); + cy.get(core.Application.PAGE).type('v'); }); it('Settings dialog', function() { // Setup - cy.get(os.settingsDialog.DIALOG).should('not.be.visible'); + cy.get(settings.settingsDialog.DIALOG).should('not.be.visible'); // Test - cy.get(os.statusBar.SETTINGS_BUTTON).click(); - cy.get(os.settingsDialog.DIALOG).should('visible'); + cy.get(core.statusBar.SETTINGS_BUTTON).click(); + cy.get(settings.settingsDialog.DIALOG).should('visible'); // Clean up - cy.get(os.settingsDialog.CLOSE_BUTTON).click(); - cy.get(os.settingsDialog.DIALOG).should('not.be.visible'); + cy.get(settings.settingsDialog.CLOSE_BUTTON).click(); + cy.get(settings.settingsDialog.DIALOG).should('not.be.visible'); }); it('Legend', function() { // Setup - cy.get(os.legendDialog.DIALOG_TEXT).should('not.be.visible'); + cy.get(dialogs.legendDialog.DIALOG_TEXT).should('not.be.visible'); // Test - cy.get(os.statusBar.LEGEND_BUTTON).click(); - cy.get(os.legendDialog.DIALOG_TEXT).should('be.visible'); + cy.get(core.statusBar.LEGEND_BUTTON).click(); + cy.get(dialogs.legendDialog.DIALOG_TEXT).should('be.visible'); // Clean up - cy.get(os.legendDialog.DIALOG_CLOSE).click(); - cy.get(os.legendDialog.DIALOG_TEXT).should('not.be.visible'); + cy.get(dialogs.legendDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.legendDialog.DIALOG_TEXT).should('not.be.visible'); }); it('Data servers', function() { // Setup - cy.get(os.settingsDialog.DIALOG).should('not.be.visible'); + cy.get(settings.settingsDialog.DIALOG).should('not.be.visible'); // Test - cy.get(os.statusBar.SERVERS_BUTTON).click(); - cy.get(os.settingsDialog.DIALOG).should('be.visible'); - cy.get(os.settingsDialog.Tabs.ACTIVE_TAB).should('contain', 'Data Servers'); - cy.get(os.settingsDialog.Tabs.Map.Interpolation.TAB).click(); - cy.get(os.settingsDialog.Tabs.ACTIVE_TAB).should('contain', 'Interpolation'); + cy.get(core.statusBar.SERVERS_BUTTON).click(); + cy.get(settings.settingsDialog.DIALOG).should('be.visible'); + cy.get(settings.settingsDialog.Tabs.ACTIVE_TAB).should('contain', 'Data Servers'); + cy.get(settings.settingsDialog.Tabs.Map.Interpolation.TAB).click(); + cy.get(settings.settingsDialog.Tabs.ACTIVE_TAB).should('contain', 'Interpolation'); // Clean up - cy.get(os.settingsDialog.CLOSE_BUTTON).click(); - cy.get(os.settingsDialog.DIALOG).should('not.be.visible'); + cy.get(settings.settingsDialog.CLOSE_BUTTON).click(); + cy.get(settings.settingsDialog.DIALOG).should('not.be.visible'); }); it('Alerts dialog', function() { // Setup - cy.get(os.alertsDialog.DIALOG).should('not.be.visible'); + cy.get(dialogs.alertsDialog.DIALOG).should('not.be.visible'); // Test - cy.get(os.statusBar.ALERTS_BUTTON).click(); - cy.get(os.alertsDialog.DIALOG).should('be.visible'); - cy.get(os.alertsDialog.DIALOG).should('contain', 'There are no alerts to view'); + cy.get(core.statusBar.ALERTS_BUTTON).click(); + cy.get(dialogs.alertsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.alertsDialog.DIALOG).should('contain', 'There are no alerts to view'); // Clean up - cy.get(os.alertsDialog.DIALOG_CLOSE).click(); - cy.get(os.alertsDialog.DIALOG).should('not.be.visible'); + cy.get(dialogs.alertsDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.alertsDialog.DIALOG).should('not.be.visible'); }); it('History dialog', function() { // Setup - cy.get(os.historyDialog.DIALOG).should('not.be.visible'); + cy.get(dialogs.historyDialog.DIALOG).should('not.be.visible'); // Test - cy.get(os.statusBar.HISTORY_BUTTON).click(); - cy.get(os.historyDialog.DIALOG).should('be.visible'); - cy.get(os.historyDialog.DIALOG).should('contain', 'There is no history to view'); + cy.get(core.statusBar.HISTORY_BUTTON).click(); + cy.get(dialogs.historyDialog.DIALOG).should('be.visible'); + cy.get(dialogs.historyDialog.DIALOG).should('contain', 'There is no history to view'); // Clean up - cy.get(os.historyDialog.DIALOG_CLOSE).click(); - cy.get(os.historyDialog.DIALOG).should('not.be.visible'); + cy.get(dialogs.historyDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.historyDialog.DIALOG).should('not.be.visible'); }); it('Sounds', function() { // Setup - cy.get(os.statusBar.Mute.BUTTON).should('have.class', os.statusBar.Mute.SOUND_ON_CLASS); + cy.get(core.statusBar.Mute.BUTTON).should('have.class', core.statusBar.Mute.SOUND_ON_CLASS); // Test - cy.get(os.statusBar.Mute.BUTTON).click(); - cy.get(os.statusBar.Mute.BUTTON).should('have.class', os.statusBar.Mute.SOUND_OFF_CLASS); + cy.get(core.statusBar.Mute.BUTTON).click(); + cy.get(core.statusBar.Mute.BUTTON).should('have.class', core.statusBar.Mute.SOUND_OFF_CLASS); // Clean up - cy.get(os.statusBar.Mute.BUTTON).click(); - cy.get(os.statusBar.Mute.BUTTON).should('have.class', os.statusBar.Mute.SOUND_ON_CLASS); + cy.get(core.statusBar.Mute.BUTTON).click(); + cy.get(core.statusBar.Mute.BUTTON).should('have.class', core.statusBar.Mute.SOUND_ON_CLASS); }); }); diff --git a/cypress/integration/smoke-tests/toolbar-center.spec.js b/cypress/integration/smoke-tests/toolbar-center.spec.js index a83d3a740..a3c7796a6 100755 --- a/cypress/integration/smoke-tests/toolbar-center.spec.js +++ b/cypress/integration/smoke-tests/toolbar-center.spec.js @@ -1,5 +1,5 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); describe('Toolbar center', function() { before('Login', function() { @@ -11,34 +11,34 @@ describe('Toolbar center', function() { // none // Test - cy.get(os.Toolbar.Date.INPUT) + cy.get(core.Toolbar.Date.INPUT) .should('have.value', Cypress.moment().format('YYYY[-]MM[-]DD')); - cy.get(os.Toolbar.PREVIOUS_DAY_BUTTON).click(); - cy.get(os.Toolbar.Date.INPUT) + cy.get(core.Toolbar.PREVIOUS_DAY_BUTTON).click(); + cy.get(core.Toolbar.Date.INPUT) .should('have.value', Cypress.moment().subtract(1, 'days').format('YYYY[-]MM[-]DD')); // Clean up cy.wait(500); // Wait to avoid rapidly changing dates - cy.get(os.Toolbar.NEXT_DAY_BUTTON).click(); - cy.get(os.Toolbar.Date.INPUT) + cy.get(core.Toolbar.NEXT_DAY_BUTTON).click(); + cy.get(core.Toolbar.Date.INPUT) .should('have.value', Cypress.moment().format('YYYY[-]MM[-]DD')); }); it('Date', function() { // Setup - cy.get(os.Toolbar.Date.Calendar.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Date.Calendar.PANEL).should('not.be.visible'); // Test - cy.get(os.Toolbar.Date.INPUT).click(); - cy.get(os.Toolbar.Date.Calendar.PANEL).should('be.visible'); - cy.get(os.Toolbar.Date.Calendar.MONTH_DROPDOWN).should('contain', Cypress.moment().format('MMM')); - cy.get(os.Toolbar.Date.Calendar.YEAR_DROPDOWN).should('contain', Cypress.moment().format('YYYY')); - cy.get(os.Toolbar.Date.Calendar.CURRENT_DAY).should('contain', Cypress.moment().format('D')); + cy.get(core.Toolbar.Date.INPUT).click(); + cy.get(core.Toolbar.Date.Calendar.PANEL).should('be.visible'); + cy.get(core.Toolbar.Date.Calendar.MONTH_DROPDOWN).should('contain', Cypress.moment().format('MMM')); + cy.get(core.Toolbar.Date.Calendar.YEAR_DROPDOWN).should('contain', Cypress.moment().format('YYYY')); + cy.get(core.Toolbar.Date.Calendar.CURRENT_DAY).should('contain', Cypress.moment().format('D')); // Clean up cy.wait(500); - cy.get(os.Toolbar.Date.Calendar.CLOSE_BUTTON).click(); - cy.get(os.Toolbar.Date.Calendar.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Date.Calendar.CLOSE_BUTTON).click(); + cy.get(core.Toolbar.Date.Calendar.PANEL).should('not.be.visible'); }); it('Next day', function() { @@ -46,16 +46,16 @@ describe('Toolbar center', function() { // none // Test - cy.get(os.Toolbar.Date.INPUT) + cy.get(core.Toolbar.Date.INPUT) .should('have.value', Cypress.moment().format('YYYY[-]MM[-]DD')); - cy.get(os.Toolbar.NEXT_DAY_BUTTON).click(); - cy.get(os.Toolbar.Date.INPUT) + cy.get(core.Toolbar.NEXT_DAY_BUTTON).click(); + cy.get(core.Toolbar.Date.INPUT) .should('have.value', Cypress.moment().add(1, 'days').format('YYYY[-]MM[-]DD')); // Clean up cy.wait(500); // Wait to avoid rapidly changing dates - cy.get(os.Toolbar.PREVIOUS_DAY_BUTTON).click(); - cy.get(os.Toolbar.Date.INPUT) + cy.get(core.Toolbar.PREVIOUS_DAY_BUTTON).click(); + cy.get(core.Toolbar.Date.INPUT) .should('have.value', Cypress.moment().format('YYYY[-]MM[-]DD')); }); @@ -64,55 +64,55 @@ describe('Toolbar center', function() { // none // Test - cy.get(os.Toolbar.DURATION_DROPDOWN).should('have.value', 'day'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('contain', 'day'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('contain', 'week'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('contain', 'month'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('contain', 'custom'); - cy.get(os.Toolbar.DURATION_DROPDOWN).select('month'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('have.value', 'month'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('have.value', 'day'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('contain', 'day'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('contain', 'week'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('contain', 'month'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('contain', 'custom'); + cy.get(core.Toolbar.DURATION_DROPDOWN).select('month'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('have.value', 'month'); // Clean up - cy.get(os.Toolbar.DURATION_DROPDOWN).select('day'); - cy.get(os.Toolbar.DURATION_DROPDOWN).should('have.value', 'day'); + cy.get(core.Toolbar.DURATION_DROPDOWN).select('day'); + cy.get(core.Toolbar.DURATION_DROPDOWN).should('have.value', 'day'); }); it('Time filter', function() { // Setup - cy.get(os.Toolbar.timeFilter.BUTTON) - .should('not.have.class', os.Toolbar.timeFilter.BUTTON_IS_ACTIVE_CLASS); - cy.get(os.Toolbar.timeFilter.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.timeFilter.BUTTON) + .should('not.have.class', core.Toolbar.timeFilter.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.timeFilter.PANEL).should('not.be.visible'); // Test - cy.get(os.Toolbar.timeFilter.BUTTON).click(); - cy.get(os.Toolbar.timeFilter.BUTTON) - .should('have.class', os.Toolbar.timeFilter.BUTTON_IS_ACTIVE_CLASS); - cy.get(os.Toolbar.timeFilter.PANEL).should('be.visible'); - cy.get(os.Toolbar.timeFilter.START_HOUR_INPUT).should('be.visible'); - cy.get(os.Toolbar.timeFilter.END_HOUR_INPUT).should('be.visible'); - cy.get(os.Toolbar.timeFilter.APPLY_BUTTON).should('be.visible'); + cy.get(core.Toolbar.timeFilter.BUTTON).click(); + cy.get(core.Toolbar.timeFilter.BUTTON) + .should('have.class', core.Toolbar.timeFilter.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.timeFilter.PANEL).should('be.visible'); + cy.get(core.Toolbar.timeFilter.START_HOUR_INPUT).should('be.visible'); + cy.get(core.Toolbar.timeFilter.END_HOUR_INPUT).should('be.visible'); + cy.get(core.Toolbar.timeFilter.APPLY_BUTTON).should('be.visible'); // Clean up - cy.get(os.Toolbar.timeFilter.BUTTON).click(); - cy.get(os.Toolbar.timeFilter.BUTTON) - .should('not.have.class', os.Toolbar.timeFilter.BUTTON_IS_ACTIVE_CLASS); - cy.get(os.Toolbar.timeFilter.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.timeFilter.BUTTON).click(); + cy.get(core.Toolbar.timeFilter.BUTTON) + .should('not.have.class', core.Toolbar.timeFilter.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.timeFilter.PANEL).should('not.be.visible'); }); it('Timeline', function() { // Setup - cy.get(os.Timeline.PANEL).should('not.exist'); + cy.get(core.Timeline.PANEL).should('not.exist'); // Test - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('be.visible'); - cy.get(os.Timeline.START_DATE_TIME_TEXT).should('be.visible'); - cy.get(os.Timeline.PLAY_BUTTON).should('be.visible'); - cy.get(os.Timeline.RECORD_BUTTON).should('be.visible'); - cy.get(os.Timeline.END_DATE_TIME_TEXT).should('be.visible'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('be.visible'); + cy.get(core.Timeline.START_DATE_TIME_TEXT).should('be.visible'); + cy.get(core.Timeline.PLAY_BUTTON).should('be.visible'); + cy.get(core.Timeline.RECORD_BUTTON).should('be.visible'); + cy.get(core.Timeline.END_DATE_TIME_TEXT).should('be.visible'); // Clean up - cy.get(os.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); - cy.get(os.Timeline.PANEL).should('not.exist'); + cy.get(core.Toolbar.TIMELINE_TOGGLE_BUTTON).click(); + cy.get(core.Timeline.PANEL).should('not.exist'); }); }); diff --git a/cypress/integration/smoke-tests/toolbar-left.spec.js b/cypress/integration/smoke-tests/toolbar-left.spec.js index 17a8b3c1f..fd84f3807 100755 --- a/cypress/integration/smoke-tests/toolbar-left.spec.js +++ b/cypress/integration/smoke-tests/toolbar-left.spec.js @@ -1,5 +1,9 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Toolbar left', function() { before('Login', function() { @@ -9,140 +13,140 @@ describe('Toolbar left', function() { describe('Add data buttons', function() { it('Add data dialog (via button)', function() { // Setup - cy.get(os.addDataDialog.DIALOG).should('not.exist'); + cy.get(dialogs.addDataDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.addData.BUTTON).click(); - cy.get(os.addDataDialog.DIALOG).should('be.visible'); - cy.get(os.addDataDialog.DIALOG_HEADER).should('contain', 'Add Data'); + cy.get(core.Toolbar.addData.BUTTON).click(); + cy.get(dialogs.addDataDialog.DIALOG).should('be.visible'); + cy.get(dialogs.addDataDialog.DIALOG_HEADER).should('contain', 'Add Data'); // Clean up - cy.get(os.addDataDialog.DIALOG_CLOSE).click(); - cy.get(os.addDataDialog.DIALOG).should('not.exist'); + cy.get(dialogs.addDataDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.addDataDialog.DIALOG).should('not.exist'); }); it('Import file (via button)', function() { // Setup - cy.get(os.importDataDialog.DIALOG).should('not.exist'); + cy.get(imports.importDataDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); - cy.get(os.importDataDialog.DIALOG_HEADER).should('contain', 'Import Data'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); + cy.get(imports.importDataDialog.DIALOG_HEADER).should('contain', 'Import Data'); // Clean up - cy.get(os.importDataDialog.DIALOG_CLOSE).click(); - cy.get(os.importDataDialog.DIALOG).should('not.exist'); + cy.get(imports.importDataDialog.DIALOG_CLOSE).click(); + cy.get(imports.importDataDialog.DIALOG).should('not.exist'); }); }); describe('Add data dropdown', function() { it('Menu options', function() { // Setup - cy.get(os.Toolbar.addData.Menu.PANEL).should('not.exist'); + cy.get(core.Toolbar.addData.Menu.PANEL).should('not.exist'); // Test - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.PANEL).should('be.visible'); - cy.get(os.Toolbar.addData.Menu.menuOptions.ADD_DATA).should('be.visible'); - cy.get(os.Toolbar.addData.Menu.menuOptions.OPEN_FILE_OR_URL).should('be.visible'); - cy.get(os.Toolbar.addData.Menu.menuOptions.ADD_CESIUM_ION_ASSET).should('be.visible'); - cy.get(os.Toolbar.addData.Menu.menuOptions.RECENT_WORLD_IMAGERY).should('be.visible'); - cy.get(os.Toolbar.addData.Menu.menuOptions.RECENT_STREET_MAP).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.PANEL).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.ADD_DATA).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.OPEN_FILE_OR_URL).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.ADD_CESIUM_ION_ASSET).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.RECENT_WORLD_IMAGERY).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.RECENT_STREET_MAP).should('be.visible'); // Clean up - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.PANEL).should('not.exist'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.PANEL).should('not.exist'); }); it('Add data dialog (via dropdown)', function() { // Setup - cy.get(os.addDataDialog.DIALOG).should('not.exist'); + cy.get(dialogs.addDataDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.menuOptions.ADD_DATA).click(); - cy.get(os.addDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.ADD_DATA).click(); + cy.get(dialogs.addDataDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.addDataDialog.CLOSE_BUTTON).click(); - cy.get(os.addDataDialog.DIALOG).should('not.exist'); + cy.get(dialogs.addDataDialog.CLOSE_BUTTON).click(); + cy.get(dialogs.addDataDialog.DIALOG).should('not.exist'); }); it('Import file (via dropdown)', function() { // Setup - cy.get(os.importDataDialog.DIALOG).should('not.exist'); + cy.get(imports.importDataDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.menuOptions.OPEN_FILE_OR_URL).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.OPEN_FILE_OR_URL).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.importDataDialog.CANCEL_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('not.exist'); + cy.get(imports.importDataDialog.CANCEL_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('not.exist'); }); it('Cesium ion asset', function() { // Setup - cy.get(os.importCesiumIonAssetDialog.DIALOG).should('not.exist'); + cy.get(imports.importCesiumIonAssetDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.menuOptions.ADD_CESIUM_ION_ASSET).click(); - cy.get(os.importCesiumIonAssetDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.ADD_CESIUM_ION_ASSET).click(); + cy.get(imports.importCesiumIonAssetDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.importCesiumIonAssetDialog.CANCEL_BUTTON).click(); - cy.get(os.importCesiumIonAssetDialog.DIALOG).should('not.exist'); + cy.get(imports.importCesiumIonAssetDialog.CANCEL_BUTTON).click(); + cy.get(imports.importCesiumIonAssetDialog.DIALOG).should('not.exist'); }); it('Recently used layers', function() { // Setup - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Layers'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES).should('be.visible'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES).should('be.visible'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) - .should('have.class', os.layersDialog.Tabs.Layers.Tree.LAYER_IS_ACTIVE_CLASS_WILDCARD); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) - .should('have.class', os.layersDialog.Tabs.Layers.Tree.LAYER_IS_ACTIVE_CLASS_WILDCARD); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Layers'); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES).should('be.visible'); + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES).should('be.visible'); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .should('have.class', shared.Tree.ROW_CHECKED_CLASS); + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .should('have.class', shared.Tree.ROW_CHECKED_CLASS); // Test - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.menuOptions.RECENT_STREET_MAP).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES).should('not.exist'); - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.menuOptions.RECENT_WORLD_IMAGERY).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES).should('not.exist'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.RECENT_STREET_MAP).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES).should('not.exist'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.RECENT_WORLD_IMAGERY).click(); + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES).should('not.exist'); // Clean up - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.menuOptions.RECENT_STREET_MAP).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES).should('be.visible'); - cy.get(os.Toolbar.addData.Menu.BUTTON).click(); - cy.get(os.Toolbar.addData.Menu.menuOptions.RECENT_WORLD_IMAGERY).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES).should('be.visible'); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) - .should('have.class', os.layersDialog.Tabs.Layers.Tree.LAYER_IS_ACTIVE_CLASS_WILDCARD); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.WORLD_IMAGERY_TILES) - .find(os.layersDialog.Tabs.Layers.Tree.LAYER_TOGGLE_CHECKBOX_WILDCARD) - .should('have.class', os.layersDialog.Tabs.Layers.Tree.LAYER_IS_ACTIVE_CLASS_WILDCARD); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.RECENT_STREET_MAP).click(); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES).should('be.visible'); + cy.get(core.Toolbar.addData.Menu.BUTTON).click(); + cy.get(core.Toolbar.addData.Menu.RECENT_WORLD_IMAGERY).click(); + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES).should('be.visible'); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .should('have.class', shared.Tree.ROW_CHECKED_CLASS); + cy.get(layers.layersTab.Tree.WORLD_IMAGERY_TILES) + .find(shared.Tree.ROW_CHECKBOX) + .should('have.class', shared.Tree.ROW_CHECKED_CLASS); }); }); it('Layers button', function() { // Setup - cy.get(os.layersDialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); // Test - cy.get(os.layersDialog.DIALOG_CLOSE).click(); - cy.get(os.layersDialog.DIALOG).should('not.exist'); - cy.get(os.Toolbar.LAYERS_TOGGLE_BUTTON).click(); - cy.get(os.layersDialog.DIALOG).should('be.visible'); + cy.get(layers.Dialog.DIALOG_CLOSE).click(); + cy.get(layers.Dialog.DIALOG).should('not.exist'); + cy.get(core.Toolbar.LAYERS_TOGGLE_BUTTON).click(); + cy.get(layers.Dialog.DIALOG).should('be.visible'); // Clean up // none - not needed @@ -150,13 +154,13 @@ describe('Toolbar left', function() { it('Drawing tool', function() { // Setup - cy.get(os.Application.PAGE).type('+++++++++++++++++++++++++'); // zoom in - cy.get(os.Toolbar.Drawing.BUTTON) - .should('not.have.class', os.Toolbar.Drawing.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Application.PAGE).type('+++++++++++++++++++++++++'); // zoom in + cy.get(core.Toolbar.Drawing.BUTTON) + .should('not.have.class', core.Toolbar.Drawing.BUTTON_IS_ACTIVE_CLASS); // Test - cy.get(os.Toolbar.Drawing.BUTTON).click(); - cy.get(os.Toolbar.Drawing.BUTTON).should('have.class', os.Toolbar.Drawing.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.Drawing.BUTTON).click(); + cy.get(core.Toolbar.Drawing.BUTTON).should('have.class', core.Toolbar.Drawing.BUTTON_IS_ACTIVE_CLASS); // TODO: The rest of this test needs to be completed. // There were problems getting the map to respond to mouse inputs. @@ -168,90 +172,90 @@ describe('Toolbar left', function() { // an area was created // Clean up - cy.get(os.Toolbar.Drawing.BUTTON).click(); - cy.get(os.Toolbar.Drawing.BUTTON) - .should('not.have.class', os.Toolbar.Drawing.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.Drawing.BUTTON).click(); + cy.get(core.Toolbar.Drawing.BUTTON) + .should('not.have.class', core.Toolbar.Drawing.BUTTON_IS_ACTIVE_CLASS); }); describe('Drawing tool menu', function() { it('Menu options', function() { // Setup - cy.get(os.Toolbar.Drawing.Menu.PANEL).should('not.exist'); + cy.get(core.Toolbar.Drawing.Menu.PANEL).should('not.exist'); // Test - cy.get(os.Toolbar.Drawing.Menu.BUTTON).click(); - cy.get(os.Toolbar.Drawing.Menu.PANEL).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.BOX).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.CIRCLE).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.POLYGON).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.LINE).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.CHOOSE_AREA).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.ENTER_COORDINATES).should('be.visible'); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.WHOLE_WORLD).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.BUTTON).click(); + cy.get(core.Toolbar.Drawing.Menu.PANEL).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.BOX).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.CIRCLE).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.POLYGON).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.LINE).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.CHOOSE_AREA).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.ENTER_COORDINATES).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.WHOLE_WORLD).should('be.visible'); // Clean up - cy.get(os.Toolbar.Drawing.Menu.BUTTON).click(); - cy.get(os.Toolbar.Drawing.Menu.PANEL).should('not.exist'); + cy.get(core.Toolbar.Drawing.Menu.BUTTON).click(); + cy.get(core.Toolbar.Drawing.Menu.PANEL).should('not.exist'); }); it('Choose area', function() { // Setup - cy.get(os.chooseAreaDialog.DIALOG).should('not.exist'); + cy.get(dialogs.chooseAreaDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Drawing.Menu.BUTTON).click(); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.CHOOSE_AREA).click(); - cy.get(os.chooseAreaDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.BUTTON).click(); + cy.get(core.Toolbar.Drawing.Menu.CHOOSE_AREA).click(); + cy.get(dialogs.chooseAreaDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.chooseAreaDialog.CANCEL_BUTTON).click(); - cy.get(os.chooseAreaDialog.DIALOG).should('not.exist'); + cy.get(dialogs.chooseAreaDialog.CANCEL_BUTTON).click(); + cy.get(dialogs.chooseAreaDialog.DIALOG).should('not.exist'); }); it('Enter coordinates', function() { // Setup - cy.get(os.enterAreaCoordinatesDialog.DIALOG).should('not.exist'); + cy.get(dialogs.enterAreaCoordinatesDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Drawing.Menu.BUTTON).click(); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.ENTER_COORDINATES).click(); - cy.get(os.enterAreaCoordinatesDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.BUTTON).click(); + cy.get(core.Toolbar.Drawing.Menu.ENTER_COORDINATES).click(); + cy.get(dialogs.enterAreaCoordinatesDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.enterAreaCoordinatesDialog.DIALOG_CLOSE).click(); - cy.get(os.enterAreaCoordinatesDialog.DIALOG).should('not.exist'); + cy.get(dialogs.enterAreaCoordinatesDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.enterAreaCoordinatesDialog.DIALOG).should('not.exist'); }); it('Whole world query', function() { // Setup - cy.get(os.layersDialog.DIALOG).should('be.visible'); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Areas'); - cy.get(os.layersDialog.Tabs.Areas.Tree.WHOLE_WORLD_AREA).should('not.exist'); + cy.get(layers.Dialog.DIALOG).should('be.visible'); + cy.get(layers.areasTab.TAB).click(); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Areas'); + cy.get(layers.areasTab.Tree.WHOLE_WORLD_AREA).should('not.exist'); // Test - cy.get(os.Toolbar.Drawing.Menu.BUTTON).click(); - cy.get(os.Toolbar.Drawing.Menu.menuOptions.WHOLE_WORLD).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.WHOLE_WORLD_AREA).should('be.visible'); + cy.get(core.Toolbar.Drawing.Menu.BUTTON).click(); + cy.get(core.Toolbar.Drawing.Menu.WHOLE_WORLD).click(); + cy.get(layers.areasTab.Tree.WHOLE_WORLD_AREA).should('be.visible'); // Clean up - cy.get(os.layersDialog.Tabs.Areas.Tree.WHOLE_WORLD_AREA).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.WHOLE_WORLD_AREA) - .find(os.layersDialog.Tabs.Areas.Tree.REMOVE_AREA_BUTTON_WILDCARD).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.WHOLE_WORLD_AREA).should('not.exist'); - cy.get(os.layersDialog.Tabs.Layers.TAB).click(); - cy.get(os.layersDialog.Tabs.ACTIVE).should('contain', 'Layers'); + cy.get(layers.areasTab.Tree.WHOLE_WORLD_AREA).click(); + cy.get(layers.areasTab.Tree.WHOLE_WORLD_AREA) + .find(layers.areasTab.Tree.REMOVE_AREA_BUTTON).click(); + cy.get(layers.areasTab.Tree.WHOLE_WORLD_AREA).should('not.exist'); + cy.get(layers.layersTab.TAB).click(); + cy.get(layers.Dialog.ACTIVE_TAB).should('contain', 'Layers'); }); }); it('Measure tool', function() { // Setup - cy.get(os.Toolbar.Measure.BUTTON) - .should('not.have.class', os.Toolbar.Measure.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.Measure.BUTTON) + .should('not.have.class', core.Toolbar.Measure.BUTTON_IS_ACTIVE_CLASS); // Test - cy.get(os.Toolbar.Measure.BUTTON).click(); - cy.get(os.Toolbar.Measure.BUTTON).should('have.class', os.Toolbar.Measure.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.Measure.BUTTON).click(); + cy.get(core.Toolbar.Measure.BUTTON).should('have.class', core.Toolbar.Measure.BUTTON_IS_ACTIVE_CLASS); // TODO: The rest of this test needs to be completed. // There were problems getting the map to respond to mouse inputs. @@ -263,40 +267,40 @@ describe('Toolbar left', function() { // measurement was taken // Clean up - cy.get(os.Toolbar.Measure.BUTTON).click(); - cy.get(os.Toolbar.Measure.BUTTON) - .should('not.have.class', os.Toolbar.Measure.BUTTON_IS_ACTIVE_CLASS); + cy.get(core.Toolbar.Measure.BUTTON).click(); + cy.get(core.Toolbar.Measure.BUTTON) + .should('not.have.class', core.Toolbar.Measure.BUTTON_IS_ACTIVE_CLASS); }); it('Interpolation', function() { // Setup - cy.get(os.Toolbar.Measure.Menu.PANEL).should('not.exist'); + cy.get(core.Toolbar.Measure.Menu.PANEL).should('not.exist'); // Test - cy.get(os.Toolbar.Measure.Menu.BUTTON).click(); - cy.get(os.Toolbar.Measure.Menu.PANEL).should('be.visible'); - cy.get(os.Toolbar.Measure.Menu.menuOptions.MEASURE_GEODESIC).should('be.visible'); - cy.get(os.Toolbar.Measure.Menu.menuOptions.MEASURE_RHUMB_LINE).should('be.visible'); + cy.get(core.Toolbar.Measure.Menu.BUTTON).click(); + cy.get(core.Toolbar.Measure.Menu.PANEL).should('be.visible'); + cy.get(core.Toolbar.Measure.Menu.MEASURE_GEODESIC).should('be.visible'); + cy.get(core.Toolbar.Measure.Menu.MEASURE_RHUMB_LINE).should('be.visible'); // Clean up - cy.get(os.Toolbar.Measure.Menu.BUTTON).click(); - cy.get(os.Toolbar.Measure.Menu.PANEL).should('not.exist'); + cy.get(core.Toolbar.Measure.Menu.BUTTON).click(); + cy.get(core.Toolbar.Measure.Menu.PANEL).should('not.exist'); }); it('Clear', function() { // Setup - cy.get(os.clearDialog.DIALOG).should('not.exist'); + cy.get(dialogs.clearDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.CLEAR_BUTTON).click(); - cy.get(os.clearDialog.DIALOG).should('be.visible'); - cy.get(os.clearDialog.Items.ALL).should('be.visible'); - cy.get(os.clearDialog.Items.STATES).should('be.visible'); - cy.get(os.clearDialog.OK_BUTTON).should('be.visible'); - cy.get(os.clearDialog.CANCEL_BUTTON).should('be.visible'); + cy.get(core.Toolbar.CLEAR_BUTTON).click(); + cy.get(dialogs.clearDialog.DIALOG).should('be.visible'); + cy.get(dialogs.clearDialog.Items.ALL).should('be.visible'); + cy.get(dialogs.clearDialog.Items.STATES).should('be.visible'); + cy.get(dialogs.clearDialog.OK_BUTTON).should('be.visible'); + cy.get(dialogs.clearDialog.CANCEL_BUTTON).should('be.visible'); // Clean up - cy.get(os.clearDialog.CANCEL_BUTTON).click(); - cy.get(os.clearDialog.DIALOG).should('not.exist'); + cy.get(dialogs.clearDialog.CANCEL_BUTTON).click(); + cy.get(dialogs.clearDialog.DIALOG).should('not.exist'); }); }); diff --git a/cypress/integration/smoke-tests/toolbar-right.spec.js b/cypress/integration/smoke-tests/toolbar-right.spec.js index 4f10b6193..b8081d70f 100755 --- a/cypress/integration/smoke-tests/toolbar-right.spec.js +++ b/cypress/integration/smoke-tests/toolbar-right.spec.js @@ -1,5 +1,9 @@ /// -var os = require('../../support/selectors.js'); +var core = require('../../support/selectors/core.js'); +var dialogs = require('../../support/selectors/dialogs.js'); +var imports = require('../../support/selectors/imports.js'); +var layers = require('../../support/selectors/layers.js'); +var shared = require('../../support/selectors/shared.js'); describe('Toolbar right', function() { before('Login', function() { @@ -9,32 +13,32 @@ describe('Toolbar right', function() { describe('Save menu', function() { it('Menu options', function() { // Setup - cy.get(os.Toolbar.Save.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Save.Menu.PANEL).should('not.be.visible'); // Test - cy.get(os.Toolbar.Save.Menu.BUTTON).click(); - cy.get(os.Toolbar.Save.Menu.PANEL).should('be.visible'); - cy.get(os.Toolbar.Save.Menu.menuOptions.STATE).should('be.visible'); - cy.get(os.Toolbar.Save.Menu.menuOptions.SCREENSHOT).should('be.visible'); + cy.get(core.Toolbar.Save.Menu.BUTTON).click(); + cy.get(core.Toolbar.Save.Menu.PANEL).should('be.visible'); + cy.get(core.Toolbar.Save.Menu.STATE).should('be.visible'); + cy.get(core.Toolbar.Save.Menu.SCREENSHOT).should('be.visible'); // Clean up - cy.get(os.Toolbar.Save.Menu.BUTTON).click(); - cy.get(os.Toolbar.Save.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Save.Menu.BUTTON).click(); + cy.get(core.Toolbar.Save.Menu.PANEL).should('not.be.visible'); }); it('Save state (from save menu)', function() { // Setup - cy.get(os.saveStateDialog.DIALOG).should('not.be.visible'); + cy.get(dialogs.saveStateDialog.DIALOG).should('not.be.visible'); // Test - cy.get(os.Toolbar.Save.Menu.BUTTON).click(); - cy.get(os.Toolbar.Save.Menu.menuOptions.STATE).click(); - cy.get(os.saveStateDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.Save.Menu.BUTTON).click(); + cy.get(core.Toolbar.Save.Menu.STATE).click(); + cy.get(dialogs.saveStateDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.saveStateDialog.DIALOG_CLOSE).click(); - cy.get(os.saveStateDialog.DIALOG).should('not.be.visible'); - cy.get(os.Toolbar.Save.Menu.PANEL).should('not.be.visible'); + cy.get(dialogs.saveStateDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.saveStateDialog.DIALOG).should('not.be.visible'); + cy.get(core.Toolbar.Save.Menu.PANEL).should('not.be.visible'); }); // TODO: Skipping test of screenshot. @@ -51,231 +55,243 @@ describe('Toolbar right', function() { describe('State menu', function() { it('Menu options', function() { // Setup - cy.get(os.Toolbar.States.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.States.Menu.PANEL).should('not.be.visible'); // Test - cy.get(os.Toolbar.States.Menu.BUTTON).click(); - cy.get(os.Toolbar.States.Menu.PANEL).should('be.visible'); - cy.get(os.Toolbar.States.Menu.menuOptions.IMPORT_STATE).should('be.visible'); - cy.get(os.Toolbar.States.Menu.menuOptions.SAVE_STATE).should('be.visible'); - cy.get(os.Toolbar.States.Menu.menuOptions.DISABLE_STATES).should('be.visible'); + cy.get(core.Toolbar.States.Menu.BUTTON).click(); + cy.get(core.Toolbar.States.Menu.PANEL).should('be.visible'); + cy.get(core.Toolbar.States.Menu.IMPORT_STATE).should('be.visible'); + cy.get(core.Toolbar.States.Menu.SAVE_STATE).should('be.visible'); + cy.get(core.Toolbar.States.Menu.DISABLE_STATES).should('be.visible'); // Clean up - cy.get(os.Toolbar.States.Menu.BUTTON).click(); - cy.get(os.Toolbar.States.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.States.Menu.BUTTON).click(); + cy.get(core.Toolbar.States.Menu.PANEL).should('not.be.visible'); }); it('Import state', function() { // Setup - cy.get(os.importDataDialog.DIALOG).should('not.exist'); + cy.get(imports.importDataDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.States.Menu.BUTTON).click(); - cy.get(os.Toolbar.States.Menu.menuOptions.IMPORT_STATE).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.States.Menu.BUTTON).click(); + cy.get(core.Toolbar.States.Menu.IMPORT_STATE).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.importDataDialog.CANCEL_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('not.exist'); - cy.get(os.Toolbar.States.Menu.PANEL).should('not.exist'); + cy.get(imports.importDataDialog.CANCEL_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('not.exist'); + cy.get(core.Toolbar.States.Menu.PANEL).should('not.exist'); }); it('Save state (from state menu)', function() { // Setup - cy.get(os.saveStateDialog.DIALOG).should('not.exist'); + cy.get(dialogs.saveStateDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.States.Menu.BUTTON).click(); - cy.get(os.Toolbar.States.Menu.menuOptions.SAVE_STATE).click(); - cy.get(os.saveStateDialog.DIALOG).should('be.visible'); + cy.get(core.Toolbar.States.Menu.BUTTON).click(); + cy.get(core.Toolbar.States.Menu.SAVE_STATE).click(); + cy.get(dialogs.saveStateDialog.DIALOG).should('be.visible'); // Clean up - cy.get(os.saveStateDialog.CANCEL_BUTTON).click(); - cy.get(os.saveStateDialog.DIALOG).should('not.exist'); - cy.get(os.Toolbar.States.Menu.PANEL).should('not.be.visible'); + cy.get(dialogs.saveStateDialog.CANCEL_BUTTON).click(); + cy.get(dialogs.saveStateDialog.DIALOG).should('not.exist'); + cy.get(core.Toolbar.States.Menu.PANEL).should('not.be.visible'); }); it('Disable state', function() { + // Catch console error we don't care about + cy.on('uncaught:exception', function(err) { + if (err.message.includes('$rootScope')) { + expect(err.message).to.include('$rootScope'); + return false; + } + return true; + }); + // Setup - cy.get(os.Toolbar.addData.OPEN_FILE_BUTTON).click(); - cy.get(os.importDataDialog.DIALOG).should('be.visible'); - cy.upload('smoke-tests/load-state-file-arcgis/test-state-arcgis_state.xml'); - cy.get(os.importDataDialog.NEXT_BUTTON).click(); - cy.get(os.importStateDialog.DIALOG).should('be.visible'); - cy.get(os.importStateDialog.CLEAR_CHECKBOX).check(); - cy.get(os.importStateDialog.OK_BUTTON).click(); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_4).should('contain', 'Police Stations Features (3)'); - cy.get(os.layersDialog.Tabs.Layers.Tree.LAYER_5).should('contain', 'Fire Hydrants Features (747)'); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_2).should('contain', 'Aurora Hydrant Include'); - cy.get(os.layersDialog.Tabs.Areas.Tree.AREA_4).should('contain', 'Aurora Police Include'); - cy.get(os.layersDialog.Tabs.Filters.TAB).click(); - cy.get(os.layersDialog.Tabs.Filters.Tree.FILTER_2).should('contain', 'East Hydrants'); + cy.get(core.Toolbar.addData.OPEN_FILE_BUTTON).click(); + cy.get(imports.importDataDialog.DIALOG).should('be.visible'); + cy.upload('smoke-tests/toolbar-right/test-state_state.xml'); + cy.get(imports.importDataDialog.NEXT_BUTTON).click(); + cy.get(imports.importStateDialog.DIALOG).should('be.visible'); + cy.get(imports.importStateDialog.CLEAR_CHECKBOX).check(); + cy.get(imports.importStateDialog.OK_BUTTON).click(); + cy.get(shared.Tree.ROW_4).should('contain', 'Police Stations Features (3)'); + cy.get(shared.Tree.ROW_5).should('contain', 'Fire Hydrants Features (747)'); + cy.get(layers.areasTab.TAB).click(); + cy.get(shared.Tree.ROW_2).should('contain', 'Aurora Hydrant Include'); + cy.get(shared.Tree.ROW_4).should('contain', 'Aurora Police Include'); + cy.get(layers.filtersTab.TAB).click(); + cy.get(shared.Tree.ROW_2).should('contain', 'East Hydrants'); // Test - cy.get(os.Toolbar.States.Menu.BUTTON).click(); - cy.get(os.Toolbar.States.Menu.menuOptions.DISABLE_STATES).click(); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Fire Hydrants Tiles'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Police Stations Tiles'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Fire Hydrants Features'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Police Stations Features'); - cy.get(os.layersDialog.Tabs.Areas.TAB).click(); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Aurora Police Include'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Aurora Police Exclude'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Aurora Hydrant Include'); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'Aurora Hydrant Exclude'); - cy.get(os.layersDialog.DIALOG).should('contain', 'No results'); - cy.get(os.layersDialog.Tabs.Filters.TAB).click(); - cy.get(os.layersDialog.DIALOG).should('not.contain', 'East Hydrants'); - cy.get(os.layersDialog.DIALOG).should('contain', 'No results'); + cy.get(core.Toolbar.States.Menu.BUTTON).click(); + cy.get(core.Toolbar.States.Menu.DISABLE_STATES).click(); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Fire Hydrants Tiles'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Police Stations Tiles'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Fire Hydrants Features'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Police Stations Features'); + cy.get(layers.areasTab.TAB).click(); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Aurora Police Include'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Aurora Police Exclude'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Aurora Hydrant Include'); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'Aurora Hydrant Exclude'); + cy.get(layers.Dialog.DIALOG).should('contain', 'No results'); + cy.get(layers.filtersTab.TAB).click(); + cy.get(layers.Dialog.DIALOG).should('not.contain', 'East Hydrants'); + cy.get(layers.Dialog.DIALOG).should('contain', 'No results'); // Clean up - cy.get(os.layersDialog.Tabs.Layers.TAB).click(); - cy.get(os.Application.PAGE).type('v'); - cy.get(os.Toolbar.Date.INPUT).clear(); - cy.get(os.Toolbar.Date.INPUT).type(Cypress.moment().format('YYYY[-]MM[-]DD')); - cy.get(os.Toolbar.Date.INPUT).type('{esc}'); + cy.get(layers.layersTab.TAB).click(); + cy.get(core.Application.PAGE).type('v'); + cy.get(core.Toolbar.Date.INPUT).clear(); + cy.get(core.Toolbar.Date.INPUT).type(Cypress.moment().format('YYYY[-]MM[-]DD')); + cy.get(core.Toolbar.Date.INPUT).type('{esc}'); }); }); describe('Search tool', function() { it('Search provider', function() { // Setup - cy.get(os.Toolbar.Search.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Search.Menu.PANEL).should('not.be.visible'); // Test - cy.get(os.Toolbar.Search.Menu.BUTTON).click(); - cy.get(os.Toolbar.Search.Menu.PANEL).should('be.visible'); - cy.get(os.Toolbar.Search.Menu.searchTypes.COORDINATES_CHECKBOX).should('be.visible'); - cy.get(os.Toolbar.Search.Menu.searchTypes.LAYERS_CHECKBOX).should('be.visible'); + cy.get(core.Toolbar.Search.Menu.BUTTON).click(); + cy.get(core.Toolbar.Search.Menu.PANEL).should('be.visible'); + cy.get(core.Toolbar.Search.Menu.searchTypes.COORDINATES_CHECKBOX).should('be.visible'); + cy.get(core.Toolbar.Search.Menu.searchTypes.LAYERS_CHECKBOX).should('be.visible'); // Clean up - cy.get(os.Toolbar.Search.Menu.BUTTON).click(); - cy.get(os.Toolbar.Search.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Search.Menu.BUTTON).click(); + cy.get(core.Toolbar.Search.Menu.PANEL).should('not.be.visible'); }); it('Search', function() { // Setup - cy.get(os.Toolbar.Search.INPUT).should('be.empty'); - cy.get(os.Toolbar.Search.Results.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Search.INPUT).should('be.empty'); + cy.get(core.Toolbar.Search.Results.PANEL).should('not.be.visible'); // Test - cy.get(os.Toolbar.Search.INPUT).type('street{enter}'); - cy.get(os.Toolbar.Search.Results.PANEL).should('be.visible'); - cy.get(os.Toolbar.Search.Results.PANEL).should('contain', 'Street Map'); - cy.get(os.Toolbar.Search.Menu.BUTTON).click(); - cy.get(os.Toolbar.Search.Menu.PANEL).should('contain', 'street (All Search Types)'); + cy.get(core.Toolbar.Search.INPUT).type('street{enter}'); + cy.get(core.Toolbar.Search.Results.PANEL).should('be.visible'); + cy.get(core.Toolbar.Search.Results.PANEL).should('contain', 'Street Map'); + cy.get(core.Toolbar.Search.Menu.BUTTON).click(); + cy.get(core.Toolbar.Search.Menu.PANEL).should('contain', 'street (All Search Types)'); // Clean up - cy.get(os.Toolbar.Search.Menu.BUTTON).click(); - cy.get(os.Toolbar.Search.Menu.PANEL).should('not.be.visible'); - cy.get(os.Toolbar.Search.CLEAR_BUTTON).click(); - cy.get(os.Toolbar.Search.Results.PANEL).should('not.be.visible'); - cy.get(os.Toolbar.Search.INPUT).should('be.empty'); + cy.get(core.Toolbar.Search.Menu.BUTTON).click(); + cy.get(core.Toolbar.Search.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Search.CLEAR_BUTTON).click(); + cy.get(core.Toolbar.Search.Results.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Search.INPUT).should('be.empty'); }); }); describe('Support menu', function() { it('Menu options', function() { // Setup - cy.get(os.Toolbar.Support.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Support.Menu.PANEL).should('not.be.visible'); // Test - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.PANEL).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.menuOptions.ABOUT).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.menuOptions.CONTROLS).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.menuOptions.SHOW_TIPS).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.menuOptions.OPENSPHERE_CAPABILITIES).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.menuOptions.VIEW_ALERTS).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.menuOptions.VIEW_LOG).should('be.visible'); - cy.get(os.Toolbar.Support.Menu.menuOptions.RESET_SETTINGS).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.PANEL).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.ABOUT).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.CONTROLS).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.SHOW_TIPS).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.OPENSPHERE_CAPABILITIES).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.VIEW_ALERTS).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.VIEW_LOG).should('be.visible'); + cy.get(core.Toolbar.Support.Menu.RESET_SETTINGS).should('be.visible'); // Clean up - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.PANEL).should('not.be.visible'); + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.PANEL).should('not.be.visible'); }); it('About', function() { // Setup - cy.get(os.aboutDialog.DIALOG).should('not.exist'); + cy.get(dialogs.aboutDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.menuOptions.ABOUT).click(); - cy.get(os.aboutDialog.DIALOG).should('be.visible'); - cy.get(os.aboutDialog.DIALOG).should('contain', 'AngularJS'); - cy.get(os.aboutDialog.DIALOG).should('contain', 'Cesium'); + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.ABOUT).click(); + cy.get(dialogs.aboutDialog.DIALOG).should('be.visible'); + cy.get(dialogs.aboutDialog.DIALOG).should('contain', 'AngularJS'); + cy.get(dialogs.aboutDialog.DIALOG).should('contain', 'Cesium'); // Clean up - cy.get(os.aboutDialog.CLOSE_BUTTON).click(); - cy.get(os.aboutDialog.DIALOG).should('not.exist'); + cy.get(dialogs.aboutDialog.CLOSE_BUTTON).click(); + cy.get(dialogs.aboutDialog.DIALOG).should('not.exist'); }); it('Controls', function() { // Setup - cy.get(os.controlsDialog.DIALOG).should('not.exist'); + cy.get(dialogs.controlsDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.menuOptions.CONTROLS).click(); - cy.get(os.controlsDialog.DIALOG).should('be.visible'); - cy.get(os.controlsDialog.DIALOG).should('contain', 'General Controls'); - cy.get(os.controlsDialog.DIALOG).should('contain', '3D Controls'); + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.CONTROLS).click(); + cy.get(dialogs.controlsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.controlsDialog.DIALOG).should('contain', 'General Controls'); + cy.get(dialogs.controlsDialog.DIALOG).should('contain', '3D Controls'); // Clean up - cy.get(os.controlsDialog.DIALOG_CLOSE).click(); - cy.get(os.controlsDialog.DIALOG).should('not.exist'); + cy.get(dialogs.controlsDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.controlsDialog.DIALOG).should('not.exist'); }); it('Onboarding', function() { // Setup - cy.get(os.welcomeToOpenSphereDialog.DIALOG).should('not.exist'); + cy.get(dialogs.welcomeToOpenSphereDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.menuOptions.SHOW_TIPS).click(); - cy.get(os.welcomeToOpenSphereDialog.DIALOG).should('be.visible'); - cy.get(os.welcomeToOpenSphereDialog.DIALOG) + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.SHOW_TIPS).click(); + cy.get(dialogs.welcomeToOpenSphereDialog.DIALOG).should('be.visible'); + cy.get(dialogs.welcomeToOpenSphereDialog.DIALOG) .should('contain', 'OpenSphere is a map-driven analysis tool'); // Clean up - cy.get(os.welcomeToOpenSphereDialog.STOP_SHOWING_TIPS_BUTTON).click(); - cy.get(os.welcomeToOpenSphereDialog.DIALOG).should('not.exist'); + cy.get(dialogs.welcomeToOpenSphereDialog.STOP_SHOWING_TIPS_BUTTON).click(); + cy.get(dialogs.welcomeToOpenSphereDialog.DIALOG).should('not.exist'); }); it('OpenSphere capabilities', function() { // Setup - cy.get(os.openSphereCapabilitiesDialog.DIALOG).should('not.exist'); + cy.get(dialogs.openSphereCapabilitiesDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.menuOptions.OPENSPHERE_CAPABILITIES).click(); - cy.get(os.openSphereCapabilitiesDialog.DIALOG).should('be.visible'); - cy.get(os.openSphereCapabilitiesDialog.Tree.CAPABILITY_2) - .should('contain', 'Add Data'); - cy.get(os.openSphereCapabilitiesDialog.Tree.CAPABILITY_5).should('contain', 'Map'); - cy.get(os.openSphereCapabilitiesDialog.Tree.CAPABILITY_9).should('contain', 'Tracks'); - cy.get(os.openSphereCapabilitiesDialog.SEARCH_INPUT).should('be.empty'); - - // Clean up - cy.get(os.openSphereCapabilitiesDialog.CLOSE_BUTTON).click(); - cy.get(os.openSphereCapabilitiesDialog.DIALOG).should('not.exist'); + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.OPENSPHERE_CAPABILITIES).click(); + cy.get(dialogs.openSphereCapabilitiesDialog.DIALOG).should('be.visible'); + cy.get(dialogs.openSphereCapabilitiesDialog.DIALOG).within(function() { + cy.get(shared.Tree.ROW_2) + .should('contain', 'Add Data'); + cy.get(shared.Tree.ROW_5).should('contain', 'Map'); + cy.get(shared.Tree.ROW_9).should('contain', 'Tracks'); + cy.get(dialogs.openSphereCapabilitiesDialog.SEARCH_INPUT).should('be.empty'); + + // Clean up + cy.get(dialogs.openSphereCapabilitiesDialog.CLOSE_BUTTON).click(); + }); + + cy.get(dialogs.openSphereCapabilitiesDialog.DIALOG).should('not.exist'); }); it('Alerts', function() { // Setup - cy.get(os.alertsDialog.DIALOG).should('not.exist'); + cy.get(dialogs.alertsDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.menuOptions.VIEW_ALERTS).click(); - cy.get(os.alertsDialog.DIALOG).should('be.visible'); - cy.get(os.alertsDialog.DIALOG).should('contain', 'There are no alerts to view'); + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.VIEW_ALERTS).click(); + cy.get(dialogs.alertsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.alertsDialog.DIALOG).should('contain', 'There are no alerts to view'); // Clean up - cy.get(os.alertsDialog.DIALOG_CLOSE).click(); - cy.get(os.alertsDialog.DIALOG).should('not.exist'); + cy.get(dialogs.alertsDialog.DIALOG_CLOSE).click(); + cy.get(dialogs.alertsDialog.DIALOG).should('not.exist'); }); // https://docs.cypress.io/guides/references/trade-offs.html#Multiple-tabs @@ -290,18 +306,18 @@ describe('Toolbar right', function() { // Note that this test doesn't reset settings it('Reset settings', function() { // Setup - cy.get(os.resetSettingsDialog.DIALOG).should('not.exist'); + cy.get(dialogs.resetSettingsDialog.DIALOG).should('not.exist'); // Test - cy.get(os.Toolbar.Support.Menu.BUTTON).click(); - cy.get(os.Toolbar.Support.Menu.menuOptions.RESET_SETTINGS).click(); - cy.get(os.resetSettingsDialog.DIALOG).should('be.visible'); - cy.get(os.resetSettingsDialog.DIALOG) + cy.get(core.Toolbar.Support.Menu.BUTTON).click(); + cy.get(core.Toolbar.Support.Menu.RESET_SETTINGS).click(); + cy.get(dialogs.resetSettingsDialog.DIALOG).should('be.visible'); + cy.get(dialogs.resetSettingsDialog.DIALOG) .should('contain', 'Are you sure you want to clear your settings and reload'); // Clean up - cy.get(os.resetSettingsDialog.CANCEL_BUTTON).click(); - cy.get(os.resetSettingsDialog.DIALOG).should('not.exist'); + cy.get(dialogs.resetSettingsDialog.CANCEL_BUTTON).click(); + cy.get(dialogs.resetSettingsDialog.DIALOG).should('not.exist'); }); }); }); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 2b4c8110d..8d3e10abc 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -23,7 +23,8 @@ // // -- This is will overwrite an existing command -- // Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... }) -var os = require('./selectors.js'); +var core = require('../support/selectors/core.js'); +var layers = require('../support/selectors/layers.js'); var config = require('./index.js'); var addMatchImageSnapshotCommand = require('cypress-image-snapshot/command') .addMatchImageSnapshotCommand; @@ -33,18 +34,19 @@ addMatchImageSnapshotCommand({ failureThreshold: 0.0005, failureThresholdType: 'percent', customSnapshotsDir: 'cypress/comparisons', - blackout: [os.Toolbar.PANEL, - os.statusBar.PANEL, + blackout: [core.Toolbar.PANEL, + core.statusBar.PANEL, '.ol-overviewmap', - os.Map.ATTRIBUTION, - os.layersDialog.DIALOG, + core.Map.ATTRIBUTION, + layers.Dialog.DIALOG, '.ol-zoom', - os.Map.ROTATION_BUTTON, - os.Map.MAP_MODE_BUTTON] + core.Map.ROTATION_BUTTON, + core.Map.MAP_MODE_BUTTON] }); Cypress.Commands.add('imageComparison', function(name) { - cy.wait(2500); + cy.wait(6000); + cy.get(layers.layersTab.Tree.LOADING_SPINNER, {timeout: 20000}).should('not.be.visible'); cy.matchImageSnapshot(name); }); @@ -57,11 +59,12 @@ Cypress.Commands.add('login', function(clearLocalStorage) { indexedDB.deleteDatabase(config.IndexedDB.SETTINGS); } cy.visit(config.HIDE_TIPS); - cy.get(os.layersDialog.Tabs.Layers.Tree.Type.mapLayer.STREET_MAP_TILES, {timeout: 15000}).should('be.visible'); + cy.get(layers.layersTab.Tree.STREET_MAP_TILES, {timeout: 15000}).should('be.visible'); + cy.get(layers.layersTab.Tree.LOADING_SPINNER, {timeout: 20000}).should('not.be.visible'); }); Cypress.Commands.add('upload', function(fileName) { - cy.get(os.Application.HIDDEN_FILE_INPUT).then(function(subject) { + cy.get(core.Application.HIDDEN_FILE_INPUT).then(function(subject) { cy.fixture(fileName, 'base64') .then(Cypress.Blob.base64StringToBlob) .then(function(blob) { diff --git a/cypress/support/execute-tests.sh b/cypress/support/execute-tests.sh index faf7f8474..6c1cd6e59 100755 --- a/cypress/support/execute-tests.sh +++ b/cypress/support/execute-tests.sh @@ -44,9 +44,9 @@ function setVariables() { export SETTINGS_OS_SOURCE=config/settings.json export SETTINGS_OS_TARGET=dist/opensphere/config/settings_os.json - export ALL_TESTS=cypress/integration/** - export SMOKE_TESTS=cypress/integration/smoke-tests/** - export SINGLE_TEST=cypress/integration/ + export ALL_TESTS=** + export SMOKE_TESTS=smoke-tests/** + export TEST_PATH=cypress/integration/ export TEST_RESULT } @@ -64,14 +64,22 @@ function checkArguments() { case "$TESTS" in "all") - TEST_SPEC=$ALL_TESTS + TEST_SPECS=$TEST_PATH$ALL_TESTS ;; "smoke") - TEST_SPEC=$SMOKE_TESTS + TEST_SPECS=$TEST_PATH$SMOKE_TESTS ;; "spec") - TEST_SPEC=$SINGLE_TEST$SPEC + TEST_SPECS=$TEST_PATH$SPEC ;; + "loop") + if [ -z "$SPEC" ]; then + echo 'WARNING: Spec pattern not passed, selecting ALL tests' + TEST_SPECS=$TEST_PATH$ALL_TESTS + else + TEST_SPECS=$TEST_PATH$SPEC + fi + ;; *) if [ -z "$TESTS" ]; then if ! [ "$MODE" == "gui" ]; then @@ -79,7 +87,7 @@ function checkArguments() { exit 1 fi else - echo "ERROR: only all, smoke, or spec accepted as a valid tests argument; '$TESTS' is not valid" + echo "ERROR: only all, smoke, spec, or loop accepted as a valid tests argument; '$TESTS' is not valid" exit 1 fi ;; @@ -141,14 +149,40 @@ function startWebServer() { function runTests() { if [ "$MODE" == "cli" ]; then if [ "$ENVIRONMENT" == "ci" ]; then - echo 'INFO: starting Cypress in continuous integration environment' - $(npm bin)/cypress run --config baseUrl=http://localhost:8282/dist/opensphere --spec "$TEST_SPEC" + echo 'INFO: starting Cypress in continuous integration environment' + $(npm bin)/cypress run --config baseUrl=http://localhost:8282/dist/opensphere --spec "$TEST_SPECS" + TEST_RESULT=$? else echo 'INFO: starting Cypress in local development environment via the command line' - $(npm bin)/cypress run --spec "$TEST_SPEC" + if [ "$TESTS" == "loop" ]; then + result_counter=0 + echo 'INFO: starting test loop to check for flaky tests' + for i in 1 2 3 4 5 + do + echo "INFO: test run $i/5 starting..." + $(npm bin)/cypress run --spec "$TEST_SPECS" + last_result=$? + echo "INFO: test run $i/5 finished with code: $last_result" + result_counter=$(($result_counter + $last_result)) + done + TEST_RESULT=$result_counter + if (( $TEST_RESULT > 0)); then + if (( $TEST_RESULT == 5)); then + echo "WARNING: each test loop finished with code: 1. Tests appear to consisently FAIL." + else + echo 'WARNING: *******************' + echo "WARNING: FLAKY TESTS!! There were $TEST_RESULT failed loops out of 5 loops completed." + echo 'WARNING: *******************' + fi + else + echo 'INFO: test loop finished, all loops passed' + fi + else + $(npm bin)/cypress run --spec "$TEST_SPECS" + TEST_RESULT=$? + echo "INFO: Cypress tests finished with code: $TEST_RESULT" + fi fi - TEST_RESULT=$? - echo "INFO: Cypress tests finished with code: $TEST_RESULT" else echo 'INFO: starting Cypress in local development environment via interactive mode' $(npm bin)/cypress open @@ -198,7 +232,7 @@ ENVIRONMENT=$1 #cli or gui MODE=$2 -#all or smoke +#all, smoke, spec, loop TESTS=$3 #spec diff --git a/cypress/support/index.js b/cypress/support/index.js index 1dab465b1..7dccf0ef9 100644 --- a/cypress/support/index.js +++ b/cypress/support/index.js @@ -28,3 +28,12 @@ exports.IndexedDB = { }; exports.HIDE_TIPS = '?tips=false'; + +// Catch console error we don't care about +Cypress.on('uncaught:exception', function(err) { + if (err.message.includes('outerWidth')) { + expect(err.message).to.include('outerWidth'); + return false; + } + return true; +}); diff --git a/cypress/support/selectors.js b/cypress/support/selectors.js deleted file mode 100644 index 608446bf8..000000000 --- a/cypress/support/selectors.js +++ /dev/null @@ -1,3152 +0,0 @@ -exports.aboutDialog = { - DIALOG: '#aboutModal', - DIALOG_HEADER: '[title=\'About\']', - DIALOG_CLOSE: '#aboutModal .close', - CLOSE_BUTTON: '.btn[data-dismiss=\'modal\']' -}; - -exports.addArcServerDialog = { - DIALOG: '[label=\'Add Arc Server\']', - DIALOG_HEADER: '[title=\'Add Arc Server\']', - DIALOG_CLOSE: '[label=\'Add Arc Server\'] .close', - TITLE_INPUT: '[name=\'title\']', - URL_INPUT: '[name=\'url\']', - SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' -}; - -exports.addDataDialog = { - DIALOG: '#addData', - DIALOG_HEADER: '[title=\'Add Data\']', - DIALOG_SHOW_HELP_BUTTON: '[title=\'Show help\']', - DIALOG_CLOSE: '#addData .close', - SEARCH_INPUT: '[placeholder=\'Search available layers\']', - CLEAR_BUTTON: '[title=\'Clear the search term\']', - GROUP_BY_DROPDOWN: '[ng-model=\'addData.view\']', - MANAGE_SERVERS_BUTTON: '[title=\'Add, edit, and remove servers providing data to the application\']', - OPEN_FILE_URL_BUTTON: '[title=\'Open a local file or URL\']', - Tree: { - LAYER_WILDCARD: '#addData .slick-row', - LAYER_NODE_WILDCARD: '.js-node-toggle', - LAYER_NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - LAYER_NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - LAYER_TOGGLE_SWITCH_WILDCARD: '[title=\'Activates or deactivates the layer\']', - LAYER_IS_ON_CLASS_WILDCARD: 'c-toggle-switch-on', - LAYER_IS_OFF_CLASS_WILDCARD: 'c-toggle-switch-off', - FILTER_BUTTON_WILDCARD: '[title=\'Manage filters\']', - REMOVE_THE_FILE_BUTTON_WILDCARD: '[title=\'Remove the file\']', - LAYER_1: '#addData .slick-row:eq(0)', - LAYER_2: '#addData .slick-row:eq(1)', - LAYER_3: '#addData .slick-row:eq(2)', - LAYER_4: '#addData .slick-row:eq(3)', - LAYER_5: '#addData .slick-row:eq(4)' - }, - DESCRIPTION_PANEL: '[bind-directive=\'addData.getInfo()\']', - CLOSE_BUTTON: '[ng-click=\'addData.close()\']' -}; - -exports.addExpressionDialog = { - DIALOG: '#editfilter', - DIALOG_HEADER: '[title=\'Edit Filter\']', - DIALOG_CLOSE: '#editfilter .close', - COLUMN_DROPDOWN: '[ng-model=\'expr.column\']', - OPERATOR_DROPDOWN: '[ng-model=\'expr.op\']', - EXPRESSION_INPUT: '[ng-model=\'expr.literal\']', - OK_BUTTON: '[ng-click=\'filters.finish()\']', - CANCEL_BUTTON: '[ng-click=\'filters.cancel()\']' -}; - -exports.addFolderDialog = { - DIALOG: '[label=\'Add Folder\']', - DIALOG_HEADER: '[title=\'Add Folder\']', - DIALOG_CLOSE: '[label=\'Add Folder\'] .close', - FOLDER_LABEL_INPUT: '[name=\'title\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.addGeoServerDialog = { - DIALOG: '[label=\'Add GeoServer\']', - DIALOG_HEADER: '[title=\'Add GeoServer\']', - DIALOG_CLOSE: '[label=\'Add GeoServer\'] .close', - TITLE_INPUT: '[name=\'title\']', - URL_INPUT: '[name=\'url\']', - SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' -}; - -exports.addPlaceDialog = { - DIALOG: '#placemarkEdit', - DIALOG_HEADER: '[title=\'Add Place\']', - DIALOG_CLOSE: '#placemarkEdit .close', - NAME_INPUT: '[name=\'name\']', - DESCRIPTION_INPUT: '.CodeMirror', - POSITION_INPUT: '[ng-model=\'posText\']', - POSITION_BUTTON: '[title=\'Set the position by clicking on the map\']', - ENTERING_POSITION_BADGE: '[data-title=\'"Entering Position"\']', - ALTITUDE_INPUT: '[name=\'altitude\']', - ALTITUDE_UNITS_DROPDOWN: '[ng-model=\'ctrl.altUnits\']', - Time: { - NO_TIME: '[value=\'notime\']', - Instant: { - RADIOBUTTON: '[value=\'instant\']', - DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']', - HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']', - MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']', - SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']', - NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']', - CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']' - }, - RANGE: { - RADIOBUTTON: '[value=\'range\']', - Start: { - DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']:eq(0)', - HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']:eq(0)', - MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']:eq(0)', - SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']:eq(0)', - NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']:eq(0)', - CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']:eq(0)' - }, - End: { - DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']:eq(1)', - HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']:eq(1)', - MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']:eq(1)', - SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']:eq(1)', - NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']:eq(1)', - CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']:eq(1)' - } - }, - TIME_SELECTION_BADGE: '[ng-if=\'help\']' - }, - Accordion: { - styleOptions: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - DROPDOWN: '[ng-model=\'$parent.shape\']', - Style: { - Icon: { - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_INPUT: '[name=\'iconRotation\']', - ICON_ROTATION_BADGE: '[data-title=\'"Icon Rotation"\']' - }, - Ellipse: { - SEMI_MAJOR_INPUT: '[name=\'semiMajor\']', - SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMajorUnits\']', - SEMI_MAJOR_AXIS_BADGE: '[data-title=\'"Semi-Major Axis"\']', - SEMI_MINOR_INPUT: '[name=\'semiMinor\']', - SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMinorUnits\']', - SEMI_MINOR_AXIS_BADGE: '[data-title=\'"Semi-Minor Axis"\']', - ORIENTATION_INPUT: '[name=\'orientation\']', - ELLIPSE_ORIENTATION_BADGE: '[data-title=\'"Ellipse Orientation"\']' - }, - ellipseWithCenter: { - SEMI_MAJOR_INPUT: '[name=\'semiMajor\']', - SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMajorUnits\']', - SEMI_MAJOR_AXIS_BADGE: '[data-title=\'"Semi-Major Axis"\']', - SEMI_MINOR_INPUT: '[name=\'semiMinor\']', - SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMinorUnits\']', - SEMI_MINOR_AXIS_BADGE: '[data-title=\'"Semi-Minor Axis"\']', - ORIENTATION_INPUT: '[name=\'orientation\']', - ELLIPSE_ORIENTATION_BADGE: '[data-title=\'"Ellipse Orientation"\']', - CENTER_DROPDOWN: '[ng-change=\'ctrl.onCenterShapeChange($parent.centerShape)\']', - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_INPUT: '[name=\'iconRotation\']', - ICON_ROTATION_BADGE: '[data-title=\'"Icon Rotation"\']' - } - } - }, - labelOptions: { - Label: { - BUTTON: '[title=\'Configure how labels are displayed for the layer\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - SIZE_DROPDOWN: '[name=\'spinner\']', - ALWAYS_SHOW_LABELS_CHECKBOX: '#showLabels', - Column: { - HANDLE_WILDCARD: '[title=\'Click and Drag to move this label\']', - CHECKBOX_WILDCARD: '[ng-model=\'label.showColumn\']', - DROPDOWN_WILDCARD: '[title=\'Sets the data field used for labels\']', - REMOVE_COLUMN_BUTTON_WILDCARD: '[title=\'Remove this label\']', - ADD_COLUMN_BUTTON: '[title=\'Add a label\']', - COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' - } - } - }, - annotationOptions: { - SHOW_ANNOTATION_CHECKBOX: '[ng-attr-for=\'showAnnotation{{ctrl.uid}}\']', - SHOW_NAME_CHECKBOX: '[ng-attr-for=\'showAnnotationName{{ctrl.uid}}\']', - SHOW_DESCRIPTION_CHECKBOX: '[ng-attr-for=\'showAnnotationDescription{{ctrl.uid}}\']', - SHOW_DEFAULTTAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationDefaultTail{{ctrl.uid}}\']', - SHOW_NOTAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationNoTail{{ctrl.uid}}\']', - SHOW_LINETAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationLineTail{{ctrl.uid}}\']' - } - }, - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.advancedDialog = { - DIALOG: '[label=\'Advanced\']', - DIALOG_HEADER: '[title=\'Advanced\']', - DIALOG_CLOSE: '[label=\'Advanced\'] .close', - LAYER_DROPDOWN: '[ng-model=\'layer\']', - GROUP_BY_DROPDOWN: '[ng-model=\'order\']', - ADD_FILTER_BUTTON: '[label=\'Advanced\'] [title=\'Add a filter\']', - ADVANCED_CHECKBOX: '[title=\'Advanced mode allows more specific combinations of layers, filters, and areas\'] input', - EXPAND_ALL_BUTTON: '[title=\'Expand all\']', - COLLAPSE_ALL_BUTTON: '[title=\'Collapse all\']', - RESET_BUTTON: '[title=\'Clears all the checkboxes in the form\']', - Tree: { - LAYER_WILDCARD: '[label=\'Advanced\'] .slick-cell', - LAYER_1: '[label=\'Advanced\'] .slick-cell:eq(0)', - LAYER_2: '[label=\'Advanced\'] .slick-cell:eq(1)', - LAYER_3: '[label=\'Advanced\'] .slick-cell:eq(2)', - LAYER_4: '[label=\'Advanced\'] .slick-cell:eq(3)', - LAYER_5: '[label=\'Advanced\'] .slick-cell:eq(4)', - LAYER_NODE_WILDCARD: '.js-node-toggle', - LAYER_NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - LAYER_NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - LAYER_TOGGLE_SWITCH_WILDCARD: '[label=\'Advanced\'] .c-tristate', - LAYER_IS_ON_CLASS_WILDCARD: '[label=\'Advanced\'] .c-tristate-off', - LAYER_IS_OFF_CLASS_WILDCARD: '[label=\'Advanced\'] .c-tristate-on', - OPERATOR_DROPDOWN_WILDCARD: '[title=\'Whether to pass all filters (AND) or any filter (OR)\']', - QUERY_EXCLUDE_TOGGLE_BADGE_WILDCARD: '[title=\'Toggles between querying and excluding the area\']', - EDIT_LAYER_BUTTON_WILDCARD: '[title=\'Edit\']', - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove\']' - }, - EXPORT_BUTTON: '[ng-click=\'comboCtrl.launchExport()\']', - Import: { - BUTTON: '[ng-click=\'comboCtrl.launchExport()\']', - Menu: { - BUTTON: '[ng-click=\'comboCtrl.openImportMenu()\']', - menuOptions: { - IMPORT_FILE_URL: '[title=\'Import areas from a file or URL\']', - ENTER_COORDINATES: '[title=\'Enter coordinates to load data for a box, circle, or polygon\']', - WHOLE_WORLD: '[title=\'Load data for the whole world\']' - } - } - }, - APPLY_BUTTON: '[ng-click=\'comboCtrl.apply()\']', - CLOSE_BUTTON: '[ng-click=\'comboCtrl.close()\']' -}; - -exports.alertsDialog = { - DIALOG: '#alerts', - DIALOG_HEADER: '[title=\'Alerts\']', - DIALOG_CLOSE: '#alerts .close', - ALERT_WILDCARD: '.alert', - SHOW_POPUPS_CHECKBOX: '#alerts__show-popups', - CLEAR_ALERTS_BUTTON: '[title=\'Clear all alerts\']' -}; - -exports.Application = { - PAGE: 'body', - HIDDEN_FILE_INPUT: 'input[type=\'file\']' -}; - -exports.chooseAnIconDialog = { - DIALOG: '#iconselector', - DIALOG_HEADER: '[title=\'Choose an Icon\']', - DIALOG_CLOSE: '#iconselector .close', - Pins: { - YELLOW_PUSHPIN: '[title=\'Yellow Push Pin\']', - GREEN_PUSHPIN: '[title=\'Green Push Pin\']', - WHITE_PUSHPIN: '[title=\'White Push Pin\']', - ARROW: '[title=\'Arrow\']', - CIRCLE: '[title=\'Circle\']', - PLANE: '[title=\'Airports\']', - BOAT: '[title=\'Ferry\']', - CHOPPER: '[title=\'Heliport\']', - HOSPITAL: '[title=\'Hospitals\']', - CAUTION: '[title=\'Caution\']' - }, - CURRENT_PIN: '.img-fluid', - OK_BUTTON: '[ng-click=\'selector.okay()\']', - CANCEL_BUTTON: '[ng-click=\'selector.okay()\']' -}; - -exports.chooseAreaDialog = { - DIALOG: '[label=\'Choose Area\']', - DIALOG_HEADER: '[title=\'Choose Area\']', - AREA_DROPDOWN: '[ng-model=\'area\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-click=\'confirm.cancel()\']' -}; - -exports.chooseATrackDialog = { - DIALOG: '[label=\'Choose a Track\']', - DIALOG_HEADER: '[title=\'Choose a Track\']', - TRACK_DROPDOWN: '[ng-model=\'confirm.track\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.chooseTrackSortColumnDialog = { - DIALOG: '[label=\'Choose Track Sort Column\']', - DIALOG_HEADER: '[title=\'Choose Track Sort Column\']', - TRACK_DROPDOWN: '[ng-model=\'confirm.column\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.clearDialog = { - DIALOG: '#clear', - DIALOG_HEADER: '[title=Clear]', - DIALOG_CLOSE: '[label=Clear] .close', - OK_BUTTON: '[ng-click=\'clear.accept()\']', - CANCEL_BUTTON: '[ng-click=\'clear.cancel()\']', - Items: { - ALL: ':contains(\'All\').custom-control', - EXCLUSION_AREAS: ':contains(\'Exclusion Areas\').custom-control', - LAYER_AREA_FILTER_QUERY_COMBINATIONS: ':contains(\'Layer/Area/Filter query combinations\').custom-control', - LAYERS: ':contains(\'Layers\').custom-control', - MAP_POSITION: ':contains(\'Map Position\').custom-control', - NONQUERY_FEATURES: ':contains(\'Non-query Features\').custom-control', - QUERY_AREAS: ':contains(\'Query_Areas\').custom-control', - STATES: ':contains(\'States\').custom-control' - } -}; - -exports.copyCoordinatesDialog = { - DIALOG: '#copyPosition', - DIALOG_HEADER: '[title=\'Copy Coordinates\']', - DIALOG_TEXT: '.container-fluid', - OK_BUTTON: '[ng-click=\'copyPosition.close()\']' -}; - -exports.controlsDialog = { - DIALOG: '#controlsHelp', - DIALOG_HEADER: '[title=\'Controls\']', - DIALOG_CLOSE: '#controlsHelp .close', - DIALOG_TEXT: '#controlsHelp .js-window__wrapper' -}; - -exports.createBufferRegionDialog = { - DIALOG: '#Buffer', - DIALOG_HEADER: '[title=\'Create Buffer Region\']', - DIALOG_CLOSE: '#Buffer .close', - TITLE_INPUT: '[name=\'title\']', - TITLE_BADGE: '[ng-if=\'help.title\']', - DESCRIPTION_INPUT: '[name=\'description\']', - DESCRIPTION_BADGE: '[ng-if=\'help.description\']', - TAGS_INPUT: '[ng-model=\'config.tags\']', - TAGS_BADGE: '[ng-if=\'help.tags\']', - BUFFER_DISTANCE_INPUT: '[name=\'distance\']', - BUFFER_DISTANCE_BADGE: '[x-content=\'buffer.help.distance\']', - LIVE_PREVIEW_CHECKBOX: '[name=\'liveEnabled\']', - LIVE_PREVIEW_BADGE: '[x-content=\'buffer.livePreviewContent\']', - OK_BUTTON: '[ng-click=\'buffer.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'buffer.cancel()\']' -}; - -exports.createBufferRegionsDialog = { - DIALOG: '#Buffer', - DIALOG_HEADER: '[title=\'Create Buffer Regions\']', - DIALOG_CLOSE: '#Buffer .close', - TITLE_COLUMN_DROPDOWN: '[ng-model=\'config.titleColumn\']', - TITLE_COLUMN_BADGE: '[ng-if=\'help.titleColumn\']', - DESCRIPTION_COLUMN_DROPDOWN: '[ng-model=\'config.descColumn\']', - DESCRIPTION_COLUMN_BADGE: '[ng-if=\'help.descColumn\']', - DESCRIPTION_INPUT: '[name=\'description\']', - DESCRIPTION_BADGE: '[ng-if=\'help.description\']', - TAGS_COLUMN_DROPDOWN: '[ng-model=\'config.tagsColumn\']', - TAGS_COLUMN_BADGE: '[ng-if=\'help.tagsColumn\']', - TAGS_INPUT: '[name=\'tags\']', - TAGS_BADGE: '[ng-if=\'help.tags\']', - BUFFER_DISTANCE_INPUT: '[name=\'distance\']', - BUFFER_DISTANCE_BADGE: '[x-title=\'"Buffer Distance"\']', - DISTANCE_UNITS_DROPDOWN: '[name=\'units\']', - DISTANCE_UNITS_BADGE: '[x-content=\'buffer.help.units\']', - LIVE_PREVIEW_CHECKBOX: '[name=\'liveEnabled\']', - LIVE_PREVIEW_BADGE: '[x-content=\'buffer.livePreviewContent\']', - UPDATE_PREVIEW_BUTTON: '[ng-click=\'buffer.updatePreview(true)\']', - USE_SELECTED_FEATURES_CHECKBOX: '[name=\'buffer.useSelected\']', - SOURCE_CHECKBOX_WILDCARD: '[name=\'sourcelist\'] [name=\'items\']', - OK_BUTTON: '[ng-click=\'buffer.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'buffer.cancel()\']' -}; - -exports.createColumnAssociationDialog = { - DIALOG: '#columnmappingform', - DIALOG_HEADER: '[title=\'Create Column Association\']', - DIALOG_CLOSE: '#columnmappingform .close', - NAME_INPUT: '[name=\'name\']', - DESCRIPTION_INPUT: '[name=\'description\']', - ADD_ASSOCIATION_BUTTON: '[ng-click=\'cmFormCtrl.add()\']', - Associations: { - LAYER_DROPDOWN_WILDCARD: '.select2-chosen', - COLUMN_DROPDOWN_WILDCARD: '.select2-chosen', - REMOVE_EXPRESSION_BUTTON_WILDCARD: '[title=\'Remove this expression\']', - LAYER_1_DROPDOWN: '.select2-chosen:eq(0)', - COLUMN_1_DROPDOWN: '.select2-chosen:eq(0)', - EXPRESSION_1_REMOVE_BUTTON: '[title=\'Remove this expression\']:eq(0)', - LAYER_2_DROPDOWN: '.select2-chosen:eq(1)', - COLUMN_2_DROPDOWN: '.select2-chosen:eq(1)', - EXPRESSION_2_REMOVE_BUTTON: '[title=\'Remove this expression\']:eq(1)' - }, - OK_BUTTON: '[ng-click=\'cmFormCtrl.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'cmFormCtrl.cancel()\']' -}; - -exports.createFeatureActionDialog = { - DIALOG: 'editfeatureaction', - DIALOG_HEADER: '[title=\'Create Feature Action\']', - DIALOG_CLOSE: '#editfeatureaction .close', - TITLE_INPUT: '#filterTitle', - DESCRIPTION_INPUT: '#filterDesc', - TAGS_INPUT: '#filterTags', - Basic: { - ADD_EXPRESSION_BUTTON: '[title=\'Adds a new expression to the filter\']', - MATCH_ALL_RADIO_BUTTON: '[ng-model=\'root.grouping\'][value=\'And\']', - MATCH_ANY_RADIO_BUTTON: '[ng-model=\'root.grouping\'][value=\'Or\']', - COLUMN_DROPDOWN_WILDCARD: '[ng-model=\'expr.column\']', - OPERATOR_DROPDOWN_WILDCARD: '[ng-model=\'expr.op\']', - VALUE_DROPDOWN_WILDCARD: '[name=\'literal\']', - EXPRESSION_1_COLUMN_DROPDOWN: '[ng-model=\'expr.column\']:eq(0)', - EXPRESSION_1_OPERATOR_DROPDOWN: '[ng-model=\'expr.op\']:eq(0)', - EXPRESSION_1_VALUE_DROPDOWN: '[name=\'literal\']:eq(0)', - EXPRESSION_2_COLUMN_DROPDOWN: '[ng-model=\'expr.column\']:eq(1)', - EXPRESSION_2_OPERATOR_DROPDOWN: '[ng-model=\'expr.op\']:eq(1)', - EXPRESSION_2_VALUE_DROPDOWN: '[name=\'literal\']:eq(1)' - }, - Advanced: { - ADD_EXPRESSION_BUTTON: '[title=\'Adds a new expression to the filter\']', - ADD_GROUP_BUTTON: '[title=\'Adds a new group to the filter\']', - REMOVE_ELEMENT_BUTTON: '[title=\'Removes an element from the filter\']', - GROUPING_NODE_WILDCARD: '.c-node-toggle', - GROUPING_OPERATOR_DROPDOWN_WILDCARD: '[ng-model=\'item.grouping\']', - GROUPING_REMOVE_BUTTON_WILDCARD: '[ng-click=\'groupUi.remove()\'] [title=\'Remove the expression\']', - GROUPING_1_NODE_WILDCARD: '.c-node-toggle:eq(0)', - GROUPING_1_OPERATOR_DROPDOWN_WILDCARD: '[ng-model=\'item.grouping\']:eq(0)', - GROUPING_1_REMOVE_BUTTON_WILDCARD: '[ng-click=\'groupUi.remove()\'] [title=\'Remove the expression\']:eq(0)', - GROUPING_2_NODE_WILDCARD: '.c-node-toggle:eq(1)', - GROUPING_2_OPERATOR_DROPDOWN_WILDCARD: '[ng-model=\'item.grouping\']:eq(1)', - GROUPING_2_REMOVE_BUTTON_WILDCARD: '[ng-click=\'groupUi.remove()\'] [title=\'Remove the expression\']:eq(1)', - EXPRESSION_TEXT_WILDCARD: '#editfeatureaction .grid-canvas .text-truncate', - EXPRESSION_EDIT_BUTTON_WILDCARD: '[title=\'Edit the expression\']', - EXPRESSION_REMOVE_BUTTON_WILDCARD: '[title=\'Remove the expression\']', - EXPRESSION_1_TEXT: '#editfeatureaction .grid-canvas .text-truncate:eq(0)', - EXPRESSION_1_EDIT_BUTTON: '[title=\'Edit the expression\']:eq(0)', - EXPRESSION_1_REMOVE_BUTTON: '[title=\'Remove the expression\']:eq(0)', - EXPRESSION_2_TEXT: '#editfeatureaction .grid-canvas .text-truncate:eq(1)', - EXPRESSION_2_EDIT_BUTTON: '[title=\'Edit the expression\']:eq(1)', - EXPRESSION_2_REMOVE_BUTTON: '[title=\'Remove the expression\']:eq(1)' - }, - ADD_ACTION_BUTTON: '[title=\'Add a new action\']', - SET_LABEL_DROPDOWN: '[ng-model=\'action.id\']', - CONFIGURE_ACTION_BUTTON: '[title=\'Configure the action\']', - OK_BUTTON: '[ng-click=\'ctrl.finish()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.cancel()\']' -}; - -exports.customDateTimeFormatsDialog = { - DIALOG: '[label=\'Custom Date/Time Formats\']', - DIALOG_HEADER: '[title=\'Custom Date/Time Formats\']', - DIALOG_CLOSE: '[label=\'Custom Date/Time Formats\'] .close', - DIALOG_TEXT: '[label=\'Custom Date/Time Formats\'] .modal-body', - CLOSE_BUTTON: '[ng-click=\'th.close()\']' -}; - -exports.descriptionInfoDialog = { - DIALOG: '[data-testid=\'descriptioninfo\']', - CONTENT: '[data-testid=\'descriptioninfocontent\']', - CLOSE_BUTTON: '[ng-click=\'windowCtrl.close(true)\']' -}; - -exports.editArcServerDialog = { - DIALOG: '[label=\'Edit Arc Server\']', - DIALOG_HEADER: '[title=\'Edit Arc Server\']', - DIALOG_CLOSE: '[label=\'Edit Arc Server\'] .close', - TITLE_INPUT: '[title=\'The title for the server\']', - URL_INPUT: '[name=\'url\']', - SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' -}; - -exports.editColumnAssociationDialog = { - DIALOG: '#columnmappingform', - DIALOG_HEADER: '[title=\'Create Column Association\']', - DIALOG_CLOSE: '#columnmappingform .close', - NAME_INPUT: '[name=\'name\']', - DESCRIPTION_INPUT: '[name=\'description\']', - ADD_ASSOCIATION_BUTTON: '[ng-click=\'cmFormCtrl.add()\']', - Associations: { - LAYER_DROPDOWN_WILDCARD: '.select2-chosen', - COLUMN_DROPDOWN_WILDCARD: '.select2-chosen', - REMOVE_EXPRESSION_BUTTON_WILDCARD: '[title=\'Remove this expression\']', - LAYER_1_DROPDOWN: '.select2-chosen:eq(0)', - COLUMN_1_DROPDOWN: '.select2-chosen:eq(0)', - EXPRESSION_1_REMOVE_BUTTON: '[title=\'Remove this expression\']:eq(0)', - LAYER_2_DROPDOWN: '.select2-chosen:eq(1)', - COLUMN_2_DROPDOWN: '.select2-chosen:eq(1)', - EXPRESSION_2_REMOVE_BUTTON: '[title=\'Remove this expression\']:eq(1)' - }, - OK_BUTTON: '[ng-click=\'cmFormCtrl.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'cmFormCtrl.cancel()\']' -}; - -exports.editGeoServerDialog = { - DIALOG: '[label=\'Edit GeoServer\']', - DIALOG_HEADER: '[label=\'Edit GeoServer\'] [ng-class=\'headerClass\']', - DIALOG_CLOSE: '[label=\'Edit GeoServer\'] .close', - TITLE_INPUT: '[title=\'The title for the server\']', - URL_INPUT: '[name=\'url\']', - SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' -}; - -exports.editParametersDialog = { - DIALOG: '#editParams', - DIALOG_HEADER: '[title=\'Edit Parameters\']', - DIALOG_CLOSE: '#editParams .close', - URL_INPUT: '[placeholder=\'Server URL\']', - ADD_PARAMETER_BUTTON: '[title=\'Add a new parameter row\']', - REMOVE_PARAMETER_BUTTON: '[title=\'Remove the selected parameter row\']', - GRID: '[options=\'ctrl.gridOptions\']', - APPLY_BUTTON: '[title=\'Apply parameter changes and refresh the layer.\']', - CANCEL_BUTTON: '[title=\'Cancel the parameter edit, discarding all changes.\']' -}; - -exports.editPlaceDialog = { - DIALOG: '#placemarkEdit', - DIALOG_HEADER: '[title=\'Add Place\']', - DIALOG_CLOSE: '#placemarkEdit .close', - NAME_INPUT: '[name=\'name\']', - DESCRIPTION_INPUT: '.CodeMirror', - POSITION_INPUT: '[ng-model=\'posText\']', - POSITION_BUTTON: '[title=\'Set the position by clicking on the map\']', - ENTERING_POSITION_BADGE: '[data-title=\'"Entering Position"\']', - ALTITUDE_INPUT: '[name=\'altitude\']', - ALTITUDE_UNITS_DROPDOWN: '[ng-model=\'ctrl.altUnits\']', - Time: { - NO_TIME: '[value=\'notime\']', - Instant: { - RADIOBUTTON: '[value=\'instant\']', - DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']', - HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']', - MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']', - SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']', - NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']', - CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']' - }, - RANGE: { - RADIOBUTTON: '[value=\'range\']', - Start: { - DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']:eq(0)', - HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']:eq(0)', - MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']:eq(0)', - SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']:eq(0)', - NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']:eq(0)', - CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']:eq(0)' - }, - End: { - DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']:eq(1)', - HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']:eq(1)', - MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']:eq(1)', - SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']:eq(1)', - NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']:eq(1)', - CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']:eq(1)' - } - }, - TIME_SELECTION_BADGE: '[ng-if=\'help\']' - }, - Accordion: { - styleOptions: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - DROPDOWN: '[ng-model=\'$parent.shape\']', - Style: { - Icon: { - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_INPUT: '[name=\'iconRotation\']', - ICON_ROTATION_BADGE: '[data-title=\'"Icon Rotation"\']' - }, - Ellipse: { - SEMI_MAJOR_INPUT: '[name=\'semiMajor\']', - SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMajorUnits\']', - SEMI_MAJOR_AXIS_BADGE: '[data-title=\'"Semi-Major Axis"\']', - SEMI_MINOR_INPUT: '[name=\'semiMinor\']', - SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMinorUnits\']', - SEMI_MINOR_AXIS_BADGE: '[data-title=\'"Semi-Minor Axis"\']', - ORIENTATION_INPUT: '[name=\'orientation\']', - ELLIPSE_ORIENTATION_BADGE: '[data-title=\'"Ellipse Orientation"\']' - }, - ellipseWithCenter: { - SEMI_MAJOR_INPUT: '[name=\'semiMajor\']', - SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMajorUnits\']', - SEMI_MAJOR_AXIS_BADGE: '[data-title=\'"Semi-Major Axis"\']', - SEMI_MINOR_INPUT: '[name=\'semiMinor\']', - SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMinorUnits\']', - SEMI_MINOR_AXIS_BADGE: '[data-title=\'"Semi-Minor Axis"\']', - ORIENTATION_INPUT: '[name=\'orientation\']', - ELLIPSE_ORIENTATION_BADGE: '[data-title=\'"Ellipse Orientation"\']', - CENTER_DROPDOWN: '[ng-change=\'ctrl.onCenterShapeChange($parent.centerShape)\']', - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_INPUT: '[name=\'iconRotation\']', - ICON_ROTATION_BADGE: '[data-title=\'"Icon Rotation"\']' - } - } - }, - labelOptions: { - Label: { - BUTTON: '[title=\'Configure how labels are displayed for the layer\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - SIZE_DROPDOWN: '[name=\'spinner\']', - ALWAYS_SHOW_LABELS_CHECKBOX: '#showLabels', - Column: { - HANDLE_WILDCARD: '[title=\'Click and Drag to move this label\']', - CHECKBOX_WILDCARD: '[ng-model=\'label.showColumn\']', - DROPDOWN_WILDCARD: '[title=\'Sets the data field used for labels\']', - REMOVE_COLUMN_BUTTON_WILDCARD: '[title=\'Remove this label\']', - ADD_COLUMN_BUTTON: '[title=\'Add a label\']', - COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' - } - } - }, - annotationOptions: { - SHOW_ANNOTATION_CHECKBOX: '[ng-attr-for=\'showAnnotation{{ctrl.uid}}\']', - SHOW_NAME_CHECKBOX: '[ng-attr-for=\'showAnnotationName{{ctrl.uid}}\']', - SHOW_DESCRIPTION_CHECKBOX: '[ng-attr-for=\'showAnnotationDescription{{ctrl.uid}}\']', - SHOW_DEFAULTTAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationDefaultTail{{ctrl.uid}}\']', - SHOW_NOTAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationNoTail{{ctrl.uid}}\']', - SHOW_LINETAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationLineTail{{ctrl.uid}}\']' - } - }, - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.enterAreaCoordinatesDialog = { - DIALOG: '[label=\'Enter Area Coordinates\']', - DIALOG_HEADER: '[title=\'Enter Area Coordinates\']', - DIALOG_CLOSE: '[label=\'Enter Area Coordinates\'] .close', - boundingBox: { - NAME_INPUT: '[name=\'name\']', - LONGITUDE_FIRST_CHECKBOX: '[name=\'lonFirst\']', - CORNER_1_INPUT: '[name=\'pos\']:eq(0)', - CORNER_1_BADGE: '[data-title=\'"Entering Position"\']:eq(0)', - CORNER_2_INPUT: '[name=\'pos\']:eq(0)', - CORNER_2_BADGE: '[data-title=\'"Entering Position"\']:eq(0)' - }, - Circle: { - NAME_INPUT: '[name=\'name\']', - LONGITUDE_FIRST_CHECKBOX: '[name=\'lonFirst\']', - CENTER_INPUT: '[name=\'pos\']', - CENTER_BADGE: '[data-title=\'"Entering Position"\']', - RADIUS_INPUT: '[name=\'radius\]', - RADIUS_UNITS_DROPDOWN: '[ng-model=\'ctrl.radiusUnits\']' - }, - Polygon: { - NAME_INPUT: '[name=\'name\']', - LONGITUDE_FIRST_CHECKBOX: '[name=\'lonFirst\']', - COORDINATES_INPUT: '[name=\'coordinates\']', - COORDINATES_BADGE: '[data-title=\'"Entering Coordinates"\']' - }, - OK_BUTTON: '[ng-click=\'ctrl.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'confirm.cancel()\']' -}; - -exports.exportColumnAssociationsDialog = { - DIALOG: '[label=\'Export Column Associations\']', - DIALOG_HEADER: '[title=\'Export Column Associations\']', - DIALOG_CLOSE: '[label=\'Export Column Associations\'] .close', - NAME_INPUT: '[name=\'title\']', - SAVE_TO_DROPDOWN: '[name=\'persister\']', - EXPORT_ALL_RADIO_BUTTON: '[name=\'timeTypeRadios\']:eq(0)', - EXPORT_SELECTED_RADIO_BUTTON: '[name=\'timeTypeRadios\']:eq(0)', - OK_BUTTON: '[ng-click=\'cmExportCtrl.accept()\']', - CANCEL_BUTTON: '[ng-click=\'cmExportCtrl.close()\']' -}; - -exports.exportDataDialog = { - DIALOG: '#export', - DIALOG_HEADER: '[title=\'Export Data\']', - DIALOG_CLOSE: '#export .close', - NAME_INPUT: '[name=\'title\']', - SAVE_TO_DROPDOWN: '[ng-model=\'persister\']', - TYPE_DROPDOWN: '[ng-model=\'exporter\']', - EXPORT_SELECTED_FEATURES_CHECKBOX: '#js-export-options__useselected', - SOURCE_CHECKBOX_WILDCARD: '#export [name=\'items\']', - OK_BUTTON: '[ng-click=\'exportdialog.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'exportdialog.cancel()\']' -}; - -exports.exportFeatureActionsDialog = { - DIALOG: '#filteractionexport', - DIALOG_HEADER: '[title=\'Export Feature Actions\']', - DIALOG_CLOSE: '#filteractionexport .close', - NAME_INPUT: '[name=\'title\']', - EXPORT_ACTIVE_RADIO_BUTTON: '[name=\'exportmode\']:eq(0)', - EXPORT_SELECTED_RADIO_BUTTON: '[name=\'exportmode\']:eq(1)', - EXPORT_ALL_RADIO_BUTTON: '[name=\'exportmode\']:eq(2)', - OK_BUTTON: '[ng-click=\'ctrl.save()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.cancel()\']' -}; - -exports.exportHeatmapDialog = { - DIALOG: '#exportDialog', - DIALOG_HEADER: '[title=\'Export: Heatmap - load-data-file-test-features.kmz.kmz\']', - DIALOG_CLOSE: '#exportDialog .close', - NAME_INPUT: '[name=\'title\']', - SAVE_TO_DROPDOWN: '[ng-model=\'persister\']', - OK_BUTTON: '[ng-click=\'exportdialog.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'exportdialog.cancel()\']' -}; - -exports.exportPlacesDialog = { - DIALOG: '[label=\'Export Places\']', - DIALOG_HEADER: '[title=\'Export Places\']', - DIALOG_CLOSE: '[label=\'Export Places\'] .close', - NAME_INPUT: '[name=\'title\']', - SAVE_TO_DROPDOWN: '[ng-model=\'treeExport.persister\']', - COMPRESS_AS_KML_CHECKBOX: '#js-kmlexport__compress', - USE_FEATURE_COLORS: '#js-kmlexport__useItemColor', - EXPORT_ELLIPSES: '#js-kmlexport__exportEllipses', - DEFAULT_ICON_BUTTON: '[ng-click=\'iconPicker.show()\']', - OK_BUTTON: '[ng-click=\'treeExport.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'treeExport.cancel()\']' -}; - -exports.featureActionsDialog = { - DIALOG: ':contains(\'Feature Actions\').modal', - DIALOG_HEADER: ':contains("Feature Actions").modal-header', - DIALOG_CLOSE: ':contains("Feature Actions")>.close', - SEARCH_INPUT: '[ng-change=\'ctrl.search()\']', - CLEAR_BUTTON: '[title=\'Clear the search term\'][ng-click=\'ctrl.clearSearch()\']', - GROUP_BY_DROPDOWN: '[ng-change=\'ctrl.search()\'][ng-options=\'key for (key, value) in views\']', - CREATE_BUTTON: '[ng-click=\'ctrl.editEntry()\']', - FEATURE_ACTIONS_BADGE: '[x-title=\'helpTitle\']', - featureAction: { - TOGGLE_CHECKBOX_WILDCARD: '[title=\'If the action should automatically execute against loaded data\']', - TEXT_WILDCARD: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] .text-truncate span', - COPY_BUTTON_WILDCARD: '[title=\'Copy the action\']', - EDIT_BUTTON_WILDCARD: '[title=\'Edit the action\']', - REMOVE_BUTTON_WILDCARD: '[title=\'Remove the action\']', - FEATURE_1_TOGGLE_CHECKBOX_WILDCARD: '[title=\'If the action should automatically execute against ' + - 'loaded data\']:eq(0)', - FEATURE_1_TEXT_WILDCARD: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] ' + - '.text-truncate span:eq(0)', - FEATURE_1_COPY_BUTTON_WILDCARD: '[title=\'Copy the action\']:eq(0)', - FEATURE_1_EDIT_BUTTON_WILDCARD: '[title=\'Edit the action\']:eq(0)', - FEATURE_1_REMOVE_BUTTON_WILDCARD: '[title=\'Remove the action\']:eq(0)', - FEATURE_2_TOGGLE_CHECKBOX_WILDCARD: '[title=\'If the action should automatically execute against ' + - 'loaded data\']:eq(1)', - FEATURE_2_TEXT_WILDCARD: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] ' + - '.text-truncate span:eq(1)', - FEATURE_2_COPY_BUTTON_WILDCARD: '[title=\'Copy the action\']:eq(1)', - FEATURE_2_EDIT_BUTTON_WILDCARD: '[title=\'Edit the action\']:eq(1)', - FEATURE_2_REMOVE_BUTTON_WILDCARD: '[title=\'Remove the action\']:eq(1)', - FEATURE_3_TOGGLE_CHECKBOX_WILDCARD: '[title=\'If the action should automatically execute against ' + - 'loaded data\']:eq(2)', - FEATURE_3_TEXT_WILDCARD: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] ' + - '.text-truncate span:eq(2)', - FEATURE_3_COPY_BUTTON_WILDCARD: '[title=\'Copy the action\']:eq(2)', - FEATURE_3_EDIT_BUTTON_WILDCARD: '[title=\'Edit the action\']:eq(2)', - FEATURE_3_REMOVE_BUTTON_WILDCARD: '[title=\'Remove the action\']:eq(2)' - }, - EXPORT_BUTTON: '[ng-click=\'ctrl.launchExport()\']', - IMPORT_BUTTON: '[ng-click=\'ctrl.launchImport()\']', - APPLY_BUTTON: '[ng-click=\'ctrl.apply()\']', - CLOSE_BUTTON: '[ng-click=\'ctrl.close()\']' -}; - -exports.featureInfoDialog = { - DIALOG: '#featureInfo', - DIALOG_HEADER: '#featureInfo [title=\'Feature Info\']', - DIALOG_CLOSE: '#featureInfo .close', - SEARCH_INPUT: '[placeholder=\'Search features\']', - CLEAR_BUTTON: '#featureInfo [title=\'Clear the search term\']', - Grid: { - FEATURE_TEXT_WILDCARD: '#featureInfo .slick-cell.r1', - FEATURE_1_TEXT: '#featureInfo .slick-cell.r1:eq(0)', - FEATURE_2_TEXT: '#featureInfo .slick-cell.r1:eq(1)', - FEATURE_3_TEXT: '#featureInfo .slick-cell.r1:eq(2)', - FEATURE_4_TEXT: '#featureInfo .slick-cell.r1:eq(3)', - FEATURE_5_TEXT: '#featureInfo .slick-cell.r1:eq(4)' - }, - FEATURE_NAME_TEXT: '[ng-attr-title=\'{{info.title}}\']', - COORDINATES_TEXT: '[ng-bind-html=\'simpleLocationCtrl.location\']', - ACTIVE_COORDINATES_CLASS: '#featureInfo .btn-group .active', - DD_BUTTON: '[title=\'Display in Decimal Degrees\']', - DMS_BUTTON: '[title=\'Display in Degrees Minutes Seconds\']', - DDM_BUTTON: '[title=\'Display in Degrees Decimal Minutes\']', - MGRS_BUTTON: '[title=\'Display in Military Grid Reference System\']', - FEATURE_TEXT: '[items=\'activeTab\']' -}; - -exports.fileExistsDialog = { - DIALOG: '[label=\'File Exists!\']', - DIALOG_HEADER: '[title=\'File Exists!\']', - SAVE_RADIO_BUTTON: '[value=\'saveNew\']', - REPLACE_PREVIOUS_BUTTON: '[value=\'replace\']', - REPLACE_REIMPORT_BUTTON: '[value=\'replaceAndImport\']', - OK_BUTTON: '[ng-click=\'confirm.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'confirm.cancel()\']' -}; - -exports.geoJSONAreaImportDialog = { - DIALOG: '[label=\'GeoJSON Area Import\']', - DIALOG_HEADER: '[title=\'GeoJSON Area Import\']', - DIALOG_CLOSE: '[label=\'GeoJSON Area Import\'] .close', - Tabs: { - areaOptions: { - TITLE_COLUMN_INPUT: '[ng-model=\'config.titleColumn\']', - DESCRIPTION_COLUMN_DROPDOWN: '[ng-model=\'config.descColumn\']', - DESCRIPTION_INPUT: '[name=\'description\']', - TAGS_COLUMN_DROPDOWN: '[ng-model=\'config.tagsColumn\']', - TAGS_INPUT: '[name=\'tags\']', - MERGE_AREAS_CHECKBOX: '[name=\'merge\']' - } - }, - PREV_BUTTON: '[title=\'Previous step\']', - NEXT_BUTTON: '[title=\'Next step\']', - DONE_BUTTON: '[ng-click=\'wiz.accept()\']', - CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' -}; - -exports.historyDialog = { - DIALOG: '#history', - DIALOG_HEADER: '[title=\'History\']', - DIALOG_CLOSE: '#history .close', - COMMAND_WILDCARD: '[ng-repeat=\'command in historyView.commandHistory\']', - CLEAR_HISTORY_BUTTON: '[title=\'Clear all history\']' -}; - -exports.importCesiumIonAssetDialog = { - DIALOG: '#importIonAsset', - DIALOG_HEADER: '[title=\'Import Cesium Ion Asset\']', - DIALOG_CLOSE: '#importIonAsset .close', - TITLE_INPUT: '[name=\'title\']', - DESCRIPTION_INPUT: '[name=\'description\']', - TAGS_INPUT: '[name=\'tags\']', - ASSET_ID_INPUT: '[name=\'assetId\']', - ACCESS_TOKEN_INPUT: '[name=\'accessToken\']', - OK_BUTTON: '[ng-click=\'ctrl.accept()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' -}; - -exports.importCSVDialog = { - DIALOG: '[label=\'CSV Import\']', - DIALOG_HEADER: '[title=\'CSV Import\']', - DIALOG_CLOSE: '[label=\'CSV Import\'] .close', - Tabs: { - Configuration: { - HEADER_ROW_SPINNER: '[name=\'spinner\']:eq(0)', - HEADER_ROW_CHECKBOX: '[ng-model=\'config.useHeader\']', - DELIMITER_DROPDOWN: '[ng-model=\'config.delimiter\']', - DATA_ROW_SPINNER: '[name=\'spinner\']:eq(0)', - COMMENT_DROPDOWN: '[ng-model=\'config.commentChar\']', - RAW_DATA_TEXT: '[x-data=\'configStep.linePreviewRows\']', - PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' - }, - Geometry: { - FORMAT_HELP_BUTTON: '[title=\'Help for location formats\']', - noGeometry: { - RADIOBUTTON: '[name=\'geomTypeRadios\':eq(0)]' - }, - separateLatLon: { - RADIOBUTTON: '[name=\'geomTypeRadios\':eq(1)]', - LATITUDE_DROPDOWN: '[ng-model=\'step.latColumn\']', - AUTO_FORMAT_CHECKBOX: '[ng-model=\'step.useGeoSeparateAutoFormat\']', - COORDINATES_FORMAT_DROPDOWN: '[ng-model=\'step.geoSeparateFormat\']', - LONGITUDE_DROPDOWN: '[ng-model=\'step.lonColumn\']', - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)', - ALTITUDE_DROPDOWN: '[name=\'altitude\']', - UNITS_DROPDOWN: '[ng-model=\'step.altitude.units\']', - BEARING_DROPDOWN: '[name=\'bearing\']', - IGNORE_ROWS_CHECKBOX: '[ng-model=\'step.ignoreMissingGeomRows\']', - ELLIPSE_FIELDS_CHECKBOX: '[ng-model=\'step.showEllipse\']', - Ellipse: { - RADIUS_CEP_DROPDOWN: '[ng-model=\'step.ellipse.radius.column\']', - RADIUS_CEP_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.radius.units\']', - SEMI_MAJOR_DROPDOWN: '[name=\'semiMajor\']', - SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMajor.units\']', - SEMI_MINOR_DROPDOWN: '[name=\'semiMinor\']', - SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMinor.units\']', - ORIENTATION_DROPDOWN: '[name=\'orientation\']' - } - }, - singleGeometry: { - RADIOBUTTON: '[name=\'geomTypeRadios\':eq(2)]', - COLUMN_DROPDOWN: '[ng-model=\'step.posColumn\']', - TYPE_DROPDOWN: '[ng-model=\'step.posType\']', - SAMPLE_TEXT: '[ng-if=\'geomStep.sample\']', - RESULT_TEXT: '.d-block:eq(1)', - ALTITUDE_DROPDOWN: '[name=\'altitude\']', - UNITS_DROPDOWN: '[ng-model=\'step.altitude.units\']', - BEARING_DROPDOWN: '[name=\'bearing\']', - IGNORE_ROWS_CHECKBOX: '[ng-model=\'step.ignoreMissingGeomRows\']', - ELLIPSE_FIELDS_CHECKBOX: '[ng-model=\'step.showEllipse\']', - Ellipse: { - RADIUS_CEP_DROPDOWN: '[ng-model=\'step.ellipse.radius.column\']', - RADIUS_CEP_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.radius.units\']', - SEMI_MAJOR_DROPDOWN: '[name=\'semiMajor\']', - SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMajor.units\']', - SEMI_MINOR_DROPDOWN: '[name=\'semiMinor\']', - SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMinor.units\']', - ORIENTATION_DROPDOWN: '[name=\'orientation\']' - } - }, - PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' - }, - Time: { - FORMAT_HELP_BUTTON: '[title=\'Help for custom date and time formats\']', - noTime: { - RADIOBUTTON: '[value=\'none\']' - }, - Instant: { - RADIOBUTTON: '[value=\'instant\']', - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - } - }, - timeRange: { - RADIOBUTTON: '[value=\'range\']', - Start: { - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']:eq(0)', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(0)', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(0)', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(0)', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(0)', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(0)' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' - } - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - }, - End: { - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']:eq(1)', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(1)', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(1)', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(1)', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(1)', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(1)' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' - } - }, - SAMPLE_TEXT: '.d-block:eq(2)', - RESULT_TEXT: '.d-block:eq(3)' - } - }, - PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' - }, - Options: { - LAYER_TITLE_INPUT: '[name=\'title\']', - DESCRIPTION_INPUT: '[name=\'desc\']', - TAGS_INPUT: '[name=\'tags\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - } - } - }, - PREV_BUTTON: '[title=\'Previous step\']', - NEXT_BUTTON: '[title=\'Next step\']', - DONE_BUTTON: '[ng-click=\'wiz.accept()\']', - CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' -}; - -exports.importDataDialog = { - DIALOG: '#urlimport', - DIALOG_HEADER: '[title=\'Import Data\']', - DIALOG_CLOSE: '#urlimport .close', - CHOOSE_A_FILE_OR_URL_FILE_INPUT: '[placeholder=\'Choose a file or enter a URL\']', - BROWSE_BUTTON: '[title=\'Choose a local file\']', - NEXT_BUTTON: '[title=\'Load the file for import\']', - CANCEL_BUTTON: '[title=\'Cancel file import\']' -}; - -exports.importGeoJSONDialog = { - DIALOG: '[label=\'Import GeoJSON\']', - DIALOG_HEADER: '[title=\'Import GeoJSON\']', - DIALOG_CLOSE: '[label=\'Import GeoJSON\'] .close', - Tabs: { - Time: { - FORMAT_HELP_BUTTON: '[title=\'Help for custom date and time formats\']', - noTime: { - RADIOBUTTON: '[value=\'none\']' - }, - Instant: { - RADIOBUTTON: '[value=\'instant\']', - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - } - }, - timeRange: { - RADIOBUTTON: '[value=\'range\']', - Start: { - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']:eq(0)', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(0)', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(0)', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(0)', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(0)', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(0)' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - } - }, - End: { - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']:eq(1)', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(1)', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(1)', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(1)', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(1)', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(1)' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - } - } - }, - PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' - }, - Options: { - LAYER_TITLE_INPUT: '[name=\'title\']', - DESCRIPTION_INPUT: '[name=\'desc\']', - TAGS_INPUT: '[name=\'tags\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - } - } - }, - PREV_BUTTON: '[title=\'Previous step\']', - NEXT_BUTTON: '[title=\'Next step\']', - DONE_BUTTON: '[ng-click=\'wiz.accept()\']', - CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' -}; - -exports.importKMLDialog = { - DIALOG: '[label=\'Import KML\']', - DIALOG_HEADER: '[title=\'Import KML\']', - DIALOG_CLOSE: '[label=\'Import KML\'] .close', - LAYER_TITLE_INPUT: '[name=\'title\']', - DESCRIPTION_INPUT: '[name=\'desc\']', - TAGS_INPUT: '[name=\'tags\']', - COLOR_PICKER: '[name=\'color\']', - OK_BUTTON: '[title=\'Import the file\']', - CANCEL_BUTTON: '[title=\'Cancel file import\']' -}; - -exports.importStateDialog = { - DIALOG: '[label=\'Import State\']', - DIALOG_HEADER: '[title=\'Import State\']', - DIALOG_CLOSE: '[title=\'Import State\'] .close', - NAME_INPUT: '[name=\'title\']', - DESCRIPTION_INPUT: '[name=\'desc\']', - TAGS_INPUT: '[name=\'tags\']', - CLEAR_CHECKBOX: '[name=\'clear\']', - Choose: { - CHECKBOX: '[name=\'showOptions\']', - ALL_CHECKBOX: '[name=\'all\']', - CURRENT_VIEW_CHECKBOX: '[title=\'Sets the current map view/position\'] [type=\'checkbox\']', - DATA_LAYERS_CHECKBOX: '[title=\'Sets the current layers\'] [type=\'checkbox\']', - EXCLUSION_AREAS_CHECKBOX: '[title=\'Sets the current exclusion areas\'] [type=\'checkbox\']', - FEATURE_ACTIONS_CHECKBOX: '[title=\'Sets the current Feature Actions\'] [type=\'checkbox\']', - FILTERS_CHECKBOX: '[title=\'Sets the current filters\'] [type=\'checkbox\']', - QUERY_AREAS_CHECKBOX: '[title=\'Sets the current query areas\'] [type=\'checkbox\']', - QUERY_ENTRIES_CHECKBOX: '[title=\'Sets the query combinations\'] [type=\'checkbox\']', - TIME_CHECKBOX: '[title=\'Sets the current timeline\'] [type=\'checkbox\']' - }, - OK_BUTTON: '[ng-click=\'stateForm.accept()\']', - CANCEL_BUTTON: '[ng-click=\'stateForm.close()\']' -}; - -exports.importURLDialog = { - DIALOG: '#urlimport', - DIALOG_HEADER: '[title=\'Import URL\']', - DIALOG_CLOSE: '#urlimport .close', - ENTER_A_URL_INPUT: '[name=\'url\']', - NEXT_BUTTON: '[title=\'Import the URL\']', - CANCEL_BUTTON: '[title=\'Cancel URL import\']' -}; - -exports.layerDescriptionDialog = { - DIALOG: '[label=\'Layer Description\']', - DIALOG_HEADER: '[title=\'Layer Description\']', - DIALOG_CLOSE: '[label=\'Layer Description\'] .close', - DIALOG_TEXT: '[name=\'confirmForm\']', - CLOSE_BUTTON: '[ng-class=\'yesButtonClass\']' -}; - -exports.layersDialog = { - DIALOG: '[label=Layers]', - DIALOG_HEADER: '.js-window__header', - DIALOG_TIPS: '[title=\'Show help\']', - DIALOG_CLOSE: '[label=Layers] .close', - Tabs: { - ACTIVE: '.active.nav-link', - Layers: { - TAB: '.nav-link:eq(0)', - GROUP_BY_DROPDOWN: '[ng-change=\'layers.onGroupByChanged()\']', - addData: { - BUTTON: '[label=\'Layers\'] [title=\'Add data to the map\']', - Menu: { - BUTTON: '[label=\'Layers\'] .dropdown-toggle', - PANEL: '#menu', - menuOptions: { - ADD_DATA: '[title=\'Browse the data catalog\']', - OPEN_FILE_OR_URL: '[title=\'Import data from a local file or a URL\']', - ADD_CESIUM_ION_ASSET: '[title=\'Loads a Cesium Ion asset in 3D mode\']', - RECENT_STREET_MAP: ':contains(\'Street Map (Map)\').text-truncate', - RECENT_WORLD_IMAGERY: ':contains(\'World Imagery (Map)\').text-truncate' - }, - Recent: { - DATA_WILDCARD: '[role=\'menuitem\']', - DATA_1: '[role=\'menuitem\']:eq(3)', - DATA_2: '[role=\'menuitem\']:eq(4)', - DATA_3: '[role=\'menuitem\']:eq(5)', - DATA_4: '[role=\'menuitem\']:eq(6)', - DATA_5: '[role=\'menuitem\']:eq(7)' - } - } - }, - SEARCH_INPUT: '[placeholder=\'Search active layers\']', - CLEAR_BUTTON: '[title=\'Clear the search term\']', - TILE_LAYERS_TOGGLE_BUTTON: '[title=\'Toggle Tile Layers\']', - FEATURE_LAYERS_TOGGLE_BUTTON: '[title=\'Toggle Feature Layers\']', - Tree: { - LAYER_WILDCARD: '.slick-row', - LAYER_NODE_WILDCARD: '.js-node-toggle', - LAYER_NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - LAYER_NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - LAYER_TOGGLE_CHECKBOX_WILDCARD: '[title=\'Show or hide the layer\']', - LAYER_IS_ACTIVE_CLASS_WILDCARD: 'c-tristate-on', - LAYER_IS_INACTIVE_CLASS_WILDCARD: 'c-tristate-off', - LAYER_1: '.slick-row:eq(0)', - LAYER_2: '.slick-row:eq(1)', - LAYER_3: '.slick-row:eq(2)', - LAYER_4: '.slick-row:eq(3)', - LAYER_5: '.slick-row:eq(4)', - LAYER_6: '.slick-row:eq(5)', - LAYER_7: '.slick-row:eq(6)', - LAYER_8: '.slick-row:eq(7)', - LAYER_9: '.slick-row:eq(8)', - LAYER_10: '.slick-row:eq(9)', - Type: { - imageLayer: { - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove the layer\']', - contextMenu: { - PANEL: '#menu', - menuOptions: { - EXPORT_HEATMAP: '[title=\'Exports the heatmap as a KML Ground Overlay\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - REMOVE: '[title=\'Removes the layer\']', - RENAME: '[title=\'Rename the layer\']' - } - }, - Accordion: { - Style: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - COLORS_DROPDOWN: '[title=\'Sets the color algorithm for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', - INTENSITY_DROPDOWN: '[name=\'intensity\'] .spinner', - INTENSITY_SLIDER: '[name=\'intensity\'] .ui-slider-handle' - } - } - }, - featureLayer: { - FEATURE_COUNT_TEXT_WILDCARD: 'span:eq(8)', - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove the layer\']', - Server: { - MANAGE_FILTERS_BUTTON_WILDCARD: '[title=\'Manage filters\']', - contextMenu: { - PANEL: '#menu', - menuOptions: { - EDIT_PARAMETERS: '[title=\'Edit request parameters for the layer\']', - GO_TO: '[title=\'Repositions the map to show the layer\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - CLEAR_SELECTION: '[title=\'Clears the selection for the layer\']', - ADD_TO_TIMELINE: '[title=\'Enables layer animation when the timeline is open\']', - REMOVE_FROM_TIMELINE: '[title=\'Disables layer animation when the timeline is open\']', - MOST_RECENT: '[title=\'Adjusts application time to show the most recent data for the layer\']', - REFRESH: '[title=\'Refreshes the layer\']', - LOCK: '[title=\'Lock the layer to prevent data from changing\']', - UNLOCK: '[title=\'Unlock the layer and refresh its data\']', - REMOVE: '[title=\'Removes the layer\']', - RENAME: '[title=\'Rename the layer\']', - SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']', - EXPORT: '[title=\'Exports data from this layer\']', - ADD_TO_TRACK: '[title=\'Adds selected features (or all features if none are selected) ' + - 'to an existing track.\']', - CREATE_BUFFER_REGION: '[title=\'Create buffer regions around loaded data\']', - CREATE_TRACK: '[title=\'Creates a new track by linking selected features (or all ' + - 'features if none are selected) in time order.\']', - FEATURE_ACTIONS: '[title=\'Perform actions on imported data matching a filter\']', - GENERATE_HEATMAP: '[title=\'Generate a heatmap of current features\']', - Copy: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item', - ALL: '[evt-type=\'layer.copy 1\']', - SHOWN: '[evt-type=\'layer.copy 2\']', - SELECTED: '[evt-type=\'layer.copy 3\']', - UNSELECTED: '[evt-type=\'layer.copy 4\']', - HIDDEN: '[evt-type=\'layer.copy 5\']' - }, - Merge: { - TOP_LEVEL: ':contains(\'Merge\').ui-menu-item', - ALL: '[evt-type=\'layer.merge 1\']', - SHOWN: '[evt-type=\'layer.merge 2\']', - SELECTED: '[evt-type=\'layer.merge 3\']', - UNSELECTED: '[evt-type=\'layer.merge 4\']', - HIDDEN: '[evt-type=\'layer.merge 5\']' - }, - Join: { - TOP_LEVEL: ':contains(\'Join\').ui-menu-item', - ALL: '[evt-type=\'layer.join 1\']', - SHOWN: '[evt-type=\'layer.join 2\']', - SELECTED: '[evt-type=\'layer.join 3\']', - UNSELECTED: '[evt-type=\'layer.join 4\']', - HIDDEN: '[evt-type=\'layer.join 5\']' - }, - SAVE_TO_PLACES: '[title=\'Copies selected features to the Saved Places layer, or all ' + - 'features if none selected\']' - } - } - }, - Local: { - contextMenu: { - PANEL: '#menu', - menuOptions: { - GO_TO: '[title=\'Repositions the map to show the layer\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - CLEAR_SELECTION: '[title=\'Clears the selection for the layer\']', - ADD_TO_TIMELINE: '[title=\'Enables layer animation when the timeline is open\']', - REMOVE_FROM_TIMELINE: '[title=\'Disables layer animation when the timeline is open\']', - MOST_RECENT: '[title=\'Adjusts application time to show the most recent data for the layer\']', - REFRESH: '[title=\'Refreshes the layer\']', - REMOVE: '[title=\'Removes the layer\']', - RENAME: '[title=\'Rename the layer\']', - SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']', - SHOW_FEATURES: '[title=\'Displays features in the layer\']', - EXPORT: '[title=\'Exports data from this layer\']', - ADD_TO_TRACK: '[title=\'Adds selected features (or all features if none are selected) ' + - 'to an existing track.\']', - CREATE_BUFFER_REGION: '[title=\'Create buffer regions around loaded data\']', - CREATE_TRACK: '[title=\'Creates a new track by linking selected features (or all ' + - 'features if none are selected) in time order.\']', - FEATURE_ACTIONS: '[title=\'Perform actions on imported data matching a filter\']', - GENERATE_HEATMAP: '[title=\'Generate a heatmap of current features\']', - Copy: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item', - ALL: '[evt-type=\'layer.copy 1\']', - SHOWN: '[evt-type=\'layer.copy 2\']', - SELECTED: '[evt-type=\'layer.copy 3\']', - UNSELECTED: '[evt-type=\'layer.copy 4\']', - HIDDEN: '[evt-type=\'layer.copy 5\']' - }, - Merge: { - TOP_LEVEL: ':contains(\'Merge\').ui-menu-item', - ALL: '[evt-type=\'layer.merge 1\']', - SHOWN: '[evt-type=\'layer.merge 2\']', - SELECTED: '[evt-type=\'layer.merge 3\']', - UNSELECTED: '[evt-type=\'layer.merge 4\']', - HIDDEN: '[evt-type=\'layer.merge 5\']' - }, - Join: { - TOP_LEVEL: ':contains(\'Join\').ui-menu-item', - ALL: '[evt-type=\'layer.join 1\']', - SHOWN: '[evt-type=\'layer.join 2\']', - SELECTED: '[evt-type=\'layer.join 3\']', - UNSELECTED: '[evt-type=\'layer.join 4\']', - HIDDEN: '[evt-type=\'layer.join 5\']' - }, - SAVE_TO_PLACES: '[title=\'Copies selected features to the Saved Places layer, or all ' + - 'features if none selected\']' - } - } - }, - Accordion: { - Style: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - DROPDOWN: '[ng-model=\'$parent.shape\']', - Style: { - Icon: { - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_CHECKBOX: '.no-text > .fa', - ROTATION_DROPDOWN: '[title=\'Sets the data field used for bearing\']' - }, - LineOfBearing: { - BEARING_DROPDOWN: '[title=\'Sets the data field used for bearing\']', - Manual: { - RADIOBUTTON: '#lengthManual', - INPUT: '#lengthColumn', - SLIDER: '[name=\'length\']', - UNITS_DROPDOWN: '.ml-1[title=\'Sets the units field used for length\']' - }, - Column: { - RADIOBUTTON: '#lengthColumn', - DROPDOWN: '[title=\'Sets the data field used for length\']', - UNITS_DROPDOWN: '[title=\'Sets the data field used for length\']', - MULTIPLER_INPUT: '[ng-model=\'columnLength\']' - }, - showArrow: { - CHECKBOX: '#showArrow', - SIZE_INPUT: '[max=\'maxSize[ctrl.arrowUnits]\']', - UNITS_DROPDOWN: '[title=\'Sets the units field used for arrow size\']' - }, - showEllipse: { - CHECKBOX: '#showEllipse', - SHOW_ELLIPSOIDS_CHECKBOX: '[name=\'showEllipsoids\']', - SHOW_GROUND_REF_CHECKBOX: '[name=\'showGroundReference\']' - }, - showError: { - CHECKBOX: '#showError', - TIP_BUTTON: '[x-content=\'ctrl.helpText\']', - TIP_POPUP: '.popover', - BEARING_ERR_DROPDOWN: '[title=\'Sets the data field used for bearing error\']', - BEARING_ERR_MULTIPLYER_INPUT: '[ng-model=\'bearingErrorMultiplier\']', - LENGTH_ERR_DROPDOWN: '[title=\'Sets the data field used for length error\']', - LENGTH_ERR_UNITS_DROPDOWN: '[ng-model=\'ctrl.lengthErrorUnits\']', - LENGTH_ERR_MULTIPLER_INPUT: '[ng-model=\'lengthErrorMultiplier\']' - } - }, - LineOfBearingWithCenter: { - CENTER_DROPDOWN: '[ng-model=\'$parent.centerShape\']', - BEARING_DROPDOWN: '[title=\'Sets the data field used for bearing\']', - Manual: { - RADIOBUTTON: '#lengthManual', - INPUT: '#lengthColumn', - SLIDER: '[name=\'length\']', - UNITS_DROPDOWN: '.ml-1[title=\'Sets the units field used for length\']' - }, - Column: { - RADIOBUTTON: '#lengthColumn', - DROPDOWN: '[title=\'Sets the data field used for length\']', - UNITS_DROPDOWN: '[title=\'Sets the data field used for length\']', - MULTIPLER_INPUT: '[ng-model=\'columnLength\']' - }, - showArrow: { - CHECKBOX: '#showArrow', - SIZE_INPUT: '[max=\'maxSize[ctrl.arrowUnits]\']', - UNITS_DROPDOWN: '[title=\'Sets the units field used for arrow size\']' - }, - showEllipse: { - CHECKBOX: '#showEllipse', - SHOW_ELLIPSOIDS_CHECKBOX: '[name=\'showEllipsoids\']', - SHOW_GROUND_REF_CHECKBOX: '[name=\'showGroundReference\']' - }, - showError: { - CHECKBOX: '#showError', - TIP_BUTTON: '[x-content=\'ctrl.helpText\']', - TIP_POPUP: '.popover', - BEARING_ERR_DROPDOWN: '[title=\'Sets the data field used for bearing error\']', - BEARING_ERR_MULTIPLYER_INPUT: '[ng-model=\'bearingErrorMultiplier\']', - LENGTH_ERR_DROPDOWN: '[title=\'Sets the data field used for length error\']', - LENGTH_ERR_UNITS_DROPDOWN: '[ng-model=\'ctrl.lengthErrorUnits\']', - LENGTH_ERR_MULTIPLER_INPUT: '[ng-model=\'lengthErrorMultiplier\']' - } - } - } - }, - Label: { - BUTTON: '[title=\'Configure how labels are displayed for the layer\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - SIZE_DROPDOWN: '[name=\'spinner\']', - ALWAYS_SHOW_LABELS_CHECKBOX: '#showLabels', - Column: { - HANDLE_WILDCARD: '[title=\'Click and Drag to move this label\']', - CHECKBOX_WILDCARD: '[ng-model=\'label.showColumn\']', - DROPDOWN_WILDCARD: '[title=\'Sets the data field used for labels\']', - REMOVE_COLUMN_BUTTON_WILDCARD: '[title=\'Remove this label\']', - ADD_COLUMN_BUTTON: '[title=\'Add a label\']', - COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' - } - } - }, - Options: { - BUTTON: '[title=\'Configure the layer options\']', - AUTO_REFRESH_DROPDOWN: '[ng-model=\'vector.refresh\']', - UNIQUE_IDENTIFIER_DROPDOWN: '[ng-model=\'vector.uniqueId\']', - ALTITUDE_MODE: '[title=\'Sets how the layer interprets altitude in 3D mode.\']', - LOCK_LAYER_CHECKBOX: '#lockLayer' - } - }, - drawingLayer: { - SAVE_BUTTON: '[title=\'Save\']', - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove the layer\']', - parentContextMenu: { - PANEL: '#menu', - GO_TO: '[title=\'Repositions the map to show the layer\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - RENAME: '[title=\'Rename the layer\']', - SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']' - }, - contextMenu: { - PANEL: '#menu', - menuOptions: { - Query: { - LOAD: '[title=\'Clear queries, then query for this area for all layers\']', - ADD: '[title=\'Add a query for this area for all layers\']', - chooseLayers: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(0)', - FEATURES: '[title=\'Query area for layes of type (Features)\']', - CUSTOM: '[evt-type=\'add:custom\']' - } - }, - Exclude: { - SET: '[title=\'Clear exclusions, then add an exclusion area for all layers\']', - ADD: '[title=\'Add an exclusion area for all layers\']', - chooseLayers: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(1)', - FEATURES: '[title=\'Exclude area for layes of type (Features)\']', - CUSTOM: '[evt-type=\'add_exclude:custom\']' - } - }, - SELECT: '[title=\'Select features in this area\']', - SELECT_EXCLUSIVE: '[title=\'Select only features in this area, deselecting features ' + - 'outside of the area\']', - DESELECT: '[title=\'Deselect features in this area\']', - REMOVE_FEATURES_IN_AREA: '[title=\'Remove features in this area from the map\']', - CREATE_BUFFER_REGION: '[title=\'Create a buffer region from the feature(s)\']', - MODIFY_AREA: '[title=\'Modify the area\']', - SAVE_TO_PLACES: '[title=\'Creates a new saved place from the area\']', - ZOOM: '[title=\'Zoom the map to the feature(s)\']', - EDIT_AREA_DETAILS: '[title=\'Edit area information such as title/description\']', - ENABLE_AREA: '[title=\'Enable the area\']', - DISABLE_AREA: '[title=\'Disable the area\']', - EXPORT: '[title=\'Export the area\']', - MERGE: '[title=\'Merge selected areas into a new area\']', - REMOVE_AREA: '#menu [title=\'Remove the area\']' - } - }, - Accordion: { - Style: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle' - } - } - }, - Track: { - EDIT_TRACK_BUTTON_WILDCARD: '[title=\'Edit the place\']', - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove the layer\']', - parentContextMenu: { - PANEL: '#menu', - GO_TO: '[title=\'Repositions the map to show the layer\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - CLEAR_SELECTION: '[title=\'Clears the selection for the layer\']', - ADD_TO_TIMELINE: '[title=\'Enables layer animation when the timeline is open\']', - REMOVE_FROM_TIMELINE: '[title=\'Disables layer animation when the timeline is open\']', - MOST_RECENT: '[title=\'Adjusts application time to show the most recent data for the layer\']', - REMOVE: '[title=\'Removes the layer\']', - RENAME: '[title=\'Rename the layer\']', - SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']', - EXPORT: '[title=\'Exports data from this layer\']', - CREATE_BUFFER_REGION: '[title=\'Create buffer regions around loaded data\']', - FEATURE_ACTIONS: '[title=\'Perform actions on imported data matching a filter\']', - GENERATE_HEATMAP: '[title=\'Generate a heatmap of current features\']', - Copy: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item', - ALL: '[evt-type=\'layer.copy 1\']', - SHOWN: '[evt-type=\'layer.copy 2\']', - SELECTED: '[evt-type=\'layer.copy 3\']', - UNSELECTED: '[evt-type=\'layer.copy 4\']', - HIDDEN: '[evt-type=\'layer.copy 5\']' - }, - Merge: { - TOP_LEVEL: ':contains(\'Merge\').ui-menu-item', - ALL: '[evt-type=\'layer.merge 1\']', - SHOWN: '[evt-type=\'layer.merge 2\']', - SELECTED: '[evt-type=\'layer.merge 3\']', - UNSELECTED: '[evt-type=\'layer.merge 4\']', - HIDDEN: '[evt-type=\'layer.merge 5\']' - }, - Join: { - TOP_LEVEL: ':contains(\'Join\').ui-menu-item', - ALL: '[evt-type=\'layer.join 1\']', - SHOWN: '[evt-type=\'layer.join 2\']', - SELECTED: '[evt-type=\'layer.join 3\']', - UNSELECTED: '[evt-type=\'layer.join 4\']', - HIDDEN: '[evt-type=\'layer.join 5\']' - }, - SAVE_TO_PLACES: '[title=\'Copies selected features to the Saved Places layer, or all ' + - 'features if none selected\']' - }, - contextMenu: { - PANEL: '#menu', - menuOptions: { - CREATE_BUFFER_REGION: '[title=\'Create buffer regions around loaded data\']', - ENABLE_TRACK_INTERPOLATION: '[title=\'Show the interpolated position of the track marker.\']', - DISABLE_TRACK_INTERPOLATION: '[title=\'Only move track marker when there is a supporting feature.\']', - FOLLOW_TRACK: '[title=\'Follow the track as it animates.\']', - UNFOLLOW_TRACK: '[title=\'Cancel following the track during animation.\']', - SHOW_TRACK_LINE: '[title=\'Show the track line.\']', - HIDE_TRACK_LINE: '[title=\'Do not show the track line.\']', - SAVE_TO_PLACES: '[title=\'Copies selected features to the Saved Places layer, or all ' + - 'features if none selected\']', - FEATURE_INFO: '[title=\'Display detailed feature information\']', - GO_TO: '[title=\'Repositions the map to show the layer\']' - } - }, - Accordion: { - Style: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - DROPDOWN: '[ng-model=\'$parent.shape\']', - Style: { - Icon: { - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_CHECKBOX: '.no-text > .fa', - ROTATION_DROPDOWN: '[title=\'Sets the data field used for bearing\']' - } - } - }, - Label: { - BUTTON: '[title=\'Configure how labels are displayed for the layer\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - SIZE_DROPDOWN: '[name=\'spinner\']', - ALWAYS_SHOW_LABELS_CHECKBOX: '#showLabels', - Column: { - HANDLE_WILDCARD: '[title=\'Click and Drag to move this label\']', - CHECKBOX_WILDCARD: '[ng-model=\'label.showColumn\']', - DROPDOWN_WILDCARD: '[title=\'Sets the data field used for labels\']', - REMOVE_COLUMN_BUTTON_WILDCARD: '[title=\'Remove this label\']', - ADD_COLUMN_BUTTON: '[title=\'Add a label\']', - COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' - } - } - } - }, - savedPlace: { - CREATE_A_NEW_FOLDER_BUTTON_WILDCARD: '[title=\'Create a new folder\']', - CREATE_A_NEW_SAVED_PLACE_BUTTON_WILDCARD: '[title=\'Create a new place\']', - CREATE_A_NEW_ANNOTATION_BUTTON_WILDCARD: '[title=\'Create a new annotation\']', - EDIT_PLACE_BUTTON_WILDCARD: '[title=\'Edit the place\']', - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove the layer\']', - parentContextMenu: { - PANEL: '#menu', - GO_TO: '[title=\'Repositions the map to show the layer\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - CLEAR_SELECTION: '[title=\'Clears the selection for the layer\']', - ADD_TO_TIMELINE: '[title=\'Enables layer animation when the timeline is open\']', - REMOVE_FROM_TIMELINE: '[title=\'Disables layer animation when the timeline is open\']', - RENAME: '[title=\'Rename the layer\']', - SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']', - EXPORT: '[title=\'Exports data from this layer\']', - ADD_TO_TRACK: '[title=\'Adds selected features (or all features if none are selected) ' + - 'to an existing track.\']', - CREATE_BUFFER_REGION: '[title=\'Create buffer regions around loaded data\']', - CREATE_TRACK: '[title=\'Creates a new track by linking selected features (or all ' + - 'features if none are selected) in time order.\']', - GENERATE_HEATMAP: '[title=\'Generate a heatmap of current features\']', - Copy: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item', - ALL: '[evt-type=\'layer.copy 1\']', - SHOWN: '[evt-type=\'layer.copy 2\']', - SELECTED: '[evt-type=\'layer.copy 3\']', - UNSELECTED: '[evt-type=\'layer.copy 4\']', - HIDDEN: '[evt-type=\'layer.copy 5\']' - }, - Merge: { - TOP_LEVEL: ':contains(\'Merge\').ui-menu-item', - ALL: '[evt-type=\'layer.merge 1\']', - SHOWN: '[evt-type=\'layer.merge 2\']', - SELECTED: '[evt-type=\'layer.merge 3\']', - UNSELECTED: '[evt-type=\'layer.merge 4\']', - HIDDEN: '[evt-type=\'layer.merge 5\']' - }, - Join: { - TOP_LEVEL: ':contains(\'Join\').ui-menu-item', - ALL: '[evt-type=\'layer.join 1\']', - SHOWN: '[evt-type=\'layer.join 2\']', - SELECTED: '[evt-type=\'layer.join 3\']', - UNSELECTED: '[evt-type=\'layer.join 4\']', - HIDDEN: '[evt-type=\'layer.join 5\']' - }, - ADD_FOLDER: '[title=\'Creates a new folder and adds it to the tree\']', - ADD_PLACE: '[title=\'Creates a new saved place\']', - EXPORT_PLACES: '[title=\'Exports Saved Places from the selected location\']', - REMOVE_ALL: '[title=\'Removes all of the places\']' - }, - contextMenu: { - PANEL: '#menu', - menuOptions: { - CREATE_BUFFER_REGION: '[title=\'Create buffer regions around loaded data\']', - EDIT_PLACE: '[title=\'Edit the saved place\']', - EXPORT_PLACES: '[title=\'Exports Saved Places from the selected location\']', - REMOVE: '[title=\'Removes the layer\']', - FEATURE_INFO: '[title=\'Display detailed feature information\']', - GO_TO: '[title=\'Repositions the map to show the layer\']' - } - }, - Accordion: { - Style: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - DROPDOWN: '[ng-model=\'$parent.shape\']', - Style: { - Icon: { - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_CHECKBOX: '.no-text > .fa', - ROTATION_DROPDOWN: '[title=\'Sets the data field used for bearing\']' - }, - ellipseWithCenter: { - CENTER_DROPDOWN: '[ng-model=\'$parent.centerShape\']', - ROTATION_CHECKBOX: '.no-text > .fa', - ROTATION_DROPDOWN: '[title=\'Sets the data field used for bearing\']' - } - } - }, - Label: { - BUTTON: '[title=\'Configure how labels are displayed for the layer\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - SIZE_DROPDOWN: '[name=\'spinner\']', - ALWAYS_SHOW_LABELS_CHECKBOX: '#showLabels', - Column: { - HANDLE_WILDCARD: '[title=\'Click and Drag to move this label\']', - CHECKBOX_WILDCARD: '[ng-model=\'label.showColumn\']', - DROPDOWN_WILDCARD: '[title=\'Sets the data field used for labels\']', - REMOVE_COLUMN_BUTTON_WILDCARD: '[title=\'Remove this label\']', - ADD_COLUMN_BUTTON: '[title=\'Add a label\']', - COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' - } - } - } - }, - tileLayer: { - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove the layer\']', - contextMenu: { - PANEL: '#menu', - menuOptions: { - EDIT_PARAMETERS: '[title=\'Edit request parameters for the layer\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - REFRESH: '[title=\'Refreshes the layer\']', - REMOVE: '[title=\'Removes the layer\']', - RENAME: '[title=\'Rename the layer\']', - SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']' - } - }, - Accordion: { - Style: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - OPACITY_RESET_BUTTON: '[title=\'Restore default opacity\']', - BRIGHTNESS_SLIDER: '[name=\'brightness\'] .ui-slider-handle', - BRIGHTNESS_RESET_BUTTON: '[title=\'Restore default brightness\']', - CONTRAST_SLIDER: '[name=\'contrast\'] .ui-slider-handle', - CONTRAST_RESET_BUTTON: '[title=\'Restore default contrast\']', - SATURATION_SLIDER: '[name=\'saturation\'] .ui-slider-handle', - SATURATION_RESET_BUTTON: '[title=\'Restore default saturation\']', - colorPicker: { - BUTTON: '[title=\'Sets the color/shape used to render features\'] [color=\'color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - COLORIZE_CHECKBOX: '#tile_colorize' - }, - Options: { - BUTTON: '[title=\'Configure the layer options\']', - AUTO_REFRESH_DROPDOWN: '[ng-model=\'vector.refresh\']' - } - } - }, - mapLayer: { - REMOVE_LAYER_BUTTON_WILDCARD: '[title=\'Remove the layer\']', - STREET_MAP_TILES: ':contains(\'Street Map Tiles\').slick-row', - WORLD_IMAGERY_TILES: ':contains(\'World Imagery Tiles\').slick-row', - contextMenu: { - PANEL: '#menu', - menuOptions: { - EDIT_PARAMETERS: '[title=\'Edit request parameters for the layer\']', - IDENTIFY: '[title=\'Identifies a layer on the map\']', - REFRESH: '[title=\'Refreshes the layer\']', - REMOVE: '[title=\'Removes the layer\']', - RENAME: '[title=\'Rename the layer\']', - SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']' - } - }, - Accordion: { - Style: { - BUTTON: '[title=\'Style controls for the layer(s)\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - OPACITY_RESET_BUTTON: '[title=\'Restore default opacity\']', - BRIGHTNESS_SLIDER: '[name=\'brightness\'] .ui-slider-handle', - BRIGHTNESS_RESET_BUTTON: '[title=\'Restore default brightness\']', - CONTRAST_SLIDER: '[name=\'contrast\'] .ui-slider-handle', - CONTRAST_RESET_BUTTON: '[title=\'Restore default contrast\']', - SATURATION_SLIDER: '[name=\'saturation\'] .ui-slider-handle', - SATURATION_RESET_BUTTON: '[title=\'Restore default saturation\']' - }, - Zoom: { - BUTTON: '[title=\'Zoom controls for the layer(s)\']', - MIN_ZOOM_SPINNER: '[name=\'minZoom\']', - MIN_ZOOM_CURRENT_BUTTON: '[title=\'Sets the min zoom to the current zoom level\']', - MAX_ZOON_SPINNER: '[name=\'maxZoom\']', - MAX_ZOOM_CURRENT_BUTTON: '[title=\'Sets the max zoom to the current zoom level\']' - } - } - } - } - } - }, - Areas: { - TAB: '.nav-link:eq(1)', - GROUP_BY_DROPDOWN: '[ng-model=\'view\']', - SEARCH_INPUT: '[placeholder=\'Search areas\']', - CLEAR_BUTTON: '[title=\'Clear the search term\']', - Tree: { - AREA_WILDCARD: '.slick-row', - AREA_NODE_WILDCARD: '.js-node-toggle', - AREA_NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - AREA_NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - AREA_TOGGLE_CHECKBOX_WILDCARD: '[title=\'Show or hide the area\']', - AREA_IS_ACTIVE_CLASS_WILDCARD: '.c-tristate-on', - AREA_IS_INACTIVE_CLASS_WILDCARD: '.c-tristate-off', - SAVE_AREA_BUTTON_WILDCARD: '[ng-click=\'nodeUi.edit()\']', - REMOVE_AREA_BUTTON_WILDCARD: '[title=\'Remove the area\']', - AREA_1: '.slick-row:eq(0)', - AREA_1_SAVE_BUTTON: '[title=\'Save\']:eq(0)', - AREA_1_REMOVE_BUTTON: '[title=\'Remove the area\']:eq(0)', - AREA_2: '.slick-row:eq(1)', - AREA_2_SAVE_BUTTON: '[title=\'Save\']:eq(1)', - AREA_2_REMOVE_BUTTON: '[title=\'Remove the area\']:eq(1)', - AREA_3: '.slick-row:eq(2)', - AREA_3_SAVE_BUTTON: '[title=\'Save\']:eq(2)', - AREA_3_REMOVE_BUTTON: '[title=\'Remove the area\']:eq(2)', - AREA_4: '.slick-row:eq(3)', - AREA_4_SAVE_BUTTON: '[title=\'Save\']:eq(3)', - AREA_4_REMOVE_BUTTON: '[title=\'Remove the area\']:eq(3)', - AREA_5: '.slick-row:eq(4)', - AREA_5_SAVE_BUTTON: '[title=\'Save\']:eq(4)', - AREA_5_REMOVE_BUTTON: '[title=\'Remove the area\']:eq(4)', - TEMP_AREA_1: ':contains(\'temp area 1\')', - TEMP_AREA_2: ':contains(\'temp area 2\')', - TEMP_AREA_3: ':contains(\'temp area 3\')', - TEMP_AREA_4: ':contains(\'temp area 4\')', - TEMP_AREA_5: ':contains(\'temp area 5\')', - WHOLE_WORLD_AREA: ':contains(\'Whole World\') .slick-cell', - contextMenu: { - PANEL: '#menu', - menuOptions: { - Query: { - LOAD: '[title=\'Clear queries, then query for this area for all layers\']', - ADD: '[title=\'Add a query for this area for all layers\']', - chooseLayers: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(0)', - FEATURES: '[title=\'Query area for layes of type (Features)\']', - CUSTOM: '[evt-type=\'add:custom\']' - } - }, - Exclude: { - SET: '[title=\'Clear exclusions, then add an exclusion area for all layers\']', - ADD: '[title=\'Add an exclusion area for all layers\']', - chooseLayers: { - TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(1)', - FEATURES: '[title=\'Exclude area for layes of type (Features)\']', - CUSTOM: '[evt-type=\'add_exclude:custom\']' - } - }, - SELECT: '[title=\'Select features in this area\']', - SELECT_EXCLUSIVE: '[title=\'Select only features in this area, deselecting features outside of the area\']', - DESELECT: '[title=\'Deselect features in this area\']', - REMOVE_FEATURES_IN_AREA: '[title=\'Remove features in this area from the map\']', - CREATE_BUFFER_REGION: '[title=\'Create a buffer region from the feature(s)\']', - MODIFY_AREA: '[title=\'Modify the area\']', - SAVE_TO_PLACES: '[title=\'Creates a new saved place from the area\']', - ZOOM: '[title=\'Zoom the map to the feature(s)\']', - EDIT_AREA_DETAILS: '[title=\'Edit area information such as title/description\']', - ENABLE_AREA: '[title=\'Enable the area\']', - DISABLE_AREA: '[title=\'Disable the area\']', - EXPORT: '[title=\'Export the area\']', - MERGE: '[title=\'Merge selected areas into a new area\']', - REMOVE_AREA: '#menu [title=\'Remove the area\']' - } - } - }, - EXPORT_BUTTON: '[ng-click=\'areasCtrl.export()\']', - Import: { - BUTTON: '[ng-click=\'areasCtrl.import()\']', - Menu: { - BUTTON: '.fa-chevron-down', - PANEL: '#menu', - menuOptions: { - IMPORT_FILE_URL: '[title=\'Import areas from a file or URL\']', - ENTER_COORDINATES: '[title=\'Enter coordinates to load data for a box, circle, or polygon\']', - WHOLE_WORLD: '[title=\'Load data for the whole world\']' - } - } - }, - ADVANCED_BUTTON: '[ng-click=\'areasCtrl.launch()\']' - }, - Filters: { - TAB: '.nav-link:eq(2)', - GROUP_BY_DROPDOWN: '[ng-change=\'filtersCtrl.onGroupChange()\']', - ADD_FILTER_BUTTON: '[title=\'Add a filter\']', - SEARCH_INPUT: '[placeholder=\'Search...\']', - CLEAR_BUTTON: '[ng-change=\'filtersCtrl.onSearchTermChange()\']', - Tree: { - FILTER_WILDCARD: '.slick-row', - FILTER_NODE_WILDCARD: '.js-node-toggle', - FILTER_NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - FILTER_NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - FILTER_TOGGLE_CHECKBOX_WILDCARD: '[title=\'Show or hide the filter\']', - FILTER_IS_ACTIVE_CLASS_WILDCARD: '.c-tristate-on', - FILTER_IS_INACTIVE_CLASS_WILDCARD: '.c-tristate-off', - COPY_FILTER_BUTTON_WILDCARD: '[title=\'Copy\']', - EDIT_FILTER_BUTTON_WILDCARD: '[title=\'Edit\']', - REMOVE_FILTER_BUTTON_WILDCARD: '[title=\'Remove\']', - FILTER_1: '.slick-row:eq(0)', - FILTER_1_COPY_BUTTON: '[title=\'Copy\']:eq(0)', - FILTER_1_EDIT_BUTTON: '[title=\'Edit\']:eq(0)', - FILTER_1_REMOVE_BUTTON: '[title=\'Remove\']:eq0()', - FILTER_2: '.slick-row:eq(1)', - FILTER_2_COPY_BUTTON: '[title=\'Copy\']:eq(1)', - FILTER_2_EDIT_BUTTON: '[title=\'Edit\']:eq(1)', - FILTER_2_REMOVE_BUTTON: '[title=\'Remove\']:eq(1)', - FILTER_3: '.slick-row:eq(2)', - FILTER_3_COPY_BUTTON: '[title=\'Copy\']:eq(2)', - FILTER_3_EDIT_BUTTON: '[title=\'Edit\']:eq(2)', - FILTER_3_REMOVE_BUTTON: '[title=\'Remove\']:eq(2)', - NEW_FILTER_1: ':contains(\'New Filter\'):eq(0)', - NEW_FILTER_2: ':contains(\'New Filter\'):eq(1)', - NEW_FILTER_3: ':contains(\'New Filter\'):eq(2)', - contextMenu: { - PANEL: '#menu', - menuOptions: { - HIDE: '[title=\'Hides the filter\']', - SHOW: '[title=\'Shows the filter\']', - TURN_FILTER_ON: '[title=\'Apply the filter to all areas for the query\']', - TURN_FILTER_OFF: '[title=\'Remove the filter from all areas for the query\']', - REMOVE: '[title=\'Removes the filter\']', - EXPORT_FILTER: '[title=\'Export the filter\']' - } - } - }, - EXPORT_BUTTON: '[ng-click=\'filtersCtrl.export()\']', - IMPORT_BUTTON: '[ng-click=\'filtersCtrl.import()\']', - ADVANCED_BUTTON: '[ng-click=\'filtersCtrl.launch()\']' - }, - Places: { - TAB: '.nav-link:eq(3)', - ADD_FOLDER_BUTTON: '[ng-click=\'places.addFolder()\']', - ADD_PLACE_BUTTON: '[ng-click=\'places.addPlace()\']', - EXPAND_ALL_BUTTON: '[title=\'Fully expand the tree from the selected item, or the root if nothing is selected\']', - COLLAPSE_ALL_BUTTON: '[title=\'Fully collapse the tree from the selected item, or the root if ' + - 'nothing is selected\']', - Tree: { - PLACE_WILDCARD: '.slick-row', - Type: { - Folder: { - NODE_WILDCARD: '.js-node-toggle', - NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - TOGGLE_CHECKBOX_WILDCARD: '[title=\'Show or hide the layer\']', - IS_ACTIVE_CLASS_WILDCARD: 'c-tristate-on', - IS_INACTIVE_CLASS_WILDCARD: 'c-tristate-off', - CREATE_FOLDER_BUTTON_WILDCARD: '[title=\'Create a new folder\']', - CREATE_PLACE_BUTTON_WILDCARD: '[title=\'Create a new place\']', - EDIT_BUTTON_WILDCARD: '[title=\'Edit the folder\']', - REMOVE_BUTTON_WILDCARD: '[title=\'Remove the folder\']', - FOLDER_1: '.slick-row:eq(0)', - FOLDER_1_CREATE_FOLDER_BUTTON: '[title=\'Create a new folder\']:eq(0)', - FOLDER_1_CREATE_PLACE_BUTTON: '[title=\'Create a new place\']:eq(0)', - FOLDER_1_EDIT_FOLDER_BUTTON: '[title=\'Edit the folder\']:eq(0)', - FOLDER_1_REMOVE_FOLDER_BUTTON: '[title=\'Remove the folder\']:eq(0)', - FOLDER_2: '.slick-row:eq(1)', - FOLDER_2_CREATE_FOLDER_BUTTON: '[title=\'Create a new folder\']:eq(1)', - FOLDER_2_CREATE_PLACE_BUTTON: '[title=\'Create a new place\']:eq(1)', - FOLDER_2_EDIT_FOLDER_BUTTON: '[title=\'Edit the folder\']:eq(1)', - FOLDER_2_REMOVE_FOLDER_BUTTON: '[title=\'Remove the folder\']:eq(1)', - FOLDER_3: '.slick-row:eq(2)', - FOLDER_3_CREATE_FOLDER_BUTTON: '[title=\'Create a new folder\']:eq(2)', - FOLDER_3_CREATE_PLACE_BUTTON: '[title=\'Create a new place\']:eq(2)', - FOLDER_3_EDIT_FOLDER_BUTTON: '[title=\'Edit the folder\']:eq(2)', - FOLDER_3_REMOVE_FOLDER_BUTTON: '[title=\'Remove the folder\']:eq(2)', - FOLDER_4: '.slick-row:eq(3)', - FOLDER_4_CREATE_FOLDER_BUTTON: '[title=\'Create a new folder\']:eq(3)', - FOLDER_4_CREATE_PLACE_BUTTON: '[title=\'Create a new place\']:eq(3)', - FOLDER_4_EDIT_FOLDER_BUTTON: '[title=\'Edit the folder\']:eq(3)', - FOLDER_4_REMOVE_FOLDER_BUTTON: '[title=\'Remove the folder\']:eq(3)', - FOLDER_5: '.slick-row:eq(4)', - FOLDER_5_CREATE_FOLDER_BUTTON: '[title=\'Create a new folder\']:eq(4)', - FOLDER_5_CREATE_PLACE_BUTTON: '[title=\'Create a new place\']:eq(4)', - FOLDER_5_EDIT_FOLDER_BUTTON: '[title=\'Edit the folder\']:eq(4)', - FOLDER_5_REMOVE_FOLDER_BUTTON: '[title=\'Remove the folder\']:eq(4)', - contextMenu: { - PANEL: '#menu', - menuOptions: { - ADD_FOLDER: '[title=\'Creates a new folder and adds it to the tree\']', - ADD_PLACE: '[title=\'Creates a new saved place\']', - EDIT_FOLDER: '[title=\'Edit the folder label\']', - EXPORT_PLACES: '[title=\'Exports Saved Places from the selected location\']', - REMOVE_ALL: '[title=\'Removes everything under the folder\']' - } - } - }, - Place: { - TOGGLE_CHECKBOX_WILDCARD: '[title=\'Show or hide the layer\']', - IS_ACTIVE_CLASS_WILDCARD: 'c-tristate-on', - IS_INACTIVE_CLASS_WILDCARD: 'c-tristate-off', - EDIT_BUTTON_WILDCARD: '[title=\'Edit the place\']', - REMOVE_BUTTON_WILDCARD: '[ng-if=\'nodeUi.canRemove()\']', - PLACE_1: '.slick-row:eq(0)', - PLACE_1_EDIT_BUTTON: '[title=\'Edit the place\']:eq(0)', - PLACE_1_REMOVE_BUTTON: '[ng-if=\'nodeUi.canRemove()\']:eq(0)', - PLACE_2: '.slick-row:eq(1)', - PLACE_2_EDIT_BUTTON: '[title=\'Edit the place\']:eq(1)', - PLACE_2_REMOVE_BUTTON: '[ng-if=\'nodeUi.canRemove()\']:eq(1)', - PLACE_3: '.slick-row:eq(2)', - PLACE_3_EDIT_BUTTON: '[title=\'Edit the place\']:eq(2)', - PLACE_3_REMOVE_BUTTON: '[ng-if=\'nodeUi.canRemove()\']:eq(2)', - PLACE_4: '.slick-row:eq(3)', - PLACE_4_EDIT_BUTTON: '[title=\'Edit the place\']:eq(3)', - PLACE_4_REMOVE_BUTTON: '[ng-if=\'nodeUi.canRemove()\']:eq(3)', - PLACE_5: '.slick-row:eq(4)', - PLACE_5_EDIT_BUTTON: '[title=\'Edit the place\']:eq(4)', - PLACE_5_REMOVE_BUTTON: '[ng-if=\'nodeUi.canRemove()\']:eq(4)', - contextMenu: { - PANEL: '#menu', - menuOptions: { - CREATE_BUFFER_REGION: '[title=\'Creates buffer regions around loaded data\']', - EDIT_PLACE: '[title=\'Edit the saved place\']', - EXPORT_PLACES: '[title=\'Exports Saved Places from the selected location\']', - REMOVE: '[title=\'Removes the place\']', - FEATURE_INFO: '[title=\'Display detailed feature information\']', - GO_TO: '[title=\'Repositions the map to display features at this level of the tree\']' - } - } - } - } - }, - EXPORT_BUTTON: '[title=\'Export places to KML\']', - IMPORT_BUTTON: '[title=\'Import places only\']' - } - } -}; - -exports.legendDialog = { - DIALOG_TEXT: '[ng-if=\'mainCtrl.legend\']', - SETTINGS_BUTTON: '[title=\'Open settings\']', - DIALOG_CLOSE: '[title=\'Close the legend\']' -}; - -exports.locationFormatsDialog = { - DIALOG: '[label=\'Location Formats\']', - DIALOG_HEADER: '[title=\'Location Formats\']', - DIALOG_CLOSE: '[label=\'Location Formats\'] .close', - DIALOG_TEXT: '[label=\'Location Formats\'] .modal-body', - CLOSE_BUTTON: '[ng-click=\'th.close()\']' -}; - -exports.Map = { - CONTAINER: '#map-container', - CANVAS_3D: '.webgl-canvas', - CANVAS_2D: '.canvas:eq(0)', - OVERVIEW_MAP: '.ol-overviewmap-map', - OVERVIEW_MAP_TOGGLE_BUTTON: '[title=\'Overview map\']', - ZOOM_IN_BUTTON: '.ol-zoom-in', - ZOOM_OUT_BUTTON: '.ol-zoom-out', - ROTATION_BUTTON: '.ol-rotate', - MAP_MODE_BUTTON: '.ol-mapmode', - ATTRIBUTION: '.ol-attribution', - contextMenu: { - PANEL: '#menu', - menuOptions: { - RESET_VIEW: '[title=\'Resets to the default view\']', - RESET_ROTATION: '[title=\'Resets to the default rotation\']', - TOGGLE_2D_3D_VIEW: '[title=\'Toggle the map view between 2D and 3D views\']', - SHOW_LEGEND: '[title=\'Display the map legend\']', - CLEAR_SELECTION: '[title=\'Clears the selected features across all layers\']', - BACKGROUND_COLOR: '[title=\'Change the map background color\']', - Sky: { - OPTION: '[title=\'Show the sky/stars around the 3D globe\']', - IS_ACTIVE_CLASS: '[title=\'Show the sky/stars around the 3D globe\'] .fa-check-square-o', - IS_INACTIVE_CLASS: '[title=\'Show the sky/stars around the 3D globe\'] .fa-square-o' - }, - Sunlight: { - OPTION: '[title=\'Light the 3D globe with the Sun\']', - IS_ACTIVE_CLASS: '[title=\'Light the 3D globe with the Sun\'] .fa-check-square-o', - IS_INACTIVE_CLASS: '[title=\'Light the 3D globe with the Sun\'] .fa-square-o' - }, - COPY_COORDINATES: '[title=\'Copy coordinates to clipboard\']', - CREATE_BUFFER_REGION: '[title=\'Create a buffer region around the clicked coordinate\']', - SUN_MOON_INFO: '[title=\'See sun/moon event times for this location\']', - SAVE_TO_PLACES: '[title=\'Creates a new saved place from this location\']', - CREATE_ANNOTATION: '[title=\'Creates a new annotation at this location\']' - } - } -}; - -exports.modifyAreaDialog = { - DIALOG: '#modifyArea', - DIALOG_HEADER: '[title=\'Modify Area...\']', - DIALOG_CLOSE: '#modifyArea .close', - AREA_TO_MODIFY_DROPDOWN: '[ng-model=\'area\']:eq(0)', - AREA_TO_MODIFY_BADGE: '[x-title=\'helpTitle\']:eq(0)', - Operation: { - ADD_RADIO_BUTTON: '[value=\'Add\']', - REMOVE_RADIO_BUTTON: '[value=\'Remove\']', - INTERSECTION_RADIO_BUTTON: '[value=\'Intersect\']', - BADGE: '[x-title=\'modarea.getPopoverTitle(op)\']' - }, - AREA_TO_ADD_DROPDOWN: '[ng-model=\'area\']:eq(1)', - AREA_TO_ADD_BADGE: '[x-title=\'helpTitle\']:eq(1)', - REPLACE_AREA_CHECKBOX: '[name=\'replace\']', - REPLACE_AREA_BADGE: '[x-content=\'modarea.help.replace\']', - OK_BUTTON: '[ng-click=\'modarea.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'modarea.cancel()\']' -}; - -exports.openSphereCapabilitiesDialog = { - DIALOG: '[label=\'OpenSphere Capabilities\']', - DIALOG_HEADER: '[title=\'OpenSphere Capabilities\']', - DIALOG_CLOSE: '[label=\'OpenSphere Capabilities\'] .close', - Tree: { - CAPABILITY_WILDCARD: '[label=\'OpenSphere Capabilities\'] .slick-row', - CAPABILITY_NODE_WILDCARD: '.js-node-toggle', - CAPABILITY_NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - CAPABILITY_NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - CAPABILITY_1: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(0)', - CAPABILITY_2: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(1)', - CAPABILITY_3: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(2)', - CAPABILITY_4: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(3)', - CAPABILITY_5: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(4)', - CAPABILITY_6: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(5)', - CAPABILITY_7: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(6)', - CAPABILITY_8: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(7)', - CAPABILITY_9: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(8)', - CAPABILITY_10: '[label=\'OpenSphere Capabilities\'] .slick-row:eq(9)' - }, - DESCRIPTION_TEXT: 'section', - SEARCH_INPUT: '[placeholder=\'Search features\']', - CLOSE_BUTTON: '[ng-click=\'setCon.close()\']' -}; - -exports.renameLayerDialog = { - DIALOG: '[label=\'Rename Layer\']', - DIALOG_HEADER: '[title=\'Rename Layer\']', - LAYER_NAME_INPUT: '[name=\'title\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.resetSettingsDialog = { - DIALOG: '[label=\'Reset Settings\']', - DIALOG_HEADER: '[title=\'Reset Settings\']', - CLEAR_AND_RELOAD_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.saveStateDialog = { - DIALOG: '#stateExport', - DIALOG_HEADER: '[title=\'Save State\']', - DIALOG_CLOSE: '#stateExport .close', - NAME_INPUT: '[name=\'title\']', - SAVE_TO_DROPDOWN: '[name=\'persister\']', - DESCRIPTION_INPUT: '[name=\'desc\']', - TAGS_INPUT: '[name=\'tags\']', - CHOOSE_PARTS_CHECKBOX: '[name=\'showOptions\']', - OK_BUTTON: '[ng-click=\'stateForm.accept()\']', - CANCEL_BUTTON: '[ng-click=\'stateForm.close()\']' -}; - -exports.saveToPlacesDialog = { - DIALOG: '#savePlaces', - DIALOG_HEADER: '[title=\'Save to Places\']', - DIALOG_CLOSE: '#savePlaces .close', - TITLE_COLUMN_DROPDOWN: '[ng-model=\'config.titleColumn\']', - TITLE_COLUMN_BADGE: '[x-content=\'help.title\']', - TITLE_INPUT: '[name=\'title\']', - TITLE_BADGE: '[ng-class=\'popoverctrl.icon\']', - DESCRIPTION_COLUMN_DROPDOWN: '[ng-model=\'config.descColumn\']', - DESCRIPTION_COLUMN_BADGE: '[ng-if=\'help.descColumn\']', - DESCRIPTION_INPUT: '[name=\'description\']', - DESCRIPTION_BADGE: '[ng-if=\'help.description\']', - TAGS_COLUMN_DROPDOWN: '[ng-model=\'config.tagsColumn\']', - TAGS_COLUMN_BADGE: '[ng-if=\'help.tagsColumn\']', - TAGS_INPUT: '[name=\'tags\']', - TAGS_BADGE: '[ng-if=\'help.tags\']', - USE_SELECTED_FEATURES_CHECKBOX: '[name=\'ctrl.useSelected\']', - SOURCE_CHECKBOX_WILDCARD: '#savePlaces .custom-checkbox', - OK_BUTTON: '[ng-click=\'ctrl.confirm()\']', - CANCEL_BUTTON: '[ng-click=\'ctrl.cancel()\']' -}; - -exports.setLabelDialog = { - DIALOG: '#importActionConfig', - DIALOG_HEADER: '[title=\'Set Label\']', - colorPicker: { - BUTTON: '#importActionConfig [ng-click=\'colorPicker.togglePopup()\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - SIZE_DROPDOWN: '#importActionConfig [max=\'labelCtrl.maxSize\']', - Column: { - HANDLE_WILDCARD: '[title=\'Click and Drag to move this label\']', - CHECKBOX_WILDCARD: '[ng-model=\'label.showColumn\']', - DROPDOWN_WILDCARD: '[title=\'Sets the data field used for labels\']', - REMOVE_COLUMN_BUTTON_WILDCARD: '[title=\'Remove this label\']', - ADD_COLUMN_BUTTON: '[title=\'Add a label\']', - COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', - COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', - COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', - COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' - }, - ADD_CUSTOM_LABEL_CHECKBOX: '[title=\'Add a custom label to each feature\']', - COLUMN_NAME_INPUT: '[name=\'name\']', - VALUE_INPUT: '[name=\'value\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.setSoundDialog = { - DIALOG: '#importActionConfig', - DIALOG_HEADER: '[title=\'Set Sound\']', - SOUND_DROPDOWN: '[ng-model=\'ctrl.sound\']', - DELAY_DROPDOWN: '#importActionConfig [name=\'spinner\']', - DELAY_BADGE: '[content=\'ctrl.help\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.setStyleDialog = { - DIALOG: '#importActionConfig', - DIALOG_HEADER: '[title=\'Set Style\']', - OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', - SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', - Style: { - Icon: { - ICON_BUTTON: '[ng-model=\'icon\']', - ROTATION_CHECKBOX: '.no-text > .fa', - ROTATION_DROPDOWN: '[title=\'Sets the data field used for bearing\']' - }, - LineOfBearing: { - BEARING_DROPDOWN: '[title=\'Sets the data field used for bearing\']', - Manual: { - RADIOBUTTON: '#lengthManual', - INPUT: '#lengthColumn', - SLIDER: '[name=\'length\']', - UNITS_DROPDOWN: '.ml-1[title=\'Sets the units field used for length\']' - }, - Column: { - RADIOBUTTON: '#lengthColumn', - DROPDOWN: '[title=\'Sets the data field used for length\']', - UNITS_DROPDOWN: '[title=\'Sets the data field used for length\']', - MULTIPLER_INPUT: '[ng-model=\'columnLength\']' - }, - showArrow: { - CHECKBOX: '#showArrow', - SIZE_INPUT: '[max=\'maxSize[ctrl.arrowUnits]\']', - UNITS_DROPDOWN: '[title=\'Sets the units field used for arrow size\']' - }, - showEllipse: { - CHECKBOX: '#showEllipse', - SHOW_ELLIPSOIDS_CHECKBOX: '[name=\'showEllipsoids\']', - SHOW_GROUND_REF_CHECKBOX: '[name=\'showGroundReference\']' - }, - showError: { - CHECKBOX: '#showError', - TIP_BUTTON: '[x-content=\'ctrl.helpText\']', - TIP_POPUP: '.popover', - BEARING_ERR_DROPDOWN: '[title=\'Sets the data field used for bearing error\']', - BEARING_ERR_MULTIPLYER_INPUT: '[ng-model=\'bearingErrorMultiplier\']', - LENGTH_ERR_DROPDOWN: '[title=\'Sets the data field used for length error\']', - LENGTH_ERR_UNITS_DROPDOWN: '[ng-model=\'ctrl.lengthErrorUnits\']', - LENGTH_ERR_MULTIPLER_INPUT: '[ng-model=\'lengthErrorMultiplier\']' - } - }, - LineOfBearingWithCenter: { - CENTER_DROPDOWN: '[ng-model=\'$parent.centerShape\']', - BEARING_DROPDOWN: '[title=\'Sets the data field used for bearing\']', - Manual: { - RADIOBUTTON: '#lengthManual', - INPUT: '#lengthColumn', - SLIDER: '[name=\'length\']', - UNITS_DROPDOWN: '.ml-1[title=\'Sets the units field used for length\']' - }, - Column: { - RADIOBUTTON: '#lengthColumn', - DROPDOWN: '[title=\'Sets the data field used for length\']', - UNITS_DROPDOWN: '[title=\'Sets the data field used for length\']', - MULTIPLER_INPUT: '[ng-model=\'columnLength\']' - }, - showArrow: { - CHECKBOX: '#showArrow', - SIZE_INPUT: '[max=\'maxSize[ctrl.arrowUnits]\']', - UNITS_DROPDOWN: '[title=\'Sets the units field used for arrow size\']' - }, - showEllipse: { - CHECKBOX: '#showEllipse', - SHOW_ELLIPSOIDS_CHECKBOX: '[name=\'showEllipsoids\']', - SHOW_GROUND_REF_CHECKBOX: '[name=\'showGroundReference\']' - }, - showError: { - CHECKBOX: '#showError', - TIP_BUTTON: '[x-content=\'ctrl.helpText\']', - TIP_POPUP: '.popover', - BEARING_ERR_DROPDOWN: '[title=\'Sets the data field used for bearing error\']', - BEARING_ERR_MULTIPLYER_INPUT: '[ng-model=\'bearingErrorMultiplier\']', - LENGTH_ERR_DROPDOWN: '[title=\'Sets the data field used for length error\']', - LENGTH_ERR_UNITS_DROPDOWN: '[ng-model=\'ctrl.lengthErrorUnits\']', - LENGTH_ERR_MULTIPLER_INPUT: '[ng-model=\'lengthErrorMultiplier\']' - } - } - }, - OK_BUTTON: '[ng-class=\'yesIcon\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.settingsDialog = { - DIALOG: '#settings', - DIALOG_HEADER: '[title=\'Settings\']', - DIALOG_CLOSE: '#settings .close', - Tabs: { - ACTIVE_TAB: '.selected', - columnAssociations: { - TAB: ':contains("Column Associations").slick-cell', - PANEL: ':contains("Column Associations").container-fluid', - CREATE_BUTTON: '[ng-click=\'cmCtrl.create()\']', - EXPORT_BUTTON: '[ng-click=\'cmCtrl.export()\']', - IMPORT_BUTTON: '[ng-click=\'cmCtrl.import()\']', - Association: { - NODE_WILDCARD: '.js-node-toggle', - NODE_EXPANDED_WILDCARD_CLASS: 'fa-caret-down', - NODE_COLLAPSED_WILDCARD_CLASS: 'fa-caret-right', - ROW_WILDCARD: '[label=\'Settings\'] .container-fluid .slick-cell', - EDIT_BUTTON_WILDCARD: '[title=\'Edit the column mapping\']', - REMOVE_BUTTON_WILDCARD: '[title=\'Remove the column mapping\']', - ROW_1: '[label=\'Settings\'] .container-fluid .slick-cell:eq(0)', - ROW_1_EDIT_BUTTON: '[title=\'Edit the column mapping\']:eq(0)', - ROW_1_REMOVE_BUTTON: '[title=\'Remove the column mapping\']:eq(0)', - ROW_2: '[label=\'Settings\'] .container-fluid .slick-cell:eq(1)', - ROW_2_EDIT_BUTTON: '[title=\'Edit the column mapping\']:eq(1)', - ROW_2_REMOVE_BUTTON: '[title=\'Remove the column mapping\']:eq(1)', - ROW_3: '[label=\'Settings\'] .container-fluid .slick-cell:eq(2)', - ROW_3_EDIT_BUTTON: '[title=\'Edit the column mapping\']:eq(2)', - ROW_3_REMOVE_BUTTON: '[title=\'Remove the column mapping\']:eq(2)' - } - }, - dataServers: { - TAB: ':contains("Data Servers").slick-cell', - PANEL: ':contains("Data Servers").container-fluid', - ADD_SERVER_BUTTON: '[title=\'Add a new server\']', - SERVER_WILDCARD: '[ng-repeat=\'item in data\']', - SERVER_CHECKBOX_WILDCARD: '[ng-change=\'servers.update()\']', - SERVER_ONLINE_BADGE_WILDCARD: '[title=\'Online\']', - SERVER_OFFLINE_BADGE_WILDCARD: '[title=\'Offline\']', - EDIT_SERVER_BUTTON_WILDCARD: '[title=\'Edit server\']', - DELETE_SERVER_BUTTON_WILDCARD: '[title=\'Delete server\']', - REFRESH_SERVER_BUTTON_WILDCARD: '[title=\'Refresh server\']', - SERVER_1: '[ng-repeat=\'item in data\']:eq(0)', - SERVER_2: '[ng-repeat=\'item in data\']:eq(1)', - SERVER_3: '[ng-repeat=\'item in data\']:eq(2)', - SERVER_4: '[ng-repeat=\'item in data\']:eq(3)', - SERVER_5: '[ng-repeat=\'item in data\']:eq(4)' - }, - locationFormat: { - TAB: ':contains("Location Format").slick-cell', - PANEL: ':contains("Location Format").container-fluid', - DEG_RADIO_BUTTON: '[title=\'Use DEG\']', - DMS_RADIO_BUTTON: '[title=\'Use DMS\']', - DDM_RADIO_BUTTON: '[title=\'Use DDM\']', - MGRS_RADIO_BUTTON: '[title=\'Use MGRS\']' - }, - Map: { - TAB: ':contains("Map").slick-cell', - PANEL: '[generic=\'defaultsettingui\']', - Areas: { - TAB: ':contains("Areas").slick-cell', - PANEL: ':contains("Areas").container-fluid', - includeOptions: { - colorPicker: { - BUTTON: '[title=\'Sets the color of include areas\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - WIDTH_SLIDER: '[value=\'area.inWidth\']' - }, - excludeOptions: { - colorPicker: { - BUTTON: '[title=\'Sets the color of exclude areas\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - }, - RESET_BUTTON: '[ng-click=\'palette.reset()\']' - }, - WIDTH_SLIDER: '[value=\'area.exWidth\']' - }, - RESET_ALL_BUTTON: '[ng-click=\'area.reset()\']' - }, - Bearing: { - TAB: ':contains("Bearing").slick-cell', - PANEL: ':contains("Bearing").container-fluid', - TRUE_NORTH_RADIO_BUTTON: '#trueNorth', - MAGNETIC_NORTH_RADIO_BUTTON: '#magnetic', - CLICK_HERE_LINK: '[ng-if=\'helpUrl\'] a' - }, - Display: { - TAB: ':contains("Display").slick-cell', - PANEL: ':contains("Display").container-fluid', - mapMode: { - FLAT_MAP_2D_RADIO_BUTTON: '#mapMode2D', - GLOBE_3D_RADIO_BUTTON: '#mapMode3D' - }, - Position: { - DEFAULT_RADIO_BUTTON: '#cameraModeDefault', - FIXED_RADIO_BUTTON: '#cameraModeFixed', - REMEMBER_LAST_RADIO_BUTTON: '#cameraModeRemember', - LATITUDE_TEXT: '[ng-if=\'display.cameraState\'] .col:eq(0)', - LONGITUDE_TEXT: '[ng-if=\'display.cameraState\'] .col:eq(1)', - ZOOM_TEXT: '[ng-if=\'display.cameraState\'] .col:eq(2)' - }, - globeOptions: { - ENABLE_SKY_CHECKBOX: '#skyEnabled', - ENABLE_SKY_BADGE: '[content=\'display.help.sky\']', - ENABLE_SUNLIGHT_CHECKBOX: '#sunlightEnabled', - ENABLE_SUNLIGHT_BADGE: '[content=\'display.help.sunlight\']', - ENABLE_FOG_CHECKBOX: '#fogEnabled', - ENABLE_FOG_BADGE: '[content=\'display.help.fog\']', - FOG_DENSITY_SLIDER: '.ui-slider-handle' - } - }, - Interpolation: { - TAB: ':contains("Interpolation").slick-cell', - PANEL: ':contains("Interpolation").container-fluid', - GEODESIC_RADIO_BUTTON: '#geodesicInterpolation', - RHUMB_RADIO_BUTTON: '#rhumbInterpolation', - GRANULARITY_INPUT: '[name=\'kilometers\']' - }, - Legend: { - TAB: ':contains("Legend").slick-cell', - PANEL: ':contains("Legend").container-fluid', - OPEN_LEGEND_BUTTON: '[title=\'Open the legend on the map\']', - contentOptions: { - SHOW_FEATURE_LAYERS_CHECKBOX: '#legendShowVector', - SHOW_FEATURE_LAYER_TYPE_CHECKBOX: '#legendShowVectorType', - SHOW_FEATURE_COUNT_CHECKBOX: '#legendShowCount', - SHOW_TILE_LAYERS_CHECKBOX: '#legendShowTile', - SHOW_FEATURE_ACTIONS_CHECKBOX: '#legendShowFeatureActions', - SHOW_AUTO_COLORS_CHECKBOX: '#legendShowAuto', - SHOW_MANUAL_COLORS_CHECKBOX: '#legendShowManual', - SHOW_COLUMN_IN_LABEL_CHECKBOX: '#legendShowColumn' - }, - displayOptions: { - SHOW_BACKGROUND_CHECKBOX: '#legendShowBackground', - BOLD_TOGGLE_BUTTON: '[ng-click=\'legend.toggleBold()\']', - DECREASE_FONT_BUTTON: '[ng-click=\'legend.decreaseFontSize()\']', - INCREASE_FONT_BUTTON: '[ng-click=\'legend.increaseFontSize()\']', - colorPicker: { - BUTTON: '[title=\'Change the legend background color\']', - SELECTED_COLOR: '.c-colorpalette__selected', - Color: { - WHITE: '[title=\'#ffffff\']', - BLACK: '[title=\'#000000\']', - RED: '[title=\'#FF0000\']', - ORANGE: '[title=\'#FFA500\']', - YELLOW: '[title=\'#FFFF00\']', - GREEN: '[title=\'#008000\']', - BLUE: '[title=\'#0000FF\']', - INDIGO: '[title=\'#4B0082\']', - VIOLET: '[title=\'#EE82EE\']' - } - }, - OPACITY_SLIDER: '.ui-slider-handle' - } - }, - Projection: { - TAB: ':contains("Projection").slick-cell', - PANEL: ':contains("Projection").container-fluid', - MAP_PROJECTION_DROPDOWN: '[ng-model=\'projCtrl.projection\']', - APPLY_BUTTON: '[ng-click=\'projCtrl.apply()\']' - }, - Units: { - TAB: ':contains("Units").slick-cell', - PANEL: ':contains("Units").container-fluid', - IMPERIAL_RADIO_BUTTON: '#imperial', - METRIC_RADIO_BUTTON: '#metric', - NAUTICAL_RADIO_BUTTON: '#metric', - NAUTICAL_MILES_ONLY_RADIO_BUTTON: '#nauticalmile', - MILES_ONLY_RADIO_BUTTON: '#mile', - YARDS_ONLY_RADIO_BUTTON: '#yard', - FEET_ONLY_RADIO_BUTTON: '#feet' - } - }, - Theme: { - TAB: ':contains("Theme").slick-cell', - PANEL: ':contains("Theme").container-fluid', - PRIMARY_THEME_DROPDOWN: '[ng-change=\'ctrl.onThemeChange()\']', - ACCESSIBILITY_OPTIONS_DROPDOWN: '[ng-model=\'ctrl.accessibleTheme\']' - } - }, - RESET_BUTTON: '[ng-click=\'setCon.reset();\']', - CLOSE_BUTTON: '[ng-click=\'setCon.close()\']' -}; - -exports.shpImportDialog = { - DIALOG: '[label=\'SHP Import\']', - DIALOG_HEADER: '[title=\'SHP Import\']', - DIALOG_CLOSE: '[label=\'SHP Import\'] .close', - Tabs: { - Time: { - FORMAT_HELP_BUTTON: '[title=\'Help for custom date and time formats\']', - noTime: { - RADIO_BUTTON: '[name=\'timeTypeRadios\']:eq(0)' - }, - Instant: { - RADIOBUTTON: '[value=\'instant\']', - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - } - }, - timeRange: { - RADIOBUTTON: '[value=\'range\']', - Start: { - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']:eq(0)', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(0)', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(0)', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(0)', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(0)', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(0)' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - } - }, - End: { - Type: { - DROPDOWN: '[ng-model=\'model.dateType\']:eq(1)', - dateTime: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' - }, - separateDateTime: { - DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(1)', - DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(1)', - DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)', - TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(1)', - TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(1)', - TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(1)' - }, - dateOnly: { - DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', - FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', - CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' - }, - SAMPLE_TEXT: '.d-block:eq(0)', - RESULT_TEXT: '.d-block:eq(1)' - } - } - }, - PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' - }, - Options: { - LAYER_TITLE_INPUT: '[name=\'title\']', - DESCRIPTION_INPUT: '[name=\'desc\']', - TAGS_INPUT: '[name=\'tags\']', - COLOR_PICKER: '[name=\'color\']' - } - }, - PREV_BUTTON: '[title=\'Previous step\']', - NEXT_BUTTON: '[title=\'Next step\']', - DONE_BUTTON: '[ng-click=\'wiz.accept()\']', - CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' -}; - -exports.statusBar = { - PANEL: '.o-navbottom', - ALTITUDE_TEXT: '.altitude-text', - ZOOM_TEXT: '.zoom-text', - Scale: { - BAR: '.ol-scale-line', - Menu: { - PANEL: '#menu', - menuOptions: { - IMPERIAL: '[title=\'Switches to Imperial\']', - METRIC: '[title=\'Switches to Metric\']', - NAUTICAL: '[title=\'Switches to Nautical\']', - NAUTICAL_MILES_ONLY: '[title=\'Switches to Nautical Miles Only\']', - MILES_ONLY: '[title=\'Switches to Miles Only\']', - YARDS_ONLY: '[title=\'Switches to Yards Only\']', - FEET_ONLY: '[title=\'Switches to Feet Only\']' - } - } - }, - COORDINATES_TEXT: '.ol-mouse-position', - SETTINGS_BUTTON: '[title=\'View Settings\']', - LEGEND_BUTTON: '[title=\'View Legend\']', - SERVERS_BUTTON: '[title=Servers]', - ALERTS_BUTTON: '[title=Alerts]', - ALERTS_UNREAD_BADGE: '[title=Alerts] .badge', - HISTORY_BUTTON: '[title=History]', - Mute: { - BUTTON: '.fa-volume-off, .fa-volume-up', - SOUND_ON_CLASS: 'fa-volume-up', - SOUND_OFF_CLASS: 'fa-volume-off' - } -}; - -exports.sunAndMoonDialog = { - DIALOG: '#suncalc', - DIALOG_HEADER: '[title=\'Sun and Moon Info\']', - DIALOG_CLOSE: '#suncalc .close', - COORDINATES_TEXT: '[ng-bind-html=\'simpleLocationCtrl.location\']', - DD_BUTTON: '[title=\'Display in Decimal Degrees\']', - DMS_BUTTON: '[title=\'Display in Degrees Minutes Seconds\']', - DDM_BUTTON: '[title=\'Display in Degrees Decimal Minutes\']', - MGRS_BUTTON: '[title=\'Display in Military Grid Reference System\']', - DATE_TIME_TEXT: 'div.ng-binding.mb-2', - OK_BUTTON: '[ng-click=\'ctrl.close()\']' -}; - -exports.Timeline = { - PANEL: '[ng-if=\'mainCtrl.timeline\']', - VIEW_WINDOW: '.extent:eq(0)', - HISTOGRAM_POINTS: '.c-histogram-group__line-point', - START_DATE_TIME_TEXT: '.order-0', - PREV_BUTTON: '[title=\'Previous frame\']', - PLAY_BUTTON: '[title=\'Toggle animation of tiles/features on the map\']', - NEXT_BUTTON: '[title=\'Next frame\']', - PAUSE_BUTTON: '[title=\'Toggle animation of tiles/features on the map\']', - RECORD_BUTTON: '#timeline-record-button', - END_DATE_TIME_TEXT: '.order-md-2' -}; - -exports.Toolbar = { - PANEL: '.o-navtop', - addData: { - BUTTON: '#addDataButton', - OPEN_FILE_BUTTON: '[title=\'Open a file or URL\']', - Menu: { - BUTTON: '.o-add-data-button .dropdown-toggle', - PANEL: '#menu', - menuOptions: { - ADD_DATA: '[title=\'Browse the data catalog\']', - OPEN_FILE_OR_URL: '[title=\'Import data from a local file or a URL\']', - ADD_CESIUM_ION_ASSET: '[title=\'Loads a Cesium Ion asset in 3D mode\']', - RECENT_STREET_MAP: ':contains(\'Street Map (Map)\').text-truncate', - RECENT_WORLD_IMAGERY: ':contains(\'World Imagery (Map)\').text-truncate' - }, - Recent: { - DATA_WILDCARD: '[role=\'menuitem\']', - DATA_1: '[role=\'menuitem\']:eq(3)', - DATA_2: '[role=\'menuitem\']:eq(4)', - DATA_3: '[role=\'menuitem\']:eq(5)', - DATA_4: '[role=\'menuitem\']:eq(6)', - DATA_5: '[role=\'menuitem\']:eq(7)' - } - } - }, - LAYERS_TOGGLE_BUTTON: '[title=\'View Layers\']', - Drawing: { - BUTTON: '[title=\'Draws a box on the map for queries, zoom, and selection\']', - BUTTON_IS_ACTIVE_CLASS: 'active', - Menu: { - BUTTON: '[ng-click=\'drawControls.toggleMenu()\']', - PANEL: '#menu', - menuOptions: { - BOX: ':contains(\'Box\')[role=\'menuitem\']', - CIRCLE: ':contains(\'Circle\')[role=\'menuitem\']', - POLYGON: ':contains(\'Polygon\')[role=\'menuitem\']', - LINE: ':contains(\'Line\')[role=\'menuitem\']', - CHOOSE_AREA: ':contains(\'Choose Area\')[role=\'menuitem\']', - ENTER_COORDINATES: ':contains(\'Enter Coordinates\')[role=\'menuitem\']', - WHOLE_WORLD: ':contains(\'Whole World\')[role=\'menuitem\']' - } - } - }, - Measure: { - BUTTON: '#measureButton', - BUTTON_IS_ACTIVE_CLASS: 'active', - Menu: { - BUTTON: '.btn-secondary.dropdown-toggle-split[ng-click=\'ctrl.openMenu()\']', - PANEL: '#menu', - menuOptions: { - MEASURE_GEODESIC: '[title=\'Measures the shortest distance between two points (variable bearing).\']', - MEASURE_RHUMB_LINE: '[title=\'Measures the path of constant bearing between two points.\']' - } - } - }, - CLEAR_BUTTON: '[title=\'Select items to clear/reset\']', - PREVIOUS_DAY_BUTTON: '[title=\'Previous day\']', - Date: { - INPUT: '[placeholder=Date]', - Calendar: { - PANEL: '#ui-datepicker-div', - MONTH_DROPDOWN: '.ui-datepicker-month', - YEAR_DROPDOWN: '.ui-datepicker-year', - CURRENT_DAY: '.ui-state-active', - TODAY_BUTTON: '.ui-datepicker-current', - CLOSE_BUTTON: '.ui-datepicker-close' - } - }, - NEXT_DAY_BUTTON: '[title=\'Next day\']', - DURATION_DROPDOWN: '[title=Duration]', - timeFilter: { - BUTTON: '[title=\'Show/hide time filter panel\']', - BUTTON_IS_ACTIVE_CLASS: 'btn-info', - PANEL: '.c-date-panel__extended', - START_HOUR_INPUT: '[ng-model=\'ctrl.startHour\']', - START_MINUTE_INPUT: '[ng-model=\'ctrl.startMinute\']', - END_HOUR_INPUT: '[ng-model=\'ctrl.endHour\']', - END_MINUTE_INPUT: '[ng-model=\'ctrl.endMinute\']', - APPLY_BUTTON: '[title=\'Apply time slice\']' - }, - TIMELINE_TOGGLE_BUTTON: '#timelineButton', - Save: { - Menu: { - BUTTON: '[title=\'Save options\']', - PANEL: '#menu', - menuOptions: { - STATE: '[title=\'Save the application state\']', - SCREENSHOT: '[title=\'Save a screenshot\']' - } - } - }, - States: { - Menu: { - BUTTON: '[title=\'State options\']', - PANEL: '#menu', - menuOptions: { - IMPORT_STATE: '[title=\'Import a state from a local file or a URL\']', - SAVE_STATE: '[title=\'Save the application state\']', - DISABLE_STATES: '[title=\'Disable all active application states\']' - } - } - }, - Search: { - Menu: { - BUTTON: '.c-search-box__dropdown', - PANEL: '.js-searchbox__search-options', - searchTypes: { - ALL_BUTTON: '[ng-click=\'searchBox.toggleAll(true)\']', - NONE_BUTTON: '[ng-click=\'searchBox.toggleAll(false)\']', - COORDINATES_CHECKBOX: ':contains(\'Coordinates\') .dropdown-item', - LAYERS_CHECKBOX: ':contains(\'Layers\') .dropdown-item' - }, - recentSearches: { - SEARCH_WILDCARD: '[ng-repeat=\'recent in searchBox.recentSearches\']', - SEARCH_1: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(0)', - SEARCH_2: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(1)', - SEARCH_3: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(2)', - SEARCH_4: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(3)', - SEARCH_5: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(4)' - } - }, - Results: { - PANEL: '.c-searchresults', - resultCard: { - PANEL_WILDCARD: '.card', - HEADER_WILDCARD: '.card-header', - SUBTITLE_WILDCARD: '.card-subtitle', - BODY_WILDCARD: '.card-body', - REMOVE_BUTTON_WILDCARD: '.card :contains(\'Remove\') > button', - ADD_BUTTON_WILDCARD: '.card :contains(\'Add\') > button', - GO_TO_BUTTON_WILDCARD: '.card [title=\'View the result on the map\']' - }, - resultCard1: { - PANEL: '.card:eq(0)', - HEADER: '.card-header:eq(0)', - SUBTITLE: '.card-subtitle:eq(0)', - BODY: '.card-body:eq(0)', - REMOVE_BUTTON: '.card:eq(0) :contains(\'Remove\') > button', - ADD_BUTTON: '.card:eq(0) :contains(\'Add\') > button', - GO_TO_BUTTON: '.card:eq(0) [title=\'View the result on the map\']' - }, - resultCard2: { - PANEL: '.card:eq(1)', - HEADER: '.card-header:eq(1)', - SUBTITLE: '.card-subtitle:eq(1)', - BODY: '.card-body:eq(1)', - REMOVE_BUTTON: '.card:eq(1) :contains(\'Remove\') > button', - ADD_BUTTON: '.card:eq(1) :contains(\'Add\') > button', - GO_TO_BUTTON: '.card:eq(1) [title=\'View the result on the map\']' - }, - resultCard3: { - PANEL: '.card:eq(2)', - HEADER: '.card-header:eq(2)', - SUBTITLE: '.card-subtitle:eq(2)', - BODY: '.card-body:eq(2)', - REMOVE_BUTTON: '.card:eq(2) :contains(\'Remove\') > button', - ADD_BUTTON: '.card:eq(2) :contains(\'Add\') > button', - GO_TO_BUTTON: '.card:eq(2) [title=\'View the result on the map\']' - }, - resultCard4: { - PANEL: '.card:eq(3)', - HEADER: '.card-header:eq(3)', - SUBTITLE: '.card-subtitle:eq(3)', - BODY: '.card-body:eq(3)', - REMOVE_BUTTON: '.card:eq(3) :contains(\'Remove\') > button', - ADD_BUTTON: '.card:eq(3) :contains(\'Add\') > button', - GO_TO_BUTTON: '.card:eq(3) [title=\'View the result on the map\']' - }, - resultCard5: { - PANEL: '.card:eq(4)', - HEADER: '.card-header:eq(4)', - SUBTITLE: '.card-subtitle:eq(4)', - BODY: '.card-body:eq(4)', - REMOVE_BUTTON: '.card:eq(4) :contains(\'Remove\') > button', - ADD_BUTTON: '.card:eq(4) :contains(\'Add\') > button', - GO_TO_BUTTON: '.card:eq(4) [title=\'View the result on the map\']' - } - }, - INPUT: '.c-search-box__input', - CLEAR_BUTTON: '[title=\'Clear search\']', - BUTTON: '[type=submit]' - }, - Support: { - Menu: { - BUTTON: '[title=Support]', - PANEL: '#menu', - menuOptions: { - ABOUT: '[title=\'About OpenSphere\']', - CONTROLS: '[title=\'Keyboard and mouse controls\']', - SHOW_TIPS: '[title=\'Reset help tips, and show the initial set of tips\']', - OPENSPHERE_CAPABILITIES: '[title=\'Display the OpenSphere Capabilities\']', - VIEW_ALERTS: '[title=\'Display the alert log\']', - VIEW_LOG: '[title=\'Display the application log\']', - RESET_SETTINGS: '[evt-type=\'displayClearLocalStorage\']' - } - } - } -}; - -exports.trackNameDialog = { - DIALOG: '[label=\'Track Name\']', - DIALOG_HEADER: '[title=\'Track Name\']', - TRACK_NAME_INPUT: '[name=\'title\']', - OK_BUTTON: '[ng-class=\'yesButtonClass\']', - CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' -}; - -exports.welcomeToOpenSphereDialog = { - DIALOG: '.js-onboarding__popover', - DIALOG_HEADER: '.popover-header', - DIALOG_CLOSE: '.js-onboarding__popover .close', - DESCRIPTION_TEXT: '[ng-bind-html=\'ngOnboardCtrl.description\']', - STOP_SHOWING_TIPS_BUTTON: '[ng-click=\'ngOnboardCtrl.stopShowing()\']', - NEXT_BUTTON: '[ng-click=\'ngOnboardCtrl.next()\']' -}; diff --git a/cypress/support/selectors/core.js b/cypress/support/selectors/core.js new file mode 100644 index 000000000..e27008f73 --- /dev/null +++ b/cypress/support/selectors/core.js @@ -0,0 +1,272 @@ +exports.Application = { + PAGE: 'body', + HIDDEN_FILE_INPUT: 'input[type=\'file\']' +}; + +exports.Map = { + CONTAINER: '#map-container', + CANVAS_3D: '.webgl-canvas', + CANVAS_2D: '.canvas:eq(0)', + OVERVIEW_MAP: '.ol-overviewmap-map', + OVERVIEW_MAP_TOGGLE_BUTTON: '[title=\'Overview map\']', + ZOOM_IN_BUTTON: '.ol-zoom-in', + ZOOM_OUT_BUTTON: '.ol-zoom-out', + ROTATION_BUTTON: '.ol-rotate', + MAP_MODE_BUTTON: '.ol-mapmode', + ATTRIBUTION: '.ol-attribution', + contextMenu: { + PANEL: '#menu', + RESET_VIEW: '[title=\'Resets to the default view\']', + RESET_ROTATION: '[title=\'Resets to the default rotation\']', + TOGGLE_2D_3D_VIEW: '[title=\'Toggle the map view between 2D and 3D views\']', + SHOW_LEGEND: '[title=\'Display the map legend\']', + CLEAR_SELECTION: '[title=\'Clears the selected features across all layers\']', + BACKGROUND_COLOR: '[title=\'Change the map background color\']', + Sky: { + OPTION: '[title=\'Show the sky/stars around the 3D globe\']', + IS_ACTIVE_CLASS: '[title=\'Show the sky/stars around the 3D globe\'] .fa-check-square-o', + IS_INACTIVE_CLASS: '[title=\'Show the sky/stars around the 3D globe\'] .fa-square-o' + }, + Sunlight: { + OPTION: '[title=\'Light the 3D globe with the Sun\']', + IS_ACTIVE_CLASS: '[title=\'Light the 3D globe with the Sun\'] .fa-check-square-o', + IS_INACTIVE_CLASS: '[title=\'Light the 3D globe with the Sun\'] .fa-square-o' + }, + COPY_COORDINATES: '[title=\'Copy coordinates to clipboard\']', + CREATE_BUFFER_REGION: '[title=\'Create a buffer region around the clicked coordinate\']', + SUN_MOON_INFO: '[title=\'See sun/moon event times for this location\']', + SAVE_TO_PLACES: '[title=\'Creates a new saved place from this location\']', + CREATE_ANNOTATION: '[title=\'Creates a new annotation at this location\']' + } +}; + +exports.statusBar = { + PANEL: '.o-navbottom', + ALTITUDE_TEXT: '.altitude-text', + ZOOM_TEXT: '.zoom-text', + Scale: { + BAR: '.ol-scale-line', + Menu: { + PANEL: '#menu', + IMPERIAL: '[title=\'Switches to Imperial\']', + METRIC: '[title=\'Switches to Metric\']', + NAUTICAL: '[title=\'Switches to Nautical\']', + NAUTICAL_MILES_ONLY: '[title=\'Switches to Nautical Miles Only\']', + MILES_ONLY: '[title=\'Switches to Miles Only\']', + YARDS_ONLY: '[title=\'Switches to Yards Only\']', + FEET_ONLY: '[title=\'Switches to Feet Only\']' + } + }, + COORDINATES_TEXT: '.ol-mouse-position', + SETTINGS_BUTTON: '[title=\'View Settings\']', + LEGEND_BUTTON: '[title=\'View Legend\']', + SERVERS_BUTTON: '[title=Servers]', + ALERTS_BUTTON: '[title=Alerts]', + ALERTS_UNREAD_BADGE: '[title=Alerts] .badge', + HISTORY_BUTTON: '[title=History]', + Mute: { + BUTTON: '.fa-volume-off, .fa-volume-up', + SOUND_ON_CLASS: 'fa-volume-up', + SOUND_OFF_CLASS: 'fa-volume-off' + } +}; + +exports.Timeline = { + PANEL: '[ng-if=\'mainCtrl.timeline\']', + VIEW_WINDOW: '.extent:eq(0)', + HISTOGRAM_POINTS: '.c-histogram-group__line-point', + START_DATE_TIME_TEXT: '.order-0', + PREV_BUTTON: '[title=\'Previous frame\']', + PLAY_BUTTON: '[title=\'Toggle animation of tiles/features on the map\']', + NEXT_BUTTON: '[title=\'Next frame\']', + PAUSE_BUTTON: '[title=\'Toggle animation of tiles/features on the map\']', + RECORD_BUTTON: '#timeline-record-button', + END_DATE_TIME_TEXT: '.order-md-2' +}; + +exports.Toolbar = { + PANEL: '.o-navtop', + addData: { + BUTTON: '#addDataButton', + OPEN_FILE_BUTTON: '[title=\'Open a file or URL\']', + Menu: { + BUTTON: '.o-add-data-button .dropdown-toggle', + PANEL: '#menu', + ADD_DATA: '[title=\'Browse the data catalog\']', + OPEN_FILE_OR_URL: '[title=\'Import data from a local file or a URL\']', + ADD_CESIUM_ION_ASSET: '[title=\'Loads a Cesium Ion asset in 3D mode\']', + RECENT_STREET_MAP: ':contains(\'Street Map (Map)\').text-truncate', + RECENT_WORLD_IMAGERY: ':contains(\'World Imagery (Map)\').text-truncate' + }, + Recent: { + DATA: '[role=\'menuitem\']', + DATA_1: '[role=\'menuitem\']:eq(3)', + DATA_2: '[role=\'menuitem\']:eq(4)', + DATA_3: '[role=\'menuitem\']:eq(5)', + DATA_4: '[role=\'menuitem\']:eq(6)', + DATA_5: '[role=\'menuitem\']:eq(7)' + } + }, + LAYERS_TOGGLE_BUTTON: '[title=\'View Layers\']', + Drawing: { + BUTTON: '[title=\'Draws a box on the map for queries, zoom, and selection\']', + BUTTON_IS_ACTIVE_CLASS: 'active', + Menu: { + BUTTON: '[ng-click=\'drawControls.toggleMenu()\']', + PANEL: '#menu', + BOX: ':contains(\'Box\')[role=\'menuitem\']', + CIRCLE: ':contains(\'Circle\')[role=\'menuitem\']', + POLYGON: ':contains(\'Polygon\')[role=\'menuitem\']', + LINE: ':contains(\'Line\')[role=\'menuitem\']', + CHOOSE_AREA: ':contains(\'Choose Area\')[role=\'menuitem\']', + ENTER_COORDINATES: ':contains(\'Enter Coordinates\')[role=\'menuitem\']', + WHOLE_WORLD: ':contains(\'Whole World\')[role=\'menuitem\']' + } + }, + Measure: { + BUTTON: '#measureButton', + BUTTON_IS_ACTIVE_CLASS: 'active', + Menu: { + BUTTON: '.btn-secondary.dropdown-toggle-split[ng-click=\'ctrl.openMenu()\']', + PANEL: '#menu', + MEASURE_GEODESIC: '[title=\'Measures the shortest distance between two points (variable bearing).\']', + MEASURE_RHUMB_LINE: '[title=\'Measures the path of constant bearing between two points.\']' + } + }, + CLEAR_BUTTON: '[title=\'Select items to clear/reset\']', + PREVIOUS_DAY_BUTTON: '[title=\'Previous day\']', + Date: { + INPUT: '[placeholder=Date]', + Calendar: { + PANEL: '#ui-datepicker-div', + MONTH_DROPDOWN: '.ui-datepicker-month', + YEAR_DROPDOWN: '.ui-datepicker-year', + CURRENT_DAY: '.ui-state-active', + TODAY_BUTTON: '.ui-datepicker-current', + CLOSE_BUTTON: '.ui-datepicker-close' + } + }, + NEXT_DAY_BUTTON: '[title=\'Next day\']', + DURATION_DROPDOWN: '[title=Duration]', + timeFilter: { + BUTTON: '[title=\'Show/hide time filter panel\']', + BUTTON_IS_ACTIVE_CLASS: 'btn-info', + PANEL: '.c-date-panel__extended', + START_HOUR_INPUT: '[ng-model=\'ctrl.startHour\']', + START_MINUTE_INPUT: '[ng-model=\'ctrl.startMinute\']', + END_HOUR_INPUT: '[ng-model=\'ctrl.endHour\']', + END_MINUTE_INPUT: '[ng-model=\'ctrl.endMinute\']', + APPLY_BUTTON: '[title=\'Apply time slice\']' + }, + TIMELINE_TOGGLE_BUTTON: '#timelineButton', + Save: { + Menu: { + BUTTON: '[title=\'Save options\']', + PANEL: '#menu', + STATE: '[title=\'Save the application state\']', + SCREENSHOT: '[title=\'Save a screenshot\']' + } + }, + States: { + Menu: { + BUTTON: '[title=\'State options\']', + PANEL: '#menu', + IMPORT_STATE: '[title=\'Import a state from a local file or a URL\']', + SAVE_STATE: '[title=\'Save the application state\']', + DISABLE_STATES: '[title=\'Disable all active application states\']' + } + }, + Search: { + Menu: { + BUTTON: '.c-search-box__dropdown', + PANEL: '.js-searchbox__search-options', + searchTypes: { + ALL_BUTTON: '[ng-click=\'searchBox.toggleAll(true)\']', + NONE_BUTTON: '[ng-click=\'searchBox.toggleAll(false)\']', + COORDINATES_CHECKBOX: ':contains(\'Coordinates\') .dropdown-item', + LAYERS_CHECKBOX: ':contains(\'Layers\') .dropdown-item' + }, + recentSearches: { + SEARCH: '[ng-repeat=\'recent in searchBox.recentSearches\']', + SEARCH_1: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(0)', + SEARCH_2: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(1)', + SEARCH_3: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(2)', + SEARCH_4: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(3)', + SEARCH_5: '[ng-repeat=\'recent in searchBox.recentSearches\']:eq:(4)' + } + }, + Results: { + PANEL: '.c-searchresults', + resultCard: { + PANEL: '.card', + HEADER: '.card-header', + SUBTITLE: '.card-subtitle', + BODY: '.card-body', + REMOVE_BUTTON: '.card :contains(\'Remove\') > button', + ADD_BUTTON: '.card :contains(\'Add\') > button', + GO_TO_BUTTON: '.card [title=\'View the result on the map\']' + }, + resultCard1: { + PANEL: '.card:eq(0)', + HEADER: '.card-header:eq(0)', + SUBTITLE: '.card-subtitle:eq(0)', + BODY: '.card-body:eq(0)', + REMOVE_BUTTON: '.card:eq(0) :contains(\'Remove\') > button', + ADD_BUTTON: '.card:eq(0) :contains(\'Add\') > button', + GO_TO_BUTTON: '.card:eq(0) [title=\'View the result on the map\']' + }, + resultCard2: { + PANEL: '.card:eq(1)', + HEADER: '.card-header:eq(1)', + SUBTITLE: '.card-subtitle:eq(1)', + BODY: '.card-body:eq(1)', + REMOVE_BUTTON: '.card:eq(1) :contains(\'Remove\') > button', + ADD_BUTTON: '.card:eq(1) :contains(\'Add\') > button', + GO_TO_BUTTON: '.card:eq(1) [title=\'View the result on the map\']' + }, + resultCard3: { + PANEL: '.card:eq(2)', + HEADER: '.card-header:eq(2)', + SUBTITLE: '.card-subtitle:eq(2)', + BODY: '.card-body:eq(2)', + REMOVE_BUTTON: '.card:eq(2) :contains(\'Remove\') > button', + ADD_BUTTON: '.card:eq(2) :contains(\'Add\') > button', + GO_TO_BUTTON: '.card:eq(2) [title=\'View the result on the map\']' + }, + resultCard4: { + PANEL: '.card:eq(3)', + HEADER: '.card-header:eq(3)', + SUBTITLE: '.card-subtitle:eq(3)', + BODY: '.card-body:eq(3)', + REMOVE_BUTTON: '.card:eq(3) :contains(\'Remove\') > button', + ADD_BUTTON: '.card:eq(3) :contains(\'Add\') > button', + GO_TO_BUTTON: '.card:eq(3) [title=\'View the result on the map\']' + }, + resultCard5: { + PANEL: '.card:eq(4)', + HEADER: '.card-header:eq(4)', + SUBTITLE: '.card-subtitle:eq(4)', + BODY: '.card-body:eq(4)', + REMOVE_BUTTON: '.card:eq(4) :contains(\'Remove\') > button', + ADD_BUTTON: '.card:eq(4) :contains(\'Add\') > button', + GO_TO_BUTTON: '.card:eq(4) [title=\'View the result on the map\']' + } + }, + INPUT: '.c-search-box__input', + CLEAR_BUTTON: '[title=\'Clear search\']', + BUTTON: '[type=submit]' + }, + Support: { + Menu: { + BUTTON: '[title=Support]', + PANEL: '#menu', + ABOUT: '[title=\'About OpenSphere\']', + CONTROLS: '[title=\'Keyboard and mouse controls\']', + SHOW_TIPS: '[title=\'Reset help tips, and show the initial set of tips\']', + OPENSPHERE_CAPABILITIES: '[title=\'Display the OpenSphere Capabilities\']', + VIEW_ALERTS: '[title=\'Display the alert log\']', + VIEW_LOG: '[title=\'Display the application log\']', + RESET_SETTINGS: '[evt-type=\'displayClearLocalStorage\']' + } + } +}; diff --git a/cypress/support/selectors/dialogs.js b/cypress/support/selectors/dialogs.js new file mode 100644 index 000000000..e21c8d1e9 --- /dev/null +++ b/cypress/support/selectors/dialogs.js @@ -0,0 +1,722 @@ +exports.aboutDialog = { + DIALOG: '#aboutModal', + DIALOG_HEADER: '[title=\'About\']', + DIALOG_CLOSE: '#aboutModal .close', + CLOSE_BUTTON: '.btn[data-dismiss=\'modal\']' +}; + +exports.addArcServerDialog = { + DIALOG: '[label=\'Add Arc Server\']', + DIALOG_HEADER: '[title=\'Add Arc Server\']', + DIALOG_CLOSE: '[label=\'Add Arc Server\'] .close', + TITLE_INPUT: '[name=\'title\']', + URL_INPUT: '[name=\'url\']', + SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' +}; + +exports.addDataDialog = { + DIALOG: '#addData', + DIALOG_HEADER: '[title=\'Add Data\']', + DIALOG_SHOW_HELP_BUTTON: '[title=\'Show help\']', + DIALOG_CLOSE: '#addData .close', + SEARCH_INPUT: '[placeholder=\'Search available layers\']', + CLEAR_BUTTON: '[title=\'Clear the search term\']', + GROUP_BY_DROPDOWN: '[ng-model=\'addData.view\']', + MANAGE_SERVERS_BUTTON: '[title=\'Add, edit, and remove servers providing data to the application\']', + OPEN_FILE_URL_BUTTON: '[title=\'Open a local file or URL\']', + DESCRIPTION_PANEL: '[bind-directive=\'addData.getInfo()\']', + CLOSE_BUTTON: '[ng-click=\'addData.close()\']', + Tree: { + LAYER_TOGGLE_SWITCH: '.c-toggle-switch', + LAYER_IS_ON_CLASS: 'c-toggle-switch-on', + LAYER_IS_OFF_CLASS: 'c-toggle-switch-off', + REMOVE_THE_FILE_BUTTON: '[title=\'Remove the file\']' + } +}; + +exports.addExpressionDialog = { + DIALOG: '#editfilter', + DIALOG_HEADER: '[title=\'Edit Filter\']', + DIALOG_CLOSE: '#editfilter .close', + COLUMN_DROPDOWN: '[ng-model=\'expr.column\']', + OPERATOR_DROPDOWN: '[ng-model=\'expr.op\']', + EXPRESSION_INPUT: '[ng-model=\'expr.literal\']', + OK_BUTTON: '[ng-click=\'filters.finish()\']', + CANCEL_BUTTON: '[ng-click=\'filters.cancel()\']' +}; + +exports.addFolderDialog = { + DIALOG: '[label=\'Add Folder\']', + DIALOG_HEADER: '[title=\'Add Folder\']', + DIALOG_CLOSE: '[label=\'Add Folder\'] .close', + FOLDER_LABEL_INPUT: '[name=\'title\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.addGeoServerDialog = { + DIALOG: '[label=\'Add GeoServer\']', + DIALOG_HEADER: '[title=\'Add GeoServer\']', + DIALOG_CLOSE: '[label=\'Add GeoServer\'] .close', + TITLE_INPUT: '[name=\'title\']', + URL_INPUT: '[name=\'url\']', + SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' +}; + +exports.addPlaceDialog = { + DIALOG_HEADER: '[title=\'Add Place\']' +}; + +exports.advancedDialog = { + DIALOG: '[label=\'Advanced\']', + DIALOG_HEADER: '[title=\'Advanced\']', + DIALOG_CLOSE: '[label=\'Advanced\'] .close', + LAYER_DROPDOWN: '[ng-model=\'layer\']', + GROUP_BY_DROPDOWN: '[ng-model=\'order\']', + ADD_FILTER_BUTTON: '[label=\'Advanced\'] [title=\'Add a filter\']', + ADVANCED_CHECKBOX: '[title=\'Advanced mode allows more specific combinations of layers, filters, and areas\'] input', + EXPAND_ALL_BUTTON: '[title=\'Expand all\']', + COLLAPSE_ALL_BUTTON: '[title=\'Collapse all\']', + RESET_BUTTON: '[title=\'Clears all the checkboxes in the form\']', + Tree: { + OPERATOR_DROPDOWN: '[title=\'Whether to pass all filters (AND) or any filter (OR)\']', + QUERY_EXCLUDE_TOGGLE_BADGE: '[title=\'Toggles between querying and excluding the area\']', + EDIT_LAYER_BUTTON: '[title=\'Edit\']', + REMOVE_LAYER_BUTTON: '[title=\'Remove\']' + }, + EXPORT_BUTTON: '[ng-click=\'comboCtrl.launchExport()\']', + Import: { + BUTTON: '[ng-click=\'comboCtrl.launchExport()\']', + Menu: { + BUTTON: '[ng-click=\'comboCtrl.openImportMenu()\']', + IMPORT_FILE_URL: '[title=\'Import areas from a file or URL\']', + ENTER_COORDINATES: '[title=\'Enter coordinates to load data for a box, circle, or polygon\']', + WHOLE_WORLD: '[title=\'Load data for the whole world\']' + } + }, + APPLY_BUTTON: '[ng-click=\'comboCtrl.apply()\']', + CLOSE_BUTTON: '[ng-click=\'comboCtrl.close()\']' +}; + +exports.alertsDialog = { + DIALOG: '#alerts', + DIALOG_HEADER: '[title=\'Alerts\']', + DIALOG_CLOSE: '#alerts .close', + ALERT: '.alert', + SHOW_POPUPS_CHECKBOX: '#alerts__show-popups', + CLEAR_ALERTS_BUTTON: '[title=\'Clear all alerts\']' +}; + +exports.chooseAnIconDialog = { + DIALOG: '#iconselector', + DIALOG_HEADER: '[title=\'Choose an Icon\']', + DIALOG_CLOSE: '#iconselector .close', + Pins: { + YELLOW_PUSHPIN: '[title=\'Yellow Push Pin\']', + GREEN_PUSHPIN: '[title=\'Green Push Pin\']', + WHITE_PUSHPIN: '[title=\'White Push Pin\']', + ARROW: '[title=\'Arrow\']', + CIRCLE: '[title=\'Circle\']', + PLANE: '[title=\'Airports\']', + BOAT: '[title=\'Ferry\']', + CHOPPER: '[title=\'Heliport\']', + HOSPITAL: '[title=\'Hospitals\']', + CAUTION: '[title=\'Caution\']' + }, + CURRENT_PIN: '.img-fluid', + OK_BUTTON: '[ng-click=\'selector.okay()\']', + CANCEL_BUTTON: '[ng-click=\'selector.okay()\']' +}; + +exports.chooseAreaDialog = { + DIALOG: '[label=\'Choose Area\']', + DIALOG_HEADER: '[title=\'Choose Area\']', + AREA_DROPDOWN: '[ng-model=\'area\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-click=\'confirm.cancel()\']' +}; + +exports.chooseATrackDialog = { + DIALOG: '[label=\'Choose a Track\']', + DIALOG_HEADER: '[title=\'Choose a Track\']', + TRACK_DROPDOWN: '[ng-model=\'confirm.track\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.chooseTrackSortColumnDialog = { + DIALOG: '[label=\'Choose Track Sort Column\']', + DIALOG_HEADER: '[title=\'Choose Track Sort Column\']', + TRACK_DROPDOWN: '[ng-model=\'confirm.column\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.clearDialog = { + DIALOG: '#clear', + DIALOG_HEADER: '[title=Clear]', + DIALOG_CLOSE: '[label=Clear] .close', + OK_BUTTON: '[ng-click=\'clear.accept()\']', + CANCEL_BUTTON: '[ng-click=\'clear.cancel()\']', + Items: { + ALL: ':contains(\'All\').custom-control', + EXCLUSION_AREAS: ':contains(\'Exclusion Areas\').custom-control', + LAYER_AREA_FILTER_QUERY_COMBINATIONS: ':contains(\'Layer/Area/Filter query combinations\').custom-control', + LAYERS: ':contains(\'Layers\').custom-control', + MAP_POSITION: ':contains(\'Map Position\').custom-control', + NONQUERY_FEATURES: ':contains(\'Non-query Features\').custom-control', + QUERY_AREAS: ':contains(\'Query_Areas\').custom-control', + STATES: ':contains(\'States\').custom-control' + } +}; + +exports.copyCoordinatesDialog = { + DIALOG: '#copyPosition', + DIALOG_HEADER: '[title=\'Copy Coordinates\']', + DIALOG_TEXT: '.container-fluid', + OK_BUTTON: '[ng-click=\'copyPosition.close()\']' +}; + +exports.controlsDialog = { + DIALOG: '#controlsHelp', + DIALOG_HEADER: '[title=\'Controls\']', + DIALOG_CLOSE: '#controlsHelp .close', + DIALOG_TEXT: '#controlsHelp .js-window__wrapper' +}; + +exports.createBufferRegionDialog = { + DIALOG: '#Buffer', + DIALOG_HEADER: '[title=\'Create Buffer Region\']', + DIALOG_CLOSE: '#Buffer .close', + TITLE_INPUT: '[name=\'title\']', + TITLE_BADGE: '[ng-if=\'help.title\']', + DESCRIPTION_INPUT: '[name=\'description\']', + DESCRIPTION_BADGE: '[ng-if=\'help.description\']', + TAGS_INPUT: '[ng-model=\'config.tags\']', + TAGS_BADGE: '[ng-if=\'help.tags\']', + BUFFER_DISTANCE_INPUT: '[name=\'distance\']', + BUFFER_DISTANCE_BADGE: '[x-content=\'buffer.help.distance\']', + LIVE_PREVIEW_CHECKBOX: '[name=\'liveEnabled\']', + LIVE_PREVIEW_BADGE: '[x-content=\'buffer.livePreviewContent\']', + OK_BUTTON: '[ng-click=\'buffer.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'buffer.cancel()\']' +}; + +exports.createBufferRegionsDialog = { + DIALOG: '#Buffer', + DIALOG_HEADER: '[title=\'Create Buffer Regions\']', + DIALOG_CLOSE: '#Buffer .close', + TITLE_COLUMN_DROPDOWN: '[ng-model=\'config.titleColumn\']', + TITLE_COLUMN_BADGE: '[ng-if=\'help.titleColumn\']', + DESCRIPTION_COLUMN_DROPDOWN: '[ng-model=\'config.descColumn\']', + DESCRIPTION_COLUMN_BADGE: '[ng-if=\'help.descColumn\']', + DESCRIPTION_INPUT: '[name=\'description\']', + DESCRIPTION_BADGE: '[ng-if=\'help.description\']', + TAGS_COLUMN_DROPDOWN: '[ng-model=\'config.tagsColumn\']', + TAGS_COLUMN_BADGE: '[ng-if=\'help.tagsColumn\']', + TAGS_INPUT: '[name=\'tags\']', + TAGS_BADGE: '[ng-if=\'help.tags\']', + BUFFER_DISTANCE_INPUT: '[name=\'distance\']', + BUFFER_DISTANCE_BADGE: '[x-title=\'"Buffer Distance"\']', + DISTANCE_UNITS_DROPDOWN: '[name=\'units\']', + DISTANCE_UNITS_BADGE: '[x-content=\'buffer.help.units\']', + LIVE_PREVIEW_CHECKBOX: '[name=\'liveEnabled\']', + LIVE_PREVIEW_BADGE: '[x-content=\'buffer.livePreviewContent\']', + UPDATE_PREVIEW_BUTTON: '[ng-click=\'buffer.updatePreview(true)\']', + USE_SELECTED_FEATURES_CHECKBOX: '[name=\'buffer.useSelected\']', + SOURCE_CHECKBOX: '[name=\'sourcelist\'] [name=\'items\']', + OK_BUTTON: '[ng-click=\'buffer.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'buffer.cancel()\']' +}; + +exports.createColumnAssociationDialog = { + DIALOG_HEADER: '[title=\'Create Column Association\']' +}; + +exports.createFeatureActionDialog = { + DIALOG: 'editfeatureaction', + DIALOG_HEADER: '[title=\'Create Feature Action\']', + DIALOG_CLOSE: '#editfeatureaction .close', + TITLE_INPUT: '#filterTitle', + DESCRIPTION_INPUT: '#filterDesc', + TAGS_INPUT: '#filterTags', + Basic: { + ADD_EXPRESSION_BUTTON: '[title=\'Adds a new expression to the filter\']', + MATCH_ALL_RADIO_BUTTON: '[ng-model=\'root.grouping\'][value=\'And\']', + MATCH_ANY_RADIO_BUTTON: '[ng-model=\'root.grouping\'][value=\'Or\']', + COLUMN_DROPDOWN: '[ng-model=\'expr.column\']', + OPERATOR_DROPDOWN: '[ng-model=\'expr.op\']', + VALUE_DROPDOWN: '[name=\'literal\']', + EXPRESSION_1_COLUMN_DROPDOWN: '[ng-model=\'expr.column\']:eq(0)', + EXPRESSION_1_OPERATOR_DROPDOWN: '[ng-model=\'expr.op\']:eq(0)', + EXPRESSION_1_VALUE_DROPDOWN: '[name=\'literal\']:eq(0)', + EXPRESSION_2_COLUMN_DROPDOWN: '[ng-model=\'expr.column\']:eq(1)', + EXPRESSION_2_OPERATOR_DROPDOWN: '[ng-model=\'expr.op\']:eq(1)', + EXPRESSION_2_VALUE_DROPDOWN: '[name=\'literal\']:eq(1)' + }, + Advanced: { + ADD_EXPRESSION_BUTTON: '[title=\'Adds a new expression to the filter\']', + ADD_GROUP_BUTTON: '[title=\'Adds a new group to the filter\']', + REMOVE_ELEMENT_BUTTON: '[title=\'Removes an element from the filter\']', + GROUPING_NODE: '.c-node-toggle', + GROUPING_OPERATOR_DROPDOWN: '[ng-model=\'item.grouping\']', + GROUPING_REMOVE_BUTTON: '[ng-click=\'groupUi.remove()\'] [title=\'Remove the expression\']', + GROUPING_1_NODE: '.c-node-toggle:eq(0)', + GROUPING_1_OPERATOR_DROPDOWN: '[ng-model=\'item.grouping\']:eq(0)', + GROUPING_1_REMOVE_BUTTON: '[ng-click=\'groupUi.remove()\'] [title=\'Remove the expression\']:eq(0)', + GROUPING_2_NODE: '.c-node-toggle:eq(1)', + GROUPING_2_OPERATOR_DROPDOWN: '[ng-model=\'item.grouping\']:eq(1)', + GROUPING_2_REMOVE_BUTTON: '[ng-click=\'groupUi.remove()\'] [title=\'Remove the expression\']:eq(1)', + EXPRESSION_TEXT: '#editfeatureaction .grid-canvas .text-truncate', + EXPRESSION_EDIT_BUTTON: '[title=\'Edit the expression\']', + EXPRESSION_REMOVE_BUTTON: '[title=\'Remove the expression\']', + EXPRESSION_1_TEXT: '#editfeatureaction .grid-canvas .text-truncate:eq(0)', + EXPRESSION_1_EDIT_BUTTON: '[title=\'Edit the expression\']:eq(0)', + EXPRESSION_1_REMOVE_BUTTON: '[title=\'Remove the expression\']:eq(0)', + EXPRESSION_2_TEXT: '#editfeatureaction .grid-canvas .text-truncate:eq(1)', + EXPRESSION_2_EDIT_BUTTON: '[title=\'Edit the expression\']:eq(1)', + EXPRESSION_2_REMOVE_BUTTON: '[title=\'Remove the expression\']:eq(1)' + }, + ADD_ACTION_BUTTON: '[title=\'Add a new action\']', + SET_LABEL_DROPDOWN: '[ng-model=\'action.id\']', + CONFIGURE_ACTION_BUTTON: '[title=\'Configure the action\']', + OK_BUTTON: '[ng-click=\'ctrl.finish()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.cancel()\']' +}; + +exports.customDateTimeFormatsDialog = { + DIALOG: '[label=\'Custom Date/Time Formats\']', + DIALOG_HEADER: '[title=\'Custom Date/Time Formats\']', + DIALOG_CLOSE: '[label=\'Custom Date/Time Formats\'] .close', + DIALOG_TEXT: '[label=\'Custom Date/Time Formats\'] .modal-body', + CLOSE_BUTTON: '[ng-click=\'th.close()\']' +}; + +exports.descriptionInfoDialog = { + DIALOG: '[id*=descriptionInfo]', + CONTENT: '[id*=descriptionInfo] iframe', + CLOSE_BUTTON: '[id*=descriptionInfo] [ng-click=\'windowCtrl.close(true)\']' +}; + +exports.editArcServerDialog = { + DIALOG: '[label=\'Edit Arc Server\']', + DIALOG_HEADER: '[title=\'Edit Arc Server\']', + DIALOG_CLOSE: '[label=\'Edit Arc Server\'] .close', + TITLE_INPUT: '[title=\'The title for the server\']', + URL_INPUT: '[name=\'url\']', + SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' +}; + +exports.editColumnAssociationDialog = { + DIALOG_HEADER: '[title=\'Edit Column Association\']' +}; + +exports.editGeoServerDialog = { + DIALOG: '[label=\'Edit GeoServer\']', + DIALOG_HEADER: '[label=\'Edit GeoServer\'] [ng-class=\'headerClass\']', + DIALOG_CLOSE: '[label=\'Edit GeoServer\'] .close', + TITLE_INPUT: '[title=\'The title for the server\']', + URL_INPUT: '[name=\'url\']', + SAVE_BUTTON: '[ng-click=\'ctrl.accept()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' +}; + +exports.editParametersDialog = { + DIALOG: '#editParams', + DIALOG_HEADER: '[title=\'Edit Parameters\']', + DIALOG_CLOSE: '#editParams .close', + URL_INPUT: '[placeholder=\'Server URL\']', + ADD_PARAMETER_BUTTON: '[title=\'Add a new parameter row\']', + REMOVE_PARAMETER_BUTTON: '[title=\'Remove the selected parameter row\']', + GRID: '[options=\'ctrl.gridOptions\']', + APPLY_BUTTON: '[title=\'Apply parameter changes and refresh the layer.\']', + CANCEL_BUTTON: '[title=\'Cancel the parameter edit, discarding all changes.\']' +}; + +exports.editPlaceDialog = { + DIALOG_HEADER: '[title=\'Edit Place\']' +}; + +exports.enterAreaCoordinatesDialog = { + DIALOG: '[label=\'Enter Area Coordinates\']', + DIALOG_HEADER: '[title=\'Enter Area Coordinates\']', + DIALOG_CLOSE: '[label=\'Enter Area Coordinates\'] .close', + boundingBox: { + NAME_INPUT: '[name=\'name\']', + LONGITUDE_FIRST_CHECKBOX: '[name=\'lonFirst\']', + CORNER_1_INPUT: '[name=\'pos\']:eq(0)', + CORNER_1_BADGE: '[data-title=\'"Entering Position"\']:eq(0)', + CORNER_2_INPUT: '[name=\'pos\']:eq(0)', + CORNER_2_BADGE: '[data-title=\'"Entering Position"\']:eq(0)' + }, + Circle: { + NAME_INPUT: '[name=\'name\']', + LONGITUDE_FIRST_CHECKBOX: '[name=\'lonFirst\']', + CENTER_INPUT: '[name=\'pos\']', + CENTER_BADGE: '[data-title=\'"Entering Position"\']', + RADIUS_INPUT: '[name=\'radius\]', + RADIUS_UNITS_DROPDOWN: '[ng-model=\'ctrl.radiusUnits\']' + }, + Polygon: { + NAME_INPUT: '[name=\'name\']', + LONGITUDE_FIRST_CHECKBOX: '[name=\'lonFirst\']', + COORDINATES_INPUT: '[name=\'coordinates\']', + COORDINATES_BADGE: '[data-title=\'"Entering Coordinates"\']' + }, + OK_BUTTON: '[ng-click=\'ctrl.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'confirm.cancel()\']' +}; + +exports.exportColumnAssociationsDialog = { + DIALOG: '[label=\'Export Column Associations\']', + DIALOG_HEADER: '[title=\'Export Column Associations\']', + DIALOG_CLOSE: '[label=\'Export Column Associations\'] .close', + NAME_INPUT: '[name=\'title\']', + SAVE_TO_DROPDOWN: '[name=\'persister\']', + EXPORT_ALL_RADIO_BUTTON: '[name=\'timeTypeRadios\']:eq(0)', + EXPORT_SELECTED_RADIO_BUTTON: '[name=\'timeTypeRadios\']:eq(0)', + OK_BUTTON: '[ng-click=\'cmExportCtrl.accept()\']', + CANCEL_BUTTON: '[ng-click=\'cmExportCtrl.close()\']' +}; + +exports.exportDataDialog = { + DIALOG: '#export', + DIALOG_HEADER: '[title=\'Export Data\']', + DIALOG_CLOSE: '#export .close', + NAME_INPUT: '[name=\'title\']', + SAVE_TO_DROPDOWN: '[ng-model=\'persister\']', + TYPE_DROPDOWN: '[ng-model=\'exporter\']', + EXPORT_SELECTED_FEATURES_CHECKBOX: '#js-export-options__useselected', + SOURCE_CHECKBOX: '#export [name=\'items\']', + OK_BUTTON: '[ng-click=\'exportdialog.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'exportdialog.cancel()\']' +}; + +exports.exportFeatureActionsDialog = { + DIALOG: '#filteractionexport', + DIALOG_HEADER: '[title=\'Export Feature Actions\']', + DIALOG_CLOSE: '#filteractionexport .close', + NAME_INPUT: '[name=\'title\']', + EXPORT_ACTIVE_RADIO_BUTTON: '[name=\'exportmode\']:eq(0)', + EXPORT_SELECTED_RADIO_BUTTON: '[name=\'exportmode\']:eq(1)', + EXPORT_ALL_RADIO_BUTTON: '[name=\'exportmode\']:eq(2)', + OK_BUTTON: '[ng-click=\'ctrl.save()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.cancel()\']' +}; + +exports.exportHeatmapDialog = { + DIALOG: '#exportDialog', + DIALOG_HEADER: '[title=\'Export: Heatmap - load-data-file-test-features.kmz.kmz\']', + DIALOG_CLOSE: '#exportDialog .close', + NAME_INPUT: '[name=\'title\']', + SAVE_TO_DROPDOWN: '[ng-model=\'persister\']', + OK_BUTTON: '[ng-click=\'exportdialog.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'exportdialog.cancel()\']' +}; + +exports.exportPlacesDialog = { + DIALOG: '[label=\'Export Places\']', + DIALOG_HEADER: '[title=\'Export Places\']', + DIALOG_CLOSE: '[label=\'Export Places\'] .close', + NAME_INPUT: '[name=\'title\']', + SAVE_TO_DROPDOWN: '[ng-model=\'treeExport.persister\']', + COMPRESS_AS_KML_CHECKBOX: '#js-kmlexport__compress', + USE_FEATURE_COLORS: '#js-kmlexport__useItemColor', + EXPORT_ELLIPSES: '#js-kmlexport__exportEllipses', + DEFAULT_ICON_BUTTON: '[ng-click=\'iconPicker.show()\']', + OK_BUTTON: '[ng-click=\'treeExport.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'treeExport.cancel()\']' +}; + +exports.featureActionsDialog = { + DIALOG: ':contains(\'Feature Actions\').modal', + DIALOG_HEADER: ':contains("Feature Actions").modal-header', + DIALOG_CLOSE: ':contains("Feature Actions")>.close', + SEARCH_INPUT: '[ng-change=\'ctrl.search()\']', + CLEAR_BUTTON: '[title=\'Clear the search term\'][ng-click=\'ctrl.clearSearch()\']', + GROUP_BY_DROPDOWN: '[ng-change=\'ctrl.search()\'][ng-options=\'key for (key, value) in views\']', + CREATE_BUTTON: '[ng-click=\'ctrl.editEntry()\']', + FEATURE_ACTIONS_BADGE: '[x-title=\'helpTitle\']', + featureAction: { + TOGGLE_CHECKBOX: '[title=\'If the action should automatically execute against loaded data\']', + TEXT: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] .text-truncate span', + COPY_BUTTON: '[title=\'Copy the action\']', + EDIT_BUTTON: '[title=\'Edit the action\']', + REMOVE_BUTTON: '[title=\'Remove the action\']', + FEATURE_1_TOGGLE_CHECKBOX: '[title=\'If the action should automatically execute against ' + + 'loaded data\']:eq(0)', + FEATURE_1_TEXT: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] ' + + '.text-truncate span:eq(0)', + FEATURE_1_COPY_BUTTON: '[title=\'Copy the action\']:eq(0)', + FEATURE_1_EDIT_BUTTON: '[title=\'Edit the action\']:eq(0)', + FEATURE_1_REMOVE_BUTTON: '[title=\'Remove the action\']:eq(0)', + FEATURE_2_TOGGLE_CHECKBOX: '[title=\'If the action should automatically execute against ' + + 'loaded data\']:eq(1)', + FEATURE_2_TEXT: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] ' + + '.text-truncate span:eq(1)', + FEATURE_2_COPY_BUTTON: '[title=\'Copy the action\']:eq(1)', + FEATURE_2_EDIT_BUTTON: '[title=\'Edit the action\']:eq(1)', + FEATURE_2_REMOVE_BUTTON: '[title=\'Remove the action\']:eq(1)', + FEATURE_3_TOGGLE_CHECKBOX: '[title=\'If the action should automatically execute against ' + + 'loaded data\']:eq(2)', + FEATURE_3_TEXT: '[label=\'Feature Actions for load-data-file-test-features.zip Features\'] ' + + '.text-truncate span:eq(2)', + FEATURE_3_COPY_BUTTON: '[title=\'Copy the action\']:eq(2)', + FEATURE_3_EDIT_BUTTON: '[title=\'Edit the action\']:eq(2)', + FEATURE_3_REMOVE_BUTTON: '[title=\'Remove the action\']:eq(2)' + }, + EXPORT_BUTTON: '[ng-click=\'ctrl.launchExport()\']', + IMPORT_BUTTON: '[ng-click=\'ctrl.launchImport()\']', + APPLY_BUTTON: '[ng-click=\'ctrl.apply()\']', + CLOSE_BUTTON: '[ng-click=\'ctrl.close()\']' +}; + +exports.featureInfoDialog = { + DIALOG: '#featureInfo', + DIALOG_HEADER: '#featureInfo [title=\'Feature Info\']', + DIALOG_CLOSE: '#featureInfo .close', + SEARCH_INPUT: '[placeholder=\'Search features\']', + CLEAR_BUTTON: '#featureInfo [title=\'Clear the search term\']', + Grid: { + FEATURE_TEXT: '#featureInfo .slick-cell.r1', + FEATURE_1_TEXT: '#featureInfo .slick-cell.r1:eq(0)', + FEATURE_2_TEXT: '#featureInfo .slick-cell.r1:eq(1)', + FEATURE_3_TEXT: '#featureInfo .slick-cell.r1:eq(2)', + FEATURE_4_TEXT: '#featureInfo .slick-cell.r1:eq(3)', + FEATURE_5_TEXT: '#featureInfo .slick-cell.r1:eq(4)' + }, + FEATURE_NAME_TEXT: '[ng-attr-title=\'{{info.title}}\']', + COORDINATES_TEXT: '[ng-bind-html=\'simpleLocationCtrl.location\']', + ACTIVE_COORDINATES_CLASS: '#featureInfo .btn-group .active', + DD_BUTTON: '[title=\'Display in Decimal Degrees\']', + DMS_BUTTON: '[title=\'Display in Degrees Minutes Seconds\']', + DDM_BUTTON: '[title=\'Display in Degrees Decimal Minutes\']', + MGRS_BUTTON: '[title=\'Display in Military Grid Reference System\']', + FEATURE_TEXT: '[items=\'activeTab\']' +}; + +exports.fileExistsDialog = { + DIALOG: '[label=\'File Exists!\']', + DIALOG_HEADER: '[title=\'File Exists!\']', + SAVE_RADIO_BUTTON: '[value=\'saveNew\']', + REPLACE_PREVIOUS_BUTTON: '[value=\'replace\']', + REPLACE_REIMPORT_BUTTON: '[value=\'replaceAndImport\']', + OK_BUTTON: '[ng-click=\'confirm.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'confirm.cancel()\']' +}; + +exports.historyDialog = { + DIALOG: '#history', + DIALOG_HEADER: '[title=\'History\']', + DIALOG_CLOSE: '#history .close', + COMMAND: '[ng-repeat=\'command in historyView.commandHistory\']', + CLEAR_HISTORY_BUTTON: '[title=\'Clear all history\']' +}; + +exports.layerDescriptionDialog = { + DIALOG: '[label=\'Layer Description\']', + DIALOG_HEADER: '[title=\'Layer Description\']', + DIALOG_CLOSE: '[label=\'Layer Description\'] .close', + DIALOG_TEXT: '[name=\'confirmForm\']', + CLOSE_BUTTON: '[ng-class=\'yesButtonClass\']' +}; + +exports.featureListDialog = { + DIALOG: '[id*=featureList]', + DIALOG_HEADER: '[id*=\'featureList\'] .js-window__header', + DIALOG_CLOSE: '[id*=\'featureList\'] .close', + DIALOG_FOOTER: '[id*=\'featureList\'] .modal-footer', + CLOSE_BUTTON: '[ng-click=\'ctrl.close()\']', + contextMenu: { + PANEL: '#menu', + SELECT_ALL: '[title=\'Selects all items\']', + DESELECT_ALL: '[title=\'Deselects all items\']', + INVERT: '[title=\'Inverts the selection\']', + SORT_SELECTED: '[title=\'Sorts by the selected items\']', + HIDE_SELECTED: '[title=\'Hides selected items\']', + HIDE_UNSELECTED: '[title=\'Hides unselected items\']', + DISPLAY_ALL: '[title=\'Displays all items\']', + REMOVE_SELECTED: '[title=\'Removes selected items\']', + REMOVE_UNSELECTED: '[title=\'Removes the unselected items\']', + EXPORT: '[title=\'Exports data to a file\']', + GO_TO: '[title=\'Repositions the map to display features at this level of the tree\']' + } +}; + +exports.legendDialog = { + DIALOG_TEXT: '[ng-if=\'mainCtrl.legend\']', + SETTINGS_BUTTON: '[title=\'Open settings\']', + DIALOG_CLOSE: '[title=\'Close the legend\']' +}; + +exports.locationFormatsDialog = { + DIALOG: '[label=\'Location Formats\']', + DIALOG_HEADER: '[title=\'Location Formats\']', + DIALOG_CLOSE: '[label=\'Location Formats\'] .close', + DIALOG_TEXT: '[label=\'Location Formats\'] .modal-body', + CLOSE_BUTTON: '[ng-click=\'th.close()\']' +}; + +exports.modifyAreaDialog = { + DIALOG: '#modifyArea', + DIALOG_HEADER: '[title=\'Modify Area...\']', + DIALOG_CLOSE: '#modifyArea .close', + AREA_TO_MODIFY_DROPDOWN: '[ng-model=\'area\']:eq(0)', + AREA_TO_MODIFY_BADGE: '[x-title=\'helpTitle\']:eq(0)', + Operation: { + ADD_RADIO_BUTTON: '[value=\'Add\']', + REMOVE_RADIO_BUTTON: '[value=\'Remove\']', + INTERSECTION_RADIO_BUTTON: '[value=\'Intersect\']', + BADGE: '[x-title=\'modarea.getPopoverTitle(op)\']' + }, + AREA_TO_ADD_DROPDOWN: '[ng-model=\'area\']:eq(1)', + AREA_TO_ADD_BADGE: '[x-title=\'helpTitle\']:eq(1)', + REPLACE_AREA_CHECKBOX: '[name=\'replace\']', + REPLACE_AREA_BADGE: '[x-content=\'modarea.help.replace\']', + OK_BUTTON: '[ng-click=\'modarea.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'modarea.cancel()\']' +}; + +exports.openSphereCapabilitiesDialog = { + DIALOG: '[label=\'OpenSphere Capabilities\']', + DIALOG_HEADER: '[title=\'OpenSphere Capabilities\']', + DIALOG_CLOSE: '[label=\'OpenSphere Capabilities\'] .close', + DESCRIPTION_TEXT: 'section', + SEARCH_INPUT: '[placeholder=\'Search features\']', + CLOSE_BUTTON: '[ng-click=\'setCon.close()\']' +}; + +exports.renameLayerDialog = { + DIALOG: '[label=\'Rename Layer\']', + DIALOG_HEADER: '[title=\'Rename Layer\']', + LAYER_NAME_INPUT: '[name=\'title\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.resetSettingsDialog = { + DIALOG: '[label=\'Reset Settings\']', + DIALOG_HEADER: '[title=\'Reset Settings\']', + CLEAR_AND_RELOAD_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.saveStateDialog = { + DIALOG: '#stateExport', + DIALOG_HEADER: '[title=\'Save State\']', + DIALOG_CLOSE: '#stateExport .close', + NAME_INPUT: '[name=\'title\']', + SAVE_TO_DROPDOWN: '[name=\'persister\']', + DESCRIPTION_INPUT: '[name=\'desc\']', + TAGS_INPUT: '[name=\'tags\']', + CHOOSE_PARTS_CHECKBOX: '[name=\'showOptions\']', + OK_BUTTON: '[ng-click=\'stateForm.accept()\']', + CANCEL_BUTTON: '[ng-click=\'stateForm.close()\']' +}; + +exports.saveToPlacesDialog = { + DIALOG: '#savePlaces', + DIALOG_HEADER: '[title=\'Save to Places\']', + DIALOG_CLOSE: '#savePlaces .close', + TITLE_COLUMN_DROPDOWN: '[ng-model=\'config.titleColumn\']', + TITLE_COLUMN_BADGE: '[x-content=\'help.title\']', + TITLE_INPUT: '[name=\'title\']', + TITLE_BADGE: '[ng-class=\'popoverctrl.icon\']', + DESCRIPTION_COLUMN_DROPDOWN: '[ng-model=\'config.descColumn\']', + DESCRIPTION_COLUMN_BADGE: '[ng-if=\'help.descColumn\']', + DESCRIPTION_INPUT: '[name=\'description\']', + DESCRIPTION_BADGE: '[ng-if=\'help.description\']', + TAGS_COLUMN_DROPDOWN: '[ng-model=\'config.tagsColumn\']', + TAGS_COLUMN_BADGE: '[ng-if=\'help.tagsColumn\']', + TAGS_INPUT: '[name=\'tags\']', + TAGS_BADGE: '[ng-if=\'help.tags\']', + USE_SELECTED_FEATURES_CHECKBOX: '[name=\'ctrl.useSelected\']', + SOURCE_CHECKBOX: '#savePlaces .custom-checkbox', + OK_BUTTON: '[ng-click=\'ctrl.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.cancel()\']' +}; + +exports.setLabelDialog = { + DIALOG: '#importActionConfig', + DIALOG_HEADER: '[title=\'Set Label\']', + SIZE_DROPDOWN: '#importActionConfig [max=\'labelCtrl.maxSize\']', + Column: { + HANDLE: '[title=\'Click and Drag to move this label\']', + CHECKBOX: '[ng-model=\'label.showColumn\']', + DROPDOWN: '[title=\'Sets the data field used for labels\']', + REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']', + ADD_COLUMN_BUTTON: '[title=\'Add a label\']', + COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' + }, + ADD_CUSTOM_LABEL_CHECKBOX: '[title=\'Add a custom label to each feature\']', + COLUMN_NAME_INPUT: '[name=\'name\']', + VALUE_INPUT: '[name=\'value\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.setSoundDialog = { + DIALOG: '#importActionConfig', + DIALOG_HEADER: '[title=\'Set Sound\']', + SOUND_DROPDOWN: '[ng-model=\'ctrl.sound\']', + DELAY_DROPDOWN: '#importActionConfig [name=\'spinner\']', + DELAY_BADGE: '[content=\'ctrl.help\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.setStyleDialog = { + DIALOG: '#importActionConfig', + DIALOG_HEADER: '[title=\'Set Style\']', + OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', + SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', + OK_BUTTON: '[ng-class=\'yesIcon\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.sunAndMoonDialog = { + DIALOG: '#suncalc', + DIALOG_HEADER: '[title=\'Sun and Moon Info\']', + DIALOG_CLOSE: '#suncalc .close', + COORDINATES_TEXT: '[ng-bind-html=\'simpleLocationCtrl.location\']', + DD_BUTTON: '[title=\'Display in Decimal Degrees\']', + DMS_BUTTON: '[title=\'Display in Degrees Minutes Seconds\']', + DDM_BUTTON: '[title=\'Display in Degrees Decimal Minutes\']', + MGRS_BUTTON: '[title=\'Display in Military Grid Reference System\']', + DATE_TIME_TEXT: 'div.ng-binding.mb-2', + OK_BUTTON: '[ng-click=\'ctrl.close()\']' +}; + +exports.trackNameDialog = { + DIALOG: '[label=\'Track Name\']', + DIALOG_HEADER: '[title=\'Track Name\']', + TRACK_NAME_INPUT: '[name=\'title\']', + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.welcomeToOpenSphereDialog = { + DIALOG: '.js-onboarding__popover', + DIALOG_HEADER: '.popover-header', + DIALOG_CLOSE: '.js-onboarding__popover .close', + DESCRIPTION_TEXT: '[ng-bind-html=\'ngOnboardCtrl.description\']', + STOP_SHOWING_TIPS_BUTTON: '[ng-click=\'ngOnboardCtrl.stopShowing()\']', + NEXT_BUTTON: '[ng-click=\'ngOnboardCtrl.next()\']' +}; diff --git a/cypress/support/selectors/imports.js b/cypress/support/selectors/imports.js new file mode 100644 index 000000000..318ead011 --- /dev/null +++ b/cypress/support/selectors/imports.js @@ -0,0 +1,179 @@ +exports.geoJSONAreaImportDialog = { + DIALOG: '[label=\'GeoJSON Area Import\']', + DIALOG_HEADER: '[title=\'GeoJSON Area Import\']', + DIALOG_CLOSE: '[label=\'GeoJSON Area Import\'] .close', + Tabs: { + areaOptions: { + TITLE_COLUMN_INPUT: '[ng-model=\'config.titleColumn\']', + DESCRIPTION_COLUMN_DROPDOWN: '[ng-model=\'config.descColumn\']', + DESCRIPTION_INPUT: '[name=\'description\']', + TAGS_COLUMN_DROPDOWN: '[ng-model=\'config.tagsColumn\']', + TAGS_INPUT: '[name=\'tags\']', + MERGE_AREAS_CHECKBOX: '[name=\'merge\']' + } + }, + PREV_BUTTON: '[title=\'Previous step\']', + NEXT_BUTTON: '[title=\'Next step\']', + DONE_BUTTON: '[ng-click=\'wiz.accept()\']', + CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' +}; + +exports.importCesiumIonAssetDialog = { + DIALOG: '#importIonAsset', + DIALOG_HEADER: '[title=\'Import Cesium Ion Asset\']', + DIALOG_CLOSE: '#importIonAsset .close', + TITLE_INPUT: '[name=\'title\']', + DESCRIPTION_INPUT: '[name=\'description\']', + TAGS_INPUT: '[name=\'tags\']', + ASSET_ID_INPUT: '[name=\'assetId\']', + ACCESS_TOKEN_INPUT: '[name=\'accessToken\']', + OK_BUTTON: '[ng-click=\'ctrl.accept()\']', + CANCEL_BUTTON: '[ng-click=\'ctrl.close()\']' +}; + +exports.importCSVDialog = { + DIALOG: '[label=\'CSV Import\']', + DIALOG_HEADER: '[title=\'CSV Import\']', + DIALOG_CLOSE: '[label=\'CSV Import\'] .close', + Tabs: { + Configuration: { + HEADER_ROW_SPINNER: '[name=\'spinner\']:eq(0)', + HEADER_ROW_CHECKBOX: '[ng-model=\'config.useHeader\']', + DELIMITER_DROPDOWN: '[ng-model=\'config.delimiter\']', + DATA_ROW_SPINNER: '[name=\'spinner\']:eq(0)', + COMMENT_DROPDOWN: '[ng-model=\'config.commentChar\']', + RAW_DATA_TEXT: '[x-data=\'configStep.linePreviewRows\']', + PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' + }, + Geometry: { + FORMAT_HELP_BUTTON: '[title=\'Help for location formats\']', + noGeometry: { + RADIOBUTTON: '[name=\'geomTypeRadios\':eq(0)]' + }, + separateLatLon: { + RADIOBUTTON: '[name=\'geomTypeRadios\':eq(1)]', + LATITUDE_DROPDOWN: '[ng-model=\'step.latColumn\']', + AUTO_FORMAT_CHECKBOX: '[ng-model=\'step.useGeoSeparateAutoFormat\']', + COORDINATES_FORMAT_DROPDOWN: '[ng-model=\'step.geoSeparateFormat\']', + LONGITUDE_DROPDOWN: '[ng-model=\'step.lonColumn\']', + SAMPLE_TEXT: '.d-block:eq(0)', + RESULT_TEXT: '.d-block:eq(1)', + ALTITUDE_DROPDOWN: '[name=\'altitude\']', + UNITS_DROPDOWN: '[ng-model=\'step.altitude.units\']', + BEARING_DROPDOWN: '[name=\'bearing\']', + IGNORE_ROWS_CHECKBOX: '[ng-model=\'step.ignoreMissingGeomRows\']', + ELLIPSE_FIELDS_CHECKBOX: '[ng-model=\'step.showEllipse\']', + Ellipse: { + RADIUS_CEP_DROPDOWN: '[ng-model=\'step.ellipse.radius.column\']', + RADIUS_CEP_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.radius.units\']', + SEMI_MAJOR_DROPDOWN: '[name=\'semiMajor\']', + SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMajor.units\']', + SEMI_MINOR_DROPDOWN: '[name=\'semiMinor\']', + SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMinor.units\']', + ORIENTATION_DROPDOWN: '[name=\'orientation\']' + } + }, + singleGeometry: { + RADIOBUTTON: '[name=\'geomTypeRadios\':eq(2)]', + COLUMN_DROPDOWN: '[ng-model=\'step.posColumn\']', + TYPE_DROPDOWN: '[ng-model=\'step.posType\']', + SAMPLE_TEXT: '[ng-if=\'geomStep.sample\']', + RESULT_TEXT: '.d-block:eq(1)', + ALTITUDE_DROPDOWN: '[name=\'altitude\']', + UNITS_DROPDOWN: '[ng-model=\'step.altitude.units\']', + BEARING_DROPDOWN: '[name=\'bearing\']', + IGNORE_ROWS_CHECKBOX: '[ng-model=\'step.ignoreMissingGeomRows\']', + ELLIPSE_FIELDS_CHECKBOX: '[ng-model=\'step.showEllipse\']', + Ellipse: { + RADIUS_CEP_DROPDOWN: '[ng-model=\'step.ellipse.radius.column\']', + RADIUS_CEP_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.radius.units\']', + SEMI_MAJOR_DROPDOWN: '[name=\'semiMajor\']', + SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMajor.units\']', + SEMI_MINOR_DROPDOWN: '[name=\'semiMinor\']', + SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'step.ellipse.semiMinor.units\']', + ORIENTATION_DROPDOWN: '[name=\'orientation\']' + } + }, + PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' + } + }, + PREV_BUTTON: '[title=\'Previous step\']', + NEXT_BUTTON: '[title=\'Next step\']', + DONE_BUTTON: '[ng-click=\'wiz.accept()\']', + CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' +}; + +exports.importDataDialog = { + DIALOG: '#urlimport', + DIALOG_HEADER: '[title=\'Import Data\']', + DIALOG_CLOSE: '#urlimport .close', + CHOOSE_A_FILE_OR_URL_FILE_INPUT: '[placeholder=\'Choose a file or enter a URL\']', + BROWSE_BUTTON: '[title=\'Choose a local file\']', + NEXT_BUTTON: '[title=\'Load the file for import\']', + CANCEL_BUTTON: '[title=\'Cancel file import\']' +}; + +exports.importGeoJSONDialog = { + DIALOG: '[label=\'Import GeoJSON\']', + DIALOG_HEADER: '[title=\'Import GeoJSON\']', + DIALOG_CLOSE: '[label=\'Import GeoJSON\'] .close', + PREV_BUTTON: '[title=\'Previous step\']', + NEXT_BUTTON: '[title=\'Next step\']', + DONE_BUTTON: '[ng-click=\'wiz.accept()\']', + CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' +}; + +exports.importKMLDialog = { + DIALOG: '[label=\'Import KML\']', + DIALOG_HEADER: '[title=\'Import KML\']', + DIALOG_CLOSE: '[label=\'Import KML\'] .close', + LAYER_TITLE_INPUT: '[name=\'title\']', + DESCRIPTION_INPUT: '[name=\'desc\']', + TAGS_INPUT: '[name=\'tags\']', + COLOR_PICKER: '[name=\'color\']', + OK_BUTTON: '[title=\'Import the file\']', + CANCEL_BUTTON: '[title=\'Cancel file import\']' +}; + +exports.importStateDialog = { + DIALOG: '[label=\'Import State\']', + DIALOG_HEADER: '[title=\'Import State\']', + DIALOG_CLOSE: '[title=\'Import State\'] .close', + NAME_INPUT: '[name=\'title\']', + DESCRIPTION_INPUT: '[name=\'desc\']', + TAGS_INPUT: '[name=\'tags\']', + CLEAR_CHECKBOX: '[name=\'clear\']', + Choose: { + CHECKBOX: '[name=\'showOptions\']', + ALL_CHECKBOX: '[name=\'all\']', + CURRENT_VIEW_CHECKBOX: '[title=\'Sets the current map view/position\'] [type=\'checkbox\']', + DATA_LAYERS_CHECKBOX: '[title=\'Sets the current layers\'] [type=\'checkbox\']', + EXCLUSION_AREAS_CHECKBOX: '[title=\'Sets the current exclusion areas\'] [type=\'checkbox\']', + FEATURE_ACTIONS_CHECKBOX: '[title=\'Sets the current Feature Actions\'] [type=\'checkbox\']', + FILTERS_CHECKBOX: '[title=\'Sets the current filters\'] [type=\'checkbox\']', + QUERY_AREAS_CHECKBOX: '[title=\'Sets the current query areas\'] [type=\'checkbox\']', + QUERY_ENTRIES_CHECKBOX: '[title=\'Sets the query combinations\'] [type=\'checkbox\']', + TIME_CHECKBOX: '[title=\'Sets the current timeline\'] [type=\'checkbox\']' + }, + OK_BUTTON: '[ng-click=\'stateForm.accept()\']', + CANCEL_BUTTON: '[ng-click=\'stateForm.close()\']' +}; + +exports.importURLDialog = { + DIALOG: '#urlimport', + DIALOG_HEADER: '[title=\'Import URL\']', + DIALOG_CLOSE: '#urlimport .close', + ENTER_A_URL_INPUT: '[name=\'url\']', + NEXT_BUTTON: '[title=\'Import the URL\']', + CANCEL_BUTTON: '[title=\'Cancel URL import\']' +}; + +exports.SHPImportDialog = { + DIALOG: '[label=\'SHP Import\']', + DIALOG_HEADER: '[title=\'SHP Import\']', + DIALOG_CLOSE: '[label=\'SHP Import\'] .close', + PREV_BUTTON: '[title=\'Previous step\']', + NEXT_BUTTON: '[title=\'Next step\']', + DONE_BUTTON: '[ng-click=\'wiz.accept()\']', + CANCEL_BUTTON: '[ng-click=\'wiz.cancel()\']' +}; diff --git a/cypress/support/selectors/layers.js b/cypress/support/selectors/layers.js new file mode 100644 index 000000000..7e310f6d4 --- /dev/null +++ b/cypress/support/selectors/layers.js @@ -0,0 +1,308 @@ +exports.Dialog = { + DIALOG: '[label=Layers]', + DIALOG_HEADER: '.js-window__header', + DIALOG_TIPS: '[title=\'Show help\']', + DIALOG_CLOSE: '[label=Layers] .close', + ACTIVE_TAB: '.active.nav-link' +}; + +exports.layersTab = { + TAB: '.nav-link:eq(0)', + GROUP_BY_DROPDOWN: '[ng-change=\'layers.onGroupByChanged()\']', + addData: { + BUTTON: '[label=\'Layers\'] [title=\'Add data to the map\']', + Menu: { + BUTTON: '[label=\'Layers\'] .dropdown-toggle', + PANEL: '#menu', + ADD_DATA: '[title=\'Browse the data catalog\']', + OPEN_FILE_OR_URL: '[title=\'Import data from a local file or a URL\']', + ADD_CESIUM_ION_ASSET: '[title=\'Loads a Cesium Ion asset in 3D mode\']', + RECENT_STREET_MAP: ':contains(\'Street Map (Map)\').text-truncate', + RECENT_WORLD_IMAGERY: ':contains(\'World Imagery (Map)\').text-truncate' + }, + Recent: { + DATA: '[role=\'menuitem\']', + DATA_1: '[role=\'menuitem\']:eq(3)', + DATA_2: '[role=\'menuitem\']:eq(4)', + DATA_3: '[role=\'menuitem\']:eq(5)', + DATA_4: '[role=\'menuitem\']:eq(6)', + DATA_5: '[role=\'menuitem\']:eq(7)' + } + }, + SEARCH_INPUT: '[placeholder=\'Search active layers\']', + CLEAR_BUTTON: '[title=\'Clear the search term\']', + TILE_LAYERS_TOGGLE_BUTTON: '[title=\'Toggle Tile Layers\']', + FEATURE_LAYERS_TOGGLE_BUTTON: '[title=\'Toggle Feature Layers\']', + Tree: { + LOADING_SPINNER: '[title=\'Loading...\']', + FEATURE_COUNT_TEXT: 'span:eq(8)', + STREET_MAP_TILES: ':contains(\'Street Map Tiles\').slick-row', + WORLD_IMAGERY_TILES: ':contains(\'World Imagery Tiles\').slick-row', + Buttons: { + CREATE_A_NEW_FOLDER_BUTTON: '[title=\'Create a new folder\']', + CREATE_A_NEW_SAVED_PLACE_BUTTON: '[title=\'Create a new place\']', + CREATE_A_NEW_ANNOTATION_BUTTON: '[title=\'Create a new annotation\']', + EDIT_PLACE_BUTTON: '[title=\'Edit the place\']', + EDIT_TRACK_BUTTON: '[title=\'Edit the place\']', + MANAGE_FILTERS_BUTTON: '[title=\'Manage filters\']', + REMOVE_LAYER_BUTTON: '[title=\'Remove the layer\']', + SAVE_BUTTON: '[title=\'Save\']' + }, + contextMenu: { + PANEL: '#menu', + ADD_FOLDER: '[title=\'Creates a new folder and adds it to the tree\']', + ADD_PLACE: '[title=\'Creates a new saved place\']', + ADD_TO_TIMELINE: '[title=\'Enables layer animation when the timeline is open\']', + ADD_TO_TRACK: '[title=\'Adds selected features (or all features if none are selected) ' + + 'to an existing track.\']', + CLEAR_SELECTION: '[title=\'Clears the selection for the layer\']', + CREATE_BUFFER_REGION: '[title=\'Create buffer regions around loaded data\']', + CREATE_TRACK: '[title=\'Creates a new track by linking selected features (or all ' + + 'features if none are selected) in time order.\']', + DESELECT: '[title=\'Deselect features in this area\']', + DISABLE_AREA: '[title=\'Disable the area\']', + DISABLE_TRACK_INTERPOLATION: '[title=\'Only move track marker when there is a supporting feature.\']', + EDIT_AREA_DETAILS: '[title=\'Edit area information such as title/description\']', + EDIT_PARAMETERS: '[title=\'Edit request parameters for the layer\']', + EDIT_PLACE: '[title=\'Edit the saved place\']', + ENABLE_AREA: '[title=\'Enable the area\']', + ENABLE_TRACK_INTERPOLATION: '[title=\'Show the interpolated position of the track marker.\']', + EXPORT_HEATMAP: '[title=\'Exports the heatmap as a KML Ground Overlay\']', + EXPORT: '[evt-type=\'export\']', + EXPORT_PLACES: '[title=\'Exports Saved Places from the selected location\']', + FEATURE_ACTIONS: '[title=\'Perform actions on imported data matching a filter\']', + FEATURE_INFO: '[title=\'Display detailed feature information\']', + FOLLOW_TRACK: '[title=\'Follow the track as it animates.\']', + GENERATE_HEATMAP: '[title=\'Generate a heatmap of current features\']', + GO_TO: '[title=\'Repositions the map to show the layer\']', + HIDE_TRACK_LINE: '[title=\'Do not show the track line.\']', + IDENTIFY: '[title=\'Identifies a layer on the map\']', + LOCK: '[title=\'Lock the layer to prevent data from changing\']', + MERGE: '[title=\'Merge selected areas into a new area\']', + MODIFY_AREA: '[title=\'Modify the area\']', + MOST_RECENT: '[title=\'Adjusts application time to show the most recent data for the layer\']', + REFRESH: '[title=\'Refreshes the layer\']', + REMOVE: '[title=\'Removes the layer\']', + REMOVE_ALL: '[title=\'Removes all of the places\']', + REMOVE_AREA: '#menu [title=\'Remove the area\']', + REMOVE_FEATURES_IN_AREA: '[title=\'Remove features in this area from the map\']', + REMOVE_FROM_TIMELINE: '[title=\'Disables layer animation when the timeline is open\']', + RENAME: '[title=\'Rename the layer\']', + SAVE_TO_PLACES: '[evt-type=\'places:saveToPlaces\']', + SELECT: '[title=\'Select features in this area\']', + SELECT_EXCLUSIVE: '[title=\'Select only features in this area, deselecting features ' + + 'outside of the area\']', + SHOW_DESCRIPTION: '[title=\'Gives details about the layer\']', + SHOW_FEATURES: '[title=\'Displays features in the layer\']', + SHOW_TRACK_LINE: '[title=\'Show the track line.\']', + UNLOCK: '[title=\'Unlock the layer and refresh its data\']', + UNFOLLOW_TRACK: '[title=\'Cancel following the track during animation.\']', + ZOOM: '[title=\'Zoom the map to the feature(s)\']', + Copy: { + TOP_LEVEL: ':contains(\'Copy\').ui-menu-item', + ALL: '[evt-type=\'layer.copy 1\']', + SHOWN: '[evt-type=\'layer.copy 2\']', + SELECTED: '[evt-type=\'layer.copy 3\']', + UNSELECTED: '[evt-type=\'layer.copy 4\']', + HIDDEN: '[evt-type=\'layer.copy 5\']' + }, + Merge: { + TOP_LEVEL: ':contains(\'Merge\').ui-menu-item', + ALL: '[evt-type=\'layer.merge 1\']', + SHOWN: '[evt-type=\'layer.merge 2\']', + SELECTED: '[evt-type=\'layer.merge 3\']', + UNSELECTED: '[evt-type=\'layer.merge 4\']', + HIDDEN: '[evt-type=\'layer.merge 5\']' + }, + Join: { + TOP_LEVEL: ':contains(\'Join\').ui-menu-item', + ALL: '[evt-type=\'layer.join 1\']', + SHOWN: '[evt-type=\'layer.join 2\']', + SELECTED: '[evt-type=\'layer.join 3\']', + UNSELECTED: '[evt-type=\'layer.join 4\']', + HIDDEN: '[evt-type=\'layer.join 5\']' + }, + Query: { + LOAD: '[title=\'Clear queries, then query for this area for all layers\']', + ADD: '[title=\'Add a query for this area for all layers\']', + chooseLayers: { + TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(0)', + FEATURES: '[title=\'Query area for layes of type (Features)\']', + CUSTOM: '[evt-type=\'add:custom\']' + } + }, + Exclude: { + SET: '[title=\'Clear exclusions, then add an exclusion area for all layers\']', + ADD: '[title=\'Add an exclusion area for all layers\']', + chooseLayers: { + TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(1)', + FEATURES: '[title=\'Exclude area for layes of type (Features)\']', + CUSTOM: '[evt-type=\'add_exclude:custom\']' + } + } + } + }, + Accordion: { + Style: { + BRIGHTNESS_SLIDER: '[name=\'brightness\'] .ui-slider-handle', + BRIGHTNESS_RESET_BUTTON: '[title=\'Restore default brightness\']', + COLORIZE_CHECKBOX: '#tile_colorize', + COLORS_DROPDOWN: '[title=\'Sets the color algorithm for the layer(s)\']', + CONTRAST_SLIDER: '[name=\'contrast\'] .ui-slider-handle', + CONTRAST_RESET_BUTTON: '[title=\'Restore default contrast\']', + INTENSITY_DROPDOWN: '[name=\'intensity\'] .spinner', + INTENSITY_SLIDER: '[name=\'intensity\'] .ui-slider-handle', + OPACITY_RESET_BUTTON: '[title=\'Restore default opacity\']', + SATURATION_SLIDER: '[name=\'saturation\'] .ui-slider-handle', + SATURATION_RESET_BUTTON: '[title=\'Restore default saturation\']' + }, + Options: { + BUTTON: '[title=\'Configure the layer options\']', + AUTO_REFRESH_DROPDOWN: '[ng-model=\'vector.refresh\']', + UNIQUE_IDENTIFIER_DROPDOWN: '[ng-model=\'vector.uniqueId\']', + ALTITUDE_MODE: '[title=\'Sets how the layer interprets altitude in 3D mode.\']', + LOCK_LAYER_CHECKBOX: '#lockLayer' + }, + Zoom: { + BUTTON: '[title=\'Zoom controls for the layer(s)\']', + MIN_ZOOM_SPINNER: '[name=\'minZoom\']', + MIN_ZOOM_CURRENT_BUTTON: '[title=\'Sets the min zoom to the current zoom level\']', + MAX_ZOON_SPINNER: '[name=\'maxZoom\']', + MAX_ZOOM_CURRENT_BUTTON: '[title=\'Sets the max zoom to the current zoom level\']' + } + } +}; + +exports.areasTab = { + TAB: '.nav-link:eq(1)', + GROUP_BY_DROPDOWN: '[ng-model=\'view\']', + SEARCH_INPUT: '[placeholder=\'Search areas\']', + CLEAR_BUTTON: '[title=\'Clear the search term\']', + Tree: { + SAVE_AREA_BUTTON: '[ng-click=\'nodeUi.edit()\']', + REMOVE_AREA_BUTTON: '[title=\'Remove the area\']', + TEMP_AREA_1: ':contains(\'temp area 1\')', + TEMP_AREA_2: ':contains(\'temp area 2\')', + TEMP_AREA_3: ':contains(\'temp area 3\')', + TEMP_AREA_4: ':contains(\'temp area 4\')', + TEMP_AREA_5: ':contains(\'temp area 5\')', + WHOLE_WORLD_AREA: ':contains(\'Whole World\') .slick-cell', + contextMenu: { + PANEL: '#menu', + Query: { + LOAD: '[title=\'Clear queries, then query for this area for all layers\']', + ADD: '[title=\'Add a query for this area for all layers\']', + chooseLayers: { + TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(0)', + FEATURES: '[title=\'Query area for layes of type (Features)\']', + CUSTOM: '[evt-type=\'add:custom\']' + } + }, + Exclude: { + SET: '[title=\'Clear exclusions, then add an exclusion area for all layers\']', + ADD: '[title=\'Add an exclusion area for all layers\']', + chooseLayers: { + TOP_LEVEL: ':contains(\'Copy\').ui-menu-item:eq(1)', + FEATURES: '[title=\'Exclude area for layes of type (Features)\']', + CUSTOM: '[evt-type=\'add_exclude:custom\']' + } + }, + SELECT: '[title=\'Select features in this area\']', + SELECT_EXCLUSIVE: '[title=\'Select only features in this area, deselecting features outside of the area\']', + DESELECT: '[title=\'Deselect features in this area\']', + REMOVE_FEATURES_IN_AREA: '[title=\'Remove features in this area from the map\']', + CREATE_BUFFER_REGION: '[title=\'Create a buffer region from the feature(s)\']', + MODIFY_AREA: '[title=\'Modify the area\']', + SAVE_TO_PLACES: '[title=\'Creates a new saved place from the area\']', + ZOOM: '[title=\'Zoom the map to the feature(s)\']', + EDIT_AREA_DETAILS: '[title=\'Edit area information such as title/description\']', + ENABLE_AREA: '[title=\'Enable the area\']', + DISABLE_AREA: '[title=\'Disable the area\']', + EXPORT: '[title=\'Export the area\']', + MERGE: '[title=\'Merge selected areas into a new area\']', + REMOVE_AREA: '#menu [title=\'Remove the area\']' + } + }, + EXPORT_BUTTON: '[ng-click=\'areasCtrl.export()\']', + Import: { + BUTTON: '[ng-click=\'areasCtrl.import()\']', + Menu: { + BUTTON: '.fa-chevron-down', + PANEL: '#menu', + IMPORT_FILE_URL: '[title=\'Import areas from a file or URL\']', + ENTER_COORDINATES: '[title=\'Enter coordinates to load data for a box, circle, or polygon\']', + WHOLE_WORLD: '[title=\'Load data for the whole world\']' + } + }, + ADVANCED_BUTTON: '[ng-click=\'areasCtrl.launch()\']' +}; + +exports.filtersTab = { + TAB: '.nav-link:eq(2)', + GROUP_BY_DROPDOWN: '[ng-change=\'filtersCtrl.onGroupChange()\']', + ADD_FILTER_BUTTON: '[title=\'Add a filter\']', + SEARCH_INPUT: '[placeholder=\'Search...\']', + CLEAR_BUTTON: '[ng-change=\'filtersCtrl.onSearchTermChange()\']', + Tree: { + COPY_FILTER_BUTTON: '[title=\'Copy\']', + EDIT_FILTER_BUTTON: '[title=\'Edit\']', + REMOVE_FILTER_BUTTON: '[title=\'Remove\']', + NEW_FILTER_1: ':contains(\'New Filter\'):eq(0)', + NEW_FILTER_2: ':contains(\'New Filter\'):eq(1)', + NEW_FILTER_3: ':contains(\'New Filter\'):eq(2)', + contextMenu: { + PANEL: '#menu', + HIDE: '[title=\'Hides the filter\']', + SHOW: '[title=\'Shows the filter\']', + TURN_FILTER_ON: '[title=\'Apply the filter to all areas for the query\']', + TURN_FILTER_OFF: '[title=\'Remove the filter from all areas for the query\']', + REMOVE: '[title=\'Removes the filter\']', + EXPORT_FILTER: '[title=\'Export the filter\']' + } + }, + EXPORT_BUTTON: '[ng-click=\'filtersCtrl.export()\']', + IMPORT_BUTTON: '[ng-click=\'filtersCtrl.import()\']', + ADVANCED_BUTTON: '[ng-click=\'filtersCtrl.launch()\']' +}; + +exports.placesTab = { + TAB: '.nav-link:eq(3)', + ADD_FOLDER_BUTTON: '[ng-click=\'places.addFolder()\']', + ADD_PLACE_BUTTON: '[ng-click=\'places.addPlace()\']', + EXPAND_ALL_BUTTON: '[title=\'Fully expand the tree from the selected item, or the root if nothing is selected\']', + COLLAPSE_ALL_BUTTON: '[title=\'Fully collapse the tree from the selected item, or the root if ' + + 'nothing is selected\']', + Tree: { + Type: { + Folder: { + CREATE_FOLDER_BUTTON: '[title=\'Create a new folder\']', + CREATE_PLACE_BUTTON: '[title=\'Create a new place\']', + EDIT_BUTTON: '[title=\'Edit the folder\']', + REMOVE_BUTTON: '[title=\'Remove the folder\']', + contextMenu: { + PANEL: '#menu', + ADD_FOLDER: '[title=\'Creates a new folder and adds it to the tree\']', + ADD_PLACE: '[title=\'Creates a new saved place\']', + EDIT_FOLDER: '[title=\'Edit the folder label\']', + EXPORT_PLACES: '[title=\'Exports Saved Places from the selected location\']', + REMOVE_ALL: '[title=\'Removes everything under the folder\']' + } + }, + Place: { + EDIT_BUTTON: '[title=\'Edit the place\']', + REMOVE_BUTTON: '[ng-if=\'nodeUi.canRemove()\']', + contextMenu: { + PANEL: '#menu', + CREATE_BUFFER_REGION: '[title=\'Creates buffer regions around loaded data\']', + EDIT_PLACE: '[title=\'Edit the saved place\']', + EXPORT_PLACES: '[title=\'Exports Saved Places from the selected location\']', + REMOVE: '[title=\'Removes the place\']', + FEATURE_INFO: '[title=\'Display detailed feature information\']', + GO_TO: '[title=\'Repositions the map to display features at this level of the tree\']' + } + } + } + }, + EXPORT_BUTTON: '[title=\'Export places to KML\']', + IMPORT_BUTTON: '[title=\'Import places only\']' +}; diff --git a/cypress/support/selectors/settings.js b/cypress/support/selectors/settings.js new file mode 100644 index 000000000..12680fe98 --- /dev/null +++ b/cypress/support/selectors/settings.js @@ -0,0 +1,158 @@ +exports.settingsDialog = { + DIALOG: '#settings', + DIALOG_HEADER: '[title=\'Settings\']', + DIALOG_CLOSE: '#settings .close', + Tabs: { + ACTIVE_TAB: '.selected', + columnAssociations: { + TAB: ':contains("Column Associations").slick-cell', + PANEL: ':contains("Column Associations").container-fluid', + CREATE_BUTTON: '[ng-click=\'cmCtrl.create()\']', + EXPORT_BUTTON: '[ng-click=\'cmCtrl.export()\']', + IMPORT_BUTTON: '[ng-click=\'cmCtrl.import()\']', + Association: { + NODE: '.js-node-toggle', + NODE_EXPANDED_CLASS: 'fa-caret-down', + NODE_COLLAPSED_CLASS: 'fa-caret-right', + ROW: '[label=\'Settings\'] .container-fluid .slick-cell', + EDIT_BUTTON: '[title=\'Edit the column mapping\']', + REMOVE_BUTTON: '[title=\'Remove the column mapping\']', + ROW_1: '[label=\'Settings\'] .container-fluid .slick-cell:eq(0)', + ROW_1_EDIT_BUTTON: '[title=\'Edit the column mapping\']:eq(0)', + ROW_1_REMOVE_BUTTON: '[title=\'Remove the column mapping\']:eq(0)', + ROW_2: '[label=\'Settings\'] .container-fluid .slick-cell:eq(1)', + ROW_2_EDIT_BUTTON: '[title=\'Edit the column mapping\']:eq(1)', + ROW_2_REMOVE_BUTTON: '[title=\'Remove the column mapping\']:eq(1)', + ROW_3: '[label=\'Settings\'] .container-fluid .slick-cell:eq(2)', + ROW_3_EDIT_BUTTON: '[title=\'Edit the column mapping\']:eq(2)', + ROW_3_REMOVE_BUTTON: '[title=\'Remove the column mapping\']:eq(2)' + } + }, + dataServers: { + TAB: ':contains("Data Servers").slick-cell', + PANEL: ':contains("Data Servers").container-fluid', + ADD_SERVER_BUTTON: '[title=\'Add a new server\']', + SERVER: '[ng-repeat=\'item in data\']', + SERVER_CHECKBOX: '[ng-change=\'servers.update()\']', + SERVER_ONLINE_BADGE: '[title=\'Online\']', + SERVER_OFFLINE_BADGE: '[title=\'Offline\']', + EDIT_SERVER_BUTTON: '[title=\'Edit server\']', + DELETE_SERVER_BUTTON: '[title=\'Delete server\']', + REFRESH_SERVER_BUTTON: '[title=\'Refresh server\']', + SERVER_1: '[ng-repeat=\'item in data\']:eq(0)', + SERVER_2: '[ng-repeat=\'item in data\']:eq(1)', + SERVER_3: '[ng-repeat=\'item in data\']:eq(2)', + SERVER_4: '[ng-repeat=\'item in data\']:eq(3)', + SERVER_5: '[ng-repeat=\'item in data\']:eq(4)' + }, + locationFormat: { + TAB: ':contains("Location Format").slick-cell', + PANEL: ':contains("Location Format").container-fluid', + DEG_RADIO_BUTTON: '[title=\'Use DEG\']', + DMS_RADIO_BUTTON: '[title=\'Use DMS\']', + DDM_RADIO_BUTTON: '[title=\'Use DDM\']', + MGRS_RADIO_BUTTON: '[title=\'Use MGRS\']' + }, + Map: { + TAB: ':contains("Map").slick-cell', + PANEL: '[generic=\'defaultsettingui\']', + Areas: { + TAB: ':contains("Areas").slick-cell', + PANEL: ':contains("Areas").container-fluid', + includeOptions: { + WIDTH_SLIDER: '[value=\'area.inWidth\']' + }, + excludeOptions: { + WIDTH_SLIDER: '[value=\'area.exWidth\']' + }, + RESET_ALL_BUTTON: '[ng-click=\'area.reset()\']' + }, + Bearing: { + TAB: ':contains("Bearing").slick-cell', + PANEL: ':contains("Bearing").container-fluid', + TRUE_NORTH_RADIO_BUTTON: '#trueNorth', + MAGNETIC_NORTH_RADIO_BUTTON: '#magnetic', + CLICK_HERE_LINK: '[ng-if=\'helpUrl\'] a' + }, + Display: { + TAB: ':contains("Display").slick-cell', + PANEL: ':contains("Display").container-fluid', + mapMode: { + FLAT_MAP_2D_RADIO_BUTTON: '#mapMode2D', + GLOBE_3D_RADIO_BUTTON: '#mapMode3D' + }, + Position: { + DEFAULT_RADIO_BUTTON: '#cameraModeDefault', + FIXED_RADIO_BUTTON: '#cameraModeFixed', + REMEMBER_LAST_RADIO_BUTTON: '#cameraModeRemember', + LATITUDE_TEXT: '[ng-if=\'display.cameraState\'] .col:eq(0)', + LONGITUDE_TEXT: '[ng-if=\'display.cameraState\'] .col:eq(1)', + ZOOM_TEXT: '[ng-if=\'display.cameraState\'] .col:eq(2)' + }, + globeOptions: { + ENABLE_SKY_CHECKBOX: '#skyEnabled', + ENABLE_SKY_BADGE: '[content=\'display.help.sky\']', + ENABLE_SUNLIGHT_CHECKBOX: '#sunlightEnabled', + ENABLE_SUNLIGHT_BADGE: '[content=\'display.help.sunlight\']', + ENABLE_FOG_CHECKBOX: '#fogEnabled', + ENABLE_FOG_BADGE: '[content=\'display.help.fog\']', + FOG_DENSITY_SLIDER: '.ui-slider-handle' + } + }, + Interpolation: { + TAB: ':contains("Interpolation").slick-cell', + PANEL: ':contains("Interpolation").container-fluid', + GEODESIC_RADIO_BUTTON: '#geodesicInterpolation', + RHUMB_RADIO_BUTTON: '#rhumbInterpolation', + GRANULARITY_INPUT: '[name=\'kilometers\']' + }, + Legend: { + TAB: ':contains("Legend").slick-cell', + PANEL: ':contains("Legend").container-fluid', + OPEN_LEGEND_BUTTON: '[title=\'Open the legend on the map\']', + contentOptions: { + SHOW_FEATURE_LAYERS_CHECKBOX: '#legendShowVector', + SHOW_FEATURE_LAYER_TYPE_CHECKBOX: '#legendShowVectorType', + SHOW_FEATURE_COUNT_CHECKBOX: '#legendShowCount', + SHOW_TILE_LAYERS_CHECKBOX: '#legendShowTile', + SHOW_FEATURE_ACTIONS_CHECKBOX: '#legendShowFeatureActions', + SHOW_AUTO_COLORS_CHECKBOX: '#legendShowAuto', + SHOW_MANUAL_COLORS_CHECKBOX: '#legendShowManual', + SHOW_COLUMN_IN_LABEL_CHECKBOX: '#legendShowColumn' + }, + displayOptions: { + SHOW_BACKGROUND_CHECKBOX: '#legendShowBackground', + BOLD_TOGGLE_BUTTON: '[ng-click=\'legend.toggleBold()\']', + DECREASE_FONT_BUTTON: '[ng-click=\'legend.decreaseFontSize()\']', + INCREASE_FONT_BUTTON: '[ng-click=\'legend.increaseFontSize()\']', + OPACITY_SLIDER: '.ui-slider-handle' + } + }, + Projection: { + TAB: ':contains("Projection").slick-cell', + PANEL: ':contains("Projection").container-fluid', + MAP_PROJECTION_DROPDOWN: '[ng-model=\'projCtrl.projection\']', + APPLY_BUTTON: '[ng-click=\'projCtrl.apply()\']' + }, + Units: { + TAB: ':contains("Units").slick-cell', + PANEL: ':contains("Units").container-fluid', + IMPERIAL_RADIO_BUTTON: '#imperial', + METRIC_RADIO_BUTTON: '#metric', + NAUTICAL_RADIO_BUTTON: '#metric', + NAUTICAL_MILES_ONLY_RADIO_BUTTON: '#nauticalmile', + MILES_ONLY_RADIO_BUTTON: '#mile', + YARDS_ONLY_RADIO_BUTTON: '#yard', + FEET_ONLY_RADIO_BUTTON: '#feet' + } + }, + Theme: { + TAB: ':contains("Theme").slick-cell', + PANEL: ':contains("Theme").container-fluid', + PRIMARY_THEME_DROPDOWN: '[ng-change=\'ctrl.onThemeChange()\']', + ACCESSIBILITY_OPTIONS_DROPDOWN: '[ng-model=\'ctrl.accessibleTheme\']' + } + }, + RESET_BUTTON: '[ng-click=\'setCon.reset();\']', + CLOSE_BUTTON: '[ng-click=\'setCon.close()\']' +}; diff --git a/cypress/support/selectors/shared.js b/cypress/support/selectors/shared.js new file mode 100644 index 000000000..b2a1f7e6c --- /dev/null +++ b/cypress/support/selectors/shared.js @@ -0,0 +1,393 @@ +exports.annotationOptions = { + SHOW_ANNOTATION_CHECKBOX: '[ng-attr-for=\'showAnnotation{{ctrl.uid}}\']', + SHOW_NAME_CHECKBOX: '[ng-attr-for=\'showAnnotationName{{ctrl.uid}}\']', + SHOW_DESCRIPTION_CHECKBOX: '[ng-attr-for=\'showAnnotationDescription{{ctrl.uid}}\']', + SHOW_DEFAULTTAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationDefaultTail{{ctrl.uid}}\']', + SHOW_NOTAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationNoTail{{ctrl.uid}}\']', + SHOW_LINETAILTYPE_RADIOBUTTON: '[ng-attr-for=\'showAnnotationLineTail{{ctrl.uid}}\']' +}; + +exports.colorPicker = { + BUTTON: '[name=\'color\']', + SELECTED_COLOR: '.c-colorpalette__selected', + Color: { + WHITE: '[title=\'#ffffff\']', + BLACK: '[title=\'#000000\']', + RED: '[title=\'#FF0000\']', + ORANGE: '[title=\'#FFA500\']', + YELLOW: '[title=\'#FFFF00\']', + GREEN: '[title=\'#008000\']', + BLUE: '[title=\'#0000FF\']', + INDIGO: '[title=\'#4B0082\']', + VIOLET: '[title=\'#EE82EE\']' + }, + RESET_BUTTON: '[ng-click=\'palette.reset()\']' +}; + +exports.columnAssociationDialog = { + DIALOG: '#columnmappingform', + DIALOG_CLOSE: '#columnmappingform .close', + NAME_INPUT: '[name=\'name\']', + DESCRIPTION_INPUT: '[name=\'description\']', + ADD_ASSOCIATION_BUTTON: '[ng-click=\'cmFormCtrl.add()\']', + Associations: { + LAYER_DROPDOWN: '.select2-chosen', + COLUMN_DROPDOWN: '.select2-chosen', + REMOVE_EXPRESSION_BUTTON: '[title=\'Remove this expression\']', + LAYER_1_DROPDOWN: '.select2-chosen:eq(0)', + COLUMN_1_DROPDOWN: '.select2-chosen:eq(0)', + EXPRESSION_1_REMOVE_BUTTON: '[title=\'Remove this expression\']:eq(0)', + LAYER_2_DROPDOWN: '.select2-chosen:eq(1)', + COLUMN_2_DROPDOWN: '.select2-chosen:eq(1)', + EXPRESSION_2_REMOVE_BUTTON: '[title=\'Remove this expression\']:eq(1)' + }, + OK_BUTTON: '[ng-click=\'cmFormCtrl.confirm()\']', + CANCEL_BUTTON: '[ng-click=\'cmFormCtrl.cancel()\']' +}; + +exports.Grid = { + GRID: '.slick-grid', + HEADER_ROW: '.slick-header', + HEADER_CELL_1: '.slick-header-column:eq(0)', + HEADER_CELL_2: '.slick-header-column:eq(1)', + HEADER_CELL_3: '.slick-header-column:eq(2)', + HEADER_CELL_4: '.slick-header-column:eq(3)', + HEADER_CELL_5: '.slick-header-column:eq(4)', + HEADER_CELL_6: '.slick-header-column:eq(5)', + HEADER_CELL_7: '.slick-header-column:eq(6)', + HEADER_CELL_8: '.slick-header-column:eq(7)', + HEADER_CELL_9: '.slick-header-column:eq(8)', + HEADER_CELL_10: '.slick-header-column:eq(9)', + HEADER_CELL_11: '.slick-header-column:eq(10)', + HEADER_CELL_12: '.slick-header-column:eq(11)', + HEADER_CELL_13: '.slick-header-column:eq(12)', + HEADER_CELL_14: '.slick-header-column:eq(13)', + HEADER_CELL_15: '.slick-header-column:eq(14)', + ROWS: '.slick-row', + ROW_IS_SELECTED_CLASS: 'selected', + ROW_1: '.slick-row:eq(0)', + ROW_2: '.slick-row:eq(1)', + ROW_3: '.slick-row:eq(2)', + ROW_4: '.slick-row:eq(3)', + ROW_5: '.slick-row:eq(4)', + ROW_6: '.slick-row:eq(5)', + ROW_7: '.slick-row:eq(6)', + ROW_8: '.slick-row:eq(7)', + ROW_9: '.slick-row:eq(8)', + ROW_10: '.slick-row:eq(9)', + CELLS: '.slick-cell', + CELL_1: '.slick-cell:eq(0)', + CELL_2: '.slick-cell:eq(1)', + CELL_3: '.slick-cell:eq(2)', + CELL_4: '.slick-cell:eq(3)', + CELL_5: '.slick-cell:eq(4)', + CELL_6: '.slick-cell:eq(5)', + CELL_7: '.slick-cell:eq(6)', + CELL_8: '.slick-cell:eq(7)', + CELL_9: '.slick-cell:eq(8)', + CELL_10: '.slick-cell:eq(9)', + CELL_11: '.slick-cell:eq(10)', + CELL_12: '.slick-cell:eq(11)', + CELL_13: '.slick-cell:eq(12)', + CELL_14: '.slick-cell:eq(13)', + CELL_15: '.slick-cell:eq(14)' +}; + +exports.layerStyle = { + BUTTON: '[title=\'Style controls for the layer(s)\']', + OPACITY_SLIDER: '[name=\'opacity\'] .ui-slider-handle', + SIZE_SLIDER: '[name=\'size\'] .ui-slider-handle', + DROPDOWN: '[ng-model=\'$parent.shape\']', + Style: { + Icon: { + ICON_BUTTON: '[ng-model=\'icon\']', + ROTATION_CHECKBOX: '.no-text > .fa', + ROTATION_DROPDOWN: '[title=\'Sets the data field used for bearing\']' + }, + LineOfBearing: { + BEARING_DROPDOWN: '[title=\'Sets the data field used for bearing\']', + Manual: { + RADIOBUTTON: '#lengthManual', + INPUT: '#lengthColumn', + SLIDER: '[name=\'length\']', + UNITS_DROPDOWN: '.ml-1[title=\'Sets the units field used for length\']' + }, + Column: { + RADIOBUTTON: '#lengthColumn', + DROPDOWN: '[title=\'Sets the data field used for length\']', + UNITS_DROPDOWN: '[title=\'Sets the data field used for length\']', + MULTIPLER_INPUT: '[ng-model=\'columnLength\']' + }, + showArrow: { + CHECKBOX: '#showArrow', + SIZE_INPUT: '[max=\'maxSize[ctrl.arrowUnits]\']', + UNITS_DROPDOWN: '[title=\'Sets the units field used for arrow size\']' + }, + showEllipse: { + CHECKBOX: '#showEllipse', + SHOW_ELLIPSOIDS_CHECKBOX: '[name=\'showEllipsoids\']', + SHOW_GROUND_REF_CHECKBOX: '[name=\'showGroundReference\']' + }, + showError: { + CHECKBOX: '#showError', + TIP_BUTTON: '[x-content=\'ctrl.helpText\']', + TIP_POPUP: '.popover', + BEARING_ERR_DROPDOWN: '[title=\'Sets the data field used for bearing error\']', + BEARING_ERR_MULTIPLYER_INPUT: '[ng-model=\'bearingErrorMultiplier\']', + LENGTH_ERR_DROPDOWN: '[title=\'Sets the data field used for length error\']', + LENGTH_ERR_UNITS_DROPDOWN: '[ng-model=\'ctrl.lengthErrorUnits\']', + LENGTH_ERR_MULTIPLER_INPUT: '[ng-model=\'lengthErrorMultiplier\']' + } + }, + LineOfBearingWithCenter: { + CENTER_DROPDOWN: '[ng-model=\'$parent.centerShape\']', + BEARING_DROPDOWN: '[title=\'Sets the data field used for bearing\']', + Manual: { + RADIOBUTTON: '#lengthManual', + INPUT: '#lengthColumn', + SLIDER: '[name=\'length\']', + UNITS_DROPDOWN: '.ml-1[title=\'Sets the units field used for length\']' + }, + Column: { + RADIOBUTTON: '#lengthColumn', + DROPDOWN: '[title=\'Sets the data field used for length\']', + UNITS_DROPDOWN: '[title=\'Sets the data field used for length\']', + MULTIPLER_INPUT: '[ng-model=\'columnLength\']' + }, + showArrow: { + CHECKBOX: '#showArrow', + SIZE_INPUT: '[max=\'maxSize[ctrl.arrowUnits]\']', + UNITS_DROPDOWN: '[title=\'Sets the units field used for arrow size\']' + }, + showEllipse: { + CHECKBOX: '#showEllipse', + SHOW_ELLIPSOIDS_CHECKBOX: '[name=\'showEllipsoids\']', + SHOW_GROUND_REF_CHECKBOX: '[name=\'showGroundReference\']' + }, + showError: { + CHECKBOX: '#showError', + TIP_BUTTON: '[x-content=\'ctrl.helpText\']', + TIP_POPUP: '.popover', + BEARING_ERR_DROPDOWN: '[title=\'Sets the data field used for bearing error\']', + BEARING_ERR_MULTIPLYER_INPUT: '[ng-model=\'bearingErrorMultiplier\']', + LENGTH_ERR_DROPDOWN: '[title=\'Sets the data field used for length error\']', + LENGTH_ERR_UNITS_DROPDOWN: '[ng-model=\'ctrl.lengthErrorUnits\']', + LENGTH_ERR_MULTIPLER_INPUT: '[ng-model=\'lengthErrorMultiplier\']' + } + }, + Ellipse: { + SEMI_MAJOR_INPUT: '[name=\'semiMajor\']', + SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMajorUnits\']', + SEMI_MAJOR_AXIS_BADGE: '[data-title=\'"Semi-Major Axis"\']', + SEMI_MINOR_INPUT: '[name=\'semiMinor\']', + SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMinorUnits\']', + SEMI_MINOR_AXIS_BADGE: '[data-title=\'"Semi-Minor Axis"\']', + ORIENTATION_INPUT: '[name=\'orientation\']', + ELLIPSE_ORIENTATION_BADGE: '[data-title=\'"Ellipse Orientation"\']' + }, + ellipseWithCenter: { + CENTER_DROPDOWN: '[ng-model=\'$parent.centerShape\']', + ROTATION_CHECKBOX: '.no-text > .fa', + ROTATION_DROPDOWN: '[title=\'Sets the data field used for bearing\']', + SEMI_MAJOR_INPUT: '[name=\'semiMajor\']', + SEMI_MAJOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMajorUnits\']', + SEMI_MAJOR_AXIS_BADGE: '[data-title=\'"Semi-Major Axis"\']', + SEMI_MINOR_INPUT: '[name=\'semiMinor\']', + SEMI_MINOR_UNITS_DROPDOWN: '[ng-model=\'ctrl.semiMinorUnits\']', + SEMI_MINOR_AXIS_BADGE: '[data-title=\'"Semi-Minor Axis"\']', + ORIENTATION_INPUT: '[name=\'orientation\']', + ELLIPSE_ORIENTATION_BADGE: '[data-title=\'"Ellipse Orientation"\']', + ICON_BUTTON: '[ng-model=\'icon\']', + ROTATION_INPUT: '[name=\'iconRotation\']', + ICON_ROTATION_BADGE: '[data-title=\'"Icon Rotation"\']' + } + } +}; + +exports.layerLabel = { + BUTTON: '[title=\'Configure how labels are displayed for the layer\']', + SIZE_DROPDOWN: '[name=\'spinner\']', + ALWAYS_SHOW_LABELS_CHECKBOX: '#showLabels', + Column: { + HANDLE: '[title=\'Click and Drag to move this label\']', + CHECKBOX: '[ng-model=\'label.showColumn\']', + DROPDOWN: '[title=\'Sets the data field used for labels\']', + REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']', + ADD_COLUMN_BUTTON: '[title=\'Add a label\']', + COLUMN_1_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_1_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_1_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_2_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_2_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_2_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_3_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_3_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_3_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_4_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_4_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_4_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)', + COLUMN_5_CHECKBOX: '[ng-model=\'label.showColumn\']:eq(0)', + COLUMN_5_DROPDOWN: '[title=\'Sets the data field used for labels\']eq:(0)', + COLUMN_5_REMOVE_COLUMN_BUTTON: '[title=\'Remove this label\']eq:(0)' + } +}; + +exports.Options = { + LAYER_TITLE_INPUT: '[name=\'title\']', + DESCRIPTION_INPUT: '[name=\'desc\']', + TAGS_INPUT: '[name=\'tags\']' +}; + +exports.placeDialog = { + DIALOG: '#placemarkEdit', + DIALOG_CLOSE: '#placemarkEdit .close', + NAME_INPUT: '[name=\'name\']', + DESCRIPTION_INPUT: '.CodeMirror', + POSITION_INPUT: '[ng-model=\'posText\']', + POSITION_BUTTON: '[title=\'Set the position by clicking on the map\']', + ENTERING_POSITION_BADGE: '[data-title=\'"Entering Position"\']', + ALTITUDE_INPUT: '[name=\'altitude\']', + ALTITUDE_UNITS_DROPDOWN: '[ng-model=\'ctrl.altUnits\']', + Time: { + NO_TIME: '[value=\'notime\']', + Instant: { + RADIOBUTTON: '[value=\'instant\']', + DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']', + HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']', + MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']', + SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']', + NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']', + CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']' + }, + RANGE: { + RADIOBUTTON: '[value=\'range\']', + Start: { + DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']:eq(0)', + HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']:eq(0)', + MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']:eq(0)', + SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']:eq(0)', + NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']:eq(0)', + CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']:eq(0)' + }, + End: { + DATE_INPUT: '#placemarkEdit [ui-date=\'wheelDate.dateOptions\']:eq(1)', + HOUR_INPUT: '[ng-model=\'dateTimeCtrl.hour\']:eq(1)', + MINUTE_INPUT: '[ng-model=\'dateTimeCtrl.minute\']:eq(1)', + SECONDS_INPUT: '[ng-model=\'dateTimeCtrl.second\']:eq(1)', + NOW_BUTTON: '[ng-click=\'dateTimeCtrl.setNow()\']:eq(1)', + CLEAR_BUTTON: '[ng-click=\'dateTimeCtrl.reset()\']:eq(1)' + } + }, + TIME_SELECTION_BADGE: '[ng-if=\'help\']' + }, + OK_BUTTON: '[ng-class=\'yesButtonClass\']', + CANCEL_BUTTON: '[ng-class=\'noButtonClass\']' +}; + +exports.Time = { + FORMAT_HELP_BUTTON: '[title=\'Help for custom date and time formats\']', + noTime: { + RADIOBUTTON: '[value=\'none\']' + }, + Instant: { + RADIOBUTTON: '[value=\'instant\']', + Type: { + DROPDOWN: '[ng-model=\'model.dateType\']', + dateTime: { + DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', + FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', + CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' + }, + separateDateTime: { + DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']', + DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']', + DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']', + TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']', + TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']', + TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']' + }, + dateOnly: { + DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']', + FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']', + CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']' + }, + SAMPLE_TEXT: '.d-block:eq(0)', + RESULT_TEXT: '.d-block:eq(1)' + } + }, + timeRange: { + RADIOBUTTON: '[value=\'range\']', + Start: { + Type: { + DROPDOWN: '[ng-model=\'model.dateType\']:eq(0)', + dateTime: { + DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', + FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', + CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' + }, + separateDateTime: { + DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(0)', + DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(0)', + DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)', + TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(0)', + TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(0)', + TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(0)' + }, + dateOnly: { + DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(0)', + FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(0)', + CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(0)' + } + }, + SAMPLE_TEXT: '.d-block:eq(0)', + RESULT_TEXT: '.d-block:eq(1)' + }, + End: { + Type: { + DROPDOWN: '[ng-model=\'model.dateType\']:eq(1)', + dateTime: { + DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', + FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', + CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' + }, + separateDateTime: { + DATE_DROPDOWN: '[ng-change=\'tiUI.onDateColumn()\']:eq(1)', + DATE_FORMAT_DROPDOWN: '[ng-model=\'tiUI.dateFormat\']:eq(1)', + DATE_CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)', + TIME_DROPDOWN: '[ng-model=\'model.timeColumn\']:eq(1)', + TIME_FORMAT_DROPDOWN: '[ng-model=\'tiUI.timeFormat\']:eq(1)', + TIME_CUSTOM_INPUT: '[ng-model=\'model.timeFormat\']:eq(1)' + }, + dateOnly: { + DATE_DROPDOWN: '[ng-model=\'model.dateColumn\']:eq(1)', + FORMAT_DROPDOWN: '[ng-change=\'tiUI.onDateFormat()\']:eq(1)', + CUSTOM_INPUT: '[ng-model=\'model.dateFormat\']:eq(1)' + } + }, + SAMPLE_TEXT: '.d-block:eq(2)', + RESULT_TEXT: '.d-block:eq(3)' + } + }, + PREVIEW_DATA_TEXT: '[x-data=\'config.preview\']' +}; + +exports.Tree = { + ROW: '.slick-row', + ROW_NODE_TOGGLE: '.js-node-toggle', + ROW_NODE_EXPANDED_CLASS: 'fa-caret-down', + ROW_NODE_COLLAPSED_CLASS: 'fa-caret-right', + ROW_CHECKBOX: '.c-tristate', + ROW_CHECKED_CLASS: 'c-tristate-on', + ROW_UNCHECKED_CLASS: 'c-tristate-off', + FILTER_BUTTON: '[title=\'Manage filters\']', + ROW_1: '.slick-row:eq(0)', + ROW_2: '.slick-row:eq(1)', + ROW_3: '.slick-row:eq(2)', + ROW_4: '.slick-row:eq(3)', + ROW_5: '.slick-row:eq(4)', + ROW_6: '.slick-row:eq(5)', + ROW_7: '.slick-row:eq(6)', + ROW_8: '.slick-row:eq(7)', + ROW_9: '.slick-row:eq(8)', + ROW_10: '.slick-row:eq(9)' +}; diff --git a/package.json b/package.json index 34a33278e..75a59679b 100644 --- a/package.json +++ b/package.json @@ -87,6 +87,7 @@ "test:cypress-all": "bash cypress/support/execute-tests.sh dev cli all", "test:cypress-smoke": "bash cypress/support/execute-tests.sh dev cli smoke", "test:cypress-spec": "bash cypress/support/execute-tests.sh dev cli spec $1", + "test:cypress-loop": "bash cypress/support/execute-tests.sh dev cli loop $1", "init:apidoc": "rimraf .build/*.conf.json dist/apidoc && mkdirp .build dist/apidoc", "init:base": "rimraf .build dist && mkdirp .build dist/opensphere", "init:debug": "rimraf index.html", diff --git a/src/os/ui/descriptioninfo.js b/src/os/ui/descriptioninfo.js index 50697b252..2239a0d36 100644 --- a/src/os/ui/descriptioninfo.js +++ b/src/os/ui/descriptioninfo.js @@ -130,8 +130,7 @@ os.ui.launchDescriptionInfo = function(id, description, opt_titleDetail) { 'height': '600', 'min-height': '600', 'max-height': '600', - 'show-close': 'true', - 'data-testid': 'descriptioninfo' + 'show-close': 'true' }; var template = ''; diff --git a/views/descriptioninfo.html b/views/descriptioninfo.html index 8d7a6e065..cc99a24b3 100644 --- a/views/descriptioninfo.html +++ b/views/descriptioninfo.html @@ -1,5 +1,5 @@
    diff --git a/views/windows/featurelist.html b/views/windows/featurelist.html index 3fd583857..caf90eabb 100644 --- a/views/windows/featurelist.html +++ b/views/windows/featurelist.html @@ -1,4 +1,4 @@ -
    +