@pie-element/extended-text-entry 14.2.0-next.4 → 14.2.0-next.6

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [14.2.0-next.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/extended-text-entry@14.2.0-next.5...@pie-element/extended-text-entry@14.2.0-next.6) (2026-04-16)
7
+
8
+ ### Bug Fixes
9
+
10
+ - bump libs PIE-46, PIE-25, PIE-54, PIE-44, PIE-29, PIE-13, PIE-129 ([5c17838](https://github.com/pie-framework/pie-elements/commit/5c17838a53483437e42dc679a4361e16b7ef5e31))
11
+
12
+ # [14.2.0-next.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/extended-text-entry@14.2.0-next.4...@pie-element/extended-text-entry@14.2.0-next.5) (2026-04-13)
13
+
14
+ ### Bug Fixes
15
+
16
+ - bump libs PIE-34 ([9f8b35a](https://github.com/pie-framework/pie-elements/commit/9f8b35a856ca1eba67d5630a358b96226cfca984))
17
+
6
18
  # [14.2.0-next.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/extended-text-entry@14.2.0-next.3...@pie-element/extended-text-entry@14.2.0-next.4) (2026-04-10)
7
19
 
8
20
  ### Features
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [12.2.0-next.6](https://github.com/pie-framework/pie-elements/compare/@pie-element/extended-text-entry-configure@12.2.0-next.5...@pie-element/extended-text-entry-configure@12.2.0-next.6) (2026-04-16)
7
+
8
+ ### Bug Fixes
9
+
10
+ - bump libs PIE-46, PIE-25, PIE-54, PIE-44, PIE-29, PIE-13, PIE-129 ([5c17838](https://github.com/pie-framework/pie-elements/commit/5c17838a53483437e42dc679a4361e16b7ef5e31))
11
+
12
+ # [12.2.0-next.5](https://github.com/pie-framework/pie-elements/compare/@pie-element/extended-text-entry-configure@12.2.0-next.4...@pie-element/extended-text-entry-configure@12.2.0-next.5) (2026-04-13)
13
+
14
+ ### Bug Fixes
15
+
16
+ - bump libs PIE-34 ([9f8b35a](https://github.com/pie-framework/pie-elements/commit/9f8b35a856ca1eba67d5630a358b96226cfca984))
17
+
6
18
  # [12.2.0-next.4](https://github.com/pie-framework/pie-elements/compare/@pie-element/extended-text-entry-configure@12.2.0-next.3...@pie-element/extended-text-entry-configure@12.2.0-next.4) (2026-04-10)
7
19
 
8
20
  ### Features
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pie-element/extended-text-entry-configure",
3
3
  "private": true,
4
- "version": "12.2.0-next.4",
4
+ "version": "12.2.0-next.6",
5
5
  "description": "",
6
6
  "main": "lib/index.js",
7
7
  "module": "src/index.js",
@@ -13,8 +13,8 @@
13
13
  "@mui/icons-material": "^7.3.4",
14
14
  "@mui/material": "^7.3.4",
15
15
  "@pie-framework/pie-configure-events": "^1.3.0",
16
- "@pie-lib/config-ui": "12.2.0-next.28",
17
- "@pie-lib/editable-html-tip-tap": "1.2.0-next.27",
16
+ "@pie-lib/config-ui": "12.2.0-next.35",
17
+ "@pie-lib/editable-html-tip-tap": "1.2.0-next.34",
18
18
  "lodash-es": "^4.17.23",
19
19
  "prop-types": "^15.6.2",
20
20
  "react": "18.3.1",
@@ -0,0 +1 @@
1
+ import{_dll_react_dom as e,_dll_react as t,_dll_prop_types as n,_dll_mui__material as i,_dll_mui__material_styles as a}from"../../../@pie-lib/shared-module@^4.1.0/module/index.js";import{_dll_pie_lib__config_ui as s}from"../../../@pie-lib/config-module@^3.1.0/module/index.js";import{_dll_pie_lib__editable_html_tip_tap as o}from"../../../@pie-lib/editable-html-module@^6.2.0/module/index.js";var l={};Object.defineProperty(l,"__esModule",{value:!0});class r extends CustomEvent{constructor(e,t=!1){super(r.TYPE,{bubbles:!0,detail:{update:e,reset:t}}),this.update=e,this.reset=t}}r.TYPE="model.updated";var d=l.ModelUpdatedEvent=r;class c extends CustomEvent{constructor(e,t){super(c.TYPE,{bubbles:!0,detail:{src:e,done:t}}),this.src=e,this.done=t}}c.TYPE="delete.image";var p=l.DeleteImageEvent=c;class u extends CustomEvent{constructor(e){super(u.TYPE,{bubbles:!0,detail:e}),this.handler=e}}u.TYPE="insert.image";var h=l.InsertImageEvent=u;class g extends CustomEvent{constructor(e,t){super(g.TYPE,{bubbles:!0,detail:{src:e,done:t}}),this.src=e,this.done=t}}g.TYPE="delete.sound";var b=l.DeleteSoundEvent=g;class m extends CustomEvent{constructor(e){super(m.TYPE,{bubbles:!0,detail:e}),this.handler=e}}m.TYPE="insert.sound";var _,E=l.InsertSoundEvent=m,f=e;_=f.createRoot,f.hydrateRoot;const C=t,I=n,{Typography:v}=i,{styled:S}=a,{FeedbackSelector:x}=s,{InputContainer:y}=s,{settings:k}=s,{layout:P}=s,w=o,{ALL_PLUGINS:M}=o;function T(e){let t,n=e[0],i=1;for(;i<e.length;){const a=e[i],s=e[i+1];if(i+=2,("optionalAccess"===a||"optionalCall"===a)&&null==n)return;"access"===a||"optionalAccess"===a?(t=n,n=s(n)):"call"!==a&&"optionalCall"!==a||(n=s((...e)=>n.call(t,...e)),t=void 0)}return n}const{Panel:A,toggle:D,numberFields:R,dropdown:q}=k,Y={type:"default",default:"Your answer has been submitted"},O=S(v)(({theme:e})=>({paddingBottom:e.spacing(1)})),j=S(y)(({theme:e})=>({paddingTop:e.spacing(1),marginTop:e.spacing(2),marginBottom:e.spacing(2),width:"100%"})),H=S("div")(({theme:e})=>({fontSize:e.typography.fontSize-2,color:e.palette.error.main,paddingTop:e.spacing(1)}));class F extends C.Component{static __initStatic(){this.propTypes={onModelChanged:I.func.isRequired,onConfigurationChanged:I.func,model:I.object.isRequired,configuration:I.object.isRequired,imageSupport:I.object.isRequired,uploadSoundSupport:I.object.isRequired}}constructor(e){super(e),F.prototype.__init.call(this),F.prototype.__init2.call(this),F.prototype.__init3.call(this),this.state={setDimensions:!0}}__init(){this.onPromptChange=e=>{const{onModelChanged:t,model:n}=this.props;t({...n,prompt:e})}}__init2(){this.changeFeedback=e=>{const{model:t,onModelChanged:n}=this.props;n({...t,feedback:e})}}__init3(){this.changeTeacherInstructions=e=>{const{model:t,onModelChanged:n}=this.props;n({...t,teacherInstructions:e})}}render(){const{model:e,configuration:t,imageSupport:n,onConfigurationChanged:i,onModelChanged:a,uploadSoundSupport:s}=this.props,{annotations:o={},contentDimensions:l={},dimensions:r={},equationEditor:d={},feedback:c={},playerSpellCheck:p={},prompt:u={},settingsPanelDisabled:h,spanishInput:g={},specialInput:b={},spellCheck:m={},studentInstructions:_={},teacherInstructions:E={},mathInput:f={},maxImageWidth:I={},maxImageHeight:v={},multiple:S={},withRubric:y={},mathMlOptions:k={},baseInputConfiguration:F={}}=t||{},{errors:G={},extraCSSRules:W,feedbackEnabled:L,promptEnabled:z,spellCheckEnabled:N,teacherInstructionsEnabled:B,toolbarEditorPosition:U}=e||{},{prompt:J,teacherInstructions:K}=G,Q=I&&I.prompt,V=v&&v.prompt,X={position:"top"===U?"top":"bottom"},Z={mathInput:f.settings&&D(f.label),equationEditor:d.enabled&&e.mathInput&&q(d.label,["non-negative-integers","integers","decimals","fractions","Grade 1 - 2","Grade 3 - 5","Grade 6 - 7","Grade 8 - HS","geometry","advanced-algebra","statistics","item-authoring"]),spanishInput:g.settings&&D(g.label),specialInput:b.settings&&D(b.label),dimensions:r.settings&&R(r.label,{width:{label:"Width (px)",suffix:"px",min:100,max:1200},height:{label:"Height (px)",suffix:"px",min:100,max:500}}),"multiple.enabled":S.settings&&D(S.label,!0),promptEnabled:u.settings&&D(u.label),feedbackEnabled:c.settings&&D(c.label),annotationsEnabled:o.settings&&D(o.label),spellCheckEnabled:m.settings&&D(m.label),playerSpellCheckDisabled:p.settings&&D(p.label)},$={teacherInstructionsEnabled:E.settings&&D(E.label),studentInstructionsEnabled:_.settings&&D(_.label),rubricEnabled:T([y,"optionalAccess",e=>e.settings])&&D(T([y,"optionalAccess",e=>e.label]))},ee=e=>Object.assign({...F},e||{});return C.createElement(P.ConfigLayout,{extraCSSRules:W,dimensions:l,hideSettings:h,settings:C.createElement(A,{model:e,configuration:t,onChangeModel:e=>a(e),onChangeConfiguration:e=>i(e),groups:{Settings:Z,Properties:$}})},B&&C.createElement(j,{label:E.label},C.createElement(w,{className:"prompt",markup:e.teacherInstructions||"",onChange:this.changeTeacherInstructions,imageSupport:n,nonEmpty:!1,error:K,toolbarOpts:X,spellCheck:N,maxImageWidth:I&&I.teacherInstructions||Q,maxImageHeight:v&&v.teacherInstructions||V,uploadSoundSupport:s,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:k,pluginProps:ee(T([E,"optionalAccess",e=>e.inputConfiguration]))}),K&&C.createElement(H,null,K)),z&&C.createElement(j,{label:u.label},C.createElement(w,{activePlugins:M,className:"prompt",markup:e.prompt||"",onChange:this.onPromptChange,imageSupport:n,nonEmpty:!1,error:J,toolbarOpts:X,spellCheck:N,maxImageWidth:Q,maxImageHeight:V,uploadSoundSupport:s,languageCharactersProps:[{language:"spanish"},{language:"special"}],mathMlOptions:k,pluginProps:ee(T([u,"optionalAccess",e=>e.inputConfiguration]))}),J&&C.createElement(H,null,J)),L&&C.createElement(C.Fragment,null,C.createElement(O,{variant:"h6"},"Feedback"),C.createElement(x,{label:"When submitted, show",feedback:e.feedback||Y,onChange:this.changeFeedback,toolbarOpts:X})))}}F.__initStatic();var G={annotationsEnabled:!1,dimensions:{height:100,width:500},equationEditor:"Grade 8 - HS",feedbackEnabled:!1,mathInput:!1,playerSpellCheckDisabled:!0,predefinedAnnotations:[{label:"good",text:"good",type:"positive"},{label:"★",text:"★",type:"positive"},{label:":-)",text:":-)",type:"positive"},{label:"creative",text:"creative",type:"positive"},{label:"run-on",text:"run-on",type:"negative"},{label:"frag",text:"fragment",type:"negative"},{label:"tran",text:"transition",type:"negative"},{label:"supp",text:"support needed",type:"negative"},{label:"punc",text:"punctuation",type:"negative"},{label:"agr",text:"agreement wrong",type:"negative"},{label:"unclear",text:"unclear",type:"negative"},{label:"cut",text:"cut",type:"negative"},{label:"sp",text:"spelling",type:"negative"},{label:"cap",text:"capitalization",type:"negative"},{label:"inf",text:"informal",type:"negative"},{label:"awk",text:"awkward",type:"negative"}],prompt:"",promptEnabled:!0,rationale:"",rationaleEnabled:!0,spanishInput:!1,specialInput:!1,spellCheckEnabled:!0,studentInstructionsEnabled:!0,teacherInstructions:"",teacherInstructionsEnabled:!0,toolbarEditorPosition:"bottom"},W={annotations:{settings:!1,label:"Annotations"},baseInputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1},h3:{disabled:!0},blockquote:{disabled:!0},textAlign:{disabled:!0},showParagraphs:{disabled:!1},separateParagraphs:{disabled:!0}},dimensions:{settings:!0,label:"Text-Entry Display Size"},spellCheck:{label:"Spellcheck",settings:!1,enabled:!0},playerSpellCheck:{label:"Disable Student Spellcheck",settings:!0,enabled:!0},equationEditor:{settings:!1,label:"Equation Editor",enabled:!0},feedback:{settings:!0,label:"Feedback"},mathInput:{settings:!0,label:"Student response can include math notation",enabled:!1},settingsPanelDisabled:!1,spanishInput:{settings:!0,label:"Students can insert Spanish",enabled:!1},specialInput:{settings:!0,label:"Students can insert Special Characters",enabled:!1},multiple:{settings:!1,label:"Multiple Parts",enabled:!1},studentInstructions:{settings:!1,label:"Student Instructions"},prompt:{settings:!0,label:"Prompt",inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},teacherInstructions:{settings:!0,label:"Teacher Instructions",inputConfiguration:{audio:{disabled:!1},video:{disabled:!1},image:{disabled:!1}},required:!1},maxImageWidth:{teacherInstructions:300,prompt:300},maxImageHeight:{teacherInstructions:300,prompt:300},withRubric:{settings:!1,label:"Add Rubric"},mathMlOptions:{mmlOutput:!1,mmlEditing:!1}};const L=t;function z(e){let t,n=e[0],i=1;for(;i<e.length;){const a=e[i],s=e[i+1];if(i+=2,("optionalAccess"===a||"optionalCall"===a)&&null==n)return;"access"===a||"optionalAccess"===a?(t=n,n=s(n)):"call"!==a&&"optionalCall"!==a||(n=s((...e)=>n.call(t,...e)),t=void 0)}return n}class N extends HTMLElement{static __initStatic(){this.createDefaultModel=(e={},t)=>{const n={...G,...e};return z([t,"optionalAccess",e=>e.withRubric,"optionalAccess",e=>e.forceEnabled])&&!n.rubricEnabled&&(n.rubricEnabled=!0),n}}constructor(){super(),this._root=null,this._configuration=W,z([this,"access",e=>e._configuration,"access",e=>e.withRubric,"optionalAccess",e=>e.forceEnabled])&&(this._configuration.withRubric.settings=!1),this._model=N.createDefaultModel({},this._configuration)}set model(e){this._model=N.createDefaultModel(e,this._configuration),this.render()}set configuration(e){this._configuration={...W,...e};const{withRubric:t={}}=e||{};z([t,"optionalAccess",e=>e.forceEnabled])&&(this._configuration.withRubric.settings=!1,this._model.rubricEnabled||(this._model.rubricEnabled=!0)),this.render()}onModelChanged(e){this._model=e,this.render(),this.dispatchEvent(new d(this._model,!1))}onConfigurationChanged(e){this._configuration={...W,...e},this._model&&this.onModelChanged(this._model),this.render()}insertImage(e){this.dispatchEvent(new h(e))}onDeleteImage(e,t){this.dispatchEvent(new p(e,t))}insertSound(e){this.dispatchEvent(new E(e))}onDeleteSound(e,t){this.dispatchEvent(new b(e,t))}render(){if(this._model){const e=L.createElement(F,{model:this._model,configuration:this._configuration,onModelChanged:this.onModelChanged.bind(this),onConfigurationChanged:this.onConfigurationChanged.bind(this),imageSupport:{add:this.insertImage.bind(this),delete:this.onDeleteImage.bind(this)},uploadSoundSupport:{add:this.insertSound.bind(this),delete:this.onDeleteSound.bind(this)}});this._root||(this._root=_(this)),this._root.render(e)}}disconnectedCallback(){this._root&&this._root.unmount()}}N.__initStatic();export{N as default};
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Get the feedback from a {FeedbackConfig}
3
+ *
4
+ * @param {FeedbackConfig} feedback
5
+ * @param {string} fallback
6
+ */
7
+ const getFeedback = (feedback, fallback) =>
8
+ new Promise((resolve) => {
9
+ if (!feedback || feedback.type === 'none') {
10
+ resolve(undefined);
11
+ return;
12
+ }
13
+ feedback = feedback || {};
14
+ const out = feedback[feedback.type] || fallback;
15
+ resolve(out);
16
+ });
17
+
18
+ var defaults = {
19
+ annotationsEnabled: false,
20
+ dimensions: { height: 100, width: 500 },
21
+ equationEditor: 'Grade 8 - HS',
22
+ feedbackEnabled: false,
23
+ mathInput: false,
24
+ playerSpellCheckDisabled: true,
25
+ predefinedAnnotations: [
26
+ { label: 'good', text: 'good', type: 'positive' },
27
+ { label: '★', text: '★', type: 'positive' },
28
+ { label: ':-)', text: ':-)', type: 'positive' },
29
+ { label: 'creative', text: 'creative', type: 'positive' },
30
+ { label: 'run-on', text: 'run-on', type: 'negative' },
31
+ { label: 'frag', text: 'fragment', type: 'negative' },
32
+ { label: 'tran', text: 'transition', type: 'negative' },
33
+ { label: 'supp', text: 'support needed', type: 'negative' },
34
+ { label: 'punc', text: 'punctuation', type: 'negative' },
35
+ { label: 'agr', text: 'agreement wrong', type: 'negative' },
36
+ { label: 'unclear', text: 'unclear', type: 'negative' },
37
+ { label: 'cut', text: 'cut', type: 'negative' },
38
+ { label: 'sp', text: 'spelling', type: 'negative' },
39
+ { label: 'cap', text: 'capitalization', type: 'negative' },
40
+ { label: 'inf', text: 'informal', type: 'negative' },
41
+ { label: 'awk', text: 'awkward', type: 'negative' },
42
+ ],
43
+ prompt: '',
44
+ promptEnabled: true,
45
+ rationale: '',
46
+ rationaleEnabled: true,
47
+ studentInstructionsEnabled: true,
48
+ teacherInstructions: '',
49
+ teacherInstructionsEnabled: true,
50
+ toolbarEditorPosition: 'bottom',
51
+ };
52
+
53
+ async function createDefaultModel(model = {}) {
54
+
55
+ return { ...defaults, ...model };
56
+ }
57
+
58
+ const normalize = (question) => ({ ...defaults, ...question });
59
+
60
+ async function model(question, session, env) {
61
+ const normalizedQuestion = normalize(question);
62
+
63
+ const fb =
64
+ env.mode === 'evaluate' && normalizedQuestion.feedbackEnabled
65
+ ? getFeedback(normalizedQuestion.feedback, 'Your answer has been submitted')
66
+ : Promise.resolve(undefined);
67
+
68
+ let teacherInstructions = null;
69
+ if (env.role === 'instructor' && (env.mode === 'view' || env.mode === 'evaluate')) {
70
+ teacherInstructions = normalizedQuestion.teacherInstructionsEnabled ? normalizedQuestion.teacherInstructions : null;
71
+ } else {
72
+ teacherInstructions = null;
73
+ }
74
+
75
+ let equationEditor = normalizedQuestion.equationEditor || 'miscellaneous';
76
+
77
+ switch (normalizedQuestion.equationEditor) {
78
+ case 'Grade 1 - 2':
79
+ equationEditor = 1;
80
+ break;
81
+ case 'Grade 3 - 5':
82
+ equationEditor = 3;
83
+ break;
84
+ case 'Grade 6 - 7':
85
+ equationEditor = 6;
86
+ break;
87
+ case 'Grade 8 - HS':
88
+ equationEditor = 8;
89
+ break;
90
+ }
91
+
92
+ const annotatorMode = normalizedQuestion.annotationsEnabled && (env.role === 'instructor' || env.mode === 'evaluate');
93
+
94
+ return fb.then((feedback) => ({
95
+ prompt: normalizedQuestion.promptEnabled ? normalizedQuestion.prompt : null,
96
+ dimensions: normalizedQuestion.dimensions,
97
+ customKeys: normalizedQuestion.customKeys || [],
98
+ id: normalizedQuestion.id,
99
+ disabled: env.mode !== 'gather',
100
+ feedback,
101
+ teacherInstructions,
102
+ language: normalizedQuestion.language,
103
+ mathInput: normalizedQuestion.mathInput,
104
+ spanishInput: normalizedQuestion.spanishInput,
105
+ specialInput: normalizedQuestion.specialInput,
106
+ equationEditor,
107
+ spellCheckEnabled: !normalizedQuestion.playerSpellCheckDisabled,
108
+ playersToolbarPosition: normalizedQuestion.playersToolbarPosition || 'bottom',
109
+ annotatorMode,
110
+ disabledAnnotator: normalizedQuestion.annotationsEnabled ? env.role !== 'instructor' : true,
111
+ predefinedAnnotations: normalizedQuestion.annotationsEnabled ? normalizedQuestion.predefinedAnnotations : [],
112
+ extraCSSRules: normalizedQuestion.extraCSSRules,
113
+ }));
114
+ }
115
+
116
+ async function outcome(/*question, session, env*/) {
117
+ return {
118
+ score: 0,
119
+ completed: 'n/a',
120
+ note: 'Requires manual scoring',
121
+ };
122
+ }
123
+
124
+ // remove all html tags except img, iframe and source tag for audio
125
+ const getContent = (html) => (html || '').replace(/(<(?!img|iframe|source)([^>]+)>)/gi, '');
126
+
127
+ const validate = (model = {}, config = {}) => {
128
+ const errors = {};
129
+
130
+ ['teacherInstructions', 'prompt'].forEach((field) => {
131
+ if (config[field]?.required && !getContent(model[field])) {
132
+ errors[field] = 'This field is required.';
133
+ }
134
+ });
135
+
136
+ return errors;
137
+ };
138
+
139
+ export { createDefaultModel, model, normalize, outcome, validate };
package/module/demo.js ADDED
@@ -0,0 +1,38 @@
1
+ import Configure from './configure.js';
2
+ import Element from './element.js';
3
+ import * as controller from './controller.js';
4
+
5
+ var generate = {};
6
+
7
+ generate.model = (id, element) => ({
8
+ id,
9
+ element,
10
+ customKeys: ['\\square'],
11
+ feedback: { type: 'default', default: 'this is default feedback' },
12
+ prompt: 'This is the question prompt',
13
+ promptEnabled: true,
14
+ mathInput: true,
15
+ playersToolbarPosition: 'bottom',
16
+ toolbarEditorPosition: 'bottom',
17
+ spellCheckEnabled: true,
18
+ rubricEnabled: false,
19
+ annotationsEnabled: false,
20
+ });
21
+
22
+ const { model } = generate;
23
+ var config = {
24
+ elements: {
25
+ 'extended-text-entry': '../..',
26
+ },
27
+ models: [model('1', 'extended-text-entry')],
28
+ };
29
+
30
+ //Note: demo-el is a custom element loaded in the markup.
31
+ customElements.whenDefined("demo-el").then(() => {
32
+ config.models.forEach((m) => {
33
+ const de = document.createElement("demo-el");
34
+ document.body.appendChild(de);
35
+ de.def = { tagName: m.element, Element, Configure, controller };
36
+ de.model = m;
37
+ });
38
+ });