@doenet/v06-to-v07 0.7.0-beta6 → 0.7.0-beta7

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.
Files changed (3) hide show
  1. package/index.js +603 -444
  2. package/index.js.map +1 -1
  3. package/package.json +1 -1
package/index.js CHANGED
@@ -67460,10 +67460,467 @@ class MathList extends CompositeComponent {
67460
67460
  return { replacementChanges, nComponents };
67461
67461
  }
67462
67462
  }
67463
+ function returnScoredSectionAttributes() {
67464
+ return {
67465
+ aggregateScores: {
67466
+ createComponentOfType: "boolean",
67467
+ createStateVariable: "aggregateScoresPreliminary",
67468
+ defaultValue: false
67469
+ },
67470
+ weight: {
67471
+ createComponentOfType: "number",
67472
+ createStateVariable: "weight",
67473
+ defaultValue: 1,
67474
+ public: true
67475
+ },
67476
+ sectionWideCheckWork: {
67477
+ createComponentOfType: "boolean",
67478
+ createStateVariable: "sectionWideCheckWork",
67479
+ defaultValue: false,
67480
+ public: true
67481
+ },
67482
+ showCorrectness: {
67483
+ createComponentOfType: "boolean",
67484
+ createStateVariable: "showCorrectnessPreliminary",
67485
+ defaultValue: null
67486
+ },
67487
+ submitLabel: {
67488
+ createComponentOfType: "text",
67489
+ createStateVariable: "submitLabel",
67490
+ defaultValue: "Check Work",
67491
+ public: true,
67492
+ forRenderer: true
67493
+ },
67494
+ submitLabelNoCorrectness: {
67495
+ createComponentOfType: "text",
67496
+ createStateVariable: "submitLabelNoCorrectness",
67497
+ defaultValue: "Submit Response",
67498
+ public: true,
67499
+ forRenderer: true
67500
+ },
67501
+ displayDigitsForCreditAchieved: {
67502
+ createComponentOfType: "integer",
67503
+ createStateVariable: "displayDigitsForCreditAchieved",
67504
+ defaultValue: 3,
67505
+ public: true
67506
+ }
67507
+ };
67508
+ }
67509
+ function returnScoredSectionStateVariableDefinition() {
67510
+ const stateVariableDefinitions = {};
67511
+ stateVariableDefinitions.scoredDescendants = {
67512
+ returnDependencies: () => ({
67513
+ scoredDescendants: {
67514
+ dependencyType: "descendant",
67515
+ componentTypes: [
67516
+ "_sectioningComponent",
67517
+ "answer",
67518
+ "setup",
67519
+ "_blockScoredComponent",
67520
+ "p",
67521
+ "li",
67522
+ "div",
67523
+ "span"
67524
+ ],
67525
+ variableNames: [
67526
+ "scoredDescendants",
67527
+ "aggregateScores",
67528
+ "weight"
67529
+ ],
67530
+ recurseToMatchedChildren: false,
67531
+ variablesOptional: true
67532
+ }
67533
+ }),
67534
+ definition({ dependencyValues }) {
67535
+ let scoredDescendants = [];
67536
+ for (let descendant of dependencyValues.scoredDescendants) {
67537
+ if (descendant.componentType === "setup") {
67538
+ continue;
67539
+ }
67540
+ if (descendant.stateValues.aggregateScores || descendant.stateValues.scoredDescendants === void 0) {
67541
+ scoredDescendants.push(descendant);
67542
+ } else {
67543
+ scoredDescendants.push(
67544
+ ...descendant.stateValues.scoredDescendants
67545
+ );
67546
+ }
67547
+ }
67548
+ return { setValue: { scoredDescendants } };
67549
+ }
67550
+ };
67551
+ stateVariableDefinitions.answerDescendants = {
67552
+ returnDependencies: () => ({
67553
+ answerDescendants: {
67554
+ dependencyType: "descendant",
67555
+ componentTypes: ["answer", "_blockScoredComponent"],
67556
+ variableNames: ["justSubmitted"],
67557
+ recurseToMatchedChildren: false
67558
+ }
67559
+ }),
67560
+ definition({ dependencyValues }) {
67561
+ return {
67562
+ setValue: {
67563
+ answerDescendants: dependencyValues.answerDescendants
67564
+ }
67565
+ };
67566
+ }
67567
+ };
67568
+ stateVariableDefinitions.justSubmitted = {
67569
+ forRenderer: true,
67570
+ returnDependencies: () => ({
67571
+ answerDescendants: {
67572
+ dependencyType: "stateVariable",
67573
+ variableName: "answerDescendants"
67574
+ }
67575
+ }),
67576
+ definition({ dependencyValues }) {
67577
+ return {
67578
+ setValue: {
67579
+ justSubmitted: dependencyValues.answerDescendants.every(
67580
+ (x2) => x2.stateValues.justSubmitted
67581
+ )
67582
+ }
67583
+ };
67584
+ }
67585
+ };
67586
+ stateVariableDefinitions.showCorrectness = {
67587
+ forRenderer: true,
67588
+ returnDependencies: () => ({
67589
+ showCorrectnessPreliminary: {
67590
+ dependencyType: "stateVariable",
67591
+ variableName: "showCorrectnessPreliminary"
67592
+ },
67593
+ showCorrectnessFlag: {
67594
+ dependencyType: "flag",
67595
+ flagName: "showCorrectness"
67596
+ }
67597
+ }),
67598
+ definition({ dependencyValues, usedDefault }) {
67599
+ let showCorrectness;
67600
+ if (!usedDefault.showCorrectnessPreliminary) {
67601
+ showCorrectness = dependencyValues.showCorrectnessPreliminary;
67602
+ } else {
67603
+ showCorrectness = dependencyValues.showCorrectnessFlag !== false;
67604
+ }
67605
+ return { setValue: { showCorrectness } };
67606
+ }
67607
+ };
67608
+ stateVariableDefinitions.displayDecimalsForCreditAchieved = {
67609
+ returnDependencies: () => ({}),
67610
+ definition: () => ({
67611
+ setValue: { displayDecimalsForCreditAchieved: -Infinity }
67612
+ })
67613
+ };
67614
+ stateVariableDefinitions.aggregateScores = {
67615
+ public: true,
67616
+ shadowingInstructions: {
67617
+ createComponentOfType: "boolean"
67618
+ },
67619
+ returnDependencies: () => ({
67620
+ aggregateScoresPreliminary: {
67621
+ dependencyType: "stateVariable",
67622
+ variableName: "aggregateScoresPreliminary"
67623
+ },
67624
+ sectionWideCheckWork: {
67625
+ dependencyType: "stateVariable",
67626
+ variableName: "sectionWideCheckWork"
67627
+ }
67628
+ }),
67629
+ definition({ dependencyValues }) {
67630
+ return {
67631
+ setValue: {
67632
+ aggregateScores: dependencyValues.aggregateScoresPreliminary || dependencyValues.sectionWideCheckWork
67633
+ }
67634
+ };
67635
+ }
67636
+ };
67637
+ stateVariableDefinitions.creditAchieved = {
67638
+ public: true,
67639
+ shadowingInstructions: {
67640
+ createComponentOfType: "number",
67641
+ addAttributeComponentsShadowingStateVariables: {
67642
+ displayDigits: {
67643
+ stateVariableToShadow: "displayDigitsForCreditAchieved"
67644
+ },
67645
+ displayDecimals: {
67646
+ stateVariableToShadow: "displayDecimalsForCreditAchieved"
67647
+ }
67648
+ }
67649
+ },
67650
+ forRenderer: true,
67651
+ defaultValue: 0,
67652
+ hasEssential: true,
67653
+ additionalStateVariablesDefined: [
67654
+ {
67655
+ variableName: "percentCreditAchieved",
67656
+ public: true,
67657
+ shadowingInstructions: {
67658
+ createComponentOfType: "number",
67659
+ addAttributeComponentsShadowingStateVariables: {
67660
+ displayDigits: {
67661
+ stateVariableToShadow: "displayDigitsForCreditAchieved"
67662
+ },
67663
+ displayDecimals: {
67664
+ stateVariableToShadow: "displayDecimalsForCreditAchieved"
67665
+ }
67666
+ }
67667
+ },
67668
+ defaultValue: 0,
67669
+ hasEssential: true
67670
+ }
67671
+ ],
67672
+ stateVariablesDeterminingDependencies: [
67673
+ "aggregateScores",
67674
+ "scoredDescendants"
67675
+ ],
67676
+ returnDependencies({ stateValues }) {
67677
+ let dependencies2 = {
67678
+ aggregateScores: {
67679
+ dependencyType: "stateVariable",
67680
+ variableName: "aggregateScores"
67681
+ }
67682
+ };
67683
+ if (stateValues.aggregateScores) {
67684
+ dependencies2.scoredDescendants = {
67685
+ dependencyType: "stateVariable",
67686
+ variableName: "scoredDescendants"
67687
+ };
67688
+ for (let [
67689
+ ind,
67690
+ descendant
67691
+ ] of stateValues.scoredDescendants.entries()) {
67692
+ dependencies2["creditAchieved" + ind] = {
67693
+ dependencyType: "stateVariable",
67694
+ componentIdx: descendant.componentIdx,
67695
+ variableName: "creditAchieved"
67696
+ };
67697
+ }
67698
+ }
67699
+ return dependencies2;
67700
+ },
67701
+ definition({ dependencyValues }) {
67702
+ if (!dependencyValues.aggregateScores) {
67703
+ return {
67704
+ setValue: {
67705
+ creditAchieved: 0,
67706
+ percentCreditAchieved: 0
67707
+ }
67708
+ };
67709
+ }
67710
+ let creditSum = 0;
67711
+ let totalWeight = 0;
67712
+ for (let [
67713
+ ind,
67714
+ component
67715
+ ] of dependencyValues.scoredDescendants.entries()) {
67716
+ let weight = component.stateValues.weight;
67717
+ creditSum += dependencyValues["creditAchieved" + ind] * weight;
67718
+ totalWeight += weight;
67719
+ }
67720
+ let creditAchieved;
67721
+ if (totalWeight > 0) {
67722
+ creditAchieved = creditSum / totalWeight;
67723
+ } else {
67724
+ creditAchieved = 1;
67725
+ }
67726
+ let percentCreditAchieved = creditAchieved * 100;
67727
+ return { setValue: { creditAchieved, percentCreditAchieved } };
67728
+ }
67729
+ };
67730
+ stateVariableDefinitions.creditAchievedIfSubmit = {
67731
+ defaultValue: 0,
67732
+ stateVariablesDeterminingDependencies: [
67733
+ "aggregateScores",
67734
+ "scoredDescendants"
67735
+ ],
67736
+ returnDependencies({ stateValues }) {
67737
+ let dependencies2 = {
67738
+ aggregateScores: {
67739
+ dependencyType: "stateVariable",
67740
+ variableName: "aggregateScores"
67741
+ }
67742
+ };
67743
+ if (stateValues.aggregateScores) {
67744
+ dependencies2.scoredDescendants = {
67745
+ dependencyType: "stateVariable",
67746
+ variableName: "scoredDescendants"
67747
+ };
67748
+ for (let [
67749
+ ind,
67750
+ descendant
67751
+ ] of stateValues.scoredDescendants.entries()) {
67752
+ dependencies2["creditAchievedIfSubmit" + ind] = {
67753
+ dependencyType: "stateVariable",
67754
+ componentIdx: descendant.componentIdx,
67755
+ variableName: "creditAchievedIfSubmit"
67756
+ };
67757
+ }
67758
+ }
67759
+ return dependencies2;
67760
+ },
67761
+ definition({ dependencyValues }) {
67762
+ if (!dependencyValues.aggregateScores) {
67763
+ return {
67764
+ setValue: {
67765
+ creditAchievedIfSubmit: 0
67766
+ }
67767
+ };
67768
+ }
67769
+ let creditSum = 0;
67770
+ let totalWeight = 0;
67771
+ for (let [
67772
+ ind,
67773
+ component
67774
+ ] of dependencyValues.scoredDescendants.entries()) {
67775
+ let weight = component.stateValues.weight;
67776
+ creditSum += dependencyValues["creditAchievedIfSubmit" + ind] * weight;
67777
+ totalWeight += weight;
67778
+ }
67779
+ let creditAchievedIfSubmit = creditSum / totalWeight;
67780
+ return { setValue: { creditAchievedIfSubmit } };
67781
+ }
67782
+ };
67783
+ stateVariableDefinitions.createSubmitAllButton = {
67784
+ forRenderer: true,
67785
+ additionalStateVariablesDefined: [
67786
+ {
67787
+ variableName: "suppressAnswerSubmitButtons",
67788
+ forRenderer: true
67789
+ }
67790
+ ],
67791
+ returnDependencies: () => ({
67792
+ sectionWideCheckWork: {
67793
+ dependencyType: "stateVariable",
67794
+ variableName: "sectionWideCheckWork"
67795
+ },
67796
+ sectionAncestor: {
67797
+ dependencyType: "ancestor",
67798
+ componentType: "_sectioningComponent",
67799
+ variableNames: ["suppressAnswerSubmitButtons"]
67800
+ },
67801
+ documentAncestor: {
67802
+ dependencyType: "ancestor",
67803
+ componentType: "document",
67804
+ variableNames: ["suppressAnswerSubmitButtons"]
67805
+ },
67806
+ pAncestor: {
67807
+ dependencyType: "ancestor",
67808
+ componentType: "p",
67809
+ variableNames: ["suppressAnswerSubmitButtons"]
67810
+ },
67811
+ liAncestor: {
67812
+ dependencyType: "ancestor",
67813
+ componentType: "li",
67814
+ variableNames: ["suppressAnswerSubmitButtons"]
67815
+ },
67816
+ divAncestor: {
67817
+ dependencyType: "ancestor",
67818
+ componentType: "div",
67819
+ variableNames: ["suppressAnswerSubmitButtons"]
67820
+ },
67821
+ spanAncestor: {
67822
+ dependencyType: "ancestor",
67823
+ componentType: "span",
67824
+ variableNames: ["suppressAnswerSubmitButtons"]
67825
+ }
67826
+ }),
67827
+ definition({ dependencyValues }) {
67828
+ let warnings = [];
67829
+ let createSubmitAllButton = false;
67830
+ let suppressAnswerSubmitButtons = false;
67831
+ if (dependencyValues.documentAncestor.stateValues.suppressAnswerSubmitButtons || dependencyValues.sectionAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.pAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.liAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.divAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.spanAncestor?.stateValues.suppressAnswerSubmitButtons) {
67832
+ suppressAnswerSubmitButtons = true;
67833
+ } else if (dependencyValues.sectionWideCheckWork) {
67834
+ createSubmitAllButton = true;
67835
+ suppressAnswerSubmitButtons = true;
67836
+ }
67837
+ return {
67838
+ setValue: {
67839
+ createSubmitAllButton,
67840
+ suppressAnswerSubmitButtons
67841
+ },
67842
+ sendWarnings: warnings
67843
+ };
67844
+ }
67845
+ };
67846
+ stateVariableDefinitions.suppressCheckWork = {
67847
+ forRenderer: true,
67848
+ returnDependencies: () => ({
67849
+ autoSubmit: {
67850
+ dependencyType: "flag",
67851
+ flagName: "autoSubmit"
67852
+ }
67853
+ }),
67854
+ definition({ dependencyValues }) {
67855
+ return {
67856
+ setValue: {
67857
+ suppressCheckWork: dependencyValues.autoSubmit
67858
+ }
67859
+ };
67860
+ }
67861
+ };
67862
+ stateVariableDefinitions.showCheckWork = {
67863
+ forRenderer: true,
67864
+ returnDependencies: () => ({
67865
+ createSubmitAllButton: {
67866
+ dependencyType: "stateVariable",
67867
+ variableName: "createSubmitAllButton"
67868
+ },
67869
+ suppressCheckWork: {
67870
+ dependencyType: "stateVariable",
67871
+ variableName: "suppressCheckWork"
67872
+ }
67873
+ }),
67874
+ definition({ dependencyValues }) {
67875
+ return {
67876
+ setValue: {
67877
+ showCheckWork: dependencyValues.createSubmitAllButton && !dependencyValues.suppressCheckWork
67878
+ }
67879
+ };
67880
+ }
67881
+ };
67882
+ return stateVariableDefinitions;
67883
+ }
67884
+ async function submitAllAnswers({
67885
+ component,
67886
+ actionId,
67887
+ sourceInformation = {},
67888
+ skipRendererUpdate = false
67889
+ }) {
67890
+ component.coreFunctions.requestRecordEvent({
67891
+ verb: "submitted",
67892
+ object: {
67893
+ componentIdx: component.componentIdx,
67894
+ componentType: component.componentType
67895
+ },
67896
+ result: {
67897
+ creditAchieved: await component.stateValues.creditAchievedIfSubmit
67898
+ }
67899
+ });
67900
+ let answersToSubmit = [];
67901
+ for (let answer of await component.stateValues.answerDescendants) {
67902
+ if (!await answer.stateValues.justSubmitted) {
67903
+ answersToSubmit.push(answer);
67904
+ }
67905
+ }
67906
+ let numAnswers = answersToSubmit.length;
67907
+ for (let [ind, answer] of answersToSubmit.entries()) {
67908
+ await component.coreFunctions.performAction({
67909
+ componentIdx: answer.componentIdx,
67910
+ actionName: "submitAnswer",
67911
+ args: {
67912
+ actionId,
67913
+ sourceInformation,
67914
+ skipRendererUpdate: skipRendererUpdate || ind < numAnswers - 1
67915
+ }
67916
+ });
67917
+ }
67918
+ }
67463
67919
  class Div extends BlockComponent {
67464
67920
  constructor(args) {
67465
67921
  super(args);
67466
67922
  Object.assign(this.actions, {
67923
+ submitAllAnswers: this.submitAllAnswers.bind(this),
67467
67924
  recordVisibilityChange: this.recordVisibilityChange.bind(this)
67468
67925
  });
67469
67926
  }
@@ -67472,6 +67929,12 @@ class Div extends BlockComponent {
67472
67929
  static renderChildren = true;
67473
67930
  static canDisplayChildErrors = true;
67474
67931
  static includeBlankStringChildren = true;
67932
+ static createAttributesObject() {
67933
+ let attributes = super.createAttributesObject();
67934
+ let scoredSectionAttributes = returnScoredSectionAttributes();
67935
+ Object.assign(attributes, scoredSectionAttributes);
67936
+ return attributes;
67937
+ }
67475
67938
  static returnChildGroups() {
67476
67939
  return [
67477
67940
  {
@@ -67480,6 +67943,26 @@ class Div extends BlockComponent {
67480
67943
  }
67481
67944
  ];
67482
67945
  }
67946
+ static returnStateVariableDefinitions() {
67947
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
67948
+ Object.assign(
67949
+ stateVariableDefinitions,
67950
+ returnScoredSectionStateVariableDefinition()
67951
+ );
67952
+ return stateVariableDefinitions;
67953
+ }
67954
+ async submitAllAnswers({
67955
+ actionId,
67956
+ sourceInformation = {},
67957
+ skipRendererUpdate = false
67958
+ }) {
67959
+ return submitAllAnswers({
67960
+ component: this,
67961
+ actionId,
67962
+ sourceInformation,
67963
+ skipRendererUpdate
67964
+ });
67965
+ }
67483
67966
  recordVisibilityChange({ isVisible }) {
67484
67967
  this.coreFunctions.requestRecordEvent({
67485
67968
  verb: "visibilityChanged",
@@ -67492,11 +67975,23 @@ class Div extends BlockComponent {
67492
67975
  }
67493
67976
  }
67494
67977
  class Span extends InlineComponent {
67978
+ constructor(args) {
67979
+ super(args);
67980
+ Object.assign(this.actions, {
67981
+ submitAllAnswers: this.submitAllAnswers.bind(this)
67982
+ });
67983
+ }
67495
67984
  static componentType = "span";
67496
67985
  static rendererType = "containerInline";
67497
67986
  static renderChildren = true;
67498
67987
  static canDisplayChildErrors = true;
67499
67988
  static includeBlankStringChildren = true;
67989
+ static createAttributesObject() {
67990
+ let attributes = super.createAttributesObject();
67991
+ let scoredSectionAttributes = returnScoredSectionAttributes();
67992
+ Object.assign(attributes, scoredSectionAttributes);
67993
+ return attributes;
67994
+ }
67500
67995
  static returnChildGroups() {
67501
67996
  return [
67502
67997
  {
@@ -67505,6 +68000,26 @@ class Span extends InlineComponent {
67505
68000
  }
67506
68001
  ];
67507
68002
  }
68003
+ static returnStateVariableDefinitions() {
68004
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
68005
+ Object.assign(
68006
+ stateVariableDefinitions,
68007
+ returnScoredSectionStateVariableDefinition()
68008
+ );
68009
+ return stateVariableDefinitions;
68010
+ }
68011
+ async submitAllAnswers({
68012
+ actionId,
68013
+ sourceInformation = {},
68014
+ skipRendererUpdate = false
68015
+ }) {
68016
+ return submitAllAnswers({
68017
+ component: this,
68018
+ actionId,
68019
+ sourceInformation,
68020
+ skipRendererUpdate
68021
+ });
68022
+ }
67508
68023
  }
67509
68024
  const Divisions = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
67510
68025
  __proto__: null,
@@ -80506,109 +81021,6 @@ function returnFeedbackDefinitionStateVariables() {
80506
81021
  };
80507
81022
  return stateVariableDefinitions;
80508
81023
  }
80509
- function returnScoredSectionStateVariableDefinition() {
80510
- const stateVariableDefinitions = {};
80511
- stateVariableDefinitions.scoredDescendants = {
80512
- returnDependencies: () => ({
80513
- scoredDescendants: {
80514
- dependencyType: "descendant",
80515
- componentTypes: [
80516
- "_sectioningComponent",
80517
- "answer",
80518
- "setup",
80519
- "_blockScoredComponent"
80520
- ],
80521
- variableNames: [
80522
- "scoredDescendants",
80523
- "aggregateScores",
80524
- "weight"
80525
- ],
80526
- recurseToMatchedChildren: false,
80527
- variablesOptional: true
80528
- }
80529
- }),
80530
- definition({ dependencyValues }) {
80531
- let scoredDescendants = [];
80532
- for (let descendant of dependencyValues.scoredDescendants) {
80533
- if (descendant.componentType === "setup") {
80534
- continue;
80535
- }
80536
- if (descendant.stateValues.aggregateScores || descendant.stateValues.scoredDescendants === void 0) {
80537
- scoredDescendants.push(descendant);
80538
- } else {
80539
- scoredDescendants.push(
80540
- ...descendant.stateValues.scoredDescendants
80541
- );
80542
- }
80543
- }
80544
- return { setValue: { scoredDescendants } };
80545
- }
80546
- };
80547
- stateVariableDefinitions.answerDescendants = {
80548
- returnDependencies: () => ({
80549
- answerDescendants: {
80550
- dependencyType: "descendant",
80551
- componentTypes: ["answer", "_blockScoredComponent"],
80552
- variableNames: ["justSubmitted"],
80553
- recurseToMatchedChildren: false
80554
- }
80555
- }),
80556
- definition({ dependencyValues }) {
80557
- return {
80558
- setValue: {
80559
- answerDescendants: dependencyValues.answerDescendants
80560
- }
80561
- };
80562
- }
80563
- };
80564
- stateVariableDefinitions.justSubmitted = {
80565
- forRenderer: true,
80566
- returnDependencies: () => ({
80567
- answerDescendants: {
80568
- dependencyType: "stateVariable",
80569
- variableName: "answerDescendants"
80570
- }
80571
- }),
80572
- definition({ dependencyValues }) {
80573
- return {
80574
- setValue: {
80575
- justSubmitted: dependencyValues.answerDescendants.every(
80576
- (x2) => x2.stateValues.justSubmitted
80577
- )
80578
- }
80579
- };
80580
- }
80581
- };
80582
- stateVariableDefinitions.showCorrectness = {
80583
- forRenderer: true,
80584
- returnDependencies: () => ({
80585
- showCorrectnessPreliminary: {
80586
- dependencyType: "stateVariable",
80587
- variableName: "showCorrectnessPreliminary"
80588
- },
80589
- showCorrectnessFlag: {
80590
- dependencyType: "flag",
80591
- flagName: "showCorrectness"
80592
- }
80593
- }),
80594
- definition({ dependencyValues, usedDefault }) {
80595
- let showCorrectness;
80596
- if (!usedDefault.showCorrectnessPreliminary) {
80597
- showCorrectness = dependencyValues.showCorrectnessPreliminary;
80598
- } else {
80599
- showCorrectness = dependencyValues.showCorrectnessFlag !== false;
80600
- }
80601
- return { setValue: { showCorrectness } };
80602
- }
80603
- };
80604
- stateVariableDefinitions.displayDecimalsForCreditAchieved = {
80605
- returnDependencies: () => ({}),
80606
- definition: () => ({
80607
- setValue: { displayDecimalsForCreditAchieved: -Infinity }
80608
- })
80609
- };
80610
- return stateVariableDefinitions;
80611
- }
80612
81024
  class SectioningComponent extends BlockComponent {
80613
81025
  constructor(args) {
80614
81026
  super(args);
@@ -80626,48 +81038,8 @@ class SectioningComponent extends BlockComponent {
80626
81038
  static createsVariants = true;
80627
81039
  static createAttributesObject() {
80628
81040
  let attributes = super.createAttributesObject();
80629
- attributes.aggregateScores = {
80630
- createComponentOfType: "boolean",
80631
- createStateVariable: "aggregateScoresPreliminary",
80632
- defaultValue: false
80633
- };
80634
- attributes.weight = {
80635
- createComponentOfType: "number",
80636
- createStateVariable: "weight",
80637
- defaultValue: 1,
80638
- public: true
80639
- };
80640
- attributes.sectionWideCheckWork = {
80641
- createComponentOfType: "boolean",
80642
- createStateVariable: "sectionWideCheckWork",
80643
- defaultValue: false,
80644
- public: true
80645
- };
80646
- attributes.showCorrectness = {
80647
- createComponentOfType: "boolean",
80648
- createStateVariable: "showCorrectnessPreliminary",
80649
- defaultValue: null
80650
- };
80651
- attributes.submitLabel = {
80652
- createComponentOfType: "text",
80653
- createStateVariable: "submitLabel",
80654
- defaultValue: "Check Work",
80655
- public: true,
80656
- forRenderer: true
80657
- };
80658
- attributes.submitLabelNoCorrectness = {
80659
- createComponentOfType: "text",
80660
- createStateVariable: "submitLabelNoCorrectness",
80661
- defaultValue: "Submit Response",
80662
- public: true,
80663
- forRenderer: true
80664
- };
80665
- attributes.displayDigitsForCreditAchieved = {
80666
- createComponentOfType: "integer",
80667
- createStateVariable: "displayDigitsForCreditAchieved",
80668
- defaultValue: 3,
80669
- public: true
80670
- };
81041
+ let scoredSectionAttributes = returnScoredSectionAttributes();
81042
+ Object.assign(attributes, scoredSectionAttributes);
80671
81043
  attributes.boxed = {
80672
81044
  createComponentOfType: "boolean",
80673
81045
  createStateVariable: "boxed",
@@ -81087,175 +81459,6 @@ class SectioningComponent extends BlockComponent {
81087
81459
  return { setValue: { level } };
81088
81460
  }
81089
81461
  };
81090
- stateVariableDefinitions.aggregateScores = {
81091
- public: true,
81092
- shadowingInstructions: {
81093
- createComponentOfType: "boolean"
81094
- },
81095
- returnDependencies: () => ({
81096
- aggregateScoresPreliminary: {
81097
- dependencyType: "stateVariable",
81098
- variableName: "aggregateScoresPreliminary"
81099
- },
81100
- sectionWideCheckWork: {
81101
- dependencyType: "stateVariable",
81102
- variableName: "sectionWideCheckWork"
81103
- }
81104
- }),
81105
- definition({ dependencyValues }) {
81106
- return {
81107
- setValue: {
81108
- aggregateScores: dependencyValues.aggregateScoresPreliminary || dependencyValues.sectionWideCheckWork
81109
- }
81110
- };
81111
- }
81112
- };
81113
- stateVariableDefinitions.creditAchieved = {
81114
- public: true,
81115
- shadowingInstructions: {
81116
- createComponentOfType: "number",
81117
- addAttributeComponentsShadowingStateVariables: {
81118
- displayDigits: {
81119
- stateVariableToShadow: "displayDigitsForCreditAchieved"
81120
- },
81121
- displayDecimals: {
81122
- stateVariableToShadow: "displayDecimalsForCreditAchieved"
81123
- }
81124
- }
81125
- },
81126
- forRenderer: true,
81127
- defaultValue: 0,
81128
- hasEssential: true,
81129
- additionalStateVariablesDefined: [
81130
- {
81131
- variableName: "percentCreditAchieved",
81132
- public: true,
81133
- shadowingInstructions: {
81134
- createComponentOfType: "number",
81135
- addAttributeComponentsShadowingStateVariables: {
81136
- displayDigits: {
81137
- stateVariableToShadow: "displayDigitsForCreditAchieved"
81138
- },
81139
- displayDecimals: {
81140
- stateVariableToShadow: "displayDecimalsForCreditAchieved"
81141
- }
81142
- }
81143
- },
81144
- defaultValue: 0,
81145
- hasEssential: true
81146
- }
81147
- ],
81148
- stateVariablesDeterminingDependencies: [
81149
- "aggregateScores",
81150
- "scoredDescendants"
81151
- ],
81152
- returnDependencies({ stateValues }) {
81153
- let dependencies2 = {
81154
- aggregateScores: {
81155
- dependencyType: "stateVariable",
81156
- variableName: "aggregateScores"
81157
- }
81158
- };
81159
- if (stateValues.aggregateScores) {
81160
- dependencies2.scoredDescendants = {
81161
- dependencyType: "stateVariable",
81162
- variableName: "scoredDescendants"
81163
- };
81164
- for (let [
81165
- ind,
81166
- descendant
81167
- ] of stateValues.scoredDescendants.entries()) {
81168
- dependencies2["creditAchieved" + ind] = {
81169
- dependencyType: "stateVariable",
81170
- componentIdx: descendant.componentIdx,
81171
- variableName: "creditAchieved"
81172
- };
81173
- }
81174
- }
81175
- return dependencies2;
81176
- },
81177
- definition({ dependencyValues }) {
81178
- if (!dependencyValues.aggregateScores) {
81179
- return {
81180
- setValue: {
81181
- creditAchieved: 0,
81182
- percentCreditAchieved: 0
81183
- }
81184
- };
81185
- }
81186
- let creditSum = 0;
81187
- let totalWeight = 0;
81188
- for (let [
81189
- ind,
81190
- component
81191
- ] of dependencyValues.scoredDescendants.entries()) {
81192
- let weight = component.stateValues.weight;
81193
- creditSum += dependencyValues["creditAchieved" + ind] * weight;
81194
- totalWeight += weight;
81195
- }
81196
- let creditAchieved;
81197
- if (totalWeight > 0) {
81198
- creditAchieved = creditSum / totalWeight;
81199
- } else {
81200
- creditAchieved = 1;
81201
- }
81202
- let percentCreditAchieved = creditAchieved * 100;
81203
- return { setValue: { creditAchieved, percentCreditAchieved } };
81204
- }
81205
- };
81206
- stateVariableDefinitions.creditAchievedIfSubmit = {
81207
- defaultValue: 0,
81208
- stateVariablesDeterminingDependencies: [
81209
- "aggregateScores",
81210
- "scoredDescendants"
81211
- ],
81212
- returnDependencies({ stateValues }) {
81213
- let dependencies2 = {
81214
- aggregateScores: {
81215
- dependencyType: "stateVariable",
81216
- variableName: "aggregateScores"
81217
- }
81218
- };
81219
- if (stateValues.aggregateScores) {
81220
- dependencies2.scoredDescendants = {
81221
- dependencyType: "stateVariable",
81222
- variableName: "scoredDescendants"
81223
- };
81224
- for (let [
81225
- ind,
81226
- descendant
81227
- ] of stateValues.scoredDescendants.entries()) {
81228
- dependencies2["creditAchievedIfSubmit" + ind] = {
81229
- dependencyType: "stateVariable",
81230
- componentIdx: descendant.componentIdx,
81231
- variableName: "creditAchievedIfSubmit"
81232
- };
81233
- }
81234
- }
81235
- return dependencies2;
81236
- },
81237
- definition({ dependencyValues }) {
81238
- if (!dependencyValues.aggregateScores) {
81239
- return {
81240
- setValue: {
81241
- creditAchievedIfSubmit: 0
81242
- }
81243
- };
81244
- }
81245
- let creditSum = 0;
81246
- let totalWeight = 0;
81247
- for (let [
81248
- ind,
81249
- component
81250
- ] of dependencyValues.scoredDescendants.entries()) {
81251
- let weight = component.stateValues.weight;
81252
- creditSum += dependencyValues["creditAchievedIfSubmit" + ind] * weight;
81253
- totalWeight += weight;
81254
- }
81255
- let creditAchievedIfSubmit = creditSum / totalWeight;
81256
- return { setValue: { creditAchievedIfSubmit } };
81257
- }
81258
- };
81259
81462
  stateVariableDefinitions.generatedVariantInfo = {
81260
81463
  shadowVariable: true,
81261
81464
  additionalStateVariablesDefined: ["isVariantComponent"],
@@ -81380,65 +81583,6 @@ class SectioningComponent extends BlockComponent {
81380
81583
  };
81381
81584
  }
81382
81585
  };
81383
- stateVariableDefinitions.createSubmitAllButton = {
81384
- forRenderer: true,
81385
- additionalStateVariablesDefined: [
81386
- {
81387
- variableName: "suppressAnswerSubmitButtons",
81388
- forRenderer: true
81389
- }
81390
- ],
81391
- returnDependencies: () => ({
81392
- sectionWideCheckWork: {
81393
- dependencyType: "stateVariable",
81394
- variableName: "sectionWideCheckWork"
81395
- },
81396
- sectionAncestor: {
81397
- dependencyType: "ancestor",
81398
- componentType: "_sectioningComponent",
81399
- variableNames: ["suppressAnswerSubmitButtons"]
81400
- },
81401
- documentAncestor: {
81402
- dependencyType: "ancestor",
81403
- componentType: "document",
81404
- variableNames: ["suppressAnswerSubmitButtons"]
81405
- }
81406
- }),
81407
- definition({ dependencyValues }) {
81408
- let warnings = [];
81409
- let createSubmitAllButton = false;
81410
- let suppressAnswerSubmitButtons = false;
81411
- if (dependencyValues.documentAncestor.stateValues.suppressAnswerSubmitButtons || dependencyValues.sectionAncestor && dependencyValues.sectionAncestor.stateValues.suppressAnswerSubmitButtons) {
81412
- suppressAnswerSubmitButtons = true;
81413
- } else if (dependencyValues.sectionWideCheckWork) {
81414
- createSubmitAllButton = true;
81415
- suppressAnswerSubmitButtons = true;
81416
- }
81417
- return {
81418
- setValue: {
81419
- createSubmitAllButton,
81420
- suppressAnswerSubmitButtons
81421
- },
81422
- sendWarnings: warnings
81423
- };
81424
- }
81425
- };
81426
- stateVariableDefinitions.suppressCheckWork = {
81427
- forRenderer: true,
81428
- returnDependencies: () => ({
81429
- autoSubmit: {
81430
- dependencyType: "flag",
81431
- flagName: "autoSubmit"
81432
- }
81433
- }),
81434
- definition({ dependencyValues }) {
81435
- return {
81436
- setValue: {
81437
- suppressCheckWork: dependencyValues.autoSubmit
81438
- }
81439
- };
81440
- }
81441
- };
81442
81586
  return stateVariableDefinitions;
81443
81587
  }
81444
81588
  async submitAllAnswers({
@@ -81446,33 +81590,12 @@ class SectioningComponent extends BlockComponent {
81446
81590
  sourceInformation = {},
81447
81591
  skipRendererUpdate = false
81448
81592
  }) {
81449
- this.coreFunctions.requestRecordEvent({
81450
- verb: "submitted",
81451
- object: {
81452
- componentIdx: this.componentIdx,
81453
- componentType: this.componentType
81454
- },
81455
- result: {
81456
- creditAchieved: await this.stateValues.creditAchievedIfSubmit
81457
- }
81593
+ return submitAllAnswers({
81594
+ component: this,
81595
+ actionId,
81596
+ sourceInformation,
81597
+ skipRendererUpdate
81458
81598
  });
81459
- let numAnswers = await this.stateValues.answerDescendants;
81460
- for (let [
81461
- ind,
81462
- answer
81463
- ] of await this.stateValues.answerDescendants.entries()) {
81464
- if (!await answer.stateValues.justSubmitted) {
81465
- await this.coreFunctions.performAction({
81466
- componentIdx: answer.componentIdx,
81467
- actionName: "submitAnswer",
81468
- args: {
81469
- actionId,
81470
- sourceInformation,
81471
- skipRendererUpdate: skipRendererUpdate || ind < numAnswers - 1
81472
- }
81473
- });
81474
- }
81475
- }
81476
81599
  }
81477
81600
  async revealSection({
81478
81601
  actionId,
@@ -82204,6 +82327,7 @@ let Li$1 = class Li extends BaseComponent {
82204
82327
  constructor(args) {
82205
82328
  super(args);
82206
82329
  Object.assign(this.actions, {
82330
+ submitAllAnswers: this.submitAllAnswers.bind(this),
82207
82331
  recordVisibilityChange: this.recordVisibilityChange.bind(this)
82208
82332
  });
82209
82333
  }
@@ -82213,6 +82337,12 @@ let Li$1 = class Li extends BaseComponent {
82213
82337
  static canDisplayChildErrors = true;
82214
82338
  static inSchemaOnlyInheritAs = [];
82215
82339
  static includeBlankStringChildren = true;
82340
+ static createAttributesObject() {
82341
+ let attributes = super.createAttributesObject();
82342
+ let scoredSectionAttributes = returnScoredSectionAttributes();
82343
+ Object.assign(attributes, scoredSectionAttributes);
82344
+ return attributes;
82345
+ }
82216
82346
  static returnChildGroups() {
82217
82347
  return [
82218
82348
  {
@@ -82223,6 +82353,10 @@ let Li$1 = class Li extends BaseComponent {
82223
82353
  }
82224
82354
  static returnStateVariableDefinitions() {
82225
82355
  let stateVariableDefinitions = super.returnStateVariableDefinitions();
82356
+ Object.assign(
82357
+ stateVariableDefinitions,
82358
+ returnScoredSectionStateVariableDefinition()
82359
+ );
82226
82360
  stateVariableDefinitions.item = {
82227
82361
  forRenderer: true,
82228
82362
  returnDependencies: () => ({}),
@@ -82248,6 +82382,18 @@ let Li$1 = class Li extends BaseComponent {
82248
82382
  };
82249
82383
  return stateVariableDefinitions;
82250
82384
  }
82385
+ async submitAllAnswers({
82386
+ actionId,
82387
+ sourceInformation = {},
82388
+ skipRendererUpdate = false
82389
+ }) {
82390
+ return submitAllAnswers({
82391
+ component: this,
82392
+ actionId,
82393
+ sourceInformation,
82394
+ skipRendererUpdate
82395
+ });
82396
+ }
82251
82397
  recordVisibilityChange({ isVisible }) {
82252
82398
  this.coreFunctions.requestRecordEvent({
82253
82399
  verb: "visibilityChanged",
@@ -104035,6 +104181,7 @@ class Document extends BaseComponent {
104035
104181
  stateVariableDefinitions,
104036
104182
  returnScoredSectionStateVariableDefinition()
104037
104183
  );
104184
+ delete stateVariableDefinitions.aggregateScores;
104038
104185
  stateVariableDefinitions.titleChildName = {
104039
104186
  forRenderer: true,
104040
104187
  returnDependencies: () => ({
@@ -104479,22 +104626,6 @@ class Document extends BaseComponent {
104479
104626
  };
104480
104627
  }
104481
104628
  };
104482
- stateVariableDefinitions.suppressCheckWork = {
104483
- forRenderer: true,
104484
- returnDependencies: () => ({
104485
- autoSubmit: {
104486
- dependencyType: "flag",
104487
- flagName: "autoSubmit"
104488
- }
104489
- }),
104490
- definition({ dependencyValues }) {
104491
- return {
104492
- setValue: {
104493
- suppressCheckWork: dependencyValues.autoSubmit
104494
- }
104495
- };
104496
- }
104497
- };
104498
104629
  stateVariableDefinitions.containerTag = {
104499
104630
  forRenderer: true,
104500
104631
  returnDependencies: () => ({}),
@@ -104507,31 +104638,12 @@ class Document extends BaseComponent {
104507
104638
  sourceInformation = {},
104508
104639
  skipRendererUpdate = false
104509
104640
  }) {
104510
- this.coreFunctions.requestRecordEvent({
104511
- verb: "submitted",
104512
- object: {
104513
- componentIdx: this.componentIdx,
104514
- componentType: this.componentType
104515
- }
104641
+ return submitAllAnswers({
104642
+ component: this,
104643
+ actionId,
104644
+ sourceInformation,
104645
+ skipRendererUpdate
104516
104646
  });
104517
- let answersToSubmit = [];
104518
- for (let answer of await this.stateValues.answerDescendants) {
104519
- if (!await answer.stateValues.justSubmitted) {
104520
- answersToSubmit.push(answer);
104521
- }
104522
- }
104523
- let numAnswers = answersToSubmit.length;
104524
- for (let [ind, answer] of answersToSubmit.entries()) {
104525
- await this.coreFunctions.performAction({
104526
- componentIdx: answer.componentIdx,
104527
- actionName: "submitAnswer",
104528
- args: {
104529
- actionId,
104530
- sourceInformation,
104531
- skipRendererUpdate: skipRendererUpdate || ind < numAnswers - 1
104532
- }
104533
- });
104534
- }
104535
104647
  }
104536
104648
  recordVisibilityChange({ isVisible }) {
104537
104649
  this.coreFunctions.requestRecordEvent({
@@ -105817,6 +105929,7 @@ let P$2 = class P3 extends BlockComponent {
105817
105929
  constructor(args) {
105818
105930
  super(args);
105819
105931
  Object.assign(this.actions, {
105932
+ submitAllAnswers: this.submitAllAnswers.bind(this),
105820
105933
  recordVisibilityChange: this.recordVisibilityChange.bind(this)
105821
105934
  });
105822
105935
  }
@@ -105824,6 +105937,12 @@ let P$2 = class P3 extends BlockComponent {
105824
105937
  static renderChildren = true;
105825
105938
  static canDisplayChildErrors = true;
105826
105939
  static includeBlankStringChildren = true;
105940
+ static createAttributesObject() {
105941
+ let attributes = super.createAttributesObject();
105942
+ let scoredSectionAttributes = returnScoredSectionAttributes();
105943
+ Object.assign(attributes, scoredSectionAttributes);
105944
+ return attributes;
105945
+ }
105827
105946
  static returnChildGroups() {
105828
105947
  return [
105829
105948
  {
@@ -105838,6 +105957,10 @@ let P$2 = class P3 extends BlockComponent {
105838
105957
  }
105839
105958
  static returnStateVariableDefinitions() {
105840
105959
  let stateVariableDefinitions = super.returnStateVariableDefinitions();
105960
+ Object.assign(
105961
+ stateVariableDefinitions,
105962
+ returnScoredSectionStateVariableDefinition()
105963
+ );
105841
105964
  stateVariableDefinitions.text = {
105842
105965
  public: true,
105843
105966
  shadowingInstructions: {
@@ -105858,6 +105981,18 @@ let P$2 = class P3 extends BlockComponent {
105858
105981
  };
105859
105982
  return stateVariableDefinitions;
105860
105983
  }
105984
+ async submitAllAnswers({
105985
+ actionId,
105986
+ sourceInformation = {},
105987
+ skipRendererUpdate = false
105988
+ }) {
105989
+ return submitAllAnswers({
105990
+ component: this,
105991
+ actionId,
105992
+ sourceInformation,
105993
+ skipRendererUpdate
105994
+ });
105995
+ }
105861
105996
  recordVisibilityChange({ isVisible }) {
105862
105997
  this.coreFunctions.requestRecordEvent({
105863
105998
  verb: "visibilityChanged",
@@ -123270,7 +123405,7 @@ function returnStandardAnswerAttributes() {
123270
123405
  disableAfterCorrect: {
123271
123406
  createComponentOfType: "boolean",
123272
123407
  createStateVariable: "disableAfterCorrect",
123273
- defaultValue: true,
123408
+ defaultValue: false,
123274
123409
  public: true
123275
123410
  },
123276
123411
  submitLabel: {
@@ -123622,10 +123757,16 @@ function returnStandardAnswerStateVariableDefinition() {
123622
123757
  creditAchieved: {
123623
123758
  dependencyType: "stateVariable",
123624
123759
  variableName: "creditAchieved"
123760
+ },
123761
+ nextCreditFactor: {
123762
+ dependencyType: "stateVariable",
123763
+ variableName: "nextCreditFactor",
123764
+ variablesOptional: true
123625
123765
  }
123626
123766
  }),
123627
123767
  definition({ dependencyValues }) {
123628
- if (dependencyValues.creditAchieved === 1) {
123768
+ const creditAchieved = dependencyValues.creditAchieved;
123769
+ if (creditAchieved === 1 || creditAchieved > 0 && creditAchieved === dependencyValues.nextCreditFactor) {
123629
123770
  return {
123630
123771
  setValue: { hasBeenCorrect: true },
123631
123772
  setEssentialValue: { hasBeenCorrect: true }
@@ -124835,15 +124976,33 @@ class Answer extends InlineComponent {
124835
124976
  dependencyType: "ancestor",
124836
124977
  componentType: "document",
124837
124978
  variableNames: ["suppressAnswerSubmitButtons"]
124979
+ },
124980
+ pAncestor: {
124981
+ dependencyType: "ancestor",
124982
+ componentType: "p",
124983
+ variableNames: ["suppressAnswerSubmitButtons"]
124984
+ },
124985
+ liAncestor: {
124986
+ dependencyType: "ancestor",
124987
+ componentType: "li",
124988
+ variableNames: ["suppressAnswerSubmitButtons"]
124989
+ },
124990
+ divAncestor: {
124991
+ dependencyType: "ancestor",
124992
+ componentType: "div",
124993
+ variableNames: ["suppressAnswerSubmitButtons"]
124994
+ },
124995
+ spanAncestor: {
124996
+ dependencyType: "ancestor",
124997
+ componentType: "span",
124998
+ variableNames: ["suppressAnswerSubmitButtons"]
124838
124999
  }
124839
125000
  }),
124840
125001
  definition: function({ dependencyValues }) {
124841
125002
  let delegateCheckWorkToAncestor = false;
124842
125003
  let delegateCheckWorkToInput = false;
124843
125004
  let delegateCheckWork = false;
124844
- if (dependencyValues.documentAncestor.stateValues.suppressAnswerSubmitButtons) {
124845
- delegateCheckWorkToAncestor = delegateCheckWork = true;
124846
- } else if (dependencyValues.sectionAncestor?.stateValues.suppressAnswerSubmitButtons) {
125005
+ if (dependencyValues.documentAncestor.stateValues.suppressAnswerSubmitButtons || dependencyValues.sectionAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.pAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.liAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.divAncestor?.stateValues.suppressAnswerSubmitButtons || dependencyValues.spanAncestor?.stateValues.suppressAnswerSubmitButtons) {
124847
125006
  delegateCheckWorkToAncestor = delegateCheckWork = true;
124848
125007
  } else if (dependencyValues.inputChildren.length === 1 && !dependencyValues.forceFullCheckworkButton) {
124849
125008
  delegateCheckWorkToInput = delegateCheckWork = true;