@capytale/activity.js 3.1.22 → 3.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,8 +25,8 @@ export type ActivityType = {
25
25
  detailedEvaluation: boolean;
26
26
  /** Si ce type d'activité est exportable. */
27
27
  exportable: boolean;
28
- /** Si ce type d'activité est compatible lti. */
29
- lti: boolean;
28
+ /** Si ce type d'activité est compatible lti. (`null` signifie ne sera jamais compatible) */
29
+ lti: boolean | null;
30
30
  };
31
31
  export type ActivityGroup = {
32
32
  title: string;
@@ -1 +1 @@
1
- {"version":3,"file":"activityType.js","sourceRoot":"","sources":["../../src/activity/activityType/activityType.ts"],"names":[],"mappings":"","sourcesContent":["export type ActivityType = {\n id: string;\n name: string;\n status?: { beta?: boolean };\n icon: {\n path: string;\n style?: { [s: string]: string };\n };\n helpUrl: string;\n summary: string;\n description: string;\n tags?: string;\n bundle: string;\n /** Si ce type d'activité est disponible pour l'utilisateur courant. */\n available: boolean;\n /** Indique que ce type d'activité est remplacé. */\n replacedBy?: string | null;\n /** Ce type d'activité devrait être filtré en même temps que celui indiqué. */\n filterWith?: string | null;\n /** Si ce type d'activité produit des évaluations détaillées. */\n detailedEvaluation: boolean;\n /** Si ce type d'activité est exportable. */\n exportable: boolean;\n /** Si ce type d'activité est compatible lti. */\n lti: boolean;\n}\n\nexport type ActivityGroup = {\n title: string;\n tooltip?: string;\n activities: string[];\n};\n\nexport type ActivityGroups = {\n [key: string]: ActivityGroup;\n};\n\nexport type ActivityWeights = {\n all: { [key: string]: number };\n niveaux: {\n [key: string]: {\n title: string;\n activities: { [key: string]: number }\n }\n };\n groups: ActivityGroups;\n};\n"]}
1
+ {"version":3,"file":"activityType.js","sourceRoot":"","sources":["../../src/activity/activityType/activityType.ts"],"names":[],"mappings":"","sourcesContent":["export type ActivityType = {\n id: string;\n name: string;\n status?: { beta?: boolean };\n icon: {\n path: string;\n style?: { [s: string]: string };\n };\n helpUrl: string;\n summary: string;\n description: string;\n tags?: string;\n bundle: string;\n /** Si ce type d'activité est disponible pour l'utilisateur courant. */\n available: boolean;\n /** Indique que ce type d'activité est remplacé. */\n replacedBy?: string | null;\n /** Ce type d'activité devrait être filtré en même temps que celui indiqué. */\n filterWith?: string | null;\n /** Si ce type d'activité produit des évaluations détaillées. */\n detailedEvaluation: boolean;\n /** Si ce type d'activité est exportable. */\n exportable: boolean;\n /** Si ce type d'activité est compatible lti. (`null` signifie ne sera jamais compatible) */\n lti: boolean | null;\n}\n\nexport type ActivityGroup = {\n title: string;\n tooltip?: string;\n activities: string[];\n};\n\nexport type ActivityGroups = {\n [key: string]: ActivityGroup;\n};\n\nexport type ActivityWeights = {\n all: { [key: string]: number };\n niveaux: {\n [key: string]: {\n title: string;\n activities: { [key: string]: number }\n }\n };\n groups: ActivityGroups;\n};\n"]}
@@ -1,5 +1,6 @@
1
1
  export default function createLtiSession(): {
2
2
  setSessId(sessId: string): void;
3
+ setToken(token: string): void;
3
4
  getProperty(key: string): any;
4
5
  setProperty(key: string, value: any): void;
5
6
  readonly isActive: boolean;
package/api/lti/index.js CHANGED
@@ -15,6 +15,14 @@ export default function createLtiSession() {
15
15
  ltiProps = {};
16
16
  isActive = true;
17
17
  },
18
+ setToken(token) {
19
+ if (!isActive)
20
+ return;
21
+ if (ltiToken === token)
22
+ return;
23
+ ltiToken = token;
24
+ sessionStorage.setItem(`lti_session_${ltiSessionId}`, token);
25
+ },
18
26
  getProperty(key) {
19
27
  if (!isActive)
20
28
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/lti/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAoB,CAAC;IACzB,IAAI,QAAgB,CAAC;IACrB,IAAI,QAAgC,CAAC;IACrC,OAAO;QACH,SAAS,CAAC,MAAc;YACpB,IAAI,YAAY,KAAK,MAAM;gBAAE,OAAO;YACpC,YAAY,GAAG,MAAM,CAAC;YACtB,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,eAAe,MAAM,EAAE,CAAE,CAAC;YAC5D,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;YACrE,QAAQ,GAAG,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACtE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,QAAQ,GAAG,EAAE,CAAC;YAC3C,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,WAAW,CAAC,GAAW;YACnB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,WAAW,CAAC,GAAW,EAAE,KAAU;YAC/B,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,cAAc,CAAC,OAAO,CAAC,aAAa,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,QAAQ;YACR,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,SAAS;YACL,OAAO,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;QACD,gBAAgB,CAAC,GAAY;YACzB,IAAI,QAAQ,IAAI,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC;QACf,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["export default function createLtiSession() {\n let isActive = false;\n let ltiSessionId: string;\n let ltiToken: string;\n let ltiProps: { [key: string]: any };\n return {\n setSessId(sessId: string) {\n if (ltiSessionId === sessId) return;\n ltiSessionId = sessId;\n ltiToken = sessionStorage.getItem(`lti_session_${sessId}`)!;\n const ltiPropsString = sessionStorage.getItem(`lti_props_${sessId}`);\n ltiProps = ltiPropsString == null ? {} : (JSON.parse(ltiPropsString));\n if (Array.isArray(ltiProps)) ltiProps = {};\n isActive = true;\n },\n getProperty(key: string): any {\n if (!isActive) return;\n return ltiProps[key];\n },\n setProperty(key: string, value: any): void {\n if (!isActive) return;\n ltiProps[key] = value;\n sessionStorage.setItem(`lti_props_${ltiSessionId}`, JSON.stringify(ltiProps));\n },\n get isActive() {\n return isActive;\n },\n getSessId(): string | null {\n return isActive ? ltiSessionId : null;\n },\n addLtiAuthHeader(hdr: Headers): Headers {\n if (ltiToken != null) hdr.set('X-CAPYTALE-AUTH', 'lti ' + ltiToken);\n return hdr;\n }\n };\n}"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/lti/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAoB,CAAC;IACzB,IAAI,QAAgB,CAAC;IACrB,IAAI,QAAgC,CAAC;IACrC,OAAO;QACH,SAAS,CAAC,MAAc;YACpB,IAAI,YAAY,KAAK,MAAM;gBAAE,OAAO;YACpC,YAAY,GAAG,MAAM,CAAC;YACtB,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,eAAe,MAAM,EAAE,CAAE,CAAC;YAC5D,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,aAAa,MAAM,EAAE,CAAC,CAAC;YACrE,QAAQ,GAAG,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;YACtE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,QAAQ,GAAG,EAAE,CAAC;YAC3C,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,KAAa;YAClB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,IAAI,QAAQ,KAAK,KAAK;gBAAE,OAAO;YAC/B,QAAQ,GAAG,KAAK,CAAC;YACjB,cAAc,CAAC,OAAO,CAAC,eAAe,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,WAAW,CAAC,GAAW;YACnB,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,WAAW,CAAC,GAAW,EAAE,KAAU;YAC/B,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,cAAc,CAAC,OAAO,CAAC,aAAa,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,QAAQ;YACR,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,SAAS;YACL,OAAO,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1C,CAAC;QACD,gBAAgB,CAAC,GAAY;YACzB,IAAI,QAAQ,IAAI,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC;QACf,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["export default function createLtiSession() {\n let isActive = false;\n let ltiSessionId: string;\n let ltiToken: string;\n let ltiProps: { [key: string]: any };\n return {\n setSessId(sessId: string) {\n if (ltiSessionId === sessId) return;\n ltiSessionId = sessId;\n ltiToken = sessionStorage.getItem(`lti_session_${sessId}`)!;\n const ltiPropsString = sessionStorage.getItem(`lti_props_${sessId}`);\n ltiProps = ltiPropsString == null ? {} : (JSON.parse(ltiPropsString));\n if (Array.isArray(ltiProps)) ltiProps = {};\n isActive = true;\n },\n setToken(token: string) {\n if (!isActive) return;\n if (ltiToken === token) return;\n ltiToken = token;\n sessionStorage.setItem(`lti_session_${ltiSessionId}`, token);\n },\n getProperty(key: string): any {\n if (!isActive) return;\n return ltiProps[key];\n },\n setProperty(key: string, value: any): void {\n if (!isActive) return;\n ltiProps[key] = value;\n sessionStorage.setItem(`lti_props_${ltiSessionId}`, JSON.stringify(ltiProps));\n },\n get isActive() {\n return isActive;\n },\n getSessId(): string | null {\n return isActive ? ltiSessionId : null;\n },\n addLtiAuthHeader(hdr: Headers): Headers {\n if (ltiToken != null) hdr.set('X-CAPYTALE-AUTH', 'lti ' + ltiToken);\n return hdr;\n }\n };\n}"]}
@@ -1,5 +1,6 @@
1
1
  declare const ltiSession: {
2
2
  setSessId(sessId: string): void;
3
+ setToken(token: string): void;
3
4
  getProperty(key: string): any;
4
5
  setProperty(key: string, value: any): void;
5
6
  readonly isActive: boolean;
@@ -1,10 +1,20 @@
1
1
  type CapytaleUi = {
2
+ /**
3
+ * @deprecated use isInCapytaleIframe instead
4
+ */
5
+ isInCapytaletIframe: () => boolean;
2
6
  /**
3
7
  * Détermine si la page est affichée dans un iframe de Nuxt.
4
8
  *
5
9
  * @returns true si la page est affichée dans un iframe de Nuxt.
6
10
  */
7
- isInCapytaletIframe: () => boolean;
11
+ isInCapytaleIframe: () => boolean;
12
+ /**
13
+ * Détermine si la page est affichée dans le mode LTI.
14
+ *
15
+ * @returns true si la page est affichée dans le mode LTI.
16
+ */
17
+ isLti: () => boolean;
8
18
  /**
9
19
  * Envoie la commande de fermerture de la fenêtre Nuxt.
10
20
  * Déclenche une erreur si la page n'est pas affichée dans un iframe de Nuxt.
@@ -1,4 +1,5 @@
1
- function isInCapytaletIframe() {
1
+ import ltiSession from './lti';
2
+ function isInCapytaleIframe() {
2
3
  if (window.parent === window)
3
4
  return false;
4
5
  try {
@@ -8,13 +9,18 @@ function isInCapytaletIframe() {
8
9
  return false;
9
10
  }
10
11
  }
12
+ function isLti() {
13
+ return ltiSession.isActive;
14
+ }
11
15
  function closeCapytaleIframe() {
12
- if (!isInCapytaletIframe())
16
+ if (!isInCapytaleIframe())
13
17
  throw new Error('Not in Nuxt modal');
14
18
  window.parent.$drupalCloseModal();
15
19
  }
16
20
  export default {
17
- isInCapytaletIframe,
21
+ isInCapytaletIframe: isInCapytaleIframe,
22
+ isInCapytaleIframe,
23
+ isLti,
18
24
  closeCapytaleIframe,
19
25
  };
20
26
  //# sourceMappingURL=ui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/backend/capytale/ui.ts"],"names":[],"mappings":"AAeA,SAAS,mBAAmB;IACxB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC;QACD,OAAO,CAAE,MAAM,CAAC,MAAc,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB;IACxB,IAAI,CAAC,mBAAmB,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAChE,MAAM,CAAC,MAAc,CAAC,iBAAiB,EAAE,CAAC;AAC/C,CAAC;AAED,eAAe;IACX,mBAAmB;IACnB,mBAAmB;CACR,CAAC","sourcesContent":["type CapytaleUi = {\n /**\n * Détermine si la page est affichée dans un iframe de Nuxt.\n * \n * @returns true si la page est affichée dans un iframe de Nuxt.\n */\n isInCapytaletIframe: () => boolean;\n\n /**\n * Envoie la commande de fermerture de la fenêtre Nuxt.\n * Déclenche une erreur si la page n'est pas affichée dans un iframe de Nuxt.\n */\n closeCapytaleIframe: () => void;\n}\n\nfunction isInCapytaletIframe(): boolean {\n if (window.parent === window) return false;\n try {\n return ((window.parent as any).$drupalCloseModal != null);\n } catch (e) {\n return false;\n }\n}\n\nfunction closeCapytaleIframe(): void {\n if (!isInCapytaletIframe()) throw new Error('Not in Nuxt modal');\n (window.parent as any).$drupalCloseModal();\n}\n\nexport default {\n isInCapytaletIframe,\n closeCapytaleIframe,\n} as CapytaleUi;\n"]}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/backend/capytale/ui.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,OAAO,CAAC;AA6B/B,SAAS,kBAAkB;IACvB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC;QACD,OAAO,CAAE,MAAM,CAAC,MAAc,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED,SAAS,KAAK;IACV,OAAO,UAAU,CAAC,QAAQ,CAAC;AAC/B,CAAC;AAED,SAAS,mBAAmB;IACxB,IAAI,CAAC,kBAAkB,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC/D,MAAM,CAAC,MAAc,CAAC,iBAAiB,EAAE,CAAC;AAC/C,CAAC;AAED,eAAe;IACX,mBAAmB,EAAE,kBAAkB;IACvC,kBAAkB;IAClB,KAAK;IACL,mBAAmB;CACR,CAAC","sourcesContent":["import ltiSession from './lti';\n\ntype CapytaleUi = {\n /**\n * @deprecated use isInCapytaleIframe instead\n */\n isInCapytaletIframe: () => boolean;\n\n /**\n * Détermine si la page est affichée dans un iframe de Nuxt.\n * \n * @returns true si la page est affichée dans un iframe de Nuxt.\n */\n isInCapytaleIframe: () => boolean;\n\n /**\n * Détermine si la page est affichée dans le mode LTI.\n * \n * @returns true si la page est affichée dans le mode LTI.\n */\n isLti: () => boolean;\n\n /**\n * Envoie la commande de fermerture de la fenêtre Nuxt.\n * Déclenche une erreur si la page n'est pas affichée dans un iframe de Nuxt.\n */\n closeCapytaleIframe: () => void;\n}\n\nfunction isInCapytaleIframe(): boolean {\n if (window.parent === window) return false;\n try {\n return ((window.parent as any).$drupalCloseModal != null);\n } catch (e) {\n return false;\n }\n}\n\nfunction isLti(): boolean {\n return ltiSession.isActive;\n}\n\nfunction closeCapytaleIframe(): void {\n if (!isInCapytaleIframe()) throw new Error('Not in Nuxt modal');\n (window.parent as any).$drupalCloseModal();\n}\n\nexport default {\n isInCapytaletIframe: isInCapytaleIframe,\n isInCapytaleIframe,\n isLti,\n closeCapytaleIframe,\n} as CapytaleUi;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capytale/activity.js",
3
- "version": "3.1.22",
3
+ "version": "3.1.24",
4
4
  "author": "Capytale.fr",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "bin": {
package/tracker/index.js CHANGED
@@ -133,6 +133,9 @@ export default function (trackerHost, siteId) {
133
133
  this.push(['trackPageView']);
134
134
  }
135
135
  };
136
+ // SameSite=None pour les cookies
137
+ // Nécessaire pour le tracking dans une iframe
138
+ tracker.push(['setCookieSameSite', 'None']);
136
139
  if (siteId == null) {
137
140
  tracking = false;
138
141
  tempPaq = undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/tracker/index.ts"],"names":[],"mappings":"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","sourcesContent":["import loadScript from '../util/scriptLoader';\n\nimport type ActivitySession from \"../activity/activitySession\";\n\nexport type Tracker = {\n push: (args: any[]) => void;\n setUserId: (userId: string | null) => void;\n trackActivity: (data: ActivitySession) => void;\n trackPageView: () => void;\n};\n\nconst jsFile = \"matomo.js\";\nconst phpFile = \"matomo.php\";\n\nconst voidTracker: Tracker = {\n push() { },\n setUserId() { },\n trackActivity() { },\n trackPageView() { },\n}\n\n/**\n * Indique si le chargement du script de tracking a échoué.\n * Dans ce cas, le tracking est désactivé.\n */\nlet loadFailed: boolean = false;\n\n/**\n * Charge le script de tracking Matomo.\n * Cette fonction est appelée une seule fois dès que le siteId est connu.\n * \n * @param matomoUrl url du script de tracking\n * @param siteId id du site à tracker\n * @returns \n */\nfunction loadTracker(matomoUrl: string, siteId: number) {\n if ((loadFailed) || (globalThis._paq != null)) return;\n globalThis._paq = globalThis._paq || [];\n globalThis._paq.push(['setTrackerUrl', matomoUrl + phpFile]);\n globalThis._paq.push(['setSiteId', siteId]);\n loadScript(matomoUrl + jsFile).catch(() => {\n // retry once after 30s\n setTimeout(() => {\n loadScript(matomoUrl + jsFile)\n .catch(() => {\n loadFailed = true;\n delete globalThis._paq;\n });\n }, 30000);\n })\n}\n\nlet instantiated: boolean = false;\n\n/**\n * @param trackerHost nom de domaine du serveur de tracking\n * @param siteId id du site à tracker. Si null, le tracking est désactivé.\n * @returns l'objet Tracker permettant d'envoyer des événements de tracking.\n */\nexport default function (trackerHost: string, siteId: number | null | Promise<number | null>): Tracker {\n if (instantiated) {\n console.warn(\"Tracker already instantiated\");\n return voidTracker;\n }\n instantiated = true;\n const matomoUrl = \"//\" + trackerHost + \"/\";\n\n /**\n * sauvegarde des appels à push avant l'initialisation du tracker\n * c'est à dire tant que le siteId et le userId ne sont pas connus.\n */\n let tempPaq: any[] | undefined = [];\n\n /**\n * true si le tracking doit être effectué.\n * Reste à true tant que le siteId n'est pas connu.\n * Si le siteId est null, le tracking est désactivé et tracking est mis à false.\n */\n let tracking: boolean = true;\n\n /**\n * sauvegarde du userId pour initialiser le tracker quand le siteId sera connu.\n */\n let userIdSave: string | null = null;\n\n /**\n * true si le userId a été donné et sauvegardé.\n */\n let userIdSaved: boolean = false;\n\n const tracker: Tracker = {\n push(args: any[]) {\n if (loadFailed || !tracking) return;\n if (tempPaq == null) {\n globalThis._paq!.push(args);\n } else {\n tempPaq.push(args);\n }\n },\n setUserId(userId: string | null) {\n if (loadFailed || !tracking) return;\n if (globalThis._paq != null) {\n if (null == userId) {\n globalThis._paq.push(['resetUserId']);\n } else {\n globalThis._paq.push(['setUserId', userId]);\n }\n if (tempPaq != null) {\n // On pousse les appels en attente\n tempPaq.forEach((args) => {\n globalThis._paq!.push(args);\n });\n tempPaq = undefined;\n }\n } else {\n userIdSave = userId;\n userIdSaved = true;\n }\n },\n trackActivity(data: ActivitySession) {\n if (loadFailed || !tracking) return;\n let action: string | false = false;\n if (data.isAssignment) {\n if (data.mode === 'assignment') {\n action = 'edit assignment';\n } else if (data.mode === 'review') {\n action = 'review assignment';\n }\n } else {\n if (data.mode === 'create') {\n action = 'edit activity';\n } else if (data.mode === 'view') {\n action = 'view activity';\n }\n }\n if (action !== false) {\n this.push(['trackEvent', 'activity', action, data.activityBunch.activityType]);\n }\n },\n trackPageView() {\n if (loadFailed || !tracking) return;\n this.push(['trackPageView']);\n }\n }\n\n if (siteId == null) {\n tracking = false;\n tempPaq = undefined;\n } else if (siteId instanceof Promise) {\n siteId.then((sId) => {\n if (sId == null) {\n tracking = false;\n tempPaq = undefined;\n } else {\n loadTracker(matomoUrl, sId);\n if (userIdSaved) {\n tracker.setUserId(userIdSave);\n userIdSaved = false;\n userIdSave = null;\n }\n }\n }, () => {\n tracking = false;\n tempPaq = undefined;\n userIdSave = null;\n });\n } else {\n loadTracker(matomoUrl, siteId);\n }\n\n return tracker;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/tracker/index.ts"],"names":[],"mappings":"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","sourcesContent":["import loadScript from '../util/scriptLoader';\n\nimport type ActivitySession from \"../activity/activitySession\";\n\nexport type Tracker = {\n push: (args: any[]) => void;\n setUserId: (userId: string | null) => void;\n trackActivity: (data: ActivitySession) => void;\n trackPageView: () => void;\n};\n\nconst jsFile = \"matomo.js\";\nconst phpFile = \"matomo.php\";\n\nconst voidTracker: Tracker = {\n push() { },\n setUserId() { },\n trackActivity() { },\n trackPageView() { },\n}\n\n/**\n * Indique si le chargement du script de tracking a échoué.\n * Dans ce cas, le tracking est désactivé.\n */\nlet loadFailed: boolean = false;\n\n/**\n * Charge le script de tracking Matomo.\n * Cette fonction est appelée une seule fois dès que le siteId est connu.\n * \n * @param matomoUrl url du script de tracking\n * @param siteId id du site à tracker\n * @returns \n */\nfunction loadTracker(matomoUrl: string, siteId: number) {\n if ((loadFailed) || (globalThis._paq != null)) return;\n globalThis._paq = globalThis._paq || [];\n globalThis._paq.push(['setTrackerUrl', matomoUrl + phpFile]);\n globalThis._paq.push(['setSiteId', siteId]);\n loadScript(matomoUrl + jsFile).catch(() => {\n // retry once after 30s\n setTimeout(() => {\n loadScript(matomoUrl + jsFile)\n .catch(() => {\n loadFailed = true;\n delete globalThis._paq;\n });\n }, 30000);\n })\n}\n\nlet instantiated: boolean = false;\n\n/**\n * @param trackerHost nom de domaine du serveur de tracking\n * @param siteId id du site à tracker. Si null, le tracking est désactivé.\n * @returns l'objet Tracker permettant d'envoyer des événements de tracking.\n */\nexport default function (trackerHost: string, siteId: number | null | Promise<number | null>): Tracker {\n if (instantiated) {\n console.warn(\"Tracker already instantiated\");\n return voidTracker;\n }\n instantiated = true;\n const matomoUrl = \"//\" + trackerHost + \"/\";\n\n /**\n * sauvegarde des appels à push avant l'initialisation du tracker\n * c'est à dire tant que le siteId et le userId ne sont pas connus.\n */\n let tempPaq: any[] | undefined = [];\n\n /**\n * true si le tracking doit être effectué.\n * Reste à true tant que le siteId n'est pas connu.\n * Si le siteId est null, le tracking est désactivé et tracking est mis à false.\n */\n let tracking: boolean = true;\n\n /**\n * sauvegarde du userId pour initialiser le tracker quand le siteId sera connu.\n */\n let userIdSave: string | null = null;\n\n /**\n * true si le userId a été donné et sauvegardé.\n */\n let userIdSaved: boolean = false;\n\n const tracker: Tracker = {\n push(args: any[]) {\n if (loadFailed || !tracking) return;\n if (tempPaq == null) {\n globalThis._paq!.push(args);\n } else {\n tempPaq.push(args);\n }\n },\n setUserId(userId: string | null) {\n if (loadFailed || !tracking) return;\n if (globalThis._paq != null) {\n if (null == userId) {\n globalThis._paq.push(['resetUserId']);\n } else {\n globalThis._paq.push(['setUserId', userId]);\n }\n if (tempPaq != null) {\n // On pousse les appels en attente\n tempPaq.forEach((args) => {\n globalThis._paq!.push(args);\n });\n tempPaq = undefined;\n }\n } else {\n userIdSave = userId;\n userIdSaved = true;\n }\n },\n trackActivity(data: ActivitySession) {\n if (loadFailed || !tracking) return;\n let action: string | false = false;\n if (data.isAssignment) {\n if (data.mode === 'assignment') {\n action = 'edit assignment';\n } else if (data.mode === 'review') {\n action = 'review assignment';\n }\n } else {\n if (data.mode === 'create') {\n action = 'edit activity';\n } else if (data.mode === 'view') {\n action = 'view activity';\n }\n }\n if (action !== false) {\n this.push(['trackEvent', 'activity', action, data.activityBunch.activityType]);\n }\n },\n trackPageView() {\n if (loadFailed || !tracking) return;\n this.push(['trackPageView']);\n }\n }\n\n // SameSite=None pour les cookies\n // Nécessaire pour le tracking dans une iframe\n tracker.push(['setCookieSameSite', 'None']);\n\n if (siteId == null) {\n tracking = false;\n tempPaq = undefined;\n } else if (siteId instanceof Promise) {\n siteId.then((sId) => {\n if (sId == null) {\n tracking = false;\n tempPaq = undefined;\n } else {\n loadTracker(matomoUrl, sId);\n if (userIdSaved) {\n tracker.setUserId(userIdSave);\n userIdSaved = false;\n userIdSave = null;\n }\n }\n }, () => {\n tracking = false;\n tempPaq = undefined;\n userIdSave = null;\n });\n } else {\n loadTracker(matomoUrl, siteId);\n }\n\n return tracker;\n}\n"]}