@capytale/activity.js 3.1.9 → 3.1.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -23,8 +23,9 @@ export default class ActivitySession<AB extends ActivityBunch = ActivityBunch> {
23
23
  get friendlyType(): string;
24
24
  get activityType(): string;
25
25
  get returnUrl(): string;
26
- get formUrl(): string | false;
27
- get codeLink(): string | false;
26
+ get formUrl(): string | null;
27
+ get code(): string | null;
28
+ get codeLink(): string | null;
28
29
  get icon(): {
29
30
  path: string;
30
31
  style?: {
@@ -42,17 +42,25 @@ export default class ActivitySession {
42
42
  }
43
43
  get formUrl() {
44
44
  if (this.mode !== 'create')
45
- return false;
45
+ return null;
46
46
  return this.resolver({ name: 'activityNav', page: 'edit', id: this.activityBunch.activityNode.nid });
47
47
  }
48
- get codeLink() {
48
+ get code() {
49
49
  if (this.mode !== 'create')
50
- return false;
50
+ return null;
51
51
  const code = this.activityBunch.code.value;
52
52
  if (code == null)
53
- return false;
53
+ return null;
54
54
  if (code === 'student_activity')
55
- return false;
55
+ return null;
56
+ if (this.me?.profil !== 'teacher')
57
+ return null;
58
+ return code;
59
+ }
60
+ get codeLink() {
61
+ const code = this.code;
62
+ if (code == null)
63
+ return null;
56
64
  return this.resolver({ name: 'sa.launch', code: code }, true);
57
65
  }
58
66
  get icon() { return this.type.icon; }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/activity/activitySession/index.ts"],"names":[],"mappings":"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","sourcesContent":["import ActivityBunch from \"~/activityBunch/base\";\nimport type { Me } from \"~api/me/backend\";\nimport User from \"~entity/user\";\nimport type { ActivityType } from \"~/activityType/activityType\";\nimport type { RouteResolver } from \"~api/http/route\";\n\nexport type ActivityMode = \"assignment\" | \"create\" | \"review\" | \"view\" | \"detached\";\n\nexport type Student = {\n readonly nom?: string;\n readonly prenom?: string;\n readonly classe?: string;\n};\n\nfunction userAsStudent(user: User): Student {\n return {\n nom: user.nom.value || undefined,\n prenom: user.prenom.value || undefined,\n classe: user.classe.value || undefined,\n };\n}\n\nfunction meAsStudent(me: Me): Student {\n return {\n nom: me.lastname,\n prenom: me.firstname,\n classe: me.classe,\n };\n}\nexport default class ActivitySession<AB extends ActivityBunch = ActivityBunch> {\n private readonly resolver: RouteResolver;\n readonly activityBunch: AB;\n readonly me: Me | null;\n readonly type: ActivityType;\n readonly mode: ActivityMode;\n readonly student?: Student;\n constructor(resolver: RouteResolver, activity: ActivityBunch, type: ActivityType, me: Me | null, mode: ActivityMode, student?: User) {\n this.resolver = resolver;\n this.activityBunch = activity as AB;\n this.type = type;\n this.me = me;\n if (mode === 'assignment' && me != null) {\n this.student = meAsStudent(me);\n } else if (student != null) {\n this.student = userAsStudent(student!);\n }\n this.mode = mode;\n }\n get title() { return this.activityBunch.activityNode.title }\n get isAssignment() { return this.activityBunch.isAssignment }\n get instructions() { return this.activityBunch.instructions }\n get friendlyType() { return this.type.name }\n get activityType() { return this.activityBunch.activityType }\n get returnUrl(): string {\n return this.resolver({ name: 'activityNav', page: 'return', mode: this.mode, id: this.activityBunch.activityNode.nid });\n }\n get formUrl(): string | false {\n if (this.mode !== 'create') return false;\n return this.resolver({ name: 'activityNav', page: 'edit', id: this.activityBunch.activityNode.nid });\n }\n get codeLink(): string | false {\n if (this.mode !== 'create') return false;\n const code = this.activityBunch.code.value;\n if (code == null) return false;\n if (code === 'student_activity') return false;\n return this.resolver({ name: 'sa.launch', code: code }, true)\n }\n get icon() { return this.type.icon; }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/activity/activitySession/index.ts"],"names":[],"mappings":"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","sourcesContent":["import ActivityBunch from \"~/activityBunch/base\";\nimport type { Me } from \"~api/me/backend\";\nimport User from \"~entity/user\";\nimport type { ActivityType } from \"~/activityType/activityType\";\nimport type { RouteResolver } from \"~api/http/route\";\n\nexport type ActivityMode = \"assignment\" | \"create\" | \"review\" | \"view\" | \"detached\";\n\nexport type Student = {\n readonly nom?: string;\n readonly prenom?: string;\n readonly classe?: string;\n};\n\nfunction userAsStudent(user: User): Student {\n return {\n nom: user.nom.value || undefined,\n prenom: user.prenom.value || undefined,\n classe: user.classe.value || undefined,\n };\n}\n\nfunction meAsStudent(me: Me): Student {\n return {\n nom: me.lastname,\n prenom: me.firstname,\n classe: me.classe,\n };\n}\nexport default class ActivitySession<AB extends ActivityBunch = ActivityBunch> {\n private readonly resolver: RouteResolver;\n readonly activityBunch: AB;\n readonly me: Me | null;\n readonly type: ActivityType;\n readonly mode: ActivityMode;\n readonly student?: Student;\n constructor(resolver: RouteResolver, activity: ActivityBunch, type: ActivityType, me: Me | null, mode: ActivityMode, student?: User) {\n this.resolver = resolver;\n this.activityBunch = activity as AB;\n this.type = type;\n this.me = me;\n if (mode === 'assignment' && me != null) {\n this.student = meAsStudent(me);\n } else if (student != null) {\n this.student = userAsStudent(student!);\n }\n this.mode = mode;\n }\n get title() { return this.activityBunch.activityNode.title }\n get isAssignment() { return this.activityBunch.isAssignment }\n get instructions() { return this.activityBunch.instructions }\n get friendlyType() { return this.type.name }\n get activityType() { return this.activityBunch.activityType }\n get returnUrl(): string {\n return this.resolver({ name: 'activityNav', page: 'return', mode: this.mode, id: this.activityBunch.activityNode.nid });\n }\n get formUrl(): string | null {\n if (this.mode !== 'create') return null;\n return this.resolver({ name: 'activityNav', page: 'edit', id: this.activityBunch.activityNode.nid });\n }\n get code(): string | null {\n if (this.mode !== 'create') return null;\n const code = this.activityBunch.code.value;\n if (code == null) return null;\n if (code === 'student_activity') return null;\n if (this.me?.profil !== 'teacher') return null;\n return code;\n }\n get codeLink(): string | null {\n const code = this.code;\n if (code == null) return null;\n return this.resolver({ name: 'sa.launch', code: code }, true)\n }\n get icon() { return this.type.icon; }\n}\n"]}
@@ -15,11 +15,18 @@ export type ActivityType = {
15
15
  description: string;
16
16
  tags?: string;
17
17
  bundle: string;
18
+ /** Si ce type d'activité est disponible pour l'utilisateur courant. */
18
19
  available: boolean;
20
+ /** Indique que ce type d'activité est remplacé. */
19
21
  replacedBy?: string | null;
22
+ /** Ce type d'activité devrait être filtré en même temps que celui indiqué. */
20
23
  filterWith?: string | null;
24
+ /** Si ce type d'activité produit des évaluations détaillées. */
21
25
  detailedEvaluation: boolean;
26
+ /** Si ce type d'activité est exportable. */
22
27
  exportable: boolean;
28
+ /** Si ce type d'activité est compatible lti. */
29
+ lti: boolean;
23
30
  };
24
31
  export type ActivityGroup = {
25
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 available: boolean;\n replacedBy?: string | null;\n filterWith?: string | null;\n detailedEvaluation: boolean;\n exportable: 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. */\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capytale/activity.js",
3
- "version": "3.1.9",
3
+ "version": "3.1.11",
4
4
  "bin": {
5
5
  "cactjs": "./bin/cactjs.js"
6
6
  },
@@ -0,0 +1,4 @@
1
+ export default function createSignal(): [
2
+ trigger: () => void,
3
+ watch: (callback: () => void, imediate?: boolean) => () => void
4
+ ];
package/util/signal.js ADDED
@@ -0,0 +1,26 @@
1
+ function safeInvoque(callback) {
2
+ try {
3
+ callback();
4
+ }
5
+ catch (error) {
6
+ console.error(error);
7
+ }
8
+ }
9
+ export default function createSignal() {
10
+ let watchers = [];
11
+ return [
12
+ () => {
13
+ for (const watcher of watchers)
14
+ safeInvoque(watcher);
15
+ },
16
+ (callback, imediate = false) => {
17
+ watchers.push(callback);
18
+ if (imediate)
19
+ safeInvoque(callback);
20
+ return () => {
21
+ watchers = watchers.filter((watcher) => watcher !== callback);
22
+ };
23
+ }
24
+ ];
25
+ }
26
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../src/util/signal.ts"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,QAAoB;IACrC,IAAI,CAAC;QACD,QAAQ,EAAE,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACL,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,YAAY;IAIhC,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,OAAO;QACH,GAAG,EAAE;YACD,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QACD,CAAC,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE,EAAE;YAC3B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,QAAQ;gBAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpC,OAAO,GAAG,EAAE;gBACR,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;YAClE,CAAC,CAAC;QACN,CAAC;KACJ,CAAC;AACN,CAAC","sourcesContent":["function safeInvoque(callback: () => void) {\n try {\n callback();\n } catch (error) {\n console.error(error);\n }\n}\n\nexport default function createSignal(): [\n trigger: () => void,\n watch: (callback: () => void, imediate?: boolean) => () => void\n] {\n let watchers: (() => void)[] = [];\n return [\n () => {\n for (const watcher of watchers) safeInvoque(watcher);\n },\n (callback, imediate = false) => {\n watchers.push(callback);\n if (imediate) safeInvoque(callback);\n return () => {\n watchers = watchers.filter((watcher) => watcher !== callback);\n };\n }\n ];\n}"]}