Skip to content

Commit ede6a8c

Browse files
authored
qr code dependency change (#3930)
BC-10523 - Refactor QRCode printing to get rid of canvas dependency
1 parent 6f307f6 commit ede6a8c

File tree

19 files changed

+551
-309
lines changed

19 files changed

+551
-309
lines changed

package-lock.json

Lines changed: 334 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,15 @@
3333
"@vueuse/core": "^13.3.0",
3434
"@vueuse/integrations": "^13.3.0",
3535
"axios": "^1.12.2",
36-
"canvas": "^3.1.0",
3736
"dayjs": "^1.11.10",
3837
"focus-trap": "^7.6.5",
3938
"katex": "^0.16.21",
40-
"kjua": "^0.10.0",
4139
"lodash-es": "^4.17.21",
4240
"maska": "^2.1.10",
4341
"mobile-drag-drop": "^3.0.0-rc.0",
4442
"object-hash": "^3.0.0",
4543
"pinia": "^3.0.2",
44+
"qrcode.vue": "^3.6.0",
4645
"socket.io-client": "^4.8.1",
4746
"sortablejs": "^1.15.6",
4847
"sortablejs-vue3": "^1.2.11",
@@ -98,8 +97,7 @@
9897
"overrides": {
9998
"@openapitools/openapi-generator-cli": {
10099
"axios": "$axios"
101-
},
102-
"canvas": "^3.1.0"
100+
}
103101
},
104102
"engines": {
105103
"node": "22",

src/locales/de.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,8 @@ export default {
11461146
"Die Migration kann nicht gestartet werden, da das Ziel-Login-System und das derzeitige Login-System Ihrer Schule identisch sind!",
11471147
"pages.administration.migration.moin_schule_system_not_found": "Das moin.schule-System kann nicht gefunden werden!",
11481148
"pages.administration.or": "oder",
1149+
"pages.administration.printQr.printPageTabTitle": "QR-Codes teilen",
1150+
"pages.administration.printQr.printPageTitle": "Zum Registrieren bitte den QR Code scannen.",
11491151
"pages.administration.printQr.emptyUser": "Dieser Nutzer wurde bereits registriert",
11501152
"pages.administration.printQr.error":
11511153
"Die Registrierungslinks konnten auf Grund eines Problems nicht generiert werden",

src/locales/en.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,8 @@ export default {
11361136
"The migration cannot start because the target login system and your school's current login system are the same!",
11371137
"pages.administration.migration.moin_schule_system_not_found": "Cannot find moin.schule system!",
11381138
"pages.administration.or": "or",
1139+
"pages.administration.printQr.printPageTabTitle": "Share QR-Codes",
1140+
"pages.administration.printQr.printPageTitle": "Please scan the QR code to register.",
11391141
"pages.administration.printQr.emptyUser": "The selected user(s) have already been registered",
11401142
"pages.administration.printQr.error": "The registration links could not be generated",
11411143
"pages.administration.remove.error": "Failed to delete users",

src/locales/es.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,8 @@ export default {
11561156
"¡La migración no puede comenzar porque el sistema de inicio de sesión de destino y el sistema de inicio de sesión actual de su escuela son el mismo!",
11571157
"pages.administration.migration.moin_schule_system_not_found": "¡No puedo encontrar el sistema moin.schule!",
11581158
"pages.administration.or": "o",
1159+
"pages.administration.printQr.printPageTabTitle": "Compartir códigos QR",
1160+
"pages.administration.printQr.printPageTitle": "Por favor, escanea el código QR para registrarte.",
11591161
"pages.administration.printQr.emptyUser": "L{'@'}s usuari{'@'}s seleccionad{'@'}s ya han sido registrad{'@'}s",
11601162
"pages.administration.printQr.error": "No se han podido generar los enlaces de registro",
11611163
"pages.administration.remove.error": "Error al eliminar usuarios",

src/locales/uk.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,8 @@ export default {
11441144
"Неможливо розпочати міграцію, оскільки цільова система входу та поточна система входу у вашій школі збігаються!",
11451145
"pages.administration.migration.moin_schule_system_not_found": "Не вдається знайти систему moin.schule!",
11461146
"pages.administration.or": "або",
1147+
"pages.administration.printQr.printPageTabTitle": "Поділитися QR-кодами",
1148+
"pages.administration.printQr.printPageTitle": "Будь ласка, відскануйте QR-код для реєстрації.",
11471149
"pages.administration.printQr.emptyUser": "Вибраний користувач(-і) вже зареєстрований(-і)",
11481150
"pages.administration.printQr.error": "Не вдалося згенерувати посилання для реєстрації",
11491151
"pages.administration.remove.error": "Не вдалося видалити користувачів",

src/mixins/print.js

Lines changed: 0 additions & 86 deletions
This file was deleted.

src/mixins/print.unit.js

Lines changed: 0 additions & 102 deletions
This file was deleted.

src/modules/ui/layout/topbar/PageShare.unit.ts

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,32 @@
11
import PageShare from "./PageShare.vue";
22
import { createTestingI18n, createTestingVuetify } from "@@/tests/test-utils/setup";
3-
import { createMock } from "@golevelup/ts-vitest";
43
import { mount } from "@vue/test-utils";
4+
import { beforeAll, vi } from "vitest";
55

66
describe("@ui-layout/PageShare", () => {
7-
const setup = (attrs = {}) => {
8-
const windowMock = createMock<Window>({
9-
document: {
10-
write: vi.fn().mockImplementation(() => "<img></img>"),
11-
},
12-
print: vi.fn(),
13-
close: vi.fn(),
14-
});
15-
16-
Object.defineProperty(window, "open", {
17-
configurable: true,
18-
value: vi.fn().mockReturnValue(windowMock),
7+
beforeAll(() => {
8+
Object.defineProperty(window, "location", {
9+
value: { href: "url" },
10+
writable: true,
1911
});
12+
});
2013

14+
const setup = () => {
2115
const wrapper = mount(PageShare, {
2216
global: {
2317
plugins: [createTestingVuetify(), createTestingI18n()],
2418
},
25-
props: {
26-
url: "url",
27-
},
28-
...attrs,
2919
});
3020

31-
return { wrapper, windowMock };
21+
return { wrapper };
3222
};
3323

3424
describe("with available languages", () => {
3525
it("should render qr code ", () => {
3626
const { wrapper } = setup();
37-
3827
expect(wrapper.findComponent({ name: "QRCode" }).exists()).toBe(true);
3928
});
4029

41-
it("should open print menu with QR-Code", async () => {
42-
const { wrapper, windowMock } = setup();
43-
const printButton = wrapper.findComponent("[data-testid=qr-code-print]");
44-
await printButton.trigger("click");
45-
46-
expect(window.open).toHaveBeenCalled();
47-
expect(windowMock.document.write).toHaveBeenCalled();
48-
expect(windowMock.print).toHaveBeenCalled();
49-
expect(windowMock.close).toHaveBeenCalled();
50-
});
51-
5230
it("should copy link to clipboard", async () => {
5331
Object.defineProperty(navigator, "clipboard", {
5432
value: {

src/modules/ui/layout/topbar/PageShare.vue

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
<div class="pb-2">
44
{{ $t("global.topbar.MenuQrCode.qrHintText") }}
55
</div>
6-
<QRCode ref="qrCode" :url="url" />
6+
7+
<QRCode :url />
78
<div>
89
<VBtn
910
variant="outlined"
@@ -24,27 +25,14 @@
2425
<script setup lang="ts">
2526
import { mdiContentCopy, mdiPrinter } from "@icons/material";
2627
import { QRCode } from "@ui-qr-code";
27-
import { ComponentPublicInstance, ref } from "vue";
28-
29-
const props = defineProps({
30-
url: {
31-
type: String,
32-
default: window.location.href,
33-
},
34-
});
35-
const qrCode = ref<ComponentPublicInstance<HTMLDivElement>>();
28+
import { printQrCodes } from "@util-browser";
3629
30+
const url = window.location.href;
3731
const openPrintMenu = () => {
38-
const win = window.open();
39-
40-
if (qrCode.value) {
41-
win?.document.write(qrCode.value.$el.innerHTML);
42-
win?.print();
43-
win?.close();
44-
}
32+
printQrCodes([{ qrContent: url, title: document.title }]);
4533
};
4634
47-
const onCopy = () => navigator.clipboard.writeText(props.url);
35+
const onCopy = () => navigator.clipboard.writeText(url);
4836
</script>
4937

5038
<style scoped>

0 commit comments

Comments
 (0)