@stimulus-library/mixins 1.2.2 → 1.3.0

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.
@@ -61,15 +61,35 @@ export function useDirtyFormTracking(controller, form) {
61
61
  };
62
62
  }
63
63
  function getElementValue(element) {
64
- return isElementCheckable(element) ? element.checked : element.value;
64
+ if (isElementCheckable(element)) {
65
+ return element.checked;
66
+ }
67
+ else if (isHTMLSelectElement(element) && element.multiple) {
68
+ return JSON.stringify(getMultiSelectValues(element));
69
+ }
70
+ else {
71
+ return element.value;
72
+ }
73
+ }
74
+ function getMultiSelectLoadValues(element) {
75
+ let options = Array.from(element.options);
76
+ options = options.filter(option => option.defaultSelected);
77
+ return options.map(option => option.value);
78
+ }
79
+ function getMultiSelectValues(element) {
80
+ let options = Array.from(element.selectedOptions);
81
+ return options.map(option => option.value);
65
82
  }
66
83
  function getElementLoadValue(element) {
67
84
  const value = element.getAttribute(CACHE_ATTR_NAME);
68
85
  if (isElementCheckable(element)) {
69
86
  return value == null ? element.defaultChecked : value == "true";
70
87
  }
71
- else if (isHTMLSelectElement(element)) {
88
+ else if (isHTMLSelectElement(element) && value == null) {
72
89
  const options = Array.from(element.options);
90
+ if (element.multiple) {
91
+ return JSON.stringify(getMultiSelectLoadValues(element));
92
+ }
73
93
  options.forEach((option) => {
74
94
  if (option.defaultSelected) {
75
95
  return option.value;
@@ -124,23 +144,30 @@ function restoreElementFromLoadValue(element) {
124
144
  const options = Array.from(element.options);
125
145
  options.forEach((option) => {
126
146
  if (option.defaultSelected) {
127
- element.value = option.value;
128
- return;
147
+ option.selected = true;
129
148
  }
130
149
  });
131
150
  }
132
151
  else {
133
- element.value = cacheValue;
152
+ element.multiple ? restoreMultiSelect(element, cacheValue) : element.value = cacheValue;
134
153
  }
135
154
  }
136
155
  else {
137
156
  element.value = cacheValue == null ? element.defaultValue : cacheValue;
138
157
  }
158
+ checkDirty(element);
159
+ }
160
+ function restoreMultiSelect(element, cacheValue) {
161
+ let selectedOptions = JSON.parse(cacheValue);
162
+ Array.from(element.options).forEach((option) => option.selected = selectedOptions.includes(option.value));
139
163
  }
140
164
  function cacheLoadValues(element) {
141
165
  if (!elementHasCachedLoadValue(element) && isElementCheckable(element)) {
142
166
  element.setAttribute(CACHE_ATTR_NAME, element.checked.toString());
143
167
  }
168
+ else if (isHTMLSelectElement(element) && element.multiple) {
169
+ element.setAttribute(CACHE_ATTR_NAME, JSON.stringify(getMultiSelectLoadValues(element)));
170
+ }
144
171
  else {
145
172
  element.setAttribute(CACHE_ATTR_NAME, element.value.toString());
146
173
  }
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "ruby on rails",
10
10
  "ruby-on-rails"
11
11
  ],
12
- "version": "1.2.2",
12
+ "version": "1.3.0",
13
13
  "license": "MIT",
14
14
  "author": {
15
15
  "name": "Sub-Xaero",
@@ -37,25 +37,26 @@
37
37
  },
38
38
  "dependencies": {
39
39
  "@hotwired/stimulus": "^3.0.0",
40
- "@stimulus-library/utilities": "^1.2.1"
40
+ "@stimulus-library/utilities": "^1.3.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/chai": "^4.3.5",
43
+ "@types/chai": "^5.0.1",
44
44
  "@types/mocha": "^10.0.1",
45
+ "@types/node": "^22.13.17",
45
46
  "@types/sinon": "^17.0.1",
46
- "@types/sinon-chai": "^3.2.9",
47
+ "@types/sinon-chai": "^4.0.0",
47
48
  "agadoo": "^3.0.0",
48
49
  "chai": "^5.1.1",
49
50
  "fast-glob": "^3.2.12",
50
51
  "lerna": "^8.0.0",
51
- "mocha": "^10.2.0",
52
+ "mocha": "^11.1.0",
52
53
  "rimraf": "^6.0.1",
53
- "sinon": "^18.0.0",
54
+ "sinon": "^20.0.0",
54
55
  "sinon-chai": "^4.0.0",
55
56
  "standard-version": "^9.5.0",
56
- "ts-node": "^10.9.1",
57
- "typescript": "^5.1.3",
58
- "vite": "^5.0.2"
57
+ "ts-node": "^10.9.2",
58
+ "typescript": "^5.8.2",
59
+ "vite": "^6.2.4"
59
60
  },
60
- "gitHead": "ba6fdce82a376a368600b3793c8ea01d6cfb6e04"
61
+ "gitHead": "3b4c2c325aeffcfaef66e6a06ff68f00049289de"
61
62
  }