Skip to content

Commit

Permalink
clean URLs without #
Browse files Browse the repository at this point in the history
  • Loading branch information
Rello committed Sep 9, 2024
1 parent 4d291cc commit 0712fb8
Show file tree
Hide file tree
Showing 16 changed files with 298 additions and 207 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
- rework of sharing backend
- no activities for added data anymore
- excel data source: handling of time and % values
- clean URLs without #

### Fixed
- excel data source: remove all-null columns
Expand Down
240 changes: 139 additions & 101 deletions appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,109 +8,147 @@


return [
'routes' => [
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
['name' => 'page#advanced', 'url' => '/a/', 'verb' => 'GET'],
['name' => 'page#panorama', 'url' => '/pa/', 'verb' => 'GET'],
['name' => 'page#indexPublic', 'url' => '/p/{token}', 'verb' => 'GET'],
['name' => 'page#indexPublicMin', 'url' => '/pm/{token}', 'verb' => 'GET'],
['name' => 'page#authenticatePassword', 'url' => '/p/{token}', 'verb' => 'POST'],

// Report
['name' => 'report#index', 'url' => '/report', 'verb' => 'GET'],
['name' => 'report#create', 'url' => '/report', 'verb' => 'POST'],
['name' => 'report#read', 'url' => '/report/{reportId}', 'verb' => 'GET'],
['name' => 'report#delete', 'url' => '/report/{reportId}', 'verb' => 'DELETE'],
['name' => 'report#update', 'url' => '/report/{reportId}', 'verb' => 'PUT'],
['name' => 'report#createCopy', 'url' => '/report/copy', 'verb' => 'POST'],
['name' => 'report#createFromDataFile', 'url' => '/report/file', 'verb' => 'POST'],
['name' => 'report#updateOptions', 'url' => '/report/{reportId}/options', 'verb' => 'POST'],
['name' => 'report#updateRefresh', 'url' => '/report/{reportId}/refresh', 'verb' => 'POST'],
['name' => 'report#updateGroup', 'url' => '/report/{reportId}/group', 'verb' => 'POST'],
['name' => 'report#getOwnFavoriteReports', 'url' => '/favorites', 'verb' => 'GET'],
['name' => 'report#setFavorite', 'url' => '/favorite/{reportId}', 'verb' => 'POST'],
['name' => 'report#export', 'url' => '/report/export/{reportId}', 'verb' => 'GET'],
['name' => 'report#import', 'url' => '/report/import/', 'verb' => 'POST'],

// Dataset
['name' => 'dataset#index', 'url' => '/dataset', 'verb' => 'GET'],
['name' => 'dataset#create', 'url' => '/dataset', 'verb' => 'POST'],
['name' => 'dataset#read', 'url' => '/dataset/{datasetId}', 'verb' => 'GET'],
['name' => 'dataset#delete', 'url' => '/dataset/{datasetId}', 'verb' => 'DELETE'],
['name' => 'dataset#update', 'url' => '/dataset/{datasetId}', 'verb' => 'PUT'],
['name' => 'dataset#status', 'url' => '/dataset/{datasetId}/status', 'verb' => 'GET'],
'routes' => [
['name' => 'page#report', 'url' => '/', 'verb' => 'GET'],
[
'name' => 'page#report',
'url' => '/r/{id}',
'verb' => 'GET',
'postfix' => 'index',
'defaults' => [
'id' => '',
]
],
[
'name' => 'page#advanced',
'url' => '/d/{id}',
'verb' => 'GET',
'defaults' => [
'id' => '',
]
],
[
'name' => 'page#panorama',
'url' => '/pa/{id}',
'verb' => 'GET',
'defaults' => [
'id' => '',
]
],
['name' => 'page#indexPublic', 'url' => '/p/{token}', 'verb' => 'GET'],
['name' => 'page#indexPublicMin', 'url' => '/pm/{token}', 'verb' => 'GET'],
['name' => 'page#authenticatePassword', 'url' => '/p/{token}', 'verb' => 'POST'],

// Report
['name' => 'report#index', 'url' => '/report', 'verb' => 'GET'],
['name' => 'report#create', 'url' => '/report', 'verb' => 'POST'],
['name' => 'report#read', 'url' => '/report/{reportId}', 'verb' => 'GET'],
['name' => 'report#delete', 'url' => '/report/{reportId}', 'verb' => 'DELETE'],
['name' => 'report#update', 'url' => '/report/{reportId}', 'verb' => 'PUT'],
['name' => 'report#createCopy', 'url' => '/report/copy', 'verb' => 'POST'],
['name' => 'report#createFromDataFile', 'url' => '/report/file', 'verb' => 'POST'],
['name' => 'report#updateOptions', 'url' => '/report/{reportId}/options', 'verb' => 'POST'],
['name' => 'report#updateRefresh', 'url' => '/report/{reportId}/refresh', 'verb' => 'POST'],
['name' => 'report#updateGroup', 'url' => '/report/{reportId}/group', 'verb' => 'POST'],
['name' => 'report#getOwnFavoriteReports', 'url' => '/favorites', 'verb' => 'GET'],
['name' => 'report#setFavorite', 'url' => '/favorite/{reportId}', 'verb' => 'POST'],
['name' => 'report#export', 'url' => '/report/export/{reportId}', 'verb' => 'GET'],
['name' => 'report#import', 'url' => '/report/import/', 'verb' => 'POST'],

// Dataset
['name' => 'dataset#index', 'url' => '/dataset', 'verb' => 'GET'],
['name' => 'dataset#create', 'url' => '/dataset', 'verb' => 'POST'],
['name' => 'dataset#read', 'url' => '/dataset/{datasetId}', 'verb' => 'GET'],
['name' => 'dataset#delete', 'url' => '/dataset/{datasetId}', 'verb' => 'DELETE'],
['name' => 'dataset#update', 'url' => '/dataset/{datasetId}', 'verb' => 'PUT'],
['name' => 'dataset#status', 'url' => '/dataset/{datasetId}/status', 'verb' => 'GET'],
['name' => 'dataset#provider', 'url' => '/dataset/{datasetId}/provider', 'verb' => 'POST'],

// Panorama
['name' => 'panorama#index', 'url' => '/panorama', 'verb' => 'GET'],
['name' => 'panorama#create', 'url' => '/panorama', 'verb' => 'POST'],
['name' => 'panorama#read', 'url' => '/panorama/{panoramaId}', 'verb' => 'GET'],
['name' => 'panorama#delete', 'url' => '/panorama/{panoramaId}', 'verb' => 'DELETE'],
['name' => 'panorama#update', 'url' => '/panorama/{panoramaId}', 'verb' => 'PUT'],
['name' => 'panorama#getOwnFavoriteReports', 'url' => '/panoramaFavorites', 'verb' => 'GET'],
['name' => 'panorama#setFavorite', 'url' => '/panoramaFavorite/{panoramaId}', 'verb' => 'POST'],

// Data Output
['name' => 'output#read', 'url' => '/data/{reportId}', 'verb' => 'GET'],
// Panorama
['name' => 'panorama#index', 'url' => '/panorama', 'verb' => 'GET'],
['name' => 'panorama#create', 'url' => '/panorama', 'verb' => 'POST'],
['name' => 'panorama#read', 'url' => '/panorama/{panoramaId}', 'verb' => 'GET'],
['name' => 'panorama#delete', 'url' => '/panorama/{panoramaId}', 'verb' => 'DELETE'],
['name' => 'panorama#update', 'url' => '/panorama/{panoramaId}', 'verb' => 'PUT'],
['name' => 'panorama#getOwnFavoriteReports', 'url' => '/panoramaFavorites', 'verb' => 'GET'],
['name' => 'panorama#setFavorite', 'url' => '/panoramaFavorite/{panoramaId}', 'verb' => 'POST'],

// Data Output
['name' => 'output#read', 'url' => '/data/{reportId}', 'verb' => 'GET'],
['name' => 'output#readPanorama', 'url' => '/data/pa/{reportId}', 'verb' => 'GET'],
['name' => 'output#readPublic', 'url' => '/data/public/{token}', 'verb' => 'GET'],
['name' => 'output#readPreview', 'url' => '/data', 'verb' => 'POST'],

// Data Maintenance
['name' => 'dataload#updateData', 'url' => '/data/{reportId}', 'verb' => 'PUT'],
['name' => 'dataload#deleteData', 'url' => '/data/{reportId}', 'verb' => 'DELETE'],
['name' => 'dataload#deleteDataSimulate', 'url' => '/data/deleteDataSimulate', 'verb' => 'POST'],
['name' => 'dataload#importClipboard', 'url' => '/data/importCSV', 'verb' => 'POST'],
['name' => 'dataload#importFile', 'url' => '/data/importFile', 'verb' => 'POST'],

// Data loads
['name' => 'dataload#create', 'url' => '/dataload', 'verb' => 'POST'],
['name' => 'dataload#read', 'url' => '/dataload', 'verb' => 'GET'],
['name' => 'dataload#update', 'url' => '/dataload/{dataloadId}', 'verb' => 'PUT'],
['name' => 'dataload#delete', 'url' => '/dataload/{dataloadId}', 'verb' => 'DELETE'],
['name' => 'dataload#simulate', 'url' => '/dataload/simulate', 'verb' => 'POST'],
['name' => 'dataload#execute', 'url' => '/dataload/execute', 'verb' => 'POST'],
['name' => 'dataload#copy', 'url' => '/dataload/copy', 'verb' => 'POST'],

// Datasource
['name' => 'datasource#index', 'url' => '/datasource', 'verb' => 'GET'],

// Share
['name' => 'share#create', 'url' => '/share', 'verb' => 'POST'],
['name' => 'share#readReport', 'url' => '/share/report/{item_source}', 'verb' => 'GET'],
['name' => 'output#readPublic', 'url' => '/data/public/{token}', 'verb' => 'GET'],
['name' => 'output#readPreview', 'url' => '/data', 'verb' => 'POST'],

// Data Maintenance
['name' => 'dataload#updateData', 'url' => '/data/{reportId}', 'verb' => 'PUT'],
['name' => 'dataload#deleteData', 'url' => '/data/{reportId}', 'verb' => 'DELETE'],
['name' => 'dataload#deleteDataSimulate', 'url' => '/data/deleteDataSimulate', 'verb' => 'POST'],
['name' => 'dataload#importClipboard', 'url' => '/data/importCSV', 'verb' => 'POST'],
['name' => 'dataload#importFile', 'url' => '/data/importFile', 'verb' => 'POST'],

// Data loads
['name' => 'dataload#create', 'url' => '/dataload', 'verb' => 'POST'],
['name' => 'dataload#read', 'url' => '/dataload', 'verb' => 'GET'],
['name' => 'dataload#update', 'url' => '/dataload/{dataloadId}', 'verb' => 'PUT'],
['name' => 'dataload#delete', 'url' => '/dataload/{dataloadId}', 'verb' => 'DELETE'],
['name' => 'dataload#simulate', 'url' => '/dataload/simulate', 'verb' => 'POST'],
['name' => 'dataload#execute', 'url' => '/dataload/execute', 'verb' => 'POST'],
['name' => 'dataload#copy', 'url' => '/dataload/copy', 'verb' => 'POST'],

// Datasource
['name' => 'datasource#index', 'url' => '/datasource', 'verb' => 'GET'],

// Share
['name' => 'share#create', 'url' => '/share', 'verb' => 'POST'],
['name' => 'share#readReport', 'url' => '/share/report/{item_source}', 'verb' => 'GET'],
['name' => 'share#readPanorama', 'url' => '/share/panorama/{item_source}', 'verb' => 'GET'],
['name' => 'share#update', 'url' => '/share/{shareId}', 'verb' => 'PUT'],
['name' => 'share#delete', 'url' => '/share/{shareId}', 'verb' => 'DELETE'],

// Threshold
['name' => 'threshold#create', 'url' => '/threshold', 'verb' => 'POST'],
['name' => 'threshold#read', 'url' => '/threshold/{reportId}', 'verb' => 'GET'],
['name' => 'threshold#delete', 'url' => '/threshold/{thresholdId}', 'verb' => 'DELETE'],

// API
// V1
['name' => 'ApiData#preflighted_cors', 'url' => '/api/1.0/{path}', 'verb' => 'OPTIONS', 'requirements' => ['path' => '.+']],
['name' => 'ApiData#addData', 'url' => '/api/1.0/adddata/{datasetId}', 'verb' => 'POST'],

// V2
['name' => 'ApiData#preflighted_cors', 'url' => '/api/2.0/{path}', 'verb' => 'OPTIONS', 'requirements' => ['path' => '.+']],
['name' => 'ApiData#addDataV2', 'url' => '/api/2.0/adddata/{datasetId}', 'verb' => 'POST'],
['name' => 'ApiData#deleteDataV2', 'url' => '/api/2.0/deletedata/{datasetId}', 'verb' => 'POST'],

// V3
['name' => 'ApiData#preflighted_cors', 'url' => '/api/3.0/{path}', 'verb' => 'OPTIONS', 'requirements' => ['path' => '.+']],
['name' => 'ApiData#dataAddV3', 'url' => '/api/3.0/data/{datasetId}/add', 'verb' => 'POST'],
['name' => 'ApiData#dataDeleteV3', 'url' => '/api/3.0/data/{datasetId}/delete', 'verb' => 'POST'],
['name' => 'ApiData#dataGetV3', 'url' => '/api/3.0/data/{reportId}', 'verb' => 'GET'],
['name' => 'ApiData#datasetIndexV3', 'url' => '/api/3.0/datasets', 'verb' => 'GET'],
['name' => 'ApiData#reportIndexV3', 'url' => '/api/3.0/reports', 'verb' => 'GET'],
['name' => 'ApiData#reportDetailV3', 'url' => '/api/3.0/report/{reportId}', 'verb' => 'GET'],

// wizard
['name' => 'wizard#dismiss', 'url' => '/wizard', 'verb' => 'POST'],

// whatsnew
['name' => 'whatsNew#get', 'url' => '/whatsnew', 'verb' => 'GET'],
['name' => 'whatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'],
]
['name' => 'share#update', 'url' => '/share/{shareId}', 'verb' => 'PUT'],
['name' => 'share#delete', 'url' => '/share/{shareId}', 'verb' => 'DELETE'],

// Threshold
['name' => 'threshold#create', 'url' => '/threshold', 'verb' => 'POST'],
['name' => 'threshold#read', 'url' => '/threshold/{reportId}', 'verb' => 'GET'],
['name' => 'threshold#delete', 'url' => '/threshold/{thresholdId}', 'verb' => 'DELETE'],

// API
// V1
[
'name' => 'ApiData#preflighted_cors',
'url' => '/api/1.0/{path}',
'verb' => 'OPTIONS',
'requirements' => ['path' => '.+']
],
['name' => 'ApiData#addData', 'url' => '/api/1.0/adddata/{datasetId}', 'verb' => 'POST'],

// V2
[
'name' => 'ApiData#preflighted_cors',
'url' => '/api/2.0/{path}',
'verb' => 'OPTIONS',
'requirements' => ['path' => '.+']
],
['name' => 'ApiData#addDataV2', 'url' => '/api/2.0/adddata/{datasetId}', 'verb' => 'POST'],
['name' => 'ApiData#deleteDataV2', 'url' => '/api/2.0/deletedata/{datasetId}', 'verb' => 'POST'],

// V3
[
'name' => 'ApiData#preflighted_cors',
'url' => '/api/3.0/{path}',
'verb' => 'OPTIONS',
'requirements' => ['path' => '.+']
],
['name' => 'ApiData#dataAddV3', 'url' => '/api/3.0/data/{datasetId}/add', 'verb' => 'POST'],
['name' => 'ApiData#dataDeleteV3', 'url' => '/api/3.0/data/{datasetId}/delete', 'verb' => 'POST'],
['name' => 'ApiData#dataGetV3', 'url' => '/api/3.0/data/{reportId}', 'verb' => 'GET'],
['name' => 'ApiData#datasetIndexV3', 'url' => '/api/3.0/datasets', 'verb' => 'GET'],
['name' => 'ApiData#reportIndexV3', 'url' => '/api/3.0/reports', 'verb' => 'GET'],
['name' => 'ApiData#reportDetailV3', 'url' => '/api/3.0/report/{reportId}', 'verb' => 'GET'],

// wizard
['name' => 'wizard#dismiss', 'url' => '/wizard', 'verb' => 'POST'],

// whatsnew
['name' => 'whatsNew#get', 'url' => '/whatsnew', 'verb' => 'GET'],
['name' => 'whatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'],
]
];
11 changes: 11 additions & 0 deletions css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
--color-analytics-shadow: #12426E;
}

[hidden] {
display: none !important;
}

.betaFlag {
color: var(--color-warning);
border: 1px solid var(--color-warning);
Expand Down Expand Up @@ -192,6 +196,13 @@ content: inherit;
/*padding: 20px 30px;*/
}

#analytics-intro {
padding: 30px;
display: flex;
flex-direction: column;
align-items: center;
}

#app-sidebar .close {
position: absolute;
top: 0;
Expand Down
79 changes: 42 additions & 37 deletions js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,26 @@

'use strict';

document.addEventListener('DOMContentLoaded', function () {
OCA.Analytics.initialDocumentTitle = document.title;
OCA.Analytics.Visualization.hideElement('analytics-warning');

if (document.getElementById('advanced').value === 'true') {
OCA.Analytics.isDataset = true;
}

OCA.Analytics.translationAvailable = OCA.Analytics.Core.getInitialState('translationAvailable');

// Todo:
// register handlers for the navigation bar as in panorama

window.addEventListener("beforeprint", function () {
//document.getElementById('chartContainer').style.height = document.getElementById('myChart').style.height;
});

OCA.Analytics.Core.init();
});

OCA.Analytics = Object.assign({}, OCA.Analytics, {
TYPE_GROUP: 0,
TYPE_INTERNAL_FILE: 1,
Expand All @@ -30,7 +50,7 @@ OCA.Analytics = Object.assign({}, OCA.Analytics, {
SHARE_TYPE_LINK: 3,
SHARE_TYPE_ROOM: 10,
initialDocumentTitle: null,
isAdvanced: false,
isDataset: false,
currentReportData: {},
chartObject: null,
tableObject: [],
Expand Down Expand Up @@ -66,18 +86,30 @@ OCA.Analytics = Object.assign({}, OCA.Analytics, {
*/
OCA.Analytics.Core = {
init: function () {
// URL semantic is analytics/*type*/id
let regex = /\/analytics\/([a-zA-Z0-9]+)\/(\d+)/;
let match = window.location.href.match(regex);

const urlHash = decodeURI(location.hash);
if (urlHash.length > 1) {
if (urlHash[2] === 'f') {
window.location.href = '#';
OCA.Analytics.Sidebar.Report.createFromDataFile(urlHash.substring(3));
} else if (urlHash[2] === 'r') {
OCA.Analytics.Navigation.init((parseInt(urlHash.substring(4))));
}
if (match) {
OCA.Analytics.Navigation.init(parseInt(match[2]));
} else {
OCA.Analytics.Navigation.init();
// Dashboard has to be loaded from the navigation as it depends on the report index
}

if (document.getElementById('sharingToken').value === '') {
OCA.Analytics.Visualization.showElement('analytics-intro');
if (!OCA.Analytics.isDataset) {
OCA.Analytics.UI.reportOptionsEventlisteners();
document.getElementById("infoBoxReport").addEventListener('click', OCA.Analytics.Navigation.handleNewButton);
document.getElementById("infoBoxIntro").addEventListener('click', OCA.Analytics.Wizard.showFirstStart);
document.getElementById("infoBoxWiki").addEventListener('click', OCA.Analytics.Core.openWiki);
document.getElementById('fullscreenToggle').addEventListener('click', OCA.Analytics.Visualization.toggleFullscreen);
}
} else {
OCA.Analytics.Backend.getData();
}

},

getDistinctValues: function (array, index) {
Expand Down Expand Up @@ -284,7 +316,7 @@ OCA.Analytics.UI = {
},

resetContentArea: function () {
if (OCA.Analytics.isAdvanced) {
if (OCA.Analytics.isDataset) {
OCA.Analytics.Visualization.showElement('analytics-intro');
document.getElementById('app-sidebar').classList.add('disappear');
} else {
Expand Down Expand Up @@ -1333,30 +1365,3 @@ OCA.Analytics.Backend = {
}
},
};

document.addEventListener('DOMContentLoaded', function () {
if (document.getElementById('advanced').value === 'true') {
OCA.Analytics.isAdvanced = true;
}
OCA.Analytics.initialDocumentTitle = document.title;
OCA.Analytics.Visualization.hideElement('analytics-warning');

if (document.getElementById('sharingToken').value === '') {
OCA.Analytics.Visualization.showElement('analytics-intro');
OCA.Analytics.Core.init();
if (!OCA.Analytics.isAdvanced) {
OCA.Analytics.UI.reportOptionsEventlisteners();
document.getElementById("infoBoxReport").addEventListener('click', OCA.Analytics.Navigation.handleNewButton);
document.getElementById("infoBoxIntro").addEventListener('click', OCA.Analytics.Wizard.showFirstStart);
document.getElementById("infoBoxWiki").addEventListener('click', OCA.Analytics.Core.openWiki);
document.getElementById('fullscreenToggle').addEventListener('click', OCA.Analytics.Visualization.toggleFullscreen);
}
} else {
OCA.Analytics.Backend.getData();
}

OCA.Analytics.translationAvailable = OCA.Analytics.Core.getInitialState('translationAvailable');
window.addEventListener("beforeprint", function () {
//document.getElementById('chartContainer').style.height = document.getElementById('myChart').style.height;
});
});
Loading

0 comments on commit 0712fb8

Please sign in to comment.