This commit is contained in:
arc-alex
2023-11-19 19:39:13 +01:00
parent e52a75db7d
commit 85ee9de528
5 changed files with 27 additions and 55 deletions
+1 -4
View File
@@ -239,10 +239,7 @@ export const uploadSheetClientFile = async (file: File) => {
.post(`${ontimeURL}/sheet-clientsecrect`, formData, { .post(`${ontimeURL}/sheet-clientsecrect`, formData, {
headers: { headers: {
'Content-Type': 'multipart/form-data', 'Content-Type': 'multipart/form-data',
}, }
onUploadProgress: (progressEvent) => {
const complete = progressEvent?.total ? Math.round((progressEvent.loaded * 100) / progressEvent.total) : 0;
},
}) })
.then((response) => response.data.id); .then((response) => response.data.id);
}; };
@@ -11,21 +11,21 @@ import {
ModalOverlay, ModalOverlay,
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import { useQueryClient } from '@tanstack/react-query'; import { useQueryClient } from '@tanstack/react-query';
import { OntimeRundown, ProjectData, UserFields } from 'ontime-types';
import { PROJECT_DATA, RUNDOWN, USERFIELDS } from '../../../common/api/apiConstants';
import { maybeAxiosError } from '../../../common/api/apiUtils';
import { import {
getSheetsAuthStatus, getSheetsAuthStatus,
getSheetsAuthUrl, getSheetsAuthUrl,
postPreviewSheet,
uploadSheetClientFile,
patchData, patchData,
postPreviewSheet,
postPushSheet, postPushSheet,
uploadSheetClientFile,
} from '../../../common/api/ontimeApi'; } from '../../../common/api/ontimeApi';
import { OntimeRundown, ProjectData, UserFields } from 'ontime-types';
import PreviewExcel from '../upload-modal/preview/PreviewExcel';
import { projectDataPlaceholder } from '../../../common/models/ProjectData'; import { projectDataPlaceholder } from '../../../common/models/ProjectData';
import { userFieldsPlaceholder } from '../../../common/models/UserFields'; import { userFieldsPlaceholder } from '../../../common/models/UserFields';
import { PROJECT_DATA, RUNDOWN, USERFIELDS } from '../../../common/api/apiConstants'; import PreviewExcel from '../upload-modal/preview/PreviewExcel';
import { maybeAxiosError } from '../../../common/api/apiUtils';
interface SheetsModalProps { interface SheetsModalProps {
onClose: () => void; onClose: () => void;
@@ -35,7 +35,6 @@ interface SheetsModalProps {
export default function SheetsModal(props: SheetsModalProps) { export default function SheetsModal(props: SheetsModalProps) {
const { isOpen, onClose } = props; const { isOpen, onClose } = props;
const fileInputRef = useRef<HTMLInputElement>(null); const fileInputRef = useRef<HTMLInputElement>(null);
const [file, setFile] = useState<File | null>(null);
const [authState, setAuthState] = useState<boolean>(true); const [authState, setAuthState] = useState<boolean>(true);
const [rundown, setRundown] = useState<OntimeRundown | null>(null); const [rundown, setRundown] = useState<OntimeRundown | null>(null);
@@ -59,12 +58,10 @@ export default function SheetsModal(props: SheetsModalProps) {
const handleFile = (event: ChangeEvent<HTMLInputElement>) => { const handleFile = (event: ChangeEvent<HTMLInputElement>) => {
const selectedFile = event?.target?.files?.[0]; const selectedFile = event?.target?.files?.[0];
if (!selectedFile) { if (!selectedFile) {
setFile(null);
return; return;
} else { } else {
uploadSheetClientFile(selectedFile); uploadSheetClientFile(selectedFile);
} }
setFile(selectedFile);
}; };
//TODO: do smoething better here //TODO: do smoething better here
@@ -75,8 +72,7 @@ export default function SheetsModal(props: SheetsModalProps) {
const handleAuthenticate = () => { const handleAuthenticate = () => {
getSheetsAuthUrl().then((data) => { getSheetsAuthUrl().then((data) => {
console.log(data); console.log(data);
if (data == 'bad') { if (data != 'bad') {
} else {
window.open(data, '_blank', 'noreferrer'); window.open(data, '_blank', 'noreferrer');
} }
}); });
@@ -413,7 +413,7 @@ export async function previewSheet(req, res) {
*/ */
export async function pushSheet(req, res) { export async function pushSheet(req, res) {
try { try {
const data = await Sheet.push(req.body.sheetid, req.body.worksheet); await Sheet.push(req.body.sheetid, req.body.worksheet);
res.status(200).send('ok'); res.status(200).send('ok');
} catch (error) { } catch (error) {
res.status(500).send({ message: error.toString() }); res.status(500).send({ message: error.toString() });
+2 -2
View File
@@ -46,8 +46,8 @@ export const JSON_MIME = 'application/json';
* @returns {object} - parsed object * @returns {object} - parsed object
*/ */
export const parseExcel = (excelData: unknown[][], options?: Partial<ExcelImportMap>) => { export const parseExcel = (excelData: unknown[][], options?: Partial<ExcelImportMap>) => {
let projectMetadata = {}; const projectMetadata = {};
let rundownMetadata = {}; const rundownMetadata = {};
const importMap: ExcelImportMap = { ...defaultExcelImportMap, ...options }; const importMap: ExcelImportMap = { ...defaultExcelImportMap, ...options };
const projectData: Partial<ProjectData> = { const projectData: Partial<ProjectData> = {
title: '', title: '',
+15 -36
View File
@@ -6,7 +6,7 @@ import { URL } from 'url';
import { logger } from '../classes/Logger.js'; import { logger } from '../classes/Logger.js';
import { getAppDataPath } from '../setup.js'; import { getAppDataPath } from '../setup.js';
import { DatabaseModel, LogOrigin, OntimeRundownEntry, isOntimeEvent } from 'ontime-types'; import { DatabaseModel, LogOrigin, OntimeRundownEntry, isOntimeEvent } from 'ontime-types';
import { ExcelImportOptions, isExcelImportMap, defaultExcelImportMap, millisToString } from 'ontime-utils'; import { isExcelImportMap, defaultExcelImportMap, millisToString } from 'ontime-utils';
import { parseExcel } from './parser.js'; import { parseExcel } from './parser.js';
import { parseProject, parseRundown, parseUserFields } from './parserFunctions.js'; import { parseProject, parseRundown, parseUserFields } from './parserFunctions.js';
import { ensureDirectory } from './fileManagement.js'; import { ensureDirectory } from './fileManagement.js';
@@ -81,7 +81,8 @@ class sheet {
range: worksheet + '!A:Z', //FIXME: this is an abitrary range range: worksheet + '!A:Z', //FIXME: this is an abitrary range
}); });
if (rq.status === 200) { if (rq.status === 200) {
const { projectMetadata, rundownMetadata } = parseExcel(rq.data.values, options); //TODO: projectMetadata
const { rundownMetadata } = parseExcel(rq.data.values, options);
const rundown = DataProvider.getRundown(); const rundown = DataProvider.getRundown();
const titleRow = Object.values(rundownMetadata)[0]['row']; const titleRow = Object.values(rundownMetadata)[0]['row'];
@@ -184,9 +185,9 @@ class sheet {
/** /**
* saves Object to appdata path as client_secret.json * saves Object to appdata path as client_secret.json
* @param {Object} secrets * @param {} secrets
*/ */
public async saveClientSecrets(secrets: Object) { public async saveClientSecrets(secrets) {
ensureDirectory(this.sheetsFolder); ensureDirectory(this.sheetsFolder);
logger.info(LogOrigin.Server, 'Sheets: got new client_secret'); logger.info(LogOrigin.Server, 'Sheets: got new client_secret');
//TODO: test that this is actualy a client file? //TODO: test that this is actualy a client file?
@@ -236,7 +237,9 @@ class sheet {
if (response?.credentials) { if (response?.credentials) {
return true; return true;
} }
} catch (_) {} } catch (_) {
logger.info(LogOrigin.Server, 'Sheets token expired');
}
return false; return false;
} }
@@ -250,12 +253,13 @@ class sheet {
metadata, metadata,
titleCol: number, titleCol: number,
): sheets_v4.Schema$Request { ): sheets_v4.Schema$Request {
let r: sheets_v4.Schema$CellData[] = [];
const tmp = Object.entries(metadata)
.filter(([key, value]) => value !== undefined)
.sort(([aKey, a], [bKey, b]) => a['col'] - b['col']);
tmp.forEach(([key, value], index, arr) => { const r: sheets_v4.Schema$CellData[] = [];
const tmp = Object.entries(metadata)
.filter(([_, value]) => value !== undefined)
.sort(([_a, a], [_b, b]) => a['col'] - b['col']);
tmp.forEach(([_, value], index, arr) => {
if (index != 0) { if (index != 0) {
if (arr[index - 1][1]['col'] + 1 < value['col']) { if (arr[index - 1][1]['col'] + 1 < value['col']) {
arr.splice(index, 0, ['blank', { col: arr[index - 1][1]['col'] + 1 }]); arr.splice(index, 0, ['blank', { col: arr[index - 1][1]['col'] + 1 }]);
@@ -263,7 +267,7 @@ class sheet {
} }
}); });
tmp.forEach(([key, value]) => { tmp.forEach(([key, _]) => {
if (isOntimeEvent(event)) { if (isOntimeEvent(event)) {
if (key === 'blank') { if (key === 'blank') {
r.push({}); r.push({});
@@ -430,29 +434,4 @@ your keyfile, and add a 'redirect_uris' section. For example:
] ]
`; `;
function hexToRgb(hex: string) {
if (hex === '' || hex[0] !== '#') {
return { red: 1, green: 1, blue: 1 };
}
const bigint = parseInt(hex.slice(1), 16);
const r = ((bigint >> 16) & 255) / 255;
const g = ((bigint >> 8) & 255) / 255;
const b = (bigint & 255) / 255;
return { red: r, green: g, blue: b };
}
type sheetPos = {
row: number;
col: number;
};
function isEqualPartial<T>(a: T, b: Partial<T>) {
for (const [key, value] of Object.entries(a)) {
if (b[key] !== undefined && value !== b[key]) {
return false;
}
}
return true;
}
export const Sheet = new sheet(); export const Sheet = new sheet();