@pie-element/match-list 6.0.0-next.43 → 6.1.1-next.1

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/lib/main.js CHANGED
@@ -10,14 +10,14 @@ var _react = _interopRequireDefault(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _drag = require("@pie-lib/drag");
12
12
  var _core = require("@dnd-kit/core");
13
+ var _modifiers = require("@dnd-kit/modifiers");
13
14
  var _correctAnswerToggle = _interopRequireDefault(require("@pie-lib/correct-answer-toggle"));
14
15
  var _renderUi = require("@pie-lib/render-ui");
15
16
  var _styles = require("@mui/material/styles");
16
- var _uniqueId = _interopRequireDefault(require("lodash/uniqueId"));
17
- var _isUndefined = _interopRequireDefault(require("lodash/isUndefined"));
18
- var _findKey = _interopRequireDefault(require("lodash/findKey"));
17
+ var _lodashEs = require("lodash-es");
19
18
  var _answerArea = _interopRequireDefault(require("./answer-area"));
20
19
  var _choicesList = _interopRequireDefault(require("./choices-list"));
20
+ var _answer = require("./answer");
21
21
  const MainContainer = (0, _styles.styled)('div')({
22
22
  display: 'flex',
23
23
  flexDirection: 'column',
@@ -28,37 +28,76 @@ const MainContainer = (0, _styles.styled)('div')({
28
28
  class Main extends _react.default.Component {
29
29
  constructor(props) {
30
30
  super(props);
31
+ (0, _defineProperty2.default)(this, "onDragStart", event => {
32
+ const {
33
+ active
34
+ } = event;
35
+ if (active?.data?.current) {
36
+ let rect = null;
37
+ const node = active.node?.current;
38
+ if (node) {
39
+ const {
40
+ width,
41
+ height
42
+ } = node.getBoundingClientRect();
43
+ rect = {
44
+ width,
45
+ height
46
+ };
47
+ }
48
+ this.setState({
49
+ draggingElement: {
50
+ ...active.data.current,
51
+ rect
52
+ }
53
+ });
54
+ }
55
+ });
31
56
  (0, _defineProperty2.default)(this, "onPlaceAnswer", event => {
57
+ this.setState({
58
+ draggingElement: null
59
+ });
32
60
  const {
33
61
  active,
34
62
  over
35
63
  } = event;
36
- if (!over || !active) {
64
+ if (!active) {
37
65
  return;
38
66
  }
39
67
  const activeData = active.data.current;
40
- const overData = over.data.current;
41
- if (activeData && overData) {
42
- const {
43
- session,
44
- onSessionChange,
45
- model
46
- } = this.props;
47
- const {
48
- config: {
49
- duplicates
50
- }
51
- } = model;
52
- if ((0, _isUndefined.default)(session.value)) {
53
- session.value = {};
68
+ const overData = over?.data.current;
69
+ if (!activeData) {
70
+ return;
71
+ }
72
+ const {
73
+ session,
74
+ onSessionChange,
75
+ model
76
+ } = this.props;
77
+ const {
78
+ config: {
79
+ duplicates
54
80
  }
55
- const answerId = activeData.id;
56
- const targetPromptId = overData.promptId;
81
+ } = model;
82
+ if ((0, _lodashEs.isUndefined)(session.value)) {
83
+ session.value = {};
84
+ }
85
+
86
+ // dropping a placed answer back to the choices pool = remove it
87
+ if (overData.type === 'choices-pool' && activeData.promptId !== undefined) {
88
+ session.value[activeData.promptId] = undefined;
89
+ onSessionChange(session);
90
+ return;
91
+ }
92
+ const answerId = activeData.id;
93
+ const sourcePromptId = activeData.promptId;
57
94
 
58
- // only allow dropping choices (not already placed answers) onto drop zones
59
- if (activeData.type === 'choice' && overData.type === 'drop-zone' && targetPromptId) {
95
+ // Handle dropping onto a drop zone
96
+ if (overData && overData.type === 'drop-zone' && overData.promptId != null) {
97
+ const targetPromptId = overData.promptId;
98
+ if (activeData.type === 'choice' && overData.type === 'drop-zone' && targetPromptId !== undefined) {
60
99
  // check if this choice is already placed somewhere
61
- const existingPlacement = (0, _findKey.default)(session.value, val => val === answerId);
100
+ const existingPlacement = (0, _lodashEs.findKey)(session.value, val => val === answerId);
62
101
  if (existingPlacement && !duplicates) {
63
102
  // swap if duplicates not allowed
64
103
  session.value = (0, _drag.swap)(session.value, existingPlacement, targetPromptId);
@@ -66,8 +105,25 @@ class Main extends _react.default.Component {
66
105
  // place answer
67
106
  session.value[targetPromptId] = answerId;
68
107
  }
69
- onSessionChange(session);
70
108
  }
109
+ // Handle moving a placed item (target) to another drop zone
110
+ else if (activeData.type === 'target' && sourcePromptId != null) {
111
+ // If moving to a different placeholder
112
+ if (sourcePromptId !== targetPromptId) {
113
+ const targetHasItem = session.value[targetPromptId] != null;
114
+ if (targetHasItem && !duplicates) {
115
+ // swap items between placeholders
116
+ const temp = session.value[targetPromptId];
117
+ session.value[targetPromptId] = answerId;
118
+ session.value[sourcePromptId] = temp;
119
+ } else if (!targetHasItem) {
120
+ // move item to empty placeholder
121
+ session.value[targetPromptId] = answerId;
122
+ delete session.value[sourcePromptId];
123
+ }
124
+ }
125
+ }
126
+ onSessionChange(session);
71
127
  }
72
128
  });
73
129
  (0, _defineProperty2.default)(this, "toggleShowCorrect", () => {
@@ -75,9 +131,27 @@ class Main extends _react.default.Component {
75
131
  showCorrectAnswer: !this.state.showCorrectAnswer
76
132
  });
77
133
  });
78
- this.instanceId = (0, _uniqueId.default)();
134
+ (0, _defineProperty2.default)(this, "renderDragOverlay", () => {
135
+ const {
136
+ draggingElement
137
+ } = this.state;
138
+ if (!draggingElement) return null;
139
+ return /*#__PURE__*/_react.default.createElement(_answer.Answer, {
140
+ id: draggingElement.id,
141
+ title: draggingElement.value,
142
+ disabled: false,
143
+ isDragging: false,
144
+ style: draggingElement.rect ? {
145
+ width: draggingElement.rect.width,
146
+ height: draggingElement.rect.height,
147
+ boxSizing: 'border-box'
148
+ } : {}
149
+ });
150
+ });
151
+ this.instanceId = (0, _lodashEs.uniqueId)();
79
152
  this.state = {
80
- showCorrectAnswer: false
153
+ showCorrectAnswer: false,
154
+ draggingElement: null
81
155
  };
82
156
  }
83
157
  onRemoveAnswer(id) {
@@ -105,7 +179,9 @@ class Main extends _react.default.Component {
105
179
  language
106
180
  } = config;
107
181
  return /*#__PURE__*/_react.default.createElement(_core.DndContext, {
108
- onDragEnd: this.onPlaceAnswer
182
+ onDragStart: this.onDragStart,
183
+ onDragEnd: this.onPlaceAnswer,
184
+ modifiers: [_modifiers.restrictToFirstScrollableAncestor]
109
185
  }, /*#__PURE__*/_react.default.createElement(MainContainer, null, /*#__PURE__*/_react.default.createElement(_renderUi.PreviewPrompt, {
110
186
  className: "prompt",
111
187
  prompt: prompt
@@ -130,7 +206,7 @@ class Main extends _react.default.Component {
130
206
  }), model.correctness && model.feedback && !showCorrectAnswer && /*#__PURE__*/_react.default.createElement(_renderUi.Feedback, {
131
207
  correctness: model.correctness.correctness,
132
208
  feedback: model.feedback
133
- })));
209
+ })), /*#__PURE__*/_react.default.createElement(_core.DragOverlay, null, this.renderDragOverlay()));
134
210
  }
135
211
  }
136
212
  exports.Main = Main;
package/lib/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","names":["_react","_interopRequireDefault","require","_propTypes","_drag","_core","_correctAnswerToggle","_renderUi","_styles","_uniqueId","_isUndefined","_findKey","_answerArea","_choicesList","MainContainer","styled","display","flexDirection","justifyContent","color","text","backgroundColor","background","Main","React","Component","constructor","props","_defineProperty2","default","event","active","over","activeData","data","current","overData","session","onSessionChange","model","config","duplicates","isUndefined","value","answerId","id","targetPromptId","promptId","type","existingPlacement","findKey","val","swap","setState","showCorrectAnswer","state","instanceId","uniqueId","onRemoveAnswer","undefined","render","mode","prompt","language","createElement","DndContext","onDragEnd","onPlaceAnswer","PreviewPrompt","className","show","toggled","onToggle","toggleShowCorrect","disabled","showCorrect","correctness","feedback","Feedback","exports","PropTypes","object","isRequired","func","string","_default"],"sources":["../src/main.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { swap } from '@pie-lib/drag';\nimport {\n DndContext,\n} from '@dnd-kit/core';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport { color, Feedback, PreviewPrompt } from '@pie-lib/render-ui';\nimport { styled } from '@mui/material/styles';\nimport uniqueId from 'lodash/uniqueId';\nimport isUndefined from 'lodash/isUndefined';\nimport findKey from 'lodash/findKey';\nimport AnswerArea from './answer-area';\nimport ChoicesList from './choices-list';\n\nconst MainContainer = styled('div')({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n color: color.text(),\n backgroundColor: color.background(),\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n session: PropTypes.object.isRequired,\n onSessionChange: PropTypes.func,\n model: PropTypes.object.isRequired,\n prompt: PropTypes.string,\n };\n\n constructor(props) {\n super(props);\n\n this.instanceId = uniqueId();\n this.state = {\n showCorrectAnswer: false,\n };\n }\n\n onRemoveAnswer(id) {\n const { session, onSessionChange } = this.props;\n\n session.value[id] = undefined;\n\n onSessionChange(session);\n }\n\n onPlaceAnswer = (event) => {\n const { active, over } = event;\n\n if (!over || !active) {\n return;\n }\n\n const activeData = active.data.current;\n const overData = over.data.current;\n\n if (activeData && overData) {\n const { session, onSessionChange, model } = this.props;\n const { config: { duplicates } } = model;\n\n if (isUndefined(session.value)) {\n session.value = {};\n }\n\n const answerId = activeData.id;\n const targetPromptId = overData.promptId;\n\n // only allow dropping choices (not already placed answers) onto drop zones\n if (activeData.type === 'choice' && overData.type === 'drop-zone' && targetPromptId) {\n // check if this choice is already placed somewhere\n const existingPlacement = findKey(session.value, (val) => val === answerId);\n\n if (existingPlacement && !duplicates) {\n // swap if duplicates not allowed\n session.value = swap(session.value, existingPlacement, targetPromptId);\n } else {\n // place answer\n session.value[targetPromptId] = answerId;\n }\n\n onSessionChange(session);\n }\n }\n };\n\n toggleShowCorrect = () => {\n this.setState({ showCorrectAnswer: !this.state.showCorrectAnswer });\n };\n\n render() {\n const { showCorrectAnswer } = this.state;\n const { model, session } = this.props;\n const { config, mode } = model;\n const { prompt, language } = config;\n\n return (\n <DndContext onDragEnd={this.onPlaceAnswer}>\n <MainContainer>\n <PreviewPrompt className=\"prompt\" prompt={prompt} />\n\n <CorrectAnswerToggle\n show={mode === 'evaluate'}\n toggled={showCorrectAnswer}\n onToggle={this.toggleShowCorrect}\n language={language}\n />\n\n <AnswerArea\n instanceId={this.instanceId}\n model={model}\n session={session}\n onRemoveAnswer={(id) => this.onRemoveAnswer(id)}\n disabled={mode !== 'gather'}\n showCorrect={showCorrectAnswer}\n />\n\n <ChoicesList\n instanceId={this.instanceId}\n model={model}\n session={session}\n disabled={mode !== 'gather'}\n onRemoveAnswer={(id) => this.onRemoveAnswer(id)}\n />\n\n {model.correctness && model.feedback && !showCorrectAnswer && (\n <Feedback correctness={model.correctness.correctness} feedback={model.feedback} />\n )}\n </MainContainer>\n </DndContext>\n );\n }\n}\n\nexport default Main;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"main.js","names":["_react","_interopRequireDefault","require","_propTypes","_drag","_core","_modifiers","_correctAnswerToggle","_renderUi","_styles","_lodashEs","_answerArea","_choicesList","_answer","MainContainer","styled","display","flexDirection","justifyContent","color","text","backgroundColor","background","Main","React","Component","constructor","props","_defineProperty2","default","event","active","data","current","rect","node","width","height","getBoundingClientRect","setState","draggingElement","over","activeData","overData","session","onSessionChange","model","config","duplicates","isUndefined","value","type","promptId","undefined","answerId","id","sourcePromptId","targetPromptId","existingPlacement","findKey","val","swap","targetHasItem","temp","showCorrectAnswer","state","createElement","Answer","title","disabled","isDragging","style","boxSizing","instanceId","uniqueId","onRemoveAnswer","render","mode","prompt","language","DndContext","onDragStart","onDragEnd","onPlaceAnswer","modifiers","restrictToFirstScrollableAncestor","PreviewPrompt","className","show","toggled","onToggle","toggleShowCorrect","showCorrect","correctness","feedback","Feedback","DragOverlay","renderDragOverlay","exports","PropTypes","object","isRequired","func","string","_default"],"sources":["../src/main.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { swap } from '@pie-lib/drag';\nimport { DndContext, DragOverlay } from '@dnd-kit/core';\nimport { restrictToFirstScrollableAncestor } from '@dnd-kit/modifiers';\nimport CorrectAnswerToggle from '@pie-lib/correct-answer-toggle';\nimport { color, Feedback, PreviewPrompt } from '@pie-lib/render-ui';\nimport { styled } from '@mui/material/styles';\nimport { findKey, isUndefined, uniqueId } from 'lodash-es';\nimport AnswerArea from './answer-area';\nimport ChoicesList from './choices-list';\nimport { Answer } from './answer';\n\nconst MainContainer = styled('div')({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n color: color.text(),\n backgroundColor: color.background(),\n});\n\nexport class Main extends React.Component {\n static propTypes = {\n session: PropTypes.object.isRequired,\n onSessionChange: PropTypes.func,\n model: PropTypes.object.isRequired,\n prompt: PropTypes.string,\n };\n\n constructor(props) {\n super(props);\n\n this.instanceId = uniqueId();\n this.state = {\n showCorrectAnswer: false,\n draggingElement: null,\n };\n }\n\n onRemoveAnswer(id) {\n const { session, onSessionChange } = this.props;\n\n session.value[id] = undefined;\n\n onSessionChange(session);\n }\n\n onDragStart = (event) => {\n const { active } = event;\n\n if (active?.data?.current) {\n let rect = null;\n const node = active.node?.current;\n\n if (node) {\n const { width, height } = node.getBoundingClientRect();\n rect = { width, height };\n }\n\n this.setState({\n draggingElement: { ...active.data.current, rect },\n });\n }\n };\n\n onPlaceAnswer = (event) => {\n this.setState({ draggingElement: null });\n const { active, over } = event;\n\n if (!active) {\n return;\n }\n\n const activeData = active.data.current;\n const overData = over?.data.current;\n\n if (!activeData) {\n return;\n }\n\n const { session, onSessionChange, model } = this.props;\n const {\n config: { duplicates },\n } = model;\n\n if (isUndefined(session.value)) {\n session.value = {};\n }\n\n // dropping a placed answer back to the choices pool = remove it\n if (overData.type === 'choices-pool' && activeData.promptId !== undefined) {\n session.value[activeData.promptId] = undefined;\n onSessionChange(session);\n return;\n }\n\n const answerId = activeData.id;\n const sourcePromptId = activeData.promptId;\n\n // Handle dropping onto a drop zone\n if (overData && overData.type === 'drop-zone' && overData.promptId != null) {\n const targetPromptId = overData.promptId;\n\n if (activeData.type === 'choice' && overData.type === 'drop-zone' && targetPromptId !== undefined) {\n // check if this choice is already placed somewhere\n const existingPlacement = findKey(session.value, (val) => val === answerId);\n\n if (existingPlacement && !duplicates) {\n // swap if duplicates not allowed\n session.value = swap(session.value, existingPlacement, targetPromptId);\n } else {\n // place answer\n session.value[targetPromptId] = answerId;\n }\n }\n // Handle moving a placed item (target) to another drop zone\n else if (activeData.type === 'target' && sourcePromptId != null) {\n // If moving to a different placeholder\n if (sourcePromptId !== targetPromptId) {\n const targetHasItem = session.value[targetPromptId] != null;\n\n if (targetHasItem && !duplicates) {\n // swap items between placeholders\n const temp = session.value[targetPromptId];\n session.value[targetPromptId] = answerId;\n session.value[sourcePromptId] = temp;\n } else if (!targetHasItem) {\n // move item to empty placeholder\n session.value[targetPromptId] = answerId;\n delete session.value[sourcePromptId];\n }\n }\n }\n\n onSessionChange(session);\n }\n };\n\n toggleShowCorrect = () => {\n this.setState({ showCorrectAnswer: !this.state.showCorrectAnswer });\n };\n\n renderDragOverlay = () => {\n const { draggingElement } = this.state;\n\n if (!draggingElement) return null;\n\n return (\n <Answer\n id={draggingElement.id}\n title={draggingElement.value}\n disabled={false}\n isDragging={false}\n style={\n draggingElement.rect\n ? { width: draggingElement.rect.width, height: draggingElement.rect.height, boxSizing: 'border-box' }\n : {}\n }\n />\n );\n };\n\n render() {\n const { showCorrectAnswer } = this.state;\n const { model, session } = this.props;\n const { config, mode } = model;\n const { prompt, language } = config;\n\n return (\n <DndContext\n onDragStart={this.onDragStart}\n onDragEnd={this.onPlaceAnswer}\n modifiers={[restrictToFirstScrollableAncestor]}\n >\n <MainContainer>\n <PreviewPrompt className=\"prompt\" prompt={prompt} />\n\n <CorrectAnswerToggle\n show={mode === 'evaluate'}\n toggled={showCorrectAnswer}\n onToggle={this.toggleShowCorrect}\n language={language}\n />\n\n <AnswerArea\n instanceId={this.instanceId}\n model={model}\n session={session}\n onRemoveAnswer={(id) => this.onRemoveAnswer(id)}\n disabled={mode !== 'gather'}\n showCorrect={showCorrectAnswer}\n />\n\n <ChoicesList\n instanceId={this.instanceId}\n model={model}\n session={session}\n disabled={mode !== 'gather'}\n onRemoveAnswer={(id) => this.onRemoveAnswer(id)}\n />\n\n {model.correctness && model.feedback && !showCorrectAnswer && (\n <Feedback correctness={model.correctness.correctness} feedback={model.feedback} />\n )}\n </MainContainer>\n <DragOverlay>{this.renderDragOverlay()}</DragOverlay>\n </DndContext>\n );\n }\n}\n\nexport default Main;\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@pie-element/match-list",
3
+ "repository": "pie-framework/pie-elements",
3
4
  "publishConfig": {
4
5
  "access": "public"
5
6
  },
6
- "repository": "pie-framework/pie-elements",
7
- "version": "6.0.0-next.43+4249fa78f",
7
+ "version": "6.1.1-next.1",
8
8
  "description": "",
9
9
  "scripts": {
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -12,24 +12,25 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@dnd-kit/core": "6.3.1",
15
+ "@dnd-kit/modifiers": "9.0.0",
15
16
  "@emotion/react": "^11.14.0",
16
17
  "@emotion/style": "^0.8.0",
17
18
  "@mui/icons-material": "^7.3.4",
18
19
  "@mui/material": "^7.3.4",
19
20
  "@pie-framework/pie-player-events": "^0.1.0",
20
- "@pie-lib/correct-answer-toggle": "3.1.1-next.0",
21
- "@pie-lib/drag": "3.1.1-next.0",
22
- "@pie-lib/math-rendering": "4.1.1-next.0",
23
- "@pie-lib/render-ui": "5.1.1-next.0",
21
+ "@pie-lib/correct-answer-toggle": "3.2.0-next.4",
22
+ "@pie-lib/drag": "3.2.0-next.4",
23
+ "@pie-lib/math-rendering": "4.2.0-next.3",
24
+ "@pie-lib/render-ui": "5.2.0-next.4",
24
25
  "debug": "^4.1.1",
25
- "lodash": "^4.17.10",
26
+ "lodash-es": "^4.17.23",
26
27
  "prop-types": "^15.8.1",
27
28
  "react": "18.3.1",
28
29
  "react-dom": "18.3.1"
29
30
  },
30
31
  "author": "",
31
32
  "license": "ISC",
32
- "gitHead": "4249fa78fc423ef0a8c89002b8f937c42b3478ea",
33
+ "gitHead": "9cc4a1cd183a260a03c7d817e0085517112a1a56",
33
34
  "main": "lib/index.js",
34
35
  "module": "src/index.js"
35
36
  }