mirror of
https://github.com/frappe/books.git
synced 2024-09-19 19:19:02 +00:00
Merge pull request #675 from frappe/revise-telemetry
fix: review telemetry
This commit is contained in:
commit
fe3b8c4c16
@ -1,5 +1,6 @@
|
|||||||
import { Fyo } from 'fyo';
|
import { Fyo } from 'fyo';
|
||||||
import { Noun, Telemetry, Verb } from './types';
|
import { Noun, Telemetry, Verb } from './types';
|
||||||
|
import { ModelNameEnum } from 'models/types';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* # Telemetry
|
* # Telemetry
|
||||||
@ -26,6 +27,11 @@ import { Noun, Telemetry, Verb } from './types';
|
|||||||
* the app is hidden.
|
* the app is hidden.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const ignoreList: string[] = [
|
||||||
|
ModelNameEnum.AccountingLedgerEntry,
|
||||||
|
ModelNameEnum.StockLedgerEntry,
|
||||||
|
];
|
||||||
|
|
||||||
export class TelemetryManager {
|
export class TelemetryManager {
|
||||||
#url = '';
|
#url = '';
|
||||||
#token = '';
|
#token = '';
|
||||||
@ -80,7 +86,11 @@ export class TelemetryManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#sendBeacon(verb: Verb, noun: Noun, more?: Record<string, unknown>) {
|
#sendBeacon(verb: Verb, noun: Noun, more?: Record<string, unknown>) {
|
||||||
if (!this.hasCreds || this.fyo.store.skipTelemetryLogging) {
|
if (
|
||||||
|
!this.hasCreds ||
|
||||||
|
this.fyo.store.skipTelemetryLogging ||
|
||||||
|
ignoreList.includes(noun)
|
||||||
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,12 +3,15 @@ export type UniqueId = string;
|
|||||||
export type Timestamp = string;
|
export type Timestamp = string;
|
||||||
|
|
||||||
export enum Verb {
|
export enum Verb {
|
||||||
|
Started = 'started',
|
||||||
|
Completed = 'completed',
|
||||||
Created = 'created',
|
Created = 'created',
|
||||||
Deleted = 'deleted',
|
Deleted = 'deleted',
|
||||||
Submitted = 'submitted',
|
Submitted = 'submitted',
|
||||||
Cancelled = 'cancelled',
|
Cancelled = 'cancelled',
|
||||||
Imported = 'imported',
|
Imported = 'imported',
|
||||||
Exported = 'exported',
|
Exported = 'exported',
|
||||||
|
Printed = 'printed',
|
||||||
Closed = 'closed',
|
Closed = 'closed',
|
||||||
Opened = 'opened',
|
Opened = 'opened',
|
||||||
Resumed = 'resumed',
|
Resumed = 'resumed',
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
import { emitMainProcessError } from 'backend/helpers';
|
|
||||||
import { App, BrowserWindow } from 'electron';
|
import { App, BrowserWindow } from 'electron';
|
||||||
import fs from 'fs/promises';
|
import fs from 'fs/promises';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
@ -31,29 +30,11 @@ export async function saveHtmlAsPdf(
|
|||||||
printSelectionOnly: false,
|
printSelectionOnly: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
const data = await printWindow.webContents.printToPDF(printOptions);
|
||||||
* After the printWindow content is ready, save as pdf and
|
await fs.writeFile(savePath, data);
|
||||||
* then close the window and delete the temp html file.
|
printWindow.close();
|
||||||
*/
|
await fs.unlink(htmlPath);
|
||||||
return await new Promise((resolve) => {
|
return true;
|
||||||
printWindow.webContents.once('did-finish-load', () => {
|
|
||||||
printWindow.webContents
|
|
||||||
.printToPDF(printOptions)
|
|
||||||
.then((data) => {
|
|
||||||
fs.writeFile(savePath, data)
|
|
||||||
.then(() => {
|
|
||||||
printWindow.close();
|
|
||||||
fs.unlink(htmlPath)
|
|
||||||
.then(() => {
|
|
||||||
resolve(true);
|
|
||||||
})
|
|
||||||
.catch((err) => emitMainProcessError(err));
|
|
||||||
})
|
|
||||||
.catch((err) => emitMainProcessError(err));
|
|
||||||
})
|
|
||||||
.catch((err) => emitMainProcessError(err));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getInitializedPrintWindow(
|
async function getInitializedPrintWindow(
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
<Int
|
<Int
|
||||||
v-if="configFields.limit"
|
v-if="configFields.limit"
|
||||||
:df="configFields.limit"
|
:df="configFields.limit"
|
||||||
:value="limit"
|
:value="limit ?? undefined"
|
||||||
:border="true"
|
:border="true"
|
||||||
@change="(value: number) => (limit = value)"
|
@change="(value: number) => (limit = value)"
|
||||||
/>
|
/>
|
||||||
@ -104,6 +104,7 @@ import Check from './Controls/Check.vue';
|
|||||||
import Int from './Controls/Int.vue';
|
import Int from './Controls/Int.vue';
|
||||||
import Select from './Controls/Select.vue';
|
import Select from './Controls/Select.vue';
|
||||||
import FormHeader from './FormHeader.vue';
|
import FormHeader from './FormHeader.vue';
|
||||||
|
import { Verb } from 'fyo/telemetry/types';
|
||||||
|
|
||||||
interface ExportWizardData {
|
interface ExportWizardData {
|
||||||
useListFilters: boolean;
|
useListFilters: boolean;
|
||||||
@ -165,13 +166,13 @@ export default defineComponent({
|
|||||||
fieldtype: 'Check',
|
fieldtype: 'Check',
|
||||||
label: t`Use List Filters`,
|
label: t`Use List Filters`,
|
||||||
fieldname: 'useListFilters',
|
fieldname: 'useListFilters',
|
||||||
},
|
} as Field,
|
||||||
limit: {
|
limit: {
|
||||||
placeholder: 'Limit number of rows',
|
placeholder: 'Limit number of rows',
|
||||||
fieldtype: 'Int',
|
fieldtype: 'Int',
|
||||||
label: t`Limit`,
|
label: t`Limit`,
|
||||||
fieldname: 'limit',
|
fieldname: 'limit',
|
||||||
},
|
} as Field,
|
||||||
exportFormat: {
|
exportFormat: {
|
||||||
fieldtype: 'Select',
|
fieldtype: 'Select',
|
||||||
label: t`Export Format`,
|
label: t`Export Format`,
|
||||||
@ -180,7 +181,7 @@ export default defineComponent({
|
|||||||
{ value: 'json', label: 'JSON' },
|
{ value: 'json', label: 'JSON' },
|
||||||
{ value: 'csv', label: 'CSV' },
|
{ value: 'csv', label: 'CSV' },
|
||||||
],
|
],
|
||||||
},
|
} as Field,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -257,6 +258,9 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
await saveData(data, filePath);
|
await saveData(data, filePath);
|
||||||
|
this.fyo.telemetry.log(Verb.Exported, this.schemaName, {
|
||||||
|
extension: this.exportFormat,
|
||||||
|
});
|
||||||
showExportInFolder(fyo.t`Export Successful`, filePath);
|
showExportInFolder(fyo.t`Export Successful`, filePath);
|
||||||
},
|
},
|
||||||
getFileName() {
|
getFileName() {
|
||||||
|
@ -216,6 +216,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { setupDummyInstance } from 'dummy';
|
import { setupDummyInstance } from 'dummy';
|
||||||
import { t } from 'fyo';
|
import { t } from 'fyo';
|
||||||
|
import { Verb } from 'fyo/telemetry/types';
|
||||||
import { DateTime } from 'luxon';
|
import { DateTime } from 'luxon';
|
||||||
import Button from 'src/components/Button.vue';
|
import Button from 'src/components/Button.vue';
|
||||||
import LanguageSelector from 'src/components/Controls/LanguageSelector.vue';
|
import LanguageSelector from 'src/components/Controls/LanguageSelector.vue';
|
||||||
@ -334,7 +335,7 @@ export default defineComponent({
|
|||||||
updateConfigFiles(fyo);
|
updateConfigFiles(fyo);
|
||||||
await fyo.purgeCache();
|
await fyo.purgeCache();
|
||||||
await this.setFiles();
|
await this.setFiles();
|
||||||
|
this.fyo.telemetry.log(Verb.Created, 'dummy-instance');
|
||||||
this.creatingDemo = false;
|
this.creatingDemo = false;
|
||||||
},
|
},
|
||||||
async setFiles() {
|
async setFiles() {
|
||||||
|
@ -371,6 +371,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { DocValue } from 'fyo/core/types';
|
import { DocValue } from 'fyo/core/types';
|
||||||
import { Action } from 'fyo/model/types';
|
import { Action } from 'fyo/model/types';
|
||||||
|
import { Verb } from 'fyo/telemetry/types';
|
||||||
import { ValidationError } from 'fyo/utils/errors';
|
import { ValidationError } from 'fyo/utils/errors';
|
||||||
import { ModelNameEnum } from 'models/types';
|
import { ModelNameEnum } from 'models/types';
|
||||||
import { OptionField, RawValue, SelectOption } from 'schemas/types';
|
import { OptionField, RawValue, SelectOption } from 'schemas/types';
|
||||||
@ -864,6 +865,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.fyo.telemetry.log(Verb.Imported, this.importer.schemaName);
|
||||||
this.isMakingEntries = false;
|
this.isMakingEntries = false;
|
||||||
this.complete = true;
|
this.complete = true;
|
||||||
},
|
},
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
<PrintContainer
|
<PrintContainer
|
||||||
v-if="printProps"
|
v-if="printProps"
|
||||||
ref="printContainer"
|
ref="printContainer"
|
||||||
|
:print-schema-name="schemaName"
|
||||||
:template="printProps.template"
|
:template="printProps.template"
|
||||||
:values="printProps.values"
|
:values="printProps.values"
|
||||||
:scale="scale"
|
:scale="scale"
|
||||||
@ -55,11 +56,11 @@ import PageHeader from 'src/components/PageHeader.vue';
|
|||||||
import { handleErrorWithDialog } from 'src/errorHandling';
|
import { handleErrorWithDialog } from 'src/errorHandling';
|
||||||
import { fyo } from 'src/initFyo';
|
import { fyo } from 'src/initFyo';
|
||||||
import { getPrintTemplatePropValues } from 'src/utils/printTemplates';
|
import { getPrintTemplatePropValues } from 'src/utils/printTemplates';
|
||||||
|
import { showSidebar } from 'src/utils/refs';
|
||||||
import { PrintValues } from 'src/utils/types';
|
import { PrintValues } from 'src/utils/types';
|
||||||
import { getFormRoute, openSettings, routeTo } from 'src/utils/ui';
|
import { getFormRoute, openSettings, routeTo } from 'src/utils/ui';
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import PrintContainer from '../TemplateBuilder/PrintContainer.vue';
|
import PrintContainer from '../TemplateBuilder/PrintContainer.vue';
|
||||||
import { showSidebar } from 'src/utils/refs';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'PrintView',
|
name: 'PrintView',
|
||||||
@ -244,16 +245,16 @@ export default defineComponent({
|
|||||||
|
|
||||||
this.templateList = list.map(({ name }) => name);
|
this.templateList = list.map(({ name }) => name);
|
||||||
},
|
},
|
||||||
savePDF() {
|
async savePDF() {
|
||||||
const printContainer = this.$refs.printContainer as {
|
const printContainer = this.$refs.printContainer as {
|
||||||
savePDF: (name?: string) => void;
|
savePDF: (name?: string) => Promise<void>;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!printContainer?.savePDF) {
|
if (!printContainer?.savePDF) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
printContainer.savePDF(this.doc?.name);
|
await printContainer.savePDF(this.doc?.name);
|
||||||
},
|
},
|
||||||
async setTemplateFromDefault() {
|
async setTemplateFromDefault() {
|
||||||
const defaultName =
|
const defaultName =
|
||||||
|
@ -145,20 +145,21 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { Verb } from 'fyo/telemetry/types';
|
||||||
import { Report } from 'reports/Report';
|
import { Report } from 'reports/Report';
|
||||||
import { reports } from 'reports/index';
|
import { reports } from 'reports/index';
|
||||||
|
import { OptionField } from 'schemas/types';
|
||||||
import Button from 'src/components/Button.vue';
|
import Button from 'src/components/Button.vue';
|
||||||
import Check from 'src/components/Controls/Check.vue';
|
import Check from 'src/components/Controls/Check.vue';
|
||||||
import Int from 'src/components/Controls/Int.vue';
|
import Int from 'src/components/Controls/Int.vue';
|
||||||
|
import Select from 'src/components/Controls/Select.vue';
|
||||||
import PageHeader from 'src/components/PageHeader.vue';
|
import PageHeader from 'src/components/PageHeader.vue';
|
||||||
import { getReport } from 'src/utils/misc';
|
import { getReport } from 'src/utils/misc';
|
||||||
|
import { getPathAndMakePDF } from 'src/utils/printTemplates';
|
||||||
|
import { showSidebar } from 'src/utils/refs';
|
||||||
|
import { paperSizeMap, printSizes } from 'src/utils/ui';
|
||||||
import { PropType, defineComponent } from 'vue';
|
import { PropType, defineComponent } from 'vue';
|
||||||
import ScaledContainer from '../TemplateBuilder/ScaledContainer.vue';
|
import ScaledContainer from '../TemplateBuilder/ScaledContainer.vue';
|
||||||
import { getPathAndMakePDF } from 'src/utils/printTemplates';
|
|
||||||
import { OptionField } from 'schemas/types';
|
|
||||||
import { paperSizeMap, printSizes } from 'src/utils/ui';
|
|
||||||
import Select from 'src/components/Controls/Select.vue';
|
|
||||||
import { showSidebar } from 'src/utils/refs';
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: { PageHeader, Button, Check, Int, ScaledContainer, Select },
|
components: { PageHeader, Button, Check, Int, ScaledContainer, Select },
|
||||||
@ -276,6 +277,8 @@ export default defineComponent({
|
|||||||
this.size.width,
|
this.size.width,
|
||||||
this.size.height
|
this.size.height
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.fyo.telemetry.log(Verb.Printed, this.report!.reportName);
|
||||||
},
|
},
|
||||||
cellClasses(cIdx: number, rIdx: number): string[] {
|
cellClasses(cIdx: number, rIdx: number): string[] {
|
||||||
const classes: string[] = [];
|
const classes: string[] = [];
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
<p v-if="loading" class="text-base text-gray-600">
|
<p v-if="loading" class="text-base text-gray-600">
|
||||||
{{ t`Loading instance...` }}
|
{{ t`Loading instance...` }}
|
||||||
</p>
|
</p>
|
||||||
<Button v-if="!loading" class="w-24" @click="$emit('setup-canceled')">{{
|
<Button v-if="!loading" class="w-24" @click="cancel">{{
|
||||||
t`Cancel`
|
t`Cancel`
|
||||||
}}</Button>
|
}}</Button>
|
||||||
<Button
|
<Button
|
||||||
@ -72,6 +72,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { DocValue } from 'fyo/core/types';
|
import { DocValue } from 'fyo/core/types';
|
||||||
import { Doc } from 'fyo/model/doc';
|
import { Doc } from 'fyo/model/doc';
|
||||||
|
import { Verb } from 'fyo/telemetry/types';
|
||||||
|
import { ModelNameEnum } from 'models/types';
|
||||||
import { Field } from 'schemas/types';
|
import { Field } from 'schemas/types';
|
||||||
import Button from 'src/components/Button.vue';
|
import Button from 'src/components/Button.vue';
|
||||||
import FormContainer from 'src/components/FormContainer.vue';
|
import FormContainer from 'src/components/FormContainer.vue';
|
||||||
@ -153,6 +155,7 @@ export default defineComponent({
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
window.sw = this;
|
window.sw = this;
|
||||||
}
|
}
|
||||||
|
this.fyo.telemetry.log(Verb.Started, ModelNameEnum.SetupWizard);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async fill() {
|
async fill() {
|
||||||
@ -198,8 +201,13 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
|
this.fyo.telemetry.log(Verb.Completed, ModelNameEnum.SetupWizard);
|
||||||
this.$emit('setup-complete', this.doc.getValidDict());
|
this.$emit('setup-complete', this.doc.getValidDict());
|
||||||
},
|
},
|
||||||
|
cancel() {
|
||||||
|
this.fyo.telemetry.log(Verb.Cancelled, ModelNameEnum.SetupWizard);
|
||||||
|
this.$emit('setup-canceled');
|
||||||
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -49,6 +49,7 @@ import {
|
|||||||
generateCodeFrame,
|
generateCodeFrame,
|
||||||
SourceLocation,
|
SourceLocation,
|
||||||
} from '@vue/compiler-dom';
|
} from '@vue/compiler-dom';
|
||||||
|
import { Verb } from 'fyo/telemetry/types';
|
||||||
import ErrorBoundary from 'src/components/ErrorBoundary.vue';
|
import ErrorBoundary from 'src/components/ErrorBoundary.vue';
|
||||||
import { getPathAndMakePDF } from 'src/utils/printTemplates';
|
import { getPathAndMakePDF } from 'src/utils/printTemplates';
|
||||||
import { PrintValues } from 'src/utils/types';
|
import { PrintValues } from 'src/utils/types';
|
||||||
@ -66,6 +67,7 @@ export default defineComponent({
|
|||||||
components: { ScaledContainer, ErrorBoundary },
|
components: { ScaledContainer, ErrorBoundary },
|
||||||
props: {
|
props: {
|
||||||
template: { type: String, required: true },
|
template: { type: String, required: true },
|
||||||
|
printSchemaName: { type: String, required: true },
|
||||||
scale: { type: Number, default: 0.65 },
|
scale: { type: Number, default: 0.65 },
|
||||||
width: { type: Number, default: 21 },
|
width: { type: Number, default: 21 },
|
||||||
height: { type: Number, default: 29.7 },
|
height: { type: Number, default: 29.7 },
|
||||||
@ -179,6 +181,8 @@ export default defineComponent({
|
|||||||
this.width,
|
this.width,
|
||||||
this.height
|
this.height
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.fyo.telemetry.log(Verb.Printed, this.printSchemaName);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -46,6 +46,7 @@
|
|||||||
<div v-if="canDisplayPreview" class="p-4 overflow-auto custom-scroll">
|
<div v-if="canDisplayPreview" class="p-4 overflow-auto custom-scroll">
|
||||||
<PrintContainer
|
<PrintContainer
|
||||||
ref="printContainer"
|
ref="printContainer"
|
||||||
|
:print-schema-name="displayDoc!.schemaName"
|
||||||
:template="doc.template!"
|
:template="doc.template!"
|
||||||
:values="values!"
|
:values="values!"
|
||||||
:scale="scale"
|
:scale="scale"
|
||||||
|
@ -290,6 +290,8 @@ export async function updatePrintTemplates(fyo: Fyo) {
|
|||||||
updateList.push(...updates);
|
updateList.push(...updates);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isLogging = fyo.store.skipTelemetryLogging;
|
||||||
|
fyo.store.skipTelemetryLogging = true;
|
||||||
for (const { name, type, template } of updateList) {
|
for (const { name, type, template } of updateList) {
|
||||||
const doc = await getDocFromNameIfExistsElseNew(
|
const doc = await getDocFromNameIfExistsElseNew(
|
||||||
ModelNameEnum.PrintTemplate,
|
ModelNameEnum.PrintTemplate,
|
||||||
@ -299,6 +301,7 @@ export async function updatePrintTemplates(fyo: Fyo) {
|
|||||||
await doc.set({ name, type, template, isCustom: false });
|
await doc.set({ name, type, template, isCustom: false });
|
||||||
await doc.sync();
|
await doc.sync();
|
||||||
}
|
}
|
||||||
|
fyo.store.skipTelemetryLogging = isLogging;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPrintTemplateUpdateList(
|
function getPrintTemplateUpdateList(
|
||||||
|
Loading…
Reference in New Issue
Block a user